(C言語)Linuxのpacket socket(socket(AF?PACKET, SOCK_DGRAM, htons(ETH_P_IP))) を使ってTCPの3way handshakeをOSのプロトコルスタックに頼らず自力で挑戦しています。
RFCやほかの技術本をよんでIPヘッダやTCPヘッダの実装は一応できたのですが、肝心のsynパケットを送った後のackパケットが返ってきません。
wiresharkでは問題なくsynパケットと認識できているのですが、きっとどこかに不備があるはずです。
そこでC, C++ Javaでもいいのでこのプログラムの実装例が載っているサイトなどを教えてください。(英語でもかまいません)

このQ&Aに関連する最新のQ&A

A 回答 (4件)

> ところで、jjk65536さんはこういった情報をどこから入手しているのですか。


> raw socketやpacket socketを解説してくれているサイトはかなり少ないように感じます。
> 掲示板やこういった質問サイトも普段から利用されているのでしょうか。

基本的にはGoogle検索で調べてますね。
自分の英語読解力があてにならないので、基本的には海外のサンプルコードを
自分で動かして見ながら期待動作するように作ったりしてます。

教えてGoo!では普段C言語あたりを見たり回答したりしてます。

ちなみに、パケットキャプチャ中にだれかがSynをだしてたんですよ。
それにはRstの応答が返ってるんですね。
試しにそれと同じパケットを自分で出してみたんですが、Rst応答が
来なかったんです。
なんなんでしょうね。セキュリティ上の理由で同じパケットが来ても
Rst応答はしない、とかあるかもしれません。

気になる内容なので、詳しい方が現れてズバっと解決してくれると僕も嬉しいんですが。

この回答への補足

>> ちなみに、パケットキャプチャ中にだれかがSynをだしてたんですよ。
それにはRstの応答が返ってるんですね。
試しにそれと同じパケットを自分で出してみたんですが、Rst応答が
来なかったんです。

なぜだかさっぱりです。僕の作ったパケットが悪いと思っていたのですが、原因はそれだけではないのかもしれませんね。
LinuxやBSDあたりのプロトコルスタックの実装をソースコードを読んで理解できればいいのですが... ちょっとハードルが高いです。

本当にズバッと解決できたらいいのですが。

補足日時:2011/04/15 02:54
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2011/04/17 23:15

> だとしたら`TCP header length(24bytes)` / 4 = 6であっているのではないでしょうか。



すんません、合ってましたね。
普段Wiresharkの解析に頼りっきりで、ちゃんと自分で読んでなかったから
そんなことも忘れてました。

さて、提示して頂いたバイナリをパケットにして手元のPCで出力してみましたが、
やっぱりRstも来ないですねぇ。

他に詳しい方が現れるかとも思っていたんですが、いらっしゃらないみたいですね…。
力及ばず申し訳ないです。

ところでSOCK_RAWって生ソケットですよね?
これでTCPヘッダの大半をOSが作ってくれるとは初耳です。
どこのサイトに解説があったのか、教えて頂けませんか?

私は普段SOCK_RAWをEtherフレームからCで構築するときに使ってるんですが…

この回答への補足

>> ところでSOCK_RAWって生ソケットですよね? これでTCPヘッダの大半をOSが作ってくれるとは初耳です。どこのサイトに解説があったのか、教えて頂けませんか?

すみません、大嘘でした。
ハードディスクの片隅から探し出したところ0のダミーで埋めてあっただけで一応TCPヘッダは作っていました。そのときのソケットはsocket(AF_INET, SOCK_RAW, IPPROTO_TCP)でした。
どこのサイトにあったかは覚えていません。たぶん海外のサイトだったと思います。
packet socketは自分で作ったヘッダはkernelによって書きかえられませんが、RAW SOCKETはソースIPやチェックサム等はkernelによって書き換えられるので勘違いしていました。
(まぁ、考えようによってはkernelが作ってくれているともいえなくもありませんが)

