【mysql】テーブルのカラムを削除する

 

■1つのカラムだけ削除するコマンド

alter table [table_name(対象のテーブル名)] drop [column_name (削除するカラム名)];

 

■同時に複数のカラムを削除するコマンド

alter table [table_name(対象のテーブル名)] drop [column_name (削除するカラム名1)], drop [column2_name (削除するカラム名2)], drop [column3_name (削除するカラム名3)];

Amazon Web Servicesではじめる新米プログラマのためのクラウド超入門

サーバー構築経験が少ないアプリエンジニアにも安心! イチから分かるクラウド入門!
クラウドサービスの普及により、業務システム開発においても「クラウドファースト」と呼ばれる開発スタイルの採用が増えてきました。本書は、クラウドサービスの最大手「Amazon Web Services(AWS)」を使って、クラウドでのシステム開発手法を説明する入門書です。一言にAWSと言っても、提供されるサービスが多岐にわたり、どこから手をつけてよいか分からない、という声もよく聞きます。本書では、クラウドに最適化されたアーキテクチャではなく、レガシーアーキテクチャを採用し、業務システムで広く使われているJavaによるWebシステムを構築する手順を紹介することで、AWSを初めて利用する人へのハードルを低くしています。AWSの基本的な考え方や操作方法に十分に慣れたところで、クラウドネイティブなアーキテクチャでシステムを構築し、無理のないクラウド化を進めていただくことが狙いです。

(引用:https://www.amazon.co.jp/)

 

 

【NetBeans】PHPUnitとSeleniumを使用したテストを行う方法

01

PHP向けのNetBeans IDEは、PHPUnit自動化テストをサポートしています。PHPUnitによって、NetBeans IDEでは、IDEがPythonに提供するコード・カバレージと同じように、PHPのコード・カバレージが提供されます。テストの出力は、IDEのJUnitおよびPythonのテスト・ランナーが使用するのと同じ、機能が豊富な出力ウィンドウに表示されます。
NetBeans IDEでは、PHPUnitに加えて、Seleniumの移植可能なテスト・フレームワークもサポートされています。Seleniumプラグインは、更新センターから入手できます。このプラグインをインストールすると、SeleniumサーバーがIDEの登録済サーバーに追加され、Seleniumのテスト・オプションがPHPのメニューに追加されます。

(引用:https://netbeans.org/kb/docs/php/phpunit_ja.html

 

【目次】

このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます
PHPUnitのインストール
PHPUnitテストの作成と実行
テスト・グループの使用
テスト結果とIDE出力
コード・カバレージ
プロジェクト固有の構成の使用
Seleniumフレームワークでのテストの実行

FuelPHPで自作関数をまとめたファイルはどこに置いて呼び出したら良いのか問題

正解は

./fuel/app/classes/ 以下にルールに従って配置します。

 

■/fuel/app/classes/hoge.php

<?php
class Hoge {
public static function run01($var)
 {
 return $var . ' fuga.';
 }
}

 

■呼び出し例)

<?php
 class Controller_Welcome extends Controller
 {
 public function action_index()
 {
 $fuga = Hoge::run01('aaaaa');// hogeクラス
 return Response::forge(View::forge('welcome/index'));
 }
 }

このような処理で動かす

■/fuel/app/classes/hogeutil/validation.php

階層を持った置き方

<?php
class HogeUtil_Validation {
 public static function validate01($string) {
 return $string . ' 01の処理が行われました';
 }
 public static function validate02($string) {
 return $string . ' 02の処理が行われました';
 }
 public static function _validation_is_unique($val, $field)
 {
 $flag = false;
 return $flag;
 }
}

HogeUtilを呼び出しつついろいろ処理実行します。

 

fuelPHP1.6で同じControllerの別アクションに遷移するときの記述方法

FuelPHPの場合一つのControllerに複数のアクションを定義することができる。

(例えばよくある入力・確認・完了画面が一つのContorllerで実装されたりする)

その際にバリデーションとかで確認アクションの処理を途中で中断して同一Controller内の入力アクションに処理を移行したいことがままある。そういったときはFuelPHPでは以下のとおり指定してあげるだけでOK。

(引用:http://aswww.hatenablog.com/entry/2013/11/27/124334)

//同Controllerのaction_input()を返す

return $this->action_input($param);

シンプル。$this->template->contentに入れたり、View::forge使ったりする必要はありません。

MySQLのデータベースをコマンドで復元する

MySQLのデータベースをmysqldumpでバックアップする」で実行したバックアップファイルを使って復元する方法について。

①特定のデータベースのみ復元する方法

②全てのデータベースを復元する方法

 

■特定のデータベースのみ復元する方法

事前にバックアップとして取得しておいた特定のデータベースの dump ファイルから、復元する方法は次のコマンド。

※事前にバックアップとして取得しておいたデータベースの dump ファイルは必須

$ mysql -u ユーザー名 -p データベース名 < dumpファイル名

実行例)

$ mysql -u root -p test01< /tmp/mysqldump_test01.dump

 

■全てのデータベースを復元する方法

全てのデータベースを復元する方法は次のコマンド。

※事前にバックアップとして取得しておいたデータベースの dump ファイルは必須

$ mysql -u ユーザー名 -p < dumpファイル名

全ての場合はデータベース名が不要なんですね。

実行例)

