2010年10月アーカイブ

アドビのCS5対応プリントショップのリストのページから、Google Mapsに表示させるやつの10回目。

前回は、Adobe Creative Suite 出力対応店一覧が手入力で作られていることに起因したいろんなノイズに対応したHTML解析スクリプトが完成し、各印刷会社さんのステータスが得られました。

今回は、得られたステータスの住所から、Google Mapsに表示させるため、緯度/経度を取得するウェブサービス、Google Geocoding APIを軽く使ってみたいと思います。


まず、今回は、プログラムを組まないで、ブラウザのみでやってみることにします。

今回の例として、

東京都港区台場2-4-8

を使います。この住所の、緯度/経度が知りたいっていうことです。

さて、Google Geocoding APIの説明をみてみましょう。

Google Geocoding API - Google Maps API Web サービス - Google Code [code.google.com]

まず、「使用制限」の所をよく読んでおいてください。「Google Geocoding API の使用は、1 日あたり 2,500 件までという位置情報リクエストのクエリ制限の対象となります」「Geocoding API は Google マップと組み合わせて使用する場合にのみ使用できます」というあたりに注意しましょう。

次に、「ジオコーディング レスポンス」の所を読みますと、以下のような書式でリクエストすればよいということがわかります。

JSON 出力形式

以下の例では、Geocoding API は、「1600 Amphitheatre Parkway, Mountain View, CA」というクエリに対する json レスポンスをリクエストしています:

http://maps.google.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=true_or_false

この例では、パラメータ sensor の値を true または false に明示的に設定する必要があることを強調するため、パラメータの値を変数 true_or_false のままにしてあります。

というわけで、この書式に合わせて、さっきの日本の住所を入れれば良さそうです。

しかし、URLに日本語を入れてもうまく動かないので、パーセントエンコーディングした文字列を用意します。

日本語の文字列をパーセントエンコーディングにするには、ブラウザのURL欄に以下のように入力します(JavaScriptが使えるブラウザで)。

javascript:alert(encodeURI('東京都港区台場2-4-8'));

Printshop1001

そうすると、アラートダイアログが表示され、その中にパーセントエンコーディングされた文字列が入っています。

%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA%E5%8F%B0%E5%A0%B42%EF%BC%8D4%EF%BC%8D8

Printshop1002

あとは、得られた文字列を使い、Google Geocoding APIへのリクエストURLを作ります。

http://maps.google.com/maps/api/geocode/json?region=jp&sensor=false&address=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA%E5%8F%B0%E5%A0%B42%EF%BC%8D4%EF%BC%8D8

ダウンロードされてきたファイルは、以下のようになっていました。

{
  "status": "OK",
  "results": [ {
    "types": [ "sublocality_level_4", "sublocality", "political" ],
    "formatted_address": "日本, 東京都港区台場2丁目4−8",
    "address_components": [ {
      "long_name": "8",
      "short_name": "8",
      "types": [ "sublocality_level_4", "sublocality", "political" ]
    }, {
      "long_name": "4",
      "short_name": "4",
      "types": [ "sublocality_level_3", "sublocality", "political" ]
    }, {
      "long_name": "2丁目",
      "short_name": "2丁目",
      "types": [ "sublocality_level_2", "sublocality", "political" ]
    }, {
      "long_name": "台場",
      "short_name": "台場",
      "types": [ "sublocality_level_1", "sublocality", "political" ]
    }, {
      "long_name": "港区",
      "short_name": "港区",
      "types": [ "locality", "political" ]
    }, {
      "long_name": "東京都",
      "short_name": "東京都",
      "types": [ "administrative_area_level_1", "political" ]
    }, {
      "long_name": "日本",
      "short_name": "JP",
      "types": [ "country", "political" ]
    } ],
    "geometry": {
      "location": {
        "lat": 35.6266777,
        "lng": 139.7742960
      },
      "location_type": "APPROXIMATE",
      "viewport": {
        "southwest": {
          "lat": 35.6235301,
          "lng": 139.7711484
        },
        "northeast": {
          "lat": 35.6298253,
          "lng": 139.7774436
        }
      }
    }
  } ]
}

この中の、results→geometry→locationのlatとlngが、緯度/経度になります。

早速、Google Mapsで表示してみましょう。

Google Mapsの検索欄に、「35.6266777, 139.7742960」と入れてみましょう。

Printshop1003s

このように、住所から緯度/経度を得る、ジオコーディングが出来ました。


次回は、Perlから、Google Geocoding APIに問い合わせするURLを生成して、レスポンスを取得するところをやってみたいと思います。

#!/usr/bin/perl
 
trick() or treat();
exit;
 
sub trick() {
  print "いたずらしたなう\n";
  return 1;
  # print "いたずらしない\n";
  # return 0;
}
 
sub treat() {
  print "かまって!\n";
  return 1;
}
 
__END__
$ perl trickortreat.pl
いたずらしたなう
$

「かまってくれないといたずらしちゃうぞ」、ていう意味なら、文法的に逆らしいよね。

よく使うのは、open my $fh, '<'l, 'hoge.txt' or die $!; て言うやつですよね。開けなかったら死ねってやつ。

Alienwareを購入しました。


Alienware M17x Alienware M17x
2009/6/3発売
パワーと速度を兼ね備えたAlienwareブランドの17インチノートパソコン! 超高性能CPU&最高レベルのグラフィック性能で、ゲームや大量のプログラムも超高速で処理が可能!ハードコアゲーマーに最適の一台です。
Alienware M15x Alienware M15x
2009年9月発売
世界で一番パワフルな15インチゲーミングノートパソコン!
Alienware M11x Alienware M11x
2010年2月発売
モバイルサイズ&ゲーミングマシンのAlienwareシリーズノートパソコン!場所を選ばずに本格ゲームを楽しめる異次元11インチノート。

参考:


そんで、買ってから気づいたんですが、このAlienware M11x r2(リビジョン上がっている)、VGAポートがないので、直接VGAケーブルにつなげないのですね。あるのは、DisplayPortとHDMI。

そーいうこともあろうかとDisplayPortからVGAに変換するコネクタを……と思ったらこのコネクタ、MacBook用のMini DisplayPort用でした。つながらないじゃん……

