商売力開発ブログ

非エンジニアがWebサービスの開発、運営によって商売力をつける記録、その他の雑記

Laravelのマイグレーション機能の活用①

今回はPHPフレームワークの一つのLaravelの中から、データベースのマイグレーションの機能の利用に当たって、我々の活用方法を紹介します。マイグレーションの概要については以前の内容を参考にして下さい。
今回利用するDBはMySQLですが、他のDBでもほぼ同様に対応できます。

Laravelのマイグレーションファイルの変更

以下はLaravelのマイグレーションファイルの例です。

class CreateSamplesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('samples', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name',255);
            $table->string('foreign_cd',5);
            $table->integer('sample_num');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('samples');
    }
}

テーブルのコメントを設定する

今回はMySQLを使用していますが、作成したテーブルにコメントを設定したいと思います。テーブルのコメントを設定するメソッドは用意されていませんが、DBファサードのstatementメソッドを使用すれば任意のSQLが実行できるようになっています。つまりテーブルを作成した後に、statementメソッドを利用して「ALTER TABLE」を実行してテーブルに対して変更を加えることが可能です。コメントの場合は以下のようにします。

DB::statement("ALTER TABLE ".DB::getTablePrefix()."samples COMMENT 'サンプルテーブル'");

これをそのまま追加するのも良いですが、「samples」というテーブル名はupメソッド、downメソッドの他の部分にも使用されています。であればこのクラスのプロパティ(メンバ変数)としてテーブル名を設定した方が良さそうです。

class CreateSamplesTable extends Migration
{
    public $tbl_name='samples';//テーブル名のプロパティ追加
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create($this->tbl_name, function (Blueprint $table) {
            $table->increments('id');
            $table->string('name',255);
            $table->string('foreign_cd',5);
            $table->integer('sample_num');
        });
        // add comments
        DB::statement("ALTER TABLE ".DB::getTablePrefix().$this->tbl_name." COMMENT 'サンプルテーブル'");
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists($this->tbl_name);
    }
}

tbl_nameプロパティを追加して、upメソッドのSchema::createとコメント設定部分、downメソッドのSchema::dropIfExistsにこのプロパティを設定しました。
これで、このマイグレーションファイルをコピーして別のテーブルを作成する場合、テーブル名に関してはこのプロパティを変更するだけで問題ないようになりました。ちょっとした内容ですが、downメソッドのテーブル名を間違っている場合はロールバックするまで気付かなかったりするので、この対応をしておくと気にする必要がなくなります。

まとめ

今回はLaravelのマイグレーションの我々の活用方法の一部を紹介しました。
ここまでで準備が整った状態で、ここからまた別の活用方法があるのですが、長くなるのでまた別の機会で紹介したいと思います。

以上

Laravelのデータベースのマイグレーション機能

今回はPHPフレームワークの一つのLaravelの中から、データベースのマイグレーションの機能について、その概要を紹介します。
今回利用するDBはMySQLですが、他のDBでもほぼ同様に対応できます。

Laravelのマイグレーションの機能の概要

Laravelでマイグレーションと呼んでいるものはデータベースのバージョンコントロールのような機能です。LaravelのArtisanコマンドを使用して、データベースへテーブルを追加したりテーブルの定義を変更するマイグレーションファイルを作成できます。この作成したマイグレーションファイルの実行、ロールバック、一括処理をArtisanコマンドで簡単に行うことができるようになっています。
以下のコマンドでマイグレーションファイルのうち、未実行のマイグレーションを全て実行します。

php artisan migrate

以下のコマンドで最後に実行したマイグレーションをまとめて元に戻します。複数のマイグレーションも戻ることになります。

php artisan migrate:rollback

以下のコマンドは全てのマイグレーションをロールバックします。

php artisan migrate:reset

最新の状態にするために一度リセットした後、マイグレーションを実行するとマイグレーションは全てまとめて行われることになります。(ちなみにrefreshで、リセットとマイグレーションを合わせて行うこともできます。)この状態でロールバックすると全てがロールバック対象となります。マイグレーションファイルの名前にはタイムスタンプが含まれていますが、これらに関係なくマイグレーションの実行単位でグルーピングされ、ロールバックはその単位で行われます。

