ブログ内検索

プログラミング教室
最近興味があることや肥料教室についてのメルマガを配信しています

カテゴリー : コンピュータ/page-1

SOY CMSマニュアルページ作成中

SOY CMSの開発秘話を投稿しました。→SOY CMSの開発秘話
 

Minecraft: Pi Edition: Rebornでスキンを変更してみた

/** Geminiが自動生成した概要 **/
この記事は、Minecraft: Pi Edition: Rebornでスキンを変更する方法を解説しています。まず、好みのスキンをダウンロードします。次に、標準のスキンのPNGファイル(char.png)をバックアップし、ダウンロードしたスキンで置き換えます。この際、ファイルパスに注意が必要です。スキンを変更後、デザイン崩れが発生する場合は、Pythonスクリプト(minecraft_skin_fixer.py)を使用して修正します。スクリプト内のファイルパスを自身の環境に合わせて変更する必要があります。修正後、Minecraft: Pi Edition: Rebornを再起動すると、スキンが変更されているはずです。

 

Rasbperry Piにゲームパッドを繋ぎ、マインクラフトを操作する

/** Geminiが自動生成した概要 **/
この記事は、Raspberry PiまたはUbuntuに接続したLogicool F310ゲームパッドを使用してMinecraft: Pi Edition: Rebornを操作する方法を解説しています。Windows PC用のゲームパッドをLinux環境で動作させるため、joystickとjstest-gtkドライバをインストールします。jstestコマンドでゲームパッドが認識されていることを確認後、qjoypadをインストールし、GUIで各ボタンにキーボードやマウスの操作を割り当てます。記事では、マイクラリボーン用に設定したボタン割り当てを紹介し、動作確認を行うよう促しています。

 

プログラミング教育用のノートパソコンを探せ

/** Geminiが自動生成した概要 **/
Minecraft: Pi Editionを教材にプログラミング教育をしたいが、Raspberry Piは持ち運びに不便なため、代わりのノートパソコンを探している。Ubuntuが動作する中古PCでは性能不足が懸念される。そこで注目しているのが、QualcommのSnapdragonを搭載したSamsungの格安ノートPC「Galaxy Book Go」だ。ARMアーキテクチャを採用し、Ubuntuも動作する可能性があり、Raspberry Piの自由度とChromebookの価格帯の中間をいくマシンとして期待できる。

 

Minecraft: Pi Edition: Reborn on Ubuntu

/** Geminiが自動生成した概要 **/
記事では、子供向け科学雑誌に掲載された「Minecraft: Pi Edition: Reborn」(マイクラリボーン)を、Raspberry Piだけでなく、普段使いのUbuntuパソコンでも動作させた体験談を紹介しています。記事では、マイクラリボーンがUbuntu 20.04以降で動作すること、amd64、arm64、armhfのdebファイルが配布されていることから、Intel Core i5搭載のUbuntuパソコンにインストールして動作確認を行ったことが記載されています。その結果、Raspberry Pi版と同様に動作し、ローカルネットワーク経由で一緒に遊ぶこともできたと報告しています。そして、この経験から、教育用パソコンにおけるARM、Debian、Pythonの重要性について、次回以降の記事で考察していくことを示唆しています。

 

トランジスタ3電流増幅作用

/** Geminiが自動生成した概要 **/
この記事では、トランジスタの増幅作用、特に電流増幅作用について解説しています。トランジスタは、小さな電流を大きな電流に増幅することができます。具体的には、NPNトランジスタを例に、ベースにマイクロビットからの微弱な電流を流すことで、コレクタ-エミッタ間に大きな電流を流せることを説明しています。そして、この電流増幅作用を利用して、マイクロビットからの信号では光らせることのできないLEDを、トランジスタを介することで光らせることができるようになることを図解しています。

 

改めてSPIについてを知る4

