揮発性のメモ2

http://d.hatena.ne.jp/iww/

expectで、ログを取りながらログインする

#!/usr/bin/expect -f

set IPADDR "192.168.0.2"
set USERID "hoge"
set USERPW "piyo"
set LOGFILE "test.log"

# エラー・タイムアウト用関数
proc ABORT {} {
    exit 1
}

# ログ取得開始
log_file $LOGFILE
# expectのタイムアウトを30秒とする
set timeout 30

# ログイン
spawn ssh $USERID@$IPADDR
expect {
    default ABORT
    "assword:" { send "$USERPW\n"; exp_continue }
    "\\$ "
}

# 制御をユーザーに渡す
interact

puts "END"
exit 0


今日勉強したこと:

  • 文字としての$記号は、\\$と二重エスケープしないといけない
    • 本来\$とすべきところだけど、\もエスケープ対象なので
  • 制御をユーザーに渡すと、spawnしたコマンドが終了するまでinteractは終わらない
  • sendで文字列を送るとき、改行は\r
    • \nを使ってもどうせ\r\nに変換されるので、そんなに気にしなくてよい
  • ログにはspawn関数自体も表示される
    • spawn以外のほかの関数はログに出ない
    • putsもログには残らない


[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

スポーン ディレクターズカット【Blu-ray】 [ マイケル・J.ホワイト ]
価格:1080円(税込、送料無料) (2018/12/11時点)

let's encrypt の証明書を取得する

ユーザーガイド - Let's Encrypt 総合ポータル

動き

実行すると、このスクリプトが /var/www/.well-known/ 配下に適当な一時ファイルを作成する。
let's encrypt の人が http://example.com/.well-known/ にアクセスしにくる。
それが成功したらドメインがちゃんと存在する証明になり、証明書をダウンロードする。
ダウンロードできた証明書は /etc/letsencrypt/live/ に置かれる。
apacheなりnginxなりで、証明書がそこにありますと設定して完了。

スクリプトのダウンロード

https://dl.eff.org/certbot-auto
スクリプト certbot-auto がダウンロードされるので、適当に実行属性をつける

スクリプトの実行

/root/letsencrypt/certbot-auto certonly --webroot -w /var/www/ -d www.example.com -m hoge@example.com --agree-tos
certonly 証明書のダウンロードだけする
--webroot Webrootプラグインを使用する
稼働中のwebサーバを止めず、一時ファイルを作ってドメインの認証をする
-w Webrootプラグイン使用時のrootディレクトリの実体の場所
-d 証明書を取りたいドメイン
-m 連絡先メールアドレス
--agree-tos 利用規約なんか読まず自動で全同意

定期的な証明書の更新

/root/letsencrypt/certbot-auto renew --post-hook "/etc/init.d/apache2 restart"

(wheezyで実験したのでsystemdじゃない)

これをcronで数カ月に1度とか適当に動かす

expectで、日付を求める

年月日時分秒を取得したい

dateコマンドを使う

#!/usr/bin/expect -f

set NOW [ exec date "+%Y%m%d%H%M%S" ]
puts "--$NOW--"

clock関数を使う

#!/usr/bin/expect -f

set NOW [ clock format [ clock seconds ] -format "%Y%m%d%H%M%S" ]
puts "--$NOW--"


参考:


今日勉強したこと:

  • expectはTclの親戚なので、Tclのマニュアルを読むと良い
  • putsは改行をつけてくれる
  • [ ] で囲ったところはコマンドの実行結果の文字列になる
  • 文字列はダブルクオーテーションで囲わなくてもいい
    • でも人間が見る分には囲っといた方がいい気がする

ぶんぶんチョッパー

思ったよりも小さいので、材料は小分けにしなければならない。 玉ねぎなら1/4~1/3ずつに入れないと回らない。
また、内部の凸凹のせいで微妙に中身を取り出しづらい。

だけど、包丁とまな板でやるよりも100倍楽なので そんな欠点には余裕で目をつぶれる。

WinMergeでEUCJPを表示する

自動認識でEUCJPにならなかったときに手動でエンコードを指定したい

f:id:iww:20181129123149p:plain
コードページ設定

SJIS (CP932) 932
EUC-JP 20932
UTF-8 65001

システムトイレ用猫砂

4リットル×4袋=16リットル で 3,780円。 1リットル当たり約236円
2.5リットル×6袋=15リットル で 3,479円。 1リットル当たり約232円
僅差で2.5リットルの方が安い。さらに、100円オフクーポンとかあると、安い方に適用した方がより安くなる



AdLintで静的解析

結論から言うと、AdLintで静的解析してもあんまり意味なかった。

  • インストールも使い方もそこそこ簡単
  • 出てくるメッセージも読みやすい
  • mallocのfree忘れ、openのclose忘れなどは検知しない
  • gccでWarningレベルガン上げにした方がずっと役立つ
  • そもそも AdLint の開発がもう止まっている

インストール

AdLint - Browse /adlint/3.2.14 at SourceForge.net
sourceforgeからtar.gzをダウンロードし、適当なところに展開し adlint/bin にパスを通す。

解析準備

解析したいソースをフォルダごとどこかに用意する
フォルダ内で次のコマンドを実行

adlintize

GNUmakefile と、adlint_* というファイルが生成される。


このうち、 adlint_traits.yml というファイルにインクルードパスを書くところがあり
これに書かないと /use/include すら検知してくれないので適当に書く

compiler_traits:

  initial_header: "adlint_cinit.h"
  # Compiler specific include paths.
  # Ex.
  #   file_search_paths:
  #     - "/usr/include"
  #     - "/usr/local/include"
  file_search_paths:
        - "/usr/include"         # ★これとか
        - "/usr/include/linux"   # ★これとか