Home > Archives > 2007-04

2007-04

Pythonで簡易Apacheログ集計

仕事でWebサイトの負荷テストをやっている時に、PVをその場で簡単に調べたい場面があった。
車輪の再発明と思ったが、勉強によい機会だと思いPythonでスクリプトを書いてみた。

使い方は、
python logcheck.py file [interval]

fileはログファイルを指定。(標準入力の時は「-」)

intervalはログ集計の間隔を秒数で指定する。
1秒ごとにPV集計したければ1、1分ごとに集計したければ60と入力すればOK。
これを作ったときに、1秒ごと、10秒ごと、1分ごとなどいくつかに分けてグラフを見たかったので。
デフォルトは60秒です。

特定のURLへのアクセスをみるときは、ログファイルをgrepしてパイプでつなげてこのスクリプトを呼んでください。

勉強だと思って無駄にジェネレータとかクロージャとか使っていて、分かりにくいソースになっているかもしれないけど、もし気付いたところとかあれば添削してもらえると嬉しいです。

logcheck.py

PYTHON:
  1. #!/usr/bin/env python
  2.  
  3. import sys
  4. import time
  5.  
  6. def logcheck(f, interval):
  7.     log_time = 0
  8.     access_count = 0
  9.  
  10.     # functions for log interval
  11.     def calctime(log_time_str):
  12.         log_time = int(time.mktime(
  13.                     time.strptime(log_time_str.split()[3][1:],
  14.                         '%d/%b/%Y:%H:%M:%S')))
  15.         return log_time - (log_time % interval)
  16.  
  17.     def makerange(start, end):
  18.         return range(start + interval, end, interval)
  19.  
  20.     def isnotnext(a, b):
  21.         return b <a + interval
  22.  
  23.     gen = getonerow(f, calctime)
  24.  
  25.     while True:
  26.         try:
  27.             x = gen.next()
  28.         except (ValueError, IndexError):
  29.             continue
  30.         except StopIteration:
  31.             printcount(log_time, access_count)
  32.             break
  33.  
  34.         if isnotnext(log_time, x):
  35.             access_count += 1
  36.             continue
  37.  
  38.         if log_time:
  39.             printcount(log_time, access_count)
  40.  
  41.             for i in makerange(log_time, x):
  42.                 printcount(i, 0)
  43.  
  44.         log_time = x
  45.         access_count = 1
  46.  
  47.  
  48. def printcount(log_time, access_count):
  49.     if log_time:
  50.         print "%s %i" % (time.strftime('%d/%b/%Y:%H:%M:%S',
  51.                             time.localtime(log_time)),
  52.                         access_count)
  53.  
  54.  
  55. def getonerow(f, func):
  56.     for l in f:
  57.         yield func(l)
  58.  
  59.  
  60. def main():
  61.     try:
  62.         if len(sys.argv) <2:
  63.             print 'arg error'
  64.             return
  65.  
  66.         if sys.argv[1] == '-':
  67.             f = sys.stdin
  68.         else:
  69.             try:
  70.                 f = open(sys.argv[1], "r")
  71.             except:
  72.                 print 'can\'t open file'
  73.                 return
  74.  
  75.         if len(sys.argv)>= 3 and int(sys.argv[2]):
  76.             interval = int(sys.argv[2])
  77.         else:
  78.             interval = 60
  79.              
  80.         logcheck(f, interval)
  81.     except KeyboardInterrupt:
  82.         print "stoped by user"
  83.  
  84.     f.close()
  85.  
  86. if __name__ == '__main__':
  87.     main()

四谷学院の電車広告に思うこと

最近電車に載っている四谷学院の広告がきになる。

「なんで私が東大に!?」
というキャッチーなフレーズで、
キャッチの意味=「勉強できなかった私が東大に入れちゃった、何でだと思う?」
というような印象を勝手に覚えていた。

ところがよく読んでみるとこんなことが書いてある。
「中高一貫の進学校で受験対策」
「大手予備校の特待生を断って、四谷学院へ入学」

キャッチを深読みしすぎたかな。
別に四谷学院じゃなくっても受かったんじゃないのっていう感じなのが、そこはかとなく面白い。

ちなみに広告はここにも載ってた。
http://www.yotsuyagakuin.com/cm.html

沖縄に行ってきた

所属している空手団体の旅行で沖縄に行ってのんびり?飲み疲れ?してきた。
いきなり更新をしばらく休んでしまったけど、ちゃんと更新を続けよう。

水族館のでかい水槽は圧巻だったな。
20070412same.jpg

