ちょっと変わったphpのシングルトン化について

phpのインスタンスでsingletonなモデルで運用したい場面がでてきた。

でもちょっと条件があって、同じオプション(コンストラクタに渡す変数)の時に同じインスタンスを利用してもらいたい。

というのもDBコネクションを抽象化するクラスを挟んでるんだけど、DSNに相当するものをコンストラクタに渡してるからそれごとに違うコネクションを張ってほしい。これをやってくれないとトランザクションの途中で割り込んだりしてくれてそれはもう大変なことになる。そのためのテスト。

シングルトン化するコードは参考にした。ありがとうございますた。

今日も適当ダイアリー PHPでシングルトンを利用

こんなかんじでテストコードを書いてみる。

<?php
main();
function main(){
 for($i=0; $i<3; $i++){
 $test[$i] = test::gi($i);
 }
 for($i=0; $i<3; $i++){
 $test[$i+3] = test::gi($i);
 }
 foreach($test as $value){
 var_dump($value->rand);
 }
}
class test{
 public $rand;
 private static $ins;
 private function __construct($num){
 $this->rand = rand()%30;
 print $this->rand. "\n";
 }
 public function gi($num){
 if(test::$ins[$num] == NULL){
 test::$ins[$num] = new test($num);
 }else{
 // the incetance is already exists
 }
 return test::$ins[$num];
 }

}

これを動かしてみる。

%php singletonTest.php
7
15
11
int(7)
int(15)
int(11)
int(7)
int(15)
int(11)

html/cssで範囲選択させない

ブラウザ上で範囲選択をさせたくない場合がたまにある。そういう場合はCSSとかでゴニョゴニョできる。

<div id="content">
  <p>
    あいうえお<br>
    かきくけこ
  </p>
</div>

こういう要素が有った場合。まずCSS

  #content {
    -moz-user-select: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
  }

あと、IE用に

<div id="content" unselectable="on">
</div>

とunselectableを指定すると良い。どれも標準化されてる訳でもないし完全では無い。けど主要なブラウザには対応出来る。
あとはCSSでcursor: default; とか指定すると更に良いと思う。img要素とかにも効く。

mysqldumpをやってみた

7.12. mysqldump — データベースバックアッププログラム

mysqldumpを使ったときの

mysqldump –lock-all-tables –master-data=2 –no-create-db –no-create-info –flush-logs –no-autocommit –all-databases > /usr/tmp/dump.sql

–lock-all-tables

すべてのテーブルをロック。リードロック。

–master-data=2

レプリケーションの情報をコメントで書き出してくれる。あとでレプリケーションを再開したいときはmoreとかgrepで中身をみる。1にするとsqlの本文に書かれてしまうらしいのでそれをちょっと抑制するオプション。

–no-create-db

create database文を書かない。

–no-create-info

create table文を書かない。

–flush-logs

ダンプする前にlogの内容をはき出す。

–no-autocommit

テーブルごとにautocommit=0にする。

–all-databases

すべてのデータベースを対象とする。

また有用なオプションについて補足。

たった3秒でInnoDBのデータローディングが快適になるライフハック
–skip-networking

mysqlの起動オプションでネットワークを無効にして立ち上げれるらしい。

  1. mysql> SET sql_log_bin=OFF;
  2. mysql> SOURCE ‘dump.sql’

これでファイルから読み込めるらしい

innodbが使えなくなっていた

先日からshow engines;を実行すると、innodbがなくなっていたことに気がついた。

どうやらmax_connectionsを増やしすぎたせいでinnodb分のメモリが足りなくなっていた模様。

mysql> show engines;
+————+———+—————————————————————-+————–+——+————+
| Engine     | Support | Comment                                                        | Transactions | XA   | Savepoints |
+————+———+—————————————————————-+————–+——+————+
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         | NO           | NO   | NO         |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV        | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| FEDERATED  | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| ARCHIVE    | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+————+———+—————————————————————-+————–+——+————+
7 rows in set (0.00 sec)

