2014/09/30

[iOS][Objective-C]dyld: Symbol not found: _UITransitionContextFromViewControllerKey

Xcode6でコンパイルまでは無事に通ったのですが、iOS6で実機確認すると、

dyld: Symbol not found: _UITransitionContextFromViewControllerKey
みたいなエラーが発生して、超てんぱってしまった。

原因は、わからないのだが、ライブラリを最新にして、ターゲットのビルドパスを適切なものに設定したら治ったのだが、今後も同じようなことが発生した場合に見返せるように、1エントリー。

2014/09/29

[iOS][Objective-C][iOS7]toolbarの背景色を変更する

iOS7以降のフラットデザインに対してtoolbarの色を変更するにはどうすればいいのだろうか?

ずばり下のように組めばおkみたい。

[UIToolbar appearance].barTintColor = [UIColor whiteColor];
ちなみに、これはiOS7以降で使えるので、iOS6では適用できないので、注意が必要。

2014/09/28

[iOS][Objective-C]ld: warning: directory not found for option

コンパイルするときに、

ld: warning: directory not found for option "〜"
というエラーが発生して、これ原因なにかなーっと調べていたら、ちょーど同じことに悩んでた方を発見。

[iOS][エラー]ld: warning: directory not found for option "~~~"

どうやら原因は、ターゲットの「Search Paths」の「Framework Search Paths」で余計なパスが入っていたために発生していたようだ。

確かに、
"$(SRCROOT)/アプリ名"
っていうところを削除したらエラーがとれた。

2014/09/27

[iOS][Objective-C]最新のGoogle Analytics iOS SDKについて一言

Xcodeが最新の6になって、各プログラムを最新にしようとしたところ、Google Analytics iOS SDKでリンクエラーが多発。

なぜかなーっと思って調べてみると、どうやら

iOS アプリに Google Analytics を導入する(2014/08 時点)

を読むと、「libGoogleAnalyticsServices.a」がないために発生していたようだ。

これマニュアルを読むとインストールしろって書いてなかったじゃん!!

すんごい悩みましたー。

2014/09/26

[iOS][Objective-C]SVWebViewController

自前でWebViewを開くプログラムを組むのがめんどくさくなってきたので、オープンソースを利用することに。
SVWebViewControllerを使えばめちゃくちゃ簡単に実装することができる。

具体的には、下のように組めばおk

SVWebViewController *webViewController = [[SVWebViewController alloc] initWithAddress:@"https://m.facebook.com/lovenailapp"];
webViewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:webViewController animated:YES];
ちなみに、上のようにhidesBottomBarWhenPushedプロパティをYESに設定すれば画面遷移の時に、tabbarを隠すこともできる。

インストール方法も、SVWebViewController/SVWebViewControllerをドラッグして
#import "SVWebViewController.h"
と書けばいいだけなので、めちゃおススメです。

2014/09/25

[本]スケーラブルWebサイト

スケーラブルWebサイト
Cal Henderson
オライリー・ジャパン
売り上げランキング: 126,649

訳者まえがき
まえがき

1章 はじめに
1.1 ウェブアプリケーションとは?
1.2 ウェブアプリケーションの構築法
1.3 アーキテクチャとは?
1.4 どう始めるか

2章 ウェブアプリケーションのアーキテクチャ
2.1 階層化されたソフトウェアアーキテクチャ
2.2 階層化技術
2.3 ソフトウェアインタフェースの設計
2.4 A地点からB地点へ
2.5 ソフトウェアとハードウェアの分離
2.6 ハードウェアプラットフォーム
2.6.1 共有ハードウェア
2.6.2 専用ハードウェア
2.6.3 コロケーション
2.6.4 セルフホスティング
2.7 ハードウェアプラットフォームの成長
2.7.1 入手可能性と調達期間
2.7.2 輸入、出荷、設置
2.7.3 場所
2.7.4 電源
2.7.5 ネットワークオペレーションセンター(NOC)
2.7.6 接続性
2.8 ハードウェア冗長性
2.9 ネットワーキング
2.10 言語、技術、データベース

3章 開発環境
3.1 3つのルール
3.2 ソース管理の実施
3.2.1 ソース管理とは何か?
3.2.2 ユーティリティ
3.2.3 ソース管理製品
3.2.4 ソース管理に入れるべきもの
3.2.5 ソース管理に入れるべきでないもの
3.3 ワンステップビルド
3.3.1 サイトの直接編集
3.3.2 作業環境の構築
3.3.3 リリース過程のまとめ
3.3.4 ビルドツール
3.3.5 リリース管理
3.3.6 自動化すべきでないもの
3.4 問題追跡管理
3.4.1 最低限の機能
3.4.2 問題追跡管理ソフトウェア
3.4.3 何を追跡管理すべきか
3.4.4 問題管理戦略
3.4.5 CADT
3.5 開発モデルの大規模化
3.6 コーディング規準
3.7 テスト
3.7.1 リグレッションテスト(回帰テスト)
3.7.2 手動テスト

4章 国際化とローカライゼーションとUnicode
4.1 国際化とローカライゼーション
4.1.1 ウェブアプリケーションの国際化
4.1.2 ウェブアプリケーションのローカライゼーション
4.2 Unicodeの概要
4.3 UTF-8エンコーディング
4.4 UTF-8ウェブアプリケーション
4.4.1 出力の制御
4.4.2 入力の制御
4.5 PHPでUTF-8を使う
4.6 他の言語でUTF-8を使う
4.7 MySQLでUTF-8を使う
4.8 電子メールでUTF-8を使う
4.9 JavaScriptでUTF-8を使う
4.10 APIでUTF-8を使う

5章 データの一貫性とセキュリティ
5.1 データ一貫性ポリシー
5.2 良好、正当、不正
5.3 UTF-8のフィルタリング
5.4 制御文字のフィルタリング
5.5 HTMLのフィルタリング
5.5.1 なぜHTMLを使うのか?
5.5.2 HTML入力のフィルタリング
5.5.3 ブラックリストとホワイトリスト
5.5.4 開始タグと終了タグの対応づけ
5.5.5 HTMLの処理
5.6 クロスサイトスクリプティング(XSS)
5.6.1 正規の抜け穴
5.6.2 ユーザー入力に関するセキュリティホール
5.6.3 タグと括弧の対応づけ
5.6.4 プロトコルフィルタリング
5.7 SQLインジェクション攻撃
5.7.1 SQLインジェクション攻撃の対策
5.7.2 SQLインジェクション攻撃の防止

6章 電子メール
6.1 メールの受信
6.1.1 ファイルのアップロード
6.1.2 モバイルブログ
6.1.3 追跡機能のサポート
6.1.4 単純な自動化とAPI
6.2 電子メール機能のアプリケーションへの組み込み
6.2.1 別のアプローチ
6.3 MIMEフォーマット
6.4 単純なMIMEメールの解析
6.5 UUエンコードされた添付ファイルの解析
6.6 TNEF添付ファイル
6.7 携帯電話
6.8 文字セットとエンコーディング
6.9 ユーザーの認識
6.10 単体テスト

7章 リモートサービス
7.1 リモートサービスの掟
7.2 ソケット
7.3 HTTPの利用
7.3.1 HTTPの要求と応答のサイクル
7.3.2 HTTP認証
7.3.3 HTTPリクエストの生成
7.4 リモートサービスの冗長性
7.5 非同期のシステム
7.6 XMLによる情報交換
7.6.1 XMLの解析
7.6.2 REST
7.6.3 XML-RPC
7.6.4 SOAP
7.7 ライトウェイトプロトコル
7.7.1 メモリ使用量
7.7.2 ネットワーク速度
7.7.3 解析の速度
7.7.4 書き込み速度
7.7.5 欠点
7.7.6 ソースからシステムを作る

8章 ボトルネック
8.1 ボトルネックの特定
8.1.1 ソフトウェアコンポーネントによる分割
8.1.2 ハードウェアコンポーネントによる分割
8.2 CPU使用率
8.2.1 コードのプロファイリング
8.2.2 Opcodeキャッシング
8.2.3 テンプレート処理の高速化
8.2.4 一般的な解決方法
8.3 I/O
8.3.1 ディスクI/O
8.3.2 ネットワークI/O
8.3.3 メモリI/O
8.4 メモリとスワッピング
8.5 外部サービスとブラックボックス
8.6 データベース
8.6.1 クエリのスポットチェック
8.6.2 クエリのプロファイリング
8.6.3 クエリとインデックスの最適化
8.6.4 キャッシング
8.6.5 非正規化

9章 ウェブアプリケーションのスケーリング
9.1 スケーリングにまつわる神話
9.1.1 スケーラビリティとは?
9.1.2 ハードウェアプラットフォームのスケーリング
9.1.3 垂直方向のスケーリング
9.1.4 水平方向のスケーリング
9.1.5 継続作業
9.1.6 冗長性
9.2 ネットワークのスケーリング
9.3 PHPのスケーリング
9.4 ロードバランシング(負荷分散)
9.4.1 ハードウェアを使ったロードバランシング
9.4.2 ソフトウェアによるロードバランシング
9.4.3 レイヤ4
9.4.4 レイヤ7
9.4.5 きわめて大規模なバランシング
9.4.6 非HTTPのトラフィックのバランシング
9.5 MySQLのスケーリング
9.5.1 ストレージバックエンド
9.5.2 MyISAM
9.5.3 InnoDB
9.5.4 BDB
9.5.5 ヒープ
9.6 MySQLのレプリケーション
9.6.1 マスタ/スレーブのレプリケーション
9.6.2 ツリーレプリケーション
9.6.3 マスタ/マスタレプリケーション
9.6.4 レプリケーションの失敗
9.6.5 レプリケーションのタイムラグ
9.7 データベースの分割
9.7.1 クラスタリング
9.7.2 フェデレーション(連携)
9.8 大規模なデータベースのスケーリング
9.9 ストレージのスケーリング
9.9.1 ファイルシステム
9.9.2 プロトコル
9.9.3 RAID
9.9.4 フェデレーション(連係)
9.10 キャッシング
9.10.1 データのキャッシング
9.10.2 HTTPリクエストのキャッシング
9.11 スケーリングのまとめ

10章 統計、監視、警告
10.1 ウェブ統計の追跡
10.1.1 サーバログファイル
10.1.2 分析
10.1.3 ビーコンの使用
10.1.4 Spread
10.1.5 ロードバランサ
10.1.6 カスタマイズされたメトリックの追跡
10.2 アプリケーションの監視
10.2.1 バンド幅の監視
10.2.2 長期的なシステム統計
10.2.3 視覚化のカスタマイズ
10.3 警告
10.3.1 稼働時間のチェック
10.3.2 リソースレベルの監視
10.3.3 閾値のチェック
10.3.4 下限値のチェック

11章 API
11.1 データフィード
11.1.1 RSS
11.1.2 RDF
11.1.3 Atom
11.1.4 その他
11.1.5 フィードの自動検知
11.1.6 フィードのテンプレート
11.1.7 OPML
11.1.8 フィードの認証
11.2 モバイルコンテンツ
11.3 ウェブサービス
11.4 APIトランスポート
11.4.1 REST
11.4.2 XML-RPC
11.4.3 SOAP
11.4.4 トランスポートの抽象化
11.5 APIの乱用
11.5.1 APIキーによる監視
11.5.2 スロットリング
11.5.3 キャッシング
11.6 認証
11.6.1 認証なし
11.6.2 プレーンテキスト
11.6.3 MAC
11.6.4 トークンベースのシステム
11.7 将来

索引

via:目次
4年前に頂いた本をようやく読むことができた。

Unicodeの概念は相当勉強になった。

ただ、cloud全盛期となった今となってはだいぶ内容が古くなってしまっていることは否めない。

cloud版かつモバイルアプリケーションのスケーラビリティを考慮した書籍が今後、求められるのかなと。

2014/09/24

[mac os x][mavericks]eclipseが起動できない

昨日、jdkのインストール方法について書いたが、その後、eclipseを入れたら、下のように警告がでて、起動できない。
 photo eclipse_mac_os_x_01_zps28ea8133.png
なぜかなーっと思っていたら、どうやらセキュリティ関連らしく、システム環境設定の「セキュリティとプライバシー」で、「このまま開く」というボタンを押せば起動できた。
 photo eclipse_mac_os_x_02_zpsd4bb600c.png

2014/09/23

[mac os x][Mavericks]JDK6をインストール

何故か、MavericksでJava 6が発見できなかったので、インストールしてみることに。

で、方法は、jdk 6 on mountain lionを読みながらインストールを行った。

Downloads for Apple DevelopersページでJavaと検索する。

Java for OS X 2013-005 Developer Packageを選択して、java_for_os_x_2013005_dp__11m4609.dmgファイルをダウンロードする。

java_for_os_x_2013005_dp__11m4609.dmgをダブルクリックする。
 photo jdk6_mac_apple_01_zps700598d5.png
JavaDeveloper.pkgをダブルクリックする。
 photo jdk6_mac_apple_02_zps44636f09.png
「続ける」ボタンを押す
 photo jdk6_mac_apple_03_zps8c174b2c.png
「続ける」ボタンを押す
 photo jdk6_mac_apple_04_zps430ab3b3.png
「続ける」ボタンを押す
 photo jdk6_mac_apple_05_zpscb8807d0.png
「同意する」ボタンを押す
 photo jdk6_mac_apple_06_zps22fad1c8.png
「インストール」ボタンを押す
 photo jdk6_mac_apple_07_zpsa4f79a29.png
インストールされるまで待つ
 photo jdk6_mac_apple_08_zpsa0c5a755.png
「閉じる」ボタンを押してインストール完了。
 photo jdk6_mac_apple_09_zps4a2fd25a.png
インストールができたかどうかの確認は、ターミナルで

java -version
と打って
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609)
とでればおk

2014/09/22

[jQuery]tagを付与してくれるtagsInputプラグイン

タグを自動で実装してくれるtagsInputプラグインというものを同僚から教えてもらったので、使い方の勉強。

使い方は超簡単。

<link href="./jquery.tagsinput.css" media="all" rel="stylesheet" type="text/css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="./jquery.tagsinput.min.js"></script>
上記のscriptとstyleをインクルード。

HTMLは、下記の1行。
<input name="tags" id="tags" value="" />
init時のscriptは下のようにすればおk
jQuery(function($){
  var $tags = $('#tags');
  $tags.tagsInput({
    'onAddTag':function(e){
    },
    'onRemoveTag':function(e){
    },
    'onChange' : function(e){
    },
    'defaultText':'テキストを入力してください',
    'maxChars':20
  });
});
defaultText:パラメータでタグが入力されていないときの文言を設定
maxChars:1タグ当たりの最大文字数
onAddTag:tagが追加された時に呼び出されるコールバック関数
onRemoveTag:tagが削除された時に呼び出されるコールバック関数
onChange:tagに変化があった時に呼び出されるコールバック関数

ちなみに、
$('#tags').addTag('foo');
でtagを動的に追加したり、
$('#tags').removeTag('foo');
で削除することができる。

ちなみに、上で動的に設定した場合も、コールバックは呼ばれるので注意したい。

2014/09/21

[Xcode6][Objective-C]MWPhotoBrowserが不具合を起こす件

Xcode6にしたらなぜかMWPhotoBrowserが不具合を起こしてしまう。

おそらくSDWebImageを最新にしたからだと思うのだが、Pullリクエストに

_webImageOperation = [manager downloadImageWithURL:_photoURL options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                    [self fetchImageProgressWithReceivedSize:receivedSize expectedSize:expectedSize];
                } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
                    if (error) {
                        MWLog(@"SDWebImage failed to download image: %@", error);
                    }
                    _webImageOperation = nil;
                    self.underlyingImage = image;
                    [self imageLoadingComplete];
                }];
にしてほしいと書いてあったので、コールバックの部分を
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
にしたらなおった、一見落着、落着。