[iOS][粉絲相簿更新]更新App版本到XCode6

前言:

雖然我不算是專業App開發者,但是有了新版本的XCode更新還是會更新一下.這裡也記錄一些更新的過程中可能會有的問題.

過程筆記:

  • 是否要保留XCode5,該如何保留?
    • 要不要保留xcode5?
      • 這個見仁見智,不過短時間Apple不會阻擋xcode所submit的App之前.如果不想踩到太多地雷,或是企業外包App可能可以先保留起來.
    • 如何保留?
      • 這個動作必須要在App更新之前.
      • 建議把XCode從 Application 裡面複製出來.如果只是改名字是沒有用的.
  • 模擬器發生錯誤,Simulator Error: “An error was encountered while running (Domain = FBSOpenApplicationErrorDomain, Code = 4)”
  • App Package的大小從5.6MB-> 3.1MB
    • 原因我還沒查清楚,只知道大小縮小接近一半.這倒是可以好好研究看看.
    • 看起來原因是出在Provisioning 不一樣的原因,不過這個會造成大小差異?倒也是很奇怪.

[Docker]增加一些跟Docker有關的筆記

image

前言:

主要是前一篇ELK(Elasticsearch, Logstash and Kibana)文章發表之後,有人在跟我要docker image.雖然馬上就找到了logstash的docker hub.但是還是很認真的玩了一下docker,順便當作複習.

常用工具

這裡記錄一下常用的語法:

  • 停止並且刪除所有的container
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
  • 刪除所有的images
docker rmi $(docker images -q)

關於docker的一些發想

記錄一些這兩天想到關於docker可能有的更多應用.

  • 散佈新的web services/applicaiton
    • 可以隨時把你看過新的web application 或是service利用docker架成一個自成網路然後直接開始給你認識的人.讓他也可以玩玩看,而不用架個老半天,也不擔心雙方OS的問題.
  • Bug reproduce 環境保留
    • 如果某些特殊的環境下,QA可以透過docker建立好具有問題的環境然後交給RD去解決問題.

[ELK Stack]利用logstash,elsticsearch與kibana來分析log

image

前言:

本來只是跟幾個前同事聊天的時候聽到這個軟體,並沒有在意.結果之後就偶然有機會用的到.本來覺得還蠻複雜的,但是看完以下這篇影片好像就簡單多了.

https://www.youtube.com/watch?v=Kqs7UcCJqu

簡單的說:

  • logstash: 幫助你去收集各地的log或是資訊~並且根據你的格式,轉換成各種資料欄位.
  • elasticsearch: 根據各種搜尋欄位來尋找資料.
  • kibana: 視覺與圖形化的表示方式來顯示各種log,並且透過這個工具可以幫助你回答許多商業上的問題.比如說: 大部份使用者用那種裝置登入網頁?由哪個國家來?類似這些的問題.

接下來就打算要好好的研究一下,如何使用這套強大的工具.

安裝與執行:

安裝上其實間單到個不行,所以不太需要敘述.唯一需要談的是要記得裝 Openjdk-7-jre .

在執行Kibana的時候,我自己會一直出現連不到elasticsearch.後來我的解決方法是.先連一個不能連的位置.然後再連一次~就莫名其妙好了.

Logstash 的簡單介紹:

Logstash實在是一個功能很強大的工具,它主要能做的事情有:

  • [抓取]由各種地方抓取相關的資料,不論是標準輸入(stdin),檔案或是監聽一個連線都可以.並且可以把不同的資料來區隔開來作為之後用途.
  • [篩選]抓取到資料之後,這時候可以選擇使用grok去拆解資料.比如說把一串非常長但是沒人看得懂的log拆解成各個相對應得資料欄位.
  • [輸出]可以輸出到各種地方,不論是輸出到stdout印出來,或是直接丟給Elasticsearch拿來做分析用甚至可以直接輸出到資料庫.

Elasticsearch的簡單介紹

Elasticsearch是一個很有用處的資料搜尋引擎.只要能把資料餵給他(沒有限制是logstash的),你就可以下參數去搜尋需要的資料.並且他會吐出相關的JSON回復.預設的連接埠是9200.

並且Elasticsarch支援RESTful的API,所以其實有很多的類似的extension 或是 plugin可以使用.

如果一直把資料餵給他,是可以把它當資料庫使用.

Kibaba的簡單介紹

Kibana連接著Elasticsearch之後能夠去搜尋與分析資料,並且把分析的資料用圖像的方式來表現.可以記住許多的分析參數來作為BI的用途.

