跳到主要內容

發表文章

目前顯示的是 2014的文章

Java - 使用 JavaScript Engine 在後端執行 JavaScript

這篇是想寫好一段時間了 最近剛好有需求做了滿完整的應用,剛好可以拿出來當示範 Java的JavaScript engine在現在前端開發的需求越來越多的情況下,活躍的場合更多了 通常在以下狀況,你可以考慮使用JavaScript Engine 1.你想在前端使用Java的物件、類別或方法 2.前端複雜的邏輯需要在後端實現 當然你也可以將前端的運算結果用JavaScript engine傳送給後端 不過我想這個需求,使用browser request傳遞前端運算成果到後端做起來會簡單很多 這次我的實作目的是需要將一段前端邏輯拉到後端實作 目的程式最初是為了前端的功能實作,儲存資料的方式也是JSON 最後會compile成一段在JavaScript執行的code 不過有時候變化就是那麼突然(咦),因為客戶的需求及安全性考慮需要在後端使用這個功能 這次乾脆讓他在後端以JavaScript的方式省掉重新設計邏輯的麻煩 程式碼如下:

[轉載] 「無效的用戶名或密碼」:這種設計真的糟透了

優化系統設計流程的小細節 文章来自 36氪 如果登錄時輸入了錯誤的用戶名(通常是Email)或者密碼 大部分系統會彈出這麼一句話:Invalid Username or Password(無效的用戶名或密碼) 系統不會告訴你究竟是哪一個輸錯了,因為他們是特意被設計成這樣的 這樣做的原因,是出於安全性 如果有人惡意嘗試破解,具體告訴他們密碼錯了就意味著Email是對的 (帳號存在) 無形中為他們排除了一個選項 遺憾的是,這種設計顯然低估了人們的智商

Android - ImageView 移除多餘 Padding

使用 ImageView 顯示圖片時發現有多餘的Padding出現 查詢過後得到原因的解釋 因為手機解析度(density)的差異 ImageView在不同的裝置上的邊界顯示會有所不同 要確保圖片的顯示正確,可以在 ImageView 上設定adjustViewBounds屬性 <ImageView             android:layout_width="wrap_content"             android:layout_height="wrap_content"             .....             android:adjustViewBounds="true" />

Java 8 Nashorn ArrayIndexOutOfBoundsException

雖然有一段時間沒有發文 不過其實我都還是有寫些草稿,只是一直沒有完整的時間加筆 今天趁這個問題還在時效內,貼出來充版面XD 今天碰到的問題是在Java的scripting engine上跑字串實字(literal notation)會碰到  ArrayIndexOutOfBoundsException 追蹤原因後才發現客戶端使用了JDK8,難怪會有這個跟測試端不同的狀況 如同大家所知,在JDK8後Oracle揮別了過去使用的Rhino,改用新開發的Nashorn 這個例外很難不聯想到新引擎的bug 查了下果然看到類似的 問題 然後這是官方的回覆 I can reproduce the problem with 8u20, however it seems to be fixed in  JDK 9 and JDK8u40. You can download a preview release of 8u40 here: https://jdk8.java.net/download.html 這個問題推測會發生在使用數字做為JavaScript物件的屬性時 目前測試還有一種暫時的解法 就是不使用字串實字建立JavaScript物件,而是用Object的Constructor建立 也就是 var obj = {} -> var obj = new Object() 目前看起來可行,當然不保證不會觸發其他的問題 也許new Object()的實作方式是使用Java的Object,所以不會有這問題 猜測歸猜測,如果沒辦法等官方的修正,也許還是可以試試看這方法

Android 在 ScrollView 裡使用 ListView

這篇純粹拾人牙慧,來源是  How can I put a ListView into a ScrollView without it collapsing? 如同大家知道的的,ListView 放入 ScrollView 之後就變成疊起來的狀態 實際上 ListView 本身就能夠 scroll,只要將 layout_height 設定成 wrap_content 就可以了 把兩個具有 scroll 能力的元件疊加使用反而會沒辦法正常顯示 但有時候你想做的會是將複數個 ListView 並排展開 外面再包一層 ScrollView 讓一次就能捲動所有的 ListView 這時候就需要一些特殊技巧處理 提醒如果你要製作的排版並不複雜 也許只需要透過 ListView 的 addHeaderView、addFooterView 就能滿足需求 如果你要捲動的範圍內包含了文字、圖片、很多個ListView等複雜的排版,才建議使用這個方式

Android Studio 初探

參考文章: IntelliJ IDEA Q&A for Eclipse Users ndroid Studio vs. Eclipse: What You Need To Know last update:2014/12/9 Android Studio是Google的Android官方開發工具,目前正式推出1.0版了 這項工具是 IntelliJ 的開源版本 + Android SDK + Gradle 的整合 取名Android Studio大概是因為這樣才會有比較多人用吧 Google已經確定不會繼續維護Eclipse上的開發套件ADT 現在已經沒有理由不用Android Studio了 Google將他調校的滿不錯,很多快捷鍵跟新功能都很方便 這篇是我從ADT轉換過來的摸索,圖片有時間的話再更新成1.0版的圖示

建立 Android 專案的 build.xml

參考文章: GENERATING A BUILD.XML FOR AN ANDROID PROJECT Android tool 提供了建立 builder.xml 的功能 使用 Ant 跑過這個檔案後就可以產生 Android 專案的apk檔 在Windows環境下,你需要先將 .android\sdk\tools 加入系統的環境變數的 path 下 將著在命令提示字元下 android update project -p [專案路徑] -n " [apk名稱] " -s 這樣就可以產生專案用的 build.xml 看之後是繼續使用 command line 下 ant release 或其他方式取得apk檔

Windows環境 Java 8 update 後產生的 "Could not find Java SE Runtime Environment"

最近幾次更新Java 8時多少會碰到一些問題,實在很想問Oracle團隊 "你們累了嗎?"... 很明顯最近幾次是變更過往使用的路徑配置,但在 registry key 的部分沒改到 這次升到 Java 8 update20 就發現 jre 的目錄名稱為 jre1.8.0_20,而不是過往使用的 jre8的命名 升級後到 console 可以發現 java 的指令無法使用 這一連串的完整錯誤訊息是 Error: opening registry key 'Software\JavaSoft\Java Runtime Environment' Error: could not find java.dll Error: Could not find Java SE Runtime Environment. 解決方式會需要修改registry key 首先打開windows的命令提示字元(win8.1的快捷方式是Fn+R然後搜尋cmd) 輸入regedit 打開 Windows 的註冊編輯程式 找到 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment 先在這個機碼裡面新增字串 CurrentVersion ,數值設定為 1.8 接著新增機碼 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.8 在裡面新增新增字串 JavaHome,數值設定為你現在的 jre8 的路徑 修改完後到命令提示字元試試 java -version 這指令是否已經生效

Eclipse 使用 Ant 產生 jar 檔

這篇只做簡單介紹,不做Ant的教學 Ant 是Apache基金會底下的其中一個自動化工具專案 特別是 Java 使用者應該都會聽過這個工具 Eclipse 已經將這個工具整合為其內部功能之一,所以我們可以透過Eclipse的介面來執行

Android AsyncTask 較佳的 Exception 處理方式

Android 在 4.0 以後規定有網路連線的程式必須寫在另外的Thread,主Thread 負責處理與UI相關的部分 Android裡的 AsyncTask 是符合這個需求比較好的解法,他本身實作了 Java 的 concurrent 套件 所以透過它可以省掉一些實作上的細節 只是App中最常碰到的 Exception 大多是網路連線引發的 一旦沒有處理到 Exception 就很容易導致 App crash App 本身的 Exception 處理不像 Java Web 那樣有 filter、error page 等機制 參考討論後大概是以下方式比較好處理 Multi-Thread 引發的 Exception

使用開源 Library or 自幹?

