Rails4.2 直接SQLのupdate文で更新した結果がレコードセットに乗らないケース
ActiveRecordのキャッシュが原因。
コントローラ内で下記のようなコードを続けて書いて実行する。
其の一:findでレコードを取得する
其の二:同じレコードの内容を更新するSQLのupdate文を書いてexecuteする
其の三:其の一と同じコードで、同じレコードを取得する
其の三で再取得しているので、最新の内容が返ってくると思ったら大間違い。
Railsは其の一でクエリーをキャッシュする。次に同じクエリーになる場合はDBに問い合わせずキャッシュした値が返る。save等を使って更新するとキャッシュがクリアされるので、次回は最新の内容が返ってくる。またキャッシュされてその繰り返し。通常はそーやって成り立っているが、其の二でSQL文を書いているので、キャッシュがクリアされず、其の三では其の一でキャッシュした値が返る。
SQL文を書いているのはそれなりに理由があるのでやめたくはない。
uncachedでキャッシュさせないことができる。
個別にuncachedするより、ブロック(範囲)指定できるのでブロック指定で解決した。
ActiveRecord::Base.uncached { # ここに其の一から其の三まで入れた }
CakePHP 3.5 Model\Tableクラスの定数をインスタンスから参照してたら
いまどきのPHPはクラス内にconstで定義した定数にアクセスするのに、newしたインスタンス変数に::でつないで指定してやることもできる。
$class = new MyClass(); echo $class::MY_CONSTANT."\n";
(できるようになったのはPHP 5.3.0 以降。昔はクラス名に::でつないで指定してた)
その前提で、PHP 7.1 + CakePHP 3.5のコントローラでこんなコードを書いていた。
'status' => $this->Schedules::STATUS_REGIST,
そーしたら、PHP 5.6.15 だと実行時にシンタックスエラーになることが判明。
$this->Schedulesに違いがあるのか? debug()でこいつを確認すると、ちゃんと定数を記述しているSchedulesTableクラスのオブジェクトになっていて、問題がないように見える。
何で???
究明せずクラス名を使うことにしました。名前空間の指定も含めると長くなるので、冒頭でuse文も併用。
CakePHP 3.5 コマンドラインでパスワードが暗号化されたレコードを追加
CakePHP 3.5 を使ってます。
Authコンポーネントを使ったユーザ認証で、新規ユーザの作成画面を作らない(まだ作ってなかったりする)場合、直接DBにユーザレコードを突っ込むことになったりする。その際パスワードをsaltで暗号化する必要がある。
Cakeの対話型コンソールに慣れていればなんの問題もない。
慣れていないので(今のところ慣れるつもりがない)、サンプルをメモ。
bin\cake console ...(cakeコンソールに入る。プロンプト>>>が出てくる。) >>> $users = Cake\ORM\TableRegistry::get('Users'); ... >>> $user = $users->newEntity(['name' => 'namae', 'password' => 'naisyo']); ... >>> $users->save($user);
Kallithea環境のバックアップ
Kallithea環境のバックアップをやろうとしてます。
MercurialのリポジトリをKallitheaでホストしているので、リポジトリのバックアップが主役だけれと、Kallithea君自体のバックアップはどうするのかわかりませんでした。
探したらドキュメントありました。すごく簡素。
http://kallithea.readthedocs.io/en/latest/usage/backup.html
iniファイル、Whoosh index、kallithea.dbをコピーしとけばいいよって書いてある。
Whoosh index?何?
作ったWordテンプレートを編集したい
久しぶりにWordをテンプレートとして保存してテンプレート化した。
あれ?テンプレート自体を編集したいときって、どうやって開くんだっけ?忘れた。
テンプレートなので普通に開くと、新規書類扱いになる。
。。。解決した。
テンプレートファイルを右クリックして、コンテキストメニューから「開く」を選んだらできました。
なんか記憶と違う気がするけどいいや。
iOS アプリ更新で「2個のローカリゼーションでエラーが発生しました」
App Store上のiOSアプリを更新するため、色々作業して作業して。やっとiTunes Connectの「審査に提出」ボタンを押すことができました。
でも。。。
えー。どこがエラー?
画面を上から下までみたが、どこも赤くなってない。
ネットを検索すると、画像登録不足でこのエラーになるよと言ってる人がいたので、「メディアマネージャーですべてのサイズを表示」をクリックしたら、4.7インチ、4インチ、3.5インチのディスプレイサイズが赤くなってました。
iPhone用は5.5インチだけ登録しとけばいいはずなのに。。。
画面をじーっとみてたら、赤くなった各サイズに、「...インチディスプレイを使用」チェックボックスがありました。あーこれか。
これを選択すると上位サイズの代用ってことになるんですね。
そして無事エラーは消えました。
審査通るといいな。*1