Showing posts with label Develop. Show all posts
Showing posts with label Develop. Show all posts

November 30, 2016

在Obj-C專案中使用Swift CocoaPod Library

在時代從Obj-C到Swift的過渡期,某些時候我們就是可能需要在專案中引用到Swift的Library。Apple也非常好心的準備了一切,只不過有時候就是沒那麼完美。

官方文件:
Swift and Objective-C in the Same Project

在使用一個SideMenu pod的時候遭遇兩個問題:

1. 出現錯誤:“Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly.

解法是在PodFile中加入以下
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.0'
end
end
end


參考網址:http://stackoverflow.com/questions/38446097/xcode-8-beta-3-use-legacy-swift-issue/38466703#38466703


在整合時遇到第二個問題:
找不到 menuAddScreenEdgePanGesturesToPresent 將無法正確設定螢幕邊緣的PanGesture。
所幸最後在issue中找到解法: https://github.com/jonkykong/SideMenu/pull/82

原來某些swift語法無法正確被轉換為objC的語法,以至於產生的 xxx-swift.h 內容不完全。根據該pull request可以修正ScreenEdgePanGesture的問題,不過另一個menuBlurEffectStyle則得自行修改了。

November 18, 2016

ptt 爬蟲 with Python

即便經過十幾年,世界早已從無名小站經過Facebook,正演進到通訊軟體與chat bot的世界。台大批踢踢仍是台灣網路世界的熱門中樞,什麼最新最快最即時的資訊哪裡找不到,還是到批踢踢問鄉民最快。因應新的世界,也有好多好用的批踢踢手機app可以使用,滿足大家對資訊的需求。

好吧,廢話講太多(下略三千字)。今天要玩的是批踢踢的文章爬蟲。

Github上相關的程式碼很多,根據Readme挑了一個看起來合適的切入點。 https://github.com/jwlin/ptt-web-crawler 嗯,是Python。

在目前的Mac版本(10.12)已有內建Python2.7。直接跑起來卻一直出現error。胡亂安裝一陣相關套件,卻還是一直回報pyOpenssl相關錯誤。才知道原來在本機跑python還需要設定Virtual Environment才行。

根據說明,virtual environment是用來保持各專案的獨立性。解決了A專案需要版本 1.x 但 B專案需要 4.x 的這類問題。

可透過pip安裝。
$ pip install virtualenv


基本使用:
1. 在專案資料夾中建立virtual environment
$ cd my_project_folder
$ virtualenv venv

以上動作會在該資料夾中建立一個 venv 的資料夾。裡面會放Python的相關執行檔與一份用來安裝其他library的pip library。(venv也可使用其他名稱)(這資料夾在mac finder中看不到,是隱藏資料夾。)
也可以指定python interpreter
$ virtualenv -p /usr/bin/python2.7 venv

2. 使用以下指令啟動virtual env
$ source venv/bin/activate

當virtual env啟動時,會出現在提示符號右邊如:
(venv)Your-Computer:your_project UserName$

啟動後,任何使用pip安裝的套件會裝在venv中。
$ pip install requests

3. 如要關閉virtual environment
$ deactivate


接下來就可以開始玩囉~

基本上照說明執行就可以動了。以下依需求fork到我的Github上做了一點小修改。

原本設定參數 -i [起始頁] [終止頁] ,終止頁若設-1代表爬到最後。
不過因為我只需要爬最新幾頁,所以修改參數,若起始頁設定-1,則會往前數n頁再爬出來,參數這樣設 -i -1 n,就會爬該版的最後n頁文章內容。

目前大概這樣,有興趣的朋友可以到Github下載下來玩。

September 21, 2016

xcode 8 卡頓

從xcode 8 GM釋出以來,一直有一個卡頓的問題實在十分惱人。開啟xcode打沒兩個字就開始無限轉圈... @@。沒想到正式釋出之後問題仍然沒有解決。

還好搜尋之後找到解法。

不確定是否為xvim外掛的關係,總之照做之後就順利正常了。

參考文章:https://github.com/XVimProject/XVim/issues/966

解法就是,從"系統偏好設定">"安全性與隱私">"聯絡資訊" 將xcode取消勾選即可!

不知為何xcode需要取用聯絡資訊,不過果然關掉就正常了。

以上,給遇到相同問題的朋友參考~

September 9, 2016

為DEBUG build做不同的info.plist設定

