2014年12月12日 星期五

使用 innodb_file_per_table 解決 ibdata1 單一且過大

參考這裡


使用 mysql 配合 innodb 引擎在預設的情況下所有的資料都會儲存在 ibdata1

用久了這個檔案會很大,比較好的作法是把每個資料庫的 ibdata 各別儲存。

先備份全部資料庫

mysqldump -u root -p --all-databases > /home/backup/all.sql

找到 my.cnf 或是 my.ini 並加入 innodb_file_per_table=1
以我使用 EC2 自架 mysql 來說是 /etc/my.cnf
重啟資料庫  #service mysqld restart
進入資料庫
#mysql -uroot -ppassword
檢查是否開啟分類儲存功能
mysql> show variables like '%per_table%';
若已開啟會長得像
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+

再來把 ibdata1 以及 ib_logfile* 刪掉,此時進入資料庫應該就是空空的了
在還原之前最好先停止網路服務,我曾經還原到一半 ec2 就斷線當機給我看
#service httpd stop
還原
mysql -uroot -p < /home/backup/all.sql

啟用 innodb_file_per_table 後,當刪除資料表(DROP TABLE)、清空資料表(TRUNCATE TABLE),佔用的空見會自動縮減。刪除資料表資料(DELETE),則執行 OPTIMIZE TABLE 來縮減資料表空間。

OPTIMIZE TABLE 資料表名稱

最後補充一下使用別人整理的 innodb_file_per_table 的好處

1. 如果使用軟鏈結將大表分配到不同的分區上,易於管理資料文件
2. 易於監控解决IO資源使用的问题
3. 易於修復和恢復損壞的資料
    3.1 相互獨立,不影響其他innodb表
    3.2 導出導入針對單一table,而不是整個共享table
4. 解決單一文件大小的限制
5. 對於大量的delete操作,更易回收磁碟空間
6. 碎片較少,易於整理optimize table
7. 易於安全檢查
8. 易於備份

2014年11月24日 星期一

Apple Watch Human Interface Guidelines 隨手記


Apple Watch Human Interface Guidelines


Interface Style:

  • Hierarchical. This style matches the navigation style in iOS and is best suited for apps with hierarchical information. In a hierarchical app, users navigate by making one choice per screen until they reach their destination. To navigate to another destination, users must retrace some or all of their steps and make different choices.
    A hierarchical model is typically better than a flat, paginated navigation model for more complex app interactions.
  • Page-based. A paginated interface lets the user navigate between pages of content by swiping horizontally. A page-based interface is best suited for apps with simple data models where the data on each page is not directly tied to the data on the other pages.
    A dot indicator at the bottom of each page shows the user’s place in the set. Keep the total number of pages as small as possible to simplify navigation.

註:二擇一,避免混用


Glances are:
  • Template-based. There are separate templates for the upper and lower portions of the Glance screen. Use Xcode to pick the templates you want and then design your content to those specifications.
  • Not scrollable. All content must fit on a single screen.
  • Read-only. Tapping anywhere on the glance opens the app.
  • Optional. Not all apps need a Glance, and users can select which Glances to display.

註: Glances 非必要,可套版,不可滾動



Notification:

Be sensitive to the frequency with which you send notifications to users. Users might perceive a frequent notifications as annoying and disable notifications for your app on Apple Watch. Always make sure notifications are relevant to what the user wants.


註:有分 short look & long look,版面制式化,小心使用


Layout:


兩種SIZE





Color and Typography
Use black for your app’s background color. A black background blends seamlessly with the device bezel and maintains the illusion of there being no screen edges. Avoid bright background colors in your interface.
Use your app’s key color for branding or status. Every app defines a key color. The system uses this key color for the title string in the upper-left corner of the screen and in notification interfaces to highlight your app name or other key information. You should similarly use the key color as part of the branding of your app.
Use high contrast colors for text. High contrast colors make text more legible.

Use the built-in text styles whenever possible. The built-in styles automatically support Dynamic Type and were designed to look good on Apple Watch.

Prefer the use of a single font throughout your app. Apps can use an additional font for branding purposes, but use that extra font sparingly. Mixing many different fonts can make your app seem fragmented and sloppy. Use the UIFont text styles API to define different areas of text according to semantic usage, such as body or headline.


註:顏色採用高對比,建議使用黑色背景,字型盡量單一且使用內建字型。


Table:


Use row types consistently. You might create different row types to implement your content, headers, and footers. Be consistent in your use of those rows.

Avoid mixing rows with dramatically different types of content. When displaying content, be consistent with the row type you use to display that content. Use other row types only as section breaks or to organize the content rows. Using the same row type for content ensures that rows are sized consistently and are easier to navigate.

Limit the number of table rows displayed at one time. Tables with more than twenty rows of content become cumbersome to scroll through. Display only the subset of rows that are immediately relevant and give the user the option to load more rows.


註:單一cell,避免太多列,超迥10列給user "讀取更多" 的 button.

Button:



Create buttons that span the width of the screen. The creation of full-width buttons is strongly encouraged. If you must put more than one button in the same horizontal space, limit the total number of buttons to two.
Try to match button heights whenever possible. If you have multiple buttons onscreen together, use the same height for each. Buttons


註:寬盡量滿版,最多塞二個button

Image:
Create all image assets as @2x resources. There is no need to create non Retina images.


Dates and Timers:

Use a date object whenever you want to display the current day or time.
Always use a timer label to implement a precise countdown or count-up timer.

註:使用內建的 Dates Label 和 Timer Label


ICON:



























2014年10月19日 星期日

iOS : Audio Trimming

最近在研究 iOS 音樂剪輯/播放這一塊,紀錄一下

Trim :

http://stackoverflow.com/questions/13097331/unable-to-trim-a-video-using-avassetexportsession

http://stackoverflow.com/questions/9698787/ios-audio-trimming

http://stackoverflow.com/questions/21463250/cocoa-avasset-loaded-from-file-has-0-tracks

Export Mediaitem to local file:

http://stackoverflow.com/questions/13925148/exporting-video-from-users-itunes-library

http://stackoverflow.com/questions/4238219/trim-audio-with-ios


2014年9月25日 星期四

xcode plugins


分享咱家技術長推的兩個好用的 XCode Plugins


1. FuzzyAutocompletePlugin

https://github.com/FuzzyAutocomplete/FuzzyAutocompletePlugin/releases

這是一個非常懶惰的Plugins, 原本在寫程式時要依序打 NSStringFromCGRect, Xcdoe 才會跳出選擇讓你選,裝了 Fuzzy 後你可以跳著輸入 NSS RE 就會讓你選擇 NSStringFromCGRect 了。

2. BBUncrustifyPlugin

https://github.com/benoitsan/BBUncrustifyPlugin-Xcode

這個可以簡單的幫你把大家寫的 Code 的格式全部轉成一様,在多人工作的環境下,看起來會像是同一個人寫的。

2014年9月23日 星期二

Linux 找出誰佔據了你硬碟容量&清理mysql 記錄檔

搜尋資料夾檔案大小 du --exclude="proc" | sort -g -r | head



登入mysql


mysql -u root -p


清理 mysql-bin 方法為:

PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2008-12-19 21:00:00';

============================
位於 /var/spool/mail/root 信箱如果滿了,要如何一次清空呢
方法很簡單,只要下達一行指令即可

cp /dev/null  /var/spool/mail/root


2014年9月2日 星期二

App 不在背景執行也可以接收 iBeacon

有點強~

https://community.estimote.com/hc/en-us/articles/203253193-Launching-notifications-in-iOS-when-the-app-is-killed

2014年7月27日 星期日

破解 Sublime text 3 build 3059

http://www.yutent.com/?article=73

這篇是我找到最簡單的,也成功破解了, try it

2014年7月14日 星期一

UISearchDisplayController 在 鍵盤消失後 Tableview 的位置跑掉了

由於客戶要求使用 UISearchDisplayController

就弄了一下,沒想到 Display 的 table 怎様都不對,DeBug 了一個下午才解掉

有人說這是 iOS7 的 Bug,我也不知道,但的確很微妙

解答在 這裡

直接複製貼上就是完美解,

希望不要有人再浪費時間在這個問題上面。

2014年5月8日 星期四

2014年4月28日 星期一

Mac 顯示隱藏檔案

顯示隱藏檔案:defaults write com.apple.finder AppleShowAllFiles TRUE;\killall Finder

不顯示隱藏檔案:defaults write com.apple.finder AppleShowAllFiles FALSE;\killall Finder

2014年4月7日 星期一

雷神巧克力 驗關攻略

雷神巧克力賣翻全台灣,也造成日本斷貨,於是乎就有某多事的立委要求全面撤查。

所以你也才會點進來看這篇文章。 

小弟也是為了把區區幾盒巧克力帶回家,特地從新竹跑到台北辦驗關手續。

這篇文章就當作個紀錄,也給那些為了驗關而傷透腦筋的人一些方便。 

其實驗關最主要就是要貼成份的 "中文標籤",而雷神有好多種,每種口味的成份都不同。 

小弟只有大雷神的經驗,所以最後會提供大雷的中文標給各位,其他口味的就要自已 咕咕嚕 了。 

依照本篇的流程,只要你沒有倒楣被海關特別抽查到要驗貨,只需要花一天的時間,跑一趟台北就可以搞定了。 

有一點要先說明,單一口味沒超過6kg是不用跑這流程的,直接殺去郵局領就可以了,但只要有一種口味有超過,就得為這口味去跑流程囉。

驗關的流程就是 填申請書->貼中文標->拍照->回傳給社福部->取得通行證->繳稅->領貨

 step by step

Step 1.
先下載 查驗申請書進口資料申報表 社福部應該也是處理了很多雷神的案件,所以他們做了一份範例給參考,照著填就可以了,申請書範例資料申報表範例

其中要注意的是"查驗申請書"的製造廠名稱要填寫完整 “有樂製菓株式會社UTY“ ,貨品分類例填寫 18063100007 (其他口味不確定請打電話問海關),總淨重請自已算一下,大雷一盒是 0.78公斤,若是十盒就寫 7.8 kg.

"資料申報表" 的國外出口廠商、成份和中文標示様張請填寫"如附件"即可.

填寫完畢後請掃描這兩張文件以及郵局招領單、收件人的身份證正反面、產品照片(下載)以及製作的中文標(下載)。 PS 產品照片及中文標僅大雷神可用,其他口味請自行修改,中文標的進口商,地址和電話一定要填寫與巧克力的收件人一様資料

備齊後請寄 e-mail 至 gaz119@fda.gov.tw 標題就打你要申請檢驗雷神巧克力囉,若不放心可以在寄出後打電話詢問 02-89788425 吳小姐/林小姐

這裡要誇獎一下這兩位辦事人員,非常客氣,從頭我問到尾都很有耐心的回答,完全不像是處理了一堆重覆事件,拍拍手~~

確認收到後若有問題或要修改的地方她們也都會電話通知修改,全程以 mail 來回即可,都沒問題後就等審查通過,我好像只等了兩天就過了。

Step 2. 
審查通過後就可以把中文標印出來然後帶著你的郵局招領單殺到到台北總局(捷運大安森林公園站6號出口左轉過馬路就到了)去貼標了。

這裡要把你的申請書、資料表和私章正本一起全部帶著,等等要用到。

貼完之後要拍三張照片,第一張要拍你貼的中文標是否有貼好,不能只是浮貼,第二張要拍你所有的巧克力都有貼上中文標,最後一張要拍你巧克力盒上的食用期限。

都拍好後一様用 mail 的方式把照片寄至 gaz119@fda.gov.tw 再打電話詢問是否有收到,有收到後承辦人員會請妳去社福組找某人繳審查費(捷運昆陽站4號出口過馬路後巷子順著走2分鐘就到了),這時你的正本就會用到了,到了社福組到櫃台請警衛幫你打電話給承辦人員,沒問題的話繳個200塊審查費後就可以等著拿通過證明了。

Step 3.
再度回到大安郵局,拿著你的通知證明給海關看就可以領貨了,但在領貨前海關會課稅,他會問你買價多少,千萬不要傻傻的跟他說你買一盒台幣要650~700,請以日本原價報價!大雷在日本一包也才53塊日幣。你可以秀發票給他看。 我遇到的海關人還不錯,沒有多問什麼,感覺他也很無耐處理了一堆巧克力。



以上就是整個流程啦,雖然麻煩,但其實不管是去貼標還是去社福組,都會遇到一堆同様為了雷神台北跑透透的人,很容易就聊起來了,也滿有趣的啦,希望有幫到各位,有問題留言囉。




2014年4月6日 星期日

2014年3月25日 星期二

Push Notification 增強版

http://stackoverflow.com/questions/10058768/php-apple-enhanced-push-notification-read-error-response http://blog.csdn.net/tlq1988/article/details/9612237

2014年3月12日 星期三

解決 iOS 7.1 OTA error 'Cannot install applications because the certificate for yourdomain.com is not valid'

升到 iOS 7.1 後,打開原本乖乖運作的測試版 App 網頁竟然回報錯誤

'Cannot install applications because the certificate for yourdomain.com is not valid'

我和我的小夥伴們都驚呆了,估狗了一下,原來是 Apple 改成強制要用 ssl 連線了

所以解決辦法就是為你的 Domain 申請一個 SSL 憑證,收工!!!

。。。

。。。

。。。

怎麼可能~~

就這様有什麼好寫的,除非是大公司,不然每年申請 SSL 憑證也是挺麻煩。

好在 stack overflow 有人提出了利用 dropbox 來解決這個問題,親自試驗了一下還真的可以用,也利用這篇文章紀錄一下怎麼使用囉,原文在這裡


首先你要有一個 Dropbox 的帳號,怎麼申請和基本操作就不多做說明了,自已摸索吧。

若你不是第一次製作自已的 OTA,那你一定知道每一個測試的 App 都會有三個檔案

downloadpage.html

projectname.plist

projectname.ipa

依我遇到的情況,原本都是將這三個檔案丟到自已的server裡就可以運作了。

現在改成全部丟到 DropBox 裡面去。

 downloadpage.html 裡會有一個鏈結長得像這様

itms-services://?action=download-manifest&url=http://168.1.1.10/projectname.plist

這個鏈結是指向你的 Plist,當然,我們也已經把這個 Plist 丟到 DropBox 去了。

現在到 DropBox 取得你 plist 檔案的下載網址,應該會長得像下面這様

https://www.dropbox.com/s/k2xjgdvnfmp1193/projectname.plist

接著我們把這個鏈結網域改成 dl.dropboxusercontent.com 就變下面這様了

https://dl.dropboxusercontent.com/s/k2xjgdvnfmp1193/projectname.plist

把改變過後的連結取代你原本 html 裡的 url,所以你的 html 那一整段應該長得像這様

itms-services://?action=download-manifest&url=https://dl.dropboxusercontent.com/s/k2xjgdvnfmp1193/projectname.plist

ipa 檔可以選擇放在你原有的server上,我是選擇統一放到DropBox 裡,

如果你也是統一放到 Dropbox 裡,請記得 projectname.plist 裡的 ipa 連結也要修改,也是要把網域名稱換成 dl.dropboxusercontent.com 才能正常運作。

最後,你只要取得 downloadpage.html 的連結,也同様把網域改成 dl.dropboxusercontent.com 像是這様

https://dl.dropboxusercontent.com/s/6v1ufqpthjzufck/downloadpage.html

最後把連結寄給客戶,一切就和以前一模模一様様了。

















2014年3月11日 星期二

PHP curl error: (35) Cannot communicate securely with peer: no common encryption algorithm(s).

今天發現原本用 PHP parse 的網站忽然失效了

打開一看出現錯誤訊息 Cannot communicate securely with peer: no common encryption algorithm(s).

試過加入

curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);

仍然沒效果,估了老半天總算看到解答了。 在 這裡

簡單說就是把 rsa_rc4_128_sha 加到你的 curl 裡,如下

curl_setopt( $ch, CURLOPT_SSL_CIPHER_LIST, 'rsa_rc4_128_sha');

搞定!

2014年3月6日 星期四

常用的 iOS Icon image size 整理 (iPhone 6 & 6+)


iOS 8 後 icon 有各種大大小小的 size 要做,腦袋記不住,記在這吧

從 apple 開發者網站來的,更詳細的說明可以自行前往參考




紅字部份必備,橘色為建議項目,其中 Spotlight Search 和 Settings Icon 最好是做一下,其餘選填。

另外,就算只是單純做 iPhone 版的 App 也是要放 iPad 的 icon不然如果使用者用 iPad 抓 iPhone 版的App 會變成空白圖示哦!!!


2014年2月20日 星期四

快速判斷 4" / 3.5" @iOS


紀錄一下方便 C/P

把下列 Code 加入  projectname_prefix.pch 內

#define IS_FOUR_INCH     ([UIScreen mainScreen].bounds.size.height == 568)


之後在要使用的地方只要

if(IS_FOUR_INCH){
    
  //do something in 4" screen

}
else{

  //do something in 3.5" screen

}

2014年2月13日 星期四

iOS 7 multitasking (Background fetch mode)

原文網址 : http://hayageek.com/ios-background-fetch/

用法請參照上面網址,

簡單說明這功能為可以在使用者不知道的情況下更新 App 的內容(或做些其他的事)

條件是

1. App 被執行過,在背景也可。

2. 只有 30 秒的時間。

3. 你無法指定何時執行,只能設定最小時間間隔,系統會自動判斷何時執行相關程式片段。


評:在很多情況下善加利用此功能自動更新App內容可以讓使用者有種  WOW ~ 好順暢的感覺

補充:http://www.slideshare.net/tuoitrecomvn/4-whatsnewinios7m4multitaskingslides

2014年2月10日 星期一

取得 App 目前版本 @ iOS7

方便 Copy/Paste


[[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString*)kCFBundleVersionKey]

MFMailComposeViewController @ iOS7

每次要用到都會忘記,隨手記一下好了方便 Copy/Paste

有許多是本公司自有的 Object,大家可以忽略掉,改成自已的Code

1.
MessageUI.framework


2.
#import <MessageUI/MessageUI.h>

3.
if ([MFMailComposeViewController canSendMail]) {
        
        MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
        controller.mailComposeDelegate = self;

        
        [controller setToRecipients:[NSArray arrayWithObjects:@"xcoder.tw@gmail.com", nil]];
        [controller setSubject:@"信件主指"];
        
        [controller setMessageBody:[NSString stringWithFormat:@"請填寫以下項目\nApp版本:%@ \n裝置型號: \n系統版本: \n電信商:",[[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString*)kCFBundleVersionKey]] isHTML:NO];
        
        
        [self presentViewController:controller animated:YES completion:^{
            //nil
        }];
    }
    else {
        
        [UIAlertView Dai_alertViewWithTitle:@"無法使用寄信功能。" message:@"請確認您裝置上的信箱是已設定。" cancelButtonTitle:@"確定"];
        
    }


Delegate:
4.
#pragma mark MFMail delegate
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    
    switch (result) {
        case MFMailComposeResultCancelled:
        {
            [GlobalFunctions HUDStartWithString:@"取消寄信。" dismissAfterDelay:2.0f];
            
        }
            break;
        case MFMailComposeResultSaved:
        {
            [GlobalFunctions HUDStartWithString:@"信件已儲存。" dismissAfterDelay:2.0f];

        }
            break;
        case MFMailComposeResultSent:
        {
            [GlobalFunctions HUDStartWithString:@"成功送出,感謝您的寶貴意見。" dismissAfterDelay:2.0f];

        }
            break;
        case MFMailComposeResultFailed:
        {
            [GlobalFunctions HUDStartWithString:@"傳送失敗,請再試一次。" dismissAfterDelay:2.0f];

        }
            break;
        default:
            break;
    }
    [self dismissViewControllerAnimated:YES completion:nil];
    
}


2014年1月4日 星期六

SOLVE 2.23: Apps must follow the iOS Data Storage Guidelines or they will be rejected

某個 App 被 Apple Reject  了,因為是 2.23: Apps must follow the iOS Data Storage Guidelines or they will be rejected

其實這個問題好久以前就遇過了,也解過,但總是會忘記。

備份一下以免以後再發生同樣問題。

這個問題其實就是在 App 中有下載檔案的話要,每一個檔案都要備註是否要 Backup 至  iCloud。

解法也很簡單,把整個 Document 全部設定成 Do NOT Backup 就好了。

解法原帖:http://stackoverflow.com/questions/19964831/ios-flag-entire-document-directory-as-do-not-backup


簡單來說就是在你的  AppDelegate.m 的 didFinishLaunch 裡面加上

NSString *docsDir;
NSArray *dirPaths;
NSURL * finalURL;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];


finalURL = [NSURL fileURLWithPath:docsDir];


[self addSkipBackupAttributeToItemAtURL:finalURL];
skip backup 如下

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL

{

    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);



    NSError *error = nil;

    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]

                                  forKey: NSURLIsExcludedFromBackupKey error: &error];

    if(!success){

        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);

    }

    return success;
}