2008 年 1 月の履歴(もしくは日誌)


2008 年 1 月

1 月 18 日

Twitter の Badge に @ による自分宛の書き込みも表示

Twitter の Badge を使うと,自分の Web サイトに自分の最後の書き込みを表示できます.その Badge に手を加えて誰かが @onohiroki って書いたときにも表示できるようにしてみました.Badge は「Weblog / 履歴もしくは日誌」のページ右上に貼ってます.

Twitter では自分の Web サイトに Twitter の内容を表示する為の Badge を配布しています.

ここの HTML / JavaScript の Badge に手を加えました.

HTML はこんな感じ:

<div id="twitter-badge">
<ul id="twitter_update_list">
<li>What I am doing:</li>
<li>http://twitter.com/onohiroki/</li>
</ul>
</div>

<script type="text/javascript" src="twitter-badge.js"></script>
<script type="text/javascript" src="http://twitter.com/statuses/user_timeline/onohiroki.json?callback=twitterCallbackMe&count=1"></script>
<script type="text/javascript" src="http://twitter.com/statuses/friends_timeline/onohiroki.json?callback=twitterCallbackWithFriends&count=10"></script>

上の HTML 内で,script 要素が 3 つあるけど,最後の一行はページの最後の方に書いた方が良さそうです.

JavaScript は http://twitter.com/javascripts/blogger.js を改変して,こんな感じ:

// original http://twitter.com/javascripts/blogger.js
// 2008-01-17 onohiroki.cycling.jp
var numOfItem = 0;
var twitterCallbackMeHTML = "";

function twitterCallbackWithFriends(obj) {
   var twitters = obj;
   var username = "";
   var statusHTML = "";
   
   for (var i=0; i<twitters.length; i++){
      username = twitters[i].user.screen_name;
      var smalltext = "";
      if (twitters[i].text.indexOf("http") > -1) {
         smalltext = ' class="withUrlTwitter" ';
      }
      if (username == 'onohiroki') {
         numOfItem++;
         statusHTML += ('<li class="me"><span'+smalltext+'>'+twitters[i].text+'</span> <a style="font-size:85%" href="http://twitter.com/'+username+'/statuses/'+twitters[i].id+'">'+relative_time(twitters[i].created_at)+'<br /><span class="friend">by '+twitters[i].user.screen_name+'</span></a></li>')
      }
      else if (twitters[i].text.indexOf("@onohioki ") > -1){
         statusHTML += ('<li class="friend"><span'+smalltext+'>'+twitters[i].text+'</span> <a style="font-size:85%" href="http://twitter.com/'+username+'/statuses/'+twitters[i].id+'">'+relative_time(twitters[i].created_at)+'<br /><span class="friend">by '+twitters[i].user.screen_name+'</span></a></li>')
      }
   }
   if (numOfItem < 1) {
      statusHTML += twitterCallbackMeHTML;
   }
   document.getElementById('twitter_update_list').innerHTML = statusHTML;
}

function twitterCallbackMe(obj){
   var twitters = obj;
   var statusHTML = "";
   var username = "";
   for (var i=0; i<twitters.length; i++){
      username = twitters[i].user.screen_name;
      var smalltext = "";
      if (twitters[i].text.indexOf("http") > -1) {
         smalltext = ' class="withUrlTwitter" ';
      }
      statusHTML += ('<li class="me"><span'+smalltext+'>'+twitters[i].text+'</span> <a style="font-size:85%" href="http://twitter.com/'+username+'/statuses/'+twitters[i].id+'">'+relative_time(twitters[i].created_at)+'<br /><span class="friend">by '+twitters[i].user.screen_name+'</span></a></li>')
   }
   document.getElementById('twitter_update_list').innerHTML = statusHTML;
   twitterCallbackMeHTML = statusHTML;
}


function relative_time(time_value) {
  var values = time_value.split(" ");
  time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
  var parsed_date = Date.parse(time_value);
  var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
  var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
  delta = delta + (relative_to.getTimezoneOffset() * 60);

  if (delta < 60) {
    return 'less than a minute ago';
  } else if(delta < 120) {
    return 'about a minute ago';
  } else if(delta < (60*60)) {
    return (parseInt(delta / 60)).toString() + ' minutes ago';
  } else if(delta < (120*60)) {
    return 'about an hour ago';
  } else if(delta < (24*60*60)) {
    return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
  } else if(delta < (48*60*60)) {
    return '1 day ago';
  } else {
    return (parseInt(delta / 86400)).toString() + ' days ago';
  }
}

