MD Blog

誰かの何かに役に立てることを書いていきたいです

バッファロー製ルータへWifi接続している他の端末へIPアドレス指定で繋がらない時 (バッファローは糞)

Node.jsで立てたローカルサーバへ、iPhoneからアクセスしようとしたのですが繋がらずハマりました。

Safariに接続先「192.168.11.xx:xxxx」を入力してアクセスしようとするものの、何も表示されず。

しばらくレスポンスを待っているようなので接続先が全く見えていないわけではなさそうなのですが、思い当たることが何もないので頭を抱えていました。

結局、以下のブログにあるように、ルータの「プライバシーセパレーター」設定をオンにした後、またオフにすると繋がりました。

http://blog.takepan.jp/?p=169

本当に助かりました。

[iOS] xibファイルで作成したviewを、storyboardに配置する方法

複数のstoryboard上で共通したカスタムviewを使いたいとき、それぞれのstoryboardで同じ画面を設計するのは面倒なので、カスタムviewを1つのxibファイルで設計してそれを使いまわしたいことがあると思います。

その場合、xibファイルで作成したviewをstoryboardに直接配置できると便利なのですが、これをするには少し工夫が必要です。

viewクラスからxibファイルを読み込む

クラスファイルに以下を記述します。

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        if (!self.subviews.count) {
            UIView *subview = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil][0];
            subview.frame = self.bounds;
            [self addSubview:subview];
        }
    }
    return self;
}

storyboardからviewクラスを読み込むとinitWithCoderメソッドが呼ばれます。 initWithCoderメソッドの中でxibファイルを読み込もうとすると、再びinitWithCoderメソッドが呼ばれてしまい循環参照になってしまいます。 これを回避するために一工夫が必要になります。

※xib上で、読み込むviewの上に何かを配置しておく必要があります。 何も配置しないと、 if (!self.subviews.count) の判定を通ってしまい無限ループします。

storyboardにviewを配置する

storyboard上でUIViewを配置します。 そのUIViewのClassを上記のviewクラスに指定します。

References

objective c - Infinite loop when overriding initWithCoder - Stack Overflow

[iOS] Storyboardで Prototype Cells を使うと、cellの生成にinitWithStyle:reuseIdentifier:メソッドは必要ない

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"XXX"];

だけ書けば、cellが自動的に生成されます。

References

iphone - dequeueReusableCellWithIdentifier returns nil using storyboard static cells - Stack Overflow Table View Programming Guide for iOS: A Closer Look at Table View Cells

さくらVPS初期設定でやったこと

初期設定

接続

  • VPSコントロールパネルからサーバを起動
  • ssh root@xxx.xxx.xxx.xxx で接続
    • 最初接続できなかったが、ping送ったらできるようになった

パスワード変更

  • passwd

更新

ユーザの追加

  • useradd xxx
  • passwd xxx

ユーザをwheelグループに追加

  • usermod -G wheel xxx

wheelグループがsudoコマンドを使えるように

  • visudo

    # %wheel  ALL=(ALL)       ALL
    

    %wheel  ALL=(ALL)       ALL 
    

鍵認証

公開鍵を入れるディレクトリ作成

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh

鍵の生成 (ローカル側で)

公開鍵の転送

  • scp ~/.ssh/id_rsa.pub xxx@xxx.xxx.xxx.xxx:~/.ssh/authorized_keys

ログインの確認

  • ssh xxx@xxx.xxx.xxx.xxx (ssh -i ~/.ssh/id_rsa xxx@xxx.xxx.xxx.xxx と同じ意味)

SSHの設定

ファイルのバックアップ

  • cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org

ポート番号の変更

#Port 22

Port xxxxx

パスワードログインの変更

PasswordAuthentication yes

PasswordAuthentication no

rootログインの禁止

#PermitRootLogin yes

PermitRootLogin no

ログインの確認

  • service sshd restart
  • ssh -p 54322 xxx@xxx.xxx.xxx.xxx

ファイアウォールの設定

iptablesの設定

  • vim /etc/sysconfig/iptables

    *filter
     :INPUT DROP [0:0]
     :FORWARD DROP [0:0]
     :OUTPUT ACCEPT [0:0]
     -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
     -A INPUT -p icmp -j ACCEPT
     -A INPUT -i lo -j ACCEPT
     -A INPUT -m state --state NEW -m tcp -p tcp --dport 54322 -j ACCEPT
     -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
     -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
     COMMIT 
    
  • service iptables start

iptablesの確認

  • iptables -L

References

さくらのVPS入門 (全21回) - プログラミングならドットインストール

[iOS] クラッシュログをsymbolicateする

atosコマンドがうまくいかなかったので別の方法で。

前提条件

  • アプリの審査でリジェクトされる
  • iTunes Connect の Resolution Center 上でReviewerからクラッシュログを受け取る

方法

  • XcodeのOrganizer上で、Submitしたファイルの項目を右クリック
  • ファイルが存在するFinderに移動
  • アーカイブファイルを右クリックして「Show Package Contents」を選択
  • .dSYMファイルと.appファイルを探して、適当なフォルダにコピー
  • クラッシュログもそのフォルダへ入れる
  • 以下のどちらかのフォルダから "symbolicatecrash" ファイルを探してコピーしてそれもそのフォルダへ入れる

    "Contents->Developer->Platforms->iPhoneOS.platform->Developer->Library->PrivateFrameworks->DTDeviceKit.framework->Versions->A->Resources"

    "Contents->Developer->Platforms->iPhoneOS.platform->Developer->Library->PrivateFrameworks->DTDeviceKitBase.framework->Versions->A->Resources"

  • ターミナルを起動してそのフォルダへ移動

  • export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
  • ./symbolicatecrash MyApp_xxx.crash MyApp.app.dSYM

References

Symbolicating iPhone App Crash Reports - Stack Overflow

[iOS 7] iOS 7 独特のアニメーションを実装する

iOS 7 から UIActionSheet や UIAlertView などが表示される際のアニメーションが変更されました。新しいアニメーションではアニメーション終了前に動きが極端に減速し、ふわっとした軽快な印象を与えます。

これを独自に実装しようとした場合に、UIView のアニメーションメソッドの options に UIViewAnimationOptions のどの値を設定しても再現しません。

その代わりに options に (7 << 16) を指定するとうまくいきました。

審査に通るかどうかは分かりませんので自己責任で。 審査に通りました。

[UIView animateWithDuration:0.2
                          delay:0
                        options:(7 << 16)
                     animations:^{
                        // animation
                     }
                     completion:^(BOOL finished) {
                     }];

追記

animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:

メソッドで実現できました。

References

uikeyboard - UIKeyboardWillChangeFrameNotification UIViewAnimationCurve set to 7 on iOS 7 - Stack Overflow

[Node.js] 独自の Session Store を CoffeeScript で実装する

#building

app.coffee

SessionStore = require('./SessionStore')

# ...

app.use express.session(
  secret: 'keyboard cat',
  cookie:
    maxAge: 3600000 # 1 hour
  store: new SessionStore
)

SessionStore.coffee

express = require('express')

class SessionStore extends express.session.Store
  get: (sid, callback) ->
    # DBからsessionを取得
    callback null, JSON.parse(session)

  set: (sid, session, callback) ->
    # DBにJSON.stringify(session)を格納
    callback err

  destroy: (sid, callback) ->
    # sidをキーにDBからsessionを削除
    callback null

module.exports = SessionStore

Preferences