スキップしてメイン コンテンツに移動

投稿

PDOで指定したクラスにデータを割り当てて取得する方法

PDOで指定したクラスにデータを割り当てて取得するには、\PDO::FETCH_CLASSをMyPdo::fetch, MyPdo::fetchAllメソッドの引数に指定すれば簡単に実現できます。 通常はPDO::FETCH_ASSOCを指定して、array形式でデータを取得する方が手軽ですが、classでデータを扱うと、下記のメリットがあります。 arrayよりもclassでデータ取得した方がメモリ使用量が少ない arrayよりも、どんなデータを扱っているのかが明確になる それでは、\PDO::FETCH_CLASS使用例を下記に示します。 <?php $sql = <<<EOF SELECT id, name, weight, price FROM table_prodict EOF; $conn = new MyPdo(....); $conn->prepare($sql); $stmt = $conn->execute(); // クラスは第2引数で指定 $stmt->fetchAll(\PDO::FETCH_CLASS, Product::class); Porductクラスは下記を想定しています。 <?php class Product { public $id; public $name; public $weight; public $price; } \PDO::FETCH_CLASSの挙動についての補足です。 クラスを特に指定しないと、取得したカラムに対応したプロパティを持ったstdClassのインスタンスで結果が返ってきます。 指定したクラスに、クエリから取得したカラムに対応したプロパティがない場合(例えば、上記のProductカラムに$priceプロパティがない場合)は、動的にプロパティが定義されて取得したデータがセットされます。 \PDO::FETCH_PROPS_LATEを使うとプロパティにデータをセットする前に、クラスのコンストラクタが呼ばれます。クラスの事前処理が必要な場合に指定すると便利です。 クラスのプロパティ定義がprivateでも正しくデータはセットされます😲
最近の投稿

コントロールパネルから不要なアイコンを削除

古いオーディオドライバーをアンインストールしたのですが、どういうわけかコントロールパネルにアイコンが残ったままになってしまいました。 実害はないので無理に削除する必要もありませんが、気になったので削除する方法を調べてみました。 蛇足ですが、消したかったのはサウンドカードのSE-90PCIを使うときにインストールしたEnvy 24関連のコントロールパネルのアイテムです。 Googleで検索すると下記の方法がみつかりました。 (方法1) レジストリエディタを使って項目を削除する タスクバーの検索ボックスから Regedit と入力してレジストリエディタを起動。 下記のキーを探す。 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace KEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace クリックして{Default}の欄を見ながら、消したいアイテムを探して削除。 (方法2) レジストリエディタを使って項目を隠す 今回はアイテムを削除したいので目的と合致しませんが、コントロールパネルからアイテムを隠すこともできるようです。 詳細は レジストリエディタを使う方法 を参照してください。 組織で管理しているパソコンの場合は、管理者がPolicyを設定して管理することもできるようです。 詳細は Windows 10 Enterpriseで管理者が実施する方法 を参照してください。 (方法3) cplファイルを削除する C:\Windows\System32 、 C:\Windows\SysWOW64 の各ディレクトリに対して、検索ボックスに .cpl と打ち込んでコントロールパネルの項目を抽出。1つずつファイルを見てそれっぽいものを削除する。 Windows標準のものがほとんどなので、いきなり削除するのではなく、対象と思われる.cplをディレクトリから移動して間違いないか確認してから削除する方が無難だと思います。 Windows標準のものは下記のものがあるので、下記のリストに含まれるもの

Androidのトップ画面で左スワイプすると出現するGoogleのフィードを無効化する方法

Android 8.0 Oreo では下記の方法で変更できました。 Androidのホームスクリーンを長押し 使っているLauncherにもよりますが、Preferencesを選択 Home screenを選択 Scrolling modeで「Standard scrolling + Google」が選択されているので、「Standard scrolling」を選択 使っているスマートフォンのAndroidのバージョンやLauncherの種類にもよるので、「この手順で決まり」というのは中々いいづらいです。 ホームスクリーンを長押しして、ホーム画面の設定からそれらしい設定を見つけることでしょうか (例えばmSwipe to access Google appとかの場合もあるようです)。

DellのパソコンのWindows 10リセット

DellのパソコンでWindows 10をリセットをしようとして、はまったのでメモ。 当初思いついた方法は下記の3つ。 付属していたリカバリ用のCDを使う Windows標準の「 このPCを初期状態に戻す 」を使う リカバリ用のUSBメディアをDell OS Recovery Toolを使って作成してリセットする 2.のWindows標準の「初期状態に戻す」で実施しようとしたろころ PCを初期状態に戻すときにエラーが発生しました。変更は行われませんでした。 というメッセージが表示されてリセットできませんでした。 エラーメッセージをもとに試した方法(上手くいかなかった) ネットで調べて、 こちらの記事 を参考に管理者権限で開いたPowerShellで下記の作業を実行しましたが解決しませんでした(かなり端折ってかいているので、詳細はリンク先を見てください)。 システムファイルチェッカーとDISMコマンドを実行する sfc /scannow DISM.exe /Online /Cleanup-image /Restorehealth PCを再起動 ReAgentc.exeの無効/有効を切り替える reagentc /disable reagentc /enable PCを再起動 上手くいった方法 Dellのサポートページやコミュニティページを見ていたところ、 Windowsの起動オプションでイメージから回復する方法 が書いてありました。 というわけで Shiftキーを押しながら、再起動を実行 、PCを再起動時に出てくるオプションの中から「 Factory Image Restore 」を選択して無事Dell専用のリセットプロセスに入れました。 マウスコンピュータとかはWindows標準の「初期状態に戻す」でうまく行っていたので、軽く考えていました。 ちゃんとメーカーごとにリセット方法は確認しないといけませんね。反省。。。

Spring Boot 2.5でplain.jarが生成されてApp Engine上でのアプリケーションの実行に失敗した話

Google App EngineのJava 11環境でSpring BootアプリケーションをGradleを使ってデプロイしたところ、ローカル上では正しくページ表示されるのに、App Engine上にデプロイすると、なぜか、500エラーになるというトラブルに遭遇しました。 Google Cloudのログを調べてみると下記のエラーログを発見しました。Spring Boot系のクラスがjarが含まれていない! java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext さらに調べると、アップロードされたjarファイル名が xxxx-0.0.1-SNAPSHOT-plain.jar のようになっていて、 plain.jarがアップロードされていることが根本原因 でした(Google App EngineのGradle Pluginのデフォルトの設定だとfat jarではなく、plain.jarが選択されるようです)。 plain.jarは、Spring Bootの2.5から作成されるようになったので、それ以前のSpring Bootのバージョンでは問題は発生しません。 [解決法1] build.gradleのjarプラグインの設定を変更 build.gradleのjarプラグインの設定でplain.jarが生成されないうように修正して、fat jarがデプロイされるようになりました。 jar { enabled = false } こちらの記事に感謝。 https://zenn.dev/donchan922/articles/ea76614f72b15e [解決法2] appengine.stage.artifactを指定 こちらは、試していませんが、appengine.stage.artifactにデプロイするターゲットのファイルを指定する方法もありかも知れません。 # build . gradleのappenineの設定でデプロイする対象ファイルを指定。 appengine { stage { artifact = "build/libs/xxxx-0.0.1-SNAPSHOT.jar"

Gradleで使用するJDKのバージョン指定

GradleでSpring Bootを使ったjavaのプロジェクトをビルドしようとしたところ、下記のエラーが発生しました。 $ ./gradlew build > Task :compileJava FAILED > FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileJava' . > invalid source release: 11 どうやら、Javaコンパイラが11に対応していない模様。複数のJDKをインストール(8と16)していて、JDK 8の方をデフォルトにしていたため、Java 11のソースがコンパイルできないことが発覚。 gradle.properies に下記のように org.gradle.java.home で使用するJDKを指定して解決。 # org.gradle.java.home=使用するJDKのパス # 例えば筆者の環境ではこんな感じ。 org.gradle.java.home=C:/Program Files/AdoptOpenJDK/jdk-16.0.1.9-hotspot

firestoreでAuto Incrementフィールドを作成

FirestoreでAuto Increment Fieldを作成 Firestoreで連番となるフィールドの作成方法を紹介します。 肝はFirestoreのtransactionを使って原子性(Atomicity)、一貫性(Consistency)、独立性(Isolation)を保証することです。 汎用的に使えるgenerateSequenceNumber関数を作成してみました。 manage_collection: 連番を生成するターゲットcollectionを管理するcollection名 target_collection: 連番を生成するターゲットとなるcollection名 numberField: 連番を生成したいフィールド名 を渡して使います。 function generateSequenceNumber ( db , manage_collection , target_collection , numberField ) { const docRef = db . collection ( manage_collection ) . doc ( target_collection ) ; return db . runTransaction ( ( transaction ) => { return transaction . get ( docRef ) . then ( ( doc ) => { if ( ! doc . exists ) { transaction . set ( docRef , { [ numberField ] : 1 } ) ; return 1 ; } const newNumber = typeof doc . data ( ) [ numberField ] === 'undefined' ? 1 : doc . data ( ) [ numberField ] + 1 ; await transaction . update ( docRef , { [ numberField

Google Cloud Storageでクラウド上にあるファイルをローカルにあるファイルと同期させる方法

Linuxのrsyncコマンドのようにクラウド上にあるファイルをローカルにあるファイルと同期させるには、下記のコマンドを実行すればOKです。 gsutil -m rsync -r source gs://bucket/dest rsync: Linuxコマンドのrsyncのようにファイルを同期させるためのコマンド -m: multi-threaded/multi-processingの意味で並列で複数のファイルを同期させるためのオプション -r: recursiveの意味で再帰的にディレクトリ内のファイルを同期させるためのオプション