friends_timeline からデータを引っ張って来て,自分の screen_name が使われてる投稿だけ表示.もし friends_timeline に自分の発言が無かった場合は user_timeline から持って来た最新の投稿を表示します.

ぼくは JavaScript って良く知りません.これを書くのにも Web で調べながらでした.

http://onohiroki.cycling.jp/tb/tb.cgi/weblog_d20080118n1 TrackBack

1 月 16 日

iBook G4 から MacBook へ

MacBook Air が発表されましたね.とても魅力的だと思いますが,ぼくはもうちょっと廉価で厚みのある MacBook を注文しました.オンラインの Apple Store を見ていたら MacBook と一緒に Apple Care という延長保証が選べませんでした.それで電話でどうなっているんだって問い合わせたら,うっかりそのまま電話で注文してしまいました.とても簡単に電話で注文できました.

ちょっと過去を振り返ってみますと:

2000 年 6 月
PowerBook Duo 2300 から iBook (タンジェリン) に移行
2002 年 11 月
白い iBook に移行
2005 年 12 月
iBook G4 に移行
2008 年 1 月
MacBook を注文

こうして見るとだいたい 2 年から 3 年で主に使うコンピュータを乗り換えています.2 年で乗り換えなど短すぎる!っていう人もいるかもしれませんが,まぁ長くでも 3 年くらいぢゃありません?

今回発表された MacBook Air もとても魅力的なのですが,メモリが 2 GB までなのでやめておきました.MacBook ならメモリは 4 GB まで増設可能です.やっぱりメモリの再大容量が大きい方が長く使えると思うのです.

もっとも MacBook Air で SSD を使えば仮想メモリでスワップが起こっても遅くならないのかもしれませんが...

注文した MacBook は白いやつ.ハードディスクは 250 GB にしましたが,とりあえずメモリは増設なし.後から自分で増設しようと思います.

今度の Mac は Power PC ぢゃなくて Intel CPU です.Intel CPU の Mac はこれが初めてです.

http://onohiroki.cycling.jp/tb/tb.cgi/weblog_d20080116n1 TrackBack

1 月 7 日

続・メーリングリストで障害発生かも

メーリングリストからメールが正常に配信されなかったトラブルですが,ごく一部の登録メンバーだけで発生していたようです.配信されなかったメールは,コマンドをメーリングリストサーバに送れば再配信されます.

メールの本文にコマンドを以下のように書いてください.

#get 17050
#get 17051

このように書くと 17050 番と 17051 番のメールが再配信されます.

メールの題名は何でも良いです.

そして送信先は通常のメーリングリストのアドレスでは無く,コマンド送信用のアドレスに送ります.
BD サイクリングクラブ メーリングリストなら foldingbike-ctl@ml.mail.ne.jp 宛,
リカンベント サイクリングクラブ メーリングリストなら recumbent-ctl@ml.mail.ne.jp 宛に送信してください.

http://onohiroki.cycling.jp/tb/tb.cgi/weblog_d20080107n2 TrackBack

メーリングリストで障害発生かも

【追記:サポートからサーバ側の障害でありすでに解消したと連絡がありました.】

1 月 5 日の夕方から BD サイクリングクラブリカンベント サイクリングクラブのメーリングリストへ投稿したメールがきちんと配信できなくなっているようです.

まだ状況が十分に確認できていません.

[取り消し:メーリングリストに登録している人はメールが配信されているかされていないか教えていただけるとありがたいです.]

たとえば以下のメールは届いていますか?

メーリングリストでの最新の投稿は以下のリンクから確認できます.

[取り消し: 届いている場合も届いていない場合も,メーリングリストから最後に届いたメールの番号を報告してもらえるとありがたいです.
報告は onohiroki@cup.com までメールでお願いします.
報告が無いと問題の範囲がわかりません.
]よろしくお願い致します.

http://onohiroki.cycling.jp/tb/tb.cgi/weblog_d20080107n1 TrackBack

1 月 5 日

冬の多摩川サイクリングロード