關於Logstash的進階使用

  • grok是一個強大的工具,可以免去你使用regular expression 的痛苦,不過它的語法還是需要習慣.它的用途主要是可以把一串長長的字串翻譯成你看得懂的JSON格式.不過前提是你得把資料格式敘述好~讓他知道如何對應.
  • grok debugger 是一個好工具可以幫助你來找出你需要的match pattern. https://grokdebug.herokuapp.com/ 使用流程如下:
    • 先把你的Log RAW Data放到Discover的地方,可以幫你找出一些可能的pattern
    • 不然可以到Pattern去查查看常用到的pattern有哪些
    • 建立好基本的pattern之後,拿到Debugger那邊去一步步把它全部翻譯出來.
  • 一些心得分享:

結論

ELK Stack (Elasticsearch + Logstash + Kibana)可以幫你解決一些問題如下:

  • 太長的Log卻沒有一個方法可以整理跟分析它
  • 太多來源的log,每次查詢一個問題需要打開三四個檔案,但是往往還是不知道原因.得要人工去查詢.
  • 想要透過系統的log去做一些商業智慧(BI)的分析,但是又無從下手.

我覺得這套系統相當的簡單而易學,重點是也容易架設.我想可以作為伺服器要使用得時候,這個是必須要有的.

參考資料

[Jekyll]從Wordpress搬家到github pages

前言:

最近買了一台Synology NAS(DS213J)回來用,本來是打算在上面架設部落格跟相簿.不過使用過一下之後,發現Synology的限制很多.不僅內建Wordpress有許多的問題.更難去設定domain name.加上最近寫部落格覺得使用HTML越來越礙眼.可能跟一直使用Github也是有關係的. 所以決定把所有的相簿語部落格全部轉到免費的地方.

  • 相簿轉到 Flickr去,順便做異地備份.不過會把所有之前的資料寫進EXIF.這也是前幾天在忙的事情,應該過兩天會整理一篇文章.
  • 部落格轉到Github Page去,其實已經很多大大都是這麼做的,我也很想做很久.
  • 最後,家裡的NAS應該會躲在防火牆的後面.專心的儲存檔案.

接下來就會稍微提到,我這幾天在弄JekyllHugo的心得.

Hugo系統的安裝

Hugo 的安裝其實沒有遇到太大的問題.唯一的問題就是沒有比較好用的Wordpress導入的工具.大部份都是從Jekyll轉過來,所以決定先弄弄Jekyll

關於Jekyll的導入:

  • 關於架設Jekyll其實相當簡單,主要就是卡在Ruby架設跟Ruby Gem的安裝
    • 這裡我重新安裝兩次的Ruby跟Ruby Gem才能順利跑到比較正確的版本安裝.
  • 要啟動Jekyll 主要就是靠 Jekyll Bootstarp
    • 其實Git Clone下來後稍微修改_config.yaml就可以直接使用.
  • 關於Jekyll 導入有很多的方向可以走:
    • 使用 Jekyll-import
      • 這邊使用上沒有太大問題,除了文章會變成亂碼的檔案名稱外.再來就是類別沒有輸出. 大失敗.
    • 使用Wordpress Jekyll Exporter
      • 這邊是使用Wordpress的插件來使用,不過我的PHP使用的是5.26 (AppServ 2.5.10),但是這個插件是使用PHP5.3之後的namespace功能.
    • 最後找到ExutWp雖然也有檔案名稱亂掉的問題,但是有輸出類別.
      • 但是圖片就不會抓下來,這倒是有點可惜.不過比起圖片來說,類別不見我比較累啊.