純粹看到這方面的討論,所以寫一下個人心得 有經驗的開發者大概都已經有一定的體會 在我剛入門的時候滿願意嘗試各種 Library 有別人造好的輪子,那幹嘛再自己打造一個呢? 而且別人已經實現的功能看起來很強大、很好用,玩起來也很有趣 只是開源 Library當然不完全是這麼方便,使用前可以考慮以下理由 1.使用的語言及版本 你要引入的函式庫可能會使用其他語言或是不同的版本 需要承擔與當前的dependency衝突或造成日後版本升級的dependency衝突問題 2.需求不完全一致 你所需要的可能只是開源函式庫的一部分功能 但是他設計的API可能為因應廣泛的功能開發而需要更多的輸入 所以你可能會需要提供原本根本不用產生的資料 3.肥大 很多強大的框架、函式庫伴隨而來的是他的體積或是對資源的佔用 如果你開發的是與網路狀況關係更密切的應用,那麼更該盡量縮減應用的大小 4.維護與資安問題 日後你可能會因為效能、bug、配合其他功能所需的dependency等理由升級 這些也是採用上隱含的成本 這概念跟使用商用軟體或開源軟體的議題雷同 雖然開源軟體是很好的概念,也沒什麼帳面費用,但它隱含的成本可能不少於商用軟體 很多時候如果碰上bug,你可能得幫忙回報、修改才得以克服 當然這也開源軟體能持續進步的精神 商用軟體就是把上述的問題丟給開發公司負責,由他們提出解決方案 所以沒有哪邊一定比較好,重點還是開發時的各種考量 另外資安問題也是得重視的問題 left-pad事件 也是頻傳的狀況 業餘時間開發的維護者不爽無法從採用的大公司分到收益時有所聞 當你發現重要的產品壞掉竟然是採用的open source層層倚賴的如此簡單的功能出問題 想必也是無言吧 Log4Shell漏洞也是源自於圖方便的極少數需求而來的 簡單講考量須回歸SOLID原則 你採用的方案是否會造成高耦合,難以抽換或引入困難的變更成本

個人旅@京都 Day4(2014/04/11) 清水寺→二、三年坂→高台寺→金閣寺→仁和寺→北野天滿宮

話說我在之前想過 "考完這次JLPT後,我就要回來寫Blog了" 嗯...有些 Flag 還是不要亂立的好 Orz 這一天是我這個行程中在日本的最後一天 出發前還在猶豫要跑京都內部的景點、或者是跑到海津大崎賞櫻 這個時間點除了洛北的部分地點外,櫻花的花況也差不多要進入尾聲了 前一天晚上在爬花況文的時候看到有人推薦海津大崎,查了一下還滿心動的 這個行程通常會安排騎自行車遊琵琶湖畔賞櫻,以及參觀日本名城之一的彥根城 不過因為從京都出發的話要比較早啟程才有充足的時間 考量到這一天晚上還要搭HARUKA回關西機場 時間的安排上沒那麼有把握之下,還是選擇以京都市內的景點優先 退房後先前往京都車站放行李 京都車站有不少角落提供置物櫃寄放行李,時間最長可以放一天 所以可以玩一天後再回車站取行李後離開,對觀光客來說非常友善 這一天第一個來到的地點是清水寺

個人旅@京都 Day3(2014/04/10) 伏見稻荷大社→宇治

這一天因為早上出發的比較晚,差不多9點才到伏見 伏見等京都南邊的地區的京都巴士班次並不多,使用JR會比較方便 反正ICCOCA有1500日圓的儲值,在這邊用用也不錯 JR稲荷駅出口正對面就是伏見稻荷大社囉 伏見稻荷大社作為知名的觀光景點,歐美系的遊客滿多的 另外是櫻花季這段時間似乎是日本國中、小的畢業旅行時期,這幾天碰到了滿多學生團 入口處放了 いなり、こんこん、恋いろは 的 大奶怪 宇迦的宣傳圖耶

個人旅@京都 Day2(2014/04/09) 銀閣寺→哲學之道→蹴上鐵道→平安神宮→二條城

哲學之道是一條種植了許多櫻花的溪邊小徑 這裡曾經是某位京都大學哲學系教授每天散步的路線 因為這裡的櫻花綻放的時間較早,所以算是要看得趁早的選擇 第一天的晚上查詢花況得知哲學之道的花況大概剩六、七成 雖然花況已經有些差了,不過估計4/9正式開始進入吹雪期 所以就打定第一天早上會過來看看櫻吹雪啦 哲學之道的其中一端的起點在京都的世界文化遺產之一的銀閣寺旁 排行程時可以選擇一起觀賞 我選擇的方式是看完銀閣寺後,再沿著哲學之道遊覽 之後的行程沒有排的很確定,就看哪邊有花就往哪邊走啦 到銀閣寺前先往哲學之道喵一眼....嗯,六、七成的花況也還算有花

個人旅@京都 Day1(2014/04/08)

其實第一天沒特別到哪邊去 只是有點難與其他篇合併寫,所以還是單獨寫一篇 這天到關西機場後就直接搭乘 HARUKA 到京都車站了 搭乘時要注意HARUKA的班次大約是一個小時一班 也要特別注意不要搭到在同一個月台發車的關空特快,只有關空特急才是HARUKA喔 關西機場建在填海的陸地上,從HARUKA上看過去的景色還滿漂亮的 與京都的交通時間大約要一個半小時,就放鬆心情搭乘吧

