摸摸嚕嚕

從 Hello World 開始

以後想到再補

Vim

Vim 操作 指令
編輯 Esc -> i
存擋 Esc -> :w
離開 Esc -> :x or :q
向下搜尋 Esc -> / -> “搜尋字串”
向上搜尋 Esc -> ? -> “搜尋字串”

Linux 一些簡單常用指令

終端機 操作 指令
列出路經中所有檔案 ls or ls -al
複製檔案 cp <原本的檔案> <目的路徑&檔名>
搬移檔案 mv <原本的檔案> <目的路徑&檔名>
顯示目前路徑 pwd
切換路徑 cd <你想去哪裡>
顯示 ip ifocnfig (無線請看 wlan零 )
掛載 usb mount /dev/sda* /media/removeable
有機會是 sda1 or sdb,要看狀況
重啟某些 service restart <service>restart cras
重開機 reboot
建立資料夾 mkdir <資料夾名字> or mkdir -p <路徑 + 資料夾名稱>

Dut

DUT指令說明 指令
Release Information cat /etc/lsb-release
System Information crossystem
目前專案名稱 cros_config / name
重開機 reboot
安裝 chomeOS chromeos-install --y
更新 fw (fwupdater) chromeos-fwupdater --mode factory
設置 sku id ectool cbi set 2 <sku_in_Hex> <byte_count>
設置 fw config ectool cbi set 6 <sku_in_Hex> <byte_count>
取得 sku id ectool cbi get 2
取得 fw config ectool cbi get 6
解除 rootfs /usr/share/vboot/bin/make_dev_ssd.sh -f -r
更新特定 FW futillty update -i <fwImage.bin>
更新 ec flashrom -p ec -w ecImage.bin
查看 audio 設定 ps -C cras -o cmd
查看 cras 路徑 cros_config /audio/main cras-config-dir
查看 ucm 路徑 cros_config /audio/main ucm-suffix

補個範例操作:
情境大概是:我把 3rd 調整後的 Audio 檔案放在 usb 中,想要進行測試。

  1. 先解除 rootfs: /usr/share/vboot/bin/make_dev_ssd.sh -r -f

  2. 沒登入的情況下 -> 掛載 usb mount /dev/sda /media/removeable;有登入系統會自行掛載

  3. 看是不是要創建資料夾: mkdir

  4. 放 Audio 檔案到指定路徑: cp or mv

  5. 確認好後重啟 Audio service: restart cras

工作上雖然經常用的編輯器是 vim
但部份時候因為恢復原廠設置或是某些東西改版,常常會改用 nano
簡單的介紹一點點指令作為備忘錄:

  • 外觀

    vim 不同的是, nano 在最底部都會有一些指令的提醒

  • 行為
    vim 需要按 i 才能夠開始編輯;nano 則不用,隨時都可以編輯

  • 簡單指令:

  1. 在終端機中輸入:nano or nano <filename>,則會開啟 nano 或是用 nano 開啟檔案

  2. Ctrl + o -> Enter:存擋

  3. Ctrl + x -> Enter:離開 nano

    需注意:如果有編輯檔案但未存擋就按準備離開
    nano 會提示是否把 buffer 中的內容存到某個檔案
    若不想更換檔名就直接按兩下 Enter 離開

  4. Ctrl + w:尋找某個關鍵字

以上是比較常用的一些用法

Descroption:
給定一個 nums 的 integer array ,與一個 target k
請在 nums 裡找到兩數相加之合為 k

Read more »

OpenNI


OpenNI = Open Natural Interaction. 開放式自然相互作用(我到底在寫什麼 … Orz)

簡單的說 有點像是將身體的姿勢與擺動作或是聲音作為一種輸入裝置,讓系統做出對應的行為或是判斷;最常看的應該就是微軟當年在X-Box推出的Kinect.
Kinect所使用的OpenNI的晶片組,是由一間名為PrimeSense的以色列公司生產,而OpenNI專案的開發與維護也是由PrimeSense所主導. 不過該公司目前已經被Apple收購

OpenNI主要分成兩個大版本:1.5x 與 2.2x;這兩個版本不能互相相容,使用上也有些不一樣,本文以針對1.5為主.

