2020年3月12日 星期四

如何在Ubuntu 18.04上安裝Redmine


參考以下影片

https://www.youtube.com/watch?v=vaRwqhImDVU


# su root
# apt-get install apache2 libapache2-mod-passenger
# apt-get install mysql-server mysql-client
# mysql -u root -p
# apt-get install redmine redmine-mysql
# gem update
# gem install bundler
   
# vim /etc/apache2/mods-available/passenger.conf

<IfModule mod_passenger.c>
  PassengerDefaultUser www-data
  PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
  PassengerDefaultRuby /usr/bin/ruby
</IfModule>


# ln -s /usr/share/redmine/public /var/www/html/redmine
     
# vim /etc/apache2/sites-available/000-default.conf

       ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
<Directory /var/www/html/redmine>
RailsBaseURI /redmine
PassengerResolveSymlinksInDocumentRoot on
</Directory>


 # service apache2 restart
# touch /usr/share/redmine/Gemfile.lock
# chown www-data:www-data /usr/share/redmine/Gemfile.lock
# chown -R www-data:www-data /etc/redmine/default/



2017年6月28日 星期三

Chapter 1: Hello world kernel module

簡單記錄一下第一支kernel module


#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h>   /* Needed for the marcos */

MODULE_LICENSE("GPL");

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world\n");
    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye~~~\n");
}

module_init(hello_init);
module_exit(hello_exit);



 Makefile

obj-m += hello.o

KERNEL=/lib/modules/`uname -r`/build

all:
    make -C $(KERNEL) M=$(shell pwd) modules

clean:
    make -C $(KERNEL) M=$(shell pwd) clean

module_init()以及module_exit()是kernel module初始化的起點,所以是kernel module不可或缺的要素。module_init()以及module_exit()裡面代的參數分別是起始與結束的函數。從例子可以看到起始函數是hello_init()而結束函數是hello_exit()。
因此當用insmod去載入編譯好的ko檔時,透過dmesg可以看到字串"Hello world",而用rmmod時可以看到字串"Goodbye~~~"。

當要在kernel裡面秀出message時要透過printk()來達成,printk的用法跟printf很像,只是printk要加入message的level(Ex: KERN_INFO, KERN_DEBUG)。

To be continued....

2017年5月30日 星期二

Linux kernel 學習心得


    大約半年前從Non-OS的世界跨到embedded linux世界,
這巨大轉變可以對我來說可以說是非常艱辛阿,
雖然以前在學校有學過linux系統,但早就忘光光啦!

    學Linux kernel一開始翻網路上的資料以及身邊朋友的推薦就先看了傳說中的Linux聖經書"Linux Device Drive, 3e" (作者是 Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman)。在看LDD之前我對linux kernel的認識可以說是零,也就是完全不認識!在這情況下去看LDD可以說是非常痛苦... 雖然書中有提供例子參考,但是我連第一個例子都不知道要怎麼下make去build出kernel的ko檔,硬是死讀了幾章之後發現這樣下去不行,書中的介紹很多(字超級多!! 作者怎麼這麼會啦賽...),但是我一點都看不懂在說什麼,於是找另一本書來看。

    第2本書"Linux Device Driver Programming驅動程式設計" (作者是平田豐) 。這一本才真正開啟我對Linux kernel的大門,為什麼哩?因為書中有明確的例子可以參考!!!Oh my god! 有範例才是王道阿!!而且還是可以執行的範例,不是那種辛苦打了範例程式碼之後,結果make一直過不了,e04! 有了實際例子可以編譯並執行,我才真正可以體會每一段程式碼在幹什麼且會達到怎樣的效果。所以這本非常適合沒有任何底子的初學者來看,非常快就上手! 當初要是早點看這本書的話,工作上就不會被電得不要不要的... (但這又牽扯到新人訓練跟公司環境問題,唉~ 無奈啊~,有實力的人不一定懂得如何教人...)。

    還好只是想了解linux kernel的基礎知識,修改kernel code的機會不大,至少對於kernel code的寫法以及架構有比較清楚的認識了。接下來還有user space的東東要學,感覺這也是一個蠻龐大的東西啊...

2016年9月28日 星期三

vim error E212: Can't open file for writing

以前在Linux環境下用root習慣了,要做任何事情都沒有問題,
現在用一般帳號登入就開始遇到一些之前沒遇到過的問題。
這次在用vim要存檔案時出現錯誤訊息 E212: Can't open file for writing
由辜狗大神發現如果是在vim要存檔時出現E212錯誤訊息是要透過以下的指令存檔
:w !sudo tee %
然後選L,就可以存檔了~~~

最保險的方式就是每次要用vim時在下命令時都要用sudo,如下
sudo vim FILE_NAME


2016年7月22日 星期五

#define 簡單心得記錄


用過C語言的人都知道 #define 是用來定義巨集(macro),基本用法如下

#define PI 3.14159

這樣在程式碼中如果有出現 "PI"這個字的話compiler都會自動轉成3.14159。


#define也可用來定義函式,範例如下

#define getmax(a,b) a>b?a:b




如果在#define裡面#及##有特殊的用法,#會將接在後面的參數轉成string。
##則是會將2個參數串接在一起,用以下範例說明。

Example 1:
#define str(x) #x
cout << str(test);


cout << str(test); 會被轉成 cout << "test";


Example 2:
#define glue(a,b) a ## b
glue(c,out) << "test";


glue(c,out) << "test";會被轉成 cout << "test"

2016年7月21日 星期四

Linux掛載及卸載USB隨身碟

簡單記錄一下如何掛載USB隨身碟


1.先執行fdisk,檢查USB隨身碟是被系統辨識成那個裝置
fdisk -l

sda 基本上都是硬碟,我們可以藉由容量來確認隨身碟的編號
假設為sdb
2.建立USB隨身碟的掛載點:
mkdir /mnt/usb

3.掛載USB隨身碟
mount -v -t auto /dev/sdb /mnt/usb_storage

-v 顯示資訊
-t auto 讓系統自動分辯檔案系統

4.到 /mnt/usb_storage 可看到usb的內容


卸載USB隨身碟
umount /mnt/usb_storage

Ubuntu unknown filesystem type 'exfat'


在mount USB隨身碟時出現"mount: unknown filesystem type 'exfat'"這個錯誤訊息,

解法如下


Ubuntu版本是14.04之後的執行以下的指令去安裝套件

sudo apt-get install exfat-fuse exfat-utils

Linux 檔案顏色意義

這裡簡單紀錄一下 Linux各個檔案顏色所代表的意思

白色:一般檔案
藍色:目錄
綠色:可執行的一般檔案
黃色:設備檔,一般而言在 /dev
淺藍色:連結檔
綠底黑字:public可讀寫的目錄,例如 /tmp
粉紅色:一個socket
金色:一個行程process

2016年4月21日 星期四

信用卡交易專有名詞紀錄


這一篇記錄信用卡交易的一些專有名詞以及解釋,不過有些名詞解釋只查的到英文... 所以我只能盡量用我的破英文轉成中文。

Acquiring bank (信用卡收單銀行):負責收帳單的銀行。消費者在商店使用信用卡付帳時,商店會將交易相關資料送到收單銀行,常見的收單銀行如下,
Visa, MasterCard, Discover, American Express, Diners Club, Japan Credit Bureau and China UnionPay.

Issuing bank (信用卡發卡銀行):發行信用卡的銀行。

EMV: Europay, MasterCard and Visa的縮寫,國際金融業界對於智能支付卡與可使用晶片卡的POS終端機以ATM機等所制定的標準。



2015年1月5日 星期一

VB6 CommonDialog issue


Bug: 在開發VB6的應用程式時遇到一個怪異現象,當我用完CommonDialog 時再去呼叫DLL會出現DLL找不到這一個錯誤訊息。

