« 2007年12月 | トップページ | 2008年2月 »

2008年1月

2008/01/31

ヒル暗号プログラム解説

昨日は眠くてできなかったヒル暗号プログラムの解説をしたいと思います。前回に引き続きプログラムを表示します。

void hill(int u[2], int key[4], int hkey[4])
{
  int i, det_a, t, angou[2];
  det_a = (key[0]*key[3] - key[1]*key[2] + 28) % 28;
  if(det_a < 0) det_a += 28;
  t = add_gcd(det_a, 28);
  if(t == 0){
   fprintf(stderr, "This keys are incorrect!\n");
   exit(1);
  }
  angou[0] = ((key[0]*u[0] + key[1]*u[1])+28) % 28;
  angou[1] = ((key[2]*u[0] + key[3]*u[1])+28) % 28;
  for(i=0 ; i<2 ; i++){
    if(angou[i] < 0) angou[i] += 28;
  }
  //---Hukugou Kagi---
  hkey[0] = (t*key[3]+28) % 28;
  hkey[1] = (t*key[1]*(-1)+28) % 28;
  hkey[2] = (t*key[2]*(-1)+28) % 28;
  hkey[3] = (t*key[0]+28) % 28;
  for(i=0 ; i<4 ; i++){
    if(hkey[i] < 0) hkey[i] += 28;
  }
  u[0] = angou[0];
  u[1] = angou[1];
}

このヒル暗号プログラムはブロック長2で暗号化を行います。(平文から2文字ずつ読み込むということ)

このvoid関数hillの引数は(数値化した2文字、4つの暗号鍵、4つの復号鍵)となっていて、この関数に2文字と暗号鍵を渡し、暗号化された2文字と復号鍵を取り出すようにしました。(復号鍵を取り出すのはプログラム実行時に復号鍵を表示するためですが、この関数内で表示するようにすれば取り出す必要はないです)

この関数の処理は基本的にはヒル暗号のロジックどおりに行っています。

1.暗号鍵A=(a&b c&d)の行列式を計算し、GCD(detA、28)=1であることを確認(このときプログラム内では拡張ユークリッドを用いて、GCD(detA、28)=1であればdetAの逆元を、そうでなければ0を変数tに代入している)

2.暗号化する

3.復号鍵を求める

4.暗号化した文字を取り出すために変数を入れ替え

このプログラムで頻繁に行っている

(var + 28) % 28;
if(var < 0) var += 28;

という操作はmod 28を守るために行っています。つまり、0~27までの数字のみ使用できる。29なら1、-3なら25と同じになります。そのため、1行目ではのようにvarの値を変換します。では何故2行目が必要かというと、varに入っている値が-28より小さい場合には1行目で変換しても、-1~-27になってしまうので、2行目のようにしてmod 28に収めてやる必要があります。(varの値の絶対値をとってから1行目の計算をすれば2行目は必要ないかな?)

| | コメント (0) | トラックバック (0)

2008/01/30

ヒル暗号完成

ヒル暗号プログラムが完成しました。

void hill(int u[2], int key[4], int hkey[4]) 
{ 
  int i, det_a, t, angou[2]; 
  det_a = (key[0]*key[3] - key[1]*key[2] + 28) % 28; 
  if(det_a < 0) det_a += 28; 
  t = add_gcd(det_a, 28); 
  if(t == 0){ 
    fprintf(stderr, "This keys are incorrect!\n"); 
    exit(1); 
  } 
  angou[0] = ((key[0]*u[0] + key[1]*u[1])+28) % 28; 
  angou[1] = ((key[2]*u[0] + key[3]*u[1])+28) % 28; 
  for(i=0 ; i<2 ; i++){ 
    if(angou[i] < 0) angou[i] += 28; 
  } 
  //---Hukugou Kagi--- 
  hkey[0] = (t*key[3]+28) % 28; 
  hkey[1] = (t*key[1]*(-1)+28) % 28; 
  hkey[2] = (t*key[2]*(-1)+28) % 28; 
  hkey[3] = (t*key[0]+28) % 28; 
  for(i=0 ; i<4 ; i++){ 
    if(hkey[i] < 0) hkey[i] += 28; 
  } 
  u[0] = angou[0]; 
  u[1] = angou[1]; 
}

解説はまた今度ということで・・・。(とっても眠い)

ところで、ヒル暗号の暗号鍵を考えるのは面倒なので鍵生成プログラムを作りました。

#include <stdio.h> 
#include <math.h> 

int add_gcd(int a, int b) 
{ 
  int r_pre = a, r = b, r_next; 
  int x_pre = 1, x = 0, x_next; 
  int y_pre = 0, y = 1, y_next; 
  int ans_x, ans_y, ans_gcd, ans, q, k = 1; 
  while((r_next = r_pre%r) != 0){ 
    q = r_pre / r; 
    k++; 
    x_next = q*x + x_pre; 
    y_next = q*y + y_pre; 
    r_pre = r; 
    r = r_next; 
    x_pre = x; 
    x = x_next; 
    y_pre = y; 
    y = y_next; 
  } 
  ans_x = pow(-1, k) * x; 
  ans_y = pow(-1, k+1) * y; 
  ans_gcd = (ans_x * a)+(ans_y * b); 
  if(ans_gcd == 1) ans = (ans_x + b)%b; 
  else ans = 0; 
  return ans; 
} 

int main(void) 
{ 
  int i, j, k, l; 
  int det, check; 

  for(l=1 ; l<=28 ; l++){ 
   for(k=1 ; k<=28 ; k++){ 
    for(j=1 ; j<=28 ; j++){ 
     for(i=1 ; i<=28 ; i++){ 
      det = (i*l - j*k + 28) % 28; 
      check = add_gcd(det, 28); 
      if(check != 0) 
       printf("key=(%d %d %d %d)\n", i, j, k, l); 
     } 
    } 
   } 
  } 

  return 0; 
} 

