2007/12/27 木曜日

gd.sh改良しました。

Posted in シェルスクリプト by 管理人 @ 12 月 27, 2007

以前紹介したzsh auto_pushd のシェルスクリプト

gd.shというの書いたのですが、少し改良しました。

改良した点はdirs -v -l で表示される重複したディレクトリは表示しないよう

にしたのと、逆順ソートにして最新のディレクトリが一番下に表示されるように

しました。改良時間は1時間くらいなのでうまく動かない場合があるかもしれませんが

その時はコメントお願いします。

では プログラムです。

ここから————–

#!/bin/sh
dirs -v -l | awk '{
    a[$1]=$2;
    b[$1]=$2;
}
END{
    for( i=0; i<NR; i++){
        work=a[i];
        checknum=0;
        for( j=i+1; j<NR; j++){
            if( work == a[j] ){
                b[j] = "skip";
            }
        }
    }
    for ( i=NR-1; i>-1; i--){
        if ( b[i] != "skip"){
            printf("%d %s\n",i,b[i]);
        }
    }
}'
echo 移動したい番号を選んでください。
read newdir
# 入力値に1をプラスし、その終了ステータスを判定する。
expr 1 + $newdir >/dev/null 2>&1
case $? in
    0 | 1 )var=`dirs -v -l |grep -w $newdir |awk '{printf("%s\n",$2)}'`
        cd $var;;
    * ) echo " 数字以外が入力されました >$newdir" ;;
esac

ここまで————–

2007/9/10 月曜日

Javaにはポインタがない!!

Posted in プログラミング by 管理人 @ 9 月 10, 2007

よくJavaにはポインタがないのでC言語よりもわかりやすい

という人をよく見かける。

確かに明示的なポインタの宣言はJavaにはない。

だがポインタという概念がなくなったわけではないと私は思う。

例えば以下プログラムはどうだろう?

class test{
    public static void main(String[] args){
        tmp a =new tmp();
        tmp b =new tmp();
        a.data=10;
        b.data=20;
        a = b;
        b.data=100;

        System.out.println(”a= ” +a.data);
        System.out.println(”b= ” +b.data);
    }
}
class tmp{
    int data;
}

実行結果は以下の通りである。
a= 100
b= 100

どうだろう?

a=10

b=100

と想像してしまった人はいないだろうか?

どこでa.dataに100という数字が入ってきてしまったんだろう?

問題は

a = b;
の箇所だ。

そうクラスは参照型なのである。

つまりclass tmp aにはクラスのアドレスが格納されている。

これはC言語でいうポインタとほぼ一緒ではないだろうか?

クラスのアドレスが格納されているので

a=b;

でアドレスの参照先が一緒になってしまう。

参照先が一緒なので

b.data=100;

でa.dataも100になってしまうというわけだ。

ポインタという概念がない人にとっては

戸惑ってしまうだろう。

Javaのオブジェクト指向がゼッタイにわかる本―最初からそう教えてくれればいいのに!
Javaのオブジェクト指向がゼッタイにわかる本―最初からそう教えてくれればいいのに! 立山 秀利

秀和システム 2006-05
売り上げランキング : 148137

おすすめ平均 star
starタイトルはあやしいが、結構わかりやすい
starオブジェクト指向って何?っていう初心者に、いいです。

Amazonで詳しく見る by G-Tools

Javaを独習する前に読む本
Javaを独習する前に読む本 青木 峰郎

アスキー 2003-02
売り上げランキング : 269320

おすすめ平均 star
star独習したい人の最初の本に最適
starJavaの世界をのぞくのに最適
starもっと早くこの本に出会いたかった

Amazonで詳しく見る by G-Tools

2007/7/5 木曜日

シェルスクリプト コンパイラ shc

Posted in シェルスクリプト by 管理人 @ 7 月 5, 2007

みなさんLinuxやUnixでバックアップや毎日定期的に動かしたい

プログラムなどはシェルで作ってそれをcronなどで登録してると

思うのですが、シェルの中身はテキストなので、パスワードもそのまま丸見えの状態ではないでしょうか?

セキュリティ上パスワードが丸見えというのは、危険だと思うので

どうにかなかならないものかと思っていたら
シェルスクリプトをバイナリの実行形式にコンパイルするツールを発見しました。

