2012年12月30日日曜日

fuelPHPのOrm Modelのdeleteを論理削除に変える(リレーションにも対応してるよ)

fuelPHPのOrmパッケージは非常に便利なのですが、deleteがレコードの物理削除なので論理削除に挑戦してみました。
※fuelPHP1.5で論理削除がサポートされますた。ここを見てね。


[前提条件]
  1. テーブルのカラムに「deleted」という論理削除用のカラムを設ける
[実装概要]
  1. 「Model_User extends Model_Base extends \Orm\Model」のように3層構造の継承関係にする。
  2. Model_Baseにてdelete($cascade = null, $use_transaction = false){}をオーバーライドして論理削除を実装する
  3. Model_Baseにてfind($id = null, array $options = array()){}をオーバーライドして「where deleted = 0」を付加する
  4. Model_Baseにてcount(array $options = array()){}をオーバーライドして「where deleted = 0」を付加する

[ソースコード]
array型の$cascadeは対応していません

このエントリーをはてなブックマークに追加

2012年12月21日金曜日

Could not launch No such file or directory

xcodeで
「Could not launch No such file or directory 。。。」
ってエラーが出てアプリが起動しなくなってしまった時に行ったこと。

  1. xcodeの再起動
  2. アプリ削除
  3. クリーンビルド


このエントリーをはてなブックマークに追加

2012年12月11日火曜日

fuelPHPのエラー「The session data stored by the application in the cookie exceeds 4Kb.」を解消する

セッションデータのサイズが4kバイトを超えると「The session data stored by the application in the cookie exceeds 4Kb.」というエラーがでるようです。
これはセッションの保存先を変更すれば解決できます。

[手順]

1.「fuel/core/config/session.php」を「fuel/app/config/」にコピーする。
2.「session.php」のdriverの設定をdbに変更する 3.oilコマンドでセッション保存用テーブルを作成する。
$cd fuelPHPのルートフォルダ
$oil r session:create

このエントリーをはてなブックマークに追加

2012年11月30日金曜日

fuelPHP導入マニュアル俺メモ


