2021-07-10

80後的美好年代

    封筆許久,因緣際會來微解封一下.嗯...希望可以就此積分起來.

    近日才又承租N家的線上影音串流,拜賞一部日前討論熱烈且被封為神劇的The Quees's Gambit,其中一幕劇情是Beth已經獲得美國公開賽冠軍,名滿天下的時候在賣場巧遇高中同學推著嬰兒車瞎拼酒採購時的一段聊天,高中同學對著能夠靠比賽而四處跨州甚至是跨國旅行的Beth透露著欽羨的眼神.這幕讓我這種凡夫俗子突然有種好險自己是生80年代後的人. 

    在我們80年代初期出生的這一輩,並沒有戰後嬰兒潮團塊世代的人口紅利加持,加上自己更衰尾剛好落在人口出生率最高的那幾年,想當然而在資源相同,但競爭肯定遠比團塊世代人競爭來得激烈,從近年來已開發國家的人口出生率瘋狂下降、結婚年齡晚、不婚主義、草食主義橫行的社會現象早已不言而喻,更別提那節節攀升的房價... 

    但這樣的現代社會卻讓平凡的小我似乎可以更加悠遊,我們不需要才氣縱橫、也不需要功成名就,一年中只要有一段時間好好工作,然後就可以透過休假或一些轉換就讓自己環遊世界,更別提現在的網路與資訊發達,基本上只要一只背包、一本還沒過期的護照、一些存款、智慧型手機加上一點點勇氣,隨時都可以買張機票就前往世界各地,到當地再用APP找尋住宿都還來得及. 

    也許我們沒有著團塊世代的優勢,但我們有的是80後的新美好年代.

2018-03-12

[JAVA] How to type " underline _ " character using java.awt.Robot

java.awt.Robot is a very powerful library to control and simulate human's keyboard type and mouse click actions. But some special characters like "_" (the library contanst is KeyEvent.VK_UNDERSCORE) will invoke an error as follow.

       
Exception in thread "main" java.lang.IllegalArgumentException: Invalid key code
 at sun.awt.windows.WRobotPeer.keyPress(Native Method)
 at java.awt.Robot.keyPress(Robot.java:243)


The solution is:
       
public void underline() {
    keyPress(KeyEvent.VK_SHIFT);
    keyPress(KeyEvent.VK_MINUS);
    keyRelease(KeyEvent.VK_MINUS);
    keyRelease(KeyEvent.VK_SHIFT);
}

public void keyClick(int k) {
    keyPress(k);
    delay(50);
    keyRelease(k);
}


Cheers.



2017-12-28

用AI向經典StarCraft致敬: 安裝建置Deepmind pysc2


好久沒寫文啦,歲末年終,照慣例總要寫個文來收個尾,今天讓7年級頭的在下用AI向經典的PC即時對戰遊戲Startcraft星海爭霸致敬。

暨Deepmind研發的Alpha GO在圍棋領域大敗人類後,現在他們要向即時戰略進軍啦。雖然個人是不太看好能在近年就有所突破,畢竟兩款Game在本質複雜度就不是同個檔次,但這不是本文討論範圍。大概是今年五月就有發出消息,然後Deepmind八月釋出pysc2的操作tool開源專案連結在此。

pysc2是暴雪跟Deepmind兩間公司合作的開源API,用來操作模擬人類操作Starcraft這款遊戲,看到py就知道這是用python寫的小工具,sc2就是目前只支援starcraft 2(可是我只會玩一代,泣),以下是安裝建置Deepmind pysc2說明。

[系統環境]

  • Windows 10(打遊戲方便...)
  • Blizzard Starcraft II,現在免費,要裝趕快~
  • Python 2.7+ 或 3.4+

[安裝步驟]

  • 首先安裝python環境,請自行搜尋python安裝檔.msi,我的版本是2.7.8
  • 然後去設定python的系統環境變數,請開啟控制台 => 系統 => 環境變數,新增 %PYTHON_HOME%,值應該是 C:/Python27;再來於 path 補上 ;%PYTHON_HOME。大致上就是一般補環境變數,方便 cmd 操作。這裡要注意的是,Windows 10似乎要重開機才會生效,倒是跟之前的版本設定後立即生效不一樣。
  • 再來裝一下pysc2,
    • 先下載src: $ git clone https://github.com/deepmind/pysc2.git
    • $ pip install pysc2
  • 再來要先抓地圖,否則工具跑不起來,放在 StarcraftII/Maps/ 資料夾中,沒有的話就自己建吧
[執行]
  • 執行Agent (default)
    • $python -m pysc2.bin.agent --map Simple64

2017-04-07

[Basketball] 為什麼NBA球員就算裁判已經響哨,還是要去蓋對方球員的火鍋


    不知道常看NBA的大家有沒有注意到一個現象,當比賽暫停,裁判都已經吹哨了,這時候如果A隊球員如果投球,B隊球員怎樣就是要去刪他火鍋(是手癢嗎)

    其實這跟運動心理學還有人類大腦有關,當球員能順利投進球(不管是否比賽進行中),大腦會因為"進球成功"這件事情分泌多巴胺,多巴胺的分泌可以讓球員不僅心理上的快樂,連帶體力跟精神都能更加維持。其二,讓對方多投籃一次,不管投進與否都會給對方調整的機會,手感不好可以修正彈道,手感順的人可以更順(順啦~)

    所以常打球的你應該會發現,如果某一天你的手感特別好,就會越投越順,即使跳了三天三夜也不會累;或者有項運動:"桌球"更能體現多巴胺的神效,只要成功把球打進檯面腦內就分泌多巴胺,恰恰好桌球可以在極短時間、極短距離就大量完成"打進檯面"的成功激勵,所以初學者很容易上癮打桌球,即使打不好一直撿球也會樂此不疲(真心不騙)

    另外,投籃不進也會讓球員肌肉緊繃(下意識),產生些微意志沮喪的心情。


    總而言之,如果我是敵隊球員,當然不會給對手製造任何製造多巴胺的機會,不讓你找到投籃進球的節奏,就算裁判響哨比賽暫停,我還是要刪你火鍋,蓋到你的。

2017-03-09

[砸七砸八] 遷移自建Docker私有庫 & 客製化公有庫Docker並納入私有庫

最近用了一些Dockerfile與docker的東西,快速筆記一下避免忘記:

[遷移自建docker registry]

  • 想自建docker registry(也就是docker image repository倉庫)自有庫,很簡單,直接到官方docker build一下就可以自建倉庫,略述。
  • 當自有庫運行一段時間,你在上面已經有了大量自建的docker image後,如果想要遷移,這時候你可以把整個registry做docker打包,然後tar起來並且壓縮,略述。
  • 接著把壓縮的registry tar用一般檔案搬移的方式mv/cp/scp/rsync到任何新的宿主機HOST上,把他解壓縮並docker run就可以繼續執行。
    • 參考指令(以下僅為範例指令,請依當下環境自行修改)。
    • #docker run -d -p 4000:5000 --restart=always --name registry-name -v 'pwd'/your-data:/var/lib/registry registry:version

  • 無網路問題,因為container共享HOST網路。

[客製化公有庫的Dockerfile & 納入私有庫]
  • 網路上很多公有庫的docker很好用,但總是需要客製化,無所謂,反正就是拿他的Dockerfile來修改。

  • 修改後重建指令
    • #docker build -t "sean/docker-image:v030901" .
  • 貼上自有庫registry認得的tag
    • #docker tag -f sean/docker-image:v030901 ${registry_ip:registry:port}/${project}/${docker-image-name}:${tag_version}
  • 上傳到自有庫方便自己使用,可以跟自己的CI/CD流程自動化串整
    • #docker push ${registry_ip:registry:port}/${project}/${docker-image-name}:${tag_version}

2017-01-18

陪你讀冊 | 決斷兩秒間(Blink: The Power of Thinking Without Thinking)

圖片來源:Blink: The Power of Thinking Without Thinking

    受到羅輯思維視頻啟發,以往個人看書,都是看過、畫重點後就把書擱在一旁,看過的書目其實不少,但真要從記憶殿堂中把知識取出再利用的成效明顯不彰(汗...)。而羅輯思維推出的"得到APP"其中之一萬維鋼欄目的知識積累方法,是透過將自己看過的書寫成筆記,以撰寫的方法進行梳理自己的邏輯思維。

    最近迷上Malcolm Gladwell的書籍,從最早的異數:超凡與平凡的界線在哪?開始閱讀,陸陸續續又買了以小勝大:弱者如何找到優勢,反敗為勝?引爆趨勢:小改變如何引發大流行、還有本次文章要提到的決斷2秒間:擷取關鍵資訊,發揮不假思索的力量,等有空會一本本把閱讀手札補上。

    決斷2秒間:擷取關鍵資訊,發揮不假思索的力量所有探討的主題圍繞在"薄片擷取"理論,所謂薄片擷取指的就是人可以透過數年成長歷練的經驗以及知識,在很短的時間只要看過一眼,就可以得出一個可能比運作數個月的研究工作團隊還精準的判斷,為此書裡舉了一個美國加州蓋提美術館(J. Paul Getty Museum)在1983年買到假大理石雕塑(Getty kouros)的故事做為引述。