変換コネクタ、そのうち買わなきゃいかんな……

この前発売されたMacBook Airは、評判いいですね。TwitterのTL(タイムライン)で、MacBook Airをポチッただの、先週金曜日のCSS Niteで鷹野さんがMacBook Air早速買ったとかだのいろいろみているわけですけれども、せっかくなので僕はAlienware M11xを購入したわけです。


Alienware M17x Alienware M17x
2009/6/3発売
パワーと速度を兼ね備えたAlienwareブランドの17インチノートパソコン! 超高性能CPU&最高レベルのグラフィック性能で、ゲームや大量のプログラムも超高速で処理が可能!ハードコアゲーマーに最適の一台です。
Alienware M15x Alienware M15x
2009年9月発売
世界で一番パワフルな15インチゲーミングノートパソコン!
Alienware M11x Alienware M11x
2010年2月発売
モバイルサイズ&ゲーミングマシンのAlienwareシリーズノートパソコン!場所を選ばずに本格ゲームを楽しめる異次元11インチノート。

参考:


Alienwareといえば、今はDELLから販売されています。僕は、DELLから買うのは、会社のサーバをちゃんと設定する勉強するために、会社と同じ型のSC420サーバを購入した以来です(こういうことしているから金がなくなる……)。

M.C.P.C.: Mac miniが出たが、せっかくだから俺はDELLを選ぶぜ!

そんで、早速届いたので、起動する前に、いつも行う行事をしました。

Alienware01s ▲裏蓋をあけます

Alienware02s ▲HDDを取り出します

Alienware03s ▲これdo台セットと500GBHDDです

Alienware04s ▲バックアップします

〜〜〜

夜9時に届いたのですが、最初の3時間半はバックアップに費やされましたとさ。

アドビのCS4対応プリントショップのリストのページから、Google Mapsに表示させるやつの9回目。

前回は、HTMLからスクレイピングした内容をうまく置換して、住所とTELとFAXが混ざった文字列からそれぞれを切り出そうと試みましたが、失敗。そして、いつの間にか元のAdobe Creative Suite 出力対応店一覧がCS5対応になってしまっていたので、対応しなければ行けないなーて言うところまでやりました。

今回は、Adobe Creative Suite 出力対応店一覧を改めてサイトから取得し直して、そのHTMLから、整理したデータが取れるように書き換えてしまいます。


さて、いままで、アドビシステムズさんのサーバに負荷をかけないように、ローカルにHTMLを取得して、それをWeb::Scraperで解析していたのですが、アドビシステムズさんのページがかってにCS5対応のリストに変わってしまっていましたので、これを取得し直します。

Adobe Creative Suite 出力対応店一覧をGoogle Mapsで表示させる(5)

と同じように、wgetで持ってくればいいので、こんな感じで。

$ rm printshop.html
$ wget http://www.adobe.com/jp/print/printshop/ -O printshop.html

あと、今回取得したHTMLに対応したスクリプトを書きます。

Filename: test9.pl

#!/usr/bin/perl
 
use strict;
use warnings;
use utf8;
use Web::Scraper;
use YAML::Syck;
use Encode;
  
open my $fh, '<', 'printshop.html';
my $html = decode_utf8(do { local $/; <$fh> });
close $fh;
  
