日曜日, 12月 21, 2008

仮想マシンでUbuntuを動かす

Windows上で、VMWareなど仮想マシンを使うと、UbuntuなどLinuxマシンを動かすことができる。

仮想マシンに置く、システムのイメージが大きいため、ダウンロードに時間がかかることに注意。

まず、VMWare Playerをダウンロードする(登録が必要)。

起動したPlayerから、「Download」アイコンをクリックして、イメージの置いてあるサイトにアクセスする。

Ubuntu
など必要なシステムのイメージを選択し、ダウンロードする。

ダウンロードしたいファイルが、BitTorrent形式のものであれば、Vuzeなどをインストールしてダウンロードする。

ファイルが7-Zipなどの形式で圧縮されていれば、解凍用アプリをダウンロードして解凍する。

Playerから、イメージを選択して起動する。

パスワードは、イメージの置いてあるサイトに記載されている。

月曜日, 12月 15, 2008

正式版となったGoogle Chromeを試す

GoogleのChromeブラウザの製品版が出たというので、早速使ってみると、軽くて速い。とまどったのは、ブックマークの登録。右クリックにも、メニューにも項目がない。ドキュメントによると、登録にはアドレスバー左の星印をクリックする。ちょっとひっかかる設定ではある。

Javascriptに関して言えば、Firefoxと異なり、document.documentElement.scrollTop に設定はなく document.body.scrollTop を使わねばならない。同様に、screen.width には設定はなく、screen.availWidth を用いなければならない。バグかと思われたのは、moveTo() と resizeTo() を続けると、最後の設定しか有効でない点。つまり、moveTo() を最後に持ってくるとウインドウのサイズの設定が崩れ、resizeTo() を持ってくるとウインドウの位置が左上(0,0)に設定される。

正式版となったGoogle Chromeを試す (2008-12-12)

木曜日, 12月 11, 2008

グーグル社長が交代、ソニー出身の辻野氏が就任

Googleは9日、Googleの日本法人社長に、2009年1月からソニー出身の辻野氏が就任すると発表したという。

グーグル社長が交代、ソニー出身の辻野氏が就任 (2008-12-9)

日曜日, 12月 07, 2008

ブラウザ間の差違

ブラウザ間の差違による調整は、ブラウザ開発社が各社で規格を適宜変更するため、困難である。ブラウザ規格が統一されていれば、ページ製作者の苦労は軽減される。OSが統一されていれば、プログラマの仕事の大半がより創造的なものになる。しかし、WindowsおよびIEの絶対的な支配権力を要求することは、独裁下の官僚のぐちにすぎない。すべての人間が理解できる程度に同じであることを要求するのは、独裁的支配権を要求するのと同意である。異なる団体間の調整をすることは、同じであることを強要するものではない。しかし、IEのバグをかばわなければならない理由はない。Internet Explorerには、背景がスクロールで出現したり消えたりするバグがある。ズームを指定すると直るという。ほかに、IEには、改行で隙間が開くというバグがある。さらに、IEでは、DIVのスタイルがテーブルのスタイルより優先される。

月曜日, 12月 01, 2008

IE8 does not support filter:alpha ...

The hell with it -- IE8 does not support filter:alpha. It works without DOCTYPE specification but not with any of the type being spedified at the top of the page like as you would do just like a good citizen that follow all those laws and orders. Just specify IE7 mode and it works fine with the filter:alpha css or whatever. This. Here.

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

金曜日, 11月 28, 2008

雑感

妙に気張ったサイトがあるが、必要もないのにリフレクションの類を使うのは意味がないだけでなく、コンセプトをあいまいにするという欠点がある。

「あ、IEがサポートした!」など一喜一憂したくない。さらに悪いのは、「あ、IEがサポートしてない!」である。この対処法はいくらもあるが、基本線に徹するのもひとつの生き方である。ところが、基本中の基本と考えているようなことがサポートされていない場合などあり、その解決だけで時間がかかる。

最初から汎用性のない機能を説明するなどまったくテキストとして方針がなっていない。その辺の配慮が、教育的配慮というものである。他人の造ったプログラム言語を説明するには、それなりの配慮がいる。もっともよく使う演算子、関数に、決まった形式がなかったり指定されていなかったり冗長であったりすると、汚いプログラムになる。

Firefoxで対応していない機能もある。ブラウザでルビに対応しないのがあり、不便である。括弧書きはいかにもよくない。日本語に特有な機能であり、ブラウザの開発にも開発者およびサポーターの使う言語に依存する部分がある。

火曜日, 11月 25, 2008

PHP: Encrypting the Passwords

Nowadays, you need passwords everywhere, to access to blog admin page, to view member-only BBS, to read articles only available to the selected few, etc. All those sites require passwords. The passwords should be secured at a safe place and they should be safely protected -- encrypted. In PHP, crypt function does the work. It encrypts in a pattern that can be set by another secret keyword.

 
crypt($password,"ea")


Here the secret seed of this encryption is "ea" (happens to be my initials). This is a one way ticket to the password protected world -- there is no way to reverse the encryption unless you decipher the mechanism of PHP's encryption. In the real world checking of passwords, simply compare the resulting mysterious bunch of digits and letters with with the passwords that you would like to check -- with the encrypted ones, with the same secret seed.


strcmp(crypt($entered_password,"ea"),$password_stored_somewhere)==0


Notice that the string comparison is done with strcmp -- it is PHP's ancient trap. Never compare strings with == operator. PHP's inherent conversion machine might convert the string to some integer (or to any type) before doing the comparison.

土曜日, 11月 01, 2008

IE6で透過PNG

IE6では、そのままでは透過PNGを表示できません。しかし、フィルターを使うと表示が可能です。スタイルシートなどに組み込んで使います。こちらのページでは、ページのヘッダー部分でスタイルを指定しています。


filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='title.png');


「IE6でどうやって透過PNG表示するの」
「知らない」
「フィルタ使えばいいんだよ」
「あ、知ってる」
「...」

金曜日, 10月 17, 2008

PHPの配列

PHPでは、配列をハッシュのように使えます。便利です。値を変数に置くと、読みやすいコードを書くことができます。


$springEquinoxDay=(int)(20.8431 + 0.242194 * ( $year - 1980))
- (int)((double)($year - 1980)/4) ;
$springEquinox=array(3,$springEquinoxDay,"春分の日");

$automnEquinoxDay=(int)(23.2488 + 0.242194 * ( $year - 1980))
- (int)(($year - 1980)/ 4);
$automnEquinox=array(9,$automnEquinoxDay,"秋分の日");

$official_holidays=array( array(1,1,"元旦"),
array(2,11,"建国記念日"),
$springEquinox,
array(4,29,"昭和の日"),
array(5,3,"憲法記念日"),
array(5,4,"みどりの日"),
array(5,5,"こどもの日"),
$automnEquinox,
array(11,3,"文化の日"),
array(11,23,"勤労感謝の日"),
array(12,23,"天皇誕生日"));



春分の日・秋分の日の算出方法は、こちらを参照させていただきました。

水曜日, 10月 15, 2008

PHPでのログイン管理

PHPでのログイン管理において、クッキーを使ってセッション番号によって判別する方法を示します。

session_start();
$sessionid=session_id();

if(strcmp($_SESSION['sid'],$sessionid)!=0)
{
$user=$_REQUEST['user'];
$password=$_REQUEST['password'];

if(strcmp($user,$user_cfg)!=0)
{
header('Location: index.php?message=noUser');
}

if(strcmp($password,$password_cfg)!=0)
{
header('Location: index.php?message=noPassword');
}
if(strcmp($user,$user_cfg)==0 && strcmp($password,$password_cfg)==0)
$_SESSION['sid']=$sessionid;
}

セッション番号を記録し、現在のセッション番号と比較するのに、ここではセッション変数を用いています。

セッション変数$_SESSION['sid']に記録されたセッション番号と、session_id()で得られる現在のセッション番号を比較します。もし一致しなければ、ログイン情報をチェックし、一致しなければログイン画面index.phpに移行します。一致すればセッション変数に現在のセッション番号を記録します。

月曜日, 10月 13, 2008

職人芸

昨日は、お隣さんに、庭を拝見させていただいた。日本風の邸宅から、見事に手入れされた庭木が見える。いわく、「刈り込みというのはね」「職人芸なんですよ」「自然に」「はさみが動く」「理論じゃない」。先が見えなければ、刈り込むにもうまくいかないだろうと意見を述べたのだが、「いや、そうじゃない」「波長があって」とおっしゃる。

そんなに技術を魔術にしては困る、それじゃあいったいどうやって教わればいいんだろう、と思ったのだが、あくまで確信をこめて「どこに植えたらいいかって、それさえまったく飲み込めない人間もいるんですよこれが」とこれはまた頓着なくおっしゃる。

興味深く思ったのは、そういえばコンピュータに関しても似たような言い回しがあって、やはり「波長が」と言うのである。「どうも合わない」と思われるノリのブログもあれば、結果が明日になって出てくるようなコンパイルはしたくないという波長もある。しかし、他人に「Javaとは波長が合う」と言っても、Javaでプログラムを組み、別言語を使用したことがなければ、意味は通じない。「つまらないことに引っかからなくてすむから書きやすい」といっても、これも抽象的な話である。

だから、ようするにそういうことであろうと結論付けている。ようするに、Javaプログラムの書きやすさなど、説明しようとすれば「あるべきところに、ちゃんと備わっている」としか言いようがない。それは、類まれなる設計のよさからくるものであり、使う人の質と数によるものであり、ひいては設計したチームのリーダーシップによるものである。

ちなみに、植物を植えつけるなら分散して、いくつかの株に分け、どの場所がもっとも適しているかを見るのが安全である。日当たりと水はけと風通しと、植物でも科によって種によって、好む場所が違う。ある程度の見当をつけたら、さまざまに試みるのがコツというものだと思っている。

土曜日, 10月 11, 2008

C++/CLI でのプログラミング

先日、Visual C++ 2005 Expressでプログラムを書いていて、理解できないコンパイルエラーに悩んだ。何かと言うと、このコンパイルがキーワードチェックをしない。

array<int>^ array={5,4,3,2,1};
array<int>^ test;

分かってみればどうということもないが、「type 'int' unexpected」と出るので、構文のどこがまずいのか、探し出すのに手間取った。

C++/CLI では、Managed C++ をさらに改良した構文を用いて、どこかしらJavaの方式を継承した気配の言語が実装されている。現行のC++からの移行というより、整合性のある構文で、いわく違和感のないプログラム形式を目指しているという。

デリゲートとは、クラス構造を超えてメソッドにアクセスするポインタである。なんと足し算、引き算がある。メソッドを足された順に呼び出すという。

メタなクラス記述用クラスである属性クラスを使える。複数指定でき、引数もとる。Javaのアノテーション機能のことだという。しかし、Javaではドキュメンテーションにしか使わない。

タイプをメタで記述するテンプレートもある。ジェネリックもある。ジェネリックであればMSILで使えるという。制限もつく。推測でタイプを決めるという。

packがないのはプログラムでコンポーネントを記述するメリットを生かしていないと思う。

火曜日, 10月 07, 2008

PHPの出力を取得し、文字コードを変換する

PHPでは、include()関数を使って別のPHPプログラムの出力結果を読み込む方法があります。

 
include("news/news.php");


読み込む際に、同時に日本語文字コードの変換を行うやり方を以下に示します。

 
ob_start();
include("news/news.php");
$eucContents=ob_get_contents();
ob_end_clean();
$utf8Contents=mb_convert_encoding($eucContents,"UTF-8","EUC-JP");
echo $utf8Contents;

水曜日, 9月 24, 2008

Compare.java

The following is a Java command line tool that searches each line of the file in another file specified. To compile,

javac Compare.java

To run the program,

java Compare data.txt file.txt



import java.io.*;

