2013年11月26日 星期二

linux 使用swap memory

最近嘗試在aws ec2 上deploy 一個ror的project

但因為使用的是free trail instace所以memory很小,deploy的時候會噴cannot allocate memory

要切一塊disk空間作為swap memory以解決這個問題


首先先確認是否已經存在swap memory:

sudo swapon -s


如果沒有會顯示如下
Filename    Type  Size Used Priority


在確認沒有swap memory後檢查我們是否有足夠的硬碟空間,我們要做一塊512mb的swap memory所以要至少這麼多

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.9G  3.5G  4.1G  47% /
udev            288M   12K  288M   1% /dev
tmpfs           119M  176K  118M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            296M     0  296M   0% /run/shm


開始建立swap memory

sudo dd if=/dev/zero of=/swapfile bs=1024 count=512k
sudo mkswap /swapfile
執行完會顯示
Setting up swapspace version 1, size = 262140 KiB
no label, UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxx

接著使用這個空間
sudo swapon /swapfile

不過只是這樣重開機的話會失去效用,所以要把這塊swap memory加入fstab(file system table)中
sudo vim /etc/fstab

加入這行
 /swapfile       none    swap    sw      0       0 

記得把Swappiness設定為0, 這樣可以確保os只有在緊急的時候(例如不swap就噴out of memory)才做swap動作,增加效能

sudo su -
echo 0 > /proc/sys/vm/swappiness
exit



2013年11月11日 星期一

Android: 使用LightingColorFilter 來做使用image background的button的onClick特效

以往我在做用其他image為background的button的onClick特效時,都要準備好兩張image,

一張為按下去前,一張為按下去後,實為麻煩.

後來發現只要使用Android sdk內建的LightingColorFilter就可以用一張圖達到不錯的類似效果:


mTestBtn.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if(event.getAction() ==MotionEvent.ACTION_DOWN) v.getBackground().setColorFilter(new LightingColorFilter(0xFF999999, 0xFF000000)); else if(event.getAction() ==MotionEvent.ACTION_UP) v.getBackground().clearColorFilter(); return false; } });

Android:setting text size in pixel


textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, valueInPixel);

2013年11月5日 星期二

Android: 當資料庫越來越肥大 之 容易擴充的DB架構

使用這樣的寫法在修改或擴增database的時候可以比較舒服(我覺得啦XD)
不過如果只是要寫一個小小且不太會擴充的db那就先不需要這把牛刀了!

後面有完全沒有整理過(囧)的範例code,可能看code比較好懂.

此架構大致分為五個部分:

DBHelper


  • 這個就是一般在寫db的時候繼承SQLiteOpenHelper而來的class,這邊增加了一些function讓操作更便利一點.擔負起了依照schema來建立table、實際操作db等重責大任.
  • 這個class是獨立於project的,可以直接貼到別的project.

DBSchema


  • 掌握了整個db的架構,建立實體以後會喂给DBHelper的constructor吃.
  • 這個class幾乎也獨立於不同project,除了要在變數定義的時候告知這個project中table的相關資訊.另外加入新的Table時也記得要在這裡增加定義.

DBTable

  • 每一個table有自己專屬的class,所以加入新table的時候基本上不會動到舊的架構.
  • 提供的method儘量不存取到自己以外的table.
  • 提供存取自己table 的method给data provider使用.

Data Provider

  • 扮演db的adapter角色,可以存取多個db並且將資料處理組合後以便使用.
  • app的其他部分需要存取資料理當只會使用到Provider,不會直接使用DBTable.
  • Provider理當是唯一會直接使用到DBTable的class.
  • 可以視需求增加不同的data provider

Global initialization

因為DBHelper是採用singleton,所以用application context來做初始化.
我是另外建立了一個application class來確保db在被任何activity使用前已經初始劃完成.



建立一個新的table步驟:

  1. 先建立一個table class.
  2. 去Schema中加入Table資訊.
  3. 接著就可以在data provider中使用這個table.

剩下的就讓code自己來解說吧XD