php aspect mock

最近在研究 aspect mock.
發現幾點要注意的:

  1. 文件有提到:
    appDir defines the root of web application which is being tested. All classes outside the root will be replaced with the proxies generated by AspectMock. By default it is a directory in which vendor dir of composer if located. If you don’t use Composer or you have custom path to composer’s vendor’s folder, you should specify appDir.
    意思是如果 你 include 要 mock 的 dir 不在 appDir  底下.
    那就不行.
  2. 如果你要 mock 的 class method 是繼承來的.
    class 本身沒有去 override parent method.
    那麼 parent class 也要在 include path 裡面.
  3. 由於 asspect mock 是利用蓋掉已經註冊進去 spl autoload 的 composer ClassLoader
    把它換成自己的, 所以像是 php 內建 Memcached 這種,
    他就沒轍了…

複雜的ipv6設定

還蠻有趣的真的!
之前在台北有用過,
但是那時是用 ddwrt 內建的功能,
點一點就配置好了!
以下是以我前幾天申請了hinet ipv6來玩,
現在申請比以前簡單很多,
http://www.ipv6.hinet.net/,
有線上申請的連結!!
點一點就有了(而且幾乎是馬上),
手癢把之前改裝成 router 的 raspberry pi 2,
增加了 SLAAC 功能,
步驟如下:

1. 開啟 ipv6:
編輯 /etc/modules 加入一行 ipv6

2. /etc/ppp/options: 增加這行 +ipv6 ipv6cp-use-ipaddr

3. 裝完 wide-dhcpv6-client (安裝過程會問你要監聽哪個介面,記得改成 ppp0), 編輯 /etc/wide-dhcpv6/dhcp6c.conf


interface ppp0
{
send ia-pd 0;
script "/etc/wide-dhcpv6/dhcp6c-script";
};
id-assoc pd 0 {
prefix-interface eth0 {
sla-len 0;
};
};

這是要從 isp 那邊拿到配發的 prefix.

4. 裝完 radvd 編輯 /etc/radvd.conf (公告ra用的)

interface eth0
{
AdvSendAdvert on;
AdvManagedFlag off; //由ra取得prefix然後自己組合產生ipv6位址
AdvOtherConfigFlag on; //dns等其他資訊由 dhcpv6 拿
AdvLinkMTU 1492;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 10;
prefix ::/64 {
AdvRouterAddr on;
AdvOnLink on;
AdvAutonomous on;
};
};

dns 部分本來我是設定 rdnss 不過 windows 沒支援…
mac os x 10.10 倒是有.

5. 裝完 wide-dhcpv6-server 編輯 /etc/wide-dhcpv6/dhcp6s.conf
option domain-name-servers 2001:b000:168::1 2001:b000:168::2 2001:4860:4860::8888 2001:4860:4860::8844;
option domain-name “xxx.org";

第一個就是列出 dns 位址, 前兩組是 hinet 後面是 google的.
option domain-name, dns 尾碼, 設定之後, client 比如只打 www,
如果 dns 查不到,
為自動補完變成 www.xxx.org.

wide-dhcpv6-server 這個東西要不要配置其實無所謂,
因為其實hinet 他的 ipv4 dns 可以查得到反解成 ipv6 的位址,
所以就算沒有ipv6的 dns,
還是照常可以查詢,
我會知道是因為沒有設定 ipv6 dns,
nslookup 可以看到是到 ipv4 dns 查的.

6. 編輯 /etc/sysctl.conf
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.accept_ra=2
net.ipv6.conf.default.accept_ra=2

下面要設定 accept_ra 的原因是如果不這樣
ppp0 就拿不到 ip 了.

7. 編輯 /etc/ppp/ipv6-up 最後加入
service wide-dhcpv6-client start
service radvd start
service wide-dhcpv6-server start

配置完我是直接重開-_-!
然後就完成啦!!

看似輕鬆完成,
其實我研究了整整兩天= =!!
因為要看很多資料,
還要知道 hinet 怎配的…

ssh tunnel

感覺網管跟RD就像一個守門的,
另外一個進攻的….
今天原本開放的機器突然被限定,
只好連到跳板….

開發機 A  —>   資料機 C  被擋,
程式卻放在開發機 A,
所以只好 ssh tunnel 開發機 A –> 跳板機B  —>   資料機 C …

Raspberry Pi router

