顯示具有 程式設計 標籤的文章。 顯示所有文章
顯示具有 程式設計 標籤的文章。 顯示所有文章

2018/06/05

想逃離 Github 嗎?歡迎搬家到 Bitbucket

微軟買下 Github 之際,大家紛紛逃竄到 Gitlab 上,但是大家好像都忘記還有個不錯的服務叫做 Bitbucket



我個人會繼續留在 Github 的原因:

  • 多數開放程式碼、開發平台、CI/CD 服務,短期內不可能轉移到其他程式碼代管平台上
  • 微軟進幾年的作風已經大改,像是 VS code 都開放原始碼、支援 3rd-party plugin,並且支援跨平台。
  • .NET 也支援 Linux 了,雖然我想這有微軟的商業考量,對 Linux 使用者沒有壞處,因為若有更多工程師建立 Linux 專案,表示 Linux 使用者有更多可以選擇的解決方案 (即已要付費)。
  • 微軟知道自己以前的聲譽不好,現在不會笨到對 Github 毛手毛腳。就算有,Github 社群的壓力也會逼微軟放棄。
  • Gitlab 是一個不錯的服務,但是我不認為他有支撐大量負載的能力。當大家都把 open source project 搬過去時,可能會因為負載過高而發生問題。另外還有朋友提醒,Gitlab 之前把自己的 DB 砍掉,還有 live rescue
  • 個人蠻期待後續微軟會推出的整合服務

2018/05/24

PHP 7.1 的 Symmetric Array Destructuring

PHP 7.1 對 list() 語法做了一些調整,讓 list() 操作使用起來更簡便。

原本的 list() 語法:
list($a, $b) = [1, 2];
// $a = 1, $b = 2

在 7.1 以後可以使用陣列來表示:
[$a, $b] = [1, 2];

這個語法稱為 Symmetric Array Destructuring

有了這個 feature 以後,不用另外宣告暫存變數也可以對調變數 (swap):
[$b, $a] = [$a, $b];

2017/11/10

函式中參數順序的設計

最近在 refactor legacy code,遇到很尷尬的函式定義,笑也不是哭也不是。

函式會要求使用者傳入多個參數,有時並不是所有的參數都必須給值,函式的設計者會以大家較常使用的方式來當作參數的預設值,例如 PHP 裡面的「json_decode()」:
json_decode($json);  // consider as json_decode($json, false)

json_decode($json, true);  // 不使用預設值才手動傳數第二個參數


但這次遇到比較尷尬的是,legacy code 把第一個參數設計為 optional,也就是有預設值。但問題來了,在 PHP 的語法當中,呼叫函式無法在前幾個參數不給值:
getData( , 'some', 'option');  // syntax error

所以不管怎麼樣,都至少要給第一個參數:
getData(null, 'some', 'option');

所以把有預設值的參數放在前面其實根本沒有省下什麼時間呀 ... XD

2014/03/09

Google's Clean Code Talks

查資料時,無意間發現 Google 有一系列的演講,整理出如何撰寫乾淨、好維護、可以測試的程式碼。

影片有很多段,已查不到播放順序,請各位自己挑選了看。



2012/09/18

C 強制資料輸出

無意間發現透過 printf 輸出資料時,程式會將資料放在 buffer 中,過一段時間後再一起印出。
int main(){
   while(1){
      printf(".");
      sleep(1);
   }
   return 0;
}

可以透過 fflush() 強制將 buffer 中的資料輸出:
while(1){
   printf(".");
   fflush(stdout);
   sleep(1);
}

2012/07/25

製造無法閱讀的程式碼

前陣子某 geek 朋友過生日,所以想用程式給他一個小驚喜。原本打算送給他一個假的 patch,讓他在編譯時收到訊息,不過弄半天還是沒搞懂 #pragma 怎麼用,後來改用程式碼混淆的方式製作卡片。


步驟大概如下:
  1. 做卡片
  2. 轉成程式碼
  3. 製造大亂

2012/07/01

animate on jQuery

初學 jQuery 第一個感想就是 selector 非常好用,加上 effects 功能後,可以說是懶人的一大福音。

在 effects 中有看到 slide down / up,區塊會上下滑動,但沒看到左右滑動的,所以自己試著刻一個。

<style>
#box {
   width: 200px;
   display:  inline;
}
</style>

