2016年11月19日 星期六

偷偷拷貝夥伴的COMPOSER_HOME目錄

和夥伴在同一台主機下共同練習Laravel
每個人都自己的家目錄
而每個人也需要各在自己的家目錄下
composer global require "laravel/installer"
指令
主要目的是要把laravel的安裝程式下載回來到COMPOSER_HOME
(關於COMPSER_HOME是~/.composer還是~/.config/composer請看這一篇)

但是composer global的執行實在太慢了
偷懶一點的作法是

一、利用root的權限,把別人的COPY回來就好了
##舉例有test1與test2兩個使用者
mkdir ~/.composer
sudo cp -R /home/test1/.composer/* /home/test2/.composer/
sudo chown -R test.test /home/test2/.composer


二、設定laravel指令及XDG環境變數
sudo vi ~/.profile 或sudo vi ~/.bash_profile
在最後一行寫入
export PATH=$HOME/.config/composer/vendor/bin:$PATH
三、重新開機或直接執行source ~/.profile並執行laravel安裝
重新開機後,切換到自己的網頁目錄
輸入

laravel new blog

四、修改bootstrap/cache及storage
sudo chown -R www-data.www-data bootstrap/cache/
sudo chown -R www-data.www-data storage/


[Ubuntu16.04]安裝Laravel,COMPOSER_HOME竟多出了.config資料夾



如上圖
安裝Laravel的官方文件中提到:
執行
composer global require "laravel/installer"
安裝程式後,可以在~/.composer/vendor/bin目錄下找到laravel指令,但是今天卻發現此次設定的主機的路徑竟是~/.config/composer/vendor/bin,多出了一個.config的資料夾

仔細查閱相關資料後才發現,原來
假如電腦主機若是採用 freedesktop.org standards標準的作業系統,他會先偵測環境變數中XDG_CONFIG_HOME是否有設定,若沒有設定的話,就會自動幫你加上.config

If your system uses freedesktop.org standards, which it detects by looking for environment variables beginning with XDG_, then Composer uses $XDG_CONFIG_HOME/composer/, falling back to $HOME/.config/composer/ if that isn't set.


若要解決這個困擾(至少操作時跟路徑跟官方文件一致比較不會出錯),可從兩個方向著眼:
1.更改全域的設定,主機內全部使用者受惠
sudo vi /etc/profile

2.更改個別使用者
vi ~/.profile

同樣都是在檔案的最後一行加上
export XDG_CONFIG_HOME="$HOME"

這樣一來,當電腦重新啟動後,XDG_CONFIG_HOME環境變數就會先執行了,但假如你先前已經安裝過Composer的話,可能就需要再重新裝一次囉


註:其他XDG環境變數請參閱Environment variables
註:察看目前5.7的laravel Document官方文件,已經將安裝目錄改為~/.config/composer/vendor/bin,所以上面的XDG_CONFIG_HOME已毋需修改。
參考文件:




2016年11月8日 星期二

MySQL中的offset

offset的英文意思為抵消,當用在MySQL時的意思就好比忽略前幾筆資料,常跟limit搭配使用,使用時機通常是換頁時。

例如:select * from country limit 5 offset 5
意思就是:忽略前5比資料,列出country資料表中的第6~10筆資料。

2016年11月1日 星期二

ssh連線時,發生遠端主機認証資料已經改變的錯誤訊息

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:sTZh1ToLgA3719MjTD+Hnvbfb2HXXKtOk7uvp3Us23s.
Please contact your system administrator.
Add correct host key in /home/chunkai/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/chunkai/.ssh/known_hosts:3
  remove with:
  ssh-keygen -f "/home/chunkai/.ssh/known_hosts" -R 192.168.30.9
ECDSA host key for 192.168.30.9 has changed and you have requested strict checking.
Host key verification failed.


上面是最近常出現的訊息,這是因為進行ssh連線時,本機端會將伺服器端的金鑰與IP對應紀錄,寫入到
/home/使用者/.ssh/know_hosts

但是因為我裝了許多台虛擬主機,不同台的虛擬主機重啟後卻有可能使用同一組IP,如此一來本機端的know_hosts紀錄對應不符(另一種狀況,當然就是伺服器有重新安裝過,似服主機的金鑰碼又會不一樣囉,這樣也會產生對應不符的情形),就會出現上述的錯誤。只要照著他提示的建議:

ssh-keygen -f "/home/chunkai/.ssh/known_hosts" -R 192.168.30.9

重新建立know_hosts紀錄。



2016年10月29日 星期六

解決Composer安裝過程少了ext-dom延伸套件

OS:Ubuntu 16.04.3 Server
PHP:7.0.8
當我使用composer create-project要建立一個yii2的專案,安裝過程出現了composer相依性問題:

phpunit/phpunit 5.6.2 requires ext-dom * -> the requested PHP extension dom is missing from your system.

似乎是ext-dom延伸套件沒有安裝,google察看了其他的文件,才發現正確的說法是php-xml套件沒有裝上

sudo apt-get install php-xml

註:

sudo apt-get install php7.0-xml

也可以,兩個安裝的路徑似乎一樣

參考網頁:

2016年10月19日 星期三

Ubuntu16.04設定locals語系

Ubuntu16.04設定語系的方法有些不太一樣

1.檢查是否有支援中文語系
less /usr/share/i18n/SUPPORTED | grep zh_TW


2.修改預設的語系全域設定
sudo vi /etc/default/locale
改成
LANG=zh_TW.UTF-8
LANGUAGE=zh_TW.UTF-8
LC_ALL=zh_TW.UTF-8
3.輸入以下的指令,將locale套件管理程式選定預設的語系改為zh_TW.UTF-8 UTF-8,並將zh_TW.Big5及en_US.UTF-8取消
sudo dpkg-reconfigure locales

4.登出後再登入,修改的設定就會生效
如此一來,利用遠端連線軟體登入,就可以正常顯示中文

相關參考:Ubuntu14.04如何設定語系

2016年9月23日 星期五

下載Google翻譯的語音檔

利用google翻譯直接唸出單字發音
以及直接下載mp3檔
可以透過以下的網址範例做到

https://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=en&q=apple

方法:
將apple置換為你想要查詢的單字,按Enter重整網頁
網頁就會直接唸出你所查詢的單字的英語發音
接著,在畫面上按滑鼠右鍵 / 另存新檔,就可以把英文語音檔下載回來




也可以唸中文喔:「這是不是很簡單」

2016年9月17日 星期六

在Ubunt 16.04下安裝php5.x

由於Ubuntu16.04預設的PHP套件程式版本為PHP 7,所以一旦使用apt install的話,就會直接安裝最新版的PHP 7,然而假如主機本身舊有的PHP程式若有使用到已經不被支援的函式或function,該PHP程式就會出錯,然而一步一步去除錯,將可能花費更多的時間與精力,於是儘管PHP 7 以效能著稱,此時仍舊以降級為優先考量。

步驟:
1.先檢查是否已有安裝php相關套件,若有的話全部都移除。
sudo apt-get purge `dpkg -l | grep php| awk '{print $2}' |tr "\n" " "`

2.手動將PHP5.x套件來源的PPA加入系統軟體來源(software source ),也就是寫入到/etc/apt/中。
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

附註:要先設定好正確的語系,才可以正確寫入PPA來源,請參考Ubuntu16.04設定locals語系

 圖1: 將ppa寫入system會出現說明訊息,按Enter即可
 圖2: 之後會建立gpg的金鑰
 圖3:寫入的source資料會存在/etc/apt/sources.list.d/ondrej-ubuntu-php-xenial.list中
圖4:這是php source.list的內容,主要是讓system知道,若要更新或安裝php ,要到http://ppa.launchpad.net/ondrej/php/ubuntu找更新程式

3.安裝PHP 5.6版以及其他擴充函式庫
sudo apt-get install php5.6
sudo apt-get install php5.6-mbstring php5.6-mcrypt php5.6-mysql php5.6-xml




4.檢查版本
sudo php -v


附註:要安裝PHP 5.x,前題是要先安裝Apache 2.x

參考網頁:



Ubuntu 16.04安裝line

 以前若想要再Ubuntu下使用line,先決方法是必須要安裝wine,既而再安裝windows版的line進行安裝

而目前安裝的方法更為簡便了,先決條件是要有Chrome瀏覽器

1.安裝 Chrome
2.開啟 Web store 安裝 LINE:LINE - Chrome 線上應用程式商店
3.新增捷徑到應用程式或桌面:自訂及管理 / 更多工具 / 擴充功能



參考網頁:

2016年9月11日 星期日

Ubuntu16.04 Desktop的firefox是英文的,改中文吧!

那就先檢查一下Firefox的版本並下載合適的繁體中文版語言包安裝吧!

參考網頁:

Ubuntu 16.04安裝gcin

最近剛安裝好Ubuntu 16.04 Desktop版(最精簡的安裝),但是預設的狀態下,竟然無法切換輸入法打中文,於是就趕緊裝上gcin輸入法。
1.在終端機模式下輸入以下的指令,指令的意思是到keyserver.ubuntu.com還原(再打一支)編號835AB0E3的金鑰。這個網站有時會連不上去,遇到此狀況就改時再試試。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 835AB0E3


2.開啟「軟體和更新」,除了可以輸入以下的指令,當然也可以點選Unity左邊的齒輪後,尋找「軟體和更新」的設定。
software-properties-gtk

3.在「軟體和更新」的設定視窗中,點選「其他軟體」,並按「加入」


4.由於咱國人的gcin並不是Ubuntu社群維護的的軟體,以下的操作等於是將要安裝的軟體路徑,寫入sources.list清單中。

Ubuntu 1204-1410 : deb http://hyperrate.com/debian eliu release
Ubuntu 1504 : deb http://hyperrate.com/gcin-ubuntu1504 eliu release
Ubuntu 1510 : deb http://hyperrate.com/gcin-ubuntu1510 eliu release
Ubuntu 1604 : deb http://hyperrate.com/gcin-ubuntu1604 eliu release

 5.再回到終端機模式,輸入安裝指令,記得按Y
sudo apt-get install gcin

6. Unity: 右上角的齒輪→系統設定值→語言支援→鍵盤輸入法系統→gcin。或是執行 /usr/bin/gnome-language-selector→鍵盤輸入法系統→gcin

7.登出後或重新開機,就可以使用gcin輸入法了。

參考網頁:

2016年9月10日 星期六

Xoops移機的步驟

Xoops移機的步驟
把舊機資料庫備份出來-->取代舊機的IP-->再次匯入資料庫-->完成

先將舊機網頁停機,避免還有人透過網頁將資料寫入資料庫
1.service apache2 stop

2.在舊機器上,利用mysqldump將資料備份出來
mysqldump  -uroot  -p  --default-character-set=utf8  xoops > /home/webadmin/xoops.sql

3.編輯資料庫備份檔,將舊IP取代為新IP
vi /home/webadmin/xoops.sql
在vi模式下執行取代工作
例如:
:1,$s/舊IP/新IP/s
:1,$s/192.168.0.1/192.168.0.2/g


4.在新機器上將資料庫備份檔匯入(前提是新機器已經裝了Xoops)
mysqladmin -uroot -p create xoops
mysql -uroot -p  xoops < /home/webadmin/xoops.sql


2016年9月9日 星期五

更改ip後,MySQL無法啟動

Ubuntu主機的IP更改後,發現MySQL無法啟動,解決方法很簡單,原來在一開始安裝MySQL時,會自動在設定檔加入IP。所以一旦更改固定IP後,MySQL設定沒有變更,當然就無法啟動。

sudo vi /etc/mysql/my.cnf

修改
bind-address = 新的IP

重新啟動MySQL即可正常了

sudo service mysql restart

2016年8月24日 星期三

[解決]學校首頁跑粉慢粉慢,原來是ipv6惹的禍

學校的網站適用Xoops架設的,一直以來都存在著一個奇怪的現象,就是讀取首頁時總是會跑很久很久才出現,感覺起來似乎在解析DNS出現問題。

這次,終於狠下心來把主機重灌,希望能擺脫這樣的問題,果不其然,重灌後主機順多了,接著今天繼續進行ipv6的設定,然而設定完成後,那種首頁跑很久很久的感覺又回來了,直覺反應該不會是ipv6搞的鬼,果不其然

像我家中使用的是吸Net,目前上網模式仍舊停留在ipv4的狀態,所以在讀取網頁時只能夠以ipv4做解析,然而Ubuntu預設的環境是ipv6優先,兩造衝撞的結果,網頁就卡卡的。

sudo vi /etc/gai.conf
將下行註解打開
# precedence ::ffff:0:0/96  100
變成下面
precedence ::ffff:0:0/96  100

徐老大,恁馬加加油,為了你的吸Net,我只好捨棄Server端ipv6優先讀取順序,ipv6不是推出很久了嗎?在台灣怎麼還在原地踏步。

參考網頁:彰化縣自由軟體工作日誌

2016年8月11日 星期四

安裝Yii2 Framework

請參考前一篇【Ubuntu下安裝Composer】,composer的指令才能正確執行

1.安裝Composer Asset Plugin
composer global require "fxp/composer-asset-plugin:~1.1.1"

2.切換至網頁根目錄下
cd /var/www

3.以wget下載打包後的tgz安裝檔,基礎版或進階版
(1)基礎版basic
wget https://github.com/yiisoft/yii2/releases/download/2.0.9/yii-basic-app-2.0.9.tgz

(2)進階版advanced
wget https://github.com/yiisoft/yii2/releases/download/2.0.9/yii-advanced-app-2.0.9.tgz

4.將下載的安裝檔解壓縮
sudo tar zxvf yii-basic-app-2.0.9.tgz
sudo tar zxvf yii-advanced-app-2.0.9.tgz

5.修改網頁根目錄下的/basic/config/web.php內容,找到'cookieValidationKey' => '',單引號中的值任意輸入,不可為空白。
例如:
'cookieValidationKey' => '12efwfwqf3r'

此時只要在網址列輸入http://localhost/basic,就可以看到Yii 2預設的網頁。

6.若是安裝進階版,則是需要透過終端機在網頁根目錄下的advanced/。
並輸入./init指令,讓電腦自動產生advanced版的整個framework架構。
ps.進階版不用額外設定config/web.php檔



Ubuntu下安裝Composer

參考Composer的官方網站,在Ubuntu14.04下安裝Composer,其中針對第3步驟做了些修正,將composer的指令,寫入到/bin下,如此一來方便日後只要輸入composer就可以執行指令,而不用下php composer.phar

安裝的步驟為:
1.取得composer的安裝程式
2.以SHA-384驗證安裝程式
3.安裝composer至/bin目錄
4.刪除composer安裝程式


sudo php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

sudo php -r "if (hash_file('SHA384', 'composer-setup.php') === 'e115a8dc7871f15d853148a7fbac7da27d6c0030b848d9b3dc09e2a0388afed865e6a3d6b3c0fad45c48e2b5fc1196ae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

sudo php composer-setup.php --install-dir=/bin --filename=composer

sudo php -r "unlink('composer-setup.php');"


ps.第四行的指令也可以改寫成
sudo rm -rf composer-setup.php 主要目的只是要刪除下載回來的安裝檔

2016年7月8日 星期五

Ubuntu使用purge參數,清除apt-get移除後剩下的垃圾

在Ubuntu下移除套件的指令為apt-get remove,但這樣往往還是會留下設定檔等用不到的垃圾,所以建議加上"--purge"參數,這樣才能移除乾淨。
sudo apt-get remove --purge 套件名稱

至於要清查有哪些套件沒有清除乾淨,可以輸入以下的指令
dpkg -l | grep ^rc

要批次列出套件名稱
dpkg -l | grep ^rc | awk '{ print $2 }'

組合起來後
sudo apt-get remove --purge `dpkg -l | grep ^rc | awk '{ print $2 }'`



參考網頁:Ubuntu Linux 使用 apt-get 指令移除軟體並清理遺留的垃圾

2016年6月19日 星期日

Ubuntu 與 Other Linux Distros的Runlevel比較

Runlevel控制了Linux的操作模式,多工、單工、關機、重新啟動、文字或視窗模式。但Ubuntu自11.04版後,更改了Runlevel的設定方式。

Ubuntu11.04以後的版本:
設定檔:/etc/init/rc-sysinit.conf
Runlevel代碼:
0 - shutdown
1 - single user mode
2 - multiuser graphical mode
6 - reboot
修改預設模式:vi /etc/init/rc-sysinit.conf
##env DEFAULT_RUNLEVEL="Runlevel代碼"
##例如:
env DEFAULT_RUNLEVEL=2


Other Linux Distros或舊的Ubuntu OS
設定檔:/etc/inittab
Runlevel代碼:
0 - shutdown
1 - single user mode
3 - multiuser text mode
5 - multiuser graphical mode
6 - reboot
修改預設模式:vi /etc/inittab
##id:"Runlevel代碼":initdefault:
##例如:
id:5:initdefault:



兩相比較,Ubuntu11.04後的版本,不但少了文字多工模式,代碼也與傳統的有了差異,要稍注意。

參考網頁:



2016年6月17日 星期五

Linux檔案系統說明

安裝Linux時,不外乎有一堆檔案系統型態供選擇,而Linux16.04可支援的型態有ext, ext2, ext3, ext4, hpfs, iso9660, JFS, minix, msdos, ncpfs nfs, ntfs, proc, Reiserfs, smb, sysv, umsdos, vfat, XFS

目前較推荐且常用的為ext4以及XFS,它們可支援較大的檔案及儲存空間、有提供jounaling日記的功能、依舊被好好的維護著。
圖片來源:Ubuntu Document

Jounaling功能確保儲存資料時更加地可靠,Jounaling不能保證儲存時,資料一定不會損毀,但是卻可以「避免資料儲存過程發生不一致導致系統的崩壞」以及「加快檔案系統存取的速度」,當資料存取出錯時,系統將會錯誤紀錄下來並Pass過去,避免一再的錯誤讀取。

其他檔案系統型態說明:

  • hpfs:支援OS/2系統,2005停止銷售,已列為古董。
  • iso9660:光碟機檔案系統。
  • minix:支援Minix迷你版類Unix系統,現仍開發中。
  • modos:就是很傳奇很傳奇的DOS使用的檔案系統型態。
  • ncpfs:支援NCP協定的網路檔案系統,用於Novell系統。
  • nfs:網路檔案系統,透過虛擬磁碟讀取遠端電腦。
  • Proc:被預設為虛假的裝置,當我們掛載時,用以作為跟kernel溝通的介面,也就是/dev底下預設的那些資料夾名稱。
  • smb:支援smb協定的網路檔案系統。
  • sysv:an implementation of the SystemV/Coherent file system for Linux. It implements all of Xenix FS, SystemV/386 FS, and Coherent FS.
  • umsdos:Linux所使用的延伸DOS檔案系統。





參考網頁:

2016年6月13日 星期一

查看目前Apache有多少程序數

ps aux | grep apache | wc -l

ps aux => 顯示目前電腦執行的程序
wc -l => 計算有幾列
程序數的設定關乎於/etc/apache2/apache2.conf內容

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>


2016年6月10日 星期五

在E-mail標題使用UTF8字元,解決信件標題亂碼的情形

一般而言,當我們在寄信的時候,如果都採用English或是ASCII範圍的內文字寄送時,收到信件的人皆可正確地閱讀信件內容及標題。但是隨著國際化的普及,ASCII的編碼已經不能應付各國多文字的需求,於是漸漸改採用UTF-8編碼格式。

然而,寄送信件的服務,似乎沒有跟上這樣的改變,嚴格來說,各國SMTP服務預設都會採用各國的編碼,所以一旦輸入了中文的難字或特殊字、或是寄信給其他國家時,亂碼的情形就會發生。

好在,我們可以指定信件內文(body)的編碼格式,這必須輸入在信件的表頭(eamil header)中,指定的格式類似像:
Content-Type: text/plain; charset=utf-8

可是,這樣的設定並不更改標題的編碼,因為標題的編碼是獨立的,且其編碼預設為ASCII碼。好在,RFC 1342亦提供了更改的方法,只要遵照其格式以可以修正其編碼,其格式像是:
=?charset?encoding?encoded-text?=

說真的,這樣的格式還滿奇怪的,左右兩個"=",然後藉由"?"把要設定的參數隔開,倘若把這樣的東東再加到PHP程式中,鐵定有看沒有懂。
第1個參數:charset,就是要採用的編碼,當然若要字元能正常顯示,就要採用UTF-8萬國碼
第2個參數:encoding,通常我們會輸入B或Q,這樣的意義是讓信件再用Base64編碼過後傳遞,至於為何/什麼是Base64編碼,簡言之,就是將信件內容不管是文字、影像、影音、其他附加檔案等等....都經過編碼後再傳遞,收到的人自動在解碼還原。聽不懂嗎?那再換句話說就是:「採用Base64編碼技術的話,信件才能寄送文字以外的檔案格式。」
第3個參數:就是要編碼的標題文字為何?但既然第2個參數已經採用Base64編碼,那我們當然也要把輸入的中文利用php函式編碼轉換。

所以我們的寫法會像是:
=?UTF-8?B?".base64_encode('主旨')."?=

針對上面的說明,我們可以簡單的設計一個寄送信件的PHP程式

<?php
$to = " recipient@example.com “; //收件者
$subject = "=?UTF-8?B?".base64_encode(‘信件標題‘)."?=";    //信件標題,解決亂碼問題
$msg = “信件內容“; //信件內容
$header = "'From: example@example.com'."\r\n"
.'Content-Type: text/plain; charset=utf-8'."\r\n";
if(mail($to, $subject, $msg, $header)){
echo “信件已經發送成功。“;//寄信成功就會顯示的提示訊息
}else{
echo “信件發送失敗!“;//寄信失敗顯示的錯誤訊息
}
?>


參考網頁:

2016年6月4日 星期六

Win7輸入法語言列消失修復

學校有一批Win7電腦,遇到一些怪現象,像是語言列會消失不見,重新開機後有時會出現,有時不管怎麼開都還是看不到輸入法語言列,造成無法輸入中文。

另外,電腦關機後,竟然還會不斷DHCP Server送出封包要資料,Active HostName出現dash的名稱。還沒想到是怎麼造成,似乎也沒造成什麼影響,但就是覺得很討厭、很煩。

先說說輸入法語言列消失不見的問題吧,似乎被動地執行ctfmon.exe指令就可以解決。


但是要老師手動輸入ctfmon.exe,有時也顯得麻煩,且偶爾仍舊會發生輸入法語言列無法出現的情形,那就要改是第二種方法,直接寫入Regedit登錄碼,讓電腦開機就直接開啟輸入法語言列。

1.點選開始功能表,在「開始搜尋」的輸入框中輸入"regedit"並執行,找到以下編碼:
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run"

在右邊欄位點選右鍵新增字串值"ctfmon",並且修改這個字串值的數值資料為 "C:\Windows\system32\ctfmon.exe",關閉後重新啟動電腦或重新登入,語言列就會正常出現了。




在Blogger上顯示Code碼區塊

為了讓自己的Blogger可以顯示程式碼以方便閱讀及複製,可以在範本中增加CSS的樣式
操左步驟如下
「範本」→「自訂」→「進階」→「新增CSS」→貼上CODE碼→套用至網誌



以下就是要貼上的內容
CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; line-height: 1.2em; }


再來剩下最後一哩路,那就是怎麼使用了,其實也很簡單,凡是遇到要輸入程式碼的時候
,請切換到HTML模式下,在頭尾的地方分別加上<CODE>及</CODE>,把程式碼包起來即可。


顯示結果如下
參考網頁:

2016年5月31日 星期二

在Ubuntu下建立RAMdisk,以加快網頁讀取速度

RAM的中文名稱叫做隨機存取記憶體,俗稱記憶體,有著存取速度快速,當電腦重新開機後記憶體內資料清空的特性。根據這樣的特性,RAMDisk的技術就是把記憶體儲存空間,拿來做硬碟空間使用。(換句話說:本來應該存在電腦硬碟上的資料,卻改存在記憶體中)。 優點當然是:運算速度飛快。
缺點則是:
1.必須使用64位元的OS,才能使用超過4G的記憶體
2.因為是拿記憶體空間作為儲存用,重新開機或電腦當機的話,資料就會消失不見,所以如果只是為了體驗高速的快感,拿來玩玩即可,但千萬不可以儲存重要資料。
3.記憶體品質不佳時,則有可能會發生資料缺漏或儲存錯誤的狀況。(推薦使用ECC記憶體教完穩定)

針對以上的認知與了解後,接下來的實例是在一台提供Apache以及PHP服務的機器上所做的規劃。
當瀏覽者連線讀取我們的伺服器時,會在伺服器端生成Session資料以記錄瀏覽者的私密資料,而這些Session資料預設狀態下是儲存在硬碟空間,但倘使該伺服器的使用者很多時,多少會有Session交換不及的情形,所以我們的做法是把Session改存到記憶體中,反正如果伺服器重新開機或當機,Session本來就應該被清空。

作法:
1.首先,我們先建立Ramdisk的實體路徑,譬如在home底下建立ramdisk資料夾
mkdir /home/ramdisk

2.修改fstab配置,讓/home/ramdisk配置在記憶體而不是硬碟,重要的關鍵字就是「tmpfs」,size大小可以隨自己需求編配,gid=33、uid=33則是Ubuntu系統預設的Apache群組與使用者。
vi /etc/fstab
tmpfs /home/ramdisk tmpfs size=64m,gid=33,uid=33,mode=1755,noexec 0 0

3.再來就是指定session儲存路徑,把他只到我們剛剛設定的RAMDisk路徑
vi /etc/php5/apache2/php.ini
session.save_path = "/home/ramdisk"
4.重啟Apache,php.ini的設定值才會生效
service apache2 restart

5.重啟機器,fstab的設定才會生效


此外,因為我們的伺服器幾乎不關機的,所以Session雖然被寫入到/home/ramdisk,但是卻有可能不會被清除掉,所以我們也可以寫一段script,然後設定排程,定期清除session資料


1.script內容為

#!/bin/bash
/bin/umount
/home/ramdisk/bin/mount
/home/ramdisk

2.設定每天凌晨清除session資料

輸入crontab -e
00 3 * * * /root/ram_mm.txt > /dev/null

啊~會不會有人在凌晨3點讀取我的伺服器卻被踢出呢?嗯~沒錯是有可能,但是這麼晚了應該趕快去睡覺,而不是守在電腦前吧~~科科


參考網頁:

安裝Ubuntu16.04 server中文版,出現無法安裝busybox-initramfs的錯誤

安裝Ubuntu16.04 server中文版的過程中,會跳出『無法安裝busybox-initramfs』的錯誤訊息。


有兩個解決辦法:
方法一:是安裝的過程中選用English進行安裝。

但若不想安裝英文版,執意要安裝中文版時,就得按以下方法處理
方法二:
1.是安裝過程中選定中文語系後,按Ctrl + Alt + F2 進入tty2終端機模式

2.然後輸入以下的訊息,排除鎖定的檔案
while true; do rm /var/run/chroot-setup.lock; sleep 1; done

3.執行上述指令後,不用管畫面顯示或持續回應的訊息,再切回Ctrl + Alt + F1 ,繼續進行系統安裝,就不會再出現錯誤訊息了。


參考網頁:



2016年4月27日 星期三

ZyXEL WAC6103D-I 的DCS動態頻道選擇功能

把縣府配發的ZyXEL Reset後,會發現2.4G 的channel預設為6、5G的Channel預設為36,若校內沒有其他太多的AP的話,是沒什麼差別;反之,則會造成頻道互相干擾,甚至連不上無線網路的情況。

建議的方式,可以手動將鄰近AP的頻道區隔開來。
但是這樣的方式仍舊很難避免學校附近的住家的AP頻道干擾,所以偷懶一點的方式,則可以利用
ZyXEL WAC6103D-I的DCS (Dynamic Channel Selection) 動態頻道選擇的功能,讓智慧的AP,智慧的偵測自動錯開頻道。



設定完2.4G後改設定5G的頻道




2016年3月23日 星期三

Excel VBA插入圖檔程式碼

■程式碼: 
 Sub 插入圖檔() 
 Dim uR As Range, uFile$, Row&, uShp As Shape 
 With ActiveSheet.Pictures 
   If .Count > 0 Then .Delete 
 End With 
 '↑刪除原有圖片   
 For Row = 2 To 999 
   Set uR = Range("C" & Row) 
   If uR = "" Or uR(1, 7) = "" Then GoTo 101 
   uFile = "D:\image\" & uR & "_W" & uR(1, 7) & ".JPG" 
   If Dir(uFile) = "" Then uFile = "D:\image\" & [A2] & ".jpg" 
   Set uR = uR(1, 9) 
   <插入圖檔.方法1>   
   With ActiveSheet.Pictures.Insert(uFile) 
     .Top = uR.Top 
     .Left = uR.Left 
     .Width = uR.Width 
     .Height = uR.Height 
     .Placement = xlMoveAndSize 
     .PrintObject = True 
   End With 
   <插入圖檔.方法2>取消以檔案連結方式插圖  
   Set uShp = ActiveSheet.Shapes.AddPicture(uFile, False, True, _ 
        uR.Left, uR.Top, uR.Width, uR.Height) 
   With uShp 
      .Placement = xlMoveAndSize 
      .ControlFormat.PrintObject = True 
   End With 
 101: Next 
 End Sub 


2016年3月20日 星期日

EXCEL VBA將戶政資料重新整理

因應彰化區國小編班寫了Excel VBA程式,好方便註冊組長整理資料
檔案按此下載

以下是程式碼的部分

Sub 戶政資料重整()


'
' 戶政資料重整 巨集
' 戶政資料重整
' 快速鍵: Ctrl+Shift+a
'
    Dim i As Integer
'
' 先刪除重整表資料
    Sheets("重整表").Select
    lastrow2 = Sheets("重整表").UsedRange.Rows.Count
'   MsgBox (lastrow2)
    Rows("2:" & lastrow2).Delete Shift:=xlUp

 
 
 '再將戶政資料重整
    Sheets("戶政表").Select
    lastrow = Sheets("戶政表").UsedRange.Rows.Count
    lastrow = (lastrow - 1) / 4
    'MsgBox (lastrow)
    j = 2
    For i = 1 To lastrow
 
            Range("A" & j & ":H" & j + 1).Copy
            Sheets("重整表").Range("A" & i).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            Range("A" & j + 2 & ":H" & j + 3).Copy
            Sheets("重整表").Range("I" & i).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
        j = j + 4
    Next i
 
 '清除複製資料
    Application.CutCopyMode = False
 
End Sub

Sub 全形數字2半形()
'
' 全形數字2半形 巨集
' 取代全形數字to半形
'
' 快速鍵: Ctrl+Shift+b
'
    Worksheets("重整表").Select
    Columns("P:P").Select
    Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="1", Replacement:="1", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="2", Replacement:="2", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="3", Replacement:="3", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="4", Replacement:="4", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="5", Replacement:="5", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="6", Replacement:="6", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="7", Replacement:="7", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="8", Replacement:="8", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="9", Replacement:="9", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="0", Replacement:="0", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub

Sub 重整表2新生表2編班繳交表()
'
' 重整表2新生表 巨集
' 重整表2新生表,增加函數
'
' 快速鍵: Ctrl+Shift+c

' 先刪除新生表資料

    Sheets("新生表").Select
    lastrow_newstu = Sheets("新生表").UsedRange.Rows.Count
'   MsgBox (lastrow2)
    If lastrow_newstu > 1 Then
        Rows("2:" & lastrow_newstu).Delete Shift:=xlUp
    '    Selection.Delete Shift:=xlUp
    End If

'判斷重整表有多少筆資料
    lastrow = Sheets("重整表").UsedRange.Rows.Count
    Sheets("新生表").Select
'   MsgBox (lastrow)

 '新增擷取姓名函數
    Range("B2") = "=IF(ISBLANK(重整表!C2),"""",重整表!C2)"
    Range("B2").Copy
    Range("B3:B" & lastrow).Select
    ActiveSheet.Paste
 '新增擷取性別函數
    Range("C2") = "=IF(ISBLANK(重整表!J2),"""",IF(重整表!J2=""男"",1,IF(重整表!J2=""女"",2)))"
    Range("C2").Copy
    Range("C3:C" & lastrow).Select
    ActiveSheet.Paste
 '新增擷取班級函數
    Range("E2") = "=IF(ISERROR(VLOOKUP($B2,IF({1,0},編班結果表!$E$4:$E$303,編班結果表!$B$4:$B$303),2,)),"""",VLOOKUP($B2,IF({1,0},編班結果表!$E$4:$E$303,編班結果表!$B$4:$B$303),2,))"
    Range("E2").Copy
    Range("E3:E" & lastrow).Select
    ActiveSheet.Paste
 '新增擷取座號函數
    Range("F2") = "=IF(ISERROR(VLOOKUP($B2,IF({1,0},編班結果表!$E$4:$F$303,編班結果表!$C$4:$C$303),2,FALSE)),"""",VLOOKUP($B2,IF({1,0},編班結果表!$E$4:$F$303,編班結果表!$C$4:$C$303),2,FALSE))"
    Range("F2").Copy
    Range("F3:F" & lastrow).Select
    ActiveSheet.Paste
 '新增擷取生日(西元)函數
    Range("G2") = "=IF(SEARCH(""/"",重整表!E2)=3,LEFT(重整表!E2,2)+1911&MID(重整表!E2,3,8),LEFT(重整表!E2,3)+1911&MID(重整表!E2,4,8))"
    Range("G2").Copy
    Range("G3:G" & lastrow).Select
    ActiveSheet.Paste
 '新增擷取身分證字號函數
    Range("H2") = "=IF(ISBLANK(重整表!D2),"""",重整表!D2)"
    Range("H2").Copy
    Range("H3:H" & lastrow).Select
    ActiveSheet.Paste
 '新增擷取父親姓名函數
    Range("I2") = "=IF(ISBLANK(重整表!K2),"""",重整表!K2)"
    Range("I2").Copy
    Range("I3:I" & lastrow).Select
    ActiveSheet.Paste
 '新增擷取母親姓名函數
    Range("J2") = "=IF(ISBLANK(重整表!L2),"""",重整表!L2)"
    Range("J2").Copy
    Range("J3:J" & lastrow).Select
    ActiveSheet.Paste
 '新增擷取住址(不含縣市?鎮)函數
    Range("M2") = "=IF(ISBLANK(重整表!P2),"""",重整表!P2)"
    Range("M2").Copy
    Range("M3:M" & lastrow).Select
    ActiveSheet.Paste
 '新增擷取戶籍遷入日期(西元)函數
    Range("P2") = "=IF(SEARCH(""/"",重整表!F2)=3,LEFT(重整表!F2,2)+1911&MID(重整表!F2,3,8),LEFT(重整表!F2,3)+1911&MID(重整表!F2,4,8))"
    Range("P2").Copy
    Range("P3:P" & lastrow).Select
    ActiveSheet.Paste
 
 
 
 
 '重整表2編班繳交表
 '以下的巨集是針對編班繳交表做整理
    Sheets("編班繳交表").Select

 ' 先刪除新生表資料

    Sheets("編班繳交表").Select
    lastrow_randomstu = Sheets("編班繳交表").UsedRange.Rows.Count
    If lastrow_randomstu > 3 Then
        Rows("4:" & lastrow_randomstu).Delete Shift:=xlUp
    End If

 '新增編班表總人數
    Range("F1") = lastrow - 1

 '新增擷取編班繳交表的性別函數
    Range("D4") = "=IF(ISBLANK(重整表!J2),"""",IF(重整表!J2=""男"",1,IF(重整表!J2=""女"",2)))"
    Range("D4").Copy
    Range("D5:D" & lastrow + 2).Select
    ActiveSheet.Paste
 '新增擷取編班繳交表的姓名函數
    Range("E4") = "=IF(ISBLANK(重整表!C2),"""",重整表!C2)"
    Range("E4").Copy
    Range("E5:E" & lastrow + 2).Select
    ActiveSheet.Paste
 '新增擷取編班繳交表的身分證字號函數
    Range("F4") = "=IF(ISBLANK(重整表!D2),"""",重整表!D2)"
    Range("F4").Copy
    Range("F5:F" & lastrow + 2).Select
    ActiveSheet.Paste
 
    Application.CutCopyMode = False
    Range("A1").Select
    'Sheets("編班繳交表").Range("A1").Select

End Sub
相關網頁連結:大成校務資訊系統公告平台

2016年2月24日 星期三

Use of undefined constant 問題

PHP程式在執行時出現 Use of undefined constant的問題。例如下圖所顯示:



但是若當PHP網頁拉到最下面時,網頁卻依舊可正常顯示。
看來這個程式存在著許多的變數為定義的狀況。

原來在PHP5.3以前,程式允許以$_SERVER[SCRIPT_FILENAME]這樣的方式編寫
但是
PHP5.4以後就必須改寫成$_SERVER['SCRIPT_FILENAME']
若是編寫程式的習慣較鬆散,許多的程式可能都會出現上面的錯誤
若是要一段一段慢慢地修正
卻也傷神


其實只要將php.ini中的error_reporting中加入 ~E_NOTICE(運行時提醒,這些經常是是你的代碼的bug引起的;~的意思是排除的意思)
例如:
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
然後再重新啟動apache2

另外再有問題的文件第一行加上
error_reporting(0); 
也可以解決問題

參考網頁:

2016年2月22日 星期一

Google找不到學校網站

近日將學校網頁及首頁網址修改了,等到正式上線時,才發現Google竟然搜尋不到自己學校的網站(只有Google喔)。
心中著實納悶,Google不是有很多厲害的網路蜘蛛嗎?怎麼可能找不到,這樣的情形持續好幾天,依舊沒有任何進展與改變。

後來參考了耘想科技網頁,主動到Google登陸網頁,以及利用site:www.dches.chc.edu.tw檢查網站是否已經被Google收錄,都無法正確出現。

最後利用www.google.com/webmasters/,向Google索取網站的索引與排名時,才發現Google對本校的連線是逾時的。檢查防火牆才發現原來誤將Google給設定為黑名單中,造成網路蜘蛛無法進入學校網站,所以所有的驗證資料都無法使用。當利用Google搜尋時,就無法找到學校的網站了。

結論是:防火牆規則的設定要很小心,另外自己如果本身是網站管理者(主機擁有者),想要被Google可以搜尋到,利用www.google.com/webmasters/,是非常方便且即時的。因為索引資料是馬上寫入Google的搜尋資料庫中。




2016年1月4日 星期一

win7網路芳鄰無法登入,錯誤碼0x80070035

Win7 網路芳鄰無法登入,出現錯誤訊息及錯誤碼0x80070035,如下圖所見


解決方法:

1.從命令列:按一下「開始」,在「開始搜尋」方塊中輸入gpedit.msc 然後按下ENTER,開啟「本機群組原則編輯器」。



2.依序點選開啟「電腦設定」--> Windows設定 --> 安全性設定 --> 本機原則  --> 安全性選項。
找到右側欄
(1)「帳戶:Administrator帳戶狀態」,改成「啟用
(2)「帳戶:限制使用空白密碼的本機帳戶僅能登入到主控台」,改成「停用


3.類似下圖的結果,就可登入網芳了