RSS

日々のメモ書き

Debian Developerが綴るメモ

サーバの引越

linodeのVPSを使ってこのサイトは運営されているがいつの間にやら東京にデータセンターを開設していた(なんと9月だった)。ということで引越をした。

手順がFAQではよくわからなかったがサポートチケットを作成するらしい。サポートチケットを作成して数分したら準備ができたと返信ができた。コントロールパネルに戻ると移設の表示がしてありサーバーをシャットダウンして移設を実行する。

ディスクイメージの転送が10MB/sぐらいしか出ないので40分ぐらいかかった。起動してみたが非常にはやい。RTTが20msぐらいなんで今までの1/10ぐらい。

問題が一つ。DNSの書き換えのこと。VPSのサーバーがマスターになっているが同時には動かせないので移行措置なんというものが全くできずにexpireされるまでどうにもならんという話に。古いマスターも消えているので変なことにはならないはずではあるが…。もうちょっと計画的にやろうや。

秋の鈴鹿8耐

春に続いてまたも雨。ライダーズミーティングで誰の日頃の行いが悪いのでしょうとか冗談が言っていたようだが。だけどぱらつく程度の雨でやがて上がる。一時は青空が少し見える程度だった。

雨だと多いのが落車。春のような落車の影響で中切れはすまいと思ったが…。スプーンからヘアピンへ向かう途中で大落車事故…。コース全体をふさぐような事故で完全に集団が千切れてしまう。ああ…。

最初の3時間ぐらいは落車がひどかった。ヘアピンとデグナーで毎週イエローフラッグが振られていて目の前で落車をされて「落ー」と叫ぶことも。

路面は結構荒れていた。アスファルトにひびがはいっていたり。そろそろ補修が必要じゃないかなあと思うようなところがちらほら。

落車の影響で中切れした瞬間にあんまり頑張るのはやめて抑え気味で走ろうと決めた。9分台で最初は刻んでいた。3時間すぎたあたりで10分を切るのが難しくなる。4時間で24周回。このペースだと42前後かなあと思う。

  • 8時間ロードソロ 43位 42Laps 8:03:39.221

そのあとは12分から13分というペースまで落ちる。一度マトリックスの選手に引いてもらったときがあってそのときだけ10分台で走れた。ときどきおかしなスピードで抜いていくトップ集団を横目に見ながらあれについていく足が残っていればねえと思う。頑張れば1周は行けるがホームストレートでついていけないからダメ。2周頑張れる力があればもうちょっと上に行けるんだろうけど。

結局42周回でゴール。最後の周回はちょっと頑張って思いきりホームストレートでスプリントしてフィニッシュラインでハンドルを投げるとこまで頑張ってみた。

ダメだダメだと思いながらも精神力でここまでふんばれたなあとは思うけど45以上を目指したいなと思うのであった。

鈴鹿8耐前日

春に引き続いて天気が悪い。土曜日から雨。明日も日中は雨のようだ。やる気がそがれる。家から出るのもめんどくさかった。適当にがんばろう。

MIME/Mail関係のライブラリ

MIMEやメール関係を扱うライブラリを調べてみた。名前はdebianのパッケージ名が元なので正式名とはちょっと違う。MIME multipart・エンコーディング・base64などの扱いは全てある。とりあえずまとめ。

libetpanlibgmimelibmailutilslibmimeliblibmimeticlibvmime
License BSD-3 LGPL-2.1+ LGPL-3+ GPL MIT GPL-3+
last-update 2010-04-09 2011-06-08 2010-09-08 1997 2011-09-10 2010-05-18
C/C++ OK OK OK C++ only C++ only C++ only
Network

OK

N/A OK OK N/A OK
IMAP OK OK
OK
POP OK OK OK OK
Maildir OK OK OK
MH OK OK
Mbox OK OK
TLS/SSL OK N/A OK ? N/A OK
pkg-confi OK OK
その他 glib利用 autoconf macro

GIOでSTARTTLSを実装

めんどくさい。STARTTLSへの入り方はプロトコルによって違うので関数一発とはいかないのはわかるが…。すでにあるGSocketConnectionからGIOStreamを経由してGTlsConnectionを生成。そのあとhandshakeを行う手順。wiresharkでキャプチャしたが何も読めないことが確認できた。

#include <glib.h>
#include <gio/gio.h>

// $ gcc -Wall $(pkg-config --libs --cflags gio-2.0) gio_starttls.c