その名もshc です。
これでコンパイルしたら一緒にC言語ファイル(中身はたぶんよくわからない用になっている)も作成されるので、シェルスクリプトを配布したいが、ソースは公開したくないと時にも使える。

もちろんシェルの暗号化にも使える。

一度試してみてはいかがでしょうか?

仕事に使えるLinuxシェルスクリプト~bashで作る実用サンプル41
千葉 真人
日経BP社
売り上げランキング: 96255
UNIX シェルスクリプト辞典 (Desktop reference)
志田 智 川井 義治 田淵 貴昭 米田 聡
翔泳社
売り上げランキング: 290733
おすすめ度の平均: 5.0

5 よみやすい

2007/5/28 月曜日

zsh auto_pushd のシェルスクリプト

Posted in シェルスクリプト by 管理人 @ 5 月 28, 2007

LinuxやUnixを使っている人はシェルというものにこだわりがあるものだ。
solarisやBSD系の人はだいたいcsh tcsh。Linuxの人はbashが定番なのだが、
zshはご存知だろうか?アルファベットのzがついているので最後のシェルという
意味らしいのだが、その名にふさわしく最強のシェルだそうだ。

どんな感じかは漢のzshというコラムに
zshの魅力が紹介されている。

この中のsetopt auto_pushd というオプションが便利だな~と私は使ってみて思った。
ということで、シェルスクリプトで似たような感じができないかなと思ったので、作ってみました。
けっこうzshが入ってる環境は少ないもので(笑)

とりあえず下記のプログラムをファイルに保存し実行権限をつけてください。
ここではgd.shという名前に保存したとする。

ここから————–

#!/bin/sh
dirs -v
echo 移動したい番号を選んでください。
read newdir

# 入力値に1をプラスし、その終了ステータスを判定する。
expr 1 + $newdir >/dev/null 2>&1
case $? in
    0 | 1 )var=`dirs -v -l | grep -w $newdir | awk '{printf("%s\n",$2)}'`
               cd $var;;
        * ) echo " 数字以外が入力されました >$newdir" ;;
esac

ここまで————–

そして、pathが通っているとこに持っていってください。
次にaliasに下記を設定してください。
alias gd=’. gd.sh’
alias cd=’pushd > /dev/null’

これで終了です。
# gd
で起動できると思います。
あとはお好きにしてください。

また便利なシェルスクリプトを作ったら載せてみたいと思います。

2007/1/28 日曜日

パフォーマンス

Posted in プログラミング by 管理人 @ 1 月 28, 2007

パフォーマンスを考えているコーディングしているだろうか?
私もできれば速く効率のよいコードが良いと
考えていたのだが、必ずしもそれが良いコードではないということを知った。

Donald Knutは「An Empirical Study of Fortan Programs」という論文の中
で、プログラムの4%未満が実行時間の50%以上を占めているとしている。
つまりプログラムのほんの4%が実行時間の大半を占めているので、プログラムを
コーディングする際にパフォーマンスを考慮してコーディングするのではなく
読みやすさメンテナンスを最優先コーディングすべきだと思う。

実際にプログラムが完成したところで実行して遅いと感じたらパフォーマンスの
ことを考えても遅くないと思う。実際にプロファイラなどを使ってどこの
箇所が実行を遅くしているのかを調べる必要がある。まあその箇所も全体の4%
を探しあててそこ改善すればだいたいOKになるはずだ。

なので最初からコーディングする際にパフォーマンスを意識して
全体を速くしても意味がないし効率が悪いし、パフォーマンスを意識して
読みやすさメンテナスが悪くなっては元も子ないのである。

コードチューニングのテクニックで「行数が少ない方が速い」という定説があるがこれは嘘である。
下の例


rei1:
for i =1 to 10
  a[i] = i
end for

rei2:
a[1]=1
a[2]=2
a[3]=3
a[4]=4
a{5]=5
a[6]=6
a[7]=7
a{8]=8
a[9]=9
a[10]=10

行数が少ない方が速いのというならrei1のほうが速いと考えるだろうが
実際には

言語 rei1の所要時間 rei2の所要時間
Visual Basic 8.47 3.16
Java 12.6 3.23

