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;
}



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