プログラミング123

定年近しプログラマーが作る 今のところは絵のないカルタです。

44.僕は誰? 聞くのが怖い ケアハウス

社会的に個人の証明書と言えば、免許証、パスポート等になりますが、
インターネット上ではサーバ証明書というのがあって、
認証局に自分のサーバの公開鍵が含まれた証明書要求を出して、
サーバ証明書を取得し、インターネット接続するサーバが
自分のものであることを証明します。

証明書要求もサーバ証明書もテキストデータです。
証明書要求は自分のサーバで秘密鍵を使って、生成します。

サーバ証明書と公開されている認証局の中間証明書を合わせて、
取込む設定と接続ポートを開く構成にして、WEB サーバを再起動します。
中間証明書は認証局が発行する証明書の種別やバージョンのアダプターとして
機能するようです。

***********************************************************************************************

https、ssh 等の SSL 通信ではクライアント側が相手先のサーバ証明書を取得し、
自分が持っている認証局自体の証明書と照合することでサーバ証明書の正当性の確認後、
一時的に使用する鍵を生成し、サーバ証明書内の公開鍵で暗号化して、サーバに伝えた後、
データをその鍵で暗号化して、送信することで、セキュリティを担保しているらしいです。
正確なところは調べてみてください。

***********************************************************************************************

基本的に企業相手のクラウドサービスでは
独自ドメインと証明書の持込みが普通で、年間費用がそれなりにかかります。
クラウドサービス会社によってはクラウドサービス側で用意した証明書を
無料で利用できるところもあります。
個人利用の場合は費用上、大きな割合になることがあるので、
そのあたりも考慮すると良いです。

***********************************************************************************************

免許証について書くことになって、
ふと、小学校の自転車運転免許証のことを思い出しました。

当時、グラウンドに白線を引いて、運転試験をしていました。
合格すると画用紙に刷られた免許証に
名前が手書きされて、判子が押してあるものをもらった記憶があります。
24 インチは よいけど、26 インチは だめとか、
結構、真面目なものでした。

下の学年に転校してきた子がいて、
自転車の右側からしか乗れなくて、
先生達が免許証を渡すべきか困っていたことがありました。
当人は初めて指摘されたみたいで、
何が問題なのか理解できていないようでした。
僕は左側からしか乗れなかったので、
凄いなと思ったけれど、どうなったのかな。

45.早く家 プログラミング に帰ろう

タイトルは『マンション広告』に割り込みをかけました。

プログラミングを学習して、一番のメリットはテキストファイル、
テキスト(文字列)を自在に処理できるようになることだと言えます。
この学習範囲を『テキスト自在』と名付けておきます。

『テキスト自在』を身に付けるのに
プログラミング言語や IDE を特定する必要はありません。
しかし、ここでは Delphi を使用して、
『テキスト自在』を扱ってみます。

『テキスト自在』は応用範囲が広いため、
何度も繰り返し、利用することになります。
そこで、基本的なファイル構成を紹介します。


①フォームに UI 部品を貼り付けて、
 機能に対応するファイルを 3 つ(UnitData.pas、UnitFile.pas、UnitX.pas)
 加えた状態の設計画面です。
f:id:programingcram:20181110111846p:plain


②データ宣言やデータ確保のためのユニットです。
 僕はオブジェクト指向を使わないので、
 グローバル変数用に UnitData.pas という名前で 1 つ用意しています。
unit UnitData;

interface

const
  cstExampleMax=100;

type
  TExample=record
    i: Integer;
    s: String;
  end;

var
  FirstLog: Boolean;
  CurrentDir: String;

  Example: Array[0..cstExampleMax-1] of TExample;
  ExampleMax: Integer;

implementation

end.


③実行結果の画面です。
f:id:programingcram:20181110112052p:plain

55.青空を 見上げてごらん 構文だ

Google 翻訳を英語学習に利用する Web アプリを作成しようと考えました。

想定している使用手順は
 以下、ブラウザで行います。
①青空文庫サイトから、作品一覧 csv ファイルをダウンロードします。
②作品一覧を Web アプリにアップロードします。
③青空文庫サイトから、好きな作家の作品ファイルを zip ファイルでダウンロードします。
 僕は『中島 敦』の作品を選んでみたいです。
④作品ファイルをそのまま Web アプリにアップロードします。
 以下、Web アプリで行います。
⑤作品ファイルを一覧から選択して、zip 展開します。
⑥展開された作品ファイルからルビ等をフィルターします。
⑦原作文を段落ごとに分けます。
⑧Google cloud translate API を利用して、英訳します。
⑨翻訳文を読んで補正し、登録します。
⑩段落単位に読書進捗を管理します。
⑪補正翻訳文、原作文を参照します。
⑫Google cloud translate に送信した文字数を管理します。
 1,000,000文字で $20 なので安くはないです。

