2018年4月5日 星期四

install gcloud SDK on Mac

在網站上下載自己版本的SDK:https://cloud.google.com/sdk/downloads?hl=zh-tw

解壓縮
# tar zxvf google-cloud-sdk-183.0.0-darwin-x86_64.tar.gz

進目錄後執行安裝檔
# cd google-cloud-sdk
# ./install.sh


遇到下列錯誤訊息:
File "/google-cloud-sdk/bin/bootstrapping/install.py", line 214, in <module>
    main()
  File "/google-cloud-sdk/bin/bootstrapping/install.py", line 189, in main
    Prompts(pargs.usage_reporting)
  File "/google-cloud-sdk/bin/bootstrapping/install.py", line 113, in Prompts
    scope=properties.Scope.INSTALLATION)
  File "/google-cloud-sdk/lib/googlecloudsdk/core/properties.py", line 1512, in PersistProperty
    raise MissingInstallationConfig()

重新安裝python
# brew reinstall python

it's OK~ 


另外也可以嘗試以下指令的安裝方式
curl https://sdk.cloud.google.com | bash

2018年4月1日 星期日

讓mac有漂亮的 Terminal

  1. 安裝 iTerm2
  2. 修改 iTerm2 的 color scheme
  3. 安裝 powerline font
  4. 安裝 zsh
  5. 安裝 oh-my-zsh
  6. 安裝 zsh theme: powerlevel9k
  7. 設定 powerlevel9k

安裝方式:
brew cask instal iterm2
安裝好以後,打開 iTerm2 檢查 Report Terminal Type 的設定,設定路徑:
Preferences => Profiles => Terminal => Report Terminal Type
設為 xterm-256color,等等在 terminal 才能看得到漂亮的顏色

修改 iTerm2 的 color scheme

這步驟很重要,預設的很醜,想要自己的 command line 看起來賞心悅目就絕對要換掉預設的
設定路徑:Preferences => Profiles => Colors => Color Presets...






內建已經幾個選則可以用,不過幾乎都很難看,iTerm2 Color Schemes 有超多可以選,先把整個 repo 下載到自己的電腦後,然後 import 到 iTerm2:






剛才下載下來的 iTerm2-Color-Schemes 有很多個資料夾,從 schemes 資料夾裡面選一個喜歡的 color scheme






這邊要注意的是點選了檔案 import 以後並不會生效,還要再去 color preset 點選你剛 import 的 scheme 才會生效
我自己是用 Tomorrow Night Eighties,優點是對比不會太強比較不刺眼,螢幕盯久了不會不舒服,顏色飽和度也適中,看起來質感比較好。

安裝 powerline font

因為我們要用的 theme 會用到很多的特殊 icon,所以 iTerm2 選用的字型必需要支援這種特殊 icon font。這類型的字體統稱為 powerline font(另外還有加強版支援更多特殊 icon 的叫的 nerd font)
沒有安裝的話畫面會長這樣,遇到 icon 會變框框問號

支援 powerline 的字型很多,我推薦 Sauce Code Pro Nerd Font Complete安裝方式推薦直接用 brew 安裝比較快又好管理
安裝指令:
brew cask install font-sourcecodepro-nerd-font
如果想要裝別的,brew 上面也有很多字型可以挑。
關鍵字是 nerd:
brew cask search nerd


裝完後,記得修改 iTerm2 字型設定,改成 SauceCodePro Nerd Font 或你自己下載的字型
設定路徑:Preferences => Profiles => Text => Change Font (參考下圖)




修改 iTerm2 字型設定

安裝 zsh:

zsh 是個取代 bash 的強大 shell,比 bash 好用幾百倍。這篇文章介紹的 command line 設定一定要跑在 zsh。沒用過的一定要試一下
一樣用 homebrew 安裝:
brew install zsh

安裝 oh-my-zsh

上一步裝完 zsh 後,就可以開始調整我們想要的 command line 外觀設定了,但是原始的 zsh 因為設定太難搞,所以多年前剛出現的時候沒有受到太多關注,直到有人寫了一套叫 oh-my-zsh 的 framework 來幫助大家使用 zsh,zsh 才火了起來。現在幾乎所有 zsh 好用的工具都有支援 oh-my-zsh,所以當然是要裝這東西
安裝指令:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
註:這會直接執行 oh-my-zsh 的 install.sh有疑慮的人可以先稍微研究一下 oh-my-zsh github 上的 install.sh,覺得放心再執行
執行完以後如果沒有出現什麼錯誤訊息就代表成功了,同時會發現多了 oh-my-zsh 的資料夾 ~/.oh-my-zsh

