2007年12月31日

今年について

もう少しで2007年も終わろうとしています。
ビールを飲みながら、ちょっと振り返ってみよう。

下半期からブログを始めました。こういったものは、基本的に3日坊主な人なので、現在のほぼ毎日(書いていない日は、飲みの日ビール)更新という状態は、自分を褒めてあげたいと思います。

仕事の方は、ある程度今後の方向性についての課題が見えてきたような気がします。現在の会社にも、方向性について意識合わせができたので、とりあえず腹をくくれそうです。

また、10月末に立てた以下の目標については、
(1)以前にC++で作成した、科学技術計算クラスをJavaに移植する。
→移植はできましたが、ロジックの見直しをした方がいいところがあるので、その改造に来年はかかりましょう。
(2)Ruby on Railsで典型的なアプリケーションを作成する。
→なんか、ついついレールの外を走ってしまうので、仕切り直して、先ずはレール内でのアプリケーション作成をするように軌道修正をしましょう。
(3)今年中にホームページのリニューアルをなんとかする。
→結構進んで良かったです。来年は、C++ライブラリの整理とアップ、VMWareの作業手順、SwingやSWTのTIPS、Rails、PHP Mapleなどたくさんアップ材料があるので、スケジュールをしっかり整理して望みます。

来年やりたいこととして、プログラミング以外にあるのが「花の形態形成について」の資料を作成するなどというものもあったりします。

ともあれ、来年も頑張っていきまっしょい!猫

それでは、これを読んで下さっている人たちへ
2008年が皆さんにとっても良い年でありますように。

良かったらクリックお願いします→banner_01.gif

posted by 台北猫々 at 23:06| Comment(0) | TrackBack(0) | 日記

2007年12月30日

ソフトウエア受託開発業界考察1

この間、昔の同僚と話をする機会があったのですが、受託開発の現場は大変な状態のようですね。まあ、昔から大変は大変だったのですが、輪をかけてという意味で。。。

ITバブル崩壊以降、少ない開発費・短い工期・不十分な投入人数などナイナイ尽くしのリソースでなんとか頑張ってきていたものが、いよいよほころびが顕著になってきた感じです。

私が受託開発の現場にいた時に見ていたものは、まともな生産性が出せる限られた人間(中心メンバー)が、馬車馬のように働いて、なんとかプロジェクトを完了させている風景ばかりでした。

そんなぎりぎりの開発では、当然のことながら若手を育成する余裕はもちろん無い状態なわけで、そうなると中堅が育ってこない状態になって、中心メンバーは永久にプロジェクトを完了させることだけに一杯々々になってしまいます。

そうなると中心メンバーは、人間ですから疲弊していきます。そして、そのような中心メンバーを満足させる給料を支払っている会社がどれだけあるだろうか、いやない(反語)。

そして、中心メンバーは少しでも優遇してくれる会社を求めて転職していき(また、さらに悪い場合は、激務により心や体を壊して戦線離脱する)、後には未育成のメンバーだけが滞留していく。

これは、受託開発業界にひしめく「負のスパイラル」の1つに過ぎません。負の要因は多くあり、網の目のように絡み合い単純な解決はもはや望むことはできません。

