2018年8月29日 星期三

[pi-nas] raspbain 樹莓派 wlan0 失效,自動重啟

wlan0 失效,自動重啟,這個網路上有找到一些解法,但是有些太舊方法已經失效。於是這次重做一次,再記錄下來。

總體的概念是,使用 bash script,每隔一段時間測試網路狀況,如果有問題就重啟。


  •     測試的方法是用 curl 向 google 與 yahoo 要網頁,有回應就算成功。
  •     重啟的動作,ifup/ifdown,ifconfig wlan0 up/down 或是 dhcpcd restart 都無用。ifup/ifdown 在 raspbian 有問題,找不到 wlan0,而後兩個失敗的原因是 route default gateway 的設定會失蹤。解決方法直覺的是使用 `sudo route add default gw 192.168.1.1`,另一個則是在 dhcpcd restart 之前做 `sudo ip addr flush dev wlan0`,而我選擇後者。
  •     每隔一段時間執行的動作是使用 cron,在 raspbian 這個版本用的是 anacron,直接在 /etc/crontab 加入設定即可。它自己就會檢查與執行,不用重啟 cron deamon。

 
完整    bash script 如下:
    ```
    #!/bin/bash
    urls=("http://www.google.com" "http://tw.yahoo.com")
    http_code_accept=("200" "301" "302" "404")
    count=${#urls[@]}
    connected=0

    echo "now start to check net is on or not"
    echo "bash file in /home/pi/net_restart.sh"
    #check net is connected or not
    for ((i=0;i<$count;i++))
    do
        url=${urls[$i]}    
        result=$(curl -o /dev/null -s -m 10 -w "%{http_code}" "$url")
        for flag in ${http_code_accept[@]}
        do
            #echo $flag $result $url
            if [ $flag = $result ]; then            
                connected=$(expr $connected + 1)
                echo "accept" $url $connected
            fi
        done
    done

    if [ $connected -eq 0 ]; then
        echo "network not good"
        echo "going to restart network"
        ip addr flush dev wlan0
        systemctl restart dhcpcd
    fi
    ```

2018年8月9日 星期四

[點網]現在 visual studio 正在轉型中

最近研究 roslyn 發現幾個點。


  • 2013 還是使用 native 的 csc.exe vbc.exe。而 2015 2017 開始,使用 roslyn 做為 compiler。
  • vs extension 的規格開始改變,名字叫做 .net standard,所以 NuGet 有的東西的打包沒有跟上的話,在 2015 之後就會裝不進舊的 vs。當然也會有舊的東西裝不進新的 vs。像是 .Net Compiler Platform SDK 如果用 extension (NuGet or VSIX)裝的話,會被 vs2017 關掉。要從 Visual Studio Installer 的 Individual components 頁籤安裝才行。現在是混亂期,從 2015 到現在已經三年了吧。
  • 現在除了 library 打包換規格之外,現在也因為推出 .Net Core 的關係,framework 也是混亂期,library 有新舊兩種的 portable 格式,給 framework 用的與 core 用的也是要慎選。

2013 與 2017 的間隙很大,應該是沒辦法直跳,2015 應該要保留著用來轉換專案用。
就跟 2005 一樣,用來轉換 2003 與 2008 的專案。

現在如果要專案升級最好還是等等。

相關連結:
https://www.facebook.com/groups/DotNetUserGroupTaiwan/permalink/1945828905710218/

[點網]實際的四捨四入

文章連結:https://www.facebook.com/groups/DotNetUserGroupTaiwan/permalink/1945395752420200/

一定要筆記

今天在使用某個成績系統時候遇到四捨五入結果與Excel的ROUND()比對有誤差的問題

與負責的工程師一起測了一下之後

發現造成此問題的原因是因為 .net 中 Math.Round() 函數的行為

於是來與各位分享一下

大家先猜猜下面四捨五入到小數第二位的輸出結果

Math.Round(18.265, 2);

Math.Round(18.265, 2, MidpointRounding.AwayFromZero);

Math.Round(18.275, 2);

Math.Round(18.275, 2, MidpointRounding.AwayFromZero);

Math.Round(18.275M, 2);

Math.Round(18.275M, 2, MidpointRounding.AwayFromZero);

================================

.

.

答案分別是

Math.Round(18.265, 2) = 18.26

Math.Round(18.265, 2, AFZ) = 18.27

Math.Round(18.275, 2) = 18.27

Math.Round(18.275, 2, AFZ) = 18.27

Math.Round(18.275M, 2) = 18.28

Math.Round(18.275M, 2, AFZ) = 18.28

而造成此原因是因Math.Round() 在遇到5的時候

預設是使用 MidpointRounding.ToEven 作為捨去或進位的依據