解法:加一行 "CommonDialog1.Flags = cdlOFNNoChangeDir"就ok惹~

看來是CommonDialog不知道哪裡去改到程式路徑導致DLL找不到。


Reference:
http://yes.nctu.edu.tw/vb/3_Property/Flags_ShowOpenSave.htm

2014年12月28日 星期日

解決TortoiseGit( 版本: 1.8.12.0 ) 的commit功能無法正常運作的問題


    原來TortoiseGit (版本:1.8.12.0) 的commit功能在XP及server 2003底下會無法正常運作。要去官網 http://download.tortoisegit.org/tgit/1.8.12.0/TortoiseGit-1.8.12.0-WindowsXP-fix.zip 下載更新檔(其實這也不算是更新檔,但一時想不到更好的字眼),解壓縮後手動取代掉TortoiseGitProc.exe這一個執行檔問題就解決了。

2014年10月26日 星期日

linker script 說明

Linker Script (LD Script) 的目的是提供Linker針對編譯後的Object檔案做位置安排的設定

VMA = Virtual Memory Address
LMA = Load Memory Address

.text = program code
.rodara  = read-only data
.data = read-write initialized data
.bss = read-write uninitialized data


SECTIONS
{
    . = 0x10000; /* 設定記憶體位址(VMA or LMA?)為0x10000 */
    .text : { *(.text) } /* 將所有輸入文件的.text section 合併成一個 .text section */
    . = 0x8000000; /* 設定記憶體位址(VMA or LMA?)為0x8000000 */
    .data : { *(.data) } /* 將所有輸入文件的.data section 合併成一個 .data section */
    .bss : { *(.bss) } /* 將所有輸入文件的.bss section 合併成一個 .bss section */
}

說明:
'.'  : 原文為"location counter",代表目前擺放的位址。


Reference:
http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html

To be continue...

2014年9月30日 星期二

Open SSL 加密指令簡介

本篇文章的指令需再open SSL下執行


1. DES ECB 
可參考附錄 A。
建立明文檔案,檔名為 test_data.txt,檔案內容為
Now is the time for all
(all後面有一個空白)


加密 


指令:
openssl enc -des-ecb -in test_data.txt -out des_cipher.txt -nosalt -K 0123456789ABCDEF

 產生出的密文為:
3F A4 0E 8A 98 4D 48 15 6A 27 17 87 AB 88 83 F9
89 3D 51 EC 4B 56 3B 53 08 6F 9A 1D 74 C9 4D 4E
(由於明文長度只有 24 bytes,所以密文只有前24 bytes才是真正有用的部分。)

解密
指令:
openssl enc -des-ecb -d -in des_cipher.txt -out plain.txt -nosalt -K 0123456789ABCDEF


2. Triple DES ECB 
可參考附錄 B。
建立明文檔案,檔名為 des3_test_plain.txt,檔案內容為
The qufck brown fox jump

  • Three key triple DES EDE in ECB mode

加密 

指令:
openssl enc -des-ede3 -nosalt -K 0123456789ABCDEF23456789ABCDEF01456789ABCDEF0123 -in des3_test_plain.txt -out des3_encipher.txt

 產生出的密文為:
A8 26 FD 8C E5 3B 85 5F CC E2 1C 81 12 25 6F E6
68 D5 C0 5D D9 B6 B9 00 83 28 46 B5 2F 9E 21 3D
(由於明文長度只有 24 bytes,所以密文只有前24 bytes才是真正有用的部分。)

解密 
指令:
openssl enc -des-ede3 -d -nosalt -K 0123456789ABCDEF23456789ABCDEF01456789ABCDEF0123 -in des3_encipher.txt -out des3_recover_plain.txt


  • Two key triple DES EDE in ECB mode
加密 

