SQL Server の日付

SQL Server の日付フィールドを php で select して
MySQL へ insert する処理を行ったら
日付が 00-00-00 00:00:00 になってしまった ❗

どうも select するときにフォーマットを指定する必要があったようです。

SELECT CONVERT(VARCHAR, DATE, 120) FROM hogetable;

めんどいですねー :mrgreen:

httpd ログローテーション

あるお客様のサーバで httpd のログローテーションに失敗していました 😥

logrotate が access_log を olddir/access_log.1 に move してくれる
のですが、httpd が olddir/access_log.1 にログを書き込み続けてしまう
現象です。
本来は新しく作成された access_log にログを書きこんで欲しいのです。

調べたところ、同じ httpd に対する logrotate の設定ファイルが 3 つありました。

/etc/logrotate.d/httpd
/etc/logrotate.d/httpd1
/etc/logrotate.d/httpd2

それぞれ postrotate で SIGHUP を httpd に送っているのですが、
httpd1, httpd2 の SIGHUP を httpd が受信していないのが原因っぽいです。

多分 3 つのローテーションが一瞬で行われるので、一瞬の間に
3 回 SIGHUP が httpd に対して送られます。
しかし、httpd は立て続けにシグナルを受信できないようで、
最初の SIGHUP を受信後、httpd1, httpd2 の
SIGHUP は無視されているっぽいです。

実際に以下のようにやって httpd のログを見てみると最初の
シグナルしか受信していないのがわかります。

kill -HUP httpd_pid; kill -HUP httpd_pid; kill -HUP httpd_pid

そして、間に sleep 1 をいれて試してみたところ 3 回シグナルを受信しました。

そんな訳で、postrotate に sleep 1 を入れて様子見中です。。。 :mrgreen:

Google App Engine

Google App Engine で静的ファイルを表示してみました 🙂

  1. Account 認証
  2. 携帯のメールアドレスを使ってアカウントの認証を行います。Send をクリックすると指定した携帯のメールアドレスに verification number が届きます。
     
     
     
     

  3. verification code の入力
  4. 携帯に届いた番号を入力して Send をクリック。

     
     
     
     
     
     

  5. Application 作成
  6. 続いて Application の作成を行います。


     
     
     
     
     
     

  7. Application Identifier, Application Title 作成
  8. ここで指定する Application Identifier は一度登録すると変更できないみたいです。
    Application Title は後から変更可能。


     
     
     
     
     
     
     
     
     

  9. 登録完了

  10.  
     
     
     
     
     

  11. python 2.X ダウンロード
  12. GAE では ftp や scp でファイルをアップロードする事ができません。
    python で動作するツールを使ってアップロードします。
    その為に python 2.X が必要になりますので、ダウンロードします。

    http://www.python.org/download/releases/2.7.2/ から
    Windows X86-64 MSI Installer (2.7.2) [1] をダウンロードしました。

    インストールはダウンロードしたファイルをダブルクリックして Next で進んでいくだけです。 :mrgreen:
     
     
     

  13. App Engine SDK ダウンロード
  14. http://code.google.com/intl/ja/appengine/downloads.htmlからWindows用をダウンロードしました。

    こちらもインストールはダウンロードしたファイルをダブルクリックして Next で進んでいくだけです。
    最初に python 2.5.X をダウンロードするように指示が出ますが、先ほど既に 2.7.2 をダウンロード済みですので、無視して Next しました。
     
     
     

  15. Google App Engine Launcher の起動
  16. 最初に Google App Engine Launcher を起動すると Warning が出ました ❗

    どうも python が見つからないのが原因みたいです。
    Google App Engine Launcher の Edit>Preferences…で Python Path を指定するれば解決します。

     
     
     
     
     
     
     
     

  17. Create New Application
  18. Google App Engine Launcher の File>Create New Application… でアプリケーションを作成します。

    Application Name に yonageya を指定して、プロジェクトを保存するディレクトリを Parent Directory に指定して、Port はデフォルトのままで Create をクリックします。

    すると、Parent Directory の中に yonageya という名前のフォルダが作成され、その中に以下のファイルが作成されます。

    app.yaml
    index.yaml
    main.py

     
     

  19. app.yaml を変更
  20.  
    Google App Engine Launcher の Edit をクリックして app.yaml を編集します。
    (エディタが起動して app.yaml が編集できます)

    app.yaml の先頭は Application Identifier の定義や version の情報が記述されているのが分かります。
    Google App Engine にはバージョン管理を行う機能があるみたいなので、その為の記述なのでは? 😎

    handlers セクションではスタイルシート用の設定、- url: /.* というのはスクリプトハンドラというみたいで、指定した URL パターンとマッチするファイルがあったら、ファイルの拡張子の MIME タイプを使用して処理をしてくれるみたいです。

    詳しくはPython アップリケーションの設定で説明されています。
     
     
     
     
     
     
     
     
     
     

  21. yonageya/index.html 作成
  22.  
    表示する HTML を yonageya/index.html に作成します。

    GAE testGAE test.

    それと、スタイルシート yonageya/stylesheets/yng.css を作成します。

    body {
      font-family: Verdana, Helvetica, sans-serif;
      background-color: #DDDDDD;
    }

     
     

  23. テスト
  24.  
    作成した index.html を表示できるかテストしてみます。

    Google App Engine Launcher の Run をクリックします。

    そして、ブラウザで http://localhost:8080/ へアクセスすると作成した HTML が表示されます。
    表示されなければ Google App Engine Launcher の Logs をクリックしてエラーメッセージを確認すると解決できるかもしれません :mrgreen:


     
     
     
     
     
     
     
     
     
     
     
     
     

  25. Deploy
  26.  
    実際に GAE にアップロードします。
    Google App Engine Launcher の Deploy をクリックします。

    すると、メールアドレスとパスワードを聞かれるので、それぞれ入力して OK をクリックします。

    ログが表示されますので、エラーが無ければOKです。


     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

  27. アップロードできました!
  28.  
    ブラウザで http://yonageya.appspot.com/ へアクセスすると Deploy した HTML が表示されます ❗

セカンダリDNSサービス

お名前.comでセカンダリ DNS の無料サービスがあったなんて知りませんでした 😮

DNS関連サービス

当然ですが、お名前.comで登録したドメインしか指定できませんが 😎

さっそく利用開始しました :mrgreen:

DNS サーバに bind を利用している事がバレますが。。。

named.conf で以下のように zone 転送を許可します。
※210.172.129.81 はセカンダリネームサーバの IP Address

zone "yonageya.com" IN {
        type master;
        file "yonageya.com.zone";
        allow-update {none;};
        allow-transfer {
                210.172.129.81;
        };
};

zone ファイルにセカンダリネームサーバを追加して、serial を上げます。

$TTL    3600
@       IN      SOA     ns1.yonageya.com. webmaster.yonageya.com. (
                                2011103101; Serial
                                1800; Refresh
                                900; Retry
                                86400; Expire
                                900); Minimum
;
        IN      NS      ns1.yonageya.com.
        IN      NS      2nd.dnsv.jp.
以下省略

IP フィルタなどで通信を制限している場合には、セカンダリ DNS サーバから tcp の 53 番ポートへのアクセスを許可します。
ウチの環境ではルータで IP フィルタの設定と NAT の設定を追加しました。

そして、named を再起動します。
OS が CentOS なので、以下のように実行します。

root# service named restart

以下のようなログが記録されていれば OK です :mrgreen:

※一部ログを省略しています

Oct 31 12:37:44 ns1 named: named startup succeeded
Oct 31 12:37:44 ns1 named[29132]: running
Oct 31 12:37:44 ns1 named[29132]: zone yonageya.com/IN: sending notifies (serial
 2011103101)
Oct 31 12:41:17 ns1 named[29132]: client 210.172.129.81#49506: transfer of 'yonageya.com/IN': AXFR started

コーヒーマシン

新しくコーヒーマシンを買い換えしました 🙂

一応全自動なので、豆と水を入れておけばスイッチを押すだけでコーヒーができます 😎

Delongi 社の ESAM1000SJ という製品です。

ネットの評判では音が大きくてうるさいという書き込みが多いですが、思ったより静かで私は気になりません 🙂

色々とコーヒーライフを楽しみたいと思います! :mrgreen:

カテゴリー: Life

陶芸体験

一週間前の日曜日に箱根で陶芸体験を行いました 🙂

あまりネットに情報がありませんが、「陶芸工房早雲箱根焼」という陶芸工房みたいです。

てびねりと電動ろくろが選べて、電動ろくろに挑戦しました。

最初先生がセッティングしてくれるので、素人でも簡単に作る事ができ、
すごく楽しかったです。
多分この最初のセッティングが難しいのではないでしょうか?

そして、できあがったのがこれです。

2~3か月後に焼きあがったら郵送してくれるそうです。
楽しみだな~ 🙂

カテゴリー: Life

Google Maps API Version3 infoWindow

Google Maps API Version3 の infoWindow についてです。

  • 1. マーカーをクリックした時に、他の infoWindow が閉じるようにしたい
  • 2. infoWindow に表示する内容を個別に指定したい
  • 3. ある程度 infoWindow のサイズをコントロールしたい

という要件があり、色々やってみたところなんとかできました。

忘れないようにメモです :mrgreen:

まずは地図の表示です。

...色々...
<script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>
</head>
<body>
<div id="gmap" style="width:500px; height:500px;"></div>
<script type="text/javascript">
      var latlng = new google.maps.LatLng(35.710126,139.810665);
      var myOptions = {
          zoom: 10,
          center: latlng,
          mapTypeId: google.maps.MapTypeId.ROADMAP
      };
      var map = new google.maps.Map(document.getElementById("gmap"), myOptions);
つづく...

次にマーカーと各マーカー用の infoWindow の指定です。

...つづき
var infoWindow;
var content;
 
//marker1
var myLatLng1 = new google.maps.LatLng(35.810126, 139.610665);
var marker1 = new google.maps.Marker({
    position: myLatLng1,
    map: map
});
google.maps.event.addListener(marker1, 'click', function() {
    if (infoWindow) infoWindow.close();
    infoWindow = new google.maps.InfoWindow({
        content: '<div style="width:200px;height:100px;"><p>マーカー1</p></div>'
        })
    infoWindow.open(map, marker1);
});
 
//marker2
var myLatLng2 = new google.maps.LatLng(35.710126, 139.610665);
var marker2 = new google.maps.Marker({
    position: myLatLng2,
    map: map
});
google.maps.event.addListener(marker2, 'click', function() {
    if (infoWindow) infoWindow.close();
    infoWindow = new google.maps.InfoWindow({
        content: '<div style="width:200px;height:100px;"><p>マーカー2</p></div>'
        })
    infoWindow.open(map, marker2);
});
 
//marker3
var myLatLng3 = new google.maps.LatLng(35.710126, 139.810665);
var marker3 = new google.maps.Marker({
    position: myLatLng3,
    map: map
});
google.maps.event.addListener(marker3, 'click', function() {
    if (infoWindow) infoWindow.close();
    infoWindow = new google.maps.InfoWindow({
        content: '<div style="width:200px;height:100px;"><p>マーカー3</p></div>'
        })
    infoWindow.open(map, marker3);
});
</script>

vsftpd ファイルサイズ制限

vsftpd でファイルサイズに制限をかける方法です。

元々 vsftpd にはファイルサイズに制限をかける機能はありませんので、
無理矢理制限をかける方法です。

自己責任でお願いいたします。

方法は簡単で、vsftpd を起動するシェルスクリプトで ulimit するだけです :mrgreen:

CentOS など linux の場合、/etc/rc.d/init.d/vsftpd がシェルスクリプトになりますので、
先頭の方で ulimit -f 制限するサイズ(キロバイト単位) を追加します。

~省略~
ulimit -f 20 #← 20 キロバイトに制限
start() {
         # Start daemons.
 
~省略~

そして vsftpd を再起動します。

root# service vsftpd restart

実際に制限を超えたサイズのファイルをアップロードしてみたところ
以下のエラーとなりました。

500 OOPS: child died

たとえば 10KB の制限をかけて、1MB のファイルをアップロードすると、
10KB の壊れたファイルが作成されます :mrgreen:

あまり良い方法ではありませんが、どうしても他に手段が無い 😥
という場合には使える手かもしれません 😎