Push通知をまとめてみた(PushNotification) – iOS and Android

hisasann/PushNotification-iOSandAndroid · GitHubにあげておきました。
iOSとAndroidはディレクトリを分けて各ファイルを置いておきました。

プロジェクト自体は重いのでpushしていないです。
README.mdに基本的なことを記載。

iOS

PushNotification-iOSandAndroid/iOS at master · hisasann/PushNotification-iOSandAndroid · GitHub

release用のPush通知証明書ファイルでためす場合は、AdHocとして入れればOK!

Android

PushNotification-iOSandAndroid/Android at master · hisasann/PushNotification-iOSandAndroid · GitHub

はじめてのAndroidアプリ開発―Android4対応版 (TECHNICAL MASTER)
山田 祥寛
秀和システム
売り上げランキング: 10,811

WebStorm6のFile WatchersとIDE Improvementsがいいね!

TypeScript Support in WebStorm 6 | WebStorm & PhpStorm Blog

File Watchers

File Watchers機能が増えたので、コンパイル系のAltJSやCSSプロセッサーのSassやLessも保存時にコンパイルしてくれるので、だいぶ楽ちんになってきました。
(とはいえ、ぼくはGrunt.jsを使うので、あまりFile Watchers自体は使わないかもですが)

前のバージョンでは、External Toolsでコマンドを登録していましたが、今は保存するタイミングで自動でコンパイルしてくれます。

ためしにCoffeeScriptのFile Watchersを登録してみます。
「Settings → File Watchers」から+ボタンを押して、CoffeeScriptを選んでみます。

こんな感じで、入力しておきます。

どうもEnvironment Variablesにnodeのパスを設定しないとうまく動かなかったので、入れています。

あと、Output pathsは入れても入れなくても動きました。
指定してもその通りにならなかったので、うまく機能していないのかな?
なので、Argumentsのところで–outputで.jsファイルの保存先を指定しています。

該当のファイルのみをコンパイルしているので、Grunt.jsを使うよりも速いですね。
(Grunt.jsにいろいろ書きすぎ!)

IDE Improvements

この機能は、外観をかっちょいい感じにしてくれます。

メニューの「View → Quick Switch Scheme」よりSwitch Look and Feelを選択し、Darculaを選択するとこの画像のようになります。

こうゆう機能ぼく好きだなー。

そういえばアイコンもやわらかい感じになりました。

その他アップデート内容は、
WebStorm 6 — turbo-charge your cutting edge web dev workflow with time-saving tools
よりご覧ください。

風雲~ストームライダーズ [DVD]
ポニーキャニオン (2003-06-18)
売り上げランキング: 46,754

WebStormショートカット・機能メモ

今まではVimJavaScriptを書いていたんですが、WebStormも結構使っていて、ここ最近はWebStorm一本でJavaScriptを書き始めているので、
良かったなーというショートカットや機能をメモっていこうと思います。

ただやはりVimならこれできるのにーとモジモジすることは多々あります。

またショートカットの設定は、WebStormの設定にあるKeymapからできます。

WebStormってなあに?という方はWebStorm指南書こちらのすばらしいスライドを一読されると、おーーってなると思います。

Command + J

LiveTemplate一覧

TextMateのようにタブで保管できる候補が一覧で出てきます。
あれ、どんな候補あったっけ?というときに特に便利です。

Command + W (独自コマンド)

タブを閉じる

WebStormはデフォルトでこのコマンドでタブが閉じないので設定した。

Keymap Editor TabsのClose

