2025/12/19(金)SQLite integration
Kojima Toshiyasu版(原作?) SQLite integration
で動作するが、Wordpressを6.5以降にするとDBエラーで全く動かせなくなるので、よくわからないのでずっと放置していた。
それで、この度見つけたのが上述のものを基にした改良版の
wp-sqlite-db
だ。結果これのおかげで最新版のWordpressまで更新が可能となった。
というのもの、一旦このバージョンのSQLite integrationのdb.phpで更新して、その状態からWordpressを6.5以降にアップデート。
こうして一旦経由することでDBエラーがなく6.4と6.5のDB更新を乗り越えることで旧来のSQLiteDBたる.ht.sqliteが引っ越しできた。
そして、次に
SQLiteでWordPressを動かす(その1)
を参考にして、
SQLite database integration のセットアップ方法
も読みつつ、プラグインを手動でpluginsディレクトリにアップロードしインストールしてdb.phpをwp-contentにコピー(上書き)して最新の本家SQLite Database Integrationに移行させた。
これで、ずっと古いままだったWordpressを最新へと更新移行することができた。
2025/04/03(木)Windowsのスクリーンショットファイル名をリネーム
2024-08-26.png 2024-08-26 (1).png 2024-08-26 (2).png ...という、どうしようもないファイル名になってくれます。いろいろ面倒なのでファイル更新日時をつかってファイル名をリネームするバッチファイルを作成。
完全なリネームは怖いのでファイルコピー生成して問題なさそうであれば元のファイルは手動で削除する方法とした。
2024/06/23(日)ffmpegでアニメーションgifの容量をできるだけ小さくする
- なるべく容量を抑えたい
- 画質は問わない
- そのため動作内容がわかればよい
- 汎用性の高いファイル形式にしておきたい
./ffmpeg.exe -i "C:\soft\ffmpeg\input.mp4" -vf "fps=1, setpts=PTS/1.5, scale=600:-1, split[a][b]; [a]palettegen=max_colors=8[c]; [b][c]paletteuse;" -ss 3 -loop 0 output.gif
- 1fps
- 8色
- そこそこサイズの幅600
で600KB程度の数十秒間の動画の作成ができました。
2024/01/26(金)テキストエディタをJmEditorからMeryに。
昔話
その昔、BCC DeveloperというBorland C++の無償コンパイラを利用してWindowsアプリが作れる/作りやすいIDEがあった。その作者が高機能テキストエディタJmEditorというのソフトも公開していてすごくよくできていて、シンプルなのに必要な機能がほとんどそろっていて非常に動作も軽くて自分はずって手放せないでいました。使い始めたのが2003年とかそれくらいで、Widnows2000のころだったのでもう20年は使っています。そしてWindows10でも動いてるんだからMicrosoftもそれはそれですごい。
移行先
とはいっても、印刷機能がなかったりさすがに古くなっているし、作者のサイトもなくなっていてもうずっとアップデートもありません。それで移行先をずっと探していました。数年前に検討して少し使っているのは gPad というソフトですが、高機能すぎて自分にはちょっと違うなという感じでした。
そして今回見つけたのがMery、JmEditorの雰囲気になんとなく近くてしっくりきました。
窓の杜でも紹介されていますがこちらはバージョンが古く2.x系で作者のサイトに行くと最新の3.x系の入手が可能です。
現在はVer.3.6.5beta、アップデートも随時行われているので今後はこれを使っていきたいと思います。
それにしても、JmEditorを20年も使っていたのか…。
2022/05/31(火)Processing AndroidModeのcontrolP5ボタン
それは、定番なProcessingGUIライブラリのcontrolP5ライブラリをAndroidModeで利用する場合、ボタンイベントが所望の動作にならないというものです。ざっと調べた結果仕様っぽかったので、手軽に使いたい自分には悲しい状況になりました。
どうやらボタンイベントに関する挙動で、マウスXY/クリックによるボタン操作と画面タップによるボタン操作の違いに起因してるようです。
他の方法としては正攻法なAndroidSDKのコンポーネントを使うだとかあるみたいなのですが、難しいことは分かりませんし、カジュアルに使えてアプリ作っていきたいので今回簡易的にボタンコンポーネントクラスを作りました。
- TapButton.pde
public class TapButton { float x; float y; float w; float h; String s; int fontsize; boolean visible; TapButton(float _x, float _y, float _w, float _h, String _s) { x = _x; y = _y; w = _w; h = _h; s = _s; fontsize = int(w / s.length()); visible = true; } void Draw() { if (visible) { rectMode(CENTER); textAlign(CENTER, CENTER); textSize(fontsize); fill(255); rect(x, y, w, h); fill(0); text(s, x, y, w, h); } } void Visible(boolean b) { visible = b; } boolean Tapped(TouchEvent touchEvent) { int tapNum = touchEvent . getNumPointers( ) ; float tap_x, tap_y; if (0 < tapNum) { tap_x = touchEvent . getPointer( 0 ).x ; tap_y = touchEvent . getPointer( 0 ).y ; if ( abs(tap_x - this.x) < (w/2) && abs(tap_y - this.y) < (h/2) && this.visible) { return true; } } return false; } }
- Test.pde
import android.os.Bundle; import android.view.WindowManager; static int LetterBox = 16; //Letterbox of application draw area int sizeW, sizeH; boolean flag_backpress = false;//back button press flag boolean flag_exit = false; TapButton tb1 = new TapButton(500, 400, 300, 100, "button1"); TapButton tb2 = new TapButton(500, 600, 300, 100, "button2"); public void settings() { sizeW = displayWidth - LetterBox; sizeH = displayHeight - LetterBox; size(sizeW, sizeH); } public void setup() { frameRate(30); } void backPressed() { flag_backpress = true; } public void draw() { //DRAWING PROCESS -------------------------------------------------------------- background(150); if (mousePressed) { textSize(50); fill(0); textAlign(TOP, LEFT); text(Integer.toString(mouseX) + "," + Integer.toString(mouseY), 0, 500); } textSize(32); fill(0); textAlign(TOP, LEFT); text(Integer.toString(displayWidth), 0, 150); text(Integer.toString(displayHeight), 300, 150); ellipseMode(CENTER); // Set ellipseMode to CENTER fill(100); // Set fill to gray ellipse(mouseX, mouseY, 100, 100); // Draw gray ellipse using CENTER mode //TapButton draw --------------------------------------------------------------- tb1.Draw(); tb2.Draw(); //MAIN LOOP PROCESS ------------------------------------------------------------ if (flag_backpress) { flag_backpress = false; textAlign(CENTER, CENTER); textSize(100); fill(255); rect(0, sizeH/2 - 80, sizeW, 160, 32); fill(0); text("Exiting...", sizeW/2, sizeH/2); flag_exit = true; } else if (flag_exit) { delay(1000); exit(); } } public void touchStarted(TouchEvent touchEvent) { int tapNum = touchEvent . getNumPointers( ) ; float x = touchEvent . getPointer( 0 ).x ; float y = touchEvent . getPointer( 0 ).y ; //TapButton if (tb1.Tapped(touchEvent)) { tb1.Visible(false); } if (tb2.Tapped(touchEvent)) { tb1.Visible(true); } }
グローバル変数の
TapButton tb1 = new TapButton(500, 400, 300, 100, "button1");
でボタンを定義して、Draw()内の
tb1.Draw();
で描画、タップイベントは
public void touchStarted(TouchEvent touchEvent)内で、
if (tb1.Tapped(touchEvent))
{
tb1.Visible(false);
}
のようにifで判定してタップ時の処理を書きます。(ソースコード一部修正:2022/6/12)