2017年6月24日 星期六

使用者只能 SFTP 登入自己的家目錄

使用者只能 SFTP 登入自己的家目錄

老師的電腦動畫課堂的期末作品,是開放讓學生透過 FTP 上傳自己的作品及網頁至實驗室的伺服器,由於 FTP 是明碼的封包傳輸於最近升級系統後,便考慮改用 SFTP(SSH File Transfer Protocol)來提供上傳的服務。

提供 SFTP 上傳的同時,希望使用者和以前一樣只能使用 SFTP 無法使用 SSH 登入伺服器。SFTP 為 SSH 的檔案傳輸服務,預設建立帳號的時候使用者同時可以使用這兩種服務。透過 SFTP only + Chroot 設定我們能限制使用者僅能 SFTP 並且無法離開自己的家目錄去到處閒晃。

  1. 安裝 OpenSSH
    如果安裝的是 Ubuntu Server 應該在安裝過程會安裝 openssh-server 套件,沒有的話可以利用下面的指令安裝。

    $ sudo apt-get install openssh-server
  2. 新增一個給 SFTP 使用的群組 sftpaccess

    $ sudo groupadd sftpaccess 
  3. 修改 OpenSSH 設定檔
    編輯 /etc/ssh/sshd_config 設定檔,在約 77 行的地方找到 Subsystem sftp /usr/lib/openssh/sftp-server 註解此行並修改為 Subsystem sftp internal-sftp

    $ sudo vim /etc/ssh/sshd_config
    
    #Subsystem sftp /usr/lib/openssh/sftp-server
    
    Subsystem sftp internal-sftp

    在檔案的尾端加上下面的片段

    Match group sftpaccess
        ChrootDirectory /home/%u
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp
  4. 建立新的使用者並加入 sftpaccess 群組
    在設定檔中,我們設置了 sftpaccess 這個群組套用要做 ChrootDirectory 的設定,所以我們將要限制的使用者,加入這個群組中。

    $ sudo useradd -G sftpaccess -m <<username>> -s /sbin/nologin
  5. 更改使用者家目錄權限
    由於 Chroot 的關係,這個要 ChrootDirectory 的目錄要將擁有者設定為 root,並且目錄的權限需要為 755。

    $ sudo chown root:root /home/<<username>>
    $ sudo chmod 755 /home/<<username>>
  6. 建立上傳目錄及修改權限
    要讓使用者能上傳網頁到某個目錄,即能透過對應的網址看到內容,需要開啟上傳檔案的目錄,並於稍後的步驟中設定 Apache 的 userdir。Apache 預設的目錄名稱為 public_html 位置在使用者家目錄。
    使用者的家目錄在前一個步驟已經將擁有者設定為 root,使用者在登入後一定無法使用這個目錄,我們必須建立一個上傳目錄(public_html)並且將權限賦予使用者帳號。

    $ sudo mkdir /home/<<username>>/public_html
    $ sudo chown <<username>>:<<username>> /home/<<username>>/public_html
    $ sudo chmod 755 /home/<<username>>/public_html    
  7. 安裝 Apache2

    $ sudo apt-get install apache2
  8. 開啟 userdir module
    使用 a2enmod 開啟 userdir,並重新啟動 Apache。

    $ sudo a2enmod userdir
    $ sudo systemctl restart apache2

經過上述的步驟,使用者便僅能透過 SFTP 的方式將網站資料上傳至伺服器,由瀏覽器直接看到網頁內容了。

Categories: ,

2016年8月14日 星期日

雙系統升級 Windows 10 後造成 ubuntu 開機進入 grub rescue

雙系統升級 Windows 10 後造成 ubuntu 開機進入 grub rescue

7/29 是免費升級 Windows 10 的最後期限,雖然現在幾乎都使用 ubuntu 做為平時工作或一般使用的環境,鮮少使用 Windows 了,但是現在使用雙系統的方式,仍保有原本購買筆電附送的 Windows 8.1 。微軟這免費的升級的活動還是很吸引人,經過將近一年時間的改善,現在的 Windows 10 好像也沒有什麼災情,決定在這個截止日前升級。

