Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

SSH接続がどーしても出来ないようなら、一旦全部真っさらにしてから再導入してみる

SSH接続がどーしても出来ないようなら、一旦全部真っさらにしてから再導入してみると案外解決したりします。
この件に限らない話かも知れませんが。

実際のところ

前提状況

  • Virtualbox上にUbuntu14を構築済
  • (極めて雑に)SSHやOpenSSHまわりを導入済
  • Virtualboxのホストオンリーアダプター設定済(192.168.56.102で開放)

大事なファイルが消えている

上記前提を組み上げたものの……何故か動きませんでした。
今にして思えば、ライブラリの導入順が滅茶苦茶だったのが悪さをしていたのかも知れません。*1
ともかく、導入してから全く通信できる気配がなく。
ポートを開けても、色々設定ファイルを弄っても、ライブラリのアップデートを掛けても駄目。

万策つきて詳しい人に診てもらった所……

$ cat /etc/ssh/sshd_cofing

$

……明らかに主要ファイルであるsshd_configがぶっ飛んでます。
何か反映するときに">>"を">"とかにしたんでしょうか……?
兎も角、完全に色々終わっている事が明確になったので一度漂白するしか無さそうです。
まずは、設定ファイル毎全部消すpurge。

sudo apt-get purge openssh-server openssh-client ssh

その後に再インストール。

sudo apt-get install ssh openssh-server openssh-client