Command + Shift + ], Command + Shift + [ (独自コマンド)

タブの移動

これもよく使うので設定した、Chromeとかと同じ方法での移動。

Keymap Editor TabsのSelect Next Tab
Keymap Editor TabsのSelect Previous Tab

Shift + Option + ↑ (独自コマンド)

Caret内の文字を選択、ダブルコートの中身とか、HTMLのタグの中身とか。
Vimっぽい機能としてこれは必須でした。
複数回実行すると選択の範囲が大きくなっていく。
なので、ハッシュの中身を選択もできる。

Eclipseと同じ操作のショートカットにした。

Keymap Select Word at Caret

Shift + Option + ↓ (独自コマンド)

Caret内の文字を選択の解除
選択が行き過ぎた場合にこれで戻れる。

Shift + Option + ↑の逆版

Keymap UnSelect Word at Caret

Command + Shift + O (独自コマンド)

ブラウザの起動

書いているHTMLをすぐに開きたいときに、わざわざブラウザのほうにHTMLファイルをドラッグとかしたくないので設定した。

Keymap ViewのOpen in Browser

Option + F2

どのブラウザで選ぶかのリストが出て、エンターでそのブラウザを起動

Command + Shift + Oでも十分なんですが、他のブラウザでも見たい場合に便利。
設定のWeb BrowsersでActiveにしとかないとリストに出てきてくれないので注意。

Keymap ViewのWeb Preview

Command + E

Recent Files

最近開いたファイルをリストで表示してくれるので、これも結構使います。

Keymap ViewのRecent Files

Command + 1

Project Tool Windowを表示

つまりファイルエクスプローラーのペインに移動。
目的のファイルでエンターを押し、Escでエディターペインに移動できる。
Recentのほうでは探せなさそうなときはこっちを使っている。

Keymap ViewのTool WindowのProject

Command + 7

Structure Tool Windowを表示

これもよく使うコマンドで、ファイル内のStructure情報を表示してくれる。
エンターでその定義メソッドなどに飛べて、さらにこのペイン内ではインクリメントサーチができるので、飛びたいメソッド名がわかる場合は少しタイプするだけで目的の場所に飛べる。

Keymap ViewのTool WindowのStructure

Command + Shif + A

アクション一覧を表示

操作したいアクションのコマンドを覚えていない場合は、これで一覧表示エンターで起動できる。
これすごく便利、TextMateにもSublime Textにもありますね。

Keymap HelpのFind Action

Command + B

定義場所に移動

もっともよく使うコマンドかもしれない。
さらに、これがWebStormの強みでもある。
メソッドやプロパティの定義場所に移動してくれる、さらにファイルもまたがっていてもOKだし、プロジェクト内のJavaScriptファイルはインデクシングされているので、jQueryなどの
ライブラリにももちろん飛べる。

そして、候補がいっぱい出てきたときは、ファイル名をタイプすればインクリメントサーチしてくれる!

Keymap NavigateのDeclaration

Option + F7

関数変数の利用箇所を検索

これもWebStormの便利機能、このメソッドどこで使われているのかなーというときに使います。

Keymap FindのUsages

Shift + F6

Rename

よく使うリファクタリングのRenameです。
WebStormの協力なのはこのリファクタリングがすごいですよね。

後になって、やっぱりこのメソッド名嫌だなーと思った場合、他のエディターで直すのは大変ですが、WebStormなら一発!

Keymap RefactorのRename

Command + Option + T

クイックタグ編集

選択範囲を囲むようにHTMLタグを生成できます。
もちろんZenCodingも可能。

Surround.vimのようにダブルコートとかで囲えたらいいのになー

Keymap CodeのSurround With

Command + Option + L

コードフォーマッター

一発でコードをキレイにしてくれるので、これはコード書いては実行しています。

Keymap CodeのReformat Code

Command + Shift + Enter

現在いるステートメントで最適なコードを保管してくれる

ifやforとタイプしてこのコマンドを打つと()やら{}を保管してくれる。
ただ普段はCoffeeScriptを書いているので、このコマンドはあんまり使わなくなってきてしまいました。

Keymap Complete Current Statement

Option + Enter

へんてこなコードのところには電球のマークが出ますが、ここでこのコマンドを実行するといい感じに修正してくれる。
AppCodeではほんとこのコマンドを多様する。

F11

ブックマーク

Shift + F11でブックマーク一覧が出てきます。
AngularやBackboneなんかを今コードリーディングしているんですが、いろんな箇所でブックマークしてあとから見ることが多々あるので重宝します。

Open URL

Command + Shift + AでOpen URLと入力すると速いが、入力したURLのHTMLをWebStorm内に表示してくれるので、
サクッとWebStorm上で目的のサイトのHTMLを見たいときに便利。

LiveTemplateを自作して速くコーディングする

High-speed coding with Custom Live Templates | WebStorm & PhpStorm Blogここの記事を読むとだいたいわかりますが、TextMateのようなタブで保管する機能をもっと自分オリジナルなもの追加したい場合にLiveTemplateを使います。

キーボードリファレンス

WebStorm_ReferenceCard.pdfからpdfをダウンロードしとくといつでもショートカットが一覧で見れる。
ありがたい!

Oh my gosh!zshをいい感じにしてくれるoh-my-zshがいいね!

いままでzshを使っていたのに、robbyrussell/oh-my-zsh · GitHubを知らなかったので導入してみた。

oh-my-zshをインストールする

curlで一発でoh-my-zshを入れてくれるみたいなんだけど、もう何が入ったのかさっぱり分からないので、これはあまりオススメできない。

curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh

なので、gitから落として各種ファイルを配置する。

# gitからcloneする
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh

# すでにある.zshrcファイルをリネーム
mv ~/dotfile/.zshrc ~/dotfile/.zshrc.orig

# oh-my-zshからtemplate用の.zshrcファイルをコピー
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

既存の.zshrcを反映させる

.oh-my-zsh/customの下に自分の.zshrcを置くと読みこんでくれるんですが、拡張子を.zshにする必要があります。
また.zshを置くときに .zshrc.zshにようにファイルの先頭にドットがあるとうまく読み込んでくれなかった。

ln -s ~/dotfile/.zshrc.orig ~/.oh-my-zsh/custom/zshrc.zsh

テーマを変えてみる

.oh-my-zsh/themesの下にテーマが盛りだくさん!
とりあえずファンキーな僕にちなんで funky にしてみた。

コンソールの表示はこんな感じ。

╭─[~]─[hisasann]─[0]─[5984]
╰─[:)] %

