日本野望の会 » level☆☆ http://yabooo.org いずれにせよITで世界征服をたくらむ悪の組織です。 Mon, 28 Dec 2009 14:30:41 +0000 http://wordpress.org/?v=2.8.3 ja hourly 1 FizzBuzzはもう古い!世界のナベアツ問題。 http://yabooo.org/archives/60 http://yabooo.org/archives/60#comments Fri, 01 Feb 2008 16:13:50 +0000 http://www.yabooo.org/archives/60
ネタ記事ですが、いろいろな実装が見たいので。

有名なプログラムでの問題にFizz Buzz問題というのがあります。
これは、

最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」(Bizz Buzz の場合は 「Bizz」)、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」 (Bizz Buzz の場合は 「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者やためらった者は脱落となる。

という、牛タンゲームの簡単なやつみたいなものです。

これに似たことをする芸人さんがいます。

それが「世界のナベアツ」ことジャリズムの渡辺鐘(わたなべあつむ)です。
彼のネタの中で。

「3の倍数と3の付く数字だけアホになり、8の倍数だけ気持ち良くなります」

という天才としか言いようの無いネタがあります。これをプログラムにしてみましょう。

まずはFizzBuzz問題のほうから、

var i=0;
var comments=["","Buzz","Fizz"];
comments.push(comments[2]+comments[1]);
var id=setInterval(function(){
	var flag=0;
	flag|=(i%3==0);
	flag*=2;
	flag|=(i%5==0);
	log((flag>0)?comments[flag]:i);
	i++;
	if(i>100){clearInterval(id);}
},10);

こんな感じです。
ここでは2、3分でやれ

と書いてあるので最初に思いついたやりかたをしてみました。

これをナベアツ問題のほうに書き直すとこんな感じ。

var i=0;
var suffix=["","ぅぅういえぇえあ","~~~"];
suffix.push(suffix[2]+suffix[1]);
var id=setInterval(function(){

	var flag=0;
	flag|=i.toString().match(/3/)?1:(i%3==0);
	flag*=2;
	flag|=(i%8==0);
	log(i+suffix[flag]);
	i++;
	if(i>40){clearInterval(id);}
},10);

だいたい同じような問題です。
ですが、気持ちよくなる方法やアホになる方法などを工夫してみたり、
toStringのような文字列処理を無しでやってみるなど条件設定の付け概のある問題だとおもいます。

みなさんのいろんな実装お待ちしてますw

]]>
http://yabooo.org/archives/60/feed 6
コンピュータって0と1だけなんだよね。 http://yabooo.org/archives/58 http://yabooo.org/archives/58#comments Thu, 31 Jan 2008 06:23:32 +0000 http://www.yabooo.org/archives/58 どうも、野望ブログを書いてくれる人がいなくて寂しいひろきのだいちです。
誰か手伝って><

えっと情報系の学部に入るとなにやらC言語というプログラム言語をいじらされることがあるかと思います。
そんで、なんかccなりgccなりとかをコマンドとしてうたされて、「a.outってやるといいよ。」みたいなことをいろんな人から言われ、そんなもんなのかーって思ってよくわかんねーなって、感じになってしまい、プログラム怖いみたいなことになってしまうこともあるように思います。

なので、映画とかなんとなくの情報で、コンピュータって0と1だけで動くんだぜ、みたいな知識はあるのに、
C言語は0と1じゃないし、よくわからんって人のためにコンピュータって0と1だけなんだなぁということをわかってもらうための記事を書きます。

たとえば、C言語でこんなプログラムを書いたとします。

  #include<stdio.h>
    void main(){
        int b;
        b=10
        printf("%d",b);
    }

これは「人間が理解できるように」「人間がプログラムを書きやすいように。」ということを目的に作られたプログラム言語ってやつなんですが、
これを「コンパイル」(ぷよぷよの会社じゃないよ)という動作で「機械がよめる01のデータ」に直します。

人間が読めなくなってしまったデータはバイナリといいます。
コロスケがコロッケが2個から4個に増えて喜んだときにも「バイナリ~♪」といいますが
それとは関係なく「2進数の」という意味です。

これを16進数に置き換えて中身をみてみると

    00 B8 CC CC CC CC F3 AB C7 45 FC 0A 00 00
    00 C7 45 F8 14 00 00 00 8B 45 FC 03 45 F8・・・・・・

こんなかんじになっています。
まぁ、なんだかわかりませんよねw

なんだかわからないけど、もしこの中身を適当に書き換えちゃうと機械が読めなくなるので動作しなくなっちゃうわけです。

「機械が読めるように書き換えたら?」

そうしたら、C言語という人間がわかる言語を介さなくてもコンピュータに計算を動作させることができるようになるわけです。
というわけでやってみましょう。

    void main(){
        int a;
        int b;
        a=10;
        b=20;
        b=a+b;
        b=a-b;//ココを
        printf("%d",b);
    }

このようなプログラムを、

    void main(){
        int a;
        int b;
        a=10;
        b=20;
        b=a+b;
        b=a+b;//こうする
        printf("%d",b);
    }

このようにしたいと思ったときに、バイナリを書き換えて変更することを考えて見ましょう。

自力で、main関数があるところを探してもいいのですが面倒なので、
目印を入れておきましょう。

    void main(){
        int a;
        int b;
        a=10;
        b=20;
        b=a+b;
        b=a-b;
	//ここに目印を入れておく。
        __asm{
            nop;
            nop;
            nop;
            nop;
            nop;
            nop;
        }
	//何もしない命令をいっぱい入れておく
        printf("%d",b);
    }

__asmから始まるなんかわからない部分が追加されてますが、
気にしないでください・・・・

とはいえ、気になるので説明します。
僕は、プログラムを書くときに「これはおまじない」といわれるのが嫌いなんです。

学校の先生が「おまじないだよ。」というのを耳にしたら、それは半分は職務怠慢だと思ってください。

CPUというコンピュータの内部で計算をしている一番えらい(熱い)機械は、01の塊になったプログラムを渡されるとそれを数個ずつ塊で持ってきて、塊ごとにきまった動作をしてくれる熱いやつです。

この決まった動作ごとに割り当てられた命令を機械語といいます。
機械語にはニーモニックという名前が付いていて、それを「アセンブリ」といいます。(ちょっと違うかもしれないけどこんなかんじ。)

C言語はそれよりももっと複雑に人間にわかるような書き方に変えているので「高級言語」といいます。

__asm{}というブロックの中にはこのアセンブリ言語をそのままかいていいですよ。というふうにコンパイラにお願いする部分です。

そのなかにnopという「何もしないでね」という命令を書き込んでおいたわけです。

nopというニーモニックは、機械語としては16進数で90というのに書き換えられます。これはCPUごとに違うのですが今回の場合はそうでした。

ということは__asmの中身はコンパイルすると

    nop :90
    nop :90
    nop :90
    nop :90
    nop :90
    nop :90

と展開されるということです。

と言うことは・・・・コンパイルされた実行ファイルの中にも
90 90 90 90 90 90という列が存在するはず。

そしてそのあたりがよくわからんけど、
実行ファイルの中のmain関数の最後あたりなんだろーなぁー。

というあたりがつきます。

なので、
バイナリエディタから検索してその位置を確認します。

そして、この90 90 90 90 90 90の直前に

b=b-aが
機械語として展開されているはず!!

そしてその動作がどのようになるかというと、

    1.レジスタにbを入れる
    2.レジスタとaを引き算する
    3.bにレジスタを写す。

こんな感じになります。

いきなり出てきたけど、レジスタってなんだ!!バカ野郎!いい加減にしやがれ!このFXXXやろうが!

と思われるかもしれないので、説明すると
普通プログラムと言うのは、最初作られたときには
ハードディスクという機械の中に入っています。
これは大容量ですが、ちょっとよく使うデータにとっては遅いです。

これを実行するときにメモリという機械にこのプログラムを入れておきます。
メモリは比較的早く読み書きできるので便利です。

ところがCPUっていう熱い機械は、メモリのデータを直接計算することができないのです。

そのかわりレジスタというメモリよりももっと早く読み書きできてしかも計算できるところをちょっとだけ持ってます。

なので、計算するときは一度レジスタに入れてから計算します。

そしてそれぞれが、16進数で2桁(この単位をバイトといいます)×3ずつの命令の長さを持っていて、

    1.(レジスタに入れろ)[Bを]
    2.(レジスタと引き算しろ)[Aを]
    3.(レジスタをメモリに戻せ)[Bに]。

という感じになっていて、

    (**)[** **](sub)[ ** **]
    (**)[** **]90 90 90 90 90 90

こんな風に分けられているので、
このsubという引き算の部分をadd(03)に書き換えて足し算にかえてしまえば
いいということがわかります。

書き換えた結果が
これ↓
binary.gif
そして、
実行してみると・・・

    %assembly1 -20
    %assembly2 40

わお。

ちゃんと書き換えられてますね。

やっぱりコンピュータって01で動いているんだなぁということが
わかりました。

それじゃ、また。

]]>
http://yabooo.org/archives/58/feed 0
ネットワークケーブルをハサミでぶった切った http://yabooo.org/archives/41 http://yabooo.org/archives/41#comments Fri, 25 Jan 2008 10:38:28 +0000 http://www.yabooo.org/archives/41 どうも、ひろきのだいち@事務局長です。

日本野望の会では、中高生や大学でITを学んでいる人に向けて情報技術との触れ合いを促進するための記事を
書いていきます。Writerは随時募集中です。

はじめての記事は、昔ながら「解体もの」です。

最近は無線LANというヤツが普及してきたこともあって、あんまり見たことないひとも増えたかもしれない

Ethernetケーブルというやつをはさみでちょん切りました。

cable_100.jpg

いまや、100円均一でもうっている見慣れたケーブルですね。

主にイーサネットという規格で家庭では使われています。

イーサネット(Ethernet) はコンピュータネットワークの規格のひとつで、世界中のオフィスや家庭で一般的に使用されているLAN(ラン、ローカルエリア・ネットワーク)で最も使用されている技術規格である。

現代のLAN(Local Area Network)では、主に物理的な規格である「イーサネット」と、通信内容の取り決めを決めた「TCP/IPプロトコル」の組合せが一般的である。

 wikipedia イーサネット

だそうです。

ケーブルの名前はカテゴリ5。

カテゴリー5ケーブル: Category 5 cableCat 5)とは、高速信号転送のためのツイストペアケーブルの規格である。基本的にシールドされていない。カテゴリー5の上位規格としてカテゴリー5eがある。主にイーサネットなどのコンピュータネットワークでの構内配線に使われるが、他にも電話トークンリングATMなどにも使われることがある(短距離であれば、最高 155Mbit/s の転送が可能)。

wikipedia カテゴリ5ケーブル

そういった面倒なことはさておき、ぶった切りましょう。

たかが100円です。

おっと、ただ単にぶった切るだけじゃ、おもしろくないですね。

単なる破壊工作になってしまいます。

そこでWikipediaのカテゴリ5の項目を見ていくとこんな記述がありました。

ケーブルのコネクタでの結線は T568A または T568B の2種類の方式がある(右図)。ストレートケーブルの場合、これらはどちらでも違いはない(両端のピン番号が正しく対応しているため)。ただし、ケーブル 同士を継ぎ足す形で接続する場合、両者が混在するとインピーダンスが異なるために信号が減衰する可能性がある。PC同士などを直接つなぐ場合、一方が T568A で一方が T568B のクロスケーブルを使うが、最近のハードウェアはストレートケーブルであっても接続可能な場合がある。

ん?

どうやら、クロスとストレートという2種類があるようですね。

買ってきたケーブルはストレートケーブルというやつでした。

このケーブルは8つ銅線が2つずつねじってよってあり、
信号の雑音による影響を軽減しています。

クロスケーブルとかストレートケーブルの違いは
ケーブルのコネクタ部分で、繋げる線が違うということだけです。

普通、ネットワークの業者などはケーブルの長い(100mくらい)の
を持っていて、必要なサイズにきって適切にコネクタに配置して
利用します。
では、T568AとかT568Bとかってなんなんでしょう。

それは、なかにある8本の線がどういう順番で接続する端子につながれているのかという規格です。

kikaku.jpg

そして、下の図のようなイメージでクロスとストレートの使い分けをします。

cross.jpg

ということは、

tunagu.jpg

見た目は完全にストレートケーブルなのに、中身でクロスしちゃえばクロスケーブルができてしまうということなんです。

そんなわけでおっちらとつないでみることにしました。

 

cable1.png

なんだかよくわからないと思いますが、

1.白/橙
2.橙
3.白/緑
4.青
5.白/青
6.緑
7.白/茶
8.茶
1.白/緑
2.緑
3.白/橙
4.青
5.白/青
6.橙
7.白/茶
8.茶

という具合に、切断したケーブルをつなぎなおして、テープで止めただけです。

これで完成した手作りクロスケーブルと同じく買ってきたクロスケーブルを測定して比べてみましょう。

世の中にはステキな人がいて、通信を測定するツールがタダで利用できます。

http://dast.nlanr.net/Projects/Iperf/ 

今回はこのIperfというソフトを使いました。

測定結果は・・・

市販のクロス
PC–PC:67.5Mbps

自作のクロス
PC–PC:66.8Mbps

と言う感じでほとんど変わりません。

さらに!

100MbpsのFast Etherの場合、8本のより対線のうち4本しか使ってないので 残り4本を切断しても
ケーブルとして利用できるんです。

今まで無駄な4本の線を買わされていた訳ですね。

cable2.jpg

この4本、規格から調べて切断してもいいんですが、

今回はロシアンルーレット方式で切断しました。

ずっと通信した状態でもビリビリすることはたぶん無いので安心です。

通信が切断してしまったら、それは大事な線だったのでつなげなおして、

通信が切断しなかったら、それはいらない線なのでそのまま放置です。

全部切断した後でも通信速度は変わりませんでした。

kansei.jpg

最終的にこんな感じで、いらない4本をつながないままぐるぐる巻きにして我が家でクロスケーブルとして活躍中ですw

もし、よろしければ皆さんもこんなかんじで ケーブルぶった切ってみませんか?

]]>
http://yabooo.org/archives/41/feed 0