2011年7月29日金曜日

Power Mac G5にUbuntu Server 10.4をInstall

開発用のServerが足りなくなったので、社内に余ってたPower Mac G5にUbuntuをInstallしたときのMemo.

(結局10.10はserver版がなかったので、途中の経緯は読み飛ばしてもOK)

UbuntuのInstall ISOはhttp://releases.ubuntu.com/から。

< 2011/10/26 Modified >
PowerPC用のUbuntu Install Imageは下記SiteにLink集があった
https://wiki.ubuntu.com/PowerPCDownloads

Mac用Ubuntu 10.10のInstall Imagesはhttp://cdimage.ubuntu.com/ports/releases/10.10/release/
から
ubuntu-10.10-alternate-powerpc.iso
をDownload。最新版が欲しい場合は上の階層にいけば見つかる。

DownloadしてCDに焼いたあとはInstall作業。

(一度立ち上げて)CDを挿入したあとは、Shutdown → cを押しながら起動 → promptが表示されるので「install」と入力。

あとは画面の指示に従っていけばいい。ちなみにあとでPartitionを自由に変更したかったので、LVMを指定してInstallした。

install完了後起動すると、Fatal Errorが出力されるけれど、一応Login出来る(解像度が高いDisplayでないと表示出来ないので注意)。

Installで問題が起きるとKeyboardのCD Eject Keyさえ効かなくなるので、下記siteを参考に、

CD または DVD を取り出せない、またはドライブトレイが開かない場合

起動 → Control + Mac key + O + F → promptに「eject cd」と入力 → 「shut-sown」でre-install。

InstallするSoftwareは最小限にしたいので、今度はbootのpromptで「expert video=ofonly」と入力。細かい設定をしながらinstallしてみた。

・・・けど同じSoftwareは選択できず。大人しく10.4で用意されているserver install imageを使うことにした。

server版はsoftwareを(簡易的だけれど)選択できる。2,3回installし直してやっと完了。注意点は

  • LVMは選択しない(なぜかMountできず)
  • driverを選択するときはdefaultの「現在のkernelに対応してるのだけ」を選択(図1)
  • cuiでも高解像度のDisplayが必要(CRTで表示できず)
  • SSH serverをinstallしておけばinstall直後に他のPCからSSH接続できて便利
  • 起動した直後にDeviceがなくて表示されるFatal Errorは気にしない

Server RoomのCRTで表示したかったので、Consoleの解像度を設定できるか調査。下記Siteを参考に、/etc/yaboot.confを

append="quiet nosplash video=800x600"

に設定してみた。反映させるには下記Command

$ sudo ybin -v

けど表示できず(800x600の画面にはなった)。

[all variants] PPC - Yaboot - How to configure the PPC Bootloader - Multibooting - Ubuntu Forums

省電力マシンで Ubuntu 10.04 Server セットアップメモ - nabeの雑記帳

< CUIでもCRTで表示できない問題に関する追記 >
install時に選択できるfontは関係ないみたい(図2)

Ubuntu Forumに同じ内容で困っていて解決されてないので、今のところ諦め。
[ubuntu] 10.04 issue with an old CRT monitor--not even a console login prompt... - Ubuntu Forums

 

図1. driverを選択するときはdefaultの「現在のkernelに対応してるのだけ」を選択

photo2

図2. cuiでも高解像度のDisplayが必要(CRTで表示できず) → install時に選択できるfontは関係ないみたい。

photo

2011年7月28日木曜日

Adobe PhotoshopでButtonを作るTutorial

Designに関してはjQuery UIを使うことで逃げていたけど、最近はAdobeのPhotoshop, Illustrator, Fireworksを使う機会が多くなった。

Designerが作ったのを分解してWebに落としこむなど。

Buttonぐらいは自分で作れるようになろうと調べたMemo

PhotoShopで美しいボタンを作るチュートリアル39個:phpspot開発日誌

 

< Related Posts >

[Design]Free PSD Graphic Sample集

2011年7月27日水曜日

Google AnalyticsでFacebook LikeとTwitterをTrackingする

下記記事(英語)を読んで"Social PluginのTrackingがGoogle Analyticsを使って出来るぜ"ということなので実際Bloggerでscriptを設置してみた。