| | コメント (0) | トラックバック (0)

2008/01/29

KDEがWindowsとMacOSXを・・・

KDEと言えばGNOMEと並び、Linux向けデスクトップ環境の筆頭です。(異論もあると思いますが、今回はこういう切り口で)

そのKDEがWindowsとMacOSXをサポートするようです。しかも、既にインストーラーも配布されているようです。

KDE goes cross-platform with Windows, Mac OS X support

この記事ではWindows上で動作するKDEアプリケーションのスクリーンショットも掲載されています。(英語の記事なので、開発がどれほど進んでいるのかわかりませんが)

私としては、KDEの移植によってcoLinuxやCygwinとの連携ができるようになったらいいなぁなんて思いますねぇ。

Windows用KDEプロジェクト

MacOSX用KDEプロジェクト

| | コメント (0) | トラックバック (0)

2008/01/28

日経ソフトウェア3月号

今月の日経ソフトウェアには「C言語まるごと学習ブック」が特別付録として付いています。「まるごとブック」はWindowsプログラミングに重点を置いた内容となっていて、

  • C言語の基礎(ポインタを中心に解説)
  • Visual C++ 2005 Expressの基本操作(過去記事)
  • WindowsAPIの解説(mookで見たことある内容)
  • WindowsAPIの応用(サンプルプログラムを用いて解説)
  • .NETプログラミングを紹介
  • 基本キーワード集

となっています。

で、本誌はというと、毎年1回はある(と思う)「今さら聞けないプログラミングの疑問」特集です。こういう記事ってたまに読むと、忘れていたものを気づかせてくれるんですよね。

他には、最近取り上げられることの多い「ニコニコ動画」の仕組みを解説した記事とか、「Silverlight」のプロモ記事などがあります。

中でも、私が一番興味をひかれた記事は「UML超入門」という特集記事。いつかは「UML脳的思考」ができるようになりたいなぁとか思いました。

| | コメント (0) | トラックバック (0)

2008/01/27

期末テストが迫ってきました。

期末テストです。

嫌です。

でも単位ほしいです。

なので頑張ります。

| | コメント (0) | トラックバック (0)

2008/01/26

Eclipseをダウンロード

Eclipse/Pleiades(日本語化プラグイン)をダウンロード:MergeDoc Project

公式ダウンロードページでも用途ごとのEclipseパッケージが用意されていますが、このページのほうが細分化されていて分かりやすいし、面倒ならAll-in-OneのUltimateパッケージをダウンロードすればいいわけですし。

なにより、日本語化プラグインPleiadesが最初から組み込まれているのが便利です。

| | コメント (0) | トラックバック (0)

2008/01/25

ヒル暗号

ヒル暗号 from Wikipedia

今回挑戦する暗号はヒル暗号です。

ヒル暗号のプログラムは完成しているのですが、思いつきでバグを解決してしまったので理論(というよりプログラムの挙動)を把握できていないんですよね。

ですが、ネットを調べても日本語の文献で使えるものがあまり存在していません。(上記のWikipediaのリンクも英語だし)

仕方がないので無理やりにでも英語の文献を読むしかないようですねぇ。数式なら日本語も英語も関係ないですし。

私が見つけたなかで最も有益そうな文献へのリンクを貼っておきます。(PDF形式)

| | コメント (0) | トラックバック (0)

Javaアップデート

Java SE 6の最新版Java SE 6 Update4が公開されました。

このアップデートでは375件のバグが修正されているようです。

---Javaのダウンロード---

| | コメント (0) | トラックバック (0)

2008/01/24

VistaでモニターやAeroのON/OFFを手軽にできるようになるソフト

WinFlog:Windows Vistaで省電力モニターの表示OFFやWindows Aeroの半透明表示のON/OFFを手軽に行えるソフト。[窓の杜]

このソフトをインストールすると、「コンピュータ」アイコンやデスクトップ上での右クリックメニューに上記の機能を操作する項目を追加できるようです。

確かにこれらの機能を右クリックメニューで操作できるようになると便利だと思いますよ。いちいち右クリックメニューの「個人設定」から設定するのは面倒ですから。

| | コメント (0) | トラックバック (0)

自作GUIを操作

