Info

Posts from the Code Category

ちょっと古いJavaのネタですが…

 System.out.print("011の値は:" + 011);

Advertisements

普段何気なくつかってるTeraTermですが、マクロというものがあります。TeraTermヘルプを見れば詳しく書いてあります。FTPもコマンドを外部ファイルに待たせば一覧の処理を自動化してくれます。今日はちょっと実際に作ってたものをサンプルとして掲載します。
処理の流れは以下のようになります。

  1. SSHでWindowsクライアントからサーバーAに接続して、Apacheログをftpから取得できる場所にコピー
  2. ftpでサーバーAに接続して、ApacheログファイルをWindowsクライアントにダウンロード
  3. SSHで再びサーバーAに接続して、ダウンロードしたApacheログファイルを削除
  4. ftpでサーバーBに接続して、Apacheログファイルを特定のディレウトリにアップロード
  5. Windowsクライアントのログファイル削除
  6. SSHでサーバーBに接続して、Apacheログ解析プログラムを実行

1. batファイル作成
apache_log.bat

“C:\Program Files\teraterm\ttpmacro.exe” “C:\apache\copylog.ttl”
ftp -s:”C:\apache\getlog.ftp”
“C:\Program Files\teraterm\ttpmacro.exe” “C:\apache\deletelog.ttl”
ftp -s:”C:\apache\putlog.ftp”
cd apache_log
del /Q *.apache.gz
“C:\Program Files\teraterm\ttpmacro.exe” “C:\apache\update.ttl”

2. ttlファイル作成
copylog.ttl

connect ‘192.168.0.2:22 /ssh /auth=password /user={user} /passwd={pw}’
wait ‘bash-2.04$ ‘
sendln ‘copylog-ctl’ ← シェルで作成したログコピースクリプト
wait ‘bash-2.04$ ‘
sendln ‘exit’

deletelog.ttl