Google Analytics Blog: +1 reporting in Google Webmaster Tools and Google Analytics

Mashable: Google Analytics & Webmaster Tools Now Track the Impact of Tweets, Likes and +1s

Bloggerの場合はDashboard -> Design. Html/JavaScriptのWidgetを追加。Google CodeのGoogle AnalyticsにあるSample CodeからSourceを<script>を付けて保存すれば完了。

< 2011/10/18 Modified >
最後に下記Scriptを追記するのを忘れずに。

<script type="text/javascript">
  _ga.trackSocial();
</script>

2011年7月26日火曜日

初空手試合 in Singapore

この前の日曜はSingaporeで初めての空手試合。今通っている道場(JKA)の先生繋がりで出場することになったらしい。

この大会はKUS(Karate Union of Singapore). この辺の団体事情はよく分からない。糸東流、松濤館、剛柔流の選手を見かけた。

形は苦手なので組手だけ。

組手はWKF(世界空手道連盟)のと同じ(?)。概要は

  • 拳サポ+足サポ+マウスピース+(金サポ)
  • 1試合3分
  • 8ポイント差がついたら(3分待たずに)勝ち
  • 上段蹴り=3ポイント、中段蹴り=2ポイント、突き=1ポイント

足サポを付けるのは初めてだったので、最初はしゃいでいたけど、他の試合を見ながら待っている間に思った・・・

( ゚Д゚) 追い突きしよ・・・

そしてこれが試合

最初の追い突きがダメすぎる。他の追い突きは許せる。ただ確かに当てすぎ。ポイント制の試合って分かっているので、もっとControlすべき。

流派が違っても、相手が誰であっても、体格が桁違いの相手であっても、誰もが納得できる「追い突き」で技ありを取るのが夢(目標)。

まだまだ修行が足らない。

 

< Related Posts >

Singaporeでマウスピース(Mouse Guard)を買う(作り方)
初空手稽古 in Singapore

2011年7月25日月曜日

Singaporeでマウスピース(Mouse Guard)を買う(作り方)

空手の試合で必要になったので、周りの人に聞いてマウスピースを買ったときのMemo.

買った場所はCity HallのMRTから降りて、地下を通って抜けたところのMarina Square. 店の名前は

Liang Seng Sports(Google Map)(HomePage)

City Hallから行くと、Marina Squareに入って、3階まで行って真っ直ぐ進むと吹き抜けのEventをやっている会場の上に出るので、そこを左の方に曲がるとすぐ見える。場所の番号は#03-346.

Mouse Guardの種類は3種類だけだったので、Senior用のSingleを購入。S$7ぐらい。安すぎ・・・。

作ったことがある人なら分かると思うけど、以下作り方の手順

  1. 沸騰したお湯に30秒浸ける(柔らかくなる)
  2. 普通の水に1秒浸ける
  3. 口に入れて軽く噛む(歯型が出来る感覚が分かる)
  4. 1分ぐらい噛んだら、また水に戻して冷やす(固める)
  5. 奥歯の歯型がない部分はハサミで切る
  6. 何回か口に入れて確かめながらハサミで整形する
  7. 奥の方を緩やかなカットにしておくと入れやすいし、気持ち悪くならない。

下記Siteも参考に。

マウスピースの作り方

安いし、噛みあわせも変わってくるので、1年ぐらいで買い換えるつもりでいいと思う。

2011年7月22日金曜日

日本の2輪免許証をSingaporeで切替(調査編)

日本でHornet250を乗っていたけど、SingaporeでBikeに乗るためにはどうすればいいか聞いたのでMemo.

日本で2輪の免許を持っていれば、Paper Testを受けるだけで切替できるらしい。ちなみにTestは英語。基本は日本の交通Ruleと同じだけど、標識、白線の数と意味あたりは勉強しないとダメらしい。

このPaper Test(Theory Test)はInternetでBooking(予約)する。本番の前にS$10ぐらいで練習できるので難しくはないらしい。

Singapore Safety Driving Center (SSDC)

Bukit Batok Driving Centre(こっちの方が今住んでいるところから近い)

Singaporeに山とかないので、Malaysiaまで行けば結構楽しいらしい。

あれ?Malaysiaで乗るためにはMalaysiaでも免許更新しないといけないのかな?
→ 必要ないらしい。

