続きを書きました。
投稿とページの使い分けがイマイチ良く分かりません。
読み辛かったらゴメンナサイ。
まだマイコンに低消費電力が今ほどうるさく求められていなかった1990年代初頭(今から30年くらい前!)に、この分野にいち早く目を付けた先進的な製品がTexas Instruments(以下「TI」)のMSP430です。
今では、MSP432というARM(Cortex-M4)コアにMSP430のペリフェラル(周辺機器)をそのまま搭載した後継機種が出ております。
MSP432の方が性能(クロック当たりの演算スコア)が高いのは当然ですが、それほど高い処理能力は必要とせず、コスト重視、且つとにかく低い消費電力が求められるシーンでは、MSP430もまだまだ現役です。
当初はROMやRAMも小さい容量の型番しかありませんでしたが、時代とともに進化し、今では十分にRTOSの搭載も検討できる容量ラインナップも増えてきました。
そこで、このMSP430に「μITRON4.0」準拠のRTOS(リアルタイムOS)であるTOPPERS/ASPを移植してみました。
かなりメジャーなマイコンなので、公式でリリースされていないのは不思議ですけどね。
MSP430は16ビットのマイコンで、独自コアのRISCです。
GCC系のコンパイラが提供されており、TIの開発環境やサンプルプログラムも充実しています。
MSP430最大の売りである低消費電力を保持しつつ、TOPPERS/ASPを実装することが今回のキモになります。
さて、上手く実装できるでしょうか?
TIは、自社のマイコンを搭載した評価ボードのラインナップが豊富です。
今回は、MSP430の「MSP430F5529」を搭載した「MSP-EXP430F5529LP」という評価ボードを使います。
こちらで買うと、2,500円くらいですね。
他の型番への移植も可能ですが、TOPPERS/ASPを搭載して動作させるならROM:128KB/RAM:8KB以上の容量を持つ型番を選びましょう。
また「MSP-EXP430F5529LP」を使用する場合、デバッガーは必要ありません。
この評価ボードには既にデバッガーも実装されています。
「MSP-EXP430F5529LP」を使用しない場合は「MSP-FET」というMSP430に対応したTIのデバッガを使用する必要があります。
こちらで買うと、22,000円くらいですね。
高すぎてやってられません。
ですので、それを搭載している「MSP-EXP430F5529LP」が如何にお買い得かが分かりますね。
このブログでは「MSP-EXP430F5529LP」を使用した場合の例を説明していきたいと思います。
ソースコードの入手は、こちらからどうぞ。
なるべく定期的にメンテナンスするようにしていますので、動きがおかしいな?という場合は最新版に更新をお願いします。
それでもダメな場合はコメントください。
では、次回からは、開発環境の構築やビルド方法を見ていきましょう!
前回からの続きです。
このテーマを最初からご覧になる場合はこちらからどうぞ。
結論から言いましょう。
なまら面倒くさいです!
デバッガの「Atmel-ICE」と「Arduino Mega 2560」の間で、こんな感じの配線をしなければなりません。
「Atmel-ICE」には2種類のケーブルが同梱されているはずです。
そのうちの6ピンのものは、Arduinoの「ICSP」というピンにそのまま挿すだけです。
出っ張り部分をCPU側にして、こんな感じ。
問題はもう一方のケーブル、10ピンがバラバラに出てるやつです。
それをこのように配線しなければならないのが大変なんです。
ピン配は「Arduino --- 10ピンケーブル・ピン番」で以下の通り。
RESET --- 8ピン
5V --- 4ピン
GND --- 2ピン
A4 --- 1ピン
A5 --- 5ピン
A6 --- 3ピン
A7 --- 9ピン
以上、計7ピン。
面倒だけど仕方ない、繋ぐか~…と思った矢先に更なる試練が!
どっちもメスじゃん!?
こういうケースで私がよくやる手は以下の通りです。
まず、工具箱の底の方に転がっている、こんな感じのピンヘッダ。
この金属のピンの部分をラジオペンチで樹脂から引き抜きます。
そして、引き抜いたピンを以下のようにピンソケットに挿しておきます。
これで擬似的にオスーメスの状況を作れますが、嵌合は緩く接触不良の懸念がありますので、あまりオススメしません。
これをやる場合は、配線したらマスキングテープで留めておきましょう。
「Arduino Mega 2560」に搭載されているAVRマイコン。
このシリーズには、ヒューズ設定というものがあります。
例えば、クロックは何処から取るのか?そのクロックの分周比はどのくらいか?ウォッチドッグを使うかどうか?…などといった、CPUの基本的な動作を設定するレジスタのようなものです。
その中の設定の一つに「JTAGを使うかどうか?」というものがあります。
今回、デバッガとして「Atmel-ICE」を使うことを前提に記事を書いていますが、この「Atmel-ICE」にはターゲットに対して2つの接続モードがあります。
1つ目は、ヒューズの設定やプログラムの書き込みなど、比較的シンプルな操作を行うための「ISP」モード。
2つ目は、「ISP」モードの機能に加え、ブレークポイントを仕掛けてプログラムをデバッグするなどの高度な操作を行うための「JTAG」モード。
配線の時に、2つケーブルを接続したでしょう?
6ピンの方は「ISP」モード用、バラバラ10ピンの方は「JTAG」モード用の配線なのです。
問題なのは「Arduino Mega 2560」(というかAVRマイコン全般)はデフォルトのヒューズ設定では「JTAG」モードを使用できないということです。
但し「ISP」モードは使えますし、これでヒューズの設定を変えることもできます。
ですので、これを使って「JTAG」モードを使えるようにヒューズ設定を変更しましょう。
「Atmel-ICE」高いんだから、最大限に役に立ってもらわなければ!
早速、「ISP」モードでパソコンと「Atmel-ICE」をUSBで繋ぎましょう。
「Atmel-ICE」に接続するケーブルは、6ピンの方です。
バラバラ10ピンの方は、とりあえず放置。
同時に「Arduino Mega 2560」もUSBでパソコンに繋ぎます。
(「Atmel-ICE」側は「SAM」ではなくて「AVR」の方のコネクタに接続してください。)
次は、ソフトウェア側の操作です。
「Microchip Studio」でプロジェクトを作成した前回の状況から始めます。
以下の画面が表示されたら、上部にある「ATmega2569」というタブをクリックしてください。
すると、以下の表示に切り替わりますので、すかさず左のリストから「Tool」をクリックしてください。
以下のような画面に切り替わります。
「Selected debugger/programmer」のコンボボックスに接続中の「Atmel-ICE」がID番号付きで表示されていますか?
(「J41800113804」というIDは私のですね。)
表示されていない場合は、コンボボックスをクリックして、あなたの「Atmel-ICE」(「J41800113804」以外のもの)を選択してください。
加えて「Interface」は必ず「ISP」を選択してください。
この設定を保存しましょう。
画面上部の保存アイコンをクリックしてください。
(いいよね~フロッピーディスクのアイコン。)
次に、「Microchip Studio」のメニューから「Tools」->「Device Programming」をクリックします。
以下のような画面が表示されたら、「Tool 」は Atmel-ICE、「Device」はATmega2560、「Interface」はISP、それぞれの設定を確認の上「Apply」をクリックしてください。
以下のような画面が表示されたら、左側のリストから「Fuses」をクリックします。
以下のような画面が表示されれば、「ISP」モードにより正常にCPUからヒューズ設定を読み出せた証です。
これが現在のヒューズ設定です。
ここから、以下のようにヒューズ設定を変更します。
これらを変更すると、画面下部の「HIGH」の値が変わります。
この値は、各々のヒューズ設定をビット化し、それをHEXで表したものだからです。
・「HIGH.JTAGEN」のチェックを入れる
・「HIGH.EESAVE」のチェックを入れる
・「HIGH.BOOTRST」をチェックを外す
画面下部の「HIGH」の値が「0x91」になればOKです。
「Program」ボタンをクリックして、新しいヒューズ設定をCPUに書き込みましょう。
以下の警告が出ます。
「JTAGEN」のチェックを外すとJTAG使えなくなるぞ!…って、知ってるし、今回チェックしたし、デフォルトで使わせてくれないからこうやって余計な作業をしているわけだが…。
「Continue」をクリックです!
以下のように、画面最下部に「Verify registers ... OK」の表示が出れば、無事ヒューズ設定の更新は完了です。
「Close」ボタンをクリックして、画面を閉じましょう。
これで「Atmel-ICE」で「JTAG」モードを使える設定になっているはずです。
確かめてみましょう。
「JTAG」モードでパソコンと「Atmel-ICE」をUSBで繋ぎましょう。
「Atmel-ICE」に接続するケーブルは、バラバラ10ピンの方です。
「ISP」モード用の6ピンのケーブルと繋ぎ替えてください。
「Microchip Studio」の方は、以下の画面に戻りましょう。
この画面の「Interface」のコンボボックスには、今度は「JTAG」を選択します。
おっと、保存もお忘れなく!
「Microchip Studio」のメニューから「Tools」->「Device Programming」をクリックします。
今度は「JTAG」を選択して「Apply」!
以下のように「JTAG」モードでも先程設定した通りのヒューズ設定が表示されれば大成功!
これでデバッガが使えるようになりました!
さて、JTAGが使えるようになったので、早速サンプルプログラムを転送して実行してみましょう。
その前に「TeraTerm」のご用意を。
インストールしていない方は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「TeraTermの導入」の項目を参考にしてください。
もちろん、シリアル通信のターミナルであれば、他のものもお使いいただけます。
「Arduino Mega 2560」はパソコンにUSB接続すると、擬似的なシリアルポートとして認識されます。
今回のTOPPERS/ASPのサンプルプログラムは、シリアル通信のメッセージを出力しますので、認識されたシリアルポート番号でターミナルを立ち上げておきましょう。
設定は、こんな感じです。
ボーレートは「9600」です。
(私のパソコンは、Arduinoをポート10として認識していますね。)
さて、「Microchip Studio」に戻りましょう。
プログラムのビルドと実行を行います。
画面上部の「▶」ボタンをクリックします。
しばらくすると、立ち上げておいたターミナルに以下のような表示が出ていると思います。
TOPPERS/ASPカーネルとそのサンプルプログラムの転送と実行に成功です。
ブレークポイントを試してみましょう。
動作中のプログラムを停止します。
画面上部の「■」ボタンをクリックします。
ブレークポイントを仕掛けましょう。
画面右の「Solution Explorer」のソースコードリストの中から「sample1.c」をダブルクリックし、ソースコードを表示します。
このソースコードの丁度中盤くらい、メインタスクの始めに仕掛けましょうか。
ブレークポイントは、ソースコードビューの左端をクリックすると赤丸が表示され、セットされていることを表します。
仮に、これを再びクリックするとブレークポイントが解除され赤丸も消えます。
では、ブレークポイントを仕掛けた状態で、プログラムを再び実行してみます。
上手く引っかかってくれるでしょうか…。
以下のようにプログラムが停止すれば成功です!
ここからは、「F10」キーでステップオーバー、「F11」キーでステップインなど、おなじみの操作が使用できます。
因みに、ステップオーバーやステップインなどを行っている時に命令が飛んでしまったり前後したりする場合は、最適化のせいです。
デバッグ時は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「サンプルプログラムのデバッグ」の項目を参考に最適化を解除しましょう。
ここまでの作業、本当にお疲れさまでした。
さて、次回はサンプルプログラムの動きの説明や、今回のArduino MEGA2560用ASPカーネルのちょっと込み入った情報を書いていきます。
ある日の午後、Googleアカウントが無効となった旨を通知するメールが再設定用に登録しておいたアドレスに届きました。
スパム行為がGoogle先生のポリシーに反すると書いてありますが、全く身に覚えがないっ!…という訳ではありません。
今回の私のケースでは、十分に予想できたことなのです。
ですので、「まさか!?」というより「やはり!」というのが一番の印象でした。
とはいえ、実際にこのメールを受け取り、開いていたChromeブラウザの同期アイコンに「一時停止中」と出ているのを見て事の重大さに焦りました。
以下、私がこのペナルティーを受け取ってしまった原因と思われる行為と、アカウント復活までの過程を説明したいと思います。
同じような目に遭った方の参考になれば。
この日の午後まで、私は以下の状況に置かれていました。
状況が複雑なので箇条書きにします。
1.電子メールは個人用、会社用もまとめてGmailで管理していた。
2.バックアップのため、Gmailで受信したメールは全てYahooメールに転送する設定にしていた。(これがマズかった!)
3.今月から勤務先の会社の名称が変わったのでメールアドレスのドメイン名が変わった。
4.この時、会社の古いメールサーバには、添付ファイルの問題でサーバーから削除されていない多くのメールが残留していた。
5.会社のシステム部門は、これらをそのまま新しいメールサーバーにコピーしていた。
6.Gmailで会社の新メールアドレスを追加し、旧メールアドレスを削除した。
ここからがペナルティーの原因となる行為です。
箇条書きにします。
1.Gmailは会社の新しいメールサーバーから受信データの取り込みを始めた。
2.当然、添付ファイルの問題でサーバーから削除されていないメールも取り込み始めた。
3.Gmailはこのようなファイルを検出するとアラートメールをユーザーに通知する。
4.問題となるファイルが多かったため、大量のアラートメールが通知され、それらはYahooメールにも転送された。
5.Yahooメールは同じ内容のアラートメールを短時間に大量に転送されたたため、以降のメール転送に対しエラーを提示した。
6.Gmailは転送先のYahooメールから、やはり短時間に大量のエラーを受け取った。
結果、Googleは私のアカウントがスパム行為を行っていると認識し、アカウントの無効化に至ったと考えています。
もし、私がGoogleの中の人であっても、このようなエラーログを見ればスパム行為と断定するでしょう。
たとえ、この判断をAIが行っていたとしても同様です。
問題のメールを放置しておいた私が悪いのです。
このときの状況は、Gmailの画面上で確認できていたため、少しでも早くYahooメールへの転送を解除すればよかったのかもしれません。
そして、まさにこのときに、ひょっとしたらGoogleから警告を食らうかも?と思っていましたが、傍観してしまいました。
全く言い訳のしようもございません!
かくして、私のネット人生は大いなるGoogleの加護という「エデンの園」から放り出されてしまいました。
十数年に渡る公私を問わないメールのデータも、Googleドライブに保存しておいた書類も、ようやく始めたこのブログのデータも…。
全てアクセスできなくなりました。
世界は急激に色を失いました…が、このときの私の顔だけは、映画「アバター」のナヴィ族よろしく青ざめていたはずです。
…とにかく、状況確認!
早速、ネットで同じような状況に置かれた人がいないかどうか、また、そこからのアカウント復活の方法を探し始めました。
ここでもやはり「Google」検索を使って…。
検索結果は絶望的でした。
結局、アカウント無効から削除に至った例が圧倒的に多く、アカウント復活の例は極めて少なかったのです。
これはもう仕方がない。
新しいアカウントを作成してネット人生再出発だ…と決心するものの、できることはやっておこうと思いました。
先程の通知メール、よくみると「審議をリクエスト」というボタンがありますね。
これに一縷の望みを賭けるしかない!
これをクリックすると、いくつかの質問に答えるためのページに誘導されます。
いわば、法廷ですね。
(動転していてスクリーンショットは撮っていません。)
重要なのは、事ここに至った過程(思い至る節)を説明するためのフォームです。
ここに、上記の行為を簡潔に書き込み、そして「土下座」という行為をそのまま文章化したようなお詫びの言葉を添えました。
(今回の状況を私の英語力で説明するのは難しいので、日本語で書きました。)
それを送信すると、程なくして以下のメールが届きました。
とりあえず、2営業日待ってみましょうか。
長い2日になりそうです。
死刑判決を待つ囚人の気分です。
Google先生の最後の慈悲、無効となっているアカウントのデータをダウンロードできるとのこと。
ダウンロードの準備ができるまでしばらく時間がかかるようで(私の場合は6時間ほど)、準備が完了すると以下の通知が届きます。
有無も言わさず、ダウンロードです。
2営業日待とう!と決意したものの、Googleアカウントのないネット生活は不便の連続です。
アカウント無効の翌日、このままアカウントが削除された場合のときに備えて、新しいGoogleアカウントを作成しました。
そこにダウンロードした旧アカウントのデータをコピーして復旧を試みたのですが…。
まず、メールに関しては「mbox」形式(20GB!)でダウンロードできたため、これは完璧に復旧可能。
問題は、Blogger(このブログ)のコンテンツとGoogleドライブです。
これらに関しては、ダウンロードしたデータの中には含まれていませんでした!
ブログは、まだ始めて二ヶ月弱だし一から復旧するのも大した苦労ではありませんが、問題はGoogleドライブ。
ここにしか置いてないデータも少なくはなかったのです。
この例から分かることは、GoogleはGmailのデータに関しては相当に厚い配慮をしてくれるが、それ以外のデータに関してはそうではないということです。
日頃のクラウドデータに対するバックアップの重要性を痛感した瞬間です。
そして、その日の深夜、判決は予想よりも早く下されました。
…マジ!?
やったぜ!「勝訴ォー!」(って、テメエが悪いんだろがっ!)
ここから世界は急激に色を取り戻しました。
早速、アカウントにアクセスして復旧を確認。
Gmail、OK!
Googleドライブ、OK!
フォトもOK!
しかし、ブログは…ダメでした。
アクセスすると「このブログは削除されました」という表示が出ます。
これは、作り直すしかないか…それでも他のサービスが復旧できたので大満足です。
アカウント無効から再審議のリクエスト、それからの復活まで、32時間。
Google先生の迅速な対応に感謝。
何よりもアカウントの復活を許可してくれて大感謝です。
アカウントを再開すると、以下のようなメールが届きます。
いやぁ、「ありがとう」はこっちのセリフだし…。
「アンケートに回答」というボタンをクリックすると「審議をリクエスト」の時と同じように入力フォームのあるページに誘導されます。
ここに「サポートチームにコメント」というフォームがありましたので、私は「祈り」という行為をそのまま文章化したような賛美の言葉を添えるのでした。
さて、アカウントを再開しても取り戻せなかったもの、それはブログのコンテンツです。
二ヶ月弱とはいえ、書き込んだコンテンツのバックアップもない状態でしたので、それを復旧させるのは一苦労です。
アカウント再開から8時間後、ネット上にキャッシュでも落ちていないかなぁ~?とGoogleで検索したところ、自分のブログが表示されました。
しめた!キャッシュが残っていた!と思ってアクセスすると、何かおかしい。
これキャッシュじゃないぞ、生きてるページだぞ!と気づくのに時間はかかりませんでした。
すぐさまBloggerの管理画面にアクセス…
完全に復旧している~!!
というわけで、今回のようにアカウントを無効にされて、その後に再開できたとしても全てのサービスが復旧するのには時間がかかるようです。
特にBloggerの場合は再開から8時間後。
実はこの時、アカウント無効を知った翌日に作った新しいGoogleアカウントで、このブログの復旧作業を始めていました。
無駄な作業になってしまいましたが…
終わり良ければ全て良し!
杞憂に終わって何よりでした。
以上が今回の顛末でした。
私の不注意が原因で、アカウント無効に至り、それを寛大なるGoogle先生が再開を許可してくれたわけですが、これを繰り返さないように肝に命じなければなりません。
Googleには莫大な数のユーザーがおり、今回のような問題に対し、その一つ一つを有人で対処できるはずもありませんから、電話など人と直接的に対応することはありません。
それでも伝わってきたのは、先ずは「ユーザーの保護」という観点を第一に考えているということです。
ユーザーのアカウントが何やら悪い勢力に利用されているのではないか?
ならば、ユーザーの被害を最小限に食い止めよう!
今回の私の件に関しても、そういった意図でのアカウントの無効化だったはずです。
故に、ユーザーの無実が証明されれば、アカウントの再開を許可してくれる場合もあるということです。
今回は完全に私の不注意でしたが、それでも!
だから、同じような目に遭った方は、どうか冷静に対処して欲しいと思います。
希望はあります!
一方で、私達の生活がこれほどまでにGoogleに依存していたのか!?ということを改めて認識させられました。
Googleが経営破綻などにより全てのサービスを完全に停止するようなことは考えられませんが、狂った独裁者が核のボタンを握っているこのご時世、何が起こるかは分かりません。
(まあ、そうなったらネットも何もあったもんじゃありませんが。)
日頃から重要なデータのバックアップは万全に!
特に、BloggerのデータとGoogleドライブは…ね。
前回からの続きです。
このテーマを最初からご覧になる場合はこちらからどうぞ。
前回までの作業で、開発環境をインストールし、Arduino Mega2560版TOPPERS/ASPのソースコードをダウンロードし、それをコマンドラインでビルドするまでを行いました。
このままずっとコマンドラインで作業するのもシンドいので、Eclipse上でビルドが行えるようにプロジェクトを作成しましょう。
このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「プロジェクトの作成」および「プロジェクトのクリーンとビルド」の項目を参考にプロジェクトを作成してください。
「デバッガの登録」の項目は読み飛ばしてください。
今回はデバッグ作業をこのEclipse上で行わず、次にプロジェクトを作成する「Microchip Studio」上で行う方針なので、この作業は必要ありません。
Eclipseの画面右側に以下のようなアイコンが表示されて、これらをダブルクリックすることによりビルドができるまでを確認してください。
これでEclipse上でのプロジェクトの作成は完了です。
Eclipseを閉じる前に、次の作業のために「realclean」を実行しておいてください。
さて、もう一方のIDEである「Microchip Studio」用のプロジェクトも作りましょう。
とはいえ、既にこのプロジェクトはソースコードの「OBJ」ディレクトリ内に用意してあります。
(いやいや、ちゃんと自分で一から作りたい!という方は下記<補足>を参照のこと。)
「asp.atsln」というファイルがそれです。
これをダブルクリックすると「Microchip Studio」が起動します。
(初回は信じられないくらい起動が遅いです。
これだから極力使いたくないんですよね…。)
起動の途中に以下のようなダイアログが表示されるかもしれません。
開こうとしている「Microchip Studio」のバージョンが、このプロジェクトファイルが作られた時と違うじゃないか!って怒って(?)ます。
問題ないので「Yes」をクリックします。
さらにしばらく待つと、ようやく以下のようにIDEが起動します。
画面右上の「VA Outline」というウィンドウの下の「Solution Explorer」タブをクリックしてください。
「Solution Explorer」タブにTOPPERS/ASPのソースコードが表示されているのを確認してください。
さて、この「Microchip Studio」でもTOPPERS/ASPをビルドしてみましょう。
画面上部の「Build」メニューから「Build Solution」の項目をクリックします。
ビルドが開始され、今までコマンドラインやEclipdeで見たようなビルドメッセージが画面下部に表示されれば、「Microchip Studio」上でのプロジェクトの作成は完了です。
<補足>
TOPPERS/ASPは独自のMakefileを使用してビルドします。
「Microchip Studio」で普通にプロジェクトを作成した際に自動的に生成されるMakefileではビルドができません。
したがって、TOPPERS/ASP用のプロジェクトを「Microchip Studio」で作成する場合は、TOPPERS/ASP用の既存のMakefileを指定してプロジェクトを作成する必要があります。
「Microchip Studio」でこれを行う場合は、プラグインをインストールする必要があります。
画面上部の「Tools」メニューから「Extentions and Updates...」の項目をクリックします。
以下のようなウィンドウが表示されたら、左のリストから「Online」をクリックします。
以下のようなウィンドウが表示されます。
多くのプラグインがあります。
既存のMakefileからプロジェクトを作成するためのプラグインは「Create Project from Makefile」という名前なので、このウィンドウの右上の検索ボックスに入力しましょう。
あった、これだ!
「Download」ボタンをクリックしてプラグインをインストールします。
お約束のライセンス画面。
「Install」をクリック。
インストールが完了したプラグインを使用するためには、「Microchip Studio」を再起動する必要があるみたいです。
「Restart Now」をクリックします。
再起動後に画面上部の「Tools」メニューを見てみると、「Create Project from Makefile」が追加されているのが確認できるはずです。
これを実行するとウィザード形式で既存のMakefileから「Microchip Studio」のプロジェクトが作成できます。
最初から入っている「OBJ」ディレクトリの中の「asp.atsln」も、こうやって作りました。
一からプロジェクトを作るときの参考にしてください。
次回は、いよいよビルドしたTOPPERS/ASPを実際のハードウェアに転送して実行・デバッグを行うまでを見ていきましょう。
名称:「MLAAライセンス」(MLAA) タイプ: ・コピーレフト…× ・ライセンス文の掲示…〇(ソースコード頒布のみ) ・コピーライト(著作権)…〇(ソースコード頒布のみ) ・その他…〇(バイナリ頒布のみ) 原文: Copyright: 2010 Jorge Jimenez ...