第一次到巴基斯坦的最後一天,原來想要去 Murree 看下雪的美景,後來考量到回程會不會封路還是塞車,所以最後的考量就是去 Taxila(大陸翻譯叫塔克西拉,佛教稱呾叉始羅國)。
簡單的歷史大概是,在阿育王統治期間,Taxila 是重要的佛教教學聖地,五世紀嚈噠遷入印度,大肆破壞當地的佛教寺院和佛塔,Taxila隨著衰敗。(詳細請見 Wiki 塔克西拉)。
Author Archives: richliu - Page 2
巴基斯坦 Taxila 穆斯林國家內的佛教廢墟
WSL (Windows Subsystem for Linux) 和 Windows App 的檔案權限問題
WSL 在一些輕量級的 Linux application 下很好用,不過如果專案稍大一點,vim 就不夠力
這時候如果用 Windows application 同時開發,如果寫入到 home 目錄的權限,檔案的 mode 會是 000
要手動改 755 才可以編輯
WSL 執行時仍然是用執行使用者的權限,雖然也可以跑在 admin mode 但是不建議
所以要讓 WSL Linux 和 Windows 同時開發,要將程式放在 /mnt/<driver> 下
讓 Windows 管理整個權限,就不會有寫到 home 目錄之後,檔案的 mode 變 000 的狀況
巴基斯坦 伊斯蘭馬巴德 交通
初次到巴基斯坦伊斯蘭馬巴德(Islamabad),我想對外國人最簡單的就是搭 Uber 和 Careem (也是類似 Uber 的服務).
這兩個服務都各有優劣,簡單比較一下
方便程度: Uber >> Careem
Uber 可以用網路用 Uber 內建簡訊給司機,但是 Careem 不可以,要打電話給司機
Uber 安裝只需要電話,Careem 還要 e-mail ,但是 Careem 會寄 e-mail 告訴你乘車資訊,Uber 因為在註冊時沒有,所以不確定會不會寄。
定位精準度: Uber >>> Careem
我在拉合爾有叫了幾次車都定位不到的經驗,浪費我很多時間
Uber 的問題在於司機更新位置時間不確定,猜測和網路有關,我前幾次還因此取消了叫車(取消會罰錢),後來才知道原來定位有問題,另外有問過司機,Google 導航出問題時也會帶到奇怪的地方。
網路大小:Careem >>> Careem
目前 Uber 只服務城市區,如果離城市稍遠或是不熱門的地方,還是要裝 Careem 備用一下
如果是更偏遠的地方,像是 Wahga Border (印巴邊界),兩個服務都沒有,只有被
不過 Uber 坐了幾次之後,強迫要我用信用卡付錢,這點我有點不太爽
剛剛去機場時用 Uber 叫了幾次,沒有一個人願意去的,願意去的要 RB$2000
最後是用旅館的接送服務,單次 RB$1000
註:我來的時候是問一個人那邊可以換錢,就坐上那個人的車了,他要價 RB$2000
所以我還是不知道 ISB International 到 Islamabad 市區要怎麼坐比較好,可能要用 Careem 吧
註2:現在 Google map 的 ISB international airport 還是會定位到舊的地方,所以如果定位到那邊,統統都是錯的
正確的位置是 Islamabad Gandhara International Airport。
搭 Caltrain 到 San Francisco (舊金山)
Change Ubuntu Cloud Image Size
Office 2016 註冊後還是一直出現要求註冊(啟用)的視窗
minecraft 如何用 Google Drive 同步到多台電腦
這個同題很簡單, 就建立目錄 Link 就好了
1. 開 Windows 檔案總管到
%appdata%\.minecraft |
這樣就會指到 .minecraft 的目錄, 一般是在 C:\Users\[USERNAME]\AppData\Roaming\.minecraft
2. 將 .minecraft 備份, 然後移(move)到 Google driver 下, 建一個目錄叫 Minecraft, 接下來 .minecraft 搬進去取名叫 data (或是其他你高興的字樣, 我用 data 做範例)
假設你的 Google Driver 在 D:\GoogleDrive\
那 .minecraft 新的目錄就在 D:\GoogleDrive\Minecraft\data
3. 執行有 administrator 權限的 cmd.exe, 然後輸入以下指令, 記得要將 [USERNAME] 換成 windows 使用者的名稱
mklink /D "C:\Users\[USERNAME\\AppData\Roaming\.minecraft" "D:\GoogleDrive\Minecraft\data" |
4. 在另外一台電腦將 .minecraft 目錄改名, 執行上面那步的指令.
這樣就可以同步兩邊的存檔和設定了….
家中有小孩都愛玩 minecraft 然後又會用不同電腦或是會常常重灌的很方便.
Ubuntu PPPoE Server 架設
網路上找到的範例都有缺, 主要是缺 pppoe kernel module 的部份, 也不會很難, 在 Ubuntu 18.04 下需要上個 patch 修掉 compile bug.
RSS Toeplitz Hash Calculation C Code
Toeplitz RSS(Receive Side Scaling) sample code 如下, 從 ODP Code 借來的
因為是測試用 code, 所以也不要太在乎語法什麼的
輸出可以正確的跑出 microsoft 網站的 sample
$ ./a.out sip: 187.149.9.66 dip:80.100.142.161 sport:1766 dport:2794 hash: 51ccc178 |
目前的 code 會計算 4 個 IP
像是這樣
$ ./a.out sip: 192.168.1.100 dip:10.0.0.100 sport:1000 dport:1000 hash: 8c2cb4f sip: 193.168.1.100 dip:10.0.0.100 sport:1000 dport:1000 hash: ef1317e8 sip: 194.168.1.100 dip:10.0.0.100 sport:1000 dport:1000 hash: 5f061160 sip: 195.168.1.100 dip:10.0.0.100 sport:1000 dport:1000 hash: 2324d4ee |
連檔名都叫 a.out 我真懶
#include <stdint.h>
#include <stdio.h>
#include <endian.h>
#include <string.h>
#include <arpa/inet.h>
/** rss data type */
typedef union {
uint8_t u8[40];
uint32_t u32[10];
} rss_key;
/** IPv4 tuple
*
*/
typedef struct thash_ipv4_tuple {
uint32_t src_addr;
uint32_t dst_addr;
union {
struct {
uint16_t sport;
uint16_t dport;
};
uint32_t sctp_tag;
};
} thash_ipv4_tuple_t;
/** Thash tuple union */
typedef union {
thash_ipv4_tuple_t v4;
//thash_ipv6_tuple_t v6;
} thash_tuple_t;
static const rss_key default_rss = {
.u8 = {
0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa,
}
};
static inline
uint32_t thash_softrss(uint32_t *tuple, uint8_t len,
const rss_key key)
{
uint32_t i, j, ret = 0;
for (j = 0; j < len; j++) {
for (i = 0; i < 32; i++) {
if (tuple[j] & (1 << (31 – i))) {
ret ^= htobe32(((const uint32_t *)
key.u32)[j]) << i | (uint32_t)((uint64_t) (htobe32(((const uint32_t *)key.u32) [j + 1])) >> (32 – i));
}
}
}
return ret;
}
int main(int argc,char *argv[]){
thash_tuple_t tuple;
uint32_t hash;
uint32_t tuple_len;
struct in_addr ip_addr_s,ip_addr_d;
char str_s[15], str_d[15];
#if 0
tuple.v4.src_addr = (uint32_t) inet_addr(“66.9.149.187″);
tuple.v4.dst_addr = (uint32_t) inet_addr(“161.142.100.80″);
ip_addr_s.s_addr = tuple.v4.src_addr;
ip_addr_d.s_addr = tuple.v4.dst_addr;
tuple_len += 2;
tuple.v4.sport = htobe16(2794);
tuple.v4.dport = htobe16(1766);
tuple_len += 1;
#endif
for(int i=0;i<4;i++){
tuple_len = 0;
hash = 0;
tuple.v4.src_addr = (uint32_t) inet_addr(“192.168.1.100″);
tuple.v4.src_addr = be32toh(tuple.v4.src_addr);
tuple.v4.src_addr=tuple.v4.src_addr+i*4;
tuple.v4.src_addr = htobe32(tuple.v4.src_addr);
tuple.v4.dst_addr = (uint32_t) inet_addr(“10.0.0.100″);
ip_addr_s.s_addr = tuple.v4.src_addr;
ip_addr_d.s_addr = tuple.v4.dst_addr;
tuple_len += 2;
tuple.v4.sport = htobe16(1000);
tuple.v4.dport = htobe16(1000);
tuple_len += 1;
if (tuple_len){
tuple.v4.src_addr = be32toh(tuple.v4.src_addr);
tuple.v4.dst_addr = be32toh(tuple.v4.dst_addr);
tuple.v4.sctp_tag = be32toh(tuple.v4.sctp_tag);
hash = thash_softrss((uint32_t *)&tuple,
tuple_len, default_rss);
}
ip_addr_s.s_addr = htobe32(tuple.v4.src_addr);
ip_addr_d.s_addr = htobe32(tuple.v4.dst_addr);
strcpy(str_s,inet_ntoa(ip_addr_s));
strcpy(str_d,inet_ntoa(ip_addr_d));
printf(“sip: %-14s dip:%-14s sport:%-6d dport:%-6d hash: %x \n",
str_s,str_d,
tuple.v4.sport,
tuple.v4.dport, hash);
}
return hash;
}
附帶一提, 如果在 Linux 下要修改 hash key . 可以用 ethtool 這個指令, ex:
$ ethtool -X enp5s0f4 hkey 6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a:6d:5a |
ref.
Verifying the RSS Hash Calculation : 可以比對計算出是不是正確
Symmetric RSS : 有趣的文章, 提到原來的功能沒有辦法有效的 hash , 將所有的 key 都改 0x6d5a 就可以
Scalable TCP Session Monitoring with Symmetric Receive-side Scaling
Scaling in the Linux Networking Stack
odp_classification.c
Ubuntu Build Original Linux Kernel
最好的方式應該是這一篇文章
不要再用什麼 fakeroot 去編了, 失敗率超高, 尤其是在 ARM 平台
https://wiki.ubuntu.com/KernelTeam/GitKernelBuild
Read more »
近期迴響