/** Geminiが自動生成した概要 **/
本稿では、SPI通信におけるSSとSCLKの役割を解説しています。SSはスレーブ選択信号で、LOWにすることで特定のスレーブとの通信を有効化します。SCLKはクロック信号であり、この規則的なHIGH/LOW変化を基準に同期してMOSI/MISOでのデータ送受信が行われます。具体的には、SS1をLOWにし、SCLK信号に合わせてデータ送受信を行う例を図解で示しています。今回のSPI通信解説により、以前の記事で扱ったESP8266,Raspberry Piを用いたソケット通信やUARTと合わせて、IoTにおけるセンサーデータ取得から遠隔地への送信までの仕組みの理解が深まります。

 

改めてSPIについてを知る3

/** Geminiが自動生成した概要 **/
SPI通信について、マスタースレーブ構成、データ送受信の流れ、シフトレジスタによるデータの受け渡しなど、具体的な例を挙げながら解説しています。\特に、8ビットデータ転送を図解で示し、LSB、MSB、MOSI、MISOといった用語を用いながら、マスターとスレーブ間におけるデータの移動を詳細に説明しています。\最後に、Raspberry PiとAD変換器を用いたSPI通信のコード例を紹介し、次回の記事ではシフトレジスタの仕組みやSSの役割について解説することを予告しています。

 

改めてSPIについてを知る2

/** Geminiが自動生成した概要 **/
シフトレジスタは、複数のフリップフロップを連結してデータを順次移動させるデジタル回路です。各フリップフロップは1ビットの情報を保持し、クロック信号に従って隣に情報を渡していきます。例えば、直列入力直列出力型では、入力データが"11010000"の場合、各クロックサイクルで1ビットずつシフトされ、最終的に出力"00001101"として得られます。このように、シフトレジスタはデータを一時的に記憶したり、ビット列を操作したりする際に活用されます。

 

改めてSPIについてを知る1

/** Geminiが自動生成した概要 **/
SPIは、マスター機器が複数のスレーブ機器と通信する規格です。マスターはSCLK, MISO, MOSI, SSの4つの信号線でスレーブと接続します。SSはスレーブ選択線で、マスターはHIGH/LOWを切り替えることで、どのスレーブと通信するかを選びます。複数のスレーブを接続する場合、マスター側にスレーブ数分のSS(GPIOピン)が必要です。SSは通信開始と終了の合図にもなります。

 

ビット演算を介してシリアル通信を見る

/** Geminiが自動生成した概要 **/
この記事では、ビット演算をPythonコードを用いて解説し、シリアル通信の一つであるUARTのデータ構造を擬似的に再現しています。まず、スタートビット、データビット、パリティビット、ストップビットから成るUARTのビット列を、ビットシフト演算子を用いて生成する過程を示します。次に、乱数を用いてデータビットの0/1をランダムに設定することで、より現実的なUART通信を模倣しています。これにより、ビット演算がハードウェアレベルでのデータ通信を理解する上で重要であることを示し、今後のSPI通信学習への足掛かりとします。

 

Pythonでビット演算子のビットシフトに触れる

/** Geminiが自動生成した概要 **/
Pythonのビットシフト演算子について解説しています。**<< (左シフト)** はビットを左に移動させ、右側に0を追加します。1を左に1ビットシフトすると2、2ビットシフトすると4になります。**>> (右シフト)** はビットを右に移動させ、末尾のビットは削除されます。4を右に1ビットシフトすると2、2ビットシフトすると1になります。これらの演算子は、効率的な計算やデータ処理に役立ちます。具体的な使用例は次回の記事で解説されます。

 

Pythonでビット演算子のビット否定に触れる

/** Geminiが自動生成した概要 **/
Pythonではビット否定演算子~を使うと、整数のビット反転ではなく、**負数の表現**として用いられます。記事中の例では、13 (~0b1101) のビット否定は、-14 (-0b1110) となります。これはPythonが整数を**符号付き2進数**で表現しているためです。符号付き2進数では、最上位ビットが符号を表し、残りのビットが数値を表します。ビット反転を行うには、ビット演算とマスクを組み合わせる必要があります。単にビット反転を行うだけであれば、`~` 演算子ではなく、各ビットを反転する関数を定義する方が分かりやすいかもしれません。

 

Pythonでビット演算子の排他的論理和に触れる

