Wednesday, October 28, 2015

如何將壞掉的記憶體區域(壞軌) 列入黑名單

http://unix.stackexchange.com/questions/75059/how-to-blacklist-a-correct-bad-ram-sector-according-to-memtest86-error-indicati

我覺得這篇文章好強啊。

先是用 MemTest86+ 測試,這段我覺得沒什麼,畢竟我想知道的是如何在 linux 表列錯誤的區域然後避開。

然後我看到答案是 memmap=10M$800M 代表從 800MB 開始後 10MB 都不要使用。

接著有人提到 Ubuntu 開始支援 BadRam , 主要是在 Grub2 grub.conf 指定
GRUB_BADRAM="0x7DDF0000,0xffffc000" 
就可以說明  0x7DDF0000 and less than 0x7DDF4000 處需要避開,就算 kernel 沒支援,Grub2 也可以處理


然後我看到有人說 Memtest86 2.3 與 1.6 開始,有支援 memmap= 的表列方式,當下覺得真棒,直到我看到這張圖
Memtest86+ showing badram output

心理開始泛愁,這些參數要怎麼保存下來,傳遞到 linux command line or grub.conf 咧 ??

然後有人說,我用手機拍下來,傳進 GIMP  => grayscale => invert => contrast/gamma then hand it to tesseract ${IMG} stdout ..

真是太讚了。

Sunday, October 18, 2015

催生 [地震預警APP]

以今天早上的地震來看好了
以縱波速度 5~7 公里/每秒,這次地震在 n24.85 e122.01 ,距離內湖 50.43 公里,大約可以提前 50.43 / 6 = 8.4 秒,如果加上電腦網路延遲...

應該可以在 5 ~ 6 秒前預警 .. 前提是震央附近就有地震站,而且公開資料,以目前台灣的狀況,要政府做到我覺得很困難,除非是科學家主政吧 ...

但是我們身上都有手機,手機本身就良好的地震站,你會反對說,我的手機常常會被我移動,或是走動時放在口袋裡,怎麼可能知道這時候的震動是地震還是人為造成的。
我的回答是,假設你周遭有上百支手機,都安裝了這個 APP ,所有的手機都在某一刻偵測到劇烈的震動,不太可能是人為造成的,從這點就可以歸結出這個區域的手機群偵測出一個地震。

但是你會問,這 App 不是要地震預警嗎 ? 地震都發生了,手機不用偵測到,我也感覺得到啊,哪來的預警 ?
我的回答是 : 除非你在震央,因為地震波的傳送速度大約 6 公里/每秒,所以你距離震央每增加六公里,你就多了一秒的預警時間,而網路傳遞的速度可以說是無限快(光速),所以你離震央愈遠,就有愈長的預警時間。

你會問 : 那作者為何不趕快寫出這個 App 呢 ?
我的回答是 : 我比較懶,我常常有很多的想法,但都是三分鐘熱度。

這樣一個地震 App ,適合大學生或是研究生當成作業,但是我希望是一個公司在經營,比較有規模,而且安裝的人愈多可信度以及準確性會愈高。

相同概念可參考

How to Get Early Earthquake Alerts on Your Android Smartphone





Monday, October 5, 2015

阿波羅計畫的檔案照片


阿波羅計畫的檔案照片

其實還蠻壯觀的,就什麼都拍,什麼都沒放過,所有的細節。
看一看其實可以想想這是一種工作,去一趟月球,做了很多的事情。
就好比你跟隨著一群英雄,穿越時空遊歷其中,然後就明白其實英雄也只是平凡人,只是時機不同就成了英雄。

照片很好看,很棒 !

參考

阿波羅登月成功後,NASA 和阿姆斯壯從此一帆風順了嗎?

作者  | 發布日期 2015 年 10 月 05 日 分類 天文 , 航太科技










Sunday, October 4, 2015

自製鳳梨酥




網路上查找鳳梨酥食譜,看到鳳梨醬要煮五個小時,這絕不是我韌體工程師會做的事情(而且浪費能源)。

糖200g,奶油55g,難吃的土酸鳳梨一顆,忘了秤重。再加約兩三碗水下去瓦斯爐煮一下後,進壓力鍋,加壓完成後強制洩壓,倒進炒菜鍋瓦斯爐大火收乾,快乾時翻炒避免燒焦,小火,倒進碗裡放冰箱,睡覺。

切鳳梨時,貪吃的大鬼報到,塞給他一口土鳳梨 : [很酸很難吃吧 ] , 點點頭跑掉。
煮好鳳梨醬被我塞了一口,一直吵著要吃要吃,一直魯超久,不給 ! 給我睡覺去 ! (吃太多糖就不用睡了,一直跳)









這邊沒有收得很乾,就睡覺去了。隔天去六福村玩,沒動冰了兩晚。
第三天取出再收乾一次,發現真的很油,所以又多了把油瀝乾的手續,但實在沒耐性,火開得大了點,鳳梨醬有點癟乾的狀態。(心理在想,這吃起來實在不健康,又是糖又是奶油)



看著食譜還要折甚麼方模,大小隻又在旁邊吵來吵去,不折了 ! 趕快烤烤要出門回阿公家,加緊腳步 !
餅皮的趕製,其實省略很多步驟,大部分都是急就章,


  1. 牛油,沒糯米粉,糖粉看成糖,加熱攪了老半天根本不會融化還一直冒泡,起司粉直接用起司條代替 (因為覺得起司粉很貴)。
  2. 瞪著不會融化的糖粒,再看一遍食譜,抓出抽屜裡的糖粉,加大約 2/3 食譜的量,這餅皮一定會過甜。
  3. 冷卻到常溫,沒時間,整個炒菜鍋浸到洗水藍加速冷卻。
  4. 加蛋(石安牧場超貴蛋) 兩顆 (搞不懂食譜一顆半的蛋,那剩下的半顆怎麼辦 ?) ,琪恩的奶粉(成長配方),低筋麵粉,但是沒中筋麵粉,所以全用低筋。
  5. 其實桿到後來,砂糖粒也不見了,可能自己跟麵粉溶化了吧,搞不懂 ...
拿著麵糰問芊佑這是不是跟學校的一樣,芊佑做過鳳梨酥應該可以指導我一下,結果跪著包了一個膝蓋痛,一直哀哀叫撤退。
還是自己包餡吧,包完放鐵盤上看它自己又軟禢掉不成形,實在是很無言,我實在沒那美國時間做勞作包厚紙板弄方模,想說錫箔紙包一圈捏一下應該撐得住 !

其實是蠻醜的,應該也很符合我的風格
包到後來,餡多出太多,所以有幾顆的餡料超多,吃完應該一整個腦充血血糖過高,會一直原地跳跳跳吧。不管 ! 先進烤箱再說,沒時間了!





 















170 度烤 12 分鐘,照著食譜取出要翻面,靠 ! 整個黏在上面是要怎麼翻,用力夾就分裂,算了 ! 放棄,繼續烤。
溫度上調 200 度 , 沒時間,請給我加快熟成。
又過了 6 分鐘,看到冒泡了,調低 170 度
有了上次的經驗,曉得烤熟時,餅皮不是硬的,是冷卻下來才會變硬,而且內餡已經沸騰撐破餅皮在冒泡,所以見好就收,免得又出現上次烤餅乾烤焦的情形。















後來果然變硬了,還有沒有考過頭燒焦,不然就完了。



烤完後雖然覺得好吃,但直覺這熱量驚人,所以趕緊分送大家品嘗,幫忙分攤一下熱量消耗。

Wednesday, September 30, 2015

GDB 的流水帳


Usage:
        armgdb is running on x86 as a client.
        gdbserver is running on arm-device as a server.

        Ex.
                ===================
                == On the device ==
                ===================
                        #./gdbserver 127.0.0.1:1234 server &
                Then gdbserver will listen on port 1234 on the device


                ================================
                == On the x86 (vmware fedora) ==
                ================================
                        #cd
                        #./armgdb server

                Then the gdb prompt will appear and waiting your command...
                Some settings need to be set first
                        (gdb) set solib-search-path /project/target/fs-cpio/lib <== path to your rootfs lib directory

                Then let's connect to the device port 1234
                        (gdb) target remote :1234
                        [Optional : (gdb) break ]
                        (gdb) run

Book : GNU - Debugging with gdb


用 gdb 對特定記憶體區域寫入設斷點



加快編譯的一些取巧方式


GDB 7.9 可以動態編譯插入程式片段進入正在跑的程式中
沒試過 ... 歡迎不怕辛苦的嘗試看看






這本書(Debug Hacks)讓我想起 stack unwinding oprofile

一些連結,主要是針對 ARM 架構如何去做 stack unwinding , 我目前是土法煉鋼在 SIGSEGV handler 內把該 thread  stack 直接 fopen 寫到一個檔案,因為 core dump 不完整磁碟空間不足,所以只好針對性的 dump stack. 

·         Memory Debugging
use address sanitizer, Linaro ported it to ARM on 2013/07
·         Backtrace on SEGFAULT
·         socketpair(2): create two already connected unix domain sockets
·         libunwind from Wiki:Call Stack

以下是我的一些 googling ,我後來有加程式碼來 dump stack 以及用 addr2line 來亂槍打鳥尋找可能的 backtrace .

