UITextViewあれこれ

UITextViewの実装でいろいろ試してみたのでのでメモ

  キーボード表示

遷移時にbecomeFirstResponder/textViewShouldEndEditing を使用すればキーボード編集開始/終了でデリゲートが呼ばれるはずなのに呼ばれない。。。
いろいろ試してみたら、addSubviewした後にbecomeFirstResponderすることでキーボードが表示された。
こんな感じ。

CGRect rect = CGRectMake(0, 0, 250, 50);
UITextView* textView UITextViewalloc] initWithFrame:rect];
textView.delegate = self;

[hogeViewController.view addSubview:textView];
[textView becomeFirstResponder];                // キーボードを表示

続いてデリゲートメソッドはこんな感じ。戻り値をNOにすると呼ばれなくなるので注意。

- (BOOL) textViewShouldBeginEditing: (UITextView*) textView
{
    // 編集開始時の処理

    return YES;
}

-(BOOL)textViewShouldEndEditing:(UITextView *)text
{
     // 編集終了時の処理
 
    return YES;
}

 

  テキストエリアを枠線&角丸にする

デフォルトのテキストエリアだとかなり悲しい感じなので枠線を付けて角丸にしてみます。

// 枠線
textView.layer.borderWidth = 1;
textView.layer.borderColor = [[UIColorblackColor] CGColor];
// 角丸
textView.layer.cornerRadius = 5;

layerを使用するために、QuartzCore.h のimportを忘れずに。
UITextViewってなんか扱いにくいなぁ。

objective-Cでの型変換

あんまり用途がないかなって思っていたけど、使う機会が何回かあったのでいくつかメモしておきます。

  NSString* から char*への変換

NSString* str = "hoge";
char* ch = [str UTF8String];

  char* から NSString*への変換

char* ch = "hoge";
NSString* str = [NSString stringWithCString:ch encoding:NSUTF8StringEncoding];

  NSString から int への変換

int value = [ @"123" intValue ]; 

※floatやdoubleに関しても同様にできるよ。

  int から NSString* への変換

NSString* value_str; 
value_str = [ NSString stringWithFormat : @"%d", 123 ];

Xcode4.5でopenFrameworksをビルド

Xcode4.5にあげて、oFをビルドしたら今までの作ったのものビルドが通らなくなった。。
設定を変更するだけで、問題なくビルド出来たのでメモとして残しておきます。

【環境】
Xcode4.5
openFrameworks007(古くてごめんなさい)
Target iOS6

①プロジェクトを開いて、「TARGETS」を選択し、「Build Setting」タブをクリック
②「Architectures」と「Valid Architectures」を「armv7, armv7s」から「armv7」に変更する

これで後はCleanしてBuildで問題なくビルドが通りました。

Xcodeのバージョンがあがるたびにドキドキする。

Firefox OSを試してみたよ。

Firefox OSがWin/Mac/Linuxに入れるみたいだから入れてみたよ。
【環境】
 OS : Ubuntu 12.04

インストールは簡単でここからタウンロードする。

タウンロードしたら適当なフォルダに格納して解凍する。

$ tar Icvf b2g-18.0a1.en-US.linux-i686.tar.bz2

解凍先のb2gディレクトリ移動して、gitからGaiaをチェックアウトする。

$ cd ~/b2g
$ git clone git://github.com/mozilla-b2g/gaia

次にプロファイルの作成します。ちょっと時間がかかるので辛抱強く待つ。

$ make -C gaia profile

プロファイルを指定してb2gを起動する。これでGaia UIが起動する。

$ ./b2g -profile gaia/profile

こんな感じ。

メモ(chkconfigのランレベル)

いつもchkconfigのランレベルを忘れちゃうのでメモを。

ランレベル  モード
  0     システムの停止モード
  1     シングルユーザモード
  2     マルチユーザモード(ネットワークなし)
  3     マルチユーザモード(テキストログイン)
  4     カスタムモード(未使用)
  5     マルチユーザモード(グラフィカルログイン)
  6     システムの再起動モード

ちなみにサービスを個別に指定する場合は以下のとおり。

$ chkconfig –level 3 サービス名 on

確認

$ chkconfig –list サービス名
サービス名 0:off 1:off 2:on 3:on 4:on 5:on 6:off
$

iptablesの設定

apacheの設定に続いて、iptablesの設定も書いときます。

まずはファイルが無いので作成する

