2016年5月20日金曜日

組み込み用のファイルシステムライブラリを治す


PIC用のライブラリってなぜかバグが多いんですよね。
マイクロチップ社が公式で公開しているSDカードなどにアクセスするファイルシステムライブラリとかもかなりの完成度でできているんですが、なぜかまだバグがたくさんあります。うーんとっても残念。

これではIoTデバイスを開発するときにとっても困るので、マイクロチップ社が公開しているファイルシステムのライブラリのバグを全部修正しておきました。

ついでに機種に依存する部分は全部排除したのでmbedとかarduinoとかPIC以外でも動きます。

ついでにWindowsとかLinuxとかMacでも動くようにしたので、ファイルシステムの勉強とかにも使えます。

https://github.com/yomei-o/pic


sendmail互換アプリを作る

お問合せのWebページを作ろうと思うと、メールを送るのにsendmailかその互換ソフトウェアがいります。

しかし、このsendmail、純正のものは結構サイズが大きく、設定も複雑。さらにメインのサポートはLinuxなので、WebサーバがWindowsやMaxOSXだとよいsendmail互換ソフトウェアがなくて困ります。

いろいろなOSやコンパイラで動くsendmail互換ソフトウェアがないので、MSMTPという高性能でかつコンパクトなsendmail互換のソフトウェアを改良して、いろいろなOSやコンパイラで動くようにしてみました。

とりあえず、gcc、clang、mingw、Cygwin、VisualStudio、XCodeでコンパイルできて動きます。


なにも考えずに
gcc *.c
でコンパイルできます。

sendmailとかは特定のディレクトリにインストールしないと動かないのですが、msmtpはディレクトリに構造に依存しないので、好きなディレクトリに実行形式と設定ファイルを置いて使うことができます。

これでどんなサーバのどんな設定でもメール送れる。


元のライセンスがGPLなのでソースコードを公開します。
https://github.com/yomei-o/msmtp





2016年5月18日水曜日

ホームネットワーク用のWebscoketサーバとクライアントを作ってみた。

外から家の家電を操作するようなものを作りたいとき、技術的にはWebsocketを使うとそのようなことができます。


しかし、Websocketをきちんと実装した軽量なサーバやクライアントがなかなかないので、作ってみました。

https://github.com/yomei-o/easyhttpd

一つ前の記事に書いたSQLエンジンもそうなのですが、ネットワーク系とデータベース系はライブラリを実装して互換性をきちんと試験するのが本当にとても大変です。
結構バグ取りに時間がかかってしまったのですが、今日だいぶまともに動くようになったので公開します。


CSVファイルをSQLで操作する

最近僕の周りではIoTというのが流行っているようで、いろいろなIoTデバイスでいろいろなデータを集めています。

集めたデータは大体CSVファイルになっているのですが、これだとエクセルでしかデータを活用できません。

僕的には集めたビッグデータを機械学習させたいのに・・・。

プログラムから簡単にSQLか何かでCSVファイルにアクセスできるライブラリとかないのかなぁと思ったのですが、意外とCSVファイルをSQL操作できるものってなかなかないのです。

なのでちょろっとCSVファイルをSQL操作するライブラリをつくってみました。
もっと簡単に書けるかなぁと思ったのですが、メインのところだけでも三日間、3000行もかかってしまいました。

https://github.com/yomei-o/csvsql

CSVファイルってSJISだったりするので、日本語対応とかめんどくさい。
SQLのWHEREとかも計算式対応するのがめんどくさい。
だけど大体対応しました。

これで、いろいろなプログラムにIoTデバイスのデータをプログラムから活用できます。

2016年5月11日水曜日

C++でforeachを実装してみる

久しぶりにC++文法の勉強をしています。C++11からforeachができるようになったのですが、自分で作ったクラスをforeachしたことがないので、いろいろ調べてやってみました。

どうやら、iteratorを実装すればできるっぽいのですが、結構めんどくさいのでテンプレートとして書き留めておきます。


------------------------------------------------------------
#include <stdio.h>
#include <string.h>

#include <iterator>

class AIterator;

class A{
friend AIterator;

public:
typedef AIterator iterator;
A();
virtual ~A();

A::iterator begin();
A::iterator end();
char m_str[16];
};

class AIterator : public std::iterator<std::forward_iterator_tag, int>
{
friend A;
private:
private:
AIterator();
AIterator(A* myClass, int index);

public:
AIterator(const AIterator& iterator);

public:
AIterator& operator++();
AIterator operator++(int);

int operator*();

bool operator==(const AIterator& iterator);
bool operator!=(const AIterator& iterator);

private:
int m_index;
A* m_a;

};

//
//
//

A::A()
{
m_str[0] = 0;
strcpy(m_str, "123456789");
}


A::~A()
{
m_str[0] = 0;
}

AIterator::AIterator()
{
m_a = NULL;
m_index = 0;
}

AIterator::AIterator(A* myClass, int index)
{
m_a= myClass;
m_index = index;
}

AIterator::AIterator(const AIterator& iterator)
{
m_a = iterator.m_a;
m_index = iterator.m_index;
}

int AIterator::operator*()
{
int dummy=-1;
int len;

len = strlen(m_a->m_str);
if (m_index < 0 || m_index >= len)return dummy;
dummy = m_a->m_str[m_index] & 255;
return dummy;
}

AIterator& AIterator::operator++()
{
m_index++;
return *this;
}

AIterator AIterator::operator++(int)
{
AIterator result = *this;
m_index++;
return result;
}

