11/21/2021

Solution - UnCrackable App for Android Level 2

 See challenge here

Use dex2jar tool to extract source code.

$~/Downloads/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh UnCrackable-Level1.apk

Use JD-GUI to review the source code

$java -jar ~/Downloads/jd-gui-1.6.6.jar



Now we know the check is to send string into static library libfoo.so.

Unzip apk to see lib/ folder

$tree lib

lib

├── arm64-v8a

│   └── libfoo.so

├── armeabi-v7a

│   └── libfoo.so

├── x86

│   └── libfoo.so

└── x86_64

    ├── libfoo.so

If you're a lazy person like me, I use strings first to see if anything comes up.

$strings lib/x86_64/libfoo.so

"Thanks for all t" maybe our flag to capture, but didn't pass entering to the App. Looks like the ending part is missing. So, use Ghidra or IDA free or Hopper Diassembler to see the bar function

Java_sg_vantagepoint_uncrackable2_CodeCheck_bar


some ascii code strings were found at the strncpy.

The second parameter is our flag to capture

 "Thanks for all the fish"

Solution - UnCrackable App for Android Level 1

See challenge here

Use dex2jar tool to extract source code.

$~/Downloads/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh UnCrackable-Level1.apk

Use JD-GUI to review the source code

$java -jar ~/Downloads/jd-gui-1.6.6.jar


Now we know the check is to check your input String is equal to the hardcoded ciphertext (encrypted by AES).

Write a similar java program copy & paste the function to decrypt the ciphertext without input anything

import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.SecretKey;
import javax.crypto.Cipher;
import java.util.Base64;

public class UnCrackableLevel1 {

public static void main(String[] args) throws Exception {

System.out.println(a("any"));

}

public static String a(String paramString) {
byte[] arrayOfByte = Base64.getDecoder().decode("5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=");
try {
arrayOfByte = decrypt(b("8d127684cbc37c17616d806cf50473cc"), arrayOfByte);
} catch (Exception exception) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("AES error:");
stringBuilder.append(exception.getMessage());
System.out.println("CodeCheck" + stringBuilder.toString());
arrayOfByte = new byte[0];
}
return new String(arrayOfByte);
}

public static byte[] decrypt(byte[] paramArrayOfbyte1, byte[] paramArrayOfbyte2) throws Exception {
// SecretKeySpec secretKeySpec = new SecretKeySpec(paramArrayOfbyte1,
// "AES/ECB/PKCS7Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(paramArrayOfbyte1, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(2, secretKeySpec);
return cipher.doFinal(paramArrayOfbyte2);
}

public static byte[] b(String paramString) {
int i = paramString.length();
byte[] arrayOfByte = new byte[i / 2];
for (byte b = 0; b < i; b += 2)
arrayOfByte[b / 2] = (byte) (byte) ((Character.digit(paramString.charAt(b), 16) << 4)
+ Character.digit(paramString.charAt(b + 1), 16));
return arrayOfByte;
}

}

$javac UnCrackableLevel1

$java UnCrackableLevel1

The secret is "I want to believe"

*** Note the source code use AES/ECB/PKCS7Padding

but actually using AES

2/23/2020

到底應該買房還是用租的?



如果你也是正在成家,這個問題應該也困擾你許久?
當中考慮因素有很多,並不是A或B這種兩分法,例如:

物價通膨
調薪幅度
定存年利率
保費年增率
投資年化收益率
有閒錢再投資多少
有閒錢再定存多少


  • 生活品質方面:手邊現金不夠用的時候,全家暴露在風險之下,不能生病、也不能出國玩是你要的嗎?。
  • 安全感方面:房東往往不會租你這麼久卻不漲租金,至少我們法規保障還不像歐洲對租客那樣友善。被迫搬家除了一筆費用,對小孩換環境的影響也不小。


我這邊整理了一份試算表,你可以依照自己情況填入黃色區域,就能看到逐年的資產增長。
因為不確定你會買在「蛋黃區」還是「泡沫區」房價的漲幅和折舊1.17%沒有估計在內。

(點此)下載試算表

6/14/2019

架設公司私有的偽M$ Project - OpenProject篇

繼上一篇 架設公司私有的Yum repository for CentOS 7 又要來教學一篇買不起M$ Projects 怎麼省錢做專案時程管理 ?

WHY?

  1. 專案資料都是私有的,可以升級和擴充其他功能。
  2. 作為技術宅或是小主管當夾心餅乾,老闆要你估工作時程(很多號稱agile其實瀑布式的開發方式),很多時候你還是需要自己快速的粗估一個flow。
  3. 新創公司/小公司/工作室/許多業餘的side-project 都很適合,也可以給人專業感

