ファイルのタイムスタンプで検索

linuxとかでファイルのタイムスタンプがある条件に一致するものを探したい場合、
findコマンドのmtimeオプションを使いますが、

例えば更新日時が1日以内の場合、mtimeオプションに指定する値は+1,-1,1の
どれだったかな〜と悩みます。昔からの伝統である「manを見ろ」に従い、
manページ見て確認しますが、

  • mtime n

ファイルの最終内容更新日時が n 日前ならば、真を返す。 何日前かを計算する際に、現在時刻との時間差を 24 で割った余りを 切り捨てることが、ファイルの内容更新日時の解釈にどんな影響を 及ぼすかについては、 -atime の説明を見てほしい。

  • atime n

ファイルの最終アクセス日時が n 日前ならば、真を返す。 ファイルの最終アクセス日時が何日前かを計算する際、現在時刻との時間差を 24 で割った余りは切り捨てられる。従って、 -atime +1 にマッチするためには、 ファイルは少なくとも二日前にアクセスされていなければならない。

でもmanページは暗号のように難しい説明が書いてるだけで
非常に分かりにくいです。

で、今後また忘れたときのために、以下にメモしておきます。

mtimeで指定する値 意味
+1 1日前〜現在。つまり1日以内に更新されたファイル
1 1日前〜2日前
-1 2日前〜過去。つまり2日以上過去のファイル

Arduino MEGA

うちにArduinoがやってきました。アルデューイノと読むそうです。
こいつが何者かというと、AVRマイコンと入出力ポートを備えた基板です。
Arduino IDEC++風のArduino言語を作成する統合開発環境です。
Arduino IDEでは作成したプログラムをコンパイルして、Aruduino基板のほうに転送してくれます。

何はともあれ、まずは使ってみよう!!!というこで、

1.Arduino IDEダウンロード

ここからArduino IDEをダウンロードします。
Arduino - Software

2.Arduino IDE初期設定

Arduino IDEを起動し、メニューから[ツール]-[マイコンボード]から使用しているボードを選択します。私の場合、Arduino MEGA 2560を選択しました。

3.通信設定

Arduino IDEで作成したプログラムはIDE上でコンパイルし、基板のファームウェアへ転送します。
このとき、USBシリアル変換ケーブルを使用してシリアルで書込みます。
基板をPCにUSBシリアル変換ケーブルで接続したあと、IDEのメニュー[ツール]-[シリアルポート]から使用するデバイスを選択して設定します。
当然、USBシリアルドライバが必要になるので事前にインストールしておく。
私の場合Mac OSXなので、以下のものを使用しました。

Virtual COM Port Drivers

4.サンプルプログラムコンパイル&転送

メニューから[ファイル]-[スケッチの例]-[01.Basic]-[Blink]を選択し、
サンプルファイルを開きます。
ソースはこんな感じになっています。13ピン接続LEDを1秒間隔でON/OFFにします。
ウィンドウに表示されている矢印ボタンを押して、ソースのコンパイルを行い、
基板のファームウェアに転送します。

f:id:mondayboy:20141020214043p:plain

5.動作確認

基板のファームウェアへの転送が完了すると、以下のようにLEDが1秒間隔で点滅します。
感動した〜〜〜〜!!。


Arduino MEGA test - YouTube

さて次はarduinoで何して遊ぼうかな〜

Heartbleed問題

先週発表されたOpenSSLの脆弱性問題ですが、ここ最近の脆弱性の中で一番深刻なセキュリティホールのようです。ある発表によると深刻度10段階中、11ぐらいとのこと。

SSLは普段意識せず使用していますが、インターネット上の通信を暗号化する際に利用しています。https〜で始まるURLが該当します。

バグ自体は非常に単純な境界チェック漏れ(バッファーオーバフロー)です。
ハートビートリクエストのペイロード長フィールドに実際に送信している値より、大きな値を指定して送信するとペイロード領域を超えたメモリ領域まで読込んで、ハートビートレスポンスとして送り返すというものです。

グーグルのニールさんが発見したそうですが、さすがですね。
シンプルなバグなので、修正もシンプルで私でもよく分かりました。
単純なバグですが、影響の大きさにびっくりです。

実際悪用されても、痕跡は残らないため、どうなるのやら。
見覚えないクレジットカードの請求が来ませんように。。

OpenSSL Security Advisory [07 Apr 2014]
========================================

TLS heartbeat read overrun (CVE-2014-0160)
==========================================

A missing bounds check in the handling of the TLS heartbeat extension can be
used to reveal up to 64k of memory to a connected client or server.

Only 1.0.1 and 1.0.2-beta releases of OpenSSL are affected including
1.0.1f and 1.0.2-beta1.

Thanks for Neel Mehta of Google Security for discovering this bug and to
Adam Langley and Bodo Moeller for
preparing the fix.

Affected users should upgrade to OpenSSL 1.0.1g. Users unable to immediately
upgrade can alternatively recompile OpenSSL with -DOPENSSL_NO_HEARTBEATS.

1.0.2 will be fixed in 1.0.2-beta2.

修正前のt1_lib.c

2561         /* Read type and payload length first */
2562         hbtype = *p++;
2563         n2s(p, payload);
2564         pl = p;
2565 
2566         if (s->msg_callback)
2567                 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
2568                         &s->s3->rrec.data[0], s->s3->rrec.length,
2569                         s, s->msg_callback_arg);
2570 
2571         if (hbtype == TLS1_HB_REQUEST)
2572                 {
2573                 unsigned char *buffer, *bp;
2574                 int r;
2575 
2576                 /* Allocate memory for the response, size is 1 bytes
2577                  * message type, plus 2 bytes payload length, plus
2578                  * payload, plus padding
2579                  */
2580                 buffer = OPENSSL_malloc(1 + 2 + payload + padding);
2581                 bp = buffer;
2582 
2583                 /* Enter response type, length and copy payload */
2584                 *bp++ = TLS1_HB_RESPONSE;
2585                 s2n(payload, bp);
2586                 memcpy(bp, pl, payload);

修正後のt1_lib.c

2596         /* Read type and payload length first */
2597         if (1 + 2 + 16 > s->s3->rrec.length)
2598                 return 0; /* silently discard */
2599         hbtype = *p++;
2600         n2s(p, payload);
2601         if (1 + 2 + payload + 16 > s->s3->rrec.length)
2602                 return 0; /* silently discard per RFC 6520 sec. 4 */
2603         pl = p;
2604 
2605         if (hbtype == TLS1_HB_REQUEST)
2606                 {
2607                 unsigned char *buffer, *bp;
2608                 int r;
2609 
2610                 /* Allocate memory for the response, size is 1 bytes
2611                  * message type, plus 2 bytes payload length, plus
2612                  * payload, plus padding
2613                  */
2614                 buffer = OPENSSL_malloc(1 + 2 + payload + padding);
2615                 bp = buffer;
2616 
2617                 /* Enter response type, length and copy payload */
2618                 *bp++ = TLS1_HB_RESPONSE;
2619                 s2n(payload, bp);
2620                 memcpy(bp, pl, payload);

Windows Creating and Opening Files

最近PowerShellを使ってスクリプトを書いたのですが、Windowsのファイルオープン仕様でまんまとトラップにはまりました。UNIXの人間だからはまったのか...

Windowsでは、ファイルをオープンする際、アクセスモードと共有モードの指定ができるようです。
監視系のソフトが以下のモードで常時ファイルをオープンしているとします。(多分)

アクセスモード 共有モード
READ WRITE/READ/DELETE

共有モードがWRITE/READ/DELETE全てOKだからファイルをクリアするのに、Clear-Contentコマンドでも問題ないだろうと思っていました。
が、、、
Clear-contentのコマンドが異常終了。。

Clear-contentコマンドのモードを確認すると以下のとおり、共有モードがWRITEなんですね。
つまりREADでオープンしているプロセスがいるので、WRITEだけ許可するのはおかしいだろということですね。結局Out-fileコマンドでクリアすることにしました。

PSコマンド アクセスモード 共有モード
Clear-Content WRITE/READ WRITE
Out-file WRITE/READ READ

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363874%28v=vs.85%29.aspx
Windowsは難しい〜。っていうかClear-ContentでREADを許可しない仕様はどうなのって気がします。

2014年入ってからまだいいことないな〜。年男なのに。。

Twitter api 2014/1/14問題

スマホのアプリでTwitter APIを使用しているのですが、2014年に入ってからうんともすんとも動かなくなりました。ログを確認すると以下のメッセージが出力されていました。

403:The request is understood, but it has been refused. An accompanying error message will explain why. This code is used when requests are being denied due to update limits (https://support.twitter.com/articles/15364-about-twitter-limits-update-api-dm-and-following).

Relevant discussions can be found on the Internet at:
	http://www.google.co.jp/search?q=10f5ada3 or
	http://www.google.co.jp/search?q=e574402b
TwitterException{exceptionCode=[10f5ada3-e574402b], statusCode=403, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.3}

調べてみると2014/1/14以降、HTTPでは使用できなくなることが判明。SSLを使用せよとのこと。
APIを3.0.5以降にアップグレードしたところ、無事動作しました。

http://stackoverflow.com/questions/21134176/twitterexception-unable-to-login

うちのソース管理

うちのソース管理について、記載しときます。

たまにしか使わないときに、すぐ忘れてしまうので、備忘録としてですが...

最近の流行に従い、メインのリポジトリはBitbucketを使っています。gitのGUIクライアントにSourceTreeを使っています。gitコマンドより使いやすいです。あとは作業用の領域はDropboxを使っています。PCのローカルディスクが死んだときの対策です。

 

f:id:mondayboy:20140105002652j:plain

3D RepRapプリンタ製作

8月にLunavastで3Dプリンタを購入しましたが、なかなか重い腰があがらず、放置してました。11月になりようやく組立ててみました。

製作時におけるメモとして残しときます。

 

[購入店のサポート]

  • 事前にmac osxでも動作可能と確認したが、一筋縄では動かない。問い合わせ時にそのあたりを回答してもらいたかった。
    USBシリアル通信ではドライバを入れる必要がある。
    http://www.ftdichip.com/Drivers/VCP.htmよりドライバを入手。
  • endstopの基板がマニュアルと逆になっていた。lunavastに問い合わせたところ、取り付け写真を送付してくれたが、そのまま取り付けると、endstopのスイッチ位置がずれて、正常に動作しない。このため、ボルトにナットをかませて、高さを調整する必要があった。この高さ調整がくせ者で、ボルトの長さを長くしないといけないが、そのためのボルトがない。自分で購入するしかない。
  • マニュアルにZ軸モータにボルトが最初から取り付けてあると書いていたが、なかった。このためlunavastに確認したが、一切回答なし。販売してるものとしてどうよ。せめて部品送らなくてもいいから、一言回答してほしいものです。

    結局ホームセンタいって、探してきました。

[組立時]

  • RepRapプリンタの特徴である自己複製プリンタですが、部品がRepRapプリンタで作成したものであるため、それほど強度がありません。組立時、何度か部品がいってしまいました。予備があったので助かりました。組立時は注意が必要です。
  • マニュアルが日本語のものと英語のものがあって、大変でした。英語は得意ではないので、フィーリングで作成しました。

[印刷時]

  • 3DのモデリングはTinkerCADを使用。直感的で使いやすい感じでした。
  • スライサ(gcode変換含む)はslic3rを使い、印刷はPrintrunを使用しました。
    最新版のslic3r 1.0ではなぜかSTLファイルの読み込みでエラーが発生したので、0.9を使用しました。Printrunはmac osx用のバイナリをダウンロードして使用しましたが、特に問題なく動作してくれました。

[最後に]

テスト印刷をやってみましたが、プリントベッドとフィラメントを出力するノズルの距離に問題があるせいか、形がぐちゃぐちゃでした。また途中から印刷物がプリントベッドからはがれてしまい、印刷を継続できなくなってしまったので、印刷を中断。

難しいですね。

今回の3Dプリンタの製作を通じて、RepRapプリンタの仕組みが勉強できました。また部品は念のため、プリンタで作っとくほうが賢明ですね。

さあ、後もう少し、がんばるで。