Total Pageviews

2018/07/15

[Spring Data] [Neo4j] Caused by: org.neo4j.driver.v1.exceptions.ClientException: Invalid input '{': expected whitespace or a rel type name

Problem
假設我想建立下圖 User nodes 間 IS_FRIEND_OF 與 WORKS_WITH 的關係


透過 Spring Data 建立以下的 repository class (分別傳入三個參數,包含來源 node、目的 node以及要建立的關係)
package neo4j.springdata.repository;

import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import neo4j.springdata.vo.User;

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    
    @Query(" match (from:User), (to:User) " + 
           " where from.name={from} and to.name={to} " + 
           " merge (from)-[:{relation}]->(to) ")
    void createRelation(@Param("from") String from, @Param("to") String to, @Param("relation") String relation);

} 

但在執行時,出現以下 runtime exception
Caused by: org.neo4j.driver.v1.exceptions.ClientException: Invalid input '{': expected whitespace or a rel type name (line 1, column 87 (offset: 86))
"match (from:User), (to:User)  where from.name={from} and to.name={to}  merge (from)-[:{relation}]->(to)"
                                                                                       ^
 at org.neo4j.driver.internal.net.SocketResponseHandler.handleFailureMessage(SocketResponseHandler.java:76)
 at org.neo4j.driver.internal.messaging.PackStreamMessageFormatV1$Reader.unpackFailureMessage(PackStreamMessageFormatV1.java:470)
 at org.neo4j.driver.internal.messaging.PackStreamMessageFormatV1$Reader.read(PackStreamMessageFormatV1.java:431)
 at org.neo4j.driver.internal.net.SocketClient.receiveOne(SocketClient.java:196)
 at org.neo4j.driver.internal.net.SocketConnection.receiveOne(SocketConnection.java:217)
 at org.neo4j.driver.internal.net.ConcurrencyGuardingConnection.receiveOne(ConcurrencyGuardingConnection.java:165)
 at org.neo4j.driver.internal.net.pooling.PooledSocketConnection.receiveOne(PooledSocketConnection.java:183)
 at org.neo4j.driver.internal.InternalStatementResult.receiveOne(InternalStatementResult.java:335)


How-To
根據 neo4j 於 gitlab 上的說明: https://github.com/neo4j/neo4j/issues/4334
目前在 relation 的部分,尚未支援參數化傳遞。因此,根據需求,須將其拆成兩個 methods,建立兩種不同的 relationships
package neo4j.springdata.repository;

import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import neo4j.springdata.vo.User;

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    
    @Query(" match (from:User), (to:User) " + 
           " where from.name={from} and to.name={to} " + 
           " merge (from)-[:WORKS_WITH]->(to) ")
    void createWorksWithRelation(@Param("from") String from, @Param("to") String to);
 
    @Query(" match (from:User), (to:User) " + 
           " where from.name={from} and to.name={to} " + 
           " merge (from)-[:IS_FRIEND_OF]->(to) ")
    void createIsFriendOfRelation(@Param("from") String from, @Param("to") String to);

}



2018/07/14

[Neo4j] 執行 neo4j-shell 時,出現 Connection refused 錯誤

Problem
當我要執行 neo4j-shell 時,出現以下錯誤:
F:\software\neo4j-community-3.3.3
λ bin\neo4j-shell 
ERROR (-v for expanded information):
        Connection refused



How-To
解決步驟如下:
(1) 到 neo4j 安裝目錄下,找到 conf 目錄下的 neo4j.conf 檔案

(2) 在 neo4j.conf 檔案中,找到以下設定值:
# Enable a remote shell server which Neo4j Shell clients can log in to.
#dbms.shell.enabled=true
# The network interface IP the shell will listen on (use 0.0.0.0 for all interfaces).
#dbms.shell.host=127.0.0.1
# The port the shell will listen on, default is 1337.
#dbms.shell.port=1337

(3) 將原本註解掉的值拿掉,修改並儲存:
# Enable a remote shell server which Neo4j Shell clients can log in to.
dbms.shell.enabled=true
# The network interface IP the shell will listen on (use 0.0.0.0 for all interfaces).
dbms.shell.host=127.0.0.1
# The port the shell will listen on, default is 1337.
dbms.shell.port=1337

(4) 執行 neo4j restart 即可
F:\software\neo4j-community-3.3.3
λ bin\neo4j restart
Neo4j windows service stopped
Neo4j windows service started


2018/07/13

[JavaScript] How to set an array of data to textarea ?

Problem
I have a textarea as bellows:
   <textarea class='form-control' id='sentencesToLabeledData' name='sentencesToLabeledData' rows='10' cols='50'> </textarea>

How to set an array of data totextarea? And each element should add new line character

How-To
An array has a method to glue all elements together, Array.join. Without an argument, it would use a comma (,) as glue. To put every element on a new line, use the newline character (\n).
   // entity.sentences is an array of String
   if (entity.sentences != null && entity.sentences.length > 0){
       // apply Array.join to set new line character to each array element
       document.getElementById("sentencesToLabeledData").value = entity.sentences.join("\n");
   }



2018/07/12

[JavaScript] How to convert textarea into an array?

Problem
I have a textarea as bellows:
   <textarea class='form-control' id='sentencesToLabeledData' name='sentencesToLabeledData' rows='10' cols='50'> </textarea>

I would like to get its value and convert into an array. How to do it?

How-To
Here has two steps to fulfill this requirement:
   // Step 1. get the value of textarea
   var sentencesToLabeledData = document.getElementById("sentencesToLabeledData").value;
   // Step 2. split the value of textarea by \n, then it will convert into an array
   var sentenceArray = sentencesToLabeledData.split('\n');



2018/07/11

[Mac] 如何新增照片 App 的相片圖庫?

Problem
如何新增照片 App 的相片圖庫?

How-To
先點選 option 按鈕,並同時點選照片 App



此時會出現 "選擇資料庫" 此視窗,點選下方 "新增" 按鈕即可


2018/07/10

[SQuirreL SQL Client] How to avoid An I/O error occurred while sending to the backend error

Problem
I am using SQuirreL SQL Client as my database client tool, but it is very annoying to get this error message when I do not use for a while:
An I/O error occurred while sending to the backend error

This error results from connection session timeout, how can I keep session alive?
It's very annoying to re-connect again.


How-To
Here has the process to iron out this annoying error:




2018/07/09

[PostgreSQL] How to insert data with new line character?

Problem
I have a table which name Test
The content column will have new line characters, I try to use \n to insert but in vain.
1
2
   insert into test (project_id, name, content) 
   values(5, 'test', 'aaa\nbbb');

How-To
I should use chr(10) instead of \n. Therefore, the SQL statement will be updated as bellows:
1
2
   insert into test (project_id, name, content) 
   values(5, 'test', 'aaa' || chr(10) || 'bbb');


2018/07/08

[PostgreSQL] Example for with...as..insert into

Problem
I try to get data from intent and utter_template, and insert data into story when data is not existed.


How-To
Here has the example:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
   with source as (
      select t.project_id, t.intent, t.utter_template, t.story_name
      from (
       select t1.project_id, '* _' || t1.value || chr(10) as intent, 
              '   - ' || t2.name || chr(10) utter_template, 
              'story_' || substring(t1.value from 4) story_name 
         from (select * from intent 
               where project_id=:project_id and value like 'qa_%') t1, 
              (select * from utter_template 
               where project_id=:project_id and name like 'utter_qa%') t2 
         where substring(t1.value from 4) =  substring(t2.name from 10)     
      ) t
      where (t.story_name) not in 
            (select name from story where project_id=:project_id)
   )
   insert into story (project_id, name, content) 
   (select project_id, story_name, intent || utter_template from source)


2018/07/07

[Git] How to remove directory from git repository?

Problem
I had committed and pushed target folder to git repository by accident. How to remove it?



How-To
You can remove target folder by the following process:




Here has the result after removing target folder




2018/07/06

[Java] How to compare two Integers in Java?

