Standardプランの契約ができたので、早速設定。

  • /etc/ssh/sshd_config
    1
    2
    3
    Port xxxxx # ポート番号変更
    PasswordAuthentication no # パスワードログインの禁止
    PermitRootLogin no # rootログインの禁止
  • 必要なパッケージの導入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ sudo su -
    # yum update
    # yum install zsh lv
    # chsh -s /bin/zsh
    # useradd hoge
    # passwd hoge
    # su - hoge
    $ chsh -s /bin/zsh
    $ exit
    # visudo
  • 公開鍵の登録とsshサーバの再起動、確認
  • パッケージのインストールと設定
    1
    2
    % sudo yum install mysql-server php-mysql
    % sudo vim /etc/httpd/conf/httpd.conf
  • iptablesの設定
  • PHPのインストール
    1
    2
    3
    4
    $ sudo yum install php-pear-Net-Socket php-pear php-common php-gd php-devel php php-mbstring php-pear-Mail php-cli php-imap php-snmp php-pdo php-xml php-pear-Auth-SASL php-ldap php-pear-Net-SMTP php-mysql
    $ sudo vim /var/www/html/index.php
    $ sudo /sbin/service httpd restart
    $ sudo rm /var/www/html/index.php
  • nginxのインストール
    1
    2
    3
    4
    5
    $ sudo /sbin/service httpd stop
    $ sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5Server/x86_64/epel-release-5-3.noarch.rpm
    $ sudo yum install nginx
    $ sudo chkconfig httpd off
    $ sudo chkconfig nginx on

と、ここまで設定して面倒になったので続きは後日。

 
このエントリーを含むはてなブックマークはてなブックマーク - DTIのServersMan@VPS Standardプランで最初にやったこと この記事をクリップ!Livedoorクリップ - DTIのServersMan@VPS Standardプランで最初にやったこと Googleブックマークに追加 Digg This
Tags: , ,


Ruby on Rails携帯サイト開発技法

  • 著者/訳者:伊藤 祐策 富田 陽介 三上 喜之
  • 出版社:ソフトバンククリエイティブ( 2010-04-30 )
  • 大型本:312 ページ

@yoshukiさんに献本していただきました。ありがとうございます。と言うわけで、書評を。

またもや端末識別番号問題

まず最初に残念な点を。最後の章でjpmobileを使わないで自前で機能を実装しているのですが、セッション管理に端末識別番号を利用してしまっています。これは高木さんがよく言われている由々しき問題で、エンジニアとしてはやってはいけないことのはずです。

ここまで破綻しているケータイID認証(簡単ログイン) on 高木浩光@自宅の日記

せっかくその前の章でSession Fixationの話がでたのに、最後にそれを台無しにしてしまう内容は、少し残念でした。Railsで携帯サイト開発の初の本なのでよけいに。書評でこんなこと書いてしまうのはどうかとも思ったのですが、携帯サービス開発をしている身としては、書かざるを得ませんでした。

あと途中から、あまりRubyのコードを書かない人なのかな?と思わせる部分が見受けられました。ifthenだったり、文中のメソッドがget_mobile_id()と括弧がついていたり。気になったのはその辺りでしょうか。

Railsで携帯サイト開発する人は一通り目を通すべき

とは言え、端末識別番号のこと以外ではお勧めできる本となっています。jpmobileの使い方からPCで絵文字を出す方法まで、かなり実践的な内容です。特にPCで絵文字は携帯/PC両対応のサイトを作るときには必ず出てくる問題で、それが詳しく書かれています。Railsで携帯サイト開発をする人は、一度は目を通しておいて損はしないでしょう。

そしてまとめ

これはもうjpmobile on 3という本を書くしかないですよね(多少違う)。先を越された感をぬぐい去れないので、@yoshukiさんとはどこかで飲み明かしたいと思いました。さてjpmobileがんばろう。

 
このエントリーを含むはてなブックマークはてなブックマーク - Railsで携帯サイトを作るには – Ruby on Rails携帯サイト開発技法 この記事をクリップ!Livedoorクリップ - Railsで携帯サイトを作るには – Ruby on Rails携帯サイト開発技法 Googleブックマークに追加 Digg This
Tags: , , ,
2010/04/26  |  Written by  |  under Blog