$ mysql -u root -p < /tmp/mysqldump_all_db.dump

完了

mysqlのデータベースを「バックアップする方法」と「復元する方法」について以上!

 

MySQLのデータベースをmysqldumpでバックアップする

mysqlのデータベースを「バックアップする方法」と「復元する方法」について!

 

■バックアップには2通りの方法がある

①特定のデータベースのみバックアップする

②全てのデータベースをバックアップする

 

【重要】バックアップする前に知っておいて欲しい mysqldump コマンドのオプション

–single-transaction

これはInnoDB のトランザクションを利用してバックアップを取得することができる。

例えばバックアップの対象となるデータが膨大で、バックアップに1時間かかるとする。 そうした場合でもトランザクションを利用してくれるので、バックアップを開始した時点のデータも(1時間後に)終了する間際のデータも全く整合性のとれたデータであることを保証してくれます。

–single-transaction オプションは何も考えずにつけておくと良いものです。

 

■MySQL:特定のデータベースのデータを dump(バックアップ)する

次のコマンドで行います。

$ mysqldump --single-transaction -u DBユーザ名 -p DB名 > 出力先ファイル名

 

実行例)

DBユーザーはroot で test01 という名前のデータベースを/tmp/mysqldump_test01.dump というファイル名でバックアップしたい場合は、次のようになる。

実行するとパスワードを設定している場合はパスワードを聞かれるので、パスワードを入力してバックアップ完了となります。

$ mysqldump --single-transaction -u root -p test01 > /tmp/mysqldump_test01.dump

Enter password:(入力)

完了

 

■MySQL:全てのデータベースのデータを dump(バックアップ)する

次のコマンド

$ mysqldump --single-transaction -u root -p -x --all-databases > 出力ファイル名

 

【重要】オプション -x

は、全てのデータベースの全てのテーブルをロックするためのオプション。 バックアップ中のデータの操作を禁止します。

実行例)

DB ユーザー名 root で全てのデータベースを /tmp/mysql_all_db.dump というファイル名でバックアップしたい場合は、次のようになります。

$ mysqldump --single-transaction -u root -p -x --all-databases > /tmp/mysql_all_db.dump

 

完了!

復元する方法」についてはこちら

FuelPHPのOrmはキャッシュが有効なせいで思わぬ不具合を引き起こす場合があったりする