$ sudo vi /etc/sysconfig/iptables

開いたら以下を書いて閉じる。
※可読性をよくするためにスペースを入れるけど、実際に書く時はスペースなしで。

*filter
#このホストに対して入ってくるパケットを通過させるか遮断させるかを設定
#すべてのパケットを許可([0:0] : 「パケットカウンタ:バイトカウンタ」)
:INPUT ACCEPT [0:0]					
 
#このホストを経由するパケットに対しての設定
:FORWARD ACCEPT [0:0]				
 
#このホストから送られるパケットに対する設定
:OUTPUT ACCEPT [0:0]
 
# ユーザ定義チェーン
:RH-Firewall-1-INPUT - [0:0]
 
#「-j」オプション:あるチェインを別チェインにジャンプさせる.
# ここではINPUTチェインを、ユーザー定義チェインにジャンプさせることで、INPUTとFORWARDチェインで入ってくるパケットをユーザー定義チェインでチェックさせる。
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
 
# ループバック(lo)は通信を許可する。
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
 
# pingで疎通確認したいからICMPも通信を許可する。
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
 
#「-p」に続けて番号を入力することで、プロトコルを指定
# 50(ESP)と51(AH)を許可
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
 
#「5353」:マルチキャストDNS
# これは専用のアドレス「224.0.0.251」にパケットを投げて応答をもらうことで、
# わざわざIPアドレスとホスト名の変換を行わなくてもマシンを認識できる仕組み。
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
 
# ポート「631」は印刷データの送受信のためのプロトコルで、これも「ACCEPT」で許可。
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
 
# この「state」はパケットの状態を指定するためのモジュール。
# 今回は「ESTABLISHED(過去に接続されたことがある)」または「RELATED(既存の接続に関係している)」と
# 見なされた場合に、接続を許可する。
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
#「-m tcp」でtcpモジュールを有効にした後に、「-p tcp」でプロトコルがtcpの場合に限定する。
# SSH, HTTP, FTP1, FTP2, MYSQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
 
# 接続許可のルールに一致しなかったパケット。
# それらのパケットはすべて「REJECT(エラーパケット送信)」します。
#「–reject–with」はエラーパケットの種類を指定するためのもので、
# 今回は「icmp-host-prohibited(ホストによって禁止されました)」というメッセージを送るように指定しています。
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

設定が完了したらiptablesを再起動させます。

$ sudo /etc/rc.d/init.d/iptables restart

Apacheの設定

最近、Apacheの設定について何度か聞かれたので、ちょっとだけ書いときます。
時間があるときに追加していくようにします。

Apacheの設定ファイルを開く

$ sudo vi /etc/httpd/conf/httpd.conf

Linuxのディストリビューションによっては /usr/local/apache/conf/httpd.conf かも。

■ 基本的なセキュリティ
・ServerTokensディレクティブ
ServerTokensは、クライアントに返信するサーバ応答ヘッダに含める情報を制御します。
デフォルトのままだと、応答ヘッダに「Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2」みたいにApacheやPHPのバージョンが
見えてしまうので、下記のように変更することで「Server: Apache」とでるように変更する。

#ServerTokens FULL
ServerTokens Prod // こっちに変更

することで「Server: Apache」になります。

・ServerSignatureディレクティブ
エラーメッセージ出力時にフッタを表示しないようにします。

#ServerSignature On
ServerSignature Off // こっちに変更

編集内容にエラーがないかチェック

sudo service httpd configtest

編集に問題がなさそうならapacheの再起動

sudo /sbin/service httpd restart

あとはディレクトリ毎に.htaccessの設定する感じかなと。

ubuntu12.04 にmeteor.jsを入れてみた

ubuntuにmeteor.jsを入れてみました。
【環境】
Ubuntu12.04

meteor.jsはjavascritptによるWebアプリのフレームワーク。
クライアントサイドJS(ブラウザで動くJS)やサーバーサイドJS(Node.jsとか)ではなく、
その両方で動く(Isomorphicな)フレームワークです。

まずは、インストール用のスクリプトを叩く

$ wget install.meteor.com
$ sudo sh index.html

これでインストールは完了。パッケージはdebパッケージでインストールしてくれる。
インストールされた内容は以下でチェックできる。

$ dpkg –listfiles meteor

ここまでで環境構築完了。