升級完 Windows 10 重新開機後,系統就直接進入 grub rescue 模式,估計是原來磁區的位置號碼改變所致。只要找回之前開機的磁區修改正確就好了。

查詢原本的開機磁區

以 ls 指令查詢磁區情形

grub rescue> ls

(hd0,gpt1) (hd0,gpt2) (hd0,gpt3) (hd0,gpt4) (hd0,gpt5) (hd0,gpt6)

逐步以 ls 看能不能查詢目錄情形,找出開機磁區

grub rescue> ls (hd0,gpt1)/
grub rescue> ls (hd0,gpt1)/boot
grub rescue> ls (hd0,gpt2)/
grub rescue> ls (hd0,gpt2)/boot
...

以此類推。記錄下查詢到的磁區位置(我的是(hd0,gpt6)),後面會使用上。

離開 rescue 進入 normal 模式

在 rescue 提示符號(grub rescue>)輸入 set 查詢現在的 prefix 和 root 設定值。

grub rescue> set

prefix=(hd0,gpt5)/boot/grub
root=hd0,gpt5

使用 set 指令將 prefix 和 root 更換成正確的磁區號碼,我的是將 (hd0,gpt5) 更改為 (hd0,gpt6)。

grub rescue> set prefix=(hd0,gpt6)/boot/grub
grub rescue> set root=(hd0,gpt6)

再次檢查 prefix 和 root

grub rescue> set

prefix=(hd0,gpt6)/boot/grub
root=hd0,gpt6

切換至 normal 模式

grub rescue> insmod normal
grub rescue> normal

在進入 Normal 模式後,編輯 /boot/grub/grub.cfg 檔案,將 (hd0,gpt5) 取代為 (hd0,gpt6)。取代後執行:

$ sudo grub-install

結束後重新開機。

Categories: ,

2015年11月22日 星期日

StackEdit 自定 CSS 匯出 HTML Template

StackEdit 自定 CSS 匯出 HTML Template

StackEdit 是一個所見即所得的線上 Markdown 編輯器,在先前的文章已有許多的介紹。身為程式設計在寫筆記的時候更是需要像這樣的工具,讓我們更能聚焦在內容上並且能運用 highlight.js 來標註程式碼。


檔案分享的方法

Google 雲端硬碟、Dropbox

我們更可以將筆記透過 StackEdit 直接發佈至 Google Blogger 上,或是儲存在自己的 Google 雲端硬碟、Dropbox 等等的位置。

Gist、StackEdit Viewer

如果需要將資料分享給其他沒有安裝 Markdown Viewer 的人,除了使用上述的方法,我們也可以將檔案發佈至 Gist ,或是將我們的 Markdown 檔案放至網路,透過 StackEdit 的 Viewer 將網址引入直接使用瀏覽器觀看。Ex:Here

https://stackedit.io/viewer#!url=[放置 Markdown 檔案的 URL 位址]

PDF

StackEdit 的 PDF 功能是需要透過雲端的轉換(透過 Pondoc + LaTex 實踐),對於這個部分的功能是贊助者項目,如果覺得 StackEdit 好用,很建議大家贊助讓他們可以更長久的經營。另外一個方式,是利用 StackEdit Viewer + Chrome Browser 來實踐。

  1. 開啓 Chrome Browser
  2. 開啓 StackEdit Viewer:Menu –> StackEdit Viewer
  3. 在 Viewer 模式下開啓列印
  4. 選擇 「Save as PDF」

HTML

另外一種跨平臺支援的方式是使用 HTML,只要是有瀏覽器都可以觀看,而且透過 CSS 可以改變成我們自己想要變化的風格。也是今天主要想和大家分享的方法。


使用自定的 CSS 匯出 HTML 檔案

StackEdit 匯出 HTML 的方式所匯出的檔案是很陽春白白靜靜的檔案,無論字型還是區塊安排都會有一點點的悲劇。還好,它還提供了一個以自定 Template 來匯出 HTML 的方式,讓我們有機會透過自定的 CSS 檔來完整個 HTML 檔的佈局。

自定的方式需要準備兩個主要的內容,HTML TemplateMarkdown CSS

