2020年11月18日 星期三
[NAS]檔案儲存的安全
2020年9月21日 星期一
[gae]從 appcfg 移民到 gcloud
# 從 appcfg 移民到 gcloud
Google App Engine 我用了很久,一開始它是使用 appcfg 這個指令來執行上傳網站內容到 GAE 的環境去。
直到昨天才發現資料上傳的指令要改用 gcloud,而且,gcloud 的使用必須要綁定信用卡。以往,如果超額使用了,google 是想辦法限制你的 app,像我是使用免費額度的,用完就關閉,我也不在乎。但是現在的改變,是讓我非得要跟新用戶一樣,如果超額使用了,我自己要去關掉 app,不然我就會被追討錢。這一點很討厭啊。
不過,我有信心我的小小網站沒有人看是不可能會超額的,所以還是硬著頭皮把信用卡綁了,接下來就是設定 app 自動上傳的步驟。
## 移民的步驟
按照 https://cloud.google.com/appengine/docs/standard/python/sdk-gcloud-migration
下載 gcloud SDK,並且安裝它。
然後,到原本 app 的目錄上,執行 `gcloud app deploy <app 的目錄>`
然後照著指示做,像是登入、移除 app.yaml 裡的 application 與 version 改用指令指定之類的,都成功之後,上傳完畢會提醒你,要綁信用卡,否則 app build fail。所以再照著指示去綁信用卡。綁完就會成功上傳。
如果像我要自動上傳,指令要多加 --quiet,這樣就不用互動了。另外,也指定 app 的 version,這樣就不會產生新的版本,應該會直接覆蓋。免得版本放太多沒清掉被收錢。
2020年9月17日 星期四
[HP-UX]延壽計畫 結束
HP-UX 老傢伙回家了,
客戶也沒問什麼。
關於 Python 的事,簡單記錄一下。
真心感謝這些 open source 的 source code 都有留著,
真的是夠老的程式,對於 hp-ux 還有一些修正,所以經過交叉試驗幾個版本的 python,
Python-2.3 應該是要修改比較少的。可以支援到網路與threading。
configure 的時候要使用 pth,而不要使用 pthread。
c編譯器要選 cc,c++編譯器要選 aCC。這兩個是老傢伙自己帶著的。
因為不知道該怎麼處理 configure 要增加 cflags,
所以在產生 Makefile 之後,在 cflags 的地方要加上 +DA1.1
如果遇到 aCC 抱怨 ccpython.cc 看不懂或 link 時少掉 symbol,那就去改使用 python.c 的那一個。
接下來就是球來就打,有抱怨就解的時間,大多就是修改重覆定義但內容不同的地方,或是去搜尋找不到的定義,都過了之就,就過了。報告完畢。
後註:Python-2.6.9 要從 source 編譯,需要另一個 python,所以,它也有了雞生蛋的問題。這幾年遇到幾次翻新的工作,得到的感觸就是有空能翻新就翻新,不要等太久的話,自動工具就沒辦法自動了,這讓要翻新的工夫比弄新的還大。翻新需要的其實也都不難,就是做苦工,而苦工就是需要時間與耐心。這時代好像大家都缺乏時間與耐心。
2020年9月14日 星期一
[golang]移植 go 到新的作業系統與架構
https://github.com/embeddedgo/go/tree/embedded/src/cmd/dist
https://docs.google.com/document/d/1OaatvGhEAq7VseQ9kkavxKNAfepWy2yhPUBs96FGV28/edit
根據這個文件,安裝新的 go,需要已經編譯好的 go。在還沒有 go 的地方,只能從 go1.4 開始編譯。因為 go1.4 是最後一個用 c 產生的 go 的編譯器。更高的版本都必須要用 go 來編譯。
官方文件 https://golang.org/doc/install/source 的方法,從 source 開始編譯 bootstrap toolchain,可以下載 https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz 。這個包裡面有做調整使它更適應新的作業系統。裡面可以支援的作業系統與指令集有限。
在 cmd/dist/build.c 裡有列出可用的作業系統與指令集
static char *okgoos[] = {
"darwin",};
"dragonfly",
"linux",
"android",
"solaris",
"freebsd",
"nacl",
"netbsd",
"openbsd",
"plan9",
"windows",
static char *gochars = "5668";
static char *okgoarch[] = {
// same order as gochars};
"arm",
"amd64",
"amd64p32",
"386",
在裡面會用到的 assambler, compiler, go compiler, linker 的程式碼,就放在 cmd/dist/[5-8][a,c,g,l]
例如,arm 架構就用 5[a,c,g,l],386 架構就用 8[a,c,g,l]
當 make.bash 能夠完整跑完,bootstrap toolchain 才算是完整。
裡面的流程是
1. 用 c 編譯 cmd/dist/dist 執行檔
2. 用 cmd/dist/dist bootstrap -a 編譯出 go_bootstrap 執行檔(原始檔來源 cmd/go)。cmd/dist/dist 會利用 [5-8][c,l] 與 gcc 編譯 .c 檔,用 [5-8][a] 編譯 .s 檔,用 [5-8][g,l] 編譯 .go 檔。
3. 用 go_bootstrap install 編譯 go 的其他 package,都是 .go 檔。
4. 最後刪除 go_bootstrap 執行檔
5. 用 cmd/dist/dist banner 顯示編譯資訊
以下有詳細指令關於從 source 編譯與安裝 go
http://www.boomerangsworld.de/cms/dev_guides/install_go.html
從以上資訊,可以了解到,在新的作業系統與架構上安裝 go,可能有兩種途徑:
1. 從 go1.4 開始,修正 cmd/dist/dist 的原始碼,認到正確的 GOOS GOARCH。然後在 cmd/dist/dist bootstrap 階段,提供正確的 a, c, g, l 的 .c, .s 檔案。
2. 使用 cross compile 的方式,在已經可以正常執行的環境下,編譯新架構的 go。在 go 大於 1.5 之後的版本,go compiler 與 go linker 的程式架構已經改變,所以要修改的程式與原來的 cmd/dist/[5-8][a,c,g,l] 不一樣。在 goroot/src/cmd/internal/obj, cmd/asm/internal, src/cmd/link, src/cmd/compile/internal/ssa/gen 這些地方都要修正。https://embeddedgo.github.io/2019/11/19/porting_go_to_microcontrollers_part1.html https://embeddedgo.github.io/2019/11/24/porting_go_to_microcontrollers_part2.html
假始只想要安裝 go1.4 的話,那麼就去修正 cmd/dist/[5-8][a,c,g,l] 應該就可以了。
如果,想要移殖新版的 go,應該採用第二個方法。產生一個新的 go。
如果採用第一個方法,在修正完 cmd/dist/[5-8][a,c,g,l] 之後,還要再修正 go compiler 與 go linker 的程式。等於做兩次工。
2020年9月12日 星期六
[HP-UX]HP-UX 延壽計畫
# HP-UX 延壽計畫
最近工作要與 HP-UX 溝通,要來了解一下它的環境。
查了一下網路,是個 unix 系統。It's a Unix system, I know this! https://www.youtube.com/watch?v=dFUlAQZB9Ng
(從 jerv 學來的梗)
## 第一步
等到機器來了,先用鍵盤登入後,發現
只有 sh 與 vi
打錯字還不能 backspace ...
`vi` 簡單指令例如: i 遊標位置開始輸入、a 遊標位置後新增輸入、ESC 離開編輯模式、x 刪除遊標位置字元、dd 刪除遊標位置所在行、:w 存檔、:wq 存檔後離開。
google 如何改網路設定,如下:
設定 ip, mask, gateway
`vi /etc/rc.config.d/netconf`
改變 IP_ADDRESS[0] SUBNET_MASK[0] ROUTE_GATEWAY[0]
設定 ip 與 hostname 對應
`vi /etc/hosts`
設定 dns server
`vi /etc/resolv.conf`
然後,重開機,讓設定生效。(因為我不會手動使之生效)
## 第二步
網路設定生效之後,就可以坐在位子上遠端了。不然機台離我位子很遠。
首先看一下 uname
環境
```
mesf /# uname -a
HP-UX mesf B.10.20 A 9000/785 2010791808 two-user license
```
更改時間 使用 `date` 指令
hp-ux 的軟體管理工具程式有 `swlist` `swinstall` `swremove`
已經內裝好的程式有:
700QPK1020 ACE.199912.02 Workstation Quality Pack for HP-UX 10.20 (December 1999)
B3899BA B.10.20.07 HP C/ANSI C Developer's Bundle for HP-UX 10.20 (S700)
B3907CA B.10.20.07 HP FORTRAN/S700 Compiler and its associated products
B3907DB B.10.20.14 HP Fortran 90/S700 Compiler and its associated products
B3911DB A.01.15.01 HP aC++ Compiler S700
B5402AA_APZ B.10.20 MirrorDisk/UX
B6193EA ACE.199912.01 Workstation ACE for HP-UX 10.20 (December 1999)
B6378DA ACE.199912.01 Networking ACE for HP-UX 10.20 (December 1999)
HPUXEngCR700 B.10.20 English HP-UX CDE Runtime Environment
Ignite-UX-10-20 A.2.3.205 HP-UX Installation Utilities for Installing 10.20 Systems
J2559C D.06.15 Hewlett-Packard JetAdmin for Unix Utility
此外,ftp server 也已經可用,一開始我還用 ftp 指令下載檔案,痛苦。
經過搜尋之後,以下這個網站的程式才可以用。
http://mirrors.develooper.com/hpux/downloads.html
這個網站非常重要,只有它有 hp-ux 10.20 32bit PA-RISC 1.1 的工具程式。
下載 `bash-4.3.30` `gcc-4.2.2 + binutils-2.16.1 + gdb-6.5`
依照網站說明
.sd.bz 用 bzip2 解開(`bzip2 -d foo-x.y.sd.bz`),然後用 `swinstall -s <絕對路徑>/foo-x.y.sd` 安裝
其他想要用的程式,可能都要自己編譯安裝才行。
## 第三步
目標是在這個老傢伙身上安裝軟體,如果不能的話,就自己寫,寫 fortran 當然是有點太遠,寫 c/c++ 來選我一定是選 c。
但是,如果有其他的程式語言可以從這傢伙 build 出來,至少我可以不用傷腦筋字串、記憶體、指標、網路通訊的問題,時間一定會比較省,bug 應該也會比較少。
一開始先找可用 gcc 編譯的程式語言,太新的語言大多相依 linux, 或新版的 gcc,或很新的 lib。最後可選的是 python,go。但是事情沒有這麼簡單,在嘗試過程中才知道,thread 這件事是要看系統與編譯系統,原來的系統與所附的的 cc 與 aCC 不支援 thread。我安裝的這個 gcc-4.2.2 + binutils-2.16.1 + gdb-6.5 也沒有支援。
嘗試編譯 go 的過程非常複雜,最後就是卡到要寫 asm,放著。
嘗試編譯 python 的過程非常複雜,有需要再說,總之現在得到一個堪用的 python,有些 module 沒有編成功。雖然沒有 thread,但是有網路功能。
從 https://www.python.org/downloads/source/ 下載 Python-2.1.3.tgz,解開之後,進到 Python-2.1.3,
執行以下指令
```
./configure --without-threads
make
make test
```
結果是
```
108 tests OK.
3 tests failed: test_builtin test_pickle test_popen
30 tests skipped: test_al test_asynchat test_bsddb test_cd test_cl test_dl test_fcntl test_fork1 test_gdbm test_gl test_gzip test_imgfile test_largefile test_linuxaudiodev test_locale test_minidom test_nis test_openpty test_pty test_pyexpat test_sax test_socketserver test_sunaudiodev test_sundry test_thread test_threadedtempfile test_winreg test_winsound test_zipfile test_zlib
```
builtin 模組不能用有一點點讓人擔心,它的失敗原因是 `test test_builtin crashed -- exceptions.ValueError: int() literal too large: -2147483648` 這代表編譯時候的 int 與 python 認知 int 邊界可能有差異,可能所有的 int 都要小心。
想要支援 thread,系統有安裝 pth,但是用 gcc 編譯有各種問題,之後再寫有哪些問題。
2019年10月1日 星期二
[超譯] 解決 .Net Reference 的版本衝突
最近遇到一個狀況,我包好的 dll 會用到 Newtonsoft.Json.dll (Json.Net),版本是 4.5。拿去給別人(A公司)用,他們也用了別人(B公司)的 dll,也用到 Newtonsoft.Json.dll (Json.Net),但是他們指定的是 9.0.0。當 Visual Studio 把我指定的 Newtonsoft.Json.dll 搬到執行檔旁邊,B公司的 dll 就無法啟動。當換成 B公司指定的,就換我的 dll 無法啟動。A公司的人大叫該怎麼辦?因為我們公司比較小,所以我要解決這個問題。
## 主旨
一般的解決方法都是叫大家重新抓過新版的 dll,像我們這次就是叫我這比較舊的版本要升級。但,支援的 .Net Framework 不能超過 4.5.2,超過會讓其他家的 dll 無法運作。這作法也沒什麼不好,只是沒有一勞永逸。要是將來我的 dll 給了幾家客戶,他們幾家要的 Newtonsoft.Json.dll 都不一樣,或是他們升級了,我這小公司就得配合找到對應的 Newtonsoft.Json.dll 來 rebuild 才行。
網路上用不同關鍵字找過,我認為這個比較好。https://michaelscodingspot.com/how-to-resolve-net-reference-and-nuget-package-version-conflicts/
## 超譯
重點,解法有兩個方向,四個方法。
兩個方向是 (1) 如果可以,全部改成同一個版本。 (2) 使用 dll side-by-side loading。
四個解法之中,作者建議解法(1)
### 解法(1) Use a single assembly version with Binding Redirect
在有 app.config 或 dll.config 的存在時,增加一個 runtime 標籤。舉例:
```
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="1.2.11" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
```
作者舉 log4net 為例,加上 runtime 標籤指示 CLR 使用 1.2.11 版的 log4net。
### 解法(2) Override AssemblyResolve for side-by-side loading (No need for strong names)
使用 AppDomain.CurrentDomain.AssemblyResolve 事件來處理不同版本的尋找問題。
首先將要處理的 dll 的 CopyLocal 設成 False。並將不同版本的 dll 放到不同磁碟位置。然後在執行檔的最開頭註冊 AssemblyResolve 事件。它在 app 找不到 dll 的時候會被呼叫,然後我們就寫好程式來處理它。
範例:
```
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, resolveArgs) =>
{
string assemblyInfo = resolveArgs.Name;// e.g "Lib1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
var parts = assemblyInfo.Split(',');
string name = parts[0];
var version = Version.Parse(parts[1].Split('=')[1]);
string fullName;
if (name == "Lib1" && version.Major == 1 && version.Minor == 0)
{
fullName = new FileInfo(@"V10\Lib1.dll").FullName;
}
else if (name == "Lib1" && version.Major == 1 && version.Minor == 1)
{
fullName = new FileInfo(@"V11\Lib1.dll").FullName;
}
else
{
return null;
}
return Assembly.LoadFile(fullName);
};
```
### 解法(3) Copy assemblies to different folders and use <codebase> to load them side-by-side (Requires strong names)
這個方法需要 dll 有強式名字。這點 Newtonsoft.Json.dll 或 log4net 這類公開的 dll 做得到。或是自己做的 dll 也來個強式名字也行。將要處理的 dll 的 CopyLocal 設成 False。
舉例:
```
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="StrongNameLib" culture="neutral" publicKeyToken="6a770f8bdf3d476a" />
<codeBase version="1.0.0.0" href="StrongNameLibV10/StrongNameLib.dll"/>
<codeBase version="1.1.0.0" href="StrongNameLibV11/StrongNameLib.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
```
這就是告訴 CLR 按照版本去找 dll。如果沒有強式名字,CLR 會忽略版本,所以總是找到第一個 codeBase 所列的 dll。href 也可以用絕對路徑,像是 @"FILE://c:/Lib/MyLib.dll"
### 解法(4) Install assemblies to the Global Assembly Cache (GAC)
這個方法是把要用到的 dll 註冊到 GAC (Global Assembly Cache) 裡。這會需要 dll 有強式名字,而且還要使用者手動執行指令(或是用安裝程式)將 dll 註冊到 GAC 裡。例如:
```
gacutil.exe -i "c:\Dev\Project\Debug\MyLib.dll"
```
將要處理的 dll 的 CopyLocal 設成 False。依照 runtime 的尋找規則,會先找尋 GAC 有沒有可用 dll,所以因為 GAC 都有註冊,所以各自會找到對應的版本來使用。
這個方法會需要使用者手動註冊或者使用 installer 將 dll 註冊到 GAC。也就這樣而已。但是有些人就是會嫌……。
2019年7月18日 星期四
[點網]從 WSDL 檔產生伺服器端介面
重點:
* 用 wsdl.exe 產生 proxy class 時,加上參數 /serverInterface
- 記得還有 asmx 要處理
參考:
https://stackoverflow.com/questions/1394930/how-to-generate-web-service-out-of-wsdl
延申:
self host wcf
https://docs.microsoft.com/zh-tw/dotnet/framework/wcf/how-to-host-a-wcf-service-in-a-managed-application
https://social.msdn.microsoft.com/Forums/vstudio/en-US/aaa6b8d5-fc49-45ca-9cab-6d5bea60fd3b/configuring-in-code-a-selfhosted-web-service?forum=wcf
https://social.msdn.microsoft.com/Forums/en-US/19c23ba7-6de8-4052-86aa-6a81f74327c6/port-issue-on-a-self-hosted-asmx?forum=asmxandxml
https://stackoverflow.com/questions/30332510/running-a-asmx-web-service-as-a-windows-service
https://dottutorials.net/creating-soap-web-services-dot-net-core-tutorial/