Hatena::ブログ(Diary)

滴了庵日録 このページをアンテナに追加 RSSフィード

2014/12/31(Wed)

ミニ四駆ラジコン2号機できた

ほったらかしてたBLE版ミニ四駆ラジコンの動作チェックだん。むりやり回路を詰め込んだ感は否めません。次回作は基板おこし&3Dプリンタでシャーシ作ろうかと思います。

ミニ四駆ラジコン2号機

2014/12/28(Sun)

Kansai.mrb 2014 Dec でのLT

昨日、Kansai.mrb 2014 Decに参加してきました。LTでしゃべった内容をうpしておきます。

2014/12/25(Thu)

mruby導入メモ

組込みでスクリプト言語を使うことには消極的だったのですが、このところC++でWebAPIサーバを実装する苦行の日々で、少々C++に倦んできました。ここらでmrubyなどやってみようかと思い立ちました。まずはPCのUbuntu上で使って感じを掴んでみようと思います。もちろん最終的には組込みで使うのが目的。

ビルド

PCのUbuntu 12.04上に構築しました。ビルドにrakeを用いるのでrubyインストールされている必要があります。rubyは1.9系以降が吉です。1.8系は凶です。mrubyのソースをgitで落とすとminirakeというrakeのサブセット版が同梱されています。makeを実行すると、minirakeによってビルドが行なわれます。

$ sudo aptitude install git-core build-essential zlib1g-dev libssl-dev libreadline6-dev bison
$ git clone https://github.com/mruby/mruby.git
$ cd mruby
$ make

インストール

ビルドが成功したら、bin/以下のファイルを適当なディレクトリにコピーして、PATHを通しておきます。

$ sudo mkdir -p /usr/local/mruby/bin
$ sudo cp bin/* /usr/local/mruby/bin/
$ echo 'PATH=${PATH}:/usr/local/mruby/bin' >> ~/.bashrc
$ source ~/.bashrc

mirb(対話モード)

$ mirb
mirb - Embeddable Interactive Ruby Shell

> puts "Hello, world!"
Hello, world!
 => nil
> quit
$ 

mruby(インタプリタで実行)

hoge.rb

puts "Hello, world!"
$ mruby hoge.rb
Hello, world!

mrbc(コンパイルする)

$ mrbc hoge.rb
$ mruby -b hoge.mrb 
Hello, world!

2014/12/23(Tue)

UNIX/Linuxのパイプ

20年くらい日々使っていながら、UNIX/Linuxのパイプの振る舞いをよく分かってませんでした。『易経』に「日に用いて知らず」というのはこれです。ちょっと簡単なコードで実験してみました。

リスト1 test1.c

#include <stdio.h>

int main(void)
{
	int i;
	
	for(i=0;i<5;i++){
		sleep(1);
		printf("test1(%d)\n",i);
		fflush(stdout); // ←これが大事
	}
	
	return 0;
}

リスト2 test2.c

#include <stdio.h>

int main(void)
{
	char buff[1024];
	
	printf("test2 starts.\n");
	
	while(gets(buff)!=NULL){
		printf("test2[%s]\n",buff);
	}
	
	return 0;
}

実行結果

$ gcc test1.c -o test1
$ gcc test2.c -o test2
$ ./test1 | ./test2
test2 starts.  ← 0秒後
test2[test1(0)] ← 1秒後
test2[test1(1)] ← 2秒後
test2[test1(2)] ← 3秒後
test2[test1(3)] ← 4秒後
test2[test1(4)] ← 5秒後 
$        ← 5秒で終了

つまり

test1とtest2はパラレルに動いてて、test2のgetsが標準入力(=test1の標準出力)を同期待ちしてるんですね。

2014/12/19(Fri)

組込みLinux用ネットワーク設定クラス(C++)

組込みLinuxのC++でネットワークインターフェース(有線LAN/無線LAN)の設定を行なうクラスを作成しました。といっても、ほとんど ifup/ifdown/ifconfig/iwconfigなどのコマンドをC++から叩いてるだけの超テキトーなラッパーです。

ソース

busyboxについて

  • このクラスは、busybox版のifup/ifdown/ifconfig/iwconfigを使う環境で動作確認しました。
  • busybox版のifupは、DHCP設定の場合にはudhcpcを起動します。
  • ifupによるudhcpcの起動時のオプションが -b (バックグラウンド実行)となるようにします。
  • それには、busyboxのビルド時に CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS に -b を設定します。
  • (たぶん。じつは、面倒なのでビルド済みのbusyboxをバイナリーエディタ改竄して使いました。)
  • オプションが -n だと、IPアドレス即時取得できないとudhcpcが終了してしまいます。
  • udhcpcもbusyboxに含まれています。

注意点&メモ

  • ifconfigはオワコンという噂ですが、まあ組込み用ということでひとつ…
  • /etc/network/interfaces を書き換えます。
  • 無線LANに関してはまだ作りかけです…
  • WPAに対応するには wpa_supplicant を使いますが、未対応です。
  • WEPが許されるのは小学生までだよねー。キモーイ。キャハハハハハハ。
  • 無線LANアダプタによっては、iwprivによる独自コマンドでWPAに対応している場合があります。
  • popen関数で実行されるコマンドは非同期動作になるので、usleepでごまかしてます。

2014/12/13(Sat)

ウザい自動起動アプリを止める方法(Windows7)

[スタートアップ]フォルダから削除

スタートメニューの[スタートアップ]フォルダにショートカットがあったら、それを削除する。

msconfigで常駐を解除

スタートメニューの[プログラムとファイルの検索] ボックスから msconfig を起動する。 [スタートアップ]タブに該当するアプリがあったら、無効にする。

2014/12/11(Thu)

Linuxのシグナルの番号

1SIGHUP 端末との接続が切断された(Hangup)
2SIGINT キーボードからの割り込み(Interrrupt)
3SIGQUITキーボードからのプロセスの中止(Quit)
4SIGILL 不正な命令(Illegal instruction)
5SIGTRAPTrace / breakpoint trap
6SIGABRTabort関数
8SIGFPE 浮動少数点例外(Arithematic exception)
9SIGKILLKill
11SIGSEGV不正なメモリー参照(Segmentation fault)
13SIGPIPEパイプ破壊
14SIGALRMalerm関数
15SIGTERM終了(Termination)

2014/12/09(Tue)

支離滅裂2014

恒例の作業用BGMリストを改定。

2014/12/08(Mon)

GLib使ってINIファイル読み書き

INIファイルって古くさいものですが、単純なフォーマットゆえに手で簡単に編集できるので、今でも使いたい場合があります。

LinuxC言語だと、GlibライブラリにINIファイル(Key-Valueファイル)を扱うAPI関数が用意されているのですが、微妙に扱いが面倒くさいのでC++で簡単なラッパークラスを作りました。


【注意】

  • 諸事情により、わりと古いバージョンのGlibを使っています。最新のGlibならもう少し面倒が減ると思います。
  • GlibはC++でない純Cのライブラリです。そのため、g_key_file_get_string()などは内部で文字列をmallocして返すという危険な仕様になっています。今回作ったラッパーでは、mallocされた文字列はラッパー内でstd::stringで受け取ってfreeするようにしています。

2014/12/07(Sun)

接続詞としてのandとor

&&と||によるifを使わない条件分岐、シェルスクリプトではよく見るけど、C言語でやられるとちょっと戸惑う。でも英語だと、"and"と"or"を「ならば」「さもなくば」の意味で使うし、あんがい自然な表現なのかもしれない。(いや、C言語ではこんなトリッキーな書き方すべきでないと思うけど)

#include <stdio.h>

bool isEven(int x)
{
    return (x%2==0) ? true : false; 
}

int main(void)
{
    for(int i=0;i<10;i++){
        isEven(i) && printf("%d is even.\n", i);
        isEven(i) || printf("%d is odd.\n", i);
    }
    return 0;
}