某社の人とミーティングらしい。何を話すんだか全く知らないんだけど、スケジュールに入れられていた。
全く興味のなかった XBOX だけど、鉄騎はちょっと気になる。気になると言うか、このメカデザイン、どうやら知人がやってるみたい。連絡取ろうとしたんだけど、ケータイ番号変わったみたいで連絡取れず。Web も辞めちゃったみたいだし。。。
またしてもウチのサービスをパクってる会社が出現。しかも今度は凄いパクリかた。プログラム名やパラメータ名までパクってるし、用語もほとんどそのままだよ。。。ここまでオリジナルに真似しなくてもいいんじゃない?作ってて恥ずかしくないのかなぁ。なんでこんなところと品川に本社がある某世界企業が組んでセミナーなんかやるんだろ?
終わってみれば、結構有意義なミーティングだった。ふむふむなるほどね系。あ、で、この某社と上の某世界企業は別のところ。こっちの某社も世界企業だけど。
でかい書店だと店売りしているっすね>日経BP雑誌
ひさびさに駅前のたこ焼き屋台が営業していたので買った。毎日営業してるのかも知れないけど、僕が帰る時間に開いているのは珍しい。8個入り200円。滅茶苦茶うまいってわけじゃないけど、たまに食べるとうまいんだな。アクビさんに貰ったヤツにはもちろんかなわないけど。やっぱりちょっと食い足りないな>大阪たこ焼き いずれ第2段大阪散歩でリベンジせねば。あと、本物の甘栗ソフトも(笑)
少しだけイライラしている。イロイロ追い込まれているからかなぁ。たまに精神的に不安定になる時があるけど、ほっといてくれれば自力で持ち直すのでそのつもりで。
昨夜は引越してから初めて会社で日をまたいだ。もしかしたら終電があったかもしれないけど、疲れきっていたのでタクシーで帰宅。2000円程度だったらいいなと願っていたのに、メーターが上がりに上がって2700円オーバー。引越前は1200円くらいで帰れていたので倍以上だ。こんなんが続くと洒落にならん。はよ帰ろう。
本日、会社を出たのは22時30分くらい。そりゃ昨日より早いけど、会社の中では一番最後。
2003年後期のおおまかな予定が決まってきた。このまま行くと、かなり大きな波に飲み込まれて、9〜10月は忙しそうだ。しかも、その忙しさの中心人物は僕。となると、この時期に1〜2週間休むのは無理っぽいな。。。
先週の診察で結論が出なかったので今日は筋電図とやらを使った検査だった。
先週の診察時に「ちょっと痛いですよ」と聞かされていたのだが、、、実際、結構痛かったよ。手首に電極のようなものを付け、腕にスタンガンのようなものを当てられて、、、バシッっと。
最初の一発は、覚悟ができていなかった&電圧が高かったかなんかで、腕だけじゃなく体がビクッと反応した。その後も連発でスタンガン攻撃を食らった(笑)
最後に「針を刺して調べてみましょう」と言われ、親指の付け根に針を刺さされ、そして電気を流されて、、、こっちの方が痛い!
ということで、検査結果は金曜日。さて、何か出るんだろうか。
「PostgreSQL 8.3.3, 8.2.9 etc. Update Release」というエントリによると、8.3.3 の他、8.2.9, 8.1.13, 8.0.17, 7.4.21 が同時にリリースされたようだ。
セキュリティ fix では無さそうだが、いくつかのバグを修正したようだ。「crash」なんて単語が結構出てくるので、ちょっとリリースノートなんぞを見てアップグレードを検討すべきかと。
ちなみに、8.3.2, 8.2.8, 8.1.12, 8.0.16, 7.4.20 は欠番、、、ではないけれど、skip 扱いだそうで。しばらくの間、公開されてたようなので、それをダウンロードしてた人はアップグレードしてくれとのこと。
yum を使って CentOS 5 へ PostgreSQL 8.3.1 を入れる方法を書いたときの環境が残っておらず*1、昨日、yum でインストールした別のマシンには、既に 8.3.3 のパッケージがインストールされていた。
よって、試してみたかった 8.3.1 から 8.3.3 への yum update は実現せず。悔しいので(?)、yum.postgresql.org から利用できるパッケージの一覧を取得してみた。
pgpool-II やら、pgAdmin III、slony-I なんかも yum でインストールできちゃうね。最新版を追っかけるなら、この yum リポジトリを使わない手はないわー。
Available Packages compat-postgresql-libs-debuginfo.i686 4-1PGDG.rhel5 pgdg83 dbi-link.noarch 2.0.0-3.rhel5 pgdg83 geos.i686 2.2.3-2.rhel5 pgdg83 geos-debuginfo.i686 2.2.3-2.rhel5 pgdg83 geos-devel.i686 2.2.3-2.rhel5 pgdg83 ip4r.i686 1.03-1.rhel5 pgdg83 ip4r-debuginfo.i686 1.03-1.rhel5 pgdg83 orafce.i686 2.1.3-1.rhel5 pgdg83 orafce-debuginfo.i686 2.1.3-1.rhel5 pgdg83 pagila.noarch 0.10.0-1.rhel5 pgdg83 pam_pgsql.i686 0.6.3-1.rhel5 pgdg83 pg_filedump.i686 8.3-1.rhel5 pgdg83 pg_filedump-debuginfo.i686 8.3-1.rhel5 pgdg83 pgadmin3.i686 1.8.4-1.rhel5 pgdg83 pgadmin3-debuginfo.i686 1.8.4-1.rhel5 pgdg83 pgadmin3-docs.i686 1.8.4-1.rhel5 pgdg83 pgbouncer.i686 1.1.2-2.rhel5 pgdg83 pgbouncer-debuginfo.i686 1.1.2-2.rhel5 pgdg83 pgdg-redhat.noarch 8.3-4 pgdg83 pgfouine.noarch 1.0-2.rhel5 pgdg83 pgloader.i686 2.3.0-1.rhel5 pgdg83 pgplsh.i686 1.3-2.rhel5 pgdg83 pgplsh-debuginfo.i686 1.3-2.rhel5 pgdg83 pgpool.i686 3.4.1-1.rhel5 pgdg83 pgpool-II.i686 2.0.1-1.rhel5 pgdg83 pgpool-II-debuginfo.i686 2.0.1-1.rhel5 pgdg83 pgpool-II-devel.i686 2.0.1-1.rhel5 pgdg83 pgpool-debuginfo.i686 3.4.1-1.rhel5 pgdg83 pgsphere.i686 1.0.0-1.rhel5 pgdg83 pgsphere-debuginfo.i686 1.0.0-1.rhel5 pgdg83 phpPgAdmin.noarch 4.2-1.rhel5 pgdg83 plpgpsm.i686 0.3.1-1.rhel5 pgdg83 plpgpsm-debuginfo.i686 0.3.1-1.rhel5 pgdg83 plproxy.i686 2.0.4-1.rhel5 pgdg83 plproxy-debuginfo.i686 2.0.4-1.rhel5 pgdg83 plruby.i686 0.5.3-1.rhel5 pgdg83 plruby-debuginfo.i686 0.5.3-1.rhel5 pgdg83 plruby-doc.i686 0.5.3-1.rhel5 pgdg83 postgis.i686 1.3.3-1.rhel5 pgdg83 postgis-debuginfo.i686 1.3.3-1.rhel5 pgdg83 postgis-jdbc.i686 1.3.3-1.rhel5 pgdg83 postgis-utils.i686 1.3.3-1.rhel5 pgdg83 postgresql-contrib.i386 8.3.3-1PGDG.rhel5 pgdg83 postgresql-debuginfo.i386 8.3.3-1PGDG.rhel5 pgdg83 postgresql-devel.i386 8.3.3-1PGDG.rhel5 pgdg83 postgresql-docs.i386 8.3.3-1PGDG.rhel5 pgdg83 postgresql-jdbc.i686 8.3.603-1PGDG.rhel5 pgdg83 postgresql-jdbc-debuginfo.i686 8.3.603-1PGDG.rhel5 pgdg83 postgresql-odbc.i686 08.03.0100-1PGDG.rhel5 pgdg83 postgresql-odbc-debuginfo.i686 08.03.0100-1PGDG.rhel5 pgdg83 postgresql-plperl.i386 8.3.3-1PGDG.rhel5 pgdg83 postgresql-plpython.i386 8.3.3-1PGDG.rhel5 pgdg83 postgresql-pltcl.i386 8.3.3-1PGDG.rhel5 pgdg83 postgresql-python.i686 3.8.1-7PGDG.rhel5 pgdg83 postgresql-python-debuginfo.i686 3.8.1-7PGDG.rhel5 pgdg83 postgresql-tcl.i686 1.6.2-1PGDG.rhel5 pgdg83 postgresql-tcl-debuginfo.i686 1.6.2-1PGDG.rhel5 pgdg83 postgresql-test.i386 8.3.3-1PGDG.rhel5 pgdg83 prefix.i686 0.2-1.rhel5 pgdg83 prefix-debuginfo.i686 0.2-1.rhel5 pgdg83 proj.i686 4.6.0-1.rhel5 pgdg83 proj-debuginfo.i686 4.6.0-1.rhel5 pgdg83 proj-devel.i686 4.6.0-1.rhel5 pgdg83 proj-epsg.i686 4.6.0-1.rhel5 pgdg83 proj-nad.i686 4.6.0-1.rhel5 pgdg83 ptop.i686 3.6.1-1.rhel5 pgdg83 ptop-debuginfo.i686 3.6.1-1.rhel5 pgdg83 python-psycopg2.i686 2.0.6-1.rhel5 pgdg83 python-psycopg2-debuginfo.i686 2.0.6-1.rhel5 pgdg83 python-psycopg2-doc.i686 2.0.6-1.rhel5 pgdg83 python-psycopg2-zope.i686 2.0.6-1.rhel5 pgdg83 ruby-pg.i686 0.7.9.2008.02.05-1.rhe pgdg83 ruby-pg-debuginfo.i686 0.7.9.2008.02.05-1.rhe pgdg83 skytools.i686 2.1.6-1.rhel5 pgdg83 skytools-debuginfo.i686 2.1.6-1.rhel5 pgdg83 slony1.i386 1.2.14-1.rhel5 pgdg83 slony1-debuginfo.i386 1.2.14-1.rhel5 pgdg83 slony1-docs.i386 1.2.14-1.rhel5 pgdg83 table_log.i686 0.4.4-2.rhel5 pgdg83 table_log-debuginfo.i686 0.4.4-2.rhel5 pgdg83 usda-r18.noarch 1.0-1.f8 pgdg83 wxGTK.i386 2.8.4-4.el5 pgdg83 wxGTK-devel.i386 2.8.4-4.el5 pgdg83 wxGTK-gl.i386 2.8.4-4.el5 pgdg83
*1 MacBook がクラッシュしたから。。。
Kickstarter で投資していた Pebble Time が届いた!
初代 Pebble の時も『iOS/Android対応スマートウォッチ「Pebble」開封フォトレポート』とかやっていたので、今回も似たようなことをやってみよう。
発送方法を DHL に切り替えていたので、発送から到着まで実質2日ほどで届いた。どこで作ってたのか知らないのだが、トラッキング情報によるとアイルランドの空港から発送されてきた。ちなみに到着時には不在だったんだけど「POST IN」されていた。
箱には大きく「it's time」の文字。日本のダンボールとは違って薄手のダンボールなので、箱を手に取ると少し安っぽい気になってしまうのだけど、このデザインだけで wktk させてくれる。
ダンボールの開け口は、初代 Pebble と同じように、ちょっとオシャレにジッパー風味。こういう遊び心は変わっていない。
開封すると中身はこんな感じで入っていた。Apple 製品のような高級感はないけど、期待が高まる。
中に入っているクイックスタート・ガイドや説明書には、英語の他に中国語でも書かれているのだが、日本語はない。Pebble が見ている商圏は日本ではなく中華圏なんだなぁと改めて思う。例えば「Chinese support is coming to Pebble」とかの進化を見てもそう思えるしね。
初代 Pebble と比較したサイズ感。時計本体はひと回り小さくなった感じがするかな。ベルトは同じように見えるけど、Pebble Time の方が少し柔らかい。
そのバンド、Pebble Time は簡単に取り外せるように突起が付いている。ちょっと爪で引っ掛ければ、簡単に取り外せる。既に「Pebble Time 用の交換バンド」も Kickstarter に出ていたりするので、周辺機器のエコシステムを構築していく意向がありそうだ。
また、充電用の端子が本体横ではなく、本体裏側へ移動したのもこの写真で分かるはず。
もうひとつバンドで気になったのは「Pebble」の文字が彫られているところ。初代 Pebble では、こういう加工はされていなかったので、なぜか「成長したなぁ」という感じがした。
もう一度裏側を見ると「CHAMPION」と書かれている。これは「Pebble Time、Kickstarter史上最高額の2000万ドル超を調達」というニュースにもあるとおり、Kickstarter での調達額の「CHAMPION」ってことなんだろう。ずいぶん自慢げだな、おい(笑)
充電ケーブルは初代と違ってきしめんタイプになっていた。こちらの方が丈夫な気もするけれど、取り回しはしにくくならないだろうか。柔らかめだから問題ないのかな。
電源を入れてみると、スマートフォンアプリをダウンロードして、Pebble Time とリンクしろよ!って表示が出てくる。この画面はバックライトが点いた状態。
バックライトが消えると、だいぶ暗い感じがする。室内だと、この暗さでは視認性が悪い。というか、バックライトが点いていても「あれ?ちょっと暗い?」と思うかも。オレは思った。
Pebble Time 用のアプリをダウンロードしたところ。初代 Pebble のアプリとは別になっている。
アプリを起動して、Pebble Time との Bluetooth ペアリングを試みるもうまく成功しなかった。
結局、iOS の Bluetooth 設定画面でペアリングを行なった。この手順で正しいのかは分からない。
あと、ペアリングの際は「Pebble Time の UP ボタンを押しておくこと」みたいな注意書きが出ているのでちゃんと読んでおこう。
Pebble Time 側のペアリング画面は英語の他、スペイン語、中国語がローテーション表示されていた。ここにももちろん日本語は無い。
ペアリングが終わったら、ファームウェアのアップデートが始まった。手元に届いたらいきなりアップデートが始まる製品、ここのところ多いよね。まぁ、ソフトウェアエンジニア的にはいろいろ想像できるので、こういう方式もアリだと思うよ。
アップデート中の Pebble Time の表示。ホワイトバランスが狂った(笑)
ファームウェアが無事にアップデートされて、いじり始めてから、そうそう充電しなきゃと思って充電をした。ファームウェアのアップデートのときに充電して(通電させて)おかなくて良かったのか!?と今になって思うけど。。。
で、その充電中の画面が可愛かった。コーヒー(?)が注がれて、カップが満たされていく様子がアニメーションで表示される。
その後、Pebble Time の Watchface を変えてみたり、いくつかアプリを動かしていたときに、日本語言語パック は Pebble Time で動くのかな?と疑問に思って試してみた。
iOS の Pebble Time で試したらうまくインストールできなかった。Safari で言語パックをダウンロードして「Pebble Time アプリで開く」を実行しても何も反応しなかった。まだ Pebble Time では言語パックに対応していないのかな?と思って、ちょっと検索をしてみたら、「Android の Pebble Time アプリなら対応している」という話を見つけた。
幸い、Android 機も手元にあったので、そいつで再チャレンジ。すると無事に日本語が表示されるようになった!
これで日本での実用度も跳ね上がる。Pebble Time かわいいよ、Pebble Time !!
Crowi の実装メモには、まだ実装できてないけど「やる」と宣言されているものがある。その中をつらつら見ていて「プレビュースクロールのsync」というものを見つけた。これは、Qiita などで実装されているもので、エディタ部のスクロールに合わせてプレビューもスクロールするという機能のことだ(と思う)。
どうやれば実現できるかなー?とふわふわ考えていたら、できそうな気配を感じたので、実装してみた。でも、この考えで良いのかどうかがいまひとつ自信がないのと、後で自分でも忘れそうなのでメモ代わりに日記に書いておく。
Crowi で編集する時には、画面左側に <textarea>
があり、そこで Markdown を入力するようになっている。そして画面右側には、その Markdown をレンダリングした結果の HTML が表示される。
ここで Markdown のテキストが長くなってくると、画面およびコンテンツは次のような状態になる。コンテンツは、画面には見えないところまで伸びており、エディタ部・プレビュー部ともにスクロールバーが表示される。
この状態で、エディタ部のスクロールバーを動かすと、連動してプレビュー部もスクロールするというのが、この機能の概要である。
「エディタ部のスクロール率とプレビュー部のスクロール率を一致させる」という動きにしたらどうなのか?ということを考えてみた。
つまり、エディタ部がスクロール率 0% ならプレビュー部も 0%、エディタ部が 100% ならプレビュー部も 100% になるようにする。0% というのは、コンテンツの一番上が表示されている状態、100% は一番下が表示されている状態だとする。
同期した動きは、scroll イベントで実現できそうに思った。
JavaScript で「スクロール率」を一発で取得する方法は無い。いや、実はあるのかも知れないけど、少なくともオレは知らないので、どうにかして算出する方法を考えた。
スクロールに応じて変動する値として scrollTop
があった。具体的には document.querySelector('#edit-form').scrollTop
という値である。これは 0 からスタートして、下にスクロールしていくごとに値が増えていき、最下部までスクロールするとある数字で固定値になる。
つまり、scrollTop == 0
の時はスクロール率 0% で、scrollTop
が最大値になったらスクロール率 100% とみなせるのではないかと考えた。
スクロール率 | scrollTop の様子 |
---|---|
0 % | |
nn % | |
100 % |
では、どうやれば「scrollTop の最大値」が取得できるのか?
そこで出てくるのが scrollHeight
と getBoundingClientRect()
である。先ほどの scrollTop
を含めて、それぞれ次のように取得できる。
var editor = document.querySelector('#edit-form');
var scrollTop = editor.scrollTop;
var scrollHeight = editor.scrollHeight;
var rect = editor.getBoundingClientRect();
rect
はオブジェクトが返ってくる。そのキーには、top
, bottom
, width
, height
などがある。また、scrollTop
と違って、scrollHeight
と rect
の値はスクロールしても変化しない。
そして、これらの数字の関係は次のようになる。
スクロール率 | 各数字の関係 |
---|---|
0% | |
100% |
この関係から分かるように、scrollTop
の最大値は次の式で求められる。
var maxScrollTop = scrollHeight - rect.height;
最大値が取得できれば、この数字を100%として「スクロール率」の計算ができる。ここでは rate
と呼ぶことにする。後で計算に使うので、パーセント数を出すための 100 倍はしない。
var rate = scrollTop / maxScrollTop;
同様にプレビュー部の scrollTop
の最大値を取得する。取得方法は、エディタ部と同じである。ここでは説明を簡略化するために、エディタ部での計算時と変数名を同じものにしている。
var preview = document.querySelector('#preview-body');
var scrollTop = preview.scrollTop;
var scrollHeight = preview.scrollHeight;
var rect = preview.getBoundingClientRect();
var maxScrollTop = scrollHeight - rect.height;
このプレビュー部の maxScrollTop
に、エディタ部の rate
をかけることにより、「エディタ部のスクロール率とプレビュー部のスクロール率を一致させる」ということになる。
上記の考えを実装してみたのがこの pull request になる。
実際に動かすと、このような挙動になる。
この動作は「スクロール率を合わせる」というもので、「エディタ側で見えているライン」と「プレビュー側で見えているライン」が必ずしも一致するものではない。Markdown の内容やプレビューのレンダリング結果によっては、位置がズレることがある。したがって、これを「同期」というと少し言い過ぎな気がする。
実際の動作を言葉にしてみると、「このあたりに書かれているものは、なんとなくこのあたりに書かれているだろうから、そこを表示する」みたいなことになる。
それでも、この実装での動作をみると Qiita でのスクロール同期と比較してもあまり違和感がないので、そんなに悪くないかなと思っている。
ただ、もしかすると「スクロール位置同期ができないなら見出し同期にすればいいじゃない」に書かれているように、コンテンツの見出し位置を同期したほうが、書いている人には嬉しいのかもしれない。
あ、念のため言っておくと、Qiita のコードは見ていない。ブラウザ上でのスクロール動作は参考にしたけど。
【追記】pull request はマージされた。
Before...
▽ アビー [僕もABだったりします。:-)]
▽ すずき [わお。アビーさんもですか!]
▽ 双月 [AB型って凝集しますよね(笑)私も身の回りにAB型の人が多いので、人口に占める割合が少ないというのが今ひとつピンと来..]
▽ すずき [僕もAB型率の異様に多い会社に勤めてます。僕の場合、他人の血液型は「AB型かそうじゃないか」しか覚えていません(笑)]
▽ mu [http://www.alloha.info InsuRancE http://www.devonanal.com ..]