気になったので、How fast is FLUSH TABLES WITH READ LOCK?の意訳。

FLUSH TABLES WITH READ LOCKってどれだけ時間がかかる?

ちょっとまえのMySQLカンファレンスでバックアップソフトのベンダーのとこに行ったんだ。で、バックアップソフトについて話をし始めたんだけど、それはデータベース全体のロックを取得する、FLUSH TABLES WITH READ LOCKを使ってるということだった。でも彼は、ロックは「数ミリ秒」しかかからないと誇らしげに語ってた。バックアップソフトベンダーはそう思っているようだが、これは大きな勘違いだ。

実際にはこのコマンドがロックする時間はわからない。研究室のテスト環境ではそりゃミリ秒で終わるかも知れないが、実際にはもっと時間がかかる。数分から下手すれば数時間もかかることがあるだろう。そしてこの間、サーバは完全にロックされる(readonlyでもないんだ!)。なぜそうなのか、このコマンドが何をしてるか見てみよう。このコマンドには、いくつか重要な処理が含まれている。

ロックのリクエスト

FLUSH TABLES WITH READ LOCKコマンドは、すぐにグローバルロックを要求する。すると、そのロックが許可される前に、システムの中で動作している全てのプロセスがロックアウトされる。理論上、結局は読み出しのロックを取得するだけなのだから、このことは悪いようには見えない。他の読み出しロックだけが必要なコマンドとは、共存できるはずだ。

でも実際には、多くのテーブルは読み書きされている。最初の書き込みクエリーがグローバルロックによってブロックされると、それに続く読み出しクエリーは、その前の書き込みクエリーが要求したテーブルロックによってブロックされる。結局、実質的にテーブルは排他ロックされてしまい、新しいリクエストは全てブロックされてしまう。読み出しのクエリーでさえも!

ロックを待つ

FLUSH TABLES WITH READ LOCKがロックを取得する前に、ロックを持っている実行中のものは全て終わらなければならない。要するに、SELECTも含めて、全てのクエリーが終わる必要がある。もしすごい時間のかかるクエリーが動いていたり、テーブルロックするトランザクションがあったりすると、FLUSH TABLES WITH READ LOCKは全ての処理が終わってロックが解放されるまでブロックされることになる。これには結構な時間がかかるんじゃないかと思う。僕にとっては顧客のサーバにログインして走ってるクエリーを見ることなんて珍しくないこと。FLUSH TABLES WITH READ LOCKの前に、こういうクエリーが走っていたりすると、結果はさんざんなことになる。

このプロセスが動いているときにシステムがどう見えるかについて、例を示そう。

1
2
3
4
5
6
7
8
9
10
mysql> SHOW processlist;
+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+
| Id | User | Host      | db   | Command    | Time | State             | Info                                                                 |
+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+
|  4 | root | localhost | test | Query      |   80 | Sending DATA      | SELECT count(*) FROM t t1 JOIN t t2 JOIN t t3 JOIN t t4 WHERE t1.b=0 |
|  5 | root | localhost | test | Query      |   62 | Flushing TABLES   | FLUSH TABLES WITH READ LOCK                                          |
|  6 | root | localhost | test | FIELD List |   35 | Waiting FOR TABLE |                                                                      |
|  7 | root | localhost | test | Query      |    0 | NULL              | SHOW processlist                                                     |
+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+
4 rows IN SET (0.00 sec)

Id 6の接続はログインできていないことがわかる。これはMySQLのコマンドラインクライアントが-Aオプション付きで起動されていて、テーブルとカラムのリストを取り出そうとタブ補完しようとしたところだ。また「Flushing tables」と言うのも間違っている。まだテーブルをフラッシュしていない。ロックを得ようと待ってるだけなんだ。

テーブルのフラッシュ

