0. 環境 [OS] CentOS 6.10 [MySQL] 5.1 1. 前提 MySQLシステム変数は、SESSIONとGLOBALがあるので注意。 有効範囲はそれぞれ「SESSIONは接続ごと」「GLOBALはMySQL起動中」というふうに異なります。 GLOBALスコープで設定した値は、MySQL再起動で消失します。(これを防ぎたい場合、mysql.cnfに直接記載) MySQL8からは、SET PERSIST .. とすることで消失を防げる。 2. 接続 MySQLに接続。mysql -u root -p 3. コマンド (SESSIONスコープ) 下記は、SHOW SESSION VARIABLES ..と書いたのと同義。 現在の値 -- SlowQueryを出力するか? SHOW VARIABLES LIKE 'slow_query_log'; -- 何秒を超えたらSlowQueryとして出力するか? SHOW VARIABLES LIKE 'long_query_time'; -- SlowQuery出力先のファイル名 SHOW VARIABLES LIKE 'slow_query_log_file'; 更新 SET long_query_time = 3; (注)slow_query_logとslow_query_log_fileはGLOBALスコープでのみ変更可能。 4. ...

Read more

0. 環境 [OS] Windows 11 Home [Android Studio] 3.6.3 1. ビルド 期日が迫ってたので、App Bundle対応を行いました。いくつか「あれ?」と思ったので記載しておきます。 いつものように、Android Studioでメニューから[Build]-[Generate Signed Bundle / APK…]を選択。 ビルド用のダイアログで「Android App Bundle」を選択し、[Next]ボタンをクリックすると下記が開きます。 [Export encryped…]にチェックを入れ、直下に表示された秘密鍵の保存場所を覚えておきます。(*a) [Next]ボタンを押して先に進むと、aabという拡張子のファイルが生成されます。(*b) 2. アプリ公開 いつものようにブラウザでPlay Consoleを開いて、対象のアプリを選択。 左メニュー[製品版]-[新しいリリースを作成]をクリックし、[App Bundle]を選択すると下記画面に来ます。 前述(*a)の登録がまだなので、[オプトイン]リンクをクリック。 ここで前述の(*a)をアップロード。 そのままこの画面に戻ってきて上記(*b)をアップロードするとエラーが出ました。 app bundle 予期しないエラーが発生しました。もう一度お試しください(40B24C00)。 エラーコードをググっても出てこなかったので、作成中のリリースを一度破棄し、ブラウザを再起動してやり直したらうまくいきました。 (秘密鍵のアップロードはやり直さなくてOKでした) あとはいつものように必要項目を入力し、フッター部分のボタンを押していくと公開設定が完了します。しばらく「審査中」の後、無事公開されました。 [保存] → [リリースのレビュー] → [製品版としての公開を開始] → 確認ダイアログで[公開]クリック ...

Read more

0. 環境 [OS] Windows 11 Home [VirtualBox] 6.1.22 1. 問題 1週間くらい前にWindowsUpdateしたら、下記エラーでVMが起動しなくなりました。 仮想マシン"ubuntu_64"のセッションを開けませんでした。 Failed to get device handle and/or partition ID for 00000000027d6520 (hPartitionDevice=0000000000000bd1, Last=0xc0000002/1) (VERR_NEM_VM_CREATE_FAILED). 終了コード : E_FAIL (0x80004005) コンポーネント: ConsoleWrap インターフェース: IConsole {872da645-4a9b-1727-bee2-5585105b9eed} WindowsUpdate後にUIが変わってたのでたぶん「Windows 11 Insider Preview」のせいだと思います。 Windowsタスクバーの虫眼鏡マークをクリックし「設定」と入力。 設定画面が開くので左メニューから「Windows Update」をクリックすると履歴が参照可能。 2. 対応 Windowsタスクバーの虫眼鏡マークをクリックし「コントロールパネル」と入力。 「コントロールパネル」内の「プログラムと機能」をクリック。 「プログラムと機能」内の左のメニュー「Windowsの機能の有効化または無効化」をクリック。 下記が開くので、「Windows ハイパーバイザー プラットフォーム」にチェックし、Windowsを再起動したら直りました。(WindowsUpdateでデフォルトのOffに戻ってしまったようです…) ...