Setup build environment


  1. 請先安裝 XCode (Using App Store),如果可以先可以先申請為 Apple Develpoer.
  2. 請先安裝XCode command line tools ->xcode-select --install
  3. 安裝 Doxygen $ brew install doxygen
  4. 安裝 GraphViz $ brew install graphviz
  5. 安裝 Mono $ brew install mono
  6. git clone https://github.com/OpenNI/OpenNI.git
  7. 要安裝 libusb. 因為 MacPort 我裝不進去,使用 Homebrew 安裝的版本太新(1.0.21,但是需要的是1.0.8). 建議使用剛剛clone下來的 libusb:
  • 請先到剛剛clone的目錄,然後進到 cd Platform\Linux\Build\Prerequisites\
  • 解壓縮 tar -xvjf libusb-1.0.8-osx.tar.bz2
  • cd libusb -> ./autogen.sh
  • ./configure LDFLAGS='-framework IOKit -framework CoreFoundation -arch i386 -arch x86_64 ' CFLAGS='-arch i386 -arch x86_64' --disable-dependency-tracking --prefix=/opt/local
  • make
  • sudo make install
  • 此時應該會把libusb裝到 /opt/local/
  1. vim Platform/Linux/CreateRedist/install.sh 將所有/usr/路徑修改為 /usr/local/. Ex: /usr/bin -> /usr/local/bin
  2. vim Platform/Linux/Build/Makefile 同上修改
  3. vim Samples/NiViewer/glh/glh_linear.h: 因為equivalent(a,b) 似乎與macOS內建的function有重複定義. 所以將glh_linear.h中有equivalent修改為glh_equiv

Build


  1. cd Platform/Linux-x86/CreateRedist, 執行 ./RedistMaker, 此時應該會開始build了. 如果沒報error就是build成功了.
  2. Platform/Linux-x86/Redist 然後 sudo ./install.sh 就大功告成了.

附上成功執行NiViewer的圖片
NiViewer

這個時候一定要罵一下Logdown, 我真的不相信會隨意放生自己產生的一個平台的人當講師會多有幫助

設定Github

  1. 請先到你的github建立一個repository: 命名規則是<your-account.github.io>
  2. mkdir <Your blog folder> && cd <Your blog folder> 可以隨意取無所謂
  3. git clone 這個repository
  4. 請記得設定 userName 跟 Email
$ git config --global user.name "username"
$ git config --global user.email "email address"  
  1. 還有請記得設定 ssh-key:
$ ssh-keygen -t rsa -C "email address"

設定 Hexo

  1. 安裝 nodeJS
  • MacOS :
$ brew update  
$ brew install node #應該會連同 npm 都安裝完成
  • Ubuntu :
$ sudo apt update
$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -  
$ sudo apt-get install -y nodejs  
or  
```bash
$ sudo apt update
$ curl -sL https://deb.nodesource.com/setup_7.x |   sudo -E bash -  
$ sudo apt-get install -y nodejs
- 確認版本

$ node -v # 確認 node 版本
$ npm -veriosn # 確認 npm 版本

- 參考資料
[Ubuntu install NodeJS](https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions)  
[MacOS install NodeJS](https://nodejs.org/en/download/package-manager/#osx)
2. 安裝 Hexo  

$ npm install -g hexo-cli # -g 全域安裝

3. 進到剛剛 *git clone* 的資料夾:  

$ hexo init
$ npm install

4. 修改參數:  
  此時 Blog 的環境設定幾乎都在 `_config.yml`, 請記得修改該設定檔案.
  ```bash _config.yml
 # Site
 title: <Your blog Name>
 subtitle:
 description:
 author: <Your real name or nickname>
 language: zh-tw
 timezone:

 # URL
 ## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
  url: https://<your name>.github.io
  root: /
  permalink: :year/:month/:day/:title/
  permalink_defaults:
 # Deployment 
 ## Docs: https://hexo.io/docs/deployment.html
deploy:
  type: git          # <-- 請修改為 git
  repo: https://github.com/<username>/<username>.github.io.git  
  branch: master  #  <-- 我沒有修改其他的branch 

其實還有很多設定,以後在慢慢寫

此時應該已經算是完成,現在嘗試一下發表文章看看

撰寫文章與發佈

  • 使用 hexo new <title> 新增一篇文章!大概會長這樣:
title: <title>  
date: 2017-03-28 23:26:54
tags:

(請別忘記這是 markdown語法)
認真寫好你的blog後:

$ hexo clean
$ hexo generate   # mac 上可以直接輸入 hexo g
$ hexo server       # mac 上可以直接輸入 hexo s, 請在http://localhost:4000預覽blog

預覽後如果不滿意就趕緊修 xDDD. 存檔後重新刷新瀏覽器介面就可以確認剛剛修改是否有誤.

  • 將文章佈屬到 github上: hexo deploy
    如果有問題無法佈署,請安裝套件:
    npm install hexo-deployer-git --save
    成功發佈後,應該在 https://<your name>.github.io/可以看到剛剛編輯的文章

如果你想換台電腦寫部落格

我是參照以下步驟做的,個人覺得應該可以work。

  1. 請在 gitbub 另外開一個 repository, 並在舊電腦上 commit 所有得文章與環境設置. (如果theme底下有 .git目錄,請用rm -rm .git, 確保theme會被加到新的git)
  2. push 文章與環境到新的 repository
  3. 在新電腦中,請一樣安裝 git 與 所提到的環境
  4. 在新電腦中安裝 nodeJS
  5. 請不要執行 hexo init
  6. git clone 網誌的 repository (Ex: account.github.io)

這樣應該就可以動了

Docker

Docker Wiki

Docker import :

docker-import - Create an empty filesystem image and import the contents of the tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then optionally tag it.
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] [--help] file|URL|-[REPOSITORY[:TAG]]
範例: docker import http://127.0.0.1/ubuntu1604_.tar.gz ubuntu1604_i686_env
從遠端匯入一個容器(Container) 放到本地的repository

Docker load :

docker-load - Load an image from a tar archive or STDIN.
docker load [--help] [-i|--input[=INPUT]] [-q|--quiet]
範例:sudo docker load --input ubuntu_14.04.tar
--input = Read from a tar archive file, instead of STDIN. The tarball may be compressed with gzip, bzip, or xz
從本地端(local)載入image

Docker run :

docker-run - Run a command in a new container.
有點多 … 先放上公司常用的command. 附上一些參數是什麼意思
docker run --privileged --rm -it -e DISPLAY=unix$DISPLAY -v /dev/video0:/dev/video0

  • -i : attach後,鍵盤輸入會導到Container
  • -t : attach後,Container的螢幕輸入會導致目前電腦的螢幕
  • -it: 就是… -i + -t
  • -e : 設定環境的變數 ex: 設定DISPLAY的參數
  • -d : detached, container 會在背景執行
  • -v : 把container的volume 接到 本機電腦 -v [Host volume]:[Container volume]
  • –rm: Docker結束後會自動移除容器 (ㄜ..不太會翻譯)
  • –name : 執行這個名字的容器

Docker load 跟 import 差異

import 結束後不會紀錄剛剛在container上的操作,下次在run時還是回到一樣的初始狀態
load 會持續紀錄在container上的操作 -> 檔案會越來越肥 (如果一直加檔案)

後續持續更新

Bug description

沒想到我還是得用到Eclipse來build Android app
今天在build apk的時候,一直跳出這個錯誤:
dx unsupported class file version 52.0
先簡單介紹一下目前的設定環境:

  • open-jdk 1.7
  • oracle jdk 6
  • open-jdk 1.8
  • Eclipse Neon

Eclipse的 Java compiler 是 open-jdk 8
可以正常的build整個project, but .. 無法產生apk.

Error message 在上面有提到.

解決方式:

網路上找了很多的解決方法.例如 clean build, or 移除所有的jar等候在重新build.

我後來使用解決的方法為:

  1. Clean all project
  2. 把Eclipse所有的 java compiler切換到 open-jdk 1.7
  3. 重新build需要import 的 jar
  4. 然後在build APK
  5. 就不會看到error message了

Why java version 1.7

因為我build的Android app 版本為 5.1.
1.8 not support, 但是不裝又無法開啟eclipse.
所以在Eclipse中調降compiler版本

參考連結

Android developers

What is AAD ?

簡單的來說就是 Google 自己推的 android developer 的認證機制, 考試內容與自己詳細要準備的東西可以參考 Google Developer Certification 網頁中會有更多詳細的介紹. 不想看英文?沒關係 Associate Android Developer Certification(AAD)認證介紹 這個就是中文的了.

  • 怎麼考呢!? 報名考試請點這裡
  • 考試費用:149元 (俗啦) 單位:美金 (棍!~)
  • 額外準備的東西:1. 一台能上網的電腦 2. 可以視訊的裝置 3. 你的名字 我是說你的護照