MalaysiaをBikeで旅するのも楽しそう!!

2011年7月21日木曜日

[PHP]お問い合わせFormでMailを送信するLibrary

HTMLで作ったFormからEmailを送信するのを作ってほしいと頼まれたときのMemo.

まずはServer上のPHP versionとMailが送信できるか確認。

Emailを送信するSample

<?php
$to      = 'hoge@hoge.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: noreply@hoge.com';

mail($to, $subject, $message, $headers);
//mail($to, $subject, $message);
?>

Mailを送信するPHP Libraryはたくさんあるけど、Wordpressでも使っているPHPMailerを使うことにした。Wordpressでは
wp-includes/class-phpmailer.php
wp-includes/pluggable.phpのwp_mail
を読めば参考になる。

単純な使い方は下記のような感じ。使ったのはPHPMailer Lite v5.1

define('MAIL_TO', 'hoge@hoge.com');
define('MAIL_FROM', 'noreply@hoge.com');
//error_reporting(E_ALL);
if ($_POST && strpos($_SERVER['HTTP_REFERER'], 'hoge.com')) {
    require_once('./PHPMailer-Lite/class.phpmailer-lite.php');
    $mail = new PHPMailerLite();
    $mail->IsMail(); // telling the class to use native PHP mail()
   
    $mail->SetFrom(MAIL_FROM);
    $mail->AddAddress(MAIL_TO);

    $mail->Subject    = 'Contact from Website';

    $body = get_message($_POST);
    $mail->Body = strip_tags($body);

    if(!$mail->Send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
        echo "Message sent!";
    }
}

 

spamに利用されないように同じdomainかどうかはcheckした方がいい。

if (!strpos($_SERVER['HTTP_REFERER'],'hoge.com')) {
  //error
}

SecurimageなどのPHP Libraryを併用すればさらに安心。

 

< Related Posts >

【PHP】Zend_Mailを使ってメールを送信する(SMTP)(日本語対応)

2011年7月20日水曜日

Google Desktopを止めてThunderbirdに戻った

Dual Displayの環境だとGoogle Desktopと他のWindowが重なった部分がチカチカするので(私だけ?)、ThunderbirdがVer5になったのを機に移行してみた。

< 2011/08/17 Modified >
Windows7のDesktop Themeを有効にしたらチカチカしなくなった。

移行するもの

  • Google Calendar(予定の確認と追加)
  • Gmail(独自Domain = Google Apps)

Thunderbirdで追加するPlugin

GmailはIMAPを設定すればサクっと終了。Gmailヘルプの推奨されるIMAPクライアントの設定も参考に。

Google Tasksとも同期して欲しかったけど、まだ出来ないみたい。

 

< Related Posts >

Windows Live MailからThunderbirdに乗り換えた
GmailとGoogle デスクトップで脱メーラー。メール通知アプリ
Thunderbird + Lightningでスケジュール管理

2011年7月19日火曜日

相対Pathで別swfを読み込むと失敗することがあるので現在のURLを取得する

相対Pathで指定すると現在(object, embed tagが貼りつけてある)htmlが表示されているURLからのPathになる。swfの置き場所がどこになるのか分からないので、Mainのswfが置いてあるURLを取得する方法を調査。

Action Script 3.0

次のような感じ。

var current_url = root.loaderInfo.loaderURL;
this._swf_url = current_url.substr(0, current_url.lastIndexOf("/"));

this._pageLoader.load(new URLRequest(this._swf_url + "/hoge.swf"));

 

< Related Posts >

FirefoxのFlashFirebugでFlash内のTraceを表示する
AS3からAS2の外部swfを読みこんでEventを取得したい
初めてのFlash。お役立ちLink集

2011年7月18日月曜日

cssで@importを使うと読み込みが遅くなる

今まで当たり前のように複数のCSSファイルを一つのCSSから@importを使って読み込むようにしていた。その方が管理し易いし、長くなったCSSを分割したり、追加したりするときもCSSだけで完結する。

でも、この方法はPerformanceが落ちるらしい。

[css] @importを使うべきでない理由 | Screw-Axis

「遅くなると言っても無視できるLevelじゃないの?」と思い、実際に今開発中のwordpressで試してみた。

image

