ホーム

SUEKICHI.org

Google Calendar Color 拡張機能 更新

Check

Google Calendar Color 拡張機能ですが、Chrome拡張機能がChromeウェブストアからしかインストールできなくなっていたので、Chromeウェブストアに公開しました。

Google Calendar Color Monday
Google Calendar Color Sunnday

また、manifestファイルのバージョンが2以上でないと、もうすぐ使えなくなるらしいので、一緒に更新しました。
まだまだ使って頂ければと思います。

ApacheのMaxClientsの設定とその挙動をまとめてみた

Check

ApacheのMaxClientsの設定とその挙動、mod_proxyの設定との関係について、なんとなくの理解だったので、まとめてみた。

環境

  • CentOS 5.6
  • Apache 2.2.3

MaxClients

MaxClientsを超えたコネクションがあった場合

ListenBacklog の設定までキューにたまる、とドキュメントにはあるが、実際に接続してみると、なぜかそれ以上に接続できた。
リクエストの処理を実行している(リクエストを受信し処理している)コネクションは、MaxClientsの値まで数、同時に処理されている(これをアクティブな接続と呼ぶことにする)。
リクエストの処理が開始された時点で、以下のエラーログが出力される。

[error] server reached MaxClients setting, consider raising the MaxClients setting

このログが出力されるには以下の条件がある。

  • コネクションのみの場合は出力されない。
  • 起動から初めて、MaxClientsを超えた時にだけログが出力される。
  • reload(sighup)後、MaxClientsを超えた時にはログは出力されない。
  • restart(sigterm)後、MaxClientsを超えた時にログが出力される。

アクティブなコネクションがMaxClientsの数ある状態から、MaxClients以下になった場合、待ちとなっていたコネクションが順次処理される。それ以外の接続は待ち状態のまま。

mod_proxy max

設定値についての注意点

  • preforkの場合、常に1となる。
  • workerの場合、設定が有効となる。ただし、1プロセスあたりのバックエンドへのコネクションのmax値。つまり、バックエンドサーバーとの最大接続数は以下の式で求められる数となる。

    ServerLimit * max

1プロセスあたりの接続数がmaxを超えた場合

  • retry * timeoutの間、待ちになる
  • retry * timeoutを超えた場合503が発生する

maxを超えた接続がある状態で、max 以下になった場合

順次実行される

Google カレンダーのデザインが変わった!!! Google Calendar Color 拡張機能はまだ使えます

Check

Googleカレンダーのデザインがきれいになりましたね。
やっと、土日の色もきれいになるのかとおもいきや、そこは今までのままでした・・・

というわけで、公開している

Google Calendar Color 拡張機能

ですが、まだ必要なようです。デザイン変更後も、ちゃんと使えるようです。

Google Calendar Color 拡張機能にFirefox用日曜始まり版を追記しました

Check

Google Calendar Color 拡張機能にFirefox用日曜始まり版を追記しました。
Firefoxユーザーの方は、userContent.cssに記入すれば、使えると思います。

http://www.suekichi.org/blog/google-calendar-color-extension/

HT-03AにCyanogenMod-6.1を入れてみた

Check

HT-03AにAndroid 2.2ベースであるカスタムrom、CyanogenMod-6.1を入れてみました。
以下、その手順。

1. root化
 私のHT-03Aは純正の1.6でしたので、Universal Androotを利用しました。
 これまで純正1.6からのroot化は、1.5に戻してからなど、かなり大変な作業で躊躇していたのですが、このソフトのおかげであっという間にroot化OKでした。
2. CyanogenMod romイメージのインストール。
 ROM Managerというソフトを利用してインストールしました。
 このソフトから、CyanogenModのromイメージをダウンロードして、インストールできるはずだったんですが、なぜか私が作業した時には、ダウンロードでエラーが発生してしまいましたので、直接xda developersからダウンロード後、SDカードにコピーして、SDカードからのインストールでインストールしました。

モッサロイドのHT-03Aなので、Android 2.2なんて使いものにならないと思っていたのですが、結構いい感じです。1.6より快適な感じ。
一応スクリーンショットなどを。

JavaのInteger等のプリミティブ型ラッパクラスには要注意!

Check

基本的なことだけど、Javaには、プリミティブ型とオブジェクト型がある。
プリミティブ型とは、boolean, int, long, double, floatとか。
それに対応するように、Boolean, Integer, Long, Double, Floatクラスがある。

これらのプリミティブ型とオブジェクト型、何が一番違うかというと、nullが入るかどうか(表現が変だけど)。
つまり、

int a = null; //コンパイルエラー
Integer b = null; //OK

ということだ。

あと、よく使われるのが、

List<Integer> list = new ArrayList<Integer>();
list.add(1);

for (int i : list) {
	System.out.println("i=" + i);
}