考過了能幹嘛?

這個問題非常有深度,我好好冷靜想想回答你:
………………………………………………………..
………………………………………………………..
我目前只有拿來滿足我的虛榮心(掩臉)

考試難不難

  • 如果是 Android App 初學者: 不要太急著考, 多累積一點再去
  • 如果已經開發Android App 一段時間的開發人員:建議你到 這邊 檢視一下自己那邊有不足.

個人感想

真的就是個人感想 xDDDD
這不是業配文

以下是考試前的狀況:

我記得前陣子跟某位同事聊天的時候,跟他提到一些跟程式相關的證照;
印象中他的意思是:

一些跟程式相關的證照,在台灣只要死背題庫就可以考上了。
可是真正在實戰寫程式的時候,這些人有多少人是真的戰力?

一句話打消了我想去進修考證照的念頭,直到 Google IO 2016
歐歐 好像很有趣 , 歐歐 沒有題目可以背 , Android 終於也有認證了

在那之後我就有想去考的想法,雖然同事們都興趣缺缺,而我一直在等著看有沒有哪幾位善心人士能詳細分享一下考證照的過程與大概…會有多難。

Q:為什麼要等人分享?
A:因為我膽子小啊. 一次考試費用不便宜,賺錢不容易啊 Q __Q

某天無意間看到我某位強者同學,臉書上貼著他考過了AAD,問了他一些相關問題:

  • Q:你覺得考試會很難嗎? A:我老實跟你說,我覺得不會到太難。
  • Q:那你覺得有考的必要嗎? A:這個問題,要看你自己吧!應該想一下你是為了什麼考這張證照的。
  • Q:啊.. 你有報名那個 Android綠豆湯 對吧! 有一定要報名嗎? A:我是覺得沒有一定要報名,但是去那邊也是學了不少知識,這一部分也是看你;我是覺得我有學到東西。

我 我 我 .. 我承認我還是沒膽子直接考試,該是時候花錢買膽子的時候了
然後我就報名上課(買膽子)了!

Hank老師 上課:

其實上課中有一些時間我都在作自己的事情 …. (掩臉)
Android Developer們應該很難想像我在公司寫 Android的時候,幾乎是沒有使用 Android studio的;我最常用的是Sublime Text 3 + terminal 在解issue跟寫客製化。
上課很大的收穫就是:Android studio怎麼操作以及熱鍵使用
還有一些關於support library的知識等等

問題的整理、解決問題的順序、 避免思考的謬誤以及面對未知問題的心態,這些老師在課堂上所提到的心得才是最大的收穫

開始考試:

那個,其實我沒有等課程上完才考試;我是倒數第二次上課前的下午開始付費考試。
絕對不是我特別跩(真的沒有),原本念頭是:有什麼不會的先問一下老師比較快 xDDDDD

  • 付費:

  • 下載考題:
    當我拿到題目的時候其實是有嚇到的:

    1. 都是英文,超怕誤會題意
    2. 有一些需求我還真的沒寫過
  • 開始coding:
    冷靜之後,就開始整理題目提到的需求、bug;整理一下 source code,確認哪些function已經完成;
    然後就是一直:

while (!allTaskComplete()) {
    try_to_complete_task();
    debug_task();
}

印象中我有三個部分是完全沒寫過的,這個時候真的只好拜神 Google 與 stackOverflow 大神
最後真的有兩點題意不清的狀況,只好 Call out 老師,請老師指點迷津一下!

  • 上傳程式:
    完成後將程式上傳,此時系統會要求上傳護照照片與大頭照 (所以上面有提到請準備好護照)
    上傳完畢後,我過了三天就收到程式通過的通知。信中提到請預約一個時間與工作人員面試;請準備能視訊通話的裝置(手機 or webcam)。面試時也請準備好護照,面試官會比對護照。

  • 面試:
    面試人員會請你先出示護照,然後開始問你一些問題:
    別怕,聽不懂可以請他再說一次;或是請他用打字的,可以丟到Google translate.
    面試後一個禮拜會收到是否通過的通知信!

當然以上每個階段我都很提心吊膽,等最後的通知信大概是照三餐+點心宵夜的在刷手機收信

最後:

這個時候要跩一點的說:如果當初沒報名這個課程,我想我也是能通過考試(只是會更提心吊膽),請大家提起信心往前衝!

但是我沒後悔報名這個課程,反而慶幸還好當初有報名到 xD。
因為得到的比付出的更多。

如果真心想考過AAD,我覺得上這個課程是絕對有幫助的。
如果對Android很多東西都是一知半解的,我也很建議上這個課程;老師整理的教材與課程組織的相當不錯。

當初為什麼想考這張證照?我覺得我未來人生的計畫中,這張證照或許能幫的上用途,所以我就考了
考到了之後呢?拿到證照只是開始,路還很長
如果不持續加強自己的實力與能力,身上掛了再多的證照也只是裝飾品.
不要讓自己,砸了自己考到的證照。

真心祝福想通過的朋友們能順利通過
非常感謝Hank老師與Martina小姐

課程學員:呂啟銓

最後應該擺一下 :
有點沒質感的連結 xD

第一次自已寫SQLite ….

首先要先知道 有那些欄位 需要的 .
這些欄位請參考你的實際需求~

以下先用自己的sample說明

Implement

這邊使用 SQLiteOpenHelper實作

先新增一個class, extends SQLiteOpenHelper

public class DatabaseHelper extends SQLiteOpenHelper {}

SQLiteOpenHelper 有兩個 abstract 需要實作, 別擔心 Android studio 會提醒你

    @Override
    public void onCreate(SQLiteDatabase db) {
        // onCreate 會在app發現沒有Database檔案時呼叫, 不是每次都會呼叫到
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Database版本更新時
    }

此時,因為 SQLiteOpenHelper 沒有預設的Constraotor
所以你需要

public ExpenseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        // Context 就是Context
        // Name 為Database名稱 預設是"main"
        // CursorFactory 其實我不是很熟他在幹嘛  等我認真研究完在補上 先帶null
        // Version  databse 版本 
 }

現在你需要 開啟table 參考以下

CREATE TABLE table_name (
  column_name1 data_type,
  column_name2 data_type,
  column_name3 data_type,
  ···
);

轉換成Android要帶入的

private String createTable = "CREATE TABLE exp ( _id INTEGER PRIMARY KEY, " +
            "cdate DATETIME NOT null, " +
            "info VARCHAR, " +
            "amount INTEGER)";

table name 取名為 exp
_id 是PRIMARY KEY
cdate, info, amount 皆為欄位
後面的為data type
所以把這組String 帶到剛剛的 onCreate :


    private String createTable = "CREATE TABLE exp ( _id INTEGER PRIMARY KEY, " +
            "cdate DATETIME NOT null, " +
            "info VARCHAR, " +
            "amount INTEGER)";
            
     
    @Override
    public void onCreate(SQLiteDatabase db) {
        // onCreate 會在app發現沒有Database檔案時呼叫, 不是每次都會呼叫到
        db.execSQL(createTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Database版本更新時
    }

到這邊就可以使用了

DatabseHelper helper = new DatabseHelper(this, "main.db", null, 1);
ContentValues values = new ContentValues();
values.put("cdate", _date);
values.put("info", _info);
values.put("amount", _amount);
helper.getWritableDatabase().insert("exp", null, values);

當執行insert時, DatabseHelper 會確認是否有main.db
沒有會先執行 onCreate, 創建出來後 再執行insert

Tool

使用Facebook 開發的stetho > 確認 SharePreference 跟 Database 的內容
參考stackOverflow

使用 stetho
在Module 底下的gradle 加入

compile 'com.facebook.stetho:stetho:1.4.2'

在MainAavitity 的 onCreate() 中加入

import com.facebook.stetho.Stetho;
.....
......
........
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Stetho.initializeWithDefaults(this);
        ......
        ......
        ......
}

build 完後可以直接在Chrome上使用

在 chrome 網址列上輸入:chrome://inspect/#devices
可以看到以下頁面:

App 在運作的時候 會出現一個新的 link
點下去就對了

會出現新的頁面
找到你自己的DB 跟 table 就可以看到存取是否有問題

幾百年沒寫的Blog. Yoooooo

Note:
When I implement my app, I want to EditBox only can input single line.
And I using
android:maxLines="1"

Magic, it can type multi-line in editbox.
Actually ~ This xml should add an attribute.
android:inputType="text"

This way can achieve single line in Editbox.

BTW:
maxLines is an attribute that user can see lines on your app.
if maxLines = 5;
Users can input more than 5 lines but only see 5 lines on app.