いい仕事したいじゃん

改めて思った 2 + 1 のこと

最近、人に話すことで改めて自分の思いに気づいたことが二つある。

  • いい仕事をしたい
  • 中小企業には時間も人手も余裕はない

軽く掘り下げて書き残しておきたい。そして書いている途中で出てきたのが

  • 老害になりたくない

である。これも残しておこう。いつか振り返ったときにいろいろ思えるかもしれない。

いい仕事したいじゃん

「いい仕事」という言葉はいろいろな意味を含む。人によって定義が変わってしまう曖昧な言葉とも言えるけど、ここではとりあえず曖昧なまま行ってしまっていいんじゃないかと感じている。エンジニアにはエンジニアの、営業には営業の、会計には会計のいい仕事があるはずだ。それでいいと思う。

正直なところ自分は何もしなくていいなら何もしたくない人間だ。好きなことだけダラダラできるならこんな素晴らしいことはないと思うし、それでも恐らくヒマで困っちゃうようなタイプではないと思っている。

ところが残念ながら現実はそう甘くない。仕事しないと生きていけない。社会が抱えるあまりに大きな負債について「なんでこんなアホな話ばっかなんだ」と思うことは多いけれど、ひとまずそれを置いて目の前の問題に対処しなければいけない。つまり仕事するのだ。

どうせやり続けなくちゃいけないのならば「いい仕事」をしたいと自分は思うタイプである。アジャイル的には「お客様の満足」と言うのがここはかっこいいところなんだけど、あまり一つの言葉で置き換えてしまいたくはない。将来の自分が開発しているとも限らない。

中小企業には時間も人手も余裕はない

これは大きな会社でも特に真面目に国内トップレベル、あるいは世界レベルで「競争」しているところも同じかもしれない。要するに

余っているものなんか何もない

のだ。だから「本当に必要なの?」と疑問に感じるような仕事はどんどん見直さなくちゃいけない。

例えば IT の世界でよく聞くのは

  • のちにちゃんと振り返りもしないのに大量に書かされる言い訳文書
  • メンテナンス性、検索性の悪い Excel 仕様書
  • 重すぎてまともに作業できない Excel のバグ票
  • 仕様書と合ってないコード
  • 酷似しているのに微妙に違う大量のコピペコード
  • 意図を伝えず動作だけを説明する「意味のない大量のコメント」
  • 作業効率を著しく落とす「コメントアウトされた前バージョン」

これらはすべて現実によくある話1。ここで挙げたのは大まかに

  • 無駄な文書、無駄なコード
  • 作業効率の悪い文書フォーマット、作業効率の悪いコード(読みにくいコード)

に集約される。

つまり日々の生産性を確実に落とすものたちだ。ということは全部見直しの対象である。見直さないと、本来達成すべき「価値」ではなく「作業」に自分の「手」と「意識」を奪われてしまう。

しかしここで問題になるのが多層下請け構造。元請けなら文書、コードのルールは自由に設定できるが、下請けの場合はそうもいかないこともよくある。幸い自分はそういう環境にはないので、直せるところは直していかないと

競争力を失って退場させられてしまう。

それが我々の生きる世界なのだ。

老害にはなりたくない

あれ、三つ目がでてきてしまった。

書いてるうちに再確認できたことがもう一つあった。自分は

老害にはなりたくない

んだなと強く思った。

上に挙げた問題は基本的に

過去を踏襲しているだけの作業が新たな価値の創造を阻害している

と言えると思う。つまりかつてはそれが最善と思われたのでそうなったのだ。多少好意的解釈を多めに加える必要はあるが。しかし今はより適切な道具を適切に使いさえすればもっと良い作業に変えることができる。少なくとも

  1. 現代的なバージョン管理システム
  2. 現代的な Issue Tracking System

を正しく運用すれば、上の問題の多くは解消できる。もちろん導入しただけですべて解決するわけではない2が、少なくともルーチンワークのコストを下げる準備はできる

だからこの二つは最低限達成しなければいけない。

しかしそこで浮上してくるのが

教育/学習コスト

の問題である。

ここは残念ながら失うものの多いベテランの抵抗が強い。年を取れば取るほど新しいものの習得は億劫になるし、ヨーイドンで同時に学習を始めたら若いやつにかなう訳がない。気持ちは分からなくはないが、もうその状態は老害になっていると思った方がいい。