my $s = scraper {
    process '//div[@class="tabcontent"][1]//table[@class="data-bordered max"]/tbody/tr', 'codes[]' => scraper {
        process '//td[1]', pref    => [ 'TEXT', sub { s/\s//g; } ];
        process '//td[2]', company => [ 'TEXT', sub { s/\s//g; } ];
        process '//td[3]', address => [ 'TEXT', sub { s/\s//g; s/TEL:.+$//i; return $_; } ];
        process '//td[3]', phone   => [ 'TEXT', sub { s/\s//g; if(m/TEL:([\d-]+)/i){return $1;};}];
        process '//td[3]', fax     => [ 'TEXT', sub { s/\s//g; s/:/:/g; if(m/FAX:([\d-]+)/i){return $1;};undef;}]    ;
        process '//td[4]', illustratorcs5 => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
        process '//td[5]', indesigncs5    => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
        process '//td[6]', pdfx1a         => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
        process '//td[7]', pdfx4          => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
    };
};
 
my $scraped = $s->scrape($html);
print Dump($scraped);
  
exit;
 
__END__

実行結果はこんな感じ。

--- 
codes: 
  - 
    address: 北海道札幌市西区二十四軒2条6丁目1番8号
    company: 株式会社須田製版
    fax: 011-621-1500
    illustratorcs5: 1
    indesigncs5: 1
    pdfx1a: 1
    pdfx4: 1
    phone: 011-621-1000
    pref: 北海道
  - 
    address: 北海道札幌市白石区菊水2条1丁目4-27
    company: 正文舎印刷株式会社
    fax: 011-813-2581
    illustratorcs5: 1
    indesigncs5: 1
    pdfx1a: 1
    pdfx4: ~
    phone: 011-811-7151
    pref: 北海道
  - 
  ...
  - 
    address: 東京都板橋区志村1-11-1
    company: 凸版印刷株式会社情報・出版事業部
    fax: ~
    illustratorcs5: 1
    indesigncs5: 1
    pdfx1a: 1
    pdfx4: ~
    phone: 03-3968-5111
    pref: 東京都
  - 
    address: 東京都文京区小石川4-14-12
    company: 共同印刷株式会社
    fax: ~
    illustratorcs5: 1
    indesigncs5: 1
    pdfx1a: 1
    pdfx4: ~
    phone: 03-3817-2111
    pref: 東京都
  - 
  ...
  

FAXが無い会社は、undefを代入するようにフィルタ内でif文使って分岐してみました。

今回やってみてわかったんですが、アドビシステムズさんは、一覧ページの更新が手動なんですね。FAXとFaxが混在、コロンが全角と半角が混在しとるで……(フィルタ内で対応済み)

次回は、やっと住所が取得できましたので、ジオコーディングに挑戦したいと思います。

アドビのCS4対応プリントショップのリストのページから、Google Mapsに表示させるやつの8回目。

前回は、メインイベントのHTMLからスクレイピングした内容を確認し、文字列でYesなんて入っているところを、1かundefか、というとてもわかりやすい値に変換することをやりました。それを行うには、Web::Scraperでフィルタ機能というのがあって、無名関数で簡単にスクレイピングで得られた値を差し替えることが出来ることをやりました。

今回は、取得したデータのaddressというところに、住所と電話番号とFAX番号が混ざりすぎているので、ここからうまくそれぞれの項目に分離する、ということをやってみたいと思います。


さて、先回、取得したデータは、こんな感じでした。ちなみにこれはYAML::SyckのDumpになっています。

---
codes:
  -
    address: 北海道札幌市西区二十四軒2条6丁目1番8号 TEL:011-621-1000 FAX:011-621
-1500
    company: 株式会社 須田製版
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: 1
    pref: 北海道
  -
    address: 北海道札幌市北区北8条西8丁目TEL:011-747-8886 FAX:011-756-7971
    company: 北海道大学生活協同組合印刷 情報サービス部
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: ~
    pref: 北海道
  -
  ...
  -
    address: 大分県大分市碩田町2-2-13TEL:097-536-4111 FAX:097-538-1149
    company: 株式会社 双林社
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: ~
    pref: 大分県

addressという項目をみると、住所と電話番号とFAX番号が混ざっていますね。このままだと、ジオコーディングも出来ませんので、住所として成立するように分離したいと思います。ついでに、電話番号とFAX番号を独立した項目として取り出したいと思います。

さて、それを行うには、addressを取得するところに、フィルタで何かしてみればいいんじゃね?ていうことなんですけれども、いきなりWeb::Scraperで行うのも大変なので、簡単なテストスクリプトで試しましょう。

Filename: test7.pl

use strict;
use warnings;
use utf8;
binmode STDOUT => ':utf8';
my $address = "北海道札幌市西区○○号TEL:011-000-0000 FAX:011-000
-0001";
  
$_ = $address;
s/\n//g;
s/\s*?TEL:.+$//;
print;
print "\n\n";
  
$_ = $address;
s/\n//g;
s/^.+TEL:([\d-]+).+$/$1/;
print;
print "\n\n";
  
$_ = $address;
s/\n//g;
s/^.+FAX:([\d-]+).*$/$1/;
print;
print "\n\n";

実行結果

北海道札幌市西区○○号
 
011-000-0000
 
011-000-0001

あとは、Web::Scraperに組み込んでみますね。

Filename: test8.pl

 #!/usr/bin/perl
 
use strict;
use warnings;
use utf8;
use Web::Scraper;
use YAML::Syck;
use Encode;
  
open my $fh, '<', 'printshop.html';
my $html = decode_utf8(do { local $/; <$fh> });
close $fh;
  
my $s = scraper {
    process '//div[@class="tabcontent"][1]//table[@class="data-bordered max"]/tbody/tr', 'codes[]' => scraper {
        process '//td[1]', pref    => 'TEXT';
        process '//td[2]', company => 'TEXT';
        process '//td[3]', address => [ 'TEXT', sub { s/\n//g; s/\s*?TEL:.+$//; return $_; } ];
        process '//td[3]', phone   => [ 'TEXT', sub { s/\n//g; s/^.+TEL:([\d-]+).+$/$1/; return $_;}];
        process '//td[3]', fax     => [ 'TEXT', sub { s/\n//g; s/^.+FAX:([\d-]+).*$/$1/; return $_;}];
        process '//td[4]', illustratorcs4 => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
        process '//td[5]', indesigncs4    => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
        process '//td[6]', pdfx1a         => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
        process '//td[7]', pdfx4          => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
    };
};
 
my $scraped = $s->scrape($html);
print Dump($scraped);
  
exit;
 
__END__

実行結果はこんな感じ。

--- 
codes: 
  - 
    address: 北海道札幌市西区二十四軒2条6丁目1番8号
    company: 株式会社 須田製版
    fax: 011-621-1500
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: 1
    phone: 011-621-1000
    pref: 北海道
  - 
    address: 北海道札幌市北区北8条西8丁目
    company: 北海道大学生活協同組合印刷 情報サービス部
    fax: 011-756-7971
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: ~
    phone: 011-747-8886
    pref: 北海道
  - 
  ...
  - 
    address: 東京都文京区小石川4-14-12
    company: 共同印刷 株式会社
    fax: 東京都文京区小石川4-14-12TEL:03-3817-2111
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: ~
    phone: 03-3817-211
    pref: 東京都
  - 
    address: 東京都板橋区志村1-11-1
    company: 凸版印刷 株式会社情報・出版事業部
    fax: 東京都板橋区志村1-11-1 TEL:03-3968-5111
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: ~
    phone: 03-3968-511
    pref: 東京都
  - 
  ...
  

表記ぶれがあるので、この方法じゃあだめみたいだな、ということです。

次回は、もうちょっと場合分けを考えてみて、変なデータを拾わないようにしますね。あと、いつの間にかCS5対応のリストが出ちゃっていますが、やっぱりアドビさんのウェブサイトでは地図で出すという僕のアイディアが伝わっていないので、このまま作っていってみます。

PLAY STATION 3で、PCエンジンゲームアーカイブとして、グラディウスが売っていたので買ってみました。

んで、さすがに最近は反射神経が落ちてきているのですが、PCエンジンのゲームアーカイブだと、もともとセーブの無いゲームであってもPS3側で状態を丸ごとセーブできるので、要所要所でセーブしておけば、いくら反射神経だめでも脳みそやっつけることが出来るぞ!

装備はDOUBLEが強い。お勧め。

(2010-10-25 18:10追記) このエントリ内で直ったかのように見えたWinBookですが、1時間ぐらい使っているとやっぱり突然停止しちゃいました。やっぱゴミとるぐらいだと直らないんですかね……


最近Winbook WA3512Bが、Windows起動中に熱で落ちてしまうようになったので、頭にきて、Alienware M11xを注文しちゃったんですけれども、ちょっと思いついて、Winbookの裏ぶたを開けて、様子を見てみることにしました。

このマシンは、iPhone製造で有名になったFoxconn製なんですけれども、CPUとチップセットの上部に銅製のヒートパイプを配置し、マシンの隅に配した放熱フィン+空冷ファンで冷やしています。

んで、空冷ファンの隙間から、放熱フィンのほうを覗いてみたら、本来銅製のフィンが見えるはずなのに、今は見えなくなっています。ちょっとこじってみたら、ものすごい量の綿ぼこりが出てきました!

つまり、フィンに空冷ファンの風が通らなくなっていたわけです。どうりで、外部からファンで風をより多く送るようにしたのにやっぱり暴走するはずだ……

というわけで、ごみを除去したので、熱で落ちないマシンになっちゃいました。Alienware、2010/10/28まで今だけローン金利0%だからということで24回分割で申し込んじゃったんだよね。どうしよう……


Alienwareを購入するコツ:まず下のリンクからスペックと価格を見てから、次に家電量販店に行ってみよう。僕はヨドバシカメラに行ったんですけれども、スペックと価格を見比べると、ALIENWAREのほうが安いように見えてくる不思議!


Alienware M17x
Alienware M17x
2009/6/3発売
パワーと速度を兼ね備えたAlienwareブランドの17インチノートパソコン! 超高性能CPU&最高レベルのグラフィック性能で、ゲームや大量のプログラムも超高速で処理が可能!ハードコアゲーマーに最適の一台です。


Alienware M15x
Alienware M15x
2009年9月発売
世界で一番パワフル な15インチゲーミングノートパソコン!


Alienware M11x
Alienware M11x
2010年2月発売
モバイルサイズ&ゲーミングマシンのAlienwareシリーズノートパソコン!場所を選ばずに本格ゲームを楽しめる異次元11インチノート。

参考:

新潟市で開催されたCSS Nite in NIIGATA vol.2に行ってきました。

当初、同日に東京で開催されるDTPの勉強会に出ようかと思ったんですけれども、12月に予定されている日本学生支援機構から借りた奨学金の返済金を用意するには、東京に行ってられないので、地元で開催されるCSS Niteにしました。

実は、その後OSC2010 NIIGATAが同日に開催されることが判明し、こちらは参加費無料なんで、しまったこっちにすればよかったとか思ったけれども、こっちは会場が新潟大学五十嵐キャンパスということで、交通の便があり得ないほど悪いとことなので(自動車だとね)、行くのをやめた次第。

CSS Niteですが、益子さんのHTML5+CSS3の講義は、社内でWeb制作の教育訓練を担当したりしなかったりすることがある僕にとっては有益でした。

今後もこういう機会があれば参加したいなあと思います。

よく飯を食いにいくお店の親父が、「ろくる」とか言って意味が分からなかったので、「なんですかその在郷の言葉みたいなの?」ていうたらば、「あほたれ、これは死ぬって言う意味だ。死体のことをおろくって言うんだぞ。」というので、またまたーそんなわけないだろって思ったけれども調べてみたらあった。

登山用語集「あ」

【おろく】{s}
遺体を意味する俗語。語源は「南無阿弥陀仏」の6文字からなど諸説ある。派生語に【ろくる】=死ぬ【ろくった】=死んだ、などがある。

登山用語だって。親父あんたアルピニストかよ。

次に、「長シャリ」って調べてみろって言われたので、調べてみた。

刑務所用語

★長シャリ:うどん、そば、ラーメンなどの麺類のこと

今度は刑務所用語。親父あんた入ったのかよ!

最後に調べろって言うのは、「おかるでかんたくれるぞ」っていう文。意味は、「2回で昼寝するぞ」何だそうですけれども、これはどこの業界の言葉なんだろうね……

よく、Webブラウザのスクリーンショットを撮りたくなったとき、何となくきりのいい大きさ(例えば800×600pxなど)にしたくなったりしませんか?

と言うわけでそういうときのおまじないです。どこかで既出ですけれども。

方法:

URLが表示される、ロケーション欄がたいていのWebブラウザに付いていると思いますが、そこに以下の通り入力。

javascript:window.resizeTo(800,600)

これだけです。みての通り、JavaScriptで指定していますのでJavaScript対応のWebブラウザでどうぞ。あと、効かないブラウザがあったり(Operaとか)、表示倍率を変更しているとサイズが狂うブラウザ(Firefoxなど)もありますので、ブラウザの癖を見越して使ってください。

これで、ブラウザのスクリーンショット撮影は怖くなくなったね!

Twitterでつぶやいている印刷関連、DTP関連の人が増えてきたなーという印象があります。

Twitterは、使い方を他人に強制されないツールなのが特徴ですが、周辺サービスを合わせて使うとさらに楽しめます。今回は、その中でも、「ふぁぼったー」と「Favstar.fm」を紹介します。

これらは、両方とも「自分の発言を、他の人が『お気に入り』にしてくれた様子が分かる」というものです。

国産の被お気に入り(FAVS)数表示:ふぁぼったー

日本で作られている被お気に入り数表示サイトです。とりあえず、自分のTwitterアカウント名(screen name)を入れるといいよ。

Favotter

外国産の被お気に入り(ふぁぼられ)数表示:favstar.fm

外国の被お気に入り数表示サイトです。とりあえず、自分のTwitterアカウント名(screen name)を入れるといいよ。

Favstar


こういうサイトで、何を見るかっていうと、

「自分が面白いこと書いたときどれだけ他の人が反応してくれたか」

ということを見るんですよ。

DTP界隈で、Twitterの「お気に入り」機能が活用されていないようだったので、取り上げてみました。とりあえず、自分のTwitterアカウント名をふぁぼったーに入れてみるところから始めてみようぜ!

先日M.C.P.C.: 三菱コルトLimitedコンフォートパックのスピーカーをTS-J1610Aに交換したよ!にて、フロントドアについていたスピーカーを交換したのですが、このクルマ、リアドアにスピーカー設置用の穴は用意されているが、スピーカー自体はオプション装備となっています。したがって、この前余ったフロントドアから外したスピーカーを、リアドアにつけます。

昔乗っていた外車と違って今回は近くにディーラーさんがあるので、とりあえずディーラーさんの営業さんに「どうすればいい?」と聞いてみたものの的外れの回答だったので、それを受けて自分でつけることにしました。

とはいえ今回はよる9時ごろに人気の少ないショッピングセンターの駐車場で作業したので、写真は撮っていないんですけれども、ともかくポイントを。

コルトのスピーカーがオプションになっているタイプでは、内張りをはがしたあとのドアにスピーカー用のホールがありますが、取付ビスをはめる場所が四角く穴があいているだけで、このままじゃあ取付できません。そこで、四角穴用のグロメットを買ってきます。

Clip
▲イエローハットで買ったグロメット(5個入り×2袋、8個使った)

グロメットは、防水ビニールシートの上からえいやっと差し込んでしまってオッケイです。

スピーカーの配線などは来ていますので、後はビスで留めて配線するといっちょあがりです。

これで、後ろの席でも音が鳴るようになったよ。乗る人いないがな!

値段は、357円×2袋の714円です。

ダムる。

| コメント(0) | トラックバック(0)

僕は地縁とか全くないところの印刷会社に就職するという、地方の印刷屋さんではあまり無い就職の仕方をしていまして、地縁は無かったのですがこちらの方に来てから親のように面倒を見てくれている地元の人がいまして、今日はそのこちらの親のような人に親孝行をしようと思ってダム方面にドライブしてピクニックしてきたよ。

Dam01
▲見えてきた

Dam02
▲重力式コンクリートダム。ルパンならあるいは……

Dam03
▲境界線

Dam04
▲上流

Dam05
▲下流

Dam06
▲これはくさい。

Dam07
▲ほかにも人来てたよ。

Dam08
▲くもモクモクしとった

うちの実家の方は島なんであんまりでかい川もなくて、ダムがあったかどうかも印象無かったのですが、今回初めてダムに来て楽しかったです。今日は天気もよくてよいピクニック日和でした。くさい虫さえいなければなー。

(2016-03-02追記)Twitter APIが鬼のように変更が入っていて、この記事を書いたと2010年10月ではユーザ認証なしに使えていたTwitter Search APIが、2013年6月12日にTwiiter API 1.0が廃止されて以降現在ではTwitter API 1.1によるOAuth認証下でしか使えなくなっています。また、ここで紹介したスクリプトプラグインをそのままリンクしてTimeline表示していた方もいらっしゃったようなのですが、その後お元気でいらっしゃるでしょうか? ともかく、現在ではこのエントリに書かれたとおりにやっても動作しませんので予めご了承ください。

この前書いたjQueryを使ったTwitter Searchをべろべろーっと表示させるJavascriptなんですけれども、jQueryのプラグインになるように書き直してみたよ。

#cho_ag

#agqr

以下ソース。

Filename: jquery_showTwitter.js

( function( $ ) {
  $.fn.showTwitter = function( options ) {
    var defaults = {
      freq: 60000
    };
    var setting = $.extend( defaults, options );
    setting.id = Math.random().toString().replace( '.', '' );
    setting.innerId  = 'tw' + defaults.id;
    var method = {
      start: function( item ) {
        setting.target = $('<ul>').attr('id', setting.innerId );
        setting.target.appendTo( item );
        return;
      },
      show: function ( f ) {
        var d = new Date;
        d.setTime( Date.parse( f.created_at ) );
        var datestrings = (
          d.getFullYear () + '/'
          + ( '0' + ( d.getMonth() + 1) ).slice(-2) + '/'
          + ( '0' + d.getDate   () ).slice(-2) + ' '
          + ( '0' + d.getHours  () ).slice(-2) + ':'
          + ( '0' + d.getMinutes() ).slice(-2) + ':'
          + ( '0' + d.getSeconds() ).slice(-2)
        );
        f.user.from_user.replace('<', '&lt;');
        f.user.from_user.replace('>', '&gt;');
        f.text.replace('<', '&lt;');
        f.text.replace('>', '&gt;');
        var s = $(
          '<li />',
          {
            css  : { display: 'none' },
            html :
                  '<a class="stream-item-wrapper" '
              +   'href="http://twitter.com/#!/' + f.from_user
              +   '/status/' + f.id_str + '" target="_blank">'
              +   '<img class="user-profile-link" '
              +     'width="48" height="48" src="'
              +     f.profile_image_url + '" />'
              +   '<span class="tweet-content">'
              +     '<span style="display: block;">'
              +       '<span class="tweet-user-name">'
              +         f.from_user
              +       '</span>&nbsp;'
              +       '<span class="tweet-text">' + f.text
              +       '</span>'
              +     '</span>'
              +     '<span class="tweet-date">' + datestrings
              +     '</span>'
              +   '</span>'
              + '</a>'
          }
        ).addClass('stream-item').prependTo( setting.target );
        s.slideDown('slow');
        $( setting.target ).children()
          .slice( setting.data.rpp ).remove();
        return;
      },
      getJSONP: function ( f ) {
        var data = setting.data;
        if ( typeof f != 'undefined') {
          data.since_id = f;
        }
        $.ajax({
          type: 'GET',
          url : 'http://search.twitter.com/search.json',
          data: data,
          dataType: 'jsonp',
          success : function( data, status ) {
            method.callback( data );
          }
        });
        return;
      },
      callback: function ( f ) {
        setting.max_id = f.max_id_str;
        if ( typeof f.results != 'undefined' ) {
          $.each( f.results.reverse(), function( i, item ) {
            method.show(item);
          });
        }
        return;
      }
    }
    this.each(function() {
      method.start(this);
      method.getJSONP();
      setting.timerId = setInterval(
        function() { method.getJSONP( setting.max_id ); },
        setting.freq
      );
    });
    return this;
  };
}) ( jQuery );

Filename: index.html

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Twitter Realtime</title>
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <meta http-equiv="Content-Style-Type"  content="text/css" />
    <link rel="stylesheet" href="//yui-s.yahooapis.com/2.8.0r4/build/reset-fonts-grids/reset-fonts-grids.css" type="text/css" />
 
    <script type="text/javascript"
      src="//ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" src="jquery_showtwitter.js"></script>
    <script type="text/javascript">
    // <[CDATA[
    $(function() {
      $('#twitterzone').showTwitter({
        data: { q: '#cho_ag', rpp: 4, lang :'ja' } }
      );
      $('#twitterzone2').showTwitter({
        data: { q: '#agqr', rpp: 4, lang :'ja' } }
      );
    });
    // ]]>
    </script>
    <style type="text/css">
    #twitterzone ul {
      background-color: #f7f7ff;
      height: 276px;
      overflow: hidden;
      border-top: 1px solid #ebebeb;
    }
    #twitterzone2 ul {
      background-color: #fff7f7;
      height: 276px;
      overflow: hidden;
      border-top: 1px solid #ebebeb;
    }
    li.stream-item {
      border-bottom: 1px solid #ebebeb;
      clear: both;
    }
    li.stream-item a.stream-item-wrapper {
      display: block;
      padding: 10px 20px 10px 20px;
      position: relative;
      text-decoration: none;
    }
    .stream-item img {
      float: left;
    }   
    .stream-item .tweet-user-name {
      font-weight: bold;
      float: left;
      color: black;
    }   
    .tweet-content {
      display: block;
      margin-left: 58px;
      min-height: 48px;
      color: black;
    }   
    .tweet-date {
      color: #666;
      font-size: 86%;
    } 
    </style>
  </head>
  <body>
    <div id="doc" class="yui-t7">
 
      <div id="hd"><h1>Twitter Realtime</h1></div>
      <div id="bd">
        <div class="yui-g">
          <!-- YOUR DATA GOES HERE -->
 
          <div id="twitterzone">
            <p>#cho_ag</p>
          </div>
 
          <div id="twitterzone2">
            <p>#agqr</p>
          </div>
 
        </div>
 
      </div>
      <div id="ft"><p>---</p></div>
    </div>
 
  </body>
</html>

極端な話、最低限

<script type="text/javascript"
  src="//ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="jquery_showTwitter.js"></script>
<script type="text/javascript">
// <[CDATA[
$(function() {
  $('#twitterzone').showTwitter({
    data: { q: '#cho_ag', rpp: 4, lang :'ja' } }
  );
  $('#twitterzone2').showTwitter({
    data: { q: '#agqr', rpp: 4, lang :'ja' } }
  );
});
// ]]>
</script>
<div id="twitterzone"></div>
<div id="twitterzone2"></div>
で動きます(jqueryプラグインは自分のサーバに設置しよう)。

検索ワードの設定が

      $('#twitterzone').showTwitter({
        data: { q: '#cho_ag', rpp: 4, lang :'ja' } }
      );

のように出来るのですが、たとえば自分の発言を表示させたい、というのであれば、

      $('#twitterzone').showTwitter({
        data: { q: 'from:CLCLCL', rpp: 4, lang :'ja' } }
      );

で表示できます。

jQueryのプラグインの作り方 | Coder's Note [codersnote.com]

を参考にしました。

(2011-01-25 22:32修正) f.id→f.id_str setting.max_id = f.max_id; → setting.max_id = f.max_id_str; に修正。Twitterのstatus IDが64bit化した際に従来のJSONのパースでは64bit値を整数として扱えなかったため、新たに導入されたid_str、max_id_strを使うように修正。

【隠れた名作】この5年間、毎月1000本以上ずっと売れてるゲームソフトがあるらしい : オレ的ゲーム速報@刃 [jin115.com]

僕PC版の空の軌跡(FC)予約して買ってインスコして最初1時間ぐらいやったあとプレイしていないわー!

やってみようかな。てか、PSP版英雄伝説IVが4年ぐらいかけてまだ解けてないんだよな!

印刷屋さんって飲み屋さんで飲んでいると、一緒に飲んでいる方の印刷物を頼まれることってありますよね。

今回は、喪中はがきを頼まれました。

そんで、昔は喪中はがきとか作っていたんだけれどもここ最近とんと見ていなかったので、デザインと稼働だったっけと思っても何となくしか思いつかないので、急いでローソンに走ると、喪中はがきキャンペーンのチラシがあったので参考にするなど。

しかし最近の喪中はがきはいちいちカラーになっていて贅沢な気がするよね……

ここまでやったらjQueryのプラグインにすればいいんじゃねえかとは思うがめんどくせえ。あとJavascriptの書き方のスタイルが古くさいとかいうのはそのうち勉強し直します......

ソース。放課後うちで作ったやつだから会社で使ったりしてもほかの人が使ったとしても問題あるめえ。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
  <head>
    <meta http-equiv="Content-Type"
      content="text/html; charset=UTF-8" />
    <title>Twitter Realtime</title>
    <meta http-equiv="Content-Script-Type"
      content="text/javascript" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <link rel="stylesheet" href="//yui-s.yahooapis.com/2.8.0r4/build/reset-fonts-grids/reset-fonts-grids.css" type="text/css" />
 
    <script type="text/javascript"
      src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
    <script type="text/javascript">
    // <![CDATA[
    var Tw = function( f ) {
      this.id = new Date().getTime();
      this.targetId = f.targetId;
      this.freq     = f.freq;
      this.data     = f.data;
      this.innerId  = 'tw' + this.id;
      var html = '<ul id="' + this.innerId + '"></ul>';
      $(function() {
        $( '#' + f.targetId ).append( html );
      });
      return;
    };
    Tw.prototype = {
      show: function ( f ) {
        var self = this;
        var target = '#' + self.innerId;
        var d = new Date;
        d.setTime( Date.parse( f.created_at ) );
        var datestrings = (
          d.getFullYear () + '/'
          + ( '0' + ( d.getMonth() + 1) ).slice(-2) + '/' 
          + ( '0' + d.getDate   () ).slice(-2) + ' ' 
          + ( '0' + d.getHours  () ).slice(-2) + ':' 
          + ( '0' + d.getMinutes() ).slice(-2) + ':' 
          + ( '0' + d.getSeconds() ).slice(-2)
        );
        var s = $(
          '<li />',
          {
            css  : { display: 'none' },
            html :
                '<a class="stream-item-wrapper" '
              +   'href="http://twitter.com/#!/' + f.from_user
              +   '/status/' + f.id + '" target="_blank">'
              +   '<img class="user-profile-link" '
              +     'width="48" height="48" src="'
              +     f.profile_image_url + '" />'
              +   '<span class="tweet-content">'
              +     '<span style="display: block;">'
              +       '<span class="tweet-user-name">'
              +         f.from_user
              +       '</span>&nbsp;'
              +       '<span class="tweet-text">' + f.text
              +       '</span>'
              +     '</span>'
              +     '<span class=tweet-date>' + datestrings
              +     '</span>'
              +   '</span>'
              + '</a>'
          }
        ).addClass('stream-item').prependTo ( target );
        s.slideDown('slow');
        $( target ).children().slice( self.data.rpp ).remove();
        return;
      },
      callback: function ( f ) {
        var self = this;
        self.max_id = f.max_id;
        $.each( f.results.reverse(), function( i, item ) {
          self.show(item);
        });
        return;
      } ,
      getJSONP: function ( f ) {
        var self = this;
        var data = self.data;
        if ( typeof f != 'undefined') {
          data.since_id = f;
        }
        $.ajax({
          type: 'GET',
          url : 'http://search.twitter.com/search.json',
          data: data,
          dataType: 'jsonp',
          success : function( data, status ) {
            self.callback( data );
          }
        });
        return;
      },
      start: function() {
        var self = this;
        $( function() {
          self.getJSONP();
          self.timerId = setInterval(
            function() { self.getJSONP( self.max_id ); },
            self.freq
          );
        });
        return;
      }
    };
    // ]]>
    </script>
    <script type="text/javascript">
    // <![CDATA[
    var t = new Tw({
      targetId: 'twitterzone', 
      freq:      60000,
      data: { q: '#agqr', rpp: 4, lang :'ja' } }
    );
    t.start();
    // ]]>
    </script>
    <style type="text/css">
    #twitterzone ul {
      background-color: #f7f7f7;
      height: 276px;
      overflow: hidden;
    }
    li.stream-item {
      border-bottom: 1px solid #EBEBEB;
      clear: both;
    }
    li.stream-item a.stream-item-wrapper {
      display: block;
      padding: 10px 20px 10px 20px;
      position: relative;
      text-decoration: none;
    }
    .stream-item img {
      float: left;
      border: 0px;
    }   
    .stream-item .tweet-user-name {
      font-weight: bold;
      float: left;
      color: black;
    }   
    .tweet-content {
      display: block;
      margin-left: 58px;
      min-height: 48px;
      color: black;
    }   
    .tweet-date {
      color: #666;
      font-size: 86%;
    } 
    </style>
  </head>
  <body>
    <div id="doc" class="yui-t7">
 
      <div id="hd"><h1>Twitter Realtime</h1></div>
      <div id="bd">
        <div class="yui-g">
          <!-- YOUR DATA GOES HERE -->
 
          <div id="twitterzone">
          </div>
 
        </div>
 
      </div>
      <div id="ft"><p>---</p></div>
    </div>
  </body>
</html>

iPhone用ラブプラスiM/iN/iRアップデートしてみたよ!

Ipadrinko01
▲バージョンアップ前(クリックで拡大)

Ipadrinko02
▲バージョンアップ後(クリックで拡大)

DTPの勉強会とかに出かけるときにiPadにラブプラスiRを入れておくと、おじさんたちに凛子をいじられまくるので注意です!

いまJQueryを使ってTwitterの内容をぴろりん、ぴろりんとWebに表示するやつを作っているんです。会社で開発すると外に出せないのでうちで作っているんですけれども、とりあえずJQueryでぴろりん、ぴろりんと表示を下に押し出すところは出来ましたので、じゃあデータ取得部はまああとにするとして、デザインをTwitterに真似るかーと思ってNewデザインになったTwitterのウェブのソースをFirebugで見てみたら、違和感を感じて、よーく考えてみたら、

  • 古いTwitterはタイムラインはリスト要素で出来ている
  • 新しいTwitterではタイムラインはdiv要素で出来ている

ということに気づいたのだが、大勢には影響なく、そのままHTMLをパクるとかえって面倒くさいことがわかったので、自分で構造作ることにしたよ。

div要素なのはなんでなのかな? おそらくホーム画面のタイムラインの構造は、SEOとかには全く関係ないからdiv要素にしたのかな?

この前買ったクルマ三菱コルトLimitedコンフォートパックのスピーカーを交換したくなったので、CarrozzeriaのTS-J1610Aという16cm・コアキシャル 2Wayスピーカーを入手して、つけてみました。

2Wayスピーカーというと、ウーファーとツイーターが別のタイプが人気ですが、コルトの場合、ドアスピーカーの位置がわりかし高い位置に付いているので、スピーカーの音がダイレクトに耳に届くと判断し、また、コルトのダッシュボードが広々しているのでかえって何も置きたくないものですから、1つのスピーカーでウーファーとツイーターが付いているコアキシャルタイプにしました。

以下写真の連続。みんカラみたいだ。

①運転席側の内ばりを外した図。外し方はみんカラでも見ろ。

Coltspeaker_01

②最初から付いてきたスピーカーはこんなの。高音が弱い。これはいつの日か後ろのドアのスピーカーホールにつけるんだ。(コルトLimitedコンフォートパックは2スピーカーなので、後ろのスピーカーは付いていないんです)

Coltspeaker_02

③いきなり助手席側に飛ぶが、取り付け途中の図。ちなみに、コルトの場合、スピーカーの付属品では接続が出来ない。付属品を加工(破壊)して、コルトのスピーカーコネクタに合うようにする必要があるぞ。あと、クルマ用品屋さんで売っている三菱車用スピーカー接続変換ケーブル(T型)も使えないぞ!

Coltspeaker_03

④装着して内ばり戻した図。スピーカーのところをみると、穴ぽこの流れの延長線に搭乗者の耳がくるので、スピーカーのツイーターをそっちの方向に向けておいた方がいいぞ。

Coltspeaker_04

⑤スピーカーの部分の拡大。内ばりを戻す前にツイーターの向きを合わせておかないとだめなので注意です。

Coltspeaker_05

確実に鳴りはよくなったが特性とか測っていないので、FFTで解析すればいいのかな? MATLAB使えばいいのかな?(←MATLAB脳)

〜〜〜

以下のものを使ったよ。

10/13発売なので。

future gazerって「未来を見つける人」って言う意味らしいよ。今こむちゃっとカウントダウンで言ってた。

フュージャネイザンについては、fusianasanをWipikediaで引っ張ってみてくださいな。

会社から指示があって、お酒の試飲会に参加しろって言われたんですけれども、今日は納品をしなくちゃ行けない日でものすごい量の納品をしたあと家に帰ってクルマおいてから会場に歩いていったらマジで会場5分前だったのですけれどもほかの会社の人来てなかった。ナンテコッタ!

んで日本酒会社主催の会だったので液体はみな日本酒でつらい人はつらそうだった。

んで、抽選会があって僕は大吟醸のお酒が当たった!

ということで、今度うちの部署で飲み会するときに提供することにしました。

このブログにも書いているかもしれないけれども2年前はニットの服が当たったんですよね……

いま業務でウェブサイトの作り方という教育訓練を受け持っているんですけれども、せっかくなんでこれからの時流を考えてHTML5のこともやらなきゃなーと思ったのだけれども、僕自身よくわからんかったので困っていたところ、はてなブックマークで丁度そんなエントリがあがっていたなーと思って使ってみた。

HTML5+CSS3 入門 | yoppa org [yoppa.org]

ものすごく単純化された説明だったので、うまく理解してくれたようでした。お勧めです。

しかし、僕の業務って今Web作りじゃないんですよね、厳密にいえば。僕が教えていいのかというのは常に考えるところですね……

Mac OS XやUNIX系で文字コード変換するときは、コンソール(Mac OS Xだったらターミナル)から、iconv使うと便利。

iconvは、UNIXのテキスト処理環境では標準(POSIX規格)の文字変換コマンドなので、Mac OS XやらLinuxやらを行ったり来たりする人は「アイコンブ」って覚えておくとよいです。

Windowsはどうしているの? ていうかもしれませんが、秀丸あるし、WindowsからPuTTYでLinuxにログインしてLinux側で処理することが多いので……

使い方は、

$ iconv -f cp932 -t utf8 source.txt > dist.txt

です。-f は fromで、元のテキストの文字コード、-t は、toで、変換先の文字コードです。これも覚えやすいのでいいと思います。cp932というのは、「シフトJISを指定するときにはこうする」と覚えたほうがもう幸せかもしれない。

今いる工場って最初に配属された場所だったんだけれども一回別の工場に行ってまた戻ってきているんですけれども、今日たまたま荷物用エレベーターの1階ところで荷物の検品していたんですが、エレベーターのほうからインターホンで話しかけられて初めてそのインターフォンがアイホンだって気付きました。

アイホン、iPhoneの商標問題でAppleと「友好的合意」 - ITmedia News [www.itmedia.co.jp]

話題の製品って結構身近にあるもんだなーとか思いました。ホーチキツケテ!(←何となく)

たまに気になるGoogle PageRank。できればまとめて取得したいってんでこういうの。

Filename: pagerank.pl

#!/usr/bin/perl
 
use strict;
use warnings;
use WWW::Google::PageRank;
 
my @urls = (
   'http://dtpwiki.jp/',
   'http://blog.dtpwiki.jp/',
   'http://www.dtpwiki.jp/',
   'http://ranking.dtpwiki.jp/',
);
 
my $pr = WWW::Google::PageRank->new;
foreach my $url ( @urls ) {
  my $pagerank = $pr->get( $url );
  print "$pagerank\t$url\n";
  sleep 5; # 5秒待ち
}
exit;
$ perl pagerank.pl
3       http://dtpwiki.jp/
2       http://blog.dtpwiki.jp/
1       http://www.dtpwiki.jp/
2       http://ranking.dtpwiki.jp/
$

んで、どっかで正規表現とかの授業やったらしいので、上記のスクリプトのURLリストを、Googleで検索した後のソースから生成するような訓練すると上達すると思う。秀丸ならGrepして置換することになるよね。

最近クレジットカードのETCカード作ったんだけれども、使ってみたくなったので、ちょっくら乗ってみました。

今まではフツーのクレジットカード使っていたんですけれども、有人の料金所で入場券とETCクレジットカード渡したら何事もなく払えた。

ちなみに、僕が乗る高速道路区間は、料金が1000円以下だったり無料試験中だったりするので、ETC車載器載せる意味がない状態なんだけれども、さっさと取り付けたい気もするので悩み中だったり。

最近、WinBookの調子が超絶悪くなってきて、買い替えようかなーと思っていて目を付けていたDELLのStudio 15のCore i7版89,800がもうなくなってしまったので、いよいよMac Bookに入れたBoot CampパーティションをVMware Fusionで動かす機会が増えて参りました。

そんで、このまえVMware Fusion 2から、VMware Fusion 3にアップグレードしたわけなんですけれども、2の時は起動するときに必ず2回表示されていた認証ダイアログが、3になってからはでないことに気づいた(最初の1回はやったかもしれない)。

Macのユーザアカウントをしっかり管理していて、さらにWindowsを起動する機会が多い人は、2から3にアップグレードする意味があるかと思いました。

んで、VMware FusionでWindows起動して何しているかっていうと、超A&Gのデジタルラジオを聞いているわけなんですけれども……(Windows Media PlayerのDRMがかかっているのでMacだと聞けないんですよね)。

Amazonでカーナビ用のステアリングリモコンCD-SR200を頼んでいたのですが、佐川急便さんが21時30分に届けてくれた! ありがとう!

早速夜だというのに取り付けたよ!

Naviremotecontrollers
▲多い日も安心(走行中シチュエーションが)

うちのナビはHDD(1DIN)+オーディオメインユニット(1DIN)だったのですが、このリモコンで両方操作できるのでとってもよいです。

しかし、クルマで出かけていく用事がないんですよね……

月別 アーカイブ

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.2.7

このアーカイブについて

このページには、2010年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2010年9月です。

次のアーカイブは2010年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。