2007年9月28日金曜日

Seasar2のコンポーネント自動登録

スズキです。

まあ、基本は"Smart Deploy"なんですが、
suz-s2-validatorとかsuz-s2-converterなどのライブラリ作ってると、
"Smart Deploy"以外のコンポーネント自動登録機能が使えると
いろいろと便利です。
http://suz-lab.googlecode.com/svn/trunk/suz-s2-converter/
http://suz-lab.googlecode.com/svn/trunk/suz-s2-validator/

で、Seasar2には3種類あります。
http://s2container.seasar.org/2.4/ja/DIContainer.html#ComponentAutoRegister

▼FileSystemComponentAutoRegister
ファイルシステムからクラスを検索しコンポーネントの自動登録を行います。

▼JarComponentAutoRegister
jarファイルからクラスを検索しコンポーネントの自動登録を行います。
※diconにてjarファイルを指定する必要があります。
<property name="jarFileNames">"junit.*"</property>

▼ComponentAutoRegister
ファイルシステム、jarファイル両方からクラスを検索しコンポーネントの自動登録を行います。
※クラス検索対象のディレクトリ、jarファイルを特定するための、クラス(なんでもいい)を指定ます。
<initMethod name="addReferenceClass">
  <arg>@aaa.bbb.ccc.ddd.HogeImpl@class</arg>
</initMethod>

実際問題、ライブラリは開発するときは、ファイルシステム、使うときは
jarファイルにクラスがあるはずなので、おのずと、
ComponentAutoRegisterの利用がしっくりきます。

ただ、addReferenceClassで適当なクラスを指定することが、
気持ち悪いといえば悪いですが、大体、こういうときは、
ベースとする抽象クラスつくっているので、
それを指定することにしとけば、そこまで気持ち悪いってほどでもありません。

実際はこんな感じで書いてます。

-------
<component
  class="org.seasar.framework.container.autoregister.ComponentAutoRegister">
  <property name="instanceDef">
    @org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE
  </property>
  <initMethod name="addReferenceClass">
    <arg>
      @jp.co.iret.suz.s2.converter.teeda.impl.AbstractConverterImpl@class
    </arg>
  </initMethod>
  <initMethod name="addClassPattern">
    <arg>"jp.co.iret.suz.s2.converter.teeda.impl"</arg>
    <arg>".*ConverterImpl"</arg>
  </initMethod>
</component>
--------
http://suz-lab.googlecode.com/svn/trunk/suz-s2-converter/src/main/resources/suz-s2-converter.dicon-

最初(半年前)、addReferenceClassが何なのか、まったくわからず、
ComponentAutoRegisterが使えなかったんだよなー。

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

Pidgin Portable 2.1.1 Released

スズキです。

Pidginは以前も紹介した、ポータブル環境で使える、
メッセンジャーアプリケーションです。
http://suz-lab.blogspot.com/2007/08/mirandapidgin.html

これが、VISTAに移行したところ、ちょくちょく、原因不明で
落ちるようになりました。

ということで、新しいバージョンリリースしてないかな?
と探してみたら、2.1.1がリリースしてました。
http://portableapps.com/news/2007-08-23_-_pidgin_portable_2.1.1

早速、バージョンアップです。
前バージョンの設定の引継ぎは、
<インストールフォルダ>\Data\settings
のコピーだけどOKです。

そろそろ、プラグインも試してみたいなー。

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

2007年9月26日水曜日

キロ(k)やメガ(M)に変換Converter(Teeda)

スズキです。

近頃さわる機会が多い、TeedaのConverterのネタです。

アップロードしたファイルのサイズを、キロ(k)単位で、
Pageに出力するニーズがあり、
それを実現するConverter(SiPrefixConverter)を作ってみました。

まあ、こんなコードです。
http://suz-lab.googlecode.com/svn/trunk/suz-s2-converter/src/main/java/jp/co/iret/suz/s2/converter/teeda/impl/SiPrefixConverterImpl.java

使い方は、こんな感じです。