である。驚きだろうがコードの行数を減らしたからといって速度には関係ないのである。
またコンパイラにもよって速度というのは変わってくるので、以前この方法で速くなったという
経験則はまったく通じないのである。
またこの続きはいつか書きたいと思う。

Unixシステムパフォーマンスチューニング 第2版
ジャン‐パオロ・D. ムズメキ マイク ルキダス Gian‐Paolo D. Musumeci Mike Loukides 砂原 秀樹 高橋 敏明 岡島 順治郎
オライリージャパン
売り上げランキング: 190235
おすすめ度の平均: 4.0

3 チューニングの初歩
5 第2版はすごい SolarisとLinux対応

Javaパフォーマンスチューニング 第2版
ジャック シラジ Jack Shirazi 今野 睦 福与 直也 杉野 博史
オライリージャパン
売り上げランキング: 218786
おすすめ度の平均: 3.0

2 内容は良いんですが...
4 コードレベルのパフォーマンスチューニング

2007/1/22 月曜日

Accessにテーブルを作成する

Posted in c# by 管理人 @ 1 月 22, 2007

Accessにテーブル追加するサンプルです。

private void button1_Click(object sender, System.EventArgs e)
{  
    System.Data.OleDb.OleDbConnection cn =
    new System.Data.OleDb.OleDbConnection();
    System.Data.OleDb.OleDbCommand cmd;

   // 接続文字列を設定してデータベースに接続する
    cn.ConnectionString = “Provider=Microsoft.Jet.OLEDB.4.0;”
    + “Data Source=C:¥tmp¥DBSample.mdb;”;
    cn.Open();

   // 追加するテーブルが存在していたら削除しておく
    try
    {
      cmd = new System.Data.OleDb.OleDbCommand(
      ”DROP TABLE 社員”, cn);
      cmd.ExecuteNonQuery();
    }
    catch{}

   try
    {
      // 社員 テーブルを追加する
      cmd = new System.Data.OleDb.OleDbCommand(
      ”CREATE TABLE 社員(社員番号 INT, 氏名 TEXT(30))”, cn);
      cmd.ExecuteNonQuery();
    }
    catch( Exception ex)
    {
      MessageBox.Show(ex.Message.ToString());
    } 

   // データベースへの接続を切断する
    cn.Close();

   MessageBox.Show(”[社員]テーブルを追加しました。”, “結果通知”);
}

速効解決!逆引きハンドブックVisual C#

速効解決!逆引きハンドブックVisual C#

posted with amazlet on 07.01.22

日向 俊二
ソシム
売り上げランキング: 9460

おすすめ度の平均: 5.0

5 手許においておくと便利

2007/1/17 水曜日

Accessのテーブル一覧取得

Posted in c# by 管理人 @ 1 月 17, 2007

たまにはプログラム的なことも書こうかなと思いまして
リファレンス的なものを作っていこうかなと。

なにかの役に立つかもしれなので(なんの役に立つかはわからないが・・)

環境はVisual C# 2005 Express Editionです。

ということで、Accessのファイルのテーブル一覧取得です。

private void button1_Click(object sender, System.EventArgs e){
    System.Data.OleDb.OleDbConnection cn =
        new System.Data.OleDb.OleDbConnection();
    DataTable dt;

    // 接続文字列を設定してデータベースに接続する
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
        + "Data Source=C:¥tmp¥DBSample.mdb;";
    cn.Open();

    // テーブル一覧を取得する
    dt = cn.GetOleDbSchemaTable(
        System.Data.OleDb.OleDbSchemaGuid.Tables
        , new object[] {null, null, null, "TABLE"});

     // データベースへの接続を切断する
    cn.Close();

    // 結果を表示する
    foreach(DataRow dtRow in dt.Rows)
        System.Diagnostics.Debug.WriteLine(dtRow[2].ToString());
}

結果は出力ウィンドウに表示されます。

独習C#
独習C#

posted with amazlet on 07.01.17
ハーバート シルト Herbert Schildt スリーエーシステムズ 矢嶋 聡
翔泳社
売り上げランキング: 43705
おすすめ度の平均: 4.0

4 C#の文法を学ぶ本だというのは確かにそのとおり
4 .NET Frameworkの解説書ではありません、文法マニュアルです
4 この本はC#の文法の本です。

XHTML 1.0 CSS 2.0 RSS