Shifting timestamp of commit in Git

I found I miss-configured the system time on my workstation last day, where the time is always 1 day ahead the local time.

To solve this issue, I begin searching for keywords such like “git timestamp shift”, “git timestamp modify” and so on. Fortunately, this link[1] comes up with the result of Google search and indeed do helpful to my problem.

Have to say, the script is not well fit to my requirement, and I modified it this morning to get it work for me.

The snippet is as below and also available on Github Gist[link].

 

 

References:

[1.] “How to push a file to past time?”, http://stackoverflow.com/questions/24722637/how-to-push-a-file-to-past-time

 

vimrc config for Makefile

It is necessary to set an alternative config for editing Makefile in VIM, it is easy to done with adding the following setting into your vimrc file:

Laravel + Angular JS 下取得CSRF Token的解法

2015/04/02 更新: Laravel 5預設也會在Cookie中塞CSRF token,Angular預設也可以支援從cookie上撈,所以其實不用特別去做處理就可以搭起來用了。

 

最近正好在玩AngularJS,由於本人非前端高手,所以若有寫錯還請見諒與告知

今天使用了Laravel的blade views去產生一個頁面,假設是一個form好了:

檔案: (xxx.blade.php)

假設我想要在uploader這個AngularJS的controller裡面利用XMLHttpRequest去幫我把資料POST到我的某個url,那會遇到一個問題:

我如果要在Laravel裡面做CSRF怎麼辦?

原本的做法是像如下:

檔案: (xxx.blade.php)

有趣的是,當頁面render出來後,在controller裡面去輸出$scope.token的值會發現是undefined..

會造成這樣的問題應該是因為:

頁面跟token(包含他的value)都是透過blade engine render後送出來,接著AngularJS才做bootstrap,所以token跟model之間的data-binding是在value有值以後,當然$scope.token就沒有拿到預設想要給他的值(CSRF的token) [1][2]

 

稍微看了一下文件後,解法應該有不止下面兩種(我這邊寫出兩個我認為會比較好的解法):

1. 使用ng-init

投資理財有賺有賠,使用前請先詳閱公開說明書(https://docs.angularjs.org/api/ng/directive/ngInit)

The only appropriate use of ngInit is for aliasing special properties of ngRepeat, as seen in the demo below. Besides this case, you should use controllers rather than ngInit to initialize values on a scope.

不過既然官方的sample都這樣用了,我就給他拿來用一下啦:

檔案:(xxx.blade.php)

基本上ng-init你也可以放在其他地方,只要在同個scope應該是可以的,但可能要看在協同工作與維護上要怎樣寫會比較好而定。


 

2. 使用directive與$parse (個人認為這個做法好像好一點XD):

檔案:(xxx.blade.php)

接著在angular的contoller.js裡面這樣寫:

(請注意,下面的範例只是為了示範,在實作上需要視自己得情況去寫)

由於angularJS的directive命名規則要求使用dash去區隔,然後會做normalization,因此上面範例中,我在html的directive宣告是data-csrf-token,angularJS在比對與normalizaion後會轉換成csrfToken

在link指向的function預設會傳入三個參數[3],以上的範例主要會做以下幾件事情:

1. 檢查該attribute對應到的html code是否有定義了ng-model的binding關係

2.檢查該個element的形態

3.取得該element的value(也就是laravel在render時csrf_token()所產生的token)並且assign給該個scope的model中的token這個值


 

透過上述兩種方法,應該就可以在同個scope的範圍內中正確拿到csrf token的值並且拿來做相關的事情了(Ajax post)。

 

參考資料連結:

[1]. “How Javascript Loading Works”, https://987.tw/2014/05/27/how-javascript-loading-works-domcontentloaded-and-onload/

[2]. “AngularJS: Developer Guide: Bootstrap”, https://docs.angularjs.org/guide/bootstrap

[3]. “AngularJS: Developer Guide: Directives”, https://docs.angularjs.org/guide/directive

Git 筆記

最近終於下定決心要用git來管理project source code

之前很懶得弄git, 所以都是用筆記本自己慢慢track

不過壞處就是要做testing的時候很麻煩….

記錄一下幾個常用的:

1. 假設我在dev machine push了新東西到remote repo,接著想在production machine 撈回來,但是由於production machine上有做一些變更了,此時假設想要放棄production machine上的變更,直接撈remote repo回來覆蓋的話,可以這樣下:

git reset --hard HEAD
git pull

2. 要把local branch commit到remote repo並且同步tracking:

git checkout -b new-branch-name #這時會自動建立new-branch-name並且切換過去該branch
git push -u origin new-branch-name #把此branch push 到origin去並啟用同步tracking

3. 要單獨從remote repo去clone某個branch下來就好

git clone -b branch-name remote_repo_uri

Git 1.7.0版本或之後的可以這樣做:

git clone -b branch-name --single-branch remote_repo_uri

大致是這些,另外加註一下好了,通常在網路上看到的文章指令裡面很常會出現orgin,這個origin基本上就是代表原始的來源(remote repo),個人習慣會在git remote add 的時候用比較好辨識的名字來取代origin,比如說加入的remote repo是來自於github的話,那我會這樣做

git remote add github remote_repo_uri

這樣子透過git remote -v的時候會看到類似這樣子的結果:

github https://github.com/username/project_name.git (fetch)
github https://github.com/username/project_name.git (push)