--------
@SiPrefixConverter(prefix="kilo", pattern="#,##0.#")
public Long getImageSize() {
  return imageSize;
}
--------

imageSizeはバイト数ですが、表示するときは、
キロの数字に変換されます。
※patternはDecimalFormatのやつです。

prefixは"kilo"のほかに、"mega"、"giga"、"tera"まで
指定することができます。(下記を参考にしてます)
http://www.math.com/tables/general/numnotation.htm#si

本当は、

--------
@SiPrefixConverter(prefix="kilo")
@NumberConverter(pattern="#,##0.#")
public Long getImageSize() {
  return imageSize;
}
--------

と連鎖する形で実現したかったんだけど、
Converterの仕組みでは無理っぽい。
なので、SiPrefixConverterにDecimalFormatのでの変換も、
入れざるを得なかったのが、心残りです。

どうせなら、DecimalFormatConverterを作って、
そのサブクラスとして、SiPrefixConverterを作るべきだったかなー。

ま、とりあえず、上記はsuz-s2-converter-0.0.2としてリリースしました。
http://code.google.com/p/suz-lab/downloads/detail?name=suz-s2-converter-0.0.2.zip
http://suz-lab.googlecode.com/svn/trunk/suz-s2-converter/

かなり、場当たり、ライブラリー。

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

ContinuumよりHudson?

スズキです。

今まで、CIはContinuum使ってました。
http://maven.apache.org/continuum/

でも、Hudsonっていうやつのほうが評判よさそうです。
https://hudson.dev.java.net/

Continuumも1.1になってるし、
一回、時間とって、CIの調査をしたいなー。

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

2007年9月25日火曜日

ImageIO(Java)で画像ファイルフォーマットの取得

スズキです。

Javaでアップロードした画像ファイルのフォーマット(jpeg/gif/...)を取得する必要があり、
"MIME Type"みて判断してもよかったんだけど、
せっかくなので、ファイルの中身で判断する方法を試みてみました。

いきなり結論ですが、ImageIOクラス使えばできます。
コードはこんな感じです。
--------
ImageInputStream iis =
ImageIO.createImageInputStream(uploadedFile.getInputStream());
Iterator readers = ImageIO.getImageReaders(iis);
ImageReader reader = (ImageReader)readers.next();
String ext = reader.getFormatName();
--------
※uploadedFileはtomahawkのUploadedFileです。

詳しくはJavadocですね。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/javax/imageio/ImageIO.html

これで、Teedaの画像フォーマットチェックValidatorが作れそうだ。

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

Teeda 1.0.11 RC-2 リリース

スズキです。

Teeda、1.0.11-RC2がリリースされました。
いろいろ、修正されています。
http://teeda.seasar.org/ja/roadmap_and_changes.html#1.0.11-RC2

早速、開発中のTeedaプロジェクト(RC1)は、
アップデートしておこう。

そろそろ、ライブラリアップデートに対する、
テストってものも考えていかないといけないなー。

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

Red5実践投入記事

スズキです。

FMSの代替として期待しているRed5。
http://osflash.org/red5

その実践投入記事です。
http://blog.ozacc.com/archives/001685.html

今まで、使ってみたかったけど、タイミングが合わず、
なかなか使えなかったRed5。

今度こそ、使っていきたいところです。
(Seasar2使えたらいいなー)

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

2007年9月24日月曜日

"Web Scouter"設置

スズキです。

たまにチェックする、"Web Scouter"の数値、
それも、いちいちサイトに行ってチェックするのは面倒なので、
本ブログ上部で確認できるようにしました。
http://ja.webscouter.net/info.phtml?u=http%3A%2F%2Fsuz-lab.blogspot.com%2F

いちいちサイトまでいかなくても、情報をチェックできるようにして、
自由に使える時間を増やしていかなくては。

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

サイト内検索(Google)設置

スズキです。

近頃、よく、自分の書いたBlogの記事を探します。
「昔調べて、Blogに書いたけど、なんだっけ?」
といった感じです。

記事の量も増えてきたので、記憶をたどって探すのは、
さすがに限界です。

