Updates

sinatraサーバーをchkconfigで自動起動

sinataraサーバーをEC2の起動時に自動的に起動して、
さらにTwitterのStreaming APIを監視するRubyプログラムも同時起動するのに一苦労。

– chkconfigで起動するシェル (td_aircon) を作成

$sudo su
# cd /etc/init.d/
# touch td_aircon
# chmod 755 td_aircon
# vim td_aircon

td_airconの内容

#!/bin/sh
# chkconfig: 2345 99 10
# description: launch TD_AIRCON sinatra server

export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

cd /home/ec2-user/aircon/aircon-api/
thin start -C thin.yml
ruby tweet_checker.rb

今回は、thinを使ってsinatraサーバーを起動するので、以下のファイルを作る。

$ cd ~/aircon/aircon-api/
$ touch config.ru
$ vim config.ru

config.ruの中身

require 'rubygems'
require 'sinatra'

require File.expand_path "app", File.dirname(__FILE__)
run Sinatra::Application

thinの設定ファイルをつくる

$ cd ~/aircon/aircon-api/
$ thin config -C thin.yml 

出来た thin.yml の中身のポート番号を変更


---
chdir: /home/ec2-user/aircon/aircon-api
environment: development
address: 0.0.0.0
port: 4567
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 100
require: []
wait: 30
daemonize: true

自動起動をchkconfigに設定・確認する

# cd /etc/init.d/
# chkconfig --add td_aircon
# chkconfig --list

sinatraサーバーをEC2で起動して外部からアクセス

EC2上でsintraを使ってサーバーを立てようとしたら、ハマったのでメモ。

デフォルトではlocalhost以外から接続出来ない設定になっている。
実行オプションを使って、

bundle exec ruby app.rb -o 0.0.0.0

または

bundle exec ruby app.rb -e production

で起動する。

 

Security Groupの設定で、4567番のポートを開けるのも忘れずに。

 

参考: http://qiita.com/u1_fukui/items/b86b21f6ed39f4c10d5d

MacにrbenvでRuby 2.0環境を追加

以前構築したMacのRuby環境に、Ruby 2.0系を入れようと思ったらハマったのでメモ。