といったように、Collectionに数値を入れたい場合に使う。
JDK1.4以降からの機能で、プリミティブ型の変数にオブジェクト型のオブジェクトをコード上はそのまま入れられるようになった。
しかし、ここで注意!

最初に言ったように、Integerには、nullが入る。
けど、intにはnullは入らない。
なので、この例の場合、listというArrayListに、nullが入っている場合、
for文のところで、NullPointerExceptionが発生する。
このパターンで、NullPointerExceptionが発生した場合、
debug等で見つけるのがちょっとわかりにくい。
もしくは、Collectionから取り出したInteger等の変数を、
プリミティブ型の引数を持ったメソッドに渡した場合なども、
どこでNullPointerExceptionが発生しているのか、発生源を特定するのが難しいのだ。

アタリマエのことなのだけど、
あまり気にしてないとハマるので、覚書。

DTI ServersMan@VPS Entryでunixbenchしてみた

Check

とってもいまさらな感じですが、DTIのServerMan@VPS Entryで、unixbenchを動かしてみました。

BYTE UNIX Benchmarks (Version 5.1.2)

System: dti-vps-srv06: GNU/Linux
OS: GNU/Linux — 2.6.18-164.15.1.el5.028stab068.9 — #1 SMP Tue Mar 30 18:07:38 MSD 2010
Machine: i686 (i386)
Language: en_US.utf8 (charmap=”UTF-8″, collate=”UTF-8″)
CPU 0: Intel(R) Xeon(R) CPU L5520 @ 2.27GHz (4522.1 bogomips)
Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
18:40:46 up 11 days, 2:20, 1 user, load average: 0.29, 0.10, 0.02; runlevel

