Author Archives: Coolfire

System.Data.SQLite DLL 版本切換 32/64 Bit

專案是在 .NET 底下執行,當然最好還是編譯成 Any CPU,這時指定編譯為 32 Bit 的解法選項就不夠完美。在找解決方案的時候看了 Stackoverflow 的這一篇:

http://stackoverflow.com/questions/7264383/options-for-using-system-data-sqlite-in-a-32bit-and-64bit-c-sharp-world

參考了眾多解決方案都不太符合,後來想到的解法是使用 NSIS 做安裝檔案,預設複製 32 Bit 版本,安裝時當判斷作業系統是 64 Bit 時將 64 Bit 版本複製到應用程式執行路徑,反之則不複製,保持使用 32 Bit 版本。

 

Section "Main Program" MAINSEC

SetOutPath "$INSTDIR"
SetOverwrite ifnewer

; Those files are included with the installer
File /nonfatal /a /r ..\bin\Debug\en\
File /nonfatal /a /r ..\bin\Debug\zh-Hans\
File /nonfatal /a /r ..\bin\Debug\zh-Hant\
File ..\bin\Debug\App.exe
File ..\bin\Debug\App.exe.config
File ..\bin\Debug\System.Data.SQLite.dll
File ..\bin\Debug\System.Data.SQLite.xml
File /nonfatal /a /r ..\bin\Debug\Tools\

;Store installation folder
WriteRegStr HKCU "Software\FETAG\MyApp" "" $INSTDIR

;Create shortcuts
CreateDirectory "$SMPROGRAMS\MyApp"
CreateShortCut "$SMPROGRAMS\MyApp\App.lnk" "$INSTDIR\App.exe"
CreateShortCut "$SMPROGRAMS\MyApp\UnInstall.lnk" "$INSTDIR\Uninstall.exe"

CreateShortCut "$DESKTOP\MyApp.lnk" "$INSTDIR\App.exe"

;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"

; x32 or x64 DLL
!include "x64.nsh"
${If} ${RunningX64}
; MessageBox MB_OK|MB_ICONSTOP '64 Bit'
${Else}
; MessageBox MB_OK|MB_ICONSTOP '32 Bit'
CopyFiles "$INSTDIR\Tools\System.Data.SQLite.dll" "$INSTDIR\System.Data.SQLite.dll"
${EndIf}
SectionEnd

另外一個 AssemblyResolver 的方法看起來還是太麻煩了。

 

Xpreia S (LT26i) 升級 Android 6.0

Xpreia S 真是個長生機種,拿它來做 Android APP 開發因為可以用很久所以 CP 值極高,持續有不同的團隊放出最新版本的 ROM,這次在 xda-developers 上看到的這一個則是放出了 Android 6.0 的版本。之前在 Xperia Z5C 上就體驗過從 5.x 升級到 6.0 之後的速度改進,當然最主要的還是應用程式權限的細分更能讓機主擁有更多的自主性。

安裝過程國外網友做了一個不錯的教學,測試過不會變磚。

How to install Android 6.0 Marshmallow in Xperia S

先玩玩再看看以後有沒有機會升到 N… 🙂

加碼提醒,看到很多朋友用 刷機大師刷各種 ROM, 它上面推薦的 ROM 如果拿來開發你會在 Android Monitor 上看到很多有趣的現象,建議還是卸載用 xda 上的方式及 ROM 刷機吧,對那些號稱國內高手修改的 ROM 還是保持點距離。

 

在已執行的 Docker 容器服務中獲得 Shell

獲得 Shell 後可以對容器內容做一些修改及監控,或是進一步了解作者在 Image 中包了哪些東西,Docker 容器服務若已經啟動,在不影響服務正常運行的情況下想要獲得 Shell 的話,最方便的應該就是容器開發模式中使用 nsenter 的方式。網路上眾多安裝 nsenter 方式以這個命令最簡便,不需額外套件與編譯直接安裝:

安裝方法

docker run -v /usr/local/bin:/target jpetazzo/nsenter

其 Github 的項目地址在:https://github.com/jpetazzo/nsenter 有興趣的朋友可以多多關注這個項目。

使用方式

先取得容器的 PID

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)

根據 PID 獲得 Shell

$ sudo nsenter --target $PID --mount --uts --ipc --net --pid

簡化為 Shell Script <enter-cnt.sh>:

#!/bin/bash
echo "Looking PID for $1: "
PID=$(docker inspect --format {{.State.Pid}} $1)
echo $PID
sudo nsenter --target $PID --mount --uts --ipc --net --pid
ss_2016-02-28_21-08-56

網路上也有網友提供一個較複雜的 Shell 腳本 (轉自 http://www.hjue.me/post/docker-nsenter) 需要的朋友也可以參考:

#!/bin/sh
if [ -e $(dirname "$0")/nsenter ]; then
# with boot2docker, nsenter is not in the PATH but it is in the same folder
NSENTER=$(dirname "$0")/nsenter
else
NSENTER=nsenter
fi
if [ -z "$1" ]; then
echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"
echo ""
echo "Enters the Docker CONTAINER and executes the specified COMMAND."
echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."
else
PID=$(docker inspect --format "{{.State.Pid}}" "$1")
if [ -z "$PID" ]; then
exit 1
fi
shift
OPTS="--target $PID --mount --uts --ipc --net --pid --"
if [ -z "$1" ]; then
# No command given.
# Use su to clear all host environment variables except for TERM,
# initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
# and start a login shell.
"$NSENTER" $OPTS su - root
else
# Use env to clear all host environment variables.
"$NSENTER" $OPTS env --ignore-environment -- "$@"
fi
fi

[SOLVED] Shadowsocks – “500 Internal Privoxy Error”

ISSUE:

500 Internal Privoxy Error

Privoxy encountered an error while processing your request:

Could not load template file no-server-data or one of its included components.

Please contact your proxy administrator.

If you are the proxy administrator, please put the required file(s)in the (confdir)/templates directory. The location of the (confdir) directory is specified in the main Privoxy config file. (It’s typically the Privoxy install directory).

SOLUTION:

iptables -F

真糗… @#%&&
好啦,這一篇是個 KUSO, 記得把該加上的 iptables 限制加上。

iptables -I INPUT -p tcp -m tcp –dport 8388 -j ACCEPT
iptables-save

Docker 自啟動容器

建立好一個容器後把它轉成服務,並設定在每次開機時自動啟動。在 CentOS 上我們使用的是 Systemd 而不是之前 Ubuntu 的 Upstart,Systemd 的約定中設定文件應放置在 /etc/systemd/system 或是 /usr/lib/systemd/system 下,由於某些系統預設安全性修改 /etc 下的檔案權限問題比較多,為了各系統間相容建議都放在 /usr/lib/systemd/system。

以下以 Dockerize 的 OpenVPN 容器設定為服務為例,容器確定已經可以正常運行之後,在上述目錄下建立一個 docker-openvpn.service 檔案:

sudo vi /usr/lib/systemd/system/docker-openvpn.service

內容為:

[Unit]
Description=OpenVPN Docker Service
Author=Coolfire
After=docker.service

[Service]
TimeoutSec=300
Restart=always
ExecStart=/usr/bin/docker start openvpn

[Install]
WantedBy=multi-user.target

然後測試是不是可以跑起來:

sudo systemctl start docker-openvpn
docker ps

如果已經跑起來了,那麼把它設定開機自啟動:

sudo systemctl enable docker-openvpn

如果需要確認可以重開機看看服務是否不需人工干預自動跑起來了。

CoreOS 可參考:
http://chuansong.me/n/1067253

dpkg 安裝軟體列表的備份方式

/* 刪除電腦中不用的小紙片 */
我們每個人都有過重裝系統的經歷,在安裝好系統之後,如何才能快速重裝原來那些自己所鍾愛的軟件?nixCraft 提供了一個有用的技巧。它的原理是在系統完好無損的時候,就做好已安裝軟件的備份工作。然後,在重裝系統後就可以利用先前備份的文檔來執行還原操作了。下面是相關的實施步驟(以 Debian 為例):

  1. 執行備份操作:
dpkg --get-selections > installed-software.log

這將當前系統中已安裝的軟件保存到 installed-software.log 中。

  1. 在還原時使用
dpkg --set-selections < installed-software.log

導入軟件列表,再利用 dselect 工具安裝軟件。
上述方法同樣適用於 Ubuntu。另外,原文也介紹了基於 RPM 包管理器的發行版如何執行的步驟,有興趣的可以直接去看。

sudo dpkg --set-selections /home/package.selections && apt-get dselect-upgrade

關於「人件經歷」

這個類別的產生與一本叫做「人件 (PeopleWare)」的書有關,讀這本書的時候驚奇的發現在自身工作經歷上有那麼多的畫面與書中描述雷同,拿到的這個翻譯版本雖然翻譯得不太好 (機器翻譯式中文),但是透過文字所表達出來的意念與自己無法用文字或口述言語表達出來的「感覺」是那麼地貼切,很快發現自己與作者是心靈契合的 (這個版本的翻譯者與校對者應該沒有這樣的感覺)。也許可以把自己相同的經歷透過一些簡短的文字傳達出來,引發某些朋友的共鳴。

[簡記] Mac 的 Fusion Drive 建立方式

  1. 硬碟與 SSD 各分割一個扇區
  2. diskutil list
  3. diskutil cs create Fusion disk0 disk1
  4. diskutil cs list (Copy UUID)
  5. diskutil coreStorage createVolume [UUID] jhfs+ “Macintosh Fusion” 100%

另外,Disk Sensei 這個工具可以協助在 EI Capitan 中 Enable Trim Support,據 這篇 說明是不用再 Disabling kext signing 因此更加安全。我在 Fusion Drive 環境測試過沒有問題,免購買試用版本可操作 Trim Enable,推薦。

新增解除 Fusion Drive 的方法,硬碟中資料會完全遺失請先備份:

  1. diskutil cs list (Logic Volume Group 後面那一串就是 UUID)
  2. diskutil coreStorage delete [UUID]

 

冰雹過後

img_7290
前ㄧ晚狂風大作下過冰雹後樓頂的太陽能板已經歪七扭八,後面還有幾排被掀翻了,雖是天災,但此等工程質量令安全堪憂。

Copyright © 2017. Powered by WordPress & Romangie Theme.