何がLinuxデスクトップを殺したか(What Killed the Linux Desktop 日本語訳)

要約すると、(a) 第一の要因:物事があまりに早く変化し、オープンソースも独占ソフトウェアも同じように壊れる。(b) Linux ディストリビューション間の非互換性。

これがデスクトップ分野で Linux をターゲットとしようとするサードパーティの開発者のエコシステムを殺した。一度は挑戦して、「トップ」ディストロや寛容な人なら「トップ3」ディストロをサポートするのに最善を尽くすだろう。それで知ることになるのは、6ヵ月後にはそのソフトウェアがもう動かないということだけ。

何か覚えのある感覚。僕(ら)はサーバー用OSとしてDebianを選ぶのにも同じような考えをしているなと思いました。

Linuxはサーバー分野では成功して、沢山のサードパーティー開発者(僕も)に使われている。サーバー分野でサードパーティー開発者が作るプロプライエタリなソフトといえばWebアプリだ。サーバー分野では上記の様な問題があまり無いからだ。

僕らにとってVistaがコケたことに対応する出来事はRedhatがフリー版の提供を辞めた事だった。事実上の標準だったRedhatが使えなくなるというのでみんなパニックになった。Fedoraに行った人は暫くして立ち上がったCentOSを使い始めた。または僕も含め、多くの人がそれを機会にDebianに移った。確かSergeが出るちょっと前ぐらいだったように記憶しているけど、プロプライエタリなWebアプリを作るサードパーティー開発者(僕だ)にとってDebianは楽園だった。安定版は一度セットアップすれば殆ど手がかからなかったし、APIの変更で自分たちのアプリにも変更が必要ということはまず無かった。OSのメジャーアップデートは再起動無しに出来た。

2012年の現在でも楽園は健在だ。現在の安定版Squeezeはやはり安定していて、丁度昨日も一つセットアップしてきたところだ。レガシーのPHPアプリケーションをSqueezeに持ってきたところ、すっかり動作した。Debian万歳。

サーバー用途でもGUIを重視する必要があるWindowsやMac OS Xに比べて、GUIを切り捨ててサーバー用途の安定性を重視した為、比較的少ない対象に開発リソースを集中できていることがその原因だろう。その代償としてのGUI周りの不安定さならば僕は受け入れてしまうだろう・・・。

PCを新しいケースに入れ替えてからどうも家に帰ってきてつけてからWindowsが立ち上がるまで遅くなってる気がする。

起動画面を見ているとPXEの文字が。

(PXEって確かネットワークブートの規格だよなあ?)

ネットワークブートしようとしてDHCPを探しに行ってる間、待ってる時間分遅くなってるようでした。

BIOSのBoot Sequenceの設定を見てみると何故かEthernetが1stになっている。戻してやったら治りました。

日本語ファイル名の問題

svnで日本語ファイル名を使ってるとMAC-UTF8では違うファイル名ってことになるのでcheckoutしてきただけで変更扱いになる。

% brew install subversion --unicode-path

--unicode-pathを付けてbrewからインストールすればOK。

svn1.6系から1.7系へのアップグレード

1.7から.svnディレクトリはgitのようにトップディレクトリにしか作られなくなる(!)

1.6系以前のworking copyは変換が必要。

% svn upgrade

サーバー側のsvnが1.6系であっても下位互換があるので安心。

cakephp1.3系(+svn)のプロジェクトのテコ入れ的な仕事をやることになったのですが、php浦島状態です。下記、もしわかれば教えていただけるとありがたいです!

  • エンドツーエンドテストがしたい。(selenium rc+simpletestなのかな?)
  • CIしたい。(jenkins + selenium rc+simpletest or phpunitとかでできるのかな?)
  • migrationしたい。(若干あきらめ気味)
  • deployはどうやるんだろう?
  • stagingとproductionを簡単に切り替えるdeployがしたい(贅沢?)

識者の方、なにとぞ、なにとぞ・・・ m(_ _)m

追記:

@yandoさんに教えてもらった情報。

migration = migration plugin

deploy =cap-cake (capistrano)

あとはエンドツーエンドテストが気になります。(個人的にbehatはやり過ぎ感)

デフォルトでデスクトップじゃなくてPicturesに入って欲しいだろう。常識的に考えて。

% defaults write com.apple.screencapture location ~/Pictures
% killall SystemUIServer

u2plusにグッズのサイトができたので買いました。

ゆううつグッズ部公式サイト

あとは神の薬、サインバルタのTシャツが欲しいです。

先日、業務時間内に弊社インターンシップ中の@hrysdさんに対して不適切な発言がございましたのでここにお詫び申し上げます。

@hrysd「今作ろうとしてるgemでTwitterのgemみたいに設定出来るようにしたいんですけど、ココってどういう意味ですか?」

俺「どれ?」

@hrysd「ここのconfigurableの中のやつです。」

俺「どれどれ・・・?」

Twitter.configure do |config|
  config.consumer_key       = YOUR_CONSUMER_KEY
  config.consumer_secret    = YOUR_CONSUMER_SECRET
  config.oauth_token        = YOUR_OAUTH_TOKEN
  config.oauth_token_secret = YOUR_OAUTH_TOKEN_SECRET
end

module Twitter
  module Configurable
    attr_writer :consumer_key, :consumer_secret, :oauth_token, :oauth_token_secret

(...)

  # Convenience method to allow configuration options to be set in a block
  def configure
    yield self
    self
  end

(...)

end

@hrysd「このyieldってのが、」

俺「色気付きやがって・・・」

@hrysd「え?」

俺「こんな小洒落た設定方法・・・」

@hrysd「え?」

俺「チンカスの分際でblockで設定したいなんて早いんだよ!」

@hrysd「え~」

俺「アクセサを使え!アクセサを!」

誤)チンカス

正)人間(Human being)

大変申し訳ございませんでした。

[mixi] 引継ぎ

3月一杯で退職だったので業務の引継ぎをやってました。

@milkcocoaさんには特に引き継ぐ事が無かったのでその場で考えた一発ギャグを引き継ごうとしたら断られました。

4月1日から毎日フィヨルド生活になりました。

スパムきっかけで久しぶりにmixiをみたら2010年の日記。全然覚えてないけどどんな一発ギャグだったんだろうなあ。

もう終戦記念日を過ぎちゃいましたが、お盆で実家に帰った際に祖父の古い写真を幾つか見つけたのでスキャンして従軍記のブログにアップしました。

是非、俺のしょうもないブログより見ていただきたいです。

大東亜戦争従軍記

専修大学の夜学(確か)に通っていた時の祖父。

ホント、こんな三四郎みたいな格好だったんですね。ビビるわぁ。

一応、僕にも小さい頃の祖父の記憶があります。お酒が好きで、宴会の席で盛り上がった時に手拍子だけで歌う歌、(浪曲っていうのかな?)を歌っていた記憶があります。手記の中で酒盛りをしたような場面が結構ありますが、手軽に音楽を流せる機械も無かった当時、宴会はこんな感じだったのかなあと今では思います。

ご存知の通りスマホのHTML5 Auidoは現状酷い状態です。

全プラットフォーム共通で再生できるフォーマットが無かったり、iPhoneは独自仕様で自動再生はできず、ユーザー操作由来のアクションからしか再生できなかったり、複数音が再生できなかったり、Androidは2.2までは全然動かなかったり。

対応策として知られているのがCSS SpriteならぬAudio Sprite。複数の音楽ファイルをつなげて一つのファイルにし、シーク位置を制御することで好きな音を鳴らしたりループしたりする姑息なテクです。

そんな面倒なことやってられるかと思ってたんですが、そろそろAudio Sprite用のツールも揃って来ました。

jukebox

zynga/jukebox

ひとつはAudio Sprite用の再生ライブラリjukebox。Zyngaが作ってるのでちょっとマジっぽいです。

var settings = { 
  spritemap: { 
    bgmusic: { 
      start: 0.00,
      end:  20.00,
      loop: true
    },
    shoot: { 
      start: 21.00,
      end: 22.50
    },
    kaching: { 
      start: 24.00,
      end: 24.75
    } 
  } 
};

var player = new jukebox.Player(settings);
player.play('bgmusic'); // faster, sprite entry's id
player.play(12.34); // slower, will search for matching sprite entry

一つにまとまった音楽ファイルと、それぞれの曲のstart位置、end位置、loopの有無の情報を元に簡単に再生できます。勿論AndroidでのFlashへのFallbackもやってくれます。

audiosprite

tonistiigi/audiosprite

もう一つが複数の音楽ファイルを一つにまとめる面倒な作業をやってくれるaudiospriteというnodeのライブラリ。

中身はffmpegのラッパーで、ファイルを全部をくっつけた上に各種プラットフォームをカバーするための複数種類のフォーマットで音楽ファイルを作成してくれます。更にjukeboxで使うための上記で言うsettingsにあたるデータをjsonで出力してくれるという気の効きよう。

iPhoneで一番パフォーマンスが出るCore Audio Format(caf)まで作ってくれるところが泣けます。

% audiosprite --help
info: Usage: audiosprite [options] file1.mp3 file2.mp3 *.wav
info: Options:
  --output, -o      Name for the output file.                             [default: "output"]
  --log, -l         Log level (debug, info, notice, warning, error).      [default: "info"]
  --autoplay, -a    Autoplay sprite name                                  [default: null]
  --silence, -s     Add special "silence" track with specified duration.  [default: 0]
  --samplerate, -r  Sample rate.                                          [default: 44100]
  --channels, -c    Number of channels (1=mono, 2=stereo).                [default: 1]
  --help, -h        Show this help message.

実際試したところ、ちょろっと音を出したい用途には使えそうです。しかし、スマホでネット上からダウンロードして鳴らすにはこのままでは駄目で、大きなファイルになった場合の動作が不安定でした。ローカルに何とかキャッシュする方法を探れば行けるかもしれませんが、僕が試したかった怖話のような大容量の音楽ファイルを鳴らす用途には難しそうです。