個人旅@京都 規劃細節回顧

在四月前半進行了一趟自助旅行 除了一如慣例剛回來的發懶而提不起勁寫文章外 我不否認四月底的遊戲潮有對撰寫文章時間造成影響啦(炸) 然後最近又比較忙些,沒什麼寫文章的時間 這趟旅行的文章就盡量找空隙慢慢生出來 這次的旅行原先是看到櫻花季機票的優惠活動來的 去年看過了日本的夏季,今年就換個季節觀看吧 因為不是最一開始就這麼打算的 臨時試著問過一些朋友也不大好湊時間,那麼就乾脆自己一個人上吧 畢竟旅行是為了自己,配合別人而大幅更改內容不是我喜歡的事 這次搭的是樂桃航空往關西的線 旅遊路線的安排上原本有考慮撥一部份時間到大阪來趟半澤直樹朝聖之旅 不看因為櫻花的景點還是京都比較多 加上他還有為數不少的歷史景點 包含了戰國時期(本能寺)、明治維新(桂、坂本龍馬、登勢)、陰陽師等 當然上述這幾個點是我考慮很久最後放棄的(笑) 如果要做完整有深度的京都旅遊,可能最少要一個星期以上吧 在這樣的考量下,這次就全部都安排在京都

從user agent辨識新版 IE (IE11)

大家都知道在IE11後,IE就不在 user agent 裡寫上MSIE的訊息 就好像要把新IE跟過去舊IE做的蠢事撇清一樣 只是新版的IE還是有部分行為是沿用過去的,不能辨識時還是有點麻煩 好在 user agent 裡還是保留了些訊息 IE11的 user agent 的內容會是 Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; TAJB; rv:11.0) like Gecko IE10的 user agent 的內容則是 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0) 其實從這邊可以推測在IE10後,微軟就已經更換了IE的架構 Trident這個字眼應該是微軟內部使用的產品版號 之後辨識這個字眼應該就可以了

商戰的法律利器 - 假處分

這篇是聽完大成台灣律師事務所的執行長林合民律師的講演心得 首先是關於主題 "假處分" 的說明 台灣的法律制度基本上是學習日本,而日本是學習德國 所以用語上有些以日文解釋會更合情合理 假處分的假字是從日文來的,也就是 "仮" 這個字,意思是暫時 所以台灣的的假執行雖然有個假字,但卻是真執行! 同理可以推斷台灣的法律用語 假處分、假扣押、假執行 意思都相近,表示暫時處分 需要這個制度的原因是,官司訴訟從開始到結束的時間可能非常久 科技業的商品生命往往就是打官司的這兩、三年間 另一方面對方也有可能在訴訟前脫產 所以對訴訟的雙方來說,需要有個方法保障這段時間的獲利 假處分便是向法院請求 提前實現最後的判決結果

Chrome 網頁瀏覽阻斷排除(Caution provisional headers are shown)

最近幾天使用Chrome時,有時會網站有些頁面無法瀏覽 但使用其他瀏覽器開啟那些站台時,看起來又相當正常,所以不是網路線路的問題 後來打開Chrome debugger時會發現顯示一串文字 Caution provisional headers are shown 這表示這項資源可能是被擴充程式(extension)或者是一些特殊狀況 blocked 基本上我在Chrome使用的擴充程式並不多,其中的確有一次是因為AdBlock這個extension引起的 但其他並不是這樣,所以得仰賴一些Chrome內部的trace工具追查原因 你可以透過在網址列打上 chrome://net-internals 進到瀏覽器的內部控管台 切換左上角為"Event"後再重讀一次有問題的頁面 此時你就可以看到連線時相關的事件內容 在上方搜尋欄輸入該頁面的相關文字可以過濾相關的事件,這樣一來就可以找出原因 例如你可以從上圖看到我這次的問題是因為DNS產生,換了DNS就OK了 有類似問題也可以透過這個工具找出原因

網頁連結元素 Javascript Call 之 IE 地雷

