發表文章

討厭的郵件密碼猜測攻擊

時至今日, 還是存在很多寄垃圾郵件的事件. 寄垃圾信的人, 現在不再用自己的電腦來寄, 因為很容易被找到. 他們都把腦筋動到別人的郵件主機, 以往很多郵件主機管理不善, 不管誰要求它寄信, 一律來者不拒! (open relay) 寄垃圾信的人最喜歡這種主機了. 可是被偷過, 誰不會加個鎖, 裝個門的. 要求寄信, 好的, 請問帳號密碼是什麼? (SMTP AUTH) 畢竟郵件主機就是用來寄信的, 不可能關掉不寄的. 也只能加強安全性! 就好像大門就是用來出入的, 被小偷偷過, 也不可能把大門封掉吧! 所以寄垃圾信的, 很簡單, 就是想法子取得你的帳號密碼了! 總是有人把帳號密碼設得很簡單, 很容易被猜到的. 你知道有多少人每天都在試你的帳號密碼嗎? 在FreeBSD + Sendmail的環境下, 可以把Sendmail的Log Level 開到10以上: 在/etc/mail/sendmail.cf 中 # log level O LogLevel=10 然後, 在/var/log/maillog裡就可以看到類似以下的訊息: Mar 11 11:09:32 mail sm-mta[62505]: u2B39QJH062505: AUTH failure (LOGIN): authentication failure (-13) SASL(-13): authentication failure: checkpass failed, relay=[194.186.181.206] 不用太懷疑, 這就是有人在敲你的門了. 一筆一筆的看太累了! 我寫了一個小程式: mail# more whichip.rb #!/usr/local/bin/ruby -w ARGF.each{ |line|         if line.include? "["                 relay = line[/relay=(.)*/]               ...

OS X EI Capitan 10.11.1更新後,Xcode Git Remote 連不上?

我們在開發iOS App有用到Git來做版控,同時也是方便Team work,用了最簡單的方式來架設Git的遠端環境。就是找一台Mac來當remote主機,每台開發Mac使用SSH的方式連入。 設定簡單,而且remote就在自家,也不用擔心放到雲端會有資料外洩的風險。 沒想到今天在那台Mac上不小心把OS X更新到10.11.1之後,所有的開發機就不能再用Git push pull的功能了。只好開始找問題了: 1. 由開發Mac來SSH remote, 其實是正常的,而且xxx.git目錄也都存在 2. 但由開發Mac的Xcode, Source Control -> Push卻出現連不上remote的錯誤訊息 想想,就ssh到remote,cd 到xxx.git 然後 $ git Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo. $ sudo git Password: You have not agreed to the Xcode license agreements. You must agree to both license agreements below in order to use Xcode. Hit the Enter key to view the license agreements at '/Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf' Apple Inc. Xcode and Apple SDKs Agreement PLEASE SCROLL DOWN AND READ ALL OF THE FOLLOWING TERMS AND CONDITIONS CAREFULLY BEFORE USING THE APPLE SOFTWARE OR APPLE SERVICES.  THIS IS A LEGAL AGREEMENT BETWEEN YOU AND APPLE.  IF YOU AGR...

iOS 進入Background後可執行時間,可額外要求的時間由10分鐘變成3分鐘?

在不同的文件中看到iOS App由前景進入背景後,只能再執行10秒或者5秒。然後就會被suspended! 之前iOS 7的書籍中提到可以再額外要求10分鐘,當然現在iOS已經到8的版本了,今天試了一下,發現 好像可額外要求的時間又被Apple給縮短了! 建一個簡單的single view App, 其ViewController.m內容: #import "ViewController.h" @interface ViewController () { NSDateFormatter *format; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; format = [[NSDateFormatter alloc] init]; [format setDateFormat:@"H:m:s"]; [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(ticker:) userInfo:nil repeats:YES]; } - (void)ticker:(NSTimer *)theTimer { NSDate *today = [NSDate date]; NSLog(@"%@", [format stringFromDate:today]); NSLog(@"%f", [UIApplication sharedApplication].backgroundTimeRemaining); } @end 在AppDelegate.m中加入以下程式: - (void)endBackgroundTask { [[UIApplication sharedApplication] endBackgroundTask:bgTask]; } - (void)applicationDidEnterBackground:(UIApplication *)application { bgTask = [application begi...

iOS Core Data and multithread

