2016年10月11日 星期二

常用MediaWiki語法筆記

以下內容從wiki頁面複製來的,所以移除內部連結.
此頁提供編輯MediaWiki時較常用到的語法,完整資訊請參考wiki官網中的User help

目錄

 [隱藏] 
  • 1建立頁面
  • 2連結某頁面
  • 3連結至錨點
  • 4換行
  • 5清單
  • 6表格
  • 7分類
  • 8上傳檔案
  • 9移動頁面
  • 10重新導向
  • 11模板
  • 12Magic words
  • 13腳註
  • 14Table Of Contents

建立頁面

在搜尋列輸入要新建的頁面名稱,
若該頁面不存在,則會出現於此 Wiki 建立頁面"頁面名稱",
點擊該"頁面名稱"連結即進入遍及該頁面的畫面,
編輯完按建立則可.

連結某頁面

  • 內部連結
頁面名稱於雙中括號內
[[首頁]] 結果為->首頁

  • 內部連結變更顯示名稱
頁面名稱與變更名稱於雙中括號內中間加|符號
[[首頁|回家]] 結果為->回家

  • 外部連結
直接輸入網址
https://mediawiki.org 結果為->https://mediawiki.org

  • 外部連結變更顯示名稱
頁面名稱與變更名稱於中括號內
[https://mediawiki.org MediaWiki] 結果為->MediaWiki

連結至錨點

錨點就像書籤,可在文件中某處新增錨點,而後在文件其它地方或是其它頁面都可新增跳至該錨點的連結
  • 建立錨點
使用html tag div語法將id指定為錨點名稱,內容為錨點顯示的文字
<div id="NameOfAnchorHere">這是錨點</div>
結果為->
這是錨點

  • 連結至同頁錨點
#字號加錨點名稱於雙中括號內
[[#NameOfAnchorHere]] 結果為->#NameOfAnchorHere 點擊會跳至錨點

  • 其它頁面連結至錨點
錨點頁面名稱加#字號加錨點名稱於雙中括號內
[[Wiki語法教學#NameOfAnchorHere]] 結果為->Wiki語法教學#NameOfAnchorHere 在其它頁面點擊會跳至此頁錨點

換行

因使用html語法所以內文單行的換行符號在顯示時並不會換行,可用以下幾種方式達到換行
  • 換行標籤
使用換行標籤 <br />或<br>
行1<br />
行2<br>
行3
結果如下
行1
行2
行3
缺點:每行都要加比較麻煩,適用少量文字時
優點:編輯篇幅較小

  • 空白行
在要換行文字底下再多一行空白
行1
(空白行)
行2
(空白行)
行3
結果如下
行1
行2
行3
缺點:因為要多空白行,所以編輯的篇幅較大
優點:簡易快速

  • <pre>標籤
<pre>標籤將保留其中的文字格式包含換行等
<pre>
行1
行2
行3
</pre>
結果如下
行1
行2
行3
缺點:會套用<pre>標籤的樣式,但可修改
優點:適合大量內容時

清單

  • 無編號清單
用*符號加一個空白開頭
用兩個*符號加一個空白開頭則內縮一層
* 項目a
* 項目b
** 項目b1
** 項目b2
結果如下
  • 項目a
  • 項目b
    • 項目b1
    • 項目b2

  • 有編號清單
用#符號加一個空白開頭
用兩個#符號加一個空白開頭則內縮一層
# 項目a
# 項目b
## 項目b1
## 項目b2
結果如下
  1. 項目a
  2. 項目b
    1. 項目b1
    2. 項目b2

表格

  • 基本表格
符號說明
{|table start, required
|+table caption, optional; only between table start and table row
|-table row, optional on first row—wiki engine assumes the first row
!table header cell, optional. Consecutive table header cells may be added on same line separated by double marks (!!) or start on new lines, each with its own single mark (!).
|table data cell, optional. Consecutive table data cells may be added on same line separated by double marks (||) or start on new lines, each with its own single mark (|).
|}table end, required
{|後可接樣式
{|class="wikitable"
|(0,0)Orange
|(1,0)Apple
|-
|(0,1)Bread
|(1,1)Pie
|-
|(0,2)Butter
|(1,2)Ice cream
|}
結果如下
(0,0)Orange(1,0)Apple
(0,1)Bread(1,1)Pie
(0,2)Butter(1,2)Ice cream
  • 變更內容樣式表格
可針對整個表格或元素變更其樣式
變更整個表格
{|class="wikitable" style="color: red"
|(0,0)Orange
|(1,0)Apple
|-
|(0,1)Bread
|(1,1)Pie
|-
|(0,2)Butter
|(1,2)Ice cream
|}
結果如下
(0,0)Orange(1,0)Apple
(0,1)Bread(1,1)Pie
(0,2)Butter(1,2)Ice cream
變更單一元素
{|class="wikitable"
|(0,0)Orange
|style="color: red"|(1,0)Apple
|-
|(0,1)Bread
|(1,1)Pie
|-
|(0,2)Butter
|(1,2)Ice cream
|}
結果如下
(0,0)Orange(1,0)Apple
(0,1)Bread(1,1)Pie
(0,2)Butter(1,2)Ice cream

分類

  • 將頁面加入分類
Category:分類名稱於兩個中括號內
[[Category:Teaching]]
結果為將該頁面加入Teaching分類,會在頁面最底下看到所屬的分類
之後也可在Teaching分類頁面中看到該頁面以及其它同屬Teaching分類的頁面有哪些

  • 將頁面加入多個分類
重複加入分類即可
[[Category:Teaching]]
[[Category:test]]
結果為該頁面加入Teaching與test分類

上傳檔案

  • 上傳檔案並使用
在首頁的左邊sidebar中有上傳檔案的頁面連結
該頁面有說明如何上傳與使用檔案

移動頁面

  • 更換頁面名稱
移動頁面就是更換頁面名稱
wiki網站會執行以下三個動作
  1. 將頁面A改名為頁面B
  2. 將頁面A的歷史紀錄複製給頁面B
  3. 產生新的頁面A並重新導向B
產生新的頁面A是為了讓原本在其它頁面連到頁面A的連結不會失去連結對象,而可先連到A在導向B
若在移動頁面的時取消勾選 Leave a redirect behind,則可取消產生新的頁面A動作,再手動修改原本有連到頁面A的頁面改連到頁面B
  • 刪除頁面
目前只有管理者有刪除頁面的權限

重新導向

此功能是當使用者瀏覽頁面A時會自動導向頁面B給使用者瀏覽
They can be useful if a particular article is referred to by multiple names, or has alternative punctuation, capitalization or spellings.
  • 建立重新導向
在頁面A加入
#REDIRECT [[頁面B]]
使用時須注意
#前不能有空白或其它文字
編輯後請預覽,若重新導向的頁面不存在則會顯示紅色頁面B,請務必修正

模板

當有特定內容需被多個頁面使用時,則可建立該內容的模板給其它頁面使用,而不用在各個頁面都加入該內容,
當此特定內容有變更時,也只需要修改模板即可套用到所有使用此模板的頁面,而不用修改各個頁面
  • 建立模板
建立以模板命名空間Template:加模板頁面名稱的頁面
以建立"常用頁面"模板為例
在搜尋列輸入
Template:常用頁面
若該頁面未被建立,則可建立該模板頁面
編輯模板頁面後儲存即可

  • 使用模板
模板名稱於兩個大括號內
{{常用頁面}}
結果如下,該模板為一些常用的頁面連結置於表格中
常用頁面
資訊頁
測試頁
Wiki語法教學

Magic words

Magic words可以用來改變網頁的行為或當變數使用等
詳細請參考Magic words
  • 行為改變
例如 __TOC__
為Table Of Contents (目錄)的Magic words
在頁面中加入此Magic words表示指定TOC出現的位置
關於TOC將於其它章節說明

  • 變數
wiki內建如日期時間等的變數,可動態產生該資訊顯示於頁面
{{CURRENTYEAR}}
{{CURRENTTIME}}
{{LOCALTIME}}
{{#time:Ymd}}
{{#time:Y年m月d日}}
結果如下
2016
08:42
16:42
20161011
2016年10月11日

  • Parser Function
可判斷變數以顯示不用內容於頁面
{{#ifexpr: {{LOCALHOUR}} >= 17 | 5點囉快下班了 | 繼續加油}}
結果如下(結果會因是否超過下午5點而不同)
繼續加油

腳註

即加入註解於頁面底部
以ref標籤標示內容
<ref>這是腳註的註解內容</ref>
結果如下產生一註解連結,連至頁面底下註解內容
[1]

也可在註解內容中加入連結
<ref>腳註詳細說明請參考[https://www.mediawiki.org/wiki/Help:Cite wiki官網Reference]</ref>
結果如下產生一註解連結,連至頁面底下註解內容,且該內容包含連結
[2]

Table Of Contents

table of contents TOC 目錄功能就是在頁面中產生"目錄",目錄中會list章節的連結
  • 自動產生TOC
當頁面中有超過三個的section標籤(也就是四個以上),wiki就會在頁面頂端自動產生目錄
section標籤就是標題標籤,
用法為標籤內容於兩個或以上的等號內如下
= 第一層標籤 =
== 第二層標籤 ==
=== 第三層標籤1 ===
=== 第三層標籤2 ===
此結果不顯示,可參考用目錄之頁面如本頁面的目錄

  • 強制產生TOC
當頁面只有三個以下的section標籤,但又想要產生目錄時
可在頁面中加入 __FORCETOC__ magic word,即可強制產生目錄

小提醒: 當有登入wiki並瀏覽頁面時,在各section右邊會產生"編輯"的連結,點擊則進入編輯該章節的頁面,
此功能在頁面內容較多時可以較容易編輯某章節,也可避免不小心改到其它章節的狀況發生等



  1. 移至 這是腳註的註解
  2. 移至 腳註詳細說明請參考wiki官網Reference

區網架設內部MediaWiki網站

安裝MediaWiki

安裝MediaWiki完整資訊參考Manual:Running MediaWiki on Debian or Ubuntu

下載MediaWiki

由MediaWiki官網下載1.27.1版 mediawiki-1.27.1.tar.gz

解壓縮與複製至目的地

  • 解壓縮
可用圖形界面點滑鼠右鍵->在此解壓縮
或是
tar -xvzf /pathtofile/mediawiki-*.tar.gz
注意pathtofile為檔案存放的路徑
  • 複製至目的地
sudo mkdir /var/lib/mediawiki
sudo mv mediawiki-*/* /var/lib/mediawiki

下載XAMPP

由於MediaWiki需要基於一些基本工具才能動作,而XAMPP正是將這些工具打包成一個安裝包的東西,所以直接下載使用
XAMPP包含Apache + MariaDB + PHP + Perl
Apache : web server
MariaDB : database MySQL的分支
由XAMPP官網下載xampp-linux-x64-5.6.24-1-installer.run
修改mode為可執行檔
sudo chmod +x /pathtofile/xampp-linux-x64-5.6.24-1-installer.run

安裝XAMPP

執行xampp-linux-x64-5.6.24-1-installer.run,下一步直到完成,完成後可看到其安裝在/opt/lampp目錄底下

設定database

由於我們是安裝XAMPP所以database是在/opt/lampp底下,與一般直接安裝MySQL不同,所以設定方式也會不同於MediaWiki官網,請注意
  • 設定root password
官網為
mysqladmin -u root password "<enter the new password here>"
history -c
但XAMPP的database則是在
cd /opt/lampp/bin/
./mysqladmin -u root password "<enter the new password here>"
history -c
如果遇到./mysqladmin: connect to server at 'localhost' failed的問題可能是mysql沒有run
執行下行確認
./mysql.server  status
 * MySQL is not running
啟動mysql
./mysql.server  start
啟動成功後再次執行
./mysqladmin -u root password "<enter the new password here>"
history -c
以下主要以XAMPP方式為主,不再闡述與官網差異
  • Secure setup
cd /opt/lampp/bin/
./mysql_secure_installation

設定PHP

修改 /opt/lampp/etc/php.ini中的upload_max_filesize與memory_limit
upload_max_filesize=128M

memory_limit=128M

設定MediaWiki首頁

cd /opt/lampp/htdocs
sudo ln -s /var/lib/mediawiki mediawiki

啟動lampp


cd /opt/lampp/
./lampp start
若要變更port可修改/opt/lampp/etc/httpd.conf中的Listen 再./lampp restart
完成以上步驟後即可使用瀏覽器開啟MediaWiki首頁(但安裝尚未完成)

設定MediaWiki

MediaWiki的設定是透過瀏覽器界面產生LocalSettings.php
  • 開啟瀏覽器至http://web-server/mediawiki/
其中web-server為主機的電腦名稱(domain name)或是IP
該頁面會檢查是否有LocalSettings.php檔,若無則會自動進入設定頁面
  • 依頁面指示完成設定
為避免未來缺乏某些外掛工具,所以在外掛工具選擇時全部選取
管理者帳號設定為 xxx_admin
完成後下載LocalSettings.php
  • 套用LocalSettings.php
sudo mv ~/Downloads/LocalSettings.php /var/lib/mediawiki/

安裝完成

完成後再次開啟瀏覽器至http://web-server/mediawiki/則可開始使用此wiki網站
可使用xxx_admin登入,建立其他使用者帳號等

後續設定

web-server首頁

目前XAMPP的設定開啟瀏覽器至http://web-server/會跳轉到http://web-server/dashboard/
可修改/opt/lampp/htdocs/index.php中的
header('Location: '.$uri.'/dashboard/');
改為
header('Location: '.$uri.'/mediawiki/');
如此http://web-server/就會跳轉到http://web-server/mediawiki/首頁了

設定wikieditor

修改/var/lib/mediawiki/LocalSettings.php加入
# Enables use of WikiEditor by default but still allows users to disable it in preferences
$wgDefaultUserOptions['usebetatoolbar'] = 1;

# Enables link and table wizards by default but still allows users to disable them in preferences
$wgDefaultUserOptions['usebetatoolbar-cgd'] = 1;

# Displays the Preview and Changes tabs
$wgDefaultUserOptions['wikieditor-preview'] = 1;

# Displays the Publish and Cancel buttons on the top right side
$wgDefaultUserOptions['wikieditor-publish'] = 1;
讓編輯頁面時套用wikieditor外掛使編輯更加簡易

重新開機自動啟動

因為xampp服務在重新開機後不會自動啟動,須手動登入機器並啟動wiki網站才開始工作,
所以修改/etc/rc.local加入啟動xampp的命令如下,以後只要啟動機器即可
sudo /opt/lampp/xampp start

上傳檔案設定

上傳檔案功能需要更改image目錄權限才可使用
cd /var/lib/mediawiki/
sudo chmod 777 images
確認/var/lib/mediawiki/LocalSettings.php中的wgEnableUploads設定為true
## To enable image uploads, make sure the 'images' directory
## is writable, then set this to true:
$wgEnableUploads = true;

常用wiki語法教學

wiki語法教學頁面
http://etkenchen.blogspot.com/2016/10/wiki.html

2016年6月24日 星期五

Android 各層說明筆記

Android 系統從上至下大致區為

  1. application
  2. framework
  3. JNI
  4. HAL
  5. linux kernel (driver)
  6. hardware

1.application
JAVA寫的應用程式,主要呼叫framework層提供的API(功能/服務)達到所需的應用.

2.framework
JAVA寫的Android主體,實作Android制定的標準API,提供豐富與常用的功能給application使用,
並且讓application可以不用因底層driver不同而改變.
為何application要因底層driver不同而改變?
舉例來說有兩個背光的驅動IC分別由兩個driver來驅動,
而這兩個driver點亮背光的ioctl控制方式不一樣(如ioctl code不一樣等),
則application要讓背光點亮的功能就要實作呼叫兩個不同的ioctl才能支援兩個驅動IC.
但透過framework層就是要呼叫"背光點亮"這個API就好,framework層會處理底層的不同.
又framework層如何處理底層?如果只是同樣呼叫兩個不同ioctl那不就只是把麻煩事放在framework層而已嗎?
當然不是這樣,framework層除了對上定義標準API給application使用,
對下也定義"背光點亮"界面並要求底層依該定義實作,因此不同的driver若要支援Android則依循Android的規範實作即可.
但framework底下是JNI不是driver啊? 剛剛是舉例,後續會再說明.

3.JNI
C/C++寫的但是需要include JAVA產生的.h檔.
framework是JAVA寫的,driver是C/C++寫的,framework怎麼呼叫driver的ioctl?
答案就是JNI,JNI就是讓JAVA可以呼叫C/C++的界面.
在JAVA的source code中如果要呼叫C/C++ library中的function,
就要在宣告該function時加上native關鍵字等,然後編譯該JAVA會產生一.h檔,
然後在C/C++的source code中include該.h檔並實作.h檔中的function,
該function就是呼叫driver的ioctl等,
再編譯C/C++後產生.so或.dll的library檔,該library檔就可以讓JAVA呼叫使用.
此.so或.dll就稱JNI,使JAVA可以呼叫到driver的功能.
這裡須強調JNI是個界面,source code是C/C++,或許有些功能用JAVA較不易實作,而用C/C++較容易就把該功能寫在JNI,
使JNI不只是單純的界面,這是不對的行為,架構問題不多解釋.

4.HAL
主要由C/C++寫的,所以可以被JNI呼叫,並向下控制driver.
JNI已經可以呼叫底層driver了,為何又多了HAL層?
framework層是Android強大功能的主體,而HAL層則是讓Android得以商業化的關鍵,
因為driver屬於linux kenel需要公開source code,但有些廠商不希望將驅動該硬體的source code公開,
因其中可能包含其不願公開的演算法等,所以對linux平台的產品卻步,因此產生了HAL層,HAL層不屬於driver而是以使用driver的角色存在,
所以不須公開原始碼,就可以讓廠商將不願公開的code放在HAL層,而driver只負責簡單的控制硬體功能.


5.linux kernel (driver)
用C/C++寫的,driver 實作控制CPU以驅動硬體的功能,並提供ioctl等讓上層呼叫.

6.hardware
硬體...