今日はリカンベント サイクリングクラブのイベントとして,多摩川サイクリングロードを走りました.今回は Greenspeed GTX Trike で参加.本当はポジションの見直しをして,修理の為に外してあったダイナモを取り付けて,後輪のタイヤを交換してから走りたかったのですが,寝坊したので全部あきらめてあわてて習合場所へ向かいました.習合場所は二子橋付近.自宅から 15 分もかからないのでとても楽です.荒川サイクリングの時とは大違いです.

事前に参加宣言したもののくりはらさんは参加取りやめ.参加宣言無しで参加した人もいて,全部で 15 人くらいが集まりました.

集合時は曇っていて肌寒く,皆が集まるのをまっていたら小雪がちらちら.
うっきーさんが集合場所で離脱する予定ということなので,練馬の渡辺さんが集合場所で Greenspeed GT5 の折り畳みをでもストレーション.GT5 はぼくの GT5 とほぼ同じくらいの大きさかややコンパクトな印象.シートは GTX よりやや立っていて GT5 のほうが普通に乗りやすいと思いました.折り畳みもぼくの GTX よりはかなり簡単に折り畳めるようになっています.もっとも畳んだ時の大きさはあまり変わりませんが.Greenspeed では簡単に前輪を外す事ができるディスブレーキ対応のハブを開発しているようなので,それを利用すればもっと簡単に輪行できるようになるかも.

参加予定で集合が最後になったのは Mango のひろせさんで,皆が Mango が現れるのを心待ちにしていました.すると二子橋を渡ってくる見間違えようのない黄色い車体.Mango は遠目にみて軽自動車とあまり変わらないように見えました.

Mango 到着後はまた皆で試乗したりして時間があっという間に過ぎて行きます.最初は 10 時半出発の予定だったのですが,それよりも遅くなってから出発しました.

先頭は Greenspeed GTX のぼく.多摩川サイクリングロードは狭くてあまり走りやすいわけではないのですが,サイクリングロード上にだれもいない時は,ある程度の速度で走りました.GTX は久しぶりなのでなんだか楽しくなって気持ち良い速度でビューっと.その時に後ろを変速無しの折り畳み自転車 STRIDA で走っている くろかーさんの事などすっぽり頭から抜けていました.後で聞いたらついて来るのがかなり大変だったそうで...

登戸付近のせせらぎ館で休憩.その後は府中市民健康センター付近まで.

先頭を走っていてちらちらとバックミラーを見ながら走っていたのですが,ふと気がつくと Mango が後ろについていてびっくりしたり.すっと抜き去られてみるみるうちに小さくなる Mango.いったいどれだけスピードが出ているのか.
ぼくが Mango なら時速 60 km とか平気で出るとか無責任な事をあちこちで言いまわったのですが,オーナーのひろせさん曰く維持できるのは時速 50 km くらいかなとの事.なんにしてもやっぱり速い.ヒルクライムでは車体重量の為にそれほど速くないだろうけど,ヒルクライム以外なら最速の自転車ぢゃないだろうか.

府中市民健康センター付近に到着.全員がそろってから,買い出し後にここに戻って昼食をとる事を説明.それから是政駅付近のコンビニエンスストアへ昼食の買い出しに行きました.戻って来て昼食をとったあとは,やっぱり試乗会になり,それぞれ他の人のリカンベントに試乗しました.

ここから折り返してまた下流へ戻るのですが流れ解散になるので,とりあえず解散の挨拶をしてから下流へ向かいます.登戸まで来た時には 5 人くらいでした.せせらぎ館のちょっと手前でひろせさんの Mango の後輪がパンク.Mango は後輪も片持ちなのでホイールを外さなくてもチューブ交換ができる構造でした.

せせらぎ館でちょっと休憩した後はさらに下流へ向かって二子橋でちょっと休憩.さらに下流に向かうのは長岡さんと RAY さんとぼくの 3 人.丸子橋まで来た時にはぼくひとりになりました.

気持ち良く走る事ができました.

帰宅後に後輪のタイヤを交換しようかと思ったのですが,プリモのとても細いタイヤを試してみたのですが,タイヤが細すぎてうまく装着できませんでした.やっぱり STELVIO を買ってこなくちゃ.

http://onohiroki.cycling.jp/tb/tb.cgi/weblog_d20080105n1 TrackBack

[ 上に戻る]