$('#box').animate(   {
      width: '0px',
      display: 'none'
   } , 'slow'  };

不過發現 box 不會消失,用開發人員工具去看 display 屬性沒有被改變。後來看了文件才發現是自己耍蠢。

jQuery 建立動畫特效的方式,是依照 duration 以及物件屬性的數字差,並在固定時間間隔對屬性的數值做遞增、遞減,是「數值」遞增、遞減,display 屬性值並非數字,所以 jQuery 沒辦法處理。


ps. 用了 jQuery 以後就不會寫 Javascript 了 .... Orz

2012/05/26

gitignore @ github

用 CodeIgniter 當 framework 時,搞不清楚 .gitignore 要怎麼寫比較好。

後來才知道 Github 上面有個 gitignore 專案,已經整理了不少預設設定檔供參考,從 C/C++、Java、Objective-C 到常用的程式架構如 Android、CodeIgniter、CakePHP、Wordpress 等,直接複製貼上就可以用了,非常方便。

github/gitignore
https://github.com/github/gitignore

2012/04/07

qmake to cmake


以 Qt Creator 預設的 GUI Appplication 為例:
zero@zero-desktop:~/dev$ tree example/
example/
|-- example.pro
|-- main.cpp
|-- mainwindow.cpp
|-- mainwindow.h
`-- mainwindow.ui

建立 CMakeLists.txt,先寫入最常用到的幾個設定:
project( example )
cmake_minimum_required(VERSION 2.6)

set( SRC main.cpp mainwindow.cpp )
set( HEADER mainwindow.h )

讓 cmake 先載入 Qt 會用到參數:
find_package( Qt4 REQUIRED )

加入 Qt 函式庫位置:
include( ${QT_USE_FILE} )
add_definitions( ${QT_DEFINITIONS} )

因為 Qt 在編譯前會先透過 moc、uic 等對程式做處理,將 SIGNAL/SLOT、ui 轉成程式碼再做編譯。Cmake 透過 wrapper 做設定:
set( FORM mainwindow.ui )

qt4_wrap_cpp( HEADER_MOC ${HEADER} )
qt4_wrap_ui( FORM_HEADER ${FORM} )

如果專案中有使用到 qrc 檔,則需加入:
qt4_add_resources( RESOURCES_RCC resource.qrc )

有時編譯位置與程式碼放置位置不同,編譯器會讀不到 moc 轉出來的程式碼,所以要將編譯位置加入:
include_directories( ${CMAKE_CURRENT_BINARY_DIR} )

最後,編譯設定:
add_executable( exe ${SRC} ${HEADER_MOC} ${FORM_HEADER} )
target_link_libraries( exe ${QT_LIBRARIES} )

2012/04/05

「Code Smart, Don't Code hard」by CrBoy




備註:CrBoy's Blog:「那些老師沒教的事」簡報釋出


其中印象最深刻的應該是傻傻的用 printf 除錯,如果只是一般型態還好,遇到物件等之資料型態用 printf 真會把自己搞死。

另外把壓縮檔塞進版本庫裡面也很經典!SVN 或是 git 等版本管理工具其中一大功能就是比對 code 的異動,程式碼壓縮後這些工具就沒辦法做比對。誇張的是有人還會好心的把 *.o、*.exe 一起打包 commit .... XD


ps. 用 cmake 好像還蠻威的!

SQLite 單引號處理

一般處理 SQL 查詢時,遇到單引號或雙引號都會加上反斜線做跳脫。不過字串是餵給 SQLite 時,處理單引號的方式不同,是將一個單引號改為二個。

例如:
select * from content where text like '%Zero's note%'

上述字串「Zero's note」中的單引號會造成查詢錯誤,所以將單引號修改後成為:
select * from content where text like '%Zero''s note%'


Reference:
How do I use a string literal that contains an embedded single-quote (') character?

2011/12/24

for 迴圈

以前用 for 迴圈跑字串,都要寫好常一串:
char s[5]="123";
int index = 0;
while( s[index] != '\0' ){
   // get s[index];
   index++;
}

無意間看到有人這樣寫:
char s[5]="123";
int index;
for(index=0; s[index]; index++){
   // get s[index];
}

原因是 \0 會被當作 false,換做其他資料型別的陣列就沒辦法這樣寫。

2011/12/23

PHP Closing Tags


一般寫 PHP 會將系統設定、資料庫連結等功能分開放在多個不同的檔案中。

index.php:
<?php
   require('settings.php');

   // something else

   session_start();
?>

settings.php:
<?php
   // some settings
?>
 

以上程式執行以後會噴錯誤訊息:
session_start(): Cannot send session cache limiter - headers already sent
原因是在 index.php 呼叫 session_start() 之前已經輸出資料,不過到底是哪裡有輸出資料?仔細看才會發現 settings.php 在「?>」後方還換了一行,換行是在 PHP closing tag 之外,所以就被當作一般資料送出。

當程式很龐大時,這種 bug 實在會讓人摔鍵盤、丟滑鼠、凹螢幕。

事實上 PHP 程式不加上結尾的「?>」也是可以執行的,直譯器到檔案結尾會自動當作該程式段落結束,所以程式可以改寫成這樣:

index.php
<?php
   require('settings.php');

   // something else

   session_start();
 


settings.php
<?php
   // some settings
 
 

2011/06/25

FlickrLinker 擷取照片網址工具



Flickr 網站提供使用者存放自己的照片,但免費帳號僅能檢視最新的 200 張照片。

FlickrLinker 工具可以讀取網頁內容並將照片的獨立網址紀錄下來,當照片超過 200 張以後,可以透過留下來的連結連到照片的獨立頁面,以後變不需擔心找不到舊照片的網頁連結。

打開 FlickrLinker 後輸入使用者 Photo Stream 網址,如「http://www.flickr.com/photos/johnroyer/」,程式便會自動讀取網頁內容並將照片獨立頁面網址顯示於文字方塊中。

另外程式會自動判斷是否有「下一頁」,有的話會自動翻頁直到所有照片連結讀取完畢,若付費帳號顯示頁數過多,程式會不中斷直到頁面讀取完畢,執行中仍然可以複製網頁連結,跳出請點選試穿關閉按鈕。

下載:請至程式下載頁面

2011/06/10

Redmine 簡介

軟體開發時,通常都會記得程式碼要用版本管理系統,不過很容易忘記時間管理、文件管理,程式實做後一定會遇到 bug,到時除錯、系統異動等管理又會是一大問題,若需要包含這些功能的管理平台,Redmine 應該會是個不錯的選擇。


2011/06/08

ACM 解題

很久沒碰手癢摸了幾題簡單的,發現幾年沒碰後現在像個渣,連 scanf 也不會寫。還蠻懷念以前和同學互尬程式的感覺。

以下幾個 online judge 平台,大家可已是是身手:

若有其他平台上面沒有列出,歡迎提供!謝謝。

2011/05/09

XX 產生器

1. Commit Message Generator (純惡搞)
http://whatthecommit.com/

範例:commit -c "Test commit. Please ignore"



2. 專案出包理由產生器 (看也知道是惡搞的)
http://bingo.handlino.com/machines/3586

範例:直到上線前一天,PM 離職了

2011/04/24

使用 qrc 為執行檔加上圖示 (for Windows)

Qt 編譯出的執行檔預設沒有圖示,可以透過設定檔方式修改執行檔所要使用的圖示。

新增一個 qrc 檔案:
IDI_ICON1 ICON DISCARDABLE "myApp.ico"

myApp.ico 可以設定成自己要使用的圖示,不過只支援 ico 檔案類型。建立完畢後打開 Qt 專案檔 (*.pro) 加入一行參數:
RC_FILE += app.qrc

重新編譯專案以後應該可以看到執行檔鑲上 ico 圖示。

這個方法只有在 windows 上可行,在 Ubuntu 底下編譯後仍然沒效。上述所建立的 qrc 文件不是官方所使用以 XML 方式撰寫的文件,官方教學文件也沒有提到這個作法,搞不太清楚為什麼?

參考資料:
怎样设置QT生成exe文件的ico图标呀? - Qt中文论坛
http://www.qtcn.org/bbs/read.php?tid=18001

2011/04/20

2011/02/08

Qt with QSqlDatabase

程式中有使用到 QSqlDatabase 函式庫,標頭檔也正確引入,編譯時若出現錯誤訊息:
error: QSqlDatabase: No such file or directory

表示 *.pro 設定檔尚未設定 SQL 支援,參考程式範例加入設定:
QT += core gui sql