HeavyBommer@blog
時事ネタ、コンピュータ、家電、プログラミング等々、思ったこと/考えたこと/提案/使用レポ/Tipsなどを思いついたときに書いてゆきます
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
IPアドレス帯域→正規表現変換
ケータイ向けのWebページを作っている場合、前に書いたように、IPアドレス帯を正規表現で書かないとならなくなる場合が出てきます。
これがけっこう厄介で、手動で作っているといろいろミスも出てきますし、第一入念なテストができないのでぶっつけ本番になってしまいがちです。

そこで、自動生成の手段を模索していたのですが、GoogleアナリティクスのヘルプページにIPアドレス範囲→正規表現の自動生成をしてくれるページがあることを知りました。

ただ、このページだと
・手動で入力しないとならない→バッチ処理で大量の変換ができない
・通常IPアドレス帯はxxx.xxx.xxx.xxx/nnという感じで、ネットアドレス+マスクビット数という形で書かれており、そのままではこのページに入力できない
という欠点があります。

このページはJavaScriptで機能しているようなので、スクリプトをちょっと拝借して、独自の変換ツールを作ってしまいました。
コードの著作権があるので、Googleのコードの部分は掲載しませんが、独自に作った部分は以下のような感じです。


これに、googleのページから必要な関数をコピーして追加すれば機能します。
#JavaScriptが直接HTMLに埋め込まれていますので上のリンク先のページソースを表示するなり、HTMLを保存するなりすればコピペ可能です

実行はWindowsのコマンドプロンプトから
cscript //Nologo ip_addr_regex_gen.js xxx.xxx.xxx.xxx nn d
という感じです。
なお、dはデバッグレベルで、未指定or0だと正規表現だけを表示し、1以上だと開始・終了アドレスなども表示します。

ケータイ各社のアドレス帯の表をテキストエディタなどで加工してバッチファイルにでもすれば、一気に変換することもできます。

なお、ケータイ3キャリアのアドレス帯域は以下にあります。
ドコモ(i-mode)
au(ezweb)
ソフトバンク(Yahoo!ケータイ)
スポンサーサイト

テーマ:webサイト作成 - ジャンル:コンピュータ

スマフォ用ページ作成Tips
半分備忘録ですが。

・スマフォの画面サイズ
普通にページを表示させると、スマフォの場合は横方向を仮想的に900px位になるようにしているらしく、取っても小さく表示されてしまいます。
デザイン優先で、PCとスマフォを共通に扱うなら良いのですが、そうでない場合はバカみたいにフォントサイズを大きくしないと現実的な大きさにならないという欠点ができてしまいます。
そして、そういった形で解決を図ると、PCでアクセスした場合に馬鹿でかいフォントで表示されます。

というわけで、解決策ですが、metaタグでviewportを設定すると良いようです。

<meta name="viewport" content="width=device-width, initial-scale=1.0" />

みたいな感じですね。

width=device-widthでブラウザの幅(仮想)を実際のデバイスの幅に合わせます。
initial-scaleは初期倍率ですね。

ただ、iPhoneだとどうかわかりませんが、Android(標準ブラウザ)だとWVGA(幅480px)の端末でも、幅が320pxになってしまうみたいです。
なんでかわかりませんが、これについては解決策が見いだせていません。

ご存じの方がおられたら教えてほしいのですけどね。

解決法がわかりました。
target-densitydpi=device-dpiを追加すれば良いようです。(Android2.x以降)
これは前にも試していたのですが、順番がものをいうようで、widthより前に指定しないとダメなようです。
<meta name="viewport" content="target-densitydpi=device-dpi,width=device-width,initial-scale=1.0" />
とすれば、端末の実寸で表示されるようですね。

まあ、今後スマフォの画面解像度が(物理サイズは現状のままで)SVGAとかXGAとかになってくると、逆に実寸表示にしないほうがいいのかもしれませんけどね。

・画像自動拡大
これはJavaScriptを使って、ブラウザの幅に合わせて自動的に画像を拡大するというものです。
以下のような感じですね。

<img src="1key.png" id="NumImg1" onload="resize(1);" />
<img src="2key.png" id="NumImg2" onload="resize(2);" />
<img src="3key.png" id="NumImg3" onload="resize(3);" />
<br />
 ・
 ・
 ・
<script type="text/javascript">
<!--
var scrW = getBrowserWidth();
var scrH = getBrowserHeight() - 150;

function getBrowserWidth()
{
if(window.innerWidth)
{
return window.innerWidth;
}
else if(document.documentElement && document.documentElement.clientWidth != 0)
{
return document.documentElement.clientWidth;
}
else if(document.body)
{
return document.body.clientWidth;
}
return 0;
}

function getBrowserHeight()
{
if(window.innerHeight)
{
return window.innerHeight;
}
else if(document.documentElement && document.documentElement.clientHeight != 0)
{
return document.documentElement.clientHeight;
}
else if(document.body)
{
return document.body.clientHeight;
}
return 0;
}

function resize(num)
{
img = document.getElementById("NumImg" + num);
imgW = img.width;
imgH = img.height;
scaleW = (scrW / (imgW * 3)) | 0;
scaleH = (scrH / (imgH * 4)) | 0;
scale = (scaleW < scaleH) ? scaleW : scaleH;
if(scale > 1)
{
img.width=(imgW * scale).toFixed(0);
img.height=(imgH * scale).toFixed(0);
}
}
//-->
</script>

