<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java on 只放拖鞋的鞋櫃</title><link>https://jchu.cc/tags/java/</link><description>Recent content in Java on 只放拖鞋的鞋櫃</description><generator>Hugo</generator><language>zh-TW</language><lastBuildDate>Thu, 23 Feb 2023 18:25:11 +0800</lastBuildDate><atom:link href="https://jchu.cc/tags/java/index.xml" rel="self" type="application/rss+xml"/><item><title>Spring Boot OAuth 如何使用 Mock Server</title><link>https://jchu.cc/2023/02/23-oauth.html</link><pubDate>Thu, 23 Feb 2023 18:25:11 +0800</pubDate><guid>https://jchu.cc/2023/02/23-oauth.html</guid><description>&lt;style&gt;
 .roast {
 font-size: 0.9rem;
 color: #888;
 }
&lt;/style&gt;
&lt;p&gt;開發 Web 服務時，使用者的登入與驗證一直都是重要的課題，其中 OAuth 也是常被討論的部分。雖然 OAuth 已經相當成熟，但是 Spring Boot 的文件裡，使用 OAuth 的相關資訊通常都比較零散。&lt;/p&gt;
&lt;p&gt;本文紀錄我學習 Spring Boot / Spring Security + OAuth 過程中的理解與心得&lt;/p&gt;</description></item><item><title>Spring Boot 2.5.6 to 3.0.2 migration 筆記</title><link>https://jchu.cc/2023/02/21-post.html</link><pubDate>Tue, 21 Feb 2023 23:56:50 +0800</pubDate><guid>https://jchu.cc/2023/02/21-post.html</guid><description>&lt;p&gt;正在練習把玩的 Spring Boot 用的是 2.5.6，剛剛升級到 3.0.2，這邊隨手記錄必須的改動&lt;/p&gt;</description></item><item><title>Kotlin 雙冒號 ::someMethod 的觀察</title><link>https://jchu.cc/2022/09/03-kotlin.html</link><pubDate>Sat, 03 Sep 2022 23:09:44 +0800</pubDate><guid>https://jchu.cc/2022/09/03-kotlin.html</guid><description>&lt;p&gt;寫 kotlin 的時候經常會看到 &lt;code&gt;::myMethod&lt;/code&gt; 的出現，本文觀察編譯器的結果去猜測可能的過程。並非真正地去閱讀規格或源碼。若有寫不正確的地方，還請鄉親指正&lt;/p&gt;</description></item><item><title>Java 的 Nested Class</title><link>https://jchu.cc/2018/02/08-nested-class.html</link><pubDate>Thu, 08 Feb 2018 22:23:34 +0800</pubDate><guid>https://jchu.cc/2018/02/08-nested-class.html</guid><description>&lt;p&gt;最近公司做的產品，收到來自外面鄉親貢獻的 &lt;a href="https://github.com/mozilla-tw/Rocket/pull/1342"&gt;PR&lt;/a&gt;，想起了這個被自己遺忘很久的東西，趁著再次補起記憶的時候，順便做一點紀錄。&lt;/p&gt;
&lt;p&gt;簡單來說就是 Java 的 Nested class 盡量寫成 static 比較好。至於為什麼比較好，也許就要多花點功夫來了解。&lt;/p&gt;</description></item><item><title>RxJava Javadoc</title><link>https://jchu.cc/2016/10/10-rxjavadoc.html</link><pubDate>Mon, 10 Oct 2016 12:20:02 +0800</pubDate><guid>https://jchu.cc/2016/10/10-rxjavadoc.html</guid><description>&lt;p&gt;&lt;em&gt;2018/04/02 Update: add 2.1.12 doc download point&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ReactiveX is cool, as well as RxJava. If you are developing app and using RxJava, of course you often refer &lt;a href="http://reactivex.io/RxJava/javadoc/"&gt;RxJava documentations&lt;/a&gt;. I would like to refer its javadoc from my local host, but cannot find out a download point. Therefore I make a copy and upload it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.2.0
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dl.dropboxusercontent.com/u/9824121/rxjava-javadoc.zip"&gt;Download RxJava 1.2.0 javadoc from Dropbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://drive.google.com/open?id=0Bwg-OI96Zt_BU2VMY0xmWHJ0OFE"&gt;Download RxJava 1.2.0 javadoc from GoogleDrive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;About 40MB, includes all images&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.1.12
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dropbox.com/s/diwj6hgioggjnho/rxjava-2.1.12-javadoc.zip"&gt;Download RxJava 2.1.12 javadoc from Dropbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://drive.google.com/open?id=1H2PNtGKaWW1fsXL95rRt3kJBATpBqu4g"&gt;Download RxJava 2.1.12 javadoc from GoogleDrive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;About 50MB, includes all images&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Upgrade Retrofit 1.X to 2</title><link>https://jchu.cc/2016/09/05-retrofit.html</link><pubDate>Mon, 05 Sep 2016 23:51:48 +0800</pubDate><guid>https://jchu.cc/2016/09/05-retrofit.html</guid><description>&lt;p&gt;I guess most of people alreay read the post &lt;a href="https://futurestud.io/blog/retrofit-2-upgrade-guide-from-1-9"&gt;Retrofit 2 — Upgrade Guide from 1.9&lt;/a&gt;, me too. It listed some points for upgrading. If you used Retrofit 1.x in production, you might get more problem than the guide in upgrading, at least I did. Just make a memo here for myself and other poor guy.&lt;/p&gt;
&lt;p&gt;I had problems such as&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primitive String was wrapped by double quotes&lt;/li&gt;
&lt;li&gt;Upload multipart-form by using RequestBody doesn&amp;rsquo;t work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Android Studio use sdk source code</title><link>https://jchu.cc/2016/08/19-sdk.html</link><pubDate>Fri, 19 Aug 2016 11:49:49 +0800</pubDate><guid>https://jchu.cc/2016/08/19-sdk.html</guid><description>&lt;p&gt;用 Android Studio 的時候經常會用 debugger 設定 breakpoint 停下來抓蟲。step trace 的時候往往也會跳進 sdk 裡面的 code。Android Studio 會 decompile 並且找 source code 來幫助我們 trace&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android Studio 會看 build.gradle 裡面的 &lt;strong&gt;compileSdkVersion&lt;/strong&gt; 來決定開發環境用的 sdk version&lt;/li&gt;
&lt;li&gt;如果設定成 23，就會去找 &lt;strong&gt;API 23 的 source code&lt;/strong&gt;。所以要用 &lt;em&gt;Android SDK Manager&lt;/em&gt; 下載 API 23 的 source code&lt;/li&gt;
&lt;li&gt;如果是用 emulator 當開發環境，記得也要把 image 版本設定到相同的 &lt;strong&gt;API 23&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>使用 RecyclerView</title><link>https://jchu.cc/2016/03/13-recyclerview.html</link><pubDate>Sun, 13 Mar 2016 09:17:26 +0800</pubDate><guid>https://jchu.cc/2016/03/13-recyclerview.html</guid><description>&lt;p&gt;&lt;a href="http://android-developers.blogspot.tw/2015/10/android-support-library-231.html"&gt;RecyclerView&lt;/a&gt; 是個在 Google I/O 2014 出現的 ViewGroup，放在 &lt;a href="http://developer.android.com/intl/zh-tw/tools/support-library/features.html#v7"&gt;v7 support libraries&lt;/a&gt;，Android 2.1(API Level 7) 以上的版本都可以用，以現在普及率來看，幾乎是每一支手機都能用。&lt;/p&gt;
&lt;img src="https://jchu.cc/2016/03/13-recyclerview/3layout.png" alt="3layout.png" style="max-width: 800px; margin: auto;"&gt;&lt;p&gt;RecyclerView 預設就提供了三種 &lt;a href="http://developer.android.com/reference/android/support/v7/widget/RecyclerView.LayoutManager.html"&gt;LayoutManager&lt;/a&gt;，如上圖，由左而右依序是 ListLayoutManager, GridLayoutManager 與 StaggeredGridLayoutManager。都放在 v7 support libraries 裡面。&lt;/p&gt;
&lt;p&gt;看起來 List 與 Grid 已經重複了，為何 Android 還要多提供這個 Widget？&lt;/p&gt;</description></item><item><title>實作 Android ListView</title><link>https://jchu.cc/2015/09/26-implement-listview.html</link><pubDate>Sat, 26 Sep 2015 01:24:46 +0800</pubDate><guid>https://jchu.cc/2015/09/26-implement-listview.html</guid><description>&lt;p&gt;最近在改別人留下的 Android code。&lt;/p&gt;
&lt;p&gt;好一段時間沒寫 Android 了，尤其我的記憶力又特差，經常要翻一下以前寫的程式才能回想起來某些 widget 怎麼用，ListView 就是其中一個。雖說一個功能可以有多種不同實作方式，各人又有各自常用的套招，即便 ListView 沒特別難，還是經常可以看見各種不同的寫法。&lt;/p&gt;
&lt;p&gt;原本只是要貼一些程式碼進自己的筆記 wiki 裡面，想說反正都寫一些了，不如多寫一點貼出來給有緣人當參考，雖然更多時候會是我自己一直回頭來看。&lt;/p&gt;
&lt;p&gt;用 ListView 的時機通常就是這幾種&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;把一堆字串顯示在 ListView 當中&lt;/li&gt;
&lt;li&gt;把客製化的 View 顯示在 ListView 當中&lt;/li&gt;
&lt;li&gt;提供單選 single choice 的選單&lt;/li&gt;
&lt;li&gt;提供多選 multiple choices 的選單&lt;/li&gt;
&lt;li&gt;實作客製化的 multiple choices&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;接下來針對以上常見的需求來介紹，同時也會處理 Click 事件&lt;/p&gt;</description></item><item><title>SimpleAdapter and ViewBinder</title><link>https://jchu.cc/2015/09/23-simpleadapter-viewbinder.html</link><pubDate>Wed, 23 Sep 2015 23:14:59 +0800</pubDate><guid>https://jchu.cc/2015/09/23-simpleadapter-viewbinder.html</guid><description>&lt;p&gt;這是一篇以前寫過的&lt;a href="http://walkingice.blogspot.tw/2013/06/simpleadapter-and-viewbinder.html"&gt;老文章&lt;/a&gt;了，以前的 syntax highlight 弄得不好，想說貼到這邊排版比較好看，順便備份一下。&lt;/p&gt;
&lt;h1 id="simpleadapter-should-be-enough"&gt;SimpleAdapter should be enough&lt;a class="anchor" href="#simpleadapter-should-be-enough"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;ListView 是 Android 一個極為常用的元件，經常看見為了「用自己定義的 xml 來產生 ListView row」而自己實作了一個 BaseAdapter。這樣的作法也不能說不對，我一開始也是這樣。為了烤蛋糕自己做了一個烤箱的事情，幾次之後還是覺得有點怪其實絕大多數的時候我們都不需要額外實作一個 Adapter，直接拿 SimpleAdapter 來用即可。&lt;/p&gt;</description></item><item><title>streamsupport</title><link>https://jchu.cc/2015/09/18-streamsupport.html</link><pubDate>Fri, 18 Sep 2015 01:16:11 +0800</pubDate><guid>https://jchu.cc/2015/09/18-streamsupport.html</guid><description>&lt;p&gt;從字面上來看 Javascrpit 跟 Java 的差異只是在於一個是 script language，另外一個不是 (超級大誤)，所以在 Javascript 做的事情當然都可以用在 Java 裡面。(胡說八道)&lt;/p&gt;
&lt;p&gt;在 javascript 裡面經常用 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map"&gt;map&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce"&gt;reduce&lt;/a&gt; 來對資料做處理，好比說&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;num&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;bb&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;ccc&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;dddd&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;eeeee&amp;#34;&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}).&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}).&lt;span style="color:#a6e22e"&gt;reduce&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;prev&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prev&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這支無用的程式就是依序把一個字串陣列做處理&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;字元數小於 2 的字串拿掉&lt;/li&gt;
&lt;li&gt;把字串陣列轉成整數陣列，內容是該字串的長度&lt;/li&gt;
&lt;li&gt;加總每個數字&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;整個處理的過程就像一個串流(Stream)，Java8 多了 &lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html"&gt;Stream&lt;/a&gt; 這個 utility class，提供了類似的功能，可以讓我們把一個 Array 或是 List 用類似的方法來處理。&lt;/p&gt;
&lt;p&gt;但是 Java8 這麼新潮(唔)的東西，不能用在 Android 上面？就像 retrolambda 一樣，也有鄉民弄了 &lt;a href="http://sourceforge.net/projects/streamsupport/"&gt;streamsupport&lt;/a&gt; 這個 library，讓我們在 Java6 runtime 玩 stream util&lt;/p&gt;</description></item></channel></rss>