努力と才能のお話

為末大さんのtwitterでの一言が波紋を呼んでいる。

為末大が炎上!「努力は報われない」発言でネットで激論

誤解を恐れずに書くと、僕もほぼ同じ意見だったりする。
なかなか伝えるのが難しいのだけど、この投稿が一番分かりやすいかな。

https://twitter.com/daijapan/status/394491510088953857

為末さんと比較すると大変失礼になるが、
一応僕も中学、高校と種目は違えど陸上競技をやっていた。
そこには時計でタイムが計られ、数字で順列がついてしまう、
言い訳がきかない世界がある。

高校生くらいまでは、どんどん記録が伸びてくるのだけど、
ある時ぱたっと記録の伸びが止まってくる。
体の成長も止まって、技術やトレーニングもあるレベルに来ると、
当然そうなってくるわけだ。

球技のように対戦相手やチームメイトがいたりすると、
結果に対して色々なとらえ方ができる、
悪い言い方をすると「逃げ道」みたいなものがあるんだろうけど、
客観的な数字で順位をつけられると全く逃げ道がない。

高校時代の自分を思うと、とにかく愚直に頑張っていたとは思う。
今思うと、血中のヘモグロビン濃度が今より低い(若干貧血気味)とか、
ランニングフォームが完全に洗練されていないとか、
そういう方向の努力が足りないと言われればそうだと思うけど、
当時は一生懸命やっていたわけだよね。

で、そこで勝敗について、勝てないのは根性が足りないとか、
努力が足りないとか言われてしまうわけだ。
頑張っている人に言う「もっと頑張れ」は、実は結構残酷だ。

上手く行かないことをすべて努力の問題にしてしまう、
日本人はそういう傾向があるよねという話なのかなと思う。

で、じゃあ才能で99%が決まるなら、
努力はしても無駄かという議論になっているみたいだけど、
そういう話ではないわけだ。

努力してみてはじめてわかる感覚があるし、
上には上がいるなということを受け入れられるようになるには、
やれるところまで一度やってみた方がいい。
一度そういうのに行きつくと、自分に過信しなくなるし、
人との勝ち負けに執着しなくなって、
周囲の人の成功を喜べるようになるのかなと思う。

まとめると、努力しても無理なことは無理だけど、
だからといってそれを悲観する必要は全くないし、
チャレンジするのは素晴らしいことだということかな。

__________________________________________________

少し仕事に関連のある話をすると、
どれだけ長時間働いたかとか、
どれだけ寝ないで頑張ったとか、
そういう話が成功者の美談として語られることがあるし、
それを読んで長時間頑張る人も多いと思う。
そういう風潮があることが、努力至上主義の弊害なのかなと思う。

尊敬するビジネスパーソンから言われたことは、

「手を動かしているとやった気になるから、そうじゃなくて頭を使え」

と。あとは自分で色々試した感じとしても、
自分が一番成果を出しやすいスタイルというのがあって、
それでいいんじゃないかなと思っていたりする。

どちらかというと、追い込まれている時よりも、
余裕のある時の方が、いいもの作れているなぁと。

誰かに見せるためや、誰かに認めてもらうためにやっているのではなく、
自分のためにやっているわけだから、
(もちろん、株主様の為にもやっているわけですが)
自分の好きなやり方でいいんじゃないかなと。

nginxを一台のサーバーで複数動かす

「エンジンエックス」という読み方でこのスペルは正直やめて欲しい。
「nginx」とタイプする度にちょっと悩む分、0.1秒くらい遅延が出ている気がする。

一台のサーバーで複数のnginxを動かしたい。
そんなことせずにバーチャルドメインとかでなんとかしろよと言われそうだが、
nginxのモジュールを書きたいわけ。

本番環境のバイナリをいきなり更新するわけにもいかないから、
作ったモジュールの検証用に、もう一つのバイナリを動かしたいということだ。
そのための備忘録として。

普通にconfigureのオプションで –prefix=/usr/local/nginx_8080 などとして、
待ち受けるポートを8080に変更。
RedHatNginxInitScriptを元に、
起動スクリプトを2つ用意して、これで完了と思いきや…。

どうも起動スクリプトの挙動がおかしい。
8080版を起動しても終了できない上に、なぜかメインの起動スクリプトの方で、
8080版の状態を検知したりしている…。仕方ないので原因を調べてみる。

RedHatNginxInitScriptのrh_status関数の挙動がおかしい。
本番用のものだときちんと動作するのだが、8080版だけが正しく返って来ない。
こちらはLinuxの起動スクリプト用のライブラリ/etc/init.d/functionsのstatusを呼んでいるので、
そちらのソースを調べてみる。

status関数の中で色々出力させながら挙動を調べてみると、
__pids_pidof関数に原因がありそうだ。

# Output PIDs of matching processes, found using pidof
__pids_pidof() {
  pidof -c -o $$ -o $PPID -o %PPID -x "$1" || \
    pidof -c -o $$ -o $PPID -o %PPID -x "${1##*/}"
}

ああ、なるほど、pidofコマンドでnginxのpidを探しているらしい。
本番のバイナリは
/usr/local/nginx/sbin/nginx
8080版のバイナリは
/usr/local/nginx_8080/sbin/nginx
としてある。

pidofコマンドでnginxを調べると、どちらもHITするのだが、
nginx_8080を探すと、バイナリのファイル名が「nginx」のためかHITしない。
そのため、正しいpidを取得できなかったのが原因のようだ。

