かざいむ日誌

IT関係で知ったことなどを記事としてあげていきます。内容に不備や質問などあればぜひコメントをよせてください。

Raspberry Pi 定期的にサーバーにJSONをアップロード。

在席情報を教えてくれるボットを作った。

Raspberry PiでProbe Requestを取って、MACアドレスを収集。
それを5分ごとにサーバーにあげる。最初cronが動かなかったが、設定漏れだった。

 

 

qiita.com

 

roboneco.hateblo.jp

 

qiita.com

 

cronでも、カレントパスをちゃんと意識する必要がある。ちょっとうっかりしてた、、、。

 

ログインしてないとスケジュールタスクも実行してくれないみたいなので、自動ログインもするように設定。

Raspberry Piのログインを簡単にする設定(自動ログイン、デスクトップ表示) | そう いう わけさ

 

Mongooseでのあれこれ。(メモ)

Mongooseで列を指定したらエラーになった。

Mongooseで特定のフィールドだけ出そうと思って、引数に「この列は表示、この列は非表示」ってやってたらエラーが出た。表示するフィールドだけ、または表示しないフィールドだけという指定の仕方しか許されていないらしい。

[SERVER-16966] Error 10053 when combining inclusion and exclusion semantics in a single projection - MongoDB

 

 Mongooseで1件のデータを更新する、なければInsert

 upsertはないけど、findOneAndUpdateで同じことが出来るらしい。これが出来るとすごく楽。

Mongoose API v4.8.1

Insert-or-Update with MongoDB and Mongoose

 

findOneAndUpdateでエラーが起きる、、、。Mongo2.4を使っているからか、、、。MongoDBをアップグレードすればと書いてあるけど、OpenShiftで公式カートリッジがない。個人の作ったカートリッジがあるっぽい。

github.com

 

stackoverflow.com

Raspberry Pi で詰んだかと思った。常時稼働のプログラムを起動プロセスで実行、、、終わらない。

Raspberry PiWi-Fiパケットをとるシステムを作っている。常時稼働のプログラムを作ったが、どうもいつの間にか落ちている。夜帰る時まではOK。翌朝来ると、しれっと再起動している。参考にしたアプリでもその辺りをinit.dで毎回起動するようにしていた。

同じように起動時にプログラムを実行させたい。Linuxではinit.dを使うのが通常らしい。Raspberry Piではrc.localに起動時に実行したいプログラムを書くことによってスタートアッププログラムを実行できる。

Linuxのスタートアップの処理についてはこの辺りが分かりやすかった。

www.infraeye.com

d.hatena.ne.jp

ただ、そこに大きな落とし穴が、、、。

rc.localの記述の最後に & を書き忘れていた。これを書くとバックグラウンドで実行をしてくれるらしい。逆に言うと、書かないと終わるまで待つ、つまり待ちぼうけ。

teratail.com

終わりの見えない黒画面。とりあえず電源を落として、深呼吸してググル。

どうも、起動時にShift押しっぱなしで、BIOSみたいな画面に入り、起動オプションをいじって、スタートアップの手前で止めて、rc.localを編集すればいいらしい。

buturi.heteml.jp

助かりました!!

皆さん本当にありがとうございました。

Python __init__ __enter__ __exit__

Pythonのコードを読んでハテナとなったのでググりました。

以下の3つの特別なメソッドがあるらしい。

__init__
Pythonのクラスのコンストラクタ。

__enter__

__exit__

この2つはセットで用意するもので、C#でusing句を使う感じだろうか、、、。Pythonでwith句内でオブジェクトが利用される。その際に__enter__メソッドが呼ばれ、with句を抜けるときに__exit__メソッドが呼ばれる。なので、リソースの確保、解放を行うとよさそう。

dackdive.hateblo.jp

勉強になりました。ありがとうございます。

Linux 権限入門(メモ)

Linux今までほとんど触ったことなくて、権限についてもあまり意識していなかったけど、他のブログでさらっと紹介されていて、分かってなかったなぁと思ったので、ちょっとググった。

理解した範囲で簡単にまとめますが、多分下に紹介する記事やブログの方が分かりやすいです。

Linuxでは所有者、グループ、その他のユーザーの3種類のユーザーがいる。
それぞれのユーザータイプに読み取り、書き込み、実行の3種類の権限がある。

それらが、ls -l でファイル一覧出したときの、-rwxとかの文字列になる。

これを数字で表すと、1:実行、2:書き込み、4:読み取りに対応している。

これは数字を足して表すことも出来るので、chmod 777 target_file というコマンドを実行することも出来る。所有者、グループ、その他のユーザー全てが読み取り、書き込み、実行が出来るというもの。

qiita.com

Linuxコマンド集 - 【 chmod 】 ファイルやディレクトリのアクセス権を変更する:ITpro

 

勉強になりました。ありがとうございました。

IoT LinkIt ONEを使う。Lチカ。

IoTの機器をオススメされたので、ちょっと試してみた。最終的にはお天気の情報をサーバーに上げてほこほこするつもり。

進められたのが、LinkIt ONEというIoT機器。Raspberry PiArduinoで比べるとArduinoに近い感じ。エディタもArduinoだし。この機器の特徴は通信が強いんじゃないかと。Wi-Fiアンテナ、GPSGSMアンテナがついてて、SIMカードを入れれば通信ができる。

導入手順はこのサイトに従ってやるとほぼうまく行く。

Get Started on Windows - LinkIt ONE Resources

途中アップデートがうまく行かなかったので、Aruduinoエディタを再起動するとうまく行った。

で、サイトに従ってLチカを試す。失敗。

BUILTIN_LEDが定義されていないというエラーが出る。

→他のサンプルを見てみると、書き方はpinModeという関数の引数として、数値型の値:光らせたいLEDの番号を渡すようになっているらしい。

コードをちょっと直して、

/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.

Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
the correct LED pin independent of which board is used.
If you want to know what pin the on-board LED is connected to on your Arduino model, check
the Technical Specs of your board at https://www.arduino.cc/en/Main/Products

This example code is in the public domain.

modified 8 May 2014
by Scott Fitzgerald

modified 2 Sep 2016
by Arturo Guadalupi

modified 8 Sep 2016
by Colby Newman
*/

int LED_BUILTIN = 0; // the PWM pin the LED is attached to

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
  delay(1000); // wait for a second
  digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
  delay(1000); // wait for a second
}

 

 これでLチカできた!

今日のコード(2017/01/29) Linuxシェル。

Raspberry Piをセンサーとして使うおもちゃを作ってるのだが、23時間たつとサービスが止まっている。再起動がかかっているのか、なにか別のことが起きてるのか不明、、、。
参考にしたコード一式を確認すると、やはりこれに対する考慮がされている。Raspberry Piのサービスは定期的に再起動して、init.dで起動時にサービスを再度実行している。

というわけで、シェルもちゃんと書けるようになりたい。今日は、ループで10回echoをするコードを書いた。コピペ。

linuxcommand.org

で、Shellの1行目はおまじないと思ってたら、ちゃんと役割があると知ってびつくり。

d.hatena.ne.jp

sechiro.hatenablog.com

このサイトが一番イメージとして分かりやすかった。

www.infraeye.com