2008年9月30日火曜日

suz-labの英語サイト

スズキです。

下記が表記の英語サイトです。
http://translate.google.com/translate?hl=ja&langpair=ja|en&u=http://suz-lab.blogspot.com/

メモリークラフトのマネです。
http://www.memorycraft.jp/
http://translate.google.com/translate?hl=ja&langpair=ja|en&u=http://www.memorycraft.jp/

ちゃっかりタイトル下に、リンクもつけときました。
(そこもメモリークラフトのマネです)

--
http://suz-lab.blogspot.com/

2008年9月29日月曜日

超概算/概算/確定見積り

スズキです。

書評はまだですが、今、こんな本を読んでいます。
"Webプロジェクトマネジメント標準 PMBOK(R)でワンランク上のWebディレクションを目指す"
http://astore.amazon.co.jp/iretsuzusblog-22/detail/4774135992

この、82ページに"見積り"に関する内容が書かれており、
下記、3種類の見積りを定義していました。

【超概算見積り】
精度: -50%~+100%
--------
今の仕事の仕方だと、とりあえず概要聞いて、
金額感を相手に即答するときに使う見積りかな?

【概算見積り】
精度: -25%~+50%
--------
今の仕事の仕方だと、インプットは超概算見積りと同じで
持ち帰って、作業内容を類推・精査して作成した見積りかな?

【確定見積り】
精度: -5%~+10%
--------
今の仕事の仕方だと、仕様が文面でFIXされたときに
工数を精査して出せる見積りかな?

今後は、この指針で"見積り"という言葉を使っていこうと思います。

--
http://suz-lab.blogspot.com/

"Google Ajax API"で"Google Maps API"

スズキです。

以前紹介した、"Google Ajax API"にのっとって、
http://suz-lab.blogspot.com/2008/07/google-ajax-api.html
"Google Maps API"を使うサンプルです。

詳しくは、こちらのお話です。
http://code.google.com/intl/ja/apis/maps/documentation/index.html#AJAX_Loader

--------
<head>
  <meta http-equiv="Content-Type"
      content="text/html; charset=utf-8" />
  <title>Google Maps API</title>
  <script type="text/javascript"
      src="http://www.google.com/jsapi"></script>
  <script type="text/javascript">
    google.load("jquery", "1");
    google.load("maps", "2");
    google.setOnLoadCallback(function(){
      var map = new google.maps.Map2(
        $("#map")[0]
      );
      map.setCenter(
        new google.maps.LatLng(37, -122),
        13
      );
    });
  </script>
  <style type="text/css">
    #map {
      width : 300px;
      height: 300px;
    }
  </style>
</head>
<body><div id="map">地図</div></body>
--------
※インデントは全角スペースを用いています。

ついでにストリート ビューも試しとくか。
http://code.google.com/intl/ja/apis/maps/documentation/services.html#Streetview

--
http://suz-lab.blogspot.com/

$("#id").get(0) = getElementByID() !?

スズキです。

よく"Google Maps API"のサンプルで、
new google.maps.Map2(document.getElementById("map"));
というgetElementByIdを使ったものが紹介されてます。

僕は、JavaScriptが絡むと、すぐにjQueryを入れてしまう人なので、
このgetElementByIdを$("#id")...でできないかなー、
とすぐ考えてしまいます。

で、下記のようにそれっぽいのを試してみました。

new google.maps.Map2($("#map")); // NG
new google.maps.Map2($("#map").get()); // NG
new google.maps.Map2($("#map").get(0)); // OK
new google.maps.Map2($("#map")[0]); // OK

ポイントは$("#map")、$("#map").get()の戻り値は配列なので、
インデックスを指定する必要があるってことでしょうか?

これで、getElementByIdが一掃できる!

--
http://suz-lab.blogspot.com/

2008年9月28日日曜日

(書評) リズムで学ぶ三文字中国語―iPod徹底活用!

スズキです。

今、中国語の勉強に使っている書籍です。
http://astore.amazon.co.jp/iretsuzusblog-22/detail/4757412193

50個の三文字フレーズを見出しに、関連のある文法、例文、
その他のフレーズなど2ページにコンパクトにまとまめています。

また、タイトルにもあるように、iPodで閲覧できるムービーとして、
上記50個のフレーズが収められているので、目、耳から
効果的にインプットできる教材になっています。

しかし、このムービーはiPod専用というわけではなく
MP4のフォーマットとなっており、対応しているプレーヤーなら、
何でもOKということになります。
(私はビデオ対応ウォークマンで閲覧しています)

その他にも、MP3の音声のみや、テキストファイルもあり、
デジタルデータは十分すぎるほど用意されています。

あとは、内容を頭の中に叩き込むだけです。
(今週、集中してやろう!)

ギリギリ間に合った...

--
http://suz-lab.blogspot.com/

2008年9月27日土曜日

DropBox 0.6.402 & 50Gにアップグレード

スズキです。

ようやくDropBoxが50Gにアップグレードできるようになりました。
http://www.getdropbox.com/
早速、アップデートです。

"ログイン" → "Account(上部メニュー)" → "Account Type"
を選択して、"Quota Info"の"Account type"横のupgradeリンクから、
アップグレードの設定に行くことができます。

当然有料で、毎年$90.00もしくは毎月$9.99となってます。
(僕は毎年$90.00にしました)

また、DropBoxのアプリケーションも0.6.402に更新されていたので、
こちらもすぐにアップデートしました。
http://forums.getdropbox.com/topic.php?id=3394&replies=92
いろいろBugFixされてる感じでしょうか?

これで、ポータブルセットフルセットと、
それベースで使われるデータ一式がすべてDropBox化できます!

その分、使ってない有料サービス、解約しなければ...

--
http://suz-lab.blogspot.com/

S2Flex2でセッションを利用

スズキです。

久しぶりのS2Flex2案件のメンテナンス、
すっかり、S2Flex2のこと忘れてました。

調べながらだんだん思い出してきて、
そういえば、export、importとかがキーワードだったなー、
ってことでググってみると、下記の有用な情報が見つかりました。

▼利用できるアノテーション
http://s2flex2.sandbox.seasar.org/ja/annotation.html

▼[S2FLEX2]データのセッション格納について
http://www.fxug.net/modules/xhnewbb/viewtopic.php?viewmode=flat&topic_id=1014&forum=15

