PAEとSMP

自分メモ。

PAEはPhysical Address Extensionsの略、日本語で言うなら物理アドレス拡張。
FreeBSDでは 5.1-RELEASE から有効になりました。
この機能を有効にすることで、Intel P6アーキテクチャ以降で64GBの物理メモリが利用可能になりました。

現在お使いのカーネルに以下の行があればPAEは有効になっています。

options PAE


SMPはSymmetric MultiProcessor Kernelの略。マルチプロセッサ環境用のオプション。
以前からサポートされていたもののいまいちの精度のようです。
FreeBSD 6.0-RELEASEあたりから段々まともになってきた模様、それでも導入前にはベンチマークを取った方がよさそうです。

カーネルに以下の行が追加されているようでしたら、SMPは有効になっています。

options		SMP		# Symmetric MultiProcessor Kernel
options		APIC_IO		# Symmetric (APIC) I/O


パケット再送率が異常と言うエラーメッセージを見てネットオペに見てもらったら、カーネルをPAEを指定したものからSMPを指定したものに入れ替えて「これで様子を見てくださいといわれた」よく分からない。

集中して仕事したと感じている。
思い出そう。

10〜13 今日は目標の一環でUSのドキュメントを一つ翻訳しようと決める。
     ひたすらUSのサイト漁り、楽しくなってシェアシェア
     Messengerで2名から「暇なんですか」といじめられる。
     翻訳すべきドキュメントは決まらなかった。
    とりあえず新卒をいじる。

13〜14 ニートランチ N方さんをいじりそこなう
    とりあえず新卒をいじる。

14〜15 メールがたまってたのでバグトラッキングをやっつける。
     絶対スクラムとかの管理者向いてるなあとかボーっと思う。
    標準化関連のドキュメントに切れる。腹筋100回やって市ね!
    根源的な問題についてメッセで質問を投げかけられ、
     USに問い合わせようと英文を書き、添削を依頼する。
     「とりあえず一行目からありえない」というコメントをもらう。

15〜16 ありがたいセミナー、5分で見切って寝てたのでよく分からない。

16〜17 技術的な申請系をやっつける。
    よく分からないUSのツールをいろいろ動かしてみる。楽しい。
    ISMSの台帳にしばし切れる。

17〜18 セキュリティについてのレビューを求められ、もっともらしいことを言う。
     セキュリティコンサルっておいしいなあとか思う。
     相手がプレゼン慣れして無い方だったのでちょっと苦労する。
     相談者が何を聞いて欲しくてどんな答えが欲しいのかを一時間ですり合わせる。
     なんというかレビューって対局っぽいですね。
     最後に「きゅーぞうがセキュリティってpgr」と嘲笑される。
    とりあえず新卒をいじる。

18〜20 檻の人と懇々と話し込む。


・・・・・・・・・・・あれ・・・・・・・・・・
仕事して無いな・・・・・・・・・・・・・・・・
達成しようと思ったこと何も達成して無い・・・・

これが弊社によくある仕事した気になった症候群か

ライブドアリーダーも読まず集中したと思ってたんだけどなあ・・・

檻の人に
「エンジニアの評価基準なんてのはどんだけコード書いてどんだけデバッグしたかだ」
とかいわれ、自分を思い出すとここ半年で仕事で書いたのは。

C++プラグイン 500行
perlの監視系script2本 500行×2

・・・・・・・えっと・・・・・・・・・・・・

あ、後よく人から質問されて人様のコードのデバッグとかもしてマスしてます!



これはもう駄目かも分からんね。

PMがぶれる

今日いきなりヘルプ依頼が来た。
よく分からないけど、暗号化の処理を行ったファイルがパートナー企業にscpすると壊れ、社内にscpすると問題ないという話だった。
さらにそのサービスは数日後にリリースとのこと。
私自身はその相談の直後にMTGが入っていたため後輩の子にブン投げてきてしまったのだが果たして悩む。

何故こういうことになったのか。
どう聞いても3週間前に解決している問題に聞こえる。


私が見たところの問題は

  • PMが会社にいないことが多い、子供の関係で仕事にこれないことも多い
  • 技術者がこの手の開発が全員初めて
  • ほぼ全員がチームで動くのが初めて
  • 外注さんを3人使う
  • チームになっていない。企画は技術を不信に思い、技術は企画を不信に思う。
  • スケジュールが神
  • デスマーチ発動でさらに人間投下


彼らが必ずやらねばならぬこと。

  • 振り返る場を持つ