/** Geminiが自動生成した概要 **/
Pythonのビット演算子の一つである排他的論理和(XOR)について解説しています。XORは、^ 演算子で表され、2つのオペランドのビットが異なる場合に1を返す演算です。記事では、真理値表を用いてXORの動作を具体的に説明し、13と10のXOR演算を例に、ビット演算の結果が7(0b111)になることを示しています。さらに、ビットごとのXOR演算を手計算で説明し、2進数表現での理解を深めています。最後に、CPUの説明などで用いられるXORの記号を紹介しています。

 

Pythonでビット演算子の論理積に触れる

/** Geminiが自動生成した概要 **/
今回の記事では、Pythonのビット演算子の一つである論理積(&&)について解説しています。論理積は2つの値の両方が1の場合にのみ1を返す演算です。記事では、変数 `cmdout` と16進数 `0x80` の論理積を計算するコードを例に挙げています。`cmdout` は、前の処理で192(2進数で `0b11000000`)に設定されています。`0x80` は10進数で128、2進数で `0b10000000` です。これらの論理積をとると、`0b10000000` となり、これは10進数で128です。記事では、この計算がSPI通信でのデータ送受信に関連していることを示唆していますが、具体的な意味についてはまだ明らかにされていません。最後に、論理積を表す電子回路の記号も紹介されています。

 

Pythonでビット演算子の論理和に触れる

/** Geminiが自動生成した概要 **/
Pythonのビット演算子、特に論理和(OR)について解説しています。記事では、UARTとSPIの通信方式の比較を題材に、SPI通信のコードで使われているビット演算を理解しようと試みています。まず、`|=`という演算子がビットごとの論理和を計算し、結果を変数に代入するものであることを説明します。具体例として、`cmdout |= 0x18`というコードを解説しています。初期値0の変数`cmdout`と16進数`0x18`(2進数では`00011000`)の論理和を計算することで、`cmdout`の値が`00011000`となり、10進数では24になることを示しています。最後に、論理和を表す回路図の記号も紹介しています。

 

UARTについてを知る4

/** Geminiが自動生成した概要 **/
この記事では、UARTにおける「非同期」の意味について解説しています。UARTは調歩同期方式を採用しており、これはSPIのような外部クロックを使わずにデータを送受信する方法です。スタートビットとストップビットを利用することで、クロック同期なしにデータのやり取りを実現します。Webアプリで用いられる非同期処理とは異なる概念であることに注意が必要です。SPIのような同期通信方式も理解を深める上で重要ですが、複雑なため、別途学習する必要があると結論付けています。

 

ESP8266とRaspberry Piでソケット通信を試す

/** Geminiが自動生成した概要 **/
この記事では、ESP8266モジュールをクライアント、Raspberry Piをサーバーとしたソケット通信を試みています。まず、ESP8266側でWiFi接続を行い、サーバー側のIPアドレスとポート番号を指定してソケット通信を行います。記事では、ESP8266から"send socket from esp8266"というメッセージをサーバーに送信し、サーバー側で受信できていることを確認しています。これにより、ローカルネットワーク内でESP8266からRaspberry Piにデータを送信できることが確認できました。今後は、温度などのデータを送受信する方法を検討していく予定です。

 

コンピュータ二台でソケット通信を試す

/** Geminiが自動生成した概要 **/
この記事は、二台のコンピュータ間でローカルネットワークを通じてソケット通信を行う方法を解説しています。まず、Raspberry Piをサーバー側にして、そのローカルIPアドレスを調べます。次に、Pythonで記述したサーバープログラムを、調べたIPアドレスを使って修正します。クライアント側にはLinuxマシンを使用し、同様にローカルIPアドレスを調べます。その後、クライアントプログラムを実行し、サーバープログラムが実行されているRaspberry PiのIPアドレスとポート番号を指定して接続します。記事では、接続が成功したことを確認後、NodeMCUとRaspberry Piでのソケット通信に進むことを示唆しています。

 

コンピュータ一台でソケット通信を試す