それがこれになった。

image

この開発用のServerはReverse Proxyを使っているので、別の環境でやればここまで差が出るとは思わないけど、ここまで違うのはちょっと驚き。

 

< Related Post >

ApacheにReverse Proxyを設定して社内の別Serverを外部に公開

2011年7月15日金曜日

[Wordpress]Global変数を汚さずにWP_Queryを使って記事を取得

表示している記事とは別に、他の条件を指定して記事を取得したいときがある。Sidebarに閲覧数のRankingを表示させるとか。

get_postsquery_postsが便利だけど、これらはGlobalな$wp_queryを使うので、WP_QueryをInstance化する方法がOfficial Documentでも記載されている。

この方法の注意点は、独自のparameterを追加して、add_filter('posts_where', hoge())する際に引数を指定しないと実行中のquery Objectを取得できない。詳細はadd_filterのOfficial Document(英語)で。

以下はCustom Fieldにviewsというkeyがあるのだけ絞り込むsample

// Create a new instance
$second_query = new WP_Query( 'view_ranking=true' );

// The Loop
while( $second_query->have_posts() ) : $second_query->the_post();
    echo '<li>';
    the_title();
    echo '</li>';
endwhile;

//loop中に使用した$postを$wp_queryからsetし直す
wp_reset_postdata();

//この関数とadd_filterはthemeのfunctions.phpとかに追記しておく
function hook_posts_where($where, $query) {
    global $wpdb;
    $ranking_count = $query->get('view_ranking');
    if (!empty($ranking_count)) {
        $sql = array();
        $sql[] = "SELECT count(*)";
        $sql[] = "FROM $wpdb->postmeta";
        $sql[] = "WHERE post_id = $wpdb->posts.ID";
        $sql[] = "  And meta_key = 'views'";
        $add_sql[] = "(" . implode(" ", $sql) . ") > 0";
    }

    if (!empty($add_sql)) {
        $where .= " And " . implode(" And ", $add_sql);
    }
    return $where;
}
add_filter('posts_where', 'hook_posts_where', 10, 2);

 

< Related Posts >

Wordpress 開発リファレンスのリンク集
[Wordpress]適用されるfilterとactionを表示する
【PHP】オブジェクトと連想配列。相互変換する

2011年7月14日木曜日

Facebook APIのOAuthで認証する

Facebook Developers Authenticationの項に書いてあるので、それを読めば間違いない。

  1. Facebookにlogin
  2. ここからWebsiteを登録する。
  3. 登録後、My Apps(Developer Dashboard)に登録されたSiteが表示されているはず。

fbAsyncInitを使った方が非同期で読み込むので、他の処理が邪魔されずに済むらしい。こちら

LoginしたUser Nameをalertする場合は下記のようになる。

window.fbAsyncInit = function() {
    FB.Event.subscribe('auth.login', function(response) {
        var query = FB.Data.query('select name, uid from user where uid={0}', response.session.uid);
        query.wait(function(rows) {
            alert('Your name is ' + rows[0].name);
        });
    });
    FB.init({appId: '<%= app.set('fb_appid')%>', status: true, cookie: true,
      xfbml: true});
};
(function() {
    var e = document.createElement('script');
    e.type = 'text/javascript';
    e.src = document.location.protocol +
      '//connect.facebook.net/en_US/all.js';
    e.async = true;
    document.getElementById('fb-root').appendChild(e);
}());

大雑把な説明

  1. loginしたときのeventにbind(詳しくはこちら)。引数で渡されるresponseの構造はChromeのDeveloper Toolsを起動すれば分かるけど、こちらにも簡単な説明がある。
  2. Queryを発行して名前を取得(詳しくはこちら)。Facebook Query Language(FQL)に関してはこちら

 

本当はsessionでlogin状態を管理したい。

Server側はnode.jsを使っているので、この辺はまた調査。

2011年7月13日水曜日

MySQL4.1の環境をXampp for Linuxを使って別Port(3つ目)で構築

はSourceからCompileしようとしたけど、既存のMySQLに影響が出たので、Xampp for Linux(Lampp)を使って構築するようにした。

環境はCentOS 5.6 32bit

ちなみに既にmysqld, lamppがInstallされているので、このServerにとっては3つ目のMySQL.