上記読んで、後は実験です。
早くしないと、CTOA日記に怒られる...
http://blog.livedoor.jp/hiroki0907/

--
http://suz-lab.blogspot.com/

2008年9月26日金曜日

今日のブックマーク 09/26/2008

(書評) 弾言 成功する人生とバランスシートの使い方

スズキです。

早速、今日発売された「弾言」を読んでみました。
http://astore.amazon.co.jp/iretsuzusblog-22/detail/4757215339

実は小飼弾さんは僕のロールモデルです。
(なのに「アルファギークに逢ってきた」はまだ読んでない...)

まずは目次です。
--------
【1. ヒト part1 自分の価値を「見える化」してレベルアップ】
【2. カネ 相互理解のツールとして戦略的に使いこなす】
【3. ヒト part2 ネットワークにおける自分の価値をアップする】
【4. モノ 「本当は所有できない」ということを理解する】
--------
目次の詳細はこちら(ほとんど一緒)
http://www.amazon.co.jp/gp/product/toc/4757215339?tag=iretsuzusblog-22

目次の通り、この本は、ヒト、モノ、カネの枠組みでまとめられており、
このヒト、モノ、カネとタイトルにあるバランスシートを、おなじみの

資産 = 負債 + 資本

の関係に

カネ = モノ + ヒト

の関係を対応づける形で関連させています。

この考え方は、
自分の状態をあたかも会社の財務諸表を見るように
分析できそうなので、まあ、そこそこ財務諸表を見てきた
僕的には実践しやすいかな?と思っています。
(同時に分析力も、もっと磨かないといけませんが...)

その他、とりあえず実践してみたい弾言は以下の通りです。

・時間がちょっとでも空いたら、本を読め
・何かを身につけるには、しないことが苦痛になるまで習慣化せよ
・チャンスに備えて、お金の余裕より時間の余裕を作れ
・カネは、バランスシートで考える習慣をつけろ
・自分に必要なキャッシュフロー(生活費)を普段から把握しておけ
・他人にもわかるように、仕事の記録をきちんとつけろ
・自分がコントロールできないファクターをできるだけ減らせ
・自分の居場所を作るためだけの仕事はするな

まだまだ成長の余地があるってことか...
(そろそろ、書評の書き方もしっかり勉強しなければ...)

--
http://suz-lab.blogspot.com/

Mozilla Firefox, Portable Edition 3.0.2 リリース

スズキです。

表記の通りです。
http://portableapps.com/news/2008-09-24_-_firefox_portable_3.0.2

以下のリリースノートを見ましたが、
僕が理解できるものはありませんでした...
http://www.mozilla.com/en-US/firefox/3.0.2/releasenotes/

でも、とりあえずアップデートです!

--
http://suz-lab.blogspot.com/

2008年9月25日木曜日

継続すること、したいこと

スズキです。

未来のだらけた自分を牽制するために、自己啓発的なことも
ウザくならない程度に書いていこうと思います。

今まで一年半くらい、継続してブログを書いてきたのですが、
自分にとって非常に価値のあるもになってきました。
(価値の説明はウザくなりそうなので、とりあえず省略)

この価値は、ひとえに、一年半の継続の賜物だと思っています。

三日坊主日本代表クラスの僕としては、
この継続した事実は自分でも信じられない奇跡であり、
また、奇跡に見合う予想外の結果で驚いています。

まあ、終わったことはこれくらいにして、今後のことですが、
継続してやっていくことを下記のように、
もっと増やしていきたいと思っています。

▼ブログ
・毎日1エントリ以上
・順調(もっとハードル上げてもいいかも)
▼書評
・毎週一本以上
・がんばり中(最近はじめた)
▼フットサル
・毎週一回以上
・順調(週一のスクール + ほぼ週一の社内活動)
▼中国語
・毎日1時間以上
・現状不定期(勉強するリズムを作らなければ…)
▼IT系作品発表
・毎月1作品
・まったくできてない…(いつも口だけです…)

フットサルは時間が決まっており、他人も巻き込んでいるので
継続に関しては問題ないでしょう。

ブログは気を抜かなければ、今までの調子でいけるはずです。

書評は新たに始めて結構大変ですが、
ノルマというより今は楽しんでやってるので、
ここの継続が、当面のがんばるポイントとなるでしょう。

中国語は書評を死守しつつ、
火は消さない程度にメンテナンスかな?

IT系作品発表は、とりあえずほっときます。
一ヵ月後の状態みて、またどうするか考えます。

以上、suz-lab、短期戦略でした。(単なる自己満足です)

--
http://suz-lab.blogspot.com/

2008年9月24日水曜日

最近作ったConverter(Teeda)いろいろ

スズキです。

とりあえず、必要そうなのはそろえたので、ちょっと振り返っときます。

最近、次のようなConverterを作りました。
*UnicodeFromSqlConverter
*TranslitartorConverter
*TagRemoveConverter
(ソースは下記より参照できます)
▼アノテーション
http://code.google.com/p/suz-lab/source/browse/#svn/trunk/suz-s2-converter/src/main/java/jp/co/iret/suz/s2/converter/teeda
▼実装
http://code.google.com/p/suz-lab/source/browse/#svn/trunk/suz-s2-converter/src/main/java/jp/co/iret/suz/s2/converter/teeda/impl

【UnicodeFromSqlConverter】
悪名高い波ダッシュ問題を解決するためのものです。

こちらに記載されているロジックを非常に参考にしました。
http://javatec.blog105.fc2.com/blog-entry-41.html
(この業界10年以上なのに、未だ文字化けに悩まされる...)

【TranslitartorConverter】
携帯案件で全角英数・カタカナを半角にするためのものです。
ICU4J使っているので、別に全角・半角だけでなく、
Transliterator#getInstanceの引数で指定できるidの変換なら
なんでもOKです。
http://www.icu-project.org/

この辺が情報収集時のブックマーク
http://suz-lab.blogspot.com/2008/09/09042008.html

【TagRemoveConverter】
こちらも携帯用でPCサイトでしか効果のない
不要なタグを除去するためのものです。

実は下記でもがいていたのNekoHTMLの話です。
http://suz-lab.blogspot.com/2008/09/nekohtmlbr.html
http://suz-lab.blogspot.com/2008/09/javahtml.html