開發專案總會遇到一些情況,比如說某些功能是debug用的,正式版並不要送出去。如果事事都用手動調整,那我們在做Release build時就會有一張落落長的check list。所幸大部分的功能只要設定Propressor Macro,在用#if區隔程式碼就可以自動區別。

但是就是這一個但是,iOS的某些功能是在info.plist中做設定的,不找一下,還真不知道該怎麼在build time讓它自動區分開來。比如說 UIFileSharingEnabled

查找了一下,可以參考這篇:Info.plist preprocessing

雖然Apple關著這扇門,但他也開了那扇窗。只要在Project Target的Build Setting中做以下設定,就可以囉!

1. 把 Preprocess Info.plist設為YES。(預設為NO)
2. 設定一個.h檔案,比如我用的是infoPlist.h,指定為Preprocessor Definitions檔案。這邊可以直接分為兩個檔案,或用#define做區隔,這就看各人喜好囉。
3. 最後在info.plist中再使用定義好的MACRO即可。

August 26, 2016

Xcode 8 beta 5 Comment Selection broken

在寫code的時候,若有什麼快速鍵壞掉實在是十分惱人的事。

最近升級至iOS10 beta版,對應使用Xcode beta,就發現原本的cmd+/功能竟然壞了。

原以為是xvim plugin壞要,一查才知道cmd+/是內建功能,而且在beta版壞掉了。

找了一陣終於找到解法:

參考出處:https://twitter.com/kolpanic/status/763323546814844928


在Terminal中執行以下指令,重開機即可恢復正常。

sudo /usr/libexec/xpccachectl

April 25, 2016

Server API Security

App端開發到一個程度,最終還是得開始碰Server的部份。雖然紅極一時的Parse.com已經快要關店,但Opensource化後,可以自架Parse也是另外一種選擇。爬文查找用法之際,找到一系列關於資料安全性的設定與調控方式,可能在Server界已是慣例,但對初入門的我來說,可幫助我一探其中奧妙!

系列文章可從這裡開始參考:Parse Security I - Are you the Key Master?

以下節錄摘要給大家參考:

Part I,關於Master Key與各個Client Key的使用方式。
Master Key是一種security mechanism。擁有Master Key的人可以bypass後面提到的各種安全機制,對資料庫進行存取修改的動作。是故,需以保護Root Password的同樣程度來保護Master Key。
然而,Client Key則是一種辨別目前Client平台的方式。可能是iOS或Android終端,或者JavaScript或REST Client。這ClientKey會隨著app或source code進到user手中,便無法防止user反組譯或者用監聽網路傳輸的方式竊取ClientKey。所以,請不要把Client Key當成任何安全機制使用。

Part II,Class-level的權限設定。
在Parse後台上,可針對各別Class設定各種權限。可分別針對以下幾個API設定Public或Private(User/Role) 的read/write權限。
  • Get
  • Find
  • Update
  • Create
  • Delete
  • Add Field
其中比較特別的是AddField。該權限允許Client動態為table增加欄位。這功能在開發階段非常方便,但一旦App正式上架後則不應該經常發生。故上架後應將此權限關閉。
另外還有一個允許Client增加Class的全域權限,也應該在上架前關閉。

Part III - Access Control List
ACL允許為各別object設定不同的存取權限。此時帶入User的概念進來。若存有使用者的個人隱私資料,則應該使用ACL控制,不可允許任何人檢視。若為User Class,Parse預設不允許除了User本人以外的其他人修改,但可以查看內容。如有隱私資料如電話或email,則應另外設計PrivateData class存放,並設為其他User不可查看的權限。原文有相關範例程式碼,可以參考。

Part IV - Cloud Code
Parse允許上傳Javascript的Server side code。由Parse server執行。因若安全性檢查設在Client端則容易被bypass,失去保護作用,建議使用Cloud Code進行驗證資料內容等安全性檢查。
在Cloud Code中也可設定使用 `useMasterKey` 以略過security相關檢查。

Part V - 綜合運用以上功能,設計與朋友共享特定資料的範例。
本篇中解析了如何運用Role、ACL與Cloud Code,設定user的某些特定資料,可以與一群朋友分享。如有需要的朋友可以前往研究

March 18, 2016

iOS8 AutoLayout

如同Android在發展的一開始就被迫面對多種螢幕大小,而慢慢演化出一套解決方式。即便是Apple也終於在iPhone6 plus推出後,同樣的問題慢慢浮現。於是Apple推了一套自己的解決方式,是為Auto Layout與Size Classes。

