カテゴリー別アーカイブ: コンピュータ

twitter.comが引けない

 ソースポートを53に固定にしているDNSサーバからは局地的にtwitter.comが引けなくなっているようなので要注意ですよ。
 より具体的には、twitter.comゾーンのネームサーバのns1.p34.dynect.netやdynect.net.ゾーンのネームサーバのns1.dynamicnetworkservices.net.などに到達できないようです。

Windows 8

 Windows 8をしばらく使ってみているが、やはりNTカーネルになってからのWindowsとしては史上最悪の出来と言わざるを得ない。
 しかしMicrosoftがそういうリスクを冒してまでこういう設計変更を施した意図はやっとわかってきた気がする。要するにスタート画面はWindowsユーザにとっての「ポータルサイト」のようなものになるので、巨大な利権となりうるからだ。msnで果たせなかったポータルサイト独占の夢再びである。
 問題なのは、それがMicrosoftにとって都合がいいだけで、利用者にとっては不便になっただけだということである。

 ちなみにWindowsを代表するキラーアプリであるところのマインスイーパとピンボールが大幅にパワーアップしている。Windows 8のウリはこれくらいだろう。

for_eachでbreakするには

 最近のVC++ではlambda functionが使えるようになっているので、ループを書くときは単なるforやwhileでなくSTLの<algorithm>をそれと組み合わせて使うことが多いのだが、その代表であるfor_eachにはbreakが使えないという欠点がある。もちろんgotoもダメ。つまり毎回フルにループしてしまうので、必ずその必要がある用途以外に使うと効率が低下してしまうわけだ。オーダは変わらないとは言うものの、これでは実用上結構な差がつくことがあり得るのではないか。
 breakに代わる手段として思いつくのは2つ。

  1. breakの代わりにthrowする。こんなことをしていると「よくない例外の使い方の典型例」として社内の新人教育講座に取り上げられてしまいそうだ。
  2. for_eachの代わりに常にfind_ifを使う。何かを探しているのでないのにfind_ifを使うと意図がわかりづらくなりそうではある。

 そもそもなぜforやwhileを使いたくないかというと、一つはiteratorの変数宣言がややこしくてできるなら書かないで済ませたいからであり、もう一つはfindとかtransformとかという名前が付いていた方が意図がわかりやすいからである。その観点からするとどちらもイマイチという感じだが、しいて言うなら第二案の方が穏当そうである。ただ、vectorなどのクラスならともかく、単に配列をループするだけなら素直にforを使った方がよさそうな気がする。

nginx

 WordPressの遅さに耐えかねて、リバースプロキシのnginxを導入してみました。これで、一度表示されたページは二度目から高速に表示されるようになりました。ただし、新しい投稿がされるとすべてのキャッシュがクリアされます。また、ブラウザでリロードすると再生成されるはずです。
 何かありましたらコメント欄まで。

追記: この影響で不具合が出たので、Ktai Styleを使った携帯電話への対応を中止しました。スマートフォン化が進み従来型携帯電話からのアクセスが減っていることもあります。

Ubuntu 11.10のunity-greeterがCPUを消費する

現象

 Ubuntu 11.10のデスクトップのログイン画面表示中、sshなどで裏でコンソールを開いてtopを実行すると、unity-greeterというプロセスが頻繁に上位に来る。CPUの能力によっては、常時1%程度消費していることもあるようである。
 サーバとして使用するときは、原則として常時この画面が表示されているのであり、常時1%食われるのは気になる。

回避策

 [ゲストセッション]を選択すると納まる。誤ってマウスのボタンをクリックしてしまうだけでデスクトップへ行ってしまうのがこの方法の欠点である。
 このことから逆算すると、どうやらパスワード入力欄のテキストフィールドがCPUを消費しているようである。

Ubuntu 11.10から/etc/network/interfacesでのIP aliasingのサポートが中途半端になった

現象

 /etc/network/interfacesに例えば

auto lo eth1 eth1:1
iface eth1
  address 1.2.3.4
  netmask 255.255.255.0
  gateway 1.2.3.1
iface eth1:1
  address 1.2.3.5
  netmask 255.255.255.0

のように書いてeth1に複数のIPアドレスを振っていた場合、Ubuntu 11.04までは、ifconfig -aすると

# ifconfig -a
eth1      Link encap:イーサネット  ハードウェアアドレス 00:d0:b7:09:xx:xx
          inetアドレス:1.2.3.4  ブロードキャスト:0.0.0.0  マスク:255.255.255.0
          inet6アドレス: fe80::2d0:b7ff:fe09:3e77/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:65564 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:88727 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:8445020 (8.4 MB)  TXバイト:80644469 (80.6 MB)

eth1:1    Link encap:イーサネット  ハードウェアアドレス 00:d0:b7:09:xx:xx
          inetアドレス:1.2.3.5  ブロードキャスト:0.0.0.0  マスク:255.255.255.0

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:2392 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:2392 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:241622 (241.6 KB)  TXバイト:241622 (241.6 KB)

のように表示されていたのが、Ubuntu 11.10からは

