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.