社会のあり方の一例

飲み会に来ない新人を毎日無視してたら退職しやがったwwwwwww

上記の記事について、会社の規模や新人の詳細はわからないが俺はありだと思っている。このことは順を追って説明しなくてはならない。


まず、メーカーが下請けに対して仕事を発注する場合、仕事を遂行できる会社であれば発注先はどこでも良い。
大抵の場合、発注先というのはかなりの数があるので、メーカーの発注者は自分が一緒に仕事をして
気分がいいところを選ぶだろう。


例えば
Aという下請けは値段は安いが、対応は雑。
Bという下請けは仕事の質は高いが、いちいち文句言ったり、こちらの意向を無視したりしてやりづらい。
Cという下請けは値段そこそこ仕事の質もそこそこだが、こちらの意図を汲み取って柔軟に対応してくれたり細かく気を使ってくれる。
となれば、次回以降の仕事はCに頼もうと思うのが人情だろう。
また、下請けDと下請けEがあったとして、仕事も値段もほとんど変わらなかったとして
Dは接待ありで気の使い方も良い、Eは接待なしとなった場合、Dに仕事を頼むのも人情だろう。



次に下請けがメーカーと取引するとき当然顔を合わせるわけだが、この時お互いがその会社の顔となる。
当然失礼なことがあった場合は、その会社が失礼なことをしたと見られるわけだ。
立場としては当然メーカーのほうが上なわけなので、下請け側はどれだけメーカーに気に入られるかが肝になる。


ここで下請け側の新人を出すか出さないかというのは、下請け側としてはかなり難しい。
新人を出して下手な発言をされて、メーカー側の期限を損なうことは避けたい。となれば、新人を取引の場に出さないのは無難な選択である。
しかし、それではいつまで経っても新人を取引現場に出すことができないので、新人に経験をつませられない。



ではどうすればよいか。要するに取引現場で下手な発言をしないようにあらかじめ練習させればよい。
今回の上司からの誘いというのは正にそれである。断った新人は自分から練習を拒否しているのも同然である。
練習は誘われたところからすでに開始している。これを断ったということは即ち、取引先から誘われたときも断るであろうと思われても仕方ない。
ここで、「上司から誘われたら断るけど、取引先から誘われた場合は行きますよ」という人もいるだろうが
これは、「練習ではちゃんとやらないけど、本番ではできますよ」と言っているようなものだ。誰がその言葉を信用するだろうか。



少し話が変わる。
日本の労働基準法というのはかなり労働者側が有利になっていて、会社に大きな損害を与えたり
リストラしないと会社が倒産しかねない状況にならないと退職させることができない。
試用期間内であれば、試用期間終了後に能力が満たなかったとして切ることが可能だが、試用期間を過ぎてしまうと上記が適応される。
こうなると、会社に今後不利益をもたらすとわかっていても、実際に不利益をもたらすまで解雇できないのである。



さて、話をまとめよう。
この新人は、今回上司の誘いを断った。となれば、今後もし取引先に一緒に顔を出させてもいきなり誘いを断ったり、下手な発言をしかねない。
そういった会社に不利益をもたらしそうなやつには、予め仕事を与えないで+-0の状態にしたほうがマシということだ。(正確には給与払っている分マイナスだが解雇できない)



新人のあり方
会社に所属した新人のあり方は、まず上に言われた事をきっちりこなしていく。
それが理不尽であってもやり切る。必要であるならば相談する。そうやって実績を作っていく。
口先だけのやつはいらない。行動して結果を出したやつだけが認められる。




最後に
これはあくまでも一例であり、全ての会社がこれに当てはまるわけではない。ただし、資本主義の日本でこの例はかなり多いと思われる。
組織に所属する以上、こういう関係があるのは仕方がない。この図に当てはまりたくないのであれば人と極力関わらない仕事するしかないと思います。

VisualStudio2008 SP1 vectorのバグ?

以下のプログラムはstd::allocatorを継承して自作アロケータを作成し、実際よりも32byte多めに確保してその前後に
固定値を入れ、解放時に固定地を書き込んだ領域に不正書き込みがないか確認するものである。

#include <stdio.h>
#include <map>
#include <vector>
#include <string>

struct Data {
	std::string file;
	int line;
	size_t size;
};
static std::map<void*, Data> data_;

/*!
 * @brief アロケータクラスを提供します。
 */
template <class T>
class CAllocator : public std::allocator<T>
{
public:
	typedef typename std::allocator<T>::size_type size_type;
	typedef typename std::allocator<T>::pointer pointer;

	template<typename U> struct rebind { typedef CAllocator<U> other; };
	CAllocator() {}
	CAllocator(const CAllocator<T> &) {}
	template <class U> CAllocator(const CAllocator<U> &) {}

	// メモリを割り当てる
	pointer allocate(size_type size, const void* hint = 0)
	{
		Data data;

		char* p = ::new char[size + 32];
		memset(p, 0xFD, 16);
		memset(p + size + 16, 0xFE, 16);
		data.size = size;
		p += 16;
		data_[p] = data;

		printf("alloc 0x%p size:%u\n", p, size);
		return reinterpret_cast<pointer>(p);
	}

