Category Archives: プログラム/記述言語

Permalink to single post

Livestreamer

ストリームいじってるプログラムを書いたりしていたんだけど、なんかいろいろあるストリーミングサービス (ustreamとか) のURLなげたらうまい具合に探ってもらって簡単にストリームを抜き出せるライブラリとかあったら便利そうじゃね?

とかおもってたけどまぁフツーにありました。

コマンドラインから利用できて、あとPythonでできてるのでPythonのライブラリとして使用できる。あと使って無いけどWindowsでも動きそうなかんじ。大変素晴らしい。

25個ぐらいのサービスに対応してるようです。さすがにニコニコとかは無い。

Permalink to single post

libwnck (ウィンドウマネージャ操作ライブラリ)

サイネージというほどのものではないけど、それ的なもののソフトウェアをつくるために、X上で外部プロセスのウィンドウをいじってどうにかするみたいなのを探した。 いろいろ当り最終的にlibwnckを見つけた。ウィンドウマネージャの操作ライブラリ。Pythonバインディングのpython-libwnckもある。
import wnck, gtk
screen = wnck.screen_get_default()
screen.force_update()
windows = screen.get_windows()
これでウィンドウリスト (WnckWindowのリスト) が得られる。これに対して、
w = windows[0]
w.get_name() # Window Name
w.get_application().get_name() # Application Name
w.get.get_class_group().get_name() # Class Name
こんな感じで情報を取得し、
w.set_geometry(wnck.WINDOW_GRAVITY_CURRENT, wnck.WINDOW_CHANGE_X | wnck.WINDOW_CHANGE_Y, 100,100,0,0)
w.set_title("新しいタイトル")
gdk_w = gtk.gdk.window_foreign_new(w.get_xid())
gdk_w.set_decorations(0) # デコレーションの削除
# 反映させる
gtk.gdk.window_process_all_updates()
gtk.gdk.flush()
こんな感じにウィンドウが操作できる。

uWSGIと併用時のエラー

ちなみに、python-wnckを使用するWebアプリをuwsgi上で動かしたらこんな感じのエラーが出てしばらくこまった。
172.29.4.50 - - [12/Mar/2014:22:59:39] "GET /info HTTP/1.1" 200 4 "" "Mozilla/5.0 (X11; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"
[pid: 15271|app: 0|req: 6/6] *.*.*.* () {32 vars in 508 bytes} [Wed Mar 12 22:59:39 2014] GET /set_center/info => generated 4 bytes in 6 msecs (HTTP/1.1 200) 4 headers in 138 bytes (1 switches on core 0)
Wed Mar 12 22:59:41 2014 - !!! uWSGI process 15270 got Segmentation Fault !!!
Wed Mar 12 22:59:41 2014 - *** backtrace of 15270 ***
Wed Mar 12 22:59:41 2014 - uwsgi(uwsgi_backtrace+0x25) [0x431ea5]
Wed Mar 12 22:59:41 2014 - uwsgi(uwsgi_segfault+0x21) [0x431f81]
Wed Mar 12 22:59:41 2014 - /lib/x86_64-linux-gnu/libc.so.6(+0x324f0) [0x7fa477a794f0]
Wed Mar 12 22:59:41 2014 - /usr/lib/libstartup-notification-1.so.0(sn_xcb_display_new+0x109) [0x7fa47201fa89]
Wed Mar 12 22:59:41 2014 - /usr/lib/libstartup-notification-1.so.0(sn_display_new+0x2d) [0x7fa47201fb3d]
Wed Mar 12 22:59:41 2014 - /usr/lib/libwnck-1.so.22(wnck_screen_get+0x117) [0x7fa474660617]
Wed Mar 12 22:59:41 2014 - /usr/lib/python2.7/dist-packages/gtk-2.0/wnck.so(+0xa809) [0x7fa4748ac809]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x56fd) [0x7fa47521d04d]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5b7b) [0x7fa47521d4cb]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6917) [0x7fa475274917]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x184810) [0x7fa475352810]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_CallObjectWithKeywords+0x47) [0x7fa475304647]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyInstance_New+0x7b) [0x7fa4752ec58b]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x2a57) [0x7fa47521a3a7]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5b7b) [0x7fa47521d4cb]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6917) [0x7fa475274917]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x2a57) [0x7fa47521a3a7]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6917) [0x7fa475274917]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x184810) [0x7fa475352810]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x11c1ac) [0x7fa4752ea1ac]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x2a57) [0x7fa47521a3a7]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x848) [0x7fa47521e2e8]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xa6806) [0x7fa475274806]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0x184810) [0x7fa475352810]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(+0xcbdf6) [0x7fa475299df6]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyObject_Call+0x4e) [0x7fa475303d3e]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x27dd) [0x7fa47521a12d]
Wed Mar 12 22:59:41 2014 - /usr/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5b7b) [0x7fa47521d4cb]
Wed Mar 12 22:59:41 2014 - *** end of backtrace ***
Wed Mar 12 22:59:41 2014 - DAMN ! worker 2 (pid: 15270) died :( trying respawn ...
Wed Mar 12 22:59:41 2014 - Respawned uWSGI worker 2 (new pid: 15296)
最初はなんかcherrypyかuWSGIのスレッドが有効になっちゃってて変な事がおこっているかと思ったけど、どうやらPython初期化後にforkしてからGTKとかX11のAPI使っているから発生しているよう。(断定的に調べていないので違うかも。) uWSGIのlazyオプションを指定するとfork後の初期化になるようなので、それで改善した。
Permalink to single post

F-PLUG (消費電力モニタ) をLinuxで使ってみた

大地震からも日が経ち、節電という言葉もだんだん聞かなくなりつつあるなか皆様いかがお過ごしでしょうか。

なんて偉そうな事言いつつ今回のはあまりそれとは関係ないんですが、前々から会社のいろいろな機材 (サーバーとか) で使ってる消費電力のモニタとかやりたいなぁと思っていたりして、ワットモニターUSBとか、スマートコンセントとか電力計の類をいろいろ調べてたんだけど、先週とある電気量販店でF-PLUGなるよさげなものを発見した。

F-PLUG

F-PLUG 近影

  • 一口 15Aまで
  • Bluetooth (RFCOMM)
  • この手のものにしては比較的安め (約5000円)
  • 電力に加えて、温度、湿度、照度まで図れる
  • リアルタイムの電力計測が可能、また一時間ごとの積算値もF-PLUG側で記録される

とまぁこんな感じです。これを使って、いろいろとデータをとってLinuxサーバーでモニタすればなにかいいことが起きるに違いないということでこれを購入。ソフトウェアは公式にはどうやらWindows用しかないようだったけど、とりあえずBluetooth (RFCOMM) ならLinuxでも比較的簡単に何とかなるだろうという目算。

現在値取得までは比較的容易に…

とりあえず/dev/rfcomm0を使えるようにするまでの接続はググって出てきたところ (→Rasperry PiにF-PLUGを2個繋いでみた 等) を参考に。まぁ普通のRFCOMM機器の接続手順です。

あとどうやらOBDNマガジンなるものにはfplug_for_linuxなるソフトウェアが掲載されているようで、とりあえずそれを使えば現在値の取得 (電力値[W]と温度・湿度・照度) まではできた。

しかし機能が足りない

リアルタイムでのいろいろな値をモニタするものやりたかった事だけど、一番やりたかったのは積算の消費電力量 [Wh] を出すこと。上記のものではそこまでの機能は提供されていない。

まぁ一秒ごとに電力値を計測して足していけば積算電力もだせるだろという話もあるけど、なんか無駄な感じするし、そもそも二秒おきぐらいにしか計測できないので誤差がけっこう出る気がして気持ちが悪い。

ということで作る。上記は簡単な小物作りには面倒なC言語で作られていたので、結局全部Pythonで書き直すことにした。

幸いなことに、(というかなぜか?) データの仕様がまるっと公式ページ (F-PLUGメッセージ一覧) に掲載されていた。正直かなり見づらい上に若干不正確  (というか舌足らず?) だったりもするけど、こういうものがあるだけでかなり助かる。なんかもともと業務用のなんかの製品だったりするのかな。

まぁということでひたすらこのコードを打ち込む。

成果物

とりあえず制御用ソフトウェアをせっかく作ったので、現段階までにできたものを公開しときます。

まだUIはありません。作ってません。pyfplugモジュールにある FPlugDevice クラスでF-PLUGの操作ができます。ほとんど全ての機能が使えると思います。

ちなみにDebian 7とGentoo Linux (ともに64bit) で動作確認してます。

ところで精度は・・・?

それは分かりません。かなりざっと不真面目にしか確認してないです。

  • 温度: 壁掛け時計の数値が23℃の時、F-PLUGの計測値は27.0℃
    • マシンに近かったり、F-PLUG自体たぶん発熱してるから高めになった?
  • 湿度: 壁掛け時計の数値が55%の時、F-PLUGの計測値は湿度は42%
    • 温度が高い分湿度が下がってるのかも
  • 照度はほかに計測機器がないから不明
  • 電流:
    • うちの安物クランプメーターで1.4 (A) 前後のとき、F-PLUGでは170 (W) 前後
    • 同様に10.90 (A)のとき 1063 (W)
    • 電圧100 (V)、力率1.0として計算すると、それぞれ21%、2.5%ほどの差になる
    • しかしそもそもこのクランプメーターも怪しい

これじゃ (精度計測としては) 参考にもならないですね。ただまぁこの感じからすると大きく外れた値はないので、とりあえずつくったプログラムはある程度正しく動いてるんでしょう。

他の所の報告ではそもそも個体差がけっこうたったりして、それなりの誤差があるようです。

怪しげなクランプメーター

怪しげなクランプメーターで計測するの図


今後…

  • かんたんなコマンドラインのUIつくる
  • Zabbixとかで使ってみる
Permalink to single post

PIL (Python Imaging Library) のImage.thumbnailがうまく出ず小一時間・・・

PILのthumbnailで小一時間悩んだ。以下のソース
size = ***
img.open(hoge)
img.thumbnail((size, size))
img.save(fuga)
これでなぜかサムネイルがfugaに保存されるはずが、そのまま変換前の画像が保存される。 エラーも何も出ず。 いろいろ探っていたらsizeが文字列型なのが問題だった。エラーぐらい出てほしかった・・・。
Permalink to single post

セキュリティ&プログラミングキャンプ2011に参加しました

今年もセキュリティ&プログラミングキャンプ (2011)に、後半3日間だけですが特別チューターとして参加しました。

僕は2004年(第一回)のセキュリティコース参加者だったのですが、前年と同様プログラミングコースに関わることになりました。しかもなぜか「特別チューター」という肩書きに。僕はレベル的にはチューターと同じですよ。

ちなみにチューターのお仕事としては、Rubyの実行の可視化をしていたお二方のサポートを主にしていました。

今年のキャンプも例年どおりの奇人変人具合でした。毎年レベルが上がっているというのもあるかもしれませんが、なんか毎年幅が広がっている気もします。

BASICという以前からの王道から始まり突っ走る人、いろいろWebアプリとか作ってる人、実装よりも計算理論面からせめてる人もいる。今年はAndroidやってるところもあったと思います。毎年いろんな方がいるけど、それ幅が広くなっている気がします。まぁそもそもコンピュータの世界が広がっているっていう部分もあるんでしょうね。

あと今年の印象としては

  • 謎のGentooブーム
  • 謎のRedbullブーム

こんな感じです。とりあえず参加者の皆様のプレゼンも (笑える、興味深いの両方の意味で) おもしろかったし、いろんな人と今年もお話しすることができてとても楽しかったです。

個人的に悔やまれる点としては

  • 自分がじぇん厨なのでGentooブームにもっと乗っかれば良かった
    • 前半の2日間にいなかったのが災いしたか
  • スナガラボの売り込みをもっとしまくれば良かった
    • というか名刺作った量がそもそも少なすぎた

まぁこんな感じです。

そういうわけで、今後ともスナガラボ株式会社と須永をよろしくお願いします。

各種情報へのポインタ (自分のためにも今後追加します。。。)

http://d.hatena.ne.jp/nishiohirokazu/
Permalink to single post

RubyKaigi2011で発表しましたよ

Rubyで使えるリアルタイムプロファイラって題目で発表しました。とはいえ実態はPythonのほうが(ry

何だかんだで言いたいことは言えたし、Pythonのところで狙いどおりウケてくれたので、よしといった感じでしょうか。

実際に使っている方もいらっしゃってそれはうれしかったです。

公開場所→sunagae.netのllprofページ

取り上げていただいたサイト

とかを自己満のためリストする。(順不同)

デモ動画

これだけみてもなかなか分かりませんが・・・

Permalink to single post

並列実行の視覚化ツール

個人的なプログラム書いてるとき、並列実行の視覚化ツールがあったら便利だなぁと思って作ってしまった。

マルチスレッドとかで並列実行されるプログラムを実行させて、記録されるログからシーケンス図っぽいものを自動的に作ってくれます。

なんかそれなりにまとまったものができたので、たまにはちゃんと公開してみる。

まぁなんか似たようなソフトってあるんだろうなぁ。。

VizEXECのページ

・・・なんかこういう脇道にそれるのばっかりで、メインの作業がなかなか進まないんだよなぁ。

Permalink to single post

Monoを組み込み処理系として使う: 処理系サイズ

Monoを組み込んだプログラムをWindows向けに配布するときは一緒に配布してしまうのが多分楽。しかしその時にサイズがあまり大きすぎるとちょっと困る。

ということで、サイズ削減版のMonoを作るとどの程度のサイズになるかを調べてみた。

使ったのは本家で配布されているWindows版バイナリのMono 2.8.2。

とりあえずさっきのサンプルが動く最小構成と、Gtk#が動く範囲での最小構成で作ってみる。

結果:

  • ミニマム: 5.1 MB
  • Gtk#ミニマム:  46.4 MB
  • Gtk#ミニマムをzip: 17.4 MB

ミニマムはサンプルプログラム+mono-2.0.dll+mscorelib.dllだけなので、 (リビルドとかしない限り) 最小限構成だと思う。

Gtk#ミニマムのほうはなんかもう少し削れるかもしれない。ただし、まともなアプリ作ると参照が増えるかもしれないので、まぁこの程度なんでしょう。

zipすれば20MB切るし、初期配布サイズとしてはまぁOKかなぁという感じですかね。

Permalink to single post

Monoを組み込み処理系として使う

Monoの言語(C#、Boo、etc.)をスクリプティングとして使う場合とかに使える、C++の小さいサンプルを作ってみた。

スクリプティングとして使う場合は「C++→スクリプト」と「スクリプト→C++」の2方向の呼び出しができる必要がある。ということで最小限それができるサンプルを。

「C++→スクリプト」はMonoのAPI (mono_runtime_invokeとか) をつかってがんばる。「スクリプト→C++」はP/Invokeを使えばできるらしい。とりあえずやってみる。

試験環境はGentoo Linux、Mono 2.8.2です。monotest.cppがメインで、test.dllを呼び出している。test.dllはBoo言語でかかれている。ちなみにBoo言語はPythonライクなMonoの言語。まぁべつにC#でつくっても動くはず。。。

monotest.cpp:


#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/debug-helpers.h>

#include <string>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
using namespace std;


extern "C" {
extern void PrintFunc(int val);
}

void error(const string &msg = "")
{
	cerr << "Error:" << msg << endl;
	abort();
}

int main(int argc, char* argv[])
{
	// Export Check
	void *ThisModule = dlopen(NULL, RTLD_LAZY);
	cout << "Module Handle:" << ThisModule << endl;
	void *pFunc = dlsym(ThisModule, "PrintFunc");
	cout << "Function Handle:" << pFunc << endl;
	if(!pFunc)
		error("No symbol: PrintFunc");
	

	MonoDomain *domain;
	const char *file;
	int retval;
	
	if (argc < 2){
		fprintf (stderr, "Please provide an assembly to load\n");
		return 1;
	}
	file = argv [1];

	domain = mono_jit_init("monotest");

	MonoAssembly *assembly = mono_domain_assembly_open (domain, "test.dll");
	if (!assembly)
		error();

	
	PrintFunc(0);
	
	MonoImage *image = mono_assembly_get_image(assembly);
	MonoClass *klass = mono_class_from_name(image, "TestNamespace", "TestClass");
	MonoMethodDesc *desc = mono_method_desc_new(":TestStaticMethod(int)", false);
	MonoMethod *static_method = mono_method_desc_search_in_class (desc, klass);
	
	void *args[1];
	int val1 = 1234;
	args[0] = &val1;
	mono_runtime_invoke (static_method, NULL, args, NULL);

	mono_jit_cleanup (domain);
	return 0;
}

void PrintFunc(int val)
{
	cout << "In PrintFunc :" << val << endl;
}

test.boo:

namespace TestNamespace

import System.Runtime.InteropServices

[DllImport("__Internal", EntryPoint: "PrintFunc")]
def PrintFunc(val as int):
	pass

class TestClass:
	static def TestStaticMethod(val1 as int):
		print "In TestClass: ", val1
		PrintFunc(val1 * 2)
		return

コンパイル:

$ g++ -export-dynamic -g monotest.cpp -o monotest `pkg-config --cflags --libs mono-2`
$ booc test.boo

実行結果:

$ ./monotest test.dll
Module Handle:0x46d048e0
Function Handle:0x8048ff0
In PrintFunc :0
In TestClass:  1234
In PrintFunc :2468

P/Invokeはちょっと注意が必要。たぶんdlopenで自分自身を開いてやってるので、シンボルを参照できるようにする必要がある。具体的には、関数をextern “C”する必要があったり、コンパイル時に-export-dynamicをつける必要があったり。monotest.cppのmainの頭についているdlopenのテストコードはそれのチェック用。もしかしたらこれは外部ライブラリとかにしたほうがいいのかもね。

まぁとりあえずそれなりに簡単にMonoを組み込むことができそうということが分かった。

あとはWindowsでどうなるかだな。。。

Permalink to single post

島めぐりマップつくってみた

旅行する時には必ずGPSロガー(Holux M-241)をもってって、なんとなく軌跡を記録していたりします。

いままでデータを適当にためてっただけでしたが、そろそろいくらかデータがたまって来たので、適当に可視化ツール作って、いままで巡った島をマップにしてみました。

ツールはPython + PIL(Python Imaging Library)でつくりました。PILは初めて使ったけどこれは便利ですね。

下図ができたマップ。(クリックして拡大)

青い線がGPSによる軌跡です。誤差があったり、一部補完してたりするので、完全に正確ではありません。途切れ途切れになっているところは、GPSの感度が悪かったり、GPSの電源を入れ忘れていたりでデータが取れなかったところ。かつ、まだ補完してないところ。結構多くて残念。

あと伊豆諸島とかは、GPS買う前にいったから軌跡がかけず。とても残念。

東京−大阪間に三本くらい軌跡があるのは、東海道線乗ったときと中央線乗ったときと、あとなんだろう。高速バスかな。福江島の右の奴は長崎本線、新潟の方も北陸本線。小笠原の右に走ってる線はグアムにいくときの飛行機ルート。

あー、日本の輪郭とかも書きたいけどフリーのデータ拾ってこないとなぁ。SVGとかで転がっているところ誰か知りませんかねぇ。いや自分でGPSもって日本一周すればいいのかな。

いやー、それにしてもまだまだ24島しか回ってないのかぁ。まだまだだなぁ・・・。

あ、あと「島図鑑なるものが・・・」で書いた原色 日本島図鑑をやはり買ってしまった。

Permalink to single post

色々制作

niconico.py

ニコニコ動画というかニコニコ実況のPython向けライブラリを書いた。というよりは、ニコニコ実況の解析プログラム的なものかいてて、それの副産物のような感じではあるけど。

とりあえずniconico.py公開リンク

LoafCMS(仮)

なんか写真とか動画とかも含めて適当に管理すれば、それなりのページができるようなCMSがほしいなーと思っていて、それを実現すべくLoafCMS(仮)なるものを書いています。

が、しかしデザインとか何度も考え直していて一向に進まず。困ったものだ。

使えるレベルになったら公開したい。

で、それを使ってsunaga-labを構築したいなぁとか思っていたのですが、なんからちがあかないので、とりあえずwikiだけ構築してしまうことにした。

URL: http://www.sunaga-lab.net/w/

コンテンツがなにもないのも寂しいので、niconico.py関連だけ書いておいた。

http://www.sunaga-lab.net/w/doku.php?id=niconicoと
Permalink to single post

激しくgoogle作成中

超速でgoogleを作成中。なんかあれ作ったりこれ作ったりで最近取り留めがなくなっている感じも否めないが。

それについてとりあえず現状の記録しとく。

» 続きを読む…

« 以前のエントリ