/** Geminiが自動生成した概要 **/
この記事では、マイコンを用いたデータ送信システム構築に向けて、まずは一台のPCでのソケット通信を試行しています。具体的には、Pythonを用いて、受信側(サーバー)と送信側(クライアント)のプログラムを作成し、同一PC上で動作させています。サーバー側はポート番号12345で接続を待ち受け、クライアント側からの接続があると、入力されたデータを受信し、"Successed!"というメッセージを返信します。記事では、それぞれのプログラムのコード例と実行結果を示し、実際にデータの送受信が成功していることを確認しています。今後は、2台のPC間でのソケット通信に挑戦する予定です。

 

NodeMCUをWebサーバにしてみた

/** Geminiが自動生成した概要 **/
NodeMCU(ESP8266)をWebサーバにする実験。MicroPythonのサンプルコードを参考に、GPIOピンの状態をWebページに表示する仕組みを作成。NmapでNodeMCUのIPアドレスを特定しブラウザからアクセスした結果、GPIOピンの状態がリアルタイムに確認できた。HTTP通信の基礎を学ぶ良い機会となり、今後は外部からのリクエストに応じて処理を行う仕組みも試したい。

 

NodeMCUをWiFiのアクセスポイントにしてみる

/** Geminiが自動生成した概要 **/
この記事は、NodeMCU(ESP8266)をWiFiのアクセスポイントにする方法を解説しています。筆者は、サンプルコードを参考に、NodeMCUにWiFi接続とアクセスポイント設定のコードを記述し実行しました。その結果、コードに記述した「ESP-AP」という名前のアクセスポイントが作成されたことを確認しました。しかし、パスワードが設定されていないため、現時点では接続できない状態です。記事では、引き続きWiFi用語の解説や接続方法について掘り下げていくことを示唆しています。

 

NodeMCUにファームウェアをインストールする

/** Geminiが自動生成した概要 **/
ESP8266 NodeMCUモジュールにMicroPythonファームウェアをインストールするには、esptoolツールを使用します。ファームウェアのbinファイルをダウンロードし、`esptool`コマンドを使用してフラッシュを消去してから、新しいファームウェアを書き込みます。ファームウェアがインストールされたら、Thonny IDEを使用してLチカプログラムを作成します。ThonnyをESP8266に接続し、`main.py`という名前でプログラムを保存します。プログラムを実行すると、NodeMCUのLEDが点滅します。

 

AD変換器から出力されたデジタル値を読み込む

/** Geminiが自動生成した概要 **/
この記事では、AD変換器を使ってアナログ値をデジタル値として読み取る方法を解説しています。AD変換器からのデータ送信には、複数のピンを使ったSPI通信という方式が使われています。SPI通信では、マスター(Raspberry Pi)とスレーブ(AD変換器)間でデータのやり取りが行われます。重要な点は、AD変換器からのデジタルデータは1本のピンではなく、SCLK、MISO、MOSI、SSの4本のピンを使ってやり取りされることです。

 

アナログとデジタル

/** Geminiが自動生成した概要 **/
記事では、そろばんがデジタルである理由をアナログとデジタルの違いを説明しながら解説しています。アナログは水銀体温計のように、値が連続的に変化し、無限に細かい値をとります。デジタルは電子体温計のように、飛び飛びの値で表現されます。そろばんは玉を1つずつ動かすことで数を表現するため、値は飛び飛びになります。そのため、そろばんはデジタルに分類されます。

 

pH測定で用いるガラス電極法に触れてみる

/** Geminiが自動生成した概要 **/
筆者はpH測定器の仕組みを理解するため、ガラス電極法について調べています。ガラス電極法は、pHガラス電極と比較電極を用い、pHガラス応答膜の内側と外側のpHの違いにより生じる起電力を測定することでpHを算出します。pHガラス応答膜の内側にはpH7の塩化カリウムが用いられ、測定したい液体に当てると、pHの差に応じて起電力が発生します。この起電力は温度によって変動するため、測定前にキャリブレーションが必要です。筆者はpH測定器をRaspberry Piに接続しようとしましたが、A/D変換が必要なため、接続は保留となっています。

 

Raspberry PiのPWMでサーボモータを動かしてみる

/** Geminiが自動生成した概要 **/
この記事では、Raspberry PiのPWM機能を使ってサーボモーターを制御する方法を解説しています。サーボモーターは、パルス幅によって回転角度を制御することができます。この記事では、GeekServo 9G Servo-Grayというサーボモーターを使用し、GPIO 12に接続して制御しています。コードでは、RPi.GPIOライブラリを使ってPWM信号を生成し、ChangeDutyCycle()関数でデューティ比を変更することで、サーボモーターの回転角度を制御しています。具体的には、デューティ比2.5%で-45度、7.25%で90度、12%で225度回転するように設定されています。

 

Raspberry Piと赤色LEDでホタルのような点滅を試す

/** Geminiが自動生成した概要 **/
記事では、Raspberry PiとLEDを用いて、PWM(パルス幅変調)による疑似アナログ信号の生成と、その効果について解説しています。PWMは、デジタル信号のパルス幅を調整することで、見かけ上アナログ信号のような出力を行う技術です。記事では、パルス幅を徐々に変化させることで、LEDの明るさが滑らかに変化する様子を「ホタルの光」に例えています。 具体的には、Pythonコードを用いてPWMのデューティ比を周期的に変化させることで、LEDの明るさを制御し、ホタルの点滅のような効果を実現しています。

 

Fritzingを使って、Raspberry Piの回路図を作成する

/** Geminiが自動生成した概要 **/
Fritzingというアプリを使えば、電子回路の回路図が簡単に作成できます。Raspberry Piなど、様々な電子部品がパーツとして用意されており、ドラッグ&ドロップで配置できます。標準パーツにない場合は、ネットから追加することも可能です。例えば、Raspberry Pi 4 Model Bのパーツは、フォーラムで共有されているfzpzファイルをダウンロードしてインポートすることで使用できます。

 

Raspberry Piのシリアルコンソールを試す

/** Geminiが自動生成した概要 **/
Raspberry Piのシリアルコンソール機能を使うと、ネットワーク環境がなくても有線でRaspberry Piを操作できます。今回は、Raspberry Pi 4BとUbuntu 20.04、USB-TTLシリアルコンソールケーブルを使って接続を試みました。Raspberry Pi側でシリアルポートとコンソールを有効化し、ケーブルで接続します。Ubuntu側ではscreenコマンドを使ってシリアルコンソールに接続します。接続が確立すると、Ubuntuの端末にRaspberry Piのログイン画面が表示され、操作が可能になります。接続を終了するには、ctrl + a、kと入力します。

 

Raspberry PiでLCDに文字列を出力する

/** Geminiが自動生成した概要 **/
この記事では、Raspberry PiとI2C接続のLCDディスプレイを使って文字列を表示する方法を解説しています。まず、Raspberry Piの設定でI2Cを有効化し、LCDのI2CモジュールをGPIOピンに接続します。接続が正しければ、「i2cdetect -y 1」コマンドでI2Cアドレスが表示されます。次に、OSOYOOのライブラリ「i2clcda.py」を使ってPythonコードを作成し、LCDに文字列を表示します。コードでは、ライブラリをインポート後、「lcd_init()」でLCDを初期化し、「lcd_string()」関数で文字列と表示位置を指定して出力します。表示されない場合は、I2Cモジュールのポテンショメータを調整してコントラストを調整する必要があります。

 

NmapでLAN内のRaspberry Piを探してみる

/** Geminiが自動生成した概要 **/
本記事では、Nmapを活用してLAN内のRaspberry PiのIPアドレスを特定する方法を解説します。Ubuntu環境ではNmapのインストールからIPアドレス発見までスムーズに進んだ成功事例を紹介。一方、ChromebookのLinux環境ではNmapでのスキャンが上手くいかない問題に直面。その原因が、ChromebookのLinuxがLXCコンテナ上で動作しており、ネットワーク環境がホストと異なるためと判明しました。コンテナ環境からのLAN内探索の難しさを示し、コンテナ技術への深い理解が不可欠であることを提示します。

 

Raspberry PiをChromebookから操作する