ところで、jjk65536さんはこういった情報をどこから入手しているのですか。
raw socketやpacket socketを解説してくれているサイトはかなり少ないように感じます。
掲示板やこういった質問サイトも普段から利用されているのでしょうか。

補足日時:2011/04/13 20:18
    • good
    • 0

見ました。


TCPヘッダ内のヘッダレングスが96バイトって間違ってません?
24バイトくらいになるかと思いますが。

以下のように通信しようとしていると読めましたが、合ってますか?
tcp/ip src=127.0.0.1:14818 dst=127.0.0.1:61256

そうであれば、そのPCの61256番ポートでは何かのデーモンがListen
していますか?
例えば、パケットキャプチャ中にターミナルで
# telnet 127.0.0.1 61256
としたときに、期待したAck(またはRst)は観測できますか?

目で追っていったので、読み間違いがあるかもしれません。
指摘が間違ってたらすんません。

この回答への補足

>> 以下のように通信しようとしていると読めましたが、合ってますか?

はい、あっています。


>> TCPヘッダ内のヘッダレングスが96バイトって間違ってません?


"TCPヘッダ内のヘッダレングス"というのはTCPヘッダの12バイト目から4ビット間のRFCでいうところの"Data offset"のことですか?
だとしたら`TCP header length(24bytes)` / 4 = 6であっているのではないでしょうか。
間違っていたらすみません。(そのときはTCPヘッダのどの部分かご教授お願いします)
一応wiresharkと自作のパケットキャプチャーソフトではTCP header lengthは24byteとでていますが...


いつもはLAN内のほかのPCで実験していますが、今回は自身に送りました。


>> そうであれば、そのPCの61256番ポートでは何かのデーモンがListenしていますか?

送信ポートは乱数で決めています。61256ポートで待機しているのはbind, listen, acceptでブロッキングしている自前のサーバプログラムではだめですか?

またtelnetで自前のプログラムにconnect()したときはwiresharkとtcpdumpで3way handshakeが正常に動作していることを確認しました。自前プログラムがポートでlistenしていない場合はrstが帰ってくることも確認しました。

前にどこかのWebページでみたAF_INET, SOCK_RAWをつかったプログラムは今回と同じ環境できちんと動作しましたが、この場合TCPヘッダのControl Bitsを除くIPヘッダ全体とTCPヘッダの大半はOSが作ってくれていたので、今回はEthernet headerを除くすべてのヘッダを自前で作りたいです。



よろしくお願いします。

補足日時:2011/04/12 21:40
    • good
    • 0

OpenSouceでしたら、LinuxよりBSDのネットワークスタックが読みやすいと


詳しい人に聞いたことがあります。(自分ではまだ読んでません、すんません)

それよりも、送信したSynパケットのダンプデータでも貼ってみてはいかがでしょう?
スクリーンキャプチャを撮って画像添付するとか。
わかる方が間違いを指摘してくれると思いますよ。私も見ます。

また、対向のサーバはそのSynパケットに対して正しくAckを返せるように
調整されているのでしょうか?
そのポートはサーバでオープンされていますか?
そのポートをTCPでListenしているデーモンは可動していますか?
対向サーバ上のWiresharkでは、Synパケットは観測できていますか?

その辺がOKなら、やはりパケットのどこかに間違いがあるのだと思います。
見てみたいですね。

この回答への補足

ヘッダに設定したポートにサーバーを走らせてもうんともすんとも言わず、さらに普通listenしていないポートにsynパケットを送るとrstパケットが帰ってくるはずなのですが、それも帰ってきません。多分IPヘッダidやTCPヘッダのack numberあたりが怪しい。(完全に初心者)
絶対にどこかでとんちんかんなことになってるはずです。
以下wiresharkで確認したループバックに送ったsynパケットの16進ダンプ(MSS=1460のオプション付き)