■キャッシュとは
何らかのデータにアクセスした際、2度目以降の参照でより高速にアクセスできるような方法でそのデータを複製しておく仕組みを、キャッシュと呼びます。
先に前提知識の確認のため、PHPでの簡単なキャッシュの実装を示します。
例えばDBへの問い合わせのような重い処理で手に入れたデータを複数回利用する場合、一度取得した結果は配列に格納することで、2度目以降は実際のDBへのアクセスを行わず、高速にそのデータを参照することができる。

(参考:http://tech.respect-pal.jp/fuelphp-orm-cache/)

 

■参考コード

class Model_Test extends \Orm\Model
{
    private static $cache = [];

public function get_by_id($id)
{
if (!isset(static::$cache[$id]))
{
static::$cache[$id] = static::query()
->where(‘id’, $id)
->get_one();
}
return static::$cache[$id];
}
}

 

rmのオブジェクトキャッシュはModelに設定されたプライマリキーの値*1をキー、クエリに伴って構築したOrmオブジェクトを値とする連想配列で保持されています。

Ormオブジェクトは

  • find()やquery()で最初にレコードを取り出した際
  • save()でDBへのINSERTが行われる際

にキャッシュへ登録され、2度目以降に同じレコードのオブジェクトをプライマリキーのみでfind()して取得する際、すなわちfind($pk)はほぼ配列からデータを取り出すだけの処理となり、非常に高速に動作します。しかし、純粋に速度的な面でキャッシュが有効に使われ、まともな効果が出るのはこのケースだけです。

$test = Model_Test::find(1); // 1回目はDBにクエリを飛ばす
$test2 = Model_Test::find(1); // 2回目以降はキャッシュから取り出すだけで超速い

 

しかし基本的に、この際のキャッシュ参照は速度的な面において、プライマリキーでのfind()のような劇的な効果をもたらすものではありません。ここでのキャッシュの参照は実際にDBへのクエリを飛ばしデータを取得した後、メモリのどこへ取得したデータを放り込むかを決めるものであって、DBアクセスはバイパスされず、もっぱらオブジェクトの使い回しによるメモリ使用量削減とオブジェクト生成処理省略の効果しか出ないということです

 

プライマリキー以外を条件にデータを取得する際はもちろん、たとえ結果的にプライマリーキーのみを条件にデータを取得する場合であっても、find($pk)の形でただ1つの引数のみを与える使い方以外では、高速なキャッシュの参照は行われません。

$test = Model_Test::find(1); // クエリが飛ぶ
$test = Model_Test::find('first', [ // クエリが飛ぶ
 'where' => [
 ['id' => 1]
 ]
]);
$test = Model_Test::query() // 何かしらのユニークキーで取得
 ->where('unique_key', 1)
 ->get_one();
$test = Model_Test::query()
 ->where('unique_key', 1) // 同じユニークキーで取得しても当然クエリが飛ぶ
 ->get_one();

 

プライマリキーだけではなく他のユニークキーを使ってキャッシュの恩恵を得たい場合や、ある程度複雑なクエリを飛ばす回数をキャッシュで減らしたい場合は、自前で取得結果のキャッシュを行う必要がある。

 

■Ormのキャッシュをクリアする方法
FuelPHPのOrmでは、デフォルトの機能としてはキャッシュをクリアする方法が提供されていません。

このため、たとえばバッチ処理にOrmが使用され、数十万ものOrmオブジェクトを生成するようなことがあった場合、少し悲しいことが起きるかもしれません。Ormの利用コード側が各オブジェクトの参照を手放した後も、キャッシュが参照を握り続けることによって、GCによるメモリ領域の回収が行われず、PHPの実行環境で許容されるメモリ容量を食い潰してしまう可能性があります。

foreach ($超たくさんのid as $id)
{
 // キャッシュにOrmオブジェクトが登録される
 $test = Model_Test::find($id);
 
 // キャッシュが参照を握ってるので、unsetや次のループで$testを上書きしてもGCされない
 unset($test);
} // 実行しおわる前にPHPがメモリ容量不足で死ぬ

 

そもそも、バッチ処理にOrmのような重い方法を使おうとするのは賢い選択とは言えません。が、たとえ性能が犠牲になったとしても、なるべくクエリビルダや生SQLといった他の手段の利用を避けたいケースはあり得ます。たとえば、システムの他の部分での利便性のためにOrmを採用していて、Model側の処理の多くがOrm特有の機能(Observerやリレーション定義)に依存している場合など

現状の内部実装に依存した方法であってもよいので、とにかくキャッシュをクリアしながらOrmを利用したいという場合、オブジェクトキャッシュはOrm\Modelのprotectedメンバ$_cached_objectsに連想配列として保持されているため、継承でこれを空にするメソッドを加えることで、キャッシュをクリアすることができます

class Model_Test extends \Orm\Model
{
 public static clear_cache()
 {
 static::$_cached_objects[get_called_class()] = [];
 }
}

 

データの取得時にキャッシュを無視する(無効化する)方法
データの取得時に、一旦オブジェクトキャッシュを無視したいという場合があります。

例えばFuelPHPのOrmはfind()やquery()の際にselectを使うことができ、一部のカラムについてのみデータを取得することで、DBからフェッチするデータの量を減らして最適化することができます。

$test = Model_Test::query()
 ->select('id') // 「id」カラムのみフェッチ、他のプロパティはnullになる
 ->where('id', 1)
 ->get_one();

 

問題は、この一部のカラムについてのみデータを取得し構築したOrmオブジェクトが、やはりキャッシュに登録されてしまうということです。

処理のはじめの方でselectによってカラムを絞り、半端に構築したOrmオブジェクトが、後でカラムを絞らずにプライマリキーで()find()しようとした際にもキャッシュから取得されるため、本来有効な値の入っているべきプロパティからnullが取得されるというような、予想外のバグを引き起こす可能性があります

他にもアプリケーション側の何らかの都合によって、Ormを通したデータ取得とOrmを通さないデータ更新が交互に行われるようなことがあった場合、実際のDBデータとキャッシュで内容にズレが生じてしまうことになるため、この場合もキャッシュから取得されるデータを使うのはバグの元になります。

また当然、Ormによるデータ更新をDB::rollback_transaction()で巻き戻した場合も、オブジェクトキャッシュの内容は巻き戻らず、DBデータとのズレが発生します。

最初にselectでカラムを絞って取得した後、次にfind($pk)の形で別のselect条件で同じレコードのOrmオブジェクトを取得する際は、先に述べた方法でキャッシュをまるごと破棄してしまうのも1つの対処法です。ただそこまでしなくとも、find()やquery()に与える設定でfrom_cache(false)を使うことで、データ取得の際にクエリ単位でキャッシュを無視させることもできます

$partial = Model_Test::query() // 「id」カラムのみフェッチ
 ->select('id')
 ->where('id', 1)
 ->get_one();
 
$complete = Model_Test::query() // キャッシュを無視して取得
 ->where('id', 1)
 ->from_cache(false)
 ->get_one();

 

1・プライマリキーのみでのfind()以外の場合については特別に対策されている筈なのですが(*)、実際にはやはりキャッシュされた内容だけが取得されます。なんとなくバグな気がします。
2・from_cache()は、こういったキャッシュ問題へのworkaroundとしてOrmへ後付けされたものです

ORMは便利なツールである一方、使ってよいケースとダメなケースとがあり、ダメなケースの多くは性能的な問題の解決が困難となるケースです。

 

 

「子どもの側にいたい」リモートワークを広めるコミュニティ「リモートワークジャーニー」

シングルマザーだから私がいない間に子どもが外に遊びに行こうとしたら、止める人がいないんです。子どもが難しい時期に自分はちゃんと向き合えない、残業ありきで働くことに疑問と限界を感じていました。家で「お帰り」と迎えてあげるためにはどうしたらいいか。リモートワークできる会社を探そうとWantedlyに登録しました

(引用:http://www.huffingtonpost.jp/remo/ako-nakayama_b_12768360.html