# ifconfig -a
eth1      Link encap:イーサネット  ハードウェアアドレス 00:d0:b7:09:xx:xx
          inetアドレス:1.2.3.4  ブロードキャスト:0.0.0.0  マスク:255.255.255.0
          inet6アドレス: fe80::2d0:b7ff:fe09:3e77/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:65564 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:88727 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:8445020 (8.4 MB)  TXバイト:80644469 (80.6 MB)

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:2392 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:2392 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:241622 (241.6 KB)  TXバイト:241622 (241.6 KB)

としか表示されなくなった。しかし、ip addrすると

# ip addr
1: lo: <loopback ,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth1: <broadcast ,MULTICAST,UP,LOWER_UP> mtu 1426 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:02:b3:4c:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 1.2.3.4/24 scope global eth2
    inet 1.2.3.5/24 scope global secondary eth2
    inet6 fe80::202:b3ff:fe4c:cc2a/64 scope link
       valid_lft forever preferred_lft forever

のように表示され、その他のプログラムからも1.2.3.4も1.2.3.5も使える状態である。つまり、一応追加のIPアドレスは設定できているようであるが、ifconfig -aの表示だけがおかしい。

原因

 /etc/network/interfacesの設定を読んで実際にシステムに設定しているifupdownが使用しているAPIが、ifupdownのchangelog(読むにはapt-get changelog ifupdownせよ)によると、Ubuntu 11.04搭載のバージョン0.6から11.10搭載の0.7の間で変更になったらしい。どうもそのときにIP aliasing互換への対応が抜け落ちたのではないか。おそらくもとから新しいAPIを使っているであろうipコマンドを使っても、次のようにlabelとして指定すればIP aliasing互換の設定ができる。
(/etc/network/interfacesにeth1:1の設定がないものとして)

# ip -4 addr add 1.2.3.5/24 dev eth1 brd + scope global label eth1:1
# ifconfig -a
eth1      Link encap:イーサネット  ハードウェアアドレス 00:d0:b7:09:xx:xx
          inetアドレス:1.2.3.4  ブロードキャスト:0.0.0.0  マスク:255.255.255.0
          inet6アドレス: fe80::2d0:b7ff:fe09:3e77/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:65564 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:88727 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:8445020 (8.4 MB)  TXバイト:80644469 (80.6 MB)

eth1:1    Link encap:イーサネット  ハードウェアアドレス 00:d0:b7:09:xx:xx
          inetアドレス:1.2.3.5  ブロードキャスト:0.0.0.0  マスク:255.255.255.0

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:2392 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:2392 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:241622 (241.6 KB)  TXバイト:241622 (241.6 KB)

 ifconfigは古いので、IP aliasingを使わないで一つのインタフェースに直接IPアドレスを複数割り当てた場合に対応していない。

対処法

 根本的にはifupdownの修正が必要だが、とりあえず設定の確認には古き良きifconfig -aのことは忘れ、ip addrを使う。設定そのものはいままでの/etc/network/interfacesの書き方そのままでできているので対処不要。

参照

“ifconfig -a” does not show all the inet4 interfaces ifconfigとipコマンドの関係や使い方等について参考になる。

追記

 その後LaunchpadにてBug #876829として報告され、一応パッチも作成された模様。Debianでも再現するとのこと。
 このパッチを見る限りでは、ifupdownは内部的にはまさにipコマンドを起動しているスクリプトのようだ。

2012.2.1追記: 先日の0.7~alpha5.1ubuntu5へのアップデートでこの問題は解消された。

Ubuntu 11.04でログイン時の「*** /dev/sda1 will be checked for errors at next reboot ***」が消えない

現象

 Ubuntu 11.04が稼働しているマシンにsshなどでログインしたとき、初めに表示されるメッセージの中に「*** /dev/sda1 will be checked for errors at next reboot ***」という警告が表示される(「/dev/sda1」の部分は環境によって異なる)。しかし、再起動してもディスクのチェックは行われず、再度ログインするとこの警告も再度表示される。

原因

 /etc/fstab中の当該パーティションについての行のpass列(行の最後)の数値が0に誤設定されているため。

解決方法

 /etc/fstab中の当該パーティションについての行のpass列の数値を、それがルートパーティションなら1に、それ以外なら2に修正する。

補足

 ユーザがパーティションを/etc/fstabに手で追加したときに時折起こるミス。ほかの行のpass列はほとんど0に設定されているので、それにならって漫然と0に設定してしまいがちだが、それは間違いなのである。0に設定されているのは、それらがswapやprocなどの特殊なパーティションでfsckが必要ないからである。

 なお、正常にfsckが走っても、起動直後に少しの間このメッセージが残ったままになることがある。この場合、放っておくといつの間にか消えている。

参照