HTML Template

我的 HTML Template 如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= documentTitle %></title>

<link rel="stylesheet" type="text/css" href="***[user define css file url]***">

<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script>

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.9.1/styles/monokai_sublime.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.9.1/highlight.min.js"></script>

<!--
To use prettify.js uncomment this part and comment the previous script
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=desert"></script>
-->

</head>
<body><%= documentHTML %></body>
</html>

請以上面的 Template 的內容取代 StackEdit Default template 的設定。這份 Template 使用 Highlight.js 作為程式碼標註,如果想使用 Google 的 Code-prettify(prettify.js)只要交換註解的部分即可。

Note:
1. 將 ***[user define css file url]*** 的內容取代為自己 CSS 的 URL位址。
2. 上述 Template 在 highlight.js 的部分是使用 sublime monokai 的顏色主題。

Default template 的設定:

  1. Menu –> Settings
  2. Settings 對話視窗 –> Advance

    enter image description here

  3. Advance –> Default template

    enter image description here

Markdown CSS

我自定的 CSS 檔內容如下,歡迎複製存檔後傳至自己的網路空間(我是放在 Google 雲端硬碟中),在 Template 中設定好路徑即可。

/* 
 * Copyright 2015 ninthday.
 * Version: 1.2
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Some content is copyrighted by Twitter, Inc., and also released under an
 * Apache License; these sections are noted in the source.
 * 
 * The CSS is based on this template:
 * http://pacinispace.blogspot.tw/2013/07/write-in-markdown-stackedit-with-custom.html
 *[(Copyright 2013 Alex Pacini unless otherwise noted.
 * Licensed under the Apache License, Version 2.0 (the "License");]
 * http://kevinburke.bitbucket.org/markdowncss/
 *[(Copyright 2011 Kevin Burke unless otherwise noted.
 * Licensed under the Apache License, Version 2.0 (the "License");]
 * Then it was extended to cover the Markdown Extra and applied some light changes.
 */
html{
    font-size: 62.5%;
}
body{
    margin: 0 auto;
    /*font-family: Georgia, Palatino, serif;*/
    font-family: Arial, "文泉驛正黑", "WenQuanYi Zen Hei", "儷黑 Pro", "LiHei Pro", "微軟正黑體", "Microsoft JhengHei", sans-serif;
    color: #444444;
    line-height: 1.3;
    max-width: 960px;
    padding: 30px;
    font-size: 1.6rpm;
}

h1, h2, h3, h4 {
    color: #111111;
    font-weight: 400;
}
h1, h2, h3, h4, h5, p {
    margin-bottom: 24px;
    padding: 0;
}
h1 {
    font-size: 4.8rem;
}
h2 {
    font-size: 3.6rem;
    /* The bottom margin is small. It's designed to be used with gray meta text
     * below a post title. */
    margin: 24px 0 6px;
}
h3 {
    font-size: 2.8rem;
}
h4 {
    font-size: 2.4rem;
}
h5 {
    font-size: 2rem;
}
a {
    color: #0099ff;
    margin: 0;
    padding: 0;
    vertical-align: baseline;
    text-decoration: none;
}
img[alt=banner] {
    width: 100%;
    height: 100%;
    margin-left: -10%;
}
a:hover {
    text-decoration: none;
    color: #ff6600;
}
a:visited {
    color: purple;
    text-decoration: none;
}
ul, ol {
    margin-top: 0;
    margin-bottom: 1.1em;
}
li {
    line-height: 2.4rem;
}
li ul, li ol {
    margin-left: 1.2rem;
}

p, ul, ol {
    font-size: 1.6rem;
    line-height: 1.5;
    max-width: 800px;
}

pre {
    border-radius: 4px;
    padding: 10px 24px;
    max-width: 800px;
    white-space: pre-wrap;
}

pre code {
    line-height: 1.7;
    font-size: 14px;
    font-family: "Source Code Pro", Consolas, monospace;
}

pre code, pre.prettyprint code{
    background-color:transparent !important;
}

pre.prettyprint {
    background: #23241f;
}