指令:
openssl enc -des-ede -K 0123456789ABCDEF23456789ABCDEF01 -nosalt -in des3_test_plain.txt -out des3_encipher.txt


解密 
指令:
openssl enc -des-ede -d -nosalt -K 0123456789ABCDEF23456789ABCDEF01 -in des3_encipher.txt -out des3_recover_plain.txt




參考網址
A. FIPS 8: http://csrc.nist.gov/publications/fips/fips81/fips81.htm
B. NIST Pub 800-67: http://csrc.nist.gov/publications/nistpubs/800-67-Rev1/SP-800-67-Rev1.pdf

To be continue.....

2013年11月30日 星期六

在 Ubuntu 下安裝 Bugzilla

Bugzilla是一套bug追蹤軟體,有許多知名的公司有使用bugzilla來收集並解決bug(如:Mozilla, Linux Kernel, Eclipse等等),基於好奇心之下來研究一下bugzilla如何安裝以及使用,安裝過程還真的一堆地雷阿... 以下紀錄bugzilla的安裝過程。
  • 安裝環境
作業系統:Ubuntu 13.04
Bugzilla 版本:4.5.1

  • 安裝步驟
以下的安裝步驟都是用帳號 root 進行,如果還沒開啟 root 可參考前一篇文章。

Step 1:安裝MySQL

Step 1.1: 安裝 mysql-server

輸入指令
# apt-get install mysql-server

在安裝過程中會要求使用者輸入密碼,要記得密碼後面會用到。

Step 1.2: 安裝 mysql-client-core-5.5

輸入指令
# apt-get install mysql-client-core-5.5

Step 2:安裝 Apache

 輸入指令
 # apt-get install apache2

Step 3: 安裝 sendmail

輸入指令
 # apt-get install sendmail

Step 4: 檢查 Perl 版本

輸入指令
 # perl -v
一般 ubuntu 都已經自動安裝好 perl,所以這一步可以省略。

Step 5:安裝 Bugzilla

Step 5.1: 下載 bugzilla 壓縮檔

# wget http://ftp.mozilla.org/pub/mozilla.org/webtools/bugzilla-4.5.1.tar.gz
(P.S 當初下載bugzilla-4.4.1,可是perl會要求DBI的版本至少要1.614以上,可是我安裝的版本明明是1.63但perl卻認為是無效的版本,後來發現這是bugzilla在版本辨識上有bug,搞了很久還是沒法解決,後來換成bugzilla-4.5.1版後就沒這個問題。)

Step 5.2: 解壓縮 bugzilla 到路徑 /var/www

# tar -C /var/www/ -xvf bugzilla-4.5.1.tar.gz

Step 5.3: 更改 bugzilla 資料夾名稱

# cd /var/www
# mv bugzilla-4.5.1 bugzilla

Step 5.4: 編譯bugzilla

進入到 bugzilla 資料夾
# cd /var/www/bugzilla

執行 checksetup.pl
# ./checksetup.pl

這裡應該是問題最多的地方,應該會列出一堆必要元件還沒安裝,perl 會提示缺少的元件可以透過一個指令一次安裝完全,指令如下。
# /usr/bin/perl install-module.pl --all

但是理想 情況是一次就全部安裝,可惜天不從人願,還是會有一些漏網之魚沒有安裝,這時候就請google大神吧,就我的經驗缺少的元件基本上都可以透過指令 apt-get 來下載安裝,以下舉幾個例子。如果缺少元件 Template-Toolkit 的話可以透過下面的指令來安裝。
# apt-get install libtemplate-perl
 
 如果缺少元件 Email-Send的話
# apt-get install libemail-send-perl
 
在必要的元件都安裝完成之後再執行一次 checksetup.pl
# ./checksetup.pl

如果執行完後有出現文件 localconfig 的話就代表成功了。
接著修改 localconfig 的內容
# vim /var/www/bugzilla/localconfig
將 $webservergroup 這一個設定改成 $webservergroup = 'www-data'
儲存後離開。