重頭戲!!安裝 zsh theme powerlevel9k

剛裝完 oh-my-zsh 以後,預設是使用內建的 theme robbyrussell,多了 git 資訊,顏色也看起來比原生 bash 好一些:






不過 oh-my-zsh 內建很多 theme,在它的 github wiki 上有很多截圖可以參考
切換內建的 theme 很簡單,直接修改你的 ~/.zshrc ,把原本 ZSH_THEME=”robbyrussell” 改成你想要的:
ZSH_THEME=”agnoster” # 試試看把 robbyrussell 改成 agnoster
任何的 zsh 設定修改過後,還要執行以下指令才會生效
exec $SHELL
 
powerlevel9k 不只是像上面的示範圖顯示一些基本的資訊,還可以做到很屌的事情,比如像下圖那樣,顯示 WiFi 訊號強度、筆電電池電力、CPU loading、system free memory 等等資訊在 command line





圖片擷取自 powerlevel9k github

powerlevel9k 安裝方式:

  1. powerlevel9k 不是 oh-my-zsh 內建的 theme ,必須另外下載
指令:
git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k
2. 編輯你的 ~/.zshrc ,把 ZSH_THEME 設為 powerlevel9k,並設定要顯示哪些東西在 command line 上:
ZSH_THEME="powerlevel9k/powerlevel9k" 
# command line 左邊想顯示的內容
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) # <= left prompt 設了 "dir"
# command line 右邊想顯示的內容
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(time) # <= right prompt 設了 "time"
POWERLEVEL9K_RAM_ELEMENTS="ram_free"
上面的例子我們把左邊設了一個 dir,右邊設了 time,代表左邊想顯示當前資料夾路徑,右邊顯示時間
設定完後 command line 看起來會像這樣 (記得執行 exec $SHELL,設定才會生效):

當你進入了一個沒有寫入權限的資料夾時還可以給你提醒:
# 加上 "dir_writable"
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir dir_writable vcs)

我自己習慣左側的設定放一些常用基本資訊
右邊放一些好用但不是每次下指令都要看的東西
command line 右邊的設定放在 POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
例如顯示上一個指令的 return code:
# 加上 "status" 顯示上一個指令的 return code:
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status time)
如果指令沒出錯,linux return code 為 0 時會有個綠色小勾勾:

如果打了錯誤指令會出現相對應的 return code,並且用紅色底色提醒你

還可以顯示目前電腦的 free memory:
# 加上 ram,顯示目前的 free memory
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status ram time)
 
加上 CPU load average:
# 加上 load 顯示 CPU 忙碌程度
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status ram load time)
 
顯示電量:
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(battery)
 
示範了不少,但還有非常非常多東西可以用,請參考這個列表自己玩玩看https://github.com/bhilburn/powerlevel9k#available-prompt-segments
不過有些東西中看不中用,放太多東西也會讓 command line 反應變慢,試了各種設定一陣子後,只留下了一些我覺得比較有用的,給大家參考:
# 左側
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context dir dir_writable vcs vi_mode)
# 右側
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status background_jobs history ram load time)
# 若當前登入的帳號為你的帳號 xxx,就不用特別顯示出來
DEFAULT_USER="xxx"




ref : https://medium.com/statementdog-engineering/prettify-your-zsh-command-line-prompt-3ca2acc967f

2018年3月18日 星期日

grep指令搜尋結果 顏色設定

grep 對搜尋的字做顏色標註,只要用預設參數即可,可在 ~/.bashrc 寫個 alias 就好,如下:
# vim ~/.bashrc
並在該檔案中加入底下這行:
alias grep='grep --color'
儲存檔案離開後,重開terminal即可

2018年1月26日 星期五

uboot sf 指令 教學

uboot中如果有支援 spi/qspi flash, 就可以使用 sf 的 erase, read, write 等指令操作 spi flash


sf read: 讀取 flash資料到記憶體
sf write: 寫入記憶體資料到flash
sf erase:刪除指定位置,指定長度的 flash 内容, 刪除後内容全為 1