今はSingaporeに来たばかりで今のNetwork環境で何とかやりくりしているけど、次回引越しするときはServer, Network環境を設計し直してやると思いながら・・・。

MySQL 4.1はXampp for Linux 1.4.16までなので、こちらからDownload.

解凍
# tar xzvf xampp-linux-1.4.16.tar.gz
# mv lampp /opt/lampp14

今回はMySQLだけ利用したいので他は起動させない。
# cd /opt
# lampp14/etc/my.cnf

[client]
port            = 3309
socket          = /opt/lampp14/var/mysql/mysql.sock

[mysqld]
port            = 3309
socket          = /opt/lampp14/var/mysql/mysql.sock
tmpdir          = /tmp/mysql41/

# mkdir /tmp/mysql41
# chmod 777 /tmp/mysql41

# cp /opt/lampp14/lampp /etc/rc.d/init.d/lampp14
# vi /etc/rc.d/init.d/lampp14

/opt/lampp/を/opt/lampp14/に一括で変換

3306を3309に。

でも思うように動いてくれない・・・。

いろいろ調べてみるとSource Code自体に/opt/lampp/の文字が入っているので、compileからやらないとダメみたい・・・。

 

< Related Posts >

Xampp for Linuxを別Portで起動する設定
Xampp For Linux(Lampp)でサーバ構築と設定

2011年7月12日火曜日

CentOSにMySQL4.1をInstallして複数起動(失敗編)

お客様の環境に合わせて、MySQL4.1の環境が欲しかったので、SourceからCompileして、既存のMySQLと競合しないように別Portで起動させたときのMemo. (途中で諦めたんだけど・・・)

環境はCentOS 5.6 32bit

必要なToolsをInstallしておく
# yum install gcc gcc-c++ libtermcap-devel

SourceのDownloadはこちらから。

# cd /opt/software
# unzip openlogic-mysql-4.1.22-all-src-1.zip
# cd mysql-4.1.22-src/

compile optionを確認する
# ./configure --help

Install prefixを変更してcompile
#  ./configure --prefix=/usr/local/mysql41
# make

compileの途中で
error: redeclaration of C++ built-in type
のようなErrorで怒られたら、(検索して解決したあとに)
# make clean
# make distclean
して再compile.

# make install

installが完了したら、下記Official Documentに従って初期化を行う。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 2.4 インストール後の設定とテスト

# ./scripts/mysql_install_db
# cd /usr/local/mysql41
# bin/mysqld_safe --user=mysql &

ここで、
A mysqld process already exists
と怒られたので、mysql_install_dbの出力messageに従うことにした。

# cp support-files/mysql.server /etc/rc.d/init.d/mysql41
# chmod 755 /etc/rc.d/init.d/mysql41

あとはこの起動Scriptを読んで、必要そうなのを準備
# mkdir /usr/local/mysql41/var
# chown mysql /usr/local/mysql41/var
# mkdir /usr/local/mysql41/tmp
# chmod 777 /usr/local/mysql41/tmp
# mkdir /usr/local/mysql41/log

my.cnfはsupport-filesにあるのをcopy
cp /opt/software/mysql-4.1.22-src/support-files/my-small.cnf etc/my.cnf
# vi etc/my.cnf
# vi /etc/rc.d/init.d/mysql41

[client]
port            = 3309
socket          = /usr/local/mysql41/tmp/mysql.sock

[mysqld]
port = 3309
socket = /usr/local/mysql41/tmp/mysql.sock
log-error       = /usr/local/mysql41/log/mysqld.log
pid-file        = /usr/local/var/mysqld.pid

# vi /etc/rc.d/init.d/mysql41

conf=/usr/local/mysql41/var/my.cnf

これで起動してみる。
# /etc/rc.d/init.d/mysql41 start

・・・失敗。logを見てあーだこーだしてみたけどダメ。既存のMySQLにも影響が出たのでuninstallすることにした。

まずはBackup
# cd /var/lib/
# tar -czvf /tmp/mysql20110611.tar.gz mysql/

# yum remove mysql
# yum install mysql mysql-server php-mysql php-devel
# rm -rf /usr/local/mysql41
# rm -f /etc/rc.d/init.d/mysql41

起動後に下記Errorが出たけど、もう一度再起動したら直った。

