Hatena::ブログ(Diary)

shouhの日記

2016-01-16

はてなダイアリーで見出しに枠線を表示して視認性を高めてみた

(いるとは思えないが)リピーターの方はお気づきでしょうが、本日記の見出しのデザインを変えてみました。見出しであることをわかりやすくするため、枠線を描いています。(センスが無いのはいつものことなのでお気になさらず。私自身は気に入っているのですが)

何をしたか

CSSカスタマイズを行いました。

h3 {
    border-bottom: 5px solid purple;
    padding: 5px;
}
body .section h4 {
    border-bottom: 3px dotted purple;
    padding: 3px;
}
body .section h5 {
    border-bottom: 2px double purple;
    padding: 2px;
}

注意点としては以下です。

ちなみに、HTML構造を解析したい場合は(Firefox限定ですが) Firebug が便利です。本当に便利。

2015-12-12

GnuPG を用いたシンプルなパスワード管理ツール

はじめに このカテゴリについて

私は我流でコードを書いてばかりなので、色々と非効率的だと思うし、何より他者に通じない(Github ではスターやフォローがちっとももらえない。まあコード自体が大したことないという理由もあるだろうが)。

これではまずいと思った。他者に通じる、一般的な書き方も勉強したい。というわけでコードリーディングカテゴリ「codereading」をつくり、ちまちまとまとめていくことにした。

とりあえず自分がへえと思った観点を雑多に書き並べる感じになると思うので、個人用備忘録の側面が強いかと思う。

pickとは

pick

クラス構造

Cli

  • コマンドラインパースする
  • argparse 等を使わず自前実装(argparseを使わない理由はよくわからん)
  • 実装の中身: Cli.run() がエントリポイントで、そこから do_add() やら do_rm() やらに分岐している。条件分岐は並んでいるが整然としていて見易い

Util

  • いわゆる Util
  • staticmethod ではなくインスタンス化して使っている意図がわからない

Safe

  • 組情報とファイルの各種操作
  • 設定は環境変数からロードしている
  • PICK_CONFIG 環境変数に jsonstring で複数設定を書き、それを読んでパースする仕組みになってる(がこれは使われてない)

感想

  • 役割毎にクラスを分けて機能と状態を詰め込んでいる。デザインパターンなど高度なことはしていない。これくらいの規模ならそんな必要は無いってことかしらん。
  • Safe というネーミングがかっこいい。私だったら PasswordManager とかになってる。このセンス見習いたいなあ...

コメントの書き方

  • 関数にワンラインで説明を書いている
  • データ構造はこうやって管理してますよ、的な直訳コメントは無い

疑問

  • やはり直訳コメントは書かないものなんだろうか。自分が書いたからわかる? それともコード見りゃわかる? 私はその域にいないのでまだまだ無理だなあ(英語の授業でたとえるなら本文のそばに読み仮名や単語熟語の意味を書く感じ)。

パスワード管理のアルゴリズム

パスワードファイルについて

マスターパスワードについて

感想

  • jsonstring マジ便利っすね。python 上では辞書で扱えるし、保存時も結構読みやすいデータだし、両者の変換も容易い
  • GnuPG というシンプルなコマンドがあるんだなあ。windows ではなかなかこうはいかないよなあ。
  • マスターパスワード一つだけ覚えてればいいってのは頭いいね

パスワードの生成について

仕様

  • 今のところ 50 桁の英数字記号のみ
    • 自由に指定できるようにはなっていない

アルゴリズム: 利用可能文字列を定義して、乱数でn番目を取り出すのを繰り返して作る。n番目の抽出には ord(os.urandom(1)) % length を利用(この length が 50 で決め打ち)。んで、作り方は以下のような感じ。

return ''.join(chars[next_index()] for _ in range(length))

空ループを用いた内包表記。これが python 風なのだろうか。

あと文字の選択肢には string モジュールの定義を使用している。地味に便利な定義があるんですねー。

string.uppercase + string.lowercase + string.punctuation + string.letters

疑問

  • なぜパスワード生成ルールの指定ができないの? サービスによってパスワード使用可能文字や上限文字数制限はあるので優先度は高いと思うんだけど。そういうサービス使ってないってことかな?
  • なぜ n 番目取り出しに random.randint() ではなく os.urandom() を使ってる?
  • string モジュールの主要文字定義、私も使いたい。今までいちいちその場で書いてたからなあ。

その他へえと思ったこと

  • die(msg)関数
    • print msg して exit する util
    • 便利やね。私も使おう。
  • from import の使い方
    • from os.path import expanduser, isfile, join と書くと isfile() などと prefix 無しで使える
  • sys.platform に OS の名前が入るので OS 判定ができる。