一直快樂的用舊方法開發的工程師們(指我),最終也逼不得已必需面對新技術的浪潮。

好啦,對。我就是要抱怨,Auto Layout跟Size Classes實在沒有想像的簡單。光憑自己在xcode上摸索是完全不夠的。無頭蒼蠅摸索嘗試了兩天,在新App的某些複雜UI上,遲遲不能順利的讓所有Constrtraints相安無事。只好再回去抱老師佛腳。


若您跟我一樣摸索半天不著頭緒,建議可以參考以下這節課程。


iTunesU上的 Developing iOS8 Apps with Swift 參考 Lesson 8: ViewController LifeCycle , Auto Layout


全篇只有1小時28分鐘。前段的Life Cycle也很值得參考,已經熟悉的朋友也可以再複習一番。後段的AutoLayout可以看到如何設定Constraints,object之間的關係,Constraints的priority。當然還有神妙的Size Classes該如何使用,相當值得推薦。iTunesU單集沒有星星可以按,不然完全想幫他按個五顆星上去。


(顯示為因bug解決太興奮不吐不快貌)




December 16, 2015

Install Redmine 3.1 on Heroku

當員工的時候有主管盯進度,一旦沒人盯進度,一開始可能覺得很輕鬆,但很快就會開始惶恐,覺得自己超時又落後,被內心壓力逼的喘不過來。但有時候又好像還好。沒有一把尺在旁邊,總是很準確難掌握效率。要不抓太緊,要不就放太鬆。

以前公司用的是Mantis。一些案子也試著用過Trello。另外也還有很多林林總總的專案管理工具。不過老實說,既然都入門ROR了,再說還有大神推薦,那當然是要用用Redmine的啦。

先說結論。Redmine在對我們團隊帶來的好處絕對是超高的。有一個地方可以集中管理該做的事,每天坐下來不必回想什麼案子做到哪,今天要從哪裡開始,只要打開Redmine自然列出所有該做的專案,該解的issue。上班變成登入"工作Online",開票、解任務,每天都超有幹勁的啦!

其實Redmine也已經用一段時間了,當初是架在AWS的EC2上面,選擇bitnami的solution懵懵懂懂的就灌好啟用了。陸續灌了一些plugin跟theme,開心的使用到現在。

如果是Rails開發者要順利安裝啟用應該蠻不成問題的。只不過若沒有相關背景就比較辛苦一點了。若沒有相關背景,也可以先用Plan.io試試,總之可以無痛先開始使用,試下確定沒問題,再花力氣研究如何安裝,也比較不會白走冤枉路。

安裝在EC2是有他的好處,不過一年試用到期之後就得另外想辦法了。另一個選擇則是安裝到Heroku上。Heroku的免費版限制應該算很夠使用的了。不過怪的是網路上東翻西找的文章都是一些很舊的內容,照做多半還是有些小問題,在這邊再重新整理一下。

November 1, 2015

automatically export from sketch file when build with xcode

開發過app的人就知道,在跟設計師co-work的時候,每次畫面哪邊一改,設計師丟來一整包圖,解開之後總是要花一堆時間在那邊做比對、搬移、調size、改檔名等等動作,不勝其煩。

而最近又準備要開始要進入這樣的循環,在順便為設計師研究新買的UI設計當紅app - Sketch時發現,時代又進步了!sketch竟有提供command line export的功能,真是工程師的福音呀!想當然而,一定有人把它整合進xcode的build flow中了。

June 17, 2013

Sublime Text X Arduino

最近有興趣的新玩具。Arduino。趁機報名了DAC的課程,算對Arduino有了一點初步的認識。

我有個壞習慣是,什麼開發環境拿來要用都一定要改一下的。底色scheme跟掛vi plugin之類。在iOS跟Android的開發環境都有改,這次又怎麼能夠例外呢?

尤其這麼陽春的介面,竟連內建的底色都無法換。

首先搜尋的是vi plugin。找到這個 vim-arduino 不過弄了老半天還是裝不起來。看看人家project也兩年了,忽然對還能不能適用有點遲疑。

放棄之後改找Sublime Text的Plugin,果然也有,而且還挺容易安裝的。

Source: Robot-Will/Stino GitHub

依照說明,使用Sublime Text的PackageManager安裝Arduino-like IDE即可。