接著建立 mysql 資料庫
# mysql -u root -p

接著就會進入 mysql 的介面,接著輸入以下指令建立資料庫
mysql> grant all on *.* to bugs@localhost identified by '';
mysql> flush privileges;
mysql> create database bugs;
接著就可以離開 mysql 介面(輸入exit)

然後修改 apache 的設定檔
# vim /etc/apache2/site-availibles/default

將以下的設定加入檔案 default 裡
<Directory /var/www/bugzilla>
    AddHandler cgi-script .cgi
    Options +Indexes +ExecCGI +FollowSymLinks
    DirectoryIndex index.cgi
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

接著回到路徑 /vat/www 裡
# cd /var/www

然後執行以下指令
# chown www-data:www-data bugzilla

然後再回到資料夾 bugzilla 裡
# cd /var/www/bugzilla

再執行一次 checksetup.pl
# ./checksetup.pl

這樣 bugzilla 就算建置完成了。


Step 6:重新啟動 Apache 和 MySQL

重新啟動 apache
# /etc/init.d/apache2 restart

重新啟動 mysql
# /etc/init.d/mysql restart

Step 7:驗證 bugzilla 是否安裝成功

終於到了最後一步了,首先查看主機的 IP 位址,假設為192.168.999.999
那麼隨便開啟一個瀏覽器,然後在地址欄裡輸入 http://192.168.999.999/bugzilla
如果有出現 bugzilla 的首頁那就代表安裝成功啦!接著就可以使用bugzilla的各種功能。

2013年11月29日 星期五

Ubuntu 啟動帳號 root


作業系統:Ubuntu 13.04

假設現在登入的帳號是oscar

Step 1: 設定root密碼
# sudo  passwd root
輸入 oscar  的密碼
輸入 root 的新密碼
再一次輸入新密碼

這樣就可以用root登入,可以用以下的指令試看看 root 有沒有設定成功
# su root

Step 2: 在開機時的登入畫面可以用root登入

編輯檔案
# vim /etc/lightdm/lightdm.conf

將下列的指令加入到 lightdm.conf 裡
greeter-show-manual-login=true

然後重新開機就可以在登入畫面用root直接登入。





2013年3月29日 星期五

如何在Windows環境下安裝OpenSSL

然在網路上有在Windows下安裝OpenSSL的教學,但很多都有看沒有懂,所以乾脆自己記錄一下這次自己安裝的流程以備日後可以回頭查閱。
  • 安裝環境

  1. 作業系統:Win 7 32-bit
  2. OpenSSL版本:openssl-1.0.1e.tar.gz 

  • 需事先安裝的軟體

  1. Perl 編譯工具:http://www.activestate.com/ActivePerl
  2. NASM編譯工具:http://nasm.sourceforge.net/
  3. Visual C++(我是使用2010版)
  4. 解壓縮OpenSSL(使用7-zip,解壓縮後會有許多檔案,其中INSTALL.W32是安裝OpenSSL的教學,如果安裝過程有疑問可以查看這一個檔案)
   P.S. 在安裝完NASM後,要將NASM的資料夾加入到環境變數的Path裡,否則在安裝過程中可能會出現找不到nasm這個錯誤訊息,以下說明如何將NASM加入到Path。

  •     將NASM加入到環境變數

  1. 安裝完NASM後預設的路經應該為C:\Program Files (x86)\NASM。
  2.  點選  電腦 -> 系統內容 -> 進階系統設定 -> 環境變數,在系統變數欄位裡有一個變數名為Path,快速點兩下。
  3. 在變數值欄位裡的最後面先加一個分號 ";",在分號後面加入NASM資料夾的路徑
    C:\Program Files (x86)\NASM
  •  安裝流程

  1.  點選桌面的開始 -> 所有程式 -> Microsoft Visual Studio 2010 Express ->Visual Studio 命令提示字元 (2010),就會跳出命令視窗如下圖。

    2. 進入到解壓縮的OpenSSL資料夾。
