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
しかし、この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エンジンもそうなのですが、ネットワーク系とデータベース系はライブラリを実装して互換性をきちんと試験するのが本当にとても大変です。
結構バグ取りに時間がかかってしまったのですが、今日だいぶまともに動くようになったので公開します。
しかし、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デバイスのデータをプログラムから活用できます。
集めたデータは大体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を実装すればできるっぽいのですが、結構めんどくさいのでテンプレートとして書き留めておきます。
------------------------------------------------------------
------------------------------------------------------------
どうやら、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;
}
------------------------------------------------------------
登録:
投稿 (Atom)