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?何?

・・・Python全文検索ライブラリのよーですね。うちのディレクトリにはファイルがいないので、対象外にしよう。

作ったWordテンプレートを編集したい

久しぶりにWordをテンプレートとして保存してテンプレート化した。

あれ?テンプレート自体を編集したいときって、どうやって開くんだっけ?忘れた。

テンプレートなので普通に開くと、新規書類扱いになる。

。。。解決した。

テンプレートファイルを右クリックして、コンテキストメニューから「開く」を選んだらできました。

なんか記憶と違う気がするけどいいや。

 

iOS アプリ更新で「2個のローカリゼーションでエラーが発生しました」

App Store上のiOSアプリを更新するため、色々作業して作業して。やっとiTunes Connectの「審査に提出」ボタンを押すことができました。

でも。。。

f:id:hatehatedz:20171108163235p:plain

えー。どこがエラー?

画面を上から下までみたが、どこも赤くなってない。

ネットを検索すると、画像登録不足でこのエラーになるよと言ってる人がいたので、「メディアマネージャーですべてのサイズを表示」をクリックしたら、4.7インチ、4インチ、3.5インチのディスプレイサイズが赤くなってました。

iPhone用は5.5インチだけ登録しとけばいいはずなのに。。。

画面をじーっとみてたら、赤くなった各サイズに、「...インチディスプレイを使用」チェックボックスがありました。あーこれか。

これを選択すると上位サイズの代用ってことになるんですね。

そして無事エラーは消えました。

審査通るといいな。*1

*1:次の日にはもう審査通ってApp Storeにあがってました。普通はもっと時間かかってたと思うけど、更新だったから?iPhone X対策で審査要員を増やしているから?何はともあれ終わりました

Xcode 9 のシミュレータ選択時のiOSバージョン名が化けてハッシュ表記に

f:id:hatehatedz:20171107102814p:plainiOSのシミュレータも使えるようにしていたが、いつのまにか括弧( )の中に表記されていたバージョン名がハッシュ表記に置き換わり、無残な状態。

ネットを検索したら、同じ状況だった人がいて、解決策はある様子。その人は、Xcode 6.4の事例を書いていて、Xcode 9でも起こったって人からコメントがきている。

直すのめんどうだからしばらくこのままにしとこう。