裝完之後,只要開啟任一Arduino檔案,上面選單就會出現Arduino。只需指定好Arduino官方IDE的位置之後,所有Arduino IDE的功能就會出現在SublimeText內囉!

目前是還沒有測試過upload,但我想不會有什麼問題的。

Enjoy~


September 19, 2012

After iPhone5

上週iPhone5發表之後,很開心的下載了GM回來安裝,一併也把XCode更新到GM版。

用起來也沒什麼問題,只是一些先前build的.a檔要注意,因為新的iPhone5是ARMv7s的,所以需要重新build過v7s的.a檔即可。如果不急著用新手機,就從XCode裡面把v7s拿掉也可以。

不過今天跑另一個project才發現怪怪的。原來那個案子要支援到比較舊的手機,所以一直是用v6在build。然而,v6 build出來卻無法debug。

搜尋一下得到這篇
Changes in Xcode 4.5
Xcode 4.5 and later does not support generating armv6 binaries.
The minimum supported deployment target with Xcode 4.5 or later is iOS 4.3.
就是說,使用新的Xcode4.5已經不能夠再build armv6的binary出來了。

此刻的疑問是,誰是v6的呢?
答案在此
ARMv7 = iPhone 3GS/4, iPod 3G, iPad
ARMv6 = iPhone 2G/3G, iPod 1G/2G
好吧,看來Apple是打算把v6 fade out了......

最後,如果你想檢查使用的.a檔是否有包含v7的架構,可以使用底下指令。
 lipo -info xxx.a
Architectures in the fat file: xxx.a are: armv6 armv7

以上。

July 18, 2012

Sublime Text + Closure Linter

最近簡直有一半以上的時間都在寫Javascript,要命,真的有夠難debug的。

接續前篇,最近都是用SublimeText在寫JS,然後剛好發現Google大神人真好,提供了Closure Linter這種東西。而SublimeText又剛好可以自定build system,整合在一起就非常完美了。


July 11, 2012

不做不錯?

其實,我一直都很喜歡看到手機裡面的哪個app又有新版可以用了。因為那代表可能今天又有什麼有趣的新功能出現,一般來說,更新不會是什麼壞事。當然,偶爾還是會有意外發生。

今天早上,看到WhatsApp有更新!馬上轉去Store安裝,裝完之後就發現,哈,爛了。出現一堆"%@"。有在寫iOS code的人就知道,"%@"是拿來套文字用的。"%@"出不來,表示有哪個笨蛋用了全型的 "%"。顯然這位仁兄不知道 "%" 是用來幹嘛。

一大早的,看來還沒什麼人知道,回頭google一下,果然找到WhatsApp的Translation Project頁面。在這裡:http://translate.whatsapp.com/

順利登入之後就可以看到,有一些新功能的介面文字還沒有翻譯,然後對照搜尋一下就可以看到,果然有些地方的 "%" 被打成全型了。

稍微花一點時間,把沒有翻譯的部份補上,然後對照手機裡面看的到的地方,把一些莫名出現的簡體字跟全型的 "%" 補上正確的翻譯。然後再寫了一封簡短的mail給WhatsApp團隊。

Apple審核大概要一兩週的時間,所以接下來也只有等了。

不過這些不是本篇的重點。

July 7, 2012

Sublime Text 2

最近工作需要在iOS上跑一點Javascript,缺少一個好用的IDE實在痛苦。這時候就會覺得不管是XCode、eclipse還是VisualStudio都真是偉大!還好最近發現了新editor,調校之後一切終於順手多了。

Sublime Text 官網

幾個寫code用editor必備的功能如: Syntax Highlight、Bookmark、Bracket Match... 是一定都有的。它比較特別的地方是,提供了plugin的API,大家就可以依照需求自由開發一些plugin來使用。加上plugin之後,整個就變得很豐富了。

底下介紹幾個這兩天發現的好用功能、快速鍵以及plugin。
0. 設定檔以及package installer
1. 兩欄顯示。
2. vi mode
2.1 block cursor
2.2 開啟檔案預設為command mode(7/10 新增)
3. bracket highlight
4. 標示尚未儲存的修改
5. Sublime Linter
6. 多游標同時編輯 

March 23, 2012

讓VI自動排版XML

寫app跟server要資料,使用xml是非常常見的一種作法。
在開發中常常需要用肉眼判讀XML,想把它好好排版卻是一件麻煩的事。