也就是會round到該位最近的偶數

假設我需要四捨五入到小數第二位

在遇到18.265的時候因為6是偶數,所以會做捨去

如果18.265使用了MidpointRounding.AwayFromZero就會不管奇偶去做四捨五入

得到與Excel的ROUND()相同的18.27

但又有一個問題

18.275出來為何都是18.27?

這是因為在四捨五入過程中遇到了精度丟失

造成了非預期的四捨五入行為

改為decimal之後就正常了

【結論】

處理小數四捨五入的邏輯時

#務必使用decimal型別

#確認四捨五入邏輯

#明確指定MidpointRounding模式

才會得到精確的結果

【補充】

留言中有人有提到.net預設的 ToEven

也就是 Banker's rounding

兩種四捨五入設計給不同的用途

開發前務必確認四捨五入的邏輯

2018年8月5日 星期日

[pi-nas] pi 增加 SmartMonTools

Smart Mon Tools 是用來看硬碟上 S.M.A.R.T 的資訊,
可以提前知道硬碟是不是快壞了。
對於 NAS 來說是必要的。
但因為樹莓派原先不是用來當 NAS 的,所以沒有預載這個程式。
因此要手動安裝。

sudo apt-get smartmontools

因為很久沒有去動它,所以有可能會遇到站台不見的情況而遇到 unable to fetch some archives 的情況。此時,先執行 sudo apt-get update 再試。

sudo smartctl --all /dev/sda

這樣就可以看到該硬碟所有資訊。

以下的是正常的硬碟
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
如果看到以下的文字,就應該要考慮換硬碟了。

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: FAILED!
Drive failure expected in less than 24 hours. SAVE ALL DATA.
See vendor-specific Attribute list for failed Attributes.
接下來找時間來換硬碟,會記錄 gluster 換硬碟的流程,免得又忘記了。

2018年8月1日 星期三

[git]用工具的還是人

一則臉書貼文,有關 git 之前大家怎麼版控的。
https://www.facebook.com/groups/git.tw/permalink/1817171478331512/
樓主留言問到:「想請教一下各位前輩
知道在沒有git 或 svn之類的軟體出現之前
是怎麼協同開發的...

剛剛跟公司的高層主管(不會寫程式)聊天
他說我們公司DevOps很奇怪
為什麼都沒辦法協同開發
說到協同開發每個人都一臉大便

我跟他說很多點公司的現況
1.git當備份工具 commit都沒有意義 更別說開分支之類的
2.大家都是直接連到伺服器去改程式
3.沒有人來負責merge程式
之類的

就被他反嗆
他們1X年前沒用這些東西
大家也都是連到同一台伺服器去做
照樣都可以協同開發
系統也更新了好幾代
為什麼現在不行...
所以想了解一下早期1X年以前
git svn這些東西出現以前
是怎麼協同開發的」

結果有滿多留言不是在回答「git svn這些東西出現以前
是怎麼協同開發的」,而是在講主管有問題。
如果是你,應該怎麼回答這問題呢?

也許樓主是來討拍的,而講主管有問題的才是正確解答。
但我還是留言以前經歷過的協同開發怎麼做的:「Code review, 專人merge 。之後有rational, source safe, cvs,就有辦法一個人改的時侯check out鎖檔不讓別人改,改完check in。」

當然,有些人講得沒錯,現在的程式複雜度比較高,沒有工具就很難處理好。
可以說,因為現在工具的存在,才會出現現在程式的高複雜度。
但反過來說也對,因為有高複雜度的程式的需求,才會造成現在工具的誕生。
但是,重要的還是,不會用工具的人還是會搞得一團糟。
人的概念、程式複雜度、工具支援度,三個東西是程度相合的。其中一個跟不上,就必定出問題,就必定要調整。

最後,我只能留以下留言給事主:
「如果你推不動其他資深同事,那就跟老闆說清楚。
你講的123點,不論用什麼工具都是必須要人們去做好的。
工具再好,人亂用,還是一塌糊塗。
用工具卡死、強迫一定要做到123點,每個 commit 要送老闆簽核、只有某些人才有辦法 merge 進版…等都有辦法做到,以前的幾個 source control software 都做得到。但是如此做會面對更多人性的挑戰,因為那是用伺服器就開始卡權限的,一個人不在位子上,就有可能整個公司不用改程式,一定更多人會抱怨。
工具會進步,就代表舊的方式需要捨棄一些東西來換取另一些東西。git 就是捨棄嚴格卡控,換來靈活合併與分支。如果同事們沒有相對應的概念,就容易弄得更亂。
這時候你們要想想該選擇哪種合作模式才是適合你們這群人,看是要改模式還是換工具或是換公司。」

以上幾點感想。