Error#2013 - Lost connection to MySQL server at 'reading initial communication packet', system error: 111

Xampp for linuxのMySQL4.1が入っているPackageを使お。

 

< Related Posts >

【Linux】Xampp(lampp)のMySQLを複数起動

2011年7月11日月曜日

[CentOS]VPSにswap領域を追加したくて調査(結論:出来ない)

借りていたVPSにはdefaultでswap領域が割り当てられていない。yum updateしようとしたら下記Errorになるので、手動でswap領域を追加できるか調査

memory alloc (24 bytes) returned NULL

環境はCentOS 5.6 64bit

ちなみにUSONYXという日本のクララオンラインが海外展開しているVPS Serviceを利用。


< 2011/12/27 Modified >
USONYXのVPSは、いろんなcronとServiceが設定されているので使いづらい。Maintenanceで普通に再起動されるので、VPSの意味がない。今の状態ではオススメ出来ない。


swap領域を拡張するためにはfdiskを使って、diskに新規partitionを作成しなければならない。dfで確認してみると、物理(仮想)diskがmountされているだけで、
# fdisk /dev/simfs
とかやってみても開くことができない。

つまり、VPS上でSwap領域を作成することはできない。

Memoryを使い切ると、本当にProgramが途中で止まるので、余裕のある運用をしないとダメみたい。

 

< Related Posts >

2011年7月8日金曜日

JavaScriptをconsole.logでDebugする

最近知ったconsole.logとconsole.debug関数

これを使うとFirebugやGoogle ChromeのDeveloper Toolsのconsoleにobjectや配列の中身を出力できる。

詳しくは下記siteで。

Firebug の強力な JavaScript デバッグ機能 - Google AJAX Search API - Google Code

IEではsupportされないので、あくまでdebug用として使うか、Google先生に聞くと拡張した便利関数が見つかる。

昔はalertだけでdebugしていたのが懐かしい。

2011年7月7日木曜日

jquery-scroll-followがjQuery 1.6で動かない

このblogでも詳細記事で使っているjquery.scrollfollow.js(配布元)がerrorを吐くようになっていたので調べてみた。

原因はjQuery 1.6だと動かないみたい。ここを参考に修正。

var parentHeight = parseInt( box.cont.attr( 'offsetHeight' ) );
var boxHeight = parseInt( box.attr( 'offsetHeight' ) + ( parseInt( box.css( 'marginTop' ) ) || 0 ) + ( parseInt( box.css( 'marginBottom' ) ) || 0 ) );

これを次のように変更。

var parentHeight = parseInt(box.cont.css('padding-top')) + parseInt(box.cont.css('height'));
var boxHeight = parseInt( (parseInt(box.css('padding-top')) + parseInt(box.css('height'))) + ( parseInt( box.css( 'marginTop' ) ) || 0 ) + ( parseInt( box.css( 'marginBottom' ) ) || 0 ) );

Google CDNを使って最新のVersionを取得しないようにしたほうがいいかもね。

 

< Related Posts >

Bloggerの記事にFacebook, Twitterのshare linkを表示
[jQuery]Scrollしても位置を固定のままにしてくれるPlugin

2011年7月6日水曜日

jQueryからMooToolsへ乗り換えようかと調べてみた

jQueryでclassの継承とかを実装するときに、なんか直感的じゃないなと調べていたら、MooToolsというJavaScript Frameworkなら簡単に実現できるみたい。

jQuery vs MooTools(和訳)原文

なんかよさげ。でも

  • 今後も継続的にMaintenanceされるか
  • 社内で自分だけ「MooToolsの方がいいんです!」と言っても・・・。社内で使うLibraryは統一していきたい。
  • jQuery UI, jQuery Mobileは使いたい

と考えると、やっぱりjQueryのやり方に慣れた方がいいのか?

jQueryのpluginで
HJS - JQUERY OBJECT ORIENTED CLASS
を使うと、ある程度Object指向っぽい書き方ができる。

ちなみにMooToolsにはserver-side versionもあるので、node.jsの開発をしている身としてはすごく惹かれる。

2011年7月4日月曜日

[node.js]sourceを修正して再Compile

前の記事でも悩まされていた下記Error. Browserを立ち上げて最初にAccessしたときになるみたい。

