二十代は模索のときブログ」カテゴリーアーカイブ

大前研一「即戦力の磨き方」

即戦力の磨き方 (PHPビジネス新書)

即戦力の磨き方 (PHPビジネス新書)

以前にも取り上げた本書ですが、ちょっと空いた時間に読むために買ってみました。

やはり結論から言うと、大前氏はいつもと同じ事を言っていた。ホリエモンが取り上げられたりしているのに時代を感じるけど、初めて大前氏の本を読んだ何年か前とほとんど一緒の内容なのだ。大前氏がこれほどハイペースで本の出版が可能なのも、根底にあるアイデアは常に同じで、それを飾り付ける言葉やエピソードが違うだけだからなのだろう。同じことが和田秀樹氏にも言えそうだ。

とはいえ大前氏が繰り返し叫んでいる内容は、日本人ビジネスマンは真摯に受け止めるべきである思う。今回も明確に

  • 英語力
  • 財務力
  • 問題解決力

を身に付けるべしと論じている。特に英語に関しては僕も同意見だし、財務力(財務感覚と言ったほうが良いかも)は欧米に比べると日本人はまったく持っていない。自戒も込めてこれは事実だと言っておきます。問題解決力はつまるところ論理的思考能力、事実に基づいて論じる能力、ディスカッションする能力などのことを指しているようで、これも日本人に足りないところ。

あと本書では論じていないけど、「行動力」っていうのも大切かつ、日本人に不足している能力だと思う。コンビニで働いている中国人を見ると本当にそう思う。

日本独自の検索エンジン

Yahoo!ニュース:<検索エンジン>日本の30社・機関が独自開発へ

日立製作所や富士通、NTTなど電機、情報通信大手と東京大など国内の約30社・機関が共同で、日本独自のインターネット情報の検索エンジンの開発に乗り出す。16日にも研究組織を発足させ、2年以内の実用化を目指す。国も予算面などで支援する。
 検索エンジンは、インターネット上から必要な情報を探し出す検索サイトに使われている中核技術で、ネット情報の利用に不可欠。しかし、米国企業のグーグル、ヤフー、マイクロソフトの3者が市場をほぼ独占し、技術も公開していないため、ネット社会での情報の恣意(しい)的な管理や、日本企業の事業機会が失われることが懸念されていた。

こういうことを日本独自に行うというのは喜ばしいことであるが、出来るのかどうかが問題だ。誰がリーダーシップとって、どんな開発者が開発するのか分からないけれど、国が人選をするのでは多少不安。

共同開発するのは、検索エンジンの基礎部分。開発した技術は国内外で広く公開し、企業がネット広告や検索サイト運営など、それぞれの事業に合った形で利用できるようにする。利用者が部分改良を提案するなど、技術革新が進むことも期待できる。

これだけ読むと完全にGoogleを意識しているようですね。レイヤー0の部分から研究することによって、彼らよりも優秀な検索エンジンを開発できる可能性はあるだろうけど。

いずれにせよ、今後要チェックやわ。

追記:

CNET Japen : 「Google独占にはさせない」–国産検索エンジン開発へ、産学官が一致団結

プロジェクトの名前は「情報大航海プロジェクト・コンソーシアム」。7月設立予定で、国産の情報検索・解析エンジンを開発する。日立製作所やNEC、富士通といった企業のほか、早稲田大学や東京大学などの38団体が参加する。3〜5年後の実用化を目指す。

またすごい名前になったもんだな。

コンソーシアムでは開発した検索エンジンをオープンソースとし、広く公開していく考え。参加企業はこの技術を元にしたサービスを独自に開発して提供できる。

「参加企業は」の「は」が気になるんですけど、とすると参加していない企業はこれを元にしたサービスを独自に開発して提供できないのかな。それってオープンソースじゃないんじゃ。

すごく簡単なソケット通信をやってみる

Foundations of Python Network Programming

タイトル通りだけど、ほんとに単純なソケット通信をやってみる。本当は通信をする際には例外処理や終端文字指定、スレッド処理などたくさんやらなければならないことがあるのだが、それは少しずつ実装することにして、まず基本からやろう。

