2016年9月8日 星期四

【Linux】Linux command - find, grep


find 指令

我們想查找路徑裡有什麼檔案,檔案名稱是什麼時
就會用到 find 指令

基本用法:
find "資料夾" -name "*.副檔案名"

例子:
find "/home/nightsnow" -name "*.php"

上面這個例子的意思是
把在 /home/nightsnow 路徑裡有的 php 檔案的名字都顯示出來


grep 指令

grep 指令是搜尋檔案內容


find + grep 指令

通常當我們需要搜尋內容出現在哪個檔案時
很常會用到 find + grep 指令

基本用法:
find "資料夾" -name "*.副檔案名" -exec grep "目標" {} \;

例子:
find "/home/nightsnow" -name "*.php" exec grep "welcome" {} \;

上面的例子就是要找出在 /home/nightsnow 路徑內 含有 welcome 字元的 php 檔案


另外在 grep 中有幾個命令參數是比較常用的
-m = 只顯示多少 rows (有時候可能有很多檔案會含有你所搜尋的字元,這樣會顯示超多的檔案,用了 -m 就可以 limit line 了喔)
-n = 顯示檔案內符合指定樣式的 line number
-H = 顯示檔案名稱

例子:
find "/home/nightsnow" -name "*.php" exec grep -m 10 -n -H "welcome" {} \;




2016年9月7日 星期三

【Laravel】基礎入門 (1) - Routing

使用 Laravel, 不得不提及的一定就是 Routing 了
個人認為學 Laravel 最最最最重要的第一步就是 Routing

Routing 機制是決定如何處理 request 的重要角色
現在我們來了解一下 Laravel 的 Routing 機制吧

在我們建立 Laravel 專案後,會看到專案內長這個樣子


好多資料夾和檔案的!!
然後我們需要用到的 route.php 就在 app/Http 裡


--------------------------------------
【基本路由】

打開 route.php , 我們可以看到 Laravel 已經有個簡單易懂的例子


這個例子的意思是
假設我們的網頁連結設成 website.com
那麼我們只要在瀏覽器輸入 website.com
就會顯示 Laravel 預設的歡迎畫面


假如我們想歡迎畫面設定成 website.com/welcome
然後想在 / print out "Hello World!" 這句
那只需要把 / 的 view 改成 return "Hello World!"; , 另外再加一個 /welcome 的 route 就可以了!
Route::get ( '/'function () {
return "HelloWorld";
} );
Route::get ( '/welcome'function () {
return view ( 'welcome' );
} );
view('welcome') 指的是讀取在 resources/views 裡 welcome.blade.php 這個檔案
如果想普通的讀取 php, html 檔案
就在 route.php 的最開頭加上
return View::addExtension(‘html’,’php’);
然後
Route::get ( '/index'function () { return File::get(public_path().’/pages/index.html’);} );
public_path() 指的是讀取 public 路徑

如果我們想網站只能以HTTPS進入
Route::get('/'array('https'function()
{
return 'Must be over HTTPS';
}));
這樣我們就只能 https://website.com 進入了,不然就會顯示 Must be over HTTPS

Route 的 method 除了我們熟悉的 GET 和 POST 外
還有以下很多種的
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);

Route::options($uri, $callback);

--------------------------------------
【透過URL傳遞參數】

假設我們開了 user.php ,裡面我們只是 echo $_GET['name'];
然後使用傳統的PHP GET去傳遞參數,我們的連結會長這樣
http://website.com/user.php?name=nightsnow
很長很不優美,被 user 都知道你用了什麼參數

而使用laravel的route功能,我們只需要
Route::get ('user/{name}'function ($name){
return "User ". $name;
});

加入這個在 route.php 後,在瀏覽器輸入 http://website.com/user/nightsnow
得出的結果就會是 User nightsnow 了!
連結會變得簡潔,而且 user 也不會知道我們的參數名稱

如果這個參數是選擇性的,可填可不填的
我們只需要在參數名稱後加 "?" ,例子如下
Route::get ('user/name/{name?}'function ($name = 'nightsnow'){
return "User". $name;
});


以上例子是給了一個 default 值給 $name
假如user真的沒傳參數過來時
$name 就等於 nightsnow 了

--------------------------------------
【為參數定義Regular Expression(正規表示式)】

為參數定義 Regular Expression, 需要使用 where 指令
Route::get ( 'user/{id}/{name?}'function ($id = 1, $name = "no name") {
return "User " .$id. " = " .$name;
} )->where(array('id' => '[0-9]+','name'=> '[A-Za-z]+'));

在這個例子中,意思就是 id 只能是數字,name 只能是英文字