————————————————————————
Benchmark Run: 金 9月 24 2010 18:40:46 – 19:14:15
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables 4156504.7 lps (10.0 s, 7 samples)
Double-Precision Whetstone 2138.6 MWIPS (10.3 s, 7 samples)
Execl Throughput 1461.9 lps (29.5 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 172170.9 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 46631.5 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 368636.3 KBps (30.0 s, 2 samples)
Pipe Throughput 313563.3 lps (10.0 s, 7 samples)
Pipe-based Context Switching 98627.6 lps (10.0 s, 7 samples)
Process Creation 4646.2 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 1579.2 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 224.7 lpm (60.2 s, 2 samples)
System Call Overhead 258911.3 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 4156504.7 356.2
Double-Precision Whetstone 55.0 2138.6 388.8
Execl Throughput 43.0 1461.9 340.0
File Copy 1024 bufsize 2000 maxblocks 3960.0 172170.9 434.8
File Copy 256 bufsize 500 maxblocks 1655.0 46631.5 281.8
File Copy 4096 bufsize 8000 maxblocks 5800.0 368636.3 635.6
Pipe Throughput 12440.0 313563.3 252.1
Pipe-based Context Switching 4000.0 98627.6 246.6
Process Creation 126.0 4646.2 368.7
Shell Scripts (1 concurrent) 42.4 1579.2 372.5
Shell Scripts (8 concurrent) 6.0 224.7 374.5
System Call Overhead 15000.0 258911.3 172.6
========
System Benchmarks Index Score 335.3

まー、予想通りな感じ。490円/月で十分ですな。

Google Calendar の土日に色をつけるExtentsion、まだ使えます

Check

今日、Google Calendarを見ると、デザインがアップデートされたとメッセージが表示されました。
これで、土日の色が公式に対応されたかっ!と思ったのですが、残念ながら対応されていませんでした。

以前作成したChrome用のExtensionですが、確認したところまだ有効でしたので、よければご利用ください。

Google Calendar の土日に色をつける方法

iPhoneとAndroid、エンジニア的に比べてみた

Check

iPhoneとAndroid、エンジニア的に比べてみた

現在、iPhone 3GSを利用しているが以前はHT-03A、俗に言うGoogleケータイを利用していたことがある。ハードウェアスペックが足らず、のちにモッサロイドと呼ばれるほどトロい動作のため、iPhoneに乗り換えてしまった。日本初のAndroid携帯だったにもかかわらずまったく売れず、あたかもXperiaが初めてのAndroidのような扱い。
実は、HT-03AもXperiaもソフトウェア的にはほとんど一緒で、ハードウェアスペックがかなりあがって、ソニー独自のアプリがインストールされているだけだ。

iPhoneとXperia(Android)を比べる記事はよくあるのだが、今回は、
あまり書かれていない、よりエンジニア的な比べ方をしてみようと思う。

iPhoneとAndroidの比較表
iPhone Android
デスクトップの機能 ランチャー ランチャー
通知領域
ウィジェット
実装できる機能 基本的に通常のアプリのみ 通常のアプリの他、
サービス(デーモン)、ホーム画面、ウィジェット、IME、
がんばればOS自体
マルチタスク iPhone OS 4.0 からサポート サポート済み
ハードウェアボタン ホームボタン ホームボタン
メニューボタン
戻るボタン
開発環境 Xcode eclipse
開発言語 objective-c java

デスクトップの機能

 まず、デスクトップ(と呼んでいいのか分からないが)の機能だが、iPhoneはいわゆるアプリランチャーとしての機能しか無い。あえていうなら、アイコンの上に書かれる数字で未読数等を知らせるのみだ。iPhoneOS4.0でやっとフォルダ機能が追加されることになった。
 Androidでは、インストールされているアプリを起動するランチャー以外に、
WindowsやMacでいうデスクトップとしての場所が用意される。そこには、アプリのショートカットや
ウィジェットと呼ばれる小さなアプリを配置でき、カレンダーやTwitterのタイムラインの一部など、画面を表示するだけで情報を表示できる機能がある。これはiPhoneOS4.0でも無い機能だ。
Androidには他にも、通知領域というWindowsのタスクトレイのような、ユーザーに処理の終了を伝えたりする場所が用意されている。

実装出来る機能

iPhoneでは、基本的に起動して、使って、終了する、普通のアプリしか実装できない。
なので、IMEのカスタマイズ(カーソルキーや、アルファベットの予測変換等)の細かなカスタマイズはできず、Appleによる公式アップデートを期待するしかない。
 Androidでは、IMEをつくって、デフォルトのものと置き換えたり、ホーム画面も自由につくって、変更できる。ウィジェットやサービスといった、バックグラウンドで常時動作するものなど、いろいろなアイデアを思いつく機能を実装できる。ここはAndroidのかなり優位なところだと思う。

マルチタスク

 iPhoneでは、OS4.0でのサポートが発表されたが、Androidではすでに実装済みである。
 Androidでは、マルチタスクやスレッドを有効に利用して、ウィジェットや通知領域を利用した
アプリを実装できる。iPhoneではマルチタスクはサポートされたが、それを有効に利用できる他の機能が不足しているように見える。
 他に、重要な点として、Androidでは「インテント」という重要な機能がある。
これは、アプリの一部機能を他のアプリと連携して動作する機能だ。文章で説明すると難しいのだが、例えば、Windowsでは、カメラで撮った写真を見る場合、付属のペイントでも見れるが、他の好きなソフトを自由に使うことができる。Windows等では当たり前の機能だが、iPhoneでは「ファイル」という概念がなく、アプリの中で扱うデータは写真やiPod内の音楽データなど一部例外を除き、そのアプリ内だけでしか利用できない。(あり)。AndroidではWindows等と同じように、データを扱うアプリを自由に選択でき、さらに、それが細かくわけられている。例えば、Exploreのようなインタフェースで、画像を表示するアプリがある場合、Explorerのような部分と画像を表示する部分、2つのアプリ(インテント)として個別に利用することができる。つまり、画像を選択するのはAアプリで、画像を見るのはBアプリ、といった使い方ができるのだ。この新しい概念が、マルチタスクやスレッドといったものをさらに有効利用できる機能としていると思う。

ハードウェアボタン

 iPhoneでは、ハードウェアボタンはホームボタン1つ(電源や音量ボタンはあるが)であり、アプリの切り替え(終了)に使われる。
 Androidでは、ホームボタン、メニューボタン、戻るボタンの3つがあり、特にメニューボタンと戻るボタンが、Android独自の共通したインタフェースとして機能する。メニューボタンは、マウスの右クリックで出る、コンテキストメニューのような位置づけで、その画面で利用できる機能が、画面下部にメニューとして表示される。戻るボタンは、そのまま1つ前の画面、今出ているメニューを消す等、とりあえずこのボタンを押せば、前の状態に戻る(UNDOとは違う)。どちらが良いのかは、賛否両論あると思うが、私のは、iPhoneで、まず画面のどこを押したら分からない状態よりも、とりあえずメニューボタンを押せば、その画面でできることが表示されるところが、わかりやすいと思う。

開発環境/言語

 iPhoneは、XcodeというMacに付属の統合環境とObjective-C言語で開発する。非常に良くできたツールだが、EclipseやVisualStudioとはちょっと操作感が違うので慣れが必要だ。しかし、これは統合環境というより、Objective-CやCocoaフレームワークとの違いの方が大きいかもしれない。Objective-Cは、非常に面白い言語だが、文法が他の言語とちょっと違うので、これも慣れが必要。
 また、iPhoneのSDKには、シミュレータも含まれているので、作ったアプリはちゃんと確認できるが、実機にインストールしようとすると、Appleへの開発者登録(有料)が必要になる。
 Androidは、現在主流の言語のJavaで開発されており、アプリの開発もJavaで可能。開発環境も、利用者の多いEclipseで利用できる。もちろんシミュレータもあるが、実機での確認も容易に可能。iPhoneに比べ、開発者の敷居は非常に低いと思う。

総論

全体的にAndroidのほうが、ソフトウェアの開発環境、動作環境ともに、自由度が高く、エンジニアとしてはおもしろい機能が満載だ。iPhoneは、昨今のAppleの方針と同じく、締め付けがきつく、自由度は高くない。
現在のAndroidアプリの市場はこの敷居の低さのせいもあってか、数は爆発的に増えているが、アプリの質としてはピンきりで、まだまだといった感じ。iPhoneアプリは、Androidに比べれば成熟してきているが、機能不足や限界を感じさせるアプリも多く見える。

私は、ソフトウェア的にはAndroidがかなり好きである。AndroidがiPhone並に流行って、
大手のサービスやソフトウェアが参入してきてほしいと思う。

yumでエラーが出た時の対処法 その2

Check

前回のエントリーで、yumのエラーについて簡単に書いたが、もう少し詳細を記録する。

このblogは、DTIのServersMan@VPSというサービスの上で動作している。
メモリ256MB、ディスク10GBで490円/月額というびっくりな値段だ。
VPSというだけあって、root権限ももらえて、アプリも自由に入れられ、普通のホスティングサービスとは一線を画す。
CPUや、1サーバーあたりのユーザー数等は明記されていないが、今のところかなり快適だ。
だがしかし、256MBのメモリだけはいかんともしがたい。
このblog、WordPressを動かすために、apache、PHP、mysqlを動作させる必要があるが、
まず、yumでのインストール につまづいた。
yumを実行すると、以下のようなエラーが発生。

Loaded plugins: fastestmirror
Repository ‘vz-base’ is missing name in configuration, using id
Repository ‘vz-updates’ is missing name in configuration, using id
Determining fastest mirrors
Traceback (most recent call last):
File “/usr/bin/yum”, line 29, in ?
yummain.user_main(sys.argv[1:], exit_code=True)
File “/usr/share/yum-cli/yummain.py”, line 309, in user_main
errcode = main(args)
File “/usr/share/yum-cli/yummain.py”, line 178, in main
result, resultmsgs = base.doCommands()
File “/usr/share/yum-cli/cli.py”, line 349, in doCommands
return self.yum_cli_commands[self.basecmd].doCommand(self, self.basecmd, self.extcmds)
File “/usr/share/yum-cli/yumcommands.py”, line 626, in doCommand
return base.search(extcmds)
File “/usr/share/yum-cli/cli.py”, line 799, in search
for (po, keys, matched_value) in matching:
File “/usr/lib/python2.4/site-packages/yum/__init__.py”, line 1813, in searchGenerator
for sack in self.pkgSack.sacks.values():
File “/usr/lib/python2.4/site-packages/yum/__init__.py”, line 661, in
pkgSack = property(fget=lambda self: self._getSacks(),
File “/usr/lib/python2.4/site-packages/yum/__init__.py”, line 501, in _getSacks
self.repos.populateSack(which=repos)
File “/usr/lib/python2.4/site-packages/yum/repos.py”, line 232, in populateSack
self.doSetup()
File “/usr/lib/python2.4/site-packages/yum/repos.py”, line 79, in doSetup
self.ayum.plugins.run(‘postreposetup’)
File “/usr/lib/python2.4/site-packages/yum/plugins.py”, line 179, in run
func(conduitcls(self, self.base, conf, **kwargs))
File “/usr/lib/yum-plugins/fastestmirror.py”, line 181, in postreposetup_hook
all_urls = FastestMirror(all_urls).get_mirrorlist()
File “/usr/lib/yum-plugins/fastestmirror.py”, line 333, in get_mirrorlist
self._poll_mirrors()
File “/usr/lib/yum-plugins/fastestmirror.py”, line 376, in _poll_mirrors
pollThread.start()
File “/usr/lib/python2.4/threading.py”, line 416, in start
_start_new_thread(self.__bootstrap, ())
thread.error: can’t start new thread

このエラーは、どうもメモリ不足の時に起きるようだ。
そこで、メモリを確認すると以下。

Total: 262144k
Used: 142392k
Free: 119752k

現時点で、主に、
sshd, syslogd, xinetd, crond, mysqldが動作しているが、mysqldが136MBもメモリを使っている。
そこで、mysqldのメモリ節約設定を行う。
/etc/my.cnfを編集し、

skip-innodb

とし、再起動した。
すると、mysqldが47MBに激減。

Total: 262144k
Used: 53056k
Free: 209088k

これで、apacheやPHPも快適だ。
他にも、apacheの利用しないモジュールを外したりすることで、メモリを節約する設定とする。

1 2

ホーム

Tag cloud
Amazon
いろいろ

ページの上部に戻る