events.js:45
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: EBADF, Bad file descriptor

環境はCentOS 5.6 64bit, node.js v0.4.8, Express v0.7.7, socket.io v0.6.18

Google Chrome + Inspectorを使ってDebugするとErrorになった箇所をみることができる。InspectorのInstallの仕方は前の記事を参考に。

Inspectorの機能でTraceすると、fs.jsの
ReadStream.prototype.destroy.close
を実行するときにErrorになっているみたい。

image

fs.jsやevents.jsはcompileして組み込まれているみたいなので、これを回避するためにsourceを修正して再Compileしてみた。

すでにnvmがinstallされている前提

Errorになっていた箇所を分岐して回避
# cd ./.nvm/src/node-v0.4.8
# make clean
# make distclean
# vi lib/fs.js

if (cb) cb(err);
if (err.code != 'EBADF') {
  self.emit('error', err);
)
return;

これでRebuild. そのままmakeしても出来たかもしれない。

# cd ..
# rm -f node-v0.4.8.tar.gz
# tar czvf node-v0.4.8.tar.gz node-v0.4.8/
# rm -rf node-v0.4.8
# cd ..
# rm -rf v0.4.8
# cp v0.4.5 v0.4.8
# cd
# nvm install v0.4.8

node-inspectorとnode-devもinstallし直し。
# npm install -g node-inspector node-dev

これで一応Errorは出なくなったけど、この修正が正しいかどうかは分からない。node.jsがVersion up すれば直っていると思う。

< Modified >
後で気付いたけど、alias使ってSubDirectoryに公開していると起こる。socket.ioがBackgroundでWebSocketMain.swfとかにAccessするときに404 not foundになっているのが原因じゃないかな?

io.SocketをInstance化するときにParameterを渡すと回避することも可能みたい(詳しくはSourceを読む)。

 

< Related Posts >

ApacheのReverse Proxyで502 Proxy Errorが出力される
[node.js]express-mvc-bootstrap + socket.io
[node.js]node-inspectorを使ってdebugする(express-mvc-bootstrap)

2011年7月1日金曜日

ApacheのReverse Proxyで502 Proxy Errorが出力される

node.js + socket.io(websocket)を使った開発をしていて、たまに下記Errorが出力される。

GET http://dev.hoge.com/socket.io/xhr-polling/5791412864346057/1307368752522 502 (Proxy Error)

(結果だけ知りたい人はこの記事の一番下へ。)Google先生に聞いてみると、apacheのversionを上げると直るという情報がHit。

下記記事を参考にyum経由で上げようとしてみた。今の環境はCentOS 5.6 + apache 2.2.3

# vi /etc/yum.repos.d/utter.repo

[utter]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

# yum --enablerepo=utter install httpd

でも、already installedと言われた。なんか依存関係でInstallできないのかな?wingも駄目だった。

 

「どーしたもんかなー」と調べ直してみたら、下記の情報がhit。

apacheのconfに下記のようにproxy-nokeepaliveを追記してみたら、あっさり直った。

<Proxy *>
        SetEnv force-proxy-request-1.0 1 
        SetEnv proxy-nokeepalive 1
</Proxy>

もしくは

<Location /hoge>
        SetEnv force-proxy-request-1.0 1 
        SetEnv proxy-nokeepalive 1
</Location>

詳しくはApacheのmod_proxyのReferenceを参照。

 

< 2011/07/01 Modified >
さらに下記Errorが出るのでforce-proxy-requestも追記。・・・と思ったけど、force-proxy-requestを追加しても再現する。Lamppのapache経由だと発生しないんだけどなー。

events.js:45
        throw arguments[1]; // Unhandled 'error' event

Error: EBADF, Bad file descriptor

 

< 2012/10/06 Modified >
Windows 2003 ServerのIISにRedirectすると下記Errorが頻発するようになった。

Proxy Error
The proxy server received an invalid response from an upstream server

ここを参考にProxyPassにkeepalive=onを追加したら大丈夫っぽい。やっぱりダメ。IP Addressを直接叩けば大丈夫なので、apacheとiisの相性なのか。。。?

ProxyPass /hoge http://192.168.0.22/hoge timeout=600 keepalive=On

詳しくは下記Official Documentで。

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives