[Swift]NSDataをfileに保存しようとしてしょーもないとこでハマった

やりたいこと:UIImageをファイルに保存する

Documentsに保存する場合、こう書けばいい。ググれば似たようなのが出てきます。

はまったところ

しょーもないとこではまって半日費やしました…。というのも

の部分がどうがんばってもfalseを返す。ネットで調べてみたところNSDataがnilだとfalse返すとかあったけど、デバッグするとちゃんとNSDataはデータ入ってるし。。。

原因はこれだった

パスを取得するときにDocumentDirectoryでなく、DocumentationDirectoryを指定してた。で、その指定ではLibrary/Documentationsのパスを取るっぽい。でも保存するときにそんなディレクトリがないからNSdata.writeToFileの結果がfalseになってた。

Xcodeの補完でよく見ずに似たようなものを書いてしまって迷路に迷い込み、NSData.writeToFileは別にうまくできなくてもなんもエラーを出したりしないから見つけるのに時間かかった。Xcodeの便利さに慣れて大切な何かを見落としていたよ…。

ファイル書き込みでfalseでちゃうときは書き出し先のpathが存在しないかもしれないです。

 

Intel EdisonとI2C通信で加速度・ジャイロセンサのデータを取ってみる

時代はIoT

といことで買ってきました。SDカード大の極小コンピューター、Intel Edison!!

IMG_4627

ついでにArduinoも勉強しようかなと思い、購入したのはEdison for Arduinoというやや大きめのモデルです。標準では使いづらいEdisonのI/Oを取り出しやすい形にしてくれる基板です。

開封して設定

まだ日本語のTipsがネットに転がってないIntel Edison。I2Cでセンサモジュールを読み込むだけでもマニュアル読んだり海外のForum調べたり結構苦労したんでまとめておきます。

まずEdisonを開封してすぐにやったのはファームウェアのバージョンアップとWifi設定。パソコン側でArduino IDEのインストールです。下記Qiitaの手順が参考にしました。

参考:Edisonを開封してからnode.jsでIOポート制御するまで

I2C接続

今回EdisonにI2Cで繋げて見るのはこちら↓ 加速度計って結構安いです。

IMG_4635

どちらもPinコネクタをハンダ付けを行いました。結線は下図の通り。SCLとSDAはセンサと並列と思ってたのですが、それではうまく動かず。MPU-6050のマニュアルを読んだところ他のセンサのI2CはXDA,XCLに繋くとのことなんで、こんな結線です。HMC5883LのセンサーデータはMPU-6050のレジスタに記録されるそうです。

Untitled3

 Edison側の操作

Edison for Arduinoのマニュアルを読んだところ、以下のコマンドを投入すればI2Cが使えるようになります。

前半のgpioのExportで

というエラーが返ってくるかもしれませんが、これはすでにExportされているという意味だそうです。/sys/class/gpio/にあるgpio##がエクスポート済みのgpioです。

Arduinoでは冒頭で「Wire.begin();」と打ちますが、これは上記のコマンドを打つのと同じ意味っぽいです。

#また、intelのマニュアルは2015/3/29現在GPIO204とGPIO205はHighにしろ!と下記のように書いていますが誤植だと思われます。同マニュアルのTable4を見ると204,205はlowじゃなきゃI2C使えないことがわかります。ここで詰まりました。Intelしっかりしてよ〜。

Edison for ArduinoのI2Cのピン(IO18,19)はI2Cの6番のインターフェースに接続されているとのこと。なので、

と打てば

のように0x68番地にMPU-6050が接続されていることがわかります。さらに、

と打つと

てな感じになんらかのデータが取れてることがわかります。

加速度と角速度のデータ取ってみる。

このへんのページを参考にして、このコードをArduino IDEにコピペしてEdisonに書き込んでみます。

Untitled1

特に何も書き換えないでも動きました。センサーデータは0x3Bから0x48のレジスタに入っているみたいです。「マイコンボードへの書き込みが完了しました」ってことでシリアルコンソール見てみます。

Untitled2

右上の虫眼鏡ボタンをクリックするとコンソール見れます(これ気づくのに時間かかった)。いちおうセンサーを振り振りすると急激に値がでかくなるので加速度とジャイロがとれてるっぽいっすね。静止時も下向きの加速度(Z軸)だけ値がでかいのでセンサが重力加速度を感じてます。

とりあえず今回はここまで。磁気センサのデータは難しくてまだ取れてません(汗)

[RasPi]ラズパイとLCDモジュールでI2C通信してみる

こんな感じのことをやりたい

IMG_4606

I2Cとは

今回のテーマのI2Cですが、詳しいことはわからないのでWikipediaへ。パソコンにUSB機器が多いように,マイコンにはI2C機器が多く、あらゆるセンサやデバイスにデータを入出力できるっぽいです。読み方はアイツーシーですが、組み込み系エンジニアの友人曰く、アイスクエアシーと発音するとプロっぽいらしい(誰か検証して)。

今回は↑の写真のようにディスプレーに文字を出力しちゃいたいと思います。

買ったもの

IMG_4603

SB0802Gを435円で購入。安い。

いずれも秋葉原で購入しました。頑張れば上記リンクからネット通販でも買えます。

ハンダ付け

実はここが一番苦労した。。LCDの足のピッチが1.5mmで、2.54ミリピッチのブレッドボードに挿せない。なので何とか配線をさせるようにしなきゃいけない。ハンダは素人なので、村田製作所のこのページをみてコツを勉強しました。さすが村田製作所!為になる。

IMG_4617

ハンダ付けしてこんなかんじ。タコみたい。

 回路を組む

付属の説明書に従ってブレッドボード上に回路を構成します。プルアップ抵抗は20[Ohm]を使用。RSTはアクティブLow(LowのときReset)なので、Hiにつなぎます。

ラズパイ側のGPIOは3.3VのVddとGND,SDA,SCLの4ポートを使います。ラズパイの詳しいピンアサインはググると出るので割愛。回路を組んだらRasPiの操作へ。

IMG_4621

RasPiの設定

I2Cを使えるようにする。

ラズパイにログインしてetc/modulesの編集をします。

「このファイルにはブート時に呼ばれるカーネルモジュールを書きます」とのことなので、下記のようにi2c-devを追加する。

続いて、ブラックリストの編集

「(多くの人は使わないので)I2CSとSPIデフォルトでブラックリスト入り」とのことなので、下記のようにic2をコメントアウト。

再起動してI2Cカーネルモジュールをロード

再起動後は次のコマンドでI2Cモジュールをロードする。

I2Cデバイスの確認

下記のコマンドでi2cデバイスが見つけられているか確認できます。

デバイスを認識できているとコンソールに以下のように表示されます。説明書にもある通りこのLCDのI2Cアドレス(7bit)は固定で0111110とのことです。実際16進数で3eのアドレス番地にデバイスが見つけることができました。

ちなみに回路が間違っているとデバイスが見つかりません。デバッグの使用がないんですけどよーく説明書と回路を照らし合わせて間違いを見つけてください。

文字を表示

こちらのサイト様をパクって参考にshellを走らせてLCDに文字書き込んでみました。

文字コードは仕様書の最後の表を参照しつつ以下のような感じの対応になってます。

スクリーンショット 2015-03-16 17.40.04

 

参考サイト

[RaspberryPi]GPIOをピンソケットでブレッドボード仕様に改築

GPIOをこんな感じにしました

IMG_4595

 

ケースを自作して以来、ながらく放置していたRaspberryPiですが、そろそろ色々やろうと模索中です。

で、RaspberryPiで電子工作をする際に必須になってくるのがGPIO端子ですが、ピンの形状がオスのためブレッドボードで遊びにくい!ブレッドボードで遊ぶときはジャンパ線が穴にさせる形状じゃないと遊べません。

ということでピン変換コネクタを探しました

メスーメスなピンコネクタは存在しない

要件は「2.54ミリピッチで、20ピンx2列な、メス – メスのコネクタ」でした。基盤側のオスなピンをメスの穴にしたいので、両端がメスなコネクタが欲しかったのです。

で、秋葉原をウロウロしましたが見つかりません。コネクタの品揃えが豊富なお店で「メス – メスのコネクタってないんですか?」って聞いてみたところ、パーツ屋のおやじに「わかってねぇなあにいちゃん」とばかりにそんなもんはないと言われました。

曰く、基盤側のピンはオスで、ケーブル側がメスというのが常識。コネクタには、ケーブルとケーブルを接続するための「オス – オスコネクタ」と、基盤とケーブルを接続する「オス – メスコネクタ」しかない。基盤と基盤はコネクタで繋ぐことはありえないため「メス – メスコネクタ」は存在しない。とのこと。なぁるほど。

やりたいことをやるなら、ハンダ付けか、バス配線を買うんだね。とのとこ。

買ったコネクタはこれ

L型ピンソケット 2×20 (40P)[2214R-40SG-85-F1] : ¥100

工作前にパーツ単体の写真を撮り忘れたので秋月のリンクでみてください(汗)

買ってきたソケットをハンダ付け

IMG_4596

ピン同士がくっつかないように慎重に…。というと自分でやったかのような言い方ですが、ハンダは中学の時、なんかの授業で触ったきりなので、そういうのが得意な知り合いに頼んでくっつけちゃってもらいました。

曰く、そんなに難しいものじゃない。とのことです。

[Powershell]Credentialでスクリプト内のパスワードを安全に保管

スクリプト内にパスワードを書きたくない

最近会社でどでかいインシデントがあって、対応に忙しくて一ヶ月以上更新がありませんでした(汗)

前回のPowerShellでFTPS通信スクリプトでは、スクリプト内にパスワードを平文で書いてしまいました。通信がセキュアでもパスワードの保管が全くセキュアじゃない!なんとかしたいです。

Get-Credentialコマンドを使う

考えたのが、text等の外部ファイルにパスワードを暗号化して保管しておいて、スクリプトでそれを複合する方法。調べてみるとGet-Credentialというものがありました。

パスワードを暗号化しtxtに書き出し

上記のコマンドをパスを指定したうえでPowerShellにコピペしてください。次のように認証情報を求められるので、スクリプトで使うことになるユーザー名とパスワードを打ちます。
図1
吐き出されるtxtファイルを見てみると…。ちゃんと暗号化されていますね。
図1

txtからパスワードを復号

上記のように暗号化したpasswordのtxtファイルのパスを指定してpowershellにうちます。これで $password とうつと、パスワードが平文で表示され、復号されたことが確認できます。あとは、スクリプト内でパスワードが必要な個所でこの$passwordにあたる変数を呼び出して使いましょう。

※注意:他ホスト、他ユーザーには復号できない

でもこれってそもそもコマンドで復号できていいものなの?そんなことを思いつつサーバーにスクリプトを配置し、タスクで自動実行させたらその後「認証に失敗した」的なエラーが大量に!!いろいろ試してみてわかったのが

Get-Credentialで作ったpasswordファイルを復号できるのは

  • passwordファイルを作ったホスト内のみ。かつ、
  • passwordファイルを作ったユーザーのみ

のようです。これならpasswordファイルは万が一盗まれたとしても他のホスト、他のユーザーには復号できないんですね。まーこれなら確かに安全でしょう。

そしてスクリプトをサーバーに配布する際は、タスクを実行することになるユーザーでサーバーにログインし、そのホスト内でpasswordファイルを書き出さなくてはいけないんですね。

筆者は5台程のサーバーにスクリプトを配布する作業でしたが、やたら手間がかかりました。セキュリティのためには仕方ないですね。

2015/04/04追記

さらに筆者の最近のサーバー管理で気がついたのが、同ホスト・同ユーザーでも、リストアとかSnapShot戻しなどでサーバーをCredentialを書き出す前の構成に戻すと復号できなくなります。おそらく内部的に「Credentialを作ったよん」っていう記録がないとだめなんでしょうね。