喫茶店を遊牧しながら勉強したり開発したりする大学院生のブログです。katty0324MacにWEBの開発環境整えた。Macで開発できるようにします。今までWindowsとxampp環境でゴリゴリ開発してましたが、しばらくMac一本で行くことになりそうなので、Macの方にもWEBの開発環境を作りました。非常に個人的な内容が含まれてて、これからMacに環境構築するには冗長な部分があります。Worksが見えて、もうWEBサーバが動いてることが分かります。テキトーなところにWeb用のディレクトリを作る。どっかからソースコードをダウンロードしてくる。restartこれでPHPが動くようになるはず。開くと、~/Web/projectの中に配置したページが表示されます。3のインストール愛するAptanaをインストールします。Windowsの時と同じ環境で開発できるのはありがたい。パーフェクトとは思いませんが使いやすい統合開発環境だと思います。3http://www.aptana.com/MySQLのインストールhttp://www.mysql.com/MySQLのサイトからダウンロードします。DMGというやつをダウンロードしました。展開したら、3つのプログラムを順番に実行していきます。これでMySQLサーバ起動完了。restartMySQLサーバは立ち上がってるんですが、PHPから接続できなくて、「アレ?」となりますが、php.iniの設定を1行書き換えると接続できるようになります。katty0324MySQLのレプリケーションできたー。サーバ1台態勢から脱却できるように頑張ろう。はじめにMySQLのレプリケーションに挑戦してみたのでその記録です。レプリケーションって何?「レプリカ」を作ること、データベースサーバの複製を作ることです。WEBサイトへのアクセスが増えて1台のデータベースサーバでさばききれなくなった場合などに使います。1台でさばけないなら2台にすればいいんですが、2台のデータベースサーバが同じデータをもつようにしてやらねばなりません。その一つの方法がレプリケーションです。1台目をマスター、2台目をスレーブとして、主従関係をもたせます。データベースへの更新処理はマスターに対してのみ行なって、マスターには常に最新のデータがあることを保証します。マスターに対する更新処理のログを残しておき、それを定期的にスレーブにも実行します。するとマスターに対して少し遅れをとるものの、スレーブもマスターと同じ内容にすることができます。そもそも「1台のデータベースサーバで十分です。」という状況ではレプリケーションは必要ありません。データベースサーバを増やしたくなるのは、性能を上げたいとか、システムがダウンしないように予備を用意しておきたいとか、そういう場合です。(アクセスの少ないサイトを、落ちたら諦めようというスタンスで運営していた場合必要ないと思います。)レプリケーションで何をしたの?MySQLのバックアップを定期的に取りたいと思いました。mysqldumpというコマンドを使えば、データベースの内容をテキストに落としこんでくれます。mysqldump.sql--optのオプションについて。mysqldumpの実行中にデータベースの中身が書き変わってしまうと、データに不整合が生じる危険性があるので、mysqldumpの実行中はデータベースの書き込みをロックしています。書き込みがロックされている間にWEBサイトにアクセスしてくれた人は、ロックが解除されるまでアクセスができないという状態になります。(更新系クエリがなければアクセスできます)そこで、レプリケーションを組んで、スレーブ側でmysqldumpを実行すれば良いんじゃないかと思いました。マスター側だけでWEBサイトが動いている状況では、スレーブをロックしてもサイトには影響を及ぼしません。スレーブにはレプリケーションによってマスター側と同じものがコピーされているはずなので、これをmysqldumpすれば良いという寸法です。(そもそもレプリケーションが正しく行われないかもしれない・・・という心配がありますが、とりあえず無視しておきます。以下のページを見ながらやっただけなので、こちらを見たほうが分かりやすいと思います。レプリケーションのセットアップ手順http://wadslab.net/wiki/index.php?MySQL%20%A5%EC%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3%A4%CE%A5%BB%A5%C3%A5%C8%A5%A2%A5%C3%A5%D7%BC%EA%BD%E7設定は、マスターサーバと、スレーブサーバを行ったりきたりします。どちらもさくらVPSを使っていて、マスターはサービス用にそこそこ良いやつ、スレーブは前に契約して余っていた一番安いやつです。作業ログ緑色はmysql内やvim内で入力する内容。赤色は適宜書き換えるところです。マスターのIPが49.212.yyy.yyyで、スレーブのIPが49.212.xxx.xxxとしています。slave;バックアップの取り方レプリケーションと関係ないですが、目的が自動バックアップをとるところだったので、そのあたりも書いておきます。mysqldumpを実行するシェルスクリプトをcronで定期的に実行させてやるだけです。/home/user/bak_mysql.shおわりにサーバ2台使うならスレーブ側にも読み込み系処理をさせたら良いではないかとか、バックアップとるだけなら他に方法がとか、セキュリティ的にとか、気づいたことがあればどうか突っ込んでください。落ちないiPhoneアプリが作りたい自分のための、押さえておくべきポイントたくさん。iPhoneアプリは良く落ちる。ランキングで上位に入ったり、話題になったりしているアプリでも落ちる時は落ちる。落ちるか?原因のほとんどは、解放済みのオブジェクトにメッセージを送ってしまうことだと思います。メモリ不足で落ちる?「メモリ不足で落ちる」という言葉も良く使いますが、本質的にはメモリが不足する自動的にオブジェクトが解放される解放されたオブジェクトにメッセージが送られるエラーという流れで生じるものだと思います。この問題の解決策は、ふたつ。メモリを無駄に使わない(メモリリークを無くす)メモリ不足などによって解放されたオブジェクトにメッセージが送られないようにするそのために気をつけるべきことなどを以下に列挙します。initしたら参照カウントが増えるので、かならずreleaseする。非常に基本的なことですが、確保したものは解放します。release];クラスメソッドで初期化した場合はreleaseしない。次の例のようにクラスメソッドで初期化する場合があります。この場合、autoreleaseの状態、つまり後ほど自動でreleaseが送られることになっているため、自分ではreleaseしません。...処理...CF〜Create()で作られたオブジェクトはCFRelease()で開放する。CF〜Create()という関数で作られたオブジェクトも必ず解放する必要があります。...処理...CFRelease(dataref);viewDidUnloadはいつ呼ばれる?viewDidUnloadというメソッド名を見ると、まるでビューが閉じる時に呼ばれそうなものですが、これは勘違い。一度も呼ばれることなくビューが開いて閉じることも多々あります。いつ呼ばれるかといえば、低メモリ状態になった時です。低メモリ時、最前面で表示されているもの以外のビューコントローラにはviewDidUnloadが呼ばれます。viewDidLoadで確保した変数はviewDidUnloadでreleaseする。viewDidUnloadされたビューコントローラは、画面が空っぽになってしまいます。使っている最中のビューコントローラが空になっても、問題がないのは、次に表示されるときに再びviewDidLoadが呼ばれて画面を作り直すためです。1回目のviewDidLoadで確保したオブジェクトをviewDidUnloadで解放していないと、2回目のviewDidLoadをするときにメモリリークを起こします。viewDidLoadで確保したオブジェクトはviewDidUnloadで解放します。initとviewDidLoadで確保したメモリはdeallocでreleaseする。上でも書いたように処理が終わってビューコントローラが閉じる時には、viewDidLoadは呼ばれません。deallocだけが呼ばれます。したがって、initで確保したオブジェクトはもちろん、viewDidLoadで確保したものも解放する必要があります。didReceiveMemoryWarningでオブジェクトを解放する時はnilを代入する。低メモリ状態になると、確保されている全てのビューコントローラにdidRecieveMemoryWarningが呼ばれます。viewDidUnloadは、ビューコントローラが閉じた状態になると、もう呼ばれません。didReceiveMemoryWarningはメモリが足りなくなるたびに何度でも呼ばれます。ここで注意しなければならないことは、1回目のdidReceiveMemoryWarningで解放されたオブジェクトに、2回目のdidReceiveMemoryWarningで再びreleaseが送られるとクラッシュします。そこで、didReceiveMemoryWarning内で解放したオブジェクトにはnilを代入して、二度目の解放処理が行われないようにします。(nilはreleaseを受け取ってもクラッシュしないためです)というかオブジェクトを解放する時はnilを代入する。解放後にメッセージが送られる可能性があるオブジェクトを解放する時は、releaseだけでなくnilの代入が必要です。ない場合でも、nilを代入して悪いことはないです。nil;プロパティとして定義されているものは、nilを代入して解放する。プロパティとして定義されている変数はセッターにreleaseの処理が含まれているので、nilを代入するだけで済みます。nil;この解放手段は、プロパティがassignかretainかcopyか考える必要がなくて一石二鳥です。http://iphone-dev.g.hatena.ne.jp/tokorom/20100314/1268591111ただし、次のように書いてしまうとセッターが働かず解放できないので注意。nilマルチスレッドの場合は、全てのスレッドでNSAutoreleasePoolを作成する。NSAutoreleasePoolはスレッド内でのみ有効なので、新たにスレッドを立てる場合はNSAutoreleasePoolを作成する必要があります。ループ内など大量のオブジェクトを確保するところでは、局所的にNSAutoreleasePoolを作成する。ループ内でオブジェクトを確保するような処理では、大量のメモリを消費するので、NSAutoreleasePoolを局所的に作成するなどして、ループが1周するたびにメモリを解放するようにしてやります。UIScrollViewでaddSubviewをする場合は、画面外に出たviewをremoveFromSuperviewする。UITableViewでは画面外に出たセルを自動的に再利用する機構がありますが、UIScrollViewにはありません。したがって、そのような機構を自作するなどして画面外に出たviewを閉じることでメモリ使用量を削減します。メモリ使用量の取得方法プロファイラなどを使えば見えるが、プログラム中で値として取得したい場合http://d.hatena.ne.jp/kimada/20090405/1238914098#20090405f1メモリリークを調べる。Xcode4をRunではなくAnalyzeで実行することで、本質的にメモリリークになる部分を全て指摘してくれます。これを全てつぶしても、動的に生じるメモリリークは残るので、更にProfileで実行してメモリリークをプロファイルします。これでひとつずつ確認して原因を潰していく作業が待っています。メモリ警告シミュレーションの仕方iOSシミュレータのメニューから、メモリ警告シミュレーションを実行できる。これでメモリ不足の警告を出し、つまり背面のビューコントローラをUnloadしたりして、メモリリークが起きたり、解放されたオブジェクトにメッセージが送られるようなプログラムになっていないかを確認します。おわりに以上で終わりです。勉強しながらまとめたものですので、もし誤っているところがありましたら、お知らせください。喫茶店を遊牧しながら勉強・開発していた社会人1年目です。My365、がんばって作っています。LeopardにWEBの開発環境を整えるMySQLのレプリケーションの設定(とMySQLの自動バックアップ)落ちないiPhoneアプリが作りたい自分のための、押さえておくべきポイントたくさん。WorldさくらVPSでWEBサーバを立てるまでの作業まとめ。