pythonのcgi moduleのめも
社内でpython製のものをデモするために簡単なcgiを作ろうとしたら、意外と引っかかったのでメモ。
cgi.FieldStorage() → 辞書型
postやgetを受けるcgi.FieldStorage()は、辞書型のようで辞書型でなく、バグの温床になりそうなので変換して使う。
import cgi form = cgi.FieldStorage() form_dict={} for key in form.keys(): form_dict[key] = form.getvalue(key)
cgi.FieldStorage() のエンコード指定
cgi.FieldStorage(encording='utf-8')
webは何があるか分からないのでencodeを指定する
<input type=“checkbox”>の判定
チェックが入るとcgi.FieldStorage()["key"].value
にstring型で'on'
と入る。チェックがないときはcgi.FieldStorage()
にキー自体が無い。
ただ、仮に'off'
とかが入ってくると怖いので、strの'on'
に等しいかで判定する。
tmpフォルダ
matlabplot.pyplot
などで一時ファイルを使うとき、cgi-bin
直下にtmp
フォルダを作ると権限の関係でうまく動かない。tmp
フォルダはcgi-bin
と同階層に置くこと。
後、一時ファイルを作成した後は、使う前にos.chmod
等で権限を付与することも忘れない。
shphinxを使ってPythonのコードからAPIドキュメント作成
無駄に苦労したのでメモ
- shphinxのquick_start autodocはy
- 20行目あたり,conf.pyの以下のコメントアウトを外し、sys.path.insertの表記を[srcフォルダ] へのパスにする
前
# import sys # import os # sys.path.insert(0, os.path.abspath('.'))
後
import sys import os sys.path.insert(0, os.path.abspath('[srcDirectoryPath]'))
extensions
の値を["sphinx.ext.autodoc"]
へコマンド
sphinx-apidoc -f -o [出力フォルダ] [srcフォルダ]
- index.rstの書換え
modules
の追加
.. toctree:: :maxdepth: 2 :caption: Contents: modules
- コマンド
sphinx-build -b html [conf.pyのフォルダ] [ビルド先フォルダ]
おまけ
ネット初期みたいなスタイルシートは、html_themeの値を変えることで簡単に変えられる。
http://www.sphinx-doc.org/ja/stable/theming.html
この時conf.pyからhtml_sidebars=~
をコメントアウトする出力オブジェクトの種類を決定するオプションは生成された*.rstに書き込む
そしてautodoc_default_flagsは環境変数SPHINX_APIDOC_OPTIONSに書き込む(,区切り)https://github.com/sphinx-doc/sphinx/blob/master/sphinx/apidoc.py
というかここがわかりやすかったので参考
Juman++をUbuntu(Anaconda)にインストール
無駄に苦労したのでメモ
- Juman++をDL
これは研究室のHPにいってその通りにすればいい。
これをPythonから使うにはラッパーのpyknpが必要だが、このpyknpはJuman(無印)とKNPに依存している。更に面倒なことにKNPはJuman(無印)に依存している。ので、次の順番でインストールを行う。
- Juman(無印)をDLしてインストール
- KNPをDLしてインストール
- pyknpをDLしてインストール
最後のpyknpは素直にsudo python setup.py install
を叩いても、Anacondaのpythonにインストールされない。condaのディストリビューションもない。そこでpipを使ってこうする。
pip install ./pyknp-0.3(setup.pyがあるフォルダ)
所要時間は3時間程度。お疲れさまでした。
Visual Studio 2015 Express 日本語版
いくら探してもVisual Studio 2015 Expressの日本語を探しているが見つからなかったので情報共有。
なんとURLを直接弄る必要があるらしい
あまりにも見つからないのであきらめて英語版で開発してた。
それにしてもMSは一体何を考えているんだ。
文字列の括弧をなんやかんやする
背景
練習がてら、文字列の括弧をなんやかんやするやつを作った。
ちょっと他所で使いそうなのでVBAで作った。
コード
Function Scan(St As String, h As Integer) As Variant() '#################################################### '引数 'String:パーサ対象文字(250くらいまで) 'h :最大階層数 '返却値 'variant():二次元配列で(string, integer) '例:(hoge(foo(piyo))hoge, 1) → (hoge,0) , (foo(piyo),1), (hoge,0) '################################q################### 'かっこがない時はそのまま返しておしまい If InStr(1, St, "(") = 0 And InStr(1, St, ")") = 0 Then Dim Arr_R2(1, 0) As Variant Arr_R2(0, 0) = St Arr_R2(1, 0) = 0 Scan = Arr_R2 Exit Function End If Dim i As Integer Dim buf_St As String: buf_St = "" 'キャッシュ Dim Buf_arr() As String '保存用 ReDim Buf_arr(1, Len(St) - 1) '(0, n):開始文字、(1, n);それまでの階層 '動的に要素数を決めるべきなんだろうけど面倒になった Dim buf As String '参照文字列 Dim q As Integer: q = 0 'ポインタ Dim hn As Integer: hn = 0 '階層 For i = 1 To Len(St) buf = Mid(St, i, 1) If buf = "(" Then If hn < h And Len(buf_St) > 0 Then 'hn => h の時はstackされない '各階層でつなげる必要はないのでpopもしちゃう Buf_arr(0, q) = buf_St Buf_arr(1, q) = hn buf_St = "": q = q + 1 End If hn = hn + 1 ElseIf buf = ")" Then If hn <= h And Len(buf_St) > 0 Then Buf_arr(0, q) = buf_St Buf_arr(1, q) = hn buf_St = "": q = q + 1 End If hn = hn - 1 End If '判定するの面倒だから手癖でやった If (hn > h Or Not buf = "(") And (hn >= h Or Not buf = ")") Then buf_St = buf_St & buf Next i 'キャッシュ掃き出し Buf_arr(0, q) = buf_St Buf_arr(1, q) = 0 '値が入っている要素の最大値を取る q = 0 Do While Len(Buf_arr(0, q)) > 0 q = q + 1 Loop '返却用 Dim Arr_R() As Variant ReDim Arr_R(1, q - 1) For i = 0 To q - 1 Arr_R(0, i) = Buf_arr(0, i) Arr_R(1, i) = Val(Buf_arr(1, i)) Next Scan = Arr_R End Function
Excelを閉じる時にセルをA1に合わせるVBA
背景
エクセルを閉じる時にシートの全セルを"A1"に合わせる文化があります。私もこれを忘れて何度か怒鳴られたこと(全て社内から)があります。
この日本の美徳を忘れずに実行するため、Excelを閉じる時に全てのシートについてセル"A1"を選択するVBAを作りましたのでご査収下さい。
コード
Private Sub Auto_Close() On Error GoTo Err Dim i For i = 1 To Worksheets.Count Worksheets(i).Activate Worksheets(i).Cells(1, 1).Select DoEvents Next Worksheets(1).Activate Exit Sub Err: End Sub
使い方は適当なExcelファイルのプロシージャに上記コードを突っ込んでアドインで保存。その後保存したアドインを適用。
閉じる時に「上書き保存しますか?」っていう確認が出ない場合A1に合わせて保存されないのでそこだけ注意。気に入らなかったら適当に変えて下さい。
他に不具合があったら適当にお願いいたします。教えて下さるとありがたいです。
レバコンメモ
RAP HAYABUSAにセイミツレバーをつけた時のメモ
ねじ切り
RAPにセイミツレバーを取り付けるにはねじ切り作業が必要。
使うタップはM4 ピッチ 7 mm。Amazonの安いので十分。
ついでにさび止めも買う。
LS-62-01
シャフトが短く、キビキビした動きができるレバー。
SSベースを取り付ければLS-32-(01)と同じく取り付けられる。
8方向メインガイド付き。
LS-32-01の丸ガイド
斜めに殆ど入らない。
LS-62-01改造
ばねを固くする。
スプリング受け(赤いパーツ)に1mmゴムシートを輪形に切ったものを被せると少々固くなる。LS-62-01のシャフト分解はLS-32-01と異なりCリングプライヤーは不要。マイナスドライバーで十分。LS-56、LS-58のばねも使えるかもしれない(未確認)(使えました)。
ガイドと基盤の間にスペーサー( or ナット)を入れてガイドを浮かせると戻りの反応が多少良くなる(東方などのSTGで移動量が少なくなる) 。 但し可動域が狭まる。
スペーサの長さによってはガイドを留めるねじの長さが足りなくなる。ガイドを留めているねじは恐らくM3(追記 LS-58やLS-62等ではセイミツのサブガイド取り付け用ビスが使えます)。ねじ部がちょっと長くなったねじを使うと前述の問題は解決できるかもしれない。