FreeBSDのメンテをしていたら、いつのまにかrubyが1.9から2.0になったり、perlが5.16から5.18になったり、共有ライブラリの*.laファイルを使わない方針になったりといろいろ変わっている。
/usr/ports/UPDATINGを見ながら、それぞれアップデートする。
rubyのバージョンが上がったので、passengerを入れ直したり、bundle installしたりして、なんとなく動いたかな〜、と思っていたら、MovableTypeで文字化けが発生。
状況としては、以下のような感じ。
  1. 管理コンソールは普通に表示できる。
  2. 新しい記事を書いて公開しようとすると、テンプレート「ヘッダー」がないよ的なエラーが出た上に保存した記事が文字化けしている。
  3. DBを覗くと、DBに入っている時点で文字化けしている。
化け方としては、「あ」と入れたものが、psqlで表示すると「ã\u0081\u0082」のようになる。「あ」のUTF-8でのurlencodeが「%E3%81%82」であることから、おそらく「\u00e3\u0081\u0082」のように化けているものと思われる。
*.laファイル削除の関係で、文字コード変換系のライブラリが読めてないのかな?と思ってperlとperlのモジュールを全て再インストールしてみたけど変化無し。
もともと、非推奨のPostgreSQLを使っているので、サポート的な物は期待できないし、検索しても似たような例は見当たらない。
そこで、現象の切り分けと推測を始める。
まず、管理コンソールが普通に表示できて、過去に保存した記事が読めることから、DB→cgi→ブラウザでの表示は問題ないことがわかる。
そして、新しく入力した記事が文字化けすること、存在するはずのテンプレート「ヘッダー」が見つからないと言われることから、cgi→DBで文字化けが発生していると考えられる。
後は、ソースからDBとの入出力をしている箇所が特定できれば良いのだが、MovableTypeは自前のOR Mapperを使っているらしく、なかなか該当の箇所が探せない。
諦めかけて、MySQLに移行しようかと思ったりもしたけど、MySQLはあまり好きではない。さらに、SQLレベルでの移行ではなく管理コンソールを使ってのexport/importらしく、試しにexportしてみようとしたが、途中で接続が切れてしまった。
もう少し現象を理解しようと思って、自分でperlのプログラムを書いて検証したところ、DBIモジュールでDBと出し入れするときは、utf8::is_utf8()がtrueを返す文字列(つまり、utf8のperl内部表現の文字列)を使うことになっているが、生のutf-8の文字列を渡すと同じように文字化けすることがわかった。
この辺については、Perl: 文字コードとutf8フラグについて - @bayashi Wikiとか、404 Blog Not Found:perl - utf8::is_utf8("\x{ff}") == 0あたりが詳しい。
とにかく、文字化けしているデータをEncode::decode_utf8(xxx)すると文字化けが治ることがわかったので、後はソースから余計にEncode::encode_utf8(xxx) もしくはEncode::encode('utf8', xxx)している箇所を探せば良い。
のだが、私の力ではMovableTypeのソースが読みこなせなかったので、次はDBに入れるところ(SQLのパラメータをDBIに渡しているところ)が探せれば良いのだが、前述の通りOR Mapper(ObjectDriverと言う名前らしい)を使っているのと、DBIとかPgとか同じ名前のクラスが複数パッケージに存在していて、効きそうな場所が見つけられない。
諦めかけたところで、lib/MT/Object.pm に辿り着く。こいつがOR MapperのObjectのスーパークラスのようで、__core_final_pre_save とか、 __core_final_pre_search とか言うトリガを登録しているところで、Encode::encode()している箇所が怪しそうだと当たりをつける。
そこで、encodeしているところをコメントアウトしてみたところ、無事に文字化けが発生しなくなった。
しかし、この対応が正しいとは思えないので、どなたか正しい原因と対策を教えてください〜。
諸君、私はprintfデバッグが好きだ。
でネタを書こうと思ったんけど、元ネタがとても長かったので、改変するのも面倒でやめた。

今どきのARMのマイコンの開発であれば、JTAGを使ってIDE上からデバッグができて、printfなど使わなくても変数の中身は見られるし、ブレークポイントははれるし、ステップ実行もできるのだろう。
しかし、私はJTAGを持っていない。fm3マイコンがもう一枚とか、NXPの安いボードを持っていれば、Open OCDを使ってデバッグができるのだろうが、私は持っていない。
そこで、printfデバッグの出番ですよ!となるのだが、printfの出力をどうやって受けるか?と言う問題がある。
雑誌の付録のfm3マイコンは、USBが2ポートと、多数のマルチファンクションシリアルがあるが、マルチファンクションシリアルはレベル変換をしてあげないと通常のPCのシリアルとは繋げないし、そもそも今どきのPCにはシリアルポートがないので、USB-シリアル変換ケーブルなんぞが必要になる。これも個人では持っていない。
よろしい、ならばUSBだ!(改変を諦めたとか言いながら引きずってる)
基板にあるミニUSBは、FLASH Programmerで書き込みをした後は電源供給にしか役に立っていない。
これを使わない手はないだろうと思って調べてみたところ、さすがUSB、通常のシリアルのように、RxDとTxDだけ押さえれば良いと言うような簡単なものではない。端子の抜き差しから、相手とのネゴシエーション、通信まで全部面倒見てやらないといけないらしい。
とりあえず、USBデバイスにはUSBメモリやHDDみたいなmass storageや、USBオーディオのようなクラスと呼ばれるものがあり、シリアル通信を行うものは CDC と言うらしい。
当然、そこら辺にミドルウェアが転がっているよね?と調べてみたが、open sourceの実装は見つけられず。
Keil MDKの場合は、Proを買うとUSB Deviceのミドルウェアが付いてくるが、試用版では当然使えない。
そして、IAR Embedded Workbenchには、Virtual COM Portと言うCDCのサンプル(相手からのデータをエコーバックするもの)が入っていることを発見。
このサンプルが前回作ったgccでビルドできれば、USB経由で夢のprintfデバッグができるようになるのだ。
試行錯誤ののち、なんとか動くようになったので、いつものようにgithubに上げてある。(fm3/sample3 at master · false-git/fm3>
今回のはまりポイントは、以下。
  • intrinsics.h
    IAR EW のヘッダファイルには、intrinsics.hと言うものがあるが、MDKにもgccにも該当するファイルはない。このため、空のファイルを作って、アドホックなdefineを入れてみた。
  • startup_ARMCM3.S
    gccに入っていた startup_ARMCM3.Sだと、isr_vectorが少なくて、今回使うようなUSB関連の割り込みベクタの設定がない。そこで、startup_mb9bf61x.s を参考に、不足している割り込みベクタを補完した。
  • Makefile
    今回ビルドしたコードには、for(int i = ...)みたいなコードがあり、gccのデフォルトだと怒られるので、--std=c99オプションを追加した。
  • arm_comm.h
    これは、IAR EWのプロジェクトに含まれるヘッダなのだが、CriticalSecCntrと言う変数の型が、このヘッダとmain.cで違うためエラーになっていたので型を揃えた。
    また、中にinlineなメソッドがあるのだが、そのままビルドすると何故かリンク時に Undefined Referenceになるので、staticをつけた。
    インラインアセンブラの記述に、asm()を使っていたので、gccで通るように__asm__()にした。(上述のintrinsics.hでdefine)
    ArmV7以前とV7の分岐があったので、V7用のコードがコンパイルされるように、__CORE__を7にdefineした(上述のintrinsics.h)
  • system_mb9bf61x.[ch]
    最初、sample2と同じくSysTickのサンプルから持ってきていたのだが、このコードだと SystemInit()の中でUSB/Etherのクロック設定が行われない。
    そこで、Virtual COM Portのサンプルから持ってきたら動いた。
    SysTickサンプルではなく、Spansionからダウンロードできるtemplateも見てみたが、バージョンは新しいのにUSBクロックの初期化コードや、UCCR等のレジスタのdefineもなかった。
書き出してみるとこんな感じだけど、USBクロックの初期化が足りないのはなかなか気が付かなくて、なんで動かないのか非常に悩んだ。
その過程で調べた、Virtual COM PortのSystemInit()でやっているUSBクロックの初期化について簡単に書いておこう。
基本は、ペリフェラルマニュアルの通信マクロ編である。
  1. UCCRレジスタに0を入れて、UCCRの読出しが0になるまで待つ
    UCCRレジスタに0を入れるということは、USB/Etherのクロック出力を停止していると思えば良い。
  2. UPCR1レジスタに0を入れる
    これは、USB-PLLの発振停止
  3. UPCR2〜UPCR7のレジスタを初期化
    細かく書かないけど、今回大事なのはUPCR6のUSBRに2を入れて、PLLCLKの3分周をUSBのクロックとして使用すると言うこと。
  4. UPCR1レジスタに1を入れ、読出しが1になるまで待つ。
    USP-PLLの発振開始。
  5. UCCRレジスタに0x3Dを入れる
    これも細かいことは割愛するけど、USBのクロックとしてCLKPLLを使うと言う設定。
  6. USBコントローラをonにする前に、5cycleクロック供給
  7. USBEN0/1レジスタに1を入れる
    USBコントローラを有効にする。
PLLCLKは何かって言うと、CLKMO(外部から供給されている4MHzのクロック)にPLLN(36) を掛けて PLLK(1) で割ったもの = 144MHz。これを、上記設定で3分周するのでUSBで使用する48MHzのクロックが得られるらしい。
書いてて自分で何を言ってるのかさっぱりわからないけど。
引き続き、gccでSysTickのサンプルがビルドできるようにする。
必要なのは、CMSIS関連のヘッダファイルと、デバイス用のヘッダファイルになる。
上記リンクを見ると、CMSISの仕様とテンプレートは無償でダウンロードできるとある。
しかし、ダウンロードしようとすると、ユーザ登録を求められる。メールアドレスと個人情報を登録すると、しばらくするとアクティベーションのメールが届くので、URLにアクセスすると登録が完了する。
ダウンロードしたのは CMSIS-SP-00300-r3p1-00rel0.zip と言うファイル。
展開すると、ドキュメントと、共通のヘッダ、ライブラリ、デバイス用のテンプレートファイルがある。
残念ながら、ここにはfm3マイコン用の定義は含まれていないようだ。(※ spansionからダウンロードできる)
しょうがないので、SysTickのサンプルや、MDKの中から必要なファイルをかき集めて、なんとかビルドできるようになった。
fm3/sample2 at master · false-git/fm3
かき集めたファイルは、ライセンスがいまいちわからなかったり、CMSISのEULAを読むのが面倒だったので、上記リポジトリには含めていない。READMEにどこから入手するかを書いたので、必要であれば持ってきて欲しい。
RTXカーネルもBSDライセンスだと書いてあるのでダウンロードしてみたが、試してみるのはまた今度にしよう。
さて、KEIL MDKでビルドできるようにはなったけど、試用版だと作成できるプログラムに32kBの制限がある。また、scatterファイルも使えないみたいな記述もある。なにより、ダウンロードするのに登録が必要なのが嫌だ(したけど)。
他の開発環境としては、IAR Embedded Workbench と言うのもあるが、こちらも登録が必要&機能制限版だ。
他にないかと思って調べていた所、マイコン風雲録: arm-none-eabi-gcc / 2012年メモと言うページを発見。GCC ARM Embedded in Launchpadと言うものがあるようだ。
これは、本家ARMの人が開発に携わっていて、登録不要でダウンロードできる。さらに、WindowsのみでなくLinux用やMac用も存在する。
早速、上記ページからMac用の gcc-arm-none-eabi-4_8-2014q1-20140314-mac.tar.bz2 をダウンロードし、$HOMEに展開、$HOME/gcc-arm-none-eabi-4_8-2014q1/bin に PATH を通す。
前回MDKで利用したSysTickタイマを使ったLED点滅プログラムを試そうと思ったが、includeしているmcu.hと、それがincludeしている各種ヘッダがないため、そのままだとビルドできない。
そこで、まずは予習。fm3のデータシートと、ペリフェラルマニュアル、前回のサンプルプログラムと、それがincludeしているヘッダファイルを読む。

メモリマップ

メモリマップは、データシートに載っている。
知っておかないといけないことは、以下くらいか。
  • flash ROM は、1Mbyteで、0x0000_0000〜0x000f_ffff
  • SRAMは64kbyteの領域が2つあり、0x1fff_0000〜0x0x1fff_ffffと0x2000_0000〜0x2000_ffff
  • ペリフェラルは0x4000_0000〜0x43ff_ffffに割り当てられている

GPIO

GPIOを使うために押さえないといけない情報は、Interfaceのページからダウンロードできる「拡張コネクタピン配置図」と、チップのペリフェラルマニュアルにある。
ペリフェラルマニュアルのレジスタの説明を見ると、IO関連のレジスタとしてPFR, PCR, DDR, PDIR, PDOR, PZRがあることがわかる。(他に、E***もあるが、当面無視)
PFR
ポートをGPIOで使用する(0)か、周辺機器として使用する(1)か
PCR
内蔵プルアップ抵抗を接続する(1)か、切断する(0)か
DDR
入力端子で使用する(0)か、出力端子で使用する(1)か
PDIR
現在のレベル状態を読出し
PDOR
出力レベル設定。1: high, 0: low
PZR
オープンドレイン(1)
雑誌の付属基板の場合、IOポートのPF3(ポートは、16進二桁で表す。PF3は0xF3のポートと言う意味)に負論理で繋がっているらしい。
ここで、負論理とかオープンドレインとか知らない用語が出てくる。
オープンドレインについて調べたところ、RA4の罠がわかりやすかった。このページの最後の図を見ると、意味が理解できると思う。
とにかく、基板上のLEDは、「ポートF3をGPIOで使う設定にし、オープンドレインにし、入出力を出力にし」た上で、出力をlowにすれば点灯し、highにすれば消灯するのだ。

ここまでの前提知識を入れた上でSysTickタイマのサンプルプログラムを見ると、FM3_GPIO->*F_f.P3 にアクセスして上記の内容を実現していることがわかる。
FM3_GPIOの正体は、mb9b610t.h で宣言されている構造体のポインタであり、0x40033000を指している。
この構造体は、レジスタ毎に PFR*_fやPZR*_f のような構造体を持っており、その中に P0〜PFのようなメンバ(ビットフィールド)を持っている。*の部分と、P?の部分でポートを特定するのだ。
さらにこのヘッダを読み込むと、bFM3_GPIO_PFR0_P0 のような define があることに気づく。
コメントには、「Peripheral Bit Band Alias declaration」とある。
上記構造体がビットフィールドでメンバを持っているため、ビット毎にunsigned intでアクセスできるようにしたアドレスエイリアスがあるようだ。
ここまでわかれば、アプリケーションは書けそうだ。後はコンパイル&リンクの方法だ。
まず読むのは、gccのreadme.txt
ここを読むと、アーキテクチャ毎のコマンドラインオプション、libcであるnewlibとnewlib-nano、gcc-arm-none-eabi-*/share/gcc-arm-none-eabi/samplesにサンプルがあることがわかる。
早速サンプルディレクトリを見ると、startupコード、リンカスクリプト、Makefile等のサンプルを見ることができる。
サンプルプログラムのコード自身は、無限ループだったり、printfだったりしてあまり参考にならない。

まずはstartupコード。gcc-arm-none-eabi-4_8-2014q1/share/gcc-arm-none-eabi/samples/startup/startup_ARMCM3.Sを使う。
試しに、MDK用のstartupコード startup_mb9bf61x.s と比較すると、アセンブラの文法が違う!
最初は、MDKのサンプルのstartupコードをそのまま使おうと思ったのだが、アセンブラが文句を言うので諦めた。
startupコードを眺めると、stackセクション、heapセクションに続き、isr_vectorの定義が続く。MDKのと比べると、stack size は0x200と0xc00でgccの方が大きく、heap size は両方共0、isr_vectorはgccの方はSysTick_Handlerで終わっているが、MDKの方はその後にいろいろある。
isr_vectorと言うのは、大雑把に言うとアドレス0x0から配置されるアドレステーブルで、割り込みがあったときにそこに書いてあるアドレスの割り込みハンドラを実行するためのもの。
続いて、Reset_Handler。MDKのものは、SystemInitを呼んで、__mainを呼ぶと言うものだが、gccのものは初期値付データのROMからRAMへのコピーと、BSSの0クリアがあったあとSystemInitの呼出、_startの呼び出しとなる。
__mainも、_startも、ユーザが書くコードではなく、libcに含まれるCのスタートアップルーチンと思われる。
その後は、isr_vectorに並べた割り込みハンドラとして、何もしないDefault_Handlerがweakで定義される。
知識がないので推測だが、ユーザがXXX_Handlerを書いてリンクするとそちらが採用され、書かないとデフォルトハンドラがリンクされるのだと思う。

続いて、リンカスクリプト。gcc-arm-none-eabi-4_8-2014q1/share/gcc-arm-none-eabi/samples/ldscripts/gcc.ld を採用する。
中を見ると、MEMORYと言うセクションにFLASH, RAMと言う定義があり、開始アドレスとサイズが書いてあるので、データシートから読み取った値に変更する。(rename and modify for target · cd4fcca · false-git/fm3)
後は、サンプルのMakefileを参考にMakefileを書く。(fm3/sample1/Makefile at master · false-git/fm3)
そうそう、gccでビルドしてできるのはaxfファイルなので、USB DIRECT Programmerで焼けるように hex 形式に変換してあげないといけない。
調べてみたところ、objcopyを使うと変換できるらしいので、Makefileに書いておいた。
一応 Makefile の解説をしておく。
  • NAME はアプリケーションの名前。この名前の.cがあることを想定していて、この名前の.axf, .hexができる
  • ARCH_FLAGS は readmeに書いてあったアーキテクチャ毎のオプション
  • STARTUP は、startupコードの.o
  • CFLAGS/CXXFLAGS/ASFLAGSは説明は不要か
  • USE_NANO は、newlib-nanoを使うときに定義する。使わない場合は空にする。ちなみに、nanoだとバイナリが2kくらい。nanoじゃないと10kくらいになる
  • USE_SEMIHOSTとUSE_NOHOSTはsemihostかそうじゃないかでどちらを使うか決める。JTAGを持っていないので、NOHOSTの方を使っている(参考: ARM Information Center)
  • GCは良くわからない。サンプルからそのまま
  • MAPはmapファイルの出力を指示する
  • LDSCRIPTSは、リンカスクリプトの指定
  • LFLAGSはリンク時のオプション
と、言うわけでビルドできるようになった一式は、githubに上げてある。(fm3/sample1 at master · false-git/fm3)
あ、sample1.cの説明をしていなかった。
これは単に、基板上のLEDを点灯させるだけのプログラムである。
MDKのサンプルだと、SysTick_Config()とか呼んで、SysTick_Handlerで点滅させていたのだけれど、gccでこの辺が使えるかわからなかったので、点灯させるだけで無限ループに入るようにしてある。
SystemInit()は、startupコードを__NO_SYSTEM_INITを定義せずにビルドすると呼ばれるので、空の関数を入れてある。
次回は、MDKのサンプルが動くように、CMSISをgccで動かす話をしようと思う。
Interfaceと言う雑誌の2012年6月号に、Cortex-M3が乗ったfm3マイコン基板と言う付録がついていたので、購入したまま寝かせていた。
最近無電圧の接点出力が欲しくて、簡単な電子工作をしたくていろいろ試していた。接点の先に何が繋がるかわからないので、CPUのGPIOの出力に直接繋ぐわけにはいかず、リレーと、リレードライブ回路をCPUに繋ぐ必要があることがわかった。
まずは Raspberry pi を購入してちょっと遊んでみたが、RaspbianはLinuxなので、終了処理をちゃんとやってあげないとファイルシステムが壊れるのではないかとの不安があった。
そこで、fm3基板があったことを思い出し、若松通商で「FM3 マイコン基板 部品キット」を購入。
たくさん部品が付いてきたが、全部ハンダ付けするのは骨が折れると思い、最低限必要な部品をセレクトした。
  • JP1〜JP3(ピンヘッダ)
  • リセットスイッチ
  • CN4(7PIN×2列ピンヘッダ)
  • 32.768kHz水晶振動子
  • リセットIC
  • CN5(10PIN×2列ピンBOX型ヘッダ
  • 2.2μHインダクタ
  • USBホストコネクタ標準A
を選択。CN1〜CN4の中で、CN4のみを選択したのは、CN4にはVCC/GNDとGPIOの入出力が揃っているため、使い勝手が良いと判断したため。
まずは、リセットスイッチと2PINコネクタ付ケーブルをハンダ付け。黒いビニールチューブが付いてきていたので、半分に切ってケーブルに通した状態でハンダ付けした。
続いて、JP1〜JP3のピンヘッダをハンダ付けするために、3PIN×2列のピンヘッダを折って3つに分ける必要がある。
雑な性格なので、ニッパーでピンヘッダを折ろうとしたところ、一つ目は飛んでいって行方不明になり、2つ目は壊してしまい、一つしか残らなかった。
JP1とJP2の分は最低限必要なので、使わないことにした44ピンのピンヘッダを折って使うことに。
同じ失敗をしないように、カッターで切れ込みを入れて、ラジオペンチで挟んで折ってみた。
次に、部品を基板に嵌めてみて、「背の低いものから」ハンダ付け開始。
しかし、この基板はハードウェア初心者向けでは絶対ない。
32.768kHzのクリスタルなんて、ピンの幅が2mmくらいしかない。
泣きながらハンダ付けしつつ、JTAG(CN5)と電源系(インダクタのハンダ付けと、パターンカットとハンダ盛り)を残してギブアップ。
とりあえずJP1とJP2がついていればLEDをつけるくらいはできるはずなので、USBケーブルを探してきてMacに繋いでみる。
うんともすんとも言いません。
基板をよく見てみると、リセットICの足のハンダが、隣のC22と短絡しているように見えたので、修正したりしてみる。
が、やはりうんともすんとも・・・。
いろいろやる前に、最初にUSBケーブルを繋ぐくらいはやっておくべきだった・・・。
その日はそのまま諦めて、後日別のPCに別のケーブルで繋いでみたところ、USB機器として認識。冷やしたのが良かった?
さて、これでハードの準備ができたので、次は載せるアプリが必要。
デフォルトの開発環境は、KEILのMDK(μVision)で、基板のflashにプログラムを焼くのは富士通提供のFLASH USB DIRECT。
しかし、雑誌が出てからの2年の間に、μVisionは4から5にバージョンが上がり、fm3は富士通からSpansionに売却されてしまっていた。
富士通のfm3のページにはSpansionに売却された旨の記載があり、Spansionへのリンクがあったので、Spansionからデータシートやペリフェラルマニュアル等をダウンロードし、FLASH USB DIRECTをダウンロード。
ダウンロードには個人情報の提供が必要だ。
μVisionの方も、KEILに個人情報を提供すると、期間制限版か容量制限版の試用版がダウンロードできる。
雑誌のサンプルプログラム(SysTickタイマ割り込みLED点灯制御サンプル・プログラム)は、μVision5でもそのままビルドできるので、ビルドするとhexファイルが出来上がる。
基板のJP1にショートピンを刺した状態でUSBでPCと繋ぐと、USB機器として認識されるので、USB DIRECT Programmerのインストールディレクトリのdriverの下にあるデバイスドライバをインストールする。
デバドラのインストールに成功すると、COMポートが増えるので、USB DIRECT Programmerでポート番号を指定する。
Target MCUでMB9BF618S/Tを選択し、先ほどできあがったhexファイルを指定して、Full Operationボタンを押す。
実機をリセットしてOKを押せ、と言われるので、JP2に繋いだリセットスイッチを押す。
少し待ってからOKを押すと、flashの書き込みが行われる。
JP1のショートピンを外し、再度リセットすると、無事に基板上にあるLEDが点滅した。
ここまで来るのにすごく時間がかかっていて、ハマりポイントを列挙しておく。
  • JP1がショートしている状態でないと、USBケーブルを繋いでもUSB機器として認識されない。(JP1がショートしていなくても、USBデバイスとして動作するようなアプリが書かれていれば別だが)
  • Mac上のVMware Fusion 上のWindowsにつなごうとしてもうまくいかない。Fusion 4系でも6系でも駄目。デバイスとして認識して、デバイスドライバのインストールまでいけるが、その先が駄目だった。
長くなったので、続きは別のエントリで。
2014年12月
  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      
[New] [Admin]

最近のコメント

FreeBSDで日本語マニュアル by false: コメントありがとうご
FreeBSDで日本語マニュアル by satoumc: いろいろ検討した上で
841SHとAperture by false: 試してみたところ、デ
841SHとAperture by false: なんと、今度親の携帯
841SHとAperture by 匿名: 841SHで撮るとき

Photos

  • zabbix_3.png
  • zabbix_2.png
  • zabbix_1.png
  • Lhaplus-1.png
  • mt-error.jpg
  • lisp-type.png
  • graph_47_5.png
  • items.jpg
  • feeds.jpg
  • false.jpg

アーカイブ

コンタクト

広告

Powered by Movable Type 5.2.10