/** Geminiが自動生成した概要 **/
プログラミング教室でキーボード・ディスプレイ無しにRaspberry Piを使うため、ChromebookからVNC接続を試みた。Raspberry PiでVNCサーバーを有効化し、ChromebookにVNC Viewerをインストール、IPアドレス指定で接続に成功。しかし、ディスプレイ未接続時は起動時にウィンドウシステムが立ち上がらずエラー発生。解決策として、raspi-configで画面解像度を設定することで、ディスプレイ無しでもVNC接続できるようになった。

 

ARM版ChromebookにDropboxをインストールする

/** Geminiが自動生成した概要 **/
ARM版ChromebookでLinuxアプリのDropboxを使うには、.debパッケージが使えないためDbxfsを利用する。pip3でDbxfsをインストール後、Dropboxフォルダを作成し、dbxfsコマンドを実行。表示されるURLにアクセスし、Dropboxにログインして認証コードを取得、端末に入力する。パスフレーズを設定すれば、Linuxファイル配下でDropboxのファイルが操作可能になる。Android版DropboxはChromebookのFilesのLinux共有に対応していないため、この方法が必要。

 

ChromebookのLinuxアプリで日本語入力をできるようにする

/** Geminiが自動生成した概要 **/
ChromebookのLinuxアプリで日本語入力をするために、MozcとFcitxをインストール・設定する方法を解説。locale設定後、MozcとFcitxをインストールし、設定ファイルを編集してFcitxを自動起動するように設定。fcitx-configtoolでMozcを追加し、geditで日本語入力を確認。geditでは挙動が怪しかったが、他のアプリでは正常に動作。Javaアプリでも日本語入力可能になった。cros-imを使う方法もあるが、geditでは漢字変換できない問題がある。

 

ChromebookでJava製のアプリを実行する

/** Geminiが自動生成した概要 **/
ChromebookのLinux環境でPENを動かすための手順を紹介した記事の続きで、日本語入力の設定方法を解説している。PENはJava製のため、LinuxにJavaをインストールする必要がある。インストールコマンド `sudo apt install default-jre`、バージョン確認コマンド `java -version` を紹介。その後、`java -jar PEN.jar` でPENを起動できるが、日本語入力ができないため、フォント設定が必要となる。この設定は次の記事で詳しく解説する、と予告している。

 

Chromebookはプログラミングの教育の端末として向いているか?を調査する

/** Geminiが自動生成した概要 **/
ChromebookのLinuxアプリで日本語入力ができない問題を解決する方法を解説した記事の要約です。ChromebookのLinux環境では標準で日本語入力ができません。この記事では、fcitx-mozcをインストールすることで日本語入力できるようにする方法を、スクリーンショット付きで丁寧に説明しています。まず、Linuxターミナルを開き、必要なパッケージをインストールします。次に、設定ファイルを作成・編集し、fcitxを起動するように設定します。最後に、Chromebookを再起動し、入力メソッドの設定で日本語(Mozc)を選択すれば、日本語入力が可能になります。記事では、詳細なコマンドや設定内容、トラブルシューティングについても触れています。

 

Let's Encryptでwwwありなしに対応する

/** Geminiが自動生成した概要 **/
Let's Encryptを用いて、wwwあり(www.example.com)なし(example.com)両方のドメインでhttpsアクセスを実現する方法。Ubuntu 18.04、Apache2環境を前提とする。まず、certbotをsnapでインストールし、example.comのhttps化を行う。その後、www.example.comの証明書取得のため、`certbot certonly --webroot`コマンドを実行(webroot-pathはドキュメントルート)。最後に、Apacheの設定ファイル(000-default-le-ssl.conf)にwww.example.comのVirtualHost設定を追加し、example.comへのリダイレクトを設定、Apacheを再起動する。

 

設置したお問い合わせフォームからの通知メールが届かない

/** Geminiが自動生成した概要 **/
SOY Inquiryで構築したお問い合わせフォームの管理者宛通知メールが突如届かなくなった。調査の結果、送信テストの繰り返しにより、さくらのメールボックスで迷惑メールと判定されていたことが判明。対応として、メールボックスのコントロールパネルで管理者メールアドレスをホワイトリストに登録した。転送設定を利用しているため、転送先メールアドレスのホワイトリストにも同様の登録が必要。通知メールにお問い合わせ番号を含めることで迷惑メール判定を回避できる可能性も検討中。

 