効果:やってみないとわかりません。

この Web アプリを年内に完成させるペースで
勘所を紹介していきます。

54.ケンシロウ お前は すでに 日本人

ソフトウェアの『国際化』と『地域化』とは、
『国際化』は設計時に各国対応する仕組みを入れ込むこと、
『地域化』は具体的な対応を意味するようです。

『地域化』は日本で言えば、
江戸(吉原)、京都、大阪、東北、九州、沖縄への対応が
主要なものになります(嘘つき)。

CMS や Web フレームワークではあらかじめ
『国際化』機能が組み込まれているのが普通です。

英語で書くと長くなるので、
i18n、L10N と書かれることがあります。

この記法のクイズを作ってみました。

ある作家の作品の書き出しを
Google 翻訳した後、
名詞は単数形に変換してみることにしました。
誰の作品かわかりますか。


クイズ:
It is s3y d1y in s4g. U3r t1e g2e of t1e c5l of T2g D5y L5g, t3e w1s a y3g m1n w1o l4d up to t1e s1y i2y.


ヒント:
It is a t3g of a c5n d1y. Mr. B4a w4d r3d t1e e2e of t1e l3s p2d in p6e by h5f.

80.インプラで 夢はグローバル かけ廻る

インフラストラクチャー+プラットフォーム=インプラ
としました。

先日、PaaS である Heroku( Go 言語) と pythonanywhere を試用しました。

何かに例えて、印象を表現してみたいのですが…
何かHerokupythonanywhere
衣類制服スポーツウェア
ランチ幕の内弁当サンドイッチ
住まいタワーマンション下層階小さな土地付き一軒家
乗り物鉄道オフロードバイク
旅行周遊ツアー森林キャンプ
日本企業の技術でも Heroku と同じアプローチならサービスを提供できそうです。
しかし、pythonanywhere は人的リソースの面から不可能な感じがしました。

pythonanywhere には社会事業の香りがします。
価格は とても自重していると思います。
技術は魔法に見えます。今後、利用して魔法にあやかりたいです。

Heroku はユーザ名が日本語の場合は正常に Web アプリを配備できないようです。
気を付けましょう。

85.Plan Do Up したなら Continue

品質管理業務等の手法の 1 つである PDCA は
うまく回らないと言われることがあります。

PDCA の欠点は取り組みのすべてが能動的なこと、
継続がその外側に置かれていることにあると思います。

プログラミング学習にも計画と実行のために 
ある程度の時間は必要です。
継続のキーワードは Up =向上 だと考えています。

PDUC で行きましょう。

43.雨の日は チヂミ習慣 プログラム

ある会合に韓国人の方が全員分のチヂミを
持って来てくれたことがありました。

その日は あいにくの雨で、誰かが
「雨の日なのに大変でしたね」と気遣うと…
「雨の日はチジミなんです」と答えていたのを思い出しました。

雨の日はディスプレイの照り返しがないので、
プログラミングに適していると思います。

ここでは Python Flask Blueprint + MySQL での
Web アプリのスケルトンを紹介します。 

ファイル名や変数名は参照や区別し易いように
意味のある名称ではなく記号化して、
対応関係を強調している箇所があります。

作成に当たってはインターネット上の情報を
コピー、編集させてもらっています。


①フォルダ構成(2018/11/09 訂正して、お詫びします。ごめんなさい。)
src+
     +aaa+
     |     +__init__.py
     |     +func1.py
     +bbb+
     |     +__init__.py
     |     +func2.py
     +statics+
     |         +css
     |         +img
     |         +js
     +templates+
     |           +index.html
     +db.py
     +flask_server.py

  
   


②サーバ親
# coding:utf-8
#flask_server.py
from flask import Flask
from aaa import func1
from bbb import func2

application = Flask(__name__, template_folder='templates')

modules_define = [func1.app, func2.app, ]
for appl in modules_define:
        application.register_blueprint(appl)

if __name__ == '__main__':
    application.run(debug=True)


③機能分割1(データ種類により分けると良いと思います。)
# coding:utf-8
#func1.py
from flask import Blueprint
from flask import render_template
import db

# func1のBlueprint
app = Blueprint('xxxx', __name__, url_prefix='/prefix1')

conn_pool=db.get_connection_pool()