今回はサーバ側とクライアント側を想定して二つのプログラムを作った。同じPC内でポート番号15000を使って通信をする。クライアント側はタイプされた文字列を次々にサーバ側に送り、サーバ側は受け取った文字列を表示するだけである。その内容は以下のようにしてみた。

simpleserver.py

import socket
host = ''
port = 15000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(1)
print 'Waiting for connections...'
clientsock, clientaddr = s.accept()
while 1:
rcvmsg = clientsock.recv(1024)
print 'You received -> %s' % (rcvmsg)
if rcvmsg == '':
break
clientsock.close()

simpleclient.py

import socket
host = 'localhost'
port = 15000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
while 1:
print 'Type message you want to send...'
msg = raw_input()
if msg == '':
s.close()
break
s.sendall(msg)

listen(1)というのは、処理がマルチスレッドではないとして、いくつまでクライアントを待たすことを許すのか、という設定らしい。今回は1つだけ許すということになる。recv(1024)というのはソケットからデータを10KBだけ読み取るということ(今回は問題になりませんが、もしこのプログラムで10KBを超える文字列を送信すると、上手くいかないはず)。

サーバ側を先に実行し、クライアント側を次に実行する。幾つかの文字列を入力した実行結果は以下。

実行結果(クライアント側)

C:\Python24>python.exe simpleclient.py
Type message you want to send...
Hello world!
Type message you want to send...
I love you!
Type message you want to send...
Python is a great language.
Type message you want to send...

実行結果(サーバ側)

C:\Python24>python.exe simpleserver.py
Waiting for connections...
You received -> Hello world!
You received -> I love you!
You received -> Python is a great language.
You received -> 

特に問題なく送れているようです。今後はこれを基に色々と処理を追加していこうかな。

csvファイルをディクショナリで扱ってみる

初めてのPython 第2版

そう言えば、まだディクショナリを使ったことがなかった。いまいち使うシーンが想像できなかったので使ってなかったんだけど、無理やりcsvファイルを扱うことに対して使ってみます。

以下のモジュールreadcsv.pyはファイルemp.csvを読み込み、時給×労働時間をデータごとに計算するという簡単なプログラム。

readcsv.py

def readcsv(filename):
L = [line[:-1] for line in file(filename).readlines()]
return map((lambda s: s.split(',')),L)
csvlist = readcsv('emp.csv')
for line in csvlist[1:]:
empdict = dict(zip(csvlist[0],line))
payment = int(empdict['WAGE']) * int(empdict['HOURS'])
print empdict['NAME'],'->',payment

まずreadcsv関数の中では、csvファイルの各行を行末の1文字(改行記号)を抜いた形で取得し、それぞれの行をカンマで分割してリストにする。返り値は「各行が要素となっているリスト、が要素となっているリスト」になる。ここでは練習のために、リスト内包表記を使ってみた。

実行部では、先ほど作ったリストの1番目の要素(ヘッダー)、と2番目以降の要素を

empdict = dict(zip(csvlist[0],line))

という部分でディクショナリ化する。あとはそれぞれの要素にヘッダーの名前でアクセス出来るようになるので、それを使って給与計算を行い結果を出力している。この方法であれば、CSVファイルのカラムの順番などにも影響されない処理が組めるはず。

emp.csv

NAME,WAGE,HOURS
John,1000,8
Tom,1200,9
Jack,1100,8
Nick,1200,9
Shelly,1200,7
Bill,1000,8
David,1100,9
Ron,1000,8
Kate,1000,9
Mary,1100,9

実行結果。

John -> 8000
Tom -> 10800
Jack -> 8800
Nick -> 10800
Shelly -> 8400
Bill -> 8000
David -> 9900
Ron -> 8000
Kate -> 9000
Mary -> 9900

これと同じ方法で、DBからSQLにて取ってきたデータの処理も出来るはずだ。

モジュールについて勉強中

今は初めてのPython 第2版の第5部「モジュール」を勉強中なので、あまりコードを書く例がない。Pythonはリロードなどによりダイナミックにシステムの修正や改善を行えそうです。モジュールをディレクトリに分けるときは__init__.py作らなければいけないというのは忘れないようにしないと。

そろそろモジュール分けが必要になるくらいの、少し大きめのプログラムを組んでみてもいいかも。

この本もこの後はオブジェクト指向や例外処理の話になってくるので、Python特有と思われる部分の学習は終わりに近づいてきているのかな。そろそろ次のレベルに進みたいな。

村上氏逮捕

村上ファンドの村上さんが逮捕されて、あっちゃこっちゃで大騒ぎ。僕は個人的には全然興味ないんだけど、どうもテレビで見かける人々の反応には首をかしげてしまうことも。星野仙一監督が天罰発言を以前にしてた関係で、当時頭にきていただろう大阪のおばちゃんが「天罰や〜」と発言していたけど、これで本当に天罰になるのだろうか。我々が信じられないほどのお金持ちだろうし、インサイダー取引で何年かブタ箱入ることになったって、ちょっと我慢すればまた悠々自適の生活が待っているわけなんだし、そんな何年かを「天罰」なんて呼べるかな。今回の逮捕で溜飲を下したんだろうけど、彼に天罰下って欲しいって本気で思ってるんだったら「まだ足りないんじゃない」というのが僕の意見です。ちなみに僕は、村上氏に対して特に何も思っていない。彼も堀江氏と同じく、歯に衣着せない「成功者」だっただけだ。その内のどちらか一つの要素でも欠ければ、このように叩かれることもなかったであろう。

それにしてもたまたまテレビ付けてたら見ちゃったんだけど、昨日のアッコにおまかせ。なんだあの身体検査の下劣なイメージ図(まあ実際ああやるんだろうけど)。犯罪者だったらどんな風にさらしても構わないってことかい。ここの番組のディレクターかなんかは相当村上氏に煮え切らない想いでも持っていたんだろうか。子供はいないけど、子供がいたら正直見せたくないね、あの番組。昼間から止めて欲しいし、文句があったらストレートに「村上ざまぁみろ!」とか言って欲しいんだけどな。

それと日本人はもう少し「上場」の意味について考えた方がいいと思う。

ヘタなことは書き込めないってか

The NewYork Times : For Some, Online Persona Undermines a Résumé

When a small consulting company in Chicago was looking to hire a summer intern this month, the company’s president went online to check on a promising candidate who had just graduated from the University of Illinois.

At Facebook, a popular social networking site, the executive found the candidate’s Web page with this description of his interests: “smokin’ blunts” (cigars hollowed out and stuffed with marijuana), shooting people and obsessive sex, all described in vivid slang.

It did not matter that the student was clearly posturing. He was done.

企業が採用判断の一環としてSNSを見たり、志願者をWEBでチェックしているって話。そうすると志願者の思わぬ人柄が見えてくるということだろう。実名が主なアメリカだけに、ヘタなことは書き込めないという話ですね。なかなか興味深い記事です。

SNSやブログは、書きようによっては採用に大きくプラスの影響を与えることも出来ると思う。例えばそれなりに有名な技術系のブログを書いていれば、採用活動のときに担当者に「ここ見てください」とアピールすることも出来るだろうし、既に相手が知っていたとすれば話は早い。

いずれにせよ、あまり見られて困るようなことは書くべきではないね。

あるファイル内の単語数を調べる

初めてのPython 第2版

以前書いた「文章内の単語数を調べる関数」も、文字列のsplit関数とfilter関数の組み合わせで簡単に書き直せた。ちなみにsplit関数とは、文字列を指定した区切り文字で分割し、それぞれをリストの要素として返す関数である。今回は与えられた文字列を空白で分割するようにしている。

def countwords(s):
return len(filter((lambda c: c != ''),s.split(' ')))

これを応用して、今度はあるファイル内にある単語数を調べる関数を作成してみる。引数はファイルパス。

def countwords(s):
return len(filter((lambda c: c != '' and c != '\n'),s.split(' ')))
def countwordsinfile(file):
L = map(countwords,open(file).readlines())
return reduce((lambda x,y: x + y),L)

countwords関数を少しいじったのは、例えば改行だけの行があったときに1文字と認識されてしまう現象が起きたため。open(file).readlines()はファイル内の全ての行をリストの形で返してくれる便利な関数。map関数でそれぞれに行に対してcountwords関数で単語数を調べ、最後にreduce関数で各要素を足していく。

読むファイルは以下。改行コードとEOFは表現のしようがなかったので、とりあえず手書きで加えておきました。

news.txt

The declaration came after the deaths of at least seven Palestinian civilians on a Gaza beach\n
from an apparently errant Israeli artillery shell.\n
\n
Delphi expanded its buyout deal to include all U.A.W. members, signaling a stepped-up effort\n
to avoid a strike.\n
[EOF]

実行結果。

>>> countwordsinfile('news.txt')
41

一つの単語がcondi- tion と二行に亘る場合などに対応できてませんが、とりあえず出来ましたね。

シーザー暗号でも作ってみる

う、時間とネタがないので、今日はシーザー暗号でも作ってみます。暗号化する関数encryptcaesarと、復号する関数decryptcaesarを以下のように定義する。

caesar.py

def encryptcaesar(str,shift=1):
L = list(str)
return ''.join(map(chr,map((lambda s: ord(s) + shift),L)))
def decryptcaesar(str,shift=1):
return encryptcaesar(str,shift*-1)

文字列をリストに直すlist関数と、ある文字のASCIIコードを返すord関数、そしてmap関数を用いると一行で書けてしまいます。

実行結果。

>>> str = encryptcaesar('I love my wife!')
>>> str
'J!mpwf!nz!xjgf"'
>>> decryptcaesar(str)
'I love my wife!'
>>> str = encryptcaesar('Python is great',3)
>>> str
'S|wkrq#lv#juhdw'
>>> decryptcaesar(str,3)
'Python is great'
>>> 

いまどきこんなの暗号とは言えないけど、まあ基本ってことで。

reduce関数でニュートン法

楽しくなってきたんで続けます。

ゲームプログラムめも日記:平方根

会社のプログラム見ていたら、平方根を求める関数があったので、
Pythonで書いてみました。

(中略)

reduceを使えば、2行で書けることが判明しました…!

なんと便利な。早速真似して僕も実践。Newton法を用いてある数の平方根を求める関数mysqrtを作成する。繰り返しの回数が精度を決めるが、とりあえず10回を初期値としておく。

mysqrt.py

from __future__ import division
def mysqrt(x,loop=10):
return reduce((lambda a,x: a - (a**2 - x) / (2 * a)),[x]*loop)

実行結果。

>>> mysqrt(2)
1.4142135623730951
>>> mysqrt(3)
1.7320508075688772
>>> mysqrt(5)
2.2360679774997898
>>> mysqrt(10)
3.1622776601683791
>>> mysqrt(625)
25.0
>>> mysqrt(1024)
32.000000000000803

from __future__ import divisionをきちんと書かないと、割り算の結果が全て切り捨てられてしまうのでご注意を。今気付いたけど、これだと繰り返し9回が初期値か。まあいいや。

何年ぶりかに手書きでもニュートン法を計算してみましたが、プログラムのありがたさがよく分かります。

ちなみに以下のようにmathモジュールをインポートしても、sqrt関数が使えないんだけど何でなんだろう。マニュアル見てもこれで良さそうなのだが。

>>> import math
>>> sqrt(10)
Traceback (most recent call last):
File "<pyshell#56>", line 1, in -toplevel-
sqrt(10)
NameError: name 'sqrt' is not defined

追記:

ちなみに同じ関数をループ使って書くとこんな感じになった。やっぱりスマートじゃないな。

def mysqrt(x):
a = x
cnt = 0
while cnt < 10:
a = a - (a**2 - x) / (2 * a)
cnt += 1
return a