まず、以前、openssl.org が落ちていたせいで、
一部勝手に書き換えていた部分 (http://soohei.net/1041) を元に戻す。

cd /usr/local
git reflog
git reset –hard HEAD@{0}

その後に、Homebrewの中身を最新にする

brew update
brew upgrade ruby-build

インストール可能なRubyのバージョン一覧を確認

rbenv install -l

2.0.0-p247 が出てくるのでインストールする

rbenv install 2.0.0-p247




Downloading ruby-2.0.0-p247.tar.gz…
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz
/usr/local/bin/ruby-build: line 144: pushd: ruby-2.0.0-p247: No such file or directory

BUILD FAILED

失敗する。

どうやらMac OS 10.8系だと、Homebrewを使わないでrbenv環境を作った方がいいみたい。
(ギルドの恋塚さんの助言、その後Homebrewでも出来るとわかった
→ http://shachi.hatenablog.com/entry/2013/08/06/191459 )

まずはHomebrewからrbenvとruby-buildをアンインストール

brew uninstall ruby-build
brew uninstall rbenv

rbenvのディレクトリが残っていたら一度削除
rm -rf .rbenv

新たに、rbenv, ruby-buildをgithubのレポジトリからclone

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

※ レポジトリのURL
https://github.com/sstephenson/rbenv
https://github.com/sstephenson/ruby-build

もう一度インストール

rbenv install -l
rbenv install 1.9.3-p448
rbenv install 2.0.0-p247

rbenv global 2.0.0-p247
rbenv rehash

ruby -v して、
ruby 2.0.0p247 と出力されたらOK

EC2でrbenv、Ruby, Apache, FTPのセットアップ

色々あって、新規に作ったインスタンスを最初からセットアップすることに。

 

SSHでアクセス

$ sudo yum update
$ sudo su

タイムゾーンの設定
# cp -i /usr/share/zoneinfo/Japan /etc/localtime

gitのインストール
# yum install git

 

==

rbenvを使ってシステムワイドにrubyをインストールする方法 #Ruby #rbenv – Qiita [キータ]
http://qiita.com/items/8e973a544b592376a07e

グループ staff の作成と、ユーザーの追加

# groupadd staff

# gpasswd -a ec2-user staff

# exit
$ logout

再度SSHで接続

 

====

rbenvのインストール

$ sudo su
# cd /usr/local

# git clone git://github.com/sstephenson/rbenv.git rbenv
# chgrp -R staff rbenv
# chmod -R g+rwxXs rbenv

# exit

$ vim ~/.bash_profile

.bash_profileに以下を追記

export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

 

====

sudo su してもrbenvを参照するようにする

/etc/profile.d/custom.sh をつくって

export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

を書き込む

色々インストール

 

====

http://blog.marsbar.us/blog/2013/03/13/aws-install-ruby/

$ sudo su
# yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison iconv-devel

# exit
$ logout

再度SSHで接続

 

====

RubyBuildのインストール

$ mkdir /usr/local/rbenv/plugins

$ cd /usr/local/rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git
$ chgrp -R staff ruby-build
$ chmod -R g+rwxs ruby-build

 

====

Rubyのインストール

$ rbenv install 1.9.3-p194

$ rbenv rehash
$ rbenv global 1.9.3-p194

$ which ruby
$ which gem

which gemでrbenvが参照されていることを確認する

 

====

Railsのインストールなど

http://www.rubylife.jp/railsinstall/rails/index1.html

$ gem install rdoc
$ gem install bundle
$ gem install rails

 

====

Apacheのインストールと自動起動の設定
http://live-cast.asia/blog/2010/10/amazon-ec2-for-setting-up-the-apache-micro-instances.html

$ sudo yum install httpd
$ sudo chkconfig httpd on

Apache起動
$ sudo service httpd start

 

====

FTPのセットアップ
http://dev.classmethod.jp/cloud/amazon-ec2-apache-ftp-setup/

$ sudo su
# yum install vsftpd
# vim /etc/vsftpd/vsftpd.conf

 

編集箇所

anonymous_enable=NO
ascii_upload_enable=YES(先頭の#を削除)
ascii_download_enable=YES(先頭の#を削除)


以下の行を追加

use_localtime=YES
force_dot_files=YES
pasv_min_port=60000
pasv_max_port=61000
pasv_address=xxx.xxx.xxx.xxx(Elastic IPアドレスを指定)

 

FTPの起動と、自動起動設定

# service vsftpd start
# chkconfig vsftpd on

 

iOS 開発メモ (2013年4月)

・UIViewのautoSizing

hoge.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

・文字列の置換

[hoge stringByReplacingOccurrencesOfString:@”検索する文字列” withString:@”置き換える文字列”];

iOS Push Notification

・キーチェーンアクセスから 証明書を書き出す (例: pns.p12)

openssl pkcs12 -in pns.p12 -out pns.pem -nodes

をターミナルから実行してpemファイルを作成。

・デバイストークンをハードコーディングして、簡単にテストする場合 (PHP)

Apple Push Notification Services Tutorial: Part 1/2 – Ray Wenderlich にサンプルコードがある。

デバイスIDの調べ方は、
iOSのRemote Notificationを試してみた – daicham blog
あたりを参考にiOSのAppDelegate.mに実装する。

<?php

// Put your device token here (without spaces):
$deviceToken = '1ED5B1EB97B788EE359233F5A547E881E3FEE0E2DED7A0AEB258ACD11050E051';

// Put your private key's passphrase here:
$passphrase = '';

// Put your alert message here:
$message = 'My first push notification!';

////////////////////////////////////////////////////////////////////////////////

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'pns.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
	'ssl://gateway.sandbox.push.apple.com:2195', $err,
	$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
	exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body&#91;'aps'&#93; = array(
	'alert' => $message,
	'sound' => 'default'
	);

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
	echo 'Message not delivered' . PHP_EOL;
else
	echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

をローカルに保存して (simplepush.php)

php simplepush.php

で実行する。

Connected to APNS
Message successfully delivered

と表示され、すぐ通知が飛んでくる。
(エミュレーターは非対応なので、検証出来るのは実機のみ、アプリを起動中は通知が来ないので注意)

Rubyの場合はこれを使うと良さそう。
jpoz/APNS · GitHub

CompassでCSSスプライトを自動化するメモ

background-sizeが使える環境(IE8を切れる環境)で、
Retinaなケースを考えて作る場合。(画像は@2xサイズで用意する)

 

・compassは最新のアルファ版を使うと良い (2013.4.14現在)

gem install compass --pre

Sprites are compiled in every call to sprite · Issue #897 · chriseppstein/compass

 

・pngの生成を高速化すっるには、oily_pngを入れると良い

gem install oily_png

パフォーマンスからみるSass/Compass 第2回:CompassによるCSS Sprite | MOL

 

・該当ディレクトリでターミナルから、監視開始

compass watch

 

・CompassのMixin

// スプライト画像
@mixin sprite-background($sprites, $sprites-img, $name) {
  background-image: $sprites-img;
  background-repeat: no-repeat;
  display: block;
  height: ceil(image-height(sprite-file($sprites, $name)) / 2);
  width: ceil(image-width(sprite-file($sprites, $name)) / 2);
  $ypos: ceil(nth(sprite-position($sprites, $name), 2) / 2);
  background-position: 0 $ypos;
  @include background-size(ceil(image-width(sprite-path($sprites)) / 2) auto);
}

$sprites: sprite-map("/common/sprite/*.png", $spacing: 4px);
$sprites-img: sprite-url($sprites);

#icon-large .sprite{
  @include sprite-background($sprites, $sprites-img, 'icon-large');
}

 

こんな感じ。

参考:
続☆Compassでさくっとスプライトを作る方法
Compassで複数のSprite画像を扱う
Using Compass to generate normal and retina sprite maps

 

background-sizeが使えないwebサイト制作時なんかを考えると、別の方法も必要になるので、後日検討。

iOS 開発メモ (2013年3〜4月)

いろいろ開発中に調べたことのメモ

 

・ステータスバーを隠す

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];
self.wantsFullScreenLayout = YES;

 

 ・親のインスタンスにイベントを送りたい

Protocol – Delegateパターンで実装する。

[iOS] Protocol – Delegateパターン | Objective-C イベント伝達 その1 « きんくまデザイン

 

・ARCを有効にしている場合に起こりがちなエラー

(nonatomic, assign) のあたりでエラーが出たら、 (nonatomic, strong) に書き換える。

[ARC][Xcode 4.3] プロパティのデフォルト属性が変更に! – iOS 開発ブログ Natsu’s note

 

※ ARCはXcode4.3以降(?) iOS5以降(?) で使える、自動メモリ管理です。

iOS 5 公開記念! Objective-Cのメモリ管理の革命、 ARC 超入門(サンプルはgitHubに公開) | Zero4Racer PRO Developer’s Blog

 

・UIWebView内のJavaScriptから、Objective-Cのコードを呼び出す

WebView で Javascript と Objective-C のコードを相互に呼び出す方法 ≫ 【スマホ×HTML5】Web&ハイブリッドアプリ開発者ブログ

 

・CGRectをNSLogで確認

NSLog(@"%@",NSStringFromCGRect(frame));

 

・UIViewのアニメーション

- (void)doAnimation
{
    self.alpha = 0.1f;
    self.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
    [UIView animateWithDuration:0.3f
        animations:^{
            self.alpha = 1.0f;
            self.transform = CGAffineTransformMakeScale(1.2f, 1.2f);
        }
        completion:^(BOOL finished){
        self.transform = CGAffineTransformIdentity;
    }];
}

SimpleBoxes | ブロックを使ったアニメーション処理 (iPhone/iPad, Objective-C 2.0)

 

・UIWebViewのURL取得

NSString* url = [webView stringByEvaluatingJavaScriptFromString:@"document.URL"];

UIWebViewで表示中のURL、titleを取得する: iPhoneアプリ開発備忘録

 

・ファイル名の文字列処理

// ディレクトリ名を取り出し

NSString *directoryPath = [url stringByDeletingLastPathComponent];

// ファイル名を取り出し

NSString *fileName = [url lastPathComponent];

// 拡張子取り出し

NSString *extension = [fileNameWithExtention pathExtension];

// 拡張子無しのファイル名

NSString *fileNameWithoutExtension = [fileName stringByDeletingPathExtension];

iPhone War Room: How to load local HTML resouces in UIWebView
iPhoneアプリ開発と留学 : ファイルパスからファイル名や拡張子などのみを取り出す

 

・文字列の結合

NSString *s1 = @"Hello";
NSString *s2 = @"World";
NSString *str = [NSString stringWithFormat:@"%@ %@",s1,s2];

 

・文字列のSplit

NSString *string = @"hoge,moge,fugo,mogo";
NSArray *names = [string componentsSeparatedByString:@","];
NSLog(@"%@",names);

My Codex Leicester » Blog Archive » NSStringを特定文字で分割する – Mac/iOS の Audio Visual Programmingの話題

 

・文字列の一致の比較

if ([str3 isEqualToString:str4]){
}else{
}

Compare NSString Objects (Updated)

 

・配列内のindexOf

[配列 IndexOfObject:要素]

 

・配列の要素削除

[配列 removeObjectAtIndex:インデックス];

Objective-CのTips – メメメモモ

 

・AS3のDictionary的なもの

NSMutableDictionary

配列とループ処理を理解しよう – @IT

 

・addSubViewの反対

removeFromSuperview

【コラム】ダイナミックObjective-C (73) デザインパターンをObjective-Cで – Composite (2) | 開発・SE | マイナビニュース

 

・UIWebViewのガベコレ強制発動

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];

iPhoneアプリでHTTP通信を頻繁に行っているとメモリ使用量が…

Cocoaの日々: [iOS] UIWebView のキャッシュ調査

(旧) Cocoaの日々: WebKit検証(36) – キャッシュをクリアする(成功)

 

iOSアプリ実機検証 〜 TestFlight配布

定期的に訪れる、iOS勉強作業。

========
実機検証
========

▼証明書の作成

キーチェーンアクセス > 証明書アシスタント > 認証局に証明書を要求

ユーザーのメールアドレス: メアドを入力
通称: 自分の名前など
CAのメールアドレス: 空欄で良い
要求の処理: ディスクに保存、鍵ペア情報を指定にチェック

鍵のサイズ: 2048ビット
アルゴリズム: RSA

 

iPhone Provisionning Protal > Certificates

で Certificate を作成してダウンロード。

キーチェーンアクセスの「ログイン」という項目内にドロップして追加。

(Development, Distributionどちらも)

 

App IDの作成

Bundle Identifierは自分のドメインなどに紐付けて、最後は 「 * 」 。
例) net.soohei.*

 

Deviceの追加

UDIDを入力してデバイスを追加する。Xcodeのオーガナイザーからも出来る。

 

Provisioning Profileの作成 (Development, Distributionどちらも)

