コンピュータ

Posts filed under コンピュータ

続・見ろ!!コードがゴミのようだ!!

Filed in ゴミコード, プログラム

せっかくなので先日書いたゴミサンプルをC++で書き直してみた。

#include <iostream>
#include <string>

class SampleClass {
public:
	int i;
	std::string s;
};

class Test {
	public:
		SampleClass* methodA(SampleClass* a, SampleClass* b);
};

int main(int argc, char* argv[])
{
	SampleClass a = SampleClass();
	a.i = 1;
	a.s = "a";

	SampleClass b = SampleClass();
	b.i = 2;
	b.s = "b";

	Test t = Test();
	
	std::cout << "== before ==" << std::endl;
	std::cout << "a= " << a.i << ":" << a.s << std::endl;
	std::cout << "b= " << b.i << ":" << b.s << std::endl;
	
	SampleClass* c = t.methodA(&a, &b);

	std::cout << "== after ==" << std::endl;
	std::cout << "a= " << a.i << ":" << a.s << std::endl;
	std::cout << "b= " << b.i << ":" << b.s << std::endl;
	std::cout << "c= " << c->i << ":" << c->s << std::endl;
	
	delete(c);
	return 0;
}

SampleClass* Test::methodA(SampleClass *a, SampleClass *b) {
	a->i = 11;
	a->s = "A";
	
	SampleClass b2 = SampleClass();
	b2.i = 12;
	b2.s = "B";
	b = &b2;

	SampleClass* c = new SampleClass();
	*c = b2;
	return c;
};

同じように作ったのだから結果は当然同じ。
ただ、戻り値cはnewしたものなので最後にdeleteしている。
この辺はJavaではそんなに意識しないことだろう。

== before ==
a= 1:a
b= 2:b
== after ==
a= 11:A
b= 2:b
c= 12:B

しかし超久しぶりにC++を書いたのでアクセス修飾子ってどうするんだっけ?と迷ってしまった。。
昔は当然と思っていたのに宣言と定義を分けるというのもかなり煩わしく感じた。
“System.out.println”と”std::cout <<" を比較すると"std::cout <<"などはプログラムを知らない人には謎の暗号にしか思えまい。。 久しぶりにC++のコードを書いて思ったのはポインタを使いたいとは思わないが、やはり概念は知っておくべきということ。 Javaで参照がどうとか勉強するよりもC++やCでポインタを学んだ方が近道な気がしている。 Javaにはガベッジコレクタがあると言ってもメモリの無駄な消費はメモリの断片化が起こってガベッジコレクタの頻発などパフォーマンスに悪影響です。インスタンスの無駄な生成自体もコストがかかりますしね。やはりJavaであってもいざというときはメモリを意識したプログラムを書くべきです。 こんなコード書いてもいいこと何もないですよ。 [java] SomeClass a = new SomeClass(); SomeClass b = new SomeClass(); // このインスタンスが作られてすぐ捨てられる b = a; [/java]

見ろ!!コードがゴミのようだ!!

Filed in ゴミコード, プログラム

まずは以下のjavaのコードをみてもらおう。

class SampleClass {
  public int i;
  public String s;
}

public class Test {
  static public void main(String[] args) {
    Test test = new Test();


    SampleClass a = new SampleClass();
    a.i = 1;
    a.s = "a";
    
    SampleClass b = new SampleClass();
    b.i = 2;
    b.s = "b";

    System.out.println("== before ===");
    System.out.println("a= " + a.i + ":" + a.s);
    System.out.println("b= " + b.i + ":" + b.s);

    SampleClass c = test.antiPattern(a,b);

    System.out.println("== after ===");
    System.out.println("a= " + a.i + ":" + a.s);
    System.out.println("b= " + b.i + ":" + b.s);
    System.out.println("c= " + c.i + ":" + c.s);
  }

  public SampleClass antiPattern(SampleClass a, SampleClass b) {
    a.i = 11;
    a.s = "A";

    SampleClass b2 = new SampleClass();
    b2.i = 12;
    b2.s = "B";
    b = b2;

    SampleClass c = new SampleClass();
    c = b2;
    return c;
  }
}

mainメソッドでantiPatternメソッドを呼ぶ前後で変数値を出力している訳だが何が出力されるか分かるだろうか。

結果はこうである。

== before ===
a= 1:a
b= 2:b
== after ===
a= 11:A
b= 2:b
c= 12:B

変数cは良いとしても、aやbまでもmainメソッドだけを見ていては決して分かりようがない結果が出力されるのである。さらに言うとantiPatternメソッドを見てみると直感的にはbも更新されてよさそうな気がするのだが実際はそうはならない。この辺はjavaのメソッドはポインタの値渡しであるという言語仕様によるものである。

しかしこれは言語仕様が許しているからと言って書いてはいけないコードの代表格と言えるだろう。mainメソッドを読んでいるのにantiPatternメソッドがどうなっているかまで意識しなくてはいけない。

上の例ではantiPatternメソッドが実行ステップにして10行足らずで完結しているのでまだよいが、antiPatternメソッドも同じように別のメソッドAを呼びだしてAの中でも渡した変数の中身が変わって返ってくるとなったらどうだろうか。さらにAの中でもBを呼び出し、Bの中でもCを呼び出し・・・。
結局全部のコードを理解しないと高々数十行のmainメソッドすら読み解くことができない。
これでは保守性が悪くてどうしようもない。
これをゴミコードと呼ばずにいられるだろうか。いや、いられまい(反語)。

さて、突然こんなことを書いたのは仕事でこんなコードを見たからである。
実際はもっと処理があるが、ポイントだけ抜粋した。

public class Y {
  public void methodA() {
    ・・・
    XListGenerator generator = new XListGenerator(a,b,c);
    List<X> xList = new ArrayList<X>();
    ・・・
    List<Something> somethingList = new ArrayList<Something>();
  ・・・
    generator.set(xList, somethingList);
  }
}

クラス名が悪い、変数名が悪いとか言いたいわけではない。
methodAが何をやっているか分かるだろうか。
「generatorに2つのlistを設定している。」と読みとるのが自然ではないだろうか。

しかしgenerator.set(list,somethingList)の中を見て愕然とした。以下のような内容なのであった。

   public set(List<X> xList, List<Something> somethingList) {
       for(i=0; i<somethingList.size(); i++) {
          String s= somethingList.get(i).getString();
          xList.get(i).setS(s);
       }
   }

なんなんでしょうかこれ。

完全に依存関係があるんだしメソッドを分けたって百害あって一利なしだ。setの主体もgeneratorなのかなんなのかよく分からない。
これでいいじゃない。

public class Y {
  public void methodA() {
    ・・・
    List<X> xList = new ArrayList<X>();
    ・・・
    List<Something> somethingList = new ArrayList<Something>();
  ・・・
    for(i=0; i<somethingList.size(); i++) {
       String s= somethingList.get(i).getString();
       xList.get(i).setS(s);
    }
  }
}

どうしてもgeneratorを使いたいなら、なるべく原型を残したとしてこうだ。

public class Y {
  public void methodA() {
    ・・・
  XListGenerator generator = new XListGenerator(a,b,c);
    ・・・
    List<Something> somethingList = new ArrayList<Something>();
  ・・・
    List<X> xList = generator.generate(somethingList);
  }
}

プログラムは動けばよい!というのは自分一人で作っている場合に限るのである。
こんなコードを読まなければいけない他人の身にもなってコードは書くべきである。

PCを携帯メールで操作

Filed in コンピュータ

たまにはIT技術者らしい記事でも。
ふと家のPCを出先から操作できるようにしようと思い立った。
うちには2台PCがある。
1台はサーバ機として稼働しており常時立ち上がりっぱなしである。
技術メモ用のWikiなどが立ちあがっている。
もう一台はクライアントとして使っており使っていないときは電源を落としている。
両方を操作したいと思っている。
iPadもiPhoneもAndroidもノートPCも持たない私が外出先から使えるのはいわゆるガラケーのみ。
ウェブを見ることとメールの送受信くらいはできる。
この制約のもとでPC操作を試みてみた。

Read the rest of this entry »

メール復活の仕組み

Filed in コンピュータ

角界に激震が走っております。あるあると言われてきた八百長。今回こそちょっとヤバい感じですね。
決め手となりそうなのは、八百長のやり取りをしていたメールがあったということですね。
メールは削除していたそうですが復元させたということだそうですね。
削除されたメールがある程度復元できるというのはIT関係の人間なら常識なのですが(ですよね?)、一般的には削除したのに復元できるってどういうこと?って感じなのでしょうか。

Read the rest of this entry »

デジタルとはなんぞや

Filed in コンピュータ

たまにはプログラマらしいことでも書いてみましょう。
よくデジタル、デジタルと申しますがそもそもデジタルとは何であろうか。ということを述べてみたいと思います。
デジタルと言われてよくある答えが0と1で表現するものというものです。厳密にはちょっと違いますが、コンピュータなどの電子機器に限って言えばその通りです。
ではなぜそもそも0と1なのかということは分かるでしょうか。分かり切ったことをという方はこの先を読んでも意味が無いのでお別れです。

Read the rest of this entry »

プログラマの素養

Filed in コンピュータ

本日はちょっと短めに、プログラマに必要な能力について書いてみます。
私の考えでは、プログラマにとって最も必要な能力とは以下の能力です。
「手を抜くことに全力を尽くせる」
いかに手を抜くか、これはプログラマに限らず多忙な日々を送る現代人全てにとって必要なことかと思われます。しかし、プログラマがその他の人と最も違うのは手を抜くためのツールを自分で作り出すことができるということです。
自分のやっている仕事を全てできるプログラムが作れれば、自分はプログラムを実行して休んでいればいいのです。
現実には全ての仕事をやらせるプログラムなんてできませんが、一部だけでもやらせればいいのです。空いた時間の分だけ本当に自分でやらなければいけないことに多く時間をさけるようになります。そういったプログラムの作成に全力を尽くせるかどうかが優秀なプログラマになれるかどうかの1つの分かれ目になると思います。

PC復活作戦失敗・・

Filed in コンピュータ

少し前の話ですが、調子に乗ってしまって失敗した話を。
以前、壊れていたPCの電源を交換して修理をし、Fedoraを導入しました。無事にウェブサーバを立ち上げ、mediawikiも立ち上げたのでした。
しかし、どうもCPUファンが常にウィンウィンと大きな音を鳴らしています。静音性の高いファンを買おうかとも考えましたが、こんな型落ちのPCにこれ以上お金をかけたくはない。
そこでグリスを購入してCPUの冷却を図ることにしたのです。
少し奮発してシリコングリスではなくシルバーグリスを購入しました。とはいえ、、600円程度のものであります。このグリスをCPUに塗りたくってやることで放熱効果を得ることができるのです。
そんなわけで、さっそくケースを開けケーブルを外し、CPUについてるファンを取り外す作業に取り掛かります。
金属のストッパーが何やら錆まくっており固いのなんの。しかし、外さなければ始まらないのでマイナスドライバーをすき間に差し込みくいっとやります。

Read the rest of this entry »

続・クラウドで世界からコンピュータが消える?

Filed in コンピュータ

前回はクラウドのメリットについて述べました。
今回はデメリットについて書こうと思ったがなんだか面倒くさくなってしまった。
今更わたしが書かなくてもいろんなところで言われているし、、。
要するにデータが自分の管理できない場所にあるためいざというときに困ってしまう。機密情報を外部の管理に任せることが危険である。というのがデメリットとしてあるわけです。
その結果、機密情報や重要な情報はやはり自分たちで管理するしかないでしょう。そのため、自社システムのスリム化はできるかも知れませんが、システム撤廃の決定的なものとはなり得ないと考えています。
それでも全てをクラウド化するというのであれば、世界中から信頼されるような国際機関なりを設立するしかないのではないでしょうか。まあ、そんなことをすればかえってコストがかかってしまい本末転倒でしょう。

Read the rest of this entry »

クラウドで世界からコンピュータが消える?

Filed in コンピュータ

今更の感がありますがクラウドについての話題。
クラウドとは某RPGの主人公。ではなくて、クラウドコンピューティングと呼ばれるシステムの提供形態のこと。クラウドとはCloudのことであり、雲のことです。
システムはネット上のどこかで動いていて、そこで扱われるデータもネット上のどこかにある。1つのデータが分割されていろいろなところに散っていてもいい。そして、ユーザはその場所を意識しなくてもよいと言うもの。
場所がもやっとしているのでそれを雲として表現しているのでしょう。
クラウド自体がコンピュータの数を減らすものではないですが、システムがどこにあってもよいことから、企業が自分たちでシステムを抱え込む必要がなく、システムまるごと外部企業に委託してしまうことで自社のシステムを破棄でき、結果的にいくつかのシステム提供企業以外からはコンピュータが無くなるだろうというものです。
ちょっと前の話ですが、クラウドについてSunMicroSystemsのグレッグ・パパドプラス氏が語ったそうです。なんでも「クラウドにより世界のコンピュータは5台になるだろう。」だとか。
まあ、本人も文字通りの意味で言ったわけではなく、5台のコンピュータというのは5つのクラウドシステム。という意味です。
現状ではグーグルやセールスフォースドットコムあたりが一歩か半歩程度先を走っている感じでしょうか。
ではなぜそんな回りくどい言い方をしたのかと言うと、コンピュータの創世記にIBMのトーマス・J・ワトソン氏が「コンピュータの市場は5台くらい」と発言したと言われていることに引っ掛けているんです。このあたり、ウィットに富んでいるというかなんというか上手いですね。

Read the rest of this entry »

PC復活作戦2

Filed in コンピュータ

さて、前回の続き。
無事電源が入るようになったPCです。
さて、次はインストールイメージをネットから落としてっと。。ただでOSが手に入るのがいいところですね。
・・・
なんと。。1G超えとな。。DVDとな。。
昔に比べて倍の容量になっているじゃないですか。CD1枚で済んでいたのは遥か昔のことか。。
悪いことに手元にDVDのメディアがない。仕方がないので6分割されたCDイメージをダウンロード。DVDメディア買いに行った方が楽だったと途中で思いつつもCDを6枚つくりました。
面倒臭い作業が終わりついにインストールです。メディアをドライブにセットして電源ON!画面に表示されたイメージロードの進行状況を現す目盛が伸びていきます。
がっ!ここでトラブル発生です。
急にリセットがかかったようにBIOS読み込み画面に戻ってしまいました。そして、またイメージロードの進行状況を現す目盛が伸びていきます。がっ!またもやリセット。。
何度やっても症状は変わりません。
PCのケースを開き、一度すべてのパーツを外して刺し直すという作業もしてみましたがやはりだめ。どうやらAGPの認識がうまくいっていないようだ。。。
後日の調査によるとDVI接続のドライバがないとの噂。
仕方がないのでビデオカードを外しオンボードを利用することとした。
すると問題なくインストール完了。

Read the rest of this entry »