(Ethernet header)00 11 11 94 7f 34 00 00 00 00 00 00 08 00
(ここからIP header)45 00 00 2c 70 ea 40 00 40 06 cb df 7f 00 00 01 7f 00 00 01
(ここからTCP header)39 e2 ef 48 00 03 1b 32 00 00 00 00 60 02 0c cf f6 c7 00 00 02 04 05 b4

補足日時:2011/04/11 18:13
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLISPのマクロと他の言語のマクロの違い

LISPのマクロは強力と言われていますが、他の言語の言うマクロとはどう違うのでしょうか?

Aベストアンサー

ここでいう「マクロ」は一言で言うと「プログラムを生成する機能」ですね。
例えばCのマクロを例に上げますと、
#define MAX(a, b) (a) > (b) ? (a) : (b)
というようなマクロを定義すると、後に
MAX(10, x)
と書いた際に
(10) > (x) ? (10) : (x)
というプログラムがコンパイル時に生成されます。

Cなどのマクロは、マクロ専用の文法があり、
マクロで書けるものにはある程度の制限が付きます。例えば、
「マクロの引数が定数の際に奇数か偶数かで『生成するプログラム』を変える」
などといった複雑なことはできません。

一方、Lispのマクロは、Lispそのもので書くことが可能で、
任意のプログラムをマクロとして書くことができます。
マクロの中で条件分岐やループなど、なんでも出来てしまいます。
これにより、コンパイル時にマクロの引数の型や値に応じて
生成するプログラムを変えることで最適化を行ったり、
新たな言語機能(と対応する文法)を追加するようなことが可能です。

例えば、昔のLispにはオブジェクト指向の機能がありませんでしたが、
マクロを使うことで、後からオブジェクト指向の機能を付け加えることができました。
また、Common Lispのオブジェクト指向の機能が独特で嫌いな人は、
マクロを使うことでJava風のオブジェクト指向の機能を追加するようなことも可能です。
極端な話、Lispの上で別の言語が作れてしまうわけです。

コンパイル時に任意のプログラムを実行できるという点では、
C++のテンプレートとも似ているといえますが、
C++のテンプレートはテンプレート専用の文法を用いる必要ある点がLispと異なります。
C++をそれなりに書ける人でも、テンプレートで任意のプログラムを書こうとすると、
かなりの苦労を強いられます。テンプレートの文法がC++の文法と異なるのが苦労する原因の一つです。
一方、Lispのマクロは、Lisp自身で書けるため、
Lispが書ける人なら誰にだって書けてしまうわけです。

以上がLispのマクロが強力と言われる要因(の一部)です。
実際に使われてみると色々と実感できると思いますよ。

ここでいう「マクロ」は一言で言うと「プログラムを生成する機能」ですね。
例えばCのマクロを例に上げますと、
#define MAX(a, b) (a) > (b) ? (a) : (b)
というようなマクロを定義すると、後に
MAX(10, x)
と書いた際に
(10) > (x) ? (10) : (x)
というプログラムがコンパイル時に生成されます。

Cなどのマクロは、マクロ専用の文法があり、
マクロで書けるものにはある程度の制限が付きます。例えば、
「マクロの引数が定数の際に奇数か偶数かで『生成するプログラム』を変える」
などといった複雑なことはで...続きを読む

Qlinux-C言語(gcc)でPostgresql

をフリーで使うため
それを可能にするライブラリをDL&Installしたいのですが
linuxC言語(gcc)でPostgresqlを使用できるライブラリを教えてください
高速化のためできればCでやりたいのですが
なければC++でもいいですから
教えてください

よろしくお願いします

Aベストアンサー

ディストリビューション不明ですが…

>libpqはyumではインストールできませんので

