UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド
前スレ
Part9 http://hibari.2ch.net/test/read.cgi/tech/1205795434/
Part8 http://pc11.2ch.net/test/read.cgi/tech/1147946176/
Part7 http://pc8.2ch.net/test/read.cgi/tech/1127373405/
Part6 http://pc8.2ch.net/test/read.cgi/tech/1116908090/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1105723117/
Part4 http://pc5.2ch.net/test/read.cgi/tech/1095843584/
Part3 http://pc5.2ch.net/test/read.cgi/tech/1085930894/
Part2 http://pc5.2ch.net/test/read.cgi/tech/1055110889/
Part1 http://pc2.2ch.net/tech/kako/992/992057422.html
Part3のミラー
http://makimo.to/2ch/pc5_tech/1085/1085930894.html
Part2のミラー
http://makimo.to/2ch/pc5_tech/1055/1055110889.html
探検
UNIXプログラミング質問すれ Part10
■ このスレッドは過去ログ倉庫に格納されています
1unco ◆manko/yek.
2011/04/18(月) 17:06:36.77342デフォルトの名無しさん
2012/02/20(月) 20:07:21.79 >338
あれはひどいな
あれはひどいな
343デフォルトの名無しさん
2012/02/20(月) 21:50:08.25 ファイル hello.c
#include <stdio.h>
void hello(void) {printf("hello world\n");}
ファイル hello.h
#ifndef __HELLO_H__
#define __HELLO_H__
extern void hello(void);
#endif //__HELLO_H__
ファイル main.c
#include <stdio.h>
#include <hello.h>
main(){hello();}
ソースコードが何をしてるかは一目瞭然なので説明はしない。
わからない人はさようなら。
これを通常のリンクでビルドする場合
gcc -o a main.c hello.c -I./
#include <stdio.h>
void hello(void) {printf("hello world\n");}
ファイル hello.h
#ifndef __HELLO_H__
#define __HELLO_H__
extern void hello(void);
#endif //__HELLO_H__
ファイル main.c
#include <stdio.h>
#include <hello.h>
main(){hello();}
ソースコードが何をしてるかは一目瞭然なので説明はしない。
わからない人はさようなら。
これを通常のリンクでビルドする場合
gcc -o a main.c hello.c -I./
344デフォルトの名無しさん
2012/02/20(月) 21:52:07.46 #include <hello.h> のいみがわかりません
345343
2012/02/20(月) 21:52:35.46 これの hello.c モジュールを動的ライブラリにする場合、
最も基本的な方法だと以下のようになる。
gcc -fPIC -c hello.c
gcc -fPIC -shared -Wl,-soname,libhello.so -o libhello.so hello.o
#インストール作業
install libhello.so /usr/lib/
install hello.h /usr/include/
結果、/usr/lib/、/usr/include/にライブラリーとしてコピーされる。
しかしこれではまだライブラリーは有効にならない。ldへの登録の必要がある。
ldconfig
これで libhello.so を使えるようになった。
あとは通常のライブラリをリンクする場合のやり方でビルドできる。
gcc -o a main.c -lhello
最も基本的な方法だと以下のようになる。
gcc -fPIC -c hello.c
gcc -fPIC -shared -Wl,-soname,libhello.so -o libhello.so hello.o
#インストール作業
install libhello.so /usr/lib/
install hello.h /usr/include/
結果、/usr/lib/、/usr/include/にライブラリーとしてコピーされる。
しかしこれではまだライブラリーは有効にならない。ldへの登録の必要がある。
ldconfig
これで libhello.so を使えるようになった。
あとは通常のライブラリをリンクする場合のやり方でビルドできる。
gcc -o a main.c -lhello
346343
2012/02/20(月) 21:53:39.53 libtoolを使って同様のことをする場合
libtool --mode=compile gcc -c hello.c
libtool --mode=link gcc -o libhello.la hello.o -rpath /usr/lib
#インストール作業
libtool --mode=install install libhello.la /usr/lib/libhello.la
libtool --mode=install install hello.h /usr/include/hello.h
ldconfig
あとは普通にリンクできる。
gcc -o a main.c -lhello
しかし、libtoolの有用な点は、この gcc -o a main.c -lhello も共通書式で書ける点にもある。
同じが、このようにも書ける。
libtoo --mode=compile gcc -o a main.c /usr/lib/libhello.la
libtool --mode=compile gcc -c hello.c
libtool --mode=link gcc -o libhello.la hello.o -rpath /usr/lib
#インストール作業
libtool --mode=install install libhello.la /usr/lib/libhello.la
libtool --mode=install install hello.h /usr/include/hello.h
ldconfig
あとは普通にリンクできる。
gcc -o a main.c -lhello
しかし、libtoolの有用な点は、この gcc -o a main.c -lhello も共通書式で書ける点にもある。
同じが、このようにも書ける。
libtoo --mode=compile gcc -o a main.c /usr/lib/libhello.la
347343
2012/02/20(月) 21:55:09.86 libtoo --mode=compile gcc -o a main.c /usr/lib/libhello.la
これは何を意味するかというと、動的ライブラリーが使用できないOSの場合は、libtoolは静的ライブラリを生成する。libhello.a
もしも libhello.aの場合は、gcc の書式は動的ライブラリの場合とは異なり、以下のようになるが、
静的ライブラリの場合: gcc -o a main.c /usr/lib/libhello.a
動的ライブラリの場合: gcc -o a main.c -lhello
この書式の違いを、共通の書式で統一できるのが libtoolの利点である。
libtool --mode=compile gcc -o a main.c /usr/lib/libhello.la
と書くことで、OSの対応状況に状況に応じて、都合良い方でビルドされる。(基本的には動的ライブラリの使用が優先される。優先度の変更はオプションで行える)
これは何を意味するかというと、動的ライブラリーが使用できないOSの場合は、libtoolは静的ライブラリを生成する。libhello.a
もしも libhello.aの場合は、gcc の書式は動的ライブラリの場合とは異なり、以下のようになるが、
静的ライブラリの場合: gcc -o a main.c /usr/lib/libhello.a
動的ライブラリの場合: gcc -o a main.c -lhello
この書式の違いを、共通の書式で統一できるのが libtoolの利点である。
libtool --mode=compile gcc -o a main.c /usr/lib/libhello.la
と書くことで、OSの対応状況に状況に応じて、都合良い方でビルドされる。(基本的には動的ライブラリの使用が優先される。優先度の変更はオプションで行える)
348デフォルトの名無しさん
2012/02/20(月) 22:36:01.70 libtoolとかautotoolとか移植を簡単にするためのツールなのに、
そのツール自体の移植が非常に困難という矛盾。
考えた奴死ねばいいのに。
そのツール自体の移植が非常に困難という矛盾。
考えた奴死ねばいいのに。
349デフォルトの名無しさん
2012/02/21(火) 00:17:38.61 >>348
?
なにを言ってるんだ?
よく考えてみろ
移植という作業の、面倒な部分のみを『抽出』して、そこを隠蔽するツールがlibtoolやautoconf。
つまり、アプリの多プラットフォーム対応の際の、面倒な部分のみを抽出した問題。この問題を解く作業こそが、libtoolやautomakeの移植作業というもの。
面倒な問題だけを一ヶ所にあつめて、問題を解こうとしてるのだから、困難なのは当然だろ。
逆に、抽出した困難さが、もしも簡単に解ける程度であれば(簡単にlibtoolを移植できたのであれば)、
それはもともと、切り分けるに値しないほど簡単な問題だったということになる。
?
なにを言ってるんだ?
よく考えてみろ
移植という作業の、面倒な部分のみを『抽出』して、そこを隠蔽するツールがlibtoolやautoconf。
つまり、アプリの多プラットフォーム対応の際の、面倒な部分のみを抽出した問題。この問題を解く作業こそが、libtoolやautomakeの移植作業というもの。
面倒な問題だけを一ヶ所にあつめて、問題を解こうとしてるのだから、困難なのは当然だろ。
逆に、抽出した困難さが、もしも簡単に解ける程度であれば(簡単にlibtoolを移植できたのであれば)、
それはもともと、切り分けるに値しないほど簡単な問題だったということになる。
350デフォルトの名無しさん
2012/02/21(火) 00:24:37.56 なんで、システムライブラリ、ヘッダーをconfigureの度にスキャンするんだ?
バカ丸出しのシステムだろ。
dllのリンクのために何行のツール作ってるんだ?
リンクのために5行以上の記述が必要なシステムなんか見たことないぞ。
バカ丸出しのシステムだろ。
dllのリンクのために何行のツール作ってるんだ?
リンクのために5行以上の記述が必要なシステムなんか見たことないぞ。
351デフォルトの名無しさん
2012/02/21(火) 00:31:39.51 まあ色々なプラットフォームでのビルドをサポートするためのツールだし。
あとキャッシュを消さなければ毎回スキャンはしないかも。
あとキャッシュを消さなければ毎回スキャンはしないかも。
352デフォルトの名無しさん
2012/02/21(火) 00:46:44.25353デフォルトの名無しさん
2012/02/21(火) 00:54:44.67 libtool は実質的に *.so (ウインドウズで言う所の *.dll のようなもの)をビルドする書式を共通化するためのものだけど、
./configure を生成する autoconf, automake は、システムのタイプを判断する作業から、プログラマーを開放してくれるから、使った方が便利。
面倒くさいのでもう343のように詳しくは書かないが、(どうせ誰かが書いてくれるだろう。)
例えば、引数で受け取った画像を拡大縮小して、ファイル出力するツール|ライブラリを書く場合。
画像処理は(たとえば単純にバイリニアだとして)、
画像をブロック毎に分割して処理を行えば、完全に並列処理できる類の問題だよな?(アムダールの法則の1/(F-(1-F))のFが非常に小さい状態)
だからスレッドに分割して、多コアに割り当てて、一気に高速計算するべき。
この際に、無駄なスレッドを作ると、逆に速度が遅くなる。
例えば、プロセッサのコア数が4だとしたら、スレッドも4個にするのが最も効率が良い。(コア数が4なのにスレッドを8個とか作っても、無駄だし、スイッチングロスで逆に遅くなる)
このプロセッサー数を、実行時に判断することもできるのだが、それだとビルド時の決め打ちによる強力な最適化を書くことができない。
そこで、定数としてビルド時にコア数を知っとくことは、性能を追求する場合において、とても有用。
そこで、ビルド時にコア数を知りたいという要求が出てくるのだが、この「コア数を知る」という方法が、OSやCPUなどによって、それぞれ全然変わってくる。
これに全パターン対応するMakefileを書くのは、非常に負担となるので、ここを共通の書式で自動化してくれるのが autoconf の役割。
たとえばプロセッサー数ならば configure.in に AX_COUNT_CPUS と一行書いておけば、(もし指定してあれば)config.hに #define CPU_COUNT 4 等のようにマクロ定義される。これを利用してコードをを最適化できる。
(AX_COUNT_CPUSのm4マクロによって(autoconf archive要インストール))
CPU数に限らず、ベクトル演算のサポートの有無など、事前に調べて最適化に有用な情報を、容易に得る手段として、autoconfは非常に便利なので使った方がいい。
autoconfで実行環境情報を積極的に得るようにすれば、プログラム最適化の幅が広がるはず。
./configure を生成する autoconf, automake は、システムのタイプを判断する作業から、プログラマーを開放してくれるから、使った方が便利。
面倒くさいのでもう343のように詳しくは書かないが、(どうせ誰かが書いてくれるだろう。)
例えば、引数で受け取った画像を拡大縮小して、ファイル出力するツール|ライブラリを書く場合。
画像処理は(たとえば単純にバイリニアだとして)、
画像をブロック毎に分割して処理を行えば、完全に並列処理できる類の問題だよな?(アムダールの法則の1/(F-(1-F))のFが非常に小さい状態)
だからスレッドに分割して、多コアに割り当てて、一気に高速計算するべき。
この際に、無駄なスレッドを作ると、逆に速度が遅くなる。
例えば、プロセッサのコア数が4だとしたら、スレッドも4個にするのが最も効率が良い。(コア数が4なのにスレッドを8個とか作っても、無駄だし、スイッチングロスで逆に遅くなる)
このプロセッサー数を、実行時に判断することもできるのだが、それだとビルド時の決め打ちによる強力な最適化を書くことができない。
そこで、定数としてビルド時にコア数を知っとくことは、性能を追求する場合において、とても有用。
そこで、ビルド時にコア数を知りたいという要求が出てくるのだが、この「コア数を知る」という方法が、OSやCPUなどによって、それぞれ全然変わってくる。
これに全パターン対応するMakefileを書くのは、非常に負担となるので、ここを共通の書式で自動化してくれるのが autoconf の役割。
たとえばプロセッサー数ならば configure.in に AX_COUNT_CPUS と一行書いておけば、(もし指定してあれば)config.hに #define CPU_COUNT 4 等のようにマクロ定義される。これを利用してコードをを最適化できる。
(AX_COUNT_CPUSのm4マクロによって(autoconf archive要インストール))
CPU数に限らず、ベクトル演算のサポートの有無など、事前に調べて最適化に有用な情報を、容易に得る手段として、autoconfは非常に便利なので使った方がいい。
autoconfで実行環境情報を積極的に得るようにすれば、プログラム最適化の幅が広がるはず。
354デフォルトの名無しさん
2012/02/21(火) 01:02:28.82 thx!!
355デフォルトの名無しさん
2012/02/21(火) 01:10:16.32 ちなみにCMakeはもっとスゴイぞ!
356デフォルトの名無しさん
2012/02/21(火) 01:26:53.76357デフォルトの名無しさん
2012/02/21(火) 01:31:38.51 バカなautotools
checking ...
これが世界中でどれだけ行われてるんだ? その電力で何人のアフリカの子供が…
システムライブラリなんか一回スキャンしてデータベース作ればOK。
考えた奴死ね。
checking ...
これが世界中でどれだけ行われてるんだ? その電力で何人のアフリカの子供が…
システムライブラリなんか一回スキャンしてデータベース作ればOK。
考えた奴死ね。
358デフォルトの名無しさん
2012/02/21(火) 01:35:41.52 >>353
> たとえばプロセッサー数ならば configure.in に AX_COUNT_CPUS と一行書いておけば、(もし指定してあれば)config.hに #define CPU_COUNT 4 等のようにマクロ定義される。これを利用してコードをを最適化できる。
autoconfが対応しているOS場合の事。対応していないときに変更箇所を探して、m4のマニュアル読みながらm4マクロ書いて…
Makefileに
NUM_CORE=4
5秒で終わるわ。
> たとえばプロセッサー数ならば configure.in に AX_COUNT_CPUS と一行書いておけば、(もし指定してあれば)config.hに #define CPU_COUNT 4 等のようにマクロ定義される。これを利用してコードをを最適化できる。
autoconfが対応しているOS場合の事。対応していないときに変更箇所を探して、m4のマニュアル読みながらm4マクロ書いて…
Makefileに
NUM_CORE=4
5秒で終わるわ。
359デフォルトの名無しさん
2012/02/21(火) 01:41:05.56 もうちょっとましな指摘は書けないのかよw
360デフォルトの名無しさん
2012/02/21(火) 02:55:02.78 >>357
おまい頭良いな
おまい頭良いな
361デフォルトの名無しさん
2012/02/21(火) 07:59:40.53 アフリカの子供が不幸なのはアフリカの大人がDQNだからだよ
日本で言えば、赤ん坊を車に放置してパチンコ台の前に陣取る親みたいなものだ
日本で言えば、赤ん坊を車に放置してパチンコ台の前に陣取る親みたいなものだ
362デフォルトの名無しさん
2012/02/21(火) 09:06:59.31 >>357
話はそんな簡単じゃないみたいだぞ。
例えばソフトをビルドするときにある関数が期待した振る舞い(フレーバー)で利用可能
かどうか、はシステムライブラリにそれがあるかだけでは決まらない(例えばコンパイラ
のオプション等)ので。
話はそんな簡単じゃないみたいだぞ。
例えばソフトをビルドするときにある関数が期待した振る舞い(フレーバー)で利用可能
かどうか、はシステムライブラリにそれがあるかだけでは決まらない(例えばコンパイラ
のオプション等)ので。
363デフォルトの名無しさん
2012/02/21(火) 09:17:44.19 >>362
configureが検出したものをオプションと一緒に記録しておけばいいんじゃない?
コンパイルオプションで挙動が変わる関数くらい数えられる程度では?
若しくは、そういった特殊な挙動を要求するものだけはDBを使わないようにすればいい
configureごとに全く同じ処理をキャッシュできればそれだけで随分速くなる
configureが検出したものをオプションと一緒に記録しておけばいいんじゃない?
コンパイルオプションで挙動が変わる関数くらい数えられる程度では?
若しくは、そういった特殊な挙動を要求するものだけはDBを使わないようにすればいい
configureごとに全く同じ処理をキャッシュできればそれだけで随分速くなる
364デフォルトの名無しさん
2012/02/21(火) 09:41:37.47 オプションに利用可能性が依存するって、どの規格(c90, c99, ...)を使うかくらい。
その以外で振る舞いや有無が変わる関数なんて使ってられんわ。使う価値ないね。
もしあるなら、そんなクズな関数を捨てれば何人の餓えているアフリカの子供が…
その以外で振る舞いや有無が変わる関数なんて使ってられんわ。使う価値ないね。
もしあるなら、そんなクズな関数を捨てれば何人の餓えているアフリカの子供が…
365デフォルトの名無しさん
2012/02/21(火) 10:15:13.00 過度の汎用性を求めて(といっても所詮Unix限定だけど)汚い設定ファイル地獄
便利さも体感できないって、なんだか一昔前のJava + J2SE + メタフレームワーク地獄
みたい
m4とXMLの違いがあるけどね
今更m4なんて弄りたがるの変態ぐらいでしょ
それはそうと、.laや.pcにフルパス埋め込まれるのは何で?
あれrelocateしにくいから嫌なんだけど
.aや.soにはそんなもん埋め込まれないのに
便利さも体感できないって、なんだか一昔前のJava + J2SE + メタフレームワーク地獄
みたい
m4とXMLの違いがあるけどね
今更m4なんて弄りたがるの変態ぐらいでしょ
それはそうと、.laや.pcにフルパス埋め込まれるのは何で?
あれrelocateしにくいから嫌なんだけど
.aや.soにはそんなもん埋め込まれないのに
366デフォルトの名無しさん
2012/02/21(火) 10:35:54.54 >>364
きみがパソコンすてればアフリカの・・・
きみがパソコンすてればアフリカの・・・
367デフォルトの名無しさん
2012/02/21(火) 11:12:28.96 さすがに古臭い感じはする。
こんだけ広まっちゃうと今さらどうこうするのは難しいだろうけど。
こんだけ広まっちゃうと今さらどうこうするのは難しいだろうけど。
368デフォルトの名無しさん
2012/02/21(火) 13:39:46.81369デフォルトの名無しさん
2012/02/21(火) 15:03:36.68370デフォルトの名無しさん
2012/02/21(火) 17:40:15.55371デフォルトの名無しさん
2012/02/21(火) 18:15:57.69 >>368
規格に関するオプション以外であるなら実例だせば議論が進むぞ。
「ある」だけ連呼すんなよ。
それが人間が管理できる以上の組み合わせならautoconfは意味があるわけだし、
数個なら意味なしという事だ。
規格に関するオプション以外であるなら実例だせば議論が進むぞ。
「ある」だけ連呼すんなよ。
それが人間が管理できる以上の組み合わせならautoconfは意味があるわけだし、
数個なら意味なしという事だ。
372デフォルトの名無しさん
2012/02/22(水) 06:42:18.85373デフォルトの名無しさん
2012/02/22(水) 09:59:24.55 > いや、コンパイラのオプションでかなり変わるっしょ。
つまり、これの実例は挙げられないという事だね。
> 話が通じてないならいいよ。
捨て台詞がみっとも茄子。
つまり、これの実例は挙げられないという事だね。
> 話が通じてないならいいよ。
捨て台詞がみっとも茄子。
374デフォルトの名無しさん
2012/02/22(水) 15:20:49.78 いい加減にして
375デフォルトの名無しさん
2012/02/23(木) 18:46:17.26 雲丹板って人減ってます?
376デフォルトの名無しさん
2012/02/23(木) 19:45:24.15 >>337
-version-info CURRENT:REVISION:AGE
と指示したら、標準的なUNIX系環境では、
libfoo.so.CURRENT-AGE.AGE.REVISION
となるべきだよね。ところがlibtoolは、FreeBSD,NetBSD,HP-UXなどでは、
libfoo.so.CURRENT.AGE.REVISION
というバージョン番号を振ってしまう。
-version-info CURRENT:REVISION:AGE
と指示したら、標準的なUNIX系環境では、
libfoo.so.CURRENT-AGE.AGE.REVISION
となるべきだよね。ところがlibtoolは、FreeBSD,NetBSD,HP-UXなどでは、
libfoo.so.CURRENT.AGE.REVISION
というバージョン番号を振ってしまう。
377デフォルトの名無しさん
2012/02/23(木) 19:57:38.09 >>375
2ch全体が絶滅危惧種
2ch全体が絶滅危惧種
378デフォルトの名無しさん
2012/02/24(金) 10:00:26.97 非同期シグナルセーフなprintf誰か作ってー
379デフォルトの名無しさん
2012/02/24(金) 10:17:07.20 そういえば、memcpyは非同期シグナルセーフじゃ無いんだな
380デフォルトの名無しさん
2012/02/24(金) 16:59:31.03 どなたか教えて頂けたらなと思います。
多分Linuxだけっぽいのですが、TCPでローカルホストにあるポートにconnect()するとして、
自分自身のソケットに接続できることに気づきました。
以下、pythonでですが、
from socket import *
s = socket()
s.bind(('', 5656))
s.connect(('localhost', 5656))
↑connect出来てしまう。netstatでみるとESTABLISHEDが
1つだけあるような状況になります。
明示的にbindしてなくても、たまたま自分自身が開いた
エフェメラルポートにも接続できちゃうみたいです。
感覚的には間違った動作に思えますが、そういう仕様なのでしょうか。
多分Linuxだけっぽいのですが、TCPでローカルホストにあるポートにconnect()するとして、
自分自身のソケットに接続できることに気づきました。
以下、pythonでですが、
from socket import *
s = socket()
s.bind(('', 5656))
s.connect(('localhost', 5656))
↑connect出来てしまう。netstatでみるとESTABLISHEDが
1つだけあるような状況になります。
明示的にbindしてなくても、たまたま自分自身が開いた
エフェメラルポートにも接続できちゃうみたいです。
感覚的には間違った動作に思えますが、そういう仕様なのでしょうか。
381デフォルトの名無しさん
2012/02/24(金) 17:17:37.05 TCPの接続は<src IP, src port, dst IP, dst port>の四つ組で識別できる。
たまたま1と3、2と4が一緒でも特に支障はない。
プロトコル状態遷移の表の作り方によっては禁止もできるが。
たまたま1と3、2と4が一緒でも特に支障はない。
プロトコル状態遷移の表の作り方によっては禁止もできるが。
382デフォルトの名無しさん
2012/02/24(金) 17:33:05.37 お前ウソついてない? listenしてないのにconnectできちゃうの?
pythonのsocketは知らんけど、勝手にlistenする?
> from socket import *
> s = socket()
> s.bind(('', 5656))
> s.connect(('localhost', 5656))
pythonのsocketは知らんけど、勝手にlistenする?
> from socket import *
> s = socket()
> s.bind(('', 5656))
> s.connect(('localhost', 5656))
383デフォルトの名無しさん
2012/02/24(金) 17:55:14.86384デフォルトの名無しさん
2012/02/24(金) 18:57:43.25 >>383
> pythonのlisten()はBSD socketモデルのlisten()だから、backlog長の設定です。
> TCPプロトコルの状態遷移のLISTEN状態への遷移を行う関数ではありません。
意味が分からないなあ。pythonでもCでもlisten()しなくてもconnect受け入れられると言っている?
それともpythonだけ? ↓を実行するとLinuxではリストにされず、FreeBSDではClosedなので、
とてもconnectできるとは思えないんだけど。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
int s;
struct sockaddr_in sin =
{.sin_port = htons(5599)};
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
perror("socket"), exit(1);
if (bind(s, (struct sockaddr)&sin, sizeof(sin)) < 0)
perror("bind"), exit(1);
system("netstat -an");
}
> pythonのlisten()はBSD socketモデルのlisten()だから、backlog長の設定です。
> TCPプロトコルの状態遷移のLISTEN状態への遷移を行う関数ではありません。
意味が分からないなあ。pythonでもCでもlisten()しなくてもconnect受け入れられると言っている?
それともpythonだけ? ↓を実行するとLinuxではリストにされず、FreeBSDではClosedなので、
とてもconnectできるとは思えないんだけど。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
int s;
struct sockaddr_in sin =
{.sin_port = htons(5599)};
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
perror("socket"), exit(1);
if (bind(s, (struct sockaddr)&sin, sizeof(sin)) < 0)
perror("bind"), exit(1);
system("netstat -an");
}
385デフォルトの名無しさん
2012/02/24(金) 20:03:31.13 カマー本とかスティーブンス本とか、
ソケットプログラミングFAQに詳しく書いてあるから読んでみてねん。
ソケットプログラミングFAQに詳しく書いてあるから読んでみてねん。
386380
2012/02/24(金) 20:19:31.29 >>381
>>383
>>385
ありがとうございます、勉強になります。
仕様上はありってところは驚きです。
スティーブンスの詳解TCP/IPとUNIXネットワークプログラミングならありますので、読み直してみます。
試しにバーチャルで2つLinuxマシン用意して、
お互いにconnectしあうようにしたら繋がってしまいました。
SYN_SENTを維持しなきゃダメみたいなんで、
RSTが届かないようにフィルタする必要がありましたけど。
ちなみにpythonじゃなくても同じですよ。
Cで書くとわかりづらいかな?と思ったのでpythonで書きました。
ってことは、LinuxでTCPを使うような時って、
エフェメラルポートを受信ポートに使うのって危険?
予期せず自分自身のソケットに接続してしまうかもしれない。
まあ、どっちかと言うと先にポートが使われてて開けられなかった、とかの方がありそうですけどね。
>>383
>>385
ありがとうございます、勉強になります。
仕様上はありってところは驚きです。
スティーブンスの詳解TCP/IPとUNIXネットワークプログラミングならありますので、読み直してみます。
試しにバーチャルで2つLinuxマシン用意して、
お互いにconnectしあうようにしたら繋がってしまいました。
SYN_SENTを維持しなきゃダメみたいなんで、
RSTが届かないようにフィルタする必要がありましたけど。
ちなみにpythonじゃなくても同じですよ。
Cで書くとわかりづらいかな?と思ったのでpythonで書きました。
ってことは、LinuxでTCPを使うような時って、
エフェメラルポートを受信ポートに使うのって危険?
予期せず自分自身のソケットに接続してしまうかもしれない。
まあ、どっちかと言うと先にポートが使われてて開けられなかった、とかの方がありそうですけどね。
387デフォルトの名無しさん
2012/02/24(金) 21:48:04.19 確かネットワークプログラミングスレってのがあったと思うけど、それはまあいいとして、
ソケットプログラミングのFAQは必読。すごくいいFAQ。
プログラミング系FAQのベストの一つなのは間違いない。
以下は日本語訳。
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
ソケットプログラミングのFAQは必読。すごくいいFAQ。
プログラミング系FAQのベストの一つなのは間違いない。
以下は日本語訳。
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
388380
2012/02/25(土) 03:39:23.24 >>383
>それからTCPの接続を確立するには、accept()しなくてもよくて、
>両側からconnect()してもOKです。
だんだん分ってきました。こんな感じですか?
・connectすると、SYNを送信して状態"SYN_SENT"
・相手から(あるいは自分の)SYNを受信して、状態"SYN_RECV"でACK送信
・ACKを受信して、状態"ESTABLISHED"
SYN_RECVなんて完全に忘れてました・・。
でもWindowsやSolaris10(x86)で同じ事は試しても、この通りにいきませんでした。
かならずしもRFCに従う必要がない?
>pythonのlisten()はBSD socketモデルのlisten()だから、backlog長の設定です。
>TCPプロトコルの状態遷移のLISTEN状態への遷移を行う関数ではありません。
こっちはまだよく分りません。
LISTENになるのに別の手段が存在するということでしょうか?
>それからTCPの接続を確立するには、accept()しなくてもよくて、
>両側からconnect()してもOKです。
だんだん分ってきました。こんな感じですか?
・connectすると、SYNを送信して状態"SYN_SENT"
・相手から(あるいは自分の)SYNを受信して、状態"SYN_RECV"でACK送信
・ACKを受信して、状態"ESTABLISHED"
SYN_RECVなんて完全に忘れてました・・。
でもWindowsやSolaris10(x86)で同じ事は試しても、この通りにいきませんでした。
かならずしもRFCに従う必要がない?
>pythonのlisten()はBSD socketモデルのlisten()だから、backlog長の設定です。
>TCPプロトコルの状態遷移のLISTEN状態への遷移を行う関数ではありません。
こっちはまだよく分りません。
LISTENになるのに別の手段が存在するということでしょうか?
389デフォルトの名無しさん
2012/02/25(土) 12:34:32.23 一応ネットワークプログラミングスレで聞いた方がよさそうだと言っとく
http://toro.2ch.net/test/read.cgi/tech/1293284816/
http://toro.2ch.net/test/read.cgi/tech/1293284816/
391デフォルトの名無しさん
2012/03/10(土) 20:50:36.82 単純なネタで恐縮ですが、errnoは並列化プログラミングに対して安全なのでしょうか?
主要な並列化手法の実装だけでもかまわないので、ご存知の方はコメントください。
また、チェック対象となるシステムコールやライブラリ関数の直前にいちいちerrno=0を
置くのはいまいちいけていない気がするのですが、もっとかっこいい方法はないですか?
主要な並列化手法の実装だけでもかまわないので、ご存知の方はコメントください。
また、チェック対象となるシステムコールやライブラリ関数の直前にいちいちerrno=0を
置くのはいまいちいけていない気がするのですが、もっとかっこいい方法はないですか?
392デフォルトの名無しさん
2012/03/10(土) 21:38:45.84 1 スレッドライブラリが用意されている環境ならば、
#define errno (* __error())
のようにスレッド毎の変数になっているので安全。
2 システムコールやライブラリでエラーが発生したときに
errnoが 更新させる仕様なので、コールする前にerrnoを
クリアする必要はない。しかしerrnoを比較するとこでエ
ラー判定をしてはいけない。システムコールならば戻り値
が負、ライブラリならばその仕様に従いエラー判定を行う。
#define errno (* __error())
のようにスレッド毎の変数になっているので安全。
2 システムコールやライブラリでエラーが発生したときに
errnoが 更新させる仕様なので、コールする前にerrnoを
クリアする必要はない。しかしerrnoを比較するとこでエ
ラー判定をしてはいけない。システムコールならば戻り値
が負、ライブラリならばその仕様に従いエラー判定を行う。
393デフォルトの名無しさん
2012/03/10(土) 21:41:01.34 >>391
> errno is thread-local; setting it in one thread does not affect its value in any other thread.
うちのLinuxのman errnoから引用。どこかで定められているはずだけど、どの規格か知らない
> errno is thread-local; setting it in one thread does not affect its value in any other thread.
うちのLinuxのman errnoから引用。どこかで定められているはずだけど、どの規格か知らない
394デフォルトの名無しさん
2012/03/10(土) 21:52:08.51395デフォルトの名無しさん
2012/03/10(土) 21:56:50.40396デフォルトの名無しさん
2012/03/11(日) 00:47:10.17 どもです(´・ω・`)
397デフォルトの名無しさん
2012/03/11(日) 03:03:42.12398デフォルトの名無しさん
2012/03/11(日) 07:12:41.24 >>397
日本語でおk
日本語でおk
399デフォルトの名無しさん
2012/03/11(日) 07:59:41.37400デフォルトの名無しさん
2012/03/11(日) 21:40:09.08 おねがいします。
親子関係にないプロセス(PID既知)の生存を確認するための通常の手法はなんですか?
親子関係にないプロセス(PID既知)の生存を確認するための通常の手法はなんですか?
401デフォルトの名無しさん
2012/03/11(日) 21:48:39.59 kill(pid, 0);
402デフォルトの名無しさん
2012/03/11(日) 22:47:06.43 ありがとうございます!
・・・というか、一度はmanに目を通しているから、間違いなく読んでいるはずなのだが・・・
恥をかかないと覚えないということか・・・
・・・というか、一度はmanに目を通しているから、間違いなく読んでいるはずなのだが・・・
恥をかかないと覚えないということか・・・
403デフォルトの名無しさん
2012/03/12(月) 00:05:33.16 >>402
全部暗記できちゃうほうが異常者ですよ。
全部暗記できちゃうほうが異常者ですよ。
404デフォルトの名無しさん
2012/03/12(月) 00:08:19.11 /procという手もある。(OSによっては)
405デフォルトの名無しさん
2012/03/14(水) 02:39:31.61406デフォルトの名無しさん
2012/03/14(水) 10:37:43.36407デフォルトの名無しさん
2012/03/14(水) 12:12:14.56 >>405
中身はいいけど、目次の暗記は必須だろ
中身はいいけど、目次の暗記は必須だろ
408デフォルトの名無しさん
2012/03/14(水) 12:13:49.31 >>405
「どっかで見たなー」 っていう記憶がもっとも大事なんだよ。
「どっかで見たなー」 っていう記憶がもっとも大事なんだよ。
409デフォルトの名無しさん
2012/03/15(木) 16:20:19.04 「もっとも大事」はどうなんだろう?
410デフォルトの名無しさん
2012/03/16(金) 01:18:56.16 教えてください
ftp://ftp.irisa.fr/pub/OpenBSD/src/sbin/init/init.c
のプログラムなんですが、
どうやって/etc/rcを実行するのかがいまいちわかりません。
runcom関数内の
execv(_PATH_BSHELL, argv);
で実行しているのではないかなと思うんですが、
main関数内の、
while ((c = getopt(argc, argv, "sf")) != -1)
switch (c) {
case 's':
requested_transition = single_user;
break;
....
}
でrequested_transitionにsingle_userが代入される。
transition関数を経由して、single_user関数に入る。
までは、何となくわかるんですが、
single_user関数内でforkして、子プロセスで
argv[0] = name;
argv[1] = NULL;
setenv("PATH", _PATH_STDPATH, 1);
execv(shell, argv);
シェルを起動する。
そこからどうやって、runcom関数に入るのかわかりませんでした。
教えて頂けないでしょうか?
ftp://ftp.irisa.fr/pub/OpenBSD/src/sbin/init/init.c
のプログラムなんですが、
どうやって/etc/rcを実行するのかがいまいちわかりません。
runcom関数内の
execv(_PATH_BSHELL, argv);
で実行しているのではないかなと思うんですが、
main関数内の、
while ((c = getopt(argc, argv, "sf")) != -1)
switch (c) {
case 's':
requested_transition = single_user;
break;
....
}
でrequested_transitionにsingle_userが代入される。
transition関数を経由して、single_user関数に入る。
までは、何となくわかるんですが、
single_user関数内でforkして、子プロセスで
argv[0] = name;
argv[1] = NULL;
setenv("PATH", _PATH_STDPATH, 1);
execv(shell, argv);
シェルを起動する。
そこからどうやって、runcom関数に入るのかわかりませんでした。
教えて頂けないでしょうか?
411デフォルトの名無しさん
2012/03/16(金) 01:36:39.64 状態名の関数は全部最後に関数を返してるじゃん?
それがカーネルが次に移る状態なのよ。
その状態で、実行すべき処理を記述してある関数を、
状態そのものの代わりにしている。
void
transition(state_t s)
{
for (;;)
s = (state_t) (*s)();
}
だからこれが状態遷移マシンになるわけ。
requested_transitionは引数とか、シグナルとか、
上の関数を使った状態遷移からは逸脱するものを扱うためにある。
それがカーネルが次に移る状態なのよ。
その状態で、実行すべき処理を記述してある関数を、
状態そのものの代わりにしている。
void
transition(state_t s)
{
for (;;)
s = (state_t) (*s)();
}
だからこれが状態遷移マシンになるわけ。
requested_transitionは引数とか、シグナルとか、
上の関数を使った状態遷移からは逸脱するものを扱うためにある。
412410
2012/03/17(土) 06:18:23.32 すいません、もう少し質問させてください。
single_user関数内でforkして子プロセスで
argv[0] = name;
argv[1] = NULL;
setenv("PATH", _PATH_STDPATH, 1);
execv(shell, argv);
特に引数なしでシェルを起動していますよね。
んで、親プロセスの
requested_transition = 0;
do {
if ((wpid = waitpid(-1, &status, WUNTRACED)) != -1)
collect_child(wpid);
if (wpid == -1) {
if (errno == EINTR)
continue;
warning("wait for single-user shell failed: %m; restarting");
return (state_func_t) single_user;
}
if (wpid == pid && WIFSTOPPED(status)) {
warning("init: shell stopped, restarting¥n");
kill(pid, SIGCONT);
wpid = -1;
}
} while (wpid != pid && !requested_transition);
で、子プロセスの面倒を見る処理を行っていると思うんですが、この処理抜けないとruncom関数に入れないですよね?
ただ起動させただけの子プロセスのシェルが、
if ((wpid = waitpid(-1, &status, WUNTRACED)) != -1)
collect_child(wpid);
どうやってこの処理を抜けるんでしょうか?子プロセスのシェルはどこからSIGSTOP受け取るんでしょうか?
それとも、起動させた子プロセスのシェルが/etc/rcを実行するんでしょうか?
その場合、/etc/rcの場所が分からないと思うんですけれど...
single_user関数内でforkして子プロセスで
argv[0] = name;
argv[1] = NULL;
setenv("PATH", _PATH_STDPATH, 1);
execv(shell, argv);
特に引数なしでシェルを起動していますよね。
んで、親プロセスの
requested_transition = 0;
do {
if ((wpid = waitpid(-1, &status, WUNTRACED)) != -1)
collect_child(wpid);
if (wpid == -1) {
if (errno == EINTR)
continue;
warning("wait for single-user shell failed: %m; restarting");
return (state_func_t) single_user;
}
if (wpid == pid && WIFSTOPPED(status)) {
warning("init: shell stopped, restarting¥n");
kill(pid, SIGCONT);
wpid = -1;
}
} while (wpid != pid && !requested_transition);
で、子プロセスの面倒を見る処理を行っていると思うんですが、この処理抜けないとruncom関数に入れないですよね?
ただ起動させただけの子プロセスのシェルが、
if ((wpid = waitpid(-1, &status, WUNTRACED)) != -1)
collect_child(wpid);
どうやってこの処理を抜けるんでしょうか?子プロセスのシェルはどこからSIGSTOP受け取るんでしょうか?
それとも、起動させた子プロセスのシェルが/etc/rcを実行するんでしょうか?
その場合、/etc/rcの場所が分からないと思うんですけれど...
413デフォルトの名無しさん
2012/03/17(土) 11:03:10.55 シングルユーザーシェルのプロセスIDがpidで、
do {
} while (wpid != pid && !requested_transition);
で、親プロセス(init)はシングルユーザーシェルの終了を待っている。
(シングルユーザーシェルはインタラクティブシェル)
> 子プロセスのシェルはどこからSIGSTOP受け取るんでしょうか?
親がシェルならsuspendして親シェルに戻るけど、親がシェルじゃないから、
シングルユーザーシェルからkill -STOP $$とかやったら固まるでしょ。
それを避けるためにリスタートする。
do {
} while (wpid != pid && !requested_transition);
で、親プロセス(init)はシングルユーザーシェルの終了を待っている。
(シングルユーザーシェルはインタラクティブシェル)
> 子プロセスのシェルはどこからSIGSTOP受け取るんでしょうか?
親がシェルならsuspendして親シェルに戻るけど、親がシェルじゃないから、
シングルユーザーシェルからkill -STOP $$とかやったら固まるでしょ。
それを避けるためにリスタートする。
414デフォルトの名無しさん
2012/03/17(土) 16:04:37.77 >>412
シングルユーザモードがなにか理解できてる?
シングルユーザモードがなにか理解できてる?
415デフォルトの名無しさん
2012/03/17(土) 16:08:03.24 >>413
シングルユーザモードの典型的なセッションは、
1. シングルユーザモード指定して起動
2. シングルユーザモードのシェルが動く。動いているサービスはほぼ皆無。
3. fsckしたり、パスワード変更したり、criticalなファイル直したり。
4. Ctrl-Dでシングルユーザモードのシェル終了。(exitコマンドでも)
5. マルチユーザーモードへ。(最近のUNIXは起動シーケンスが複雑で、再起動したいケースもままある)
シングルユーザモードの典型的なセッションは、
1. シングルユーザモード指定して起動
2. シングルユーザモードのシェルが動く。動いているサービスはほぼ皆無。
3. fsckしたり、パスワード変更したり、criticalなファイル直したり。
4. Ctrl-Dでシングルユーザモードのシェル終了。(exitコマンドでも)
5. マルチユーザーモードへ。(最近のUNIXは起動シーケンスが複雑で、再起動したいケースもままある)
416410
2012/03/18(日) 04:28:21.50 貴重なお時間頂いて、申し訳ないです。
/etc/rcって、マルチユーザーモードで起動するときに読まれますよね。
init.c内では、runcom関数でその処理を行っていますよね。
で、main関数内の
while ((c = getopt(argc, argv, "sf")) != -1)
switch (c) {
を見て、
「initの引数は、sとfでf(FASTBOOT)は機能的に実装されていないようだし、
single_user関数内で、runcom関数に飛ぶのかなぁ」と思ったんですよね。
main->single_user->runcomの流れが勝手に(自動的に)行われるんじゃないかなと推測したんです。
でも、single_user関数を見ても子プロセスでシェルを起動させて、親プロセスは待つだけで、
人間が操作をしないと、次の処理に進むようには思えない。
do {
} while (wpid != pid && !requested_transition);
の処理ですね。
main->single_user(オペレーション終了待ち)->runcomになっているんですよね。
で、runcom関数はどうやって呼ばれるのかなと思ったんです。
質問が悪かったんです。すいません。質問すべきだったのは、
カーネル(bootローダー)からinitが呼ばれるときって、シングルユーザーモードでないときの
オプションは'f'なんですか?
です。
/etc/rcって、マルチユーザーモードで起動するときに読まれますよね。
init.c内では、runcom関数でその処理を行っていますよね。
で、main関数内の
while ((c = getopt(argc, argv, "sf")) != -1)
switch (c) {
を見て、
「initの引数は、sとfでf(FASTBOOT)は機能的に実装されていないようだし、
single_user関数内で、runcom関数に飛ぶのかなぁ」と思ったんですよね。
main->single_user->runcomの流れが勝手に(自動的に)行われるんじゃないかなと推測したんです。
でも、single_user関数を見ても子プロセスでシェルを起動させて、親プロセスは待つだけで、
人間が操作をしないと、次の処理に進むようには思えない。
do {
} while (wpid != pid && !requested_transition);
の処理ですね。
main->single_user(オペレーション終了待ち)->runcomになっているんですよね。
で、runcom関数はどうやって呼ばれるのかなと思ったんです。
質問が悪かったんです。すいません。質問すべきだったのは、
カーネル(bootローダー)からinitが呼ばれるときって、シングルユーザーモードでないときの
オプションは'f'なんですか?
です。
417410
2012/03/18(日) 05:35:51.09 すいません。
init_main.cを読んでちょっと理解できました。
flagsp = flags;
*flagsp++ = '-';
options = 0;
if (boothowto & RB_SINGLE) {
*flagsp++ = 's';
options = 1;
}
#ifdef notyet
if (boothowto & RB_FASTBOOT) {
*flagsp++ = 'f';
options = 1;
}
#endif
/*
* Move out the flags (arg 1), if necessary.
*/
if (options != 0) {
*flagsp++ = '¥0';
i = flagsp - flags;
#ifdef DEBUG
printf("init: copying out flags `%s' %d¥n", flags, i);
#endif
(void)copyout((caddr_t)flags, (caddr_t)(ucp -= i), i);
arg1 = ucp;
}
つまり、何も指定しない場合は'-'が答えなんですね。
init_main.cを読んでちょっと理解できました。
flagsp = flags;
*flagsp++ = '-';
options = 0;
if (boothowto & RB_SINGLE) {
*flagsp++ = 's';
options = 1;
}
#ifdef notyet
if (boothowto & RB_FASTBOOT) {
*flagsp++ = 'f';
options = 1;
}
#endif
/*
* Move out the flags (arg 1), if necessary.
*/
if (options != 0) {
*flagsp++ = '¥0';
i = flagsp - flags;
#ifdef DEBUG
printf("init: copying out flags `%s' %d¥n", flags, i);
#endif
(void)copyout((caddr_t)flags, (caddr_t)(ucp -= i), i);
arg1 = ucp;
}
つまり、何も指定しない場合は'-'が答えなんですね。
418410
2012/03/18(日) 05:47:21.65 >つまり、何も指定しない場合は'-'が答えなんですね。
すいません。何も指定しない場合は何もないが正解でした。
suwordなんて関数、初めて見ました。
すいません。何も指定しない場合は何もないが正解でした。
suwordなんて関数、初めて見ました。
419デフォルトの名無しさん
2012/03/18(日) 22:40:11.06 たしかに「どっかで見たなー」は大事だけど
そのうち「こんなのがあるはずだ」になって
無いものを探して時間を無駄にすることになる
そのうち「こんなのがあるはずだ」になって
無いものを探して時間を無駄にすることになる
420デフォルトの名無しさん
2012/03/18(日) 22:49:00.71 man 9 store
man 9 fetch
man 9 copy
man 9 fetch
man 9 copy
421デフォルトの名無しさん
2012/03/19(月) 08:17:04.29 m9(^Д^)プギャー
422デフォルトの名無しさん
2012/03/19(月) 09:55:12.39 >>419
30分探して見つからなかったら、「無い」よ
30分探して見つからなかったら、「無い」よ
423デフォルトの名無しさん
2012/03/19(月) 09:59:41.84 あったはずのものが見つからないと気持ち悪くて他の事が出来ない。
多分精神疾患なんだろう。
多分精神疾患なんだろう。
424デフォルトの名無しさん
2012/03/19(月) 10:13:03.18 あったはずのものが見つからない・・・・
夢・・・とか
夢・・・とか
425デフォルトの名無しさん
2012/03/19(月) 10:15:31.01 >>424
呪いが解けてよかったな
呪いが解けてよかったな
426デフォルトの名無しさん
2012/03/19(月) 10:36:22.33 >>424
あるはずの現実を見ようとしていない状態より遥かにマシだ
あるはずの現実を見ようとしていない状態より遥かにマシだ
427オカルトの世界にようこそ
2012/03/19(月) 10:46:03.46 存在しないものをプログラミングするとか、
ゴーストを実装するようなもの。
ゴーストを実装するようなもの。
428デフォルトの名無しさん
2012/03/19(月) 11:31:33.10 まさにWizard
429デフォルトの名無しさん
2012/03/19(月) 11:49:08.41 どどど同邸ちゃうわ・・・!
430デフォルトの名無しさん
2012/03/19(月) 12:07:52.39 切迫していなければ
別に回り道したっていいと思うけど
最終的に正しい答えを導き出しているんだし
そのぶん、ソースも読んだだろうし
別に回り道したっていいと思うけど
最終的に正しい答えを導き出しているんだし
そのぶん、ソースも読んだだろうし
431デフォルトの名無しさん
2012/03/19(月) 13:03:50.05432デフォルトの名無しさん
2012/03/19(月) 14:19:30.88 ゴーストもいればゾンビもいる
UNIX界はほんまホラーやで
UNIX界はほんまホラーやで
433デフォルトの名無しさん
2012/03/19(月) 14:30:39.17434デフォルトの名無しさん
2012/03/19(月) 14:52:04.58 仮想コンソールの窓越しにしか見えないスタンドのような存在か
435デフォルトの名無しさん
2012/03/19(月) 16:05:39.14 みなし児もいる悲しい街なのですよ。
436デフォルトの名無しさん
2012/03/19(月) 18:17:26.17 お前ら、非技術的な話題だと食いつき良いな。
437デフォルトの名無しさん
2012/03/19(月) 18:18:17.58 技術的な話題も好物ですよ
2012/03/31(土) 00:06:18.32
物欲を満足しつつ、ちょっとしたUNIXプログラミングの実験&iPad用アプリの開発を
こなせるマシンを購入検討したいのですが、現行機種で何かオススメはありますか?
こなせるマシンを購入検討したいのですが、現行機種で何かオススメはありますか?
2012/04/01(日) 19:49:49.18
Mac板で相談しなよ。
2012/04/01(日) 19:56:56.10
いや、UNIXプログラミングができるからこそのMac選択で、
似たようなことを考えた先達がいると思うからこそここでのQです
ぶっちゃけ、Mac板でまともな回答が帰ってくるとは思えないし
似たようなことを考えた先達がいると思うからこそここでのQです
ぶっちゃけ、Mac板でまともな回答が帰ってくるとは思えないし
441営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 02:54:08.78 >>440
MacBook Airの一番安いのでスタバでドヤ顔しなさい
MacBook Airの一番安いのでスタバでドヤ顔しなさい
2012/04/02(月) 07:13:56.20
昨年、台湾の雑誌『遠見』が20歳以上の1000人にアンケートしたところ
「一番尊敬する国」「一番移住したい国」などの筆頭に日本が挙げられた
そうだ。
そういえば以前、台湾に旅行をした際に、現地で知り合った人に好意的に受け
入れられ、台湾は「親日」なんだと実感したことがある。
でも、どうして台湾は親日なのだろう。
産能短期大学講師で『日本に恋した台湾人』などの著書で知られる謝 雅梅さん
にお話を伺った。
「やはり歴史背景は大きいですね。日本統治時代(1895〜1945年)、
その目的はどうであれ、日本が台湾のインフラを整備したことは今でも高く
評価されてます。72歳になる私の父は、小学校4年生まで日本の教育を受け
ましたが、不思議と日本人に立ち居振る舞いも似てくるんですね。いわゆる
日本の頑固親父と一緒(笑)」
では、65年生まれの謝さんや若い世代にも親日派が多いのはなぜ?
「私の世代の場合、反日教育も受けましたが、父の世代からいい印象も聞いて
います。日本のテレビ番組や雑誌なども昔からあって、よく見てました。今、
20代くらいの若者には、日本の音楽やファッション、マンガやゲームなどの
サブカルチャーが人気です。彼らの世代になると、もう日本との歴史をよく
知らないんですよ。台湾も、日本のようにアメリカの影響は大きいんですが、
やはり同じアジアの日本文化の方が肌に合う。これは一過性の流行ではなく、
親日感情は昔から繋がっているんです」(同)
http://headlines.yahoo.co.jp/hl?a=20070802-00000002-rec_r-int
「一番尊敬する国」「一番移住したい国」などの筆頭に日本が挙げられた
そうだ。
そういえば以前、台湾に旅行をした際に、現地で知り合った人に好意的に受け
入れられ、台湾は「親日」なんだと実感したことがある。
でも、どうして台湾は親日なのだろう。
産能短期大学講師で『日本に恋した台湾人』などの著書で知られる謝 雅梅さん
にお話を伺った。
「やはり歴史背景は大きいですね。日本統治時代(1895〜1945年)、
その目的はどうであれ、日本が台湾のインフラを整備したことは今でも高く
評価されてます。72歳になる私の父は、小学校4年生まで日本の教育を受け
ましたが、不思議と日本人に立ち居振る舞いも似てくるんですね。いわゆる
日本の頑固親父と一緒(笑)」
では、65年生まれの謝さんや若い世代にも親日派が多いのはなぜ?
「私の世代の場合、反日教育も受けましたが、父の世代からいい印象も聞いて
います。日本のテレビ番組や雑誌なども昔からあって、よく見てました。今、
20代くらいの若者には、日本の音楽やファッション、マンガやゲームなどの
サブカルチャーが人気です。彼らの世代になると、もう日本との歴史をよく
知らないんですよ。台湾も、日本のようにアメリカの影響は大きいんですが、
やはり同じアジアの日本文化の方が肌に合う。これは一過性の流行ではなく、
親日感情は昔から繋がっているんです」(同)
http://headlines.yahoo.co.jp/hl?a=20070802-00000002-rec_r-int
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【外交】元台湾総統・馬英九氏、高市首相発言に「台湾を危険にさらす」台湾海峡の問題は「両岸の中国人が自ら話し合うべき」★2 [1ゲットロボ★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★8 [ぐれ★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 [おっさん友の会★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 [ぐれ★]
- 【芸能】俳優・野村宏伸 テレビドラマの制作費やギャラの現状訴え 「比べものにならない位、今は低くて…」 [冬月記者★]
- 中国外務省局長 「ポケットに手を入れていたのは寒いから」 ⬅︎これ [279254606]
- 【高市売り】円安、止まらず!凄い勢いで暴落中。157円へ [219241683]
- 【悲報】大阪万博行かないのに万博に文句言い、兵庫県民でもないのに斎藤知事に文句言うガイジ お前らだけじゃなかった…orz [363226198]
- 【悲報】ヤフコメ民「中国が水産物を輸入禁止にするなら、日本国民向けに安く販売すればいい。中国依存から脱するべき」 [153736977]
- 【ぺこ専🐰】なんG 兎田ぺこら実況スレ🏡【ホロライブ▶】
- 【悲報】自民党のヒゲ、外務省局長と中国高官の写真にブチギレwwwwwwwwwwwwww [834922174]