様々な依頼からこれからの働き方を見た

/** Geminiが自動生成した概要 **/
新型コロナの影響で事業への影響を覚悟していた筆者は、逆に変化を見越した企業からのWeb開発依頼が殺到した。 非接触型の予約注文システムや、代理販売・寄付サイトなど、コロナ禍のニーズに応える開発が多かった。 また、SEO対策情報の需要も高まった。 特に印象的だったのは、テレワーク向け研修システムの開発だ。 音声チャットとWebアプリを組み合わせたボードゲーム形式で、セールスの模擬体験を行うもので、オフライン研修以上の価値を感じたという。 コロナ禍でWeb技術の活用が模索された一年であり、この流れは今後も加速し、Web技術を活用できない企業は淘汰されるだろうと予測している。

 

WordPressのデータベースのスキーマを調べる

/** Geminiが自動生成した概要 **/
WordPressからのデータ抽出のため、データベーススキーマのバージョン調査を行った。テーブル名は`wp-includes/wp-db.php`に定義されており、バージョン2.5.0から変更がない。テーブルスキーマは`wp-admin/includes/schema.php`にSQLで定義され、バージョン3.3.0から変更がないことがわかった。よって、データ抽出ツールはWordPress 3.3.0以降に対応させ、それ以前のバージョンはアップグレードしてから利用するよう条件付けすれば良い。

 

UbuntuでMySQLのアップグレードが停止する原因を探る

/** Geminiが自動生成した概要 **/
Ubuntu 20.04の開発環境で、MySQL 8系のapt upgradeが停止する問題が発生。原因はMySQLの設定ファイル`mysqld`セクションに`skip-grant-tables`が設定されていたため。この設定はパスワード認証を無効化するためのもので、アップグレード処理と競合した模様。`skip-grant-tables`をコメントアウトすることで問題は解決した。開発環境ではパスワード入力を省略するために設定していたが、セキュリティリスクの高い設定のため、本来の使い方ではない。

 

データ構造のキューとリングバッファを見る

/** Geminiが自動生成した概要 **/
Go言語のテスト方法に関する記事の要約です。Goでは`*_test.go`ファイルにテスト関数を記述します。テスト関数は`TestXxx`という命名規則に従い、`*testing.T`を引数に取ります。`t.Error`や`t.Errorf`でテスト失敗を報告し、`t.Log`でログを出力します。`go test`コマンドでテストを実行でき、`-v`オプションで詳細表示、`-cover`でカバレッジ計測が可能です。記事では具体的なテスト例として、文字列の等価性チェックやエラーハンドリングのテストが紹介されています。また、外部パッケージのテストやテストデータの扱いについても触れられています。

 

字句解析器を作る為にデータ構造のスタックを見る

/** Geminiが自動生成した概要 **/
Go言語のテスト方法を解説した記事の要約です。Goでは`*_test.go`ファイルにテスト関数を記述します。テスト関数は`Test*`という名前で、`*testing.T`を引数に取ります。`t.Error`や`t.Errorf`でテスト失敗を報告、`t.Log`でログ出力、`t.Run`でサブテストを実行できます。`go test`コマンドでテストを実行し、カバレッジは`go test -cover`で確認できます。記事では具体的な例として、加算関数`Add`のテストコードを`add_test.go`に記述し、正常系と異常系のテストケースを実行する方法を紹介しています。また、テーブル駆動テストを用いて複数のテストケースを簡潔に記述する方法も説明しています。

 

PHPのハッシュテーブルを見る

/** Geminiが自動生成した概要 **/
PHPのハッシュテーブルの実装を調査した。`HashTable`は`_zend_array`構造体で定義され、`Bucket`構造体の配列`arData`を持つ。`Bucket`は値(`zval`)、ハッシュ値(`h`)、キー(`key`)を保持する。`zval`は`zend_value`共用体を含み、関数ポインタ`zend_function`もそのメンバの一つ。`zend_function`自体は共用体で、内部関数やユーザー定義関数の情報を保持する構造を持つ。関数登録は`HashTable` - `Bucket` - `zval` - `zend_value` - `zend_function`と複数のデータ構造を介して行われることが判明した。

 

ハッシュテーブルのチェイン法を見る

/** Geminiが自動生成した概要 **/
PHPのハッシュテーブルの実装であるチェイン法を、単方向連結リストを用いて再現した。ハッシュテーブルへの要素追加、検索、初期化、リサイズの関数をPHPで作成し、衝突が発生するケース(アズキとショウブ)で動作を確認した。結果、インデックス2にアズキとショウブが連結リストで格納され、検索関数も正しく動作することを確認できた。この実装はPHPのzvalや変数登録の仕組みを理解する上で役立つ。ただし、PHPのチェイン法は双方向連結リストを用いており、また、連結リストではなく配列を用いる実装もある。

 

データ構造の単方向連結リストを見る

/** Geminiが自動生成した概要 **/
PHPで単方向連結リストを実装する方法を解説しています。連結リストは、各要素(ノード)がデータと次のノードへのポインタを持つデータ構造です。記事では、ノードクラスと、リストの末尾にノードを追加する`_add`関数を定義しています。例として、木の名前をリストに追加し、図で構造を可視化しています。C言語と異なりPHPでは配列の恩恵が大きいため連結リストのメリットは少ないものの、ハッシュテーブルの衝突回避策として重要であると述べ、最後に双方向連結リストではprevプロパティで前のノードも保持すると補足しています。

 

データ構造のハッシュテーブルを見る

/** Geminiが自動生成した概要 **/
PHPの関数はハッシュテーブルというデータ構造で管理される。ハッシュテーブルは高速な検索が可能だが、ハッシュ値の衝突という問題がある。この記事では、簡単なハッシュ関数とハッシュテーブル操作関数を作成し、文字列を登録する例を通してハッシュテーブルの基本的な動作を説明する。複数の文字列を登録する際に、ハッシュ値の衝突が発生し、一部の文字列が登録されないことを示し、衝突回避のための方法としてハッシュテーブルのリサイズやハッシュ関数の改良、そしてチェイン法の存在を示唆している。

 

PHPの関数の登録2

/** Geminiが自動生成した概要 **/
PHPの関数の登録は実行時に動的に行われる。includeされたファイル内の関数は、includeされるまで定義されない。また、条件分岐で囲まれた関数は、条件が満たされなければ定義されない。つまり、関数の定義記述が実行時に通過しなければ、関数は登録されない。この挙動は、`get_defined_functions()` の結果で確認できる。これらの結果から、PHPはマルチパス方式ではなく、実行時にコードを解釈・実行しながら関数を登録していることがわかる。

 

PHPの関数の登録

/** Geminiが自動生成した概要 **/
PHPの関数登録について`get_defined_functions`関数を用いて調査。ユーザー定義関数は'user'配列に、ビルトイン関数は'internal'配列に格納される。関数の定義箇所に関わらず、実行前に`get_defined_functions`を実行すると、定義済みの全関数が取得できる。これはPHPがマルチパス方式を採用し、実行前にファイル全体を読み込んで関数登録を完了させているためと考えられる。

 

【SEO対策】Core Web Vitals

/** Geminiが自動生成した概要 **/
Google Analyticsのスクリプトをページ読み込み直後に移動することで、Core Web Vitals、特にFID(First Input Delay)を改善する方法を解説しています。通常、Google Analyticsのスクリプトは</body>直前に配置されますが、これだとスクリプトのダウンロードと実行が完了するまでブラウザが他の操作を受け付けず、FIDが悪化します。記事では、async属性を追加し<head>内に移動することで、スクリプトを非同期で読み込み、ブラウザのレンダリングを妨げないようにする方法を紹介。async属性はIEでは機能しないため、IE用に条件分岐で対応する必要性も説明しています。さらに、Google Tag Managerを使用している場合は、設定変更だけで対応可能であることも解説しています。これらの修正により、FIDが大幅に改善され、ユーザーエクスペリエンスの向上が期待できます。


Powered by SOY CMS  ↑トップへ