2019年10月31日木曜日

Python ローマ字 カナ変換

#!/usr/bin/env python36
# coding=utf-8
import json
import requests

def main():
  import io, sys
  import getopt
  from   pykakasi import kakasi
  import mojimoji


  usage =""" usage: ./kakasi.py [options]
  --help            本メッセージ
  --zipcode         郵便番号"""

  try:
    opts, args = getopt.getopt( sys.argv[1:], '-h', ['help','zipcode='])
  except getopt.GetoptError as err:
    print( str(err))
    print( usage )
    sys.exit()

  opt = dict( opts )

  if( '-h' in opt or len(opt)>1 ):
    print( usage )
    sys.exit()
  elif( '--zipcode' in opt ):
    zip= opt['--zipcode']
  else:
    zip = '1510061'

  print( 'REQUEST: ' +  zip)

  resp = requests.get( 'http://zipcloud.ibsnet.co.jp/api/search?zipcode=' + str(zip) + '&limit=1')

  response = json.loads(resp.text)
  address = response["results"][0]

  address1 = address["address1"]
  address2 = address["address2"]
  address3 = address["address3"]
  kana1    = address["kana1"]
  kana2    = address["kana2"]
  kana3    = address["kana3"]
  zipcode  = address["zipcode"]

  print( '---------取得データ---------')
  print( address1 )
  print( address2 )
  print( address3 )
  print( kana1 )
  print( kana2 )
  print( kana3 )
  print( zipcode )


  kakasi = kakasi()  # Generate kakasi instance

  print( '---------ローマ字変換--------')

  kakasi.setMode("H", "a")  # Hiragana to ascii
  kakasi.setMode("K", "a")  # Katakana to ascii
  kakasi.setMode("J", "a")  # Japanese(kanji) to ascii

  kakasi.setMode("r", "Hepburn")  # Use Hepburn romanization

  conv = kakasi.getConverter()
  roma_address1  = conv.do( address1 )
  roma_address2  = conv.do( address2 )
  roma_address3  = conv.do( address3 )
  roma_kana1     = conv.do( kana1 )
  roma_kana2     = conv.do( kana2 )
  roma_kana3     = conv.do( kana3 )
  roma_zipcode   = conv.do( zipcode )
  print( roma_address1 )
  print( roma_address2 )
  print( roma_address3 )
  print( roma_kana1 )
  print( roma_kana2 )
  print( roma_kana3 )
  print( roma_zipcode )

  print( '----------カナ変換---------')
  kakasi.setMode("H", "K")  # Hiragana to KANA
  kakasi.setMode("J", "K")  # Japanese(kanji) to KANA
  kakasi.setMode("a", "K")  # Japanese(kanji) to KANA

  conv = kakasi.getConverter()
  kana_address1  = conv.do( address1 )
  kana_address2  = conv.do( address2 )
  kana_address3  = conv.do( address3 )
  kana_kana1     = conv.do( kana1 )
  kana_kana2     = conv.do( kana2 )
  kana_kana3     = conv.do( kana3 )
  kana_zipcode   = conv.do( zipcode )
  print( kana_address1 )
  print( kana_address2 )
  print( kana_address3 )
  print( kana_kana1 )
  print( kana_kana2 )
  print( kana_kana3 )
  print( kana_zipcode )

  print( '--------全角変換------------')
  print( mojimoji.han_to_zen( kana_kana1) )
  print( mojimoji.han_to_zen( kana_kana2) )
  print( mojimoji.han_to_zen( kana_kana3) )

  print( '--------全角→ローマ字変換------------')

  kakasi.setMode("H", "a")  # Hiragana to ascii
  kakasi.setMode("K", "a")  # Katakana to ascii
  kakasi.setMode("J", "a")  # Japanese(kanji) to ascii

  kakasi.setMode("r", "Hepburn")  # Use Hepburn romanization
  print( conv.do( mojimoji.han_to_zen( kana_kana1) ))
  print( conv.do( mojimoji.han_to_zen( kana_kana2) ))
  print( conv.do( mojimoji.han_to_zen( kana_kana3) ))

if __name__ == "__main__":
    main()

2019年10月18日金曜日

wsgi 動かない。 503 Service Unavailable

Permission denied: [client 127.0.0.1:33562] mod_wsgi (pid=5683): Unable to connect to WSGI daemon process 'analyze' on '/etc/httpd/logs/wsgi.5655.0.2.sock' as user with uid=48.



# vi /etc/httpd/conf.d/wsgi.conf

WSGISocketPrefix run/wsgi
又は、
WSGISocketPrefix /var/run/wsgi

2019年10月10日木曜日

Django クラウドAPI REST認証

1.全体ツリー構造

1-1 ファルダ
TTG_Project
├── README
├── client                      # クライアントテストツール
│   ├── __pycache__
│   ├── client.py
│   ├── data.py                 # テストデータ
│   └── run                     # クライアント起動 ($ ./run)
└── server                      # Django サーバアプリケーション
    ├── api                     # API ファルダー
    │   ├── __init__.py
    │   ├── __pycache__
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   ├── models.py
    │   ├── registerAPI.py      # レジスタ用web API
    │   ├── tests.py
    │   ├── urls.py
    │   └── views.py
    ├── build                   # マイグレション/起動スクリプト
    ├── clean                   # キャシュクリヤー
    ├── conf
    │   ├── __init__.py
    │   ├── __pycache__
    │   ├── settings.py         # DB設定等、各種設定
    │   ├── urls.py
    │   └── wsgi.py             # apache 起動入り口
    ├── env
    └── manage.py               # 手動起動入り口


2.環境構築
2-1 pythonのインストール
2-2 Djangoのインストール
2-3 プロジェクトの作成

$ mkdir TTG_Project
$ cd TTG_Project
$ django-admin startproject conf
$ mv conf server
$ cd server
$ python36 manage.py startapp api

2-4 settings.pyの編集

$ vi ./conf/settings.py

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'api.apps.ApiConfig',             # 追記
  'rest_framework',                 # 追記
]

# 下記追記

from datetime import datetime, timedelta

REST_FRAMEWORK = {
  'DEFAULT_PERMISSION_CLASSES': (
  ¦ 'rest_framework.permissions.IsAuthenticated',
  ),
  'DEFAULT_AUTHENTICATION_CLASSES': (
  ¦ 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
  ),
  'NON_FIELD_ERRORS_KEY': 'detail',
  'TEST_REQUEST_DEFAULT_FORMAT': 'json'
}

JWT_AUTH = {
  'JWT_SECRET_KEY': SECRET_KEY,
  'JWT_ALGORITHM': 'HS256',
  'JWT_ALLOW_REFRESH': True,
  'JWT_EXPIRATION_DELTA': timedelta(days=7),
  'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=28),
}

# 下記ファイル作成を新規に作成
$ vi api/urls.py
from django.urls import path
from . import views
from rest_framework_jwt.views import obtain_jwt_token, verify_jwt_token, refresh_jwt_token

app_name = 'api'

urlpatterns = [
    path('token/', obtain_jwt_token),
    path('token/verify/', verify_jwt_token),
    path('token/refresh/', refresh_jwt_token),
    path('v1/register/', views.RegisterAPI.as_view()),
    path('v1/cxdnext/',  views.CxdnextAPI.as_view()),
]

2-5 conf/urls.pyの編集

$ vi conf/urls.py

from django.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('api.urls',   namespace='api')),    # 追記
]


3 デーベース

3-1 mysqlデータベース設定

$ vi conf/settings.py

import pymysql
pymysql.install_as_MySQLdb()

DATABASES = {
   'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'ttg',       # 予め空DBを作成しておく。
      'USER': 'admin',
      'PASSWORD':'password',
      'HOST': '',
      'PORT': '',
      'OPTIONS': {
            'charset': 'utf8mb4',
      },
      'ATOMIC_REQUESTS': True,
   },
   'db_ttg': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'ttg_data',   # 予め空DBを作成しておく。
      'USER': 'admin',
      'PASSWORD':'password',
      'HOST': '',
      'PORT': '',
      'OPTIONS': {
            'charset': 'utf8mb4',
      },
      'ATOMIC_REQUESTS': False,
   }
}

※  mysqlデータベースのインストール方法は省略します。

3-2 データベース構造
drop database ttg_data;
create database ttg_data;
use ttg_data;

create table  ttg_cart(
invoice        varchar(6)  not null comment "伝票コード",
state          varchar(2)  not null comment "ステータス 00:未処理 01:決済中 99:決済完了",
customerID     varchar(16) not null comment "顧客コード",
itemcode       varchar(16) not null comment "商品コード",
quantity       varchar(10) not null comment "数量",
lastupdate     varchar(14) not null comment "最終更新日時",
createtime     varchar(14) not null comment "登録日時");

3-3 サンプルデータ
insert into  ttg_cart
( invoice, state, customerID, itemcode, quantity, lastupdate, createtime ) values
('000001','00','0000000000000100','0000000000000200',3,'20191008164520','20191008164520'),
('000002','00','0000000000000100','0000000000000300',3,'20191008164520','20191008164520'),
('000003','00','0000000000000100','0000000000000400',3,'20191008164520','20191008164520'),
('000004','00','0000000000000100','0000000000000600',3,'20191008164520','20191008164520'),
('000005','00','0000000000000200','0000000000020100',4,'20191008174520','20191008164520'),
('000006','00','0000000000000200','0000000000020200',4,'20191008174520','20191008164520'),
('000007','00','0000000000000200','0000000000020100',4,'20191008174520','20191008164520'),
('000008','00','0000000000000300','0000000000030200',5,'20191008184520','20191008164520'),
('000009','00','0000000000000300','0000000000030300',5,'20191008184520','20191008164520'),
('000010','00','0000000000000300','0000000000030400',5,'20191008184520','20191008164520'),
('000011','00','0000000000000400','0000000000040100',6,'20191008194520','20191008164520'),
('000012','00','0000000000000400','0000000000040200',6,'20191008194520','20191008164520'),
('000013','00','0000000000000400','0000000000040300',6,'20191008194520','20191008164520');


4. 起動
4-1 起動前準備

1) キャシュクリア
$ vi clean
rm -f  api/migrations/000?_initial.py
rm -f  api/migrations/000?_auto_*.py
rm -rf api/migrations/__pycache__

2) マイグレションと起動
$ vi build
echo python36 manage.py makemigrations-------------------------------
python36 manage.py makemigrations

echo python36 manage.py migrate--------------------------------------
python36 manage.py migrate

echo python36 manage.py createsuperuser------------------------------
python36 manage.py createsuperuser

echo python36 manage.py runserver 0.0.0.0:8000-----------------------
python36 manage.py runserver 0.0.0.0:8000

4-2 起動
$ ./clean
$ ./build
ユーザID、mail、パスワード入力

シャットダウン時の後処理 (shutdown)

# vi /etc/systemd/system/drop.service [Unit] Description= stop httpgwd DefaultDependencies=no Before=shutdown.target RefuseManualStart=true ...