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のフォルダ] [ビルド先フォルダ]

おまけ


というかここがわかりやすかったので参考

bonbonbe.hatenablog.com

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を直接弄る必要があるらしい

d.hatena.ne.jp

あまりにも見つからないのであきらめて英語版で開発してた。
それにしても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

総括

いつも他人のVBAに文句言っているけど自分も大概。
それでもVBAは悪い文明。

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に合わせて保存されないのでそこだけ注意。気に入らなかったら適当に変えて下さい。
他に不具合があったら適当にお願いいたします。教えて下さるとありがたいです。

総括

くたばれワープロExcel

レバコンメモ

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等ではセイミツのサブガイド取り付け用ビスが使えます)。ねじ部がちょっと長くなったねじを使うと前述の問題は解決できるかもしれない。