Hatena::ブログ(Diary)

public static void main

誰かが困って検索したときに助けになる話題を書いていければと思っています。

2009-03-22

[][]Tomcat6のインストールとEclipse3.4のWTPで使用する時に詰まったことメモ

OSはWindows XPTomcatのバージョンは6.0.18です。

追記:

GoogleからTomcat5.5+Eclipse3.4でアクセスしてくる方が多いのですが、おそらくEclipse3.4のWTPで作ったプロジェクトがTomcat5.5にデプロイできない(ターゲットランタイムで選べない)ことについてではないかと思ったので一言。

Tomcat5.5にデプロイできるプロジェクトを作るには、動的Webプロジェクトを作成する際に動的Webモジュールバージョンを2.2に変更すればOKです(デフォルトでは2.5)。


Tomcat5.5とTomcat6の並存

Windows環境でインストール用のexeを使ってTomcat6のインストールを仕様としたら以下のようなエラーが発生。

Failed to install Tomcat6 service.
Check your settings and permissions
Ignore and continue anyway (not recommended)?

別のバージョンのTomcatが入っているときに発生するエラーで、どのTomcatのWindowsサービスの名前も「Apache Tomcat」となっているため、サービスを登録するときにエラーになるようです。

Eclipseからだけ使う分にはサービスとして使う必要はないので無理やりインストールを続行してしまってもよいのですが、並存させたい場合はサービス名を変更してやる必要があります。

Tomcat6をインストールする前にコマンドプロンプトを開いて以下のコマンドを実行します。

sc config tomcat5 DisplayName= "Apache Tomcat 5.5"

これで元の「Apache Tomcat」から「Apache Tomcat 5.5」と言う名前に変更できたので、Tomcat6のインストーラを実行すればエラーなくインストールができます。

名前に統一感を持たせたい人はtomcat6のサービス名のほうもリネームしてください。

ちなみにDisplayName=の後のスペースは必須です。


参考


Eclipseでサーバを定義(あるいは起動)

WTPで開発する際にはサーバ(Servers)を定義するのですが、その際にTomcat6が選択肢に出てくるのですが選択しても「選択されたタイプを使用してサーバーを作成できません」と表示されてウィザードを進めることができませんでした。

普通のTomcatサーバを起動しようとしてもjava.io.UnsupportedEncodingExceptionが発生して動かないようです。

これは、「TOMCAT_HOME\conf」以下のtomcat-users.xmlの一行目が以下のようになっているからです。

<?xml version='1.0' encoding='cp932'?>

このxmlファイルの実際のエンコーディングUTF-8なので、以下のように修正します。

<?xml version='1.0' encoding='utf-8'?>

これで上記のどちらの問題も解決しました。


参考

2008-07-02

[][]Mashup Award 4thの協賛企業・団体のAPIの商用利用について調べた

Mashup Awards 2017」が開催されるそうなので、現在身内で行っている勉強会でも何か出してみたいなあと思っています。

そこで気になったのは、提供されているAPIが商用利用が可能なのかということです。

アドセンスの一つでも張ろうかとか、アフィリエイトプログラムと連携して〜みたいなことを考える人は少なくないと思います。


商用・営利目的の定義は曖昧

何をもって商用利用の範囲に含むのかというのは議論の余地があります。