そこで対策を考えてみる。
起動や停止さえちゃんと動けばいいので、
/etc/init.d/functionsを利用しないでベタに書く手もあるのだけど、
なんかそれだとカッコよくない。
利用したままでの解決策を模索していると、
status関数とkillproc関数の上部にこのような記述が。

if [ "$1" = "-p" ]; then
  pid_file=$2
  shift 2
fi

ああ、-p pid_fileと引数の最初につけてあげれば、
pidfileを読んでpidを取得してくれるのね。

というわけで、起動スクリプトの方のrh_status関数の

status $prog

の行を

status "-p" $pid_file $prog

と変更してみると…。
うん。これで意図通り、双方バラバラにきちんと動くようになった。

あと、この起動スクリプト、まだイマイチなので少し手を入れる。
まず、pid_fileは何度も使うので変数として定義してあげる。
そして再起動についてはnginxの優雅な再起動のように、

restart() {
    configtest || return $?
    kill -USR2 `/bin/cat $pid_file`
    kill -WINCH `/bin/cat $pid_file.oldbin`
    kill -QUIT `/bin/cat $pid_file.oldbin`
}

として、停止をしないでの再起動をするように変更。
最終的な起動スクリプトはこんな感じ。

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   2345 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /usr/local/nginx/logs/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"
pid_file="/usr/local/nginx/logs/nginx.pid"
prog=$(basename $nginx) # 8080版の場合は prog="nginx_8080"などと直接指定

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc "-p" $pid_file $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    kill -USR2 `/bin/cat $pid_file`
    kill -WINCH `/bin/cat $pid_file.oldbin`
    kill -QUIT `/bin/cat $pid_file.oldbin`
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc "-p" $pid_file $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status "-p" $pid_file $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

8080版の場合は設定ファイルの位置などを修正するだけでOK。
これで一台のサーバーで複数のnginxが動かせたよ。

HOUSYリリースのお知らせ

前回の記事が思いの他ご好評いただいたようで、感謝しております。
本日は新しくオープンしたサイトのお知らせです。

リノベーション・リフォームのカタログサイト、HOUSYをリリースしました。

HOUSY

いつものように経緯などを詳しく書きたいところですが、
今回のプロジェクトの担当の谷郷が詳しく書いてくれるだろうと思うので、
そちらに譲ろうかと。

事例掲載は無料ですので、もし興味がある会社様などいらっしゃいましたら、
ぜひご連絡いただければと思います。

一般の人でも知っておいた方がいい不動産の知識

不動産業界じゃない、素人だからこそわかることもあると思っている。
プロじゃない一般の人でも、絶対に知っておいた方がいいことがある。

本日付で、レインズの利用規約が改訂された。

規程の改訂並びに新たな基準の制定について

「元付業者による正当な事由のない紹介拒否の禁止」というのが大きなポイントだ。

何を言っているかわからないと思うので、こちらに分かりやすい説明を記載してある。
ここで書いていある「囲い込み」ということが明確に禁止になるということだ。
(まだ正式リリース前だけど、この際出してしまえ!)

不動産流通の問題点

どれ程の効力があるかわからないけど、少し前進かな。
そもそも、今まで禁止されていなかったことがおかしいでしょ?

なぜ、不動産業界がこういうことになっているのか、
流通量が多い商品、たとえば家電などと比較して考えてみたい。

家電量販店などの場合、店員さんの方が圧倒的に商品知識が豊富だが、
だからといってお客さんの要望に関係なく、利益の高い商品ばかりを紹介したとすると、
いずれその評判が伝わり、そのお店の評判が下がり、売上も下がってしまう。
中長期的に考えると、「全う」な商売をしているお店が勝てる仕組みになっている。
信用がモノをいうのだ。

自分が社会人になったばかりの頃も、
誠実に仕事をすることが一番だと教えられた。

…ところが、不動産業界ではそうではないらしい。
理由は、不動産購入の機会は、多くの人にとっては生涯に1度だけ。
賃貸についてもそれほど回数は多くないし、
物件を比べて見ることもあまりできず、商品(物件)の比較ができない。

そのため、仲介業者の都合(利益が高いものや、今売りたいもの)で物件を紹介しても、
消費者はそれに気がつくことがない。
また、物件を売ろうとしても、そこにどういう問い合わせがあったのか、
なぜ売却に時間がかかるのか、そういったこともよくわからないまま、
仲介業者の意のままになってしまっていることがある。

about_1

もちろん、誠実に仕事をされている仲介業者も多くいるのだけど、
そうじゃない悪質な業者も多かったりする。
これでは自分が家を探す時に困るよね。

あとは、不動産業界の方々とお話する機会が増えた中で感じることは、
本当の「プロ」も少なからずいるということだ。

ただ物件を紹介するだけでなく、
まず、現状の収入や支出の状況、ライフプランから、
購入可能な金額や、ローンをどれくらいまで借りた方がいいかのアドバイス。
そして建物の瑕疵についての調査や、
将来の不動産価値の予測などから、
今その物件を買う場合のリスクなどをきちんと提示してくれるような、
ファイナンス、建物、不動産すべてに知識があって、
サポートしてくれるプロもいるわけだ。
そういう方に話を伺うと、すごいなぁと尊敬してしまう。

思うのだけど、ライフプランナーとかが評価されるのと同じで、
不動産仲介の分野においても、プロは尊敬されるべき仕事なんじゃないかと。

今回の改訂によって、少しずつ変わってくるといいなぁ。