FLUSH TABLES WITH READ LOCKがようやくロックを取得すると、データのフラッシュが始まる。でも全てのストレージエンジンに適用される訳じゃない。MyISAMは通常処理中ではディスクにデータをフラッシュしようとはしないにもかかわらずだ。MyISAMはOSが適切なときにディスクにフラッシュすることを当てにしている。結果的に、MyISAMが多いとOSのバッファにダーティーなのが多くなってしまい、フラッシュするのに結構な時間がかかってしまう。この間、システムはロックされたままになってしまい、全てが終わってようやくFLUSH TABLES WITH READ LOCKは完了し、レスポンスを返すことになる。

ロックの保持

このコマンドの最後の部分は、ロックが保持される時間。このロックはUNLOCK TABLESや他のいくつかのコマンドで解放される。FLUSH TABLES WITH READ LOCKを使っているたいていのバックアップシステムでは、ロックの間の処理は、ファイルシステムのスナップショットの初期化のような比較的短い時間で終わる。だから実際には処理の中で非常に短い時間を費やすだけのことが多い。

結論

実環境で動作するバックアップシステムは、FLUSH TABLES WITH READ LOCK willが瞬時に完了すると仮定するべきではない。非常に時間がかかる場合があるからだ。例えばMyISAMとInnoDBが混在している場合がそう。でも多くの場合は混在させたりしないし、バックアップシステムがグローバルロックを回避するように設定できるはずだ。InnoDBのみの場合だと、ロックを取得する必要はないはずだ。だからロックフリーなバックアップをとれる。バックアップベンダーはこのことを考慮して製品を開発すべきだ。

まとめ

MyISAM使っていると、FLUSH TABLES WITH READ LOCK willが瞬時に終わらない場合があるので注意。あとInnoDBだとそもそもロック取得しなくてもいいから、別の方法を使うべき。要調査。

 
このエントリーを含むはてなブックマークはてなブックマーク - FLUSH TABLES WITH READ LOCKの速度について この記事をクリップ!Livedoorクリップ - FLUSH TABLES WITH READ LOCKの速度について Googleブックマークに追加 Digg This
Tags: ,
2010/04/23  |  Written by  |  under Blog

型をt.binaryなどとすると、デフォルトではBLOBとなってしまい、64KiBまでしか保存できなくなってしまいます。そこで:limit => 1.megabyteとオプションで制限を大きめに書いてやると、Railsが勝手に拡張してMEDIUMBLOBにしてくれます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class CreateImages < ActiveRecord::Migration
  def self.up
    create_table :images do |t|
      t.binary  :data, :limit => 1.megabyte
      t.integer :stat

      t.timestamps
    end
  end

  def self.down
    drop_table :images
  end
end
1
2
3
4
5
6
7
8
9
10
11
mysql> desc imags;
+----------------+------------+------+-----+---------+----------------+
| Field          | Type       | Null | Key | Default | Extra          |
+----------------+------------+------+-----+---------+----------------+
| id             | int(11)    | NO   | PRI | NULL    | auto_increment |
| data           | mediumblob | YES  |     | NULL    |                |
| stat           | int(11)    | YES  |     | NULL    |                |
| created_at     | datetime   | YES  |     | NULL    |                |
| updated_at     | datetime   | YES  |     | NULL    |                |
+----------------+------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
 
このエントリーを含むはてなブックマークはてなブックマーク - RailsでMySQLのMEDIUMBLOBを使いたいとき この記事をクリップ!Livedoorクリップ - RailsでMySQLのMEDIUMBLOBを使いたいとき Googleブックマークに追加 Digg This
Tags: ,

いろいろ準備が必要なので順番に。

rootになれるようにする