connect ‘192.168.0.2:22 /ssh /auth=password /user={user} /passwd={pw}’
wait ‘bash-2.04$ ‘
sendln ‘rm /home/tomcat/htdocs/apache_log/*’
wait ‘bash-2.04$ ‘
sendln ‘exit’

update.ttl

connect ‘192.168.0.2:22 /ssh /auth=password /user={user} /passwd={pw}’
wait ‘[localhost@test ~]% ‘
sendln ‘/usr/local/apache/htdocs/cgi-bin/awstats/update.pl’
wait ‘[localhost@test ~]% ‘
sendln ‘exit’

3. ftpファイル作成
getlog.ftp

open 192.168.0.2
{user}
{pw}
binary
prompt
cd /apache_log/
lcd apache_log
mget *
quit

putlog.ftp

open 192.168.0.3
{user}
{pw}
binary
prompt
cd /awstats/apache_log
put apache_log/*.apache.gz
quit

ここまで読んでたらある疑問が出てくると思います、なぜ 192.168.0.2 と 192.168.0.3 を直接やり取りしないかと?
それは事情によりお互いに直接接続することはできず、一旦Windowsを経由しないといけなかったんです。

appengine-java-php

1. Quercusライブラリダウンロード
http://quercus.caucho.com/ から Quercus 3.1.6をダウンロードする(Quercus 4.0.1は文字化けが発生するので、今回は3.1.6を使うようにする)
jar xf quercus-3.1.6.war
(quercus.jar, resin-util.jar, script-10.jar)

2. Jettyライブラリダウンロード
http://dist.codehaus.org/jetty/jetty-6.1.17/ から jetty-6.1.17.zip をダウンロード
(jetty-6.1.17.jar, jetty-util-6.1.17.jar)

3. ライブラリをlibフォルダに入れる
1と2で取得したjarファイルを war/WEB-INF/lib に入れる

4. 設定ファイル修正
4-1 appengine-web.xml

<static-files>
  <exclude path="/**.php" />
</static-files>
<resource-files>
  <include path="/**.php" />
</resource-files>

 
4-2 web.xml

<servlet>
  <servlet-name>Quercus Servlet</servlet-name>
  <servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>
  <init-param>
    <param-name>script-encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
    <param-name>ini-file</param-name>
    <param-value>WEB-INF/php.ini</param-value>
    </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>Quercus Servlet</servlet-name>
  <url-pattern>*.php</url-pattern>
</servlet-mapping>

 
4-3 php.ini ファイル作成
war/WEB-INF の下に php.ini ファイルを新規作成

unicode.semantics=on
unicode.http_input_encoding=UTF-8
unicode.output_encoding=UTF-8
unicode.runtime_encoding=UTF-8

 
5. info.php
warの下にinfo.phpを作成

<?php
phpinfo();
?>

 
6. アクセスしてみる。
http://localhost:8080/info.php

android-logoAndroid SDKってどうゆうもんかと知りたくて試してみました。

1.SDKをダウンロード
http://developer.android.com/sdk/ からWindows用 android-sdk-windows-1.5_r2.zip ダウンロード

2.インストール
インストールと言ってもzipファイルを解凍するだけです。(適当な場所に)
自分の場合は「F:\ide\android-sdk」に入れてます。

3.emulatorを起動してみる
「F:\ide\android-sdk\tools」 に「emulator.exe」がありますが、コマンドプロンプトからそのまま > emulator.exe 起動すると以下のエラーが発生します。

emulator: ERROR: You did not provide the name of an Android Virtual Device
with the ‘-avd <name>’ option. Read -help-avd for more information.

If you *really* want to *NOT* run an AVD, consider using ‘-data <file>’
to specify a data partition image file (I hope you know what you’re doing).

Android Virtual Deviceを指定してくださいとのことですね、バーチャルデバイスを作成。

F:\ide\android-sdk\tools>android.bat create avd -n test -t 2
Android 1.5 is a basic Android platform.
Do you wish to create a custom hardware profile [no]
Created AVD ‘test’ based on Android 1.5

F:\ide\android-sdk\tools>

-n testはtestという名前のバーチャルデバイス
-t 2はAndroid 1.5 をtargetにして起動
ちなみに作成したAVDを削除するには 「android.bat delete avd -n test」、AVD一覧を表示するには「android.bat list avds」

emulator起動

F:\ide\android-sdk\tools>emulator.exe -avd test

AndroidEmulator

4.EclipseのプラグインADT(Android Development Tools)をインストール
Eclipseは3.2か3.3が必要です。Eclipseを起動して、「ヘルプ」→「ソフトウェア更新」→「サイト追加」で以下のURLを指定してインストールします。

https://dl-ssl.google.com/android/eclipse/

「ウィンドウ」→「設定」→「Android」 で SDKロケーションを設定します。

5.プロジェクト作成
「新規」→「プロジェクト」→「Android プロジェクト」の順にプロジェクトを作成する。
以下は自分が作成したプロジェクトですので、ご参考まで
プロジェクト名:footmark
ビルド・ターゲット:Android 1.5
アプリケーション名:footmark
パッケージ名:com.wordpress.footmark
Create Activity:footmark
Min SDK Version:3

footmark.javaが生成されるので、修正してみます。

package com.wordpress.footmark;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class footmark extends Activity implements OnClickListener{

 int i=0;
 TextView tv;
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 //setContentView(R.layout.main);

 LinearLayout linearLayout = new LinearLayout(this);
 linearLayout.setOrientation(LinearLayout.HORIZONTAL);//VERTICAL
 setContentView(linearLayout);

 tv = new TextView(this);
 tv.setText("Hello Android x ("+i+")");
 tv.setGravity(1);
 linearLayout.addView(tv,
 new LinearLayout.LayoutParams(
 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

 Button button1 = new Button(this);
 button1.setText("Click Me!");
 button1.setOnClickListener(this);
 linearLayout.addView(button1,
 new LinearLayout.LayoutParams(
 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
 }

 public void onClick(View v) {
 i++;
 tv.setText("Hello Android x ("+i+")");
 }
}

画面イメージ

AndroidApp

3時間でここまで…

明日、GDD phoneに転送してみよう

001最近iPhoneアプリの開発に夢中になって、なかなか時間が取れなかったのですが、今日やっと時間がすこしあったので、前からやってみたかった app engine for java を試すことにしました。Pythonの時はSDKをダウンロードして、秀丸なり好きなエディターでコードを書いてましたが、今回はEclipseのプラグインという素晴らしい選択肢がありました。もちろんJava版のSDKも用意してますけど。

推奨されてるJavaバージョンは6ですが、5でも大丈夫みたいです。Javaはすでにイスントールしてあるので、Eclipseのプラグインを入れることにしました。使ってたEclipse3.3.1にプラグインを入れようとしましたが、「org.eclipse.wst.xml.core」が必須ですと怒られて、本体のUpdateを行いましたが、今度はEclipseの起動すらできませんでした。ショック!しょうがないんでEclipse3.4でチャレンジすることにしました。

まずは、こちらからEclipse3.4.2をダウンロード(http://www.eclipse.org/downloads/packages/

英語が得意ではないんで日本語化(http://mergedoc.sourceforge.jp/index.html#/pleiades.html

次はGoogle Plugin for Eclipseを入れる。(http://dl.google.com/eclipse/plugin/3.4)

完了すると、メニューに三つのアイコンが出てきます。(可愛い~)左からプロジェクト作成、コンパイル、デプロイです。新規でプロジェクトを作成するとテンプレートでAjaxを使ったサンプルコードが自動生成されます。試しにappspotにデプロイしたのがこちら(http://term.appspot.com/)。これだけだと寂しいんでGuestBookも入れようとしましたが、失敗しました。ローカルでは問題なく動きますが、appspotにデプロイするとServer Errorが発生します。
「java.lang.ClassCastException: com.google.appengine.api.users.UserServiceFailureException cannot be cast to javax.servlet.ServletException」
どうもこれが原因らしい。(http://groups.google.com/group/google-appengine-java/browse_thread/thread/3263e14c37391830

やってみて、Pythonの時と比べると少しは楽かと思いました、少なくとも言語がJavaなんで言語そのものの勉強は要らないですね。さ~何を作ってみようかな?時間があるときですけど。時間は自分が作るものだと言われてますが、なかなか難しいですね・・・

最近世の中で、WebサイトをiPhone用インタフェースにするところがどんどん増えてきてます、今後も増え続けると思いますが、例としてあげたいのはFacebookのiPhone用ページです。iPhoneのブラウザがSafariなんで、Safariを使えばコンピュータでも確認できます。Firefoxでもある程度正しく表示できますが、IEではボロボロでした。そういった格好いい動いをするページ、今まで見たことのないページをどう作成したかはFacebookの開発者しかわからないですが、表面上のものはある程度まねできると思います。

1.まずはiuiというJavascriptライブラリをダウンロードします。
http://code.google.com/p/iui/downloads/list ここからライブラリをダウンロード。
ダウンロードしたファイルを解凍してみるとサンプルがあるので、イメージはつかめると思います。

2.iui.css, iui.js の読み込み
ページのhead 部分に iui.css と iui.js の読み込みコードを追加

<link rel="stylesheet" type="text/css" href="/css/iui/iui.css" />
<script type="text/javascript" src="js/iui/iui.js"></script>

3.ページ作成

<!-- トップバー -->
<div class="toolbar">
    <h1 id="pageTitle"></h1>
    <a id="backButton" class="button" href="#"></a>
</div>

<!-- Homeページ -->
<ul id="home" title="Home" selected="true">
    <li><a href="#blogs">Blogs</a></li>
    <li><a href="#play">Play</a></li>
    <li><a href="#me">Me</a></li>
    <li><a href="/"  target="_self">Safari</a></li>
</ul>

<!-- Blogsページ -->
<ul id="blogs" title="Blogs">
    <li class="group">中 and 韓</li>
    <li><a href="http://steadiness.blogspot.com/"
           target="_blank">Split-Second</a></li>
    <li class="group">日</li>
    <li><a href="https://footmark.wordpress.com/"
           target="_blank">FootMark</a></li>
    <li><a href="http://www.foxus.com/mt/mw/"
           target="_blank">Multi Works</a></li>
</ul>
<!-- Playページ -->
<ul id="play" title="Play">
    <li><a href="#youtube">YouTube</a></li>
    <li><a href="#sns">SNS</a></li>
</ul>
<!-- Meページ -->
<ul id="me" title="Me">
    <li><a href="#about">About</a></li>
    <li><a href="#projects">Projects</a></li>
    <li><a href="#gallery">Gallery</a></li>
</ul>

<!-- Aboutページ -->
<div id="about" class="panel" title="About">
    <h2>About</h2>
    <fieldset>
    <div class="row">
        <label>Name</label>
        <input type="text" value="King"/>
    </div>
    <div class="row">
        <label>Contact</label>
        <input type="text" value="dongrikin@gmail.com"/>
    </div>
    </fieldset>
</div>
・・・・・

後も続きますが、大体はこんな感じで追加していきます。
作成したページがこちらになります。
http://www.dongrikin.com/iphone

Perlの gethostbyaddr は遅くて使い物にならない!2000個ぐらいのIPアドレスをホスト名変換するのに5時間以上もかかる。はじめはネットワークか、DNSサーバーのせいかと思ったが、nslookup で試したところ gethostbyaddr よりずっと早かった。ということはやっぱり gethostbyaddr の問題と推定できる。自力でnslookupの情報からホスト名を取り出すのもよいだが、CPANのライブラリを使うとずっと簡単だと思う。

1.ライブラリダウンロード
http://search.cpan.org/~olaf/Net-DNS-0.63/lib/Net/DNS.pmから Net-DNS-0.63.tar.gz ダウンロード。

2.インストール
インストールというよりは設置ですね。Perlのライブラリパスにダウンロードしたものをコピーする。

3.コード

#!/usr/bin/env perl
use strict;
use Net::DNS;
use vars qw/ $myRes $query $rr $host /;

$myRes = Net::DNS::Resolver->new;

sub myLookup($){
    $query = $myRes->search($_[0], 'PTR');
    if (!$query) {
        return "?";
    }
    foreach $rr ($query->answer) {
        if ($rr->type eq "PTR") {
            return $rr->ptrdname;
        }
    }
}

$host = &myLookup("72.14.207.99");
print $host;

5時間もかかる処理が30分以内で終わった。興奮!興奮!

日本語キーボードから「半角ダッシュ」入力できる?

  • ー [全]長音
  • - [全]マイナス
  • – [半]ハイフン、マイナス
  • ー [半]長音
  • ― [全]ダッシュ
  • ‐ [全]ハイフン

いろいろ試してみたが、駄目でした。ユーザはどうやって入力できったんだろう?いたずら?

PostgreSQLのキャラクターセットをUTF8以外に設定した場合、半角ダッシュは登録されないらしいです。2ヶ月前にリリースしたシステムでバグリました。正確に言うと2年前にリリースしたシステムなんですけどね...うっん。 何社経由して来たが、今回 ”運がよかった” のでぴったりあたりました。ハハハ~

そろらくMysqlも同じでしょう。

今日、PHPで作られたグループウェアWizを弄ってみました。中にはファイル共有機能があってデフォルトのアップロードサイズは5MBでした。これはけちすぎる。少なくとも50MBにはしないとね。

早速環境定義ファイルであるgw.phpの中身をのぞいてみたら、$maxfilesize = “5242880”;という変数の定義がありました。メガバイトに換算すると大体5MBだったので、これだ!後ろに0をつけて10倍にしました。更新した定義ファイルをサーバーアップロードしてから、16MBぐらいのファイルをアップロードしてみました、が、アップロードされない。正常か異常かの結果も出してくれない。これは困ったね、どこが悪い?試しに6MBのファイルをアップしてみたら、これは上手くいった。定義ファイルの更新は反映されたぽい。これはどこかでサイズの制限が掛かってるね。

ネット調べてみたらphpの設定にもアップロードの最大サイズを定義できるみたい、php.iniの中を検索して以下のものが発見されました。

max_execution_time=30
post_max_size=8MB
upload_max_filesize=8MB
 

タイムアウトが30秒、POST形式で送れる最大サイズが8MB、ファイルのアップロード最大サイズが8MB。これを50MBにすれば解決できそうな予感。それぞれ、50MBに変更して保存、Webサーバ再起動。もう一回さっきの16MBのファイルをアップしたら、上手くいきました。

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

/**
 * @author King
 *
 */
public class DecimalFormatTest {

    public static void main(String[] args) {
        NumberFormat nemf = NumberFormat.getPercentInstance(Locale.JAPAN);
        DecimalFormat decf = (DecimalFormat)nemf;
        decf.applyPattern(“#.###”);
       
        double d1 = 1.0015;
        System.out.println(d1+ “=>” + decf.format(d1));
       
        double d2 = 1.0025;
        System.out.println(d2+ “=>” + decf.format(d2));
    }
}

処理結果は以下のようになります。

1.0015=>1.002
1.0025=>1.002

意外!答えはJavaDocで。 

java.text
クラス DecimalFormat

丸め
DecimalFormat はフォーマットに直近への丸め (ROUND_HALF_EVEN を参照) を使用します。


 ROUND_HALF_EVEN

public static final int ROUND_HALF_EVEN

「もっとも近い数字」 に丸めるモードです。ただし、両隣りの数字が等距離の場合は偶数側に丸めます。破棄する小数部の左辺の桁が奇数の場合は ROUND_HALF_UP のように動作し、偶数の場合は ROUND_HALF_DOWN のように動作します。この丸めモードは、連続する計算で繰り返し適用される場合に累積エラーを最少にします。