手元のCentOS5.6では…
>[root@localhost ~]# rpm -qs postgresql-libs
>通常 /usr/lib/libecpg.so.5
>通常 /usr/lib/libecpg.so.5.1
>通常 /usr/lib/libecpg_compat.so.2
>通常 /usr/lib/libecpg_compat.so.2.1
>通常 /usr/lib/libpgtypes.so.2
>通常 /usr/lib/libpgtypes.so.2.1
>通常 /usr/lib/libpq.so.4
>通常 /usr/lib/libpq.so.4.1
>通常 /usr/share/locale/af/LC_MESSAGES/libpq.mo
>     :
>[root@localhost ~]# rpm -qs postgresql-devel
>通常 /usr/bin/ecpg
>     :
>通常 /usr/include/ecpgtype.h
>通常 /usr/include/libpq
>通常 /usr/include/libpq-fe.h
>通常 /usr/include/libpq/libpq-fs.h
>通常 /usr/include/pg_config.h
>     :
>通常 /usr/include/sqlca.h
>通常 /usr/lib/libecpg.a
>通常 /usr/lib/libecpg.so
>通常 /usr/lib/libecpg_compat.a
>     :
>[root@localhost ~]#
なりましたが……

ディストリビューション不明ですが…

>libpqはyumではインストールできませんので

手元のCentOS5.6では…
>[root@localhost ~]# rpm -qs postgresql-libs
>通常 /usr/lib/libecpg.so.5
>通常 /usr/lib/libecpg.so.5.1
>通常 /usr/lib/libecpg_compat.so.2
>通常 /usr/lib/libecpg_compat.so.2.1
>通常 /usr/lib/libpgtypes.so.2
>通常 /usr/lib/libpgtypes.so.2.1
>通常 /usr/lib/libpq.so.4
>通常 /usr/lib/libpq.so.4.1
>通常 ...続きを読む

Qlispとその他関数型言語について

「lispを学べば悟りが開ける」という言葉をよく聞きます。

l他のプログラミング言語哲学とは一線を画すほどの教示をもった言語という印象を持ちます。

僕もlispを少し学んだだけですが「悟り」は開けませんでした。

しかし他の関数型言語(haskellとか)ではそういう話は聞きません。

なぜでしょうか。

やっぱ括弧ですか。

Aベストアンサー

他の言語が、まだまだ歴史が浅く、使っている人、特にカリスマと呼べるような人が少ないからではないでしょうか。
それに「haskellを学べば..」などといまさら言っても、二番煎じになってしまいますし。

QC言語(gcc), Linux, FTPプログラミング

C言語でFTPを使用してあるサーバからデータをダウンロードするプログラムを作りたいのですが、短期間で作らなければならない為、なるべく作り込みはしたくないのです。
FTPを扱うライブラリのようなものがあるのが一番ありがたいのですが、ご存じないでしょうか?
条件としては
・gccのバージョン3~4ぐらいで使えること。
・Solaris,RedHatなど主要なLinuxで使えること。
・ライセンスの制限がなるべく無いこと。
以上、よろしくお願いいたします。

Aベストアンサー

> FTPでアップロードは出来るという記述はあったのですが

私は逆にget出来る、の記述しか見つけられませんでした。
http://www.libcurl.org/ より:
> libcurl is a free, open source client to get documents/files from servers, using any of the supported protocols.

対応プロトコルの数を考えるとちとftp専用としてはサイズが大きそうな気はしますが、簡単に使えそうではありますね。

QLISPで C言語のフォーマット書式の"%02d"

LISPで C言語のフォーマット書式の"%02d"にあたる記述の仕方がわかりません。どのようにすればよいのでしょうか?

Aベストアンサー

Common Lisp で良いのですよね?