次にに、サンプルアプリケーションを作ってみる。
/usr/lib/meteor/examples/ 配下にサンプルがインストールされてる。

$ ls
todos wordplay leaderbord

ここではtodos 展開する。適当なディレクトリで以下のコマンドを叩く

$ meteor create –example todos
todos: created.
 
To run your new app:
cd todos
meteor

これで、叩いた場所に todosディレクトリが作られる。
それでは実行。

$ cd todos
$ meteor
[[[[[ ~/todos ]]]]]
 
Running on: http://localhost:3000/
///////////////////////////////////////////////
///////////////////////////////////////////////
 
meteor is out of date. Please run;
 
meteor update
 
///////////////////////////////////////////////
///////////////////////////////////////////////

これで、http://localhost:3000 にアクセスするとtodo管理アプリできている。

次に実際に、プロジェクトを作成してみる

$ meteor create firstApp
firstApp: created.
 
To run your new app:
cd firstApp
meteor

すると、firstAppディレクトリ配下に以下のファイルが出来ているので、好きなようにいじるだけ。

$ ls
firstApp.css firstApp.html firstApp.js

とりあえずは何か作ってみよう。

メモ(鍵とか証明書とか)

iOSでのPush通知(Provider側)を実装するのにいろいろ証明書やら鍵を作成するので
その時に調べた内容をメモしておきます。

まずは鍵と証明書の種類について
 .key : 秘密鍵(Private Key)
 .csr : 証明書発行要求(CSR : Certificate Signing Request)
 .crt : 証明書(CRT : Certificate)
 .crl : 証明書失効リスト(CRL : Certification Revocation List)

これらには、DER(Distinguished Encoding Rules)形式 と PEM(Privacy Enhanced Mail)形式がある。PEM形式は、DER形式(バイナリ)をBASE64で可視化したもの。
これを踏まえてProviderにインストールするSSL証明書と鍵を作成する。
apns-dev-cert.p12 : 証明書から作成したもの
apns-dev-key.p12 : 秘密鍵から作成したもの

① PKCS #12 ファイルapns-dev-cert.p12 から SSLサーバ証明書(EV SSL証明書)を取り出し、apns-dev-cert.pemに保存

$ openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12

② PKCS #12 ファイルapns-dev-key.p12 から秘密鍵を取り出し、暗号化せずにapns-dev-key.pem に保存

$ openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12

③ Apache で ssl を使用する場合、起動時に秘密鍵のパスワードを聞いてくるので,途中でとまってしまいます。
server.key を復号化して、パスワードを入力しなくても秘密鍵を使用できるようする。

$ openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem

④ apns-dev-cert.pem と apns-dev-key-noenc.pemを連結してapns-dev.pemに吐き出す

$ cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem

apns-dev-key-noenc.pem, apns-dev.pem をサーバの適切な場所へ放りこんでおく。

Push通知は実装以上にこの辺が面倒だな。

メモ(mac の ifconfig)

mac(Lion)でターミナルからifconfigを叩いたときに、こんな感じにEthのIPアドレス以外にいろいろ出るけどちゃんと調べてみました。

$ ifconfig
lo0: flags=8049 mtu 16384
     options=3
     inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
     inet 127.0.0.1 netmask 0xff000000
     inet6 ::1 prefixlen 128
gif0: flags=8010 mtu 1280
stf0: flags=0<> mtu 1280
en1: flags=8823 mtu 1500
     ether xx:xx:xx:xx:xx:xx
     media: autoselect ()
     status: inactive
p2p0: flags=8802 mtu 2304
     ether xx:xx:xx:xx:xx:xx
     media: autoselect
     status: inactive
fw0: flags=8863 mtu 4078
     lladdr xx:xx:xx:xx:xx:xx:xx:xx
     media: autoselect
     status: inactive
en0: flags=8863 mtu 1500
     options=2b
     ether xx:xx:xx:xx:xx:xx
     inet6 xxxx::xxxx:xxxx:xxxx:xxxx%en0 prefixlen 64 scopeid 0x7
     inet 192.168.xx.xx netmask 0xffffff00 broadcast 192.168.xx.255
     media: autoselect (1000baseT )
     status: active

lo0 : ローカルループバック
gif0:トンネルデバイス
en0 : Ethernet
en1 : Air Mac
stf0: ipv6用
fw0 : FireWire
p2p0: Air Drop

p2p0 は AirDrop用だからLionから登場。