相信很多Web開發者都會使用無作用連結做一些項目的設計 例如:<a href="javascript:void(0);" onclick="handler()" > Click me! </a> 設計的原因包含了 link element 的外觀較醒目、預設的mouseover行為的cursor就是pointer等等 你可以注意到其中的href屬性設定了 "javascript:void(0);" href 裡前綴為 javascript: 的內容會被做為 inline javascript call 執行 如此可以避免執行browser的 link element 的頁面跳轉預設行為 void(0); 則表示在JavaScript中什麼也不做 這樣就完成了一個無作用連結 既然 href 可以用來執行JavaScript,當然你也可以用  "javascript : functionA();" 的形式 讓 link element 在被點擊後執行 functionA 聽起來是很方便的做法,既然如此為什麼還會很常聽到不要這樣做的建議? 原因有2點 1是這一段 function 是用eval parse文字後才執行,效率會差一些 當然這個影響並不是那麼大,下一個原因才是重點,也是今天踩到的雷 2.在瀏覽器間的行為並不一致 當使用的function會回傳DOM object,IE會將頁面導到空白頁面並顯示[object HTMLElement]的訊息 而且直到最新的IE11的行為也是如此 這一點算是IE在行為的解讀比較奇怪,都已經是執行JavaScript了卻還保留原本的跳轉頁面行為 所以基於以上理由,少在 link element 的 href 屬性使用 inline JavaScript call 吧

Javascript操作表單元素

最近處理表單輸入項時,實在厭倦了使用getElementById、getElementsByTagName等DOM方法取得元素 一般的輸入項(input、textArea)還算好處理 只是碰上了radio button或checkbox這類群組型的輸入項還是比較麻煩 後來想一想應該有更優雅的方式能處理取得表單輸入項的元素或值才對 所以就找到了用HTML Collection的解決法

QNAP QPKG開發經驗

last update:2015/02/10 前一陣子在忙的整合,只是因為很懶才現在寫出來 老實說也是近期我才知道NAS這東西究竟能做什麼 剛好有一家客戶是用Synology的產品跑Ragic 而QNAP也找上門來談合作 這樣就把台灣前兩大的NAS廠的東西都摸過啦(註:也是世界前兩大) 我個人認為NAS適用於完全都不懂的新手或玩Linux及程式很熟的IT使用者 新手就不用考慮有的沒的需求,看平台提供什麼樣的服務就使用那些服務 如果想藉NAS做到特定需求,得要有些能力才能夠建置完成 對於這兩家的NAS硬體部分沒有研究,這部分就不提 以目前接觸過這兩家的產品的軟體面來說,我覺得QNAP的方向是對的 而QPKG就是把各家程式包裝成QNAP自家格式的 App 讓使用者能夠輕易安裝 他們的介面對於一般使用者會是比較親切的作法

選擇輸入項的提示選項設計方式

這篇來提一個設計上的易用性的小技巧,來自前幾天看到的討論 常見到一個需求是,你會想在選項裡增加提示字眼(例如:請選取選項),但又不是真的想讓使用者選取它 這算是在小地方對使用者更貼心的技巧,那麼要如何達成呢? 先從傳統的透過HTML找看看有沒有方法可以達成,印象中optgroup這個tag似乎有可能? 選項1 code: <select name="demo">     <optgroup label='請輸入選項'>         <option value="1">選項1</option>     </optgroup> </select> 雖然的確有可以提示的部分,但是否符合需求就見仁見智了 第二種方式是透過selected屬性與disabled屬性並用 請輸入選項 選項1 code: <select name="demo">     <option selected disabled>請輸入選項</option>     <option value="1">選項1</option> </select> 選項的預設值透過selected屬性解決,而disabled屬性則會在進行選取時發揮作用 看起來是不錯的方法,只是我在後面有看到一個我更喜歡的方式 第三種方式是透過CSS輔助 請輸入選項 選項1 code: <select name="demo">     <option selected style="display: none;">請輸入選項</option>     <option value="1">選項1</option> </select> display: none;會在選取時發揮作用,讓選單裡乾脆不出現這個選項 目前就看到這幾種方式,設計時可以考慮使用來增加易用性

Even Faster Web Site 讀後

這本書寫的時間點比較早 而最近幾年的browser和網路建設更是日新月異 有些內容可能已經不大適用,不過裡面的多數準則依然可以遵守 一部分的內容在blog其它文章提過了,就不寫在這裡了 追求效率的重點之一便是提高檔案的下載、重繪(render)等處理的效率 很多技巧都是為了追求這個要點而發展出來的