SIerにとってのCash Cowと、大企業の20/80の法則

一年前のこのディフェンシブな開発というエントリーにもあるように、日本のSIにおけるビジネスモデルの問題点はいろいろと感じている人も多いと思う。

極論してしまうと、いかに少ない機能で多くの見積もりを承認してもらい、いかにその少ない機能を安く作って差額で利益を出すかというモデルになっている。
そんな考えばかりじゃ仕事がなくなっちゃうから、いいものを作ろうというエンジニア魂だってもちろんある。

でもそうはいっても、結局はサービス精神を出して「いいもの」を作っても利益が圧迫され、最低限のものを安く作るほうが利益にはつながるわけだ。

そんなことを感じて、
・もっと新しいビジネスモデル、契約形態を考えたい
・自分たちでサービスを立ち上げられないのか
・安全なプロジェクト運営ばかりではなくもっとチャレンジする取り組みを
・全員PMとかいうゼネコンみたいな方向性ってどうなの?
・技術で何かすることだってできるだろう
なんていう話を会社のある取締役を含めた会社のメンバーと議論した。

その取締役から、
「とがったことにチャレンジするのもいいが、会社としてのCash Cowはなんなのか。それが実は今あるSIをきっちりやることなのではないか。」
「そして、そのCash Cowがあるからこそ、新たな取り組みや、ピンの人たちによる会社としてのイメージリーディングになるような取り組みもできるのではないか」
そんな話を聞いた。

確かに図体の大きくなった会社としては、その話は一理あるなーと妙に納得した。
確かに、できるだけ予算やスケジュールを守って動くものを作ってくれて、お客様が自分の手を煩わせることなく運用までしてくれて・・・これが今のSIer、というかうちの会社の金のなる木なのは間違いない。(それが今後何年の間金のなる木になるのかは別として、少なくとも今後5年とかのスパンだと・・・)
そして、その足元を固めていくことも、会社の存続のために大事なことも間違い。

さらに
「それがわかった上で、さまざまな取り組みもしていきたいというのであれば、この会社はそれに応じる素養がある」
ともいっていた。
こういった取り組みをしていったらそれが次の花形を生み出すかもしれないしね。

大企業における20/80の法則も読んだ上で、こういう話を聞くといろいろ考えるな。
すぐに独立とかベンチャーでチャレンジしたいという気持ちもあるけど、80の人が支えてくれているこの会社で20の方に入っていろいろ楽しく仕事をするというのもありかなーと思ってしまうな。

いままでの技術的な遍歴 最近の話

引き続きその後の遍歴をまとめておく。

2005年に、せっかくネットの企画部門に来てるんだからブログをやってみよう。
一応技術の分かる人としてきてるんだから、レンタルサーバー借りてMovableTypeインストールしてみよう。
独自ドメインも取ってみよう。
なんか面白くなってきたからカスタマイズしてみよう。
php化するといいらしい。
XHTMLとCSS、面白い。

という感じでブログを立ち上げた。
ダイエットやトレーニングの話を、SEOも気にしながら更新していた。

最初は個人で情報を出してアクセスが来るという感覚は全く分からなかったけど、1日に100人以上のアクセスになってくると面白くなってきた。

ネタ切れ気味なこともあり、6ヶ月程度で更新が止まったままになっちゃったけど、ここでネットの楽しさ+自分で作る楽しさを再認識した。
(ちなみに最近でもGoogle Analysticsで見ると日に70人前後来ているようで、結構驚きです)

この辺がかなり転機になったかなーと思う。
普通にSEとかプログラマーとかいう職業だとしても、自分でサーバーを借りたり、自宅に立てたり、何かを作って公開したり、という人は少数派のはず。
それがやってみると、自分でサーバーを借りて何か作って公開するという敷居がこんなにも低いのかとすごい驚いた記憶がある。
プロマネがどうとか、インフラ担当がどうとか、上流工程がどうとか言う間に普通に動くものが公開できちゃう。もちろん規模が小さいからできることもあるけど、楽しみながら勉強にもなる。
これじゃー(意識の低い)職業プログラマは趣味プログラマに技術的に負けて当然ですよ。私も含めてだけど。

その後、PHPでちょっとしたものを作ってみたり、オブジェクト指向っぽい開発をしてみたり、Javascriptで遊んだりした。
次はPHPだけじゃ物足りなくなってきて、Pythonを触ってみたりMochiKitを触ってみたりしています。
フレームワークはDjangoとか。
ここで Ruby on Rails とか Prototype.js って言わないところがひねくれてる気もしますが、良しとしましょう。

これから色々勉強した話とか感じたこととか悩んでる話とかアップしながら、考え方も文章も技術もレベルアップしていきたいなーと思う。

いままでの技術的な履歴 社会人編

会社に入ってからは、結果的には逸注した案件の提案などに関わった後、ちょっとした在庫管理システムなんかを作った。画面はExcelVBA+Oracle。バッチはPL/SQL。

関連会社が作ったのがダメダメで、学生時代のVB経験を活かして画面系はほとんど作り直した。

それからWebっぽい仕組みなんかもちょっとしたシステムを作って、HTMLを覚えた。
Oracle Application Serverなるものがあって、PL/SQLでWebシステムを作るという今ではあまり見られなくなったこともやった。

本格的にWebシステムを作り始めたのが2年目の後半から。
勉強しながら全体アーキテクチャーを検討したり、開発標準を作ったり、いろんなことをした。
技術的にはC言語のCGI+Oracleだった。
Javaを動かすためののアプリケーションサーバーは、値段も高く、まだまだ不安定だという結論だった気がする。
プロジェクトもそこそこの規模だったので、マネジメントも勉強した。

Apache、Oracle、負荷分散、チューニング、DBのコネクションプーリング、いろいろなことをそこで学んだ。

でもそのころに思っていたのが、「やっぱり上流工程とかマネジメントだよ、技術は基本だけ抑えてればいい」だった。

それからは、プロジェクトの中でいろいろ仕事したり、お客様の支援でRFPを作ったり、開発チームのリーダーをしたり・・・。

そして転機が訪れたのが3年前。
なんとお客様の企画部門に常駐して、ビジネスから一緒に作るというコンサルちっくな仕事をしだした。

Webのビジネスを検討して素早く立ち上げたいが、企画側にシステム知見がないので困る局面が増えているから・・・というのが私が企画部門のお手伝いを始めた理由だった。
(システム部門は現行のシステムを立ち上げたりお守りしたりするので手一杯だった)

そしてそれからの話が、このブログの最初のエントリーというわけである。

これからは取りとめも無い話を進めますが、あとで自分で振り返るためにも今までの遍歴と今の考え方などをまとめておきました。

いままでの技術的な履歴 学生時代編

一応、今までの履歴をまとめておこうかな。

いわゆる優秀な「ナナロク」世代が、マイコンだとかベーシックだとかそういうのからITの世界に入ったというのを聞くとちょっとうらやましい。

というのも、大学に入るまでに触ったことがあるのはゲーム機とワープロ専用機(懐かしい!)だけ。
大学に入ってから初めてコンピューターの世界を知った。

Sunのワークステーションを使って、Pascalの授業もあった。
今思えば、条件分岐とかループとかの概念、本当に単純なUnixコマンドはそこで覚えたし、それなりに「ふーん、面白いな」と思ったこともあった。
とはいってもやっぱりやる気の無かった当時の自分には苦痛で苦痛で・・・。

なんといってもはなから自分で作るのはあきらめていて、人の書いたソースを丸写ししてるだけなのに動かない。
当然(?)人差し指しか使わない劇遅タイピングなのに加え、「0」と「O」とか、「1」と「l」とかをtypoしていると全く発見できなかった。
今思うとよっぽど頭を使ってなかったんだな。0とOなんて意味が違うんだから普通間違わねーよ!

そこで情報科の先輩から教えてもらって覚えた最大の必殺技は、他の人のファイルを自分にコピーしてくるというひどいものだった。

そんな状態だったのに、4年になって卒論を書かなきゃというときに自分でプログラムを書く必要に迫られてしまった。
やらないと卒業できないのでやるしかない。

とあるアルゴリズムを改良して、計算速度がどれくらい向上するかというのが研究テーマだった。

なのにそこで選んだ言語はVisualBasic。
理由は簡単そうだから。

しかしそこで奇跡が・・・というほどのことも無いんだけど、いろいろ考えて実装していると「こりゃなんか楽しいぞ」となってきた。
徹夜で実装したり、夜中に非力なPCを走らせておいたら次の日にはOSがハングしていて泣きそうになったり・・・そういうのも楽しく感じていた。

結果的にたいしたアルゴリズムは作れなかったけど、なんとか卒業もできた。

それからSIerに就職して今に至るんだけど、就職してからの履歴はまた次のエントリーで。

Home > Archives > 2007-04

Search
Feeds
Meta

Return to page top