(長くなったので続く猫
posted by 台北猫々 at 22:07| Comment(0) | TrackBack(0) | コラムみたいな

河童凶刃

日本刀を持った河童に、追っかけ回される
夢を見ました猫
posted by 台北猫々 at 20:17| Comment(0) | TrackBack(0) | 日記

2007年12月29日

Static Import

この前調べ物をしていて偶然知ったのですが、staticメンバに対して非修飾でアクセスする方法があるのですね(Java5から導入された)

従来は↓のようにするところが、
double r = Math.cos(Math.PI * theta);

import static java.lang.Math.*;
のようにすることにより、

double r = cos(PI * theta);
というように記述することができるようになります。
ソースがすっきりしますね。

ただ、参照ページにもありますが、名前空間が分からなくなるので、多用するとソースの可読性が非常に低下する危険性があるであろうと思われ。多分通常の開発では規約で使用禁止になるかもしれませんね。

使い所を誤らなければ便利かと思います。猫

参照ページ:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/language/static-import.html


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 11:02| Comment(0) | TrackBack(0) | 技術メモ(Java)

着きました。

実家に今さっき着きました。
なにげに距離があるのです。

この時期にあんなに強い雨が降るなんてね。猫
posted by 台北猫々 at 00:04| Comment(0) | TrackBack(0) | 日記

2007年12月28日

今日はこれから

実家に帰らないと。。。
なんか、慌しくて師走らしい。
posted by 台北猫々 at 20:28| Comment(0) | TrackBack(0) | 日記

2007年12月27日

ふと、思ったのですが・・・

昔、人間で河豚を初めて食べた人って、多分お亡くなりになったでしょう。それでも、後に続こうとした人達がいてくれたおかげで自分達は、今河豚を食べることができるんだなあ猫
posted by 台北猫々 at 22:49| Comment(0) | TrackBack(0) | 日記

Windows版のgettimeofday関数です。

一応ミリ秒がとれます。まあ、タイマ分解能はOSに依存しちゃいますがね。

#include <windows.h>
#include <time.h>

struct timezone {
int tz_minuteswest;
int tz_dsttime;
};

#define EPOCHFILETIME (116444736000000000i64)

int gettimeofday(struct timeval *tv, struct timezone *tz)
{
FILETIME tagFileTime;
LARGE_INTEGER largeInt;
__int64 val64;
static int tzflag;

if (tv)
{
GetSystemTimeAsFileTime(&tagFileTime);

largeInt.LowPart = tagFileTime.dwLowDateTime;
largeInt.HighPart = tagFileTime.dwHighDateTime;
val64 = largeInt.QuadPart;
val64 = val64 - EPOCHFILETIME;
val64 = val64 / 10;
tv->tv_sec = (long)(val64 / 1000000);
tv->tv_usec = (long)(val64 % 1000000);
}

if (tz)
{
if (!tzflag)
{
_tzset();
tzflag++;
}

//Visual C++ 6.0でOKだった・・
//tz->tz_minuteswest = _timezone / 60;
//tz->tz_dsttime = _daylight;

long _Timezone = 0;
_get_timezone(&_Timezone);
tz->tz_minuteswest = _Timezone / 60;

int _Daylight = 0;
_get_daylight(&_Daylight);
tz->tz_dsttime = _Daylight;
}

return 0;
}



↓で構築したVisualC++ 2005 Express Editionで動作確認しました。
http://winter-tail.sakura.ne.jp/nmap/setup.html

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 21:07| Comment(0) | TrackBack(1) | 技術メモ(Windows C/C++)

2007年12月26日

高精度数値計算のC++→Java移植

をやり始めたわけですが、C/C++を結構忘れていることに愕然とさせられる今日この頃なわけで。。。

例えば、
int num[10];
int *p = num;
*p++ = 0;
で、*p++=0;ってどうなるんだっけ?てな感じ。
(*p=0;をしてp++;ということですよね。シーケンシャルアクセス)

あと、ちょっと悩んだのが、C/C++だとプリミティブ型(intとかshortとか)でも参照渡しかアドレス渡しをすれば関数内での値の書き換えが、呼び出し側にも反映されますよね。これをJavaでどうやろうかと。

とりあえずは、あまり修正量を増やすのが嫌だったので、例えば以下のような出力パラメタ用クラスを作って、それらしくしました。

private class RETURN {
public int val;
}

ともかく、正常動作を確認してから、リファクタリングしないと駄目だなあ。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 23:09| Comment(0) | TrackBack(0) | 日記

のきなみ解凍しちゃいます。

カレントにあるtar.gzファイルをのきなみ解凍しちゃいます。

#!/bin/sh

LIST=`ls | grep tar.gz`
for i in $LIST
do
echo "----"
echo $i
tar zxvf $i
done

exit
posted by 台北猫々 at 21:35| Comment(0) | TrackBack(0) | 技術メモ(シェル)

2007年12月25日

今日はクリスマス

だったんですね猫
posted by 台北猫々 at 21:45| Comment(0) | TrackBack(0) | 日記

PDFファイルダウンロードDE表示


/**
* ファイルダウンロード処理
* ダウンロードの際は「Content-Disposition: inline」により、
* ダウンロードダイアログが表示されず、ブラウザのプラグインで
* 開きます。
* @param filename PDFファイルのフルパス名
* @return 0:成功 -1:失敗
*/
public static function downloadPdf($filename) {
if( !file_exists($filename) ) {
return -1;
}
$filesize = filesize($filename);
header("Content-Disposition: inline; filename=".basename($filename));
header("Content-Length: " . $filesize);
header("Content-Type: application/pdf");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
header("Pragma: private");

$handle = fopen($filename, "rb");
while (!feof($handle)) {
echo fread($handle, 4096);
flush();
}
fclose($handle);
return 0;
}

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 21:15| Comment(0) | TrackBack(0) | 技術メモ(PHP)

HTTPヘッダについて(Expires)

PDFファイルダウンロードDE表示ファイルダウンロード処理でのHTTPヘッダについて、いくつかメモ。

"Expires: 0"については、以下を参照としています。
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21
>HTTP/1.1 clients and caches MUST treat other invalid date formats, especially including the value "0", as in the past (i.e., "already expired").

Expiresには、日付だけでなく「期限切れ」を表す"0"を設定することもできるとのことですね。

ただ、safariは"Expires: 0"の記述に対応していないという、不穏な噂があるような、ないような猫

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 20:51| Comment(0) | TrackBack(0) | 技術メモ

2007年12月24日

セマフォ削除(C++)

セマフォ生成したものを削除します。

try
{
/* セマフォキー値 OSで一意の値です */
long lnSemKey = 0x0000ffff;

errno=0;
int iSemId = semget(lnSemKey,1,(0666));
if(iSemId < 0)
{
throw -1;
}

errno=0;
semctl(iSemId,0,IPC_RMID,0);
}
catch(int r)
{
return(r);
}
return(0);
posted by 台北猫々 at 23:00| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2007年12月23日

PHP+MySQLでの文字エンコーディング設定

UTF-8で統一します。

HTMLファイルのエンコードを以下のように設定します。
HTMLからPHPに渡されるデータはUTF-8になります。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

さらにmy.cnf(my.ini)に以下のように設定を行います。init_connectを設定することで、クライアントから"SET NAMES utf8"を実行したのと同じことになります。つまり、クライアント→サーバのデータのエンコーディングがUTF-8であることを示します。

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
init_connect="SET NAMES utf8"

もしくは、

[mysqld]
default-character-set=utf8
init_connect="SET NAMES utf8"



他に"skip-character-set-client-handshake"というパラメータもあります。これは、クライアントからの文字エンコード指定を無視することになり、もし設定するとinit_connect="SET NAMES utf8"の意味がなくなるので、注意猫

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 12:47| Comment(0) | TrackBack(0) | 技術メモ

ファイルダウンロード処理


/**
* ファイルダウンロード処理
* ダウンロードの際は「Content-Disposition: attachment」により、
* ダウンロードダイアログが表示され、ブラウザのプラグインでは
* 開かないようになります。
* @param filename ファイルのフルパス名
* @return 0:成功 -1:失敗
*/
function download($filename) {
if( !file_exists($filename) ) {
return -1;
}
$filesize = filesize($filename);
header("Content-Disposition: attachment; filename=".basename($filename));
header("Content-Length: " . $filesize);
header("Content-Type: application/octet-stream");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
header("Pragma: private");

$handle = fopen($filename, "rb");
while (!feof($handle)) {
echo fread($handle, 4096);
flush();
}
fclose($handle);
return 0;
}

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 08:20| Comment(0) | TrackBack(0) | 技術メモ(PHP)

2007年12月22日

セマフォロック解除(C++)

セマフォロック(C++)したものを解除します。


#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

struct sembuf sembuff; // セマフォバッファ
memset(&sembuff,'\0',sizeof(sembuff));

try
{
/* セマフォキー値 OSで一意の値です */
long lnSemKey = 0x0000ffff;

errno=0;
int iSemId = semget(lnSemKey,1,(0666));
if(iSemId < 0)
{
throw -1;
}

errno=0;
if(semctl(iSemId,0,GETVAL,0) >= 1)
{
throw -2;
}
sembuff.sem_num = 0;
sembuff.sem_op = +1;
sembuff.sem_flg = SEM_UNDO;

errno=0;
while(semop(iSemId,&sembuff,1) < 0)
{
if(errno != EINTR)
{
throw -1;
}
}
}
catch(int r)
{
return(r);
}
return(0);


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 15:52| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2007年12月20日

XAMPPをデフォルトインストールでPHPでMySQLでエラーへの対処

「Fatal error: Call to undefined function mysql_connect() in 」

PHPから、mysql_connect()を呼び出そうとして時に↑のようなエラーが出た場合の確認ポイントです。

・phpinfo()の結果にMySQLのセクションがあるか?
・C:\xampp\apache\logs\error.logの内容
・C:\xampp\apache\bin\php.ini
→ extension_dir = "C:\xampp\php\ext\" となっているか?
→ extension=php_mysql.dll となっているか?
→ extension=php_mysqli.dll となっているか?
→ include_path = ".;C:\xampp\php\pear\"のようにダブルクオートでちゃんと閉じられているか?
・C:\xampp\apache\binにlibmysql.dllがあるか?
・C:\xampp\php\extにphp_mysql.dll、php_mysqli.dllがあるか?

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 23:14| Comment(0) | TrackBack(0) | 技術メモ

スペシャリストかジェネラリストか?

 多分、元々の気質はスペシャリストなのだと思います。ですが、新卒で入社した会社ではジェネラリストであることを期待されていて、その期待に応えようとし、その特質を身に付けました。
 
 そのため私の中では、スペシャリストの自分とジェネラリストの自分が共存しています。それが自分の強みである反面、自分にぶれ(一貫性の無さ)を生じさせます。

 今は人生の分水嶺。選択する時なのでしょうが、「為すべきは為さざるべきか、それが問題だ」的な気分です。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 22:51| Comment(0) | TrackBack(0) | 日記

2007年12月19日

セマフォロック(C++)

セマフォ生成が行われいること前提にします。
実際には、セマフォロックすると、別のプロセスが同じセマフォ(キーが同じ)をロックしようとしても待機状態になります。


#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
struct sembuf sembuff; // セマフォバッファ
memset(&sembuff,'\0',sizeof(sembuff));

try
{
/* セマフォキー値 OSで一意の値です */
long lnSemKey = 0x0000ffff;

errno=0;
int iSemId = semget(lnSemKey,1,(0666));
if(iSemId < 0)
{
throw -1;
}

sembuff.sem_num = 0;
sembuff.sem_op = -1;
sembuff.sem_flg = SEM_UNDO;

errno=0;
//ロックします。
while(semop(iSemId,&sembuff,1) < 0)
{
if(errno != EINTR)
{
throw -1;
}
}
}
catch(int r)
{
return(r);
}
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 21:32| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)