網頁

2013年8月29日 星期四

Spring、J2EE、Hibernate學習筆記-could not initialize proxy - no Session

記錄一種狀況,在spring中使用hibernate是很常有的事,尤其在hbm中將兩個table的資料做聯集,不過遇到個狀況,記錄如下:

先取得人員的資訊(其中聯集到此人員的角色資訊),但事後要用時卻出現Exception如下:
could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session


看起來是預設聯集另一個table時是用lazy的方式,加上用的是spring的
HibernateTemplate,會自動close session,在hbm file那個field的property attribute加上lazy="false",這樣就ok了

2013年8月28日 星期三

Tomcat筆記-在ie中無法直接下載rar

Tomcat中內建的mime type沒有rar,所以照下列步驟處理

Step1:cd {Tomcat安裝目錄}/conf
Step2:vim web.xml
Step3:在Default MIME Type Mappings的區塊中,加入底下的code
<mime-mapping>
    <extension>rar</extension>
    <mime-type>application/x-rar</mime-type>
</mime-mapping>


Step4: 重啟server
Step5: 清掉IE的cache,再試一次就ok了

2013年8月20日 星期二

Spring、J2EE學習筆記-更動Tomcat內的jvm options

想要更動tomcat取用的memory量,找半天找不到在哪設,查了下資料才知道在shell script中,步驟如下

Step 1: cd {Tomcat安裝目錄}/bin
Step 2: vim catalina.sh
Step 3: 加入以下(設定是參考Help: Tomcat crashing with "org.apache.jk.common.ChannelSocket processConnection"

#JAVA_OPTS="-server -d64" (我的server不是64位元,所以mark掉)
JAVA_OPTS="$JAVA_OPTS -Xms2048m -Xmx2048m"
JAVA_OPTS="$JAVA_OPTS -XX:PermSize=300m -XX:MaxPermSize=300m"
JAVA_OPTS="$JAVA_OPTS -XX:NewSize=1024m -XX:MaxNewSize=1024m"
JAVA_OPTS="$JAVA_OPTS -XX:TargetSurvivorRatio=90 -XX:SurvivorRatio=5 -XX:MaxTenuringThreshold=12"
JAVA_OPTS="$JAVA_OPTS -XX:+CMSClassUnloadingEnabled"


我其實主要只是想設定2048的memory,哈

參考網址:
Help: Tomcat crashing with "org.apache.jk.common.ChannelSocket processConnection"
tomcat jvm options
add jvm options in tomcat

Spring、J2EE學習筆記-org.apache.jk.common.MsgAjp processHeader 嚴重的: BAD packet signature 18245

查看到log有底下的訊息

2013/8/15 下午 10:00:57 org.apache.jk.common.MsgAjp processHeader
嚴重的: BAD packet signature 18245
2013/8/15 下午 10:00:57 org.apache.jk.common.ChannelSocket processConnection 嚴重的: Error, processing connection
java.lang.IndexOutOfBoundsException
at java.io.BufferedInputStream.read(BufferedInputStream.java:310)
at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:628)
at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:585)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:693)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Thread.java:662)

查了下資料,發現還蠻多人有這狀況,主要是有人查了8009這個socket,用netstat -na看了下,也沒發現有process在用,這倒是讓我覺得有人在掃這個IP,不很好幾個小時一次,看了下資料都是在tomcat的server.xml中將<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />給mark掉即可,稍微看了下ajp是什麼

The Apache Tomcat Connector - AJP Protocol Reference
Apache JServ Protocol(wiki)

看起來是綁定web server和application server的binary protocol,細節沒測試不知道,猜是tomcat和apache綁定80有關,總之拿掉那行後看來是沒有exception了。

參考網址:

2013年8月19日 星期一

iOS開發筆記 - 取消圖示上的光影

有個需求要取消圖示上半圓的光影,印像是將Prerendered打勾,不知道為什麼一直取消不掉,只好找下資料,看到的方法都一樣,記錄在底下:

1. 先在專案 Target 的 Summary 標籤頁下找到 App Icons項
2. 在 “Prerendered” 打上鉤。
此时在info.plist里会多出一个配置项 "Icon already includes gloss effects"
3. 再找到 “Icon files (iOS 5)” 專案(如果有的話)展開,把裏面的 “Icon already includes gloss effects” 設置成 “YES”

不過仔細用以往的經驗想了下,可能是Resources被cache,只好"Command"+"Shift"+"K",先清一清專案重新編譯,裝置原本裝好的刪掉,再重新裝上去,就ok了

2013年8月14日 星期三

iOS開發筆記 - NSArray及NSDictionary的writeToFile: atomically:存檔失敗,但無Exception

NSArray及NSDictionary有個方便的writeToFile的function可以用,但發現若是裡頭有個元素是NSNull時,存檔會失敗,而且還沒有任何的exception,一般在使用時,是不會想到用NSNull,但我主要是在用AFNetwork時,發現它在解析JSON時,若null的元素會直接設NSNull。

推敲原因,猜測是因為NSNull並沒有實作Archive(實作了也很奇怪),而內定的Class都有,所以若有可能取得的NSArray及NSDictionary之中有元素可能有NSNull,要記得writeToFile前,先將那個元素remove或設成內定Class或能Archive的元素,才能成功儲檔。

2013年8月13日 星期二

Hibernate學習筆記 - org.hibernate.MappingException: No Dialect mapping for JDBC type: -1

試了半天也找了很多的資料,就是看不到有什麼解釋,只知道在設定hbm中設定property的type時,若使用的是sybase資料庫,type設定成text會有問題,會一直出現下列的Exception:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1

猜就是type不支援。查了資料,大多都說Text是varchar(4000),要用就type="string" length="4000",這樣設定就過了,不過4000也太大了吧

2013年8月11日 星期日

2013年8月8日 星期四

iOS開發筆記 - 使用Regular expression比對電話前置字串

做個紀錄

需求:
  • 針對+86 123234534或+886 097xxxxx
大概的寫法是:

NSError *error = NULL;
NSRegularExpression *regex 

   = [NSRegularExpression regularExpressionWithPattern:@"^[\\+][0-9]+(\\s)|^[\\+]" options:NSRegularExpressionCaseInsensitive error:&error];

NSString *mobile = @"+86 123456789";
NSString *modifiedString = [regex stringByReplacingMatchesInString: mobile options:0 range:NSMakeRange(0, [mobileChanged length]) withTemplate:@""];

NSLog(@"%@", modifiedString);


這樣就ok了~

參考網址:
NSRegularExpression Class Reference
User regular expression to find/replace substring in NSString

iOS開發筆記 - NSString取代字串中某個文字

記錄一下,NSString取代字串中某個文字的方式

NSString *str = @"This is a string. That is a string";
str = [str stringByReplacingOccurrencesOfString:@"string" withString:@"duck"];


這方式會搜尋整個字串,用後面的字取代所有符合前面字串的字

2013年8月4日 星期日

iOS開發筆記 - TTTAttributedLabel的使用

最近對UILable有些需求:
  1. 有link點擊
  2. 若是電話號碼可以打電話
  3. 若是連結可以開網址
  4. 若是地圖可以開Apple Map
找到了個不錯的元件可以符合上述的需求:TTTAttributedLabel,下載點:mattt / TTTAttributedLabel

mattt / TTTAttributedLabel有蠻完整的範例,不過這邊還是紀錄一下。

Step 1:
COPY兩個檔案:TTTAttributedLabel.h及TTTAttributedLabel.m

Step 2:
加入CoreText.framework

Step 3(若專案本身是ARC不需要這步驟):
至Build Paases -> Compile Sources中找到TTTAttributedLabel.m加入-fobjc-arc

再來就可以使用了。以我自己的為例:

先將要使用這元件的ViewController或Class加上TTTAttributedLabelDelegate

電話號碼:
TTTAttributedLabel *tel = [[TTTAttributedLabel alloc] initWithFrame:CGRectMake(10, 10, 190, 21)];
tel.delegate = self;

if (tel.text != nil && ![tel.text isEqualToString:@""])  { 

    //電話號碼的範圍是整個字串

    [tel addLinkToPhoneNumber:tel.text withRange: [tel.text rangeOfString:tel.text] ];
}


開網址:
TTTAttributedLabel *webSite = [[TTTAttributedLabel alloc] initWithFrame:CGRectMake(10, 10, 190, 21)];
webSite.delegate = self;
if (webSite.text != nil && ![webSite.text isEqualToString:@""]) {
    //網址的範圍是整個字串
    NSURL *urlString = [[NSURL alloc] initWithString:[@"http://" stringByAppendingString: webSite.text]];
    [webSite addLinkToURL:urlString withRange:[webSite.text rangeOfString: webSite.text] ];
}

開Apple Map:
TTTAttributedLabel *addrLabel = [[TTTAttributedLabel alloc] initWithFrame:CGRectMake(10, 10, 190, 21)];
addrLabel.delegate = self;
if (addrLabel.text != nil && ![addrLabel.text isEqualToString:@""]) {
    //地址的範圍是整個字串
    NSDictionary *addr = @{@"addr": addrLabel.text};
    [addrLabel addLinkToAddress:addr withRange: [addrLabel.text rangeOfString: addrLabel.text] ];
}


還蠻簡單易用。