code {
    border-radius: 4px;
    font-size: 1.6rem;
    color: #3f3f3f;
    padding: 2px 4px;
    background-color: rgba(128,128,128,0.09);
}

aside {
    display: block;
    float: right;
    width: 390px;
}

blockquote {
    border-left: 10px solid #eee;
    padding: 15px 20px;
    margin-left:0;
    background-color: rgba(128,128,128,0.06);
    border-top-right-radius: 5px;
    border-bottom-right-radius: 5px;
}

blockquote cite {
    font-size:14px;
    line-height:20px;
    color:#bfbfbf;
}
blockquote cite:before {
    content: '\2014 \00A0';
}

blockquote p {  
    color: #666;
    margin:0 0 1.1rem;
}

blockquote p:last-child,
blockquote ul:last-child,
blockquote ol:last-child{
    margin-bottom:0;
}

hr{
    margin-top:21px;
    margin-bottom:21px;
    border:0;
    border-top:1px solid rgba(128,128,128,0.3)
}

dt {
  font-weight: bold;
}

dt, dd {
    margin-top: 5px; 
    margin-bottom: 10px;
    font-size: 1.6rem;
}

dd {
    margin-left: 40px;
}

table {
    margin-bottom: 20px;
    max-width: 100%;
    background-color: transparent;
    border-collapse: collapse;
    font-size: 1.6rem;
}

table th,
table td {
    padding: 10px;
    line-height: 20px;
    text-align: left;
    vertical-align: top;
    border-top: 1px solid #dddddd;
}

table th {
    font-weight: bold;
}

table thead th {
    vertical-align: bottom;
}

table caption + thead tr:first-child th,
table caption + thead tr:first-child td,
table colgroup + thead tr:first-child th,
table colgroup + thead tr:first-child td,
table thead:first-child tr:first-child th,
table thead:first-child tr:first-child td {
    border-top: 0;
}

table tbody + tbody {
    border-top: 2px solid #dddddd;
}

.footnote {
    vertical-align: top;
    position: relative;
    top: -0.5em;
    font-size: 0.8rem;
}

.tooltip li {
    line-height: 1.4;
}

.toc ul {
    list-style-type: none;
    margin-bottom: 1.1rem;
}

.sequence-diagram,
.flow-chart{
    text-align:center;
    margin-bottom:1.1rem
}

.sequence-diagram text,
.flow-chart text{
    font-size:15px !important;
    font-family:"Source Sans Pro",sans-serif !important;
}

.sequence-diagram [fill="#ffffff"],
.flow-chart [fill="#ffffff"]{
    fill:#f8f8f8;
}

.sequence-diagram [stroke="#000000"],
.flow-chart [stroke="#000000"]{
    stroke:#3f3f3f;
}

.sequence-diagram text[stroke="#000000"],
.flow-chart text[stroke="#000000"]{
    stroke:none;
}

.sequence-diagram [fill="#000"],
.flow-chart [fill="#000"],
.sequence-diagram [fill="#000000"],
.flow-chart [fill="#000000"],
.sequence-diagram [fill="black"],
.flow-chart [fill="black"]{
    fill:#3f3f3f;
}

Note:
這個 Markdown CSS 是參考 Pacini’s Space 文章,再做了不少的修改。

  • 修改加強了對於中文的設定
  • 整個系統單位使用 rem 的方式取代 px
  • 調整相關 Highligh.js 顯示設定
  • UML 圖形跑版的調整
  • 補上 dt, dd 設定
  • Note 區塊的寬度限制
  • 分割線的顏色比重與寬度限制
  • 將 pre code 的設定獨立

StackEdit 的 Hello! 文件,在套用我的 Markdown CSS 後的樣子(Live Preview)。原先 Pacini 的版本

Categories: ,

2015年10月16日 星期五

uBuntu /boot 空間 100% 滿載問題

uBuntu /boot 空間 100% 滿載問題

在先前的文章「uBuntu 更新時 /boot 空間不足」中,有針對如果 boot 空間不足的時候該如何以 apt-get purge 的方式移除舊的 kernel-package。現在可以使用 apt-get autoremove old-kernel-package 的方式移除,如果不指定 kernel-package 的版本,則會移除現在所有的舊版本。

