0%

はじめに

乗らなくちゃ、GAEのビッグウェーブに。というわけでプライベートなプロジェクトでGAEをインフラにしたアプリを開発しつつ、はまったところをメモ。
Eclipse 3.6 on MacOS X 10.6

環境構築

基本的に以下の通り。
http://sites.google.com/site/slim3documentja/getting-started

Google Plug-in の update site (Eclipse 3.6)は 以下。
http://dl.google.com/eclipse/plugin/3.6

今回の構成

コントローラ・モデル層は slim3 にお任せ。
ビューは JSP。 要するに slim3 のデフォルト状態

開発手順

  • まず自動生成
    スケルトンを自動生成する機能があるのでそれに頼る。
    /build.xml を右クリック→実行→Ant実行
    実行中に入力を求めるダイアログが開くので、作成したいパスを応答する。
    この時、入力するパスは “/“ で終わる必要がある
    ex)
    / <= ルートが自動生成される。逆に言うと初期状態では生成されてない。
    /login/ <= /login/ が自動生成される。

  • 編集対象のファイル

  • view
    /war/自動生成したパス/*.jsp
    index.jspは自動生成される。 ルート直下にマップされるjspは /war/ 直下に生成される

  • Controller
    Controller = StrutsでいうところのActionに相当するみたい。
    /src/<slim3.rootPackage>.自動生成したパス/controller/hogeController.java
    ルート直下用は /src/<slim3.rootPackage>/controller/ 以下に生成される。
    index.jspに対応する Controller は IndexController

デバッグ手順

プロジェクト右クリック → 実行 → Webアプリケーション
自動的に Jetty が起動し、ポート 8888 で待ち受け状態になる。
http://localhost:8888/

はまったところ

  • jsp編集時、http://java.sun.com/jsp/jstl/core のタグ・ライブラリー記述子が見つかりません という警告がでる
    → App Engine SDK に含まれる repackaged-appengine-jakarta-standard-x.x.x.jar をビルドパスに追加すると直る
    うちの環境では
    /Applications/eclipse/plugins/com.google.appengine.eclipse.sdkbundle.1.4.0_1.4.0.v201012021502/appengine-java-sdk-1.4.0/lib/tools/jsp
    以下にあった。(なんという長いパスなんだ)

Webアプリケーションをブラウザにキャッシュして、オフラインでも
使えるようにする為には、以下の2つを行えばOK。
参考にしたURL: http://www.html5.jp/trans/w3c_offline_webapps.html#offline
分かりやすい解説: http://journal.mycom.co.jp/special/2009/html5-2/003.html
あとで読んで何か書く:http://journal.mycom.co.jp/special/2009/html5-2/002.html

manifestファイルを作る

manifestファイルはタダのテキストファイル。
MIMEタイプは text/cache-manifest らしいが、Firefox4β7では特に気にしていないようだ。
manifestファイルの例

|

Revision: 2010/11/16 r1

CACHE MANIFEST
main.css
main.html
main.js

NETWORK:
|< CACHE MANIFEST以下に、キャッシュして欲しいファイルを列挙。
NETWORK: 以下は、キャッシュしてはいけないファイルを列挙する。

html中にmanifestに関する記述を追加

あれ、これ全部のファイルに追加が必要?(→要調査)

|

昨日からの続き。

まずは[http://d.hatena.ne.jp/marqut/20100219:title=昨日]の話を読んでからのがいいかもしれない。
というか、全部今日書いたんだけど、長すぎるので分割したのです。

復活して実装してみた。

・・・簡単なはずなのにヒドイ目にあった。何がひどいって、IEがひどい。。。
IE6 , IE7 (Quirks), IE8 (Quirks) / IE7(Standard),IE8(Standard) / それ以外
の3パターンで同じ情報の取り方が全く違うんだもん。
特にひどいのはIEだった。間違った取り方をしても、それはそれで存在している
プロパティなので取得は成功してしまったりして、なんだこれっていう結果に…
もう、素でJavascript書くもんじゃないねー。

##というわけでデモというかサンプル公開します。
デモページ
http://www.ziomatrix.org/software/QuitWhere/QuitWhere.html
Javascriptファイル
http://www.ziomatrix.org/software/QuitWhere/QuitWhere.js

使い方

  • ここまで読まれた!を表示させたい要素に “doc_n” という id をつけます。
    例:

    ||

    ||<
  • bodyタグの onload に addQuitWhereDaemon() を追加します。
  • headの中に、QuitWhere.js を追加します。
    詳しくは、デモページを御覧下さい。

一応使用条件など

  • あくまで as-is ベースで提供するものです。
  • 完全な動作を保証するものではありません。また、修正の義務を負いません。
  • 個人利用・商用利用問わず、無条件にコピペ・利用可。許諾も不要です。
  • 修正・機能追加した場合、それを公開する必要はありませんが、教えてくれると助かります。
    ・・・ようするに、良識の範囲内で好きに使ってくださいということです。

ここまでくれば

サーバー側の仕掛けがないのですが、ここまで出来ちゃえばあとはちょこちょこっと組むだけでしょう。

##無茶なお願い
土曜日なので寝ていたら、会社の同僚モドキから電話。曰く、
「1ページに長い文章が入ってるWebサイトがあるとして、ユーザーがどこまで読んだかを把握したい。
できるよね?」
・・・いや、基本的には無理ですが何か?
「コンサルができるって言ってるんだけど・・・」
・・・じゃあコンサルに聞けばいいじゃん!

##twitterでぐちってみた
やり方しってる人が教えてくれたら嬉しいなーとか思ったんだけど、来たのは・・・
「私もそれ知りたいです。」という声。><;
じゃあやってみますか!

##ところで(脱線)
どこかでうなぎの寝床式Webサイトってどこかで見たことがあるなぁ・・・と思って記憶を辿ったら
http://www3.coara.or.jp/~tomoyaz/higa9911.html#991112 ここだった。

##考えてみた
そんなことはできません。というのが基本的な答えですが(ここは変わらない)
擬似的にやる方法はありそうです。
ただし、基本的には無理なことをやろうとしているので、完璧なモノはできません。
ということだけはご理解頂きたいぞっと。

##なんでページ分けしてあったらどこまで読んだかわかるんだっけ?
1ページごとにリクエストが発生するから、単純にアクセスログみれば解析できるよね。
…ProxyさしてるからIPアドレスが一緒でわからないだろとか、細かい所は無視すれば。

##アイデア 1 AutoPagerise ぽくしてみる?
そもそも、うなぎの寝床なのが悪いとか言ってしまうパターン。
基本的に、1ページが長いからどこまで読んだのか分からない。そもそも、なんで長いページにしたいのか?
そりゃ、ページめくり(次のページへ)をクリックするのがめんどくさいから。
じゃあ、ある程度までスクロールしたら自動的に次のページを読み込んで挿し込めば、なんのことはない、
長いページと同じ使い勝手で読めるので問題ない。
ただ、AutoPagerise相当の機能を書かなきゃならんけど。 ある程度スクロールした所でXHRを使って続きを
取得して、適切な位置に挿入してあげれば良いだけなので(文章にするだけなら)簡単。
簡単だけど、ページ作成時にちょっとしたおまじないを仕込む必要があるかなー

##アイデア 2 元の文書に適当にDIVを仕込んでそこを超えた時点でログを出力
どこまで読んだか知りたいってことは、ある程度の範囲みたいなのがあるはず。
そこに何かを埋め込んでもらって、そこを通過(スクロール的に)した時点でXHRを使ってログ出力
#例えば、class=”hogehoge_1” みたいな。

##アイデア 3 HTML使うから悪い
Flashにでもしたらどうですかね…画面のスクロール位置とか取り放題ですがどうでしょう。

どっちにしても

0.5秒ごとに画面の位置を取得する的な実装になるかなぁ。
あと、本当に読んでるのかは実際分からないという罠。 何もみないでがーっとスクロールされたりしても
結局わからないんですよねー。
あと、元のページに何かを仕込んでもらう必要があるというのが欠点。
逆に言えば、仕込まなければバグがあっても悪さしないという利点にもなるんだけれども。

まぁ実装してみる?

必要なもの。
++ 画面を監視するJavaScript
++ ログを記録するサーバー側で動作する何か(phpあたりが一番楽かな)

と、ここまで考えてめんどくさくなったので一旦凍結。

→ がんばりました。 http://d.hatena.ne.jp/marqut/20100220

というわけでいろいろとメモしてみる。

・関連付けを変更するアプリ
Administrator権限のユーザーでも通常は管理者権限を発揮できない
ようになった。 そのため、通常の権限で関連づけを変更するような
操作をしても変更できない。
ちなみに、Windows標準の関連づけ変更手順は…

コントロールパネル→既定のプログラム→関連づけを変更する

というまどろっこしい手順。
で。関連づけを変更するアプリに関連づけを変更してほしい場合は、
アプリを起動する際に、アイコンを右クリックして管理者として実行。
#少なくとも、MediaPlayer Classic とマンガミーヤとIrfanviewは
#これでOKでした。

よく考えたら超基本なのに今まで出てこなかったなぁ。
意外といえば意外。 でもこれはphpとかRubyと同じ書き方なので違和感は全然ない。
あれ、else if ってこういう書き方なのか…
ここだけ違和感感じるかも。

| if (条件) {
条件に一致したとき
} else if (条件2) {
条件には一致しなくて条件2には一致したとき
} else {
条件にも条件2にもあわなかったとき
} |<

苦手な論理記号たちまで登場してきた。
|| → or
&& → and

final 〜〜
変更不可能なフィールドになる。

static 〜〜
クラスで一つしかインスタンス化されない。
…ってどういうことだか。とりあえず、定数の定義は
コレをつけましょう。っていうことでいいのかなぁ。

で、staticってなんだかわからないので、適当に書いてみた
サンプルプログラム。(コンパイルエラーになります)

| public class ConstantTest {

final int i = 10;
static final int j = 100; // 定数のインスタンスが複数あっても無意味。
final static int k = 300; // final と static はどっちが先でもいい

public static void main (String args[]) {
    i = 100;
    System.out.println (i);

    j = 500;
    System.out.println(j);
}

} |<

i はstaticな main の中からは参照出来ません。
なるほど。クラスをインスタンス化してないから
staticではないフィールドのインスタンスは存在
しないと。 存在してもiに値は代入出来ませんが。

…やっぱり定数用なのかなぁ、staticって。

なんか、突然難しくなってきた。
会社の先輩曰く、JavaのIOは結構難しいらしい。

| import java.io.*;

public class InputTest {
public static void main (String args[]) {
System.out.println (“よおこそ。おなまえは?”);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
String line = reader.readLine();
System.out.println (line + “さん。こんばんわ。”);
} catch (Exception e) {
System.out.println(e);
}
}
} |<

目新しいこと。
・import java.io.*;
パッケージの取り込み。らしい。なんのことやら。
とりあえず決まり文句ですかね。
・なんだか複雑な BufferedReader
VBの感じだとInputStreamから直接入力しそうだけど、なぜか
さらに一枚噛んでる。これ、なにかうれしいことがあるのかな
・try 〜 catch で例外捕捉
といっても、こんな入力でどういう例外が発生するんだか。
キーボードが壊れましたとか?(笑)

基本型と応用型に分かれるらしい。
基本型は…
byte / char / int / short / long / float / double

覚えきれない気がする。けど、割と普通の構成。
あれ、Stringは…^^;

型は常に意識すること。

| public class VariableTest {
public static void main (String args[]) {
int x;
int y = 4; // 宣言して代入。便利
x = 10;
System.out.println (x * y);
}
} |<

・クラス名は頭が大文字で始めるのが慣例?
→ あ、Rubyといっしょ。

・doubleの精度で計算させるときは、整数でもわざと
1.0とか書いて明確にする。

Javaのインストール後、環境変数 JAVA_HOMEを設定しておく。
・一部のツールがこれを見に来るらしい?

超基本!のHello World

| public class Hello {
public static void main (String args[]) {
System.out.println (“Hello World”);
}
} |<

ソース→(Javacでコンパイル)→ .class → (java)→ 実行
.class はバイトコードで、機種依存しない。

Javaは大文字小文字にうるさい。
・class名とソースファイルの名前の大文字小文字でも文句言う。
・system.out とか書いたらコンパイルエラーになった。

割とPHPとそっくりな文法。(PHPが似せたんだよね、きっと)

ソースみれば何となくは理解できるような気はしますが、
いろんな事情で本気で勉強する羽目になってしまいました。

せっかくなので、何を勉強してるのかこそこそとメモして
行きますね。 …いや、赤い靴をはいた女の子にインスパイアされ
ただけなんですけどw

目標は Struts + JSP でサーブレットがかけるようになること。
…仕事で必要になっただけなんですけど。結局。

今日、私じゃない人がAutoCADのデータをJw_CADにコンバートする
用事があって、適当なフリーソフトを探してこれでどお?
なんてやってみたら…
ファイルが大量かつフォルダ分けされてて、手でやるのは非常にめ
んどくさいんだけど…なんて言われました。
幸い、そのソフトにはコマンドライン版のコンバータもあったので、
そっちの使い方をちょろっと教えて、あとは手でどうぞ♪
なんてやってたら、実はフォルダが84個ほどあることが判明。
さすがに気の毒になったのでどうしようか考えてみたら…
WindowsXP以降のCMD.EXEはかなりいろいろ機能追加が行われてるって
いうのを思い出した。たしか、@ITで読んだような。
でも、それを探すのはめんどくさいので for /? で聞いてみたら
以下のような事が出来ると判明。一発で処理してよろこばれましたとさ。

1.指定フォルダ以下のファイルに処理

for /r c:\windows %f in (*.log) do type %f

指定ディレクトリ以下のファイルで、
in (ワイルドカード) に該当するファイル名を持つファイルを対象に
ファイル名(フルパス)を一個ずつ %f に入れて、do 以下の文を実行する。

2.サブフォルダを含めてフォルダ単位で処理

for /d %d in (c:\windows*) do dir %d

in (フォルダ) 以下にあるフォルダを一個ずつ %d に返しつつ、
do 以下のコマンドを実行。

…他にも set /p hogehoge ユーザーの入力を環境変数に受け取るとか
昔からこれがあればなぁ。っていうのが増えまくってた。