public class Compare
{
public boolean contains(String str, String text)
{
boolean found=false;
if(0<=text.indexOf(str))
{
found=true;
}
return found;
}

private String readFile(String fileName)
{
String text="";
try
{
FileInputStream fis=new FileInputStream(fileName);
InputStreamReader isr=new InputStreamReader(fis,"utf-8");
BufferedReader reader=new BufferedReader(isr);
String line="";
while((line=reader.readLine())!=null)
{
//System.out.println(line);
text+=line+"\n";
}
}
catch(Exception e)
{
e.printStackTrace();
}
return text;
}

public void compareLine(String org, String dest)
{
String text=readFile(dest);
try
{
FileInputStream fis=new FileInputStream(org);
InputStreamReader isr=new InputStreamReader(fis,"utf-8");
BufferedReader reader=new BufferedReader(isr);
String line="";
while((line=reader.readLine())!=null)
{
if(contains(line,text))
{
System.out.print("o ");
}
else
{
System.out.print("x ");
}
System.out.println(line);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}

public static void main(String args[])
{
if(1<args.length)
{
Compare compare=new Compare();
compare.compareLine(args[0],args[1]);
}
}
}

木曜日, 8月 28, 2008

PHPによるデータベースアクセス

PHPでは、PDOというクラスを使うと、MySQLなどデータベースへのアクセスが簡潔に記述できます。クエリ操作など、データベース関連の関数が抽象化されているので、データベースに非依存のコードを書くことができます。例外処理機能があるので、よりわかりやすいコードを書くことができます。

手順としては、クラスをインスタンス化し、メンバ関数を実行します。結果はオブジェクトとして返されるので、メンバ関数を使用すると順次値を引き出すことができます。返される値は、デフォルトで連想配列および数値を引数とする配列となります。



try
{
$dbh=new PDO('mysql:dbname='.$MYSQL_DATABASE.';host='.$MYSQL_HOST,$MYSQL_USER,$MYSQL_PASSWORD);
$dbh->query("SET NAMES UTF8");

$sql="select * from photos where data_no=".$data_no;
$photoSet=$dbh->query($sql);

if(!empty($photoSet))
{
while($row=$photoSet->fetch())
{
echo $row['filename'];
}
}
}
catch (PDOException $e)
{
echo $e->getMessage();
}
$dbh=null;



オートインクリメントで値を設定している場合には、
lastInsertId()
を使うとインデックス値を得ることができます。


$dbh->query($sql);
$data_no=$dbh->lastInsertId();

金曜日, 8月 22, 2008

フォームでブラウザが勝手に文字コードを変換

フォームで日本語の文字列を受け渡す場合に、ブラウザが勝手に文字列をEUCやShift-JISなどに変換してしまう場合があります。

エンコードされた文字列がなんであるかを知りたい場合に、mb_detect_encoding 関数を使うことができます。

まず、フォームにhidden属性で、テスト用の文字列を指定します。

<input type="hidden" name="JapaneseEncoding" value="テスト用文字列">

フォームから値を受け取るPHPのページで、mb_detect_encoding 関数を用いて文字コードを判定します。

文字コードが判定できれば、mb_convert_encoding 関数を用いて、コード変換することができます。

$encoding=mb_detect_encoding($_REQUEST['JapaneseEncoding'],"ascii,jis,utf-8,euc-jp,sjis");
mb_convert_encoding($str,"utf-8",$encoding);

木曜日, 8月 21, 2008

PHPでHTMLタグを取り除く

PHPでは、HTMLを「文字通り表示する」 htmlspecialchars($str) という関数がある。

不等号が含まれる文章やコードなど、HTMLタグをそのまま表示するときに使う。

それでは、その逆の「タグを除去する」関数があるかといえば、特に設定されていない(らしい)。

正規表現を使うと、それらしきものができる。しかし、クォートで囲まれたカギ括弧などには対応しない。

contents$str="<html a=\">\">contents</html>";
echo mb_ereg_replace("<[^>]*>","",$str);

クォートで囲まれたカギ括弧などは、特別に指定しなければならない。

echo mb_ereg_replace("<[^>]*\".*\"[^>]*>","",$str);

グルジア語について


グルジア語について リンク集

サバイバル・グルジア語 (音声つき、おすすめ)
グルジア語の数体系
グルジア語のアルファベット
グルジア語 (Wiki)
グルジア文字 (Wiki)
グルジア語のすすめ
グルジアへ旅立つ人のためのグルジア語
FONTS.GE (グルジア語フォント)
グルジア文字をローマ字に変換してくれるサイト
THE GEORGIAN LANGUAGE (文法まとめ)
Georgian Language (学習サイト)
グルジア語の能格
グルジア語文法 (単行本)
【動画・アニメ】 The Magic Egg (jadosnuri kvertskhi)

グルジア語はフランス語のように、20進法(vigesimal)をとる。20*n+m の形で、65であれば、3x20+5と表す。

グルジア語の語変化で、母音を省略して短縮する(syncope)という形がある。megobari(友人) < megobrebi(友人、複数)

数あるグルジア語のアルファベット表記のなかで、現在使われているものは、Mxedruli, Mkhedruli (軍隊の、世俗の)という。

グルジア語では、me iaponeli var.(მე იაპონელი ვარ, 日本人です)のように、SOVの文型をとることができる。

sakartvelo (グルジア国)というのは、kartveli (グルジア人)に sa~o をつけたものという。

グルジア語をローマ字化する際に、放出音(ejective)の表記が標準によって異なるため、注意が必要である。さらに、グルジア文字での表記での放出音が酷似している。 პარასკევი (p'arask'evi, 金曜日)という単語をみてほしい。კპვとすべて異なる文字である。კがkの放出音、პがpの放出音、ვはvを表す。

ちなみに、グルジア語で、NOはアラ არა (ara)といい、千をアタシ ათსი (atsi)という。

グルジア語の人称代名詞とコピュラ 動画

単数複数
1
მე ვარ (me var)
ჩვენ ვართ (chven vart)
2
შენ ხარ (shen xar)
თქვენ ხართ (tkven xart)
3
ის არის (is aris)
ისინი არიან (isini arian)


名詞の格変化の基本形 → Noun Declension 

主格 Nominative
ეს არის წიგნ (is aris ts'igni)
これは本です
~は
呼格 Vocative
მზე! (mzeo!)
太陽よ!
~よ!
対与格 Dative
წერს წერილ (ts'ers ts'erils)
手紙を書く
~を、~に
所有格 Genitive
იმერეთის მხარე (imeretis mxare)
イメレティ地区
~の
具格 Instrumental
მე ვწერ ფანქრით (me vts'er pankrit)
私は鉛筆で書く
~で
副詞格 Adverbial
მეგობრად (megobrad)
友人として
~として


規則動詞の活用
წერ (to write)

単数
複数
1
წერ (vts'er)
წერ (vts'ert)
2
წერ (ts'er)
წერ (ts'ert)
3
წერ (ts'ers)
წერენ (ts'eren)


規則動詞の過去形



単数
複数
1
დავწერე (davts'ere)
დავწერეთ (davts'eret)
2
დაწერე (dats'ere)
დაწერეთ (dats'eret)
3
დაწერა (dats'era)
დაწერეს (dats'eres)


グルジア語で動詞の命令形、書け!(da-ts'er-e, დაწერე)は、直訳で書いた!と過去形(アオリスト)となる。

グルジア語の動詞は、アラビア語と同じように語根から派生形を作る。派生形の、人称と数による変化形は、基本形とは異なる。派生形は、語根の前につく母音(PV)と、後につく要素(P/FSF)を変化させ、-d 形、-i 形などの変化形がある。

-i 形では、დახატავს (da=khat'-av-s) を დაიხატება (da=i-khat'-eb-a) のように、PVに i を、P/FSFに eb に変化させる。-d 形では、ააშენებს (a=a-shen-eb-s) を აშენდება (a=shen-d-eb-a) のように、PVを取り除き、P/FSFに d を加える。派生系の人称と数による変化形は以下のようになる。



単数
複数
1
ავშენდები
(a=v-shen-d-eb-i)
ავშენდებით
(a=v-shen-d-eb-it)
2
აშენდები
(a=shen-d-eb-i)
აშენდებით
(a=shen-d-eb-it)
3
აშენდება
(a=shen-d-eb-a)
აშენდებიან
(a=shen-d-eb-ian)


数詞(基数)

1. ერთი erti
2. ორი ori
3. სამი sami
4. ოთხი otkhi
5. ხუთი khuti
6. ექვსი ekvsi
7. შვიდი shvidi
8. რვა rva
9. ცხრა tskhra
10. ათი ati
11. თერთმეტი (tertmet'i)
12. თორმეტი (tormet'i)
13. ცამეტი (tsamet'i)
14. თოთხმეტი (totkhmet'i)
15. თხუთმეტი (tkhutmet'i)
16. თექვსმეტი (tekvsmet'i)
17. ჩვიდმეტი (chvidmet'i)
18. თვრამეტი (tvramet'i)
19. ცხრამეტი (tskhramet'i)
20. ოცი (otsi)

met'i とは"more"を意味するという。

30. ოცდაათი, otsdaati
40. ორმოცი, ormotsi
50. ორმოცდაათი, ormotsdaati
60. სამოცი, samotsi
70. სამოცდაათი, samotsdaati
80. ოთხმოცი, otkhmotsi
90. ოთხმოცდაათი, otkhmotsdaati
100. ასი, asi
200. ორასი, orasi
300. სამასი, samasi
1000. ათასი, atasi

曜日の表し方

日曜日ქვირა (kvira)
月曜日ორშაბათი (orshabati)
火曜日სამშაბათი (samshabati)
水曜日ოთხშაბათი (otkhshabati)
木曜日ხუთშაბათი (khutshabati)
金曜日პარასკევი (p'arask'evi)
土曜日შაბათი (shabati)

昨日 გუშინ (gushin)
今日 დღეს (dghes)
明日 ხვალ (khval)

グルジア文字は、アルメニア文字との類似が指摘されており、ギリシア文字あるいはパフラヴィー文字から発展したものと考えられているという。(ルイ・ジャン・カルヴェ「文字の世界史」)

この本では、パフラヴィー文字がパルティアで使われたと書いてあるが、パフラヴィー語は、サーサーン朝ペルシアの公用語である。

パルティア(247BC頃~226AD)はイランで国の祖として称えるサーサーン朝ペルシア(226-651)の始祖アルダシール1世より前の古代王朝で、共通語としてギリシア語とアラム語を使用したという。ヴォロガセス1世の時代には非ヘレニズムの風潮が高まり、パフラヴィー語を使用したという。ゾロアスター教の勢いが強まるのは、非ヘレニズムの動きからという。

サーサーン朝ペルシアはゾロアスター教を国教としているが、聖典「アヴェスター」はアヴェスター語で書かれており、サーサーン朝の時代にすでに解読が困難になっていたという。教祖ザラスシュトラの直言とされるガーサー部分は解釈が分かれるという。アヴェスター語はサンスクリット語ときわめて近いという。アラム文字を基本としたアルファベットであるアヴェスター文字で記述するという。

火曜日, 8月 05, 2008

Google Maps ストリートビューが凄すぎて2ちゃんは祭りに

GoogleMap では(ちょっと衝撃的な)ストリートビューが公開されました。

さっそく、近所の散歩を楽しんできました(実際に散歩するより楽しいかも)。

GoogleMap (ストリートビューボタンをクリック)

すごい。

一般メディアおよび新聞、IT関連のニュースメディアを含め、なぜ書いていないのか不思議。と、よく考えてみると、米国では先に公開されていることに気づきました。なんだ。

Google Maps ストリートビューが凄すぎて2ちゃんは祭りに (2008-8)

水曜日, 7月 30, 2008

PHP: ランダムなファイル名を返す関数

Windows環境のApache+PHPでは、tempnam()関数が正常に動作しないようです。仕様かもしれませんが、拡張子は.tmpが自動的についてしまうし、プレフィックスの指定が3文字になるようです。ランダムなファイル名を返す関数を作ってみたので、参考になればと思います。

引数にファイル名の長さを指定してください。


function tempFile($length)
{
$alphanumeric="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$len=strlen($alphanumeric);
$name="";
for($i=0;$i<$length;$i++)
{
$index=rand(0,$len-1);
$name.=substr($alphanumeric,$index,1);
}
return $name;
}

金曜日, 7月 25, 2008

iPhoneという奇跡


iPod はトラブルフリーである。なにせ、マニュアルがない。実際、説明抜きでも分かるほど使いやすい。感に入ったように「うん、いいね。ぜんぜん違う」「なるほどね。これ皆んな欲しがるわけだ」という返答をもらっている。そうだと思う。動画を動かして、映画など見ていると特に大きなその画面の無駄のないスペースの使い方がアートだと思う。

iPhoneという奇跡 (2008-7-13)

土曜日, 7月 19, 2008

WikiにおけるJavaの記述

Java の基本コンセプトは、無論のこと「仮想化」である。そのためには、言語仕様が明確であることが要求される。毎月、あるいは半年毎に変わる仕様にあわせて、仮想マシンを作りたいと思う技術者はいない。

言語仕様もさることながら、ライブラリの仕様もはっきり定義されていなければならない。このあいだ作り上げたプログラムが、ライブラリのAPIを勝手に変更されたために、意味もない警告を出してくる状況は、決して快いものではない。

言葉がいいかげんに使われるものではなく、遊びではないように、プログラミング言語を規定する側はより一層の思いやりを必要とする。プログラムは、単なるアルゴリズムの記述ではあるが、それを読み解くのはコンパイラだけではなく、記述するのは人間だからである。

Java言語の表記法が、C言語に近いのは、時代、社会的背景によるものである。しかし、Javaでは、ベタにメモリアドレスを扱うC言語とは異なり、より安全で自然なプログラミング言語である。範囲外の配列の引数は、例外処理される。オブジェクトはもちろん、それとして扱うことができる。

Java

火曜日, 7月 08, 2008

PHPの変数には、文字通り、どんな型の値を放り込むことが可能です

PHPの変数には、文字通り、どんな型の値を放り込むことが可能です。つまり、数値や文字列を返すはずの関数の返り値に、FALSEを返し、例外処理ができます。例として、ゼロでの割り算を例外処理したい場合のコードを挙げておきます。


function divide($x,$y)
{
if($y!=0)
$result=$x/$y;
else
$result=FALSE;
return $result;
}

$x=10;
$y=0;
$z=divide($x,$y);
echo "$x divided by $y equals to ";
if($z)
{
echo "$z";
}
else
{
echo "... undefined

";
}


PHPでは、変数に型を自由に指定できるため、型を含めて判断したい場合には、見慣れない===(イコールサインを3つ重ねた演算子)や!==など使うことができます。

PHPの比較演算子

木曜日, 7月 03, 2008

PHPについて -- 型変換、可変変数、グローバル変数

PHPは、サーバーサイドで動くスクリプト言語ですが、これがとても便利。やみつきになります。使っていて、PHPの言語仕様で、気づいた点を3つ。


1.PHPでは、文字列が数値にキャスト(型変換)できる。全角数字を半角に変換するには、mb_convert_kana()を用いる。


$a=(int)"10";


$str = mb_convert_kana($str, "a");
$a=(int)$str;


2.PHPでは、文字列を変数として評価することができる。(Lispでいう、eval)


$variableName="newVariable";
$newVariable="value";
echo $$variableName;


3.PHPでは、関数を定義する際に、外部変数(グローバル変数)は関数内でそれと指定せねばならない。関数内での外部変数への代入は、外部変数そのものの値を変えない。


$globalValue=100;
function summit($politicalFactor)
{
      global $globalValue;
      return $globalValue*$politicalFactor;
}
$globalValue=summit(1.3);

水曜日, 7月 02, 2008

「Firefox 3」がギネスブックに認定,公開初日ダウンロード件数の世界記録

一日で最多のダウンロード数をギネス記録にしよう!という、6月17日に行われた「ダウンロード・デイ」。Firefox 3のダウンロード数は800万を超え、見事世界記録を達成したとのこと。現時点で、ダウンロード数は2870万件とか。

「Firefox 3」がギネスブックに認定,公開初日ダウンロード件数の世界記録 (2008-7-3)

土曜日, 6月 28, 2008

Firefox3の新機能

Smart Location Bar
Firefox3の新機能といえば、表示(V)-ズーム(Z)-拡大(I)あるいは縮小(O)で、画像を含めてページが拡大・縮小できる、ということに先日、気がついたのですが...既出でしょうか。スマート・ロケーションバーは、確かに便利。日本語のページタイトルが出てくるのでありがたい。印刷関係の機能は、IEのほうが便利なような...IEだと、選択した部分だけプレビューして印刷が可能で、紙が無駄になりません。

「Firefox 3」が公開、その内容に迫る (2008-6-18)
Firefox 3 - 機能概要
Firefox 3 ダウンロード

木曜日, 6月 26, 2008

GenaratePassword.java

As the name suggests -- this snippet generates an 8-letter password (that's all).


public class GeneratePassword
{
public static void main(String args[])
{
String alphanumeric="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int len=alphanumeric.length();
for(int i=0;i<8;i++)
{
int index=(int)Math.floor(Math.random()*len);
System.out.print(alphanumeric.charAt(index));
}
}
}

火曜日, 6月 24, 2008

端末は2万3000円から iPhoneで料金プラン

「iPhone(アイフォーン)」
アップル社の iPhone がついに7月11日に発売。昨日23日、ソフトバンクモバイルはついに料金設定を発表したようです。端末が8GBのもので2万3040円、16GBのもので3万4560円(等差数列ですねこれは)。インターネット接続が定額の「パケット定額フル」プランで月々7280円からの2年間契約が条件とか。

端末は2万3000円から iPhoneで料金プラン (2008-6-23)
iPhone 割賦で月々960円から ソフトバンク発表 (2008-6-24)
端末は2万3000円から iPhoneで料金プラン (2008-6-23)

火曜日, 6月 17, 2008

Firefox3のダウンロード・デイは、19日 2:00 まで


Firefox3のダウンロード・デイは、2008 年 6 月 18 日 17:00 (日本時間では翌 19 日 2:00) まで。

Firefox 3は、確かに速い。タブの切り替えが瞬時に行われます。ダウンロードページのURLは重いので、リンクに直接飛ぶと、とどこおりなくダウンロードできます(そちらをメールしてくれればいいのに>Mozillaグループ)。

Windows版ダウンロード

#なんでIEじゃいけないの、とか聞かれたらどうしようかと思う(しかし、会社では「もしかして、反マイクロソフトなの」と言われた)。

Firefox 3 無料ダウンロード

ダウンロード状況を、地図で表示する素敵なサイトがこちらに → Firefox 3 の灯

「Firefox 3 の灯」とは]

「Firefox 3」の市場シェアが早くも6%台に--Net Applications調査 (2008-6-20)

日曜日, 6月 15, 2008

LED基礎知識


7月の洞爺湖サミットが近くなり、地球温暖化の話題が多く語られています。

ニュースでは、「エコ」「省電力」な製品として、LEDの話題がとりあげていました。LEDの照明灯というものがあるそうです。LEDは確かに省電力です。東芝のE-COREという製品では、40W相当の明るさのもので5.3W、60W相当のもので7.8W。そして、寿命が長いのがLEDの特色とかで、カタログスペック40000時間。気になるCO2排出量は、クリプトンランプ比較で約10分の1(40W)、約7分の1(60W)。

LEDの寿命は、何で決まるのか...松下のサイトに説明がありました。

LED基礎知識
E-CORE[イー・コア]は消費電力1/7で白熱灯器具と同等の明るさを実現した高効率ダウンライトです
動画で見るLED基礎知識

金曜日, 6月 13, 2008

バックアップ

バックアップにどのメディアがいいかと調べてみると、ブルーレイは、メディアが単価430円(25GB)、プレーヤーが2万5800円。DVD-R DL規格のDVDで、9.4GB、単価795円。1TBのハードディスクが15400円。

#バックアップはこまめに

水曜日, 6月 11, 2008

Google Map API: Longitude and Lattitude

The Google Maps API offers an address look-up and one of the feature is
that the engine can search for the lattitude and longitude of the
specified query. The first thing you need to do is to access here
(Sign Up for the Google Maps API) and get an API key. Then a php file,
something like this one will do the search for you.

火曜日, 6月 10, 2008

iPhone、低価格が魅力に 来月発売、機能や戦略に課題も

アップル社はソフトバンクモバイルを通して、iPhone を日本で販売すると発表。

米アップル:iPhone、低価格が魅力に 来月発売、機能や戦略に課題も (2008-6-11)

日本語の iPhone のデモをリンクしようと思ったのですが、ちょっと見つからない。店頭で、実際に操作することをオススメします。「すばらしい操作性」「秀逸なデザイン」「持っていたい一品」だと思います。

【iPhone】情報小出しで“狂想曲”増幅 アップルのしたたか戦略 (2008-6-10)

低価格設定で、端末販売台数を伸ばすことのほうが重要、という戦略だとか。

アップルがiPhone 3Gを披露、価格は199ドルから

気になるのは、通信料ということでしょうか。

金曜日, 6月 06, 2008

Firefox 3、リリース日に24時間最多ダウンロード記録に挑戦

6月中旬に発表のFireFox3、高速・安定化を目指して改善されてるそうです。

「Gecko 1.9 レンダリングプラットフォームを基盤としており、描画速度や安定性が向上する。また文字と画像を同じ縮尺のままページを拡大・縮小するフルページズーム機能やSQLiteを活用したブックマーク機能など、数多くの新機能を備える」

Firefox 3、リリース日に24時間最多ダウンロード記録に挑戦 (2008-5-29)

さらに、ダウンロード数でギネスブックに挑戦する!イベントが。

FireFox3 の一日のダウンロード数を競うイベントがMozilla Foundations から発表。

国別に色分けされたマップが、サイトに載ってます。

ギネス世界記録への挑戦
より良い Web 体験を楽しもう Download Day



ちなみに、FireFoxのシェアは、18.41%(Net Applications発表、2008年5月)。



Safari 6%突破 Firefox 3すでにOpera超え、IEは純減 (2008-6-5)

(会社でFirefox3のダウンロード・デイの話をすると、「ダウンロードすると、なんか得するわけ?抽選かなんかで景品でもつければ」「ダウンロードの際に、サーバーがパンクしないのか」と言われた。)

日曜日, 6月 01, 2008

和電国際:アップルとの「iPhone」販売に合意

香港の和電国際は29日、iPhone販売でアップル社と提携に合意したという。ソフトバンクはiPhoneを提供する、という情報があるという。マイクロソフトはWindows 7で、iPhone 形式のタッチスクリーンを導入するという。

和電国際:アップルとの「iPhone」販売に合意 (2008-5-29)

ところで、iPod って、これ中国製なんですよね。

機械部品がないっていうか。

金曜日, 5月 30, 2008

迷惑メール法の改正案が成立、事前同意無しの広告メール送信は違法に

迷惑メール法の改正案が、今日30日に国会を通過して成立、6ヶ月以内に施行されるというニュース。米国では、240億円の罰金が科せられたケースがあったり、この世界もすこしは動いてるフンイキがあります。迷惑メール対策、送信者のアドレスの検索方法というのがあるわけですが、行政が絡むと安心。個人ではなかなか対策の立てにくいものがあります。

迷惑メール法の改正案が成立、事前同意無しの広告メール送信は違法に (2008-5-30)
迷惑メール送信、全面禁止に 改正法成立 (2008-5-30)
迷惑広告規制の改正メール法成立 (2008-5-30)
迷惑メールに240億円 米、過去最高の支払い命令 (2008-5-14)
spamの被害に遭い始めたら

木曜日, 5月 29, 2008

青空文庫専用ビューアー「Aozora Viewer」最新版、表示を高速化

青空文庫の読める、Javaベースのアプリ(の最新版)が公開。いいですねえ。フォントがずれるきらいはあるけれども、縦書きで読めます。

青空文庫専用ビューアー「Aozora Viewer」最新版、表示を高速化 (2008-5-28)

水曜日, 5月 28, 2008

クラスをアンロード・リロードする

いまさら、でもちょっと気付いたことを...

Javaで初期時のインスタンス化において読み込んだクラス定義は、forName()でインスタンス化してもアップデートされない。forName()は、クラス名を動的に指定することができるが、動的な読み込みのためではない。ClassLoaderを使うと、クラスを定義するパスを動的に指定できるが、動的な読み込みのためではない。

クラス定義は、ローダーを指定し、クラスとローダーを共にアンロードしても、アンロードしないようである(JDK6.0、Windows環境で)。明示的に指定させない理由は、理解しがたい。使用する際には、その事実を念頭においてプログラムしなければならない。

日曜日, 5月 25, 2008

「JavaOne 2008レポート」見えてきたJava SE 7

Javaの新しいバージョン、Java SE 7 が議論されているとか。

つまんない変更を加えて、そんなことよりも仮想マシンの普及に力を入れて欲しい、とわりに深刻に悩む毎日なわけですが、「モジュール」、「プロファイル」が導入されるというニュース。

オブジェクト指向言語では、C言語で言う構造体を、「カプセル化」しており、クラス構造体のメンバ変数へのアクセス権を指定できます。Javaでは、さらにクラスをまとめた「パッケージ」を指定し、DLLのように扱うことが可能です。「モジュール」では、複数のパッケージをまとめ、アクセス権を定義するということらしい。「プロファイル」とは、rt.jar のサブセットだそうです。「言語仕様・管理」については、例外の複数指定、javadocの形式変更・追加、ファイルIOの強化、JMXその他野心的な改変が語られているらしい。

「JavaOne 2008レポート」見えてきたJava SE 7 (2008-5-24)

It took me some time before I realize that the package private is the default setting of all the Java variables and methods when they are set within a class. The modifiers are only public and private and the possibilities of module thing coming in the next version of SDK, I was to reaffirm what those are. The Java tutorials used to write something like the default being public. Yeah, I am sure of that.

金曜日, 5月 23, 2008

iPod touch

iPod touch の操作性はすばらしい。

まず、全画面タッチスクリーンは、画面の大きさが違う。まさに「全画面表示」である。操作に必要な、大きなボタンがオーバーレイで表示され、捜査が終了すると消える。

LANでネットにつなげる強みは大きい。youtube がそのまま閲覧できる。青空文庫、Gutenberg サイトへ飛べば、本がそのまま読める。

iPod touch に、ZiPhone というフリーのソフトを用いると、おなじみのフリーソフトがインストールできる(フリーソフトによる脆弱性で、プラットフォームがWindows程度にオープンになるという経営上の不安がIT記事には散見される)。

サードパーティアプリを使うと、辞書も使える。

日曜日, 5月 18, 2008

OpenOffice 2.4

OpenOffice 2.4 は、日本語変換エンジンを独自で持つらしい。起動と動作が速くなっている。PDF変換すると、画像にするため、フォントの質がよくない。

OpenOffice 2.4

タイ語

タイ文字の子音は、高中低の声調を持つ。サンスクリット語を記述するのに、サンスクリット語の音にあわせて文字をあて、それぞれ声調が異なるためという。しかし、現代タイ語ではすでに音価を変えているため、無気音は中子音、鼻音は低子音というルールしか適応できないらしい。

「iPhoneが日本に上陸する日」

メディアの記事を読んでもまったく業界の戦略は読めず、主導権のありばもはっきりせず、なぜかIT関係者には人材があまりにも少ないというイメージが付着するのは避けたい。

「iPhoneが日本に上陸する日」という本が昨年発行されている。

日曜日, 5月 11, 2008

プログラムを書く人の、さまざまな動機

プログラムを組むことに批判的な記事は、大手メディアの体質によるものである。プログラムを動かして楽しむ読者に対する配慮がまったくなく、その感動を語ることも少ない。コードの巻き方を伝授するくらいなら、プログラムを動かして便利になる生活を語ったほうが、いわば教育的ではある。

キーワードは、「自作アプリ」であり、「カスタマイズ」である。生活に密着した、その人ならではのアプリの開発は、商品価値を高めるばかりではなく、社会的現象として、現代の文化の欠かせない要素である。そして、プロブラム作成は、職業ライターの権威であると同時に、すべての人間に開かれた技術であるべきである。開かれた技術とは、著作権を反故にすることではない。そして、技術を提供するということは、社会参加の重要な行為である。著作権とは、公開の是非を著作権の持ち主が保有するということに他ならない。

ゲームソフトの作者と、カスタム・ソルーションのアプリ作者兼メンテ作業員と、IT技術の解説者、消費者側に立つべき企業の商品開発方針はもちろん異なる。しかし、ここでは、マシンを使う人間はすべて消費者(=ユーザー)であることに留意すべきである。ユーザーがもっとも使いやすい、手になじむ、自分のものと思えるマシンとは、つまり便利に使えて、信頼性があり、そして要求を聞いてくれるアプリがあってこそである。

プログラミング言語でいえば、信頼性とはライブラリの充実と着実な実装であり、使いやすさは情報量に多くの部分を依存する。必要な機能が実装されていないライブラリで、先人と同じ苦労をすることは、少なくとも技術の進歩とは言いがたい。Javaの存在で、モバイル機器を含む多くのプラットフォームで、自由が確保され、生活がこんなにも豊かになることを改めて強調したい。

土曜日, 5月 10, 2008

JavaアプリをPalmのPRC形式に変換して起動する

iPodやiPhoneで6月にもJavaが正式サポートされる可能性があるそうです。早速、モバイル用のJava、J2MEで書いてみました。試みに、Palmマシンで動かしてみましたので必要なツールなどここに書きとめておきます。

5月10日現在、最新のWTK(ワイヤレス・ツールキット)は、WTK2.5.2で、MIDP2.1、CLDC1.1まで使えるようです。しかし、Palmマシンで動かすには、PRC形式に変換しなければなりません。ここでは、WTK1.0.3についてくる PRC Converter Tool を使用しました。

まず、WTK2.5.2を立ち上げて、プロジェクトを作成し、設定(Settings)のAPI Selection をMIDP1.0にします。プログラムが無事コンパイルできたら、ProjectメニューのPackageから、Create Packageを選択し、JARファイルに圧縮します。

次に、WTK1.0.3を立ち上げて、File メニューのUtilities から、PalmOSEmulator を選択します。右上にGenerate PRCという表示がでてきますのでクリックすると、PRC Converter Toolが起動します。JARファイルを選択して、FileメニューからConvertを選び、PRC形式に変換します。

あとは、PRCファイルをPalmマシンに送るだけです。実際に動くまで、必要なファイルを探すのに苦労したのでここに書いたことが役に立てば幸いです。もっとも、ベストな方法であるかどうかの保障は当然ながらありません。

書いてみたアプリはこちら→ Java をモバイル機器で動かす

水曜日, 5月 07, 2008

ボーダフォン、iPhoneを新たに10か国で販売開始

ボーダフォンは6日、新たに10カ国でiPhoneを売り出すと発表

ボーダフォン、iPhoneを新たに10か国で販売開始 (2008-5-6)
3G iPhone日本発売はいつ? (2008-5-7)
3G iPhone発売に対応?--AT&T、6~7月の休暇取得を禁止 (2008-5-7)
3G対応「iPhone」は199ドルか--AT&T価格をFortuneが報道 (2008-5-1)
中国のiPod所有者の88%はiPhoneに興味あり,米Pearl Research社が調査 (2008-4-10)

マスコミで見えてくる政治、というのは、民主主義とは微妙に異なる。マスコミとは、イメージを作り上げる政治である。コンテンツ作成者の、腕の見せ所ではあるが、その「なんとなく」「本格的みたい」な自民党のイメージは、山口補選を注視してきた人間にとっては歯がゆいものである。

政治とは、仲介業でもある。いやがる人間を捕まえて、なんらかの妥協案を強制し、「役に立っている」といいたがるものである。胡錦涛は「おしん」を称賛したという。しかし、「スポコン」モノは、コンテンツ作者の間でも敬遠される傾向にある。

政治といえば、アップルのジョブズ氏はやたらに人気があるという。カリスマ性というらしいが、カリスマ性のない指導者を見慣れている日本人には、まったく驚愕に値する。ソフト配布を一元化するという。CNETに類似する仕組みがあるが、発表されるソフトの多さは、マシンの強みである。ニッチという市場はあるが、先に独占すると携帯アプリ的な収入が見込めるという目算はある。

面白い企画だと思わせるのは、やはり政治であり、コンテンツ作成者の腕がかかっている。iPhone、iPodはすばらしいマシンである。自由に使いこなせれば、消費者としてこれほどのメリットはないだろうと思う。

火曜日, 5月 06, 2008

ProGuard: Javaバイトコードの軽少化・最適化・難読化に

Obfuscator というツールがあり、Java プログラムをコンパイルしたバイトコードの逆コンパイルを防ぐという。最適化も行うという。なかなか完成度の高いツールで、頼りにできそうなありがたいプログラム、ダウンロードはこちら → ProGuard

自作アプリで試してみたところ(Tibetan.jar)、4.2kのものが3.9kに。

ちなみに、Tibetan.jarはチベット語入力アプリです。チベット語を入力して画像に落とせます。使い方は、JARファイルをダウンロードして起動。

java -jar Tibetan.jar

チベット語に興味のある方、どうぞ。

月曜日, 4月 28, 2008

サン、iPhone向けJVMの開発意向をあらためて表明――アップルとの交渉を継続

サン・マイクロシステムズ社は、アップル社に、iPhone向けのJVM開発への協力を要請しているという。

サン、iPhone向けJVMの開発意向をあらためて表明――アップルとの交渉を継続 (2008-4-25)

オープンな規格で広い世界が展開しているプラットフォームのほうが、使い捨てる技術より、労力、投資のわりに見返りが大きいということを、(改めて)強調したい。

国内販売に関して、アップル社との提携の話がいくつかの企業と進められているという。

ヘルプもチュートリアルもなしに、プログラムを書くのは困難を伴うが、Javaなら可能である。言語設計がいいからである。携帯アプリ用のJavaはAPIがいくらか異なるが、スマートな基本設計がプログラムの作成を容易にしている。オブジェクト指向のライブラリ設計には、抽象クラスとインターフェースクラスの構成が、コンポーネントとその動作を別に記述することのできるJavaライブラリのメリットを発揮している。

Sun Java Wireless Toolkit for CLDC 2.5.2
MIDPプログラミング入門

日曜日, 4月 27, 2008

MFCで拡大印刷する

チベットの旗を(印刷紙)4倍にして印刷するにはどうするか。

MFCで書いたので、そのコツをまとめておくと...

ページ数を規定する。印刷する画像のサイズを計算してSetMaxPage(int)で指定する。OnBeginPrinting()などで行う。

CDCのオフセットを指定する。ページ数を取得して、位置を指定する。OnPrepareDC()で行う。

OnDraw()で、CDC::IsPrinting()のときに、印刷用に画像を描画する。

MFCで拡大印刷する Morph-1.0.0.zip Free Download

日曜日, 4月 06, 2008

オンラインでチベット語を入力するアプリ

Javaでチベット語入力用アプレットを作ってみました。

Tibetan Online Keyboard

フォントはTibetan Machine Uni を使っています。

チベット語についてのメモ

チベット文字の表示

ང་རི་པིན་ནས་ཡིན། (日本人です)

木曜日, 2月 14, 2008

Java is the nicest thing to have.

What this administration did was to distort opinions so that the targets will be directed to somewhere that is irrelevant to thier teams. But what we say is true and will be true for the foreseeable future, and the situation will exactly be the same if they do not take actions. Their stores won't motivate the people here to do better
jobs nor to get better skills. They do not have pride in their works. It will take forever to get their job done.

Java is the nicest thing to have.

Here is the Grep.java program I've just written.

Java JDK

日曜日, 2月 03, 2008

Unicode Hex Representation

I just happened to have had some needs to know the unicode hex for certain unicode characters. Here are the javascript that does the conversion from the given unicode string to its hex representation. Please feel to take it from here.

Unicode Hex Representations

土曜日, 2月 02, 2008

ソニー、デジタル一眼「α」初のライブビュー搭載の「α350」など発表

ソニーは、デジタル一眼レフ「α100」の後継機種の「α200」を2月に、ライブビュー付の「α350」を3月に発売すると発表したらしい。

ソニー、デジタル一眼「α」初のライブビュー搭載の「α350」など2機種 (2008-2-1)

フォーカスが早くなり、高感度になる、α350では画素数が1420万画素ということらしい。

土曜日, 1月 26, 2008

To implement Emacs styled "kill-line"

What I found out today is that emacs styled "kill-line" is really a thing that makes you feel you're in fact using the program like a part of you. Just because it will get you to a part of the program, it indeed is going to make you feel better using the software. That kind of application is something that all of us would have to want to program.

To look at what "kill-line" is, try the Java applet editor in my Zhuyin page. The popup menu of the Java applet editor shows the "Cut Line" that is much like "kill-line" and delete the text from where the caret is to the end of the line. "Copy Line" does just as you assume, it selects the portion of line to the end and that part is copied to the system clipboard.

In case you want to know the beautiful Java lines that can accomplish these tasks, here are the codes.


boolean isLineEnd(char ch)
{
return (ch=='\u2029'||ch=='\u2028'||ch=='\u0085'||ch=='\n'||ch=='\r');
}

public int getLineEndPosition()
{
int index=-1;
String text=textArea.getText();
if(!text.isEmpty())
{
int pos=textArea.getCaretPosition();
index=pos;
int len=text.length();
while(!isLineEnd(text.charAt(index)) && ++index<len);
}
return index;
}

void cutLine()
{
int start=textArea.getCaretPosition();
int end=getLineEndPosition();
textArea.setSelectionEnd(end);
textArea.replaceSelection("");
}

void copyLine()
{
int start=textArea.getCaretPosition();
int end=getLineEndPosition();
textArea.setSelectionEnd(end);
textArea.copy();
}

Java is wonderful. >> C/C++ only programmers

Java is wonderful. If anything, I could complain just a few things, like sometimes, they use English that is not entirely correct in the sense that makes me feel that some English speaker is making fun of Japanese. Maybe it is too much of programming on my part (^^;) but anything that is uncertain about the language is just painful. Here is this Java compiler error message. The error message must convey the precise meaning of what is going on in the program -- and not in other part of the world. ^^

Please remove or make sure it appears in the correct subdirectory of the classpath.

木曜日, 1月 24, 2008

Javaで書いたプログラムがもっとも古びず、長持ちする

けったいな意見の持ち主がいて、プログラムを書くと「マイクロソフトに利用されている」という。しかし、プログラムを書くのはプログラマで、プログラムを使うのはユーザーである。同様に、政治的意見を持つのは国民で、政治の結果をもろにかぶるのは市民である。

Javaで書いたプログラムがもっとも古びず、長持ちする。プログラマとしては他に換えがたいメリットがある。95で書いたプログラムは、もう目にする機会もない。

こちら、自作ソフトのページ↓です

Java Programming

月曜日, 1月 21, 2008

Suppose you want to use my OnScreenKeyboard class.

What is good about Java is, as they say -- write once, run anywhere. It means that the everything you write won't be wasted in a way that not only you can have it but also that you have it on your way. Java classes are extendable. Only thing that the programmer must be aware of is to set the classpath right.

In case you want to use my OnScreenKeyboard class, download (easai.jar).
The OnScreenKeyboard class is in easai.util package so import the package to use the class.

import easai.util.*;

...

OnScreenKeyboard keyboard
=new OnScreenKeyboard("Taiwanese",this);
keyboard.init();

OnScreenKeyboard constructor takes a string argument that specifies the language and an ActionListener. This ActionListener is a wonderful thing that makes this component usable for any of the application you wish.
You just have to set the ActionListener to receive all the output from the OnScreenKeyboard application.


public void actionPerformed (ActionEvent e)
{
String command=e.getActionCommand();
String ch=command.substring(0,1);
int pos=textArea.getCaretPosition();
textArea.insert(ch,pos);
}



Please have a look at this application that uses the OnScreenKeyboard class if what is describe above is not entirely clear to you.

/* TaiwaneseApplet.java -- Zhuyin on screen keyboard
*
* Copyright (C) 2008 Erica Asai

* This program is free software;
* you can redistribute it and/or
* modify it under the terms of the
* GNU General Public License
* as published by the Free Software
* Foundation; either version 2
* of the License, or (at your option)
* any later version.
*
* This program is distributed in
* the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without
* even the implied warranty of
* MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the
* GNU General Public License
* for more details.
*
* You should have received a copy
* of the GNU General Public License
* along with this program; if not,
* write to the Free Software
* Foundation, Inc., 59 Temple Place
* - Suite 330, Boston, MA 02111-1307, USA.
*
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import easai.util.*;

public class TaiwaneseApplet extends JApplet implements ActionListener
{
JTextArea textArea=new JTextArea(15,50);
JButton clear=new JButton("Clear");
JButton larger=new JButton("Font Size (+)");
JButton smaller=new JButton("Font Size (-)");
OnScreenKeyboard keyboard
=new OnScreenKeyboard("Taiwanese",this);

public void init()
{
keyboard.nButtons=10;
keyboard.init();

clear.addActionListener(this);
larger.addActionListener(this);
smaller.addActionListener(this);

JPanel control=new JPanel();
control.setLayout(new FlowLayout());
control.add(larger);
control.add(smaller);

JPanel textPanel=new JPanel();
JScrollPane textScroll=new JScrollPane(textArea);
textPanel.add(textScroll);
textPanel.add(clear);

JPanel panel=new JPanel();
BorderLayout layout=new BorderLayout();
panel.setLayout(layout);

JPanel keyboardPanel=new JPanel();
keyboardPanel.setLayout(new BorderLayout());
keyboardPanel.add(keyboard,BorderLayout.CENTER);
keyboardPanel.add(control,BorderLayout.SOUTH);

panel.add(keyboardPanel,BorderLayout.NORTH);
panel.add(textPanel,BorderLayout.CENTER);

JScrollPane scroll=new JScrollPane(panel);
add(scroll);
}

public void actionPerformed(ActionEvent e)
{
String command=e.getActionCommand();
if(0<command.length())
{
if(command.equals("Clear"))
{
textArea.setText("");
}
else if(command.equals("Font Size (+)"))
{
keyboard.resizeFont(2);
}
else if(command.equals("Font Size (-)"))
{
keyboard.resizeFont(-2);
}
else
{
String ch=command.substring(0,1);
int pos=textArea.getCaretPosition();
textArea.insert(ch,pos);
}
}
}
}



The way to set the classpath right is a bit technical. The package name of the OnScreenKeyboard class is "easai.util". As that all the Java classes are organized in the most familiar way of directories, You must store the class file in the directory named easai/util as follows.


+--easai--util
--+
+--your Java application directory


Then compile your Java application with a proper classpath option.


javac -classpath ".;.." *.java


Visit this site (http://easai.00freehost.com/Zhuyin/index.html) to see how it runs.

土曜日, 1月 19, 2008

Character.UnicodeBlock: To obtain the character set

In line with the InputContext article the other day to alter keyboard setting and the font range, I would like to present here the following code to obtain the character set and set the locale for the InputContext.

With the use of Character.UnicodeBlock.of(char), and the returned value of the UnicodeBlock information, the locale can be set -- manually. Suppose you have a JTextArea and the cursor is on the area of the text that you want to add some input.

Bopomofo (Zhuyin) is a set of alphabets that is universally used in Taiwan. In the following code, the character under the cursor is examined and the locale is set to Locale.TAIWAN if it is a Zhuyin character.


int pos=textArea.getCaretPosition();
String text=textArea.getText();
char ch=text.charAt(pos);
Character.UnicodeBlock block=Character.UnicodeBlock.of(ch);
Locale current=Locale.US;
if(block==Character.UnicodeBlock.BOPOMOFO)
current=Locale.TAIWAN;

木曜日, 1月 17, 2008

Sun Microsystems to buy MySQL

What does it mean for us, for Sun Microsystems to buy MySQL? The answer: BB+.

Sun Microsystems' ratings unaffected by agreed MySQL acquisition - S&P (2008-1-17)

But for MySQL users, it's a blessing. It means (probably) formal driver supports, documentation supports and package distribution under Java JDK.

I use MySQL with a jdbc driver and from Java application, DB access is as easy as ever. Just like Java. Here is how to open a database connection.


Class.forName(driver).newInstance();
connection = DriverManager.getConnection(openDBString+database,user,password);
statement=connection.createStatement();


I say, Java is wonderful. How about this? To browse through the database and print out whatever satisfies the condition, the following does the job.


ResultSet rs = statement.executeQuery("SELECT * FROM "+tableName+condition);
ResultSetMetaData meta = rs.getMetaData();
int nCol=meta.getColumnCount();
while (rs.next())
{
String buf=template;
for(int i=1;i<=nCol;i++)
{
String columnName=meta.getColumnName(i);
System.out.println(columnName,new String(rs.getBytes(i),"UTF8"));
}
}


I say, Java is wonderful.

...

I will declear new and then they must delete it. > obsolete programmers

But it is new you know.

...any problems? ^^

月曜日, 1月 14, 2008

Select and set a locale for InputContext from the available locales list

Yesterday, I wrote in this blog about InputContext and how to set the language environment. Here are some more codes for listing up all the available languages, from which you can select the Locale and set it for the InputContext for your application.


Locale locales[]=Locale.getAvailableLocales();


A word of caution is that not all listed locales are available for InputContext -- of those, only that has both the language code and the country code can be set to use. But once you have the array of strings for the available locales, this input dialog will do the job nicely to put all locales in scrollable pane and wait for user input. Here, names is the string array that contains the list of locales.


Object selectedValue = JOptionPane.showInputDialog(null,
"Select a locale", "Language",
JOptionPane.INFORMATION_MESSAGE, null,
names,names[0]);


Perhaps it gets more clearer if you look at the code so I put it right here. Here all the locales that only have either the country code or the language code are filtered out. This is what this following code does: the list of locales will be presented and then when a value is selected, the locale will be set for the InputContext.

As of 2008-1-16, the code has been modified so that the list will be sorted out in alphabetical order.

   public void langList(JMenuItem mi)
{
int x=mi.getX();
x+=mi.getWidth();
int y=mi.getY();
Locale locales[]=Locale.getAvailableLocales();
String names[]=new String[locales.length];
String languages[]=new String[locales.length];
String countries[]=new String[locales.length];
int index=0;
for(int i=0;i&lt;locales.length;i++)
{
languages[index]=locales[i].getLanguage();
countries[index]=locales[i].getCountry();
if(!languages[index].isEmpty() && !countries[index].isEmpty())
{
names[index]=locales[i].getDisplayName();
index++;
}
}
int nLocales=index;
int sortedIndex[]=new int[nLocales];
String sortedNames[]=new String[nLocales];
for(int i=0;i&lt;nLocales;i++)
sortedIndex[i]=i;
for(int i=0;i&lt;nLocales;i++)
{
for(int j=i+1;j&lt;nLocales;j++)
{
if(0&lt;names[sortedIndex[i]].compareTo(names[sortedIndex[j]]))
{
int t=sortedIndex[i];
sortedIndex[i]=sortedIndex[j];
sortedIndex[j]=t;
}
}
}
for(int i=0;i&lt;nLocales;i++)
{
sortedNames[i]=names[sortedIndex[i]];
}
if(0&lt;nLocales)
{
Object selectedValue = JOptionPane.showInputDialog(null,
"Set Language Environment", "Language",
JOptionPane.INFORMATION_MESSAGE, null,
sortedNames,sortedNames[0]);
int i=0;
if(selectedValue!=null)
{
while(!((String)selectedValue).equals(names[i]) && ++i&lt;nLocales);
if(i&lt;nLocales)
{
Locale newLocale=new Locale(languages[i],countries[i]);
inputContext.selectInputMethod(newLocale);
}
}
}
}

日曜日, 1月 13, 2008

InputContext and IME

I had such an unpleasant time looking through pages about IME -- as if everybody is using languages that use alphabets only. But for the most of us who use not only alphabets but also other scripts, here are some pieces of advice. Just a few lines -- but you can control IME from Java applications.

InputContext inputContext=null;
inputContext=frame.getInputContext();
inputContext.selectInputMethod(Locale.JAPAN);

This turns on Japanese IME. If you alter the locale to Locale.TAIWAN, or instantiate the class with language and country codes as:
Locale locale=new Locale("hi","IN");

then you can turn on the IME of your choice from your Java application.

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...