Install

使用Docker安裝OpenProject (真的只需要一行)


docker run -p 8080:80 -v openproject-db:/var/lib/postgresql/9.4/main -v openproject-data:/var/db/openproject -e SECRET_KEY_BASE=MY012j38adasSECRET openproject/community:8

啟動和運行OpenProject:

預設管理密碼(登錄名:admin,密碼:) admin。然後,啟動瀏覽器http://localhost:8080/ 一般來說為了避免資料建立之後消失, 會用 -v (Volume) 將電腦內的空間掛進去, 這樣docker stop之後資料保持。
網頁登入後馬上就可以看到畫面, 登入之後可以開始建立你的第一個專案。
一般來說要先建立Users 和 Group 並且賦予不同角色。



如果你需要寄email, 例如通知人員開始執行工作包, 新的技術比較偏好用Webhook去通知你的工作IM, 例如Slack。參考官網說明的SMTP配置透過環境變數傳入docker預設情況下,docker容器將嘗試通過本地postfix發送電子郵件 。但是,以這種方式發送的電子郵件很可能會失敗或最終進入用戶的垃圾郵件收件箱。我們建議使用外部SMTP服務器發送您的電子郵件。

一個不錯的選擇是SendGrid,它提供每月最多12000封電子郵件的免費計劃。只需在網站上註冊,審請一個新的API密鑰並將其複製到某個設定(看起來像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)。您也可以使用您的SendGrid用戶名和密碼,但這不太安全。然後,您可以使用以下附加環境變數 (使用SendGrid,SMTP_USER_NAME始終是apikey。只需替換 SMTP_PASSWORD為您生成的API密鑰)

docker run -d \ -e EMAIL_DELIVERY_METHOD=smtp \ -e SMTP_ADDRESS=smtp.sendgrid.net \ -e SMTP_PORT=587 \ -e SMTP_DOMAIN=my.domain.com \ -e SMTP_AUTHENTICATION=login \ -e SMTP_ENABLE_STARTTLS_AUTO=true \ -e SMTP_USER_NAME="apikey" \ -e SMTP_PASSWORD="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" \ ...

您可以為其他SMTP提供程序調整這些設置,例如GMail。

這裡要小心,如果你用GMail,需要產生application password來代替寄信,不能用真實的user密碼(心裡背誦的那個)。

開始第一個scrum project

此處我們嘗試建立一個scrum project 切成2個phase, 第一個phase是功能開發, 第二個phase是管理介面和金流串接。

首先要有人, 所以從Users群組開始添加一些User帳號。這裡添加之後只是產生User帳號, 還必須把他們一一添加到專案中, 才可以在後續的Task assignment將工作包分配給他們。

OpenProject 有很方便的群組管理, 這裡我將潛在的專案成員依照在公司內的組織劃分為RD, PM, SQA測試。
接著在scrum project下面添加的work packages添加工作包。這裡一開始不是很確定在OpenProject內的 Phase, Task, feature, user story的相對關係, 通常來說是Phase包住另外三個。沒關係,等試驗之後再用Gantt Chart打開來看。




用open project可以很容易設定工作包的parent
點下工作包的information, 在右上角可以點一下設定parent。不需要從parent一個一個add child的方式。


反過來如果是初期的工作包展開, 從parent添加子工作包會比較直覺。
添加了一些工作包之後可以切換到Gantt Chart View。這裡暫時只有在第一個工作包下面增加第一個feature, 所以看起來是Phases/Tasks/Features



10/11/2018

Taiwan points exchange rates

當你要推出一個贈送點數的行銷方案時, 是否考慮過可能產生無窮迴圈被用戶洗點數?

台灣紅利點數轉換率一覽 是一個工具
計算台灣各種點數之間的最優交換比率(轉換路徑)。 計算是否有任何迴圈會造成無限增長點數?
利用python networkx的深度優先搜尋算法, 以及graphviz 做出下圖


7/26/2018

Using Nexmo to receive incoming calls


Reference
https://www.nexmo.com/blog/2017/01/26/handle-inbound-text-speech-phone-call-node-js-dr/


# Buy a virtual number

First you make a payment (with credit-card/paypal) in order to buy virtual numbers. At least 10 Euro to start.
Here I bought an Indonesia number +628557467xxxx .

# Setup a webserver to receive webhooks.

The target is When anyone (from PSTN/GSM) calls your virtual number, Nexmo platform intercepts the call and
sends it to the application you created.
To setup a web server on your laptop to listen the webhook, you can use any web framework.
For me i use CodeIgniter . Download and unzip it anywhere.
Create a controller named event.php under application/controller with the following

defined('BASEPATH') OR exit('No direct script access allowed');
class event extends CI_Controller
{
public function index()
{
var_dump($_POST);
}
}

and a answer.php like the following,

defined('BASEPATH') OR exit('No direct script access allowed');
class answer extends CI_Controller
{
public function index()
{
var_dump($_POST);
}
}

Then under the same folder, run
>php -S localhost:4001 -t ./
will start a web server listening on port 4001.
Then we setup a ngrok which is an auto registering dynamic https endpoint.
On a macOS laptop, use
>brew cask install ngrok
>ngrok http 4001
For example, you see the following:

ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Session Expires 7 hours, 59 minutes
Version 2.2.8
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://e69a8532.ngrok.io -> localhost:4001
Forwarding https://e69a8532.ngrok.io -> localhost:4001
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00

Now everything is ready on your laptop.
Then we tell Nexmo to send webhook to https://e69a8532.ngrok.io

# Install nexmo command line interface
>npm install nexmo-cli -g
>npm i npm to update
>nexmo setup

Find your application id on the page.
>nexmo app:update "My First App" https://e69a8532.ngrok.io/answer https://e69a8532.ngrok.io/event
>nexmo link:app

# Testing

Call the virtual number like +628557467xxxx from your mobile phone (GSM) or Skype out
and you'll see the variable dumped in php.
[Thu Jul 26 16:41:55 2018] ::1:65010 [200]: /event
[Thu Jul 26 16:41:55 2018] ::1:65011 [200]: /event
[Thu Jul 26 16:41:56 2018] ::1:65012 [200]: /event
[Thu Jul 26 16:41:56 2018] ::1:65013 [200]: /event
[Thu Jul 26 16:42:12 2018] ::1:65017 [200]: /event
[Thu Jul 26 16:42:12 2018] ::1:65015 [200]: /event
[Thu Jul 26 16:42:13 2018] ::1:65016 [200]: /answer?to=628557467xxxx&from=4434xxxxxxxxxx&conversation_uuid=CON-xxxxxxxx-7a9e-426d-961b-828bc7726d49&uuid=93b62d17c960c0209xxxxxxxxxx

12/04/2017

Block incoming calls. How to extract offline database from Whoscall


Prepare apk and root phone
Download apk of gogolook whoscall from some website like this.

Install apk to a rooted android phone, I recommend samsung i9001.
A little bit old, but great performance running CyanogenMod. Here's how you can root your i9001

Download offline database
Update offline database following instructions in Whocall app, this will create a database named

Under android /data/data//databases/offline.realm

Use Android studio device monitor tools to navigate to above path,
Click the button (top-right) to "pull file from device"
Save it to your Download folder on your laptop, say whoscall_database

.realm is a client-side database that helps you seamless integrate a sqlitedb and scale-up if needed. Realm database help manage db when gets larger.


Download real browser from above site to your Mac laptop

Open Download/whoscall_database/offlinedb.realm

I'm using a Taiwan number so most of the database are numbers in Taiwan.



Looks like when a call comes in, whoscall is using a hash function to calculate from the phonenumber to a hash value and then search from the offline database for a hit. If so, shows a warning triangle on the lock screen. 

4/25/2017

Scaled Agile for The Enterprise

最近聽關於專案管理的podcast 很有感覺
原來專家們已經遇過要從50位RD成長100位RD的瓶頸。

當我們從scrum抽取 Agile 概念用於backlog 工作項目以及排序優先順序, 已經某種程度上已經契合 Agile的精神。

但是Business operation management layer 相當於原本PMP當中提到的PMO (Project management Office的角色,管理階層往往希望「每一項功能」在產出方面希望得到日期保證,實際上這是waterfall的精神。

這兩種方法在原理上是衝突的。

解決方法是:

1. 經常溝通或教育PMO認知到為何Agile比較快deliver一些feature到客戶手上、修改對於壓日期的「預期心理」。PMO鎖定策略面就好,缺點是可能因為策略不明導致下一round的Agile process卡輪。

2. CEO直接頒布本公司採用Agile 方法,會比較硬性而且大家需要學習Agile的名詞與方法。
12相比第一是靠潛移默化我覺得比較好。


3. 如果研發的throughput 要再scale上去的話、可能需要建立中間整合層的人,有幾種方法學像是leSS, nexus。 不過我還沒有學習過相關的framework以及管理技能, 研究之後再分享。

2/25/2016

架設公司私有的Yum repository for CentOS 7


開始之前先瞭解一下世界上的軟件庫, 以及注意事項:

$yum -y install yum-utils httpd createrepo rsync reposync wget

根據公司的需要, 我們要同步CentOS 7 以及EPEL的Repo, Architect是採用x86_64 因此不需要i386的部分.
硬碟規劃約保留300GB

httpd是為了架設網站, 開放port 80 給公司的辦公室網域 以及RD開發區, SAT測試區, BETA區以及上線區域
reposync - used to synchronize remote yum repositories to a local directory, using yum to retrieve the packages
createrepo - Create repomd (xml-rpm-metadata) repository

0. 在/var/www/html/ 創建好規劃的目錄結構

在開始之前可以找一個離自己最快的yum repo, 因為我的mirror是架設在東京的AWS, 可能找日本的mirror會快很多.
找速度較快而且支援rsync的mirror site, 以我的例子是找到 mirror.fairway.ne.jp
$vi /etc/yum/pluginconf.d/fastestmirror.conf
修改成為這行: exclude=.gov, facebook, mirror.slowmirror.com

1. 對於centos,使用命令:

建立結構
$mkdir -p /var/www/html/yum/centos/7/os/x86_64
$mkdir -p /var/www/html/yum/centos/7/updates/x86_64
$mkdir -p /var/www/html/yum/centos/7/extras/x86_64

開始同步CentOS
$rsync -avrt rsync://mirror.fairway.ne.jp/centos/7/os/x86_64/ /var/www/html/yum/centos/7/os/x86_64/ &

結束之後安裝yum-arch進行RPM分析,並在目錄下產生headers資料夾
$wget ftp://rpmfind.net/linux/epel/6/ppc64/yum-arch-2.2.2-9.el6.noarch.rpm
$rpm -ivh yum-arch-2.2.2-9.el6.noarch.rpm
$yum-arch /var/www/html/yum/centos/7/os/x86_64
$yum-arch /var/www/html/yum/centos/7/updates/x86_64
$yum-arch /var/www/html/yum/centos/7/extras/x86_64

對64-bit packages目錄產生repodata資料夾
$createrepo /var/www/html/yum/centos/7/os/x86_64
$createrepo /var/www/html/yum/centos/7/updates/x86_64
$createrepo /var/www/html/yum/centos/7/extras/x86_64

2. 對於RHEL部分:

我使用reposync 這個工具, 先執行指令確認自己所屬的repo
$yum repolist

reposync 在執行的時候如果要用背景 & , 記得要用 nohup, 避免人離開去休息的時候, 一旦關閉terminal 就停止了
$reposync --repoid=epel --arch=x86_64 --gpgcheck -l --download_path=/var/www/html/
$reposync --repoid=base --arch=x86_64 --gpgcheck -l --download_path=/var/www/html/
$reposync --repoid=extras --arch=x86_64 --gpgcheck -l --download_path=/var/www/html/
$reposync --repoid=updates --arch=x86_64 --gpgcheck -l --download_path=/var/www/html/

The above command will download the packages in the mentioned download path. You then need to run following command to create the repository:
$cd /var/www/html/
$createrepo -v /var/www/html/

3.針對webstatic 的部分 Webtatic EL7 for CentOS/RHEL 7:


之後輸入
$yum repolist
會看到多了webtatic 這個repoid (我們就放寬不檢查GPG key了, 以免沒抓到)
$reposync --repoid=webtatic --arch=x86_64 --download_path=/var/www/html/

再做一次createrepo
$createrepo -v /var/www/html/

4. 開放firewall 給 80 port
$firewall-cmd --zone=public --add-port=80/tcp --permanent
$firewall-cmd --reload
$systemctl enable httpd

參考文獻:

-  How to create a local mirror of the latest update for Red Hat Enterprise Linux 5, 6, 7 without using Satellite server? https://access.redhat.com/solutions/23016

11/05/2015

The End of HP Public cloud


Public cloud is an important part of our customers’ hybrid cloud strategy, and what they tell us is that they want the ability to seamlessly bring together multiple public cloud environments, from AWS to Azure to Google to Alibaba, under a single hybrid cloud model. So, we will be evolving our strategy in public cloud to ensure that we can deliver this to our customers. We will sunset the HP Helion Public Cloud offering on January 31, 2016 and will move to an open, multiple partner-based model for providing these important capabilities to our customers through our private and managed cloud offerings.

To support this new model, we will continue to aggressively grow our partner ecosystem and integrate different public cloud environments. We are helping customers build cloud-portable applications based on OpenStack code through the HP Helion Development Platform and our work in the Cloud Foundry community. In Europe, we are leading the Cloud28+ initiative that is bringing together commercial and public sector IT vendors and EU regulators to develop common cloud service offerings across 28 different countries.

For customers who want access to existing large scale public cloud providers, we have already added greater support for Amazon Web Services as part of our hybrid delivery with HP Helion Eucalyptus and support Office/365 and Azure.

11/04/2015

Apple在iOS 9強化安全的ATS措施 (App Transport Security)

升級之後可能發生的錯誤現象:

Transport security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

解決辦法有很多種:
若你的App會從很多來源下載HTTP頁面, 直接Allow Arbitrary Loads

如果你的App只會從你的服務網域下載資料, 請使用Exception Domains
以個別的方式加入例外, 記得your.domain是一個Dictionary, NSTemporaryExceptionAllowsInsecureHTTPLoads (NSExceptionAllowsInsecureHTTPLoads是錯誤的)和
NSIncludeSubDomains是Boolean如下圖:

我是使用Xcode 7.1
請留意一下, Exception Domains是可以在Xcode內下拉選擇,
但是IncludesSubdomains前面要有NS開頭, 不信的話用其他編輯器打開Info.plist.

參考資料:
http://www.neglectedpotential.com/2015/06/working-with-apples-application-transport-security/
http://googleadsdeveloper.blogspot.tw/2015/08/handling-app-transport-security-in-ios-9.html

10/27/2015

Target 'AFNetworking' of project 'Pods' was rejected as an implicit dependency for 'libAFNetworking.a' because its architectures 'x86_64' didn't contain all required architectures 'i386 x86_64'

=== 筆記 ===
環境
Mac OS 10.10.5
XCode 7.1

iOS Project使用到AFNetworking, 透過CocoaPods安裝,
嘗試編譯時的出現警告:

現象
原因
pod install 的時候預設編譯的SDK變成OSX 

解決方法
選擇Pods專案>Build Settings>Base SDK 選擇 iOS


9/24/2015

Ansible結合Docker的使用方式

前言

為什麼不直接用Docker就好?
以現況來說,如果服務暫時無法移植到container執行, 要在私有雲上跑, 仍然需使用Ansible或是Chef或是Puppet這一類的工具。

目標

讓習慣Ansible的開發人員用原有的腳本在筆電上重複進行部署測試。
單純利用Docker的好處節省在開發機上安裝一堆VM (節省安裝OS的時間&空間)。
學習少量的Docker指令。

觀念

Ansible是從common role負責安裝所有的機器, 再由其他role安裝與設定其他各式Server。
Ansible需要為各種role撰寫playbook。
Docker的觀念是通過建立自己的base image 例如from Cent OS 7, 設置防火牆 VPN 與時區校正之後, commit, tag, 再從base image上安裝軟體變成各式Server。
用docker-compose以及links可以直接組裝許多Official images, 基本上只需要設計服務所需要的Application layer的images。
Docker需要為各種image撰寫Dockerfile。

安裝Docker

請按照官方步驟在Mac安裝完Docker環境之後在spotlight可以找到docker QuickStart Terminal 
你會得到一隻鯨魚以及一個IP, 那個就是虛擬機的IP, 請抄起來。

假設我們需要1台空白機讓Ansible管理, 執行:
bash-3.2$ docker run -d shooding/docker-ubuntu-openssh
bash-3.2$ docker ps
你會看到1台機器(container)正在執行。

這裏我解釋一下參數
-d = daemon背景模式執行
shooding/docker-ubuntu-openssh 是我放在docker hub上面的image名稱
如果有興趣可以看一下Dockerfile的寫法, 這裏使用的是Ubuntu 14.04 LTS版本。

安裝Ansible
$ brew install ansible

設定Inventory

Inventory就是要被Ansible管理的機器群。
剛剛已經用docker開好1台機器(container), 一般會分成staging和production來區分環境。
現在是在筆電上進行測試, 使用staging
把container的資訊加入到~/staging

$ vim ~/staging

請把IP換成你剛剛抄起來的IP。請把account換成你的User名稱。
[app_servers] 
app-1 ansible_ssh_host=192.168.99.100 ansible_ssh_port=2222

[app_servers:vars]

ansible_connection=ssh
ansible_ssh_user=root

將Ansible的Inventory路徑設定到環境變數當作預設值
$ vim ~/.profile
$ export ANSIBLE_HOSTS=/Users/shooding/staging
$ source ~/.profile

測試一下對於1台機器的連接狀況
$ ansible all -m ping 
你會得到...

用過Ansible就知道它是透過SSH連到被控制的主機(node)

因此我們需要將docker的SSH port forward出來, 並且將公鑰複製進去被控制的機器。
如果你還不會產生SSH 公鑰/私鑰, 請先完成產生SSH金鑰 的步驟。
或是直接執行:
$ ssh-keygen
會產生~/.ssh/id_rsa和~/.ssh/id_rsa.pub

那麼...

剛剛忘記把docker的port forward出來, 再進行一次吧
先停止所有的機器
bash-3.2$ docker stop $(docker ps -q)
bash-3.2$ docker run -d -p "2222:22" shooding/docker-ubuntu-openssh

參數說明 -p port forward 將SSH port 22 對應到外埠2222
也就是在ansible裡面設定的ansible_ssh_port = 2222

接著將公鑰複製進去被控制的機器
bash-3.2$ docker cp ~/.ssh/id_rsa.pub 660246bd6146:/root/.ssh/authorized_keys
660246bd6146 (這裏請換成你的 container id )

使用Ansible測試連接是否成功?
$ ansible all -m ping
參數說明: 使用ping module測試所有機器
XXXX | success >> {
    "changed": false,
    "ping": "pong"
}


成功了, 在這之後就可以照原來Ansible的使用方法囉!

附錄小幫手
如果你需要所有機器的private IP, 有時候建置互相連接的cluster會用到
bash-3.2$ docker inspect $(docker ps -q) | grep '"IPAddress"'

TODO
其實我很想要省掉docker cp的操作, 而直接將id_rsa.pub透過 docker -v 參數分享空間到
container裡面。例如開機器的時候改成:
docker run -d -p "2222:22" -v ~/.ssh/id_rsa.pub:/root/.ssh/authorized_keys shooding/docker-ubuntu-openssh

但是很可惜這樣做會造成SSH無法登入, 大神請在回應中點評一下。


8/11/2015

Lima開箱


先前在Kickstarter上贊助的Lima終於到貨了, 需要向海關申報價值和補稅金折騰了一陣。
Lima是一個讓你接上USB硬碟把它變成雲端化的一種技術。
首先先來一張三個顏色的疊疊樂。


打開之後很讓人驚豔的一點是包裝盒內有磁吸設計,紅色拉環也非常明顯,無需太多說明。附贈的耳機有木頭裝飾,算是小小驚喜。但是原本以為會靠木質共鳴來提高音質的溫潤感,實測之後純粹是我想太多了,幾乎沒有中低音。

拉開之後發現本體,確實蠻輕巧的。

USB port就是讓你外接硬碟用的,建議是外接一個大於你筆電的硬碟,最大不能超過7TB。外接USB Hub串聯硬碟要等未來功能釋出。

背後的網路孔和電源孔(是的,他需要插座。不然電從哪裡來供給硬碟呢?)
和羅技的Unify接頭比較一下大小,宅宅們應該就有感覺了。為什麼會說宅宅們?因為待會操作和設定確實不太容易。

周邊線材都很好的收納在盒子內,而且公司很細心的附上適合台灣的電源插頭。

造訪直接點這個連結 http://install.meetlima.com 下載安裝軟體,這裏我是用Mac laptop進行下載。你如果用Google搜尋Lima只會找到某某首都,要搜尋meetlima。
令人非常害怕的是安裝檔案竟然有200多MB (你沒看錯, 200多MB)。進行安裝的時候動畫非常的炫,讓我懷疑這個軟體裡面有多少MB是動畫成份。

按照說明上的操作你必須把Lima接上硬碟, 網路, 電源這三樣之後再進行下邊步驟。
你的laptop和lima必須暫時位於相同的網路環境, 也就是家中的router之下。
目前沒有任何地方可以查詢到Lima的MAC Address。

註冊個人帳戶之後Lima service會把這個裝置登記在你的名下。Mac筆電上會多出一顆硬碟,如下圖:

Lima主打的一點就是我們到外面趴趴走的時候,還可以聽存放在家裡硬碟裡面的音樂,所以我先把幾首mp3丟到Lima硬碟裡面。

目前手機app仍在測試階段,當你註冊完畢之後在信箱中應該會有一封信,這是Crashlytics的測試版本。這裏我是用手機安裝iOS版本。


安裝過程也是非常的....久。應該也是下載200MB的軟體。


需要輸入我的帳號密碼,因為我已經在Mac筆電上註冊過,Lima service已經把Lima和他所處的網路設定以及我的帳號綁定在一起。
會根據我輸入的帳號密碼嘗試連接Lima裝置,我猜如果沒有在Mac筆電上註冊,純粹直接透過手機App啟用的話,手機也必須待在家中的網路之下。
連接成功之後會開始把手機上的照片匯入到Lima裡面,這裏似乎只有匯入其中的一部分。可能是某種智能快取技術。
如果你不想匯入可以skip。


又來了非常炫的動畫,到這裡我已經很佩服這間公司的設計和包裝,但是技術就...一直有點卡卡的感覺,可能如同他們在包裝盒上所說的:「At Lima, we focus on what's important. We don't care about technology. We care about you.」
來了,找到我剛剛在Macbook上傳的MP3,如果仔細看的話,它下面的小小圖示(Available)有分成(Available)和(Available via XXX)。
意思是那個檔案並不是存放在我手機裡面,而是在筆電上。

如果點下去播放,會很快的從筆電上快取過來,然後開始播放。一旦快取成功,Available on XXX就變成Available(在本地即手機上) 之後每次播放就只是從手機播放,和筆電無關了。

根據Lima blog上的技術說明,他們採用一種專有(proprietary)的VPN技術加上P2P網路,聽起來相當於自動翻牆。

TODO (之後會再更新這篇文章)
  • 測試用手機看電影
  • 測試用3個Lima同時掛載在我的帳號下看發生什麼事情



5/29/2015

ZENLET 開箱

幾個月前在FlyingV上贊助的ZENLET終於到貨了,包裝盒非常有質感。

打開之後馬上可以看到ZENLET標誌。
官方印製的Thank you note。
比Macbook的Touch panel稍微小一些。


放入卡片的狀態,卡片愈多會卡越緊,要稍微用力才能單手推開。推開的時候實際上是從背面推開,ZENLET的機構會讓卡片會依序展開來, 但是最下面那一張幾乎不會展開。
我注意到信用卡類的有浮出的字其實會干擾, 推開的時候造成一些摩擦力。
由於底部有一層金屬怕會干擾悠遊卡扣款, 所以我馬上跑到7-11測試一下, 感應完全沒問題。

感想:
如果單手推開可以再做滑順一點就好了。

同場加映:





5/27/2015

小朋友保險研究

/** 免責聲明
以下文章僅個人心得, 本網站之內容僅供參考之用,並未據此勸誘使用者採取任何行為,不構成對任何人在任何地區的投資建議、買賣之要約、勸誘買賣有價證券、金融產品或票券或參與任一特定的投資策略或任何其他意思表示,讀者不應視為專業意見而加以倚賴。任何人士或團體根據本網站所載任何資訊、意見或估計行事而直接或間接遭受的任何損失,概不作任何保證或承擔任何責任 */

開始:
最近二寶出生了之後又把以前研究保險的心得翻出來。

先說結論:
我會選擇10萬壽險主約+雙 * 定期實支實付醫療險附約+親子豁免條款
醫療險的額度至少家中次要經濟來源(父、母其中之一)的薪資, 相當於所得替代率的概念, 避免長期住院需要父母辭職照顧的情形。

社會環境&假設前提:
DRG實施後, 平均住院天數下降(因為醫生沒利潤, 會建議患者趕快出院, 自費住院不給付), 門診比例提高, 門診手術費較貴, 最好多投保一些。如果有能力負擔單人房也比較不會被趕著出院, 但是單人房價也是每年都在調高。

定期險vs終身險 (此處以醫療險為例):
終身險前期總投入保費較高, 對父母產生的壓力稍大
反之定期險在前面投入很小, 但小朋友長大以後保費每年增加一些, 約30歲與終身險追平, 但60歲以後保費往往倍增, 這是因為保險公司對於未來的不確定進行風險轉嫁。
但我認為30歲以後應由成年子女自行負擔老年醫療的規劃, 父母只需在年輕時替他們打好基礎即可。
定期險相較之下金流壓力較小,更可以給他們更好的童年環境。

定期險會根據金管會規定每年或數年更新條款, 一般而言從優認定, 隨著醫療手術技術的進步, 這點是最大的好處。
定期險通常只能續約保到75歲左右。
定期險要避免發生扣款中斷。

醫療險:
實支實付如果只保1家不要選 (日額、實支2擇1的)。如果保2家組合, 則盡量選2擇1的, 這樣每一家都可以自由搭配。
實支實付重點要看保不保證續保, 到幾歲?
理賠的項目有沒有全民健保以外的自費支出。(除看護外自費全部包括的概括式條款), 有概括式條款的較佳, 模糊解釋時從優解釋。

需留意超過30天有加倍理賠嗎? 拖過30天的病通常會花大錢了。
實支實付有沒有涵蓋高貴自費藥材?
如果你的保險有Cover, 醫生可能喜歡你這種病患, 可以放新的用利潤高的藥, 醫病關係良好, 也可以放心的升等單人病房。

壽險:
小孩14歲之前壽險額度都沒意義。任何時候小孩掛了我也不想領那種錢。14歲之後, 加公司團保定期壽險(為什麼這時候又要保? 因為實在便宜又大碗), 直到小朋友成年, 工作之後就要自己負擔, 因為這時候他的壽險額度是為了身後留下錢給另一半。

意外險:
所有保險賠率最高的高CP值險種, 完全是風險轉嫁的概念。
金管會有規定一個人最多保多少意外險, 避免殺人詐領,
經濟許可就盡量保滿。公司團保的意外險不計入, 也盡量保滿。

防癌、重大疾病:
(如果家族沒有遺傳病史)小朋友在防癌、重大疾病機率不高可以視自己經濟狀況投保, 用儲蓄準備金替代即可。小朋友成年之後請他自己投保防癌。

燒燙傷:
小朋友最難受的就是燒燙傷, 任何爸媽都會哭翻。
重點是家裡要減少可能發生燙傷的環境, 比買什麼保險都重要。
可加保意外險或是特別針對燒燙傷的險種。

親子豁免條款: 
如果爸媽掛了, 雖然保了很多醫療險, 但是遺眷繳不出來也是枉然, 這條不算便宜。

額度該保多少?
醫療險的額度至少>家中次要經濟來源(父、母其中之一)的薪資, 相當於所得替代率的概念, 避免萬一萬一需要長期住院, 父母一人辭職照顧的情形。
如果報稅時你是列舉申報, (通常有租一整層, 或是已貸款買房正在繳利息的家庭, 往往用列舉)
保險扣除額每個人24000, 因此小朋友的保險支出建議保超過24000, 這時候就相當於保費打折。


/** 免責聲明
以下文章僅個人心得, 本網站之內容僅供參考之用,並未據此勸誘使用者採取任何行為,不構成對任何人在任何地區的投資建議、買賣之要約、勸誘買賣有價證券、金融產品或票券或參與任一特定的投資策略或任何其他意思表示,讀者不應視為專業意見而加以倚賴。任何人士或團體根據本網站所載任何資訊、意見或估計行事而直接或間接遭受的任何損失,概不作任何保證或承擔任何責任 */

5/21/2015

磁浮鋼鐵人開箱


幾個月前訂購的鋼鐵人來了!

磁浮的效果不錯, 有感覺到鎖定在一個3度空間中, 可惜不能飛太高。
鋼鐵人的面罩可以打開, 底下有一個開關是打開全身的燈泡。

放置的時候需要一些技巧, 否則很容易被周圍磁力吸住, 小心撞壞。
當手上傳來磁力鎖定的感覺之後, 緩緩放開腳的部份, 就會保持浮空,
建議使用變壓器12V, 供電比較穩定。

關於底座過熱的問題, 只要保持在磁浮時不要旋轉就幾乎不會熱, 也比較省電。
如果一直放置失敗, 磁力重新鎖定會浪費電並且發熱,
經過不斷地練習, 現在只要5秒內就可以放好。

Mac OS X 安裝memcached for PHP



此處我的開發環境是Mac OS X with MAMP (PHP 5.6.2)
開發環境的安裝步驟

以下是安裝memcache 並且在PHP中啟用.

$brew install libmemcached

在console下
要用$which php
確保是使用/Application/MAMP下面的版本, 如果是用/usr/bin/php 表示需要設定export path 
export PATH=/Applications/MAMP/bin/php/php5.6.2/bin/php:$PATH

然後
$sudo pecl install memcache

如果沒有執行前面安裝libmemcached的步驟, pecl在安裝的時候會詢問libmemcached的路徑.
$vim /Applications/MAMP/bin/php/php5.6.2/conf/php.ini
extension=memcache.so

重新啟動MAMP
在mac os X上將memcached跑起來as a daemon and listen on default port 11211

$memcached -d

如果需要清除memcahed的時候,(例如程式反應不正確)
$telnet 127.0.0.1 11211
>flush_all
>quit