2015/02/27

[Python][Google App Engine]datastore_v3.Put() was too largeというエラー

datastoreに画像を突っ込む処理をしている時に、下のようなエラーに遭遇した。

The request to API call datastore_v3.Put() was too large.

stackoverflowのThe request to API call datastore_v3.Put() was too largeで確認するとどうやら1Mb以上のデータを突っ込もうとするとエラーが発生するみたい。

確かにデータ量を抑えたら登録できた。

2015/02/26

[iOS][Objective-C]AFNetworking 2.0を使ってPOST時に進捗状況を確認

AFNetworking 2.0を使ってPOSTする時に進捗状況を確認したい場合はどうすればいいのだろうか?

同じ悩みを抱えている人がstackoverflowのAFNetworking 2.0 HTTP POST Progressにあって、下のように実装したら確かに取得できた。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{};
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
AFHTTPRequestOperation *requestOperation = [manager POST:@"http://localhost"
                                              parameters:parameters
                               constructingBodyWithBlock:(id formData ){
                                               }  success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                                   NSLog(@"operation success: %@\n %@", operation, responseObject);
                                               } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                                   NSLog(@"Error: %@", error);
                                           }];
[requestOperation setUploadProgressBlock:^(NSUInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {
    double percentDone = (double)totalBytesWritten / (double)totalBytesExpectedToWrite;
    NSLog(@"progress updated(percentDone) : %f", percentDone);
}];
[requestOperation start];
これとSVProgressHUDを絡めれば相当いけている幹事になるかも。

2015/02/25

[iOS][Objective-C]UINavigationbarを完全透明

UINavigationbarを半透明ではなくて完全に透明にしたい場合はどうすればいいのだろうか?

stackoverflowのTransparent UINavigationBarよると以下のコードで透明化できました。

-(void)viewDidLoad{
  [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  self.navigationController.navigationBar.shadowImage = [UIImage new];
  self.navigationController.navigationBar.translucent = YES;
  self.navigationController.view.backgroundColor = [UIColor clearColor];
}
これよくよく考えるとnavigationBarを隠して実装したほうが早かったかも。

2015/02/24

[iOS][Objective-C]iOS7からのUITextViewのinit

どうやらiOS7からUITextViewのinitの仕方が変わったみたい。

iOS7から下のようにすればいいみたい。

CGRect frame;
UITextView *textView = [UITextView alloc] initWithFrame:frame textContainer:nil];
第二引数はnilでもいいみたい。

2015/02/23

[HTML]robots.txtでindexさせない方法

google app engineでrobots.txtの404が発生していてtxtファイルを作ってみたものの中身をどうすればいいかわからず、以下のサイトを見て解決できました。

robots.txtの書き方(保存版)

User-Agent: *
Disallow: /
上の書き方でクロールせずにすむ事ができそうです。

2015/02/22

[JavaScript][wysihtml]テキストの位置を変更する

wysihtmlプラグインを実行してテキストの位置を変更したい場合はどうすればいいのだろうか?

<style>
.wysiwyg-text-align-left{
    text-align:left;
}
.wysiwyg-text-align-center{
    text-align:center;
}
.wysiwyg-text-align-right{
    text-align:right;
}
</style>
<div id="wysihtml5-toolbar" style="display: none;">
  <a data-wysihtml5-command="justifyCenter">中央寄せ</a>
  <a data-wysihtml5-command="justifyLeft">左寄せ</a>
  <a data-wysihtml5-command="justifyRight">右寄せ</a>
</div>
<div id="wysihtml5-textarea"></div>
<script>
editor = new wysihtml5.Editor('wysihtml5-textarea', {
    toolbar:'wysihtml5-toolbar',
    parserRules:wysihtml5ParserRules
});
</script>
実行した結果、確かに文字位置の変更ができました。

2015/02/21

[JavaScript][wysihtml]iタグに独自classを付与する

wysihtmlプラグインを実行して斜体のiタグに独自のclassを付与したい局面が発生したので調査しました。

stackoverflowのwysihtml5 editor - how to simply add a class to an element?でも同じ悩みを抱えている人がいて、実際に下のように組んでgruntかけたら動いた。

(function(wysihtml5){
  wysihtml5.commands.italic = {
    exec: function(composer, command, className) {
      wysihtml5.commands.formatInline.execWithToggle(composer, command, "i", className, new RegExp(className, "g"));
    },

    state: function(composer, command, className) {
      // element.ownerDocument.queryCommandState("italic") results:
      // firefox: only <i>
      // chrome:  <i>, <em>, <blockquote>, ...
      // ie:      <i>, <em>
      // opera:   only <i>
      return wysihtml5.commands.formatInline.state(composer, command, "i", className, new RegExp(className, "g"));
    }
  };
}(wysihtml5));
実行は下。
<div id="wysihtml5-toolbar" style="display: none;">
  <a data-wysihtml5-command="italic" data-wysihtml5-command-value="hoge">斜体</a>
</div>
iタグ以外にも使えるので重宝します。

2015/02/20

[iOS][Objective-C]iOS8のpush notificationの仕様変更について

iOS8でデバッグしていると以下のようなエラーメッセージが表示された。

registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later.
そこで、qiitaのiOS8のRemote Notificationの登録メソッドについてを読みながら修正を加えてみた。

ちなみにiOS7以前までは、
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert];
としていた。

今回、iOS8では下のように変更した。
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
確かに動いたけど、なんか釈然としないなー。

2015/02/19

[Objective-C][iOS]AFNetworking2.0で独自headerを追加

AFNetworking2.0でヘッダーを追加したい場合はどうすればいいのだろうか?

AFNetworking 2.0 add headers to GET requestによるとAFTTHRequestSerializerを使えとあって、確かにAFHTTPRequestSerializerで確認すると

- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field
というメソッドがあったので、試しに使ってみる。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//独自ヘッダーの追加
[manager.requestSerializer setValue:@"" forHTTPHeaderField:@""];
[manager GET:@"" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];
実行した結果確かにヘッダーを追加してリクエストを飛ばすことができました。

2015/02/18

[iOS][Objective-C]マクロでNSStringメソッドを使う

マクロでstaticのNSStringやFloat、intを設定できるのは知っているのだが、NSStringのメソッドを使ってコンパイルの時に実行することはできるのだろうか?

Objective-Cで最近お気に入りのマクロ4つ

で確認すると下のようにすることはできるみたい。

#define HOGE = [NSString stringWithFormat:@"%@", @"Hello Objective-C"];
これはすごく便利。

開発版と本番でapiのhttpをわけるときに重宝します。