[前提条件]

  1. MAC環境でのマニュアルである
  2. fuelPHP1.4を使用したマニュアルである
  3. MAMPのインストールと環境設定が完了している
  4. エクリプスのインストールと環境設定が完了している
  5. PDTがインストールされている
  6. MakeGoodがインストールされている
  7. PHPUnitがインストールされている
  8. Gitがインストールされている
  9. curlがインストールされている
  10. oilがインストールされている
  11. ここまでの参考文献:初めてのフレームワークとしてのfuelPHP
  12. エクリプス用のGitプラグインEGitがインストールされている
  13. 「~/work/」配下に「hoge」という名前のプロジェクトを作成するマニュアルとする
  14. 前提条件が多いからとあきらめないこと。あきらめたらそこd(ry

[導入マニュアル目次]

  1. fuelPHPのインストール
  2. MAMPからアクセス出来るようにシンボリックリンクを作成する
  3. ブラウザでの接続確認
  4. エクリプスにプロジェクトをインポートする
  5. 「hoge/docs」フォルダをプロジェクト用のフォルダに改造する(改造するより別途docs_devとかを掘ったほうが良さげです)
  6. config.phpの変更
  7. 自動補完の設定
  8. MakeGoodの設定
  9. MakeGoodの設定確認
  10. Goutteのインストール
  11. セッションの保存先をcookieからdbへ変更する
  12. fuelPHPのGitコミットログをまとめる(工事中)
  13. Bitbucketへpushする
  14. Bitbucketからcloneする

[導入マニュアル]

1.fuelPHPのインストール

$cd ~/work
$oil create hoge

2.MAMPからアクセス出来るようにシンボリックリンクを作成する

「/Applications/」にMAMPがインストールされている場合
$cd /Applications/MAMP/htdocs/
$ln -s ~/work/hoge/public hoge

3.ブラウザでの接続確認

ブラウザ(safari、chrome等)を起動してhttp://localhost/hoge/にアクセスする。
次のようなwelcome画面が表示されればOK
fuelPHPのインストール完了確認スクリーンショット

4.エクリプリスにプロジェクトをインポートする

 4.1.エクリプスを起動する
 4.2.メニューからimportを選択
エクリプスにプロジェクトをインポートするメニューのスクリーンショット

 4.3.Projects from Gitを選択してNext>をクリック
Gitのプロジェクトをインポートするメニューのスクリーンショット

 4.4.Localをダブルクリック
ローカルのプロジェクトをインポートするメニューのスクリーンショット

 4.5.右上のaddボタンでhogeを追加後選択してFinishをクリック

プロジェクトフォルダを選択するメニューのスクリーンショット

 4.6.PHP Projectを選んでNext>をクリック
プロジェクトの言語を選択するメニューのスクリーンショット

 4.7.Create project at existing location (from existing source)を選択し、Browserボタンからhogeを選択語Finishをクリック
既存のプロジェクトを選択するメニューのスクリーンショット

5.「hoge/docs」フォルダをプロジェクト用のフォルダに改造する

「hoge/docs」にfuelPHP関連のドキュメントが置かれているが特に必要ないので中身を削除してプロジェクト用のドキュメントを配置出来るようにする。
$cd ~/work/hoge
$git rm --cached docs
$rm -rf docs
$mkdir docs
$touch docs/.gitkeep
gitで管理したくないドキュメントがある場合は「docs/.gitignore」ファイルを作成し追加する。

6.config.phpの変更

「fuel/app/config/config.php」を次のように変更する。


7.自動補完の設定

「hoge/fuel/app/_autocomplete.php」を作成する。
内容についてははじめてのフレームワークとしてのfuelPHPを参照

8.MakeGoodの設定

8.1.fuel/core/bootstrap_phpunit.php」
  「fuel/app/bootstrap_makegood.php」にコピーして変更する。
内容についてははじめてのフレームワークとしてのfuelPHPを参照

 8.2.hogeのプロジェクトフォルダを右クリックしPropertiesをクリックする。
プロジェクトのプロパティ設定画面を起動するメニューのスクリーンショット

 8.3.MakeGoodを選択して次のように設定してApplyをクリック
MakeGoodの設定をする画面のスクリーンショット

8.4.PHP Include Pathを選択して次のように設定してFinishをクリック
includeパスの設定をする画面のスクリーンショット


 9.MakeGoodの設定確認

9.1.「fuel/app/tests/makegoodsetup_Test.php」を作成し次のコードを記述する。

 9.2. makegoodsetup_Test.phpを右クリックし、[全てのテストの実行]をクリックする。
テストを実行するメニューのスクリーンショット

 9.3.MakeGoodの結果が次のようになればOK
テスト結果のスクリーンショット

10.Goutteのインストール

$cd ~/work/hoge
$git submodule add git://github.com/fabpot/Goutte.git fuel/app/vendor/Goutte

11.セッションの保存先をcookieからdbへ変更する。(※別途DBの設定が必要)

デイフォルトのセッション保存先がcookieになっていますが、容量不足でエラーになる場合があるので保存先をDBへ変更します。
 11.1.「fuel/core/config/session.php」を「fuel/app/config/」にコピーして編集する。
 11.2.oilコマンドでセッション保存用テーブルを作成する。
 $cd ~/work/hoge
 $oil r session:create

12.fuelPHPのGitコミットログをまとめる

fuelPHPの開発コミットログは邪魔なので一つにまとめる
(工事中)

13.Bitbucketへpushする

13.1.Bitbucketにリポジトリを作成する

 13.2.commitする
 $git add --all
 $git commit -a -m 'message'


 13.3.「hoge」をpushする
 $git remote set-url origin https://dummy@bitbucket.org/dummy/hoge.git
 $git branch -m 1.4/master master
 $git push -u origin master

14.Bitbucketからcloneする

cloneした後サブモジュールをインストールする必要がある。
$cd ~/work
$mv hoge hoge_old
$git clone https://dummy@bitbucket.org/dummy/hoge.git
$cd hoge
$git submodule init
$git submodule update





このエントリーをはてなブックマークに追加

2012年11月26日月曜日

HTMLでtree構造を表現するサンプル

HTMLでツリー構造を表現するためのサンプルです。
.htmlファイルにコピペしてください。

a
  
 1
aa
  
 2
aaa
  
 3
aaaa
  
 4
aaa
  
 5
aa
  
 6
aa
このエントリーをはてなブックマークに追加

2012年11月12日月曜日

unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard

xcode4.5以降でUITableViewのdelegateメソッドが自動生成されると、このエラーが出る場合があります。
原因は

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{]
内に自動生成されたコードに
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

が記述されているからです。
このメソッドはiOS6.0以降でないと使用できません。
なのでiOS6.0未満も対応しているアプリではエラーとなってしまいます。

◎解決方法
従来の
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; 
を使用するだけで解決します。

このエントリーをはてなブックマークに追加

2012年11月8日木曜日

xcodeプロジェクトをgitで管理する際に無視させるディレクトリとファイル


.DS_Store
*.xcodeproj/*.mode1v3
*.xcodeproj/*.pbxuser
*.xcodeproj/*.xcworkspace
*.xcodeproj/xcuserdata/
*.xcworkspace/xcuserdata/
build/
.svn/
*.swp
*.nib
Thumbs.db
*.[oa]
*~
*.bak





◎無視させるようにする手順

  1. ターミナルを起動する
  2. $git config --global core.excludesfile $HOME/.gitexclude
  3. .gitexcludeファイルに無視するディレクトリやファイルを記述する

※上記の方法で無視させた場合、環境依存になってしまう(MAC毎に設定が変わってしまう)為、プロジェクト毎に.gitignoreを配置するのが良いでしょう

このエントリーをはてなブックマークに追加

2012年11月5日月曜日

Git逆引きリファレンスぅ


◎変更内容を全て破棄する

全ての変更内容(ステージと作業フォルダ)がHEADつまり最新のコミット内容に置き換わります。
--hardオプションをつけることで作業フォルダの内容も対象となります。
つまり「git reset HEAD」とした場合ステージ(index)の内容だけが最新のコミット内容に置き換わります。

◎ディレクトリ(フォルダ)配下をGitで管理出来るようにする

Gitで管理したいディレクトリへ移動して本コマンドを実行することで、配下の全てのフォルダ及びファイルを管理する必要最低限の準備が整います。
※1 本コマンドを実行後に管理対象とするフォルダ及びファイルを指定する必要があります。

◎ディレクトリ(フォルダ)配下の全てのディレクトリ及びファイルをステージ(index)に追加する

Gitで管理したいディレクトリへ移動して本コマンドを実行すると、配下の全てのファイルをGit管理下に置く事が出来ます。 addは変更内容を追加するようなイメージです。
※1 .gitignore によって無視されているファイルは無視されます。
※2 --updateの機能も同時に実行されます。

◎作業フォルダ配下の全ての追加・変更・削除をステージ(index)に登録する

ここでいう作業フォルダとは.gitがあるフォルダで、「git init」を実行したフォルダを示します。 「$ls -a」で.gitを確認する事が出来ます。 ※1 「git add -A」でも同じ事が可能

◎ディレクトリ(フォルダ)を指定してステージ(index)に追加する

addはステージ(index)に変更内容を追加するようなイメージです。これを「ステージする」とか「ステージング」といいます。
新しいファイルを追加するという変更内容を追加しています。
※1 「git add .」でカレントディレクトリを指定出来ます。

◎メッセージを付加して変更内容を保存する

git add等での変更内容は実際には一時的な記録(スナップショット)でしかありません。
この一時的な記録場所をindex(索引)又はstage(ステージ)といい、記録することを「ステージ(stage)する」とか「ステージング」といいます。
indexの内容(stageされた変更内容)を履歴に保存するのがcommitです。commit先はリポジトリといいます。

◎コミットIDとメッセージだけのシンプルなlogが見たい

◎コミットIDを指定して内容を比較する

◎変更内容(削除も含む)をステージ(index)から復活させたい

◎変更内容(削除も含む)をリポジトリ(履歴)の最新から復活させたい

※1 ステージ(index)の内容は破棄されます。

◎最新コミットの筆者をリセットする

◎作業フォルダの変更内容を維持したまま最新コミットを取り消す

◎commitとaddを同時に行う

「-a」のオプションを付加する事で、ステージ(index)にあるファイルの変更が更新(git add)されてさらにコミットされます。
※1 ステージ(index)に無い(git addされていない)ファイルはコミットされません。

◎必要のないディレクトリやファイルをgit addしてしまった

◎前回のコミットメッセージを編集したい

--amendオプションを付加すると新しい履歴は追加されずにHEADのコミット内容が上書きされます。
※1 ステージ(index)内容が変更されていた場合それもcommitに含まれてしまいます。

◎ステージ(index)の変更内容を取り消す

※1 「git reset」でも同じ事が可能

◎ファイル名を変更したい

変更した後はコミットしないとリポジトリには反映されません。

◎ステージ(index)からファイルを削除する

--cachedオプションを付加するとステージ(index)が対象になります。
当然ながらリボジトリに反映させる為にはcommitする必要があります。

◎最新のコミットから特定のコミットを削除して最新コミットとする

逆マージというやつです。本コマンドの場合は逆マージしてさらにコミットまで実行されます。 なので複数コミットの場合は使用出来ません。

◎複数コミットの逆マージ

この時点で のように表示されるので と修正して
:wq
コミットメッセージ編集画面が起動したらメッセージを編集して
:wq

◎rebaseを中止する

◎共有リポジトリを作成する

◎ブランチを作成する

◎ブランチを切り替える

◎リモートリポジトリのブランチを削除する

◎日本語ファイルの文字化けを解消する

◎GitコマンドをTabで補完できるようにする

本コマンドは一回実行すれば次回login時も有効になっています。

◎ステージ(index)の中身が見たい

◎サブモジュールを削除したい

◎リポジトリとステージされた内容(インデックス)のdiffを取りたい

◎ブランチAのコミット内容を現在のブランチへマージする

◎ブランチの作成と新しいブランチへの切り替えを同時に行う

◎ブランチAを削除する

◎設定(Config)の一覧が見たい

◎現在のブランチにマージ済みのブランチ一覧を表示する

◎現在のブランチに未だマージされていないブランチ一覧を表示する

◎HEADとは

HEAD はあなたが作業しているローカル(カレント)ブランチの最新のコミットを指し示します。

◎リビジョンを指定してブランチを作成する

◎gitkで全体のグラフを表示したい

◎マージを中断したい

このコマンドによりステージと作業領域の状態が最新のコミット内容で強制的に上書きされます。

◎git pull だけでカレントブランチのpullを実行したい

$git pull
を実行すると次のようなエラーが出る場合 トラッキング先を設定することで
$git pull
でpullすることが出来るようになります。 トラッキングを設定すると$git push、$git pull、だけで実行出来るようになります。

◎gitでプロジェクトをエクスポートする

フォルダ名/配下にエクスポートされてファイルパス.zipが作成される
※フォルダ名/のスラッシュを忘れないでね


このエントリーをはてなブックマークに追加

/Applications/MAMP/Library/bin/mysqld: unknown variable 'default-character-set=utf8'ってエラーが出た

MACにMAMPをインストールしたけれどmysqlが起動してくれません。
/Applications/MAMP/logs/mysql_error_log.err
の内容を確認してみると、
121105 19:26:44 [ERROR] /Applications/MAMP/Library/bin/mysqld: unknown variable 'default-character-set=utf8'
こんなエラーが出てました。
どうやら以前インストールしたmysqlの設定で/etc/my.cnfに
[mysqld]
 default-character-set   = utf8
を追加したのですが、mysql5.5から表記が変わったようです。
[mysqld]
character-set-server   = utf8

に修正したら無事にmysqlが起動できました。
このエントリーをはてなブックマークに追加

2012年11月2日金曜日

UIWebViewにJSONデータを渡す with jQuery

jQueryを使用すればUIWebViewにJSON形式のデータを読み込ませることが簡単にできます。
手順はこちら

  1. NSString型のJSONデータを用意する。
  2. UIWebViewのjavascript実行メッソッドを呼ぶ。
  3. jQueryのパースメソッドを使用して文字列型のJSONデータをオブジェクトに変換する。

◎各ステップのサンプル

◎ポイント

  1. 「NSString stringWithFormat:@"loadJSON('%@');",」の%@シングルクォーテーションで囲む。
このエントリーをはてなブックマークに追加

iphoneシミュレーターで現在位置を変更したい

iphoneシミュレーターの現在位置は初期設定だとアメリカになっています。
現在位置はiphoneシミュレーターのメニューから変更することが可能です。
iphoneシミュレーターの現在位置を変更するスクリーンショット
このエントリーをはてなブックマークに追加

2012年10月22日月曜日

iphoneシミュレーターのホームボタンがなくなっている。

iphone5シミュレーターにはホームボタンがないのですが、メニューからホーム画面に遷移させることができます。
iphone5シュミレーターのホームボタンを表示するメニューのスクリーンショット
このエントリーをはてなブックマークに追加

2012年10月17日水曜日

PHPで出力したCSVファイルの先頭に空行が入ってしまう

PHPでCSVファイルを出力するコードを書いたのですが、出力されたCSVファイルを開くと謎の空行が先頭に入ってしまうという現象が起きてハマりました。
原因は

  • PHPの閉じタグの後に空行が入っていた。
PHPのコードは<?php ?>のタグの間に記述しますが
このように?>の後ろに空行が入っていた場合はechoと同じ扱いとなってしまいます。
この空行がCSV出力した際に一緒に出力されてしまい、余分な空行が入ってしまうのです。

◎対処方法
PHPの仕様でPHPコードのみで記述されたファイルでは閉じタグを省略することが可能です。閉じタグを記述しなければ空行が出力されることはありません。

このエントリーをはてなブックマークに追加

PHPのarray_mapが動かない

PHPのarray_mapが動かなくてはまりましたYO。
原因は
  • クラス内のインスタンスメソッドを使用する際はcallbackが文字列指定では動かない
でした。
このエントリーをはてなブックマークに追加

2012年10月11日木曜日

MAMPでMySQLが起動しない時の対処

まず、ぐぐってすぐ出てくるのが

  • ターミナルを起動して「killall -9 mysqld」コマンド実行

ですが、これを試してもダメでした。
で、なにが原因だったかというと別途MySQLをインストール&起動していたからのようで、
それを停止してMAMPを再起動したら無事にMySQLを起動することができました。
ついでに自動起動のチェックもはずしました。

このエントリーをはてなブックマークに追加

2012年10月5日金曜日

sqlite3でテーブルが存在していた場合だけdropしたい

そんなときは

このエントリーをはてなブックマークに追加

2012年10月1日月曜日

'hoge.js' of type sourcecode.javascript for architecture i386ってwarnigを消したい

xcodeではAdd filesで.jsファイルを追加した場合にCompile Sourcesに追加されてしまい、「jsファイルのコンパイル方法がわかりません」と表題のワーニングが出てしまいます。
このワーニングを消す手順を紹介します。

  1. Compile Sourcesから.jsファイルを削除する
  2. Copy Bundle Resourcsに.jsファイルを追加する。
1.Compile Sourcesから.jsファイルを削除する



2.Copy Bundle Resourcsに.jsファイルを追加する。

このエントリーをはてなブックマークに追加

2012年9月16日日曜日

WebGLリンク集

WebGLを勉強する為のリンク集

  1. HTML5による物理シミュレーション環境の構築 ~WebGLライブラリThree.js 入門
  2. javascriptライブラリ「THREE」
  3. WebGLのチュートリアル

このエントリーをはてなブックマークに追加

2012年9月5日水曜日

Objective-Cでクラスメソッドの有無を判定する

そのクラスに指定したクラスメソッド(セレクター)が存在するのか判定する為には
- (BOOL)respondsToSelector:(SEL)aSelector; 
を利用します。 このメソッドはインスタンスメソッドなんですけど、なぜかクラスに対して呼び出すことができます。コンパイルも通るし実行時に落ちたりもしません。(小一時間調べたけど分からずじまい)
このエントリーをはてなブックマークに追加

2012年9月4日火曜日

画力上達の為のリンク集

絵が上手に描けるようになりたいので、デッサン、パース、イラスト等のhow toサイトの中で、個人的に繰り返し閲覧したくなるようなサイトを集めていくことにする。
このエントリーをはてなブックマークに追加

2012年8月24日金曜日

iPhoneアプリでネットワーク接続(圏外)状況を取得する

圏外だったらブラウザを起動しない、wifiに接続されていなければ警告を表示する等、事前にネットワークの状態を取得したい場合は
SystemConfiguration.frameworkSCNetworkReachability
を使用するのですが。appleがラッパークラスをここに用意してくれているのでそれを利用するのが簡単です。
プロジェクトに
  • Reachability.h
  • Reachability.m
を追加して中身をappleのサンプルからコピーします。
ポイント
  1. reachabilityWithHostNameの引数はurlでは無くホスト名を設定する必要があります。
  2. NotificationCenterを利用すれば接続状況の変化通知を受け取ることもできます。
このエントリーをはてなブックマークに追加

「Declaration of 'struct sockaddr_in' will not be visible outside of this function」って警告がでちゃったYO

「Declaration of 'struct sockaddr_in' will not be visible outside of this function」の解決方法は

  1. netinet/in.hをインポートする

このエントリーをはてなブックマークに追加

2012年8月10日金曜日

HTMLにおいてチェックボックスやラジオボタンを読み取り専用にするには

HTMLにおいてチェックボックス(checkbox)やラジオボタン(radio)を読み取り専用(readonly)にする方法を紹介します。disable属性は使用しません。
手順

◎checkboxの場合
  1. onclickイベントにてfalseを返却する。
  2. name属性を一意な物に変更する。

◎radioの場合
  1. 未選択項目のonclickイベントにて$(this).remvoeAttr('checked');を実行する。(要jquery)
  2. name属性を一意な物に変更する。
このエントリーをはてなブックマークに追加

2012年7月31日火曜日

cocos2dでlibxml2のインクルードエラー

cocos2dのプロジェクトを新規に作成してlibxmlをインクルードしようと思ったら 'libxml/xmlreader.h' file not found 
ってエラーが出て結構はまってしまった。
この「'libxml/xmlreader.h' file not found」はメジャーなエラーなんだけれど
Build Settings -> Search Paths -> Header search Pahts 

$SDKROOT/usr/include/libxml2 
を追加することで解決するはずなんです。
しかし、今回はなぜかエラーがとれませんでした。 で、解決方法は
TARGETS

Build Settings -> Search Paths -> Header search Pahts 
にも
$SDKROOT/usr/include/libxml2 
を追加する。
このエントリーをはてなブックマークに追加

2012年7月21日土曜日

Soundflowerをインストールして起動したけれどメニューに「Soundflower is not installed」って表示されてしまう場合の対処方法


Soundflowerを起動してメニューを開いても「Soundflower is not installed」って表示されてしまう場合はターミナルを起動して次のコマンドをたたくべし!

sudo chmod -R g=r /System/Library/Extensions/Soundflower.kext
sudo kextload /System/Library/Extensions/Soundflower.kext

このエントリーをはてなブックマークに追加

2012年7月6日金曜日

ゲームのデータを考える時のヒント

ゲームのデータを考えるのってすーーっごく大変なんだと最近分かりました。
ただ闇雲に考えてもなかなか思い浮かばないのでヒントをまとめてみました。

◎モンスター編

  1. 新しい生息地を与える(ツンドラ・ウルフ)
  2. 新しい色を与える(ブラック・ドラゴン)
  3. 新しい見た目を与える(クリスタル・タートル)
  4. 新しい属性を与える(ヴェノム・スパイダー)
  5. 新しい能力を与える(フライング・ソード)
  6. 合成する(ドラゴン・アント)
  7. 他の物に例える(スパイク:とげが生えた芋虫、シー・デビル:タコみたいの)
  8. 表現を変える(ファイア、フレイム、ブレイズ、バーン、アグニート)
  9. ドロップ・アイテムを参考にする(血の結晶:ブラッド・スライム)
  10. 巨大化させる(ジャイアント・ワーム)
  11. 強さのランク付けをする(ウォーリアー、ナイト、マスター、ロード)
  12. 乗りものに乗せる(ドラゴン・ライダー)
  13. レア度を考える(common、uncommon、rare、boss、s-boss)

◎アイテム編

  1. アイテムの用途を考える(回復、攻撃、治療、素材)
  2. モンスターや特定種族が生成するアイテムを考える(オーク・メタル)
  3. モンスターの体から採取することを考える(ねずみのしっぽ)
  4. 素材に分割する(布・蜘蛛の糸・鉄)
  5. 強弱、大小、等ランクをつける(レッサー、ノーマル、グレーター)

◎装備編

  1. 属性や魔力を与える(フレイム・アーマー、ホーリー・クロス)
  2. 材料から考える(アイアン・ヘルム)
  3. 特定のモンスターや種族の名前を与える(イフリート・ロッド、エルヴン・ブーツ)
  4. シリーズ化する(レザー・ヘルム、レザー・アーマー、レザー・ブーツ)
  5. 特化能力から考える(スピード・ブーツ、デーモン・キラー)
  6. 職業から考える(盗賊の指輪
  7. 表現をかえる(クロス、ローブ、アーマー、シャツ、メイル)
このエントリーをはてなブックマークに追加

2012年6月13日水曜日

squirrel関連リンク集

http://www.squirrel-lang.org/
http://ja.wikipedia.org/wiki/Squirrel
http://wikiwiki.jp/lua/?Squirrel
http://monsho.blog63.fc2.com/?q=squirrel&page=1
このエントリーをはてなブックマークに追加

cocos2dで開発環境をretina専用(低解像度非対応)にする

最近はcocos2dを触っているのですがデバイス3GS以下が比対応の場合に画像を低解像度、retina、二つ用意するのは面倒なのでretina用の画像だけでcocos2d開発する方法を調べました。

  1. retina用の画像だけを用意する。例)hoge.png
  2. CCDirectorをretinaに対応させる
  3. retina用のファイル名サフィックスを設定する
です。簡単ですね。2、3のソースコードはこちら


サフィックスを空文字にするだけでした、ちゃんちゃん。
このエントリーをはてなブックマークに追加

2012年5月14日月曜日

The entitlements specified in your application’s Code Signing Entitlements file do not match those specified in your provisioning profile.

特定のデバイス+特定のアプリだけ表題の警告が出て実機に転送できないという現象が発生しました。
いつものようにgoogle先生に聞いてみたのですがいろいろな原因があるようですね。
最終的に解決したのですが。根本的な原因は不明なままです。

◎対処内容
  1. デバイスのProvisioning Profileをすべて削除する。
  2. デベロッパー登録更新後に作成したProvisioning ProfilesのDevicesにて当該デバイスにチェックが入っていなかったのでチェック。
  3. 修正したProvisioning Profileをダウンロード。
  4. Organizerで当該デバイスのProvisioning ProfilesにダウンロードしたProvisioning Profileを追加する(ドラッグアンドドロップではなく下の+addで追加)
今回はこれで解決しました。まぁProvisioning Profileの対象デバイスにチェックが入っていなかったのが原因だと思われます。
このエントリーをはてなブックマークに追加

2012年5月11日金曜日

CGRect関連便利関数あれこれ

を記事にしようかと思ったんですけど、わかりやすい記事を発見したのでリンクだけメモっておく
CGRectのメソッド色々メモ 比較編
CGRectのメソッド色々メモ サイズ・座標取得
CGRectのメソッド色々メモ 矩形変更編
このエントリーをはてなブックマークに追加

2012年5月10日木曜日

MACでipconfig

ターミナルを起動して
sudo /sbin/ifconfig
このエントリーをはてなブックマークに追加

2012年5月9日水曜日

Objective-Cでクラス名文字列からインスタンスを生成する方法

Objective-Cでクラス名文字列からインスタンスを生成したい場合は
NSClassFromString(@"クラス名");
を使用します。

え、使うのかって?
たとえばこんなんどうでしょう?
このエントリーをはてなブックマークに追加

2012年5月8日火曜日

Instance method '-resizedImage:' not found (return type defaults to 'id')

「Instance method '-resizedImage:' not found (return type defaults to 'id')」って警告がでました。メソッドが見つからないと言っているようです。-resizedImage:が宣言されている.hファイルを#importすることで解決しました、めでたし、めでたし。
このエントリーをはてなブックマークに追加

2012年5月7日月曜日

カメラロールのステータスバーを非表示にする

カメラロール(UIImagePickerController)のステータスバーを非表示にする方法を紹介します。やり方は
UIImagePickerControllerを継承してviewWillAppear内でステータスバーを非表示にする
です。
この方法でステータスバー非表示だけでなくナビバーを消したり、ツールバーを表示したり、いろいろカスタマイズできます。継承して拡張するってやつですね。
それではソースを見てみましょう。
◎ポイント
  1. オーバーライドしたviewWillAppear内でsuperのviewWillAppearを呼び出だしましよう。呼び出さないとスーパークラス(
    UIImagePickerController)のviewWillAppearが実行されなくなってしまいます。
このエントリーをはてなブックマークに追加

2012年5月1日火曜日

iPhoneでアプリ全体のタッチ操作を有効にしたり無効にしたり

アニメーション実行中や通信中等ユーザーからのタッチ操作を受け付けたくない場合にアプリへのタッチ操作を受け付けなくすることができます。

このエントリーをはてなブックマークに追加

2012年4月30日月曜日

isKindOfClassとisMemberOfClassってなにが違うねん

ってことで調査したところ継承関係も含めて判定するかどうかのようです。
isKindOfClass:継承関係内に指定クラスが存在すれがYESを返却する
isMemberOfClass:allocしたときのクラス(ちょっと自信ない)が指定クラスならYES
以下検証プログラム

このエントリーをはてなブックマークに追加

2012年4月29日日曜日

is missing from working copyっていう警告がでちゃった

xcodeの警告で
warning: Missing file:/job/hoge/trunk/hoge/Classes/Generic/UI/UICustom/NSCViewVisitor.h is missing from working copy 
こんなのがでて消すのにほんのり苦労しました。
どうやらSVNの警告のようで下記コマンドを実行することで解決しました。 その他:SVN管理されているフォルダーをコピーする際はフォルダー内のSVN情報もコピーされてしまいます。
このエントリーをはてなブックマークに追加

2012年4月20日金曜日

SyntaxHighlighterを使ってるけれどhtmlがうまく表示されない

SyntaxHighlighterを使いはじめた頃から困っていたのですがpreタグ内部で<や&が使えないようですね。
解決方法はpreではなくscriptタグを使えばよいみたいです。
このエントリーをはてなブックマークに追加

UIWebViewでiOSのシステムフォントを使いたいよ

ってことで
まぁheadタグでフォントに「Helvetica Neue」をしていすればよい訳です。
「Helvetica NeueUI」じゃないのか?!って思ったんですけど表示が変わりませんでした。
このエントリーをはてなブックマークに追加

iOSのシステムフォントって実際なんなの?

ってことでしらべてみましたYO
検証結果は「Helvetica NeueUI」でした。
以下検証内容

UIFont *font = [UIFont systemFontOfSize:12];
NSLog(@"font-info:%@", font);
 

font-info: font-family: ".Helvetica NeueUI"; font-weight: normal; font-style: normal; font-size: 12px
 
このエントリーをはてなブックマークに追加

2012年4月11日水曜日

iOSにおけるアプリのライフサイクルのイベントトリガ一覧

iOS5になってアプリのライフサイクルイベント仕様が少し変わっているのでGoogle Docsにまとめました。
が、スプレッドシートじゃなくてアクティビティ図にすればよかったと後悔しています。

このエントリーをはてなブックマークに追加

2012年4月6日金曜日

UITextViewでキャレットの位置を先頭、後尾に移動するパート2

先日作ったキャレット位置を先頭に移動したり、後尾に移動するメソッドがxcodeのAnalyze
でワーニングが出てしまうので作り直しました。


@interface UITextView (extend)
// キャレット位置の設定
typedef enum {
    UICTextViewCaretPositionHead = 0, // 先頭
    UICTextViewCaretPositionTail  // 後尾
}UICTextViewCaretPositionType;
- (void)setCaretPosition:(UICTextViewCaretPositionType)_caretPositionType; 
@end
   
@implementation UITextView (extend)
- (void)setCaretPosition:(UICTextViewCaretPositionType)_caretPositionType
{
 // キャレットを移動する為の選択範囲情報
 NSArray *rangesAtCaretPosition = [NSArray arrayWithObjects:
           [NSValue valueWithRange:(NSRange){0, 0}],      // 先頭
           [NSValue valueWithRange:(NSRange){[self.text length], 0}], // 後尾
          nil
           ];

 // 引数チェック
 if ([rangesAtCaretPosition count] <= _caretPositionType) {
  @throw [NSException exceptionWithName:@"invalid argument error" reason:@"out of range:_caretPositionType" userInfo:nil];
 }

 // キャレットを移動
 NSRange range;
 [[rangesAtCaretPosition objectAtIndex:_caretPositionType] getValue:&range];
 self.selectedRange = range;

}

@end
  
NSValueを使ってNSArrayに保存するように修正しまいた。
このエントリーをはてなブックマークに追加

2012年4月5日木曜日

[NSMutableString stringWithString:nil];で落ちた

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSPlaceholderMutableString initWithString:]: nil argument'
*** First throw call stack:
[NSMutableString stringWithString:_url];
 

メソッドの引数を[NSMutableString stringWithString:url];って実装してたら落ちました。どうやらnil指定だと落ちるようです。
nilの場合は空文字(@"")に置き換えてlogを出力するように修正しました。

if (nil == _url) {
  _url = @"";
  NSLog(@"url is nil");
 }
 
このエントリーをはてなブックマークに追加

2012年3月27日火曜日

UITextViewでキャレットの位置を先頭、後尾に移動する

UITextViewのキャレット位置を先頭に移動したり、後尾に移動するメソッドをつくりました。

@interface UITextView (extend)
// キャレット位置の設定
typedef enum {
    UICTextViewCaretPositionHead = 0, // 先頭
    UICTextViewCaretPositionTail  // 後尾
}UICTextViewCaretPositionType;
- (void)setCaretPosition:(UICTextViewCaretPositionType)_caretPositionType; 
@end
   
@implementation UITextView (extend)
- (void)setCaretPosition:(UICTextViewCaretPositionType)_caretPositionType
{
 // キャレットを移動する為の選択範囲情報
 const NSRange rangesAtCaretPosition[] = {
            {0, 0},     // 先頭
            {[self.text length], 0} // 後尾
           };
 // キャレットを移動
 self.selectedRange = rangesAtCaretPosition[_caretPositionType]; 

}

@end
  

※注目してほしいところ
  1. データとロジックを分けるという考え方に基づいて設計している。
  2. あれ?if文もswitch文も使われてないYO!
これanalyzeするとワーニングがでますね。orz


新しく記事を書いたよ
http://yskmanabe.blogspot.jp/2012/04/xcodeanalyze-interface-uitextview.html
このエントリーをはてなブックマークに追加

2012年3月26日月曜日

Objective-CでURLをaタグで囲む

ツイート内のURLをaタグで囲みたいよー
ということで囲んでくれるメソッドを作成しました。


あれ?pre使ってるのにうまく表示されない部分が。。。
<¥/%@>
の¥は削除してください。

正規表現を使って置換しています。
メソッド名がしっくりこないのは気のせいだろうか。。。
このエントリーをはてなブックマークに追加

2012年2月24日金曜日

Objective-CでTweetからハッシュタグを抽出する

「直近のtweetからハッシュタグを10件抽出して候補とする」って機能を実装する為に、tweetの文字列からハッシュタグの一覧を抽出するプログラムを作りますた。

1文字ずつパースしてはいないので実行速度はあまり速くないと思います。
- (NSArray *)hashTagFromString:(NSString *)_string
{
 NSMutableArray *result = [NSMutableArray array];
 NSInteger length = [_string length];
 NSRange validRange = {0, length};
 while (YES) {
  NSRange range = [_string rangeOfString:@"(^#[^ ]+ | #[^ ]+ | #[^ ]+$|^#[^ ]+$)" options:NSRegularExpressionSearch range:validRange];
  if (range.location == NSNotFound) {
   break;
  }
  NSString *hashTag = [_string substringWithRange:range];
  NSString *trimedHashTag = [hashTag stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  [result addObject:trimedHashTag];
  validRange.location = range.location + range.length;
  validRange.length = length - validRange.location;
 }
 
 return result;
 
}
※twitterAPIにてinclude_entities=trueをオプションしていするとハッシュタグ一覧を取得することができます。
このエントリーをはてなブックマークに追加

2012年2月22日水曜日

NSOperationのdeallocが呼ばれなくてハマりました

ひさしぶりにメモリ関連でハマりました。
NSOperationのdeallocが呼び出されなくてメモリーリークしまクリスティ。
setCompletionBlock内でoperation自身を参照したのが原因のようです。「自分で自分のリテインカウントをインクリメントして保持」てきなことが起こっているのかな?

// オペレーションがqueueから削除された時の処理設定
 [anOperation setCompletionBlock:^{
  // delegateに通知
  if (_delegate) {
   [_delegate netWorkConnector:self requestOperationCompleted:_request];
  }
  
  // 保持しているrequestの解放
  [operations removeObject:anOperation];
  if ([operations count] <= 0) {
   [self.delegateOperationDictionary removeObjectForKey:pointerOfDelegate];
  }
  GNRLoggerDebug(@"-- operation  completed --");
 }];
 

operationのアドレス情報を別変数に入れることで解決しました。
// オペレーションがqueueから削除された時の処理設定
 NSNumber *p = [NSNumber numberWithInteger:(NSInteger)anOperation];
 [anOperation setCompletionBlock:^{
  // delegateに通知
  if (_delegate) {
   [_delegate netWorkConnector:self requestOperationCompleted:_request];
  }
  
  // 保持しているrequestの解放
  [operations removeObject:(id)[p integerValue]];
  if ([operations count] <= 0) {
   [self.delegateOperationDictionary removeObjectForKey:pointerOfDelegate];
  }
  GNRLoggerDebug(@"-- operation  completed --");
 }];
 

まぁ原因の根本はBlocksの知識がしょっぱいからに違いない。。。
このエントリーをはてなブックマークに追加

2012年2月20日月曜日

No previous prototype for function 'functionname'ってwarningの対処

スタティックなメソッドなのにstaticが付いてませんでした。
なので
static int hoge;
こんな感じにstaticをつけてやることで解消しました。
このエントリーをはてなブックマークに追加

2012年2月19日日曜日

viewのx座標だけ、y座標だけ、widthだけ、heightだけ変更したい

UIViewのwidthだけ変更したいのに
@interface UIView (extend)
aView.frame = CGRectMake(aView.frame.origin.x, aView.frame.origin.y, 100, aView.frame.size.height);
@end
って書くのまんどくせー。
ってことで下記のようなUIViewの拡張メソッドを用意して使っています。

@interface UIView (extend)
- (void)setX:(NSInteger)x;
- (void)setY:(NSInteger)y;
- (void)setWidth:(NSInteger)width;
- (void)setHeight:(NSInteger)height;
- (void)setOrigin:(CGPoint)point;
- (void)setSize:(CGSize)size;
@end
 


#import "UIView+extend.h"


@implementation UIView (extend)



- (void)setX:(NSInteger)x

{

 self.frame = CGRectMake( x, self.frame.origin.y, self.frame.size.width, self.frame.size.height );

}

- (void)setY(NSInteger)y

{

 self.frame = CGRectMake( self.frame.origin.x, y, self.frame.size.width, self.frame.size.height );

}

- (void)setWidth:(NSInteger)width

{

 self.frame = CGRectMake( self.frame.origin.x, self.frame.origin.y, self, view.frame.size.height );

}

- (void)setHeight:(NSInteger)height

{

 self.frame = CGRectMake( view.frame.origin.x, view.frame.origin.y, view.frame.size.width, height );

}



- (void)setOrigin:(CGPoint)point {

 self.frame = CGRectMake(point.x, point.y, self.frame.size.width, self.frame.size.height);

}

- (void)setSize:(CGSize)size {

 self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, size.width, size.height);

}



- (void)setViewSizeHalf:(UIView*)view {

 view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width/2, view.frame.size.height/2);

}

@end
 

#import "Hoge.h"
#import "UIView+extend.h"

@implementation Hoge
- (id)init
{
 if (self = [super init]) {
  UIView *aView = [[[UIView alloc] init] autorelease];
  [aView setX:100];
 }
 return self;
}

@end
 
実績の無いソースコードなのでコピペじゃコンパイル通らないかもしれません。
このエントリーをはてなブックマークに追加

2012年2月17日金曜日

tabBarControllerに配置したnavigatioController内でviewControllerをpushした際にタブバーを非表示

タブターコントローラー(UITabBarController)に配置したナビゲーションコントローラー(UINavigatioController)内でviewControllerをpushした際にタブバー(tabbar)を非表示にするにはviewControllerのinitに下記コードを記述します。
-(id)init
{
 if( self=[super init] ){
  self.hidesBottomBarWhenPushed = YES;
 
 }
 return self;
}
 
ナビゲーションバー見たいにいつでも表示/非表示できないん?
このエントリーをはてなブックマークに追加