参考リンク

zsh最強シェル入門
zsh最強シェル入門
posted with amazlet at 13.01.29
中島 能和
翔泳社
売り上げランキング: 557,668

Macのスクリーンショットを動画にするRubyコード

@edvakfさんにスクリーンショット撮ると面白いよーと教えていただいたので、以下の記事を参考にRubyでコード書いてみた。
Macのスクリーンショットで1日の作業を記録して動画で振り返り – 西尾泰和のはてなダイアリー

screencaptureというMacに初めから入っているコマンドを使うとスクリーンキャプチャが撮れるらしい。
さらに、ffmpegを断片の画像たちを動画に変換する。

これで一日の最後に自分がどうゆう作業をしていたのがダイジェスト(走馬灯)のように確認できて面白い。
さらにiSightで自分の顔を撮っても面白そう。

スクリーンキャプチャを撮るサンプルコード

class Capture
  attr_accessor :path
  @@INTERVAL = 30

  def initialize(path="~/")
    @path = path
  end

  public
  def capture
    Dir.glob(@path + "**/*") do | f |
      p f
      File.delete(f)
    end

    0.upto(0/(0.0)) do | count |
      filename = @path + now() + "-%08d.png"%[count]
      save(filename)
      sleep(@@INTERVAL)
    end
  end

  private
  def save(filename)
    system("screencapture -x #{filename}")
  end

  def now
    Time.now.strftime("%Y-%m-%d")
  end
end

capture = Capture.new("/Users/hisamatsu/capture/image/")
capture.capture

gist

スクリーンキャプチャ

画像から動画を作るサンプルコード

事前に

brew install ffmpeg

しとくこと。

class Movie
  attr_accessor :image_path
  attr_accessor :movie_path

  def initialize(image_path="~/", movie_path="~/")
    @image_path = image_path
    @movie_path = movie_path
  end

  public
  def capture
      filename = movie_path + now() + ".avi"
      save(filename)
  end

  private
  def save(filename)
    command = "ffmpeg -y -f image2 -r 5 -i #{@image_path}#{now()}-%08d.png -s 720x450 #{filename}"
    system(command)
  end

  def now
    Time.now.strftime("%Y-%m-%d")
  end