最後總算成功了,也成功的導入到[Github Page] (http://kkdai.github.com).搞了兩天再裝系統,卻真正只用到Jekyll不到兩個小時的時間.當然扣除掉我的部落格一千多篇文章的轉檔.

最後還需要把Domain Name轉到Github去,可以參考這篇文章

  • 增加一個檔案是CNAME到Github的目錄下,內容是你的網址.(舉例: example.com)
  • 上傳到Github後,稍等一下就會轉址.
  • 也要去DNS Server設定的地方去改 CNAME來指向你的位址,然後就是等待啦.

打完收工….

參考文章:

[MOOC][Java][Programming Cloud Service] 額外學習 NoSQL,GAE與更多其它

主要的作業都做完了,不過接下來都是選修的部分.但是課程可是一點都不馬虎,又有mongoDB,又有GAE還有其他的部分.都是很值得學習的部分.

筆記:

  • 關於MongoDB的設定
    • 如果要使用local mongodb 一切都比想像中的簡單的多
      • 不需要帳號,與密碼
      • 建立mongoDB 與執行
        • brew mongodb
        • sudo mongd
      • 在Spring 裡面鏈結
        • add application.properties
        • spring.data.mongodb.host=127.0.0.1
        • spring.data.mongodb.port=27017
      • 這樣就可以了… 其他都不用改
      • 想要檢查是否有存取的話
        • mongo
        • use test
        • db.video.find()
  • 在原來的Spring 加入MongoDB support
    • 使用MongoRepository 換掉 VideoRepository
    • Gradle 增加:
      • compile(“org.springframework.boot:spring-boot-starter-data-mongodb”)
    • 就這麼簡單,不過預設會寫到
      • Database: test
      • Collection: Video
      • 如果要使用自己定義的資料庫名字(database name),需要增加以下的code (參考這裡)
class ApplicationConfig extends   AbstractMongoConfiguration 
    {
 
      @Override
      protected String getDatabaseName() {
        return "moocs";
      }
 
      @Override
      public Mongo mongo() throws Exception {
        return new Mongo();
      }
 
      @Override
      protected String getMappingBasePackage() {
        return"com.oreilly.springdata.mongodb";
      }
    }

參考

  • Spring Document
    • Spring getting start with MongoDB https://spring.io/guides/gs/accessing-data-mongodb/
    • Access MongoDB with REST https://spring.io/guides/gs/accessing-mongodb-data-rest/
    • http://docs.spring.io/spring-data/data-mongo/docs/current/reference/html/mongo.repositories.html
  • JPA Repositories http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html

[MOOC][Java][Programming Cloud Service] 筆記與第二次作業

前言:

這些學習主要都是針對Mooc 上面的課程(Programming Cloud Service)所學到的一些部分.

 心得:
第二個作業不確定是不是最後的作業,但是卻相當的有趣.主要是透過架設OAuth2 的Server 然後去搭配測試程式的Client來做Video是否有喜歡 (like)的操作.
裡面幾個邏輯都算是很簡單,比如說Video不能被同一個使用者喜歡兩次. 喜歡的Video是必須存在的….

主要的難度,還是在跟Https 與 OAuth2的部分,不過由於我有習慣從第一個範例開始就寫同一個程式然後慢慢去改~慢慢學習裡面的幾個比較奧妙的地方.
所以這次的作業反而相當快就寫完了.

很值得修的課程,對於 HTTPS, OAUTH都有相當清楚地介紹,想要了解透過Exclipse去架設Java Server (不論是 Jetty 或是 Tomcat)這都是好選擇.
當然如果你對於Eclipse上面Gradle不太熟,這個也可以告訴你怎麼學習啊~~因為我也卡了很久.主要就是每次加了新component 之後都忘記要 Gradle->Refresh.

最後提一下學這堂課的動機吧,第一個部分是希望好好把Cloud Programming 有系統地學一下,雖然說懂 JSON,REST跟 OAuth.但是詳細的原理跟真正在Java (畢竟JSON是Java出來的)上要如何實現才能真正的了解;另外一個原因就是因為我一直以來對於Java與使用Eclipse有一種排斥感(雖然我修過Scala),但是我希望透過這個學習會讓我更熟悉這些部分.

我學習的Github 在這裏

  

課堂筆記:

  • @ComponentScan 會搜尋指定範圍的原件,是會重啟Spring.除了一些PaaS可能會踢掉之外(GAE?),一般而言並不會造成任何效能上的影響.

  • @Autowired 對應著Application.java 的一個@Bean/@Component/@Service/@Repository,可以讓他根據不同狀況來改變injection 不同的class. 如果沒有@Bean在Application 會產生exception.

    • 使用上可以類似C++的繼承方式,使用 @Autowired 在一個parent class上.然後利用@Bean 或其他的方式來mapping 到你需要的child class來改變或是更換你需要的物件.
  • Java Persistence API @Entity @Respository 需要做以下的事情
    • 需要在Grandle 先加上以下的資訊

      • compile(“org.springframework.boot:spring-boot-starter-data-jpa:${springBootVersion}”)       

      • compile(“jdbc:jdbc:2.0”)    

      • compile(“com.h2database:h2”)    

    • 如果要連接一些資料庫,也需要在application.properties裡面設定好

      • spring.datasource.url=jdbc:mysql://localhost/test

      • spring.datasource.username=dbuser

      • spring.datasource.password=dbpass

      • spring.datasource.driverClassName=com.mysql.jdbc.Driver

  • About Data REST

    • 要把整個Spring 從controller 改成由這個改變)

      • Application 繼承RepositoryRestMvcConfiguration

      • Gradle 要加入compile(“org.springframework.data:spring-data-rest-webmvc”)

      • 整個Controller 不再需要,直接移除後開始使用 VideoRepository

      • 修改 VideoRepository 傳回與接收直,注意以下事項: (參考另外一個改變)

        • findByXXX 必須回傳 Collection 不然就會錯誤<

        • addVideo 不回傳

    • 重要的是必須要 ObjectMapper弄好~不然傳回HATEOS就沒辦法直接使用/li>

  • Spring Security 增加一些安全性的保護(登入機制)並且利用加密的cookie來辨別身份,並且可以根據使用者權限來決定可以執行的REST指令或是要求.

    • 要加上https的支援,必須要做以下的修改:

      • 加入mainresourcesprivatekeystone (如何產生看這裡)

      • 要把Jetty 改成用tomcat

        • compile(“org.springframework.boot:spring-boot-starter-web:${springBootVersion}”)    

        • compile(“org.springframework.boot:spring-boot-starter-tomcat:${springBootVersion}”)

      • 必須在Application 加入以下的東西

        • @Bean

        • EmbeddedServletContainerCustomizer containerCustomizer()

      • 千萬記住在test那邊要把網址改成 https://localhost:8443/ 而且在properties 裡面設定的 SERVER_PORT=9000 也沒有效果

    • 要加上login redirection 需要完成以下的修改: (參考以下修改  )

      • Add in build.gradle    

        • compile(“org.springframework.boot:spring-boot-starter-security:${springBootVersion}”)
      • 需要新增一個class 繼承  WebSecurityConfigurerAdapter 來處理帳號與login/logout的問題與設定.

        • 必須要加上以下兩個設定,不然啟動的時候會有問題

          • @Configuration// Setup Spring Security to intercept incoming requests to the Controllers

          • @EnableWebSecurity

      • 在unit test的時候,需要注意以下的部分:

        • 根據目前的設定,任何的method都需要登入才能執行. 不然會跳出exception 可以由retrofit 接過來為 HttpStatus.SC_MOVED_TEMPORARILY

        • logout後應該也是要發生,exception 如果要試著去執行任何指令.

    • 課程以外,我把關於認證的部分做了一點小研究,主要就是根據不同的使用者權限來設定哪些方法可以執行~哪些會失敗 (參考Github)

         @Autowired public void    
         configureGlobal(AuthenticationManagerBuilder auth)
    { 
    auth .inMemoryAuthentication() .withUser("user") 
    //#1 
    .password("password") .roles("USER") 
    .and() .withUser("admin") // #2 
    .password("password") .roles("ADMIN","USER"); 
    } 
  • 前面設定密碼是一樣的,就不重複敘述,這裡唯一要注意的,由於HasRoles 是使用字串,所以大小寫是有差別的.

  • 最後來到OAuth2,要完成OAuth2 需要有以下的步驟:

    • 先要在build.gradle 裡面加上:

      • compile(“org.springframework.security.oauth:spring-security-oauth2:2.0.0.RC2”)    

      • compile(“org.springframework.security.oauth:spring-security-oauth2-javaconfig:1.0.0.M1”)

      • compile(“org.apache.httpcomponents:httpclient:4.3.4”)

    • 新增檔案去控制 UserDetails 與 UserDetailsService (參考: 這個改變)

    • 針對Retrofit 的client 部分,需要implement 更多關於OAuth的部分,主要是:

      • 新增一個OAuthHandler 去負責 RequestInterceptor

      • 並且直接修改 RestAdapter.Builder 去新增OAuth的處理.

  • 在開發這種有client跟server的程式的時候,特別要注意的是如果發現有問題的時候,需要去釐清究竟是server還是client的問題.

    • 如果是學習這個課堂的範例的話,可以考慮跑跑課堂內附的client搭上你自己寫的server.有時候問題是出在client而不是你server有問題.

    • 如果是web server (Tomcat 或是 jetty )可能比較麻煩~需要一步步把所加上的部分蓋掉來追蹤.

    • 千萬要注意 @PathVariable 跟  @RequestParam的差異,簡單解釋一下:

      • @PathVariable 是當你使用 GET Path 為參數比如說  video/2 

      • @RequestParam 雖然也走GET但是卻不是Path 而是會以其他方式傳遞.

  • 有個需要注意的部分是,關於回傳Http.Status Exception Code

    • 404:  Resource Not Found 

      • 可以直接用 throw new ResourceNotFoundException();
    • 400: Bad Request

      • 可以繼承 RuntimeExcption然後依照以下修改

        • @ResponseStatus(value = org.springframework.http.HttpStatus.BAD_REQUEST)

        • public final class BadRequestException extends RuntimeException  {   //  class definition}

參考: