2016年8月27日 星期六

[學習] 看完保哥Git教學(17)

git merge  有遇到衝突時,即不同分支改到同一檔案的同一行時,又要做Merge的時候就會產生衝突。

善用GUI軟體,SourceTree..

記得操作是Clone/New按下去後,選擇Add Working Copy,再選工作目錄資料夾(Repository)。就可以出漂亮的樹狀圖了。


* git merge [other_branchname]
* git checkout -b [new_branchname]
* git reflog             找紀錄
* git branch -d [branchname]      刪掉已被合併過的分支
* git branch -D [branchname]      刪掉未合併的分支
* git branch feature <SHA1>
* git reset --hard ORIG_HEAD     回覆到最新Commit的上一個commit
* git status
* git ls-files -u            看哪個檔案衝突
* git diff [filepath]           比較衝突檔案

[Git] reset 在不同commit之間跳來跳去,檔案變化

 git reset [commit ID] 和 git reset --hard [commit ID] 差別
PS: 如果不知道跳到哪裡了,請善用reflog
http://ithelp.ithome.com.tw/articles/10138150

狀況 1: 今天有5個commits,心血來潮想回去第3個commit
-- 確認工作目錄 git status 都乾淨
使用git reset [third commit ID] 或 git reset --hard [third commit ID]
結果:都順利回去第3個commit,沒有其他訊息。

狀況2.1:承上,在第3個commit裡面做檔案新增/修改,也沒git commit,再回去最新的commit
git reset [newest commit ID] :剛剛的檔案被保留並屬於unstaged狀態*(未放在索引)
             有git commit也一樣會被改成unstaged
git reset --hard [newest commit ID]:剛剛的檔案會被忽略(刪掉),強迫回到最新commit狀態

狀況2.2:反過來,在最新的commit做檔案新增/修改(沒commit),跳回第3個commit
git reset [third commit ID]:檔案會被帶進來屬於unstaged狀態;就算有commit也一樣會被變成unstaged狀態保留下來。

狀況3: 在第3個commit建立新分支,沒做任何動作就跳到第2個commit或回最新的commit
兩種指令結果: 分支自動被延伸到所跳到的commit
=>這種特性可以救回被刪掉的分支,如狀況4說明

狀況4: 在最新的commit刪掉分支  git branch -d(or -D) [被刪分支],後悔了想救回來
使用兩種 git reset 指令回到[被刪分支]存在的commit,這樣就救回來了。


狀況5:不知道跳到哪個commit了,想直接跳到最新的commit
=> 善用git reflog 找紀錄....它很強大,Git預設紀錄至少30天,刪除reflog也無法全刪,只能一筆一筆刪,刪了不會影響commit。



2016年8月26日 星期五

[Git] 跟Bitbucket有關的整理

在本機用cmd設好remote路徑,但push一直被reject如下
git push -u origin master
To https://Ray2016@bitbucket.org/document_ray/fileupload.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to ...

註: http://goo.gl/hn58v6
-u 就是Upstream 如果遠端沒有任何檔案,那第一次都要下下面指令再push
git branch --set-upstream
不然就是用一行解決
git push -u origin my_branch

解決:
git fetch 遠端路徑       => 拉下最新分支
git remote add [遠端路徑別名]  [路徑]    => 設定遠端路徑
git pull --rebase [別名] master        => 重新定義參考基準
接下來就可以用 git push [別名] master


如何清理Bitbucket上面的commit紀錄
一般對本機的檔案,我們都用git revert [commit ID]回到某一版,就會清掉其他commit...注意是那些commit就消失了。

遠端的Bitbucket,也是一樣道理
git reset --hard [遠端commit ID] => 重置版本
git push -f           => 強迫更新,就達到上面的方式了

更多回復版本的作法還要多練習,清掉commit紀錄也是。
另外有一點好事,本機的新增的檔案只要還沒commit,那版本怎樣回復,不會被影響到那些檔案。可以再玩看看。



查看遠端路徑設定、修改遠端別名
git remote -v
git remote set-url [別名] [新路徑]
https://help.github.com/articles/changing-a-remote-s-url/

2016年8月23日 星期二

[思考] 設計第0步的對話

丫壹 這就是為什麼我要先做「設計」
Elaine 這裡怎麼設計
丫壹 這樣子下去,他所耗的時間都是白工
Elaine 在這裡我還是很不懂你那一天覺得我們已經在想SQL這件事情為什麼就已經在寫CODE了
Elaine 我自己昨天是稍微寫了一下,是按照那天你說的方式去寫
Elaine 確實很順。但我還是不明白
丫壹 重點在於
丫壹 你在接到需求時
丫壹 是在想你是要「哪些資料集合」,還是「哪一張表」
Elaine 我想的是哪一張表
Elaine 哪些表
Elaine 需要
丫壹 前面是抽象設計,後面實作設計
丫壹 如果你一個資料集合是好幾張表組合起來呢
Elaine 所以是哪些表我需要
丫壹 這樣就直接深入「實作」了丫
丫壹 如果code本來不是你寫的,你怎麼在那個時間知道哪一張表
Elaine 不知道,所以要找跟問
丫壹 那是不是變成你在規劃時,又要一邊確認一邊規劃
丫壹 那為何不先利用一些抽象的資料集合概念
丫壹 先知道總共需要哪些資料群
丫壹 這些資料群有什麼樣的關係,或是邏輯計算
Elaine 像是EMP資料,請假資料。這種資料群?
丫壹 對
丫壹 然後在把這個結果去對應到實際的表格之中
丫壹 這樣不是比較明確嗎
丫壹 簡單講一個原則
丫壹 只要你們不是從一個全面的抽象角度去思考
丫壹 而是一直要知道「實際的東西」在哪去才能思考
丫壹 那一 定會一直遇到問題,或是少東西
丫壹 因為你根本不知道全部應該要有多少東西
丫壹 最直接的一個舉例
丫壹 如果我們在拼圖時,不給最後拼圖來的全圖
丫壹 會發生什麼事
Elaine 不能拼阿
丫壹 但你們現在都在這樣子「拼圖」丫
丫壹 還拼的很開心呢
丫壹 ray 的這張報表
丫壹 是一個很基本的東西
丫壹 如果是寫「庫存報表」,你看看你怎麼用那麼細節的資訊來做
丫壹 如果功能是複雜到有關係,又有計算,上下筆資料也有關係的情況下
丫壹 有什麼方式去思考,會差距很多
丫壹 最直接會發生的狀況就是
Elaine 做出來的不是要的
丫壹 你們只能用程式碼去問問題
丫壹 哈,用硬來的也能用出個結果丫
Elaine 恩。以前寫的報表確實都會在程式面上來做最後處理
Elaine 因為sql寫不好~哈
丫壹 所以結論就是
Elaine 或是指能處理一部分
丫壹 你要用別的方式來補那個洞
丫壹 然後愈補又愈大洞
Elaine so trouble
丫壹 這點就是我跟你們在開發跟debug的速度差異最大的地方

2016年8月19日 星期五

[學習] Git (13) stash 暫存工作目錄與索引變更

指令
* git stash          儲存modified、staged狀態的檔案
* git stash save        跟上面一樣
* git stash -u         儲存所有檔案含untracked
* git stash save -u       跟上面一樣
* git stash list         顯示所有暫存清單
* git stash pop         回覆到最新的暫存檔儲存狀態並把該暫存檔刪掉
* git stash apply        回覆到最新的暫存檔儲存狀態並留下該暫存檔
* git stash pop "stash@{id}"   回復到指定的暫存檔儲存狀態並把該暫存檔刪掉
* git stash apply "stash@{id}"  回復到指定的暫存檔儲存狀態並留下該暫存檔
* git stash drop "stash@{id}"   刪除指定暫存檔
* git stash clear         清空所有暫存檔

[YEZZ]建置開發環境走過去的坑

下了一個新環境,建了新資料庫。登入人員的帳密建立就要注意,密碼是有被加密編碼的。
相關的資料表要補的資料還是要補這樣。

舊專案的首頁登入路徑還是錯的。

從遠端Git Clone專案下來的時候,還是把舊專案加底線或清掉再重抓/換分支吧,不然都有舊專案跟新專案混淆的錯誤。

不過今天還算是有學習到的,自己打開專案追每個方法的來源、用Postman測試做Debug...等等,滿有趣的。

2016年8月18日 星期四

[Html] 怎麼顯示換行?

用AngularJS,簡單一點是用<pre>就可以顯示
另外一種,用<p style="white-space: pre-line"> 這樣也可以

[練習] Git blablabla

剛在想,看了這麼幾天的Git,我到底學甚麼要幹嘛...?

操作自己的檔案一遍以後,就想起來,原來我是想刪版本紀錄....
不過學到這麼多觀念跟指令也是件好事啦~

[學習] 紀錄指令 Git (11) 認識認識Git物件的一般參照與符號參照 #保哥

此篇參照名稱(ref)」 簡單來說就是 Git 物件的一個「指標」
可以把「參照名稱」想像成 Git 物件絕對名稱的別名 (Alias)

Git 參照名稱又有區分「一般參照」與「符號參照」,兩者的用途一模一樣,只在於內容不太一樣。「符號參照」會指向另一個「一般參照」,而「一般參照」則是指向一個 Git 物件的「絕對名稱」。

Git(11) http://ithelp.ithome.com.tw/articles/10136234
[一般參照]
git branch 取得所有分支名稱,並得知目前「工作目錄」是指向哪個分支。
git log --pretty=oneline 取得該分支的所有版本紀錄。

//預設這些分支的「參照名稱」(即自己命名的分支名稱)會指向分支的「最新版」
type .git\refs\heads\newbranch1 檔案名稱一樣雜湊碼id,是指向版本歷史紀錄中的「最新版」。

git cat-file -p [id] 取得該 commit 物件的內容
等同於
git cat-file -p 分支名稱(參照名稱)

git show [id] 取得該版本的變更紀錄

