2014年6月29日

php 日期比較

在看 code 的時候第一次看到有人使用下列的判斷式來判斷時間是否在區間內
<?php
if (date("Y-m-d H:i:s") >= "2014-06-29 00:00:00" 
    && date("Y-m-d H:i:s") <= "2014-06-29 23:59:59") {
    // 在活動時間內 做某些事
}

1. 兩個判斷式需要與現在時間進行判斷,卻呼叫兩次相同的 date function,有可能造成效能上的耗損,類似的情況如下面程式碼,每次迴圈執行 count 都會被執行,這個例子是在 $arr 不會因為迴圈而使得大小變動,那麼就不應該每次都執行。
<?php
$arr = rang(1,10000);
// bad
for ($i=0;$i<count($arr);$i++) {
    // do something
}
 
// good
$arrLength = count($arr);
for ($i=0;$i<$arrLength;$i++) {
    // do something
}
2. 雖然說在此,透過相同的時間字串格式進行字串比對達到判斷現在時間是否為活動進行時間是正確的,但是因為數字比對比字串比對來得更有效率,一般是將時間轉換成時間戳記後進行比較。

3. 在字串比較上,是一個一個字元進行比較,因為兩者的時間字串格式相同,加上數字在 ASCII 上的順序剛好等於數字大小順序。

4. 想要找出西元99年來讓此判斷失誤,查閱文件後發現 date 是有範圍限制的。

date function doc
http://php.net/manual/zh/function.date.php

初探 IL 藉由不同判斷寫法

在看別人的 code 時候發現對於布林變數判斷兩種不同的寫法

// 方法 1
using System;
class MainClass{
    public static void Main(){
        bool isOk = false;
        if (isOk) {
            // do something
        }
    }
}

// 方法 2
using System;
class MainClass{
    public static void Main(){
        bool isOk = false;
        if (Ok == true) {
            // do something
        }
    }
}

方法 1 是我常用的寫法,一直以來都是習慣這麼寫,對於方法 2 感覺似乎有點多餘,但不可否認,方法 2 的確是比較明顯。

想確認一下兩者寫法對於 IL 是否有任何差異。
c# 程式碼透過編譯器變成 IL(Intermediate Language) 然後在VM上面執行
於是我透過 Ildasm.exe (IL 反組譯工具) 將 exe 檔案進行反組譯看看裡面的 IL

結果如下

方法 1
.method public hidebysig static void  Main() cil managed
{
    .entrypoint
    // 程式碼大小       11 (0xb)
    .maxstack  1
    .locals init (bool V_0,
             bool V_1)
    IL_0000:  nop
    IL_0001:  ldc.i4.0
    IL_0002:  stloc.0
    IL_0003:  ldloc.0
    IL_0004:  stloc.1
    IL_0005:  ldloc.1
    IL_0006:  brtrue.s   IL_000a
 
    IL_0008:  nop
    IL_0009:  nop
    IL_000a:  ret
} // end of method MainClass::Main

方法 2
.method public hidebysig static void  Main() cil managed
{
    .entrypoint
    // 程式碼大小       11 (0xb)
    .maxstack  1
    .locals init (bool V_0,
             bool V_1)
    IL_0000:  nop
    IL_0001:  ldc.i4.0
    IL_0002:  stloc.0
    IL_0003:  ldloc.0
    IL_0004:  stloc.1
    IL_0005:  ldloc.1
    IL_0006:  brtrue.s   IL_000a
 
    IL_0008:  nop
    IL_0009:  nop
    IL_000a:  ret
} // end of method MainClass::Main
兩者沒有任何差異

Ilasm.exe (IL 組譯工具) 說明
http://msdn.microsoft.com/zh-tw/library/496e4ekx(v=vs.110).aspx

IL 範例說明
http://60-251-1-52.hinet-ip.hinet.net/taiwan/msdn/columns/DoNet/IL.htm

IL 說明
http://hi.baidu.com/fastlei/item/2cad855555b4f6444eff20fd

2014年6月14日

文字編輯器 Sublime Text Part 3 外掛介紹與安裝

很多人提供了自己寫的 Sublime Text 外掛
因為安裝太麻煩,所以有人就寫了一個外掛管理器 Package Control

Package Control 網站
https://sublime.wbond.net/
網站提供了一些不同選項的排名以及搜尋

安裝方式
到這邊 https://sublime.wbond.net/installation 找要輸入的指令
用 Ctrl + ` 打開主控台然後根據不同的 Sublime Text 版本複製指令貼上後按下 ENTER 送出

如何安裝其他的外掛?
1. 按下 Ctrl + Shift + P
2. 輸入 Package Control 會看到 Package Control 相關的選項 (此輸入框可以使用模糊搜尋,例如 pcip)
3. 選擇 Package Control:Install Package
4. 輸入你要安裝的外掛名稱按下 Enter 就會自動安裝了


目前我常用的外掛(依照使用的頻繁度排序)
IMESUPPORT - 用來解決中文輸入法選字介面不在打字浮標附近的問題
Alignment - 程式碼對齊 選取後 Ctrl + Alt + A / Cmd+Ctrl+A
WordHighlight - 因為修改 $導致不會選取
SFTP - 遠端同步編程
AutoFileName - 檔案路徑智慧提示
DocBlockr - 快速註解
All Autocomplete - 全部自動完成
BracketHighlighter - 括號{}高亮顯示(安裝後需設定參數)
SublimeCodeIntel - 智慧提示
SyncedSideBar - 側邊攔與tab頁籤同步
SublimeLinter - PHP 語法檢查
{
    "sublimelinter":"save-oly",
    "sublimelinter_popup_errors_on_save": true,
    "sublimelinter_fill_outlines": true,
    "sublimelimt_executable_map":
    {
        "php":"C:\\xampp\\php\\php.exe"
    }
}
JsFormat - JS格式化插件 Ctrl + Alt + F(需自行定義 keybinding)
Pretty JSON
ConvertToUTF8 - 可開啟 UTF8 以外檔案
Goto Documentation - 快速查看函數說明(需自行定義 keybinding)
ApacheConf.tmLanguage - 支援 .conf 語法顏色
INI - 支援 .ini 語法顏色
Change Tracker - 修改的足跡
Clipboard History - 剪貼簿記錄
AdvancedNewFile

註冊Window右鍵選單
我是使用打包版本,有時候會常用右鍵選單對文件指定我要用哪一個應用程式開啟
但是 Sublime Text 沒有註冊選單,所以我們可以使用下列的文字自訂選單
開啟純文字檔案後貼入以下文字,另存副檔名為 .reg 後,點兩下即可註冊
必須要注意以下文字有設定 Sublime Text 的執行檔位置,必須要先修改成你放的位置才可以正常
內容如下

Windows Registry Editor Version 5.00

; This will make it appear when you right click ON a folder
; The "Icon" line can be removed if you don't want the icon to appear
[HKEY_CLASSES_ROOT\Directory\shell\sublime]
@="Open Folder as Sublime Project"
"Icon"="\"C:\\Sublime Text 2.0.2 x64\\sublime_text.exe\",0"

[HKEY_CLASSES_ROOT\Directory\shell\sublime\command]
@="\"C:\\Sublime Text 2.0.2 x64\\sublime_text.exe\" \"%1\""

; This will make it appear when you right click INSIDE a folder
; The "Icon" line can be removed if you don't want the icon to appear

[HKEY_CLASSES_ROOT\Directory\Background\shell\sublime]
@="Open Folder as Sublime Project"
"Icon"="\"C:\\Sublime Text 2.0.2 x64\\sublime_text.exe\",0"

[HKEY_CLASSES_ROOT\Directory\Background\shell\sublime\command]
@="\"C:\\Sublime Text 2.0.2 x64\\sublime_text.exe\" \"%V\""

; Notepadd++ like open with Sublime Text 2.0.2 x64

[HKEY_CLASSES_ROOT\*\shell\Open with Sublime Text]
@="Open with Sublime Text"
"Icon"="\"C:\\Sublime Text 2.0.2 x64\\sublime_text.exe\",0"

[HKEY_CLASSES_ROOT\*\shell\Open with Sublime Text\command]
@="\"C:\\Sublime Text 2.0.2 x64\\sublime_text.exe\" \"%1\""

文字編輯器 Sublime Text Part 2 我常用的設定

1. 修改編輯器設定
使用選單列打開 Preferences\Settings-User,貼上以下文字
{
    "bold_folder_labels": true,
    "color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme",
    "default_line_ending": "unix",
    "detect_slow_plugins": false,
    "draw_minimap_border": true,
    "ensure_newline_at_eof_on_save": true,
    "file_exclude_patterns":
    [
        "*.bmp",
        "*.jpg",
        "*.png",
        "*.psd",
        "*.tga",
        "*.mp3",
        "*.wav",
        "*.ttf"
    ],
    "folder_exclude_patterns":
    [
        ".git",
        ".hg",
        ".svn"
    ],
    "font_face": "Inconsolata",
    "font_options":
    [
        "directwrite"
    ],
    "font_size": 11,
    "highlight_line": false,
    "ignored_packages":
    [
        "Vintage"
    ],
    "rulers":
    [
        120
    ],
    "tab_size": 4,
    "translate_tabs_to_spaces": true,
    "tree_animation_enabled": false,
    "trim_trailing_white_space_on_save": true,
    "use_tab_stops": true,
    "word_separators": "./\\()\"'-:,.;<>~!@#%^&*|+=[]{}`~?",
    "word_wrap": "true"
}