ということで、Googleのサイト内検索を、
本Blog上部に設置しました。

タグはこんな感じです。

--------
<form action="http://www.google.co.jp/search" method="get">
  <input maxlength="255" value="" name="q" size="16" type="text"/>
  <input value="検索" name="btnG" type="submit"/>
  <input value="UTF-8" name="ie" type="hidden"/>
  <input value="UTF-8" name="oe" type="hidden"/>
  <input value="ja" name="hl" type="hidden"/>
  <input value="suz-lab.blogspot.com" name="domains" type="hidden"/>
  <input value="suz-lab.blogspot.com" name="sitesearch" type="hidden"/>
</form>
--------

技術Blogを書き続けることは、
未来の自分の技術力を加速させてくれるような気がする。

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

2007年9月23日日曜日

Javascriptでタグの除去

スズキです。

フィード(RSS)のdescriptionなどを、
Yahooの日本語形態素解析Webサービスなどで解析するとき、
http://developer.yahoo.co.jp/jlp/MAService/V1/parse.html
内部のHTMLタグが邪魔になります。

できれば、Javascriptの時点で、タグの除去を行いたいところですが、
調べてみると、Prototype.jsでタグの除去を行う関数(stripTags)が
用意されていました。
http://www.prototypejs.org/api/string/stripTags

使い方はこんな感じです。

----
var before = "<a>test</a>";
var after = before.stripTags();
alert(after);
----
"test"とタグが除去された形で表示されます。

JQueryベースの場合はどうやればいいんだろう?

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

2007年9月22日土曜日

PropertyConverter(Teeda)なるものを作ってみた

スズキです。

Teedaのコンバーター、便利です。

DBから取得した、表示フラグなど、
"true"なら"表示"、"false"なら"非表示"と出力する場合でも、
Converter作れば、アノテーション一発で変換することができ、
さらにそのConverterは使いまわすことも容易です。

で、実際の案件で上記のようConverter使おうとすると、
結構な数のConverterが必要になってきます。

クラスがいっぱいできるのは、あまり好きではないので、
変換ルールをpropertiesファイルに書いて、
そのキーを指定すると、キーに従った変換ルールを適用する
Converter(PropertyConverter)を作ってみました。

まずは変換ルールを書いたプロパティファイル
(appConverters_ja.properties)を用意します。

--------
jp.co.iret.suz.s2.converter.teeda.display.true=表示
jp.co.iret.suz.s2.converter.teeda.display.false=非表示

jp.co.iret.suz.s2.converter.teeda.country.0=日本
jp.co.iret.suz.s2.converter.teeda.country.1=アメリカ
jp.co.iret.suz.s2.converter.teeda.country.2=中国

jp.co.iret.suz.s2.converter.teeda.pref.AAA=東京都
jp.co.iret.suz.s2.converter.teeda.pref.BBB=大阪府
jp.co.iret.suz.s2.converter.teeda.pref.CCC=北海道
--------
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/resources/appConverters_ja.properties

キーの最後が変換元の値で、それより前がmessageIdとなります。
そして、下記のようにアノテーションに上記のmessageIdを指定します。

--------
public boolean trueFlag = true;
public boolean falseFlag = false;
public int zeroId = 0;
public int oneId = 1;
public int twoId = 2;
public String aaaCd = "AAA";
public String bbbCd = "BBB";
public String cccCd = "CCC";

@PropertyConverter(
  messageId="jp.co.iret.suz.s2.converter.teeda.display"
)
public boolean isTrueFlag() { return trueFlag; }

@PropertyConverter(
  messageId="jp.co.iret.suz.s2.converter.teeda.display"
)
public boolean isFalseFlag() { return falseFlag; }

@PropertyConverter(
  messageId="jp.co.iret.suz.s2.converter.teeda.country"
)
public int getZeroId() { return zeroId; }

@PropertyConverter(
  messageId="jp.co.iret.suz.s2.converter.teeda.country"
)
public int getOneId() { return oneId; }

@PropertyConverter(
  messageId="jp.co.iret.suz.s2.converter.teeda.country"
)
public int getTwoId() { return twoId; }

@PropertyConverter(
  messageId="jp.co.iret.suz.s2.converter.teeda.pref"
)
public String getAaaCd() { return aaaCd; }

@PropertyConverter(
  messageId="jp.co.iret.suz.s2.converter.teeda.pref"
)
public String getBbbCd() { return bbbCd; }

@PropertyConverter(
  messageId="jp.co.iret.suz.s2.converter.teeda.pref"
)
public String getCccCd() { return cccCd; }
--------
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/java/jp/co/iret/suz/example/teeda/web/converter/ListPage.java

そうすると、表示は次のように変換された結果となります。

(messageId: jp.co.iret.suz.s2.converter.teeda.display)
true → 表示
false → 非表示
(messageId: jp.co.iret.suz.s2.converter.teeda.country)
0 → 日本
1 → アメリカ
2 → 中国
(messageId: jp.co.iret.suz.s2.converter.teeda.pref)
AAA → 東京都
BBB → 大阪府
CCC → 北海道

設定としては、app.diconに下記記述が必要となります。

--------
<components>
  ...
  <include path="suz-s2-converter.dicon"/>
</components>
--------
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/resources/app.dicon

というのを、suz-s2-converter-0.0.1としてリリースしてみました。
http://code.google.com/p/suz-lab/downloads/detail?name=suz-s2-converter-0.0.1.zip
http://suz-lab.googlecode.com/svn/trunk/suz-s2-converter/

次は、VelocityConverterなるものを作ろう。

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

suz-s2-validator-0.0.4 リリース

スズキです。

下記、修正に伴い
http://suz-lab.blogspot.com/2007/09/iefirefox.html
0.0.4としてリリースです。
http://code.google.com/p/suz-lab/downloads/detail?name=suz-s2-validator-0.0.4.zip

0.0.5は下記機能の実装を目指したいと思います。
-ファイルサイズのチェック
-ファイルタイプ(gif/jpeg/pdf/...)のチェック
-メッセージフをappMessages.propertiesから切り離す

時間、いつ取れるかなー。
(案件で必要になれば、すぐなんだけど)

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

IEとFirefoxではアップロードファイル名が違う!?

スズキです。

ついさっき、作成した、アップロードファイルバリデーターを
http://suz-lab.blogspot.com/2007/09/suz-s2-validator-003.html
iretの中の人に使ってもらったら、早速フィードバック(バグ)がきてしまった。
http://mchiraura.blogspot.com/2007/09/suz-s2-validator.html

なんか、表記のようにIEとFirefoxでは、
アップロードしたファイルに対して、getName()で取れる値が
下記のように異なっている。

Firefox: hoge.jpg
IE6,7: C:\Users\iretsuzuki\Pictures\hoge.jpg

しかたないので、

String name = file.getName().substring(file.getName().lastIndexOf("\\") + 1);

として評価するように修正。

あと、アップロードファイルがNULLのときも、ヌルポがでてたので、
それも修正。

これで、suz-s2-validator-0.0.4としよう。
(品質悪すぎ…)

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

2007年9月21日金曜日

suz-s2-validator-0.0.3リリース&アップロードファイルバリデーター(Teeda)

スズキです。

昔、suz-s2-validatorなるものを作ってました。
http://suz-lab.blogspot.com/2007/07/suz-s2-validator-002.html

近頃、TeedaのValidatorをいろいろいじり始め、
Teedaでのファイルアップロード時にファイル名をチェックするものを
作る必要があり、せっかくなんで、suz-s2-validatorとして作ってみました。

そして、0.0.3としてリリースしてしまいました。
http://code.google.com/p/suz-lab/downloads/detail?name=suz-s2-validator-0.0.3.zip
http://suz-lab.googlecode.com/svn/trunk/suz-s2-validator/

使い方は下記のとおりで、namePatternsが配列で指定でき、
マッチさせたい、正規表現パターンを複数書くことができます。
(どれにもマッチしなかったらエラーとなります)

--------
public UploadedFile uploadedFile;

@Required
@UploadedFileValidator(namePatterns={"aaa", "hoge\\.jpg"})
public void setUploadedFile(UploadedFile uploadedFile) {
  this.uploadedFile = uploadedFile;
}
--------
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/java/jp/co/iret/suz/example/teeda/web/upload/EntryPage.java

その他の設定として、app.diconに下記記述が必要となります。

--------
<components>
  ...
  <include path="suz-s2-validator.dicon"/>
</components>
--------
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/resources/app.dicon

また、現状、表示するエラーメッセージもappMessages(_ja).propertiesに
記述する必要があります。

jp.co.iret.suz.s2.validator.teeda.uploadedFileName=ファイル名が不正です。

とりあえず、こんな感じです。
(まだ、自分関係しか使えないですね)

せっかくなんで、MAXファイルサイズや、ファイルタイプ(gif, jpeg)などにも
対応したいなー。

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

Teedaでweb.xmlのtomahawkFilterの位置

スズキです。

Seasar-userのMLでtomahawkFilterの位置が
s2filterの上でないと、いろいろ問題が出るような投稿がありました。
(詳しくはこちら)
http://ml.seasar.org/archives/seasar-user/2007-September/012467.html

なので、suz-example-teedaのweb.xmlも修正しておきました。
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/webapp/WEB-INF/web.xml

そろそろ、ブログ復活。

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

2007年9月18日火曜日

HTTPSで"Google Analytics"を警告なしに使う

スズキです。

久しぶりの投稿です。
なぜ、久しぶりかというと、リリースラッシュだからです。

で、リリースするときに、
急遽埋め込んだ、"Google Analytics"のコード(Javascript)が原因で、
HTTPSのページで、
保護されない項目やら、 保護されている項目やら
の警告が出るようになってしまいました。

原因は、そのページ内で、
<script src="http://www.google-analytics.com/urchin.js"
type="text/javascript"></script>
という記述があったからです。

これを、下記のように変更することで回避することができます。
<script src="https://ssl.google-analytics.com/urchin.js"
type="text/javascript"></script>
(参考) http://www.onflow.jp/blog/archives/2006/02/google_analytic.html

このような細かいところも、(Teedaで)美しく解決していきたいなー。
(今は、かなり、場当たり…)

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

2007年9月9日日曜日

Eclipseの正規表現プラグイン&Pleiades1.2.1.p8

スズキです。

近頃、PHPやってる時間が長くなり、
正規表現とかも、頻繁に必要になってます。

PHPの開発もEclipse(Aptana)でやっているので、
Eclipseの正規表現系のプラグインを本気で考えてみることにしました。

結論として導入したのは、QuickRExです。
http://www.bastian-bergerhoff.com/eclipse/features/

選んだポイントとしては、単純で、
Pleiadesが対応しているかどうかです。
(最終的には社内に基本セットとして提供するので日本語化が重要です)

ついでにPleiadesのリリースチェックしたら、1.2.1.p8
が出ていたので、それもアップデートしときました。
http://mergedoc.sourceforge.jp/

正規表現はTeedaのConverterでも使うので、
なかなか重宝しそう。

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

"Virtual Desktop for Win32"でデスクトップの使い分け

スズキです。

近頃、"Lifehacker"という本を読んでいます。
ITを駆使して効率よく生きていくためのノウハウ本ってところです。
http://www.amazon.co.jp/dp/4756149499/

その中に、"仕事別に複数のデスクトップを使い分けよう"(ハック10)
というものがあり、
Microsoft Virtual Desktop Manager
仮想デスクトップアプリケーションの利用を紹介しています。

これは便利そうなので、実践しようと思いましたが、
できれば、ポータブル環境で実現しようと思い、いろいろ調べると
表記アプリケーションが見つかりました。
http://homepage1.nifty.com/salt/fsw.htm

YLunchの自動起動(起動時)に設定しておけば、
起動のストレスもありません。壁紙もデスクトップごとに変更できます。