基本的にはblogSetomits : GDD Phone の標準 1.6 ROM で Rootedを参考にしてます。まずAndroid SDKをインストールしてtoolsディレクトリにパスを通しておきます。あとHTCのsigned-jdd-ota-14721.zipとAuto-sign.zipは別途ダウンロードしておきましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
% cd ~/Works/android
% mkdir signed-jdd-ota-14721
% cd signed-jdd-ota-14721
% unzip ~/Downloads/signed-jdd-ota-14721.zip
% cd signed-jdd-ota-14721/META-INF/com/google/android/
% rm update-script updater-script
% wget http://dl.dropbox.com/u/227579/gddphone/1.6/update-script
% wget http://dl.dropbox.com/u/227579/gddphone/1.6/updater-script
% cd ~/Works/android
% wget http://upld.komugi.net/Android/ota1.6su_patch.zip
% mkdir ota1.6su_patch
% cd ota1.6su_patch
% unzip ../ota1.6su_patch.zip
% cp -rf system ../signed-jdd-ota-14721
% cd ../signed-jdd-ota-14721
% zip -r update.zip META-INF boot.img radio.img system
% cd ../
% unzip Auto-sign.zip
% cd Auto-sign
% java -jar signapk.jar testkey.x509.pem testkey.pk8 update.zip update_signed.zip
% adb push update_signed.zip /sdcard/update.zip
% adb shell sync

そしたら電源長押しで電源を切って、ホームボタン押しながら電源を入れます。次にホームと電源ボタンを押すとメニューがでるので、apply sdcard:update.zip [Alt+S]を選んでトラックボールをクリック。しばらくすると終わるので、reboot system now [Home+Back]を選んでクリック。またしばらくすると起動するので、rootになれるか確認。

1
2
3
% adb shell
$ su
#

リカバリーモード用プログラムのインストール

またしてもblogSetomits : GDD Phone の ROM を OpenEclair 1.2.2 にを参考にして作業します。ほんとにお世話になります。

1
2
3
4
5
6
% cd ~/Works/android
% wget http://youspookedfelicity.com/dwang/dwang-v1.17.1.zip
% mkdir dwang
% cd dwang
% unzip ../dwang-v1.17.1.zip
% adb push system/bin/flash_image /sdcard

次にここからrecovery-RA-sapphire-v1.6.2G-blue.imgをダウンロードします。

1
2
3
4
5
6
7
8
% cd ~/Works/android
% mv ~/Downloads/recovery-RA-sapphire-v1.6.2G-green.img ./
% adb push recovery-RA-sapphire-v1.6.2G-green.img /sdcard
% adb shell
$ su
# mount -o remount,rw /dev/block/mtdblock3 /system
# flash_image recovery /sdcard/recovery-RA-sapphire-v1.6.2G-green.img
# mount -o remount,ro /dev/block/mtdblock3 /system

なんか途中でエラーメッセージが表示されるが気にせず続行。

1
% adb push CaNNoN202-CompleteEclair-v20_B.zip /sdcard

あとは先程と同じようにリカバリーモード(HOME+電源)で起動して、WipeFactory resetしたあと、Flash zip from sdcardから先程のzipファイルを選択して実行します。

しばらくするとアニメーションととももに起動して、晴れて新しいROMを使うことができます。

さて、これにdocomoのSIMを入れてあれこれやってみるかな。

 
このエントリーを含むはてなブックマークはてなブックマーク - GDD PhoneにComplete EclairというROMを入れてみた この記事をクリップ!Livedoorクリップ - GDD PhoneにComplete EclairというROMを入れてみた Googleブックマークに追加 Digg This
No tags for this post.
2010/04/21  |  Written by  |  under Blog

やはりユーザに優しくないから。あと記事を書くことが目的で、ブログシステムとかCMSを作るのが目的じゃなかったから。

ユーザに優しいWordPress

MovableTypeと並んでCMSの双対をなしていると思われるWordPressですが、ユーザ数が多いだけあって情報もプラグインも豊富でした。また公式サイトにしっかりしたインストールマニュアルがあることもポイントの一つです。こういった「ユーザに優しい」姿勢というのが、世に広く受け入れられる事につながるのでしょう。

じゃあ、tdiaryがユーザに優しくないかというと、Rubyistにはそうではないでしょう。だってコード読めばわかるし。必要な機能がないなら自分で実装してしまえばいいですからね。でもその方向に行ってしまうと、カスタマイズに注力してしまって、なんか本末転倒な気がしてしまうのです。一時期はtdiaryで環境を作り始めたのですが、「なんかコード書いているのがメインになってきている」と感じたので諦めました。

Railsのものにしなかったのも、それと同じような理由からです。「なければ作ればいいじゃないか」と言うのもいいのですが、「なかったから別のにしました」でもいいんじゃないかと思うわけです。と言うわけで、しばらくはWordPressでPHPと戯れていたいと思います。

 
このエントリーを含むはてなブックマークはてなブックマーク - tdiaryやRailsにしなかった理由 この記事をクリップ!Livedoorクリップ - tdiaryやRailsにしなかった理由 Googleブックマークに追加 Digg This
Tags: , ,
2010/04/20  |  Written by  |  under Blog

来るGo!肉の日(5月29日(土))に、TokyuRuby会議02が開催されます。それに伴い、LT発表者の募集が始まっています。

TokyuRuby会議02

一見するとすごい敷居が高そうですが、何を隠そう、単なる飲み会です(違。みんなが飲んでいる間に、好き勝手喋ることができる、LTデビューにはもってこいのイベントです。内容もRubyと言う単語が入ってさえいれば、内容は問いません。プレゼンのタイトルに「TokyuRuby会議02」とか書くと、あとは何でもいいってことですね、わかります。

ちなみに今回も司会をすることになっているので、打ち合わせさえしてもらえれば合いの手を入れることも可能です。むしろコント化してもいいかもしれません。無限に可能性が広がるLT、それがTokyuRuby会議です(言い過ぎ。

と言うわけで、肉と酒が好きな方は(そうでない方も)、是非ご応募ください。

 
このエントリーを含むはてなブックマークはてなブックマーク - TokyuRuby会議02 LT発表者募集中 この記事をクリップ!Livedoorクリップ - TokyuRuby会議02 LT発表者募集中 Googleブックマークに追加 Digg This
Tags: , ,

やっぱりApacheのメモリ消費量が多い気がしてきたのでnginxに移行しました。要点としては、mod_phpのようなものはないため、FastCGIでPHPを動作させる必要があると言うこと。

インストールは大して難しくないのですが、いかんせん日本語での情報が少ないのが難点です。基本的には公式wikiPHP/FastCGI Exampleを参考にすれば問題ありません。以下、Debian (lenny) での作業ログです。
まずは必要なパッケージをインストールします。その前に、必要に応じてApacheを停止しておきます。

1
2
% sudo invoke-rc.d apache2 stop
% sudo aptitude install php5-cgi nginx

次にFastCGI用daemonのスクリプトを作成。

1
% sudo vim /etc/init.d/php5-fastcgi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash
BIND=127.0.0.1:9000
USER=www-data
PHP_FCGI_CHILDREN=2
PHP_FCGI_MAX_REQUESTS=1000

PHP_CGI=/usr/bin/php5-cgi
PHP_CGI_NAME=`basename $PHP_CGI`
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"
RETVAL=0

start() {
      echo -n "Starting PHP FastCGI: "
      start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS
      RETVAL=$?
      echo "$PHP_CGI_NAME."
}
stop() {
      echo -n "Stopping PHP FastCGI: "
      killall -q -w -u $USER $PHP_CGI
      RETVAL=$?
      echo "$PHP_CGI_NAME."
}

case "$1" in
    start)
      start
  ;;
    stop)
      stop
  ;;
    restart)
      stop
      start
  ;;
    *)
      echo "Usage: php5-fastcgi {start|stop|restart}"
      exit 1
  ;;
esac
exit $RETVAL

作成したら実行権限をつけて自動起動の設定をし、起動しておきます。

1
2
3
% sudo chmod a+x /etc/init.d/php5-fastcgi
% sudo update-rc.d php5-fastcgi defaults
% sudo invoke-rc.d php5-fastcgi start

次にnginxの設定です。DebianではApacheと同じく、/etc/nginx/site-availableに設定ファイルを入れて、有効にしたいものだけ/etc/nginx/site-enabledにシンボリックリンクを張る感じになります。今回は/etc/nginx/site-available/wordpressと言うファイル作ります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# for wordpress
upstream wordpress {
  server 127.0.0.1:9000;
}

server {
  listen   80 default;
  server_name  stnard.jp;

  location / {
    root /var/www;
    index index.php index.html;

    # static files
    if (-f $request_filename) {
      expires 30d;
      break;
    }

    # request to index.php
    if (!-e $request_filename) {
      rewrite ^(.+)$  /index.php?q=$1 last;
    }
  }

  location ~ \.php$ {
                fastcgi_pass   wordpress;
                fastcgi_index  index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name;
  }

  location ~ /\.ht {
    deny all;
  }

  access_log  /var/log/nginx/wordpress.access.log combined;
  error_log  /var/log/nginx/wordpress.error.log;
}

作成したらシンボリックリンクを張って、設定ファイルの構文チェックをします。ついでにデフォルト設定のシンボリックリンクは削除しておきます。

1
2
3
4
5
6
% cd /etc/nginx/site-enabled/
% sudo ln -s /etc/nginx/site-available/wordpress ./
% sudo rm default
% sudo nginx -t
the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful

上記で問題なければ、nginxを起動して動作確認。

1
% sudo invoke-rc.d nginx start

移行してみた感想としては、Apacheよりも何倍も高速になった気がします。恐らくはFastCGIをdaemon化したことが大きいのでしょうが、体感できる高速さはやはり魅力です。用途に応じてnginxやlighttpdなどの高速Webサーバを試してみるのもいいのではないでしょうか。

 
このエントリーを含むはてなブックマークはてなブックマーク - WordPress on nginx with FastCGIに移行してみた この記事をクリップ!Livedoorクリップ - WordPress on nginx with FastCGIに移行してみた Googleブックマークに追加 Digg This
Tags: , ,


と言うわけで注文しました。x68kと言われては買わざるを得ません。これで人生決まったようなもんだし。

 
このエントリーを含むはてなブックマークはてなブックマーク - フェルガナの誓いと言うよりx68kサントラのために この記事をクリップ!Livedoorクリップ - フェルガナの誓いと言うよりx68kサントラのために Googleブックマークに追加 Digg This
Tags: ,
2010/04/18  |  Written by  |  under Blog

最近よく、「経営者が技術者の会社がいいよねー」的な話しをするのですが、一概にそれが良いかどうかを考える時があります。

技術者のことを理解できるのは技術者だけなのか

確かに経営者が技術者だと、社員である技術者の気持ちやトレンドをよく理解してくれそうな気になります。確かにそれはあるのですが、逆に理解しすぎて本当に大事なことをおろそかにしてしまう可能性があります。技術者といっても仕事をしてお金を稼いでるわけです。それを大事にしないで、技術者のこだわりや気持ちを重視してしまうことがあるのではないかと、最近思うようになりました。

またここで言う「理解する」というのも、ちゃんと考えなくてはいけない部分です。単に「技術者側に立つ」だけでは理解した事になりません。よく「本当に貴方のことを思ってやってるんですよ」的な話がありますが、短期的ではなく長期的に見たときに、「ああ、ちゃんと理解してたんだな」となることが、「理解して」いたことになるのではないでしょうか。こういうのって人に説明し辛いし、その場ではわかってもらえないことが多いので、「まあ、とりあえずはいいか」と短期的に賛同を得られる方に進んでしまいケースが多いんじゃないかなと思ってます。

経営者と技術者を同時にできるかどうか

と言うのも、世の中で技術者主導の会社というのは結構あるのですが、うまく行っているところばかりではないと、よく聞くからです。技術者が経営者になるというのは、簡単なことではないでしょう。仙台Ruby会議02でいろんな話を聞きましたが、みなさんかなり苦労している感じでした。やはり、考え方が違う2つの職種を同時にこなそうとするのは大変で、どちらの立場もわかる苦しさがあるのだなと感じました。

ちょっと考えがまとまらないところなのですが、この点についてはいろいろと書いていきたいと思っています。

 
このエントリーを含むはてなブックマークはてなブックマーク - 技術者経営者がいいかどうか この記事をクリップ!Livedoorクリップ - 技術者経営者がいいかどうか Googleブックマークに追加 Digg This
Tags: , , ,