圖片
    對於我們初學Core Data的人來說,在Xcode 5的時代,若要使用Core Data來存儲資料,第一件事就是在建立專案的時候只能選擇空的應用程式,才能有勾選使用Core Data的選項。如果選擇建立single view專案的話,那就沒有使用Core Data選項可選了。所以網路[1]上有不少人在討論,若已經建立專案,而當初沒有勾到Core Data選項時,該如何加入之。還好,到了XCode 6, 現在single view專案,已經有Core Data選項可以選了。     但是預設建立的Core Data, 在讀寫資料時,其實是以UI Thread來作業的。也就是說和所有UI有關的元件共用主要的Thread。這樣一來,最明顯的問題,就是在做Import/Export工作的時候,會造成App卡住的現象。   以簡單的新增資料數筆至Core Data來做實驗,就會發現,當新增的資料愈多時,卡住的時間就會愈久。如以下程式: AppDelegate *delegate = ( AppDelegate *)[[ UIApplication sharedApplication ] delegate ];      Xxx *xx;          for ( int i= 0 ; i     xx = [ NSEntityDescription insertNewObjectForEntityForName : @"Xxx" inManagedObjectContext :delegate.managedObjectContext];                  xx. startDate = [ NSDate   date ];     xx. stopDate = [xx. startDate dateByAddingTimeInterval :( arc4random () % 7200 + 1 )]; ...

iOS Table View 加入Search功能(使用Core Data當資料來源,並客製化Table View Cell)

圖片
    其實如何加入Search功能至Table View的做法是有很多人討論的,只要google一下就可以找到許多。目前大部份人都說要使用search display controller,也就是在XCode裡右下角的元件庫裡看到的Search Bar and Search Display Controller,如下圖。只要把它拉到你的Table View裡面,然後再加入一些程式碼就可以了。但大部份都是很簡單的利用NSArray來當做Table View的資料來源。例如[1], 是一個很好教學文件,它也告訴我一個重要的觀念: search display controller 會自帶一個Table View。但是它用NSArray來做Table View的資料來源。就連我手上談論iOS程式的書(1)都有提到這個議題,但同樣地,都是使用Array來當資料來源。     所以當我的專案是使用Core Data當資料來源時,這變成了一個問題。不過,這就是程式開發者的工作,不是嗎?當然,我們有許多選擇。例如,可以把Core Data的資料先轉成NSArray啦。不過,這是笨方法。因為當初使用Core Data,就是有一個好用的NSFetchedResultsController可以使用,它不但協助我們處理掉讀取Core Data的細節,還考量到效能的問題。實在沒有理由,要棄之不用。     另一個問題是,我的專案裡的Table View Cell是客製化的,也就是說不是預設的只有顯示一個字串,而是我自己拉Label,拉UIImage...。這會有什麼問題嗎?問題出在search display controller會自帶結果Table View,不知道要如何去客製化它的Cell。總不能讓Search結果的Table View Cell長的樣子和原來的不一樣吧!     最後一個問題是,現在iOS8剛出來,有了一些改變。原本這個議題,大家的作法都是使用search display controller來做,有趣的是,居然文件裡講,在iOS8中,請不要再用這個類別了。不過,若要相容於iOS7,那還是用search display controller。 以下,分別來討論解決的方法和概...

Bluetooth Serial Port Setting on Mac OS X 10.10 (Yosemite) and some others

圖片
    有一天我哥和我談到他在玩Arduino可以透過藍牙來搖控模型車,只是都要用Android手機,無法用iPhone來搖控。這有點奇怪,我想要弄清楚為什麼是這樣,真的是這樣麼?首先我找到Hock Chen寫的一篇文章[1],談論的內容跟這個問題很相關。Hock Chen主要在教我們如何用MIT AI2這個工具寫一支可以在Android手機上跑的App,這支App主要是可以透過藍牙送出字串到Arduino+HC 06的版子上面。然後也教我們如何在Arduino上面寫程式,可以將收到的字串顯示在LCD顯示器上。      MIT AI2是個很有趣的工具,只要拖拉元件,再玩拼圖就可以寫成App了。我依照Hock Chen的文章把這支App做出來,發現主要只是利用一個藍牙client元件來送出字串而已。可是這樣就可以運作,實在也太神奇了。因為藍牙是個多才多藝的玩意,有藍牙滑鼠,有藍牙鍵盤,有藍牙音樂,有藍牙耳機。那這個元件到底做了什麼呢?     因為我手上也沒有Arduino的硬體,所以我想用一台電腦來接收看看,是不是可以收到這支App送出來的字串。我在一台沒有藍牙硬體的Vista電腦上安裝了一支藍牙donger, 如下圖示。它使用broadcom晶片,和widcomm的軟體。     在安裝好驅動程式後, 先把手機和電腦做個配對。之後打開藍牙的設定, 如下圖: 在Windows8.1, 我裝了一支CSR晶片的BT 4.0 donger, Win8.1會自己認到, 之後要設定藍時, 只要到裝置和印表機, 找到該donger按右鍵選Bluetooth設定即可。 我在COM連接埠的設定頁中, 新增了一個連入的COM9埠。然後, 打開putty, 連到這個COM9埠去。如下圖示: 然後, 等putty的畫面出現後, 就可以使用andriod手機, 打開那支App來連到電腦, 再輸入幾個字串來送出去。 此時可以看到成功的把字串由手機送出到電腦了。 所以這支用MIT AI2拉出來的App,到底是做什麼呢?我知道是透過藍牙送字串啦。但由以上送字串到電腦的設定過程中,可以了解我在電腦上設了一個連入的COM埠,而且在這個COM埠...