これだよ、これ。このクリア感。やっぱり人間は寝ないとダメだね。朝から電車内でプログラムチェックなんぞやったら、昨日さんざん調べて見つからなかったバグ発見。いったい昨日はなんだったんだ。。。
日経産業新聞にウチのサービスの記事が載った。今年の始めに作った機能がようやく日の目に。全てが正しく載っているわけではないけど、今回はかなり正しい記事。担当記者もそれなりに勉強したらしい(笑)
料理作るのは好きだし、まぁ、美味しいと言われることも多かった。ただ、「できる方ができる時にやる」って言ってたのに、僕ばっかり作ってた時期があって、なんか納得いかずにケンカしたこともあった。もちろん、その時期に彼女の方も「できる時」だったんだけどね。
最初は「当番制にしようか?」という話をしたら、前述の「できる方ができる時にやる」を提案してきたので、じゃあそうしようという話になった。僕が先に帰れるときはさっさと帰ってスーパー寄って、食事作って待ってるって感じだったんだけど、その逆はあまりにも少なかった。彼女の方が先に帰ってたのに夕飯の支度を何もせずに、自分のやりたいことをやっていた時にはさすがに頭にきたけど。「なんで作らないんだ?」って聞いたら、僕が作った方が美味しいから、みたいなことを言われたときには、「こりゃ付き合う相手を間違ったかな?」と思った。そういうもんじゃないだろ?って。
そんなこんなで別れたのだ。もちろん、これが全ての理由じゃないけど。。。なんでこんなん語ってるんだ?今日は(笑)
「まぁ」が多すぎ。ダメダメだ。
昨日のダルさは眠気のためなのかと思って、昨夜は23時前に就寝。朝までグッスリかと思ったら、深夜3時過ぎくらいに目が覚めた。しかも、妙に喉が乾いていたので、台所でお茶をグビッ。自分の部屋に戻ったけど、なんかもの足りない。シアター室の冷蔵庫に水を入れていたのを思い出してグビグビグビッ。ようやく満足して再び眠りに。
7時過ぎに目覚めたけど、ダルさは抜けきらず。湿気のせいか?
『日記(ウェブログ)とコミュニティを融合した新感覚サイト「きゅるる」、6月12日より正式サービス開始!』だそうだ。
【主な機能】 ・日記全文検索機能(フレーズでも検索可能です) ・コメント機能(日付ごとにコメントを追加できます) ・ユーザー日記ページのスキン(デザイン)変更機能 ・写真(画像)追加機能(画像はサーバー側で縮小、レタッチ不要でデジタルカ メラで撮った写真をそのままアップロード可能です) ・日記のつながり機能(同じ日の同じテーマ日記、キーワードつながり、逆リ ンクつながり) ・日記メルマガ配信機能(日記を追加すると自動的に購読者に日記をメール配 信することができます)
tDiary と関心空間の良いトコ取り+αって感じなのかな。
【追記】ネタ元は PressNetwork で流れたメール。
「シミュレーション」と「シュミレーション」、どっちが正しいんだっけ?と改めて考えると不安になったので、google で検索してみた。
「シミュレーション」ではズラズラ出てきたので、やっぱり「シミュ」で正しかった!と思いつつも、念のため「シュミレーション」でも検索してみたら、こっちもズラズラと。
「あはは、間違ってるヤツ、こんなにいるじゃん」と、いくつかのサイトを見に行って、Command + F でサイト内検索をしても、、、ない、ないんですよ「シュミレーション」が。どーなってんの?と思いつつ「シミュレーション」で検索すると、それはちゃんと見つかる。
これって google 側で「シミュレーション」のよくある間違いとして「シュミレーション」を認識・対応しているんだろうか? 他にもこんな言葉ないかなー?
代官山 花壇で、僕の誕生パーティを開いてくれた。メンツは同居組、チム、non-nonn、ワタ、ユリ(敬称略)。誕生月&倶楽部会員ならコース料理割引ってことで、こりゃイイ!と思ってたものの、その場で会員になることはできずに残念。
最後にケーキ(持ち込み)を用意してくれていた。プレートにチョコレートで何か描かれてると思ったら、、、
ダースベイダーのイラストが!(笑) ケーキ屋さんにお願いして描いてもらったとのこと。「ダースベイダー書いて貰えますか?」と聞いたら「イラストを用意してください」と言われて、わざわざ手配してくれたそうだ。
会計時に、(数千円のコース+飲み物)×8名なのに7万円台のレシートを持ってこられ「えぇぇ!?」と言って、再チェックさせたら今度は5万なんぼ。それでも、よく見たらコースが10名として計算されており、再再度のチェックでようやく正しそうな金額が出て支払うという、なんとも怪しげな結末に。この事件(?)が意味するところは、この先1年の僕は、訂正多しで前途多難ということになるのだろうか。
今年の誕生日プレゼントにこんなモノを貰ったよ!
ちゃんと頭から被れるんだよ!ゴム臭くて息苦しいけど(笑)
手も付いている。オレの手がデカ過ぎて、なかなか入らないんだけどさ(笑)
前から存在は知っていて、ちっこくて、かわいくて、キレイで、コレ欲しいなぁと思ってはいたものの、値段はソレナリなので躊躇していた。
ところが、ふと、アシストオンを見たら値下げされてたので即購入。S4のブルー。どうやって持ち歩こうかな。キーホルダーとして使ってる方法が紹介されてるけど、それ以外の方法はなんかないかな。
買ったは良いけど、なかなか観る時間が取れずにいたのだが、今日ようやく観ることができたインド版スター・ウォーズ。パクリではなくリスペクトらしいのだが、エピソード4〜6だけでなく、エピソード1からも影響を受けている。ただ、結構ゴッチャなんだよな。殺し屋(賞金稼ぎ?)がX-Wingもどきに乗っていたりするし、味方の兵隊がストームトルーパー風だったりするし。あえてごちゃ混ぜにしてるのか、本気で間違っているのかは良くわからんかった。
で、こういうモノは吹き替えだろう!と思って、オリジナル音声ではなく日本語吹き替え版で観たのだが、キャストが凄い。主人公のアーリャマーン(ルークに相当)には水島裕、アーリャマーンの師匠ホーシン(オビワンに相当?でも顔はルーカスっぽい)には石丸博也、悪玉のナーラック(ここはダースベイダー相当ではなく、皇帝相当でもない。見た目はマグマ大使風)には池田秀一という豪華な顔ぶれ。この辺はなかなか良い。
でも、この作品、パロディとして観る分には良いけど、本気で観ようと思うとツライよ。はっきり言ってつまらない。途中で何度寝たことか(笑)。しかも、これ、本作で終わりじゃないのだよ。エピソード1と付いているのは伊達じゃなかった。
本作の最後では、主人公がドクロ顔のデススターもどきに連行され、悪の親玉とライトセイバーもどきで戦うのだ。そして、いよいよ決着が!というところで、アーリャマーンがカーボン冷凍(なのか?)されてしまって、、、というところで終わり。。。思わず「えー」っと叫んでしまった。
エピソード2の予告もあって、この後は美女がカーボン冷凍を解きにやってくるようなんだけど、、、観ないだろうなぁ、きっと。
Mac OS X 10.4.9 (PowerPC) へインストールしてみた。既存の Safari 2 が上書きされるので注意!
パッと見、違いが分からん。あ、日本語リソースが無いようで、メニューが全て英語になっているから見た目は違うか。
気になっていた「\」問題は、「\」として入力可能になったようだ<ほれ
コンビニに「ペプシ アイスキューカンパー」があったので買って飲んでみたが、、、見事に美味しくない。
いつの間にやら www.wasf.net から wasforum.jp へドメイン変更をしていた WASForum こと Web Application Security Forum。毎年、この時期にカンファレンスを開いているのだが、今年はなかなかアナウンスされないなーと思ってたら、やっときたきた。
「WASForum Conference2008開催決定」というエントリによると、今年は初の2日間開催。1日目が管理者向け、2日目がエンジニア向けっぽいのだが、オレとしては両日参加してみたいところだ。
今朝見たときは、1日目と2日目で別料金がかかる&値段が違うような記述があったような気がするのだが、いま見ると載ってないな。調整中ってことかな。
ということで、募集開始の告知を待つことにする。たぶん、これまでの参加者にはメールで告知してくれるよね?
Redmine勉強会に ust 担当として参加した。
ウチの場合、影舞、Trac、Redmine が共存していて、一番使っているのが Trac という状況。Redmine はイイ!と思いつつ、他のシステムからの全面移行は行なっていない。まとめた方が管理は楽そうだとは思うものの、そこまで困っていないのと、過去の情報資産の「完全移行」は難しいんじゃないか?という考えから、そのまま共存している感じ。
ま、それはともかく。
いつも ust をやっている時には、配信状況のモニタを中心に行なってしまい、(申し訳ない事に)発表者のスライドや話にはあまり集中できていない。
ところが、今回の勉強会では、モニタリングそっちのけで、各発表に集中してしまうこともチラホラ。どうも、自分とは違う視点からの利用例などの発表があって、引き込まれてしまった。
2時間休憩ナシの密度の濃い勉強会だったけど、疲れた感じはせず、ひたすら面白かった。まだまだいろいろな視点からの使い方があると思うので、ぜひ次も開催できるといいな。
「トレジャーデータ 無印良品「MUJI passport」事例セミナーのご案内」というメールを貰って、最近 TD のクエリをガシガシ叩くことが増えてきたオレは興味津々だったのだが、会社に OK を貰って、業務の一環として参加してきた。
セミナーのWebページを見てもハッシュタグが書かれていなかったので、「あぁ、そういうセミナーなんだな」(?)と思ったりして、もしかして Twitter 実況したらダメなのかしら?とつぶやいてみたら、
— Kazuki Ohta (@kzk_mover) 2014, 6月 12
と、即座に OK を貰ったので、ひさびさに実況をしてきた。
実況とは言うものの、実は自分用のメモであって、これを使って、会社内で共有する参加レポートも作成するのであった。
ちなみに実況する際には、講演者の話を聞きながら、プレゼン資料に書かれた文章も参考にしながら、自分で理解した言葉に変換して書いているので、必ずしも講演者の言葉通りのものではない。文字起こしではないのだ。オレの解釈や間違っていたり、理解が違っていると、ちんぷんかんぷんな内容になっている恐れもある。
ただ、この方法は瞬間的な理解とアウトプットを集中して繰り返すため、セミナーなどの理解度が上がって、自分では気に入っている方法。
また、それがまとめられて、誰かの理解の助けになればそれも良いよね、と思って、ローカルなメモではなく、あえて Twitter に書いている。
ということで、まとめて貰った!!
肝心のセミナーの中身だけど、いま自分が叩いているようなクエリに関連することだけではなく、もっと別の視点からみた活用法のヒントを得られたので、オレ的には非常に参考になった良いセミナーだった。
少し前から、インフラの構築もできるし、アプリも書けるようなエンジニアを「フルスタックエンジニア」なんて言葉で呼ぶようになってきているけど、これからのフルスタックエンジニアは、それに加えて、分析・統計・解析もできるようにならないと生きていけないのでは?などと危機感を持ったりも。
大学へ行ってない40過ぎたおっさんでも、分析・統計・解析の世界を学んでいくことができるかなー。
昨日の日記の続き。今日は Pebble から「Pebble とリンクしたスマートフォン」を通じて Web API から情報取得する部分を作っていくところになる。
チュートリアルの Part3 は PebbleKit JS を使って、Web 上のコンテンツから取得した情報を Pebble アプリ内に表示するチュートリアルになる。
このチュートリアルでは、JavaScript で OpenWeatherMap から現在の天気と気温を取得して表示していく。
まずは、JavaScript で情報を書き換える場所づくりとして、テキストレイヤーを追加していく。これは、時刻表示のときと同じ流れなので分かりやすい。
// Create temperature Layer
s_weather_layer = text_layer_create(GRect(0, 130, 144, 25));
text_layer_set_background_color(s_weather_layer, GColorClear);
text_layer_set_text_color(s_weather_layer, GColorWhite);
text_layer_set_text_alignment(s_weather_layer, GTextAlignmentCenter);
text_layer_set_text(s_weather_layer, "Loading...");
ちょっと違うのは、初期状態で表示するテキストを「Loading...」にしているところかな。JavaScript で情報取得して書き換える前には、こういった表示にしておくほうがユーザにやさしいということだろう。
それから同じフォントでも違うフォントサイズを利用するには、appinfo.json
で改めて定義が必要なようだ。
{
"type": "font",
"name": "FONT_PERFECT_DOS_48",
"file": "fonts/perfect-dos-vga.ttf",
"compatibility": "2.7"
},
{
"type": "font",
"name": "FONT_PERFECT_DOS_20",
"file": "fonts/perfect-dos-vga.ttf",
"compatibility": "2.7"
},
ここでチュートリアルの説明にちょっとワナがある。
チュートリアル Part2 では、フォントファイルの指定を "file": "fonts/perfect-dos-vga.ttf"
のように fonts
ディレクトリ以下にファイルがあるように書いているのに、チュートリアル Part3 では "file":"perfect-dos-vga.ttf"
とディレクトリが存在していない。
上記の JSON は Part2 に合わせてディレクトリが入った状態で書いている。
その他、いつもの unload 処理を追加した後で、build & install すると、このような Loading 表示が出た。
ちなみにフォントサイズの指定は「_48」とか「_20」の部分になるようだ。どういうルールでそうなっているのかは、うまく把握できていないのだけど、「_20」の部分を「_10」に書き換えて build & install してみたら、小さいフォントで表示されたので、今はそういうものだと思っておこう。
Pebble および Pebble と接続しているスマートフォンとの間の通信は、AppMessage API を使って行われるとのこと。
AppMessage の使い方の概要は次のようになるらしい。
この手順で開始されて実際にメッセージが届くと AppMessageInboxReceived
コールバックが呼ばれるそうだ。コールバック関数は、次の4つが紹介されている。カッコ内の関数名はチュートリアルに書かれていた名前であり、これに固定されている訳ではない。
inbox_received_callback()
)inbox_dropped_callback()
)outbox_failed_callback()
)outbox_sent_callback()
)コールバック関数を定義したら、それを init()
の中でシステムへ登録する。
// Register callbacks
app_message_register_inbox_received(inbox_received_callback);
app_message_register_inbox_dropped(inbox_dropped_callback);
app_message_register_outbox_failed(outbox_failed_callback);
app_message_register_outbox_sent(outbox_sent_callback);
AppMessage を ON にするためには「app_message_open()
」を実行してやる必要がある。
// Open AppMessage
app_message_open(app_message_inbox_size_maximum(), app_message_outbox_size_maximum());
これを実行するのは、コールバック関数を定義した後に行なうのがベストプラクティスだとチュートリアルには書いてある。この順番で実行することで、メッセージの取りこぼしが無くなるみたいだ。
それから、Pebble とスマートフォンの間でデータのやりとりをするためのキーとして、次の定義をしておく。
#define KEY_TEMPERATURE 0
#define KEY_CONDITIONS 1
AppMessage でのメッセージのやりとりのキーは数値のようなのだが、数字でのアクセスだとマジックナンバーになってしまうし、何よりコードがリーダブルでは無くなるので、こうしておくのが普通だそうだ。更に複雑になった場合には enum を利用して整理する方法もあるよと紹介されている。
PebbleKit JS は、src/js/pebble-js-app.js
ファイルに記述していく。どうもこのひとつのファイルに全てを記述していくようだ。
最小のひな形としてサンプルが掲載されている。そのインデントが好みではないので、自分ではこのようにした。最小構成では ready
と appmessage
のイベントを LISTEN するだけのものだ。
/*global Pebble */
Pebble.addEventListener('ready', function(e) {
console.log('PebbleKit JS ready !');
});
Pebble.addEventListener('appmessage', function(e) {
console.log('AppMessage received !');
});
ここまでできたら、また build & install を実行する。そして console.log()
の出力を見てみようというのだ。まず、インストール時に console.log()
の実行結果が表示された。
% pebble install --phone 192.168.1.78
[INFO ] Installation successful
[INFO ] JS: starting app: 0000-0000-0000-0000-0000000000000 Tutorial1
[INFO ] app is ready: 1
[INFO ] JS: Tutorial1: PebbleKit JS ready !
それから、ログを見る方法として pebble logs
コマンドが紹介されている。log
じゃなくて logs
ね。これを実行すると、ログの流し見ができるようになる。
% pebble logs --phone 192.168.1.78
[INFO ] Enabling application logging...
[INFO ] Displaying logs ... Ctrl-C to interrupt.
[INFO ] I ocess_manager.c:297 Heap Usage for App <Tutorial1>: Total Size <22352B> Used <6536B> Still allocated <40B>
[INFO ] JS: stopping app: 0000-0000-0000-0000-0000000000000 Tutorial1
[INFO ] JS: starting app: 0000-0000-0000-0000-0000000000000 Tutorial1
[INFO ] app is ready: 1
[INFO ] JS: Tutorial1: PebbleKit JS ready !
これは既に起動していた Tutorial1 の Watchface を別の Watchface に切り替えてから、もう一度 Tutorial1 へ戻したときの様子。一度 Tutorial1 がストップし別の Watchface が起動(こっちは特にログを吐き出していない)、そして Tutorial1 が再び起動して、console.log()
の内容が表示された。
つまり、Watchface アプリの起動時に pebble-js-app.js
が読み込まれ、イベントリスナーに登録した ready
イベントが発火されたという訳だ。
この logs
サブコマンドでは、PebbleKit JS の console.log()
だけでなく、C 言語での APP_LOG
の内容も出力してくれるそうだ。チュートリアルにも「logs
はデバッグに超便利だよ!」って書かれている。プリントデバッグ万歳!
OpenWeatherMap.org から天気情報を取得して、Watchface アプリに表示させるステップが説明されている。チュートリアルの説明そのままだけど、こんな手順になるそうだ。
この手順は JavaScript の範疇になる。コードを追加していくのは、先ほどと同じ src/js/pebble-js-app.js
だ。
その前に、位置情報を取得するためには appinfo.json
へ capabillities
の定義が必要になるそうなので記述する。
"capabillities": [
"location"
],
JSON 内のどのレベルに書くのか?と思ったのだけど、他のフィールドの配下ではなくトップレベル(という言い方で良いのだろうか?)に書けばいいようだ。
そして改めて JavaScript へ戻る。先ほど作った ready
イベントのリスナーに getWeather()
の呼び出しを追加する。
Pebble.addEventListener('ready', function(e) {
console.log('PebbleKit JS ready !');
getWeather();
});
getWeather()
の中身はこうなっている。
function locationSuccess(pos) {
// We will request the weather here
}
function locationError(err) {
console.log('Error requesting location!');
}
function getWeather() {
navigator.geolocation.getCurrentPosition(
locationSuccess,
locationError,
{timeout: 15000, maximumAge: 60000}
);
}
まず getWeather()
内で navigator.geolocation.getCurrentPosition()
を実行して位置情報を取得する。これは Pebble の独自メソッドではなく、標準の Geolocation API の書式だ。
Pebble がスマートフォンと接続している状態であれば、この API を使ってスマートフォンが持っている位置情報をこの JavaScript で取得できるってことみたいだ。
位置情報が取得できたら、locationSuccess()
が呼ばれ、失敗したら locationError()
が呼ばれる。locationSuccess()
には位置情報のオブジェクトが渡される。
次はこの locationSuccess()
の中身を実装していく。
function locationSuccess(pos) {
var url = 'http://api.openweathermap.org/data/2.5/weather?lat='
+ pos.coords.latitude
+ '&lon='
+ pos.coords.longitude;
xhrRequest(url, 'GET', function(responseText) {
var json = JSON.parse(responseText);
var temperature = Math.round(json.main.temp - 273.15);
console.log('Temperature is ' + temperature);
var conditions = json.weather[0].main;
console.log('Conditions are ' + conditions);
});
}
xhrRequest()
はこのチュートリアルで独自に定義した XMLHttpRequest の処理(この日記には書いてないので、本家チュートリアルを参照すべし)だ。ここでは、getCurrentPosition()
で取得した位置情報を使って OpenWeatherMap.org の API 呼び出し用の URL を作り、それを XMLHttpRequest(つまり Ajax)で呼び出している。レスポンスが返ってきたら、その中身を JSON にパースして、console.log()
へ吐き出している。
ここまで作って build & install したら次のようなログが出てきた。
% pebble install --phone 192.168.1.78
[INFO ] I ocess_manager.c:297 Heap Usage for App <Tutorial1>: Total Size <22352B> Used <6536B> Still allocated <40B>
[INFO ] JS: starting app: 0000-0000-0000-0000-0000000000000 Tutorial1
[INFO ] Installation successful
[INFO ] JS: starting app: 0000-0000-0000-0000-0000000000000 Tutorial1
[INFO ] app is ready: 1
[INFO ] JS: Tutorial1: PebbleKit JS ready !
[INFO ] JS: Tutorial1: Temperature is 18
[INFO ] JS: Tutorial1: Conditions are Rain
気温が 18 度で、天気は雨だ。このとき OpenWeatherMap の Web サイトで東京の天気を見てみたら、18度で雨となっているので、正しく情報が取得できたようだ(これを書いていたときには東京にいた)。
OpenWeatherMap からのレスポンスのサンプルが、このチュートリアルの Gist で公開されている。日の出・日の入りや気圧とかも取得できるみたいだね。
JavaScript での最後のステップと書かれている。このステップで、JavaScript から Pebble アプリへのデータ送信のやり方が分かるはず。
まず、AppMessage で使うキーを appinfo.json
に定義する。
"appKeys": {
"KEY_TEMPERATURE": 0,
"KEY_CONDITIONS": 1
}
これは最初のほうで Tutorial1.c
へ定義した、この部分と一致させるってことだろうな。
#define KEY_TEMPERATURE 0
#define KEY_CONDITIONS 1
次に AppMessage 送信の本体部分を実装していく。その本体はこのような形で Pebble.sendAppMessage()
を使う。temperature
と conditions
には、それぞれ温度と天気の値が入っているものとする。
var dictionary = {
'KEY_TEMPERATURE': temperature,
'KEY_CONDITIONS': conditions
};
Pebble.sendAppMessage(dictionary,
function(e) {
console.log('Weather info sent to Pebble successfully!');
},
function(e) {
console.log('Error sending weather info to Pebble!');
}
);
それから、appmessage
のイベントリスナーにも getWeather()
を仕込んでおけとのこと。これは後から実装する「情報のアップデート」に必要な仕込みらしい。
あともうちょい。
今度は Tutorial1.c
の修正。inbox_received_callback()
の中を実装することになる。AppMessage で送信されたキーごとに文字列を作成し、TextLayer へ出力する流れ。
static void inbox_received_callback(DictionaryIterator *iterator, void *context) {
Tuple *t = dict_read_first(iterator);
while (t != NULL) {
switch (t->key) {
case KEY_TEMERATURE:
snprintf(temperature_buffer, sizeof(temperature_buffer), "%dC", (int)t->value->int32);
break;
case KEY_CONDITIONS:
snprintf(conditions_buffer, sizeof(conditions_buffer), "%s", t->value->cstring);
break;
default:
APP_LOG(APP_LOG_LEVEL_ERROR, "Key %d not recognized!", (int)t->key);
break;
}
t = dict_read_next(iterator);
}
snprintf(weather_layer_buffer, sizeof(weather_layer_buffer), "%s, %s", temperature_buffer, conditions_buffer);
text_layer_set_text(s_weather_layer, weather_layer_buffer);
}
最後に「一定時間で天気情報をアップデートする」という処理を tick_handler()
の中に記述する。tick_handler()
は「1分ごとに時計表示を書き換える」ところで使っていたルーチン。ここに「30分ごとに天気情報を取得して AppMessage を送信する」という処理を追加する。
if (tick_time->tm_min % 30 == 0) {
DictionaryIterator *iter;
app_message_outbox_begin(&iter);
dict_write_uint8(iter, 0, 0);
app_message_outbox_send();
}
ここまで書いて build & install をすると、Watchface に現在位置の天気情報が表示される。さっきログに出てきたように、「18C Rain」と表示された。
これでチュートリアルの全てが終了。なんとなく全体像は把握できたかな。でも JavaScript 部分はともかく、C 言語部分はだいぶ模写しただけ感があるので、もうちょっと知識を得ねばという感じだな。
なにはともあれ、自分で作った画面が Pebble 上に表示されるのは楽しいね、チュートリアルとは言え。
昨年の北海道旅行のために買った Helinox の「サンセットチェア」を、3月にふもとっぱらへキャンプへ行った時に壊してしまっていた。椅子が倒れていたことに気がつかずに座ろうとしてしまい、自分がひっくり返るのと同時に椅子へおかしな加重を与えてしまって、ポールが曲がってしまったのであった。
先週、購入した店舗へ持ち込んで修理の依頼をしていたのだけど、それが完了したとのことで引き取りに行ってきた。
曲がってしまったポールを2本交換して4,600円(税別)。新品の Helinox チェアを買うよりは安いけれど、結構いいお値段になってしまった。
次からは気をつけて座らないと。
▽ 双月 [はじめまして。ゆうすけさんのとこから飛んできました。...難しいですね。とりあえず、お疲れだと思うので、ええと、お大..]
▽ すずき [はじめまして>双月さん えっと、別れたのはだいぶ前のことなので全然平気です。ご心配ありがとうございます。]