相変わらずコピペしてます。いえ、Python書いてます。
お久しぶりです
かなりこのブログも放置していますが、こんなブログでも毎日何人かの方が訪れていることに驚きを隠せません。
とはいっても、どこのページを目掛けてこられたのかも確認していませんし、確認したところでその記事に追加出来る情報も持っていないのでそっとしてあります...
今何やってんの?
今はどんなことをしているかというと、主にPythonを書いています。
で、昔はこのブログに何かか書きかけていたよなーと、ふと思い出し、自分自身が再訪したという所です。
ということで、おそらくお久しぶりですって言葉は、自分自身以外には当てはまらないかな。
何しに来たの?
さて、Pythonを書いているとはいうものの、結局コピペプログラマーはコピペ以外はしていません。 最近では随分手抜きが進化したもので、エディタで特定キーワードを入力するとスニペットが展開され、そのキーワードだけ書き換えて日々過ごしています。
そんなこんなで、今度はPythonに関するネタがある程度あるので、それをブログにまとめようとしているのですが、、、
ただ、このサイトにはもうその役目を負わせるのは違うかなとも思うので、別にサイトを立ち上げています。
外からリンクされているのも意味があるとということなので、自分でやって意味あるかどうかは知りませんが、ちょっとやってみます。
最終的には?
最終目標は何なのかは自分でもはっきりしませんが、このサイトの目標はきっとPythonを書くことで空を飛ぶことだと思われます。
飛べるかどうかは私にも分かりませんが、とりあえずチャレンジしていないことは為しえないの法則だけは成り立つと信じてやってみます。
Python/Djangoを使ってWebアプリケーション開発
DjangoでWebアプリケーション開発
Hello Python、Hello Excelとアプリの開発環境の構築から実際の開発、そして動作確認を行った後、いよいよDjangoというWebアプリケーションフレームワークをつかった開発について解説します。
比較対象として並べられることの多いPHP、Ruby、JavaScriptなどがWebシステムを開発するための言語であるかのごとく扱われがちなのに対して、Pythonというプログラミング言語はかならずしもWebの世界が主戦場というわけではありません。
実際とある調査によると、Webアプリケーション用途が26%なのに対して、データ解析や機械学習などのデータサイエンスの分野が27%と、Webの分野は2番手という調査もあるようです。その他、システム管理の用途で使われたりするのもよく見かけますね。
ですので、Django自体を取り上げるのは少し微妙な感じではありますが、それでもPythonを学習する理由としては1/4は締めていると前向きに考えて突き進んでいきたいと思います。
Djangoとは
いわゆるMVCデザインパターンに緩やかに従ったWebアプリケーションフレームワークです。
大雑把に言えば、urls.pyがURLディスパッチャーで、views.pyがメインロジック、modles.py がデータモデルを担当し、DjangoがO/Rマッパーを提供することで、基本的にはSQLを書かずにWebアプリケーションを開発することを可能にしています。
コンテンツ
現時点で以下のコンテンツが準備されています。
Djangoのプロジェクトを作成し、アプリケーションを1つ作成します。 ここまでで、一通りのWebアプリとして動作させるところを解説しています。
そのあと、より詳細な内容として、静的ファイル、モデル、マイグレーションと解説しています。
今後はビューについてのより詳細な内容の解説を予定しているほか、API KEYの実装や、トランザクション、どうしても必要に迫られたときのために素のSQLを書く方法など、実際のDjangoアプリ開発に必須の内容を提供予定です。
記事の構成
これまでの記事と少し形式が変わります。それまでは完成形のソースコードを提示してから、それにたどり着くために一からどんなプログラミングを施していくかという流れでしたが、さすがにフレームワークであるDjangoのアプリですので無理があります。
ですので、一部順序通りに説明が出来ていない部分や、それまでに紹介したアプリの開発具合とは異なったところを出発点にするなど、完全なるステップバイステップにはなっていない部分が登場するかと思います。
PythonでExcelを扱ってみよう
Hello Excel
PythonでExcelファイルを扱うという、とてもとても具体的で、内容そのものは他に何の応用も出来ない題材を選んでいます。
具体的すぎるというのは承知の上です。
そんなこといっても、架空の題材をでっち上げてサンプルアプリ的に作るって言うのはよくある話で、私も研修資料を開発していた頃にはよくやっていました。
でも自分自身も含めて、具体性が無いんですよね。可能性をあまり感じないんですよ。
思いっきり具体的に
そこで思い切って、執筆時にまさに取りかかってた題材をそのまま使ってしまえってなもので。
Excelシートを住所録的に使っていたファイルがあり、残念なことに郵便番号が入力されていません。 そのため記入されている住所を元に郵便番号をWeb検索し、その結果を郵便番号欄に記録するというのをやってみています。
ここでは次の要素が登場します。
Excelファイル扱うためにPandas
Pandasを使う動機に、不純とかそういう表現があるかどうかは知りませんが、あまり聞かない動機かも知れません。 でも、Pandas経由で使えることを知れば、Python使っててExcelでデータ処理してるの?って自問し始め、Pandasに興味を持てればそれもありかなとも思っています。
PandasでExcelファイルを読み込むと、どんな風にデータが展開されて、どんな風にデータを扱えば良いのかが分かるようになっています。
Padasについては、もっと詳しく取り上げようとしていて、以下の記事を皮切りに、シリーズ的に投稿中なので、そちらも是非見てください。
その他の要素
その他の要素として、Pythonプログラムの中からHTTPリクエストを実行して、本来であればWebブラウザ上で表示される内容をプログラムで処理することで郵便番号を手に入れようとしています。 HTTPリクエストには、requestsパッケージを利用し、HTMLの解析にはHTMLParserが登場します。
もちろんExcelファイルを読み込むだけでは無くて、結果を書き込むところも登場します。
ただ、ラストワンマイルともうしますが、思いっきり個別具体的な対応方法については掲載していません。 その辺は記事を読んで頂ければ、なんとなく許してもらえるかなぁと...
それではもしよろしければ、お読み頂ければと思います。
法人検索システムを開発しました
法人検索システム
ここのところPythonを主に触っているという投稿をしているかと思います。 そんな中でも、実際にDjangoを使ったWebアプリケーションとして、個人的に法人検索システムを開発し公開しました。
この法人検索システムとは、国税局が提供しているhttps://www.houjin-bangou.nta.go.jp/のコピーサイトのようなものです。
より具体的には、住所(都道府県+市区町村+住所詳細)あるいは法人名で検索可能で、法人番号とそれに紐付く法人情報を提供するシステムです。
法人番号は、法人名を変えたり所在地を変更したりしても変わることがない、会社にとってのマイナンバーのような物です。 そしてどこかの法人に吸収されたり合併したりしてもその記録が残り、会社の情報を追いかけることが可能です。
コピーサイトってどういうこと?
実は国税庁が提供している情報は完全に公開されています。 この「完全に公開」には、2つの意味があります。
1つは、扱っている情報そのものは法律により広く公に開示し誰でも利用可能とされています。 さきほど法人番号をマイナンバーに例えましたが、会社を設立(登記)すると割り振られる番号でマイナンバーとは違って公にする番号です。
もう1つは、国税庁のWebサイトのデータは完全に公開、提供されるということです。平たく言うとダウンロード可能なのです。
従って、国税庁のWebサイトの説明を読めば明らかですが、国税庁からデータを入手してコピーサイトの類いを作ることは完全に自由です。
国税庁が公開しているデータについてもう少し厳密に言うと、最新情報だけであれば誰でも今すぐダウンロード出来ます。 CSVファイルで提供されているので、Excel等に展開して、、、うーん、ちょっとデータ量が多すぎてExcelでは無理かも知れません。 が、原理的にはそういうことです。
すぐに手に入る情報が最新情報のみというのは次のような構図です。
株式会社Aが0001番の法人番号を持っているとします。そして前の社名がB株式会社だったとします。
最新情報のみなので、CSVではB株式会社の情報や過去に存在していた事実も分かりません。
国税庁のデータは法人番号が起点になっていて、この番号は会社名や住所などの情報が変わっても変わりません。ですので、国税庁のシステムでは、0001番の最新情報に株式会社Aが存在し、0001番の1つ古い情報にB株式会社が存在しているといった具合です。
Web API
ここからがお役所にしてはやるじゃんって部分なのですが、データの提供はCSVでのダウンロードの他にWeb APIが用意されています。 そしてWeb API経由であれば、履歴である過去のデータについても取得できます。Web APIの利用は誰でも無料で可能です。
裏を返せば、履歴を含めて完全な情報をに入れようとおもうと、Web APIを用いる必要があります。
WebAPIを利用するに当たって、次の文言を掲示していくことが定められています。
「このサービスは、国税庁法人番号システムのWeb-API機能を利用して取得した情報をもとに作成しているが、サービスの内容は国税庁によって保証されたものではない」
はい、そうですね。『コピーサイトを作る場合』に、きちんとこれを示しておくようにというお達しです。 ですので、繰り返しになりますが、自由にコピーサイトを作って問題はないのです。
Web APIを使用するには申し込みが必要です。
とは言っても、審査とか、許可とか言った類いの事はなく、完全なる登録ごとです。 その際、Web APIによるアクセスが集中すると国税庁側が困るので、APIの利用形態、頻度やタイミングの類いのヒアリング(申し込み時に記載するだけ)と その後の調整が出来るように連絡先(電話番号)に連絡が来る可能性がある、というだけのことです。
申し込み自体はWebか紙かのどちらかで申請し、完了すると書面にて連絡が届きます。
その書面にApp Key が記載されていてそれを使えばWeb APIが応答してくれるという流れです。
あなたも法人検索システム開発出来ます
ということで、現在進行中のPythonの解説を読んで、国税庁のサイトをみれば、コピーサイトはご自身でも立ち上げることが可能となります。
Python 入門
せっかくなので、どんなことを書いているか、少しずつ紹介してみます。
Python入門
内容としては、初めてPythonを触るのに必要となる環境構築から解説を始めています。
自分自身はMacを使っているのですが、一応LinuxとWindowsについても環境構築について触れています。 普段はMacで書いて、Linuxで動かすという流れですね。
教科書的な順序で説明していくのは大分骨が折れますし、そもそも「まだそれ説明してないじゃん」を回避しながら記事を書くのはとても大変です。 目的は自分が経験した内容の記録を残しておくという意味合いが強いので、そういうのを気にはしつつも、やりたいこと、説明したいこと中心に進めて行く感じで書いています。
前提としているPythonは3.8.1 ということで新しめです。
コンテンツ
環境構築
まずは、環境構築の手順です。
で、今気がついたのですが、Windowsがネイティブな環境構築じゃないですね。ま、いまさらWSLを使っていない人はいないかも知れないですし、VSCodeだってWSL内のファイルを普通に扱えるので、このさいWindowsは諦めてLinux化してみて下さい。
Hello Python
処理の内容は整数の四則演算ですが、実際にPythonプログラムに登場する基本的な要素を織り交ぜたものにします。
Hello Excel
Hello Pythonで基本をマスターした後は、無限の可能性があるわけですが、その中の1つとしてExcelで作成したファイルを操作してみたいと思います。おそらくどんな素晴らしい仮想的な題材を考え出したとしても、それが全て人のおかれた状況にマッチすることはあり得ないので、潔く完全リアルケースを題材にします。
Hello Django
最後は、DjangoというWebアプリケーションを作成するためのフレームワークを前提に、Webアプリケーションを作成してみたいと思います。このアプリは題材云々というよりは、オーソドックスに一通り解説するべきところを解説した後は、こんな時どうする?というTipsを中心に扱っていきたいと思います。
こんな内容です。もし良かったら訪問してみてください。
JavaScript 非同期処理 ループ 終了待ち 同期処理 同期実行
やりたいこと
一言で言うと
非同期処理をループで回して、終わりを待ちたい
複数行で言うと
題材は何でも良いのですが、ここではデータベースのTable_A, Table_B, Table_Cのレコード数を取り出し、その和(10+20+30=60)を求めたいとします。
let sum = 0 for (const label in ["A", "B", "C"]) { sum += select count(*)してくれる関数("Table_" + label) } console.log(sum)
この例はおそらくsumが0として残念な結果になると思います。 で、この記事を読む動機を持った方は、大げさに言うと下のようなことになりたくないといった感じでしょうか。
count("Table_A").then(result => { sum += result count("Table_B").then(result => { sum += result count("Table_C").then(result => { sum += result console.log(sum) } } }
ここまでひどくは無くても、then.then.then と君の名は。状態は避けたいと。そして、ループで処理したいよねと。 それをここでは扱います。
なので
ここまででお分かりの方には「同期処理」や「同期実行」という話題は扱わないというのがお分かりかと思いますが 私含めて、この「やりたいこと」を考えているときには、自分の考えていることと検索キーワードの不一致に気がついて いなかったので、あえてこう書きました。
実食
使うのはPrpmise.all()です。
これまで「なにそれおいしいの?」と思っていた方、「なんだかよくわかんねーな」と思っていた方、意味分からなくてもこのひな形をコピペすれば、一応終了待ちは出来ますので是非。
意味分からなくてもスイッチ押せばエンジンはかかるんですよ。え、なに?お宅のはモーターだって?大丈夫、ちゃんとエンジンブレーキもききますって。ま、あとは、勉強するなり、実験するなり、意味が分からないまま使い続けるなり、お好きにすれば良いと思います。でもボタン押さないのはもったいない。
Promise.all()
ここでは、DBアクセスの代わりにsetTimeout()を使っています。
let sum = 0 const test = function(param) { return new Promise( function(resolve, reject) { setTimeout(function(){ sum += param resolve(sum) }, param*1000) }) } const promises = [] promises.push(test(3)) promises.push(test(5)) Promise.all(promises).then(function(result) { console.log("result: " + JSON.stringify(result)) console.log("sum: " + sum) }).catch(err => { console.log("err: " + JSON.stringify(err)) }) console.log("sum: " + sum)
これで無事に、合計値が得られます
sum: 0 result: [3,8] sum: 8
やりたいことをsetTimeout()の箇所に記載すればいいわけです。
補足
Promise.all()は処理の合流
Promise.all()は同期的に実行しているわけではありません。あくまで終了待ち、処理を合流させるために使うものです。 そして、それは指定した処理だけの話です。次のコードを実行すればそれが分かります。
console.log("begin") let sum = 0 const test = function(param) { console.log("2 " + param + "秒") return new Promise( function(resolve, reject) { console.log("3") setTimeout(function(){ console.log("5 " + param + "秒待ち") sum += param resolve(sum) }, param*1000) console.log("4") }) } console.log("1") const promises = [] promises.push(test(3)) console.log("6.1: sum: " + sum) promises.push(test(5)) setTimeout(function() { console.log("6.2: sum: " + sum) }, 6000) setTimeout(function() { console.log("7") Promise.all(promises).then(function(result) { console.log("8.1: result: " + JSON.stringify(result)) console.log("8.1: sum: " + sum) }).catch(err => { console.log("8.2: err: " + JSON.stringify(err)) }) }, 7000) console.log("end")
結果
begin 1 2 3秒 3 4 6.1: sum: 0 2 5秒 3 4 end 5 3秒待ち 5 5秒待ち 6.2: sum: 8 7 8.1: result: [3,8] 8.1: sum: 8
考えてみれば当たり前ですが、二つの処理はpromisesにpush()された行で動き始めるので、5.x秒後には終わっているはずです。 なので、6秒後に結果を確認すると結果は出そろっています。このコードでは「合流して確認」という作業を7秒後に発動させているだけです。 Primise.all()を使うと、この5.x秒とかを意識せずに、すでに終わっていようが終わっていまいが、合流後の処理を記載できるということに過ぎません。 そして、このPromise.all()を囲っているsetTimeout()を外すと次の結果となり、Promise.all()自体も非同期処理としてその先に進んでしまっているので、ここで全体が待ってくれているわけではありません。
begin 1 2 3秒 3 4 6.1: sum: 0 2 5秒 3 4 7 end 5 3秒待ち 5 5秒待ち 8.1: result: [3,8] 8.1: sum: 8 6.2: sum: 8
JavaやC++の類いでもスレッドの扱いで面倒があったかと思いますが。ただ世界をひっくり返しただけなので別に楽も苦労もしていません。隣の芝、青かった?使用人の皆さん、よくおっしゃるんですよねー。
JavaScript 整数 商 余り
やりたいこと
一言で言うと
整数の商と余りを知りたい
複数行で言うと
次の数式で表したときの商:3、余り:1を得たい
10 ÷ 3 = 3 ・・・1
実食
まずはやってみる
先に言っておくと、残念な例です。
const value = 10 console.log( value / 3 ) console.log( value % 3 )
結果は以下の通り。
3.3333333333333335 1
余りは予定通りとれますが、商は残念な感じです。この世がすべてNumberだということを忘れていました。
でも、これは乗り越えられます。こちら で書いたとおり。
これが答え
こうすれば、
const value = 10 console.log( Math.floor(value / 3 ) ) console.log( value % 3 )
この通り。
3 1
この動作は別に闇でもないし、当然の結果と言える。でも、他のことと併せて考えると、どんだけ捻くれているんだと。