Converter系は書き散らかしてたけど、なんか、
まとまり始めた気がする。このまま、まとめ上げたいなー。

--
http://suz-lab.blogspot.com/

Converter(JSF/Teeda)は連鎖できない

スズキです。

試した限り、表記のようです。つまり、

--------
@Converter1
@Converter2
public String getComment() {
  ...
}
--------

としても、Converter1だけきいて、Converter2はききません。
Validatorみたいに連鎖してきいてくれたらいいのになー
と思いながら、仕方ないので、汎用なConverterを
共通ライブラリとして用意し、プロジェクトでは必要に応じて、
共通ライブラリのConverterを利用したConverterを
作る作戦にしました。

こんな感じです。

--------
public class MobileTextConverter extends OutputConverter {
  // 使用する共通ライブラリのコンバーターをDI
  @Binding
  public TranslitartorConverterImpl translitartorConverter;
  @Binding
  public TagRemoveConverterImpl tagRemoveConverter;
  // アノテーションからもらうパラメータ
  public String[] acceptTags;
  public String id;
  @Override
  public String getAsString(FacesContext context, UIComponent
component, Object value)
      throws ConverterException {
    String result = null;
    this.translitartorConverter.id = this.id;
    // 実は全角カタカナを半角カタカナにしています
    result = this.translitartorConverter.getAsString(context, component, value);
    this.tagRemoveConverter.acceptTags = this.acceptTags;
    // 実はbr以外のタグを除去しています
    result = this.tagRemoveConverter.getAsString(context, component, result);
    return result.replace("<BR/>", "<br/>");
  }
}
--------

前後関係すっ飛ばしてるので、まったく参考にならないソースですが、
何が言いたかったかというと、専用コンバーターつくって、その中で
汎用的なConverterをDIして使うのがいいんじゃないか?
ってことです。

もう時間無いから、今回はこれでいきましょう...

--
http://suz-lab.blogspot.com/

TeedaでJavaScriptの出力を抑止

スズキです。

Teedaではフォームを使ってるページなどに、
下記のようなJavaScriptが出力されます。
--------
<script language="JavaScript" type="text/javascript">
var forms = ['daysForm'];
for (var i = 0, len = forms.length; i < len; ++i) {
  var span = document.createElement('span');
  span.style.display = 'none';
  span.style.position = 'absolute';
  var form = document.getElementById(forms[i]);
  form.appendChild(span);
  span.innerHTML = "<input type='hidden' name='te-conditions'
  value='rO0ABXNyABdqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDTATlwQbMD7AgABWgALYWNjZXNzT3JkZXJ4cgARamF2YS51dGlsLkhhc2hNYXAFB9rBwxZg0QMAAkYACmxvYWRGYWN0b3JJAAl0aHJlc2hvbGR4cD9AAAAAAABgdwgAAACAAAAAAnQAEWJvZHk6aXNDcnVtYnNBcmVhc3IAEWphdmEubGFuZy5Cb29sZWFuzSBygNWc+u4CAAFaAAV2YWx1ZXhwAHQAFGJvZHk6aXNOb3RDcnVtYnNBcmVhc3EAfgAEAXgA'
/>";
}
//
</script>
--------

web.xmlに次のように指定すると、
そのJavaScript出力が抑制されるようです。
--------
<context-param>
  <param-name>teeda.JAVASCRIPT_NOT_PERMITTED_PATH</param-name>
  <param-value>/</param-value>
</context-param>
--------
http://teeda.seasar.org/ja/extension_customize.html#javascript

実際、試したところ、ちゃんとJavascriptがscriptタグごと、
消えていました。

携帯なんで...

--
http://suz-lab.blogspot.com/

今日のブックマーク 09/24/2008

2008年9月23日火曜日

X02NKにJoikuSpot

スズキです。

