在app中開啟外部app

筆記一下開外部app的寫法

private void startOthersApp(String packagename) {
Intent i = new Intent(Intent.ACTION_MAIN);
PackageManager manager = getPackageManager();
try {
i = manager.getLaunchIntentForPackage(packagename);

if (i == null)
throw new PackageManager.NameNotFoundException();
else {
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
} catch (PackageManager.NameNotFoundException e) {
}
}

android emulator "Unfortunately, launcher has stopped."

從API 18(Android 4.3)開始我的模擬器就呈現跑不動的狀態,跑些自己寫的簡單demo還可,反倒是點個應用程式清單去看所有App就掛了,連launcher都掛掉還以為是bug哩XD

其實是VM heap給不夠,可能Android 4.3之後heap吃重程度大吧?!
調大就好,如下圖

參考網址
http://ktatsiu.wordpress.com/2013/10/15/fixing-android-emulator-unfortunately-launcher-has-stopped/

另外,關於stack vs. heap的解釋
http://antrash.pixnet.net/blog/post/70456505-stack-vs-heap%EF%BC%9A%E5%9F%B7%E8%A1%8C%E6%99%82%E6%9C%9F%E5%84%B2%E5%AD%98%E5%85%A9%E5%A4%A7%E8%A6%81%E8%A7%92

Eclipse升級Android至API19報錯java.nio.BufferOverflowException

在Eclipse穩定使用API 17一陣子,最近開始升級至API 18、19,還包含了Android SDK Build-tools
沒想到本來運行正常的project現在都報錯,錯誤大致上不脫以下這些
Unable to execute dex: java.nio.BufferOverflowException. 
Check the Eclipse log for stack trace. 
Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.

解決辦法
uninstall Android SDK Build-tools(版本19)
install Android SDK Build-tools(版本18.1.1)

京都 錦市場

錦市場號稱京都的後廚房,近年成為一個旅遊景點,許多遊客都想用輕鬆的方式感受當地市場氛圍,順便解決正餐。

今天的行程要靠地鐵一日卷走透透,逛完京都御苑後,再度搭乘烏丸線前往四条站,出站沿烏丸線往北走,徒步8min遇到錦小路通右轉,看到有錦字樣的入口處就是啦~

泥看看,隨便照都是歪國人入鏡,錦市場真的是個景點XD

不得不說,日本人真的很愛乾淨,不管哪一攤,就算是販賣漁獲的,也乾爽沒臭味,逛市場就像逛街一樣舒服,每家店都想看看呢

乾淨的市場內巷道

京都人的愛~醬菜 是個我不懂的東東lol

蔬菜攤

好吃的烤魚攤

雖然是立吞,但這家的鯖魚又厚又大,也不貴~好想念啊@@

走到底只吃了鯖魚,但對這裡的店家也有個底了,我們決定先把最底的錦天滿宮晃完,再折回來慢慢吃ㄎ

接下來,吃了個網路上略有名氣的田中鶏卵,玉子燒偏甜不合我味,還不是現做的~冷冷低

吃完冷冷玉子燒,有點傷心,趕快來一盒博士章魚燒暖暖胃

結果有跟玉子燒合照,為什麼卻只跟章魚燒的食物劵合照,怎麼了我=_=


最後,管它是幾月天,身為甜食控一定要用甜食結尾~來支冰淇淋唄

另一人氣店家,豆乳冰淇淋跟迷你甜甜圈

不用吃冰淇淋就很甜,呵呵


若有機會重遊京都,錦市場會是想讓人再訪之一
所以說遊記不要拖過一年,邊寫都覺得也太流水帳了吧,憑什麼說有多想再訪o(╬ ̄皿 ̄)=○# ( ̄#)3 ̄)

Using GlassFish in Eclipse

在Eclipse中使用GlassFish Server前,請先安裝GlassFish和GlassFish Tool,安裝說明如下列網址
Install GlassFish Server
Install GlassFish Tool

接著按照下列步驟設定,設定完成後就能在Eclipse發布resource至GlassFish Server


New Server

選擇GlassFish,我安裝的是3.1所以選這個版本

設定Runtime與GlassFish安裝路徑
此時發現,沒有JDK可選,先將設定步驟暫停一下,回頭設定JDK

========設定JDK  開始========




========設定JDK  結束========

經過四個步驟的JDK設定,再回到設定Runtime與GlassFish安裝路徑,已經有JDK可選了

設定domain,如果設定domain有問題,請參考這篇glassfish\domains\domain1 does not exist

至此已設定完成,再來將想架在GlassFish上的resource加進去即可



com.microsoft.sqlserver.jdbc.SQLServerDriver not found

use MS JDBC Driver in Tomcat / GlassFish提到在GlassFish使用MS的JDBC,必須要把sqljdbc4.jar放到C:\glassfish3\glassfish\domains\domain1\lib\ext位置

結果繼續在同個java專案寫第二隻RESTful,竟然連第一隻都掛了,改了N次寫法,最終還是暫時把最近學@ManyToOne先註解調,先用最簡單測試過的方式撰寫,錯誤竟然變成com.microsoft.sqlserver.jdbc.SQLServerDriver not found,這個錯誤明明就在use MS JDBC Driver in Tomcat / GlassFish解決了不是嗎@@

程式碼改了又改,GlassFish重啟N次,VM記憶體一直被吃滿滿,最後~當我再把sqljdbc4.jar複製一份到C:\glassfish3\glassfish\domains\domain1\lib\位置並且重啟,就好嘞!!

目前是以下二個位置都有sqljdbc4.jar  特此紀錄,之後有看到可供佐證的文章再來確認@@
C:\glassfish3\glassfish\domains\domain1\lib\ext
C:\glassfish3\glassfish\domains\domain1\lib\

然後,這次還有個小心得~自己下command啟動GlassFish Server比Eclipse好用,又快又不會失敗 lol

<後記>
後來在Oracle官網找到一篇Making the JDBC Driver JAR Files Accessible,文中提到jar到底要放哪
copy the JAR files into the domain-dir/lib directory   一般JDBC
copy the JAR files into the domain-dir/lib/ext directory      Oracle database with EclipseLink extensions

不過這篇的GlassFish版本是3.0.1說~
針對我用的版本3.1.2.2又在Oracle官網找到Specifying the Persistence Provider for an Application,也是提到要放在domain-dir/lib directory

所以本來的做法明明就對呀@@
再觀察看看好了

Install GlassFish Tool

安裝好GlassFish,要開始在Eclipse中使用!
使用前,請先按照本文在Eclipse中安裝GlassFish Server開發工具

從功能選單的File→New→Others...選擇Server

Server Type根本沒GlassFish可選,那麼就點選右上的Download additional server adapters

有一堆Server Tool可以裝

找到GlassFish來裝

接受使用條款

一路等它安裝,安裝完後重開,成功!



最後,在瀏覽器輸入網址http://localhost:4848/common/index.jsf
若有以下畫面,表示你真的安裝成功^^ (前提是Server有Start喔)



參考文章
Eclipse 整合 GlassFish 3 開發環境
在Eclipse中安裝GlassFish Server開發工具
Eclipse Juno 中安裝 GlassFish

Install GlassFish Server

最近在看Java,想要改寫手邊一個小練習,體驗一下Java EE環境下的開發方式

問題來了,新增EJB Project時需要選TargetRuntime,怎麼沒有Tomcat呢?
原來Tomcat只是個Servlet容器,在Java EE是不夠用的,我們需要再找一個較全面的Java EE容器~GlassFish


首先至官網下載GlassFish,本文安裝ogs-3.1.2.2-windows.exe

一路用預設值安裝,若遇到8080 port被Tomcat佔用,解決方式請參考change Tomcat default port 8080 for GlassFish

安裝畫面如下






這個帳密的部分,如果按照預設,那就是不需密碼


安裝過程基本上就是這樣,都選預設值即可Next到底
至於如何在Eclipse中使用GlassFish請參考另一篇

京都御苑

京都御苑是旅程裡唯一不能delay的景點,如果要參觀裡面的京都御所,要事先在網路預約場次,不像餐廳還保留部分名額現場候位XD  不然就只能逛外圍的御苑了

京都市地鐵烏丸線的今出川站下車,出站後沿烏丸線往南走,順利抵達報到出~西側的清所門報到。好加在今天沒賴床&前晚預買早餐,不然京都御苑的外圍公園那麼大,一個走錯方向,很可能就找不到清所門@@

附上一張御苑地圖,寫漢字蠻易懂的(中央的京都御苑就是須額外預約場次的地方)

今天天氣好到爆炸,算是老天賞臉讓衣服帶不夠的我曬一下太陽XD

再提醒一次參觀免費但一定要預約!而且報到證明最好列印出來,方便工作人員查驗

參觀前要先至紀念品區集合,觀看影片與導覽人員的行前說明
導覽可以選擇英、日語場次,基於日語完全聽攏無,本人硬著頭皮選了英語場,老實說講了那些內容我全忘了,只記得導覽人員英文抹賣,沒有日本怪腔(我有資格說人家嗎XD)

聽完行前說明,接下來就是乖乖跟在導覽人員屁股後面,邊聽說明邊亂拍照
說亂拍不為過,因為認真聽就沒時間拍,也不能拍太久,會有個像007的日本大叔壓在隊伍後面,防止遊客脫離參觀動線T_T
而且而且,京都御苑的參觀是在戶外走動觀看建築物,雖有將室內門敞開,但不可入內只能由外觀賞,總而言之有點走馬看花XD

這張沒其他人頭,應該是嚴重落後隊伍拍的,後面可能有007殺死人的眼神 lol

這排朱紅色外廊圍住另一棟氣派建物,但也只能隔著朱紅大門,睨著因距離遠有點迷你的建物T_T

有點虛的京都御苑掰掰XD 下一站就是京都人的廚房錦市場啦^0^



★京都御苑
phone:075-211-1215
website:http://sankan.kunaicho.go.jp/guide/kyoto.html (請至官網預約)

JPA must has Primary Key

根據Java Persistence Book的23.6小節No Primary Key所述,使用JPA一定要有Primary Key
節錄內容如下

No Primary Key
Sometimes your object or table has no primary key. The best solution in this case is normally
to add a generated id to the object and table. If you do not have this option, sometimes
there is a column or set of columns in the table that make up a unique value. You can use
this unique set of columns as your id in JPA. The JPA Id does not always have to match the
database table primary key constraint, nor is a primary key or a unique constraint required.

If your table truly has no unique columns, then use all of the columns as the id. Typically
when this occurs the data is read-only, so even if the table allows duplicate rows with the
same values, the objects will be the same anyway, so it does not matter that JPA thinks
they are the same object. The issue with allowing updates and deletes is that there is no
way to uniquely identify the object's row, so all of the matching rows will be updated or
deleted.

If your object does not have an id, but its' table does, this is fine. Make the object an
Embeddable object, embeddable objects do not have ids. You will need a Entity that
contains this Embeddable to persist and query it.

以上落落長原文,用中文簡述如下
1. 最好狀況,就是table有primary key(以下簡稱pk),object也有pk(object可想成JPA裡的Entity)
2. 次之狀況,就是table沒有pk,但有unique value,可以改用具備unique value的column或column set(多個column組合,類似複合鍵的感覺)
3. 如果table結構實在連column set都做不出pk,那就改用all column當pk;如果連all column當pk都會遇到資料重複的問題,那也不用擔心,因為這種資料結構通常都是read-only,但如果做update或delete的話,就會是整批同value一起做,object的反應會跟table一樣
4. 如果table有pk,object卻沒有(可能因為某些設計因素你不願提供),那就使用Embeddable object處理
(第4點的Embeddable object本人還不會,之後再細究)

use MS JDBC Driver in Tomcat / GlassFish

Tomcat與GlassFish用法大致相同,只有jar包的儲存位置有差異,步驟如下

●下載JDBC Driver
Microsoft JDBC Driver 4.0 for SQL Server下載sqljdbc4.jar

●把JAR包放到lib資料夾
 ◎Tomcat
       放至Tomcat Server安裝位置的lib資料夾,如果Tomcat安裝在C:\Tomcat\,那就放到C:\Tomcat\lib
 ◎GlassFish
       放至GlassFish Server其domain下的ext資料夾,如果GlassFish安裝在C:\glassfish3\,且domain名稱為domain1,那就放到C:\glassfish3\glassfish\domains\domain1\lib\ext

●定義persistence.xml
< ?xml version="1.0" encoding="UTF-8" ?>
< persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
    < persistence-unit name="jpa unit name" transaction-type="RESOURCE_LOCAL">
        < provider>org.eclipse.persistence.jpa.PersistenceProvider</ provider>
        < exclude-unlisted-classes>false</ exclude-unlisted-classes>
        < properties>
            < property name="javax.persistence.jdbc.driver"
                value="com.microsoft.sqlserver.jdbc.SQLServerDriver" / >
            < property name="javax.persistence.jdbc.url"
                value="jdbc:sqlserver://sqlserver的位址:1433;databaseName=資料庫名稱" / >
            < property name="javax.persistence.jdbc.user" value="資料庫帳號" / >
            < property name="javax.persistence.jdbc.password" value="資料庫密碼" / >
        </ properties>
    </ persistence-unit>
</ persistence>

glassfish\domains\domain1 does not exist

GlassFish安裝完畢,開始在Eclipse新建GlassFish Server,結果卡關~拋錯glassfish\domains\domain1 does not exist
但安裝時明明就預設建立了名稱為domain1的網域@@

解決方法如下
●檢查C:\glassfish3\glassfish\config\asenv.bat的設定
請確認裡面的AS_JAVA=是指向正確的JDK位置
(我的VM存在多人使用不同版本jdk的狀況,所以這部分要改)

●執行C:\glassfish3\glassfish\bin\asadmin.bat

●輸入create domain語法
create-domain --adminport 4848 domain1

●輸入網域管理者帳號
我的帳號安裝時預設是admin

●輸入網域管理者密碼
我的密碼預設是空白,直接按enter即可

●成功
C:\glassfish3\glassfish\domains下也會出現一個名為domain1的資料夾,裡面有相關設定檔

Eclipse也恢復正常


參考文章
eclipse error: glassfish\domains\domain1 does not exist