使用說明
sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus and chip select
sf read addr offset len - read 'len' bytes starting at 'offset' to memory at 'addr'
sf write addr offset len - write 'len' bytes from memor at 'addr' to flash at 'offset'
sf erase offset [+]len    - erase 'len' bytes from 'offset' + 'len' round up 'len' to block size
sf update addr offset len - erase and write 'len' bytes from memory at 'addr' to flash at 'offset'


使用範例
sf probe
在使用sf read sf write之前,一定要先用sf probe


sf write 0x20000000 0x0 0x10
把記憶體中0x2000 0000的資料, 寫入flash的0x0, 寫入資料長度為0x10, (注意:flash的位置以及寫入長度度最單位位是Byte)



sf read 0x20000000 0x10000 0x10
把flash位置0x10000, 長度为0x10的資料, 寫入到記憶體0x20000000, (注意:flash的位置以及寫入長度度最單位是Byte)


sf erase 0x0 0x10000
刪除flash的0x0, 長度為0x10000的資料, 刪除是以erase block為單位, offset和len參數必須要跟erase block對齊的。





驗證讀寫結果
可以结合uboot md命令, 可以用md查看記憶體中的資料
md.l 0x20000000 0x10
印出記憶體位置0x20000000, 長度為0x10的資料

2017年12月28日 星期四

install vim-go(on Mac OSX)

install vim-go 的插件
# curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
# git clone https://github.com/fatih/vim-go.git ~/.vim/plugged/vim-go

編輯 .vimrc
# vim ~/.vimrc

在 vimrc 中加入下列三行後儲存離開
call plug#begin()
Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' }
call plug#end()
 
最後再用 vim 去看 golang 的 code 就可以發現已經安裝好了
 
note: 注意 vim 的版本,若安裝失敗有可能是 vim 版本太舊請先更新
      # brew upgrade vim
 
 
使用方式:
 
執行,直接在 vim 底下輸入“:GoRun“ 即可看到結果.
 
編譯,在 vim 底下輸入“:GoBuild”,若成功可以看到 “vim-go: [build] SUCCESS”
  



reference:

https://github.com/fatih/vim-go-tutorial

http://www.evanlin.com/switch-ide-to-vim/

http://fealonelei.github.io/2015/08/18/MAC-Vim-IDE-for-Go(lang).html

2017年12月13日 星期三

golang mkdir permission error

今天在Linux底下執行golang的os.Mkdir發生資料夾權限問題,透過ls -al去看才發現資料夾的權限跟我在os.Mkdir所設定的權限完全不一樣.後來發現建立資料夾時除了需要指定權限外,也需要加上系統的Umask.

原code:
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. )
  6. func main() {
  7. err := os.MkdirAll("gotest/", 0777)
  8. if err != nil {
  9. panic(err)
  10. }
  11. } 
 
修正後:
  1. package main

  2. import (
  3. "fmt"
  4. "os"
  5. "syscall"
  6. )

  7. func main() {
  8.     mask := syscall.Umask(0)
  9.     defer syscall.Umask(mask)
  10.     err := os.MkdirAll("gotest/", 0777)
  11.     if err != nil {
  12.         panic(err)
  13.     }
  14. }
 

2017年11月16日 星期四

設定CentOS時間與NTP伺服器時間同步

將系統與NTP 的伺服器同步
設定步驟
1.以root 的身分登入
2. 執行下面的指令安裝NTP
# yum install ntp
3. 啟動服務
#chkconfig ntpd on
4. 設定系統和 time.stdtime.gov.tw 同步 (以time.stdtime.gov.tw為例)
#ntpdate time.stdtime.gov.tw
5.啟動ntp
# service ntpd start
6.可以執行下面的指令確定目前系統的時間
#date

Visual Studio 2017 建立 DLL(Dynamic Linking Library)

以 VS2017 為例

1.檔案 -> 新增 -> 專案



2.已安裝 -> Visual C++ -> Windows Desktop -> Windows 傳統式精靈



3. 應用程式類型 -> 動態連結程式庫(.dll) -> 空白專案




4. 在專案中加入 .cpp 與 .h 檔





5.在 (.h)檔 中加入以下程式碼

#pragma once
__declspec(dllexport) int myadd(int a, int b);

6.在 (.cpp) 檔 中加入以下程式碼

 #include "ProjectDll.h"
int myadd(int a, int b) {

    return a + b;
}

7. 建制 -> 重建方案 後即可產生 DLL 檔




呼叫剛剛建置的DLL