int
main(int argc, char **argv)
{
    GSocketClient *client;
    GCancellable *cancellable = NULL;
    GSocketConnection *connection; 
    GSocketConnectable  *connectable = NULL;
    GError *error;

    g_type_init();
    client = g_socket_client_new();
    connection = g_socket_client_connect_to_host(client, 
						 "imap.example.com",
						 143,
						 cancellable,
						 &error);
    if (connection == NULL) {
	 g_printerr ("%s can't connect: %s\n", argv[0], error->message);
	 return 1;
    }
    
    GInputStream *input = g_io_stream_get_input_stream(G_IO_STREAM(connection));
    GOutputStream *output = g_io_stream_get_output_stream(G_IO_STREAM(connection));
    char *buf; 
    buf = g_strnfill(1024, 0);
    g_input_stream_read(input, buf, 10240,NULL, &error);
    g_print("%s\n", buf);

    char str[] = "STARTTLS\n";
    g_output_stream_write(output, str, sizeof(str), NULL, &error);


    g_free(buf);
    buf = g_strnfill(1024, 0);
    g_input_stream_read(input, buf, 9999,NULL, &error);
    g_print("%s\n", buf);

    
    GIOStream *tls_conn;
    tls_conn = g_tls_client_connection_new (G_IO_STREAM(connection),
					    connectable, &error);
    if (!tls_conn) {
          g_printerr ("Could not create TLS connection: %s\n",
                      error->message);
          return 1;
    }

    if (!g_tls_connection_handshake (G_TLS_CONNECTION (tls_conn),
				     cancellable, &error))
    {
	g_printerr ("Error during TLS handshake: %s\n",
		    error->message);
	return 1;
    }

    input = g_io_stream_get_input_stream(tls_conn);
    output = g_io_stream_get_output_stream(tls_conn);

    char str2[] = "a01 capability\n";
    g_output_stream_write(output, str2, sizeof(str2), NULL, &error);

    g_free(buf);
    buf = g_strnfill(1024, 0);
    g_input_stream_read(input, buf, 1024,NULL, &error);
    g_print("%s\n", buf);

    return 0;
}

実行するとこうなる。handshakeの処理をしないinput・outputを渡すと謎の文字が表示されるだけである。

$ ./a.out 
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2008 Double Precision, Inc.  See COPYING for distribution information.

STARTTLS OK Begin SSL/TLS negotiation now.

* CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE AUTH=PLAIN ACL ACL2=UNION
 OK CAPABILITY completed

$ 

gnubiff改造中

gnubiffを新着メールの通知に使っているがまだGnome3に対応していない。このままだとDebianから削除される。これは困るがアップストリームが対応する気配が感じられないので自分でやってみることにした。結論からすると途中で壁にぶつかっている。

ガイドに従ってやってみた。Glade-2からGlade-3に変更するとかGnomeの古いコードを削るとかGTK+2の範囲でできる対応までは順調にできた。だがいざGTK+3に上げるとかlibpanel-applet-4.0に対応させようとするところで困難を極める。コードがひど混乱ぶりだ。C++を使っているのだがgtkmmを使っていない。キャストを使っているので型安全があやしい。ちょっとでも間違えるとさっさとSEGVで落ちてしまう。

UIがGnome(アプレット)・GTK+(独立アプリ)・systemtrayとあるがsystemtrayはGTK-3ではeggtrayiconに替わって(10年前のコードだぞ)GtkStatusIconを使わなければならない。しかしこれはGtkWidgetではないのでGtkWidget前提のコードでは破綻する。いやどうにかしたいけどUIの基底クラスで定義してあるもーん、まいったなーという感じである。

パネルアプレットはGnome3では大部違うし。書き換えも大変だな…。もっと恐しいのがネットワーク回り。POP・IMAPなどそれぞれのメールボックスに対応したクラスが独自実装で書いてあってsocketまで独自実装かよ。すくなくともここはGNU mailutilsぐらいで書き直したい。これって改造とかいう範囲でおさまらん気がする。

一からSystemtrayのソフトとして書いてそこから考えたほうがいい気がする。

GladeXMLからGtkBuilderへ

signalを登録するあたりでちょっと違うなあ…。

void                glade_xml_signal_connect_data       (GladeXML *self,
                                                         const char *handlername,
                                                         GCallback func,
                                                         gpointer user_data);

void                glade_xml_signal_connect_data       (GladeXML *self,
                                                         const char *handlername,
                                                         GCallback func,
                                                         gpointer user_data);

void                (*GladeXMLConnectFunc)              (const gchar *handler_name,
                                                         GObject *object,
                                                         const gchar *signal_name,
                                                         const gchar *signal_data,
                                                         GObject *connect_object,
                                                         gboolean after,
                                                         gpointer user_data);

void                (*GtkBuilderConnectFunc)            (GtkBuilder *builder,
                                                         GObject *object,
                                                         const gchar *signal_name,
                                                         const gchar *handler_name,
                                                         GObject *connect_object,
                                                         GConnectFlags flags,
                                                         gpointer user_data);

signal_dataはどこに消えたんだろう。

sourceforgeからgit cvsimport

SourceForgeでホスティングされているあるプロジェクトを変更しようと思った。大改造になりそうなのでgitを使いたい。折角すでにCVSが用意されている。じゃあcvsimportでもやるかなと思った。しかしネットワーク越しにcvsimportをやると遅くてたまらない。そういえばレポジトリのバックアップが取れた気がするなあ…。

https://sourceforge.net/apps/trac/sourceforge/wiki/CVS#Backups ということだった。このあとは

git cvsimport -d :/tmp/path/foo module

/homeをbtrfsに

btrfsを部分的に使用して1年ぐらい経ったかと思う。特に問題になるようなことは発生してなかったので/homeをext3からbtrfsに変更した。btrfs-convertを実行。30GBぐらいを変換するのに30分はかかってないと思う。特に何もなく動作中。

< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 >