読者です 読者をやめる 読者になる 読者になる

ochalog

Ruby と MediaWiki が好きな電子・情報系の学生のブログ。

2016-11-18 の日記

C 言語 Raspberry Pi プログラミング 日記

「標準課題」というグループ課題で、友達の班に「C言語でメールを送れるようにしたい」という要望があった。おもしろそうだったので、放課後に実験を一緒にやってみた。

構成

学校にはファイアウォールがあってインターネット上のSMTPサーバに直接アクセスすることができないようだったので、とりあえず課題用に配られたRaspberry PiSMTPPOP3/IMAPサーバとすることにした。Raspberry Piにユーザーアカウントを作り、Maildirにメールが届くようにする。

前提

ユーザーアカウントは事前に作ってあり、ログインできるものとする。なければ useradd -m someone で作っておく。

Postfixのインストールと設定

Raspbian Jessieを使っていたので、Debian 8での設定手順がそのまま使える。「Debian 8 Jessie : MAILサーバー : Postfix インストール/設定 : Server World」を参考にした。実験用で外に出すつもりがなかったし、時間の余裕があまりなかったので、以下の点は変えた。

  • インストール中、構成のプリセットの選択で「ローカルのみ」を選んだ。
  • 容量制限やSMTP-Authの設定をしなかった。

SMTPサーバの確認

初めにmailutilsを入れてmailコマンドを使えるようにした。

sudo apt-get install mailutils

また、RaspbianではMAIL環境変数が設定されていなかったようなので、以下の内容で /etc/profile.d/mail.sh を作ってログイン時に設定されるようにした。

export MAIL=$HOME/Maildir

反映させるため、一旦ログアウトして再度ログインする。

続いてsendmailコマンドで自分宛てにメールを送った。

sendmail ocha@example.org
# 以下は標準入力
From: ocha@example.org
To: ocha@example.org
Subject: Hello

Hello world!
.

送信後、mailコマンドで確認すると、送ったメールが届いていた。

C言語でメールを送るプログラムを作る

sendmailコマンドを呼び出して標準入力に書き込めばメールを送信できたので、popen(3)でそれを行う。エラー対策等は厳密ではないので注意。

/*
 * send-hello.c
 */

#include <stdio.h>

int main(int argc, char* argv[]) {
  if (argc != 3) {
    fprintf(stderr, "Usage: %s NAME ADDRESS\n", argv[0]);
    return 1;
  }

  char* name = argv[1];
  char* address = argv[2];

  char sendmail_command[256];
  snprintf(sendmail_command, sizeof(sendmail_command),
           "sendmail %s", address);

  FILE* sendmail = popen(sendmail_command, "w");
  if (sendmail == NULL) {
    perror("popen");
    return 1;
  }

  fputs("From: ocha@example.org\n", sendmail);
  fprintf(sendmail, "To: %s\n", address);
  fputs("Subject: Hello\n\n", sendmail);
  fprintf(sendmail, "Hello, %s!\n", name);
  fputs(".\n", sendmail);

  pclose(sendmail);

  return 0;
}

使うときはこのような形で。

./send-hello ocha ocha@example.org

Dovecotのインストールと設定

最後にPOP3/IMAPサーバとしてDovecotをインストールして、メールソフトから受信したメールを見られるようにした。Postfixと同様に「Debian 8 Jessie : MAILサーバー : Dovecot インストール/設定 : Server World」を参考にした。

PCのThunderbirdIMAPサーバとしてRaspberry PiIPアドレスとポート番号143を指定して、上のプログラムを使って送信したメールを受信できることを確認した。

感想

調べながら作業を行ったので時間がかかったが、要点を押さえればそれほど複雑ではない印象だった。

sendmailコマンドはなかなか便利。ちょうど学校でプロセス関連のシステムコールやライブラリ関数の使い方を習った後だったので、良い応用例だった。Raspberry Piなら、ハードウェアの制御と合わせればおもしろいものができそう。

HHVMのコンパイルエラー対策

PHP MediaWiki

スーパーロボット大戦Wiki等のMediaWikiを動かすためのHHVMを3.14.2に更新しようとしたときに、まずCMakeで失敗した。これはサブモジュールを再帰的にすべてダウンロードできていなかったためで、以下のコマンドを実行することで次に進めた。

# gitでcloneしたHHVMのディレクトリで
rm -rf third-party
git submodule update --init --recursive

しかし、その後makeするとコンパイルエラーが起きて止まってしまった。コンパイルに失敗するのは hphp/hack/src/server/serverError.ml で、探してみたところ以下のissueが見つかった。

Fixed Datetime comparison with milliseconds involved by wjzijderveld · Pull Request #6888 · facebook/hhvm

新しいバージョンではだめなのかと3.14.1等バージョンを戻して試してみるもどうもうまくいかない。さらに探してみると、以下のissueが見つかり、そこに衝撃の事実が。

jwatzman commented on 31 Dec 2015

ocaml's build systems are terrible when it comes to incremental builds. Can you try rm -rf hphp/hack/src/_build and try again?

Error: Unbound value ServerMonitor.start_monitoring · Issue #6701 · facebook/hhvm」より

訳すと「OCamlのビルドシステムはインクリメンタルビルドになるとひどい。rm -rf hphp/hack/src/_build をやってもう一度試してもらえる?」といったところか。こんな罠は知らなかった…

というわけで、上記のとおりにできたファイルを削除してもう一度ビルドをかけたらすんなり進んだ。しかし3コアのVPSではビルドにかなり時間がかかるようで、2時間弱も待つことに。

OSC 2016 Nagoyaに出展します

日記 プログラミング マイコン Raspberry Pi Ruby OpenStreetMap