1.檔案 -> 新增 -> 專案 -> 已安裝 -> Visual C++ -> Windows Desktop -> Windows 傳統式精靈 -> 主控台應用程式



  
2.先在專案的屬性(property) -->  C/C++  -->  一般 (general)  -->其他Include目錄
 將剛剛編譯的DLL的(.h)檔的位置include進來

 
3.在連結器(linking) --> 一般(general)  --> 其他程式庫目錄
這邊將你剛剛編譯的DLL的(.lib)檔的路徑加進來

 





4.在連結器(linking) --> 輸入(input) -->其它相依性(additional dependencies)
輸入剛剛編譯的DLL(.lib)檔的名字



5.程式中include你的DLL的(.h)檔即可呼叫DLL中的方法來使用了

 #include "xxx.h"

6.compiler完,記得將你剛剛編譯的DLL檔放在你的EXE檔的同一個資料夾中








 

2017年11月1日 星期三

GUI applications entirely in Golang(not finish)

golang GUI,隨手筆記

稍微做了點資料搜集,下方列出三種目前找到的第三方套件,目前看來QT對於各個平台支援較為齊全.
但也有人主推HTML5,沒有跨平台的問題.



QT:
https://github.com/therecipe/qt#linux-1

支援平台
Target                       Arch.                   Host OS
----------------------------------------------------------
windows.                  (32 / 64)              Any
android(+Wear)        arm                      Any
Linux                        64                        Any
macOS                      64                        macOS
iOS                           (arm + arm64)     macOS
Raspberry Pi             arm                      Any

Awesome:
https://awesome-go.com

QML:
https://github.com/go-qml/qml

HTML5:
透過http, websocket 等方式跟go溝通

2017年6月2日 星期五

調整 vim 設定

編輯 ~/.vimrc 這個檔案(若沒有請自行新增)

在檔案中加入所需要的設定

背景 (預設 set bg=light)
set bg=dark

只在 Normal 以及 Visual 模式使用滑鼠,也就是取消 Insert 模式的滑鼠
set mouse=nv


顯示行號
set number


搜尋不分大小寫
set ic

使用空白取代 Tab
set expandtab

自訂縮排 (Tab) 位元數

set tabstop=2
set shiftwidth=2


字數過長時換行
set wrap

不換行
set nowrap

高亮當前行 (水平)
set cursorline


捲動時保留底下 3 行
set scrolloff=3

儲存後退出即可


更多詳細介紹請看:
http://note.drx.tw/2008/01/vimrc-config.html

如要套用別人的 Color Scheme 可以參考
https://blog.longwin.com.tw/2009/03/choose-vim-color-scheme-2009/

2017年5月12日 星期五

[linux] rm 誤刪檔案

午覺剛睡醒,不小心手殘 rm 砍錯檔!!!! 特別紀錄一下補救方式

首先是安裝 extundelete 程式 ,下載回來之後解壓縮安裝
# tar xvf extundelete-0.2.4.tar.bz2
# cd extundelete-0.2.4
# ./configure
# make install

安裝好後在 src/ 資料夾底下可以看到執行檔
# cd src

查詢被刪除的檔案在哪一個檔案系統
# df -aT

救回特定目錄下的檔案(我所使用的選項)
# ./extundelete /dev/mapper/root --restore-directory /source_code

救回檔案系統下的全部檔案
# ./extundelete /dev/mapper/root --restore-all

救回特定檔案
# ./extundelete /dev/mapper/root --restore-file /source_code/test.txt

註:
/dev/mapper/root <- 檔案所在的檔案系統

/source_code <- 檔案所在的目錄

希望可以幫到大家

2017年2月22日 星期三

tee and grep command

隨手做筆記

時空背景:
在執行程式時,終端機上的訊息太多又跑太快,來不及看。(on CentOS)

Solution:
./exe | tee log
grep -rn Error log

在執行 "exe" 這個程式時透過 "|" pipeline 與 "tee" 這個 tool 將訊息同時顯示在終端機上並寫入 "log" 這個檔案

程式中斷後,透過 "grep" 這個 tool 在 "log" 這個檔案當中搜尋 "Error" 這關鍵字並顯示在終端機上

MAC
ref: https://unix.stackexchange.com/questions/145651/using-exec-and-tee-to-redirect-logs-to-stdout-and-a-log-file-in-the-same-time
./exe &> >(tee -a "$log_file")

2017年1月23日 星期一

golang cross-compiler on windows to...