ホスト側のOS Xで見ると……動きましたね(憤怒

$ ssh shuzo@192.168.56.102 -p 22
shuzo@192.168.56.102's password: 
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)
(ry
shuzo@shuzo-VirtualBox:~$

*1:ssh入れたあとにapt-get updateしてopenssh-server入れるとかね

ChromeブラウザアプリPostmanでAPI鯖の試験をする

PostmanはAPI鯖の試験をするのに便利なアプリケーションです。
ChromeブラウザアプリやOS Xアプリとして展開されています*1
ちょっとの内容ならcURLでゴリゴリでもラクですが、認証を使い分けたり便利スクリプトで自動化したい場合なんかには有効そうです。

実際のところ

導入

公式のダウロードページへ行き
f:id:shuzo_kino:20161006222332p:plain
Chromeアプリストアが立ち上がるので導入。
f:id:shuzo_kino:20161006222336p:plain
無事起動すると、こんな画面のアプリが立ち上がります。
f:id:shuzo_kino:20161006222517p:plain

お試し

localhostのアプリもURLをぶっ込んであげればこの通り
f:id:shuzo_kino:20161006222022p:plain
ヘッダも確認できますね
f:id:shuzo_kino:20161006222307p:plain

便利そうなトコ

……まぁ、この程度ならcURLでやればいいのですが。

Oathまわり(AWSキーも)あったり
f:id:shuzo_kino:20161006221843p:plain
テストスクリプトを走らせたりもできます。
よく書く内容はあらかじめテンプレがあるので、ペタペタ貼るだけでだいぶ工数が減ります
f:id:shuzo_kino:20161006221850p:plain

*1:Linux版も開発中とのこと

PythonでもLambda式

みんな大好き無名関数!
Lambda式はPythonにもあります。

実際のところ

特に何も読み込まずに定義可能です。

a = lambda x: map(int, x.split(','))

コールする時は引数として。

a('12,24')
#>> [12, 24]

a('2, hoge')
#>> ValueError: invalid literal for int() with base 10: 'hoge'

a('2, 2.9')
#>> ValueError: invalid literal for int() with base 10: '2.9 '

bottleのURLキャプチャで正規表現をつかう

bottleのURLキャプチャで正規表現をつかう方法です。
エントリ番号を入力する所で文字列や日本語を投入されないようにできます。

実際のところ

一致させる場合

@get('/blog/:num#[0-9]+#')

特定の文字列だけキャプチャという事も可能

@get('/hello/:name#(shuzo|taro)#')

一致はさせたいが、変数は不要の場合

POST何かのときに有用ですね。

@post('/blog/#[0-9]+#')

bottleにファイルの変更を検知してリロードする機能を加える

bottleにも、ファイルの変更を検知してリロードする機能が備わっています。
ある程度性能とトレードオフな所があるので、開発段階でTrue、実用段階でFalseにしてしまえばいいでしょう。

実際のところ

普通のrunにreloader=Trueを付け加える。
それだけです。

run(host='localhost', port=8080, reloader=True)

テンプレートのようなファイルの更新は参照されません。
ま、都度レンダリングされてるからなんでしょうが。

FlashAirのupload.cgiを使ってファイルをアップロード

FlashAirのupload.cgiを使ってファイルをアップロードする方法です。
元の写真アップ機能はもちろん、データロガーとしても。
用途が広がって、色々捗りますね。

実際のところ

設定の書き換え

UPLOADを1(=アップロード対応)、
APPTIMEOUTを0(=停止しない)

[Vendor]

CIPATH=/DCIM/100__TSB/FA000001.JPG
VERSION=FA9CAW3AW3.00.00
CID=02544d535733324731ea8ec97900f701
PRODUCT=FlashAir
VENDOR=TOSHIBA
APPNAME=flashair
WEBDAV=1
TIMEZONE=36
IFMODE=1
APPSSID=APMODE_SSID
APPNETWORKKEY=*****
APPMODE=6
APPAUTOTIME=0
DNSMODE=1
BRGSSID=YOURNETWORK_SSID
BRGNETWORKKEY=*********
LOCK=1
UPLOAD=1

動作試験

では、この状態でhttp://flashairを見てみましょう。
前回の記事でRaspbian環境を作ってるのでdebian系のbootファイルが色々見えてますね。
f:id:shuzo_kino:20161001225907p:plain

WEBブラウザで実験

http://flashair/upload.cgiにアクセスすると、
f:id:shuzo_kino:20161001225828p:plain
ためしに、このフォームでgopherくんの画像をアップすると……一番下に出てきます。
軽い画像データなので、そっけないアイコンが見えます。
デジカメのようなサイムネイル埋め込みデータなら小さい画面が出るみたいです。
f:id:shuzo_kino:20161001225656p:plain

ディレクトリを変える

このままだと都合が悪いので、アップロード先を変えましょう。
写真のアップ先として"/DCIM/100__TSB"というのがあるので、これに倣う感じで101__TSBとします。
cURLのリクエスト発行で楽々。

$ curl http://flashair/upload.cgi?UPDIR=/DCIM/101__TSB

【番外編?】cURLで画像アップ

ディレクトリ変更の確認も兼ねて、もう一個画像をうp。
今度はcURLで。

$ cd $IMGDIR
$ curl -F 'file=@chip.png' http://flashair/upload.cgi

みてみると、まずディレクトリは出来てます。
f:id:shuzo_kino:20161001230210p:plain
潜ると、ちゃんとありましたね。
f:id:shuzo_kino:20161001230215p:plain

FlashAir上にRaspbian環境を構築してみる(MacBookPro編)

FlashAir上でRaspbianを動かす方法です。
今回の作業環境はMac Book Pro。

実際のところ

作業環境

  • Mac Book Pro (Retina, 13-inch, Mid 2014)
  • OS X Yosemite
  • RASPBIAN JESSIE LITE(September 2016)

FlashAir環境の退避

まずは退避先ディレクトリを用意。

$ cd ~/
$ mkdir flashair_bak

flashairをSDカードスロットに差し込んだ状態で、「SD_WLAN」と「DCIM」をコピー。
認識時点では、「NO NAME」という名前でした。

$ cp -r /Volumes/NO\ NAME/SD_WLAN ~/flashair_bak/
$ cp -rf /Volumes/NO\ NAME/DCIM ~/flashair_bak/

Rasbianの導入

www.raspberrypi.org
公式からRasbianのimgをもらってきます。
私はLiteですが、必要に応じてフル機能の奴でも良いでしょう。
導入し終わったら、unzipで展開です。

$ unzip ~/Downloads/2016-09-23-raspbian-jessie-lite.zip

SDカード初期化

OS X付属のディスクユーティリティで初期化していしまいます。
f:id:shuzo_kino:20161001221004p:plain
特に設定していなければUNTITLEDという名前になるはず。

SDカードの位置確認とアンマウント

まずはSDカードの情報確認

$ diskutil list
/dev/disk0
(略)
/dev/disk1
(略)
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *30.9 GB    disk2
   1:                 DOS_FAT_32 UNTITLED                30.9 GB    disk2s1

このdisk2というのが、今回のターゲットになります。

$ diskutil unmountDisk /dev/disk2

書き込み

いよいよ書き込みです。
ここで注意したいのは、SDカードスロットの位置がdisk2だった時、ターゲットは/dev/rdisk2という名前で指定というトコ。rの文字が必要です。
私はここで無駄に引っかかりました。
bs付けないと遅くてシャーないので、1Mbyte毎。

sudo dd bs=1m if=2016-09-23-raspbian-jessie-lite.img of=/dev/rdisk2

これで書き込み完了です。
SDカードが認識されると、"boot"という名前に変更されています。

FlashAirまわりの情報を戻す

先程退避ディレクトリに逃した一時情報を、Rasbianの"/boot"に突っ込みます。
OS Xでのパスは/Volumes/bootとなっています。

$ cp -r ~/flashair_bak/ /Volumes/boot/

抜き出し&Raspberry Piに投入

$ diskutil unmountDisk /dev/disk2

これで書き込み前のネットワーク情報が設定されています。
設定をちゃんとやっていれば、ネットワーク上にFlashAirが出現しているのが確認できるでしょう。
f:id:shuzo_kino:20161001222449p:plain