sudo apt-get autoremove linux-image-3.13.0-51-generic linux-image-3.13.0-51-generic

這個方式也會一併的移除相依套件,相當的安全又乾淨(愈來愈無腦操作了 =,.=)。先前 purge 方式是在 /boot 還有空間的時候移除舊版,最近碰上的問題則是 /boot 空間已經 100% 滿載,新的 kernel 又只有裝一半(相依套件未完成安裝),導致任何的 apt-get 方式都無法使用,系統提示要以 apt-get -f install 方式強制解決新 kernel 的相依問題,而 /boot 又沒有任何空間,進入 Deadlock 狀況…

對於這種狀況的解法,

  1. 我們先清理出一些 /boot 的空間

    
    # 切換至 /boot 目錄下
    
    $ cd /boot
    
    
    # 確認目前運行的 kernel 版本
    
    $ uname -r
    
    
    # 備份舊的 kernel 版本
    
    $ sudo tar -cvf ~/boot.tar *3.13.0-36-generic *3.13.0-37-generic
    
    
    # 刪除已經備份的內容
    
    $ sudo rm -f *3.13.0-36-generic *3.13.0-37-generic

    Note
    完成後面的相依性安裝需要一些空間,請試需要移出足夠的空間。

  2. 解決套件相依性問題

     $ sudo apt-get -f install
  3. 使用 autoremove 方法清除舊版本

$ sudo apt-get autoremove

重新開機就會套用新的 kernel 版本。

參考連結:

Categories: ,

2015年10月2日 星期五

PHP 命名風格

PHP 的命名風格(Coding Style)

PHP 的學習與使用有蠻常的時間,近期的 PHP 更新使得這個語言融入其他語言的優點,在程式的特性上有些大躍進。近期閱讀 「現代PHP(Modren PHP)」 這本書,有種看完會更新整個使用 PHP 思維的感覺。書中有篇章在說明 PHP-FIG 的 PSR 建議標準,相同的使用規範能夠讓程式開發人員的程式互通性更好,合作性更佳,不再是悶着頭寫程式的時代,讓我們更容易的使用別人的輪子造車子。

其中 PSR-1 對於程式碼的風格有一些基礎的規範,回顧之前不同時期寫的程式,會發現自己在不同的學習階段,會依據當時查詢的風格規範而更改,每次都有一點小小的不同,這次決定記錄下來讓自己參考也與其他人交流。

變數命名

PSR-1 建議標準中,有針對類別、常數等建議命名原則,對於變數的名稱在 PSR-1 的內容中有提到沒有特別制定建議項目,之前觀察不同前輩的建議和查詢幾個有名的框架(Zend、Symfony、Laravel),寫下自己對變數名稱的命名。

  • 駝峰式命名法(camelCase),小寫字母開頭,後面每個單字的第一個字母大寫。
  • 要使用描述性的命名方式。
  • 迴圈變數通常使用: $i, $j, $k, …等等。
  • 存放 session 的變數前面以 sess 開頭。
  • 存放 cookie 的變數前面以 coke 開頭。
  • 臨時性的變數前面以 tmp 開頭。
  • $query$result 這兩個變數只能用在 SQL 的查詢語法變數與查詢結果變數。
  • 項目名稱(option)全部使用小寫及使用底線 _ (underscore)分隔。
$defaultOptions = array(
    'some_default' => 'values',
    'another_default' => 'more values',
);

常數命名

  • 常數名稱完全採用大寫英文字母。【PSR-1】
  • 必要時使用底線 _ (underscore)來區分單字。【PSR-1】
  • 如果內容有可能會改變,應改採用變數而非常數。

類別命名

  • 必須使用大寫開頭的駝峰式命名(camelCase),又稱爲 TitleCase。【PSR-1】
  • extends 和 implements 關鍵字需和類別名稱在同一行。【PSR-2】