2016-11-04

[Selenium] How to solve org.openqa.selenium.remote.ProtocolHandshake createSession problem

    近期用 Selenium 在沒有更新任何源碼的情況,再次執行後遇到以下錯誤:


Starting ChromeDriver 2.23.409699 (49b0fa931cda1caad0ae15b7d1b68004acd05129) on port 21975
Only local connections are allowed.
十一月 04, 2016 1:55:08 下午 org.openqa.selenium.remote.ProtocolHandshake createSession
資訊: Attempting bi-dialect session, assuming Postel's Law holds true on the remote end
十一月 04, 2016 1:55:10 下午 org.openqa.selenium.remote.ProtocolHandshake createSession
資訊: Detected dialect: OSS
Exception in thread "main" org.openqa.selenium.NoSuchSessionException: no such session
  (Driver info: chromedriver=2.23.409699 (49b0fa931cda1caad0ae15b7d1b68004acd05129),platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 4 milliseconds
Build info: version: '3.0.0-beta4', revision: '3169782', time: '2016-09-29 10:30:04 -0700'


    解法是要將 ChromeDriver 2.23 更新到 2.25 即可,不過這點還滿弔詭的,因為我個人並沒有更動到任何既有源碼或更新 Selenium 套件,代表 ChromeDriver 本身一定有做一些檢查,這點有空再來研究。

[額外資訊]

2016-11-03

Ubuntu安裝Java JDK 7或JDK 8

介紹於 Ubuntu 14.04 / 16.04 上安裝 Java JDK 7 / 8 的方法。

[說明]
當網路環境處於離線,或不一定直接能存取到internet仰賴proxy時,使用ppa的安裝基本會失效,乾脆到官網上下載 jdk 檔案然後直接進行設定反而是最快的做法。

[步驟]
  1. 請至官網下載JDK,我們這裡用 jdk1.8.0_111 這個版本作為示範,請自行替換版號。
  2. 建立 Ubuntu 的 jvm 目錄,指令:
    • #sudo mkdir /usr/lib/jvm
  3. 將下載的 jdk 檔案解壓縮到 jvm 目錄,指令:
    • #sudo tar -zxvf jdk-8u111-linux-x64.tar.gz -C /usr/lib/jvm
  4. 再來要將 java 預設路徑告知系統,請:
    • #sudo vim ~/.bashrc
    • 添加以下內容
    •        
      export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_111
      export JRE_HOME=${JAVA_HOME}/jre
      export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
      export PATH=${JAVA_HOME}/bin:$PATH
      
      
    • 使環境變數生效
    • #source ~/.bashrc
  5. 然後執行以下步驟,讓 Ubuntu 認得這個版本的 JDK
    • #sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_111/bin/java 300
    • #sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_111/bin/javac 300  

2016-11-02

[Ubuntu] 設定ssh可遠端用密碼登入

    某些版本的Ubuntu預設沒有開啟ssh遠端用帳密登入的權限,所以當你使用Puttie等連線軟體的時候會遇到登入錯誤,解法如下:

  1. 直接到Server上登入Ubuntu Console
  2. #sudo vim /etc/ssh/sshd_config
  3. 將 PasswordAuthentication 變數由 no 改為 yes
  4. 重啟ssh service,指令:/etc/init.d/ssh restart
  5. 即可由遠端透過ssh登入
  6. #sudo -s
  7. #passwd

2016-10-29

[自動化網頁測試] 於Ubuntu使用Selenium整合Headless Firefox

這裡介紹Geb(瀏覽器自動化browser automation)的解決方案Selenium + Headless Firefox。

[環境與工具]

  • Ubuntu Server 14.04 LTS
  • JDK 1.8.0_91(注意!! jdk 1.7 Selenium 會有問題)
  • Ubuntu沒有GUI,需要使用xvfb(x window virtual framebuffer)作為headless browsergraphic render
  • Web Driver
    • firefox webdrivergeckodriver-v0.10.0
    • google chrome webdriverchromedriver_win32 / linux64
    • 請自行下載並注意執行環境平台
[xvfb & firefox]
  • 安裝指令
    • #sudo apt-get install firefox xvfb
  • 安裝過程如果缺少字型
    • #sudo apt-get update
    • #sudo apt-get install -y xorg xvfb dbus-x11 xfonts-100dpi xfonts-75dpi xfonts-cyrillic
  • 啟動xvfbgraphic render,頻道0~99任選,1280x960x16為模擬視窗大小,目前使用此值運作正常
    • #Xvfb :99 -ac -screen 0 1280x960x16
  • 擷取xvfb畫面

2016-09-14

在Macbook Pro使用Bootcamp安裝Windows10

基於與在下公司方便共事 + 個人是Apple Macbook系列的硬體控(沒有任何品牌的laptop質感比得上),所以必須委屈讓個人的MBP安裝Windows 10。

[注意事項]

  • 新版的安裝方式跟Windows 7不同,不過變得更方便了!!


[硬體]

  • Apple Macbook Pro 2015
  • Bootcamp
  • 安裝Windows 10
[安裝步驟]
  1. 先登入Mac OS,啟動應用程式工具的Bootcamp
  2. 準備Windows 10.iso,並存檔於Mac OS
  3. 啟動Bootcamp,輸入iso的檔案路徑,連上網路,Bootcamp會自動幫你下載需要的硬體驅動程式;再來就是選定你要給定Mac OS跟Windows的磁碟空間大小,最後點選下一步便會開始安裝作業。
  4. Windows 10安裝步驟,略。
  5. 順利安裝Windows 10後,最重要的是安裝驅動程式,這個比較不好找,要點選[開始] -> [檔案總管] -> [電腦],這時候C槽圖示下面你會看到還有個iso掛在那邊,不要懷疑,你需要的驅動程式就在裡面,不用再自己去抓啦(想抓也抓不到...我花時間找很久)。點進去資料夾,裡面應該有[Driver],點選Setup即可!!

2016-09-10

使用Visual Studio 2015製作Cordova的Android APK(可上架至Google Play)


前些日子的文章提到,Microsoft Visual Studio 2015 針對 Mobile APP 開發相當友善,近日用其 Cordova 套件來開發,推薦大家使用;今天跟大家介紹如何使用Visual Studio 2015製作Android APP的android-release.apk,以便發佈到Google Play。

[製作keystore]

  • Cordova建置Android APP分為兩個階段,分別為Debug、Release,上架至Google Play上的APP需要開發者的金鑰簽署,以下是簽署指令
  • 使用jdk的keytool製作金鑰,一般而言放置路徑會在C:\Program Files\Java\jre1.8.0_91\bin
  •        
    #keytool -genkey -alias your-key-name.keystore -keyalg RSA -validity 20000 -keystore you-key-name.keystore
    
    

[設定keystore資訊於Cordova專案]
  • 有兩個檔案需要設定,其一是[專案] -> [res] -> [native] -> [android] -> ant.properties,請自行填入方才製作的keystore資訊

  • 其二為[專案] -> [www] -> build.json,編輯後會像是

2016-09-08

北京坑錢事件簿

背包旅行多次的經驗
讓我深刻體會到,剛到某個國家前幾天一定都會被坑到錢
在大陸當然也不例外

事件一:
出機場因為行李繁多,計程車一台不願意載我們兩人
所以我和同事就包了台廂型車前往住宿飯店
要價650RMB,還沒得殺價
到了飯店,得知其他同事跳錶的計程車資才110RMB...XD

事件二:
在飯店附近的小店購買手機易付卡
店家開價65,我們就說早上來個同事才買55,
店家立刻說他記錯了...改算我們55
事後我們問了房仲,他們買只要50~

事件三之一:
我在小區附近的美廉美超市買了P牌吹風機,178RMB,
隔天在鬧區的大賣場看到特價99RMB....(吐血)

事件三之二:
同事U在美廉美超市也想買吹風機,標價約95,
然後他在閒聊中隨口說了:"喔,好貴喔"
服務員馬上說:"我們現在有做特價,只要75"
得知:在賣場也可以殺價~

事件四:
同事C在超市買了盒保鮮膜包起來的四根香蕉,7.5RMB
回家後發現壓在底下的兩根是爛掉的...