Read more

0. 環境 [OS] MacOS 10.11.6 [Flutter] 2.2.3 [Dart] 2.13.4 1. 背景 React NativeでiOSアプリを作成してたんですが、環境周りの不具合に時間を取られ、肝心の実装がほとんどできない状態が続いてました。 そこで、試しにFlutterをやってみたら、シュミレーターで動かすところまでは比較的楽にできたので乗り換えることにしました。 JSを使えるエンジニアが多いという理由で、React Nativeが支持されるかな?と予想してたのですが、 最近、TwitterなどでReact離れを 見かけることが増えてきて、そろそろ潮時かなと思ってきました。 2. 検討 作成したいアプリがローカルDBを使用しているので、何が良いのかいろいろ見てみました。 こちらのページがよくまとまってます。 まず、僕の環境で、sqflite、Realm、Moor、ObjectBoxはサンプルアプリすら動かなかったので諦めました。 作ろうとしてるアプリのAndroid版がSQLite3を使ってるので、sqfliteやそれをラッピングしてるというMoorがいいかなと思ったのですが、下記のエラーが解決できず諦めました。同様のエラーで開発者に対する質問が結構挙がってましたが、いまいち決定的な解決方法はなさそうでした。 Error: MissingPluginException(No implementation found for method getDatabasesPath on channel com.tekartik.sqflite) 3. Hiveサンプルアプリ 上記ページで紹介されてるHiveがさくっと動きました。 サンプルページの「Code」ボタンからファイルアイコンをクリックしてURLをコピー。(画像参照) 適当なディレクトリにソースをダウンロードしてアプリを起動します。 $ git clone https://github.com/hivedb/samples.git $ cd samples/todo/ $ flutter create . $ flutter run To-Doアプリが起動しました。 ...

Read more

0. 環境 [OS] MacOS 10.11.6 [React Native] 0.61.4 [SQLite Studio] 3.2.1 1. 背景 React NativeでiOSアプリを作成中です。 ローカルストレージとしてExpoのSQLiteを使っていますが、開発ツールからテーブル参照する方法が分からず調べてました。 アプリから登録されたレコードの確認など、なにかとこの手のツールは必要です。 Androidアプリ開発のStethoみたいなのがないかなーと思ってましたが、結局こんな感じにしました。 2. 手順(DBファイルの格納先) expo-sqliteが作成するDBファイルの保存先は${FileSystem.documentDirectory}/SQLite/${name}」なので、まず${FileSystem.documentDirectory}がどこなのか調べます。 (詳細はこちらのページの”SQLite.openDatabase”参照) アプリ実行時に必ず通る箇所にログを仕込みます。(importとconsoleの行だけあればどこでもOK) import * as FileSystem from 'expo-file-system' class DB { static db; static getDB(){ console.log("FileSystem; " + FileSystem.documentDirectory); : コンソールに出力されたパスからfile://を削ったものが${FileSystem.documentDirectory}です。 さらに上記${name}は、SQLite.openDatabase();の引数で指定しているDB名になります。 3. 手順(SQLiteStudio) MacにSQLiteStudioをインストール。 SQLiteStudioのメニューで[Database]-[Add a database]を選び、上記2で調べたパスを[File]に入力して[OK]をクリック。 左ペインにテーブルが表示されれば成功です。 ...

Read more

0. 環境 [Gradle] 5.6.4 1. 問題 こちらの情報を元にFabricからFirebaseへの移行を行いました。 Android プロジェクトに Firebase を追加する Upgrade to the Firebase Crashlytics SDK コード修正後、エラーが発生してビルドできず・・・ Duplicate class com.google.android.gms.measurement.AppMeasurement found in modules jetified-firebase-analytics-impl-12.0.1-runtime.jar (com.google.firebase:firebase-analytics-impl:12.0.1) and jetified-play-services-measurement-impl-17.4.3-runtime.jar (com.google.android.gms:play-services-measurement-impl:17.4.3) Duplicate class com.google.android.gms.measurement.AppMeasurement$ConditionalUserProperty found in modules jetified-firebase-analytics-impl-12.0.1-runtime.jar (com.google.firebase:firebase-analytics-impl:12.0.1) and jetified-play-services-measurement-impl-17.4.3-runtime.jar (com.google.android.gms:play-services-measurement-impl:17.4.3) Duplicate class com.google.android.gms.measurement.AppMeasurement$Event found in modules jetified-firebase-analytics-impl-12.0.1-runtime.jar (com.google.firebase:firebase-analytics-impl:12.0.1) and jetified-play-services-measurement-impl-17.4.3-runtime.jar (com.google.android.gms:play-services-measurement-impl:17.4.3) Duplicate class com.google.android.gms.measurement.AppMeasurement$EventInterceptor found in modules jetified-firebase-analytics-impl-12.0.1-runtime.jar (com.google.firebase:firebase-analytics-impl:12.0.1) and jetified-play-services-measurement-impl-17.4.3-runtime.jar (com.google.android.gms:play-services-measurement-impl:17.4.3) Duplicate class com.google.android.gms.measurement.AppMeasurement$OnEventListener found in modules jetified-firebase-analytics-impl-12.0.1-runtime.jar (com. ...

Read more

環境 [OS] Debian 10 [PHP] 7.3.13 [Laravel] 7.6.2 [PHPUnit] 8.5.3 [Mockery] 1.3.1 はじめに ソフトウェアやアプリケーション開発にとって品質管理は切っても切り離せない存在です。 日本の従来の品質管理は散布図やPB曲線などを用いて定量化を重視してきました。 しかし、それらは品質を数値化し分析することに寄りすぎていると感じるのは僕だけでしょうか? 品質管理の本来の目的は「品質を上げること」にあるはずです。 一言で品質と言っても様々ですが、「品質 = 要求仕様に則った実装」と定義すると、品質向上のための必要十分な施策はUnitTestによるホワイトボックステストが一番の近道だと考えています。 実際、ネットの情報を見ても、Googleなどのテック企業はUnitTestを中心に据えているように見えます。 その上で、報告などの目的でどうしても品質を定量化したいのであれば、UnitTestのカバレッジ計測ツールを使ったら良いのではないでしょうか。 1. 方針 下記の方針でユニットテストを書いていきますが、自分のプロジェクトと合わない部分は変えて下さい。 1-1. 後々CIで動かすことも考慮し、DB接続はモックで代替する。 1-2. フレームワークを含めず実装した箇所だけのテストコードを書く。 1-3. プロダクションコードの全ロジックを通すテストコードを書く。(「3. テスト記載方法」で後述) 1-4. 上記1-2の範囲でツールを用いてカバレッジを計測し、なるべく100%に近づける。(一般的にツールは評価が甘めのため) 1-5. テストコードの構成はフレームワークやデファクトスタンダードに合わせる。 2. 設定 2-1. PHPUnit LaravelにはPHPUnitが最初から入ってるので、アプリのルートで下記コマンドを実行するとサンプルのテストコードが実行されます。 composer exec -v phpunit アプリルートにあるtestsディレクトリにテストコードを格納していきます。同ディレクトリ内はさらにFeatureとUnitに分かれてます。 tests |-- CreatesApplication.php |-- Feature | `-- ExampleTest.php |-- TestCase.php `-- Unit `-- ExampleTest.php Laravelの方針に合わせて、下記の区分けでテストを書いていきます。 Feature ...

Read more

0. 環境 [VirtualBox] 6.1.6 [ホストOS] Windows 10 Home [ゲストOS] Ubuntu 16.4 1. やりたいこと Windows10(ホストOS)にVirtualBoxを入れて、その上でUbuntu(ゲストOS)を動かします。 その際、ホストOS上のファイルをゲストOSからも操作したい。 IDEやエディタはホストOS上で起動し、バージョン管理やWebサーバー経由の確認などはゲストOSで行いたいというのが意図です。 2. インストール VirtualBoxとUbuntuのインストール&設定はこの記事が分かりやすかったです。 VirtualBoxのサイトで下記リンクからダウンロード。 [VirtualBox 6.1.6 platform packages]-[Windows hosts] また、Ubuntuはこちらのサイトから「64-bit PC (AMD64) desktop image」をダウンロードしました。 1.6Gあるので僕の環境だと数時間かかりました。 3. 共有フォルダ設定 Ubuntuのインストールが終わったら、VirtualBoxのホーム画面からインストールした仮想マシンを選択して「設定」をクリック。 下記のウィンドウが起動するので、左メニューの「共有フォルダー」をクリックします。 さらに右端にあるプラスマークをクリック。 下記ウィンドウに必要項目を入力します。 ・「フォルダーのパス」は「その他」を選んで、ホストOS側で共有したいフォルダーを選択。 ・「フォルダー名」は自動で入るのでさわらず。(1) ・「自動マウント」をチェックONにします。 ・「マウントポイント」はゲストOSの任意のディレクトリを指定。(2) ・「永続化する」というチェックボックスがある場合、それもON。 こんな感じに追加されました。 ゲストOSを再起動します。 これだけだとゲストOSからホストOSの共有フォルダが見えませんでした。 調べてるといろんなページで「Ubuntuに”Gust Additions”をインストールする必要がある」と書いてましたが、入れなくても後述の手順でできました。 (以前はそうだったのかもしれません) “mount.vboxsf”コマンドを使いたいので、ゲストOS上でrootになるかsudoをつけて下記コマンドを実行。 # apt install virtualbox-guest-utils 次にゲストOS側で予めマウントポイントのディレクトリを作成しておきます。(上記(2)) 最後に、第一引数に前述の(1)、第二引数に(2)を指定してこのコマンドを実行するとホスト側のフォルダが参照できました。(下記のshareは読み替えて下さい) # mount.vboxsf share /share 仮想マシンを落とすと設定が消えてしまったので、~/.bashrcに上記コマンドを書いておきました。 ...

Read more

0. 環境 [MySQL] 8.0.17 1. 経緯 GCP無料枠のメモリ約500MBという貧弱な環境でWordPressを運用してます。 少しでもパフォーマンス改善したく、MySQLのクエリキャッシュを設定しました。(下記要点のみ記載) # vim /etc/my.cnf.d/mysql-server.cnf : : [mysqld] query_cache_type=1 query_cache_limit=1M query_cache_size=20M MySQLを再起動。 # mysql -u hoge -phoge -e"SET GLOBAL innodb_fast_shutdown = 1" # service mysqld stop # service mysqld start 起動しなくなりました… ログを見ると下記エラーが出てました。(要点のみ記載) # tail -F /var/log/mysql/mysqld.log : : [Server] unknown variable 'query_cache_type=1'. 2. 対応 ネットで情報を漁ったところ、MySQL8からはクエリキャッシュが使えなくなったようです。 MySQL 8.0: Retiring Support for the Query Cache 代わりにProxySQLというのが紹介されてましたが、ミドルウェアを追加するとメンテするポイントも増えるので今回は見送りました。 一旦は、WordPressのプラグイン(WP Super Cache)とphp-fpmのチューニングで、DBより手前で何とかする方向で進めます。 ...

Read more

MySQLで日付系のカラムを比較するときにちょっと手間取ったのでメモ。 0. 環境 [MySQL] 5.7.14 1. 前提 2つのテーブルに型が異なるカラムがあったとします。()内は小数秒の桁数の精度を表してます。 テーブルAの定義抜粋 CreateDate datetime(3) # 小数秒あり テーブルBの定義抜粋 created_at timestamp # 小数秒なし 2. 手順 この2カラムが一致していることをWHERE句で指定するには、日付フォーマットを揃えるとうまくいきました。 SQL文の抜粋 AND IFNULL(DATE_FORMAT(a.CreateDate, '%Y%m%d%H%i%S'), '') = IFNULL(DATE_FORMAT(b.created_at, '%Y%m%d%H%i%S'), '') 今回は秒まで比較できれば十分でしたが、もし小数秒以下も含める場合は、下記を参照してフォーマットを追加して下さい。 MySQLにおける日付変換 3. 日付型の違い そもそもdatetimeとtimestampの使い分けは?というのはこの記事によくまとまっていました。 MySQL: DATETIME vs TIMESTAMP ざっくり言うと、こんな感じですね。 [datetime] 格納できる値の範囲が広いが、その分容量が必要。 [timestamp] インデックス、UTC変換、タイムゾーン対応など、機能性を求めるならこっち。 4. 参考 日付と時間型の概要 ...

Read more