migrateエラーの対応策をメモ
maigrateをしようとして「Already on the latest migration for app:default.」
エラーとなった
事象発生手順
1.oil generate migrationコマンドで生成されたマイグレーションファイルを実行。
oil refine migrate // 又はoil r migrate
2.作成されたテーブルを削除
drop table [table名]
3.再びマイグレーションファイルを実行
oil refine migrate // 又はoil r migrate
結果:
「Already on the latest migration for app:default.」発生
既にマイグレーションは最新の状態ですといった内容
解決策
1.マイグレーションの実行で作成されたmigrationテーブルの対象のレコードを削除する
2.下記コマンドを実行
oil refine migrate:current // 又はoil r migrate:current
公式サイト:http://press.nekoget.com/fuelphp_doc/general/migrations.html
DB::queryの戻り値をModel型で返す方法をメモ
データベースへクエリを投げる方法が多々あるが、副問い合わせなどを使用した複雑なSQLなどになるとSQLを直接書いた方が可読性を考えてもよい
※直接SQLを実行する場合にはエスケープ処理をは自動的に行われないため、手動でいれることが必要になる
select文(稀にupdate文も)に限って言うとSQL直接記述のほうが今後のカスタマイズなど考えてもトータル間違いない。この場合crudすべてをSQL直接記述にしたほうが統一していいが、便利なメソッドもあるので、適時使い分けるのがいい。
データベースへクエリを実行する方法
データベース処理を行う方法
1.DBクラスのDB::queryメソッドで直接SQLを記述してクエリを実行する
2.DBクラスのクエリビルダーメソッドを使用してクエリを実行する
3.orm/Modelクラスの静的メソッドを使用してクエリを実行する
「1.DBクラスのDB::queryメソッドで直接SQLを記述してクエリを実行する」を使う場合と「3.orm/Modelクラスの静的メソッドを使用してクエリを実行する」を使う場合だと戻り値の型が違う。戻り値に関しては「3.orm/Modelクラスの静的メソッドを使用してクエリを実行する」の場合にはorm/Modelが返り、modelに関わるメソッドを備えているためなにかと便利。
そのため、DB::queryをmodel型に変換する方法をメモ
※参考:http://docs.fuelphp.com/classes/database/usage.html
Orm/Modelを継承したModel_Userを用意
protected static $_properties = array( 'id', 'username', 'password', 'group', 'email', 'last_login', 'created_at', 'updated_at' );
「3.orm/Modelクラスの静的メソッドを使用してクエリを実行する」でusername,passwordに一致するレコードを取得
$users = Model_User::find( 'all', array('username' => $username,'password' => $password) );
array 2 => object(Model_User)[32] protected '_is_new' => boolean false protected '_frozen' => boolean false protected '_data' => array 'id' => string '2' (length=1) 'username' => string 'admin' (length=5) 'password' => string '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8' (length=40) 'group' => string '1' (length=1) 'email' => string 'test@hotmail.com' (length=16) 'last_login' => string '1' (length=1) 'created_at' => string '111111111' (length=9) 'updated_at' => string '1356073749' (length=10) protected '_original' => array 'id' => string '2' (length=1) 'username' => string 'admin' (length=5) 'password' => string '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8' (length=40) 'group' => string '1' (length=1) 'email' => string 'test@hotmail.com' (length=16) 'last_login' => string '1' (length=1) 'created_at' => string '111111111' (length=9) 'updated_at' => string '1356073749' (length=10) protected '_data_relations' => array empty protected '_original_relations' => array empty protected '_reset_relations' => array empty protected '_view' => null protected '_iterable' => array empty
「1.DBクラスのDB::queryメソッドで直接SQLを記述してクエリを実行する」でusername,passwordに一致するレコードを取得
「3.orm/Modelクラスの静的メソッドを使用してクエリを実行する」と同様に戻り値の型をMode_Userにするためにはas_objectメソッドでオブジェクト名を指定する必要がある。さらにas_arrayメソッドで配列へ変換することも同時に必要。これで実行すると同様の結果になる。
※bindメソッドでエスケープ処理を行っている
$users = DB::query( 'SELECT * FROM tb_users WHERE username = :username AND password = :password' ) ->bind('username', $username) ->bind('password' , $password) ->as_object('Model_User') ->execute() ->as_array();
array 0 => object(Model_User)[33] protected '_is_new' => boolean false protected '_frozen' => boolean false protected '_data' => array 'id' => string '2' (length=1) 'username' => string 'admin' (length=5) 'password' => string '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8' (length=40) 'group' => string '1' (length=1) 'email' => string 'test@hotmail.com' (length=16) 'last_login' => string '1' (length=1) 'created_at' => string '111111111' (length=9) 'updated_at' => string '1356073881' (length=10) protected '_original' => array 'id' => string '2' (length=1) 'username' => string 'admin' (length=5) 'password' => string '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8' (length=40) 'group' => string '1' (length=1) 'email' => string 'test@hotmail.com' (length=16) 'last_login' => string '1' (length=1) 'created_at' => string '111111111' (length=9) 'updated_at' => string '1356073881' (length=10) protected '_data_relations' => array empty protected '_original_relations' => array empty protected '_reset_relations' => array empty protected '_view' => null protected '_iterable' => array empty
戻り値の型がModel_Userになっている
created_atとupdated_atのUNIXタイムスタンプとdatetimeについてメモ
FuelPHPは規約に従うとテーブルカラムのcreated_at と updated_at はデフォルトUNIX タイム スタンプで記録 します。datetimeで保存することも可能。UNIXタイムスタンプとdatetimeを変換することが結構ありそうなのでメモ。2038年問題があがっているのでdatetimeがいいかな。
created_at とupdated_atをdatetimeで保存する方法
mysql_timestamp のデフォルト値「false」を「true」にすればOK
create_at
protected static $_observers = array( 'Orm\Observer_CreatedAt' => array( 'events' => array('before_insert'), 'mysql_timestamp' => true, 'property' => 'created', ), );
update_at
protected static $_observers = array( 'Orm\Observer_UpdatedAt' => array( 'events' => array('before_save'), 'mysql_timestamp' => true, 'property' => 'updated', ), );
まとめて設定
protected static $_observers = array( 'Orm\Observer_CreatedAt' => array('events'=>array('before_insert'), 'mysql_timestamp' => true,), 'Orm\Observer_UpdatedAt' => array('events'=>array('before_save'), 'mysql_timestamp' => true,), );
公式サイト:http://fuelphp.com/docs/packages/orm/observers/included.html
UNIXタイムスタンプとdatetimeを変換
datetimeをUNIXタイムスタンプに変換
$date = "2012-12-12 12:12:12"; echo strtotime($date);
UNIXタイムスタンプをdatetimeに変換
$date = time(); echo date("Y-m-d H:i:s",$date);
いまさらですがafreechart公式サイトで現行作成できるグラフ・チャートでライブラリが存在しないことが分かりました。jfreechartはレーダーチャートのAPIがあるので当然あるだろうと高をくくってしまっておりました。
・公式サイト:http://afreechart.googlecode.com/svn/doc/screenshot/index.html
行き当たりばったりなやり方だったのでブログ的にも失敗しました。
次は別のライブラリを検討してレーダーチャートを作成することにします。
<<ライブラリの配置>>
■ライブラリをダウンロード
以下サイトより最新のライブラリをダウンロード
http://code.google.com/p/afreechart/downloads/list
※現在はafreechart-0.0.4.jarが最新
■ダウンロードしたライブラリをプロジェクトへ取り込み
Eclipseの場合はlipフォルダへ配置して「外部ライブラリ追加」処理を行う
仕事上Androidでレーダーチャートを使う場面になったので作ってみようかと思います。
Androidではグラフやチャートを表示するUI(コントロール)はデフォルトでは用意されておりません。
そのため独自に実装する必要がありますが、1から作ろうとすると結構手間です。
レーダーチャートはラジアン値から、sin(X座標またはY座標)、cos(X座標またはY座標)で座標を取得してチャートを起点となる位置から表示するなどのメソッドを用意する必要があります。特に難しくはありません。下記コードはライブラリを使わずに独自にカスタムビューで作成したものです。このコードはラジアン値より、90度210度330度と3点のチャートにしています。点が増えるたびにそれぞれ作成する必要がありそうで手間です。後半の起点の微調整は即席なのでご了承。
protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.RED); double rd1 = Math.toRadians(90); double rd2 = Math.toRadians(210); double rd3 = Math.toRadians(330); float maxVal = 100; float df1X =(float)Math.cos(rd1) * maxVal; float df1Y =(float)Math.sin(rd1) * maxVal; float df2X =(float)Math.cos(rd2) * maxVal; float df2Y =(float)Math.sin(rd2) * maxVal; float df3X =(float)Math.cos(rd3) * maxVal; float df3Y =(float)Math.sin(rd3) * maxVal; Path path = new Path(); path.moveTo((105+df1X),(-80+df1Y)); path.lineTo((105+df2X),(220+df2Y)); path.lineTo((105+df3X),(220+df3Y)); canvas.drawPath(path, paint); }
位置の調整が特にメンドクサイのでライブラリを使うことにします。
今回試すのはjavaでも有名なjfreechartという棒グラフ,折れ線グラフ,円グラフ,ガントチャートなどを簡単に作成できるライブラリのAndroid版ということで、afreechartというライブラリを使います。
すでにいいサンプルがあるかとググルとレーダーチャートを実践しているサンプルがみつからないので、ライブラリを駆使して作成することにします。
今回はここまで。
code golfや学校課題でメジャーなfizzbuzz問題を考えてみた事をメモ
javaで考えようとしたが、classやmainが必須のためcodegolfは向いていないのでphpで考える。
調べると一番codegolfのストロークが短くすむ言語はperlになっている。ruby,javascriptもいいらしい。さすがにC#,javaは入ってない。
fizzbuzz問題とは
1から100までの数を出力するプログラム。
3の倍数「fizz」、5の倍数「buzz」と出力し、3と5両方の倍数は「fizzbuzz」と出力する
一応頑張って限界まで考えたコード(82バイト)
<?for($i=0;@$i++<100;)echo($i%3&&$i%5?$i:($i%3?"":"fizz").($i%5?"":"buzz"))."¥n";
ネットから最短コードと言われている59バイトのfizzbuzz
<?for(;$i++<100;)echo$i%3?$i%5?$i:"":Fizz,$i%5?"":Buzz," ";
これはオタクすぎて考えつかない。
ただ、関数を使う事も許されているので、標準ライブラリでメソッド名1文字のfizzbuzzメソッドができたらもっと短くなる。
codegolfの問題を考えるうちに日本語で文章を書くときも同様に短めにかきたくなってきた。
coffee-break
Don't write code that useless.
1日5杯はコーヒー、カフェオレ飲みます。狭心症のため安静にします☆松本 雄貴
Kotlinでサービスリリース目指す!
iOSでチャットアプリ作成中。自然言語解析LSIを習得中
Mac / Android・iOS / Rails / Oracle
2017年 Lpic L2取得
2012年 Android技術者資格取得
2010年 OracleMasterGold10g取得
2008年 CCNAQiitaもたまに投稿
https://qiita.com/y-matsumoto東京近郊で常駐開発探してる方はこちらよりご連絡ください
SES企業でパートナー会社を探している企業様はこちらよりご連絡ください
スプリットカメラ iOS / Android
音声認識で聞いた日付から曜日当てアプリ Android
ソーシャルタイマー Android
カテゴリー
- ActiveRecord (2)
- Android (52)
- AndroidStudio (10)
- Ansible (1)
- AWS (1)
- Bash (18)
- Blog (7)
- BootStrap (1)
- CentOS (16)
- Chef (1)
- css (2)
- Eclipse (5)
- error (1)
- Facebook (2)
- Firebase (1)
- FuelPHP (16)
- Git (22)
- GitHub (3)
- Gradle (2)
- GraphAPI (1)
- Grunt (1)
- heroku (2)
- illustrator (1)
- iOS (17)
- Java (4)
- Jenkins (1)
- jQuery (3)
- Kotlin (2)
- Mac (22)
- nginx (1)
- Node.js (3)
- peco (1)
- php (5)
- Python (1)
- Rails (16)
- Ruby (11)
- shell (1)
- SNS (1)
- Swift (2)
- tmux (2)
- Vagrant (6)
- Vim (6)
- windows (2)
- WordPress (3)
- zsh (4)
- フリーランス (1)
- ライブラリ (1)
- 勉強会 (2)
- 宣伝 (1)
- 未分類 (2)
最近の投稿
- [MAC]HighSierraでgitプッシュエラー「Unable to negotiate with xxx.xxx.xxx.xxx port xx: no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se fatal: Could not read from remote repository.」
- [iOS]iOS11からFacebook,Twitter連携(シェアなど)廃止の対応方法
- [iOS]速報2017AppleSpecialEventのiOS11、iPhone8など発表内容について
- [iOS][Firebase]The default Firebase app has not yet been configured. Add `[FIRApp configure];
- [iOS]2017年9月リリースのiOS11で開発者が対応するべきこと
- 今人気の現金化サービスCASH(キャッシュ)を使ったレビュー
- [Pandoc][Mac]pandocでmarkdownからwordファイル作成
- [Android]映画サマーウォーズの聞いた日付(誕生日)から曜日当てをアプリ音声認識で簡単に実現
- [Android]起動しているActivityを取得するadb shell コマンド
- [Android][Kotlin]kotlin学習で参考になるサイト一覧
2024年4月 月 火 水 木 金 土 日 « 5月 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 アーカイブ
- 2018年5月
- 2017年9月
- 2017年8月
- 2017年7月
- 2017年6月
- 2017年5月
- 2017年2月
- 2017年1月
- 2016年12月
- 2016年7月
- 2016年6月
- 2016年1月
- 2015年12月
- 2015年11月
- 2015年10月
- 2015年9月
- 2015年8月
- 2015年7月
- 2015年6月
- 2015年5月
- 2015年4月
- 2015年3月
- 2015年2月
- 2015年1月
- 2014年12月
- 2014年11月
- 2014年6月
- 2014年5月
- 2014年4月
- 2014年3月
- 2014年2月
- 2014年1月
- 2013年12月
- 2013年11月
- 2013年9月
- 2013年8月
- 2013年7月
- 2013年6月
- 2013年5月
- 2013年4月
- 2013年3月
- 2013年2月
- 2013年1月
- 2012年12月
- 2012年10月
- 2012年5月
- 2010年6月
おすすめ備忘録
- [BootStrap]BootStrap2レイアウトを3へ移行する※変更されたクラス名など確認
- [FuelPHP]opauthライブラリでFacebook認証を速攻実装する
- [FuelPHP]GitHubエラー:fatal: Not a git repository: fuel/core/../../.git/modules/fuel/core
- [Android]localhostエラー:org.apache.http.conn.HttpHostConnectException: Connection to http://localhost refused
- [FuelPHP]完成?:独自オリジナル認証ドライバをsimpleauthを参考に実装する3
エントリ