では実際のマイグレーションファイルはどうなっているか見てみましょう。
以下はLaravelのインストール時に追加される、「2014_10_12_000000_create_users_table.php」です。

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

upとdownの2つのメソッドで構成され、upメソッドがマイグレーションの実行時の対象メソッドで、downメソッドがロールバックやリセットの対象メソッドになります。こちらを実行すると「users」というテーブルが作成されることになります。ロールバックをすると「users」というテーブルが削除されるという状態になっています。

マイグレーションの実行単位を変更して、特定のマイグレーションをロールバックできるようにする

マイグレーションの実行単位でグルーピングされるのは既に言及していますが、この状態だと特定のテーブルだけロールバックして作成しなおすといったことができず不便なことがあります。
この実行単位のグループはテーブルで管理されているため、そのテーブルを更新することでグルーピングの状態を変更することが可能です。その管理テーブルの状態は以下のSQLで確認することができます。

Select * From migrations
Order By batch desc,id

「migrations」は3カラムのテーブルで「id」がAUTO_INCREMENTの主キー、「migration」がマイグレーションファイル名、「batch」が実行グループを意味するINT型の整数になっています。
1度しかマイグレーションを実行していない場合、batchカラムは「1」のものだけとなります。この状態でマイグレーションを実行するとbatchカラムが「2」、もう一度実行するとbatchカラムが「3」という具合に、マイグレーションの実行単位ごとに数値が振られたレコードが作成されていきます。そしてロールバックはこのbatchの最大値のものが対象となります。
よって特定のマイグレーションをロールバックしたい場合は、その実行マイグレーションのレコードのbatchの値を最大値に更新してから、ロールバックすることで対応することができるのです。

注意事項

こちらの対応方法は正式な手順としてサポートされているものではありません。実際の環境で行う場合は自己責任となりますのでご注意下さい。我々は良くやっていますが(笑)
ちなみにbatchの値は最大値と記載している通り、連番である必要はないようです。ソースは確認していませんが、現状(Laravel5)はロールバックのときにmigrationsテーブルのbatchカラムの最大値を抽出して対象としているようです。
またmigrationsテーブルのmigrationカラムが対象のマイグレーションファイル名を意味していますので、こちらを間違って変更してしまいロールバックをするとエラーとなります。これは逆にロールバックやリセット前に、マイグレーションファイル名を変更してしまった場合に、ロールバックやリセットを行うとエラーとなる動作と一致します。

まとめ

今回はLaravelのマイグレーションの概要について紹介しました。こちらの機能を非エンジニアが知った時は、管理が相当楽になり非常に便利になる機能だと思いました。実際に使用してみると色々できて本当に便利です。 Laravelを使用している方はこちらのマイグレーションの機能を利用すると色々と捗ると思います。
今回はマイグレーションの概要でしたが、次回以降に我々の開発での活用方法をご紹介したいと思います。

以上

映画「スリー・ビルボード」感想

息抜きがてら映画「スリー・ビルボード」を鑑賞。予想のできない映画でかなりの良作だったので感想・レビューを残しておきたいと思います。ネタバレもあるのでまだ見てない人はご注意ください。

あらすじ

アメリカはミズーリ州の田舎町エビング。さびれた道路に立ち並ぶ、忘れ去られた3枚の広告看板に、ある日突然メッセージが現れる。──それは、7カ月前に娘を殺されたミルドレッド・ヘイズ(フランシス・マクドーマンド)が、一向に進展しない捜査に腹を立て、エビング広告社のレッド・ウェルビー(ケイレブ・ランドリー・ジョーンズ)と1年間の契約を交わして出した広告だった。

※引用:映画公式ホームページより

www.foxmovies-jp.com


『スリー・ビルボード』予告編 | Three Billboards Outside Ebbing, Missouri Trailer

3枚の看板と3人の物語

ストーリーは主人公のミルドレッドが広告屋に依頼して出した以下の3枚の看板
「レイプされて死んだ」
「逮捕はまだ?」
「どうして?ウィロビー署長」
を設置したことから展開していきます。が、この映画の感想を検索してみると、ストーリーの説明が難しいといった意見が結構あります。犯人捜しが続く展開ではなく、看板の設置を契機にもたらした人間ドラマを中心に進んでいくのですが、それがどんなストーリーかと説明するのが難しいのです。
主な登場人物は主人公で偏屈で頑固なミルドレッド、広告に名指しされたウィロビー署長、そしてこの田舎町の不良警官ディクソン、この3人を軸にしてストーリーが転がっていくのですが、見ている観客からすると本当に予期せぬ方向に転がっていきます。

おそらくどれかのキャラクターに感情移入して見るタイプの人には、何も解決しない展開が少し物足りないというか中々入り込めないのではないかという気がします。そもそも登場するどのキャラクターも一筋縄ではいかない人たちばかりです。

またこの手の上手い作品の特徴で、ところどころ笑えるシーンも良い感じで入っていて、緊張感のあるシーンとのバランスがまた可笑しくさせます。

いたるとろこに表れる「ズレ」

この映画のポイントと思ったのは「ズレ」、それも「認識のズレ」です。それがズレたままだったり、ズレに気付いたりして物語の起伏を作っている気がします。
差別や暴力が普通にあるアメリカの田舎町を背景・舞台装置にして、「俺はデートのつもりさ」という小男、娘が実は親父の方がよかったと知ったミルドレッド、ウィロビー署長が自殺したのはミルドレッドのせいだと考える人々、犯人を見つけたと確信するディクソン、いたるところにズレが描かれます。
顔に大火傷を負って誰だかわからない状態のディクソンに対して、「大丈夫かい」と声をかける大怪我の広告屋。実はそれが自分を病院送りにした張本人であるディクソン(そもそもこのディクソンの広告屋に対する暴力とかズレ過ぎでしょ)と知らされたときの広告屋の対応、オレンジジュースのシーンは印象的だ。

そもそも看板も犯人に向けてではなく、警察に向けられたメッセージであるのもズレていると言えるし、警察も捜査をせずに怠慢にしていたわけではなく、それなりに捜査をしていたので警察へのメッセージとしてもズレているのかもしれない。
いやそもそも被害者家族からしたら、警察がどんなに捜査していようと、犯人が捕まらなければ何も意味がなく「一生懸命捜査したんだ」ということがズレているのかもしれない。

と感想を抱きながら、そんなことを考えてる私がズレているのかもしれない、と思わせる作品です。

ラストは犯人ではないが悪人の元へショットガンを携えて向かうミルドレッドとディクソン、本当はあまり行きたくないと言いながら、「警察署に火を着けたのは私よ」と告げるミルドレッドに「そんな事をするのはあんたぐらいしかいないだろ」とディクソン、「あいつを殺すのか?」のディクソンの問いに「それは道々考えればいいわ」と応えるミルドレッド。

最後まで色々なズレが利いています。

スタッフ・キャストなど

監督はマーティン・マクドナーというイギリス人で脚本も担当しています。こんな脚本を作れるだけでも凄いですね。才能がある人が羨ましい(笑)
他の作品についても見てみたくなりました。

主演はフランシス・マクドーマンド、予告編だけ見てもその偏屈そうな雰囲気が出てて凄い存在感ですです。「ファーゴ」でアカデミー主演女優賞取ってますが、個人的には最近たまたま見た「あの頃ペニー・レインと」の怖い母親役が印象に残ってます。この映画とは違う怖さが出てます。

まとめ

今回は公開中の映画「スリー・ビルボード」の感想・レビューでした。映画館でなくても、その内もう一回は見たいと私は思いました。それだけの何かがある作品である気がします。

気になった方は一度見てみてはいかがでしょうか。

以上

Project-Alphaのガントチャートの機能紹介~その1