実は、携帯はX02NKを使ってます。
iPhoneにするかぎりぎりまで迷いましたが、
当時、iPhoneはGoogleカレンダーとの同期が
スマートではなかったので、GooSyncが使える、
X02NKにしました。(http://www.goosync.com/)
(GooSyncはカレンダーだけでなく連絡先の同期もできます)

で、表記なんですが、出先の一つの無線LANが非常に遅く、
"ip reachable"でないとまったく使い物にならない人間の
僕としてはかなりの死活問題です。
仕方なくJoikuSpotというアプリを導入することによる
X02NKの無線LANルーター化を試すことにしてみました。
http://www.joikuspot.com/

上記サイトでクレジットカードにて購入し、
早速インストール&設定です。
(上記作業は非常に直感的で説明するまでもないでしょう)

実際に、ノートPCからはちゃんと無線LANの
アクセスポイントとして認識され接続もできました。

接続スピードはそこそこの速さで、WEBブラウジングなど、
少し引っかかるなー程度で、上述した出先の環境と比べても
非常に快適です。

以下、BNRスピードテスト(下り)の結果です。
http://www.musen-lan.com/speed/

▼X02NK(JoikuSpot)
--------------------------------------------------
1.NTTPC(WebARENA)1: 548.239kbps(0.548Mbps) 67.92kB/sec
2.NTTPC(WebARENA)2: 578.65kbps(0.578Mbps) 71.77kB/sec
推定転送速度: 578.65kbps(0.578Mbps) 71.77kB/sec

▼出先の一つの無線LAN
--------------------------------------------------
1.NTTPC(WebARENA)1: 293.748kbps(0.293Mbps) 36.61kB/sec
2.NTTPC(WebARENA)2: 225.225kbps(0.225Mbps) 28.06kB/sec
推定転送速度: 293.748kbps(0.293Mbps) 36.61kB/sec

▼会社(光)
--------------------------------------------------
1.NTTPC(WebARENA)1: 4190.885kbps(4.19Mbps) 523.57kB/sec
2.NTTPC(WebARENA)2: 2668.734kbps(2.668Mbps) 333.41kB/sec
推定転送速度: 4190.885kbps(4.19Mbps) 523.57kB/sec

これで、実用的なスピードでどこでも(Softbankのエリア内で)
インターネットにつながる環境が手に入りました。

ということで、今後は、X02NK関係も
このブログで紹介していきたいと思っています。

--
http://suz-lab.blogspot.com/

PoundでSSLラッパー再び

スズキです。

久しぶりにPoundでSSLの設定を行う機会がありました。
それも中間証明書が必要なものです。

以前、この手の手順はブログに書いておいたので、
http://suz-lab.blogspot.com/2007/05/poundssl.html
瞬殺作業だなー、と思いながらやってみると、

SSL_CTX_use_certificate_chain_file "pound.crt" failed - aborted

というエラーがでてPoundが起動できずがっかりし、
ググると上記記事へのコメントが引っかかり、
http://www.haloscan.com/comments/iretsuzuki/2042927249797706121/
コメントに気づいていなかった自分に対し
さらにがっかりしてしまいました。

原因は、証明書の中身の下記の記述です。
-----END CERTIFICATE----------BEGIN RSA PRIVATE KEY-----

これを、下記のように改行を入れることにより、
上記エラーはなくなりPoundが正常起動するようになりました。
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----

コメントへの反応が遅い…反省…

--
http://suz-lab.blogspot.com/

2008年9月22日月曜日

"Selenium IDE"の導入(Firefoxアドオン)

スズキです。

Selenium関係で調べていたら、"Selenium IDE"なる
Firefoxのアドオンを見つけました。
https://addons.mozilla.org/ja/firefox/addon/2079

Seleniumがよくわかっていないにも関わらず、
早速、いつも使っているFirefoxに導入してみました。

使い方などは下記のサイトにわかりやすく説明されています。
▼Web アプリケーションテストツール Selenium のテスト記述から開放してくれる Firefox 拡張 Selenium IDE
http://cl.pocari.org/2006-02-15-3.html
▼Selenium IDEの活用とSeleniumの使いどころ
http://www.thinkit.co.jp/free/article/0705/2/7/

要は、ブラウザ上の操作をSeleniumのテストスクリプトとして
作成できるアドオンらしいです。

スクリプト化できるので、保存した操作をブラウザ上で再生、
といったこともできます。

無料でこんなツールが使える時代になったのか...
とちょっとびっくりしました。(商用はいろいろ試したことあり)

次は、Selenium本体です。
Flashまでの道のりは遠そうだなー…

--
http://suz-lab.blogspot.com/

FlashでSelenium(リンク情報のみ…)

スズキです。

Flashのテストのお話で、Seleniumが使えるよ
ってことらしいです。

▼Testing Flash with Selenium RC
http://wiki.openqa.org/display/SRC/Testing+Flash+with+Selenium+RC
▼Selenium RCによるFlash用の機能テストの作成と実行
http://www.adobe.com/jp/devnet/flash/articles/flash_selenium.html
▼flash-selenium
http://code.google.com/p/flash-selenium/

そもそもSeleniumがよくわかってないので…

今週は、Selenium勉強週間にしょう。

--
http://suz-lab.blogspot.com/

2008年9月21日日曜日

簡単なPDOのサンプル(改)

スズキです。

以前紹介した「簡単なPDOのサンプル」をちょっと深めました。
http://suz-lab.blogspot.com/2008/09/pdophp.html

今回は、機能ごとにファイルを分けて、
require_onceで取り込んでいます。

また、データ削除をテーマに、
PDOのprepare、bindValue、executeも使っています。

要は、GETパラーメータで与えられたidのデータを削除して、
削除後のデータリストを取得&JSONで表示しているのもが
下記のdelete-hoge.phpとなってます。

-------- header-cache.php
<?php
header("Expires: Thu, 01 Dec 1994 16:00:00 GMT");
header("Last-Modified: ". gmdate("D, d M Y H:i:s"). " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>
-------- connect-db.php
<?php
$dbs = "sqlite:hoge.db";
$user = "";
$pass = "";
$dbh = new PDO($dbs, $user, $pass);
?>
-------- select-hoge.php
<?php
require_once "connect-db.php";
require_once "header-cache.php";
$sql = <<< SQL
SELECT *
FROM hoge
SQL;
$stmt = $dbh->query($sql);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
print(json_encode($result));
?>
-------- delete-hoge.php
<?php
require_once "connect-db.php";
require_once "header-cache.php";
$sql = <<< SQL
DELETE FROM bmi
WHERE id = :id
SQL;
$stmt = $dbh->prepare($sql);
$stmt->bindValue(":id", $_GET["id"]);
$stmt->execute();
require_once "delete-hoge.php";
?>

とりあえず、1日1エントリのノルマは達成…

--
http://suz-lab.blogspot.com/

2008年9月20日土曜日

(書評) JavaScriptの絵本

スズキです。

前回の書評から、ちょうど一週間、
http://suz-lab.blogspot.com/2008/09/blog-post.html
今回は「JavaScriptの絵本」についてです。
http://astore.amazon.co.jp/iretsuzusblog-22/detail/479811460X

まずは目次です。
----------------
1. HTML
HTMLタグ, テーブル, フレーム, フォーム, CSS, スタイル

2. JavaScriptの実装
Hello World!, 呼び出し方法, ブラウザのオブジェクト, プロパティ, メソッド

3. 変数と演算子
型, 型の変換, 計算の演算子, 条件式で使う演算子, 論理演算子, 演算の優先度

4. 制御文
if, for, while, ループの中断, switch文

5. 関数
定義, 呼び出し, 変数のスコープ

6. 一般的なオブジェクト
配列, 文字列, 数学関数, 日付, 正規表現

7. ブラウザのオブジェクト
Window, Document, Form, Element, Location, DOM, Event, Style

8. Ajaxの基礎
XML, XMLHttpRequest
----------------

見てわかるとおり、プログラムの変数、型、関数、制御構造など、
JavaScriptでWeb!、というよりもプログラム基本的な概念の部分に、
重きをおいて書かれています。

僕は仕事でいろいろな人にプログラムを教える機会があるのですが、
Webデザイン系のバックグランドをもっていて、そこから
JavaScript/PHP/ActionScriptなどプログラム的なところに踏み出そう
としている人に対して、どんな本を薦めるべきかなー、と日々考えながら
見つけた一冊です。(言語がJavaScriptというのもお手軽でGoodです)

内容もタイトルどおり、絵をふんだんに使い、初学者にわかりやすく、
プログラムの基本的なトピックを解説しており、また、
JavaScript特有の内容も一通り(Ajaxまで)解説しています。

WebデザインからWebプログラムにスキルを拡大したい人は、
この本とブラウザとエディタで非常に簡単に効率よく
学習していけるんじゃないかなー、と思っています。

さて、次回はJavaScriptつながりで、下記のjQuery本二冊を
比較しながら紹介していこうと思っています。

▼実践!Ajaxフレームワーク jQuery
http://astore.amazon.co.jp/iretsuzusblog-22/detail/4839928541

▼jQueryで作る Ajaxアプリケーション
http://astore.amazon.co.jp/iretsuzusblog-22/detail/4774134902

来週、金曜日までにがんばろう!

--
http://suz-lab.blogspot.com/

2008年9月19日金曜日

NekoHTMLでbrタグだけ残す

スズキです。

以前NekoHTML使って、
HTMLへのフィルターのかけ方について書きました。
▼JavaでHTMLタグを除いたり閉じてないタグを閉じたり
http://suz-lab.blogspot.com/2008/09/javahtml.html

これは、DBに格納されている、HTMLタグの入った文章を
携帯表示に適した形に調整するための調査・実験でした。

文章中のタグがXML的に不完全だと、Durianの
コンテンツ変換時にXMLのパースエラーになってしまいます。

なので、閉じてないタグは閉じないといけません。
また、携帯に不要なタグも除去する必要があります。
(今回はbrタグ以外除去することにしています)

なので、特定のタグ以外を除去し、その特定のタグも
閉じてないものは閉じてる状態にする必要があります。

しかし、実は、下記のように簡単に実現することができました。
(convertHtml関数については上述の記事を参照)

public void convertForMobile() throws Exception {
  String htmlFragment = "<p> あああ <p> い<br>いい <p> ううう";
  ElementRemover remover = new ElementRemover();
  // brタグは除去しない
  remover.acceptElement("br", null);
  XMLDocumentFilter[] filters = { remover };
  System.out.println(convertHtml(filters, htmlFragment));
}
※空白は全角を使っています。

ポイントはacceptElementです。(コメントの通りです)
また、これだけで、閉じてないbrタグも閉じた形にしてくれました。

以下、実行結果です。

あああ い<BR/>いい ううう

あとは、Converter(Teeda)にするだけだ!

--
http://suz-lab.blogspot.com/

Durianでリンクパラメータを自動的に付与

スズキです。

久しぶりのDurianネタです。
http://durian.symmetric.jp/

あいかわらず、Java系の携帯案件は、
Durian + Teeda でやってます。

今回は、docomoのuidの処理を想定しなければいけないので、
uid=NULLGWDOCOMO
を、すべてのHTMLのURLに付与する必要があります。

これをどう実現するか、いろいろ調べたのですが
結局、Durianが持っている機能で簡単にできました。

下記に対して、任意のパラメータを自動で付与することができます。
- a/frame/iframeタグのhref属性
- formタグのaction属性()
- リダイレクトURL(Locationヘッダ)

さすがに、Durianは携帯ソリューションだけあって、
パラメータをつけるにしても、docomo、au、softbankごとに、
付与するパラメータを切り替えることもできます。
(当然、uid=NULLGWDOCOMOはdocomoだけってことで)

実際の設定の仕方は、下記の"リンクパラメータ操作"の部分に
説明があります。
http://durian.symmetric.jp/dev/doc/manage/admin_core.html

管理画面のデモもあるので、Durian持ってなくても
試してみることはできます。
http://durian.symmetric.jp/demo.html

次は各種携帯用Converter(Teeda)を作らなければ...

--
http://suz-lab.blogspot.com/

jQuery連載-第3回の公開

スズキです。

以前、紹介した"iret R&D team"によるjQuery連載の
第3回が公開されました。

▼第3回 Lightbox風プラグインでダイアログ表示(2)
http://gihyo.jp/design/serial/01/jquery-plugin/0003

(第1回、第2回の紹介)
http://suz-lab.blogspot.com/2008/09/jquery.html

今回は、Shadowbox.jsとThickBoxの紹介をしています。

"iret R&D team"の皆様お疲れさまでした。
第4回もがんばってください。

--
http://suz-lab.blogspot.com/

eqで要素集合から一つだけの要素を選択(jQuery)

スズキです。

いまさらの話です。

jQueryで, $("div")とかくと、divタグが複数ある場合、
div要素が集合として(複数)取得されます。

さらに、$("div").eq(0)とすると、その中の先頭が取得されます。
eq(1)なら、その次のdiv要素が取得されます。

それだけの話です。
"jQuery Form Plugin"もやらなければ...

--
http://suz-lab.blogspot.com/

Dropboxにポータブル環境

スズキです。

メモリークラフトでも紹介されているDropboxに
今使っているポータブル環境一式を入れてみました。
▼超便利オンラインバージョン管理ストレージDropbox
http://www.memorycraft.jp/2008/09/dropbox.html

本来、ポータブル環境は外部ストレージにて利用するものですが、
いつも使っている外部ストレージの調子が悪くなり、
また、現状、ノートPCとデスクトップPCの二台しか使っていないので、
両PCのローカルディスクにポータブル環境をいれ、
適当に同期をとりながら使用するスタイルになってしまってます。

また、この方がアプリケーションの起動なども早いので、
そのあたりのメリットも捨てがたく、再び外部ストレージを
購入するまでにはいたっていません。

ただ、やはり、同期は面倒です。で、Dropbox、
両PCを"Manage Computers"として登録すれば、
この同期も自動的にいい感じにやってくれるんじゃないか?
と期待しています。
(まあ、運用の仕方はある程度注意が必要だと思いますが)

50Gにしたいなー。

--
http://suz-lab.blogspot.com/

2008年9月18日木曜日

今日のブックマーク 09/18/2008

JavaでHTMLタグを除いたり閉じてないタグを閉じたり

スズキです。

表記をJavaらしく実装しようといろいろ調べたり試したりしていたら、
JAXPっぽい実装になってしまいました。

主役はNekoHTMLの
org.cyberneko.html.parsers.DOMFragmentParser
http://nekohtml.sourceforge.net/
とXercesの
org.apache.xml.serialize.XMLSerializer
http://xerces.apache.org/xerces2-j/
です。

全部じゃないですが、インポートするのはこんな感じです。

import org.apache.html.dom.HTMLDocumentImpl;
import org.apache.xerces.xni.parser.XMLDocumentFilter;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.cyberneko.html.filters.ElementRemover;
import org.cyberneko.html.filters.Purifier;
import org.cyberneko.html.parsers.DOMFragmentParser;

タグの除去をテストするメソッドです。
XMLDocumentFilterにElementRemoverを利用しています。

public void convertByRemover() throws Exception {
  String htmlFragment = "<p> あああ <p> いいい <p> ううう";
  XMLDocumentFilter[] filters = { new ElementRemover() };
  System.out.println(convertHtml(filters, htmlFragment));
}

閉じてないタグの閉じをテストするメソッドです。
XMLDocumentFilterにPurifierを利用しています。

public void convertByPurifier() throws Exception {
  String htmlFragment = "<p> あああ <p> いいい <p> ううう";
  XMLDocumentFilter[] filters = { new Purifier() };
  System.out.println(convertHtml(filters, htmlFragment));
}

つまり、XMLDocumentFilterという仕組みを使って、
与えられたHTMLをフィルタリングする形になっています。

で実際その中身は下記となります。
(結構、読みずらい...)

private String convertHtml(XMLDocumentFilter[] filters, String
htmlFragment) throws Exception {
  DOMFragmentParser parser = new DOMFragmentParser();
  // フィルターの設定
  parser.setProperty("http://cyberneko.org/html/properties/filters", filters);
  HTMLDocument document = new HTMLDocumentImpl();
  DocumentFragment fragment = document.createDocumentFragment();
  // 対象となるHTMLを設定
  InputSource inputSource = new InputSource(new StringReader(htmlFragment));
  parser.parse(inputSource, fragment);
  StringWriter writer = new StringWriter();
  OutputFormat format = new OutputFormat();
  // XML宣言は出力して欲しくない
  format.setOmitXMLDeclaration(true);
  XMLSerializer serializer = new XMLSerializer();
  serializer.setOutputCharStream(writer);
  serializer.setOutputFormat(format);
  serializer.serialize(fragment);
  return writer.getBuffer().toString();
}

結果はconvertByRemoverが

あああ いいい ううう

convertByPurifierが

<P> あああ </P><P> いいい </P><P> ううう</P>

と無事目的を達成することができました。

週末は、これらを使ったConverter(Teeda)祭りかな?

--
http://suz-lab.blogspot.com/

2008年9月17日水曜日

文字化け関係は文字化けタグにまとめました

スズキです。

ちょくちょく文字化け関係について書いているので、
文字化けタグ作って、
今までの記事で関係してそうなのを登録してみました。
(まあ、自分用ですが...)
http://suz-lab.blogspot.com/search/label/%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91

携帯の文字化けでいつもはまってる...

--
http://suz-lab.blogspot.com/

MySQL(UTF8)→Java(MS932)文字化け

スズキです。

よくある話です。情報もいっぱいあります。
でも、まだ、はまってます。

まあ、最終的にはこんな感じに変換することになるのかな?
http://javatec.blog105.fc2.com/blog-entry-41.html

調査の過程で賢くなったことは、

▼各文字のunicode表記のコードの表示の仕方
for(int i = 0; i < hoge.length(); i++) {
  Integer.toHexString(hoge.charAt(i));
}
※hogeに該当文字列が入ってます。

▼Seasar2に波ダッシュを全角チルダに変換するUtilあった!
org.seasar.framework.util.StringConversionUtil
#fromWaveDashToFullwidthTilde

ってとこでしょうか。

携帯もUTF-8にならないかなー...

--
http://suz-lab.blogspot.com/

Squidでキャッシュしない設定

スズキです。

忘れたころのSquidです。

下記の
「"Query String"付のURLはキャッシュしない」
ための設定が有名で参考になるでしょう。

acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

上記のQUERY(aclで定義したもの)を
他のものに差し替えればOKです。

--
http://suz-lab.blogspot.com/

jQueryの$.post

スズキです。

今更ながらですが、jQueryの$.postを真剣に使う機会があったので、
自分メモです。

$.postは非同期通信で外部のURLをPOSTメソッドでリクエストし、
そのレスポンスを受け取る関数です。

よく使う書式はこんな感じだと思います。

$.post("hoge.php", {"hoge1" : 1, "hoge2": "hoge"}, my_func);

第一引数: リクエスト対象URL
第二引数: POSTパラメータ
第三引数: レスポンス取得後に実行する関数

my_funcは引数を一つとり、
その引数に取得したレスポンスのBody(HTTP)が入ります。
(こんな感じで関数定義します)
function my_func(data) {
  alert(data);
}

$.postのポイントですが、おそらく第二引数のPOSTパラメータでしょう。
JSON形式で記述します。
{"hoge1" : 1, "hoge2": "hoge"}

一つのパラメータ名に複数の値をセットするには、配列を使います。
{"hoge1" : [1, 2]}
注意点として、同じパラメータ名で複数セットすると、
最後のものだけが有効になり、想定した結果にはなりません。
{"hoge1" : 1, "hoge1" : 2}

最後にこのJSON形式のパラメータ指定で、IE(7)とFirefox(3)との
挙動の違いです。

Firefox(3)は最後にカンマが残っていても正常に動作しますが、
IE(7)は動作しません。
{"hoge1" : [1, 2,], "hoge2" : "hoge",}

なので手を抜かず、カンマはちゃんと
複数データをつなぐときだけに用いるようにしましょう。

詳しくはこちら。(そこまで詳しくないか)
http://semooh.jp/jquery/api/ajax/jQuery.post/+url%2C+data%2C+callback%2C+type+/

--
http://suz-lab.blogspot.com/

DBViewer 1.0.9 リリース

スズキです。

EclipseのDBを操作するプラグインDBViewerが1.0.9になってます。
http://sourceforge.jp/projects/dbviewer/files/?release_id=32908#32908

早速アップデートしましたが、
"Release Notes"や"Change Log"が見つけられなかったため、
何がどうアップデートされたかはわかってません...

DBViewerExtention For S2JDBC
http://sourceforge.jp/projects/dbviewer/document/DBViewerExtension_S2JDBC_1.0.0.v20080914_-_Notes/
ってのもリリースしてますね。

--
http://suz-lab.blogspot.com/

2008年9月16日火曜日

Submitボタンの結果を別ウィンドウで開く

スズキです。

いろいろやり方はあるとは思いますが、
下記が表記を実現するためのコードの一つです。

--------
<head>
  <script type="text/javascript">
    function my_submit(form) {
      form.target="newwindow";
      window.open("","newwindow");
      document.getElementById("submit").click();
    }
  </script>
</head>
<body>
  <form method="post" action="loading.html">
    <input type="button" value="button" onclick="my_submit(this.form)"/>
    <input id="submit" type="submit" value="submit" style="display:none"/>
  </form>
</body>
--------

他人のコードのメンテナンスは結構勉強になります。
(嫌がらないように...)

--
http://suz-lab.blogspot.com/

2008年9月14日日曜日

簡単なPDOのサンプル

スズキです。

再度、PDOのExceptionまわりを試してみて、
最終的に落ち着いたものです。

僕の環境(Windows)のPHP(5.2.6)では、PDOExceptionが
なぜかキャッチできない状態でした。
なので、Exceptionを用いたコードにはなっていません。

キャッシュの部分はこちらの記事のものを流用しています。
http://suz-lab.blogspot.com/2007/07/phphttp.html

--------
<?php

// キャッシュの無効化
header("Expires: Thu, 01 Dec 1994 16:00:00 GMT");
header("Last-Modified: ". gmdate("D, d M Y H:i:s"). " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

// SQLの作成
$sql = <<< SQL
select *
from hoge
SQL;

// SQLの実行
$dbh = new PDO("sqlite:hoge.db","", "");
$stmt = $dbh->query($sql);
if($dbh->errorCode() != "00000") {
  print_r($dbh->errorInfo());
  exit();
}
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

// JSONデータの出力
print(json_encode($result));

?>
--------
※スペースは全角を使っています。

Exception使いたいなー。

--
http://suz-lab.blogspot.com/

Eclipse3.4にPDT(1.0.3)は入らない

スズキです。

そろそろ、Eclipse3.4でPHPの開発環境でも整えようか?
と思い、
http://download.eclipse.org/tools/pdt/updates
を更新サイトに指定してインストールを開始すると、

--------
要求を完了できません。 詳細を参照してください。
Cannot find a solution satisfying the following requirements Match[
requiredCapability: org.eclipse.equinox.p2.iu/
org.eclipse.wst.web_ui.feature.feature.group/[
3.0.1.v200807220139-7R0ELZE8Ks-y8HYiQrw5ftEC3UBF,
3.0.1.v200807220139-7R0ELZE8Ks-y8HYiQrw5ftEC3UBF
]].
--------

といったメッセージが出てインストールに失敗してしまいました。
Eclipse3.4の対応はPDT2.0からのようです。

そしてPDT2.0のリリースは"2008/12/29"です。
http://www.eclipse.org/pdt/

ということで、この作業は年明けに持ち越しです。
まだ、メインで使うべきは3.3.2なんだろーなー。

--
http://suz-lab.blogspot.com/

2008年9月13日土曜日

(書評) 人生のプロジェクト

スズキです。

そろそろ週に一回は書評を書ける人間になろうと思っています。

で、今回は「人生のプロジェクト」です。
http://astore.amazon.co.jp/iretsuzusblog-22/detail/4861139139/

近頃、ものごとが思い通りにすすままいなー、と思いながら、
本屋でたまたま手に取った本です。

写真が多く、その分、文章が少なく、かた苦しくない
非常に読みやすいものとなっています。

最も印象に残ったフレーズは、

「怖がらなくてもいい、死ぬこと以外はかすりキズだ。」

です。今まで、この気持ちで生きてきたつもりでしたが、
歳を重ねるにつれて忘れてきていたようです。

次に印象に残ったフレーズは、

二人の男(A, B)がレンガを積んでいた。

「君たちはなにをしてるんだ?」

A: 「レンガを積んでいるんだ。」
B: 「教会を作っているんだ。」

です。当然、二人の未来はまったく違うものになるはずです。

その他にも、

-プロジェクトとは?的な話
-MECE
-ロジックツリー

などの話もありますが、この本は僕にとって若いときに持っていて、
近頃、薄くなっていた精神論的なものを、
再度、確認させてくれました。

次回は一週間以内に、「JavaScriptの絵本」
http://astore.amazon.co.jp/iretsuzusblog-22/detail/479811460X/
を紹介する予定です。
初めてプログラムを勉強する人に薦めたい本です。

--
http://suz-lab.blogspot.com/

PNotes 4.0 リリース

スズキです。

以前紹介した付箋アプリケーションPNotesが
http://suz-lab.blogspot.com/2008/06/pnotes.html
4.0にバージョンアップしてました。
http://pnotes.sourceforge.net/index.php?page=4

早速アップデートです。

でも付箋、有効に使えてない...

--
http://suz-lab.blogspot.com/

2008年9月11日木曜日

S2JDBC - SAStruts - JSON - jQuery

スズキです。

今までは、"Java - JSON - jQuery"を実現するのに、
Teeda(Ajax) を使っていました。でも、そろそろ飽きてきて、
さらに、SAStrutsもやらなきゃなーという思いから、

S2JDBC - SAStruts - JSON - jQuery

のデータの流れを試してみました。
というか、要はSAStrutsでいかに気持ちよく
JSONを出力できるか?を試してみました。

ポイントはJSONICです。
http://jsonic.sourceforge.jp/
このJSON#encodeを利用するとあっさりできました。

以前、JSON-libを紹介しましたが
http://suz-lab.blogspot.com/2008/01/json-libxmljson.html
JavaオブジェクトをJSON形式にエンコードなら、
こっちのほうがお手軽です。

で、実際のサンプルは下記のようになります。
(僕的には気持ちいいです)

public class JsonAction {
  @Binding
  private HttpServletResponse response;
  @Binding
  private JdbcManager jdbcManager;
  @Execute(validator = false)
  public String select() throws IOException {
    String sql = "json/select.sql";
    List<BeanMap> list = this.jdbcManager
      .selectBySqlFile(BeanMap.class, sql)
      .getResultList();
    this.response.setContentType("text/javascript");
    this.response.setCharacterEncoding("UTF-8");
    this.response.getWriter().write(JSON.encode(list));
    return null;
  }
}
※setCharacterEncodingしないとJSONが文字化けします。

このJSONは、"ajax/select"(URL)で取得できるので、
このURLをjQueryの$.getJSONの引数に指定すれば、
あとは、Javascript(jQuery)のお話です。

もう少しこなれれば、SAStrutsとTeedaの
自分なりの住み分けが定義できそうです。

--
http://suz-lab.blogspot.com/

zend_hex_strtodやらphp5ts.dllやら

スズキです。

あるポータブル環境でPHPのPDOを利用するようにphp.iniを設定して
apacheと立ち上げると、

プロシージャ エントリ ポイント zend_hex_strtod が
ダイナミック リンク ライブラリ php5ts.dll から見つかりませんでした。

といったメッセージが出てapacheが立ち上らなくなっていました。
ほかの同じような環境ではできたのになー、と思いながら調べていると、

httpd.exeが存在するフォルダに、php5ts.dllをコピーしなければいけない

とのことでした。

つまり、昔の僕は、上記をちゃんとやっていて、最近の僕が
ポータブル環境のapacheをアップデートして、この作業を忘れてた
ってことなんでしょう…

こういうTIPSはできるだけブログに残しておかなければ...
明日の自分のために。

--
http://suz-lab.blogspot.com/

2008年9月10日水曜日

FlashDevelop 3.0.0 Beta9 リリース

スズキです。

表記の通りです。徐々にアップデートされてるようです。
http://www.flashdevelop.org/community/viewtopic.php?f=11&t=3589&start=0&st=0&sk=t&sd=a

ただ、Beta8で何も制作せずにBeta9になってしまった...
心が弱すぎる...

--
http://suz-lab.blogspot.com/

Papervision3Dの拡張機能的なもの

スズキです。

表記のようなものが、ぼちぼち出現し始めてします。

▼vectorvision
(note.xさんの記事) http://blog.r3c7.net/?p=220
(Google Codes) http://code.google.com/p/vectorvision/

▼AS3Dmod
(note.xさんの記事) http://blog.r3c7.net/?p=224
(Google Codes) http://code.google.com/p/as3dmod/

Papervision3D、ぜんぜん試せれてない...

--
http://suz-lab.blogspot.com/

今日のブックマーク 09/10/2008

"Google App Engine"で"YouTube API(Upload)"が失敗

スズキです。

YouTubeのAPIでアップロード系の調査があり、
なんか、Pythonモジュールもあるようなので、
http://code.google.com/apis/youtube/developers_guide_python.html
"Google App Engine"で使えるようにしてみようと、
意気込んでいたのですが、見事に失敗(タイムオーバー)でした...

ただ、この辺に情報はあるのでできるとは思います...
http://code.google.com/apis/youtube/articles/youtube_api_appengine.html

サンプルPHPでの動作確認はできたので、
一応依頼されてることに関してはクリアです。

もう少し賢くして、再チャレンジかな?

--
http://suz-lab.blogspot.com/

2008年9月9日火曜日

PostgreSQLでExplain

スズキです。

近頃、DBチューニングモードです。

PostgreSQLでExplainするには、

explain select ...

といった具合に、SQLの前にexplainの文字列をつけるだけで実現できます。
http://www.postgresql.jp/document/current/html/sql-explain.html

ちなみにMySQLも同様です。(出力結果は違いますが...)

このあたり、まだまだ勉強が足りない...

--
http://suz-lab.blogspot.com/

今日のブックマーク 09/09/2008

2008年9月8日月曜日

"Seasar Conference"行ってきました

スズキです。

先週の土曜日に行ってきました。

▼13:00-13:45 SAStrutsとS2JDBCの最新機能
S2JDBC-Genは面白そう。
チーム開発でのローカルDBの更新がこれでいかにうまくできるかかな?
今まで何度も挫折して、DBは皆で共有DBにつないでます...

▼14:00-14:45 T2 - the WEB2.0 Connector -
○クライアント - ステートフル
○サーバ - ステートレス
その通りだと思う。RIA、もっとがんばらないと。

▼15:00-15:45 AutumnだけどSpring
Spring2.xについていろいろ知識がついた。
でも、メインはSeasar2なので、IoCコンテナの動向として。

▼16:00-16:45 Teeda 再考 - 使い方から拡張方法まで -
PhaseListenerは今度試してみたい。
あと、OValっていう検証フレームワークは試してみたいところ。
http://oval.sourceforge.net/

以上、一言コメントです。
そういえば、もう秋か...

--
http://suz-lab.blogspot.com/

今日のブックマーク 09/08/2008

2008年9月4日木曜日

今日のブックマーク 09/04/2008

2008年9月3日水曜日

WinMerge Portable (2.8.6) と External diff Tool (Eclipse Plugin)

スズキです。

"WinMerge Portable"が2.8.6にバージョンアップしてたので、
http://portableapps.com/news/2008-09-01_-_winmerge_portable_2.8.6
何も考えずにアップデートし、せっかくなので、下記プラグインにて
Eclipseと連動できるようにもしてみました。
▼External diff Tool (Eclipse Plugin)
http://sourceforge.net/projects/externaldiff

Eclipseに"External diff Tool"を導入したら、
ウインドウ→設定→一般→比較/外部ツール
で、外部diff実行可能ファイルにWinMergePortable.exeを
指定する必要があります。

そうすると、複数のファイル/フォルダを選択して、右クリックすると
比較→相互(外部ツール)
が出現して、選択することで、"WinMerge Portable"が
そのファイル/フォルダに対して起動します。

ちなみに、"External diff Tool"は2006年のものですが、
Eclipse3.4(Ganymede)でも問題なく動作しました。

また、ポータブル環境、力を入れ始めました。

--
http://suz-lab.blogspot.com/

jQueryプラグインに関する連載

スズキです。

実は近頃、iretの中の人たちで構成される"iret R&D team"が
gihyo.jpにてjQueryのプラグインに関する連載をしています。

▼jQueryプラグインで彩る,ワンランク上のサイト制作
http://gihyo.jp/design/serial/01/jquery-plugin

▼第1回 プラグインを見つけよう
http://gihyo.jp/design/serial/01/jquery-plugin/0001

▼第2回 Lightbox風プラグインでダイアログ表示(1)
http://gihyo.jp/design/serial/01/jquery-plugin/0002

そして、今日、その第2回が公開されました。
"iret R&D team"の皆様お疲れさまでした。

僕もがんばらないと...

--
http://suz-lab.blogspot.com/