(dolist (num '(5 10 200))
(princ (format nil "~2,'0D~%" num)))

実行結果:
05
10
200


format関数
http://www.yuasa.kuis.kyoto-u.ac.jp/~hiraisi/format-func.html

Q[C言語]トラバースするプログラム(linux)

linux(ubuntu11.04)でコマンドラインからもらったディレクトリをトラバースするプログラムを作りたいんですがうまくいきません。
一応書けたのですがどうも予想と違う動きをしてしまいます。


#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h>
#include<string.h>

static void do_traverse(char *patht, int t);

int main(int argc, char *argv[])
{
int i;
if(argc<2)
{
fprintf(stderr,"%s: no arguments\n",argv[0]);
exit(1);
}
for(i=1;i<argc;i++)
{
do_traverse(argv[i],0);
}
return 0;
}

static void do_traverse(char *path, int t)
{
DIR *d;
struct dirent *ent;
int i;

d=opendir(path);
if(!d)
{
perror(path);
exit(1);
}

while((ent=readdir(d))!=NULL)
{
struct stat st;
if(lstat(ent->d_name,&st)<0)
{
perror(ent->d_name);
exit(1);
}
for(i=0;i<t;i++)
{
printf(" ");
}
printf("%s\n",ent->d_name);

if((strcmp(".",ent->d_name))==0 || (strcmp("..",ent->d_name))==0 || S_ISLNK(st.st_mode))
{
continue;
}

if(S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode))
{
do_traverse(ent->d_name,t+1);

}
}
closedir(d);
}

例えばディレクトリaにファイルbとディレクトリcがあり、ディレクトリcの中にはファイルdとディレクトリeがあり、ディレクトリeの中にはファイルfがあるとします。
僕の理想では
$./traverse a
とすると
..
.
b
c
..
.
d
e
..
.
f

となるはずなんですが(表示の順番は適当です)、実際は

b
..
.
c

となってしまいうまくトラバースしてくれません
どうしてこうなるかわかりません
誰か助けてください
お願いします

linux(ubuntu11.04)でコマンドラインからもらったディレクトリをトラバースするプログラムを作りたいんですがうまくいきません。
一応書けたのですがどうも予想と違う動きをしてしまいます。


#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h>
#include<string.h>

static void do_traverse(char *patht, int t);

int main(int argc, char *argv[])
{
int i;
if(argc<2)
{
fprintf(stderr,"%s: no arguments\n",argv[0]);
exit(1);
...続きを読む

Aベストアンサー

失礼ですが、プログラムが間違ってますよ。
引数pathにディレクトリ名を渡してます。
このままだと"c"をlstatしてしまいます。
カレントにディレクトリ"c"は存在していませんので、ここでエラーです。
正しくはlstat("a/c", &st);ですよね。

そんな風になおして以下のようなテストコードを書いてみたところ
動きましたので貼っておきます。


#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h>
#include<string.h>

static void do_traverse(char *patht, int t);

int main(int argc, char *argv[])
{
  int i;
  if (argc < 2) {
    fprintf(stderr, "%s: no arguments\n", argv[0]);
    exit(1);
  }
  for (i = 1; i < argc; i++) {
    do_traverse(argv[i], 0);
  }
  return 0;
}

static void do_traverse(char *path, int t)
{
  DIR *d;
  struct dirent *ent;
  int i;

  d = opendir(path);
  if (!d) {
    perror(path);
    exit(1);
  }

  while ((ent = readdir(d)) != NULL) {
    struct stat st;
    char newpath[BUFSIZ];
    sprintf(newpath, "%s/%s", path, ent->d_name);
    if (lstat(newpath, &st) < 0) {
      perror(newpath);
      exit(1);
    }
    for (i = 0; i < t; i++) {
      printf(" ");
    }
    printf("%s\n", ent->d_name);

    if ((strcmp(".", ent->d_name)) == 0
      || (strcmp("..", ent->d_name)) == 0 || S_ISLNK(st.st_mode)) {
      continue;
    }

    if (S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) {
      do_traverse(newpath, t + 1);

    }
  }
  closedir(d);
}

失礼ですが、プログラムが間違ってますよ。
引数pathにディレクトリ名を渡してます。
このままだと"c"をlstatしてしまいます。
カレントにディレクトリ"c"は存在していませんので、ここでエラーです。
正しくはlstat("a/c", &st);ですよね。

そんな風になおして以下のようなテストコードを書いてみたところ
動きましたので貼っておきます。


#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h>
#include<string.h>

static void do_traverse(char *patht, in...続きを読む

Qlispの入門書

lispの入門書を探しています。

lispの書き方をただ説明するだけでなく、他の言語と違ってどういう利点が
あるのかを説明したものがいいです。

なにかおすすめの本があったら教えてください。

Aベストアンサー

・The Little Schemer
Lispの最高の入門書です。一問一答を追っていくことで、リスト操作やLispプログラムを作っていく感覚について皮膚で理解できるようになります。
英語ですが、難しい文章はないのでそれほど問題ないはず。
環境の整えかたなどの記述はいっさいありません。 "Lisp" を実践して学ぶ本です。

・プログラミングGauche
Lispの方言の一つにSchemeという言語があります。その一つの処理系であるGaucheの本です。さいきん出たばっかり。
Gauche のさまざまな組み込み関数を利用することで関数型プログラミングを実践していきます。
日本語で勉強したいならこちらです。

・リスト遊び
日本語だとこの辺も入門書です。あまり詳しく知りませんが、Emacs Lispの本です。
筆者はEmacs上でemailを読めるMewというソフトウェアの開発者でもあるそうです。

Lispの良さについてはネット上の文章を読む方がよろしいかと。適当に、LispとかPaul GrahamとかShiroとかのキーワードを探してみてください。
「ハッカーと画家」を読むのも良いですね。


Lispコミュニティにコミットするのがいちばんですが。

・The Little Schemer
Lispの最高の入門書です。一問一答を追っていくことで、リスト操作やLispプログラムを作っていく感覚について皮膚で理解できるようになります。
英語ですが、難しい文章はないのでそれほど問題ないはず。
環境の整えかたなどの記述はいっさいありません。 "Lisp" を実践して学ぶ本です。

・プログラミングGauche
Lispの方言の一つにSchemeという言語があります。その一つの処理系であるGaucheの本です。さいきん出たばっかり。
Gauche のさまざまな組み込み関数を利用することで関数...続きを読む

QC言語の演習問題(C言語)について質問です。

以下のプログラムは数字と演算子を配列に入れているプログラムです。
このプログラムを式を入れて四則演算のみで計算させるプログラムを作成してるのですがご指導お願いできますか?
例:8/3*3enterkey
答え:8

変数の型は変更しないで行うとの指示のことなので、変数は増やしても構いませんが、変えないでお願いします。
http://codepad.org/Iks8CtjT

Aベストアンサー

この問題、なにをやらせようとしてるのかなぁ。

ちょっと面倒だけど、分子と分母を用意して有理数として計算する、という方法もある。

Q初めて関数型言語を学ぶとしたら、どの言語がお奨めですか?

初めて関数型言語を学ぶとしたら、どの言語がお奨めですか?
JavaScriptをやっていて、関数型言語に興味を持ちました。

いままで、勉強した言語はC < Java < Python < JavaScriptです。(右側の方が比重・興味が大きい)
現在、Web系志望の学生なので、その辺を踏まえてアドバイスいただけると助かります。

今のところ興味を持ってるのは、Common Lisp/Haskellあたりです。

よろしくお願いします。

Aベストアンサー

C言語が「関数型」?なのか、と言われると多分違うと思うんですけどね。普通は命令型/手続き型に分類されるんじゃないか、と思います。

ちなみに、JavaScriptはSchemeに影響を受けてる言語です。それで言うと、SchemeかCommon Lispがいいんじゃないのかな、とは思いますがね。ただ、あんまり関数型、って感じで書かれている本は少ないと思います。

Web系志望と言う事なんで、Common Lispですと、

ANSI Common Lisp: http://www.pej-hed.jp/washo/288.html
にHTML生成のトピックあり。

実践Comon Lisp: http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06721-1
にAllegro Serveと言うライブラリを利用したWebプログラミングの例があり。HTML生成の例もあり。
原著のサイトでは、
http://www.gigamonkeys.com/book/practical-web-programming-with-allegroserve.html
http://www.gigamonkeys.com/book/practical-an-html-generation-library-the-interpreter.html
http://www.gigamonkeys.com/book/practical-an-html-generation-library-the-compiler.html
辺り。

プログラミング言語Lisp: http://ascii.asciimw.jp/books/books/detail/4-7561-3926-4.shtml
CL-HTTPと言うライブラリを用いたWebサーバーの説明が載っています。
ただし、本自体はMacintosh用の商用実装、Mac Common Lisp

Mac Common Lisp:
http://www.digitool.com/

を用いたものなんで、注意する必要があります。Macを持ってないならあまりお薦めしません。また、若干古い本ですね。

Haskellの方は良く分かりませんが、Common LispならそれなりにWeb関係の簡単なアプリの書き方も紹介されている、と言う事です。

参考までに。

C言語が「関数型」?なのか、と言われると多分違うと思うんですけどね。普通は命令型/手続き型に分類されるんじゃないか、と思います。

ちなみに、JavaScriptはSchemeに影響を受けてる言語です。それで言うと、SchemeかCommon Lispがいいんじゃないのかな、とは思いますがね。ただ、あんまり関数型、って感じで書かれている本は少ないと思います。

Web系志望と言う事なんで、Common Lispですと、

ANSI Common Lisp: http://www.pej-hed.jp/washo/288.html
にHTML生成のトピックあり。

実践Comon Lisp: http://s...続きを読む

QC言語C++言語アセンブラ言語の就職先

自分は以前Javaプログラマをやってました。

あまりに、便利なライブラリばかりで、「なんかプログラムを書いているというより、ソフトウェアの振る舞いを書いているだけだ。。」とおもってしまい、すきになれませんでした。正直、苦痛でした。

今、上記言語を勉強しているのですが、コンピュータの根本からプログラムをしている実感が沸き、とても面白いです。

でも、これらの言語を習得したところでどんなところに就職できるのかさっぱりわかりませんし、需要があるのかもしりません。いわゆる組み込み系統は就職できるんでしょうが、私としてはアルゴリズムでUNIXのプログラムをシコシコ書いているような作業がすきなのです。いってみれば、私はクラシックな人間だとおもいます。

そんな僕ですが、就職先はあるのでしょうか?よろしくお願いします。

Aベストアンサー

 勉強熱心ですね。
 実際に、kamkamkam3-san の言われている、
「なんかプログラムを書いているというより、ソフトウェアの振る舞いを書いているだけだ。。」というのは的を得ています。
 
 経験からなんですが、ソフトウェア会社では、ノウハウとしてライブラリをもっています。ちょうど、Java のクラス・ライブラリーなようなものです。ですから、それらを使って製品を効率良く製品をつくれるかが重要です。実際のソフトウェア・エンジニアは、それをうまく使って効率良くコーディングすることを要求されます。

 ソフトウェア業界は、1人で閉じた製品を開発することは、まずないです。製品=プロジェクトだとすると、最低3名~100人以上が同時進行となります。そうなると、割り当てられたノルマを効率良く行うかが評価のポイントになります。つまり、「ソフトウェアの振る舞いを書いているだけ」ということにもなります。

 コンピュータ言語は、あくまでもツール(道具)です。
 kamkamkam3-san が、今後どういった分野の仕事を希望している(興味がある)かが重要だと思います。
 その答えとして、「C言語C++言語アセンブラ言語」を勉強することで実感できると思います。ですので、ぜひ、勉強を続けてください。

 勉強熱心ですね。
 実際に、kamkamkam3-san の言われている、
「なんかプログラムを書いているというより、ソフトウェアの振る舞いを書いているだけだ。。」というのは的を得ています。
 
 経験からなんですが、ソフトウェア会社では、ノウハウとしてライブラリをもっています。ちょうど、Java のクラス・ライブラリーなようなものです。ですから、それらを使って製品を効率良く製品をつくれるかが重要です。実際のソフトウェア・エンジニアは、それをうまく使って効率良くコーディングすることを要求さ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング