/** Geminiが自動生成した概要 **/
PageSpeed Insightsでスコア100を目指すため、サーバー側の処理速度向上に取り組んだ。SEO対策として、PHP製CMSを使う場合、PHPバージョンを最新に保つことが重要。PHP7系はOPCacheにより高速化されており、バージョンアップだけでスコア向上も期待できる。VPSサーバでのバージョンアップ方法は過去記事を参照。PHP8ではJitコンパイラ導入で更なる高速化が見込まれる。かつてGo言語への移植も検討したが、PHPでスコア100達成できたため中止した。
カテゴリー : プログラミング/page-2
【SEO対策】実行環境のバージョンを上げて高速化
SOY ShopのマイページのフォームでParsley.jsを使用する際に注意すること
/** Geminiが自動生成した概要 **/
SOY2HTMLでセキュアなフォームを設置するには、csrf_tokenを利用する。HTMLFormクラスでformタグを出力すると自動的にトークンが埋め込まれる。トークンはセッションに保存され、送信時に検証されるため、クロスサイトリクエストフォージェリを防げる。 独自にformタグを作成する場合は、soy:id="csrf"でトークンを埋め込む必要がある。また、JavaScriptで非同期通信を行う場合も、トークンをヘッダーやパラメータに含める必要がある。トークンの有効期限は短いため、フォームの送信に時間がかかる場合は注意が必要。これらの対策により、安全なフォームを実現できる。
pickadate.jsでHTML5のrequired属性を使いたい
/** Geminiが自動生成した概要 **/
pickadate.jsでHTML5のrequired属性を使うには、`editable: true`オプションを設定する必要がある。ただし、これによりページ読み込み時にrequiredチェックが実行され、未入力エラーが表示される問題が発生する。これを回避するには、フォームにIDを付与し、クリックイベントでpickadateを初期化するよう変更する。さらに、カレンダー表示のために`pickr.pickadate('open')`も追加する必要がある。これにより、フォームクリック時に初めて初期化とバリデーションが行われるようになり、初期エラー表示の問題が解決する。
Ubuntu19.10でSnapのBracketsのライブプレビューが動作しなかった時の対処
/** Geminiが自動生成した概要 **/
Ubuntu 19.10でSnap版Bracketsのライブプレビューが「ファイルへのアクセスが拒否されました」エラーで動作しない問題の対処法。Brackets 1.14 (snap経由)、Chromium 79.0.3945.79 (snap)環境で、GitHubのIssueを参考に解決。解決策は、Bracketsのメニュー「File」→「Enable Experimental Live Preview」を有効にすること。これにより、設定済みのブラウザ(ChromiumやFirefox)でライブプレビューが正常に動作するようになった。
Ubuntu19.10でSelenium + php-webdriverが動作しなかった時の対処
/** Geminiが自動生成した概要 **/
Ubuntu 19.10でSelenium + php-webdriverを用いたUIテスト自動化環境構築中に、「拡張機能の読み込みエラー」と「Chrome failed to start: exited abnormally」が発生。chromedriverのパスが意図せず`/usr/local/bin`に存在していたのが原因。`/usr/bin`に移動後、テストは正常に開始された。
PHPのexec関数でセッションの値の引き継ぎに苦戦した時のメモ
/** Geminiが自動生成した概要 **/
Amazon Linux 2のLAMP環境で、PHPの`exec`関数を使ってGoogle Analytics APIにアクセスする際にセッションの引き継ぎに失敗した。`exec`で実行した`cmd.php`内で`session_start()`してもセッション情報が取得できなかった。調査の結果、`cmd.php`内では`session_save_path()`の戻り値が空文字列になっていた。`session_save_path("/var/lib/php/session");`を`session_start()`前に追加することでセッション情報が取得できるようになり、APIアクセスも成功した。`php.ini`の`session.save_path`の設定が原因と考えられるが、未検証。
PHPで形態素解析エンジンのMaCabを使用する為の手順のメモ
/** Geminiが自動生成した概要 **/
Ubuntu 19.10環境でPHPからMeCab形態素解析エンジンを使用する手順をまとめたメモです。MeCab、辞書(mecab-ipadic-utf8, mecab-ipadic-neologd)、php-mecabをインストールし、PHPからMeCabを呼び出すテストコードを実行しています。 php-mecabインストールでは、phpize、configure、make、installを行い、mecab.iniを作成、ApacheとCLIで有効化しました。テストコードは"今日は晴天なり"を解析し、結果を配列で出力しています。ブラウザと端末の両方から実行し、期待通りの解析結果が得られました。
Jenkins + ヘッドレスChromeでテスト自動化の省力化
/** Geminiが自動生成した概要 **/
JenkinsによるSOY CMS/Shopのテスト自動化で、ビルド時間が5時間超となり、Chromeのクラッシュが発生していた。メモリ使用量削減のため、ヘッドレスChromeを導入。php-webdriverのコードにChromeOptionsを追加することで、ヘッドレスChromeでのテスト実行が可能になった。仮想デスクトップ(Xvfb)も不要となり、メモリ使用量が削減され、格安VPSでの高負荷テスト継続に期待が持てる。
PHPで並行処理
/** Geminiが自動生成した概要 **/
PHPで並行処理を行う方法として、exec関数でジョブファイルを実行する方法が紹介されています。ジョブファイルはバックグラウンドで実行され、メインプロセスとは独立して動作します。ただし、ジョブファイルの結果をメインプロセスに返すことができないという欠点があります。記事では、Google OAuthを使ったジョブで、メインプロセスのセッション情報をジョブファイルで利用する方法についても説明されています。ジョブファイルの引数にセッションIDを渡し、ジョブファイル内でセッションを復元することで、アクセストークンなどのセッション情報を共有できます。最終的に、ジョブの結果をメインプロセスで扱う方法については触れられていませんが、Go言語やNode.jsのような並行処理に適した言語の使用が推奨されています。
さくらのVPSにUbuntu18.04を入れてSOY CMSを動かした時のメモ
/** Geminiが自動生成した概要 **/
SOY CMSでMySQL 8系に接続できない場合、認証方式の違いが原因です。MySQL 8系は`caching_sha2_password`がデフォルトですが、SOY CMSは`mysql_native_password`で接続します。解決策は、MySQLの設定ファイル`mysqld.cnf`の`[mysqld]`セクションに`default_authentication_plugin=mysql_native_password`を追加し、MySQLを再起動します。新規インストール時はインストール時に`mysql_native_password`を指定できます。既存ユーザの場合は、MySQLにログインし`ALTER USER 'ユーザ名'@'localhost' IDENTIFIED WITH mysql_native_password BY 'パスワード';`を実行し、`FLUSH PRIVILEGES;`で変更を適用します。
Go言語を使ってJSONから複数のデータを取得してみる
/** Geminiが自動生成した概要 **/
Go言語で複数のJSONデータを読み込む方法を解説しています。sample.jsonファイルには、配列[]とオブジェクト{}を用いて複数のデータが記述されています。main.goでは、`[]Sample`型の変数を定義し、`json.Unmarshal`でJSONデータをデコードします。配列の要素へはインデックスを指定してアクセスし、各キーの値はドット記法で取得できます。例えば、`samples[1].Name`は2番目のデータの"name"キーの値("kumata")を取得します。
Go言語でKVSのRedisを使ってみる
/** Geminiが自動生成した概要 **/
Go言語で複数サーバ間のセッション共有を実現するため、KVSのRedisを導入した。UbuntuにRedisをインストール後、Go言語でRedigoパッケージを用いてRedisに接続。`conn.Do("コマンド", "キー", "バリュー")`でRedisを操作し、SETで値を格納、GETで取得、DELで削除できることを確認した。ただし、削除済みキーを取得するとGo側ではエラーが発生する点に注意が必要。Redisを用いることで複数サーバ間のデータ共有が可能となる。
Go言語でJSON
/** Geminiが自動生成した概要 **/
Go言語でJSONを扱う方法について解説されています。 `sample.json`ファイルにID、名前、読み仮名などのデータを保存し、`main.go`でそのデータを読み込んで利用する方法が示されています。 `ioutil.ReadFile`でJSONファイルを読み込み、`json.Unmarshal`でGoの構造体`Sample`に変換します。`Sample`構造体はJSONデータのキーに対応するフィールドを持ちます。変換後、`sample.Name`のようにアクセスすることで、JSONデータの値を取得できます。
妻がプログラミングをはじめてGo言語とQtでアプリを公開するまで
/** Geminiが自動生成した概要 **/
妻にプログラミングを教えた動機は、事務職希望の女性こそプログラミングスキルを身につけるべきだという考えに基づいている。事務作業はルーティン化しやすい反面、変化への対応が求められる。プログラミングは論理的思考力や問題解決能力を養い、変化への対応力を高める。これらは事務職で役立つだけでなく、キャリアの幅を広げる可能性も秘めている。妻は最初の実験台であり、私自身にとっても新たな言語を教える貴重な経験となった。将来的には、プログラミング教育の普及を通じて、女性がより活躍できる社会を目指したいと考えている。
Go言語でGoogle Analyticsのデータをチャットワークに送ってみる
/** Geminiが自動生成した概要 **/
Go言語でGoogle AnalyticsのページビューをChatworkに送信するコードを紹介しています。 Google Analytics APIを用いて前日のページビューと日付を取得し、Chatwork APIで指定のルームに投稿します。 コードでは、認証情報、GAのプロファイルID、ChatworkのルームIDとAPIトークンが必要です。 `Data.Ga.Get`メソッドで前日のページビューを取得し、`Dimensions("ga:date")`で日付も取得します。 取得したデータはChatwork APIのPOSTリクエストで送信されます。 実行にはGoogle API Consoleで取得した認証情報が必要です。 具体的な手順やコードの全体はGitHubリポジトリを参照ください。
Go言語でsyncパッケージを使ってみる
/** Geminiが自動生成した概要 **/
Goの`sync`パッケージは、複数のゴルーチン間での共有リソースへのアクセスを同期するためのプリミティブを提供します。`Mutex`は相互排他ロックを提供し、一度に1つのゴルーチンだけがクリティカルセクションにアクセスできるようにします。`RWMutex`は、複数の読み取りゴルーチンと単一の書き込みゴルーチンを許可する読み取り/書き取りロックです。`WaitGroup`は、ゴルーチンのグループが完了するのを待つためのメカニズムを提供します。`Cond`は、ゴルーチンが条件変数で待機し、他のゴルーチンによって通知されることを可能にします。`Once`は関数が一度だけ実行されることを保証します。これらのプリミティブを使用して、データの競合を回避し、ゴルーチン間の協調を実現できます。
Go言語で関数の練習問題③
/** Geminiが自動生成した概要 **/
Go言語でランダムな数字を出力するgenerate関数を作成する問題。generate()の実行結果を変数r(int型)に代入するため、generate関数はint型の値を返す。ランダムな数字を生成するには`rand`パッケージを使用し、`rand.Seed(time.Now().UnixNano())`でシード値を設定、`rand.Intn(10)`で0~9の乱数を生成する。`generate()`は引数を取らないため`()`内は空で、生成した乱数rを返すため`return r`が必要。
Go言語で関数の練習問題②
/** Geminiが自動生成した概要 **/
Go言語で、"こんにちはうさこさん"と出力するgreet関数を作成する練習問題。`greet(name)`に`name := "うさこさん"`を渡すと、指定の挨拶を出力する。greet関数は文字列型の引数`a`を受け取り、`fmt.Println`で挨拶を出力する。`greet()`の呼び出しで戻り値を変数に代入していないため、greet関数は返り値を持たない。よって、`return`文は不要。
Go言語で関数の練習問題①
/** Geminiが自動生成した概要 **/
Go言語で`f(x) = x + 2`を関数として実装し、x=3の結果を表示する例題。関数の定義は`func f(x int) int { y := x + 2; return y }`となる。`f(x int)`は整数型の引数xを受け取ることを、`int`は整数型の返り値を意味する。関数内では`x + 2`の結果をyに代入し、`return y`でyの値を返す。main関数では`f(3)`の結果をyに代入し、`fmt.Println(y)`で出力する。main関数とf関数では変数yのスコープが異なるため、f関数内のyは新規変数として扱われる。
Go言語でQtのQComboBoxを使ってみる
/** Geminiが自動生成した概要 **/
Go言語でQtのQComboBoxの使い方を示すコード例です。QBoxLayoutでレイアウトを定義し、AddItemsで選択肢を追加します。ConnectCurrentIndexChanged2で選択変更時の処理を実装し、QMessageBoxで選択された項目を表示します。
Go言語とQtで計算フォームを作成してみる
/** Geminiが自動生成した概要 **/
Go言語とQtでアルバイト給与計算フォームを作成。時給と時間を入力すると、合計金額が自動計算される。 QLineEditで入力値を取得し、strconv.Atoiで数値に変換、掛け算後、strconv.Itoaで文字列に戻し、goukeiInputに表示。入力値の変更を検知するために、jikanInputとjikyuuInputにConnectEditingFinishedを使い、calcAndInsert関数を呼び出している。 Clear()で以前の結果を消去してからInsert()で新しい結果を表示することで、値の更新を正しく行う工夫もされている。
Go言語でQtのQGroupBoxとQGridLayoutを組み合わせたサンプル
/** Geminiが自動生成した概要 **/
Go言語でQtを用いて、アルバイト給与計算UIを作成するサンプルコードです。QGroupBoxで「時間」「時給」「給料1」「出勤日数」「交通費」「交通費合計」「給与合計」の入力欄をグループ化し、QGridLayoutで2x4のグリッドレイアウトに配置しています。各グループにはQLineEditとQLabelをQBoxLayoutで垂直配置し、グループ間には演算子を表示するQLabelを配置しています。
Go言語でQtのQLineEditを使ってみる
/** Geminiが自動生成した概要 **/
Go言語でQtのQLineEditを使い入力フォームを作成する方法を解説。QLineEditウィジェットを作成し、SetPlaceholderTextメソッドでプレースホルダーテキストを設定、AddWidgetメソッドでレイアウトに追加することで実現する。プレースホルダーは入力欄に初期表示されるヒントテキストで、"Please input number"のように設定することでユーザーへ入力内容を促す。 コード例では、ウィンドウ、レイアウト、QLineEditを生成し、プレースホルダーを設定後、レイアウトに追加、ウィンドウに表示する手順を示している。
Go言語の構造体2
/** Geminiが自動生成した概要 **/
Go言語の構造体について解説しています。大文字で始まるフィールドは外部パッケージからアクセスできますが、小文字で始まるフィールドはアクセスできません。小文字フィールドへのアクセスは、パッケージ内に`Set~`や`Get~`のようなメソッドを定義することで実現します。具体例として、`Person`構造体の`name`フィールド(小文字)へのアクセス方法を説明しています。`pac`パッケージ内で`SetName`メソッドを定義し、`main`パッケージから`person.SetName("ryoko")`のように呼び出すことで、`name`フィールドに値を設定できます。
Go言語のパッケージの関数とメソッドについて
/** Geminiが自動生成した概要 **/
Go言語のパッケージ内の関数と、構造体に紐づくメソッドの使い分けについて解説。`pac`パッケージ内の`Person`構造体を例に、`pac.GetName()`はパッケージ関数として`usako`を返し、`person.GetName()`は`Person`構造体のメソッドとして、`person`の`name`フィールド値を返す。パッケージ関数は構造体とは無関係だが、メソッドは構造体のフィールドにアクセスできる。`person := pac.NewPerson()`で構造体インスタンスを取得し、`person.SetName()`でフィールド値を設定する例も示している。
Go言語でQtのQBoxLayoutを使ってみる
/** Geminiが自動生成した概要 **/
Go言語でQtのQBoxLayoutの使い方を解説した記事の要約です。QBoxLayoutはウィジェットを水平または垂直に配置するためのレイアウトです。`widgets.NewQBoxLayout(3, nil)`で下から上に、`widgets.NewQVBoxLayout()`で上から下にウィジェットを配置できます。記事では、`widgets.NewQMainWindow`でウィンドウを作成し、`widgets.NewQWidget`を中央ウィジェットとして配置しています。そして、`widgets.NewQLabel2`でラベルを作成し、`widget.Layout().AddWidget()`でレイアウトに追加することで、ラベルを垂直に並べています。`QBoxLayout`では引数で方向を指定しますが、`QVBoxLayout`は上から下に並べる専用のレイアウトです。どちらを使っても同じ結果を得られますが、`QVBoxLayout`を使う方が簡潔に記述できます。
Qtのレイアウトについて
/** Geminiが自動生成した概要 **/
Qtのレイアウトは、QBoxLayout、QGridLayout、QFormLayoutの3種類が主要です。QBoxLayoutは、水平配置のQHBoxLayoutと垂直配置のQVBoxLayoutを含みます。QHBoxLayoutはウィジェットを横に、QVBoxLayoutは縦に並べます。QGridLayoutはグリッド状にウィジェットを配置し、QFormLayoutはラベルと入力フィールドのような2列配置に特化しています。それぞれ異なる配置ニーズに対応し、柔軟なUIデザインを可能にします。
Go言語でQtのQMainWindowを使ってみる
/** Geminiが自動生成した概要 **/
Go言語でQtのQMainWindowを用いて、シンプルなウィンドウアプリケーションを作成する方法を解説した記事です。Qtのメインウィンドウ構造を図解し、赤枠部分に相当する基本的なフレームワークを作成するコード例を提示しています。 `widgets.NewQMainWindow`でメインウィンドウを生成し、サイズやタイトルを設定、`widgets.NewQWidget`で空のウィジェットを作成して中央に配置しています。Go言語でのQt開発環境構築に関する記事へのリンクも含まれています。最終的に"Hello Ryoko"というタイトルの400x300ピクセルのウィンドウが表示されます。
Go言語でQtを扱ってみる on Windows
/** Geminiが自動生成した概要 **/
Windows10でGo言語とQtの開発環境を構築する方法を解説。MSYS2とQtをインストールし、Go言語のパッケージを取得・設定後、サンプルコードを実行する手順を説明。環境変数の設定やQtインストール時のコマンド、Goのパッケージ設定コマンド、サンプルコード実行コマンド、発生したエラーと解決策(libicudt61.dll不足)について記述。
Go言語でQtを扱ってみる on Ubuntu
/** Geminiが自動生成した概要 **/
Ubuntu 18.04にGo言語とQtをインストールし、GoでQtアプリケーションを開発する手順を記録した記事です。Go 1.11、Qt 5.11.1をインストールし、QtのサンプルWebブラウザの実行を確認後、GoのQtバインディングパッケージ`github.com/therecipe/qt`をインストールしました。`qtsetup`コマンドでパッケージの準備中に問題が発生しましたが、`generate`終了時点で中断し、サンプルプログラムを実行したところ、正常に動作することを確認しました。
JavaScriptのAnalyzerNodeで音に反応して動きを変えてみる
/** Geminiが自動生成した概要 **/
Web Audio APIのAnalyzerNodeを用いて、音声でアニメーションを制御する方法を紹介しています。 円が画面端で跳ね返る単純なアニメーションに、音声の周波数データ解析を組み込みました。 周波数データが一定閾値を超えると、円の進行方向がランダムに変化します。 音が途切れてもデータが残るため、setTimeoutを用いて一定時間反応しないように制御しています。 具体的には、`analyser.getByteFrequencyData(data)`で周波数データを取得し、`data[20]`の値が閾値を超えた場合に円の移動方向を反転させています。
Go言語とSQLiteでプリペアドステートメント
/** Geminiが自動生成した概要 **/
SOY2DAOでプリペアドステートメントを利用するには、SOY2::Queryクラスを使用します。SQL文中の値をプレースホルダ(?)で置き換え、bindメソッドで値をバインドします。これによりSQLインジェクションを防ぎます。例えば、`SELECT * FROM user WHERE id = ?`というSQLに対し、`$query->bind(':id', 1);`のように値をバインドします。プレースホルダ名はコロン(:)で始めます。複数の値をバインドする場合は、配列で渡すことも可能です。プリペアドステートメントは、同じSQLを繰り返し実行する場合にパフォーマンス向上に繋がります。SOY2DAOは内部でキャッシュ機構を持ち、一度パースしたSQLを再利用するためです。 また、SQL文を簡潔に記述できるメリットもあります。
JavaScriptのAnalyzerNodeで拾った音の周波数を可視化してみる3
/** Geminiが自動生成した概要 **/
BiquadFilterNodeは、2次セクションを持つデジタルフィルターで、オーディオ信号の変更に使用されます。`type`プロパティでフィルターの種類を指定し、`frequency`でカットオフ周波数または中心周波数を設定します。`Q`プロパティはフィルターの帯域幅を制御します。`gain`は特定のフィルタータイプでのみ使用されます。主なフィルタータイプは、ローパス、ハイパス、バンドパス、バンドストップ、ローシェルフ、ハイシェルフ、ノッチ、オールパスです。ローパスは指定周波数以下の周波数を通過させ、ハイパスは指定周波数以上の周波数を通過させます。バンドパスは特定の周波数帯域を通過させ、バンドストップはその帯域を減衰させます。シェルフフィルターは特定の周波数以上または以下のゲインを調整し、ノッチフィルターは特定の周波数を除去します。オールパスフィルターはすべての周波数を通過させますが、位相を変化させます。
Go言語とSQLiteでトランザクション
/** Geminiが自動生成した概要 **/
Go言語とSQLiteでトランザクションを実装する方法を示すコード例です。user_id=1の金額から1000円減算し、user_id=2に1000円加算する処理を、db.Begin()でトランザクション開始、tx.Commit()で終了させています。途中のエラー発生時は、それ以前の変更もデータベースに反映されません。各処理はtxオブジェクトを使ってSQLを実行し、エラーチェックを行っています。これにより、一連の操作が原子的に実行され、データの整合性が保たれます。
JavaScriptのAnalyzerNodeで拾った音の周波数を可視化してみる2
/** Geminiが自動生成した概要 **/
Web Audio APIを用いてマイク入力の音声の周波数を可視化するJavaScriptコード例を紹介している。AnalyzerNodeでFFTを行い、得られた周波数データをcanvasにグラフとして描画する。コードでは、マイクへのアクセス、AudioContextとAnalyserNodeの作成、周波数データの取得と描画処理を解説。実行すると音声入力に応じてリアルタイムに周波数グラフが変化するが、ハウリングが発生しやすい点についても言及している。
Go言語でExcelからデータを取得する。
/** Geminiが自動生成した概要 **/
Go言語でExcelファイル(test.xlsx)のデータを取得するコードの説明です。`tealeg/xlsx`ライブラリを使用し、`OpenFile`でファイルを開き、シート、行、セルを順にループ処理します。`cell.String()`でセルの値を文字列として取得し、出力します。コードは、Excelファイルの全シートの全セル内容を文字列として表示するものです。
JavaScriptのAnalyzerNodeで拾った音の周波数を可視化してみる1
/** Geminiが自動生成した概要 **/
この記事は、JavaScriptで音の周波数を可視化する方法を学ぶための導入部分です。音のデジタル化に不可欠なフーリエ変換の概念を、三角関数のグラフを用いて分かりやすく解説しています。sin波、cos波、そしてそれらの合成波のグラフを示し、複雑な波形も三角関数の組み合わせで表現できることを説明。式の係数を配列データとして取り出すことで、音をデジタルデータとして扱えるようになることを示しています。最後に、高速フーリエ変換(FFT)に触れ、次回JavaScriptでの実装を示唆しています。記事には、HTML5 Canvasを使ったsin波を描画するコード例も掲載されています。
Go言語でExcel形式のファイルを作成
/** Geminiが自動生成した概要 **/
Go言語でExcelファイルを作成する方法を解説しています。`tealeg/xlsx`ライブラリを使用し、`xlsx.NewFile()`でファイル構造体を作成、`AddSheet("")`でシートを追加します。`sheet.Cell(行, 列).Value = "値"`でセルに値を入力します。行、列は0始まりで、(0,0)はA1セルを表します。`file.Save("ファイル名.xlsx")`でファイルを保存します。サンプルコードでは"kaeru.xlsx"に"usa"、"kuma"、"dora"、"pao"を書き込んでいます。
Go言語とSQLでランダムの顧客10人の注文を10000件登録してみる
/** Geminiが自動生成した概要 **/
Go言語とSQLiteを用いて、ランダムな顧客データ10,000件を生成・登録するコード例です。`orders`テーブル(id, user_id, price)を作成後、ループ処理で10,000回データ挿入を行います。顧客ID(user_id)は1から10の乱数、金額(price)は1,000から10,000の乱数を`rand.Intn()`で生成し、`strconv.Itoa()`で文字列に変換しています。SQL挿入文はプレースホルダを用いず、文字列連結で生成しています。ループ内で都度乱数シードを設定し、変数tとkをループ内で宣言することでデータ生成と挿入を繰り返します。
JavaScriptのWeb Audio APIで録音してみる
/** Geminiが自動生成した概要 **/
Web Audio APIを用いて録音機能を実装した。navigator.getUserMediaでマイクアクセス権を取得し、MediaRecorderで録音、10秒後に停止しsample.wavとしてダウンロードさせる。 現状は問答無用で録音開始・停止する仕様だが、将来的には取得した音の周波数を解析し、音に合わせた処理を実現したい。
Go言語とSQLite3でデータを取得する
/** Geminiが自動生成した概要 **/
Go言語とSQLite3を用いて、`sample.db`内の`orders`テーブルから3件のデータを取得するプログラムです。`db.Query`でSQLクエリを実行し、`rows.Next()`で各行を処理、`rows.Scan()`でid、user_id、priceの各列の値を変数に格納します。最後に`fmt.Print`と`fmt.Println`を用いて取得したデータを表示します。出力はid、user_id、priceがそれぞれ一行ずつ表示され、各レコードごとに空行で区切られます。
Go言語のSQLiteドライバでデータを挿入してみる
/** Geminiが自動生成した概要 **/
Go言語でSQLiteを操作し、データを挿入する手順を説明しています。まず、MSYS2を用いてSQLiteドライバをインストールします。次に、`sql.Open`でデータベースを開き、`db.Exec`でSQL文を実行します。テーブル作成の例では、`CREATE TABLE`文を変数`s`に格納し、`db.Exec(s)`で実行します。データ挿入の例では、`INSERT INTO`文を変数`t`に格納し、`db.Exec(t)`で実行します。`_ "github.com/mattn/go-sqlite3"`は必須で、手動で追記する必要があります。
SQLiteで集計をしてみる
/** Geminiが自動生成した概要 **/
SOY ShopのSQLiteデータベースから、姓が「齋藤」の顧客の注文回数を集計する方法を説明しています。`soyshop_order`テーブルと`soyshop_user`テーブルを`user_id`と`id`で結合し、`WHERE`句で名前を絞り込み、`GROUP BY`句でユーザーごとに集計します。注文金額の合計は`SUM(price)`、注文回数は`COUNT(o.id)`で算出できます。結果として、各「齋藤」さんの注文回数と名前が表示されます。
SQLiteのALTER文で新たなフィールドを追加してみる
/** Geminiが自動生成した概要 **/
SQLiteのALTER文を使って既存のusersテーブルにcategoryフィールドを追加し、外部キー制約でcategoryテーブルと紐づけました。usersテーブルにはid、name、fname、genderに加え、categoryテーブルのidを示すcategoryフィールドが追加されました。その後、UPDATE文で各ユーザーにcategoryを割り当て、SELECT文とWHERE句で特定のcategoryを持つユーザーを抽出しました。さらに、INNER JOINを用いてusersテーブルとcategoryテーブルを結合し、category名で検索する方法も示しました。最終的に'tanpopo'に属するユーザーの情報が抽出されました。
Soil & Geoロガーで現在地の土質と地質を調べよう
/** Geminiが自動生成した概要 **/
Android端末で現在地の土壌と地質を調べるWebアプリをHTML5、Service Worker、IndexedDBを用いて開発。GPSで緯度経度を取得し、オフラインでも動作。取得した情報は農研機構の土壌図、産総研の地質図、Googleマップへのリンク生成に利用。現在Android Chromeのみ対応で、ログは10件保持。Service Worker使用による位置情報取得の不具合調査中。開発中のロガー機能の一部公開で、正式版は非公開。機能追加要望や不具合報告は受け付けていない。Githubでソースコード公開中。
Go MobileでAndroidアプリの実行までを見てみる
/** Geminiが自動生成した概要 **/
Go Mobileは、GoでAndroidおよびiOSのネイティブアプリを構築するためのツールとライブラリを提供します。クロスコンパイルにより、Goのコードをモバイルプラットフォームのネイティブライブラリに変換し、既存のモバイルアプリに統合することも、スタンドアロンアプリとして構築することも可能です。 OpenGL ES 2や、タッチ、センサーイベントへのアクセスなど、モバイルプラットフォームの機能を活用するためのAPIを提供しています。ただし、Go Mobileはまだ実験的な段階にあり、完全な機能提供には至っていません。詳細な情報や最新の状況は、公式Wikiを参照ください。
UbuntuでAndroid Debug Bridgeを使ってみる
/** Geminiが自動生成した概要 **/
Ubuntu 18.04でAndroid Debug Bridge (ADB) を使用してAndroidアプリをデプロイする方法を紹介しています。ADBをインストール後、Go Mobileのサンプルコードをエミュレータと実機(ZTE Blade V580, Android 5.1)にデプロイしました。エミュレータではバージョン不一致でアプリは起動しませんでしたが、実機では開発者モードを有効化し、USBデバッグをONにすることで、`gomobile install`コマンドでアプリのデプロイと起動に成功しました。
SQLiteでWHER句を使ってみる
/** Geminiが自動生成した概要 **/
SQLiteのWHERE句の使い方を解説した記事の要約です。SELECT文で特定のデータを取得する方法を説明し、WHERE句で条件を指定する方法を示しています。名前の取得、名前と苗字の両方の取得、特定の名前のデータ取得などを例に挙げ、WHERE句の基本的な使い方を解説しています。さらに、LIKE演算子とワイルドカード%を使った部分一致検索、AND演算子による複数条件の指定、!=演算子による条件の否定、NOT LIKE演算子による否定一致検索などを紹介しています。具体的なSQL文と実行結果を示しながら、それぞれの演算子の使い方を分かりやすく説明しています。
UbuntuにAndroidのエミュレータを入れる
/** Geminiが自動生成した概要 **/
Ubuntu 18.04にAndroidエミュレータを導入する方法。必要なライブラリをインストール後、Android Studioをダウンロード、インストールし、パスを通す。次に、KVM関連のライブラリをインストールし、ユーザーにKVMの使用権限を与える。Android Studioを再起動し、AVDマネージャーから好みのエミュレータを作成、実行することで、開発機上でAndroidアプリの動作確認が可能になる。
SQLiteでデータを入れて取り出してみる
/** Geminiが自動生成した概要 **/
Windows 10 で SQLite を使い、データを操作する方法を解説しています。SQLite をダウンロード、インストールし、環境変数を設定後、コマンドプロンプトでデータベースファイル(sample.db)を作成します。SQL文を用いて、テーブル作成、データ挿入、削除、並び替え、表示など基本操作を例示しています。`CREATE TABLE` でテーブルを作り、`INSERT INTO` でデータ挿入、`SELECT * FROM` で全データ表示、`DELETE FROM` でデータ削除、`ORDER BY` で並び替え、`LIMIT` で表示件数制限を行います。DB Browser for SQLite での確認方法にも触れています。