migr8

勤め先でDBのマイグレ管理されてなかったので導入してみました。

今までのマイグレーションのフロー

  1. ローカル環境で修正のち確認
  2. 問題がなければテスト環境に修正を適用
  3. Skypeを通じて変更用のSQLを共有

これからのマイグレーションのフロー

  1. ローカル環境で修正のち確認
  2. migr8が生成する履歴ファイルをGitLabにpush
  3. GitLabから自動で他の開発者に更新通知
  4. 修正者はテスト環境でGitLabから最新の履歴ファイルをpull
  5. migr8.rb upコマンドを実行してテスト環境を最新にする

これで何が幸せなの?

  • 「誰が」「なぜ」更新したのかを把握出来る。
  • 必ずGitLabにコミットするので、共有するのを忘れる事がなくなる。
  • 更新漏れがあっても更新する順番を意識しなくてもすむ。
  • GitLabを介するためデグレを素早く察知し出戻りが最小限で済む。

実際にやってみる

  1. usersテーブルを作成
  2. GitLabにコミット
  3. サーバに更新を適用

開発者のローカルとテスト環境、本番環境にmigr8をインストール
usersテーブルを作成

migr8.rb new -m "usersテーブルを作成しました"

するとエディタが開くので以下のように修正します。

version:     xjyg6058
desc:        usersテーブルを作成しました
author:      kkyouhei
vars:
  #変数が使えます
  - table:   users

#バージョンアップ時の動作 つまりこれから行う動作
up: | 
     create table ${table} (
          id        integer primary key auto_increment,
          name   varchar(255) not null unique
     );

#バージョンダウン時の動作 usersテーブルなんてやっぱり必要ないんだよ
down: |
  drop table ${table};

保存して終了したらDBをバージョンアップする。

migr8.rb up

DBにはusersテーブルが作成されて履歴ファイルが更新されています。


migr8

history.txt
--migrations

|
|--vawq3286.yaml

history.txtとmigrationsディレクトリをリモートリポジトリに追加する。

git add migr8/history.txt
git add migr8/migrations
git commit -m "usersテーブルを追加しました"
git push origin master

サーバにログインして以下のコマンドを実行

#リモートリポジトリから最新の履歴ファイルを取得
git pull origin master
#DBのバージョンアップ
migr8.rb up

これでサーバのDBが最新化されました。
履歴ファイルをリモートリポジトリにコミットした時点で
各開発者に通知が行くようにしてるので、開発者が気づいたら
ローカルの履歴ファイルをgit pullで最新化してサーバと同じ手順を踏み最新化を行います。

$ is not defined

$ is not defined
こいつのせいで小一時間はまってしまいました。

結論から言うとscriptタグの内容を誤タイプしてしまったせいで、
jQuery本体を正しく読み込んでなかったせいです。
個人的に間違えやすそうなところは

1.type属性
  type="javascript"としてしまったため、動きませんでした。
  ただしくは、type="text/javascript"

2.src属性
  ちゃんとjQuery本体までのパスを確認しましょうね。

3.最初にjQuery本体を読み込む
  外部ファイルにjQueryを書いている場合に起こります。


検索してたら他にもprototype.jsと一緒にjQueryを使っていると、
$ is not definedが出てしまうケースがあるそうです。

くだらないことで時間を無駄にしないようにしましょう。

多次元配列内にある空の要素を削除

大した物でもないけど下書き保存されていてかわいそうだったので公開

$hairetu1が整形対象の配列
$hairetu2が整形後の配列


1 foreach($hairetu as $key => $hairetu2){
2 foreach($hairetu2 as $key => $val){
3 if(empty($val)){
4 unset($hairetu2[$key]);
5 }
6 }
7 }

3次元以上になる場合はforeachを増やすだけです。


1 foreach($hairetu as $key => $hairetu2){
2 foreach($hairetu2 as $key => $hairetu3){
foreach($hairetu3 as $key => $key){
3 if(empty($val)){
4 unset($hairetu3[$key]);
5 }
}
6 }
7 }

デザイナー向けCakePHP勉強会に行って来た

デザイナー向けCakePHP勉強会