このままだと困るのでメモリ関連のパラメタをいじって直してやるとする。

再起動すると早速エラーメッセージが。

InnoDB: Error: data file ./ibdata1 is of a different size
InnoDB: 640 pages (rounded down to MB)
InnoDB: than specified in the .cnf file 64000 pages!
InnoDB: Could not open or create data files.
InnoDB: If you tried to add new data files, and it failed here,
InnoDB: you should now edit innodb_data_file_path in my.cnf back
InnoDB: to what it was, and remove the new ibdata files InnoDB created
InnoDB: in this failed attempt. InnoDB only wrote those files full of
InnoDB: zeros, but did not yet use them in any way. But be careful: do not
InnoDB: remove old data files which contain your precious data!
100426  6:15:03 [ERROR] Plugin ‘InnoDB’ init function returned error.
100426  6:15:03 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.

どうやらibdata周りで引っかかったらしい。

該当する行を調べたところ

#innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend
innodb_data_file_path = ibdata1:1000M;ibdata2:10M:autoextend
innodb_file_per_table

となっている。実際のファイルはibdata1が10Mしかない。おそらく過去に安易な考えでibdataを作って放置したりしてたんだろうね。

ここで各ファイルをバックアップする。

#sudo mv ibdata1 ibdata1.bak
#sudo mv ib_logfile0 ib_logfile0.bak

#sudo mv ib_logfile1 ib_logfile1.bak

#sudo mv ibdata2 ibdata2.bak

ログも一緒にやってやらないと、mysql起動時にログファイルと内容違うやんけ、って怒られた。

以上をやってmysqlを起動して、エラーログを確認して、show engines;すれば完了。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 136
Server version: 5.1.45-log FreeBSD port: mysql-server-5.1.45

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> show engines;
+————+———+—————————————————————-+————–+——+————+
| Engine     | Support | Comment                                                        | Transactions | XA   | Savepoints |
+————+———+—————————————————————-+————–+——+————+
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV        | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| FEDERATED  | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| ARCHIVE    | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         | NO           | NO   | NO         |
+————+———+—————————————————————-+————–+——+————+
8 rows in set (0.00 sec)

ついでにmysqlのバージョンも5.1.33から5.1.45にあげてやった。

change the database engine
ほげ

nicovideでエラーが発生

fordが外向きのアクセスでも

503 Proxy error とか

bad gateway

ってのを返してた。

fordのエラーログもとくに影響なかったけど、server-statusをみたらwwwwwwwwwwwwwってWがいっぱいになってた。

http://ford.l3tp.org/server-status

lincolnの状態もとくにおかしくなかった。server-statusは見ていない。

lincolnのapacheを再起動したら直った。以上。

[Thu Apr 22 02:05:45 2010] [error] server reached MaxClients setting, consider raising the MaxClients setting
[Thu Apr 22 02:05:25 2010] [notice] Apache/2.2.13 (FreeBSD) mod_ssl/2.2.13 OpenSSL/0.9.8e DAV/2 PHP/5.2.11 with Suhosin-Patch SVN/1.6.6 configured -- resuming normal operations
[Thu Apr 22 02:05:25 2010] [notice] Digest: done
[Thu Apr 22 02:05:25 2010] [notice] Digest: generating secret for digest authentication ...
[Thu Apr 22 02:05:24 2010] [warn] module dav_module is already loaded, skipping
[Thu Apr 22 02:05:24 2010] [warn] Init: Session Cache is not configured [hint: SSLSessionCache]
[Thu Apr 22 02:05:16 2010] [notice] caught SIGTERM, shutting down
[Thu Apr 22 01:05:05 2010] [notice] child pid 17492 exit signal Segmentation fault (11)
[Wed Apr 21 18:43:30 2010] [notice] child pid 6652 exit signal Segmentation fault (11)
[Wed Apr 21 16:24:37 2010] [error] [client ::] File does not exist: /usr/local/www/apache22/data/wp-content
[Wed Apr 21 11:56:53 2010] [notice] child pid 90919 exit signal Segmentation fault (11)