無理やりSwing!」から始まったSwingプログラミングが所期の目的を果たすことができました。(火曜日にはGUIフロントエンドが完成していましたが、肝心の数値計算プログラムの完成が遅れていました。理由:昨日のアレ

このプログラムが完成したことにより、

プログラムを実行して、パラメータを入力。
計算が終わったらファイルAをBにコピーしてから再びプログラムを実行してパラメータを入力。
また計算が終わったらファイルAを・・・

という億劫な作業を直感的に操作できるようになりました。おまけに、自分で作ったGUIプログラムを使うことで数値計算も楽しさが倍増です。

Md_calculator_client

このプログラムは思いつきで急造したので、「パラメータを入力して実行」、「特定のファイルをコピー」、「入力欄をクリア」と最小限の機能しか実装していません。使用したコンポーネントも以前に挙げたもののみです。

簡単に言うと、このプログラムはexec()で呼び出す外部プログラムをボタンで選択しているだけですが、この方法は「ボタン」と「外部プログラム呼び出しメソッド」を増やすだけで機能を増加できるので、今後は出力されたデータをGnuplotでグラフ化したり、グラフを画像データ化する機能を追加したいと思っています。(Javaを理解しているとは言えないので、Javaをもっと理解し、コードが安全か危険かを判断できるようにしたいとも思う)

/*========================
  GUI FrontEnd For MDcalc
  Input Form
  Using Java Swing
  ========================*/

import javax.swing.*;
import java.io.*;
import java.awt.event.*;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.BorderLayout;

//---Run MDcalc---
class MDcalculator
{
    //---Calc---
    public String calc(int nstep, int istart,
		     int ivs, int nvs, int temp)
    {
	String result;
	try{
	    Runtime rt = Runtime.getRuntime();
	    Process p  = rt.exec("./MDcalc "+nstep+" "+istart+
				 " "+ivs+" "+nvs+" "+temp);
	    InputStream is = p.getInputStream();
	    InputStreamReader isr = new InputStreamReader(is);
	    BufferedReader br = new BufferedReader(isr);
	    result = br.readLine();
	}catch(IOException ex){
	    ex.printStackTrace();
	    result = "error";
	}
	return result;
    }

    //---Copy---
    public void copy()
    {
	String re2;
	try{
	    Runtime rt2 = Runtime.getRuntime();
	    Process p2  = rt2.exec("cp restart.out restart.in");
	}catch(IOException ex){
	    ex.printStackTrace();
	}
    }
}

//---Main Class---
public class InputForm extends JFrame implements ActionListener
{
    //---InputForm Parts---
    JTextField form1;
    JComboBox  form2;
    JComboBox  form3;
    JTextField form4;
    JTextField form5;
    JLabel     caution;

    public static void main(String[] args)
    {
	InputForm frame = new InputForm();
	frame.setTitle("MD Calculator Client");
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setSize(350, 400);
	frame.setLocationRelativeTo(null);
	frame.setVisible(true);
    }

    InputForm()
    {
	//---Base---
	JPanel base = new JPanel();

	//---Input nstep---
	JPanel panel1 = new JPanel();
	panel1.setPreferredSize(new Dimension(350, 50));
	panel1.setLayout(new FlowLayout());
	form1 = new JTextField(10);
	form1.setHorizontalAlignment(JLabel.RIGHT);
	panel1.add(new JLabel("NSTEP:"));
	panel1.add(form1);

	//---Input istart---
	JPanel panel2 = new JPanel();
	panel2.setPreferredSize(new Dimension(350, 50));
	panel2.setLayout(new FlowLayout());
	String[] f2_ini = {"ON", "OFF"};
	form2 = new JComboBox(f2_ini);
	panel2.add(new JLabel("Read restart.in:"));
	panel2.add(form2);

	//---Input ivs---
	JPanel panel3 = new JPanel();
	panel3.setPreferredSize(new Dimension(350, 50));
	panel3.setLayout(new FlowLayout());
	String[] f3_ini = {"ON", "OFF"};
	form3 = new JComboBox(f3_ini);
	panel3.add(new JLabel("Velocity Scale:"));
	panel3.add(form3);

	//---Input nvs---
	JPanel panel4 = new JPanel();
	panel4.setPreferredSize(new Dimension(350, 50));
	panel4.setLayout(new FlowLayout());
	form4 = new JTextField(10);
	form4.setHorizontalAlignment(JLabel.RIGHT);
	panel4.add(new JLabel("Scale:"));
	panel4.add(form4);
	panel4.add(new JLabel("every times"));

	//---Input temp---
	JPanel panel5 = new JPanel();
	panel5.setPreferredSize(new Dimension(350, 50));
	panel5.setLayout(new FlowLayout());
	form5 = new JTextField(10);
	form5.setHorizontalAlignment(JLabel.RIGHT);
	panel5.add(new JLabel("TARGET TEMP[K]:"));
	panel5.add(form5);

	//---Run Button---
	JPanel panel6 = new JPanel();
	panel6.setPreferredSize(new Dimension(350, 50));
	panel6.setLayout(new FlowLayout(FlowLayout.RIGHT));
	JButton run_btn = new JButton("Run");
	run_btn.addActionListener(this);
	run_btn.setActionCommand("run");
	JButton reset_btn = new JButton("Reset");
	reset_btn.addActionListener(this);
	reset_btn.setActionCommand("reset");
	JButton copy_btn = new JButton("Copy");
	copy_btn.addActionListener(this);
	copy_btn.setActionCommand("copy");
	caution = new JLabel("");
	panel6.add(caution);
	panel6.add(run_btn);
	panel6.add(copy_btn);
	panel6.add(reset_btn);

	//---Put Form Panel on Base---
	base.add(panel1);
	base.add(panel2);
	base.add(panel3);
	base.add(panel4);
	base.add(panel5);

	//---Set Panels on Frame---
	getContentPane().add(base, BorderLayout.CENTER);
	getContentPane().add(panel6, BorderLayout.PAGE_END);
    }

    //---Action Event Method---
    public void actionPerformed(ActionEvent e)
    {
	MDcalculator mdc = new MDcalculator();
	String f1str, f4str, f5str, end_str, act_cmd;
	int f1, f2=0, f3=0, f4, f5;
	int f2index, f3index;

	act_cmd = e.getActionCommand();
	if(act_cmd.equals("run")){
	    //---form1---
	    f1str = form1.getText();
	    f1 = Integer.parseInt(f1str);
	    //---form2---
	    f2index = form2.getSelectedIndex();
	    if(f2index == -1){
		caution.setText("Error!");
	    }else{
		if(f2index == 0) f2 = 1;
		else if(f2index == 1) f2 = 0;
	    }
	    //---form3---
	    f3index = form3.getSelectedIndex();
	    if(f3index == -1){
		caution.setText("Error!");
	    }else{
		if(f3index == 0) f3 = 1;
		else if(f3index == 1) f3 = 0;
	    }
	    //---form4---
	    f4str = form4.getText();
	    f4 = Integer.parseInt(f4str);
	    //---form5---
	    f5str = form5.getText();
	    f5 = Integer.parseInt(f5str);

	    //---Run MDcalc---
	    caution.setText("Start!");
	    end_str = mdc.calc(f1, f2, f3, f4, f5);
	    caution.setText(end_str);
	}else if(act_cmd.equals("reset")){
	    form1.setText("");
	    form4.setText("");
	    form5.setText("");
	    caution.setText("Reset!");
	}else if(act_cmd.equals("copy")){
	    mdc.copy();
	    caution.setText("Copy!");
	}
    }
}

| | コメント (0) | トラックバック (0)

2008/01/23

やられたぜ・・・キャストにな

数値計算プログラムを書いているとき、何度もコードを読み返してみてもバグがとれませんでした。(運動エネルギーが急速に失われて0に近づいていく)

根気よく何度も何度もコードを読み返しました。他人のコードとも比較しました。でも、なにが悪いのか発見できませんでした。

心が折れかかった頃、最後の力を振り絞ってprintfによる各変数の値の確認を試みたのです。

そしたらでましたよ。

$ ”doubleじゃなくてintだぜ、ソレ。”

・・・えっ!doubleじゃねぇの?コレ。

int temp;

temp = (double)temp / 119.8;

これはdouble型じゃないんですね^^; 「代入先がint型でも代入するものがdouble型だから、代入先は暗黙的にキャストされる」と勝手に思い込んだのが原因でした。

| | コメント (0) | トラックバック (0)

2008/01/22

Javaプログラム内から外部プログラムを呼び出す

無理やりSwing!」で、私は数値計算プログラムごとJavaで書き直そうとしていましたが、スケジュール的にきつくなってきたので、数値計算プログラムはC言語のままで、パラメータ入力だけをJava Swingにやらせることにしました。

外部プログラムをJavaプログラムから起動するには「Runtimeクラス」か、「JNI(Java Native Interface)」 という選択肢があるようです。

Runtimeクラスのexec()で外部プロセスを起動する方法のほうがJNIをつかうよりも簡単にできそうです。(JNIのほうがパフォーマンスが良いようですが)

C言語プログラムにはscanf()ではなく、コマンドライン引数で値を渡すように改造すればいいだけです。

今回はJavaからC言語プログラムを呼び出すことにしましたが、もっとJavaを勉強して、いつかはJavaで書き直したいです。(グラフの描画も含めて)

| | コメント (0) | トラックバック (0)

2008/01/21

Java Swingの練習「電卓」

Swingの練習がてらに電卓を作ってみました。

Calculator

値1と値2のテキストフィールドに数を入力して、演算子をドロップダウンメニューで選択して実行ボタンをクリックすると計算結果が表示されます。 また、リセットボタンをクリックするとテキストフィールドが初期化されます。

/*==========================
  Swingの動作確認プログラム
  その2:四則演算電卓,Calclator
  2007 / 01 / 20 ~
  ==========================*/

import javax.swing.*;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.BorderLayout;
import java.awt.event.*;

public class Calc extends JFrame implements ActionListener
{
    JTextField answer;
    JTextField num1;
    JTextField num2;
    JComboBox  operator;

    public static void main(String[] args)
    {
	Calc calcFrame = new Calc();
	calcFrame.setTitle("Calculator");
	calcFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	calcFrame.setSize(300, 300);
	calcFrame.setLocationRelativeTo(null);
	calcFrame.setVisible(true);
    }

    Calc()
    {
	//---Base Panel---
	JPanel base = new JPanel();

	//---Answer Panel---
	JPanel panel1 = new JPanel();
	panel1.setPreferredSize(new Dimension(300, 50));
	panel1.setLayout(new FlowLayout());
	answer        = new JTextField("0.0", 20);
	answer.setHorizontalAlignment(JLabel.RIGHT);
	panel1.add(answer);

	//---Num1 Panel---
	JPanel panel2   = new JPanel();
	panel2.setPreferredSize(new Dimension(300, 50));
	panel2.setLayout(new FlowLayout(/*FlowLayout.LEFT*/));
	JLabel label_p2 = new JLabel("値1:");
	num1            = new JTextField(10);
	num1.setHorizontalAlignment(JLabel.RIGHT);
	panel2.add(label_p2);
	panel2.add(num1);

	//---Operator Panel---
	JPanel panel3     = new JPanel();
	panel3.setPreferredSize(new Dimension(300, 50));
	panel3.setLayout(new FlowLayout(/*FlowLayout.LEFT*/));
	JLabel label_p3   = new JLabel("演算子:");
	String[] serect_ope = {"+", "?", "×", "÷", "%"};
	operator          = new JComboBox(serect_ope);
	panel3.add(label_p3);
	panel3.add(operator);

	//---Num2 Panel---
	JPanel panel4   = new JPanel();
	panel4.setPreferredSize(new Dimension(300, 50));
	panel4.setLayout(new FlowLayout(/*FlowLayout.LEFT*/));
	JLabel label_p4 = new JLabel("値2:");
	num2            = new JTextField(10);
	num2.setHorizontalAlignment(JLabel.RIGHT);
	panel4.add(label_p4);
	panel4.add(num2);

	//---Action Button Panel---
	JPanel  panel5    = new JPanel();
	panel5.setPreferredSize(new Dimension(300, 50));
	panel5.setLayout(new FlowLayout(FlowLayout.RIGHT));
	JButton button1_p5 = new JButton("リセット");
	button1_p5.addActionListener(this);
	button1_p5.setActionCommand("Reset");
	JButton button2_p5 = new JButton("実行");
	button2_p5.addActionListener(this);
	button2_p5.setActionCommand("Enter");
	panel5.add(button1_p5);
	panel5.add(button2_p5);

	base.add(panel1);
	base.add(panel2);
	base.add(panel3);
	base.add(panel4);

	getContentPane().add(base, BorderLayout.CENTER);
	getContentPane().add(panel5, BorderLayout.PAGE_END);
    }

    public void actionPerformed(ActionEvent e)
    {
	int    index_op;
	String act_cmd, str_num1, str_num2, str_ans;
	double d_num1, d_num2, d_ans;

	act_cmd  = e.getActionCommand();
	str_num1 = num1.getText();
	str_num2 = num2.getText();
	d_num1   = Double.parseDouble(str_num1);
	d_num2   = Double.parseDouble(str_num2);
	index_op = operator.getSelectedIndex();

	if(act_cmd.equals("Enter")){
	    if(index_op == -1){
		str_ans = "Serect Operator!!";
	    }else{
		if(index_op == 0){
		    d_ans = d_num1 + d_num2;
		}else if(index_op == 1){
		    d_ans = d_num1 - d_num2;
		}else if(index_op == 2){
		    d_ans = d_num1 * d_num2;
		}else if(index_op == 3){
		    d_ans = d_num1 / d_num2;
		}else{
		    d_ans = d_num1 % d_num2;
		}
		    str_ans = Double.toString(d_ans);
	    }
	    answer.setText(str_ans);
	}else if(act_cmd.equals("Reset")){
	    answer.setText("0.0");
	    num1.setText("");
	    num2.setText("");
	}
    }
}

せっかくGUIアプリケーションを作っても実行をコマンドから行うのではGUIらしくないので実行可能ファイル(JARファイル)を作ることにします。JARファイルを作るには実行に必要なクラスファイル(.class)とマニフェストファイル(.mf)を用意します。

マニフェストファイルは次のように記述します。

Manifest-Version: 1.0
Main-Class: Calc

このとき、2行目の最後は改行しておく必要があります。またマニフェストファイルは.txt形式で保存しても問題ないようです。

次にjarコマンドを使ってJARファイルを作成します。(jarコマンドはJDKが必要、---Download JDK---)コマンドは次のようにします。

$ jar cvfm Calc.jar Calc.mf Calc.class

jar オプション 作成するJARファイル名 マニフェスト クラスファイルとなっていて、オプションcvfmのvを省くと、何も言わずに実行します。

こうして作成されたJARファイルはダブルクリックするだけで実行することが可能となります。(動作確認はJRE Version6 Update3で確認しましが、他のバージョンで実行できないときは報告してください。---Download JRE---)

クラスファイル:Calc.classをダウンロード
マニフェストファイル:Calc.mf

JARファイル:Calc.jarをダウンロード
Calc.jarをダウンロードするとZIP形式で保存されますが、ファイル名を.zipから.jarに変更するだけで使用可能です。(なぜならJARはZIP形式で圧縮されているため)なお、万が一使用する場合は自己責任でお願いします。

| | コメント (0) | トラックバック (0)

ついにきたか・・・

IT mediaのインタビューシリーズ「New Generation Chronicle」、いいですね、このシリーズ。

ついにきましたよ。amachangさん。

インタビューの内容はココからどうぞ。

なんでamachangさんは自宅にPCを置かないのだろうか?(PCは全て会社にあり、開発やブログの更新はこのPCを使うと言っていた)いろいろと不便だと思いますが・・・。

| | コメント (0) | トラックバック (0)

2008/01/20

更新プログラムKB943899は危険!?

hortenseさんの「PCとほほ日記」経由の情報です。

1月9日にWindows UpdateでインストールされたWindows Vistaの更新プログラム「KB943899」が原因でHDDがスピンアップしなくなってしまうそうです。(つまり、HDDからブートできなくなる)

ThinkPad、Let's noteなど機種を問わず発生しているようなので、私はKB943899をアンインストールしました。(Microsoftには早めに対応してもらいたい!)

解決策もあるようですが、問題が発生する前に対処したほうが無難だと思います。

Link:インストールされている更新プログラムを調べるには

大元の情報源は仙石浩明さんの日記です。

---追記---

発生した機種はLet's note(Panasonicは修正パッチを作成中らしい)、Dell XPSが多いようです。(ThinkPadでの報告もある)

どうやら日立製HDD(Power-Up In Standby 機能をサポートしている)であることが要因のひとつらしいです。

私のThinkPad X60は富士通製のHDDだったので大丈夫だったのかもしれません。ですが、KB943899はブート不可能になる以外にも何かバグがあるような・・・(電源管理まわりに悪影響を及ぼすような)

KB943899をアンインストールしてからシステムが安定したような気がするし。(アンインストール前はスリープから復帰するときの挙動がおかしかった)気のせいでしょうか?

---さらに追記---

KB943899に対して、Let's noteはBIOSアップデート、ThikPadはファームウェアアップデートで対処できるようです。(発症前に適用する必要があります)

| | コメント (0) | トラックバック (0)

今回のSwingプログラムに必要なもの

前回の続きです。

数値計算プログラムをGUI化する計画において、数値計算の部分はC言語をJavaに書き直すとして、一番大事なのはGUI部品です。

計算に必要なパラメータの入力をGUIで行うので、これを実現するために必要なSwingの機能を学習しなくてはなりません。なので、必要な事柄を列挙します。(メモとして)

JFrame : これにコンポーネント(部品)を付け足してGUIを実現する。要はドダイ。

JPanel : フレームに直接、コンポーネントを貼り付けることもできるが、レイアウトを考慮するならば、パネルにコンポーネントを貼り付ける。

JLabel : 主に文字列を表示(画像も表示できる)

JTextField : 文字列を入力するために使用(つまりテキストボックス)

JButton : ボタン。イベントを開始するにはボタンをクリック

JComboBox : ドロップダウンメニューを作る

レイアウトマネージャー : コンポーネントのレイアウトを設定する

・イベントモデル(ActiveEvent) : ボタンを押したら計算開始!とかするためには発生したイベントを処理しなくてはならない。

必要なものはこれくらいでしょうか。

現時点での学習状況はこんな感じです。(ソースコード:Test1.java

Swing_test_3

一応、ここに挙げたものは網羅しているので、今度は四則演算を行う簡単な電卓でも作って練習します。

| | コメント (0) | トラックバック (0)

2008/01/19

無理やりSwing!

だいぶ前にSwingに手を出したものの、いろんなものに手を出しすぎて収集がつかずSwingは放置状態でした。

ある日、課題の数値計算プログラムを書いて動作を実行していたとき、CUIでのパラメータの入力が煩わしくなりました。

そこで私は「GUIだったらもうちょっと便利かもしれない・・・」と思いました。

こう思えたとき私はちょっと嬉しかったです。なぜならば、プログラミングは作りたいものがあるからこそ楽しいですから。(それにプログラマーは楽をするための苦労を厭わない人種であると誰かが言っていた)

とはいっても私はまともなGUIアプリケーションは作ったことがないし、Swingは放置していたのでフレームを表示させるくらいしかできず、さらにJava自体も不自由なく書けるわけではないので数値計算プログラムをGUI化するのは苦労しそうです。

完成までの計画としては、入門書を1ページずつ順に追っていくのでは時間もかかるしモチベーションも消えてしまうので、このプログラムに最低限必要なところだけを覚えようかと思います。(クラスの定義などは今は捨て置く)

でも、たまに背伸びをすると学習効率が上がるような気がします。(もちろん挫折のリスクも伴いますが)

| | コメント (0) | トラックバック (0)

2008/01/18

我々の世界は仮想現実らしいですよ

technobahn」より、 "我々が現実として捕らえている現象の全ては実はコンピューター内に作られた仮想現実ではないか、とする究極の物理学理論をニュージーランドの研究者が5日、論文発表を行った" そうです。

この論文によると、我々の住むこの世界は何者かが作り出した仮想世界で、宇宙はシミュレーションの産物だそうで。

研究者たちは、このように考えることでビッグバンがなぜ起こったのか、未だ解明されない物理学上の疑問点が簡単に説明できるそうです。

・・・奇想天外ですね。というよりも人類の目の前に高~く積まれた問題から逃げ出したと言うべきでしょうか。(キリスト教信者のいう「世界は神によって創造された」を現代的に解釈したのかもしれませんが)

このトンデモ理論を肯定したとすると、この宇宙は周期境界条件下でシミュレーションされていて(1セル=銀河団くらいの単位で)どこまでも同じ光景が広がっているとか、シミュレーションしているコンピュータが処理落ちすると不景気になるとか、シミュレーションしている何者かが飽きてくると「戦争発生ボタン」を押して戦争を引き起こす、なんてことになっていたりして。

・・・SFとしては面白いですが、この研究者たちはもうちょっと現実を見るべきなんでしょうね。

| | コメント (0) | トラックバック (0)

2008/01/17

日経Linux2008年2月号

1月号で創刊100号を迎えた日経Linuxの100号記念企画後編の記事を読むと、創刊当時(1999年)のことが書かれていたので、この頃のことを少し振り返ってみます。

1999年だと私はまだ中2で、Win98マシンをゲーム機がわりにして遊んでいました。(プログラミングの存在なんて知らなかった)

この頃、私の部屋はモデムから離れていたのでインターネットもできなかったし、インターネットの便利さにも気づいてなかったですね。(気づいたのは高3、遅い・・・)

Linuxなんて名前も知らなかったです。

だいぶ話が脱線しましたが、今月号の特集

1.メール・セキュリティ

2.リモートでLinuxを操る

は地味だけど面白いです。

| | コメント (0) | トラックバック (0)

「Culture First」とか言う前にさぁ・・・

ITmediaの記事 「iPod課金」は「文化を守るため」――権利者団体が「Culture First」発表 を読んでいて憤ったのでグチを少々

「文化が経済至上主義の犠牲になっている」とし、経済性にとらわれない文化の重要性をアピールしながら、補償金の「適正な見直し」で、文化の担い手に対する経済的な見返りを要求。[記事抜粋]

つまり、

最近は受け取る補償金の額が減っている。

これはiPodなど携帯オーディオ、PC、携帯電話、カーナビ、Blu-ray Disc、HD DVD、HDDなど、コピーデータを保存することが可能なものが課金対象になっていないからだ。

だから、これらの製品は課金対象にしていこうと思う。

ということらしいです(短絡的だなぁ)。これに対する私の意見は次のようなものです。

・JASRACなどの権利団体が徴収する補償金は使用用途が不明でなので、公開するべき(使い道もわからないものを払わされては消費者は納得いかない)

・権利団体側の理屈は、コピーにたいする課金ではなく「将来コピーする可能性」に課金している。うまく言えないが、釈然としない。

・コンテンツが売れない理由をコピーのせいにするのは乱暴すぎる。売れないのはコンテンツに魅力がないからだ。(コンテンツの乱発にも問題がある)

・収益をあげたいなら課金に頼らずにビジネスモデルを改善すべき(減収を消費者のせいにするのはアホのすることだ)

と、意見は挙げればきりがないですが、要は「もっと考えろ」ってことです。「文化が経済至上主義の犠牲になっている」云々をJASRACとかに言われたくないし・・・

| | コメント (0) | トラックバック (0)

2008/01/16

セグメンテーション違反

セグメンテーション違反っていったいなんだ!?

もっと分かりやすくしてほしいです。

たぶん次のようなことなんだろうけど・・・

  • 配列の要素の指定によるもの
  • ファイルオープンできない
  • 変なものにアクセスしようとしている

もうちょっと細分化してくれないかなぁ。

---追記---

「通りすがり」さんのコメントをうけて、GDBを使ってみたら確かに細かく分析されたので問題解決できました。(このときのセグメンテーション違反は、ある条件下ではfopenしないのにfcloseしようとしてたのが原因)

GDBを使い方を参考にしたサイト:ファイヤープロジェクト

| | コメント (1) | トラックバック (0)

2008/01/15

こんなに・・・

部屋の掃除をしていて気づいたのですが、夏以降に買った本(ほとんどプログラミング関連)の量がすごいことになっていました。

読みきっていない本が大多数・・・。(私の場合、有益な情報が1ページでもあれば買ってしまうので)

地道に読んでいこうと思います。

| | コメント (0) | トラックバック (0)

2008/01/14

HDMIセレクター

我が家にもHDMI端子をもつ高画質液晶ディスプレイが配備され、今後普及するであろうHDMI機器(PCはもちろん、PS3や地デジ、ハイビジョンレコーダーなど)にも対応可能となりました。

しかし、出力端子が増えても入力端子が増えることはそうそうありません。(先に挙げた機器を買うたびにディスプレイを買うことは現実的ではありません)

そこで、HDMIセレクターです!出力をセレクターで管理すればディスプレイ一台で問題なし!ってわけです。

私が探した中で、今のところ候補に挙がっているのは

トリニティSimplism

・シグマA.P.OHDMIセレクター

どちらも入力端子を4ポート備え、リモコン付きです。シグマのはHDMI ver1.3bという不可解なバージョンに対応していますが・・・(次期バージョンは1.3aじゃなかったけ?)

ちょこちょこ買い換えるようなものでもないので吟味が必要ですね・・・。

---追記---

1.3bというバージョンはHDMI検査機関Authorized Testing Center(ATC)におけるテストCompliance Test Specification(CTS)に定義されるバージョンで、一般機器に冠されるものではないそうです。(トリニティのブログに書いてありました。)

| | コメント (0) | トラックバック (0)

2008/01/13

雪だ!

雪が降ってました。今日は。

私がコタツを置いてドカッと座っているこの地点は日本列島のなかでも比較的雪が多い地域のはずですが、今年は積もるほどの雪が降らないです。(年末に多少積もったらしいですが)

もう今年は降らないのだろうか?と思っていたら、雪が降ってひと安心(スタッドレスタイヤが無駄にならずに済むので)でしたが、大して積もらないので「温暖化の影響かぁ」などと思っている私でした。

---追記---

1月17日に無事、積もってくれました。

| | コメント (0) | トラックバック (0)

2008/01/12

あれ?system-config-security-levelは?

以前紹介した「Fedora 8で作るLinuxサーバー超入門」の内容で間違いと思われるものがあったのでメモしておこうと思います。

この本ではファイヤーウォールの設定ツール(下の画像)を呼び出すコマンドを「system-config-security-level」としていますが、Fedora 8ではこのコマンドを使うことはできません。(私の場合はできませんでした)

Photo

「使えない?インストールされていないのだろうか?ならインストールすればいいや。」と思ってyumでインストールしようとしても「system-config-security-level」はどのミラーにも置いてないと言われます。

Fedora Projectを調べてみると、こんな記述が

system-config-firewallsystem-config-selinux パッケージは system-config-security-level を置き換えました。system-config-selinuxpolicycoreutils-gui パッケージの一部です。

つまり「system-config-security-level」はもう存在しないということです。今後、ファイヤーウォールの設定ツールを呼び出すコマンドは「system-config-firewall」になるわけです。

(*別にコマンドで起動しなくてもメニューバーの「システム」→「管理」→「ファイヤーウォール」で起動できます)

| | コメント (0) | トラックバック (0)

2008/01/11

3乗根を求める

2乗根(平方根)を求めるならsqrt()(C言語のmathライブラリの関数)で求められますが、3乗根となると手が止まる人もいると思います。(私もその一人)

3乗根が整数になる値(8,27,64,125,216,...)ならばpow(n, 1.0/3.0)で求めてもなんら問題ないと思いますが、3乗根が実数になる値となると精度が気になります。

そんなときに私が思いつくのはNewton法くらいです。(Newton法の詳細はリンク先のWikipediaで)つまり、f(x) = x^3 - n = 0 とおいてNewton法により x の値を求めるわけです。

う~ん、どちらを使えばいいんだろう?

pow()のほうが汎用性高いけど、Newton法のほうが精度よさそうだし・・・

アドバイス欲しいなぁ

| | コメント (3) | トラックバック (0)

2008/01/10

Windowsで使える開発環境「MinGW」

Windowsで開発(ここではC言語とする)するためのソフトといえば代表的なものに「Borland C++ Compiler」、「Visual C++」、「Cygwin」などがありますが、今日見つけたのが「MinGW」。

「MinGW」とはMinimalist GNU for Windows(Windowsのための最小限度のGNUの意)でCygwinから派生したソフトウェアです。

Cygwinとの大きな違いは、CygwinはPOSIXをWindows上に構築すること目的とし、POSIX互換のためにDLLを必要とするのに対し、MinGWはGCCなどのコンパイラと各種ツールのみをインストールするのでDLLを必要とせず、動作はMinGWのみで完結します。これによりMinGWはリムーバブル・メディアからも使用可能です。(レジストリにも影響を与えない)

インストールはSourceForgeからインストーラーをダウンロードします。(現在の最新版は5.1.3)このインストーラーは必要なファイルをダウンロードしてインストールするので、実行するときはインターネットに接続しておく必要があります。

インストーラーは英語ですが、特に問題は無いでしょう。

Mingw

この画像を見ても分かるとおり、Cコンパイラ以外にもC++やFortran、Javaなどインストールすることが可能です。

インストール後はパスを通して(環境変数のPathを編集する)おけばgccコマンドをどこでも使えるようになります。(デフォルトなら;C:\MinGW\binを追加)

また、Eclipse CDT用のコンパイラにすることもできます。[ZDNet]

| | コメント (0) | トラックバック (0)

2008/01/09

IE、W3C準拠へ! IE7.js!

その筋の人には頭痛の種だったInternet ExplorerのHTML/CSS表示処理をW3C準拠させるためのライブラリ「IE7.js」が公開されました。

詳しいことはこの記事を読んでください!

私がまとめようとしても知識不足で記事をコピペするのと同じになってしまうので ^^;

最近はIEのシェアが低下しているようですから、MicrosoftはIEをW3Cに準拠させることでIEの巻き返しをはかろうとしているのでしょうかね?

| | コメント (0) | トラックバック (0)

2008/01/08

その名は「Emacs.NET」!

年末から耳にするようになったEmacs.NET、これはGNU Emacsの.NET移植版とウワサされているもので、米MicrosoftのDon Box氏が開発しています。

マイコミジャーナル」によると、どうやらDon Box氏は自身のブログでEmacs.NETの開発者とテスターを募集しているようです。

Microsoft公式のEmacsが誕生する日は近い!・・・のでしょうか?

| | コメント (0) | トラックバック (0)

2008/01/07

祝!アクセス数10000突破!

このブログのアクセス数がついに10000を突破しました!

これからもよろしくお願いします。

| | コメント (0) | トラックバック (0)

2008/01/06

iKnow!はじめました

最近目にすることが多くなった「iKnow!」を始めてみることにしました。

毎日続けられるかが心配です。

| | コメント (0) | トラックバック (1)

2008/01/05

EclipseでJSPを実行するときのTomcat設定メモ

以前、EclipseでJSPをTomcat上で実行しても

Tomcat_run

この画像のようにindexが表示されなかったのですが、今日になって解決しました。これは、Tomcatのバージョンによるものらしいです。(私の場合はver6.0.13)

具体的な解決法は、

Tomcat_xml2

画像のようにエクスプローラ内の「サーバー」下にあるTomcat内のファイル[web.xml」を書き換えます。書き換えるところは画像の場所で

Tomcat_xml

<param-name>listings</param-name>の<param-value>をfalseを画像のようにtrueにすればOKです。変更後に実行すると冒頭の画像のようにJSPファイルのリストが表示されるようになります。

*画像内の文字が見にくい場合は画像をクリックしてください。

| | コメント (4) | トラックバック (0)

2008/01/04

Fedora 8 にApacheをインストールする

Fedora 8にApacheをインストールします。

Apacheのパッケージ名は「httpd」なので、管理者権限でyumを実行します。

$ su
# yum install httpd

これでインストールできます。

Apacheがインストールできたら/etc/rc.d/init.d/httpdスクリプトを使います。起動するときは、

# /etc/rc.d/init.d/httpd start

停止するときは、

# /etc/rc.d/init.d/httpd stop

再起動するときは、

# /etc/rc.d/init.d/httpd restart

設定を変更したときにApacheに変更内容を反映させるときは、

# /etc/rc.d/init.d/httpd reload

とします。また、システム起動時にApacheを自動で起動させるようにするには、

# /sbin/chkconfig httpd on

とするようです。なお、外部からアクセスできるようにするためにはファイヤーウォールの設定でポート80番(HTTPプロトコル)を通すように設定しておきます。

| | コメント (0) | トラックバック (0)

2008/01/03

JavaにC言語のprintfのようなものはないのだろうか?

Javaで文字列を標準出力に出力するためのメソッドにprintlnやprintがありますが、数値計算などで出力に数が含まれる場合はこれらのメソッドよりも細かく制御したい(つまりC言語のprintfと同じようにしたい)ときにはどうすれば?と思って調べてみました。

パッケージjava.io内のクラスPrintStreamにはフォーマット処理用のメソッドが2つ存在します。このメソッドはformatとprintfで、2つは同等で構文も同じです。(なぜ全く同じものが2つ存在しているのかは知りませんが)

使い方は以下のようになり、Cのprintfとほぼ同じです。

public class FormatTest
{
  public static void main(String[ ] args)
  {
    long n = 565656;
    System.out.format("%d%n", n);

ただ、C言語の変換文字よりJavaのほうが大雑把みたいです。(10進整数ならd、10進浮動小数点ならfといった感じ)

| | コメント (0) | トラックバック (0)

2008/01/02

今年の抱負はどうしようか

2008年はやりたいこと、やらなければならないことがいっぱいありすぎて整理できてないです。

| | コメント (0) | トラックバック (0)

2008/01/01

2008年1月1日

Free_title_009_2

| | コメント (0) | トラックバック (0)

« 2007年12月 | トップページ | 2008年2月 »