end

capture = Movie.new("/Users/hisamatsu/capture/image/", "/Users/hisamatsu/capture/movie/")
capture.capture

gist

画像を動画にする

aviファイルなのでVLCとかで開くとよいかと思います。

たのしいRuby 第3版
たのしいRuby 第3版
posted with amazlet at 13.01.25
高橋 征義 後藤 裕蔵
ソフトバンククリエイティブ
売り上げランキング: 21,205

UIViewのbackgroundImageをrepeatする方法

すんごく簡単なんだけど、忘れそうなのでメモメモ。

self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"hoge.png"]];

[via]
cocoa touch – Repeating background image in native iPhone app – Stack Overflow

ASIHTTPRequestに必要なframeworkたち

iPhoneアプリでHttpリクエストを使う場合には必須なライブラリ、ASIHTTPRequestの必須frameworkがオフィシャルのサイトに書いてあるのだけでは動かないのでメモメモ。

もう毎回忘れちゃうんですが、
How to use ASIHTTPRequest in your projects – All-Seeing Interactive
に書かれている、

Repeat the last two steps to add the following: SystemConfiguration.framework, MobileCoreServices.framework, CoreGraphics.framework and libz.dylib.

via: How to use ASIHTTPRequest in your projects – All-Seeing Interactive

これだけでは実際には動かないです。

  1. SystemConfiguration.framework
  2. MobileCoreServices.framework
  3. CoreGraphics.framework
  4. libz.dylib
  5. CFNetwork.framework

最後のCFNetwork.frameworkがないと動かないのです!

ファミ通App iPhone&Android NO.004 (エンターブレインムック)
エンターブレイン (2012-10-18)
売り上げランキング: 22

WebViewのCookieをネイティブ側のリクエストで使う方法(iPhone・Android)

iPhone版

CookieをiPhone側でセット/削除する方法 – 風日記
iphone – Where are an UIWebView’s cookies stored? – Stack Overflow
を見た。

iPhone側はすごく簡単で、WebViewでリクエストを投げると、それだけでASIHTTPRequest(ネイティブ)のリクエストと共有されていた。
Cookieの内容を確認するにはNSHTTPCookieStorageを使うとすぐに見ることができる。

サンプル・コード

NSHTTPCookie *cookie;
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [cookieJar cookies]) {
    NSLog(@"%@", cookie);
    if ([@"lab.hisasann.com" isEqualToString:cookie.domain]) {
        NSLog(@"name - %@", cookie.name);
        NSLog(@"value - %@", cookie.value);
    }
}

gist

iPhoneでWebViewのCookieを共有する方法 — Gist


Android版

Androidのほうはやや複雑、WebViewのリクエストが完了するイベントで、すでにインスタンス化してあるHttpClientに対して、Cookieをaddしないといけない。
これをしないと、HttpClient(ネイティブ)のリクエストにCookieが乗ってくれない。

サンプル・コード

webview.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
  System.out.println("onPageFinished - " + url);
  super.onPageFinished(view, url);

  // Cookieの保存が予想されるURLの場合
  if (url.indexOf("http://lab.hisasann.com/") > -1) {
      // WebViewのCookieを取得
      String cookie = CookieManager.getInstance().getCookie(url);
      System.out.println("cookie - " + cookie);
      String[] cookies = cookie.split(";");
      for (String keyValue : cookies) {
    keyValue = keyValue.trim();
    String[] cookieSet = keyValue.split("=");
    // Cookieを作成
    BasicClientCookie bCookie = new BasicClientCookie(cookieSet[0], cookieSet[1]);
    bCookie.setDomain("lab.hisasann.com");
    bCookie.setPath("/");
    // CookieStoreを取得
    CookieStore store = httpClient.getCookieStore();
    // Cookieを追加
    store.addCookie(bCookie);
      }
  }
    }
});

Cookieの内容を確認するにはCookieStoreを使うとすぐに見ることができる。

サンプル・コード