bool AIterator::operator!=(const AIterator& iterator)
{
return this->m_a != iterator.m_a || this->m_index != iterator.m_index;
}

bool AIterator::operator==(const AIterator& iterator)
{
return !(*this != iterator);
}

A::iterator A::begin()
{
return AIterator(this, 0);
}

A::iterator A::end()
{
int len;

len = strlen(m_str);
return AIterator(this,len);
}

//
//
//

int main()
{
A a;

for (int i : a){
printf("i=%02x\n",i);
}
return 0;
}



------------------------------------------------------------

2016年4月20日水曜日

Windows10でネットブックで画面の解像度をあげる

僕B5サイズのノートPCが大好きで、家でブラウザを使うのにネットブックを使っています。

東芝のUX23という機種を使っているのですが、Windows7とかWindows10を入れると、画面の解像度が1024*600になってしまい、一部のソフトが画面からはみ出して、ボタンをクリックできず使えません。

WindowsXPのときは液晶サイズより高い解像度を設定できたのに、Windows7以降は液晶サイズより高い解像度の設定ができないようで、とても不便です。

昔は新しいPCを買ってお金で解決したのですが、おじさんのように給料が下がってしまった人は知恵で解決していきます。

なかなかネットに解決方法が載っていないので、どうやったら画面の解像度を上げられるかいろいろ実験して調べてみました。

どうやら、レジストリにスケーリングONの設定をして、インテルのGMA950のグラフィックスドライバを入れれば画面の解像度を上げられるようです。


まず、IntelのGMA950(G945)のグラフィックスドライバ。

https://downloadcenter.intel.com/ja/product/81509/Graphics-Drivers-for-Mobile-Intel-945GM-Express-Chipset-Family

これをいれます。僕の時はバージョン: 15.12.75.4.1930というものを入れました。
これをいれずにレジストリを変更すると解像度を上たとたんにブルーバックになってしまいます。
Windows8以降ではインストーのル途中で古いバージョンのドライバーを入れようとしていますと聞かれますが、強制的に古いバージョンを入れます。


次にレジストリの書き換え。
拡張子が.regのファイルを作り、以下のテキストをファイルに書き込みます。
------------------------------
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000]
"Display1_DownScalingSupported"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0001]
"Display1_DownScalingSupported"=dword:00000001
------------------------------

そして、ファイルをクリックするとレジストリの変更ができ、PCを再起動すると設定が有効になります。

これで1024*600までしか画面の解像度の設定ができなかったPCが1024*768と1152*864の設定ができるようになります。

液晶サイズはもともと1024*600なので1024*768などに設定すると画面が縮小されてしまいますが、いままで大きい画面でないと使えなかったソフトが使えるようになります。

他のネットブックでもたいていIntelのGMA950のグラフィックアクセラレータなので、同様な方法で解像度を上げることができます。
Windows7、Windows8、Windows10で試しましたが、どのバージョンのWindowsでもこの方法が使えます。


2016年4月7日木曜日

C言語でレーベンバーグ・マーカート法(Levenberg-Marquardt)をやってみた

最小二乗法を実験するブログ、最終回の本日は、レーベンバーグ・マーカート法です。
最小二乗法は線形関数を推定する場合は簡単なのですが、非線形の場合とっても難しくなるようです。

ソースコードでいうと、線形の場合、C言語のファイルが一つなのですが、非線形の場合、ファイルが2000個近くになります。

ビッグマックセットに例えると、普通のビッグマックセット650円なのにグランドビックマックセット130万円って感じでしょうか。


とりあえず、C言語でレーベンバーグ・マーカート法をやるには以下の二つのライブラリがいります。

levmar
http://users.ics.forth.gr/~lourakis/levmar/

LAPACK
http://www.netlib.org/lapack/


levmarは名前からもわかるようにレーベンバーグ・マーカート法のライブラリです。
しかもこのライブラリはLAPACKというフォートラン言語で書かれたベクトル演算ライブラリを使っています。さらにLAPACKはBLASというライブラリを使っています。

フォートラン?
フォートランっていう言葉20年ぶりくらいに久しぶりに聞いた。


このLAPACKというライブラリをC言語からどうやって使うかというと

1.コンパイルしてあるライブラリをどっかから持ってきて使う

2.フォートランコンパイラでコンパイルして、ラッパーをCコンパイラでコンパイルして使う

3.f2cでフォートラン部分のソースコードをC言語に変換して、BLASとlibf2cとも一緒にコンパイルして使う。

このどれかの方法でやらないといけません。
一番簡単な1の方法を使おうと思ったのですが、VisualStudio2008用のライブラリしかない・・・・。

仕方がないので3の方法でコンパイルをすることにします。

f2cをかけたC言語のソースコードはCLAPACKというようで、以下のところにあります。
http://www.netlib.org/clapack/

CLAPACKのソースコードを取ってきて、Visual-C2015で頑張ってコンパイルします。
ひたすら2000ファイル近いソースコードをコンパイルし、エラー部分を修正していきます。
なんというめんどくさい作業。

さらに、levmarをCLAPACKに対応するように修正。

それでも半日くらいかければコンパイルすることができます。

http://kivantium.hateblo.jp/entry/20140408/p1

これでやっと上記のソースコードをVisualStudioで動かすことができました。


VisualStudioでも動くようにした、フルC言語のLAPACKとlevmarはこちら。
https://drive.google.com/open?id=0B5M9qMMg3tfQRDVRaWpuVVh1OWc


コンパイルが面倒ですが、一度作ってしまえばWindows版のBLASとLAPACKだけでもしばらくいろいろ遊んで楽しめそう。