方法命名

  • 必須使用小寫開頭的駝峰式命名(camelCase)。【PSR-1】
  • 小寫字母開頭,後面每個單字的第一個字母大寫。【PSR-1】
  • 當參數的數量多長度超過最大值(80字)時,可以換行處理。換行後其他參數要縮排起始大括弧要在新的一行。【Zend 1
public function bar($arg1, $arg2, $arg3,
    $arg4, $arg5, $arg6) 
{
    // all contents of function
    // must be indented four spaces
}

SQL語法

  • $query 變數名稱來存放 SQL 的命令。當發生錯誤時可以容易找出問題的地方。
  • 所有 SQL 的關鍵字必須採用大寫英文字母。
  • SQL 的寫法要分行,幫助程式碼容易閱讀與了解。

檔案命名

  • 檔案名稱完全採用小寫英文字母。
  • 字與字之間使用底線 _ 連接(EX:show_table.php)。
  • 一定要使用 .php 作為副檔名。
  • 會被引入的設定內容以 .inc.php 結尾。
  • 檔名長度必須小於 32 個字元(符合舊式系統)。

Categories:

2015年6月16日 星期二

Python 的 MySQLdb 套件安裝

Python and MySQL
先前 ubuntu 的套件庫沒有包含 Python 的 MySQLdb 套件,必須手動至 MySQLdb 官網下載位址下載來解壓縮安裝,如果還不確定是不是已經安裝,可以先進 python import 試試看。如果出現 ImportError: No module named MySQLdb 的訊息就表示還沒有安裝這個模組。

Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named MySQLdb
>>> exit()

手動安裝的方式:先下載目前的版本,解壓縮後安裝,步驟如後。

$ sudo tar -zxvf MySQL-python-1.2.4b4.tar.gz
$ cd MySQL-python-1.2.4b4
$ python setup.py build
$ python setup.py install

若要使用 pip 安裝,在這篇文章中有敘述安裝的步驟和方法,這邊記錄一下步驟。

$ sudo easy_install pip
$ sudo pip install pip --upgrade
$ sudo apt-get build-dep python-mysqldb
$ sudo pip install MySQL-python

現在使用的系統是 ubuntu 14.04.2 64bit,發現套件庫裡已經有包含 MySQLdb 了,只要直接用 apt-get 安裝即可。現在套件庫裡的版本是 1.2.3。

$ sudo apt-get install python-mysqldb
$ sudo apt-cache policy python-mysqldb
python-mysqldb:
  Installed: (none)
  Candidate: 1.2.3-2ubuntu1
  Version table:
     1.2.3-2ubuntu1 0

Categories: ,

2015年6月13日 星期六

迎接新生兒 CJScope ZQ-230 + Ubuntu GNOME 14.04.2

新生兒 CJScope ZQ-230

筆記型電腦發展一直很迅速,至這兩年才慢慢的被平板取代掉一部分的市場,如果只是上上網或玩玩小遊戲倒是很夠用了,想做圖或是寫程式的話,還是使用筆記型電腦比較好一些,個人覺得平板暫時還是無法完全取代筆記型電腦。

上一臺筆電為了追求輕薄選擇了 inhon 的 carbon book,全機使用碳纖外殼整體重量才 880 公克,實在是非常適合攜帶的電腦。可是卻有一個對我來說非常大的致命傷,RAM 只有 4GB 大小而且還是與內顯共用,全機一體成形記憶體燒在主機板上,完全沒有能夠加裝的空間,開啓 Chrome 瀏覽器不久就會面臨記憶體吃光光的窘境…

為了更能夠以筆電來工作,尋覓一陣子各廠牌的筆電,總是會有一兩樣規格的不符合需求。記憶體足夠的螢幕解析度太差 沒有 FullHD ,輕薄的筆電又是記憶體不足,什麼都不錯的又太過於厚重。各大廠在產品定位區隔上都掐的剛剛好!老天爺啊~怎麼就是十全十美的筆電呢?!

上天果然是有聽到宅男的呼喚,學弟在某一天突然帶來一臺沒看過的廠牌 CJScope,上網搜尋了一下這個品牌原來是客製化筆電的品牌(亮點:客製化),當週就立馬到他們的旗艦店去現場試機和討論,當天就拜倒在組裝的魅力下敗了一臺 ZQ-230。雖然沒有談成扣除掉 Windows 作業系統,自己挑了喜歡的硬體組合還是感到很滿足的啊!