	// メモリを解放する
	void deallocate(pointer p, size_type num)
	{
		printf("deallocate 0x%p\n", p);

		if (data_.count(p) != 0) {
			Data data = data_[p];

			char* pp = reinterpret_cast<char*>(p) - 16;
			size_t end_off = data.size + 16;
			for (int i = 0; i < 16; ++i) {
				unsigned char c1 = pp[i];
				unsigned char c2 = pp[end_off + i];
				if (c1 != 0xFD) {
					// 先頭16バイトが不正アクセスされた
//					printf("0x%02x %pの前方に不正アクセス FILE:%s LINE:%d\n", c1, p, data.file.c_str(), data.line);
					printf("0x%02x %pの前方に不正アクセス\n", c1, p);
				}
				if (c2 != 0xFE) {
					// 先頭16バイトが不正アクセスされた
//					printf("0x%02x %pの後方に不正アクセス FILE:%s LINE:%d\n", c2, p, data.file.c_str(), data.line);
					printf("0x%02x %pの後方に不正アクセス\n", c2, p);
				}
			}
			::delete pp;
			data_.erase(pp);
		} else {
			// 登録されていない不正なポインタ
		}
	}

	// 割当てることができる最大の要素数を返す
	size_type max_size() const { return 100 * 1024 * 1024; }
};
int main()
{
	std::vector<char, CAllocator<char> > buf(100);
}


このプログラムを起動した場合、期待する出力というのは以下となる

alloc 0x00678EF0 size:100
deallocate 0x00678EF0

アドレスは環境によってことなるが、期待する動作はこれである。VS2008で起動した場合はこの結果が得られた…Debugビルドではな!
Releaseビルドして実行すると驚くべき結果になった

alloc 0x00098F60 size:1
alloc 0x00091730 size:100
deallocate 0x00091730
deallocate 0x00098F60
0xfb 00098F60の後方に不正アクセス
0x1d 00098F60の後方に不正アクセス
0x00 00098F60の後方に不正アクセス

これはいったいどういうことだ!
size1の領域取得、さっぱりわからん。いったい何のために取得しているんだ。
取得と解放のログを見る限り、1byteの確保と100byteの確保は別の目的で使用されているらしい。
解放ログが100byte解放の後に1byte解放しているからね。
しかし、その後不正アクセスが入っている。グローバルnewで確保している以上、確保領域が被ることはない
つまり、何かしらの理由で不正アクセスがされているのは確定である。誰か説明して><

プライオリティ描画管理

以前まではスプライト描画用の構造体を作って、その構造体を保存しておき
ソートをかけて描画するという手法をとっていたわけだが、結構メモリを消費するのと
数を増やしづらいというのがあったので、新しい手法として関数単位のソートを書くようにしてみた。

class DrawList
{
public :
	typedef void (*DrawFunc)(void* arg1, void* arg2);

	DrawList(int n) : data_(n){}
	void Clear() {
		for (unsigned int i = 0; i < data_.size(); ++i) {
			data_[i].clear();
		}
	}
	void Set(DrawFunc func, void* arg1, void* arg2, int prt) {
		Data data;
		data.func = func;
		data.arg1 = arg1;
		data.arg2 = arg2;
		data_[prt].push_back(data);
	}
	void Draw() {
		for (unsigned int i = 0; i < data_.size(); ++i) {
			std::list<Data>::iterator it = data_[i].begin();
			for (; it != data_[i].end(); ++it) {
				(it->func)(it->arg1, it->arg2);
			}
		}
	}

private :
	struct Data {
		DrawFunc func;
		void* arg1;
		void* arg2;
	};
	std::vector<std::list<Data> > data_;
};

明日ファイーストマスター・・・らしい


本気でヤバくなったので、ネトゲーを今月から休止
うん、遅すぎるね

しかし、ネトゲやらなくなって仕事のはかどり具合がぱねぇ
今までの5〜10倍の速度で仕事してるわ!
ネトゲ休止が遅かったから間に合わなそうだけど・・・(ファーストは)

でだ、PS3はUSBスティックメモリでBDエミュレートができるわけだが
今日イメージを作成して書き込みをしたら、まさかの書き込みエラー

こんなことは一度もなかったので、なぜかと思い調べてみたら容量オーバーだった

USBスティックメモリの容量8GB、ディスクイメージ9GB

どうしてこうなった・・・

マスターもうすぐだけど容量アップアップ

もうすぐマスターで、データがいろいろそろってきたわけですが
ここで大問題発生!!!!

なんと、ファイルの容量が4Gを超えてしまって、自前のアーカイブツールが対応できなくなってしまった。
今からちょっと作り直してくる!

PS3開発始めました

こっちの日記長いこと書いていませんね
なぜならやる気がないから(キリィ


PS3の仕事を請け負い、現在勉強中なのですがどうもやる気がでません。
たぶん一人だからですね。
正直なところ職場でプログラマ一人という環境に限界を感じています。
周りとプログラムの話をできないというのが苦痛で仕方ありません。


今の会社に入ったばかりの頃は、新しい職場ということで気が引き締まっていましたが
今では仕事中にゲーム三昧という体たらく。
それでもまぁ仕事なので一応やりますけどね。
PS3の中身はOpenGL ES+拡張API+Cg(シェーダ)
サウンドは、CRIに任せちゃいます。


画像表示以外のところのライブラリは一通り完成しました
画像表示は終わっているので、文字表示とレンダリングターゲット変更と
出力時にテレビサイズに合わせるのをやれば、ライブラリは一通り完成です。
やる気があればとっくに終わっているのですが、やる気がないのでなかなか終わりませんマル