住所から都道府県を取得するには?

php で住所から都道府県コードを取得する実装を考えてみました。

色んな方法があるかと思いますが自分の場合は以下になりました 🙂

//住所
$addr = "東京都港区ほげほげ1-2-3";
 
//先頭3文字を切り出す
$cut = mb_substr($addr, 0, 3, 'UTF-8');
 
//都道府県先頭3文字の配列を作成
$prefs = array(
        1 => '北海道',
        2 => '青森県',
        ...省略...
        14 => '神奈川', //県は削除
        15 => '新潟県',
        ...省略...
        30 => '和歌山', //県は削除
        ...省略...
        46 => '鹿児島', //県は削除
        47 => '沖縄県'
);
 
//検索
$prefjis = array_search($cut, $prefs);
 
echo $prefjis;

最初 [都道府県] で preg_match() していたのですが、
“広島県府中市” が出てきて “広島県府” となってしまい
この方法に行きつきました 🙂

メモメモ 🙂

LVM partition 拡張

LVM Partition を拡張したのでメモしときます。

1. DISK の未使用部分を LVM Partition(8e) に割り当てる
fdisk で /dev/sda3 を追加。

# fdisk -l /dev/sda
 
Disk /dev/sda: 1998.0 GB, 1997998653440 bytes
255 heads, 63 sectors/track, 242909 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x53c96b5d
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
/dev/sda2              64        9730    77637632   8e  Linux LVM
/dev/sda3            9730      242909  1873015886+  8e  Linux LVM
2. 作成した LVM Partition(8e) に PV を作成する
# pvcreate /dev/sda3
  Writing physical volume data to disk "/dev/sda3"
  Physical volume "/dev/sda3" successfully created

確認。

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               VolGroup00
  PV Size               74.04 GiB / not usable 10.00 MiB
  Allocatable           yes (but full)
  PE Size               32.00 MiB
  Total PE              2369
  Free PE               0
  Allocated PE          2369
  PV UUID               19Ucwg-EVtw-jCY4-Oiob-JgbP-iT6e-kHsXJa
 
  "/dev/sda3" is a new physical volume of "1.74 TiB"
  --- NEW Physical volume ---
  PV Name               /dev/sda3
  VG Name
  PV Size               1.74 TiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               NxgCf3-NFs6-5glX-sMM9-CdGp-tAgS-uBQ2A9
3. VG(VolumeGroup00) に PV を追加する
# vgextend VolGroup00 /dev/sda3
  Volume group "VolGroup00" successfully extended

確認。

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               VolGroup00
  PV Size               74.04 GiB / not usable 10.00 MiB
  Allocatable           yes (but full)
  PE Size               32.00 MiB
  Total PE              2369
  Free PE               0
  Allocated PE          2369
  PV UUID               19Ucwg-EVtw-jCY4-Oiob-JgbP-iT6e-kHsXJa
 
  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               VolGroup00
  PV Size               1.74 TiB / not usable 29.08 MiB
  Allocatable           yes
  PE Size               32.00 MiB
  Total PE              57159
  Free PE               57159
  Allocated PE          0
  PV UUID               NxgCf3-NFs6-5glX-sMM9-CdGp-tAgS-uBQ2A9
# vgdisplay
  --- Volume group ---
  VG Name               VolGroup00
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  7
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                5
  Open LV               5
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1.82 TiB
  PE Size               32.00 MiB
  Total PE              59528
  Alloc PE / Size       2369 / 74.03 GiB
  Free  PE / Size       57159 / 1.74 TiB
  VG UUID               T6SPgx-fbpY-9WP0-H6Ux-WJKb-V4eR-1632Cd
4. LV(home) のサイズを VG(VolGroup00) の空きサイズを割り当てて拡張する
# lvextend -l +57159 /dev/VolGroup00/home
  Extending logical volume home to 1.80 TiB
  Logical volume home successfully resized
5. サイズを確認
# lvdisplay
  --- Logical volume ---
  LV Path                /dev/VolGroup00/root
  LV Name                root
  VG Name                VolGroup00
  LV UUID                2ZzdSh-GjPN-y7Vk-U0ls-LiY3-4cfK-umDFpE
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2012-08-02 05:44:43 +0900
  LV Status              available
  # open                 1
  LV Size                6.00 GiB
  Current LE             192
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
 
  --- Logical volume ---
  LV Path                /dev/VolGroup00/swap
  LV Name                swap
  VG Name                VolGroup00
  LV UUID                OV2tSK-tmZz-bwqB-SWmC-TViE-Vd0r-ThqMqH
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2012-08-02 05:44:46 +0900
  LV Status              available
  # open                 1
  LV Size                4.00 GiB
  Current LE             128
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1
 
  --- Logical volume ---
  LV Path                /dev/VolGroup00/tmp
  LV Name                tmp
  VG Name                VolGroup00
  LV UUID                LUddtQ-2jvh-p2lI-27QP-QcIE-x4C1-gMsj5q
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2012-08-02 05:44:46 +0900
  LV Status              available
  # open                 1
  LV Size                2.00 GiB
  Current LE             64
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2
 
  --- Logical volume ---
  LV Path                /dev/VolGroup00/var
  LV Name                var
  VG Name                VolGroup00
  LV UUID                0y5eR0-5pcW-zrpL-iHsf-hvSK-2CAq-n1ENhC
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2012-08-02 05:44:48 +0900
  LV Status              available
  # open                 1
  LV Size                4.00 GiB
  Current LE             128
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:3
 
  --- Logical volume ---
  LV Path                /dev/VolGroup00/home
  LV Name                home
  VG Name                VolGroup00
  LV UUID                E0Q4NM-PLJm-RUGg-8A0u-LYmv-P18c-NyGtOZ
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2012-08-02 05:44:51 +0900
  LV Status              available
  # open                 1
  LV Size                1.80 TiB
  Current LE             59016
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:4
# vgdisplay
  --- Volume group ---
  VG Name               VolGroup00
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  8
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                5
  Open LV               5
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1.82 TiB
  PE Size               32.00 MiB
  Total PE              59528
  Alloc PE / Size       59528 / 1.82 TiB
  Free  PE / Size       0 / 0
  VG UUID               T6SPgx-fbpY-9WP0-H6Ux-WJKb-V4eR-1632Cd
