プログラミング学習録

とあるプログラマーが、プログラムについて学んだことを書き記す、備忘録です。

CentOS6.5が公開された。

32bit
http://ftp.riken.jp/Linux/centos/6.5/isos/i386/

64bit
http://ftp.riken.jp/Linux/centos/6.5/isos/x86_64/


どちらのbit対応の物を見ても良いが、一例として64bitのインストール一覧を挙げると、
 0_README.txt                          01-Dec-2013 07:41  2.2K  
 CentOS-6.5-x86_64-LiveCD.iso          30-Nov-2013 02:09  649M  
 CentOS-6.5-x86_64-LiveCD.torrent      01-Dec-2013 08:23   26K  
 CentOS-6.5-x86_64-LiveDVD.iso         30-Nov-2013 02:13  1.7G  
 CentOS-6.5-x86_64-LiveDVD.torrent     01-Dec-2013 08:23   70K  
 CentOS-6.5-x86_64-bin-DVD1.iso        29-Nov-2013 21:11  4.2G  
 CentOS-6.5-x86_64-bin-DVD1to2.torrent 01-Dec-2013 08:23  215K  
 CentOS-6.5-x86_64-bin-DVD2.iso        29-Nov-2013 21:11  1.2G  
 CentOS-6.5-x86_64-minimal.iso         29-Nov-2013 21:14  398M  
 CentOS-6.5-x86_64-minimal.torrent     01-Dec-2013 08:23   16K  
 CentOS-6.5-x86_64-netinstall.iso      29-Nov-2013 21:05  243M  
 CentOS-6.5-x86_64-netinstall.torrent  01-Dec-2013 08:23   10K  
 md5sum.txt                            30-Nov-2013 02:49  388   
 md5sum.txt.asc                        30-Nov-2013 02:59  1.2K  
 sha1sum.txt                           30-Nov-2013 02:50  436   
 sha1sum.txt.asc                       30-Nov-2013 02:58  1.3K  
 sha256sum.txt                         30-Nov-2013 02:52  580   
 sha256sum.txt.asc                     30-Nov-2013 02:58  1.4K  

真ん中付近に

CentOS-6.5-x86_64-bin-DVD1.iso        29-Nov-2013 21:11  4.2G  
 CentOS-6.5-x86_64-bin-DVD1to2.torrent 01-Dec-2013 08:23  215K  
 CentOS-6.5-x86_64-bin-DVD2.iso        29-Nov-2013 21:11  1.2G  

と、DVD1とDVD2のISOがあることが分かる。
DVD1だけでダウンロードは完了できるので、DVD1とDVD2の違いは何なのかと疑問に思っていた。

結論から言うと、DVD1が本体で、DVD2が追加パッケージであった。

http://wiki.centos.org/Manuals/ReleaseNotes/CentOS6.0#head-710e17fe8ed8c98a1fe4faee4e11e2135df09fff

原文(英語)
Content for x86_64 is split into two DVDs. The second disk contains only packages from upstream's "Optional" channel. Installs not requiring any of the packages from the "Optional" category should run using only DVD#1.
日本語
64bitの内容物は、二つのDVD(筆者注:DVD1とDVD2のこと)に分かれています。2つ目の内容物はアップストリームの追加チャンネルのパッケージだけを含んでいます。インストールしたものは追加カテゴリーからのパッケージを一切必要とせずDVD1を使うだけで動きます。


break文とcontinue文はどの様に違うのか。
言葉で書くと、

break文=強制的に処理ブロックから抜け出す
continue文=強制的に以降の処理を終了する

である。 
言葉で書くとあまり違いがないが、実際の処理には大きな違いがある。
違いを明確にするために、C言語で以下の検証用プログラムを使う。

プログラム1
#include <stdio.h>

int main(void){
int i=0, j=0, test=0;
for (i = 1; i < 5; i++){
for (j = 1; j < 5; j++){
if (j == 3){
break;
}
printf("%dの%d回目\n", i, j);
}
}
scanf_s("%d", &test);//入力待ちによるストップ目的
return 0;
}


プログラム2
#include <stdio.h>

int main(void){
int i=0, j=0, test=0;
for (i = 1; i < 5; i++){
for (j = 1; j < 5; j++){
if (j == 3){
continue;
}
printf("%dの%d回目\n", i, j);
}
}
scanf_s("%d", &test);//入力待ちによるストップ目的
return 0;
}