@app.route('/a')
deffunc1_a():
    
    try:
      conn=conn_pool.get_connection()
      cursor = conn.cursor()

      #stmt = "select * from table1 where name = '%s'"
      #cursor.execute(stmt % "name1")
      
      cursor.execute("select database()")
      result=cursor.fetchone();
      print(result) 
    
    finally:
      cursor.close();     
      conn.close();
          
    return render_template('index.html',)

@app.route('/b')
deffunc1_b():
    return'func1_b'


④機能分割2(データ種類により分けると良いと思います。)
# coding:utf-8
#func2.py
from flask import Blueprint
from flask import render_template
import db

# func2のBlueprint
app = Blueprint('yyyy', __name__, url_prefix='/prefix2')

conn_pool=db.get_connection_pool()

@app.route('/a')
deffunc2_a():
    
    try:
      conn=conn_pool.get_connection()
      cursor = conn.cursor()

      #stmt = "select * from table1 where name = '%s'"
      #cursor.execute(stmt % "name1")
      
      cursor.execute("select database()")
      result=cursor.fetchone();
      print(result) 
    
    finally:
      cursor.close();     
      conn.close();
          
    return render_template('index.html',)

@app.route('/b')
deffunc2_b():
    return 'func2_b'


⑤DB接続プール
# coding:utf-8
#db.py
import mysql.connector
from mysql.connector import pooling

defget_connection_pool():
    conn_pool = pooling.MySQLConnectionPool(pool_name="mysql_pool_1",
                                            pool_reset_session=True,
                                            pool_size=2,
                                            host = 'localhost',
                                            port = 3306,
                                            user = 'senryuu',
                                            password = 'senryuu',
                                            database = 'senryuu',
                                            allow_local_infile=True)
    
    return conn_pool


⑥テンプレート例
<!-- index.html -->
<!DOCTYPE html>
<html lang="ja">
  <head>
  </head>
  <body>

    <h1>Hello from index.html</h1>

  </body>
</html>

76.答案は 赤いシートの 下にあり

『川柳の投稿サイト』のテーブル構成案を示します。
正解というわけではありません。

共通
Idid
UUIDuuid
作成日時created
更新日時modified
①ユーザusers
ニックネームname
メールemail
パスワードpassword
②パスワードpasswords
ユーザIduser_id
メールIdemail
パスワードpassword
進捗progress
進捗Xprogressx
③セッションsessions
メールemail
ユーザIduser_id
お題Idtitle_id
投稿Idpost_id
④お題titles
お題title
投票予告日vote_announce
投票開始日vote_start
投票終了日vote_end
投票結果発表日vote_result
公開予告日public_announce
公開開始日public_start
公開終了日public_end
公開結果発表日public_result
⑤投稿posts
ユーザIduser_id
お題Idtitle_id
シリアル№serial
第一first
第二second
第三third
投稿フラグflag_post
公開フラグflag_public
投票集計poll_use_sum
メダル種別Idtype_medal_id
削除フラグflag_delete
⑥投票残poll_rests
ユーザIduser_id
お題Idtitle_id
投票残rest
⑦投票済poll_uses
ユーザIduser_id
お題Idtitle_id
投稿Idpost_id
投票済use
⑧入賞prises
ユーザIduser_id
お題Idtitle_id
投稿Idpost_id
メダル種別Idtype_medal_id
⑨レコード数record_counts
ユーザ数user_count
投稿数post_count
投票数poll_count
入賞数prise_count
⑩メダル種別type_medals
名称name
イメージファイル名image_filename

100.ミレニアム ファルコン定規 プレゼント

f:id:programingcram:20181028113913p:plain

ミレニアム ファルコン定規は
Web アプリ デッサンの進捗をプロモートします。

これは定規というよりもソロバンのようなもので、
頭の中に思い描くと Web アプリ構成を整理しやすくなります。

① User はユーザ、またはサービス対象でプログラムのこともあります。
② Menu はユーザ I/F 、または I/F 全般です。
③ Route は URL であったり、サーバ側のリクエスト分配機能です。
④ Input は入力、⑤ Process は処理、⑥ Output は出力で古典的な表現になります。
⑦ DeskTop はクライアント側のデータ保管領域です。
 サーバ側の属性データと見立てることも可能です。
⑧ DB はサーバ側の永続的データ保管領域です。

僕が Web アプリをデッサンする時は頭の中で単機で使用します。
チームの場合は編隊になるのかも知れません。

120.私たち、「◎▲」 に 決めました。

タイトルは『納骨堂の広告』のコピーです。

今後、月曜日にデッサン、火曜日にプログラムコードを
過去の記事をたどって、紹介していきます。
そのためにプログラミング言語を以下のように限定させてもらいます。

① Web アプリは Python の Web フレームワークである Flask で
  Blueprint を使って、ファイルを構成します。
② PC 上のユーティリティプログラム作成には主として、
  Delphi を使います。
③ PC 上のユーティリティプログラムで 
  Excel ファイルのアクセスが肝になるものには
  C# と EPPlus を使います。
④ PC 上のユーティリティプログラムで
 企業内で利用して、引継ぎが必要になりそうなものには
  Java を使います。

最近、何か決めましたか。

42.エンジンを ニンジンと読む 日本人

Nginx という Web サーバがあります。

『ウィキペディア』に まとまった解説があります。
【機能と特徴】に現在の Web サーバと 
その周辺機能が挙げられています。

クラウド上にWeb サーバを立ち上げる際に
ユーザが増えてきた時に対応する選択肢として、
考慮しておくと良いかも知れません。

企業の Web サーバであったり、
個人の Web サーバであっても、
最初から、かなりの数のユーザアクセスを集める自信があれば、
あらかじめ、Web サーバのフロントエンドに
Nginx を導入しておく手もあります。

H/W(仮想)を分けることで、
運用と管理の見通しが良くなるはずです。

75.夏休み 待ってる 一人スプリント

スプリントは Google Ventures で採用されている
デザイン手法です。

実施期間は 5 日間です。

これを一人でするのを僕は『一人スプリント』と呼んでいます。
パートナーがいれば『二人スプリント』でも良いです。
一人でも二人でも音節は一緒です。

普段は忙しい人でも、休みを犠牲にすれば、
Web アプリの設計ができます。

本を読み込むのは時間がかかるので、
調査等は事前に済ませておくと
実施期間中の時間を有効に使えます。

これをすると休暇明けの あのタイムラグみたいなものが
緩和されている気がします。
結局、休めていないだけかも知れません。

74.思い込み 砕くミニマム バイアブル

ミニマムバイアブルプロダクトは

書籍:
『スタートアップ・マニュアル』
ベンチャー創業から大企業の新事業立ち上げまで
スティーブン・G・ブランク+ボブ・ドーフ 著
堤 孝志+飯野将人 訳
(株式会社翔泳社)
の 49 ページに解説があります。

『川柳の投稿サイト』は それのアンチパターンになっています。
①顧客に話を聞いていない。
②最初から機能の盛り込み過ぎ。
僕には友達が一人いるけれど、
日本人ではないので、この件に関しては相談していません。

この程度のものであれば、
さっさと作ってしまってかまわないとは思いますが、
規模が大きかったり、法改正に絡んだり、
課金等クリティカルな機能を含む場合は
骨組みをしっかり設計して、利用者の要望に応じて、
徐々に肉付けしていくと大きな失敗は ないと思います。

普通の人は雪だるまは作れても、雪像は作れません。
自衛隊は さすがだと思います。

73.ER 緊急究明 オペレーション

ER は ER 図のことで、 E は Entity で実体と訳されています。
しっくりきませんが我慢します。R は関係の意味です。

表形式 DB の場合はテーブル名とその項目名を書いて、
実体を示し、矢印で関係を示します。
個人用に作成する時は矢印は描かなくて良いと思います。

これを作った後は項目のデータ型と長さを指定して、
テーブルを作成します。

ここまでくれば、足場機能がある環境の場合は
登録、参照、更新、削除機能のひな型を自動生成できます。
個人用であれば、充分、使用に耐えうるプログラムとなります。

ここで『川柳の投稿サイト』の ER 図を例として載せるのが普通ですが、
業務フロー図に増して、
わたしには描くのは とても無理と思われると困るので、
今のところは やめておきます。

業務フロー図は時間と場所等のキーワードを配置することで、形成できました。
四角の中に動詞を名詞化して記入して、結び付ければできあがりました。

しかし、ER 図を書くには その前に頭の中で
テーブル構成とその項目の設計ができあがっていなければなりません。
そのためにはユーザエクスペリエンスの文から
名詞間の所有または帰属関係を読み取る必要があります。
さらに名詞の陰に隠れた名詞(属性)を捜し出すことも必要になります。
これらのことは普通は無意識の内に行われます。
作業のほとんどは演繹的ではなく、
帰納的に身についていくものなので伝えるのは難しいです。
項目を洗い出した後は正規化と呼ばれる手法を使用します。
これは普通に問題なくできると思います。

業務フロー図は誰が書いても、ほぼ同じものができあがります。
しかし、ER 図は人によって、異なるものができることもあります。

例えば、家族で家事を分担するとして、
その予定と実績を記録する Web アプリを考えてみてください。

あなたなら、表をいくつ用意しますか。
僕なら、表をいつつ用意します。