6. ファイルシステムの拡張をする前に念のため umount

umout /home したら /home を使用しているプロセスがいて busy になったので、プロセス停止。

プロセスの調べ方は fuser コマンドを利用する。

# fuser -muv /home
                     USER        PID ACCESS COMMAND
/home:               mysql      2370 F.c.. (mysql)mysqld
                     root       2457 ....m (root)httpd
                     apache    19941 ....m (apache)httpd
                     apache    19942 ....m (apache)httpd
                     apache    19943 ....m (apache)httpd
                     apache    19944 ....m (apache)httpd
                     apache    19945 ....m (apache)httpd
                     apache    19946 ....m (apache)httpd
                     apache    19947 ....m (apache)httpd
                     apache    19948 ....m (apache)httpd
                     apache    19952 ....m (apache)httpd
                     apache    19959 ....m (apache)httpd
                     apache    19960 ....m (apache)httpd
                     apache    24180 ....m (apache)httpd
                     apache    26363 ....m (apache)httpd
                     apache    26511 ....m (apache)httpd
                     apache    26514 ....m (apache)httpd

プロセスが判明したら停止。

# service mysqld stop
# service httpd stop

そして umount

# cd /
# umount /home
7. ファイルシステムを拡張

拡張前のサイズ。

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-root
                      6.0G  4.1G  1.6G  72% /
tmpfs                 7.8G     0  7.8G   0% /dev/shm
/dev/sda1             485M  124M  336M  27% /boot
/dev/mapper/VolGroup00-home
                       58G  528M   54G   1% /home
/dev/mapper/VolGroup00-tmp
                      2.0G   68M  1.9G   4% /tmp
/dev/mapper/VolGroup00-var
                      4.0G  325M  3.5G   9% /var

fsck しないと拡張できないので必ず行う。

# e2fsck -n /dev/VolGroup00/home
# e2fsck /dev/VolGroup00/home
# e2fsck -f /dev/VolGroup00/home

いよいよファイルシステム拡張。

51分かかりました 😥

# resize2fs -p /dev/VolGroup00/home
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/VolGroup00/home to 483459072 (4k) blocks.
Begin pass 1 (max = 14289)
Extending the inode table     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/VolGroup00/home is now 483459072 blocks long.

mount してサイズ確認。

# mount /home
# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup00-root
                      6.0G  4.1G  1.6G  72% /
tmpfs                 7.8G     0  7.8G   0% /dev/shm
/dev/sda1             485M  124M  336M  27% /boot
/dev/mapper/VolGroup00-tmp
                      2.0G   68M  1.9G   4% /tmp
/dev/mapper/VolGroup00-var
                      4.0G  325M  3.5G   9% /var
/dev/mapper/VolGroup00-home
                      1.8T  544M  1.7T   1% /home

拡張できました ❗

8. OS 再起動

プロセスを停止したので OS 再起動しておきました。

OS 起動時にマウントできるかの確認の意味も込めて。

# sync;sync;sync;shutdown -r now

sendmail aliases から起動したコマンドの実行ユーザ

毎回ハマって調べるのに時間がかかるのでメモ。

sendmail の aliases からコマンドを起動した時のコマンドを実行する

ユーザはmail ユーザになってしまいますが(CentOS 5 の場合)

これを別のユーザにしたい時にどうすればよいか。

aliases で ファイルを include して、そのファイルのオーナーを

実行させたいユーザに chown すればOK。

以下参考にさせていただいたサイトです。

ありがとうございます!

Sendmailのaliasesを実行するのは誰か

 

ロゴ

会社のロゴを作成しました。


 

 

名刺や WEB サイト、資料のヘッダなどに使ってみようかと思っております。

tripwire St9exception

tripwire のデータベースを更新しようとしたところ例外が発生 😯

[root@hoge ~]# tripwire -m u -c /etc/tripwire/tw.cfg -r /var/lib/tripwire/report/hoge-20120705-123456.twr
*** Fatal exception: St9exception
*** Exiting...

レポートファイルがおかしかったのか ❓

tripwire -m c してからもう一度実行したところ例外が発生しませんでした :mrgreen:

[root@hoge ~]# tripwire -m c
 
[root@hoge ~]# tripwire -m u -c /etc/tripwire/tw.cfg -r /var/lib/tripwire/report/hoge-20120705-223456.twr

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

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>