2016年5月28日(土)に開催されるオープンソースカンファレンス2016 Nagoyaの浜松職業能力開発短期大学校ブースにて、避難所支援システム「避難所てだすけくん」の展示を行います。

続きを読む

どどんとふの CGI 処理:トップレベル

どどんとふ開発 プログラミング Ruby

TRPG のオンラインセッション環境「どどんとふ」の CGI 処理についての解説。前回はこちら。

ochaochaocha3.hateblo.jp

今回からサーバープログラムが書かれている DodontoFServer.rb(コミット 94c3c04)を見ていく。

続きを読む

どどんとふの CGI 処理(構成・インターフェース)

プログラミング Ruby どどんとふ開発

最近は TRPG のオンラインセッション環境どどんとふのソースを読んだり変えたりしていることが多い。TRPG.NET ではオンラインセッションが多く行われる夜間に結構重くなるので、負荷を下げることを目標としている。ソースコードの規模が大きいので、テストコードを追加しながら機能単位での分割などを行い、改善点を見つけやすくしたり部品の再利用を行いやすくしたりしている。

今回から、備忘録を兼ねて、これまで調べたどどんとふの CGI 処理について数回書く。コードへのリンクは ver. 1.47.24 リリース時のコミット 94c3c04 を使うことにする。

続きを読む

2016-04-22 授業日誌

日記 授業

1〜3限

Java等の先生の出張により、まるまる画像処理の時間に。以下のように結構多くのことをやった。

  1. OpenCVの開発環境構築
  2. Webカメラから取り込んだ画像をリアルタイムでウィンドウに表示する
  3. 光とか色とか行列とか基礎事項
  4. 行列演算
  5. 色の分解

OpenCV、グラフィックまわりを手軽に扱えるのでなかなか便利そう。標準課題という今年の後半で行うプチ卒研くらいの量の実習でも使うとのことなので、いろいろと試してみたい。

ところでこの時間のレポートはExcelに全部貼り付ける形で、水曜日のものといい本質的でない部分に時間がかかるので最後は少しうんざり。内容は面白いのだけれど。

2016-04-21 授業日誌

日記 授業

1・2限

アナログ回路設計の実習。LED3個をそれぞれ遅らせて点灯させるウィンカー回路、すべてタイミング通りに点灯させることができた。先生曰く、1個が点いたらその電圧を次の積分回路に回す、というのを繋げていくのが良いとのこと。現状では点いたままになってしまうので、最後に消すための回路が必要。フィードバックする方法を考えていたところで時間切れで終了。電子科出身の同級生がいるグループではそこまでうまくいったという話も聞き、さすがだなぁと感じた。

自宅でシミュレーションをするために帰ってからはLTspiceを入れてみた。適当にフィードバックする回路を組んでみたけれど、過渡特性がイマイチなのでもう少し考える必要があった。

3・4限

Linuxプログラミングの授業。やっとシェルプログラミング。配布資料がちょっとしたリファレンスになっているので、これからサーバー管理のときにそれを見てやることにしよう。内容的にはそれほど目新しいことはなく、最後に配られた演習問題を淡々とこなす。さらに確認テストもあったが、難なく終わった。

2016-04-20 授業日誌

日記 授業

1・2限

Linuxプログラミングの授業。今日はシェルのリダイレクト、パイプとgrepのようなフィルタプログラムがメイン。前提としてファイルディスクリプタシステムコールのかなり丁寧な説明があり、それからリダイレクトとパイプの解説という流れだった。これだけ丁寧に行ってくれれば分かりやすい。去年卒研メンバー間でセミナー的にやったが、授業でこれくらいやってもらえるのはありがたかった。最初からすべて理解するのは大変だが、資料を見直せばなんとかなるだろう。

3限

ARMマイコンの授業。今週はLEDを5個に増やしてみようという内容。ポートの設定を増やすだけなので特に難しいことはない。ただ、宿題がC言語のプログラムを覚えるために手書きで書いてこいという内容だったので面倒だった。プログラムを手書きすること、どれだけ効果があるのだろうか。

2016-04-19 授業日誌

日記 授業

1限

アナログ回路。抵抗とコンデンサを直列でつなげたときの過渡現象とテブナンの定理。テブナンの定理は去年フィルターの計算で使って以来しばらく使っていなかったので復習しておこう。

2限

経営学。今日は「企業とは何か」。企業にはいろいろな側面がありますよという話と中小企業基本法による分類。

3限

機械工学。今日もほぼイントロダクションで、図面を描く目的とか気をつけることとか。

放課後

やっと引越し先のインターネットが開通して、家で自由に使えるようになった。2週間くらいパケット量制限ありのWi-Fiしかなかったので、なかなか大変だった…

2016-04-18 授業日誌

日記 授業

1限

プロトコルTCP/IPの話。EthernetIPアドレスARPまでさらっと復習。データリンク層とインターネット層の役割の話はだいぶ丁寧だった。最後に確認テスト。ブリッジ、レイヤ2スイッチ、スイッチングハブとか、このあたりの用語がややこしい。

2限

しばらくディジタル回路の復習。ICのNOT、AND、OR、NAND、NORを確認した後、ディスクリート部品(ダイオードと抵抗とトランジスタ)でNANDを作った。動作の説明でたまたま自分が当たったので先生と「ここがLだからこちらはHになって〜」とか話していたが、残り時間が少なくて速く話していたので周りから見たら少し分かりにくかったかも。

3限

知的財産法。特許とか実用新案とかの対象を少し詳しく見てから、特許の章へ少し入った。

4限

英語。教科書は英語で書かれたワークブックで、結構やさしい。今日は簡単な単語から入った。最後に「鞄の中にあるものを英語で言ってみよう」というのがあったが、クラス全員で50個くらい違った単語が出ておもしろかった。