故事發生在去年底,
之前入手的 Raspberry Pi 在拔 hdmi 時,
不小心把電容一起扯斷了,
真是整個悲劇,
由於原本 blog 是架在上面的,
後來只好想辦法轉移到中正的機器,
剛好前陣子公司有人在團購 Raspberry Pi 2,
直到昨天才入手.
這個東西真是好物,
記憶體已經到達 1G,
CPU 又是 Cortex-A7 900MHz,
只賣 1200 是否太佛心?

昨晚在想 Raspberry Pi 2 效能既然已經是如此,
並且我 blog 也已經搬到中正機器,
考慮到頻寬與效能,
我已沒打算再搬回去XD,
所以這東西我打算朝兩步驟前進,

1. 當 router.
2. 當 dlna server.

所以先準備實踐第一步,
網路線只有一條沒關係,
買個 dlink 300 多塊的 switch (8埠),
把 Raspberry Pi 的網路線插上去.

由於我家是光纖到府,
用的機器是 Sumitomo FTE6086,
這個沒有 router 功能,
只有 switch 介面,
連出去的就是光纖孔,
所以把 dlink switch 再用一條網路線和 FTE6086 連接起來就好了.
硬體設定就此結束.

軟體設定就參考網路有關把 Raspberry Pi 變成 無線分享 ap,
不過我沒有要無線功能,
所以設定上不會把 wlan0 forward 到 ppp0,
而是 eth0.

1. 修改 /etc/network/interfaces:
註解掉 eth0 auto 那行,
改成 –>
iface eth0 inet static
address 10.0.0.1
netmask 255.255.255.0

2. sudo apt-get install isc-dhcp-server :
裝完後,
修改 /etc/default/isc-dhcp-server.

ddns-update-style none;
default-lease-time 86400;
max-lease-time 86400;
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.50 10.0.0.254; //2~50 可以保留給 static
option subnet-mask 255.255.255.0;
option broadcast-address 10.0.0.255;
option routers 10.0.0.1;
option domain-name-servers 168.95.1.1,8.8.4.4,8.8.8.8; // 第一組是種花電信的 dns
}


host pc {
hardware ethernet 11:22:33:44:55:66;
fixed-address 10.0.0.2; //static ip
}

修改完成後,要接著改 /etc/default/isc-dhcp-server

DHCPD_CONF=/etc/dhcp/dhcpd.conf
INTERFACES=eth0

sudo service isc-dhcp-server start

3. sudo apt-get install pppoe pppoeconf:
裝完後,
執行 sudo pppoeconf
依照步驟過程會要你輸入帳號密碼,
打完後他就會連上線了.

4.
設定 /etc/sysctl.conf

net.ipv4.ip_forward=1

5.
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
sudo iptables -A FORWARD -i ppp0 -o eth0 -m state –state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT

su 成 root 執行 iptables-save > /etc/iptables.ipv4.nat

在 /etc/rc.local exit 之前,
加入 iptables-restore < /etc/iptables.ipv4.nat
結束….

php reference

通常寫 C, C++,
說要不用到指標或是C++參照,
好像不太可能,
php 就真的不常用到,
不過指標真的是個好用的東西,
昨天遇到的問題是,
類似 wordpress的分類可以有階層架構,
但對應關係在資料庫是一維的,
怎把一維的資訊轉換成皆成架構呢?
這問題以前在寫C++有遇過,
那時就是用指標的解法,
寫 php 就換了腦袋了 XD,
幸好今天起床有想起來,
php 也有 reference 可用~
總之這時 php reference 就是好用的時候了,
code 如以下,


array(
'parent_id' => null,
'name' => '0',
),
'b' => array(
'parent_id' => null,
'name' => '1',
),
2 => array(
'parent_id' => 1,
'name' => '2',
),
3 => array(
'parent_id' => 4,
'name' => '3',
),
4 => array(
'parent_id' => 'b',
'name' => '4',
),
);

$pivot = -1;

foreach ($arr as &$value) {
$value['children'] = array();
if (is_null($value['parent_id'])) {
$pivot += 1;
continue;
}
if (!array_key_exists($value['parent_id'], $arr)) {
continue;
}
$arr[$value['parent_id']]['children'][] = &$value;
}

print_r(array_slice($arr, 0, $pivot + 1, true));

ext4 一個目錄下可以擁有的檔案數目

其實限制不在於單一目錄,
而是是否達到 inode 上限,
inode 上限不是固定的,
不過在 mkfs 階段可以指定,
大於 block 數量多出的 inode 會無法使用,
到了 ext4 後,
解除了 ext3 最大子目錄 32000 限制,
但是一樣會受到 inode 上限限制.
當然這點是可以理解的,
因為目錄本身也會佔據 inode.