提案できる策

  • PMは皆勤賞が狙える人間を置くのは大前提
  • PMがPMであることを自他共に紙でもページでもいいので明白にし、残す。
  • スケジュールを引く際にシニアエンジニアによるレビューを受ける。それが関係者であっても無くても良い、無いほうがむしろ良い。
  • 大規模バッチ系のプログラムであればリリース前に二週間、できれば一週間は通しでまわしてバグをつぶしておくのは常識。
  • 外注を使うならもっと、あるいは0。プロパーの3倍ドキュメントが無いと動かない彼らを少ない人数で回すなら一人雇った方がいい。固定費が上がるので悩ましいとは思う。
  • コミュニケーションのルールを定める。
  • 技術、企画共に上がもう少しきちんと管理すべき。


なんとなく、私が過去にやっだデスマーチの一つも同じような問題があった。
特にPMが誰なのかという問題については根が深く、何をしても誰かがひっくり返すみたいな状態になっていた。
確かなものが何も無くなったプロジェクトは泥にはまるしかない。
プロジェクトマネージャーとプライマリエンジニアは共にどんなプロジェクトの濁流に飲まれても立ち続けねばならない。
デスマーチを経験した彼らがそれを学んでくれるといいね思った。

特殊変数とかの話

122 名前: デフォルトの名無しさん 投稿日: 2007/10/16(火) 22:50:10
たとえば java の例。
for (i : o) {
 System.out.println(i);
}
こんなの、java を知っている人が見ればわかる事だが、
知らない人が見たら何だかさっぱりわからんだろう。
ではバッチファイルの例。
FOR %%I IN (*.txt) DO (
 ECHO %%I
)
ん〜〜。java よりはマシかな・・・でもやっぱり
BAT を知ってる人が見ればわかるが、知らない人にはわからない。
こんどは perl の例。
 ($arg1,$arg2) = @_;
やはり perl を知っている人が見ればわかるが、知らない人がみたら分からない。

結局、「可読性がどうの」 って言ってるヤツってさ、その言語を知らないだけじゃん。
単なる己の勉強不足を、言語仕様に責任転嫁してるだけ。
「魚が釣れないのは釣竿が悪いから。もっと高い釣竿ならきっと釣れるはず」 と言ってるオヤジと同レベルw

123 名前: デフォルトの名無しさん 投稿日: 2007/10/16(火) 23:08:48
>こんどは perl の例。
> ($arg1,$arg2) = @_;

$arg1 = shift(@ARG); 
$arg2 = shift(@ARG); 

if (!defined($arg1) || !defined($arg2)) { 
  return $INVALID_ARGS; 
} 

こうかけばPerl知らなくてもわかると思うぞ。ようするに書き手の問題じゃね。

まぁ、Perlはもともとが「自分が楽するための言語」であって、
他人にソースコードを読ませるためのものではなかったはずだ。

132 名前: デフォルトの名無しさん [sage] 投稿日: 2007/10/17(水) 00:24:15

<span style="font-weight:bold;">(^o^)ノ~ map { ${"arg$_"} = shift } 1..2; </span>

さすがperl

究極超人あ〜るが好きだったんです。

59 名前: 仕様書無しさん [sage] 投稿日: 04/06/08 00:02
新人が入って・・・

鳥「それにしても何だな。体力勝負のできそうなやつが一人ほしいな。」
信「体力?」
鳥「体力は必要だぞ。ものすごいクライアントの相手なども、せにゃならんからな。」
信「ひとつきいていいですか?」
信&えりか「プログラマってどんな職業なんですかぁ?」

60 名前: 仕様書無しさん [sage] 投稿日: 04/06/08 00:58
# た……たしかに、↑くらいの香具師じゃないと、こんな業界に入って来ない気がする……

関数をmapに

昔ハンドラを書くときに、URIと呼び出したいファンクションと幾つかのフラグを構造体に入れて、リクエストのたびにforでまわしてURIが定義されていれば、、、なんてコードを書いていた時代を思い出した。

32 名前: デフォルトの名無しさん [sage] 投稿日: 2007/09/28(金) 14:34:34

std::string str 

switch( str ) 
{ 
  case "あいうえお" 
    funcA(); 
    break; 

  case "かきこくけこ" 
    funcB(); 
    break; 

  (同様に続く・・・) 
} 

のように処理させたいけど文字列な為に出来ません
この様な場合どういうやり方が一般的ですか?

if文でゴリゴリ書くしかない?
33 名前: デフォルトの名無しさん [sage] 投稿日: 2007/09/28(金) 15:12:10
一般的じゃないかもしれないけどこういう手が楽っぽい

#include <map> 
#include <string> 
#include <iostream> 

void funcA() { std::cout << "invoke func A\n" ; } 
void funcB() { std::cout << "invoke func B\n" ; } 