所有的「參照名稱」都只是個檔案,一律放在git/refs目錄下
* 本地分支:**.git/refs/heads/**
* 遠端分支:**.git/refs/remotes/**
* 標 籤:**.git/refs/tags/**

其實分支全名應該要連前面路徑都寫進來,不過git可以使用分支名稱(參照名稱)就可以做指令git cat-file -p [xxx] 查詢,這就是這篇的重點。
查詢會用下面順序來找
* .git/<參照簡稱>
* .git/refs/<參照簡稱>
* .git/refs/tags/<參照簡稱;標籤名稱>
* .git/refs/heads/<參照簡稱;本地分支名稱>
* .git/refs/remotes/<參照簡稱>
* .git/refs/remotes/<參照簡稱;遠端分支名稱>/HEAD
保哥有舉例Git的搜尋順利,可以再連過去看。
http://ithelp.ithome.com.tw/articles/10136234


[符號參照]
不過用上面的方式要看當前分支的雜湊碼,要輸入type .git\refs\heads\newbranch1 ,但一開始不知道哪個分支,就要先用git branch得知自己的分支,然後有記說 .git\refs...才能得到結果,太麻煩...所以又有另一種作法,用「符號參照名稱」(Sysref),就會把這一長串顯示出來。
type .git\HEAD

保哥筆記:
在 Git 工具中,預設會維護一些特別的符號參照,方便我們快速取得常用的 commit 物件,且這些物件預設都會儲存在 .git/ 目錄下。這些符號參考有以下四個:
* HEAD
* 永遠會指向「工作目錄」中所設定的「分支」當中的「最新版」。
* 所以當你在這個分支執行 git commit 後,這個 HEAD 符號參照也會更新成該分支最新版的那個 commit 物件。
* ORIG_HEAD
* 簡單來說就是 HEAD 這個 commit 物件的「前一版」,經常用來復原上一次的版本變更。
* FETCH_HEAD
* 使用遠端儲存庫時,可能會使用 git fetch 指令取回所有遠端儲存庫的物件。這個 FETCH_HEAD 符號參考則會記錄遠端儲存庫中每個分支的 HEAD (最新版) 的「絕對名稱」。
* MERGE_HEAD
* 當你執行合併工作時 (關於合併的議題會在日後的文章中會提到),「合併來源」的 commit 物件絕對名稱會被記錄在 MERGE_HEAD 這個符號參照中。

另外撿了幾個指令,感覺比較好用的:
git update-ref [name] [commit id]     可以幫任一版本commit命名
git update-ref -d [name]      刪除該命名
git show-ref          顯示所有最新版本id和參照名稱


[學習] Git (09)比對版本與檔案差異、(10)物件的絕對名稱

http://ithelp.ithome.com.tw/articles/10135441
Git(09) 比對版本與檔案差異,我用起來比較無感,通常我會在乎當下的檔案是否commit,使用指令去比對版本與檔案差異,出來的方式要很熟才會懂cmd說甚麼,下面就先把保哥的指令記在下面。
---
今天介紹的 git diff 是個很常用的指令,各位應該熟練地使用它。我們最後來複習一下其常用指令的差異:

git diff => 工作目錄 vs 索引
git diff HEAD => 工作目錄 vs HEAD
git diff --cached HEAD => 索引 vs HEAD
git diff --cached => 索引 vs HEAD
git diff HEAD^ HEAD => HEAD^ vs HEAD

我重新整理一下本日學到的 Git 指令與參數:

* git log
* git diff
* git diff HEAD
* git diff --cached
* git diff --staged
* git diff HEAD^ HEAD
---

Git(10) 物件絕對名稱,取id前4碼以上即可=>記5碼比較方便
相關指令:
* git log
* git cat-file -p [object_id]         看commit物件或tree物件都可以
* git log --pretty=oneline          把log一行化
* git log --pretty=oneline --abbrev-commit   log一行化,簡短化

[公司] 反省作業

回想起目前這一個半月下來的幾份作業,其實應該分幾個層面

-架構
-AngularJS 摸摸
-認識公司專案Database/Service/AP、元件 
-寫寫SPC
-再認識公司元件、熟悉元件,Service/AP 居多
-寫點自己的BusinessLogic

這樣想起來,其實前面幾分都並沒有讓我寫甚麼邏輯對吧...頂多就只是AP的邏輯,卡較多的都是在於使用阿壹元件,學習如何追蹤看懂他的專案這樣罷了。

2016年8月17日 星期三

[學習] Git (08) 分支branch

http://ithelp.ithome.com.tw/articles/10135016

先學到一個概念,從當前分支再去建立分支,兩個分支會走在同一條線,如果這時候在建立的分支上有做到修改,那你就不能使用git branch -d [branch_name]去刪除掉該分支,系統會有error要你先做merge。
舉例:
error: The branch 'newbranch2' is not fully merged.
If you are sure you want to delete it, run 'git branch -D newbranch2'.

那是不是merge以後,就會變成同一條線只剩一個分支,不知道。
A: YES (8/27)

如果是先用git log找到分支的上一版本id,然後用git checkout 上一版本id,那就會切換到該版本,然後再用git checkout -b [branch-name],這時候就會切換到建立出來的新分支,並且此新分支就會跟原來分支分開在不同的路線。


指令:
git branch    顯示所有分支
git branch [branch_name]       建立新分支
git checkout -b [branch_name]      建立新分支並且切換過去,建議作法
git checkout [branch_name]    切換到該分支
git branch -d [branch_name]    刪除該分支
git branch -D [branch_name]   刪除掉(同條線)尚未merge的分支
git log            查看分支的版本紀錄

2016年8月16日 星期二

[學習] 保哥30天精通Git版控(06) + (07)

(06) 介紹物件結構和相關指令

cmd

mkdir demo-git         產生一個demo-git資料夾
cd demo-git
git init            建立repository儲存庫
echo 1 > a.txt         建立一個檔案a.txt內容是1
copy a.txt b.txt        複製a.txt叫b.txt
git add .           將檔案加入git中
git hash-object a.txt       查看blob物件,是用a.txt的內容1生成一個hash雜湊碼,前兩碼是資料夾名稱,後面是檔名,點進去看內容會是被壓縮編譯過的內容(原來是1)
git commit -m "註解說明"    提交目前版本
git log            查看commit物件雜湊碼
git cat-file -p master       查看tree物件的雜湊碼
git cat-file -p 'tree物件的雜湊碼'  查看tree物件底下的blob物件


(07) 講解索引staged結構、說明指令並講解Git檔案的生命週期(看保哥網站)

----索引就是staged狀態,Git儲存庫的運作,是將工作目錄裡的變化,透過更新索引的方式,將資料寫入成Git物件。

----git status 就會看到檔案狀態

----git show master:filename 可以看檔案內容~

----新增檔案用 git add filename 會變成等待被commit狀態(也就是staged索引),同時該檔案會屬於unmodified的狀態(不難理解,剛加入是最新的狀態),但add不是commit。

----刪除剛add但還沒commit的檔案,使用git rm filename,會出錯,因為,add的檔案雖然有被丟到等待commit的索引,但最新版裡面並沒有這個檔案,所以rm指令執行去比對索引跟最新版本後會出錯。一邊有一邊沒有這樣。

-----git rm --cached filename,這樣就可以把上述add的檔案從指名從索引中刪除,退回untracked狀態。

----如果是modified的檔案,就可以直接用git rm filename將刪除該檔案寫入索引,不過還是要git commit才會真的把該檔案刪掉。

----只要不再staged狀態的檔案,git commit是不會更新上去的,git reset --hard回復到上一版本會把該檔刪掉


[學習] Git(05) 物件 索引

保哥的30天精通Git版控 (05)
http://ithelp.ithome.com.tw/articles/10133653

我所看到的資料夾就是:工作目錄(working directory)
裡面就會有檔案,我可能就會新增/刪除/修改

Git裡面重要的兩個結構:物件、索引

物件是將「檔案內容」取出,透過它產生一組SHA1雜湊值,再依此雜湊值命名的一個檔案。
Git進行版控的過程中,所有要進行控管的目錄和檔案,都會區分「目錄資訊」與「檔案內容」,稱之為tree、blob。
blob物件就是把原本的「檔案內容」當作blob檔案的內容,用上述的雜湊值作為檔名。
tree物件就是資料夾,用指令看tree會發現blob物件會被記錄在裡面。
blob物件就是只有內容的檔案。
這兩個物件都會儲存在「物件儲存區」底下,預設在「儲存庫」.git 下的objects目錄下。

索引是一個經常異動的暫存檔,位於 .git目錄下的index檔案,想要Commit一個版本到Git儲存庫就要先更新索引才能被提交。
更新索引這份二進位檔案要用git指令:
*git add
*git mv
*git rm
*git status
*git commit
*git ls-files

Git索引是一個介於「物件儲存區 object storage」與「工作目錄 working directory」之間的媒介。沒有索引資訊,Git就無法建立版本。

保哥整理:
* 要使用 Git 版本控管,你必須先建立「工作目錄」與「版本庫」。(mkdir, git init)
* 你要先在「工作目錄」進行開發,你可能會建立目錄、建立檔案、修改檔案、刪除檔案、... 等操作。
* 然後當你想提交一個新版本到 Git 的「儲存庫」裡,一定要先更新「索引」狀態。(git add, git mv, ...)
* 然後 Git 會依據「索引」當下的狀態,決定要把那些檔案提交到 Git 的「儲存庫」裡。(git status)
* 最後提交變更時 (git commit),才會把版本資訊寫入到「物件儲存區」當中 (此時將會寫入 commit 物件)。




--實作心得
用commit物件就可以看到tree物件,用tree物件就可以看到blob物件或其他tree物件
得知該commit 有多少內容~ 當然這是屬於較細的追蹤

[學習] 公司用的Service

跟公司用的Service還是很不熟,甚麼東西在哪裡,甚麼東西可以改不能改,Code Review很久,學習起來,沒有效率,很沒成就感。

2016年8月15日 星期一

[學習] Git

依照保哥的

30 天精通 Git 版本控管

http://blog.miniasp.com/post/2013/11/03/Learning-Git-Part-2-Master-Git-in-30-days.aspx

目前做到Git 版本控管 (03):建立儲存庫 ( Repository )
學習到幾個git shell指令:
* git init            建立本機的儲存庫
* git init --bare         建立本機的共用儲存庫(多人共用電腦使用)
* git clone [REPOSITORY_URI] 複製本機或遠端(ex: GitHub)的儲存庫到本機(要先到複製目的地的位址)

其他指令學習:
* mkdir datafile_name     建立資料夾
* cd ..            回到上一層
* cd .\otherfile_name     進入這一層下的otherfile_name資料夾
* dir             查看目前目錄
* dir .git           查看儲存庫

Git 版本控管 (04)
* git init          建立本機端儲存庫
* git add .         告知Git這些檔案將被加入Git版本庫(會將此工作目錄下所有的檔案加入這個Git工作目錄的[索引]或[快取]之中)
* git add app/*       加入app目錄底下所以檔案
* git add *.txt        加入所有.txt檔
* git status         查看目前工作目錄的詳細狀態
* git status -s        同上,精簡版
* git commit        建立版本,會打開記事本,自己加上版本的說明,儲存
* git commit -m "版本紀錄的說明文字"
* git log          查歷史紀錄
* git log -10        查10筆歷史紀錄
* git rm '*.txt'        刪除所有.txt檔
* git rm 'app/*.html'
* git mv 'oldname' 'newname' 將oldname改名為newname
* git reset          
* git reset --hard       全部復原到上一版本
* git checkout master 'filename' 復原單筆檔案filename到上一版本

2016年8月14日 星期日

[檢討] 工作留言板建置檢討

檢討源由:使用ASP.NET WebFrom 製作留言板,再慢就一個下午完成吧;這次在公司確認完需求後,我還是花了三天才做完,為什麼?


作業流程:
討論(需求畫面與功能、資料表欄位設計)上班時間一天半
8/8 1:30PM 開始製作,到星期二下午五點才全部確定。
從寫User Case到手繪View到用小畫家View => Use Case實戰效率不高,手繪或劃ERD比較快,確定View用小畫家畫比較明確

開發用上班天數兩天半

遇到狀況:
週三
1. 使用介面設定路由問題,使用1.5hr
遇到錯誤訊息 XML 無法down ....TMSService ...以及另外兩個路由問題
動作
=> 以錯誤訊息較短的第二條和第三條開始, 踢鐵板1hr, 後來才發現第一條TMSService根本不存在。
=> 解決
我多新增了系統資料管理   這裡決定我將使用的Service 和 資料夾名稱
剛剛的錯誤在新增了一個TMS => Service 變成找 TMSService => 沒這個東西
所以修正的方式, TMS為CRMS底下的功能, 應該是改新增在CRMS底下即可
=> 學習 前端問題要從第一條錯誤開始解。

[週三下午5點~周四下午2點半]
2. System.Data.SqlClient.SqlException: 字串或二進位資料會被截斷。使用4.5hr
動作
(1) 開SQL Server追蹤想看產生的sql指令,
突然注意到#TempTable裡的編號為NULL
=> 開始懷疑tag, serial是否可以使用?
=> 結果,使用SN編號產生器,#TempTable不會先產生編號,會在呼叫SPC以後才會有產生
=> 看到null有這個懷疑正確,但針對錯誤訊息的方向是錯誤,此懷疑與錯誤訊息是非相關

(2) 開C#偵錯,用postman測試,發現
=>  Postman丟 2016-08-10 21:5:33 進入C#的Service專案會有一句語法
JsonConvert.DeserializeObject<IEnumerable<T>>(option.Modify.Date); 就會變成中文時間
因為C#的JsonConvert轉換JSON傳入的時間時,會依DateTime型別把時間修成 '2016/8/10 下午 10:05:33' (受到中文OS影響)
=> 解決方向:
問Sean得到前端丟JSON可以先轉,所以朝此方向得到JavaScript有 new Date();
自己多嘗試兩種方式 new Date(也是newDate的變數.getTime()); -> 完整的文字版日期時間
自訂日期時間用getFullYear() + get......

自己方向朝改變C#裡面的set方式,想對傳入的日期做String.Format,或是做個轉換器來轉換字串為正確日期格式,此方向錯誤,因為用DateTime型別就已經轉為日期格式。

將類別屬性的DateTime型別改成String宣告,一樣得到二進位截斷問題,開始懷疑不是DateTime問題,可能是其他欄位問題。

(3) 給Elaine看過得到再嘗試方向: 檢查Entity.config、檢查流水編號是否真的要再#TempTable產生時產生?再檢查是否為其他欄位問題

(4) 重新檢查Entity.config,比對最原始的作業Customer,注意到entity裡schemaType用的資料型別值都放大小寫(ex: VarChar 非 VARCHAR),檢查SQL Server追蹤的sql指令,產生的#TempTable都沒有data_type,以至於insert會有二進位被截斷問題!

(5) 因為#TempTable會依照Entity.config設定產生,而schemaType的大小寫寫錯,以致#TempTable沒有被順利產生,當改好以後,#TempTable順利產生,就沒有二進位被截斷問題。

=> 結果,日期時間應放在資料庫建立,不應該從前端建立回來。所以就在日期欄位被CREATE的時候放入DEFAULT(GETDATE()) 即可,但另一個回覆時間就不能放DEFAULT,要在SPC裡面去被建立。
=> 學習
**因為在C#使用DateTime資料型別所宣告的日期物件,用此物件讓C#對SQL做insert指令是不會有問題的,C#顯示給人看會有中文,但DateTime物件傳遞會是電腦正確的日期格式。
**SN流水號,不會在#TempTable產生時就產生,而是在#TempTable之後會再使用編號產生器SPC後才會產生。
**如果要Entity.config要改資料型別做測試,對應的類別class屬性資料型別也要跟著改。
**寫Code要配合語言特性,該使用大小寫還是照舊,操作系統防呆這件事,是要留給終端使用者,不是開發者。
=> 討論:
日期產生的事情,在Service裡面可以怎麼做。


[週四下午五點~五點半]
3. 使用StatusChange方法失效,使用時間半小時
=> 在類別的狀態屬性上要加上Attribute[Status],主鍵要加[User]
裡面的程式運作如何使用Attribute未理解

[週五 下午五點半~六點半]
4. 欄位驗證 受到 ng-repeat 影響而失效,使用時間1hr
=> 將ng-form改放在ne-repeat下方 即可對單筆作驗證

[週五 下午五點半]
5. 遇到呼叫SPC有超出變數的問題,使用時間半小時
=> 在Entity.config要給SPC的變數要跟SPC裡面CREATE的變數一樣多。

後面其餘時間都在修版面了


其他提問:size 是一個分頁要顯示多少筆數 == 資料庫要撈出多少筆數

開發作業使用專案有
資料庫Database
Services
AP

2016年8月11日 星期四

[C#] Insert 時間直接用 DateTime物件

問題描述:
我在前端給的 時間 沒有中文 {"MESSAGE_DATE":"2016-8-10 21:5:33"}
那前端要傳 時間的值 給Service 都會先被用JSON包起來,在Service裡面(C#)用JsonConvert才去得到值,然後使用C#的DateTime定義所解出來的時間會受中文OS環境影響,在debug就會看到時間顯示變成 2016-08-10 下午 09:05:33


但,不用擔心,電腦世界裡面的溝通不會受這樣的問題影響,只要我不要雞婆將這個時間用string包起來,而是繼續使用資料型別DateTime傳遞這個時間,那它就會是以一個DateTime的物件 INSERT 到資料庫,該物件裡面的value"不會有顯示中文"的問題,可以正常的insert進資料庫。

[問題] SqlDateTime溢位

System.Data.SqlTypes.SqlTypeException: SqlDateTime 溢位。必須在 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之間


原因:關於DateTime,在將DateTime類型,插入到資料庫的時候,最容易出現的一種錯誤:“SqlDateTime 溢出。必須介於 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之間”原因是我們在取DateTime.MinValue的值,並插入到資料庫的時候,DateTime.MinValue值範圍和資料庫DateTime類型資料範圍不一致造成的。資料庫中,DateTime類型欄位,最小值1/1/1753 12:00:00,而.NET Framework中,DateTime類型,最小值為1/1/0001 0:00:00,顯然,超出了Sql的值的最小範圍,導致資料溢出的錯誤。

Solution:類別的日期屬性宣告DateTime加上'?',變成 'DateTime?' 即可解決 (因#TempTable在日期未CREATE前會先做insert,如果不宣告,就會碰到C#時間預設跟SQL最小時間衝突)


參考:http://fecbob.pixnet.net/blog/post/35575023-sqldatetime%E6%BA%A2%E5%87%BA%E9%A1%9E%E9%8C%AF%E8%AA%A4%E8%A7%A3%E6%B1%BA

2016年8月6日 星期六

[學習清單] 想學好Coding~還差得遠呢!

程式員求生指南:關於寫程式的二三事

公司讀書會的分享。嘗試ORID版
O: 較在意的文章段落
  1. 自我提問: 我適合當程式員嗎? 如果你發現自己寫程式、看程式、解bug都很痛苦,半年一年了也不見改善,也許這份工作不太適合你。
  2. 程式語言的基本觀念:變數、迴圈、陣列、遞迴、I/O、網路、多執行緒、物件導向、regular expression、functional programming、
          資料結構、演算法、網路協定
       進階能力:作業系統、資料庫、網路安全
       觸類旁通:函數程式語言、組合語言、Shell Script
  3. 程式員的要求是:寫出可讀、易維護的代碼。
R:1.  看到文章的自我提問和回答,就回想自己的Coding過程:解bug的時候無著力點時總是很煩很慌張,痛苦的心情是肯定有的,但解完的成就感還是大過於痛苦的心情,這樣我就可以再繼續下去。
        2. 接著看到基本觀念和能力等等,還不到感覺完蛋了,倒是感覺,好在這篇文章的整理,給了我的很大幫助就如同自我檢視清單。
I:多少的基本觀念和能力,都牽動著未來能否達到稱職的程式員要求,與其說在這篇文章學到些甚麼,不如說是看見了有哪些武功秘笈要看過。程式語言的基本觀念需在紮實的如:I/O、多執行緒、正規表達式、資料結構、網路協定、演算法;進階能力,除了作業系統感覺離我很遠,資料庫跟網路安全應是作業上應會被現實一直要求。
D:想當程式員?除了累積更多經驗還是經驗,沒甚麼捷徑,就是路很長,跟慢跑一樣,調整步調/呼吸,持續跑下去就對了。

程式語言基本觀念
變數、迴圈、陣列、遞迴、I/O、網路、多執行緒、物件導向、regular expression、functional programming……。

基本概念:
  • 資料結構
  • 陣列(array)、串列(list)、堆疊(stack)、佇列(queue)
  • 樹(tree)、二元樹(binary tree)、雜湊表(hash table)
  • 指標(pointer):這也許不算資料結構,許多高階語言也不讓你用pointer,但是對記憶體、指標要有概念,這是程式員與非程式員的區別之一
  • 演算法
  • 對以上資料結構的各項操作
  • 排序(sort):至少搞懂3、4種基本的排序演算法,例如bubble sort、quick sort、merge sort等
  • 搜尋(search):depth-first-search、breadth-first-search、binary search等
  • 其它:迭代(iteration)、遞迴(recursive)、分治法(divide and conquer)、時間/空間複雜度的基本概念(big O)等




網路上資源很多,Google一下、多寫一些程式練習,弄懂以上基本概念,應該就夠用了。

觸類旁通:
TCP/IP、HTTP、DNS等這些都是基本的網路協定。
ex: 請解釋cookie是怎麼運作的?

進階能力:
對作業系統(OS,operating system)的了解,是資深程式員應該具備的。例如:
  • Hardware: CPU, memory, I/O devices
  • Process, multi-thread, scheduling
  • Inter-process communication: signal, socket, pipe, named pipe, shared memory, message queue...
  • Synchronization, deadlock, mutex, semaphore
  • File system, cache, virtual memory, page fault...
  • Real-time system, distributed system

資料庫觀念:
關連式資料庫(relational database)

網路安全:
網路安全議題,是屬於系統管理者的範疇,例如DoS (denial of service)、DNS spoofing、man in the middle;有些則是程式員的責任區,例如SQL injection、cross-site scripting、cross-site request forgery等等。此外像驗證使用者身份的流程、儲存/傳送使用者敏感資料的方式,也都與安全有關。

函數語言:
函數程式語言(functional programming language)是另一種風格的程式語言,可以挑一個好好學一下。我個人推薦Haskell,但F#、Scala、OCaml、LISP、R、Erlang、Clojure這些也都不錯,各有擁護者。

稍微有個概念:
組合語言

指令:
工作中有用到Linux/Unix相關的OS,我建議應該要學一種shell script,例如bash。如果你是ops/service engineer或系統管理者,這應該是必備能力了

最後自我要求:
1. 可讀性高的代碼,通常是用很好的解法,解決了真正的問題
  • 你需要徹底了解問題(problem domain)
  • 你需要考慮過至少幾種合理的解法(solution domain)
  • 你需要對程式語言、程式庫、既有程式架構和可運用工具很嫻熟
  • 你要能以簡馭繁,而這代表你掌握了更高的東西
  • 例如牛頓的F=ma
2. 寫程式必須很有紀律,例如:

  • 不急著馬上寫code,先想清楚問題、解法、架構
  • 恰到好處的註解,少了不行、過猶不及
  • 用心想過的命名(程式界有句名言: There are only two hard things in Computer Science: cache invalidation and naming things.)
  • 壓抑copy & paste及產出一堆爛code的衝動:
  • Bingo! 找到一段code了,看我的copy & paste
  • 可以work就很好啦、這麼漂亮的解法……
  • 好累,我不行了,先commit code再說
  • 在commit code之前,自己再好好review一次
3. 越容易維護、擴展的代碼,代表它的複雜度越低
  • 必須做到low coupling、high cohesion,而這兩件事都很難
  • 低複雜度的軟體系統,代表裡面各個模組的複雜度都必須更低
  • 當你輕易多用了一個外部組件、增加了一個external dependency,你就把它的複雜度整個帶進來了,所以要很小心

2016年8月5日 星期五

[學習] 程式設計就是一場與自己的戰爭!

跑完步了輕鬆多了!
Coding就是這樣,不要怪電腦為什麼給我錯,是去想為什麼會有這個錯惹了電腦不開心。偵錯的過程就像在與自己戰鬥一樣,要一直不停的問自己為什麼?為什麼會這樣?我的input是甚麼?output應該是甚麼?

這過程很枯燥很無聊,如果這時候突破不了卡關跑去問人,結果是碰了個軟釘子回來,那真的會讓人理智斷線,補個幹。

但,這也沒辦法,就像漩渦鳴人,想要變強就得先經過被嘲笑、被看不起,訓練、訓練,再訓練,直到把實力拿出來,那才算是成功。就是一場與自己的戰鬥!


不要看輕自己,也不要喜歡看別人的辛苦自己不做,變強的過程本來就是枯燥乏味又會斷人理智線的!

[JavaScript] 物件都是用JSON格式

很重要! 自己念三遍。

踩到的坑是來自於下面
var option = angular.extend({ plan: 'Contract'}, vm.page );
console.log(123);
console.log(option);
var test = { plan: 'Contract', size: vm.page.size, index: vm.page.index };
console.log(456);
console.log(test);

一開始我的寫法是
var test = {{plan: 'Contract'}, vm.page};
這是錯的,因為在JavaScript裡面的物件格式都是用key-value的方式呈現,如同JSON一樣。

extend方法的話,本身就是一個物件了   所以不用考慮JSON格式問題。

2016年8月4日 星期四

[學習] 成功路徑 以及 放下學習的傲慢

學習新東西,最重要的,需先看到效果,不是先糾結為什麼。
成功路徑出來以後,就可以開始摸索,真正學習的開始。


其實我不能貪心。
剛剛與寶貝聊天說了出來,我的腦袋如果裝了三個東西以上,就會覺得煩,覺得亂;如果改成腦袋只裝兩個東西,那就可以靜下來思考。

其實今天寫程式感覺良好就是這樣,我不能一次想多種以上的解決方法,那只會讓我猶豫不決,當我改成只想 1. 我現在可以連結的是哪個 2. 想清楚關聯性就挑起來測試 3. 試完了再依據結果想還有甚麼可以做關聯這樣,對象都是縮成兩個,如此做事就輕鬆多了。


放下學習的傲慢
今天放下自己的傲慢,做AP段的日期顯示,我選擇第一次先複製別人程式碼,看到效果以後,成就感跟踏實感就油然心生,有了這樣的成功路徑,開始再做偵錯跟下一步,都開始感到輕省許多,之後第二次就用手打,這樣的方式,可以讓我知道手打的想像是一片程式段,而不是單一個語法。

學習程式不能一股腦地全抓,而是要先複製片段,看到效果呈現以後,再手打,腦袋浮現的就不會再是(糾結)單一個語法,而是一個片段。

同樣學新東西也是一樣,先抓架構(片段),再看細節。以後讀書也可以這樣,先看目錄,腦袋先想過一遍,再迅速看一遍抓重點,再看一遍看細節。以前都懂這話怎麼說,可惜沒深刻感受,今天算是做了一遍就踏實多了。

[AngularJS] select 跟 option 的關係

這兩個就像戀人的關係,而且還是單相思咧!

當他們相遇
<select model="  "> 裡面的model
<option value="  ">裡面的value
就會有種單向綁定的狀態。

先講結果,
option 裡的 value 會傳值給 select 裡的 model ,
但 select 的 model 並不會傳值給 select裡面的 value.

程式碼片段如下:
<select name="name" class="form-control" ng-model="Contract.item.CUSTOMER_SN" ui-select2 required>
                <option ng-repeat="customer in Contract.customers" value="{{ customer.CUSTOMER_SN }}">
                    {{ customer.CUSTOMER_NAME }}
                </option>
</select>


2016年8月1日 星期一

[AngularJS] :sn 做啥用

做合約作業時候回頭看客戶作業,看到 :sn 腦袋又給他卡住一下。

在CustomerInfo.js (客戶列表) 裡
//編輯
function edit(item) {
     $state.go('customer.form', { sn: item.CUSTOMER_SN });
}

在CustomerForm.js裡
//視窗動作
vm.form = Form[!$stateParams.sn ? 0 : 1];
//客戶資料
if ($stateParams.sn) {
    var option = { condition: { CUSTOMER_SN: $stateParams.sn }, plan: 'Contact' };
    AjaxService.Get('Customer', option).then(function (data) {
        vm.item = data;
    });
}

在Config.json裡面
[
    {
        "system": "CRMS",
        "name": "customer",
        "url": "/crms/customer",
        "path": "Basic/",
        "pages": [
            {
                "name": "list",
                "fileName": "CustomerInfo",
                "controller": "CustomerCtrl",
                "controllerAs": "Customer"
            },
            {
                "name": "form",
                "url": "/form/:sn",
                "fileName": "CustomerForm",
                "controller": "CustomerFormCtrl",
                "controllerAs": "Customer"
            }
        ]
    }
]

到處都有sn,到底 sn拿來幹嘛?
那這個問題,一開始我腦袋卡的方向就是不知為何的拘泥於sn跟Form的關係,但看完,窩操, 沒啥關係,有關係的是只是sn帶的值。

想單純一點,:sn就是像C#的QueryString,專門來帶值,那在CustomerInfo.js裡面,就是丟值給sn去帶;到CustomerForm.js就是下一個判斷式判斷 $stateParams.sn 有沒有值($stateParams會儲存url),有值就帶入給Form[1]以開啟編輯頁面,然後透過AjaxService取得對應的客戶資料,顯示在編輯頁面上以做編輯。

2016年7月23日 星期六

[DB] INSERT

INSERT INTO 按照MSDN的範例,應用還蠻靈活的,不是只有INSERT INTO ... VALUES 這樣而已。

MSDN參考網站
https://technet.microsoft.com/zh-tw/library/dd776381(v=sql.105).aspx#OtherTables 

INSERT OUTPUT INTO 參考下面網址,我也做了一個測試
http://vito-note.blogspot.tw/2013/05/output-merge.html

CREATE TABLE [dbo].[Products](
    [ProductID] [int] IDENTITY(1,1) NOT NULL,
    [ProductName] [nvarchar](255) NOT NULL,
    [Price] [money] NULL,
    [CreatedTime] [datetime] NOT NULL
)

CREATE TABLE [dbo].[Audit](
    [AuditID] [int] IDENTITY(1,1) NOT NULL,
    [TableName] [nvarchar](50) NOT NULL,
    [CRUD] [char](1) NOT NULL,
    [RunTime] [datetime] NOT NULL,
    [Key1] [nvarchar](50) NULL,
    [Key2] [nvarchar](50) NULL,
    [Key3] [nvarchar](50) NULL,
)

INSERT Products (ProductName, Price, CreatedTime)
Values ('apple', 50, GETDATE())

INSERT Products (ProductName, Price, CreatedTime)
    OUTPUT 'Products', 'C', inserted.createdtime, inserted.ProductID
    INTO Audit(TableName, CRUD, RunTime, Key1)
Values ('apple', 50, GETDATE())

SELECT * FROM Products
SELECT * FROM Audit



[讀書] 給腦袋的Input

延續上一篇,思考Input - Process - Output
讀書,自我進修,學習
對我來說是甚麼?

這些都是餵給我腦袋的Input
做這個目的是甚麼?
為了讓我有正確的Input,才能有正確的Process,最後才有正確的Output。

真正達到三呆老師說的Input Check,就省掉後面要放在Process和Output上一大半的Check。

[流程] Input - Process - Output

感謝今天跟寶貝一起搭公車發生錯過公車的問題,才讓我有明顯例子去反省問題。

明明就照文件操作,也確認過,腦袋也跑過,應該萬無一失,卻在最後交作業的時候出錯!?

WHY?

明明該做的都做了,想也想過了,最終結果還是錯,錯了不打緊,還要挨一頓罵,前面的努力都像白費,真令人洩氣!

這個原因在今天要去搭公車的時候才發現癥結,狀況是這樣,明明昨天在google查過公車,也確認了時間,腦袋也覺得萬無一失,只要在指定時間到公車站就好,出門買完早餐,卻眼睜睜的看公車從我們前面開過,怎麼會?

這情況有沒有很像?
對!根本一樣!

這個情形才讓我想到,三呆老師的 Input - Process - Output
在上面兩個例子,我把事情拆小一點,就可以發現,我明明都做了確認過了,只完成了Input - Process,但是都沒有看過Output。我犯的致命錯誤,就是放著Output Check在最終結果要直接驗收的關鍵時刻。

以前是,現在是,未來不要再是!

Coding時
Input 就像是觀念(原因)、條件
Process 就是Coding(ex: ng-xxxxxx)
Output 就是要完成的目的(產出)、執行

拉進工工的5W1H,我這麼放
Input:發想理由原因 Why? 考慮環境就是 When? Where? Who?
Process:How to do?
Output:What?

每一個Process又可以再多切割更細的 Input - Process - Output,如此延續下去。以前老師就有說過,真正的全檢,是在Input Check,Process Check,Output Check,最後才交付!我就少了最後一個項目。

在自我的作業流程裡,我還需要縮小範圍,多去做這三階段思考的Check。避免最後交付失敗的窘境。

2016年7月21日 星期四

[新人]開發流程

稍微整理一下我現階段的開發流程,往後回來再看不知道會差多少?

1. 先看設計需求,要哪些畫面、功能、呈現效果
2. 想看看目前學過的作法,可用的方法,是不是該寫Store Procedure (SPC)
3. 簡單畫一下關聯資料表、想一下大概怎麼關聯法
4. 建立資料表
5. 寫SPC
6. 寫Service,設定Entity.Config, 建class
7. postman測試Get/GetList
8. 寫AP,先刻畫面再寫功能


附註:要記得建立自己的程式碼快捷

[武功秘笈] JavaScript

最近進新公司開始在碰AngularJS,從開始使用到第二天驚覺它就是JavaScript,此後...我就跳進JavaScript這個坑了...

這篇純粹描述我(嫩宅)現在對JavaScript的看法,以金庸小說的武功秘笈來說,JavaScript就像上乘武功太極拳一樣,人人都可學,重視無形勝有形。只要是想得到的想法,可以通的邏輯,套在JavaScript上,就好像可以莫名其妙的被實現了...。