自分を振り返って、自分の周りの人間を観察して思い当たることはないだろうか。はっきり言って自分で触ってもいないのにしたり顔で○○の批評をするやつは老害だ。年齢は関係ない。気をつけて掛からなきゃいけない。○○には何を入れてもいい。ちょっと前ならスマートフォンが入るし、とりあえず新しめのものを入れればだいたい成り立つ。

自分は今ちょうど境目にいると思っている。今はまだ老害ではないが、ちょっと学ぶ意欲が足りなくなったらあっという間に老害になる危険を感じている。学ぶ意欲というのは個性かもしれないが環境の問題もやはり大きい。老害になった方がいいかもしれないと感じてしまうようなら、「見捨てる」結果になるとしても、環境を変えた方がいいのかもしれないとも思う。

あるいは例えば新しい技術についての判断はしない、ただの老として生きるか。今の自分はまだ老害に腹を立てる側の人間である。つもりだ。しかしいつか労害になり得る。いつかストップを掛けてしまう側の人間になる。そのときにはもうその判断をしない立場にならなければいけないのではないかとも思っている。

  1. プロダクトオーナーの意思と合ってない仕様書はまた別な話。 

  2. 少なくともバージョン管理するだけではクソコードは良くならない。バージョン管理したうえで無駄をどんどん削ぎ落としていく作業は必要である。 

CGI を rackup してみた

Ruby は自分の大好きな言語だが、実は長く運用する Web アプリを Ruby で書いたことはない。cgi.rb の評判はずいぶん前から芳しくないし、決定打となるフレームワークの不在が長く続いたこと、すでに PHP を使っていたことが大きな理由だった。

Rails が登場した。勉強した。「うーん、なんか DBMS とか要らないんだけど、どうしたらいいのよ?」と思っているうちに世間ではすっかり定着、代わりに自分の中では興味は薄れていった。そうこうしているうちに Rails の問題点もちょこちょこ指摘されるようになり、prototype.js とともに先駆者ゆえの苦難を味わっているなぁと感じている今日この頃。

Merb だなんだと言われていた中、Rack が登場した。これだ!と思った。こういうシンプルなやつが欲しかったんだよ! しかしそれから特に何の理由もないまま一年半の月日が流れた。なんかこんなんばっかだな。RSS の登場により情報の収集は速くなったけど、知識にするための時間、手を動かして「つかむ」までの時間は、自分という人間の性能が変わらない1のでちっとも短くならない。

そんなオレ語りはどうでもよく、今回はようやく自分で Rack を使ってみましたよというお話。しかも、あんまり見ない、WEBrick と CGI の二本立て。試したのは gem で入れた rack 0.4.0

Rack の使い方は二段階ある

超簡単なチュートリアルを読んでもリファレンスを見てもこの違いを明確に意識することができなくて苦労した。Rack の機能には以下の二段階がある。

  1. Handler によってアプリケーションサーバの違いを抽象化する
  2. rackup によって便利なミドルウェアを使う

この違いは

  • ruby から直接 Rack::Handler::FOO.run( App.new )
  • rackup から run( App.new )

の違いからくる。要するに

ミドルウェアを use したければ rackup しろ

ってこと。

逆に言うと rackup しなくても Request, Response の抽象化は行えるので基本的なことはできる。

ではそれぞれの方法をもう少し詳しく見てみる。

※ ブコメいただきました。ミドルウェアの中にアプリケーションを突っ込んで、ミドルウェアを Handler に渡すという方法もあるようです。なんかちょっと不思議な感じもしますが、そもそも内部ではミドルウェアでアプリケーションを再帰的に wrap する構造のようです。

lib/rack/lobster.rb at master from chneukirchen's rack — GitHub

ruby から直接 Handler を呼ぶ方法

WEBrick の例

komagata さんの記事から拝借。

ウノウラボ Unoh Labs: RackでWebアプリのWebサーバー依存を無くす

#!/usr/bin/env ruby
require 'rubygems'
require 'rack'

class HelloRack
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]]
  end
end

Rack::Handler::WEBrick.run HelloRack.new, :Port => 3000

この hello-rack.rb を

ruby hello-rack.rb

で起こし、これにブラウザからアクセスすると

Hello, Rack

と表示される。うむ。

CGI の例

同じことは CGI でも当然できる。

#!/usr/bin/env ruby
require 'rubygems'
require 'rack'

class HelloRack
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]]
  end
end

Rack::Handler::CGI.run HelloRack.new

こんな感じで Handler を CGI にしてやれば ok. これを

  • Web サーバ配下の CGI の実行可能なディレクトリに置いて
  • 実行権限を付けて

ブラウザからアクセスしてやるとさっきと同じように

Hello, Rack

と表示される。めでたしめでたし。

これで cgi.rb を使わなくても Ruby で CGI を書けるようになったよ!

CGIAlt があるとか言わないでね。)

気をつけなきゃいけないこと

以下は自分のためのメモ

  • CGI の場合は Web サーバがアプリケーションを勝手に起こしてくれるけど、実行権限の付与が必要
  • WEBrick(など)の場合は自分でアプリを起こしてやらないといけない

自分の場合は生 CGI を触る機会が減っているので実行権限の付与をしょっちゅう忘れる。

でも Rack の本当の威力を味わうなら rackup

rackup は

rackup -s webrick [config file]

などとして server(handler) を指定してアプリケーションサーバを起動する。rackup が行われると、中で

Rack::Builder

がアプリケーションサーバの環境を作ってくれ、自分の書いたアプリケーションはこの中で実行される。

ここで初めて use が使えるようになる。

もうちょっと細かく見てみよう。

use は Rack::Builder の instance_method

Rack でミドルウェアを追加する use は Rack::Builder の instance_method となっている。

irb(main):001:0> require 'rack'
=> true
irb(main):002:0> Rack::Builder.methods.grep( /use/ )
=> []
irb(main):003:0> Rack::Builder.instance_methods.grep( /use/ )
=> ["use"]

つまり

require 'rack'

しただけでは use は使えない。

rackup の流れ

rackup を読んでみると、アプリケーションは rackup の中で以下のように実行されている。(詳細は端折ってある)

Rack::Builder.new {
  run inner_app
}

つまりそういうこと。Rack の便利機能を使いたければ rackup すべし。

では実際に rackup してみる。

WEBrick の例

直接起動で use の使えない様子

さきほどの hello-rack.rb に use を加える。

#!/usr/bin/env ruby
require 'rubygems'
require 'rack'

use Rack::ShowExceptions

class HelloRack
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]]
  end
end

Rack::Handler.WEBrick.run HelloRack.new, :Port => 3000

すると、当然ながら

$ ruby hello-rack.rb
hello-rack.rb:6: undefined method `use' for main:Object (NoMethodError)

怒られる。use なんて使えない。

rackup してみる

#! /usr/bin/env ruby
require 'rubygems'
require 'rack'

use Rack::ShowExceptions

class HelloRack
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]]
    cho_www
  end
end

run HelloRack.new

ここで注目してほしいのは、

  • cho_www という syntax error をアプリケーションの中に仕込んであるところ
  • run の呼び方を変えたところ

どうも

rackup するときは Handler は外から(rackup の -s オプションで)指定してあげた方がなんかうまくいく感じ。

これを hello-rack.ru の名前で保存し、

rackup -s webrick -p 3000 hello-rack.ru

WEBrick を rackup してブラウザ上で Trace Back

で実行。

ご覧のようにブラウザ上に Exception を表示できる。画像では端折ってあるが TraceBack も表示できる。当然のことながら cho_www を削除すれば普通に動く。

CGI の例

直接起こして use してダメなのはさっき WEBrick で見たので省略。

rackup する

ru ファイルはさっき用意した hello-rack.ru をそのまま利用。CGI の方は以下のようにする。

#! /bin/sh

/opt/local/bin/rackup hello-rack.ru

CGI でも use Rack::ShowExceptions が使えた!

パスが /opt/local/bin なのは MacPorts で入れた Ruby で gem を使ってインストールしているから。rackup のパスは適宜調整すること。

これを hello-rack.cgi の名前で保存、ごにょごにょしてブラウザからアクセスしてみる。画像の中の URL の違いに注目。確かに CGI で動いている。

ただし、当然のことながら CGI で rackup するのは負荷的には不利。

従来の流れ

  1. shebang から Ruby を起動
  2. 自分自身を読み込ませる

rackup 時の流れ

  1. shebang で sh や他のインタプリタから
  2. rackup コマンドを呼び出し
  3. そこから ruby が呼ばれ
  4. アプリケーションがロードされる

という長い道のりを要するようになってしまう。でもメリットでかいし。

わざわざ別プロセスの rackup から起動しなくてもいんじゃね?と思いたいのは分かる。自分も思った。でも結局 rackup と同じとまではいかないまでも似たような流れで Rack::Builder を呼んであげなきゃいけないので、Rack に頼るうまみが薄れちゃうよね?と思うのでそういうことはしないことにした。

まとめ

何はともあれ、Rack の基本的な使い方は分かった。map とかは分かってないけど、これで

  1. WEBrick で開発
  2. とりあえず CGI で deploy
  3. 負荷的にまずいので FastCGI にしましょうか

といった柔軟な運用が可能になった。

よしよし。

参考

  1. というか加齢とともに落ちる一方だぜ! オレは10代の若者じゃねぇ! 

kernel の更新もどんとこい

FreeBSD Security Advisory FreeBSD-SA-06:25.kmem

以前のサーバは手でリセットスイッチを押さないと再起動できなかったが、今度のは躊躇せずリモートで再起動を掛けられる。

スバラシイ。

CGIKit 2 の preview2 が出てる

CGIKit - FrontPage

変更履歴に

2.0.0 preview 2 released.

ってどうなんだ。

それにしてもえらい容量がふくれましたぞ。

竹中直人

根っから役者なのかと思ったら美大でデザインを専攻していたのか。どおりで妙に自己完結する世界を作ると思った。映画を撮るのも「映画製作という世界」を自分で作り上げたいというところなのかな。

才能と機会を両方持つ人。役者から絵描きみたいなことをする人は多いけど、この人は今後何を作っていくのだろう。

そういえば。。。

「仕事でパソコン、家でもパソコン」–IT技術者が悲鳴

今のパソコンは金か手間を掛けるしかない。手間を掛ける時間のない人、手間の掛け方の分からない人はお金を使ってください。

ITビジネスプラザ武蔵

ITビジネスプラザ武蔵

こんなものができていたのね。街中の研修施設(最大一部屋26人まで)や会議室(最大一部屋12人まで)としても使えるってことで、なかなか便利なんじゃなかろうか。まぁ自分にはあんまり関係なさそうだけど。

ネットワークリソースはネスク。こういうとこに食い込んでいるのか。

ITPro の読者層ってどうなんだ。

【結果発表】IT Pro読者はFirefoxをどう評価したか : IT Pro 記者の眼

Web のプロじゃない人の方が圧倒的多数だろうとは思うんだけど、レイアウトが崩れるとかそんな初歩的なことをぬかす ASP.NET 開発者ってどうなんだ。今まで IE でしか確認してないってことでしょ。そんなんでプロ名乗るな。

あと、IE でしか見られないサイトに対応できるようにしてほしいという意見が多いんだけど、そんなことしたら Gecko が複雑になって遅くなるし、ユーザーがサイトに対して意見していかないと状況は少しもよくならないってことが分からないのかなぁ。

これが IT の Pro たる読者の意見なのか。違うのか? 読者は Pro の卵か? なんだか謎だ。

タイトルバーに IME の情報を

以前からどうしてこれが実現していないのか不思議でならなかったことが、IME の情報をステータスバーに表示する機能。OS 標準でこの機能を提供してくれていればいいのに、と何度も思っていた。IME のツールバーを独立して表示させるのは邪魔だけど、タスクバーまで視線を移動させるのもかったるい。

というわけで Clock Pod というソフトを見つけた。これはもともとは時計を表示するものだったのだが、今ではかなりいろんな情報を表示できるようになっている。多くの情報を表示するためにテロップ機能(ゆっくりスクロールさせることで文章などの比較的多くの情報を狭い範囲に表示する機能)がついているのは最近のこの手のツールの常識のようであるが、これは全然必要ないので設定でバッサリカット。

ちなみに、設定方法はいきなり設定用のテキストファイルが関連付けられたアプリで開かれるという大胆なものだ。初心者は引くだろうがレジストリにもノータッチだし、編集を終了すればすぐに設定が反映されるので個人的にはこの方法はかなりありがたい。けっこう気に入ってしまった。

About

例によって個人のなんちゃらです

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm