2015年3月5日 星期四

使用 scaffolding

Rails 的 鷹架 (scaffolding) 可用一行指令就為 Resource 建立 Model, Views 跟 Controller 程式碼。
下面要建立部落格文章管理功能。

建立 Post resource
rails generate scaffold Post name:string title:string content:text

執行 Migration 建立了 Posts 資料表
rake db:migrate

接著修改app/views/home/index.html.erb,再加一行
<%= link_to "My Blog", posts_path %>

刷新瀏覽器後點了連結就可以操作了。

順著指南從6.5開始看,在新增post時,若輸入空白也可以加入,所以要為欄位加上驗證

加入Validation (驗證)
打開app/models/post.rb在post類別內補上驗證的程式碼
class Post < ActiveRecord::Base
  validates :name,  :presence => true
  validates :title, :presence => true,
                    :length => { :minimum => 5 }
end

其實有沒有效果執行網頁就知道了,但有另一種方式就是console工具
執行rails console
接著就可以執行ruby的程式,也是一種方法。

往指南6.7往下看之前,先理解這些檔案之間的關連

以按下My Blog連結為例,就會執行到 app/controllers/posts_controller.rb 程式內 index 這個 action,
裡面的程式 @posts = Post.all 使用到了 app/models/post.rb 這個模組,
最後靠 app/views/index.html.erb 顯示出來

那麼為什麼會去執行index這action呢?還記得之前設定過的config/routes.rb檔嗎?
裡面有一行 resources :posts 有了這一行就會自動定義出以下七個action
get    '/posts'  => "posts#index",   :as => "posts"
post   '/posts' => "posts#create",  :as => "posts"
get    '/posts/:id' => "posts#show",    :as => "post"
put    '/posts/:id'      => "posts#update",  :as => "post"
delete '/posts/:id'      => "posts#destroy", :as => "post"
get    '/posts/new'      => "posts#new",     :as => "new_post"
get    '/posts/:id/edit' => "posts#edit",    :as => "edit_post"

所以按下My Blog連結,就是第一行的設定了。

到了這邊,沒碰過Ruby的話,要先補充一下,下面的連結可以好好參考。
https://ihower.tw/rails4/ruby.html

2015年3月1日 星期日

Hello, Rails

裝好Ruby On Rails後,可參考Rails指南的操作 http://guides.ruby.tw/rails3/getting_started.html
從第3點 建立新的 Rails 專案依序操作

先啟動rvm
source ~/.rvm/scripts/rvm

到目錄下
cd myblog

建資料庫
rake db:create

啟動web伺服器
rails server

///////////////////////////////////////////

準備好了就先作最簡單的練習 hallo rails

建立Controller與View
rails generate controller home index

編輯app/views/home/index.html.erb
加入<h1>Hello, Rails!</h1>

打開config/routes.rb,修改Rails首頁位置
找到 # root 'welcome#index' 這一行
改成 root 'home#index' 存檔

瀏覽器打開 http://localhost:3000 ,就會看到 Hello, Rails! 。

2015年2月28日 星期六

Ubuntu 12.04 安裝 Ruby on Rails

這篇已經說明的很清楚了,但我還是做個筆記。
http://blog.sudobits.com/2012/05/02/how-to-install-ruby-on-rails-in-ubuntu-12-04-lts/

1.先去github取得rails-installer.sh

2.執行 rails-installer.sh
sudo chmod +x rails-installer.sh
./rails-installer.sh

3.這時log顯示裝RVM出錯,於是先執行
curl -sSL https://rvm.io/mpapis.asc | gpg --import -

4.等key裝好了,再執行一次
./rails-installer.sh

5.安裝完成後log的提示
To start using RVM you need to run `source /home/chad/.rvm/scripts/rvm`
in all your open shell windows, in rare cases you need to reopen all shell windows.

6.接下來需要載入rvm
source ~/.rvm/scripts/rvm

7.然後就可以跑了,app_name可以改成自己定的名稱
rails new app_name
cd app_name
rails server

8.在本機開網頁試看看
http://localhost:3000

在命令列模式下按Ctrl-C可關閉server,那麼如何背景執行呢?
rails server -d
這個查help是可以知道,但是背景執行時如何關閉呢?如下:
kill -9 $(lsof -i :3000 -t)



2014年11月22日 星期六

Cocos2d-x NDK 堆疊追蹤

又收到了堆疊追蹤以及使用者訊息的熱情回應(疑?不是痛駡嗎?)
堆疊追蹤如下:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'samsung/hlltezt/hllte:4.3/JSS15J/N7507ZTUANJ1:user/release-keys'
Revision: '10'
pid: 29894, tid: 29908, name: Thread-3236 >>> chad.game.mahjongtycoon <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
Abort message: 'stack corruption detected'
r0 00000027 r1 00000000 r2 00000008 r3 deadbaad
r4 00000000 r5 5fcc0544 r6 6371322c r7 63712920
r8 5fcc0c6c r9 5bdf1f00 sl 5bd97a98 fp 5fcc0c84
ip 00000001 sp 5fcc0540 lr 4004d3f7 pc 4004a930 cpsr 600a0030
d0 6f63206b63617473 d1 6e6f697470757272
d2 3fe62e4300000000 d3 3e335cbaa3698400
d4 3fe62e42fefa39ef d5 3f2a7a71c7316a74
d6 3f8d24a15045f000 d7 00000000ba4befdc
d8 0000000000000000 d9 0000000000000000
d10 0000000000000000 d11 0000000000000000
d12 0000000000000000 d13 0000000000000000
d14 0000000000000000 d15 0000000000000000
d16 3f903ab3ef110182 d17 3f2a8a8f10be2c73
d18 3e66376972bea4d0 d19 be205c610ca86c39
d20 3e2a817ff707bd4a d21 bec5090c00000000
d22 bf66c164e61cb166 d23 3f903ab3ef110182
d24 3fc555509d6ae6af d25 bf8d59f78880c128
d26 bf1aaae71a68a5df d27 bfffc5da1fed000f
d28 bf1aaae71a68a5cf d29 3f8d12f0097ff874
d30 3ff0000000000000 d31 3e2a817ff7000000
scr 80000010

backtrace:
#00 pc 0001e930 /system/lib/libc.so
#01 pc 0001c944 /system/lib/libc.so (abort+4)
#02 pc 00012325 /system/lib/libc.so
#03 pc 000117ff /system/lib/libc.so (__stack_chk_fail+6)
#04 pc 00207691 /data/app-lib/chad.game.mahjongtycoon-1/libcocos2dcpp.so (TableLayout::CalculateWinScore(unsigned char)+276)

code around pc:
4004a910 461ce00b 2b006823 e026d1fb b12468e4 
4004a920 21014a18 6011447a 4b1247a0 24002027 
4004a930 f7fc7018 2106ed3c e88ef7fe 5180f04f 
4004a940 94022006 91049403 460aa902 eb3ef7fd 
4004a950 46224629 f7fd2002 f7fceb4a 2106ed28 
4004a960 e87af7fe f7fc2001 6960e9d4 d1dc2800 
4004a970 bf00e7d4 deadbaad 000296e2 ffffff9c 
4004a980 0002c978 0002c95c b088b510 46692400 
4004a990 aa049002 94014620 94039400 ea8cf7fd 
4004a9a0 db0642a0 b1139b07 1c419806 98069106 
4004a9b0 4620e000 bd10b008 4b1eb40e b5f0491e 
4004a9c0 af00b082 f107447b 585e021c f8522101 
4004a9d0 68354b04 f852607d 31015b04 d1fa2d00 
4004a9e0 320e008a 0507f022 0220f107 0d05ebad 
4004a9f0 4669603a 0224f107 9400466d 4c04f852 
4004aa00 f8453204 2c004f04 f8dfd1f8 f853c030 

code around lr:
4004d3d4 4a0e4b0d 41f0e92d 26004680 589c447b 
4004d3e4 686768a5 f9b5e007 2b00300c 4628dd02 
4004d3f4 430647c0 3f013554 6824d5f5 d1ef2c00 
4004d404 e8bd4630 bf0081f0 00026bf4 ffffffc4 
4004d414 43f0e92d 4b16461e fb01b087 460ff502 
4004d424 46144914 aa019001 95022001 9203447b 
4004d434 90049505 681a585b b1124698 f0094630 
4004d444 4630fd18 f7ffa903 4681fe9c 0000f8d8 
4004d454 4630b110 fd1af009 0f00f1b9 9c05d003 
4004d464 fbb11b29 4620f4f7 e8bdb007 bf0083f0 
4004d474 00026ba4 ffffff60 46036842 29001e51 
4004d484 da016041 bbbaf000 f8126802 601a0b01 
4004d494 00004770 4a104b0f 4604b570 589b447b 
4004d4a4 461e6819 f009b109 6860fce4 2d001e45 
4004d4b4 da046065 f0004620 4605fba1 6822e003 
4004d4c4 5b01f812 68336022 4620b113 fcdef009

這不容易查,需要做個轉換(每個人開發環境不同,要自行變通一下)
1.將上頭的訊息copy到android-ndk-r9d下存成a.txt
2.到android-ndk-r9d目錄
3.執行
./ndk-stack -sym 你的專案目錄/proj.android/obj/local/armeabi -dump a.txt > b.txt

這裡要注意armeabi目錄,若當初是編出x86要改掉

4.得到b.txt如下:
********** Crash dump: **********
Build fingerprint: 'samsung/hlltezt/hllte:4.3/JSS15J/N7507ZTUANJ1:user/release-keys'
pid: 29894, tid: 29908, name: Thread-3236 >>> chad.game.mahjongtycoon <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
Stack frame #00 pc 0001e930 /system/lib/libc.so
Stack frame #01 pc 0001c944 /system/lib/libc.so (abort+4)
Stack frame #02 pc 00012325 /system/lib/libc.so
Stack frame #03 pc 000117ff /system/lib/libc.so (__stack_chk_fail+6)
Stack frame #04 pc 00207691 /data/app-lib/chad.game.mahjongtycoon-1/libcocos2dcpp.so (TableLayout::CalculateWinScore(unsigned char)+276): Routine TableLayout::CalculateWinScore(unsigned char) at /media/windows/xpdata/androidwork/MahjongTycoon/proj.android/jni/../../Classes/TableLayout.cpp:2052

唔,這樣查起來比較就比較有線索了。

2014年10月16日 星期四

cocos2d-x proguard 設定

使用cocos2d-x開發的確方便,只是有時也會使用java的程式碼,那proguard檔要如何設定呢?如下把整個檔都貼出來方便大家參考。若是有用到其它的庫可要自行加上去


-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembers class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

# cocos2dx
-keepclassmembers public class org.cocos2dx.lib.* {
    *;
}