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), dragonflyfreebsdlinuxnetbsdopenbsdplan9solaris 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;

}


搞定~~~~