(Ex:假如OpenSSL的資料夾是放在D槽,並且資料夾名稱叫TestOpenSSL,那麼先打 D: 再打 cd TestOpenSSL)

    3. 進入到OpenSSL的資料夾後,輸入指令
        perl Configure VC-WIN32 --prefix=c:\some\openssl\dir
(P.S. c:\some\openssl\dir是指說要將OpenSSL安裝到這一個路徑,所以如果你想放到自訂的資料夾內,譬如c槽的UserOpenssl資料夾,那就將c:\some\openssl\dir 改成c:\UserOpenssl)

    4. 輸入指令
        ms\do_nasm

    5.輸入指令
       nmake -f ms\ntdll.mak
(P.S. 如果沒將NASM加入到環境變數這裡就會compile失敗,如果已經加入但還是失敗的話,那就重開機再試一次)

    6. 輸入指令
        nmake -f ms\ntdll.mak test
(P.S. 如果前一個步驟通過的話那這一個可以略過,因為這一個步驟只是Test前一個步驟是否有正確安裝)
  
    7. 輸入指令
        nmake -f ms\ntdll.mak install

以上步驟全都完成之後,如果沒有更改步驟3的安裝路徑的話,就可以進入到c:\some\openssl\dir\bin 裡有一個執行檔名為openssl,點兩下就會出現命令視窗,就可以進行OpenSSL所提供的指令,至於有那些指令以及參數可用請參考OpenSSL的網站 http://www.openssl.org/

2012年11月8日 星期四

韌體工程師有幫助的書單

這裡整理一下對韌體工程師有幫助的書

1. 建立嵌入式系統:傑出軟體的設計模式
     Elecia Wbite 著, 莊宏祥 譯
     出版社:O'REILLY
     p.s. 這一本在入門時幫我了解的很多觀念,大推~

2. 8051單晶片徹底研究-入門篇
                                         基礎篇
    作者:林伸茂
    出版社:旗標

3. 嵌入式系統開發之道-菜鳥成長日誌與專案經理的私房菜
    作者:邱毅凌
    出版社:悅知文化

4.Test-Driven Development for Embedded C(待買)
  
出版社:Oreilly & Associates

2012年11月7日 星期三

如何閱讀Datasheet

        Datasheet裡包含了許多硬體元件的資訊,如電器特性、建議運作條件及配線(layout)等等之類的,內容就長達數百頁,看完之後完全不知道在說什麼... 因此韌體工程師比較需要注意的部分為是否有"應用程式資訊(Application information)" 或者是"運作原理(Theory of operation)" 等等與Coding有相關的部分。要知道時做驅動程式的方式?如何進行通訊?初始化?為了有效率使用元件,軟體應該做什麼?有沒有嚴格的時序要求,以及處理器該如何處理?
        在Chip的user guide文件裡有Programming章節,這一章蠻重要的。在來是記憶體的配置,各家的記憶體配置位子不盡相同,我目前看的Maxim記憶體是採用哈佛(Harvard )架構,共分3個部分,1. Programming, 2. Data, 3. Register 這3種記憶體。其中Register是蠻重要要仔細研讀的部分,其主要功能有3個,1. 控制動作, 2. 設定狀態, 3. 儲存資料。
     

開版首PO

建立這個Blogger的主要用意是來記錄自己的學習心得。
最近剛成為社新鮮人,第一份工作是韌體工程師,雖然是一間小公司,
但這裡的環境我還蠻喜歡的,帶我的是一位跟我同年的工程師,
不過他已經有2年的資歷。
由於什麼都不懂,所以最近一直猛K文件,光Datasheet就百頁以上,內容有如外星文,不知道哪些是重點,就已就一行一行的慢慢看,又買了一些書來K,所以建立這個Blogger來記錄一下自己的學習心得,不然一下子塞這麼多東西,不爆炸才怪。