安裝後的桌面截圖

選擇 Ubuntu GNOME 14.04.2 LTS

由於已經將日常的工作都轉到 Linux 平臺上,所以把 Windows 安裝在一般的硬碟,將 SSD 留做安裝 Linux 的空間以加快執行的速度。工作的桌機安裝的是 Ubuntu 14.04(Unity 桌面系統),家裡的桌機安裝的是 Linux Mint Cinnamon 17.1,HTPC 使用的是 Linux Mint MATE 17.1。一直想嘗試不一樣的桌面系統,所以在不同設備上安裝不一樣的桌面版本來嘗試。Linux 原本的設計就不是為了 Laptop,所以在電力消耗上是容易讓人頭疼,因為這一片文章 Ubuntu GNOME 14.04 “Trusty Tahr” LTS Review: Very very good! 後來決定選擇 Ubuntu GNOME 14.04.2 來試試。

硬碟分割

原本蠻擔心固態硬碟會因存取次數而有壽命上的問題,很多國外的文章都有提到現在的固態硬碟是今非昔比了,存取次數算一算都可以用上50年了。在分割的安排上除了存取次數太頻繁的,或是怕資料因為固態硬碟毀掉而蒸發的之外,全都安排放在固態硬碟中。

ZQ-230 可以安裝兩顆硬碟,一個是 M2 SATA 可安裝固態硬碟(SSD),另一個是 SATA3 的一般硬碟(HDD)。在分割區的安排是希望以提速為主,所以將 /boot、/root、/usr、/home(部分以 Link 方式到 HDD)都放在 SSD上,/tmp、swap 都放在HDD上。/var/log、/var/spool 和 /var/tmp 則是放在 ramdisk 上。

/boot   1GB (SSD)
/usr    40GB (SSD)
/       40GB (SSD)
/home   40GB (SSD)
/tmp    20GB (HDD)
swap    16GB (HDD)

安裝及設定

VIM

系統預設沒有安裝 VIM,有許多修改設定的方式都已經習慣使用 VIM,第一步當然是要先安裝它!

$ sudo apt-get install vim

Git

身爲一個程式人必備的東西啊~順便裝了我覺得不錯的視覺化界面 gitg。

$ sudo apt-get install git gitg

輸入法 ibus-rime

神級輸入法引擎 RIME 加上拼音,近來一直都使用 fcitx + rime 作爲輸入,可是 ibus 現在已經是內建的預設輸入法,先前不穩定的年代是使用 python 開發現在已經更換成 C++,速度上進步很多,加上一直有在更新調整,就決定來試用 ibus + rime 的組合 rime with ibs

$ sudo apt-get install ibus-rime
$ sudo apt-get install librime-data-luna-pinyin librime-data-terra-pinyin

OpenJDK -7

Java 7 之後已經是以 OpenJDK 為主要發展的軸線,有一些工具的執行仍需要有 Java runtime 的環境,所以安裝 OpenJDK 7。

$ sudo apt-get install openjdk-7-jdk

安裝 gtk theme 和 icon theme

Numix

$ sudo apt-add-repository ppa:numix/ppa
$ sudp apt-get update
$ sudo apt-get install numix-icon-theme-circle numix-gtk-theme 
$ sudo apt-get install numix-icon-theme

Moka Project

$ sudo add-apt-repository ppa:moka/stable
$ sudo apt-get update
$ sudo apt-get install moka-icon-theme faba-icon-theme faba-mono-icons 

安裝 Sqlite Browser

$ sudo add-apt-repository ppa:linuxgndu/sqlitebrowser
$ sudo apt-get update
$ sudo apt-get install sqlitebrowser

重新開機後的螢幕背光問題調整

在 ubuntu 14.04 的版本螢幕亮度在登出這次的 Session 後是不會被記憶住的,每次重新開機後,都會變成讓人眼睛會瞎掉的全亮模式,既傷眼睛又耗電。之前每次都是手動的去調整螢幕的亮度,可是每一次都要重新調整實在是有點累人。參考了 WEB UPD8 的文章1做了些修改來改善。

  1. 找出 ACPI 的界面控制是什麼,這個可以透過 Xorg 的 Log 來找。

    $ grep backlight /var/log/Xorg.0.log
    [     5.251] (--) intel(0): Found backlight control interface intel_backlight (type 'raw') for output eDP1

    可能會得到如上面的結果,在我的例子裡可以看到我的是 intel_backlight 將這個名稱記住,後面會使用上。

  2. 使用鍵盤上的硬體控制熱鍵(Fn + brightness keys)將螢幕的亮度調整到想要的範圍。

  3. 輸入下面的指令取得現在的亮度數值資訊。

    $ cat /sys/class/backlight/intel_backlight/brightness
    169

    Note: 這裡 backlight 資料夾中的 intel_backlight 是在步驟1中取得的 ACPI 控制界面名稱。記住這裡所得到的數值。

  4. 以 root 身份在 /etc/init/ 下建立 fixbrightness.conf 檔案

    $ sudo vim /etc/init/fixbrightness.conf

    貼上後面的內容

    description "Sets brightness after graphics device is loaded"
    
    start on graphics-device-added
    task
    exec /bin/echo BRIGHTNESS_VALUE > /sys/class/backlight/acpi_videoX/brightness

    Note: 這裡的 BRIGHTNESS_VALUE 以在步驟3中取得的數值替換。

  5. 重新開機,開機後就應該會是設定中的亮度不是全亮狀態了。

電源管理

ZQ-230 的電池容量很小,安裝完後馬上就發現系統的電量顯示,很有感的明顯的下降。使用時間約只有兩個半小時!!!這和官方標榜的九小時差異太大,即使接了兩顆硬碟比較耗電,但也不至於這麼離譜吧?!換到官方建立的 windows 中測試,也有四個小時左右的續航時間,應該就是校調的問題了。

StackOverflow 上有篇發問2討論探討了這個問題,所以文章一開始就提到 Linux 原本不是設計安裝在 Laptop 上使用的作業系統,對於電源的最佳化是需要再用其他套件調整。

安裝 intel p_state

Laptop 的 CPU 若全速執行當然是很耗電的,intel 後來使用動態頻率調整來降低電源的消耗。於是建立了 intel p_state 專案的程式碼來調整。後來在 Ubuntu 的套件中已經安裝 intel p_state 支援,但是預設是沒有被啓動。透過下面的修改,可以啓動對 intel p_state的支援。

  1. 編輯 grub 設定

    $ sudo vim /etc/default/grub
  2. 在檔案中找到 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 並且把內容修改爲 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_pstate=enable"

  3. 存檔並更新 grub 設定。

    $ sudo update-grub
  4. 重新開機套用設定。開機後檢查是否有啓動。

    $ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver

安裝TLP

TLP 是一個很好的電源管理程式,有啓動 intel p_state 可以讓 TLP 的電源管理變得更好。TLP 安裝後會自動啓動,也可以使用預設的設定就好。安裝方式:

$ sudo add-apt-repository ppa:linrunner/tlp
$ sudo apt-get update
$ sudo apt-get install tlp tlp-rdw

安裝 Powertop

PowerTOP 是個分析、監控電力消秏的節能工具程式,是由 Intel 於 2007 年以 GPLv2 授權釋出的開放原始碼專案。我們可以使用它找出 GNU/Linux 上秏電的套件,並透過停用不必要的功能以達到省電的效果。
可以參考凍仁的這篇文章,使用 apt-get 安裝即可。

$ sudo aptitude install powertop

軟體安裝

Ubuntu Software Center

在 Ubuntu Software Center 安裝一些常用的軟體:

  • System Load Indicator
  • Shutter
  • Filezilla
  • Geany
  • GParted Partition Editor
  • Meld Diff Viewer

手動下載安裝

  • 下載安裝 Dropbox
  • Google chrome
  • Netbeans

Categories: ,

Copyright © Open Jiang       Up ↑

Design by Anders Noren | Theme by NewBloggerThemes.com