バッファロー製ルータへWifi接続している他の端末へIPアドレス指定で繋がらない時 (バッファローは糞)
[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初期設定でやったこと
初期設定
接続
パスワード変更
- passwd
更新
- yum update
ユーザの追加
- useradd xxx
- passwd xxx
ユーザをwheelグループに追加
- usermod -G wheel xxx
wheelグループがsudoコマンドを使えるように
visudo
# %wheel ALL=(ALL) ALL
↓
%wheel ALL=(ALL) ALL
鍵認証
公開鍵を入れるディレクトリ作成
鍵の生成 (ローカル側で)
公開鍵の転送
ログインの確認
SSHの設定
ファイルのバックアップ
ポート番号の変更
#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
[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
[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
[Node.js] 独自の Session Store を CoffeeScript で実装する
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