アフィリエイトやアドセンスを入れることは利益を得ることを目的としているので営利目的のように思うのですが、営利目的ではないと判断しているサービスも少なくありません*1。(ex.no title

厳密に言うと、コンテストとかに企業が応募するのは宣伝目的の意味合いも強いと思うので、営利目的といえば営利目的になるのかな?

参考

というわけで、APIの場合だと提供している側の判断によると思うのですが、後から「使っちゃ駄目!」といわれることを避けるために、商用・営利目的の利用を禁止しているものは避けておくのも一つのリスク回避手段ではないかと思います。

以下、商用利用可能なものとそうでないもの、及びよくわからなかったものについてまとめました。無償版と有償版があるものは無償版の場合の条件を採用しています。

ざっと見てまとめたものなので間違いもあると思いますので、もしお気づきになりましたらご指摘ください。

以下の情報は7月1日の時点の情報です。


商用可(6)


非商用のみ(15)


不明(12)・・・どちらとも明言されていない、もしくはその記述を見つけられなかったもの


その他(2)


感想

それぞれ、利用規約がおいてなかったり、記述が曖昧だったりで結構大変でした。

明確に「商用・営利目的の利用可能」とかかれていないものは全て不明にしたのですが、禁止事項に商用利用が含まれていなければ商用利用可になるのかな?

APIについても共通したライセンス体系ができると楽でいいのですが・・・。

この辺は、主催者側で各企業に確認を取ってもらって表にまとめてもらえるとうれしいですね。


作業中に気づいたこと

楽天は利用規約の第8条で

3.利用者は、ウェブサービスを使用して利用者ソフトウェアを制作する

にあたり、サイト上のウェブサービスを使用した部分においては、

楽天サイト以外のウェブサイトへのリンクを設置してはならないもの

とします。

楽天ウェブサービス: 楽天ウェブサービス規約 | ご利用ガイド

って書いてあるんですが、マッシュアップするのに結構致命的な気が・・・。

*1:特にアフィリエイト

2008-06-12

[][][]なぜHTMLの要素のclass名にredやsmallをつけてはならないか

なんとかspotさんで取り上げられていた記事に出てきたHTMLに

<span class="small">hogehoge</span>

という記述がありました。

以前、クラス名にredとか付けていてid:youzakaに注意されたのですが、なぜ駄目なのかということを本質的に理解していなくて今回やっと理解しました。

早い話が、redとかsmallはデザイン上の特徴であって、こんな名前を付けるとデザインと文書構造の分離ができないからです。

HTMLとしては正しいかもしれないですが、本質的には

<font color="red">hogehoge</font>

と書くこととなんら変わりありません。

赤くしたり、小さくしたりするのは何らかの意味があってするはずなので、その意味に沿った名前にするべきです。

最初はredと付けていたものを青くしようと思ったら、cssを変えるだけで変更は可能でも、HTMLはclass="red"のままになってしまい、混乱の元となります。


あと今回のsmallの場合、

<span class="small">って書くくらいならおとなしく<small>って書けばいいのに。Strict DTDにある列記とした要素なのだから。

ヨウザカオオコノハズクさんのツイート: "<span class="small">って書くくらいならおとなしく<small>って書けばいいのに。Strict DTDにある列記とした要素なのだから。という話をした。"

とのことです。

参考

2008-06-04

[][]アップロードされたアイコンのリサイズ方法(はてダとTwitterを例に)

ユーザのアイコン画像のアップロード部分を作っているのですが、リサイズの方法としてどの方法が無難なのか悩んでいました。

こちらが想定するサイズをユーザに強制することは難しいので、多くの場合はアップロード後にこちらが画像のサイズを調整することになります。縦横比は画像によってまちまちなので、サービスによってどう処理するかは異なってきます。

ユーザの視点から考えるとサービス側に空気を読んでもらってリサイズ処理をして欲しいはずです。

以下の200×100の画像を使って、どんな方法があるのか調べてみました。

f:id:Kishi:20080604231339j:image



正方形にリサイズする方法

私が最初に考えていた方法です。

どんなサイズの画像が上がってきても64×64ピクセルのにリサイズします。

f:id:Kishi:20080604232022j:image

この方法の問題点は、縦横比が4:3の画像などでこの処理をすると、無理やり正方形の形にしてしまうので横や縦に伸びた画像になってしまうことです。



縦横比を崩さずリサイズする方法

はてなダイアリーのプロフィール画像がこの方法を取っています。

手順としては、

  1. アップロードされた画像の幅と高さを見て、長いほうを選択
  2. 選択した方の長さを基準に、指定した長さ(はてダの場合は64px)にリサイズする

といった感じでしょうか。

例の画像の場合だと、幅が200pxで高さが100pxなので、幅の200pxを選択。これを基準に64pxするとリサイズ後の高さは32pxになります。

f:id:Kishi:20080604231050g:image

幅と高さが64px以下になるので良い方法だと思いますが、問題点としては大きさがまちまちになってしまうところです。デザインによってはレイアウトが崩れるかもしれないので、案件次第ですね。



リサイズして正方形に切り抜く方法

Twitterのアイコンの方法です。

手順としては、

  1. アップロードされた画像の幅と高さを見て、短いほうを選択
  2. 選択した方の長さを基準に、指定した長さ(Twitterのタイムラインの場合は48px)にリサイズする
  3. リサイズされた画像の中央から指定した長さの正方形になるように切り抜く

といった感じでしょうか。

f:id:Kishi:20080604231727j:image

問題点としては画像として重要な部分を切り捨ててしまう可能性があることですが、写真や壁紙などがアップロードされることを想定すると上下(左右)を少し切り抜くだけならば画像の重要なところが見えなくなるということあまりないと思いますので、この方法が正方形にするのに適しているのではないでしょうか。

2008-05-30

[][]Wicketのtipsメモ

Wicket Wikiをあんまり読んでなかったので、少し読んでみました。その中で個人的に参考になった書き方をメモ。

あと、そのほかのブログやtwitterでの参考になったものも。

Pageのマークアップのファイルを変更する方法

ログイン前とログイン後で変更したかったので地味に困っていました。

WebPageクラスのサブクラスでpublic String getVariation()をオーバーライドして、適当な文字列を返すようにします。

Pageの名前がIndexPage.javaの場合、普段はIndexPage.htmlが利用されますが、getVariationがたとえば"foo"を返した時はIndexPage_foo.htmlが利用されるようになります。

public class IndexPage extends WebPage {
	public IndexPage(PageParameters parameters) {
		if(parameters!=null) {
			this.variant = (String)parameters.get("foo");
		}
	}

	private String variant;
	public String getVariation() {
		return variant;
	}
}
参考:

ログアウトの実装

リンクをクリックしたらログアウトして特定のページにリダイレクトする時の書き方。

Link logoutLink = new Link("my-link-wicket-id") {
	public void onClick() {
		//セッションの破棄
		getSession().invalidate();
		getRequestCycle().setRedirect(true);
		//リダイレクト
		setResponsePage(WhereEverYouWantToRedirect.class); 
	}
};
参考:

現在表示されているページへのリンクを無効にする

ナビゲーションなどで、表示されているページへのリンクを無効にしたいときに使うようです。

有効にすると、条件を満たしたときにaがspanとemに置き換わります。

new BookmarkablePageLink("page", Page.class).setAutoEnable( true );

ページ単位、アプリケーション単位でも設定できるようです。

参考:

cookieを使う

生成
((WebResponse)getRequestCycle().getResponse()).addCookie(new Cookie("cookieName", "cookieValue"));
取得
Cookie[] cookies = ((WebRequest)getRequestCycle().getRequest()).getCookies();
そのほかの方法
//staticメソッドを使っていつでも実行可能
((WebResponse)RequestCycle.get().getResponse()).addCookie(new Cookie("cookieName", "cookieValue"));
//WebPageのサブクラスで可能
getWebRequestCycle().getWebResponse().addCookie(new Cookie("cookieName", "cookieValue"));
参考:

強制的にページ遷移

ログインしてないときなどに、強制的にログインページに飛ばしたりするのに使うようです。

setResponsePageを使うのではなく、Exceptionを発生させて遷移させるようです。

throw new RestartResponseException(WhereEverYouWantToRedirect.class);
参考:

LinkのBody部分の書き換え

アンカータグの中を変える方法がわからず悩んでいたところ、id:t_yanoさんにTwitter経由で教えてもらいました。

以下のように、onComponentTagBodyをオーバーライドしてreplaceComponentTagBodyを使ってやればよいそうです。

BookmarkablePageLink link = new BookmarkablePageLink("link", IndexPage.class){
	private static final long serialVersionUID = 1L;
	@Override
	protected void onComponentTagBody(MarkupStream arg0, ComponentTag arg1) {
		replaceComponentTagBody(arg0, arg1, "アンカータグの中の文字");
	}};

おまけ

Wicket Wikiのリファレンスのタイトルを一部翻訳しました(リンク先は英語です)。

どんなことが載ってるのかを知るための参考程度に使ってください。

拙い英語力ですので、間違っているところがありましたらご指摘ください。

Wicket Wikiのリファレンス > WicketのHowTo

2008-05-07

[][][]中学生とニコニコ動画の話をして作る姿勢について思ったこと

中学生と話をしていたらニコニコ動画の話題になったのでメモ。

聞いた話

  • クラスの半数以上が利用
  • 発端はクラスの中のインターネットに詳しい人
  • 周りも含めて自分で動画を作って投稿したいと思っている

面白い動画の投稿者は英雄のような扱いでした。

自分も投稿してみたいと言っていたのですが、好きな動画が「毒キノコを全裸で採って食ってみた」とか「ハイポーション作ってみた。」とのことでしたので、無茶をしないことを祈ります。


思ったこと

動画を作成したいというベクトルが技術ではなく、何を作るかということに向いていることが個人的にはいいなあと思いました。

私の中では、動画を作成したい ≒ Final CutやAfterEffectsのような編集ソフトの使い方を覚え、効果的なエフェクトの使い方を発見し、撮影の構図や3Dモデリングや高品質で圧縮する術を勉強すること、という認識でしたが、別にそこまで詳しくなりたいと思っている人はほとんどいなくて、思いついたものを作品として形にしてみたいので手段には特にこだわりがないのではないかと思います。

プログラミングだと、どちらかといえば技術よりの人が多いように思います。勉強をするにしても、何か作りたいものがあって始めるのではなく、勉強のための勉強になっているところがあります。動画に比べると、プログラミングで、何ができるのか・何がしたいのか、ということがわかりにくいことが一因かもしれません。

この辺の意識の差が生まれたのが、動画を共有してコメントができるコミュニティがあるからであるとすると、Google App EngineやOpenSocialのような環境をうまく利用して、プログラミングの分野における作品を公開し評価してもらえるコミュニティが生まれると、もっと多くの人がプログラミングに興味を持ってくれるようになるのではないかと思いました。

2008-04-30

[][][]モバイル向けのWebサービスのユーザ登録方法メモ

物は試しとモバゲータウンとニコニコ動画のモバイル版に登録してみたのですが、携帯電話だとキャリア公式のサービスかメールマガジンぐらいしか登録したことがなかったので、個体識別番号を使って登録する方法は初経験でした。

今後、携帯電話向けのサービスを作るときに参考になりそうなので、それぞれの登録方法をメモしておきます。

ちなみに私が使っている携帯電話のキャリアはdocomoです。

モバゲータウン

  1. 携帯電話の個体識別番号を送信
  2. 自分の生年月日などの情報を入力
  3. 確認
  4. 空メールを送る
  5. 自分のメールに送られてきたURLにアクセス
  6. 登録完了


ニコニコ動画

  1. 空メールを送る
  2. 自分のメールに送られてきたURLにアクセス
  3. 携帯電話の個体識別番号を送信
  4. パケホーダイ・ichの契約状況を公開
  5. 自分の生年月日などの情報を入力
  6. 確認
  7. 登録完了

5のところで、入力ミスをして前の画面に飛んだときに入力項目が消えていたのでここは直して欲しいです。

ニコニコ動画の場合、PCでも登録している場合は紐付けの設定もできます。



その他気づいたこと

メールアドレスを入力するよりは、空メールを送ったほうが早いというのは携帯電話的でよいと思います。モバゲーとニコニコで空メールを送るタイミングが前後していますが、個人的には後者のほうが入力のストレスがなかった気がします。

生年月日の入力は、プルダウンじゃなくてyyyyMMddの形式で入れるようになっているのが、目に付きました。PCでも生年月日だけじゃなく、IPやメールアドレスの入力などで入力フォームが細かく分かれていると入力しにくく思っています。バリデーションする側からしてみれば、分けた方が正規表現が簡単になるかもしれませんが、入力する側からすれば一つの入力フォームで入れられるほうがユーザビリティが高く感じられます。

空メールのところで指定受信向けの注意が必ずついているのですが、今でもこれが原因でうまく受信が出来なくて文句を言っている人もいるのですかね。

メールアドレスは基本的に、サービスから情報を受け取るためだけに使い、ログインには個体識別番号を使います。個体識別番号を利用すると、気軽に複数アカウントを取ったり、入退会を繰り返すということを防ぐことが出来るので、ある程度のユーザの一意性を確保できるのがよいですね。ちなみに、Willcomがこういったサービスで使えないという話はよく聞きますが、個体識別番号が送信できないようになってるかららしいです。

2008-04-24

[][][]RSSをパースするときの制御文字への対処

DOMを使ってRSSをパースしているとたまに以下のエラーがおきることがあります。(Livedoorブログ、FC2、Amebaブログとかが多い)

An invalid XML character (Unicode: 0x14) was found in the element content of the document.

Unicode: 0x14の部分は0xbだったりいろいろです。

原因は、絵文字を使っていたり、文字化けしたりといったことによって制御文字が挿入されたためのようです。

ASCIIコードでは0x00〜0x1Fと0x7Fのコード範囲が制御文字になり、これが含まれているXMLはinvalidになるようです。

Javaの場合、RSSをパースする前に以下のようにこの制御文字を削除しました。

str.replaceAll("[\\00-\\x1f\\x7f]", "");

上記のコードだと、tabも消してしまうので修正。

str.replaceAll("[\\00-\\x08\\x0a-\\x1f\\x7f]", "");

RSSを提供している側で対処してほしい問題ですね。


参考

2008-04-02

[][]Wicket 1.3系を使うのに参考になった日本語のサイトまとめ

Wicketでググっても上位に出てくるのが、少し古いバージョンの記事が多く、これから使い始めようという人にとっての混乱の元になっていると思います。

周りのメンバーでWicketの勉強会をしようということになったので、Wicketの1.3.2(現在の最新バージョン)を自分で触り始めて参考になった日本語のページを以下にまとめました。

ブログに関しては記事ごとではなく、そのブログのWicketに関するカテゴリにリンクしています。

他にもよいサイトがあったら是非教えてください。

404 Not Found(2008/05/29追加)

本家のJavadocです。1.3.2に対応しています。


Geek-Side:Wicket(2008/05/29追加)

Geek-SideさんのWicketカテゴリです。

Wicket in Actionを読んでの感想が参考になります。


no title

id:YoshioriさんのWicketに関するプレゼン資料が上がっているので、Wicketってなにがいいの?って思ってる人は一度見てみるとよいと思います。


Java - @//メモ

Wicketの使い方が章立てて解説してあるので参考になります。

国際化について扱っているのはここだけでした。


no title

no titleさんのWicketカテゴリです。

「Wicket3分クッキング」はMaven2を使わないWicketの開発についてです。


ひとりにはなりきれない空を見あげる

id:yuripopさんのWicketでの一連の作成手順の記事をまとめたページです。


ふかくていWicket:ふかくてい日記:So-netブログ

ふかくてい日記:So-netブログさんの「ふかくていWicket」カテゴリです。

各記事に解説ページへのリンクがあるので、そちらを参照してください。


Wicket-ja Wiki

話題のWicket-jaのWikiです。

トラブルシューティングの「htmlが見つからないエラー」は知らないとハマりますので、Eclipseで開発する人は注意。


Wicket学習帳

タイトルどおり、Wicketを使ってあれこれやっています。

WicketのJavadocを公開してくれているので、使わせてもらっています。


矢野勉のはてな日記

Wicket-jaのid:t_yanoさんの「Wicket」カテゴリです。

wicket mailing listの話題も取り上げてくれるので、最新の動向がわかります。


Wicket

id:d-kamiさんの「Wicket」カテゴリです。

アップローダの記事が参考になりました。


Wicket

id:mdgwさんの「Wicket」カテゴリです。

個人的には、「Wicketが生成するアドレスを今風(?)にする - まどぎわBLOG」が参考になりました。

URL設計は大切ですよね。


[Wicket] - Chocotte de Choo

id:Chooさんの「Wicket」カテゴリです。

実際の開発中に困ったところなどを取り上げられているようです。


Wicket-ja-user 保存書庫

Wicket-jaのメーリングリストの過去ログです。

自分が悩んでいるものと同じような問題の解決策があるかもしれません。



おまけ:Wicketで作ったサンプルを公開しているページ

2008-03-11

[][]Pythonのガーベッジコレクションの話

以前、「JavaのGCについてメモ - public static void main」でGCについて調べたとき、RubyのGCの実装方法はわかったのですが、Pythonについて調べていなかったので、少し調べてみました。

404 Not Found」によると、Pythonでは以下の二つの手法を使っています。


  1. 参照カウント法 ・・・ オブジェクトが自身がどれだけ参照されているかをカウントし、参照が0になったらメモリを解放。
  2. Mark&Sweep ・・・ ポインタを全走査し、参照されているオブジェクトに印付け(Mark)する。すべて走査し終わった後に、印がついていないものを解放(Sweep)する。

参照カウント法を主に使っているのですが、この方法の問題点として、循環参照をしている場合メモリリークが発生する可能性があるということです。

これに対処するために、循環参照検出機構というものが存在しており、適当なタイミングでMark&Sweepを使ってGCしているようです。ただ、循環参照検出機構がどのタイミングで実行されるかについてはよくわかりませんでした。


普通にPythonを使っているときには、GCについて意識する必要はありませんが、C言語で拡張モジュールを書く場合に、参照カウントを意識して実装する必要があります。


参考