1.    man 5 core, from linux 2.6.19 it supports piping core dump to another process
Ref : Piping core dumps to a program
2.    GDB Document
3.    Get EIP in SIGSEGV action handler
Need to add -rdynamic
Ref toolchain /sys/ucontext.h for the third argument of signal action handelr.
4.    libbacktrace
A library could be linked to your program can called to analysis DWARF stylf executable.
 .        對岸的backtrace()
Create a global array to record every pthread’s first variable pointer (As stack bottom),
ex:
oprofile 

perf Profiler

Examine cache miss and branch prediction miss events for performance tuning
Perf tutorial, examples
On older kernels, use oProfile as a perf replacement
Good branch prediction miss example: Stackoverflow: Why is processing a sorted array faster than an unsorted array?
https://wiki.linaro.org/KenWerner/Sandbox/perf: perf and Cortex A9

Performance Monitor Unit

ARMv7 common PMU events are in the ARMv7 AR

一些關鍵字
oprofile
strack
valgrind
kprobes
backtrace
vfs_cache_pressure
kswapd
watchpoint
sigsegv
netconsole
oops
syslogs
ptrace
systemtap
meminfo
proc
oom killer
slab
oprofile
vprobe
xen
nmi
objdump
scheduler
stack overflow
semaphore
deadlock
buffer overrun
kernel mode
race condition
interrupt


gdb: running on PC
gdbserver: running on the device

If you have problem to run them, you may uncompress the gdb.tar.bz2 to re-build again.
(cat config.log or config.status to search for pattern like “./configure …..”, then
 copy-paste on to re-build again)

Device:
        iptables -P INPUT ACCEPT
        ./gdbserver --attach 0.0.0.0:3000 &

PC:
        ./gdb
        (gdb) set solib-search-path
        (gdb) target remote 172.16.3.92:3000
Remote debugging using 172.16.3.92:3000
[New Thread 237]
(gdb) bt
#0  0x401cb218 in select () from /usr/src/trunk/target/fs-cpio/lib/libc.so.0
#1  0x0000b6c0 in event_loop (single=
During symbol reading, incomplete CFI data; unspecified registers (e.g., r0) at 0xb278.
0) at event.c:481
#2  0x00020300 in main (argc=1, argv=0xbed11eb4) at server.c:287
(gdb) n
Single stepping until exit from function select,
which has no line number information.
ham_loop (single=0) at event.c:482
482                     if (debug_event ())
(gdb) n
484                     pthread_mutex_lock (&time_event_mutex);
(gdb) p time_event_list
$1 = (struct event *) 0xbfba8
(gdb) cont
Continuing.

Program received signal SIGINT, Interrupt.
0x401cb218 in select () from /usr/src/trunk/target/fs-cpio/lib/libc.so.0
(gdb) cont
Continuing.


Device :
ulimit –c unlimited
重啟 server , 重要!
等待 server 掛掉
cd /usr/sbin
tftp -p 1.2.3.4 -l core.數字

PC
/tmp/gdb-6.8/gdb/gdb  /tmp/server_0912010954
#必須是沒有被 strip 的版本, 可以修改 Makefile arm-linux-strip 之前插入 cp server /tmp/server_`date + %y%m%d%H%M` 來時常保留備份

#進入 gdb
(gdb) set solib-search-path /home/project/lib/
(gdb) core /tftpboot/core.數字
        #可以看出一點眉目
(gdb) bt
        #通常這邊可以看出問題
(gdb) up 或是 down
(gdb) print <變數>
        #變數通常是 function 傳進來的變數.



A patch to vim7.2 to let vim support gdb . 



我是新增 ~/.armgdb 內容:
set solib-search-path ~/TPL/target/tplfs-cpio/lib/
handle SIG33 nostop noprint pass
handle SIG32 nostop noprint pass
handle SIGTRAP nostop
handle SIGINT nostop noprint pass
handle SIGTERM nostop noprint pass
#target remote 172.16.15.77:1234

然後執行 gdb 
gdb -x ~/.armgdb

nfs mount 出問題了,真神奇

同事於 arm device 上發生困難求助
#mount -t nfs -o nolock 1.2.3.4:/home/skyter/nfs /nfs
出現錯誤訊息 (我記得是 no such directory)

首先我懷疑 device 上 /nfs 目錄不存在,所以 ls -al 發現有 nfs 目錄

所以懷疑 server 設定有問題,先確認 1.2.3.4 /home/skyter/nfs 目錄存在
接著觀察 /etc/exports
$sudo vi /etc/exports
結果也沒問題,/etc/exports 檔案屬於 nfs 的一部分,可以 man nfs 看說明
如果 /etc/exports 檔案不存在,則 nfs service 未安裝,可 apt-get install nfs-kernel-server 或者 yum install nfs-xxx 安裝,實際情況可能要 google 一下你的 Linux 套件是用於哪一種安裝指令,以及正確的 nfs 套件名稱

接著確認 nfs server 有重啟,還是不行

接著 sudo, cd 到 /var 可以觀察到 spool (用來寄 mail), mail .... log 很多目錄,這些是 Linux 系統使用的檔案,而我們要觀察的是 log 目錄裡面的內容,因為各種 service 都會把記錄儲存於此處

ls -alrt /var/log 可以按照時間排續新的最後面,看看最近幾分鐘內系統記錄了什麼資訊,因為是 Ubuntu , 所以可以看到 syslog , auth.log 皆有變動
tail syslog 或者 tail -n 30 syslog 可以看到最後面最近發生的記錄,可以看到 1.2.3.4 確實有來 mount /home/skyter/nfs.
tail auth.log 則沒有觀察到 nfs mount 相關資訊

dmesg 是系統內部命令,也可以觀察到 nfs 如果有問題時是否有記錄
於 server 與 device 執行
#dmesg | tail -n 20
都沒有看到相關訊息

因為 nfs mount 透過網路,而 Device 位於不同子網段,所以懷疑網路路由有問題,從 device ping server 有回應,route -n 顯示路由也沒問題

接著在 server 執行
#ifconfig 觀察主要網路卡是哪一張,通常是 eth0
#tcpdump -i eth0 -n host 1.2.3.4
然後 device 再執行一次 mount nfs , 有看到網路封包,但是看不到內容
-i eth0 代表監聽 eth0 網卡,-n 代表不要對 ip 做 name 的 dns 反查動作(浪費時間) , host 1.2.3.4 代表過濾監聽發送/接收方是 1.2.3.4 的封包

完整側錄封包存檔供 wireshark 分析
#tcpdump -i eth0 -n host 1.2.3.4 -s 1600 -w xx.pcap
-s 1600 代表每一個封包最多記錄到 1600 bytes , 已經足以涵蓋完整的 ip 封包大小 (約 1500 bytes 左右) , 預設值很小不足以分析
-w xx.pcap 代表全部血到 xx.pcap
再 mount nfs 一次後,Ctrl + C 停到 tcpdump

不管透過 scp, nfs, http, 或者 Linux 桌面,打開 Wireshark (Win/Linux/Mac) 去開啟 xx.pcap 檔案
其中有兩段 connection , 你可以右鍵隨便一個封包,選擇 Follow , 或者是在正常檢視下去玩弄每一個功能,最後你應該會觀察到 nfs 的 req / reply .
在這邊顯示一切正常,沒有錯誤。

所以 server , 網路都沒問題,看起來問題出在 device (kernel or user space ) , 所以啟動 strace (arm 版本), 如無 strace , 則 google 找抓下來自己編譯,丟到 device 上去跑 (記得 chmod 755 strace)

#./strace mount -t nfs -o ..................
注意最後幾則 syscall 監聽,可以看到 mount 呼叫發生錯誤,一樣是 no such directory .
這時候我
#pwd
注意到目前位於 /root , 而 nfs 目錄件於 /root/nfs
難怪 mount fail , 所以應該改成
#mount -t nfs -o nolock 1.2.3.4:/home/skyter/nfs /root/nfs


收工

Saturday, September 26, 2015

肥皂酸鹼度

因為小孩常被蚊嬰兒時子叮,塗了防蚊液雖不癢但是隔天仍然腫得很大,我得假設是蚊蟲中的甲酸讓身體引發嚴重的過敏反應造成,原本想上網買氨水,但是買不到,又不敢用水族箱的氨水來塗抹,(雖然可以抹尿,但覺得很噁心,尿中含氨水成分)

意外發現網路上傳的塗肥皂招數,理論是酸鹼中和,(氨水也是鹼性, 另外就是小蘇打粉粉)。

相比起來,拿肥皂塗在叮咬傷口上,是比較可以被接受的。市面肥皂多種,所以拿家中肥皂來做測試:
水7
Dove多芬 6.2
麗嬰房 nac nac 橘色透明 8.5
水晶肥皂 9.4
碁峰父親節 白色肥皂內含黑色點點 9.37
五雀女手工皂 9.23
施巴5.5嬰兒泡泡浴露 5.46
黑人超氟牙膏 6.41

測試工具是一隻PH電子數位測試筆

結論是南亞水晶肥皂適合

我在猜想,如果嬰兒時被蚊蟲叮咬,洗澡時又怕熱水加入施巴,後果應該會很慘。