Problem
Here has a sample code to compare two Integers, why it return false?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  package test.albert;
  
  import lombok.extern.slf4j.Slf4j;
  
  @Slf4j
  public class App {
      public static void main(String[] args) {
          Integer num1 = 554;
          Integer num2 = 554;
          Boolean result = num1 == num2;
          log.debug("compare result = " + result);
      }
  }

How-To
Owing to == between Integer will check for its reference equality, so it will return false.
If you would like to compare with its value, you need to get its intValue().

Here has the updated sample code:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  package test.albert;
  
  import lombok.extern.slf4j.Slf4j;
  
  @Slf4j
  public class App {
      public static void main(String[] args) {
          Integer num1 = 554;
          Integer num2 = 554;
          Boolean result = (num1.intValue() == num2.intValue());
          log.debug("compare result = " + result);
      }
  }


2018/07/05

[閱讀筆記] Antifragile: Things That Gain from Disorder (2/10)


  1. Fragile 追求安定與平靜,antifragile 追求從失序 (disorder) 中成長,robust 則不在乎前述二者所在乎的事情
  2. 在 fragile 中,錯誤是罕見的,但是當發生的時候通常衝擊都非常大,且無法逆轉;在 antifragile 中,錯誤是被允許的,且錯誤都是小的且良性的,是可以被逆轉且能快速復原的
  3. 若你想讓自己變成 antifragile,你必須讓你自己喜歡錯誤,犯無數個小的、不會造成重大傷害的錯誤,並從中獲得成長,讓自己變得更強
  4. 每個人在不同面相會有不同的強度表現,有些面相比較 fragile,有些面相比較 antifragile,有些面相比較 rebust
  5. 反脆弱就是像希臘神話中海德拉 (hydra) 蛇一樣的怪物,它的頭被砍掉一個,就會長回兩個,因此它不但不介意,甚至是喜歡受到傷害。放眼於現今社會,有一些人在「黑天鵝」(即不可預測的重大事件)中,能夠獲得大量好處。像不死鳥火鳳凰(phoenix)引火自焚,在灰燼中重生的人們,因反脆弱受益
  6. 墨菲定律 (Murphy's Law) 說,如果一個系統可能出錯,它終將出錯。 其實這就是描述基於複雜性產生的脆弱性。當一個過程,一個系統,充滿相互關聯的步驟或者元素,而過於複雜,它的崩潰幾乎是一個時間問題。 因為這樣的系統由於非線性效應,一個元素的損壞將導致整個系統的損壞。 而由於系統內原件過多,出現一個原件損壞是早晚的事情。所以如果可能出錯,終將出錯。
  7. 分布函數是對隨機事件的最佳描述方法, 它把一件事的所有可能結果列舉出來,並且對應每個結果用一個數表達它發生的可能性。考慮分布,叫我們在高度隨機的事物面前考慮各種可能性,並根據每種可能的權重進行決策而非過度傾向某個選項。真正依據分布函數進行思維是很難的一件事,因為我們的大腦的天性是把一些可能無限放大另一些無限縮小,這些往往和我們的心情和剛剛收到的信息有關。比如常見的如果一個新聞剛剛播放了飛機事故,很多人就不敢做飛機,因為心理放大這種事情的機率。
  8. 分布函數的世界觀告訴我們,看待未來事件,我們要切實的把它看成一個多種可能性的疊加態,而不是非黑即白的確定態。對於經典物理的系統,平均數往往占支配性作用,熱力學裡衡量物理屬性的各個量,從溫度,到壓強都是平均數。但是平均數在複雜系統面前,往往不堪一擊。其原因在於-分布函數。
  9. 限制攝取熱量,似乎會使人更為健康,但豐盛會帶來相反的效果,偶爾不要限制熱量也可以解讀如下:飲食太過規律,反而對你不好,可能使他們的生活無法發揮充分的潛力。所以,所有的毒物興奮效應所做的事,似乎是重建飲食的自然數量和人的飢餓。換句話說,毒物興奮效應是常態,缺乏毒物興奮效應則會傷害我們。
  10. 少量的毒物會刺激酵母生長,而較大的劑量則會造成傷害。植物是以有毒的物質保護自己不受傷害和驅退掠奪者,而如果我們攝取正確的數量,或許能夠刺激我們的有機組織。同樣的,服用有限且劑量低的毒,會激發健康效益。
  11. 消除系統受到的壓力因子 (stressor),不見得是好事,未來反而會造成傷害。
  12. 醫生看到腫瘤,沒辦法不做有害的事,例如在放射、化學治療或兩者都做之後進行手術—這些,對人體的傷害大於腫瘤。心生恐慌的醫生和病人很容易跨越一個平衡點;去治療不會使你死亡的腫瘤,反而使你的生命縮短,因為化學治療是有毒的。我們對於癌症已有很大的偏執,往整條鏈回頭看,我們犯下稱作肯定後件(affirming the consequent)的邏輯錯誤。就算因為癌症而早死的所有人都長出惡性腫瘤,並不表示所有的惡性腫瘤都會使人因為癌症而死
  13. 「追求快樂」不等於「避免不快樂」。每個人要知道什麼事情(例如文字編輯、通勤、不好聞的味道、痛苦、在等候室看到某本雜誌等等)使我們不快樂,也要知道該拿它怎麼辦
  14. 依賴止痛藥,等於鼓勵人們不用試誤法去找出頭痛的原因,而原因可能是睡眠不足、頸部緊張或者承受惡劣的壓力因子
  15. 稱作「健康」的東西通常都不健康,正如「社群」網路根本反社群,以及以「知識」為基礎的經濟體,通常是無知的
  16. 如果真正的財富是由高枕無憂、意識清楚、相互感恩、不嫉妒、好胃口、肌肉強健、精力旺盛、經常開懷大笑、不獨自一人用餐、不上健身房的課程、從事體力勞動(或者嗜好)、胃腸蠕動良好、沒有會議室、偶爾來點驚奇,那麼這主要是靠減法(去除醫療傷害)做到的。
  17. 我們心中都有領域依賴(domain dependence),例如有人對醫藥的領域很熟悉,但是對社會經濟學則毫無所悉;又如學生在課堂學習到的知識,無法處理複雜的真實世界。人類常常無法清楚辨識自己所學的領域外的事物
  18. 知識份子傾向對隨機事件做出負面反應 (fragility) 而非正面反應 (antifragility)
  19. 過度補償機制(overcompensation)往往隱藏在最不可能的地方,長途飛行之后最好去健身房鍛煉以消除疲勞,而不是坐下來休息。還有一個眾所周知的小伎倆,如果你急著要完成某事,不妨將其交給辦公室里任務最繁忙,或者第二繁忙的那個人去做,大多數人的空閑時間都會被浪費掉,因為空閑時間會讓他們無所事事,懶惰,無心向學,而一旦他們忙起來,他們往往會在其他任務上也更為積極
  20. 之前別人說的演講者說話的聲音要響亮的建議是錯的。如果是為了觀眾好,演講者的說話的聲音最好是讓觀眾必須努力才能聽得清,這有助于他們切換到積極的思維模式,因為他們在努力的聽,所以此時精神非常集中,而精神集中可以幫助我們進入更高的思維層面,激活更具活力、更善于分析的大腦機器。
  21. 針對自己的弱點不斷練習與強化,過度補償的結果,此一弱點變成自己的長處。
  22. 越忙的人做事越快越有效率,越不忙的人做事反而越慢/沒效率
  23. 許多空難的發生,往往是因為自動駕駛讓飛行員太舒適、造成注意力渙散與反應遲緩。受到壓力與刺激,才能把個人或組織的潛能激發出來
  24. 體力與組織能耐往往都隱藏相當的redundancy備餘,這些備餘在平常看似浪費,直到不尋常的事情發生。redundancy 儲備可以是保險也可是投資,一但機會或外部環境壓力變化,不但更可能存活,更能夠趁機超越對手或獲得利益
  25. 反脆弱是被壓力與傷害激發出來的過度補償 (overcompensation),讓你能夠適應更大壓力與挫敗的極端情境
  26. 讓我們受益最多的,往往是那些企圖傷害我們的,而非那些提供幫助給我們的
  27. 風險管理專家常利用過去的資訊,也就是 worst-case scenario 來針對未來風險進行預估,這方法成為壓力測試。但是這樣的預估只能應付上一場最嚴重的天災,大自然的力量常會令你出乎預料。回想 2011 年的福島核電廠遭受海嘯攻擊,當初建設核電廠已經根據過去最強的地震來預防,結果卻遭受海嘯侵襲
  28. 我們無法透過過去的歷史來預測罕見事件的發生
  29. 激發潛能的方法是,專注突破你的極端上限,而非提高平均表現水平
  30. 生命以不失去為勝利,賺錢以不破產為底線,速度不是第一,安全才是終點。風會熄滅蠟燭,也可能使火越燒越旺


2018/07/04

[閱讀筆記] The Little Book That Builds Wealth (6/7)


  1. 帳面價值法只適用於資產龐大且資產可以代表未來價值的股票,例如:鋼鐵、水泥業
  2. P/E (本益比) 是一個難以辨認好壞的數字,某間公司的 P/E = 14 可能是好的、也有可能是壞的,除非我們了解這間企業或產業的狀況,或是有個可以比較的基準點 (benchmark) 來比對
  3. 一間企業較別人擁有較低的 P/E 可能是件好事,也有可能是件壞事,例如低 P/E 可能源自於較低的資本回報率、缺乏健全的成長展望等
  4. 若你是拿一間企業的 P/E 與整個市場的平均 P/E 比較,也是有相同的限制。例如在 2007年中,Avon Products P/E 是 20,相對於市場平均 P/E 為 18 的確是有點昂貴,但是Avon 擁有廣泛的經濟護城河、40% 的資本回報率且在西興市場有健全的成長展望。或許,20並不是個太昂貴的數字
  5. 有些投資人會用過去的 price-earnings ratios 與現在做比較,藉此判斷目前股價是否被低估 (undervalue),如現在是營收的 20 倍,過去則是介於 30~40 倍,乍看之下似乎是嚴重低估。但是這必須是在相同的成長展望、資本回報率與競爭位置皆相同的前提下比較才有意義,只要有任何一個因素改變了,就不是個恰當的比較基礎。記住過去績效可能無法保證未來的結果
  6. 每股現金流(Cash Flow Per Share)是指企業在不動用外部籌資的情況下,用自身經營活動產生的現金償還貸款、維持生產、支付股利以及對外投資的能力,它是一個評估每股收益“含金量”的重要指標。
  7. 市現率(Price Cash Flow Ratio,PCF)是股票價格與每股現金流量的比率。市現率可用於評價股票的價格水平和風險水平。市現率越小,表示上市公司的每股現金增加額越多,經營壓力越小。對於參與資本運作的投資機構,市現率還意味著其運作資本的增加效率。
  8. 盈餘殖利率(Earnings Yield) = 本益比的倒數= EPS / 股票價格。看本益比,你關心的是『股價有沒有漲』,看 盈餘殖利率 (Earnings Yield)你關心的是『公司的獲利能力』。
  9. 盈餘殖利率就是買一間公司的獲利,他是本益比的倒數,也是外部股東報酬率使用盈餘殖利率的時候要扣掉一次性業外收益,虧錢的公司就沒有盈餘殖利率。如果想比對投資標的那個划算,可以比較他們的盈餘殖利率。
  10. 當你在進行選股時,我有五個建議
    1. 永遠記得驅動股票價值的四個動力:風險、資本回報率、競爭優勢與成長。你應該遠離高風險的個股,選擇擁有較高資本回報率的公司、擁有較強壯的競爭優勢的公司、擁有較高成長展望的公司。
    2. 使用多個分析工具進行驗證:若某個分析工具顯示此間公司很便宜,用另外一個工具分析看看,不同工具的分析結果可能相左。但是若你用多個分析工具都得到相同的結果,那麼你就可以比較有信心找到便宜的個股
    3. 耐性等待合理的價位:當你分析出一串值得擁有的觀察清單,你就該耐性等待。若難以下決策,記得一件事:沒有賺錢打敗賠錢
    4. 危機入市:當報紙頭條都是好消息,通常此時價位都已經偏高;只有在負面新聞接連爆且投資人過度反應時,價位才會便宜。你必須在別人賣出的後買進,但是這不是件容易的事情
    5. 做你自己:不要聽信理專或是別人的給你的投資建議,要自己建立起投資該具備的知識,自己做出投資決策
  11. 一間擁有長期潛在成長機會、擁有低資本投資支出、低競爭與合理風險的公司,比擁有類似成展展望,但是擁有較低的資本回報率與不確定的競爭展望來得值得投資
  12. 你應該選擇高資本回報率的公司作為投資標的,而非低資本回報率的公司
  13. 用一個過高的價格購買了全世界最佳的企業,注定是個壞投資
  14. 若一家公司擁有潛在的較好的利潤,但是目前擁有非常低的 price-to-sales ratio,這可能就是個 cheap stock 的訊號。超級強勢股的 price-to-sales ratio 市銷率可能在0.75 以下,建議避免買入 price-to-sales ratio 市銷率大於1.5的股票
  15. Price-to-book ratio (股價淨值比) 用來分析金融服務業非常有用,因為這類公司的 book value (帳面價值) 可以貼近地反映企業的真實地險性資產的價值。
  16. 為什麼 Price-to-book ratio (股價淨值比) 適合用於金融業?因為金融業的資產是現金、股票、債券或房地產,都是可以錢滾錢的資產。若用於電子業,其資產有可能是機器或廠房,有可能是賣不掉或根本不會賣的資產,此指標就無意義
  17. 要小心 Price-to-book ratio (股價淨值比) 非常低的企業,這代表這間企業的 book value (帳面價值) 可能是有問題的
  18. 要注意 P/E ratio (本益比) 中的 Earning 這個數字,因為預測的 earnings 通常都不準確。earnings 這個數字必須要看企業過去在順境與逆境時的表現,來預測未來的平均 earning 的預估值
  19. 市現率(Price Cash Flow Ratio,PCF)是股票價格與每股現金流量 (指企業在不動用外部籌資的情況下,用自身經營活動產生的現金償還貸款、維持生產、支付股利以及對外投資的能力) 的比率,用於評價股票的價格水平和風險水平。市現率越小,表示上市公司的每股現金增加額越多,經營壓力越小。但是要注意這數字裡面有沒有包含大量的 hard assets 會折舊且在未來某一天會被替換掉。
  20. 當你想賣出股票時,想想以下幾個問題,若你無法回答一個以上的YES,不要賣出:
    1. 此次投資我是否有犯了錯誤? (這應該是你最痛苦的理由)
    2. 此間公司的經營狀況是否轉壞?
    3. 我的錢是否有更好的擺放位置?
    4. 此檔股票在我的投資組合是否佔太大的比例?
  21. 許多心理學研究顯示,人類在面臨獲得或損失一千元時,損失的痛苦是獲得的快樂的兩倍,即便是金額是一樣的狀況。這樣的心理反應會讓我們聚焦於不相關的資訊,你購買時的價格與企業的未來展望毫無關係,是公司的經營狀況才會影響股價
  22. 當你要做出賣出的決定時,不該與股價有任何關係,應聚焦於發生什麼事情、或可能會發生甚麼事情,聚焦於你所擁有的股票的價值而非價格
  23. 因為股價下跌而賣出是不明智的,除非企業的價值也跟著下降;因為股價一飛衝天而賣出也是不明智的,除非企業的價值沒有跟著上升
  24. 投資人很常利用股票過去的表現來決定是否要賣出股票,記住,重要的是你預期企業未來的表現,而非過去的股價。認為股票漲到過去的高點就該下跌,這是毫無道理的;認為股票跌深就應該反彈,也沒有道理
  25. 賣出股票時,你應該聚焦於企業的未來表現,而非過去的表現