今回は我々が開発しているプロジェクト管理ツールProject-Alpha(プロジェクトアルファ)のガントチャートについて一部の機能を紹介します。
Project-Alpha(プロジェクトアルファ)は無料、フリーで利用できるプロジェクト管理ツールでガントチャートなどを利用して、複数のプロジェクトを平行して管理でき、一括して状況を把握することができます。

※こちらの機能は2018/02時点のものとなります。最新の機能では変更されている可能性があります。

ガントチャートの機能

マウス操作による設定

カレンダー部分をクリックすることで予定の開始/終了日付が設定することができます。
以下はカレンダーをクリックして予定を設定するイメージとなります。

予定についてはクリックで設定することが可能です。開始/終了日付が設定されるとその期間に応じた横棒が表示されます。実績についてはセルへの入力することで横棒が表示されます。
この横棒の右端にカーソルを合わせるとマウスを利用してサイズ変更が可能となっており、伸縮することで終了日付を変更することが可能です。横棒はドラッグ&ドロップで横に移動することが可能で、これにより開始/終了日付が変更することができます。予定については親階層となっている横棒を移動することで、子階層も合わせて移動することが可能となっています。(実績の日付を一括して変更するような運用は想定していないため、実績の親階層は移動することはできないようにしています。)

Excel(エクセル)からのコピー&ペーストへの対応

Project-Alphaでは、ガントチャートのデータをExcelからコピペで簡単に設定することが可能となっています。
以下はExcelからのコピペのイメージとなります。

IDについてはカンマの数から自動で判定し階層と数値を設定しています。(プロジェクトの設定でカンマではなく、ハイフンやアンダースコアにすることも可能です。)

現在、別のExcelファイルでガントチャートやWBSなどを作成している場合、Project-Alphaの列に合わせてExcelファイルを変更すれば、コピペだけですぐにガントチャートを利用できることになります。これにより実行中のプロジェクトでも最小の移行作業だけで気軽にご利用いただけます。

Excel(エクセル)への出力

ガントチャートをほぼそのままのイメージでExcelに出力しダウンロードすることが可能です。
以下は出力されたExcelファイルのイメージです。

こちらのExcelファイルには関数や条件付き書式が自動設定された状態で生成されており、このExcelファイル自体をガントチャートとして利用できるようになっています。(マクロは使用していません。Excelで作成するガントチャートのサンプルファイルとしてもご利用いただけます。)
Project-Alphaで共有できないメンバーにはこちらのExcelファイルを利用して、そのまま情報共有することに活用できますので、作業時間の短縮が可能です。またガントチャートはExcelからのコピペにも対応しているため、Excelファイル上の内容を更新した後にコピペで簡単に内容を移行することができます。
例えばプロジェクトのお客様など別組織のメンバーとは一時的にExcelファイルを利用して情報共有をして、最新のデータは常にProject-Alphaに持たせることで効率的なプロジェクト管理をすることができます。

Excelファイルでは以下のようなことが可能となっております。

  1. 親階層となっている行の開始/終了日付には関数により、自動で子階層から日付を取得するようになっています。子階層が変更した場合、自動で反映されます。
  2. 親階層となっている行の工数には関数により、自動で子階層から合計を取得するようになっています。子階層が変更した場合、自動で反映されます。
  3. 基準日付を過ぎた開始/終了の予定日付について、実績の欄に入力がないと遅延と判定し、対象となる予定と実績のセルの背景色がピンク色になります。また基準日付はTODAY関数が設定されています。
  4. 開始/終了日付に応じてカレンダー部分に自動で着色されます。
  5. 日付単位を変更するとカレンダーの部分の表示が自動で切り替わります。

まとめ

今回はProject-Alphaのガントチャートについて一部の機能を紹介しました。この他にも多くの機能がありますので、それらについては別でまたご紹介しようと思ってます。
ご興味のある方はぜひ一度ご利用してみ下さい。現在はクローズドβ版となっておりますの右上のプロフィールのお問合せ先か「こちら」をクリックしてご連絡下さい。

home.prj-alpha.biz

以上

プロジェクト管理・マネジメントに初めてのガントチャート

ガントチャートは多くのプロジェクトなどで利用されているスケジュール管理ツールの一つになります。Excelなどの表計算ソフトや、専用ソフト・サービスで作成することができます。今回はガントチャートを知らない人や、知っているが使ったことのない人に向けて、ガントチャートの内容とその使い方をご紹介していきます。

ガントチャートの概要

まずはイメージを持つために、ガントチャートの例を見てましょう。

これはExcelで作成されたガントチャートの例になります。工程やタスク・担当・日付などを縦軸にし、日付などの時間を横軸に配置され、この日付上に各項目に対応する期間を横棒など視覚的にわかるように表現されたものになります。例えば各項目が対応する期間はいつ頃か、並行している項目は何かがわかり易くなります。

ガントチャートを作成するには

ガントチャートを作成するには、管理対象となるタスクなどの項目とそれに対応する開始と終了日付の情報が最低限必要になります。これにより横軸の時間項目に対応する期間が表現されます。
この他に、項目の担当者、状況を示す情報、工数などの作業量、進捗状況を表す数値などで構成されます。また日付に関しても予定と実績で別けて管理することもあります。これらの列項目は実行するプロジェクトや工程に求められる管理レベルによって必要性が変わってきますので、その実行する内容に応じて設定しましょう。

各行は管理する作業単位となりタスクと呼ばれることが多いです。この作業単位を作成していく必要がありますが、一般的にはWBSと呼ばれる計画手法を用いて階層構造で表現していきます。WBSでは、必要な作業を洗い出しそれを細分化していきますが、どこまで細分化するかは求められる管理レベルによります。例えば複数人のチームで行うプロジェクトの場合、最低でも作業を実行する担当者とプロジェクトの管理者との間で共通の認識が得られるレベルまで細分化します。

作業単位を作成し列項目を内容を設定し、対応する期間が表現できればガントチャートは作成できたことになります。ガントチャートの作成ソフトの中には、ここから更に作業の前後依存関係を設定し表現できるものもあります。

ガントチャートを使う効果

ガントチャートはプロジェクトの開始前の計画段階で作成します。開始前の段階で実施すべき作業が網羅的にできることと、その実施予定のスケジュールの全体感が誰にでも簡単に把握でき、共通認識が進む効果があります。例えば作業の担当者は自分が行う作業の内容と実施時期が把握できますし、プロジェクトの管理者は発注者であるお客様とプロジェクトの開始段階で実施する作業内容や時期、役割分担について合意するのに役立てることもできます。

そしてプロジェクトの開始後は、各作業の進捗に関する情報を更新していくことで、各作業の進捗状況が一覧で確認することが可能となります。多くのガントチャートでは各作業が開始しているか終了しているかや進捗状況を、色分けなどして視覚的に判断しやすくなっており、各作業の状況が誰でも簡単に一覧で把握できるようになっています。遅延が発生している作業については担当者に確認して、調整するようにしましょう。作業の前後依存関係を設定できるガントチャート作成ソフトを利用している場合は、作業の予定期間に変更が生じた場合に影響するその他の作業が把握できるようになってますので、影響範囲を確認しながら調整することが可能です。

このようにガントチャートを使うことで、各作業の状況を管理しながらプロジェクトの関係者と情報共有を効果的に行うことができます。

まとめ

今回はガントチャートを知らない人や、知っているが使ったことのない人に向けて、その内容と使い方を簡単ではありますがご紹介しました。スケジュール管理ツールの1つとして、ガントチャートを利用した方が良い場合はこちらをお役立て下さい。 

以上

ブログ名で効果を測る

ブログ名で検索してみる

スモールビジネスでは営業に人員を十分に割けなかったり、広告費もほとんど用意することができないことが多いと思います。我々もその例に漏れず、そのためこのようにブログなどを活用して、できるだけ知名度を上げるように努力するわけです。

このブログで効率的に宣伝できれば良いのですが、何をもって効率的かを判定する必要がありますね。
効率的にできるか(できてるか)の判定方法の一つとして、ブログ名で検索してみて表示されるかを基準とすることにしました。
上位表示されればブログ名としてはとりあえず合格ということです。

ここまで2つの投稿をした段階で、ブログのタイトルをGoogle検索してみてどうなるかを見てみましょう。ブログ名は「商品力開発ブログ」なので何パターンか試してみました。

「商売力」で検索した結果

「商品力」でググった結果はこちらです。

さすがにこれでは表示されてこないですね。ただ少し確認してみると3ページ目に挨拶の投稿がヒットしていました!2つの投稿のうちの1つが早くもヒットするとは、はなかなか期待できる結果です。

「商売力開発」、「商売力 開発」で検索した結果

「商品力開発」でググった結果はこちらです。

見事に上位を独占してこのブログが表示されました!「商売力開発」なんて単語の組合せは通常使わないと思うので、これは狙い通りです。

続いて、「商品力 開発」でググった結果はこちらです。

こちらも独占してこのブログが表示されました!「商売力開発」同様にうまくいきました。

「商売力 ブログ」で検索した結果

「商品力 ブログ」でググった結果はこちらです。

こちらもまたまた独占してこのブログが表示されました!ここまでうまく上位表示されるとは想定外です(笑)

 総括

今回、ブログ名でググってみて、ほとんど投稿していない現時点でもかなり良い結果を得ることができました!合格と言えるでしょう。
これは「商売力」という単語のチョイスが良かったからだと思います。「商売」と「力」、それぞれの単語だとありふれてますが、結合するとありそうであまり使われない組合せがこの結果を導きました。
この「○○力」というのは結構使える単語な気がします。「人事力」、「個性力」とか微妙にあまり使われない組合せをブログ名に入れると、読者にはイメージがつきやすい上にSEOに強い名前になってるかもしれません。
皆さんも参考にしてみてはいかがでしょうか。

以上

自戦力紹介

自戦力といっても一人しかいないので、自己紹介と同じです。

経歴関連

大学は理工学部の電気系学科を卒業。
新卒で業務パッケージソフトを開発・販売している会社に就職、約2年半弱の勤務でパッケージソフトの導入業務を経験。退職後に約2年間の無職期間を経て、業務パッケージソフトの開発・販売している現在の会社に就職。現時点で約10年間が経過。パッケージソフトの導入業務を約7年、プリセールスを約2年、製品企画を約1年経験。
大半の期間を業務パッケージ導入コンサルタントといった位置付けで従事。

資格としては最初の会社で簿記三級を取得しただけだが、主に経理業務とその周辺業務に関するパッケージソフトの導入や業務改善のプロジェクトをいくつも経験。

開発スキル関連

業務を通して身に付けた開発系のスキルとしては、パッケージソフトがMSSQLやOracleのDBを使用していたので、その調査をするためのSQLは良く書いていました。プログラミングは学生時代に授業や研究室で少し使ったが身に付いたと言えるものはほぼなく、業務ではVBAを少し使った程度です。

Webサービスを開発するために学んだスキル

約4年半前から、Webサービスを作れるようになろうと独学で開発するための勉強を開始。プログラミング、データベースなどの開発技術だけでなく、経営戦略、マーケティング、ファイナンスなども並行して勉強をしています。
開発技術についての勉強を開始してからの期間としては以下のようなイメージです。

  • JavascriptというかjQueryとCSSのフロントエンドから勉強し始めて約4年半
  • PHP、MySQLが約2年半、PHPはFrameworkとしてLaravelを利用
  • クラウド環境としてはAWSを触り始めて約半年

非エンジニアがWebサービスを開発するための最低限の技術を何とか習得したと言えるレベルの段階です。インフラ関連はどうしても経験値が低くこれからもっと勉強しないとダメだなぁと思う今日この頃です。

今後の意気込み

Webサービスをただ開発して運営するだけでなく、商売として成立するためにはどうしたら良いかといった視点での発信もしていきたいと思います。
というわけで、現状この程度の戦力ですが宜しくお願いします。