昨天搜尋到這篇,做起來就非常簡單了。

具體的作法就是,把底下這段
au FileType xml exe ":silent 1,$!xmllint --format --recover - 2>/dev/null" 貼到.vimrc中,下次再打開xml檔案,就會自動排成好閱讀的版本囉!

November 27, 2011

傳送檔案到Dropbox

有兩次有人從大費周章從Market連到G+傳訊息問我,該怎麼在app裡面加上Dropbox的功能?
可見Dropbox的API範例可能真的寫的很難懂...

而事實上,在android要用dropbox實際也沒那麼複雜,只要善用intent,就可以直接把需要傳的資料bypass給dropbox app,讓他代替你完成剩下的動作了。

具體的程式碼如下。
Intent DBIntent = new Intent(android.content.Intent.ACTION_SEND);
DBIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(aPath)));
DBIntent.setType("text/*");
DBIntent.setPackage("com.dropbox.android");
startActivity(DBIntent);

如果把setPackage那行拿掉,則手機會跳出一個清單讓使用者選擇要使用的app。(可能會有GMail、藍芽之類)

如果需要做的功能只是把檔案上傳到dropbox,而非做什麼同步的功能的話,用這個方式就非常好用了。

October 28, 2011

你願意花多少錢?

你願意花50元,買一杯好喝的珍奶。
你願意花200元,進電影院看一部兩個小時的電影。
你願意花800元,進LiveHouse 聽一場Live。
你願意花2500元,進小巨蛋聽一場大型演唱會。

那你願不願意,花2USD不到70元,donate一個每天為你帶來美好上網體驗的軟體?即使你不donate他還是盡心盡力在為你服務。

然後,你願意花多少錢,在你每天朝夕相處的app上?

October 26, 2011

Full Screen support for eclipse on Lion

奇妙的發現一個eclipse的新Feature!

前陣子升上Lion之後,用XCode開發用的頗順手,最近又要弄android,於是又回來用eclipse。理所當然的就是,eclipse沒有支援Lion的full screen mode。

習慣full screen mode之後,用eclipse反而不習慣一堆視窗疊來疊去,把我工作中的eclipse遮住。於是google了一下,發現竟然其實是有支援的。

只要到eclipse的Market Place去安裝即可。(幾時竟然eclipse也有Market Place了!?)


引用來源

11/10 後記
當full screen mode遇上viPlugin的時候。
你也一樣一天到晚因為按了esc而離開full screen mode嗎?

這裡有個好方法。
在 "偏好設定">General>Keys裡面,把"Activate the editor"的hot key設成esc。
如此一來,當在視窗內按下esc會跑進去editor,就不會再跳出full screen mode囉!
試試看吧~


October 13, 2011

檔案的備份還原

好吧,我想這個應該還沒寫過才對。

之前在做myPocket的時候就有遇到,需要將匯出的檔案備份至dropbox或email等其他位置。當時是加入底下的code即可。

Intent DBIntent = new Intent(android.content.Intent.ACTION_SEND);
DBIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(aPath)));
DBIntent.setType("text/*");
DBIntent.setPackage("com.dropbox.android");  //指定要給特定package
startActivity(DBIntent);

但如果只有這樣,如果要從email把檔案還原回來就不知道該怎麼做了對吧。

其實只要在Manifest.xml對應的activity加入底下的intent filter即可。

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="*/*" />
<data android:pathPattern="*.*\\.key" /> //指定特定附檔名
</intent-filter>


以.key的特殊附檔名來說,如果點下載,會直接到myPocket來。
(因為本機沒有其他支援的app)

 如果點選預覽,則會出現列表讓user選擇。

September 20, 2011

在source code插入svn version

案子進行一段時間,有時候是一邊測試一邊改,改完馬上又拿去測,很容易搞不清楚現在到底是哪個版的bug。此時如果可以在code裡面自動印出版號,或者直接顯示在畫面上,那就真是太好不過了。

具體的作法如下。

在Project Setting內加入一個RunScript的Build Phase。

把它放在Copy Resources phase的後面。
Script的地方加入底下這段code。
echo -n ${TARGET_BUILD_DIR}/${INFOPLIST_PATH} \ | xargs -0 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion `svnversion -n`"

然後在需要的地方這樣取
NSString* version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

這樣就可以囉~

做完這件事就不得不讚賞一下,在xCode要做這樣的事還真是方便。

參考來源