Golang 本身就有提供cross-compile相關的工具

以下紀錄的是在windows x64下將golang cross-compiler 成 linux x86

1.先到 $GOROOT 底下的 src(我個人是 C:/go/src)建立一個build.bat檔

2.edit build.bat
set CGO_ENABLED=0
set GOROOT_BOOTSTRAP=C:/Go
:::::::x86:::::::
set GOARCH=386

set GOOS=windows
call make.bat --no-clean

set GOOS=linux
call make.bat --no-clean
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:::::::x64:::::::
set GOARCH=amd64

set GOOS=linux
call make.bat --no-clean

set GOOS=windows
call make.bat --no-clean
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

set GOARCH=amd64
set GOOS=windows
go get github.com/nsf/gocode
pause

3.執行 build.bat

4.到 $GOROOT/bin 檢查是否有安裝相關檔案(ex:linux_386)

5.到要編譯程式的資料夾底下,我將指令寫成cross-compiler2linux_x86.bat檔
cd %~dp0
set GOOS=linux
set GOARCH=386
go build helloworld.go
pause

6.執行cross-compiler2linuxx86.bat 就會生成 "helloworld"檔案

7.將 "helloworld" 檔案複製到linux x86底下執行確認。

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

本篇cross-compile工具只有設定windows x86, x64,  linux x86,  x64四種,其他平台請參考下列原文敘述進行修改。

$GOOS and $GOARCH
The name of the target operating system and compilation architecture. These default to the values of $GOHOSTOS and $GOHOSTARCH respectively (described below).
Choices for $GOOS are darwin (Mac OS X 10.7 and above and iOS), dragonfly, freebsd, linux, netbsd, openbsd, plan9, solaris and windows. Choices for $GOARCH are amd64 (64-bit x86, the most mature port), 386(32-bit x86), arm (32-bit ARM), arm64 (64-bit ARM), ppc64le (PowerPC 64-bit, little-endian), ppc64 (PowerPC 64-bit, big-endian), mips64le (MIPS 64-bit, little-endian), and mips64 (MIPS 64-bit, big-endian). The valid combinations of $GOOS and $GOARCH are:
$GOOS$GOARCH
androidarm
darwin386
darwinamd64
darwinarm
darwinarm64
dragonflyamd64
freebsd386
freebsdamd64
freebsdarm
linux386
linuxamd64
linuxarm
linuxarm64
linuxppc64
linuxppc64le
linuxmips64
linuxmips64le
netbsd386
netbsdamd64
netbsdarm
openbsd386
openbsdamd64
openbsdarm
plan9386
plan9amd64
solarisamd64
windows386
windowsamd64


ref:

2017年1月4日 星期三

openCV on VS2015

openCV教學網站

1.從官方網站下載openCV後,安裝。(一般都是直接安裝在C槽下)










2.在VS2015中開啟新專案(C++ -> Windows -> 一般 -> 空專案)




























3.進行專案屬性設定

























4.在VC++目錄 -> include目錄中加入openCV檔案路徑
C:\files\opencv\build\include
C:\files\opencv\build\include\opencv
C:\files\opencv\build\include\opencv2


















5.在VC++目錄 -> 程式庫目錄中加入openCV函式庫
C:\files\opencv\build\x86\vc10\lib



















6.在連結器 -> 輸入 -> 其他相依性 加入需要的 *.lib檔
C:\files\opencv\build\x86\vc10\lib\opencv_core231d.lib
C:\files\opencv\build\x86\vc10\lib\opencv_calib3d231d.lib
C:\files\opencv\build\x86\vc10\lib\opencv_contrib231d.lib
C:\files\opencv\build\x86\vc10\lib\opencv_features2d231d.lib
C:\files\opencv\build\x86\vc10\lib\opencv_highgui231d.lib
C:\files\opencv\build\x86\vc10\lib\opencv_imgproc231d.lib





















7.加入系統環境變數 C:\files\opencv\build\x86\vc10\bin;

















8.程式碼測試-開啟攝影機

#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

int main() {

//抓取攝影機
VideoCapture cap(0);
//嘗試開啟攝影機
if (!cap.isOpened()) {
return -1;
}

//用矩陣紀錄抓取的每張frame
Mat frame;
//建立一個視窗,名稱為camera
namedWindow("camera", 1);
for (;;)
{
//把取得的影像放置到矩陣中
cap >> frame;
//顯示frame到camera名稱的視窗
imshow("frame", frame);
if (waitKey(30) >= 0) break;
}
system("PAUSE");
return 0;

}


搞定~~~~




2016年12月6日 星期二

編譯Gstreamer ( on windows)

詳細的教學文件

首先嘗試編譯Gstreamer所提共的19個範例

1.下載Gstreamer的安裝檔,共兩個檔案(下載位置),選擇自己要的版本。
      gstreamer-1.0-x86_64-1.10.2
      gstreamer-1.0-devel-x86_64-1.10.2
    皆選擇完整安裝即可。


2.下載Gstreamer的範例檔(下載位置)
     下載回來後可以在 gst-docs\examples\tutorials\vs2010 找到"tutorials.sln"。
      為了避免改到範例的內容,建議將tutorials資料夾複製到自己想要的位置。

3.用 VS2015 打開"tutorials.sln",選擇 "建置->建置方案",官網上說明應該19個範例都可以編譯成功,但我只成功了14個。檢查code後發現都是缺少某些Win32檔案造成,想嘗試的人或許可以試著用x86的版本試試看。

每個範例的說明網站(Eng),中文。









2016年9月20日 星期二

centOS無法識別1280x960 解析度的解決方法

在 terminal 中使用cvt生成modeline信息(可以用#cvt -h查看cvt詳細訊息)
#cvt -v 1280 960
terminal 顯示訊息如下:
Modeline "1280x960_60.00"  101.25  1280 1360 1488 1696  960 963 967 996 -hsync +vsync

去掉 modeline 後,接著透過 xrandr 設定解析度
#xrandr --newmode "1280x960_60.00"  101.25  1280 1360 1488 1696  960 963 967 996 -hsync +vsync
#xrandr --addmode VGA1 "1280x960_60.00"
#xrandr --output VGA1 --mode "1280x960_60.00"

搞定~



2016年8月11日 星期四

install Mono on ubuntu

install Mono on ubuntu
ref:
http://www.mono-project.com/docs/getting-started/install/linux/#debian-ubuntu-and-derivatives
http://alvin1016.blogspot.tw/2015/03/ubuntunetmono.html
========================================================================

sudo apt-get install mono-complete

sudo apt-get install mono-runtime


# sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF

# echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list

# sudo apt-get update

get Error :
GPG error: http://hyperrate.com eliu Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 5C577D59835AB0E3

# sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 5C577D59835AB0E3

try again
# sudo apt-get update

# echo "deb http://download.mono-project.com/repo/debian wheezy-apache24-compat main" | sudo tee -a /etc/apt/sources.list.d/mono-xamarin.list

# sudo apt-get install mono-devel  mono-complete referenceassemblies-pcl

=======================================================================
testing mono (hello.cs)

using System;

public class HelloWorld
{
    static public void Main ()
    {
        Console.WriteLine (" Mono Mono ");
    }
}

compile
# mcs hello.cs

Run hello.exe
# mono hello.exe

YO~~~~~~~ it's working ~~~~~

2016年7月5日 星期二

CentOS 變更開機順序


因為安裝雙系統的關係,所以,開機選單是由 Linux 的 Grub 來控管。

1.編輯Grub檔案決定開機順序(需要root權限)
sudo vim /boot/grub/grub.conf

裡面最關鍵的兩行
default=0(預設的開機選項)
timeout=5(開機選單到數的秒數,在這裡設定為5秒)

至於 "default=0" 所代表的意思為設定第0個選項為預設開機選項。

舉例來說,進到 grub.conf 檔案後可以看到
title CentOS (xxxxx)
title windows (xxxxx)
title other (xxxxx)
其中 "CentOS"就是第0項,windows為第1項,以此類推




2016年5月15日 星期日

socket 筆記

以下詳細解釋來自 XYZ的筆記本 大大,自己另外做的筆記。

1.在 Windows 使用 Socket 需要 link Winsock Library。[server端] [client端]
   在程式中加入
   #pragma comment(lib, "wsock32.lib") 或 #pragma comment(lib, "Ws2_32.lib")

   wsock32.lib 和 Ws2_32.lib 的區別:
  • wsock32.lib 是較舊的 1.1 版本,Ws2_32.lib 是較新的 2.0 版本。
  • wsock32.lib 跟 winsock.h 一起使用,Ws2_32.lib 跟 WinSock2.h 一起使用。
  • winsock.h 和 WinSock2.h 不能同時使用,WinSock2.h 是用來取代 winsock.h,而不是擴展 winsock.h。
2.建立 socket descriptor。[server端] [client端]
   函式:SOCKET socket( int af, int type, int protocol); 
          int af:使用何種通訊。
  • 例如
    AF_INET:使用 IPv4
    AF_INET6:使用 IPv6
   int type:The type specification for the new socket.
  • 能用的值跟 " int af " 參數有關
  • 例如
    SOCK_STREAM:使用 TCP 協議
    SOCK_DGRAM:使用 UDP 協議
   int protocol:The protocol to be used.
  • 例如
    IPPROTO_TCP:使用 TCP
    IPPROTO_UDP:使用 UDP
   成功回傳 socket descriptor,失敗回傳 INVALID_SOCKET。可善用 " INVALID_SOCKET " 來檢查是否成功。

3.設定位址資訊的資料 (SOCKADDR_IN)。[server端] [client端]  
   結構:使用 IP4 格式結構 struct sockaddr_in (in 表示 internet) 設定 internet 位址資訊。
  • struct sockaddr_in:IPv4 使用
  • struct sockaddr_in6:IPv6 使用
  • struct sockaddr:通用格式
  • struct sockaddr_un:UNIX domain 格式

      4.綁定 socket 的位址資料 (bind)。[server端]
         函式:int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
         int sockfd:socket() 函式回傳的 socket descriptor
         struct sockaddr *my_addr:用來通訊的位址資料(IP、PORT)
         int addrlen:位址長度 ,sizeof(my_addr)
         綁定成功回傳 0,失敗回傳 SOCKET_ERROR。可善用 " SOCKET_ERROR " 來檢查是否成功。
      5.監聽連線 (listen)。[server端]   函式:int listen(SOCKET s,  int backlog)
      • SOCKET s:socket() 函式回傳的 socket descriptor。
      • int backlog:最大可監聽多少連線(佇列、排隊)。設定 SOMAXCONN 表示系統最大值。
      • 成功回傳 0,失敗回傳 SOCKET_ERROR。
      • connection-oriented ( SOCK_STREAM ) 的 server 程式端程式才使用。
      6.連線到 socket Server。[client端]
         函式:int connect(SOCKET s, const struct sockaddr *name, int namelen)
      • SOCKET s:socket() 函式回傳的 socket descriptor。
      • const struct sockaddr *name:Server 端的位址資料。
      • int namelen:第二個參數的大小。
      • 成功回傳 0,失敗回傳 SOCKET_ERROR,可用 WSAGetLastError() 取得 error code。
      7.傳送訊息。[server端] [client端]   
         函式 1:int send(SOCKET s, const char *buf, int len, int flags)   
         函式 2:int sendto(SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen)
      • send() 和 sendto() 的差異在於,send() 只能用在 connection-oriented ( SOCK_STREAM ) 的連線,所以 sendto() 比 send() 多最後兩個參數,用來指定目的地的位址資訊。
      • SOCKET s:socket() 函式回傳的 socket descriptor。
      • const char *buf:訊息的指標。
      • int len:訊息的長度。
      • int flags:The flags parameter can be used to influence the behavior of the function beyond the options specified for the associated socket。(一般設 0)
      MSG_DONTROUTE:不將訊息送給 gateway,而直接送給 host。(Specifies that the data should not be subject to routing. A Windows Sockets service provider can choose to ignore this flag.)
      MSG_OOB:Sends OOB data (stream-style socket such as SOCK_STREAM only)。
      • const struct sockaddr *to:目的地位址資訊。
      • int tolen:目的地位址資訊的大小。
      • 成功回傳傳送的資料長度,失敗回傳 SOCKET_ERROR。
      8.接收訊息。[server端] [client端]   
         函式 1:int recv(SOCKET s, char *buf, int len, int flags)   
         函式 2:int recvfrom(SOCKET s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen)
      • recv() 和 recvfrom() 的差異在於,recv() 只能用在 connection-oriented ( SOCK_STREAM ) 的連線,所以 recvfrom() 比 recv() 多最後兩個參數,用來指定接收來源的位址資訊。
      • SOCKET s:socket() 函式回傳的 socket descriptor。
      • const char *buf:訊息的指標。
      • int len:訊息的長度。
      • int flags:The flags parameter can be used to influence the behavior of the function invocation beyond the options specified for the associated socket.。(一般設 0)
      MSG_PEEK:Peeks at the incoming data。只看訊息內容,但不將訊息從 queue 移除。
      MSG_OOB:Processes Out Of Band (OOB) data。
      • const struct sockaddr *to:目的地位址資訊。
      • int tolen:目的地位址資訊的大小。
      • 成功回傳接收的資料長度,連線被關閉回傳 0。失敗回傳 SOCKET_ERROR。
      9.設定 socket option 選項。[server端] [client端]
         函式 :int setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen)
         用來設定建立的  socket 一些特性,例如是否強制關閉等。
      10.關閉 socket。[server端] [client端]
           函式 :int closesocket(SOCKET s)
      ===============================================================
      編譯環境

      win7 + CodeBlocks16.01 + MinGW

      Scoket Server 範例:
      執行後會等待 client 端連線,有連線進來時,則傳送 "sending data test" 訊息給 client 端。



      #pragma comment(lib, "Ws2_32.lib")
      #include <WinSock2.h>
      #include <iostream>
      using namespace std;
      void main(){
          int r;
          WSAData wsaData;
          WORD DLLVSERION;
      char *message;

          DLLVSERION = MAKEWORD(2,1);//Winsocket-DLL 版本
          //用 WSAStartup 開始 Winsocket-DLL
          r = WSAStartup(DLLVSERION, &wsaData);
          //宣告 socket 位址資訊
          SOCKADDR_IN addr;
          int addrlen = sizeof(addr);
          //建立 socket
          SOCKET sListen; //listening for an incoming connection
          SOCKET sConnect; //operating if a connection was found
          //AF_INET:表示建立的 socket 屬於 internet family
          //SOCK_STREAM:表示建立的 socket 是 connection-oriented socket
          sConnect = socket(AF_INET, SOCK_STREAM, NULL);
          //設定位址資訊的資料
          addr.sin_addr.s_addr = inet_addr("127.0.0.1");
          addr.sin_family = AF_INET;
          addr.sin_port = htons(1234);
          //設定 Listen
          sListen = socket(AF_INET, SOCK_STREAM, NULL);
          bind(sListen, (SOCKADDR*)&addr, sizeof(addr));
          listen(sListen, SOMAXCONN);//SOMAXCONN: listening without any limit
          //等待連線
          SOCKADDR_IN clinetAddr;
      c = sizeof(struct sockaddr_in);

          while( (sConnect = accept(sListen , (struct sockaddr *)&clinetAddr, &c)) != INVALID_SOCKET ){
      puts("Connection accepted"); //Reply to the client message = "Hello Client , I have received your connection. But I have to go now, bye\n"; send(sConnect , message , strlen(message) , 0);
      }
      }



      Socket Client 範例:



      #pragma comment(lib, "Ws2_32.lib") 

      #include <WinSock2.h>

      #include <iostream>

      #include <string>


      using namespace std;


      void main(){

          string confirm;

          char server_reply[2000]; 

          //開始 Winsock-DLL

          int r;

          WSAData wsaData;

          WORD DLLVersion;

          DLLVersion = MAKEWORD(2,1);
          r = WSAStartup(DLLVersion, &wsaData);
          //宣告給 socket 使用的 sockadder_in 結構
          SOCKADDR_IN addr;
          int addlen = sizeof(addr);
          //設定 socket
          SOCKET sConnect; 
          //AF_INET: internet-family
          //SOCKET_STREAM: connection-oriented socket
          sConnect = socket(AF_INET, SOCK_STREAM, NULL);
          //設定 addr 資料
          addr.sin_addr.s_addr = inet_addr("127.0.0.1");
          addr.sin_family = AF_INET;
          addr.sin_port = htons(1234);

          connect(sConnect, (SOCKADDR*)&addr, sizeof(addr));
          //接收 server 端的訊息
          puts("Connected");
      //Receive a reply from the server if((recv_size = recv(sConnect , server_reply , 2000 , 0)) == SOCKET_ERROR){
      puts("recv failed"); } puts("Reply received\n"); //Add a NULL terminating character to make it a proper string before printing server_reply[recv_size] = '\0'; puts(server_reply);
          //設定 closesocket 時,不經過 TIME-WAIT 過程,直接關閉socket
          //BOOL bDontLinger = FALSE;
          //setsockopt(sConnect,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));             
          //若之後不再使用,可用 closesocket 關閉連線
          closesocket(sConnect);