サーバOS入れ替え

 このサーバのOSをRedHat 8.0(なんと2002年リリース!)からUbuntu 11.04へ入れ替えました。同じLinux同士とはいえほとんど一から設定をやり直していて、不具合があるかもしれませんので、お気づきの点がありましたらお知らせいただければ幸いです。
 ついでにHDDをSSDに変更しましたが、このブログの速度は速くなってないようです。WordPressの遅さはDBアクセスでなくPHPで処理している部分が原因なので仕方ないですね。
 また、この機に、ある種のブラウザやプロキシサーバなどからされることのあったページの先読みに対する制限を厳しくしました。ページの右側にいろいろとあるリンクを一斉に先読みされた場合、単にページを表示させるだけでもやたらと重たいWordPressは非常に脆弱で、何も制限していないと、あっという間にload averageが10くらいに上がるとともに、メモリを食い尽くして一時的にブログがダウンしてしまいます。そこで、WordPressのページについてはIPアドレスごとの最大許容同時接続数を3に制限しました。
 ただ、ふつうの環境で閲覧されている方にはこの制限が問題になることはないはずです。そもそも、HTTP/1.1の最大接続数は2ですから。また、こちらでテストした限りでは、FirefoxにFasterfoxを入れて先読み機能を有効にしていても、このブログでは先読みは起こりません。おそらく?が入っているURLについては先読みしない仕様なのだと思われます。

NTFS上のファイルの作成日時と最終更新日時が正しくなくなる場合

 もちろんそういうユーティリティでいじった場合を除く。

作成日時(CreationTime)が正しくなくなる場合

  • 別ボリュームへ移動した場合。その移動の日時に設定される。KB299648
  • 同名のファイルを削除直後に再作成した場合など。いわゆるトンネリング。その直前に削除したファイルの持っていた作成日時に設定される。ドロナワ式対策の大好きなMicrosoftらしいとんでもない仕様だ。KB172190

最終更新日時(LastWriteTime)が正しくなくなる場合

  • Win32のCreateFileMapping(), MapViewOfFile()や、そのラッパーである.NET Framework 4.0のSystem.IO.MemoryMappedFilesを使って、メモリマップトファイルとして書き込みをした場合。最終更新日時は更新されない。調べた限りではこの仕様はドキュメント化されておらず、別に原因のある可能性もなくはないが、検証用プログラムを作って試した限りではそうなる(追記: 英語版MSDNの最新版には記述があった)。SQL Serverのバックアップ処理がこれをやっているらしく、バックアップファイルは、そのサイズが最後に拡張された日時が最終更新日時として設定されているようだ。バックアップ処理にどの程度の時間がかかったかを調べる際に実に紛らわしい。
    なお、posixのmmap()には、マップされたメモリ領域への書き込み以降(かつmsync()が呼ばれたならその呼び出し以前)の時刻でst_mtimeが更新されるという記述がある。posixサブシステム(SUA)からmmap()を呼ぶとどうなるか興味があるが未検証。

Exchange Server 2010 + Outlook 2003の組み合わせで、同期時に0x8004010Fのエラーが発生する

現象

サーバ側Exchange Server 2010 (SP1)、クライアント側Outlook 2003 (SP3)の環境で、Outlook側で[送受信]ボタンをクリックするなどしてサーバと同期すると、メールの受信等は行えるものの、エラーが発生する。同期ログには「Microsoft Exchange オフライン アドレス帳 0X8004010F」のエラーメッセージが残されている。

対処法

 まず前提として、Exchange Server 2010 のセットアップ中に「組織内に Outlook 2003 または Entourage を実行するクライアント コンピュータはありますか?」との問いに[はい]と答えておく。[いいえ]と答えてしまったときは、セットアップ完了後、Exchange Serverヘルプの「パブリック フォルダーについて」と「パブリック フォルダー データベースの作成」を参照して別途パブリックデータベースを作っておく。もっとも、これをしないとOutlook起動時に「Exchange サーバー管理者が、使用しているバージョンの Outlook をブロックしています。」と出てそもそもまったく接続できないのだが。
 そのうえで、サーバ側のExchange Management Console(EMC)にて次のように設定。

  1. ツリーで[組織の設定]-[メールボックス]をクリック。
  2. 右ペインの[データベースの管理]タブをクリック。
  3. 上ペインの[Mailbox Database …]の行を右クリックして[プロパティ]をクリック。
  4. [クライアントの設定]タブをクリックし、[オフライン アドレス帳]の[参照]をクリックして[既定のオフライン アドレス帳]を選択して[OK]をクリック。[OK]をクリックして[Mailbox Database … のプロパティ]を閉じる。
  5. 右ペインの[オフライン アドレス帳]タブをクリック。
  6. [既定のオフライン アドレス帳]行を右クリックして[プロパティ]をクリック。
  7. [配布]タブをクリックして次のものにチェックを入れ、[OK]をクリックする。
    • [Outlook 2003 SP2 またはそれ以降 (Version 4)]
    • [Web ベースの配布を有効にする]
    • [パブリック フォルダーの配布を有効にする]
  8. [既定のオフライン アドレス帳]行を右クリックして[更新]をクリック。表示されたダイアログボックスで[はい]をクリック。

 最後にOutlookを再起動して試してみる。

所感

 KB905813に、「この資料は以下の製品について記述したものです」に入っているにもかかわらずExchange Server 2010向けの手順が載っていないのはいかにも不親切。いや、そもそも別の問題なのだろうか。なんだかよくわからない。