木曜日, 9月 10, 2009

パナソニックもLED電球に参入

省電力・小型・長寿命なLED電球に、続々と企業が参入で、期待大。

パナソニック、LED電球に参入 10月発売へ (2009-9-10)
パナソニックもLED電球に参入 (2009-9-10)
三菱、60W白熱電球相当の明るさのLED電球 (2009-9-10)

アキバで売ってる安いのだと、青っぽかったりしてトイレとかだと使えるってカンジですけどね。エコだと思うといいもんです。

金曜日, 9月 04, 2009

MySQLの行く末を保証せよ - EU、OracleのSun買収について詳細調査を開始

欧州委員会は3日、データベース大手のオラクルのサン買収について、追加の調査を実施すると発表したという。

オラクルがMySQLを保有するサンを買収することで、MySQLが有料化されたり、開発が止まったりする懸念について調査するという。

欧州委員会の最終決定は、2010年1月19日以降になるという。

MySQLの行く末を保証せよ - EU、OracleのSun買収について詳細調査を開始 (2009-9-4)

金曜日, 8月 14, 2009

米マイクロソフトのZuneHD、iPod下回る価格設定

マイクロソフト社は13日、ポータブル・メディアプレーヤーZune(ズーン)HDの価格設定を発表したという。

ZuneHD は、Windows CE を搭載、CPUは ARM ベースの NVIDIA Tegra 。

iPod に対抗するとし、価格は219.99ドル(16GBモデル)、289.99ドル(32GBモデル)、発売予定日は9月15日という。

FMラジオ機能があるほか、HDMI端子がついており、テレビに動画が送れるという。

米マイクロソフトのZuneHD、iPod下回る価格設定 (2009-8-14)
ZuneHD
zunerama

オプションでFM電波を飛ばせるため、カーステレオで音楽が聴けるということでした。

日本発売は予定がないそうです。

金曜日, 7月 31, 2009

MicrosoftとYahoo!が検索分野で10年間に渡る提携を発表した狙い

マイクロソフト社とヤフーは検索エンジンを共同開発するという話題があがってますよね。

MicrosoftとYahoo!が検索分野で10年間に渡る提携を発表した狙い (2009-7-30)

もっぱら、グーグルばかり使ってた人間ですが、自分のサイトが登録されていなかったので...(笑・なぜだろう)

言語学のページ

楽天のサイトなのに理由が分かりません。

競争があるのはありがたい、と実感したという顛末でした。

日曜日, 7月 26, 2009

Microsoftが欧州でWindows 7に「ブラウザ選択画面」,ECが歓迎の声明


米マイクロソフト社は24日、新たに販売されるWindows7に「バロット・スクリーン」(投票画面)を設置し、ブラウザを選択できるようにすると発表したという。

PCに標準搭載されるOSに、特定のソフトウエアがバンドルされることは市場独占につながるとする意見に対し、マイクロソフト社は自社のブラウザ、IEをバンドルしない方針を表明していた。

欧州委員会はこのマイクロソフト社の方針に否定的コメントを発表していたという。

これに対し、マイクロソフト社は5種類のブラウザから選択できる「バロット・スクリーン」の設置を提案しているのだという。

マイクロソフト社は、IE, Firefox,Safari,Google Chrome,Opera を提案しているという。

PCメーカーは、ブラウザをプリインストールすることができるという。

Microsoftが欧州でWindows 7に「ブラウザ選択画面」,ECが歓迎の声明 (2009-7-26)

個人的には、アドオンの豊富なFirefox、起動の早いChrome,IEしか対応していないサイトがあるのでIE ...といったところが好みですね。

特に、アドオンでムカつく画像を消せたり、CSSを変えられたりできるので、Firefoxに一票。adblockとstylish、flashblockなどお勧めです。

もちろん、IEならIE7Proを使うと、広告がブロックできます。アドオンを有効にして、ツールメニューからIE7Pro preferencesをクリック。広告ブロックにチェックを入れると、広告がカットできます。

選べると、シェアが変動するので、サイトのほうも対応して変わってくる。

楽しみですね。標準化なるか、あるいはブラウザを指定するようになるか。

標準化したところで、ChromeOSの登場とか。

月曜日, 7月 20, 2009

Microsoft、「オンライン版Office」でGoogleに対抗

サンが買収されるまで、仮想マシンを散々に言ってきたマイクロソフトがこうである。「どこまで仮想化できるか」

そのマイクロソフトはオンラインのオフィスを提供する予定と発表している。

金のためにマイクロソフトは技術の発展を止めた、というのは不都合な真実というよりは現在の、特に米国の、そして日本の企業文化に対する理解への必要性を理解するべきであろう。

「仮想化したら重い」という批判とともに、仮想化・標準化は絶対にいい、かならず必要になる、メモリ制限などなくなるに決まっているという意見がある。

先走るのは、技術的にデメリットがあるというより、社会的なアクセプタンスの問題が生じる。

Microsoft、「オンライン版Office」でGoogleに対抗 (2009-7-14)

金曜日, 7月 10, 2009

Firefox で埋め込み画像の機能

つい先だって ver. 3.5 の発表されたFirefox ですが、Firefox には IE にはない機能があります。