とりあえず、仮想デスクトップ環境、試してみます。
(壁紙どうしよう)

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

2007年9月8日土曜日

EclipseのJStyleで全角スペースを可視化

スズキです。

よく、初学者にEclipseで
Java、PHP、Javascript、SQL
などを教えています。

ここで、頻度が多く、発見が難しいエラーの一つに、
半角スペースが全角スペースになってるエラーあります。

全角スペースを可視化できるプラグインとかないかなー
と調べていたら、やっぱりありました。
JStyleです。
http://www.eclipsewiki.net/eclipse/?JStyle%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3
http://mergedoc.sourceforge.jp/index.html#/jstyle.html

インストールは上記URLの情報に従えば簡単です。
(まあ、いつものやり方です)

このプラグインは全角スペースだけでなく、タブ、改行も
可視化してくれます。
(設定すれば半角スペースも可能です)

一点、注意事項として、このプラグインは
> 表示は MS ゴシック 9 ポイントで最適となるように調整しています。
とのことです。
(これを忘れると、全角スペースが棒線とかになってしまいます)

なんか、Eclipseが秀丸みたいになってきたぞ。

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

2007年9月7日金曜日

WTP 1.5.5 & DBViewer

スズキです。

WTPが1.5.5になりました。
http://www.eclipse.org/webtools/releases/1.5.5/

早速Eclipseのプラグインの更新でアップデートしました。
すると、なぜかWTPの"データベース・エクスプローラー"が動かなくなり、
少し調査しましたが、なんか解決は難しそうで、
また、WTPの"データベース・エクスプローラー"は、
タイミングを見て、他のツールに乗り換えようと思っていたこともあり、
DBViewerへの乗り換えを試してみました。
http://www.ne.jp/asahi/zigen/home/plugin/dbviewer/about.html

下記、更新サイトがあるので、導入はお決まりの方法で一発です。
http://www.ne.jp/asahi/zigen/home/plugin/dbviewer/

で、早速パースペクティブをDBViewerにしてみると、
なぜか、開きません。

Eclipseのログを見ると、案の定、Exceptionが出力されています。
--------
org.apache.commons.logging.LogConfigurationException
Invalid class loader hierarchy.
You have more than one version of 'org.apache.commons.logging.Log' visible,
which is not allowed.
--------

いろいろ、調べたり試した結果、
なんか、log4jのjarがクラスパスに重複して存在すると出現する現象らしい。
(あまり、よくわかっていませんが)

実際、
plugins/org.apache.jakarta_log4j_1.2.8.v200607172048/lib
の下に、log4j-1.2.8.jarが存在し、
plugins/zigen.plugin.db_0.3.0/lib
の下にも、log4j-1.2.9.jarが存在しています。

なので、
plugins/zigen.plugin.db_0.3.0/lib/log4j-1.2.9.jar
の方を削除することで、
無事DBViewerの起動を確認することが出来ました。

EclipseのDBプラグインはDBViewerが一番いいような気がする。

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

2007年9月4日火曜日

"del.icio.us Bookmarks"アドオン(Firefox)

スズキです。

うまく使いこなせていませんが、
ソーシャルブックマークサービスに
del.icio.usを使っています。
http://del.icio.us/

うまく使いこなしてない理由に、
ブックマークの登録、検索時に
まずはdel.icio.usサイトにいく必要があり、
そのあたりが面倒で活用しきれていない、
というものがあると思います。

ブラウザの"お気に入り/ブックマーク"のように
手軽に使えれば...と思っていたら、やっぱりありました。
https://addons.mozilla.org/en-US/firefox/addon/3615
(Firefoxのアドオンです)

このアドオンを導入すると、下記のようなことができるようになります。
-右クリックのメニューで、ブックマークの登録が可能
-"Ctrl + B"でサイドメニューにブックマークリストを出したり消したり可能
-上部の既存の"ブックマーク"メニューを隠すことも可能

これで、よりdel.icio.usを活用するようになると思います。
次は共有かな。

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