2. 修改快速鍵設定
使用選單列打開 Preferences\Key Bindings-User,貼上以下文字
[
    { "keys": ["ctrl+q"], "command": "toggle_comment", "args": { "block": false } },
    { "keys": ["ctrl+shift+q"], "command": "toggle_comment", "args": { "block": true } },
    { "keys": ["ctrl+shift+w"], "command": "close_all" },
    { "keys": ["alt+d"], "command": "open_dir", "args": {"dir": "$file_path", "file": "$file_name"} },
    { "keys": ["alt+h"], "command": "reindent", "args": {"single_line": false} },
    { "keys": ["alt+j"], "command": "js_format"},
    { "keys": ["ctrl+shift+r"], "command": "reveal_in_side_bar"}
]

可以看到在基本設定以及快速鍵設定都有 Default 與 User
Preferences\Settings-Default
Preferences\Settings-User
Preferences\Key Bindings-Default
Preferences\Key Bindings-User

1. 當編輯器進行升級的時候會直接覆蓋 Default 的檔案,所以不建議把設定設定在 Default 的檔案
2. 可以從 Default 的檔案看到有哪些數值可以進行調整,接下來在 User 的檔案進行設定覆寫,因為先載入 Defautl 後載入 User。

文字編輯器 Sublime Text Part 1 特色介紹


官方網站
http://www.sublimetext.com/

中文手冊網站
http://docs.sublimetext.tw/

特色
1. GoTo Anythiong
透過 Ctrl + P 呼叫出輸入框,輸入一部份的檔案名稱或者是利用@跳到某一個符號,利用:跳到某一行。

2. Command Palette
透過指令 Ctrl + Shift + P,可以呼叫出指令面板功能。

3. Split Editing
視窗分隔編輯,可以透過 View/Layout 來選擇不同的切割方式。

4. 客製化
快速鍵,選單,巨集,片段,自動完成等都可以透過簡單的 JSON 檔案進行設定。

5. Multiple Selections
透過 Ctrl + Shift + L 一次選取多行後再利用方向鍵移動可以一次編輯多行。
透過 Ctrl + D 選取一個字,連續的輸入可以同時選取相同的字進行修改,透過 Ctrl + K + Ctrl + D 可以跳過,使用 Ctrl + U 復原。
透過 Ctrl + D 選取一個字,再加上 Shift + F3 就可以馬上選取所有相同的字

6. Distraction Free Mode
F11 可以進入 Full Screen Mode (一般常見)。
Shift + F11 可以進入 Distraction Free Mode (專注於你所編輯的地方)。

7. Instant Project Switch
可以將多個不同路徑的資料夾拖曳進左側 Side Bar 並且將它們存成一個 project,方便後續進行操作。

8. Plugin API
可以利用 Python 來寫編輯器的外掛,並且提供交互式的主控台,可以利用 Ctrl + ` 呼叫主控台。

9. Cross Platform
可以在 OS X ,Windows 以及 Linux 的環境使用