除了定義指家路徑的 Regular Expression 外, 我們還可以定義全域的
例如很多 Route 都會用到 id 這個參數
而所有的 id 都只能是數字時
我們可以使用 pattern 指令
Route::pattern('id''[0-9]+');
這樣就不必在每個 Route 裡使用 where 來定義 Regular Expression 了!!

--------------------------------------
【為 Route 命名】

為 Route 命名,能方便我們管理,方便做 Redirect 等各項操作
使用 as 來命名
Route::get ( 'user/{id}/profile', [ 'as' => 'profile',function () {
return 'profile';
} ] );
除了 as 外還可以使用 name 的
Route::get('user/{id}/profile’, 'UserController@showProfile')->name('profile');
controller 會在之後的文章再說明~

--------------------------------------
【Redirect 重新導向】

在進行 redirect 之前,我們要先把 Route 命名
例如我們有 beforeRedirect 和 afterRedirect 的 Route
Route::get ( 'beforeRedirect', [ 'as' => 'beforeRedirect',function () {
return redirect()->route('afterRedirect');
} ] );
Route::get ('afterRedirect', ['as' => 'afterRedirect', function (){
return "redirect success";
}]);

然後 redirect() 就是重新導向嚕~
上述例子中,如果在瀏覽器輸入並前往 http://website.com/beforeRedirect
那麼他將會重新導向至 http://website.com/afterRedirect 
如果在畫面上出現 redirect success 這一句,就證明我們成功了!

假如我們 redirect 時需要傳遞參數
我們用命名的 profile route 來做例子
redirect()->route(‘profile’, [‘id’=>1]);
這樣就是 redirect 到 profile route 以及傳遞 id 這個參數了!

--------------------------------------
【Route::group】

當有很多重覆開頭的 Route 時,我們可以用 Route::group 把他們包起來~
例如我們可能會有 user/{id}/profile, user/{id}/name 等等重覆了 user/{id} 的 Route
這時候我們就可以把重覆了的 user/{id} 抽出來放在 prefix 裡
然後用 Route::group 把剩下的包起來
Route::group(['prefix' => 'user/{id}'], function () {
Route::get('name'function ($id) {
echo "name  id = ".$id;
});
Route::get('profile'function ($id) {
echo "profile";
});
});

2016年4月17日 星期日

【iOS】iOS Device Resolution


現在是 iPhone 的款式比以前多了很多
screen size 和 resolution 也比以前多了
寫 iOS app 的你可能會遇上一個問題
什麼圖適合在什麼 device 上呢?
現在 iPhone 的圖暫時分了 @1x, @2x, @3x

不要以為 screen size 越大 resolution 就越高!
這個觀念是錯的喔~
現時最高 resolution 的 device 是 iPhone Plus喔~

iPad 也只是用 @2x 的圖~~

如果想在不同 device 都有高畫質的圖
最好的方法是 provide 3 張圖,用同一名稱,但後面要記得加 @#x
size 的計法也只是 2 倍,3 倍這樣的~

例子:
假設我們有張 100x100 的 image.jpg
那我們的3張圖就分別是...
image.jpg 100x100
image@2x.jpg 200x200
image@3x.jpg 300x300

然後把圖同放進 Xcode Project 裡,Xcode會自動 detect 用家 device 是用什麼圖的~

至於正確的 size 嘛,就提供下圖給大家慢慢觀摩了!!





2016年3月8日 星期二

【Linux】Linux command - crontab

crontab 是一個很常用, 很容易理解而且很實用的指令, 大部份 crontab 都是用在伺服器上, 例如想定時給資料庫弄個備份, 就會使用到 crontab 了!
簡單來說, crontab 就是工作排程, 讓你定好在什麼時間做什麼事情~
當設定好 crontab 後, 他就會永遠在你設定的時間上執行指令嚕~

安全性:
首先要設定哪些使用者帳號可以使用 crontab 指令
/etc/cron.allow 設定在這檔案裡的使用者帳號才能使用 crontab
/etc/cron.deny 設定在這檔案的使用者帳號不能使用 crontab 
(一列只可以填寫一個使用者帳號啊) 
 格式:
代表意義 分鐘 小時 日期 月份 指令
數字範圍 0-59 0-23 1-31 1-12 0-7 就是指令咧
 過程:
使用 crontab -e 指令後, 會打開 nano 或 vim 的
在裡面一列代表一個工作, 所以記得每次都開新一列喔~
舉個例子來說會比較容易明白~ 假設現在有個用家叫 Bob, 他想每天的下午 3 點和 9 點都寄一封 email 給 Mary, 很簡單的, Bob 輸入 crontab -e 指令後, 在裡面開新一列, 輸入 0 3,9 * * * mail Mary -s "This is a subject"
不同的符號有不同的意思喔

  • " , " = and, 與的意思
  • " - " = range, 一個範圍的意思, 例如每天的 8 點至 12 點 20 分進行一項工作
20 8-12 * * * command

  • " * " = all, 全部的意思
  • " */n " = n 是數字, 代表每隔 n 單位做一次, 例如每 5 分鐘做一項工作
*/5 * * * * command
 
當用家設定完 crontab 後, 工作就會放到 /var/spool/cron 裡面, 以帳號做尾, 也就是以上面 Bob 的例子來說, 工作會紀錄到 /var/spool/cron/bob 裡面 


 
 

【Vagrant】簡單介紹 Vagrant

Vagrant 可以在這裡下載:https://www.vagrantup.com/downloads.html

Vagrant 是一個中間層技術, 一個 virtual box, 是 VMWare 等等的上一層
簡單來說就是 command-line 模式的 Virtual box

Vagrant 提供可配置, 可再生, 便攜的工作環境, 它可以統一團隊工作人員的開發環境
如果伙伴創建了 Vagrantfile, 我們可以通過 Vagrantfile 來初始化開發環境
避免了 "在我的機器上是可以的"

建立 Vagrantfile:
mkdir my_vagrant
cd my_vagrant 
vagrant init
vagrant 的 image 叫 box
執行以上的指令後, 會產生一個本地 box
除了自己建立 box 之外, 我們可以到 vagrant cloud 尋找適合自己的 box 喔

啟動 vagrant:
vagrant up
啟動後可以使用 vagrant ssh 登錄 vagrant
目錄同步: 
默認將項目目錄與虛擬機中的 /vagrant 同步
查詢狀態:
vagrant status
目前處於什麼狀態 ( running / poweroff )
查詢 box 列表:
vagrant box list 
關閉虛擬機:
vagrant halt
重新啟動虛擬機:
vagrant reload

刪除虛擬機:
vagrant destroy
只是在 "虛擬機清單" 上除名, 實際上還在的喔~~
更新虛擬機:
vagrant box update
若更改了虛擬機的provision設定:
vagrant provision
 




2016年3月7日 星期一

【Laravel/Homestead】簡易快速安裝 Laravel - Homestead

Laravel 官方提供了 Homestead
(官方教學文 - https://laravel.com/docs/master/homestead)
Homestead 是一個 使用Ubuntu 的 VM, Laravel 已經為用家們預先安裝了 Laravel 所需要的環境及 Server, 例如 Nginx, MYSQL等等, 在 Windows 及 Mac OSX 上都能夠使用



前置工作:
在安裝 Laravel - Homestead 之前, 我們需要先依次安裝composer及Laravel:




(1) 使用 VM 就當然需要安裝 VM 軟件嚕



(2) 然後需要安裝 Vagrant
想了解什麼是 Vagrant? 請參考【Vagrant】簡單介紹 Vagrant

(3) 安裝完成後, 使用 vagrant 指令把 "laravel/homestead" 這個 box 安裝至 Vagrant     中
      (安裝這個挺花時間的喔~)
vagrant box add laravel/homestead 

(4) 使用 git 指令把 Homestead clone 下來
cd ~
git clone https://github.com/laravel/homestead.git Homestead
clone 下來後, Homestead 資料夾中會有一個 Vagrantfile 檔案, 基本上要執行 vagrant命令就是要透個這個檔案執行, 所以當我的要用 vagrant 指令時, 都要先進到這個目錄才能執行嚕~

(5) 新增 SSH 金鑰
ssh-keygen -t rsa -C "username@homestead"
      *不要忘記把 username  改成自己的使用者帳號喔*
      輸入了這個指令之後一直按 enter 就可以了

(6) 初始化 Homestead

  • 移至 Homestead 目錄
cd ~/Homestead 

  • 使用以下指令來建立 Homestead.yaml 設定檔案, 這個檔案將放置在 ~/.homestead 目錄裡 


bash init.sh
(7)  設定 Homestead
打開 Homestead.yaml (在finder裡按commad+shift+g, 輸入 ~/.homestead), 或直接在終端機輸入以下指令
vim ~/.homestead/Homestead.yaml
 在 Homestead.yaml 設定檔裡:

  • 設定提供者 (provider), 可以是 virtualbox, vmware_fusion, vmware_workstation
provider: virtualbox

  • 設定共享目錄, 設定後將同步更新本機環境與 Homestead 環境 (可設定多個共享環境) 


folders:
    - map: ~/Code
      to: /home/vagrant/Code

  •  設定 sites, sites 幫助我們可以輕易指定網域對應至 homestead 環境目錄中
sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public
* map 代表本機資料夾, to 代表 VM 資料夾* 
* sites 設定的 map 的值代表 homestead.app 網址, to 的值代表把 map 網址導致哪一個資料夾, 也就是我們在瀏覽器輸入 http://homestead.app, 瀏覽器會顯示 VM 的 /home/vagrant/Code/Laravel/public 網頁* 
 (8) 設定 hosts 檔案

我們需要在 hosts 檔案裡增加網域, 這個檔案會把我們的 Homestead 網站的請求重導至 Homestead 機器
Mac 的用家請到 /etc/hosts 尋找 hosts 檔案 (在 finder 裡按 command+shift+g, 輸入 /etc/hosts), 或使用 sudo vim /etc/hosts 指令直接在終端機修改
 Windows 的路徑是 C:\Windows\System32\drivers\etc\hosts
打開 hosts 檔案後, 請在最底增加以下一列  (不是使用終端機的用家, 建議先把檔案拖曳至桌面, 改動後再拖回去取代喔~)
192.168.10.10  homestead.app
*此 IP 必須與 Homestead.yaml 裡的 IP 相同*
(9) 啟動 Vagrant Box

  • 進入 Homestead 目錄
cd ~/Homestead 

  • 輸入以下指令
vagrant up 



  • 輸入後 Vagrant 會啟動虛擬主機並共享目錄, 輸入 vagrant status, 看到 running就代表你成功了!
(10) 新增 Laravel 專案
如果在新增 Homestead 後改動過 yaml 檔案的 sites 路徑設定, 你會發現該路徑空白一片, 這時候我們就要新增 Laravel 專案了!
composer create-project laravel/laravel project-name --dev-develop
把 project-name 改成自己想要的專案名稱 

完成以上 9 項設定後, 就可以造訪網站了!
http://homestead.app
看到有 Laravel 這個字就代表成功了!

******
備註:
如果沒有修改預設的 Homestead.yaml
那請在 /User/{user-name} 加入 Code 這個資料夾 (因為 Homestead.yaml 裡的預設共享目錄是設定在 Code 裡的)
弄好後再執行一次 vagrant up, 搞定!
******

~。~。~。Homestead 進階小知識~。~。~。

(1) vagrant 捷徑
剛剛提及過, vagrant 指令是透過 vagrantfile 而執行的, 所以每次要啟動 vagrant box 時, 都需要移至 vagrantfile 所在的目錄, 那如果想在不同目錄都能使用 vagrant 指令呢?只需要執行以下指令, 我們就可以在任何位置使用 vagrant 了!
alias homestead='function __homestead() { (cd ~/Homestead && vagrant $*); unset -f __homestead; }; __homestead' 
(2) 連接資料庫
Homestead  的資料庫設定了 MySQL 及 Postgres 兩種, 要從本機電腦做用Navicat 連接資料庫, 我們需要連接 127.0.0.1 的連接埠 33060 (MySQL) 或 54320 (Postgres)
帳號:homestead
密碼:secret 
(3) 使用 SSH 連接 Homestead
除了在終端機使用 vagrant ssh 之外, 我們可以使用 IDE (例如 Netbeans, Eclipse 等等) 來 SSH 進去
如何使用 Eclipse 遠端請參考: 
【Eclipse】遠端同步修改(RSE: Remote System Explorer)
host name 輸入 192.168.10.10
user id 輸入 vagrant
密碼是根據新增 SSH 金鑰時輸入的密碼, 如果沒有新增過 SSH 金鑰, 那預設的密碼就是 vagrant
(4) Homestead 的連接埠
  • SSH2222 轉發至 22
  • HTTP8000 轉發至 80
  • HTTPS44300 轉發至 443
  • MySQL33060 轉發至 3306
  • Postgres54320 轉發至 5432
(5) 一個 Homestead 只能新增一個網域嗎?如果我想把幾個網站放進去那怎辦?
一個 Homestead 能新增多個網域的啊~就打開 homestead.yaml 新增 folders 和 sites, 儲存後執行 vagrant provision 指令就可以了!




2016年3月6日 星期日

【Mac/Laravel】簡易快速安裝 Laravel

(1) 在安裝 Laravel 之前, 我們要先安裝 Composer
     Composer 的教學請看 【Mac/Composer】簡易快速安裝 Composer

(2) 安裝 Composer 後, 請確認 ~/.composer/vendor/bin 有沒有 laravel 及其相依性套件

(3) 然後把 ~/.composer/vendor/bin 放到 $PATH, 步驟如下
          
          (3.1) 打開 bash_profile
                   vim ~/.bash_profile

          (3.2) 打開後在最底加一列 ( {user-name}要改成自己的使用者名稱啊 )
                   export PATH=/Users/{user-name}/.composer/vendor/bin:$PATH

          (3.3) 儲存後令它立刻生效
                   source ~/.bash_profile

最後在任何位置嘗試輸入 laravel , 有反應就代表成功了!