CookieStore store = httpClient.getCookieStore();
List<Cookie> cookies = store.getCookies();
for (Cookie cookie : cookies) {
    // クッキーの設定
    if ("lab.hisasann.com".equals(cookie.getDomain())) {
  // クッキーを再設定
  System.out.println(cookie.getName() + "=" + cookie.getValue());
  break;
    }
}

つまり、ひとつのHttpClientインスタンスにCookieをセットしているので、複数のHttpClientをnewする場合は、それぞれにCookieを入れないとダメっぽい。

gits

AndroidでWebViewのCookieを共有する方法 — Gist

どうでもいいことだが

iPhoneの

NSURL *url = [NSURL URLWithString:@"http://lab.hisasann.com/cookie/setcookie.php"];

http:/でも動いた。つまりスラッシュが一個足りない!

Androidではダメでした。

iOS6から搭載されたUIRefreshControl(PullToRefresh)がかっこいい!

iOS6のメーラーを使っていると、PullToRefreshがプニョ〜っと伸びる感じが気持ちいいなーと思っていたら、UIRefreshControlという名前だった。

iOS6から搭載されたUIRefreshControl(PullToRefresh)がかっこいい!

サンプルコード

使い方はすごく簡単で、UITableViewControllerのrefreshプロパティかUIScrollViewにaddSubviewするかみたい。
今回はUIScrollViewのほうで書いてみました。

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *string = @"PullToRefresh";

    _refreshControl = [[UIRefreshControl alloc] init];
    [_refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];

    // 色
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    [dictionary setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:string attributes:dictionary];

    // Font
    [attributedString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Helvetica-Bold" size:30.0f] range:NSMakeRange(0, string.length)];
    [attributedString addAttribute:NSStrokeColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, string.length)];
    [attributedString addAttribute:NSStrokeWidthAttributeName value:[NSNumber numberWithFloat:3.0] range:NSMakeRange(0, string.length)];
    _refreshControl.attributedTitle = attributedString;

    [self.scrollView addSubview:_refreshControl];
    self.scrollView.contentSize = CGSizeMake(320, 2000);
}

リフレッシュが起動したときのタイミングでこのメソッドが呼ばれます。

- (void)refresh:(id)sender {
    [NSTimer scheduledTimerWithTimeInterval:1.f target:self selector:@selector(endRefresh) userInfo:nil repeats:NO];
}

んで、何かリクエストして、そのコールバックあたりで以下を呼び出せばいいのではないでしょうか。

- (void)endRefresh {
    [_refreshControl endRefreshing];
}

簡単ですね!

関連リンク

iPhoneプログラミングUIKit詳解リファレンス
所 友太
リックテレコム
売り上げランキング: 13490

iPhoneアプリをAdHocアプリとして配布するのは実は超絶簡単だった

はじめ、
Xcode4でのAdHocアプリ(ipa)の作成方法詳解 – iPhoneアプリ開発まっしぐら★ – iPhoneアプリ開発グループ
こちらの記事を参考にしてやっていたのですが、すぐに
じつはもっと簡単なAdHocアプリ(ipa)の作成方法があった件… for Xcode4 – iPhoneアプリ開発まっしぐら★ – iPhoneアプリ開発グループ
こちらの記事を見て、すごく簡単ということでここにもメモしておきます。

事前に、

  • Distribution用のプロビジョニングファイル
  • プロビジョニングファイルを作った人のMac上で作られた秘密鍵ファイル(証明書.p12)

をMacにインストールしておく。

  1. XCodeのOrganizerを開きます
  2. Archivesを開きます
  3. Distributeボタンを押す
  4. Save for Enterprise or Ad-Hoc Deploymentにチェックを入れる
  5. Code Signing IdentityにDistribution用のプロビジョニングファイルをを選択する
  6. ipaファイルの保存場所を決める

これだけ。
プロビジョニングファイルをこちら側で用意できない場合はこの方法が使えます。

iPhoneアプリ開発塾
iPhoneアプリ開発塾
posted with amazlet at 12.10.29
カワサキ タカシ
技術評論社
売り上げランキング: 2513