埋め込み画像の機能です。画像を(バイナリでなく)文字コード化して表示できます。

ページを保存するだけで、中の画像が別ファイルなしで表示できます。

タグのフォーマットは、IMGタグにBASE64でエンコードされた画像を記述します。

PHPコードで、試験的に画像ファイルを読み込んで、埋め込んで表示するコードを書いてみました。



$fileName="hatch.gif";

$fd=fopen($fileName,"r");
$contents=fread($fd,filesize($fileName));
fclose($fd);

echo "<img src='data:image/gif;base64,". base64_encode($contents)."'>";




base64_encode()関数を用いて画像ファイルをエンコードし、埋め込んでいます。

水曜日, 7月 08, 2009

米グーグルがパソコン用OS「Google Chrome OS」を開発

Google社は8日、ネットブックOS「Google Chrome OS」を開発中と発表。

米グーグルがパソコン用OS「Google Chrome OS」を開発 (2009-7-8)

ブラウザ上でのアプリは、見た目が統一されており、広く普及しているため、Windowsに取って代わるだけの標準となりうる脅威として語られて久しい。

ブラウザだけ動けば、OSは何でもいいとなれば独占市場が切り崩せると、いう夢物語が現実に...?

火曜日, 6月 30, 2009

中国政府、「検閲ソフト」義務化を延期 新華社報道

中国は30日、検閲ソフト Green Dam の義務化を延期すると発表したという。

検閲ソフトはPCにインストールしてネットへのアクセスを制限するもので、建前上は有害サイトへのアクセスを自動的に阻むとしていた。

検閲ソフトは、技術上の問題があったとして批判があったほか、サイト許可リストへの著作権の問題やアクセス許可を国家が行うことへの非難が国内外から殺到しており、米国政府も懸念を表明していた。

中国政府、「検閲ソフト」義務化を延期 新華社報道 (2009-6-30)

月曜日, 6月 15, 2009

コード盗用に脆弱性――中国フィルタリングソフトの問題、米研究者が指摘

米ミシガン大学の研究者らは11日、中国政府がPCメーカーなどに義務付けようとしているフィルタリングのソフト「Green Dam」に、脆弱性を発見したと発表したという。

「Green Dam」は、URLでアクセスを規制するほか、画像を選択的に規制、さらになんとテキスト入力フィールドで入力をチェックするという。

米ミシガン大学のスコット・ウォルチョク氏、ランディ・ヤオ氏、アレックス・ホルダーマン氏らは、「Green Dam」に、URLリクエスト処理のプロセスでバッファオーバーランの脆弱性と、更新プログラムでの脆弱性があるとしている。
さらに、Solid Oak Software社は12日、URLのブラックリストの著作権について CyberSitter からの盗用であると発表しているという。

Solid Oak Software社と米ミシガン大学のグループは、PCメーカーらに「Green Dam」の搭載をとめるよう働きかけていくとしている。

中国政府指定の検閲ソフトにセキュリティ脆弱性--米大学研究チームが警告 (2009-6-15)
中国がPCメーカーに導入義務づけのフィルタリングソフトに盗用疑惑 (2009-6-15)
コード盗用に脆弱性――中国フィルタリングソフトの問題、米研究者が指摘 (2009-6-15)

金曜日, 6月 12, 2009

ウィンドウズ7欧州版、IE搭載せず…独占禁止法に配慮か

マイクロソフト社は11日、Windows 7の欧州版に、同社のブラウザであるIEをバンドルしないと発表したという。

OSにソフトを標準搭載することで、健全な競争が阻害されるという批判に対する、EU競争法(独占禁止法)に基づく処置という。IEについては、「タブ機能」の実装で出遅れるなど、ブラウザ間の競争が健全でないという批判があった。プラグインやアドオンの開発のオープンさ、アプリの起動・動作のスピードなど、ブラウザ間の競争に対する要望は強い。

OSがアプリを標準搭載しないということは、ユーザーにとって、そのままでは動かない、ソフトをインストールする必要がある、ユーザーがばらばらなソフトを使うので標準化されないといったデメリットがある。なんといっても、標準装備というのは便利である。コンテンツを提供する側、ソフト開発側にとっても、標準化されていれば作りやすい。マイクロソフト社の製品が重宝され、必要とされてきた理由のもっとも大きなものである。

ブラウザはOSに代わってデスクトップと同等の機能、標準化されたインターフェースを持ちうるものとして、さらに既存メディアに代わるものとして、重要な意味を持つ。マイクロソフト社が、ブラウザ上でのアプリやアプレットの動作を規制、あるいは阻害する危険性については論議がある。ブラウザ間の競争を促進することは、有効な選択肢をユーザーに与え、多様化をもたらすものであると同時に、開発者側には競争による高機能化と利便性の向上を約束するものである。

今回の措置で、PCベンダーや販売業者は任意のブラウザを搭載して販売できるようになるという。ブラウザ・ベンダー間の競争は、ブラウザ間の競争そのものではなく、ユーザーに有効な選択肢を与えるものであるかどうかは、ベンダーの処置による、という。欧州委員会では、マイクロソフト社に選択肢を提供することを義務付ける案などさまざまな可能性を示唆しているという。

ウィンドウズ7欧州版、IE搭載せず…独占禁止法に配慮か (2009-6-12)
EU、欧州版「Windows 7」からIEを削除する措置に賛否の混じった評価 (2009-6-12)
マイクロソフト、欧州向けにIE非搭載のWindows 7を提供へ (2009-6-12)

月曜日, 6月 08, 2009

中国政府、PCに監視ソフト搭載を義務づけへ 米WSJ

中国政府は、販売するPCにサイトをフィルターする監視ソフト搭載を義務付けるという。

記事からすると、有害サイトをフィルターするウイルス対策アプリのように、常駐して外部へのアクセスを監視するものらしい。

もしそうだとすると、ユーザーに使う意図がなければプロセスを殺すことが可能であり、義務付ける意味はない。さらに、リナックスなどのように、OSを変えてしまえばまったく意味はない。そのような情報が、ユーザーの間で広まらないようにすることで、ある程度のフィルタリングを強制することができるが、そうなると自由な世界の住民をすべて敵に回しているわけであり、考えにくい。

中国政府は、プロバイダや検索エンジンに規制をかけていることで悪評が高い。WikiやYoutubeを閲覧できなくするという究極の愚民政策は、中国政府に「守られている」という意識よりは、「阻害されている」という反発をより多く招くものである。法の網をくぐること、が正義になるようでは、建設的発想はもたらされない。

建前にも、誰も、自国民でさえ納得のできない愚民政策を続けるより、判断をユーザーに委譲することで責任を負う義務を課し、建設的な発想に多数が納得する、選挙、投票による意思決定システムを打ち立てるよう要請したいものである。

中国政府、PCに監視ソフト搭載を義務づけへ 米WSJ (2009-6-8)

水曜日, 4月 29, 2009

オバマ大統領のアドバイザーに、GoogleのEric Schmidt氏ら任命

オバマ大統領の科学技術関連の助言を行うアドバイザーに、GoogleからEric Schmidt氏、MicrosoftのCraig Mundle氏ら20人を任命

オバマ大統領のアドバイザーに、GoogleのEric Schmidt氏ら任命 (2009-4-28)

Schmidt氏は、lexを作ってるんですね。

火曜日, 4月 21, 2009

ソマリ語

ソマリ語は、アジアアフリカ語族の低地東クシ語に属する言語で、他にオロモ語などがクシ語に分類される。内戦状態であったため、教育制度が確立しておらず標準化されておらず、表記のゆれが大きい。Digil/Roxanweyn方言などがあるという。

イスラム法を導入するほどイスラム教の勢力が強く、アラビア語の借用語が多い。アラビア語で朝はサバフであるが、ソマリ語でsubaxとなる。おはようはsubax wanaagsan(スバフ ワナーグサン)。-sanや-anは形容詞につく語尾という。ほか、Qahtaniからの借用語が多いという。

「止まれ」がjoogso(ジョーグソ)。 「はい」がhaa(ハェー)で、「いいえ」がmaya(マヤ)。 「ありがとう」がmahad sanid(マハッド・サニッド)。「こんにちは」がiska warran(イスカ・ワラン)。

長母音・短母音、前舌音・後舌音が区別され、合計5x4=20個の母音がある。長母音・短母音の区別は母音の重複で表し、前舌音・後舌音は表記上で区別されない。

声調があり、声調によって意味が異なる場合がある。

日本語と同じく、膠着語でSOVである。不定冠詞は表記しない。