プログラマの卵ですけど第一回デザイナー向けの勉強会に参加してきました。

卒業制作でCakePHPを使ったWebサイトを構築してて、プログラマとかデザイナって分けるべきじゃないよね、って思ってたところにデザイナ向けCakeの勉強会があるじゃないか一石二鳥とはまさにこの事、ってのりで参加させてもらいました。

目次

  1. 開会(ごあいさつ)@mon_sat さん
  2. CakePHPについての基礎知識 @cakephperさん
  3. CakePHPのデザイン周りについて(初級編 @ecworks_masapさん
  4. MVCのVを極めるWebデザイナーになる @kara_dさん
  5. PHPTAL/CakePHP-TALTAL by @nojimage さん
  6. CakePHPのpaginatorのデザイン周り by @ogaaaan さん


開会(ごあいさつ) @mon_satさん

開催のきっかけ

  • プログラマとデザイナの架け橋になれば良いよね
  • デザイナがCakeを知っていればもっと短納期で良いものが作れたかもしれない

@mon_satさんからのお願い

  1. 今回学んだ事を明日から使えるような姿勢で参加しましょう。
  2. 知識はアウトプットして初めて定着するものなので、ブログに書きましょう。
  3. CakePHPのよさはコミュニティにあり、共通する物に興味がある人同士で交流して知識の向上を図りましょう。

発表者さん資料一覧

CakePHPのデザイン周りについて @ecworks_masapさん

スライド資料

MVCのVを極めるWebデザイナーになる @kara_dさん

PHPTAL/CakePHP-TALTAL by @nojimageさん

CakePHPのpaginatorのデザイン周り by @ogaaaanさん

思ったことなど


@mon_satさんの開会の言葉にあったように、デザイナとプログラマの架け橋になるような勉強会でした。
参加して感じたのが、デザイナからプログラマへ歩み寄る事は出来ても、プログラマからデザイナへ歩み寄る事は難しいって事ですね。
デザインってセンスなんかによる所が大きそうですし、敷居が高いように感じます。
僕が思う一番の敷居としてツールにあるんじゃないですかね。
例えばCakeを使ったWebサイトを作ろうとしたらまず、エディタとPHPとWebサーバとデータベースとCakeが必要ですけど、これって全部無料で手に入るものばかりです。
一方デザインにはフォトショップなどのツールが必要?で結構なお値段しますよね。
僕はデザイン系のツールをあんまり知らないので、多分って言うかきっと無料のものもあると思いますが、勉強会の前にあったCakeCafeで学割りが利くうちにアドビの購入を勧められるほど、有料と無料の差は相当大きいんだろうと思ってみたり。
だからどうなんだって話なんですが、やっぱりプログラマとデザイナは一つになることはないな、と。
しかしお互いが仕事しやすく努力する事は出来るわけで、これをどう実現するかが問題なんじゃないかな。
@nojimageさんが発表されていたようにPHPTALを導入するとか、黒い画面(Gitとか)の勉強をデザイナさんとするとかね。
今あげた物を見返してみても、やっぱりプログラマはデザイナさんに歩み寄ってもらうように助力は出来ても、自分から歩み寄る事って難しい事を再確認しました。
じゃあプログラマはどうすりゃいいのか自分なりにいくつか考えてみました。

  1. 自分の分野の教養を広げる&深める
  2. デザイナさんの業務内容を知る
  3. 1ピクセルへの熱い思いを理解する

1についてMVCモデルをきちんと理解して、設計できるようにして、デザイナさんとの仕事の切り分けをすると。
2は相手の仕事を理解していなければ、お互い良い仕事が出来るわけないですし、どう歩み寄ればいいのかわかりませんので。
最後のはCakeCafeに参加した時に、デザイナさんの方達の話で1ピクセルがどうのとか話していたので、そんなこだわりのある1ピクセルをぞんざいな扱い出来ませんよね、1ピクセルへの思いを理解しよう。
長くなってしまいましたが、何を言いたいのかと言いますと。
プログラマはデザイン出来なくても、デザイナの仕事を理解して協力し、デザイナの方がPHP恐怖症克服のために情報共有を行えば世界に平和が訪れるんじゃない?って事です。

今の技術レベルでは出来ませんが、次は普通に参加するのではなくて、フォームヘルパーについての発表とか出来たら良いなー、とか妄想に浸ってみたり。

cakePHP入門編

最近PHPフレームワークの、勉強を始めたので備忘録として、cakePHPについて書き連ねる事にしまふ。

MVCモデルってなんぞ?なんてのはぐぐれば腐るほど出て来たので省略いたしまぷ。

開発環境

  1. MacOS X
  2. xampp 1.7.3
  3. cakePHP 1.3.9

cakePHPの規則

作成したモデルやビューは、決められた名前、決められた場所に保存しなければ、きちんと動作しません。

なので、こちらでは命名規則とフォルダの役割について解説します。

フォルダ構成

まず最初にcakePHPのフォルダ構成についてです。


上記の図以外にもいくつかフォルダはありますが、主に使用するフォルダはModels Views Controllersの3点なので、ざっくりと説明します。

Model
作成したモデルを保存するフォルダ
Views
作成したビューを保存するフォルダ
Controllers
作成したコントローラを保存するフォルダ

そのまんまですね、実にわかりやすい。


命名規則

ファイルやクラス名などもcakePHPがきちんと認識してくれるように、命名規則に沿った命名の仕方があるのでご紹介します。

ファイル
ファイル名に複数単語を記述する場合はアンダースコアで単語を区切り命名します。
かっこ内は任意の名前を設定することができます。
コントローラ [example]_controller
ビュー(テンプレート) [example]/[example].ctp
ビュー(レイアウト) layouts/[example].ctp
モデル [example].php
クラス名・メソッド名
クラス名を複数の単語でつなげていくときはアンダースコアを使わずに、単語の最初の文字を大文字にして、以下の文字を小文字にします。
メソッドは最初の単語のみ全て小文字で、二つ目の単語から大文字で記述という書き方です。
コントローラ・クラス [Example]Controller
モデル・クラス [Example]Model
メソッド [exampleMethod]()

規則の説明は大体こんな感じです。

次回からは実際にコントローラ、ビューの作成の仕方をご紹介いたします。

htmlファイルでもphpを実行させる

タイトル通り拡張子がhtmlのファイルでもphpを実行するようにapacheの設定ファイルを変更していきます。

httpdファイルの編集

confディレクトリ内にあるhttpdファイルを開き、以下の記述を探して追加して下さい。


AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

AddType application/x-httpd-php .php .html .htm ←追加
AddType application/x-httpd-php-source .phps ←追加

追加したら保存し、apacheを再起動したらhtmlファイルでもphpが走るようになります。

apacheのインストール

何を血迷ったかWebサイトを立ち上げようと思い、

Apacheのインストールで、ちょっとつまづいたので対処方法をアウトプット。

インストール時に起きた問題

  1. 80番ポートが他のサービスにより使用されているため、インストール時に「make_sock could not bind to address 0.0.0.0.80」とエラーが出る
  2. http://localhost/」接続出来ない 「http://127.0.0.1」接続出来る

原因と対処方法

インストール時のエラー「make_sock could not bind to address 0.0.0.0.80」
原因:インストール時に80番ポートが他のサービスにより使用されている
  1. コマンドプロンプトを開き netstat -oan を入力
  2. ローカルアドレス「0.0.0.0:80」の行を探して、80番ポートを使用しているPIDを覚える
  3. タスクマネージャを起動して、プロセス 表示 列の選択からPIDにチェックする
  4. 80番ポートを使用していたプロセスをPIDから割り出してプロセスを終了させる
  5. Apacheを再インストールする

http://127.0.0.1は接続出来るが /http://localhost/接続出来ない
原因:自分自身を挿す「127.0.0.1」が「localhost」に対応付けられていない
  1. C:\Windows\System32\drivers\etc\hosts を開く
  2. ::1 localhost この文字列の文頭に # を付けてコメントアウトする
  3. 127.0.0.1 localhost この文字列を加えて保存

hostsファイルを開くには管理者権限を持っていないと開けないので、
管理者ユーザにログインしてから編集を行うと良いかもです。