2013/08/31

[iOS][Objective-C]iOS 6でCoreTextのバグ

え、まじで!!

AppleのiOS 6とOS X 10.8AのレンダリングエンジンCoreTextのバグのため、どのアプリもアラビア語の文字列を表示しようとすると、すぐにクラッシュする。

via:AppleのCoreTextのバグでiOS 6とOS X 10.8のアプリがクラッシュ
これ、TTTAttributedLabelを使っている時も、影響ありそうだなー。

iOS6をメインで使っている人が多いと思うので、修正版を配布した方がいいと思うのだが、どうだろうか?

2013/08/30

[iOS][Objective-C]SessionPresetが対応しているかどうかの確認

AVCaptureSessionクラスを使ってカメラ撮影を実装する場合、sessionPresetを設定する必要があります。

こんな感じに、

AVCaptureSession *session = [AVCaptureSession new];
session.sessionPreset = AVCaptureSessionPreset1280x720;
で端末によっては、対応しているかどうかわからないので、プログラム側で判断したい場合があります。

その場合は、下のように、canSetSessionPresetメソッドを使えば判断することができます。
AVCaptureSession *session = [AVCaptureSession new];
if ([session canSetSessionPreset:AVCaptureSessionPreset1280x720]) {
    session.sessionPreset = AVCaptureSessionPreset1280x720;
}else{
    session.sessionPreset = AVCaptureSessionPreset640x480;
}
特に高解像度で写真撮影をしたいアプリを実装した時に便利かなと。

2013/08/29

[iOS][Objective-C]SVProgressHUDの導入方法

Pinterestなどでよく使われるレイヤーが表示され、さらにその上にローディング画像が現れるUIですが、実は、
SVProgressHUD
というソースが使われていることが判明。
(どうして知ったかについては、Pinterestのアプリ内のところにオープンソースの断りに書いてあったから)

前々からちょっと使ってみたいなーっと思ったので、その導入方法について書きたいと思います。

もう、めちゃくちゃ簡単で、
SVProgressHUDでソースをダウンロード。

で、次に、SVProgressHUDフォルダをそのままXcodeにコピペする。

現時点での、SVProgressHUDフォルダの構成は下記の通り。

SVProgressHUD-Prefix.pch
SVProgressHUD.bundle
SVProgressHUD.h
SVProgressHUD.m
次に実際に使いたいところで下のようインポート行う。
#import "SVProgressHUD.h"
実行は、下のたった一行で表示することができる。
[SVProgressHUD show];
表示している間、そのレイヤーの下側のViewを触らせないようにマスクをつける場合は、
[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeClear];
とすることで、透明なマスクをつけることができる。

この時に、黒色にしたい場合は、
[SVProgressHUD showWithMaskType: SVProgressHUDMaskTypeBlack];
とすることで、マスクの色を変えることができる。

で、表示されたレイヤーを消したい場合は、
[SVProgressHUD dismiss];
で非表示にすることができる。

ただ、これだとちょっと味気ない場合、トランザクション中に表示している時など、結果どうなったのかUIで表したいときがあります。

そんなときは、
[SVProgressHUD showSuccessWithStatus:@"saved"];
と書くことにより、正常終了を表現することもできるし、失敗した場合は、
[SVProgressHUD showErrorWithStatus:@"failed"];
なんてすることもできる。

ちょっとgithubだけの説明だと、わからないところがあったので、1エントリーにまとめましたー。

2013/08/28

[mac]初期化する方法

そうかー、もうmacを購入して5年たつのかー。

以前、購入したmac bookを工場出荷時に戻す、つまり、初期化する方法を調べました。

具体的な方法は、下の2つのエントリーを読みながら試しました。
Mac OS X v10.6 Snow Leopard:消去してからインストールする方法
ハードディスクの初期化の方法
これ、最大の肝は、CDを入れて起動したときに「c」を押すというところがポイントかな。

それ以外は、特に問題なかった。

実は、初期化は初めて試みだったので、結構、ドキドキしましたが、終わってみると、なんてことなかったなーっと。

2013/08/27

[jQuery]IE7とIE8で画像がリサイズされない件

こんな感じでattrメソッドを使って画像をリサイズを行おうとしてもIE7とIE8でされなかった。

$('#hoge').attr({
  'width':100,
  'height':100,
});
同じ悩みを抱えている人もいました。

【jQuery】IE7でjQueryのattrが効かない

で、上のリンクと同じようにcssメソッドを使ったら無事にリサイズされましたー。
$('#hoge').css({
  'width':'100px',
  'height':'100px',
});
めでたし、めでたし。

2013/08/26

[jQuery]jquery-tmplについて

知人から共有していただいたソースを見ると、こんな記述が。。。

<script type="text/x-jquery-tmpl">
<!-- HTML CODE -->
</script>
これってなんだろうーっと思って調べたら、jquery-tmplと呼ばれるプラグインのようだ。

で、実際にgithubを覗くともはやメンテナンスをしていないようだ。

色々あるんだなーっと。

2013/08/25

[HTML][JavaScript]canvas状態を保存と復元

どうやらcanvasの状態を保存して復元することができるようだ。

保存は、saveメソッド、復元はrestoreメソッドで実現することができる。

<script>
jQuery(function($){
  var canvas = document.getElementById("hoge");
  var context = canvas.getContext("2d");

  context.fillStyle = 'rgb(255, 0, 0)';
  context.fillRect(0,0,100,100);
  context.save();

  $('#restore').on('click',function(e){
    context.restore();
  });

  $('#draw').on('click',function(e){
    context.fillRect(0,0,100,100);
  });

  context.fillStyle = 'rgb(0, 0, 0)';

});
</script>
<canvas id="hoge" width="200" height="200" style="border:solid 1px red;"></canvas>
<input type="button" value="restore" id="restore">
<input type="button" value="draw" id="draw">
上の例では、restoreボタンを押す前に、drawボタンを押すと黒色で描画されるが、restoreボタンを押した後、drawを押すと赤色で描画される。

2013/08/24

[本]逆算力 (成功したけりゃ人生の〆切を決めろ)

読了
逆算力 (成功したけりゃ人生の〆切を決めろ)
逆算力 (成功したけりゃ人生の〆切を決めろ)
高岡 浩三 おち まさと

はじめに

第1章 42歳で死ぬと思えば何でもできる
01 あなたは何歳で死ぬと思っていますか?
02 私が42歳で死ぬと思った理由
03 昔の42歳は「おじさん」だった
04 「生徒会選挙に出なさい」という母の教え
05 竹村健一さんのテニスコーチで学んだこと
06 「外資系企業」ネスレに入社する
07 「志」を持った就活をせよ
08 結婚も「42歳」からの逆算で決めた

第2章 最強の「サラリーマン」を目指せ
09 伝説は「マギーブイヨン」から始まった
10 取引先のパートナーが出世する幸運
11 ハタキを持ってスーパーを回る
12 全部で3回、会社をやめようと思った
13 上司によって評価が変わってはいけない
14 30歳で部長、10人超の部下を持つ
15 「要領」がよくないと社長は務まらない
16 移動時間のために事前に準備をする
17 敵ができることを恐れない
18 「骨」は崩すな

第3章 「受験にキットカット」が生まれた秘密
19 文化になった「受験にキットカット」
20 ブランドは誰のものか
21「きっと勝つ」でブランドに魂を入れる
22 異業種と組んで「ルール」を変える
23 CD付きキットカットを発売
24 『ケンミンSHOW』で解けた謎
25 アイデアが夢の中で生まれる理由
26 発想力よりも実行力
27 広告だけでは売れない時代にどう売るか
28 コスト削減も本質から考える

第4章 ネスレの強さと日本復活の条件
29 スイスの企業が強いワケ
30 100年前からグローバル企業
31 崩れた高度成長期モデル
32 日本の教育は江戸時代と同じ
33 ネスレ日本という「奇跡」
34 日本式経営の最強企業を作る

via:目次
前回読んだ「指導しなくても部下が伸びる!」同様、日経のキャンペーンで当たった本の一冊。

書いてあることは、他の経営者本と変わらない。
が、唯一面白かったのは、ネスレがスイスの会社であり、そしてスイスの総人口が700万という限られた人口だっため、世界規模で商売をせざるを得なかったこと。
よって、各国に適した事業戦略を立てているということ。

日本でのケースとして、キットカットの受験生応援キャンペーンなどが紹介されている。

著者として「おちまさと」と書かれているが実際、何をしたのか全然わからない。
プロデュースって、この場合、何を??

各セクションごとにまとめの言葉があったが、文書中の内容を太字にすれば必要なくなるのではないか?よって、紙面が少なくなりよりスピーディに読むことができたのではないかと思ってしまった。

まー、アメリカ以外のスイスという国の会社の様子を知るにはいいかもしれませんね。

2013/08/23

[HTML][JavaScript]canvasタグの透明度を連続的に調節する

昨日のエントリーでは、canvasの透明度を調整する方法を書きました。

今日は、連続的に変更する方法について。

<script>
jQuery(function($){
  var nAlpha = 1;
  var canvas = document.getElementById("hoge");
  var context = canvas.getContext("2d");
  context.fillRect(0,0,100,100);

  function animation(){
    nAlpha = nAlpha - 0.1;
    if(nAlpha < 0){
      nAlpha = 1;
    }

    context.clearRect(0,0,100,100);
    context.globalAlpha = nAlpha;
    context.fillRect(0,0,100,100);

    nTimerid = setTimeout(function(){
      clearTimeout(nTimerid);
      animation();

    },200);
  }

  animation();

});
</script>
<canvas id="hoge" width="200" height="200" style="border:solid 1px red;"></canvas>

2013/08/22

[HTML][JavaScript]canvasの透明度を調整する

canvasタグの透明度を調節する方法を調査しましたー。

こんな感じ

<script>
jQuery(function($){
  var canvas = document.getElementById("hoge");
  var context = canvas.getContext("2d");
  context.globalAlpha = 0.5;
  context.fillRect(0,0,100,100);
});
</script>
<canvas id="hoge" width="200" height="200" style="border:solid 1px red;"></canvas>

2013/08/21

[iOS][Objective-C]アプリ内でSMS機能を実装

昨日は、アプリ内でメール機能を実装する方法について書きましたが、SMSも同様にURLschemeを呼ばなくても自分のアプリ内で呼び出すことができます。

//phoneはメッセージを送りたい電話番号
NSString *phone;
//messageは、SMSのメッセージ内容
NSString *message;
UIViewController *viewController;
if ([MFMessageComposeViewController canSendText]) {
    mFMessageComposeViewController.messageComposeDelegate = self;
    mFMessageComposeViewController.recipients = @[phone];
    mFMessageComposeViewController.body = message;
    [viewController presentModalViewController:mFMessageComposeViewController animated:YES];
}

//MFMessageComposeViewControllerDelegate
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{

}
設定項目がわずかなので、メール機能よりも便利ですねー。

2013/08/20

[iOS][Objective-C]アプリ内でメール機能を実装

前回、アプリ内でアドレス帳内にあるメールアドレスを取得する方法を書きましたが、今回は、メールアプリを起動せずに、自分のアプリ内でメール機能を実装する方法について書きたいと思います。

以下のようなソースで呼び出すことができる。

//emailは、送信先のメアド
NSString *email = @"";
//mailtitleは、メールアドレスのタイトル
NSString *mailtitle = @"";
//messageは、メールの内容
NSString *message = @"";
UIVIewController *viewController;
if ([MFMailComposeViewController canSendMail]) {
    mailComposeViewController.mailComposeDelegate = self;
    [mailComposeViewController setToRecipients:@[email]];
    [mailComposeViewController setSubject:mailtitle];
    [mailComposeViewController setMessageBody:message isHTML:NO];
    [viewController presentModalViewController:mFMessageComposeViewController animated:YES];
}

//MFMailComposeViewControllerDelegate
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:
}
この実装で呼び出すことができる。

URLschemeを使わなくても使うことができるので、便利ですねー。

2013/08/19

[iOS][Objective-C]アドレス帳のメールアドレスを取得

昨日は、アドレス帳の電話番号を取得する方法を書きましたが、今日は、メールアドレスの取り方について。

下のようなソースコードでできる。

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
    return YES;
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
    
    NSString *email;

    //メールアドレスの場合
    if (property == kABPersonEmailProperty) {

        //複数件数あるかどうかの確認
        ABMultiValueRef emails = ABRecordCopyValue(person,kABPersonEmailProperty);
        email = (__bridge NSString*)ABMultiValueCopyValueAtIndex(emails,identifier);

        return NO;
    }
    
    return NO;
}

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
    [self dismissViewControllerAnimated:YES completion:NULL];
}
これも実機で正常終了しましたー。

2013/08/18

[iOS][Objective-C]アドレス帳の電話番号を取得

前回、アプリ内でiOSの中にあるアドレス帳を開く方法を書きました。

今回は、選択された項目が電話番号の場合の取得方法について。

次のようなソースコードで得られる。

//ABPeoplePickerNavigationControllerDelegate
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
    return YES;
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
    
    NSString *phone;
    
    //電話番号の場合
    if(property == kABPersonPhoneProperty){
        //複数件数あるかどうかの確認
        ABMultiValueRef phones = ABRecordCopyValue(person,kABPersonPhoneProperty);
        phone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phones,identifier);
        return NO;
    }
   
    return NO;
}

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
    [self dismissViewControllerAnimated:YES completion:NULL];
}
実機で試した結果、正常終了しました。

今後、アプリを作る時に、これをコピペすればいいから便利かなと。

2013/08/17

[iOS][Objective-C]アドレス帳を開く

どうやらアプリ内で、アドレス帳を開くことができるようだ。

その方法を書きたいと思います。

まずは、下の二つのライブラリーが必要です。

AddressBook.framework
AddressBookUI.framework
表示したいViewController.hに下のコードを記述。
#import <AddressBookUI/AddressBookUI.h>
表示したいViewController.mに下のコードを記述。
ABPeoplePickerNavigationController *aBPeoplepicker;

aBPeoplepicker = [[ABPeoplePickerNavigationController alloc] init];
aBPeoplepicker.peoplePickerDelegate = self;
[self presentModalViewController:aBPeoplepicker animated:YES];
ただし、これだけだとクラッシュしてしまう、理由は、delegateを設定していないから。

というわけで、ABPeoplePickerNavigationControllerDelegateを設定して、以下のメソッドを追記する。
//ABPeoplePickerNavigationControllerDelegate
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
    return YES;
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
    return NO;
}

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
    [self dismissModalViewControllerAnimated:YES];
}
こうすればクラッシュすることなく、下のようにアドレス帳にアクセスしてもいいかどうか問うアラートが表示されます。
 photo address_ios_zps95f2d955.jpg
友達招待機能とか実装したい場合に、便利かなと。

2013/08/16

[facebook][iOS]app centerに登録するときの注意点 その2

前回、app centerに登録するときの注意点について書きました。

で、実際にFacebook App Centerに提出して通ったので、その時の注意点をまとめたいと思います。

Privacy Policyは必須。かつ、外部サイトに作ること。
最初、Facebook Pagesのノートに書いていたのですが、いつまで立っても審査されず、外部のレンタルサーバーを借りてそこに移したところ、審査が始まりました。

Terms of Seriveは必須。かつ、外部サイトに作ること。
Privacy Policyと同様に、最初、Facebook Pagesのノートに書いていたのですが、いつまで立っても審査されず、外部のレンタルサーバーを借りてそこに移したところ、審査が始まりました。

ちなみに、上の二つのサイトは、日本語でも問題ないようです。

スクリーンショットは、iOSの画面をそのまま掲載すること。

AppleのApp Centerのように、余計なエフェクト入れたりはせず、ありのままの、画像を掲載すること。

以上の注意点を守って、次回以降のアプリも審査に出したいです。

ちなみに、プライバシーポリシーや利用規約のひな形は、以前、紹介した良いウェブサービスを支える「利用規約」の作り方を読んで作りました。

2013/08/15

[本]指導しなくても部下が伸びる!

読了
指導しなくても部下が伸びる!
指導しなくても部下が伸びる!
生田洋介

序章 “指導者”ではなく“促進者”になれ
新しいチームがスタートするとき
プロジェクトが動きだすとき
仕事を任せるとき
日常業務のなかで
面談の場で
会議の場で
ランチ・飲み会などの場で
部下が失敗したとき
部下が成功したとき
プロジェクトが終了したとき
終章 あなた自身が手本たれ

via:目次
どうやら日経の会員登録キャンペーンか何かであたって、いつの間にか家に突然、届いていた。

タイトルずばり指導しなくても部下が伸びるためのプレイングマネージャーに向けた72の指針が書かれてあったが、これ、全部やらないといけないのかなー?やっぱり。
読んでみて、なんだか、聖人君子のように感じてしまうのだが、どうだろうか?

「あなた自身が手本たれ」を締めにもってきたのは、起承転結上やむ得なかったかもしれないが、まず始めに実行するのが、これじゃーねーっと思ってしまったのだが、どうだろう?

部下を一度も持ったことがないので、何でも言えるんだけどね。

ってかやっぱりこのご時世、従業員ってやっぱり厳しいと思うんだよなー。
本書で書いてあるようにメンバーの将来、現在と言っても仕事のことだけではなく、プライベートのことも含めすべてに気をつけなくちゃーいけないし、だったら、クラウドファンディングや少数精鋭の専門家集団があつまった組織の方が起動力もあるし、意思決定が早いし、いいことずくめの気がするんだよ。もう疲れちゃうというか。

なので、この指針を全部やっている人はすごいなと思う、ホントに。

2013/08/14

[Twitter][iOS][Objective-C]アカウント情報を取得する

iOS上であるアカウント情報を取得するにはどうすればいいのだろうか?

GET users/showを読みながら下のように実装しました。

#import <Twitter/Twitter.h>
TWRequest *tWRequest = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"https://api.twitter.com/1.1/users/show.json"] parameters:[NSDictionary dictionaryWithObject:@"問い合わせをしたいTwitterのID" forKey:@"user_id"] requestMethod:TWRequestMethodGET];
//下のacAccountは、ACAccount型の変数
tWRequest.account = acAccount;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_async(queue, ^{
        [tWRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error){
            if(!error){
                NSDictionary *dictJSON = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil];
                dispatch_async(dispatch_get_main_queue(),^{


                });
                    

            }
        }];
        
});
上を実行した結果、正常終了しましたー。

performRequestWithHandlerで返されるresponseDataが、JSONなので、NSJSONSerializationクラスのJSONObjectWithDataメソッドを使ってパースするところがポイントですねー。

これで、プロフィールの写真を取得したりするのも簡単にできます。

2013/08/13

[iOS][Objective-C]NSStringは参照代入or値代入

当初想定では、下のコードの出力結果は、barになると思ってしたのだが、実際は、「hoge」だった。

NSString *hoge = @"hoge";
NSString *foo = hoge;
hoge = @"bar";
NSLog(@"%@",foo);
NSStringの値設定は、参照渡しになると解釈していたのだが、これだけみると値代入になっている気がする。なぜ??

2013/08/12

[iOS][Objective-C]TWRequestについて

TWRequestクラスを使ってリクエストを飛ばそうと実装しているのですが、認証が必要な場合、下のように実装しました。

ACAccount *acAccount;
TWRequest *tWRequest = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"https://api.twitter.com/1.1/users/show.json"] parameters:[NSDictionary dictionaryWithObject:@"" forKey:@"user_id"] requestMethod:TWRequestMethodGET];
tWRequest.account = acAccount;
[tWRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error){

}];
で、ここでクラッシュしてしまう。
ACAccountには、適切に値が設定されているにもかかわらず。

原因を調査してみた結果、「iOS開発:iOS Twitter frameworkを使う」によればACAccountStoreの参照が必要とあり、ACAccountクラスしか使わないにも関わらず、最終的に、ACAccountStoreクラスのインスタンスが必要なようです。

で、確かに、プロパティでACAccountStoreを保持させたところ、正常終了しました。

うーん、マニュアルに書いてなかったので、クリアーするまでに、すっげー時間がかかったなー。

2013/08/11

[iOS][Objective-C][Twitter]ACAccountStore内のViewの更新について

前回、Twitterのアカウントの使用許諾を得るために、Twitterの認証を行うというエントリーを書きました。

ACAccountStoreのrequestAccessToAccountsWithTypeメソッドを使って、usernameやらidを取得することができるのですが、そのメソッド内部で、Viewの更新を行うととてつもなく時間がかかることが判明。

具体的には、こんな感じ。

ACAccountStore *aCAccountStore = [[ACAccountStore alloc] init];
ACAccountType *aCAccountType = [aCAccountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
[aCAccountStore requestAccessToAccountsWithType:aCAccountType withCompletionHandler:^(BOOL granted, NSError *error) {
    if (granted) {
        //問題個所(ものすごく時間がかかる)
        UIVIew *hoge;
        [self.view addSubView:hoge];
    }else{
        NSLog(@"not grandted");
    }
}];
どうしてかなーっと思って調べたら、ACAccountStoreのcompletionHandlerはサブスレッドっぽいでサブスレッドであることが反映。従って、gdcを使って、メインスレッドで処理を書けばいいことがわかる。下のような感じ。
ACAccountStore *aCAccountStore = [[ACAccountStore alloc] init];
ACAccountType *aCAccountType = [aCAccountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
[aCAccountStore requestAccessToAccountsWithType:aCAccountType withCompletionHandler:^(BOOL granted, NSError *error) {
    if (granted) {
        main_queue = dispatch_get_main_queue();
        dispatch_async(main_queue, ^{
          UIVIew *hoge;
          [self.view addSubView:hoge];
        });
    }else{
        NSLog(@"not grandted");
    }
}];
実行した結果、無茶苦茶早くなりました。

ってか、ACAccountStoreのリファレンスに書いておいてほしかったwww

2013/08/10

[Twitter]プロフィールイメージとバナーイメージのレギュレーション

facebookのAPIように大小異なるプロフィールイメージをTwitterでは取得できないのかなーっと調べていたら、取得できるようです。








VariantDimensionsExample URL
normal48px by 48pxhttp://a0.twimg.com/profile_images/xx/xx_normal.png
https://si0.twimg.com/profile_images/xx/xx_normal.png
bigger73px by 73pxhttp://a0.twimg.com/profile_images/xx/xx_bigger.png
https://si0.wimg.com/profile_images/xx/xx_bigger.png
mini24px by 24pxhttp://a0.twimg.com/profile_images/xx/xx_mini.png
https://si0.twimg.com/profile_images/xx/xx_mini.png
originaloriginalhttp://a0.twimg.com/profile_images/xx/xx.png
https://si0.twimg.com/profile_images/xx/xx.png
Omit the underscore and variant to retrieve the original image. The images can be very large.

2013/08/09

[iOS][Objective-C]UITableViewCellの横幅が変更できない

昨日のエントリーでUITableViewCellの横幅がわかったことを書いたのですが、では、それを踏まえて動的に変更することはできないのだろうか?

UITableViewDelegateプロトコルの- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPathを使って下のように実装しても変更することができなかった。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
  cell.frame = CGRectMake(
    cell.frame.origin.x,
    cell.frame.origin.y,
    200,
    cell.frame.size.height
  );
}
何故なんだろう?

googleで調べてみると、どうやら、UITableViewCellを継承させたクラスを作れば実装できるみたいなんだけど、ちょっとそれは気持ち悪くて、どうにか、継承せずに変更することはできないもんかなー。

2013/08/08

[iOS][Objective-C]UITableViewCellの横幅

UITableViewControllerのUITableViewStyleがUITableViewStyleGroupedのときのUITableViewCellのwidthって一体いくつなのか気になって調べました。

Width of grouped UITableViewCell

によると300とのことです。

こうしてメモしておくと、アプリを作る上での一つの目安になって便利ですね。

2013/08/07

[Instagram][Python][GoogleAppEngine]認証(ログイン)方法

Instagramの認証を読みながら実際に、ログイン方法について調べる。

Google App Engineを使った場合は、下のように実装できるようだ。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import webapp2
import json
import urllib
from google.appengine.api import urlfetch

class LoginInstagram(webapp2.RequestHandler):
 def get(self):
  self.redirect("https://api.instagram.com/oauth/authorize/?client_id=hoge&redirect_uri=http%3A%2F%2Ffoo.appspot.com%2Ftest%2Finsta%2Fredirect&response_type=code")
  

class RedirectFromInstagram(webapp2.RequestHandler):
 def get(self):
  self.response.headers['Content-Type'] = 'text/plain'
  code = self.request.get('code')

  url = "https://api.instagram.com/oauth/access_token"
  payload = urllib.urlencode({
   "client_id":"hoge",
   "client_secret":"hoge_secret",
   "grant_type":"authorization_code",
   "redirect_uri":"http://foo.appspot.com/test/insta/redirect",
   "code":str(code)
  })
  result = urlfetch.fetch(
   url=url,
   payload=payload,
   method=urlfetch.POST,
   headers={'Content-Type': 'application/x-www-form-urlencoded'}
  )
  if result.status_code == 200:
   #tokenの表示
   self.response.out.write(result.content)

app = webapp2.WSGIApplication([
 ('/test/insta', LoginInstagram),
 ('/test/insta/redirect', RedirectFromInstagram)
 ],debug=False
)
Oauth2だとこんなに簡単なものかとびっくりしてしまった。

ライブラリなどを使わずに実装できてしまうのである。

Oauth2は、どんどん普及してほしいなと思う昨今である。

2013/08/06

[iOS][Objective-C]Appiraterの導入

ある特定のアプリを立ち上げているとよく「このアプリを評価してくれませんかー」というアラートが表示されるのですが、どうやって実装されているんだろうーっと思っていたら、どうやらAppiraterというオープンソースのコードが使われている模様。

実際に、
アプリのレビューを促すメッセージを表示するAppiraterライブラリの導入手順
を見ながら今、リリースしているアプリに導入しましたー。

上のエントリーを読みながら実装するとめちゃくちゃ早くできるので、便利ですよ。

2013/08/05

[本]大失敗!―成功企業が陥った戦略ミステイクの教訓

読了
大失敗!―成功企業が陥った戦略ミステイクの教訓
大失敗!―成功企業が陥った戦略ミステイクの教訓
ジャック トラウト

大企業が犯した数々の失敗を網羅している一冊。

最後の方にコンサルをdisっているのだが、読んでいて大丈夫なのだろうか?と心配せずにはいられなかった。訴えられないだろうか?読んでいる人の中には、コンサル会社を特定できそうな気がするのだが。

失敗にはある一定の法則があることが本書を読んで把握することができる。
同じ失敗を繰り返さないためにも、読んでおいて損はない一冊。

2013/08/04

[HTML]HTML(ホームページ)自動作成ツール4集

仕事をしていて思うのは、自動でHTMLを作ってくれるサービスがあれば、そこそこいけるんじゃないかと。

で、日常生活をしていていくつか発見したので、共有

wix
 photo wix_zpsddf25c79.png
weebly
 photo weebly_zps1d3f3708.png
amsstudio
 photo amsstudio_zpsb10486f5.png
strikingly
 photo strikingly_zps492060ea.png
引用元:シンプルで美しいウェブサイトをたった数分で作成できるサービス「Strikingly」

2013年10月01日:追記
 photo appcubator_zps8f159420.png
appcubator
引用元:Web“ページ”ではなく“サイト”を一般会社員にも作れるAppcubator(データベースやアクセス分析も最初から提供)