上記のプログラムは、2つのfor文から構成されている。
break文、continue文、がなければ、

1の1回目
1の2回目
1の3回目
1の4回目
2の1回目
2の2回目
2の3回目
2の4回目
3の1回目
3の2回目
3の3回目
3の4回目
4の1回目
4の2回目
4の3回目
4の4回目

と表示されるプログラムである。
なお、実行を何らかの形で止めなければプログラムがすぐに終了してしまい結果が見られないので、scanf_s関数で入力待ち状態にして止めることにする。
今回は、2個目のfor文の3回目で、プログラム1ではbreak文、プログラム2ではcontinue文が実行される様にした。
それぞれの実行結果は、以下の通りになる。


プログラム1実行結果 (2個目のfor文の3回目でbreak文)
1の1回目
1の2回目
2の1回目
2の2回目
3の1回目
3の2回目
4の1回目
4の2回目


プログラム2実行結果(2個目のfor文の3回目でcontinue文)
1の1回目
1の2回目
1の4回目
2の1回目
2の2回目
2の4回目
3の1回目
3の2回目
3の4回目
4の1回目
4の2回目
4の4回目

上記を見て分かる通り、プログラム1においては、break文は強制的に処理ブロックから抜け出すので、2個目のfor文からbreak文が実行された段階で即座に抜け出し、1個目のfor文の処理を続ける、という結果になっている。また、break文により抜け出せる処理ブロックは、全部(=1個目のfor文と2個目のfor文の両方)ではなく、1個(=braek文をブロック内で実行した2個目のfor文だけ)ということが分かる。
プログラム2においては、continue文は強制的に以降の処理を終了するが処理ブロックから抜けることはないので、2個目のfor文の3回目の処理だけがスキップされる結果となっている。 

以上の結果より、より正確にbreak文とcontinue文を説明するなら、

break文=強制的に(break文を実行した)処理ブロック(の1つ)から抜け出す
continu文=強制的に(continue文)以降の処理を終了する( が処理ブロックの処理を継続する)

となるであろう。

C++において、参照と、ポインタはどの点が違うのか

 最大の違いは、ポインタは初期化しなくても良いが、参照は必ず初期値がなければならないことである。

ポインタの宣言は

int * number;

の様に行う。
一方、参照は、

int &number...

の様に使う。 


参考文献:

C++編(言語解説) 第15章 参照
http://www.geocities.jp/ky_webid/cpp/language/015.html

DHCPとは、Dynamic Host Configuration Protocolの略である。
インターネットの構成のためには、 IPアドレス等の情報が必要である。
DHCPとは、これらの情報を自動的に割り当てる仕組みである。
割り当てられる情報には以下のものがある。
1.IPアドレス
2.サブネットマスク
3.デフォルトゲートウェイ

DHCP (動的ホスト構成プロトコル) の基本事項
http://support.microsoft.com/kb/169289/ja

IPアドレスはわかるですが、サブネットマスクとデフォルトゲートウェイの意味がよくわかりません。 
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1412845379 

DNSサーバ=IPとドメインのデータベース DHCPサーバ=名前解決をして実際にホストにIPを割り振る 以上の理解でよろしいでしょうか?
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1412385149 

C++入門書に突然、

#include <iostream>
using namespace std;

int main(){
cout << "Hello, World!" << endl ;


や、

 #include <iostream>
using namespace std;

int main(){
cout << "Hello, World!" << flush ;


という様に、「endl」や「flush」が使われ、 困惑したので、違いを調べてみた。

結果から言うと、
「endl」=改行した上で、バッファーをフラッシュする
「flush」=改行はせず、バッファーをフラッシュする
であった。


疑問解決には、以下のサイトが参考になった。

C++ - endl and flushing the buffer (「stackoverflow」より)
http://stackoverflow.com/questions/4751972/c-endl-and-flushing-the-buffer

C++: “std::endl” vs “\n”(「stackoverflow」より)
http://stackoverflow.com/questions/213907/c-stdendl-vs-n

endl, ends, flushの正体 (「yohhoyの日記」より)
http://d.hatena.ne.jp/yohhoy/20120124/p1


また、「バッファーをフラッシュする」の意味が分からない場合は、以下が参考になる。

バッファについて (「つくる人の味方」より)
http://www.curiocube.com/mikata/hello/ch18_buffer.php


上記1番めのサイトの質問とベストアンサーを訳す。

C++ - endl and flushing the buffer (「stackoverflow」より)
http://stackoverflow.com/questions/4751972/c-endl-and-flushing-the-buffer
 
Q.
In the C++ primer book, in chapter (1), it mentions the following:

endl is a special value, called a manipulator, that when written to an output stream has the effect of writing a newline to the output and flushing the buffer associated with that device. By flushing the buffer, we ensure that the user will see the output written to the stream immediately.

What is meant by "flushing the buffer" here?

Thanks.
質問
C++の入門者の本の第1章に、次のように書いてありました。
 
endlは特殊な変数で、マニピュレーターと呼ばれます。書くと、改行の効果を持ち、また、デバイスに関連したバッファーをフラッシュします。バッファーをフラッシュすることにより、ユーザーは表示される出力をすぐに見ることができます。 

ここの「バッファーをフラッシュする」とは 何を意味するのでしょうか?

回答、ありがとうございます(*前もって感謝の意を述べる英語的表現です)
A.

Output is generally buffered before it's written to the intended device. That way, when writing to slow to access devices(like files), it doesn't have to access the device after every single character.

Flushing means emptying the buffer and actually writing it to the device.

回答

アウトプットは概ね出力先の機器に書かれる前にバッファーします(間があります)。そうすると、(ファイルのように)デバイスへの出力が遅れる時は、一文字ごとにデバイスにアクセスせずに済むのです。

フラッシュは、バッファーをなくし、すぐにデバイスに出力します。 



2番めの質問と回答を訳す

C++: “std::endl” vs “\n”(「stackoverflow」より)
http://stackoverflow.com/questions/213907/c-stdendl-vs-n
 

Q.

Many C++ books contain example code like this...

std::cout << "Test line" << std::endl;

...so I've always done that too. But I've seen a lot of code from working developers like this instead:

std::cout << "Test line\n";

Is there a technical reason to prefer one over the other, or is it just a matter of coding style?

質問

多くのC++の本は次のようなコードの例を挙げています。

std::cout << "Test line" << std::endl;

なので私もいつもそのようにしてきました。しかし、私は、これに代わる、実務に従事しているディベロッパーの書いたコードをたくさん見てきました。 

std::cout << "Test line\n";

最初の例と違い2番めの方が好ましい技術的な理由があるのでしょうか?それとも、コーディングのスタイルの違いでしょうか?

A.

The varying line-ending characters don't matter, assuming the file is open in text mode, which is what you get unless you ask for binary. The compiled program will write out the correct thing for the system compiled for.

The only difference is that std::endl flushes the output buffer, and '\n' doesn't. If you don't want the buffer flushed frequently, use '\n'. If you do (for example, if you want to get all the output, and the program is unstable), use std::endl. 

回答

バイナリを扱うことなく、テキストモードでファイルを開くことを想定しているなら、行末の文字(endlと\n)の種類は問題ありません。コンパイルされたプログラムはコンパイル先のシステムに合わせて正しく書きだされるでしょう。

唯一の違いは、 「std::endl」は出力のバッファーをフラッシュしますが、「'\n'」はしないということです。もしあなたがバッファーをフラッシュしたくないなら、「\n」を使うべきです。もしあなたが、(例えば、アウトプット全体を受け取りたく、(そうしないと)プログラムが不安定なら)「std::endl」を使うべきです。 


3番めのサイトによれば、他に、「ends」もあるのだとか。

endl, ends, flushの正体 (「yohhoyの日記」より)
http://d.hatena.ne.jp/yohhoy/20120124/p1
識別子概要効果
endl改行文字の出力後にフラッシュ処理os.put(os.widen('\n')); os.flush();*2
ends終端文字を出力os.put(charT());*3
flushフラッシュ処理os.flush();
 「ends」は、要するに、NULL文字の挿入。配列の最後に「\0(/0)」が入ることがありますが、その意味ですね。
詳しくは以下のサイトをどうぞ。

std::ends (「cplusplus.com」より)
http://www.cplusplus.com/reference/ostream/ends/

↑このページのトップヘ