int main(void) { 
 std::map< std::string, void(*)(void) > funcs ; 
 funcs[ "あいうえお" ] = funcA ; 
 funcs[ "かきこくけこ" ] = funcB ; 

 std::string str = "あいうえお" ; 
 void(*f)(void) = 0; 
 f = funcs[str]; 
 if ( !f ) 
  // default: の処理 
 else 
  f(); 

 return 0; 
} 

要は条件をキー、呼び出す関数を値にするmapだな
値をboost::functionへの参照とかにしてやれば、動的なオブジェクトのメソッドを呼び出すことも可能

配列の長さ(要素数)をコンパイル時に計算

892 名前: デフォルトの名無しさん 投稿日: 2007/09/23(日) 22:19:28
配列の長さ(要素数)をコンパイル時に計算するにはどうしたらよいですか?
コンパイラの最適化レベルによらずにコンパイル時に計算になる例が欲しいです。

よろしくおねがいします。

903 名前: デフォルトの名無しさん [sage] 投稿日: 2007/09/23(日) 23:02:30

#include <cstddef> 
template<typename T, std::size_t N> 
char (&lengthof_helper_char_array(T (&a)[N]))[N]; 
#define lengthof(a) (sizeof(lengthof_helper_char_array(a)))

896 名前: デフォルトの名無しさん 投稿日: 2007/09/23(日) 22:37:20
>892
最適化前提でいいなら、
template int len(T (&)[N]){return N;}
というのがわりと有名。

>892,895
sizeofを使うマクロに比べてこの関数がよいのは、配列以外をこの関数に
与えるとコンパイルエラーになること。

最適化無しで数値にできる方法は知らない。
Boostスレのほうがいいかもな。

912 名前: 903 [sage] 投稿日: 2007/09/23(日) 23:29:10
>>906
関数テンプレートの引数については >>896 といっしょね。
903 は戻り値で値を返すんじゃなくて元の配列と同じ長さの char 型の配列を
返すように宣言してる。 sizeof(char) は 1 なので、この配列に sizeof を
かければ元の配列の長さが得られる。 sizeof の引数の式は実際に実行される
ことがないので、定義は要らない。

typedef とか使ってもっと簡単なコードにしたいところだけど、 template のせいで
同じ記述を何度か繰り返すことになり、あんまりすっきりしない。

916 名前: デフォルトの名無しさん 投稿日: 2007/09/23(日) 23:42:01
>>914
ありがとうございます。
もうすこしだけ教えていただけませんか?

理解の為、まず
char c3[] = {1,2,3};
char (&rc3)[3] = c3;
int main(){}
こう書いてみたらこれはコンパイルできました。

次に、
char (&f(int))[3]; // これは何.....
int main(){}
こう書いてみたら、これもコンパイルできてしまったんですが、
私は一体何を宣言したことになるのでしょうか?
917 名前: デフォルトの名無しさん [sage] 投稿日: 2007/09/23(日) 23:45:03
>>912
普通、配列を返す関数は作れないよね?
この宣言が許されるのが不思議だ...。

921 名前: デフォルトの名無しさん 投稿日: 2007/09/23(日) 23:51:12
>>918-919
何がわかったの?

916の実験続き
char (&f(int))[3];
int main() {
return sizeof(f(10000));
}
は3が戻った。

次に、
char (&f(int))[3];
int main() {
f(100);
としてみたら、
undefined reference to `f(int)'
でリンクできなかった。とりあえずここまで。
922 名前: デフォルトの名無しさん 投稿日: 2007/09/23(日) 23:53:50
こうしたらリンクできた。なんてこった。
こんな関数の定義方法があるのか!企画のどこに書いてあるんだろう?

char (&f(int))[3] {
static char x[3];
return x;
}

int main() {
f(100);

びっくりしました。ありがとうございました。みなさま。

925 名前: >>917-919 [sage] 投稿日: 2007/09/24(月) 00:08:19
おれが理解したのはこんな感じ
1.関数は配列を返すことは出来ないが、配列の参照ならば返すことができる。
その宣言方法は
char (&f())[3]; //char[3]の参照を返す関数fを宣言。

2.sizeof に関数呼び出しを与えても、関数呼び出しを行わない。返り血のサイズを返すのみ。
sizeof(f()); //この値は 3

これをtemplateで応用して上記1の配列サイズ(3)をNとし、Nはテンプレートのパラメータにする。
さらに、任意の型で仕様できる用に、typename Tもパラメータに加え、関数fの引数に与えオーバーロードさせる。
使いやすい様に sizeof(〜)全体を囲って #defineすれば>>903の出来上がり。

こんな形で実体の関数が使えるなんて知らなかった。sizeofめ。