1972年からローマ字が使われているが、かつてはアラビア文字(Wadeed's writing)が, 20世紀前半にはOsmanya scriptや Borama scriptが使用されたという。

ソマリ語の数字

1 hal ハル
2 laba ラボ
3 seddex セッデフ
4 afar アファル
5 shan シャン
6 lix リフ
7 todoba トドボ
8 sideed シデード
9 sagaal サガール
10 toban トバン
11 kow iyo toban ク・イユ・トバン
12 laba iyo toban ラボ・イユ・トバン
13 sedex iyo toban セデフ・イユ・トバン
14 afar iyo toban アファル・イユ・トバン
15 shan iyo toban シャン・イユ・トバン
16 lix iyo toban リフ・イユ・トバン
17 todoba iyo toban トドボ・イユ・トバン
18 sideed iyo toban シデード・イユ・トバン
19 sagaal iyo toban サガール・イユ・トバン
20 labaatan ラバータン
30 soddon ソッドン
40 afartan アファルタン
50 konton コントン
60 lixdan リフダン
70 todobaatan トドバータン
80 sideetan シデータン
90 sagaashan サガーシャン
100 boqol ボコル

オラクルのサン買収、狙いはハードウェアとソフトウェアの統合システム

オラクルがサンを74億ドルで買収したということです。

サンの買収は、IBMなどの交渉など、メディアの注目が集まっていましたね。

オラクルのサン買収、狙いはハードウェアとソフトウェアの統合システム (2009-4-21)

オラクルはデータベースからの収益が約5割だそうです。

■[企業経営]オラクル、サン買収の先にはCommentsAdd Star

サンは以前にMySQLを買収しているので、行方が気になるところではあります。

■[雑感]どうなるMySQL。オラクルがサンを買収CommentsAdd Starshingotadahasaqui

水曜日, 4月 15, 2009

NHKのラジオ語学講座がネットで視聴できるようになりました

いつのまにかNHKのラジオ語学講座がネットで視聴できるように(一週間分のみ)なってました。

ラジオ番組の音声が聞けます 4月6日10:00~ストリーミング開始

快挙ですね。

復習できるし、リピーターとしても毎日の「収穫」が期待できるようになってます。

木曜日, 3月 26, 2009

MySQL: Counting Rows that Has Same Value

There are many ways to count rows in a database. Here shows grouping the rows and counting them in MySQL database. The keywords are: "group by" to sort out the rows and "as" keyword to set the value to a variable.

Suppose the database has a table 'species' with 'en' field. The "group by" command will set up just one row for each 'en' value. Along with 'en' value, count(en) value will be retrieved in descending order as being set by "order by" command. The results will be a table with representative 'en' value with the count of it.


SELECT en, count( en ) AS cnt
FROM `species`
GROUP BY en
ORDER BY cnt DESC

Java: Drawing Lines of Various Width

Line drawing in Java with Graphics2D, is simple and straight foward except that the line width matters in coordinating the figures you would like to draw. Setting stroke, any line width can be set as follows:


int lineWidth=3;
BasicStroke stroke=new BasicStroke((float)lineWidth);
g2D.setStroke(stroke);


The next step is, however, rather counter-intuitive. The line will be drawn half the pixels left from the coordinate that you specify.


int d=(int)((double)(lineWidth-1)/2.0);


The drawing command will draw line that fills the area (x0,y0) to (x1,y1).


g2D.drawLine(x0+d,y0+d,x1-(lineWidth-d),y1-(lineWidth-d));

火曜日, 3月 17, 2009

プログラミング言語の選択

いわゆる文学の書体というものもあるが、ベストセラーの類いはすでに書き方が変化している。つまり、軽く読める雑誌風の、ときにはファッション雑誌風の意味の取れない文章が「もっとも身近」な種類の人間がいる。

そのトレンドにあらがうつもりはないが、間投詞を多く使い、ひらがなを主体とし、論理より感覚に訴えるノリを好むかどうかは、個人の選択である。それっぽくさ、てな感じで、って書くやりかた?ちょっと抵抗あるっていうやつ?分かる?

プログラミング言語の選択は、まさに政治そのものである。強大な国力を持つ国の言語が、その性質にかかわらず周辺国を制覇するのと同様に、無理にも書き方を同化しろという圧力が常にかかる。

「たいていの人間は英語を話す」と言えば、その意は自明であろう。「たいていの人間は***を使う」と書いて別言語、別ライブラリの使用者の反感をもろに買う。もちろん、英語が主流となるかどうかは、フランスなど国の政策に大きく影響される。

言葉の習得は一生の仕事である。人間が安いところで常に軽はずみな判断による負担が個人にかかる。真剣に選択された言葉の重みは、一生引きずって歩かねばならない支えであり、重荷である。

金曜日, 3月 13, 2009

JTable から値を取り出すときの注意

JTable は、Java で表形式のデータを扱うのにとても便利。

Swing を読み込んで、TableModel を設定して、TableCellEditor クラスを使うなど使いこなすと応用が利きます。

ここで、気づいた点をひとつ。

入力済みの数値はそのまま Integer ですが、編集を可能にして入力を得ると、値は String になります。

下記のようにすると判別できます。



Object obj=table.getValueAt(i,0);
String className=obj.getClass().getName();
if(className.equals("java.lang.String"))
{
String str=(String)obj;
events.events.get(i).from=Integer.parseInt(str);
}
else if(className.equals("java.lang.Integer"))
{
Integer intValue=(Integer)obj;
events.events.get(i).from=(int)intValue;
}

水曜日, 3月 11, 2009

Java: ディレクトリ比較

今日はちょっと会社でいやなことがあったので...

言いたいことも言えず。

だから...Javaで書いて、動くのを確認 (こうでなきゃ)。

やっぱりJavaはいい。

単なる、ディレクトリ比較のプログラムです。



/* Compare.java -- directory comparison program
*
* Copyright (C) 2009 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.io.*;

public class Compare
{
public void compare(String src, String dest)
{
try
{
File srcDir=new File(src);
if(!srcDir.isDirectory())
{
return;
}
File destDir=new File(dest);
if(!destDir.isDirectory())
{
return;
}
String srcList[]=srcDir.list();
String destList[]=destDir.list();
for(int i=0;i<srcList.length;i++)
{
int j=0;
while(!destList[j].equals(srcList[i]) && ++j<destList.length);
if(destList.length<=j)
{
System.out.println("(-)"+src+"\\"+srcList[i]);
}
else
{
compare(src+"\\"+srcList[i],dest+"\\"+destList[j]);
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}

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


水曜日, 2月 25, 2009

PHP: PDOやmysqliクラスのない環境

サーバーによって、PHPの環境が違うことがあります。

特に、データベース周りでいくつものパッケージがあるため、PHPのバージョンによって書き方が変わってきます。

PDOを使っていたのに、サーバーで使えない環境だった場合。

mysqliクラスを使っていたのにサーバーでクラスが発見できない場合。

せっかくあるコードが使えないということは、コードのリユースの面から不効率です。

対策としては、mysql*関数で書き直すか、あとは自前でクラスを作る。

そんなときのために、PHPでのクラスの書き方をアップしておきます。



if(!class_exists("mysqli"))
{
class mysqli
{
public $dbname;

function __construct($host,$dbuser,$dbpassword,$dbname)
{
$this->dbname=$dbname;
echo $dbuser;
if(!mysql_connect($host,$dbuser,$dbpassword))
echo "No DB connection established";
}
function query($sql)
{
if(!mysql_select_db($this->dbname))
echo "Database not selected";
return new mysqli_result(mysql_query($sql));
}
};

class mysqli_result
{
public $records;
function __construct($results)
{
$this->records=$results;
}
function fetch_assoc()
{
return mysql_fetch_assoc($this->records);
}
};



作り方としては、mysqliクラス、PDOクラスなど、クラスを作ってメソッドを実装する形となります。

クラス間でやりとりがある場合など、クラスを作って実装します。

ソースを変えずにポータブルなコードが可能になります。

日曜日, 2月 15, 2009

PHP: Resizing image files

The way to resize image files in PHP is straight foward yet not as simple as it should be. Nevertheless, the PHP image library is equipped with image manipulation functions. Here is a function that does the job -- resizing factor should be edited to suit your needs.



function resizePhoto($fileName,$dest)
{
header('Content-type: image/jpeg');

list($width, $height) = getimagesize($fileName);
$ratio=((float)$height)/$width;
$newWidth=90;
$newHeight=(int)($newWidth*$ratio);

$thumb = imagecreatetruecolor($newWidth, $newHeight);
$source = imagecreatefromjpeg($fileName);

imagecopyresized($thumb, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

imagejpeg($thumb,$dest);
}

土曜日, 2月 14, 2009

Xampp on Vista

Xampp mysql won't start on Vista. Moreover, the admin app emits warnings relentlessly looking for a dll. The MySQL installation must be done separately, works fine with MySQL 5.1.

The Japanese messages appear on xampp control panel and administrator page seems to have mixed interpretation of the word "stop" and "stopped".

Calling the PDO class method query() crashes Apache -- stops the service. Apache 2.2, PHP 5.2.8, MySQL 5.1 (separate installation).

木曜日, 1月 29, 2009

デジタル・フォトフレーム

ひさしぶりに電気店へ行くと、新製品がオンパレードでこの業界の進歩にいまさらながら驚いた。

デジタル一眼レフも機能が向上して、ソニーのαシリーズのものなど、自動焦点の機能が向上して「一瞬にしてピントが合う」。

フォトフレームがはやりだという。液晶モニタにメモリリーダーがついたもので、デジカメ写真・動画などが額縁感覚で飾れる。スライドショー機能はデジカメにもついており、テレビ画面につなげばそのまま画像が楽しめるが、そのまま画像が表示できる手軽さがある。大きさはさまざまで、携帯サイズの安いものから、インテリア感覚の高級品まで勢ぞろいしている。無線LAN機能がついたものもあり、ネットにつなげるという。しかし、見たところFlickrやYahooフォト、Youtubeやニコ動などとの連携はないらしい。

どうぜ小さな画面なら、iPod、ミニノートを置けばいいというのもある。電力を食うというきらいがあるが、ネット接続に苦労するということはない。DVDプレーヤーを置けばいいというのもある。

店頭で商品を見て惹かれてしまい、帰ってきて使わなくなったデジカメを取り出してテレビ画面につないだ。フォトフレーム代わりにスライドショーで眺めている。画面はテレビ画面のほうが大きく、それなりに迫力はある。

火曜日, 1月 27, 2009

ImageIO.write(): To save transparent PNG image files

The ImageIO class and its write method that comes with JDK1.60 does not support writing out transparent GIF images (at least in the way shown below). The write method of the class won't write out proper GIF format files with a transparent color. The method will create PNG files all right. The following shows how to save an image file. Suppose you have (BufferedImage)bufferedImage that you want to save:



FileOutputStream out=new FileOutputStream(fileName);
String descriptor="PNG";
BufferedImage image=new BufferedImage(right-left,bottom-top,BufferedImage.TYPE_INT_ARGB);
Graphics2D g=(Graphics2D)image.getGraphics();
g.drawImage(bufferedImage,0,0,right-left,bottom-top,left,top,right,bottom,this);
g.dispose();
ImageIO.write(image,descriptor,out);
out.flush();

金曜日, 1月 16, 2009

JFileChooser: Directory Selection



Java's JFileChooser is a handy UI component in file(s) or directory(directories) selection. As with all Java OOP classes, the set up of the JFileChooser class goes through four steps: 1. instantiate the class 2. set the parameters 3. show off the class 4. wait for the return value (is modal). The JFileChooser class works fine with file selections -- selecting a single/multiple files, setting file extension filters, and retrieve a new file name if the file does not exist.

The trouble is, the case with a directory/directories selection. The JFileChooser class can filter out all the file names, and that part is ok. But when the user enters a new directory name, the filtering would hinder the class to get the non-existent directory name. The user can not select non-existent directory name.

Here shows DirFilter class that can avoid the situation and let the application have the choice either to create or reject the user request.



class DirFilter extends javax.swing.filechooser.FileFilter
{
public String getDescription()
{
return "Directories";
}
public boolean accept(File file)
{
if(file.exists())
{
if(file.isDirectory())
{
return true;
}
else
{
return false;
}
}
else
{
file.mkdir();
return true;
}
}
}



The idea is, to set up a filter for the JFileChooser class, by passing the filter class to JFileChooser. Then the application can decide whether to create a directory of the specified name or to discard it. The filter class should be the one that FileFilter interface be implemented. A word of caution is that there are java.io.FileFilter and javax.swing.filechooser.FileFilter -- the latter should be specified.

The following shows the setting of the new filter class via addChoosableFileFilter() method.



JFileChooser dlg=new JFileChooser(".");
dlg.setDialogType(JFileChooser.SAVE_DIALOG);
dlg.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
dlg.addChoosableFileFilter(new DirFilter());
int retval=dlg.showDialog(this,null);
if(retval==JFileChooser.APPROVE_OPTION)
{
...

木曜日, 1月 08, 2009

DIVタグをネストすると、マージンをとった場合にIE7とFirefoxで結果が違う。

Nested DIV -- Firefox3
Nested DIV -- Firefox3
Nested DIV -- IE7
Nested DIV -- IE7

DIVタグをネストすると、マージンをとった場合にIE7とFirefoxで結果が違う。IE7は内部のブロック要素のマージンの長さだけ外部のブロックのサイズを変更する。Firefoxでは、なぜか内部のマージンに合わせて外部のブロックも移動する。しかも不可解なことに、外部ブロックにボーダーをつけると位置が移動する。要注意。

ソースはこちら→ div.html

日曜日, 1月 04, 2009

The Art of UNIX Programming

The Art of UNIX Programming という本があって面白く書いてある。記述のどこまでが反語なのか計りかねるところがまた興味深い本である。さらに、おそらくは日本などでも散見される意見がちりばめてあってより熟考を迫られる。

まず、意図的にはUNIXに檄を飛ばす内容となっている。そのための、現状の把握の過程が書かれている。数々の、名の知れた頭のよい人たちのウインクが見えるような本である。立場から、マイクロソフトにはまったく「反対」を唱え、協調あるいは融和、妥協など交渉する気配を見せていない。これは政治的闘争というものに他ならない。政治問題化しては問題は解決しない。Windowsプラットフォームの問題点として、文書形式がプロプラエタリなバイナリであること、アプリ間でデータの交換がやりにくいことなどを列挙しているが、問題の解決方法として、Windowsと対決するなどまったく現実的ではない。政治的リアリティとしては、その筋からWindows製品にも多くの注文が寄せられ、さまざまな改変が加えられている。Word文書形式のオープン化などは、強い要望によって成し遂げられた改革である。XML形式での文書データの交換形式の普及は、UNIX対Windowsの対決より、より実際的であり、効果的な解決方法である。

本書には、プログラムに関するポリシーであり助言が書かれている。簡略化すること、モジュール化すること、「美しく入り組んだ構成物」は矛盾という。データ構造が重要なこと、最適化がコードを重く長くすること、「まず動かし、正しくして、速くせよ」というKent Backの台詞を引用している。が、固陋なまでにC言語を使い、Java言語をスクリプト扱いする記述には、「Javaのほうがずっとスマートに美しく書ける」「CのライブラリよりJavaのクラス構造」といいたい。

しかし、銃保有があたかも反体制であるかのように書くのはまったくばかげている。

日曜日, 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.

土曜日, 12月 08, 2007

「リンクしてあるテキスト」をちりばめたマップ

最近ウィキペディアを見ていて気づいたのは、メディアの種類が増えたこと。内容の充実と共に、投稿されている音声ファイルや動画が、ネットメディアのよさをフルに生かしている。もちろん、ウィキの最大のメリットは、テキストにリンクが張られていて、気になるキーワードを深く掘り下げて検索できること。

そこで発見したのは、この「高雄市」のページにある「リンクしてあるテキスト」をちりばめたマップ。地図の画像の上に、テキストが重ねてあって、リンクが張ってある。HTMLをこのように使うと、クリッカブルマップが自然にHTMLで表現できることに、いたく感動したので、さっそくアプリを作ってみました。

なにって、このアプリ。画像を読み込んで、自由な位置にテキストを置いて、リンクを張る。これを、HTMLのコードとして出力すると、クリッカブルマップをどんなページにも埋め込めるモノで、LabelMapというプログラムを起動したら、File|Open で画像を読み込む。マウスで好きな位置をクリックして、テキストを入力。右クリックでポップアップメニューの、Set Link でURLアドレスを打ち込んで...という作業を繰り返して、書きたいテキストをすべて入力。あとは、File|Export to HTML を選択すると、該当するHTMLコードが表示されます。あとは、編集するなりコピーするなり、HTMLのページに埋め込んで利用します。

ダウンロードはこちらから。

LabelMap

日曜日, 12月 02, 2007

IEのツールバーを作成する

IEでは、レジストリで設定すると右クリックでアプリを登録できるが、セキュリティのためかメニューにはその機能がない。右クリックを禁止するサイトでスクリプトを走らせるには、新たなメニューバーをコンパイルしないとならない。バランスの悪い対処法といえる。

とつい思ったのだが、マイクロソフト社公式サイトでは、KBBARなるサンプルコードが置いてある。それを用いると、DLLの形式で、ツールバーが作成できる。

多少つかえたのが、COM関連のクラスであるが、ここに、ページのURLを取得するコードを記述する(エラー処理は省略)。

CComBSTR url;
m_pBand->m_pIE->get_LocationURL(&url);

さらに、選択されたテキストを取得するコードを以下に示す。

IHTMLDocument2 *pDoc;
m_pBand->m_pIE->get_Document((IDispatch**)&pDoc);
IHTMLSelectionObject *pObject;
pDoc->get_selection(&pObject);
IHTMLTxtRange *pRange;
pObject->createRange((IDispatch**)&pRange);
CComBSTR selectedText;
pRange->get_text(&selectedText);

これを走らせると、メニューではなく、ツールバーからDLLを起動できる。

月曜日, 11月 26, 2007

フランスで海賊行為者のウェブアクセスを禁じる新制度

フランスで、海賊ソフトを取り締まる新制度が発表されたという。独立機関が、ネットユーザーに警告し、アカウントを停止させる可能性があるという。引き換えに、デジタル著作権管理(DRM)による保護をはずし、機種間でのプロプラエタリーな規格を禁じるという、過激な制度である。

違法ソフトの摘発は、企業などで使われている海賊版を摘発することで可能といえるが、個人に対し、違法MP3ファイルのダウンロードを検出することは現在のところ不可能である。この際、違法ファイルの保持が顕著、という指摘でさえ不可能である。ごく一部の対象を取り締まることは、法の下の平等を保障しない。つまり、ある個人を違法ソフトで摘発すると、法律の恣意的な適用となる可能性が高い。

効果的なのは、個人相手ではなく、供給側に規制をかけることである。違法ファイルを置くサイトへの警告は、少なくとも日本では行われている。中国の違法DVDの販売は、中国国内での著作権をも損なうという主張がある。訪中しているサルコジ仏大統領は、中国の著作権について言及したという。中国側の反応は伝えられていないが、効果を期待したい。

フランスで海賊行為者のウェブアクセスを禁じる新制度 (2007-11-26)
フランス政府が、オンラインの海賊行為対策のため特別機関を設置へ (2007-11-26)
訪中のサルコジ仏大統領、人民元上昇を促す (2007-11-26)

火曜日, 11月 20, 2007

米アマゾン、電子書籍参入を発表・新聞や雑誌も入手可能

アップル社の iPod の成功は、デザインや機能もさることながら、魅力的なコンテンツを手ごろな価格で便利に入手できる、という「社会的要因」によるもの――という認識が、電子機器メーカーの経営者陣にあるかどうかは知らないが、他のMP3プレーヤーと「競争にならない」市場を作り出したアップル社の目覚しい発展は、技術を持つ各社が消費者の利便性を考えて「もう少し政治的に連動することができたら」可能である市場の開拓への感慨をもたらすものである。

このたび米アマゾンは、電子書籍に参入するという。有償で電子ブック「キンドル」を販売し、コンテンツをネット配信するという。価格設定は、書籍で9.99ドル、新聞が月5.99~14.99ドル、雑誌が月1.25~3.49ドル。OEMはHon Hai Precision Ind. Co., Ltdといい、ネット回線のキャリアはSprintだという。創業者でCEOのジェフ・ベゾス氏は、「思いついたら60秒」で本を入手できるメリットを語っているという。

ここで、電子化された書籍など、素直にデスクトップで読めばいい、というナイーブな意見の持ち主には、著作権がらみのコンテンツの利用法についての考慮を要請するものである(笑)。プロの情報を、正規ルートで入手する方法というのが、現在のインターネットでは実現していない現状があるからである。そして、さらに価格設定を含め、利便性を最優先し、著作権保護をも可能にする米アマゾンのマーケティング手法と、iPod の成功を考えて欲しい。

電子ブックで先行するソニーなどは、ネットからダウンロードして「貸本」が読める、「リブリエ」を発売していた。米国では、電子ブックリーダーとして現在も販売している。性能比較しているサイトがあるが、技術屋の物悲しさを覚えるように思う。リブリエを実践で使う利用者にとっては、投資してもいいと思わせる有益な情報が、支障なくタイムリーに入手できることが、デザインや機能より優先する、最大の懸念であるからである。

トラブル・フリーな既製品をブラックボックスで販売するのは、日本企業の得意技とされている。しかし、そこには消費者の利便性という決定的な要素が軽視されているように思える。消費者の利便性の本当の意義とは、企業による人権侵害にも似たサービスの強要を言うのではなく、あくまで「社会的」なメリット、最大多数の幸福を目指したものだという面を強調したいものである。

アマゾン・コム、書籍用の電子端末発売 (2007-11-20)
米アマゾン、電子書籍参入を発表・新聞や雑誌も入手可能 (2007-11-21)
Amazonの電子ブックリーダーKindle公開、399ドル (2007-11-18)
Front company and OEM for Amazon Kindle is… (2007-11-19)
Amazon Kindle vs. Sony Reader (2007-11-19)

火曜日, 11月 13, 2007

中国人ジャーナリスト逮捕事件、ヤフーが和解を決定

米ヤフーは、中国当局に提供した情報によってジャーナリストが拘束された訴訟で和解を決定したと発表したという。国境なき記者団によると、ヤフーが中国当局に提供した情報により、「ネット上の体制批判者」とされる少なくとも4人が禁固刑を受けているという。

中国人ジャーナリスト逮捕事件、ヤフーが和解を決定 (2007-11-14)

木曜日, 11月 08, 2007

中国当局への情報提供、米公聴会でヤフーCEOに批判

メロドラマのようだ、と思ったのは、ヤフーに対する米上院委員会の茶番である。ちょっと面白いので、リンクをたどって見てみると、「いやがらせ」というのは実は法的処置をしなくてすむように、米国IT企業への弁護だということが分かる。ほら、われわれも黙ってみてるわけじゃない、と有権者に訴える目的の、「金の絡まない」(=企業にとっては時間つぶし以外の意味を持たない)制裁である。

中国当局への情報提供、米公聴会でヤフーCEOに批判 (2007-11-8)

火曜日, 11月 06, 2007

画像を壁紙に設定する

コードを直接ネットに載せると、「恥をさらすようだ」という意見が(笑)あるが、くだらぬことに時間を割きたくないプログラマのために、画像を壁紙にするコードを載せておく。

あまり誇れるコードでもない、というのは、情報がなくてBMPの一時ファイルにする方法しか見つからなかったせいで、ある画像を画面の大きさにして壁紙に設定するだけのコードである。

なにかの役に立つかどうか分からないし、「いちおう」などと照れる必要もないだろうが、以下がそのコードである。

void CMyView::Setasdesktopbackground()
{
CImage image;
int screenWidth=::GetSystemMetrics(SM_CXSCREEN);
int screenHeight=::GetSystemMetrics(SM_CYSCREEN);
int bpp=m_pImage->GetBPP();
if(image.Create(screenWidth,screenHeight,bpp))
{
HDC hDC=image.GetDC();
SetStretchBltMode(hDC,HALFTONE);
m_pImage->Draw(hDC,0,0,screenWidth,screenHeight);
CString fileName=L"c:\\Windows\\Web\\Wallpaper\\background.bmp";
HRESULT res=image.Save(fileName);
image.ReleaseDC();
if(!FAILED(res))
SystemParametersInfo(SPI_SETDESKWALLPAPER,NULL,
(PVOID)fileName.GetBuffer(),SPIF_UPDATEINIFILE);
}
}

日曜日, 11月 04, 2007

MFC:プリンタ印刷をカスタマイズ

先日、MFCライブラリを使ってプリンタ印刷をカスタマイズする機会があったので、気づいたことを書いておこうと思う。

MFCでは、CScrollViewなどCView派生クラスを使えば、印刷はCView::OnFilePrint()をメニューに登録し、呼び出すだけで印刷ができる。この際には、OnPreparePrinting()を再定義してDoPreparePrinting()の一行を記述する必要がある。CView::OnFilePrintPreview()を使えば何を変更することもなくプレビューができる。

縦横(Portrait/Landscape)など印刷する紙の向きなどカスタマイズする際には、CWinApp派生クラスで定義されている、m_hDevModeを変更する必要がある。m_hDevModeは外部からアクセスできないため、CWinApp派生クラスで値を変更せねばならない。つまり、このようなコードを書かねばならない。

void CMyApp::SetOrientation(short orientation)
{
CPrintDialog printDlg(FALSE);

BOOL bRet=GetPrinterDeviceDefaults(&prinDlg.m_pd);
if(bRet)
{
DEVMODE FAR *pDevMode=(DEVMODE FAR *)::GlobalLock(m_hDevMode);
pDevMode->dmOrientation=orientation;
::GlobalUnlock(m_hDevMode);
}
}

CView派生クラスでは、DoPreparePrinting()を呼び出す前にCWinApp派生クラスで定義された上記のSetOrientation()を呼ぶと、紙の向きがカスタマイズできる。

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
int imageWidth=m_pImage->GetWidth();
int imageHeight=m_pImage->GetHeight();

CPhotoAlbumApp* pApp=(CMyApp*)AfxGetApp();

short orientation=DMORIENT_PORTRAIT;
if(imageHeight<imageWidth)
orientation=DMORIENT_LANDSCAPE;

pApp->SetOrientation(orientation);
return DoPreparePrinting(pInfo);
}

上記のコードでは、m_pImageで指定されているCImageの縦横の長さに応じて、デフォルトでの紙の向きが指定される。

流れとしては、OnFilePrint()では、OnPreparePrinting()が呼び出され、OnPreparePrinting()を再定義してDoPreparePrinting()を呼び出すと、そこではDoPrintDialog()が呼ばれ、その際にはCWinApp派生クラスのm_hDevModeが指定されるので、OnPreparePrinting()においてDoPreparePrinting()の前にm_hDevModeを指定することになる。

PHP: 定数を扱う

プロジェクトごとの定数を扱うクラス Config\Constants の紹介です。 <?php namespace Config; class Constants {     public const DB_USER = "linguist...