ちなみに、getBrowserWidth/getBrowserHeightはこちらのものを使わせてもらっています。

テーマ:webサイト作成 - ジャンル:コンピュータ

mod_rewriteで相対パス的なジャンプ
Apacheのmod_rewriteでURLを書き換えて、Locationで別のディレクトリに飛ばすというような方法です。

たとえば、

DocumentRoot ─┬─ foo ─ index.php
└─ bar ─ index.php

というようなディレクトリ構造の場合に、
http://www.mydomain.jp/foo/index.php?param=FOOBAR
でアクセスすると、
http://www.mydomain.jp/bar/index.php?param=FOOBAR
に飛ばすというようなことをやりたいとします。

httpd.confやDocumentRoot直下に.htaccessを置けるのなら簡単なのですが、今回の場合はfooディレクトリに.htaccessを置かざるを得ないという場合です。

具体的に言うと、fooがケータイ(ガラケー)専用のディレクトリで、ケータイ以外(スマフォやPC)でfooディレクトリ内のファイルにアクセスしてくると、barディレクトリの同名ファイルに飛ばすというようなことをやりたい場合です。
この場合、RewriteCondでIPアドレスなどをもとに飛ばすかどうか判定してしまうので、DocumentRootに.htaccessを設置するわけにもいきません。

・解決策1
RewriteRule ^(.*)$ /bar/$1 [R=302,L]
ディレクトリが固定ならこれでOKですね。
単純です。

ただ、今回の場合は、DocumentRoot以外に複数のAliasがあって、それぞれロゴやちょっとしたローカライズを施したページを保持していて、各Alias格納先は、基本的にシンボリックリンクでDocumentRootのファイルをリンクしているのです。
.htaccessに上のように書いてしまうと、Aliasしている先でそれぞれ.htaccessを修正せねばならず、ケータイGWサーバのIPアドレス帯が追加されると、全部の.htaccessを修正しないとならないという問題が生じます。

かといって、
RewriteRule ^(.*)$ ../bar/$1 [R=302,L]
のように相対パスを使うと、実ディレクトリで解決されてしまうので、うまく動きません。

・解決策2
そこでいろいろ試行錯誤した結果、いったんREQUEST_URIで置き換えてしまえば問題ないことに気づきました。
問題なのは、RewriteRuleに入力されるURLが.htaccessの設置されているディレクトリ基準となっていることだったので、これでいくらでも弄れるわけです。
つまり
RewriteRule ^.*$ %{REQUEST_URI} [C]
RewriteRule ^(.*)/foo/(.*)$ $1/bar/$2 [R=302,L]

と二段階で変換するわけです。

これだと、
http://www.mydomain.jp/foo/index.php?param=FOOBAR → http://www.mydomain.jp/bar/index.php?param=FOOBAR
http://www.mydomain.jp/alias1/foo/index.php?param=FOOBAR → http://www.mydomain.jp/alias1/bar/index.php?param=FOOBAR
のような感じになるので、.htaccessはシンボリックリンクでうまく動いてくれます。

何か弊害がないかがちょっと心配なのですが、今のところ特に問題は出ていません。

テーマ:webサイト作成 - ジャンル:コンピュータ

CHtmlViewによるIEコアブラウザの作成
Windows(IE4以上を入れているかWin98/Win2K以降のOS)では、IEコアを使って簡単にオリジナルWebブラウザが作れます。
フリーのタブブラウザなども、多くのものはこの機能を利用しています。

さらに、VC++でMFCを使うなら、サンプルのmfcieってのを流用すればさらに簡単です。

でも、このIEコンポーネントが結構曲者で、ちょっと込み入ったことをやろうとするとすぐ壁にぶち当たります。
今回は、とあるアプリのブラウザ部分のエミュレートの為に、オリジナルのリクエストヘッダを付与するような仕組みを入れ込んだミニブラウザを作ったのですが、結構いろいろ壁がありました…
備忘録を兼ねて、それらについてメモっておきます。
ProGuard後のPreverifyエラー

前にJ2ME環境での難読化/最適化の話を書きましたが、今回変なエラーに遭遇しました。
もちろん、元のソースはエラーにならずきちんとjarの作成まで出来ています。
エラーが起きるのは、ProGuradをで難読化/最適化した後のファイルをPreVerifyするときです。
エラーの内容は


Inconsistent stack height 1 != 0

こんな感じです。
一応クラス名やメソッド名は出ていますが、ProGuardがかかってしまっているので、マップファイルを見てクラス/メソッドを特定しましたが、一件とくに問題はなさそうでした。
で、部分的にコメントアウトしつつ検証してみると、最適化によって中途半端にコードが削られるのが原因のようでした。
例えば
int a = 0;
if((a > 0) && (str.length() > 0))
のような感じで、けして中に入らない条件分岐に論理積(&&)で別の条件をくっつけたりすると、このエラーが起きる可能性が出てくるようです。


 ただ、必ず起きるわけではなく、javacのバージョンによっても変わってくるようです。
私の場合、1.4.2では上記エラーが出ましたが、1.5.0では出ませんでした。
とりあえず、このようなエラーが出た時は、マップファイルを見るとか、ProGuardの-keepオプションで問題のクラスのメソッドを難読化しないようにするとかして原因となるメソッドを特定し、このようなけして通らない処理が無いかどうか調べてみるのが良いと思います。


 ちなみに、なぜこのような処理があったかと言うと、MIDP用のプログラムをDoJaにコンバートしているので、中途半端に処理を削ったための所為でした。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。