Certificate、App ID、Device を指定して Provisioning Profile をつくる。

ダウンロードしてXcodeに登録

 

▼ アプリのビルド、実機転送

Build Settings の中の Code Signing で、
Debug にDevelopment用のプロファイル、
Release にDistribution用のプロファイルを指定してビルドする。

sign関係のエラーが出たら、証明書や鍵が正しくマシンに入っているか確認。

アプリを Run する時に、Simulatorを選ぶと、Mac上でシミュレーターが起動、
実機を選ぶと、実機で確認できる。

実機がプロファイル内にデバイスとして登録されているかを再確認。
転送に失敗した場合は、実機にプロファイルが入っているか、

 

 

========
TestFlight
========

Adhoc用のアプリを、インターネット経由で配布・インストールできる便利なサービス。
> Test Flight

 

▼ アプリのインストールに必要な条件

・TestFlight のアカウントを持ってること

・自分の端末(デバイス)の UDID が TestFlight のアカウントに紐付いていること
(端末からTestFlightサイトにアクセスすると簡単に登録できる)

・アプリのプロファイルが端末内にインストールされていること
(TestFlightのアプリ配布用URLからもインストールできる)

・配布されたアプリのプロファイル内に、自分の端末が登録されていること

 

▼ アプリの配布に必要なもの

・TestFlight のアカウント

・Distribution (adhoc) 用のプロファイルがマシンに入っていること

・同プロファイルを使ってビルドされたアプリのIPAファイル (Xcodeで Product > Archive)

 

▼ 配布手順

・Provisioning Portal の Devices にデバイスのUDIDを登録 (Xcodeのオーガナイザー経由でも良い)

・Distribution用の Provisioning Profile で、デバイスを登録

・アプリをビルドしてIPAファイルをつくる (Xcodeで Product > Archive)

・IPAファイルを TestFlightのApp 経由で配布・通知

 

▼ もし配布する端末を増やしたくなったら

・TestFlight のアカウントにデバイスの UDID を登録。

・Provisioning Portal で Devices にデバイスを追加

Provisioning Profile (Distribution) を再ダウンロード

・アプリを再ビルド、再配布

・通知を受け取った端末から、TestFlightのURLにアクセスしてアプリをダウンロードする。

 

or もっと便利な方法教えてもらいました!

 

・TestFlightのweb上で、Apps → アプリ選択 → Permissionos → Updated Provisioning Profile の Update Profile からプロファイルを再ダウンロード。

・Teammates In The Provisioning Profile に新しいメンバーが現れたら、チェックボックスをON。

・Just Update か、Update & Notify する。

・通知を受け取った端末から (Just Updateだと通知はこない)、TestFlight サイトにアクセスしてアプリをダウンロードする。

 

再ビルドの手間がないのがGood!

 

参考:
iPhoneアプリの配布用(Distribution)のビルドを行う – Cyber Passion for iOS
2台目のMacのXcode:「Valid signing identity not found」 | MUSHIKAGO APPS MEMO
Problem while trying to set up distribution profile
TestFlight とりあえずどんなものか | MUSHIKAGO APPS MEMO
TestFlightの使い方と導入方法 | Technology-Gym