nicovidaemonの軽量化をした結果

post_title_translateクラスをsingleton化した。
singleton化する前と後のnicovidaemonの1プロセスあたりのDB接続数とメモリ使用量は以下の通り。

singleton化する前
DB接続数 99
メモリ使用量 234620KB

singleton化した後
DB接続数 51
メモリ使用量 52348KB

post_title_translateクラスは、1プロセスあたり17個のインスタンスが生成されていた。
purveyorBaseで2個(そのうち1個はtaxonomyControlが保持する)。
nicovidaemon本体で1個。
nicovidaemonはpurveyorBase8個作成するので、2*8+1=17となる。

このことから、インスタンス1個あたりのDB接続数は3個だということが分かった。
post_title_translateクラスの内部でnico_term,nico_correspond,nico_reserved_keywordテーブルのDB_Tableを生成するので、この3つのコネクションと思われる。
edbも生成しているがコネクションは増えてない様子。
調べてみたところ、edb_class.phpに書いてあった。

// 同じ DSN で接続した既存のインスタンスを取得します。
// 存在しない場合は MDB2::factory() で新しいインスタンスを作成します。
$this->mdb2 = MDB2::connect($dsn, $options);
if(PEAR::isError($this->mdb2)){
throw eexp::gi($this->mdb2->getDebugInfo());
}

FreeBSDのカーネルソースを取得する方法

FreeBSDのカーネルソースを取得する方法。

最近なんでかしらないけどカーネルが欲しくなったりすることがあって、何度かやってきた。

ハンドブックによるとcdマウントしてそこからコピーしてねって言ってるけど、マウントとか面倒。nfsでosイメージがあるディレクトリをマウント->vnode追加->マウントっていう流れなんだけど・・・。

カスタムカーネルの構築とインストール

ネットからさくっととれないもんかと試してみた。

kernelってこういうURLにあるらしい。

ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/5.3-RELEASE/src/

事前にブラウザとかで欲しいカーネルソースがあるディレクトリを指定しておく。今回だとamd64の8.0が欲しかった。

ディレクトリ以下を全部wgetする。

hogehoge

あとはハンドブック通りに展開する。でもwgetのオーバーヘッドが意外にも長いので、cdをマウントした方がいいかもしれない。またsysinstallでできそうな気がしなくもない。

っていうかできたし簡単だった。ハンドブック通りでいけたし。

FreeBSDでインタフェース名につけられる名前の根拠他

more /usr/src/sys/amd64/conf/GENERIC


# PCI Ethernet NICs.
device          de              # DEC/Intel DC21x4x (``Tulip'')
device          em              # Intel PRO/1000 Gigabit Ethernet Family
device          igb             # Intel PRO/1000 PCIE Server Gigabit Family
device          ixgbe           # Intel PRO/10GbE PCIE Ethernet Family
device          le              # AMD Am7900 LANCE and Am79C9xx PCnet
device          ti              # Alteon Networks Tigon I/II gigabit Ethernet
device          txp             # 3Com 3cR990 (``Typhoon'')
device          vx              # 3Com 3c590, 3c595 (``Vortex'')

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device          miibus          # MII bus support
device          ae              # Attansic/Atheros L2 FastEthernet
device          age             # Attansic/Atheros L1 Gigabit Ethernet
device          alc             # Atheros AR8131/AR8132 Ethernet
device          ale             # Atheros AR8121/AR8113/AR8114 Ethernet
device          bce             # Broadcom BCM5706/BCM5708 Gigabit Ethernet
device          bfe             # Broadcom BCM440x 10/100 Ethernet
device          bge             # Broadcom BCM570xx Gigabit Ethernet
device          dc              # DEC/Intel 21143 and various workalikes
device          et              # Agere ET1310 10/100/Gigabit Ethernet
device          fxp             # Intel EtherExpress PRO/100B (82557, 82558)
device          jme             # JMicron JMC250 Gigabit/JMC260 Fast Ethernet
device          lge             # Level 1 LXT1001 gigabit Ethernet
device          msk             # Marvell/SysKonnect Yukon II Gigabit Ethernet
device          nfe             # nVidia nForce MCP on-board Ethernet
device          nge             # NatSemi DP83820 gigabit Ethernet
#device         nve             # nVidia nForce MCP on-board Ethernet Networking
device          pcn             # AMD Am79C97x PCI 10/100 (precedence over 'le')
device          re              # RealTek 8139C+/8169/8169S/8110S
device          rl              # RealTek 8129/8139
device          sf              # Adaptec AIC-6915 (``Starfire'')
device          sis             # Silicon Integrated Systems SiS 900/SiS 7016
device          sk              # SysKonnect SK-984x & SK-982x gigabit Ethernet
device          ste             # Sundance ST201 (D-Link DFE-550TX)
device          stge            # Sundance/Tamarack TC9021 gigabit Ethernet
device          tl              # Texas Instruments ThunderLAN
device          tx              # SMC EtherPower II (83c170 ``EPIC'')
device          vge             # VIA VT612x gigabit Ethernet
device          vr              # VIA Rhine, Rhine II
device          wb              # Winbond W89C840F
device          xl              # 3Com 3c90x (``Boomerang'', ``Cyclone'')
# ISA Ethernet NICs.  pccard NICs included.
device          cs              # Crystal Semiconductor CS89x0 NIC
# 'device ed' requires 'device miibus'
device          ed              # NE[12]000, SMC Ultra, 3c503, DS8390 cards
device          ex              # Intel EtherExpress Pro/10 and Pro/10+
device          ep              # Etherlink III based cards
device          fe              # Fujitsu MB8696x based cards
device          sn              # SMC's 9000 series of Ethernet chips
device          xe              # Xircom pccard Ethernet

# Wireless NIC cards
device          wlan            # 802.11 support
options         IEEE80211_DEBUG # enable debug msgs
options         IEEE80211_AMPDU_AGE # age frames in AMPDU reorder q's
options         IEEE80211_SUPPORT_MESH  # enable 802.11s draft support
device          wlan_wep        # 802.11 WEP support
device          wlan_ccmp       # 802.11 CCMP support
device          wlan_tkip       # 802.11 TKIP support
device          wlan_amrr       # AMRR transmit rate control algorithm
device          an              # Aironet 4500/4800 802.11 wireless NICs.
device          ath             # Atheros pci/cardbus NIC's
device          ath_hal         # pci/cardbus chip support
options         AH_SUPPORT_AR5416       # enable AR5416 tx/rx descriptors
device          ath_rate_sample # SampleRate tx rate control for ath
device          ral             # Ralink Technology RT2500 wireless NICs.
device          wi              # WaveLAN/Intersil/Symbol 802.11 wireless NICs.

# Pseudo devices.
device          loop            # Network loopback
device          random          # Entropy device
device          ether           # Ethernet support
device          tun             # Packet tunnel.
device          pty             # BSD-style compatibility pseudo ttys
device          md              # Memory "disks"
device          gif             # IPv6 and IPv4 tunneling
device          faith           # IPv6-to-IPv4 relaying (translation)
device          firmware        # firmware assist module

# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device          bpf             # Berkeley packet filter

PC-BSD8.0でSSHとかnfsがうまく動かない

PC-BSD8.0でSSHとかnfsがうまく動かない。

sshはサーバとして、nfsはクライアントとして。

nfsはマウントしてるように見える・・・、気がしてたけど、dfするとハングアップ。

sshはpc-bsdのホスト上からアクセス(ssh localhost)するとうまくいくけど、他のホストからだと繋がらない。

おっかしーなー、とおもってipfwとpfを止めてみたけど無理。

一つ一つプロセスを見ていくと、怪しいプロセスを発見。

denyhostsっていうのが走っていました。こいつがいろいろと外からの接続とか、内側からのセションの戻りとかをはじいてたみたい。止めたらうまくいった。