C# – コンソールでコンパイル

csc.exeの場所を探す

 

v2.0.50727の中に発見。

 

ソースコードを準備

デスクトップ上にソースファイルを作成。ここではhello.csというファイル名で以下の内容を作成。

 

コマンドプロンプトに入力

まずコマンドプロンプトを開いてデスクトップに移動。

 

エクスプローラーでcsc.exeのフォルダーを開いて、csc.exeをコマンドプロンプトにドラッグアンドドロップすると、フルパスで入力してくれる。

 

半角スペースを入れて、デスクトップ上のソースファイルをドラッグ&ドロップすると、ソースファイルをフルパスで入力してくれる。

 

リターンキーを押してコンパイルすると、デスクトップにexeファイルが作成される。コンソールアプリケーションなら、このファイルをコマンドプロンプトにドラッグ&ドロップして実行。

 

コマンドプロンプトでデスクトップに移動済みなら、ソース、実行ファイルを直接タイプしてもよい。

 

Python – 図形を含むアニメーション

ArtistAnimationの場合

ArtistAnimationにグラフを追加するには、たとえばplotメソッドの戻り値をそのままリストに追加していけばよい。

ところが、matplotlib.patchesの図形の場合に同じようにすると、アニメーションにならず全フレームの図形が重ね書きされてしまう。

これを解決するには、appendの際に[]で囲んでリスト化する必要がある。

以下は円の図形のアニメーションのコード例。

実行結果は以下の通り。

グラフと図形の重ね合わせ

グラフと図形を重ね合わせるときも、patchesの図形を明示的にリストとしてappendする必要がある。

以下は、plotによる線とpatches.Circleによる円を重ねて描く例。

実行結果は以下の通り。

FuncAnimationの場合

FuncAnimationの場合は描画関数中でグラフを描くだけで、ArtistAnimationのようなコレクションを用いない。

この場合はArtistAnimationより簡明で、グラフはAxesオブジェクトなどに描画、図形はadd_artistメソッドで追加するだけ。

以下はArtistAnimationと同じく、plotによる線とpatches.Circleによる円を重ね牡蠣する例。

 

Python – FuncAnimationによる動画表示

概要

Pythonのmatplotlibにはanimationパッケージがあり、ArtistAnimationFuncAnimationの2つのクラスが準備されている。

  • ArtistAnimationは、予め動画に表示する各フレームを生成しておいて、これらを動画として表示する
  • FuncAnimationは、全結果を保存せず、フレームごとに描画を実行する関数を実行して、動画して表示する

ここでは、FuncAnimationによる動画の表示方法を整理する(ArtistAnimationについてはこちら)。

1つのグラフの表示

流れ

  1. animationパッケージ又はArtistAnimationクラスをインポート
  2. グラフを描画する関数を定義
  3. FuncAnimationクラスのコンストラクターに描画関数を渡してインスタンスを生成
  4. 表示

処理ステップ

インポート

パッケージをインポートする

または

フレームリストの準備

動画の各フレームを保存するリストを準備する。animationパッケージでは、個々のグラフフレームをartistと表現している。

FigureとAxesオブジェクトを準備

フレームを描画するオブジェクトを準備しておく

1フレームを描画する関数を定義

4周期分の正弦関数を描画する関数を定義している。

  • ここではループごとにxを計算しているが、今回は全フレーム共通なので、ループの外で準備してもよい
  • plot命令のcolor指定をしないと、描画するごとに違うグラフとして色を変えて描画されてしまう

アニメーション設定して表示させる

FuncAnimationクラスのコンストラクターに必要な引数を与えてインスタンスを生成し、表示させる。intervalはフレーム間の待機時間で、ミリ秒で与える。

GIF画像として保存する

結果をGIF画像として保存するには、plt.show()を実行せず、以下のようにimagemagicでファイルとして書き出す。

frames=20でフレーム数を設定しているが、これがないとGIF保存のときにファイル容量が肥大化してしまう。それでも容量は800KB程度になり、ArtistAnimationのときの150KB程度よりも大きい。

実行結果

以下のような動画が表示される。

コード

全体の実行コードは以下のとおり。

複数のグラフの表示

流れ

全体の流れは単一のグラフの場合と同じ。リスト保存時に複数グラフを加算して重ね合わせるところだけが異なる。

  1. animationパッケージ又はArtistAnimationクラスをインポート
  2. グラフを描画する関数を定義し、複数のグラフをプロット
  3. FuncAnimationクラスのコンストラクターに描画関数を渡してインスタンスを生成
  4. 表示

処理ステップ

以下の描画関数が単一グラフの場合と異なる。関数の中で、異なる2つのグラフを描画している

実行結果

以下のように、2つのグラフが同時に表示される。

コード

全体の実行コードは以下のとおり。

描画関数に引数を渡す

描画関数に独自の引数を渡すことができる。

たとえば最初の「1つのグラフの表示」で、frame_countと表示する最大時刻max_xを引数とする場合、まず描画関数でこれらを引数として宣言し、関数内でこれを使った処理を書く。

FuncAnimationインスタンス生成時に、fargsで独自宣言した引数の値をタプルで与える。

 

Python – ArtistAnimationによる動画表示

概要

Pythonのmatplotlibにはanimationパッケージがあり、ArtistAnimationFuncAnimationの2つのクラスが準備されている。

  • ArtistAnimationは、予め動画に表示する各フレームを生成しておいて、これらを動画として表示する
  • FuncAnimationは、全結果を保存せず、フレームごとに描画を実行する関数を実行して、動画して表示する

ここでは、ArtistAnimationによる動画の表示方法を整理する(FuncAnimationについてはこちら)。

1つのグラフの表示

流れ

  1. animationパッケージ又はArtistAnimationクラスをインポート
  2. フレームの数だけグラフを描画してリストに保存
  3. フレームリストを渡してArtistAnimationインスタンスを生成
  4. 表示

処理ステップ

インポート

パッケージをインポートする

または

フレームリストの準備

動画の各フレームを保存するリストを準備する。animationパッケージでは、個々のグラフフレームをartistと表現している。

FigureとAxesオブジェクトを準備

フレームを描画するオブジェクトを準備しておく

フレーム数を指定して各フレームを保存する

以下ではフレーム数を20として、20回分のグラフを少しずつずらして描画して保存している。

ここではグラフを正弦波として、1周期分を20分割して表示させている。

  • ここではループごとにxを計算しているが、今回は全フレーム共通なので、ループの外で準備してもよい
  • plot命令のcolor指定をしないと、描画するごとに違うグラフとして色を変えて描画されてしまう
  • 描画結果はオブジェクトとして、先に準備したartistコレクションに追加している

アニメーション設定して表示させる

ArtistAnimationクラスのコンストラクターに必要な引数を与えてインスタンスを生成し、表示させる。intervalはフレーム間の待機時間で、ミリ秒で与える。

GIF画像として保存する

結果をGIF画像として保存するには、plt.show()を実行せず、以下のようにimagemagicでファイルとして書き出す。

実行結果

以下のような動画が表示される。

コード

全体の実行コードは以下のとおり。

複数のグラフの表示

流れ

全体の流れは単一のグラフの場合と同じ。リスト保存時に複数グラフを加算して重ね合わせるところだけが異なる。

  1. animationパッケージ又はArtistAnimationクラスをインポート
  2. フレームの数だけグラフを描画して、重ね合わせてリストに保存
  3. フレームリストを渡してArtistAnimationインスタンスを生成
  4. 表示

処理ステップ

以下の部分だけが単一グラフの場合と異なる。2つのグラフを描画し、そのオブジェクトを加算して1フレームとした上でartistsに追加している

実行結果

以下のように、2つのグラフが同時に表示される。

コード

全体の実行コードは以下のとおり。

図形を含むアニメーション

matplotlib.patchesによる図形を含んでアニメーション表示するには、少し工夫がいる。その方法はこちら

 

PythonCGI – 基本

概要

PythonのコードでCGI(Common Gateway Interface)によってHTMLをする方法の基本。

基本の枠組み

コード例

例えば以下の内容をindex.pyとして準備。

  1. SheBangでPythonの場所を指定
  2. Content-Typeを出力して1行空ける
  3. 出力内容を記述

HTTPのヘッダーで最低限Content-Typeを出力し、ボディーとの間に空行が1行必要。これがないと、500エラーとなり、ログには以下の様に記録される。

コードのモード確認

ファイルがrootの実行権限を持っていること。実行権限がない場合はchmod 755chmod +xで設定する。

コードの配置

cgi実行用のディレクトリーにファイルを配置。Apacheの場合例えば/var/www/cgi-binなど。

ブラウザ表示

URLで[ホスト]/cgi-bin/index.pyを指定すると、ブラウザーにPython CGI Testと表示される。

HTML出力例

ASCII出力

基本の枠組みの出力に、以下の様にタグを加えると要素として表示される。

UTF-8出力

上のコードの一部を日本語にしてみる。

ところがこれをブラウザーで確認すると、h1要素は表示されるがp要素が全く表示されない。ソースを確認してもh1要素の行が表示されるだけ(このコードをコンソールで実行すると、h1要素の行もp要素の行も表示される)。

これを解決するには、ソースコードでio.TextIOWrapperを実行するとよいらしい。

上記の2行を追加すると、無事日本語まで表示された。

HTML出力

コンテンツを以下の様にHTMLの構造にして出力する。title要素も機能して、タブの表示が変更された。

ループの利用例

以下のコードでは、見栄えは良くないがforループでli要素を生成している。

出力に以下が加わる。

  1. 1番目のli要素
  2. 2番目のli要素
  3. 3番目のli要素
  4. 4番目のli要素
  5. 5番目のli要素

Apacheの設定

今回は/etc/httpd/conf/httpd.confのデフォルトのままでcgi-scriptの設定を加えていないが、そのままで適切に実行された。

 

2次元リストの結合

概要

2次元リスト同士の結合について整理。

  • 縦方向の結合
    • appendはループが必要
    • extendは破壊的に結合
    • +演算子は非破壊的に結合
  • 横方向の結合
    • extendでループが必要
    • +演算子はループの方法に注意

縦方向の結合

appendは要注意

1次元のリストの場合と同じく、appendは引数全体を要素として追加してしまう。

追加されるリストの各行を取り出して追加すれば可能。ただし破壊的。

extendはok(破壊的)

extendは引数のリストの内容をそのまま追加してくれる。ただし破壊的。

+演算子もok(非破壊的)

+演算子もextendと同じ挙動だが非破壊的。

横方向の結合

extendで一手間必要

extendで各要素に追加する場合、各要素をループで取出して追加する必要がある。

カウンターではなく要素を直接取り出してもok。

+演算子は要注意

+演算子で結合する場合は、結果のリストを準備しておく必要がある。このとき、結合するリストと同じ要素数(行数)の空のリストを要素に持つリストを準備しておく必要がある。

また、ループはカウンターを使って添字でリスト要素を指定しなければならない。

要素を直接取り出して演算した場合、変数が新たに作成されるがその結果は元のリストには反映されないので注意。

 

リストの追加・結合

概要

リストに対する要素の追加、リストの結合について整理。

  • リストへの1つの要素の追加
    • appendが簡明、ただし破壊的
    • extendも使えるがリストとして追加、破壊的
    • +演算子もリストとして追加、非破壊的
  • リスト同士の結合
    • appendは使えない
    • extendは破壊的にリストを追加
    • +演算子は非破壊的にリストを追加

リストへの要素の追加

appendは破壊的

appendで1つの要素をリストに追加できる。appendは破壊的で元のリストを改変する。戻り値はNone

appendは1つの引数しか持てない(append(4, 5)とはできない)。

extendはリストを追加(破壊的)

extendでも要素を追加できるが、要素そのものではなく、追加したい要素を含むリストとして追加する。extendは破壊的で元のリストを改変する。戻り値はNone

+演算子もリストの演算(非破壊的)

+演算子もextendと同じくリストを追加する。extendと違って非破壊的で、元のリストは改変されず、結果は戻り値で返される。

リストの結合

appendは使えない

appendは引数をリストの要素として追加するので、リストを引数に与えるとそのリストが要素として追加されてしまう。

extendはOk(破壊的)

extendは引数に与えたリストで元のリストを拡張する。ただし破壊的で元のリストが改変される。

+演算子もOk(非破壊的)

+演算子もextendと同じくリストを拡張するが非破壊的。拡張と言うよりも、くっつける/追加するというイメージ。

 

JS/ES – Promise

非同期実行の簡単な例

以下の例では2つのブロックが非同期に実行され、コードが書かれた順番ではなく実行時間の短い順に出力される。

Promiseによる実行順序の保証

基本形

Promiseオブジェクト.then()

この基本形では、以下の手順で処理間を同期させる。

  1. Promiseオブジェクト生成
    • 生成時の引数で渡す無名関数に先行処理を記述
    • 無名関数の引数で処理終了を発行する関数(resolve)を受け取り
    • 先行処理終了のところでresolve関数を実行
  2. Promiseオブジェクトのthenメソッドを記述
    • thenメソッドの引数で渡す無名処理に後続処理を記述
    • この後続処理は、先行処理のresolve関数が実行された後に実行される

処理完了のための関数名は任意だが、staticメソッドと同じ関数名のresolveが使われる。

以下の例では、Promise・・・・・・・・・・・・・無名関数の引数をresolveとして受け取り、resolve関数を300ms待機後の表示の後に実行している。

そしてその実行後に100ms待機の処理が実行される。

Promiseオブジェクトのthenメソッドには引数に無名関数を指定する。Promiseオブジェクトで設定したresolveメソッドが実行された後に引数の無名関数が実行される。

以下の例では、上のPromiseオブジェクトで設定した300ms待機後の表示の後に、thenメソッドで設定した100ms待機・表示が実行される。

new Promise~then

生成したPromiseオブジェクトから直接thenメソッドを実行してもよい。

Promiseオブジェクトを返す

優先実行させたい処理をPromiseオブジェクトとして、そのインスタンスを関数の戻り値とする書き方。関数にthenメソッドが適用できる。

resolveで値を渡す

resolve関数に引数を渡し、これをthenメソッドで受け取ることができる。

thenのチェイン

thenメソッドを連ねてシリアルに実行させる書き方。後続を持つthenメソッドの戻り値をPromiseオブジェクトとするのがミソ。

reject

Promiseの処理で何らかの問題が生じた場合にrejectすることができる。この場合、resolveが実行されないのでthenは処理されず、直近のcatchが呼ばれる。

以下の例ではPromiseオブジェクトで300msのブロックの最後でrejectが実行され、thenメソッドは実行されずにcatchメソッドが実行される。

 

Promise.all~全ての実行を待機

 

MapLibre – GeoJSONのソースを描画する

基本形

  • Mapオブジェクトのonメソッドで、マップのロード後処理として記述する
  • MapオブジェクトのaddSourceメソッドで図形を定義し、addLayerメソッドでレンダリング方法などを記述する
  • addLayerでソースIDを指定する

addSource

  • 第1引数でソースIDを設定し、第2引数に図形のGeoJSONを記述する

addLayer

詳細はMapLibreのLayerのドキュメントを参照。

  • id:一意なレイヤーID
  • type:形状タイプ
    • 'fill', 'line', 'symbol', 'circle', 'heatmap', 'fill-extrusion', 'raster', 'hillshade', 'background'
    • 形状タイプごとの描画仕様は、その内容によってlayoutpaintで指定する
  • source:このレイヤーに描かれるソースのIDを指定
  • layout:形状タイプごとの描画スタイルを設定
    • たとえば'line'の場合、'line-width', 'line-cap', 'line-join'など
  • paint:図形を描く色などを指定
    • たとえば'circle'の場合、'circle-color', 'circle-radius'など

図形の描画例

 

Python3 – WebAPI

概要

PythonでWebAPIによってデータをリクエストして取得する方法をまとめる。ここでは郵便番号配信サービスのzipcloudのAPIを利用する。

流れは以下の通り。

  1. 準備
    1. urllib.requestライブラリーのインポート
    2. APIエンドポイントURLのセット
    3. パラメーターのセット
    4. パラメーターのエンコード
  2. リクエストとレスポンス
    1. Requestオブジェクトの生成
    2. リクエスト実行とResponseオブジェクトの取得
  3. レスポンスオブジェクトのデコード

API仕様

zipcloudサイトの郵便番号検索APIの内容をまとめると以下の通り。

  • リクエストURL:https://zipcloud.ibsnet.co.jp/api/search
  • リクエストパラメーター
    • zipcode~必須~郵便番号(ハイフンなし7桁の数字)
    • callback~オプション~JSONPとして出力する際のコールバック関数名
    • limit~オプション~同一の郵便番号で複数のデータが存在する場合に返される上限件数(デフォルト20)
    • urlパターンの例:https://zipcloud.ibsnet.co.jp/api/search?zipcode=1330051

コード

最初に実行コードの全体を示す。

コード説明

準備

urllib.requestライブラリーのインポート

HTTPリクエストに必要なurllib.requestライブラリーをインポートする。

APIエンドポイントURLのセット

ここではzipcloudのAPIエンドポイントのURLを変数urlにセットする。

リクエストパラメーターのセット

リクエストパラメーターを辞書でセット。ここでは仕様に従ってzipcode'1130051'を与えている。

パラメーターのエンコード

リクエストに備えて、パラメーター文字列をバイト列にエンコード。ここでは一般的なutf-8を指定しているが、郵便番号は半角数字なのでasciishift_jisでも同じ結果となる。その形式は

urllib.parse.urlencode(パラメーター辞書).encode('文字コード')

リクエストとレスポンス

Requestオブジェクトの生成

ベースのURLとエンコードされたパラメーターを与えてRequestオブジェクトを生成する。

urllib.request.Request(URL文字列, data=エンコード後のパラメーター)

リクエスト実行とResponseオブジェクト取得

リクエストはRequestオブジェクトを引数としてurlopenメソッドを実行。戻り値は結果のResponseオブジェクト。

Responseオブジェクトのデコード

取得したままのResponseオブジェクトをそのまま表示しても、クラスの文字列表現となるだけ。

そこで、文字コードを指定してデコードしてやる。ここではutf-8を指定している。

response.read().decode(文字コード)

結果は文字コードで指定されたエンコード方式でデコードされ、レスポンスの文字列が得られる。

zipcloudのレスポンスはJSON形式でインデント整形された文字列となるが、あくまで文字列であり、要素を指定した値の取出しはできない。

JSON文字列の取り扱い

準備

JSON形式の文字列を辞書として読み込んだり、整形表示をしてみる(PythonでのJSONの取り扱い)。

まず、JSONを扱うにはjsonライブラリーが必要。

辞書への展開

JSON形式の文字列をPythonの辞書として取り込む。

json.loads(JSON形式の文字列)

レスポンス内容の取出し

これはzipcloudの仕様になるが、レスポンスのJSONデータのレスポンス部分は入れ子の内側('response'キーに対応)にあるので、これを取り出す。

同じ郵便番号に複数の住所が存在する場合もあるが、ここでは最初の1つだけ取り出している。

JSON形式での整形出力

辞書の内容を再度整形して文字列化する。

json.dumps(辞書, indent=桁数)

ただし、このままではマルチバイト文字が16進にエスケープされてしまう。

エスケープの抑制

json.dumpsでエスケープを抑制することで、もとの文字コードに基づいて処理される。エスケープを抑制するためには引数でensure_ascii=Falseをセットする。