投稿

Firefoxで動画再生時のノイズ

イメージ
Firefoxで動画によっては音程が非常に低くなるとともにノイズが出ることがあった セーフモードでは再現しないのでアドオンを一個一個オンオフしてみたところ、意外な原因が判明する それはUserAgent変更用のアドオンだった UserAgentがそのままだとYahooニュースの動画が再生されないので入れていたのだが、まさかこれが原因だとは思わなかった  使っているアドオン(User-Agent Switcher and Manager)をホワイトリストモードにしてYahooニュースのアドレスを入れておいた これにて一見落着

Androidでバーコードを読み込む

イメージ
 ふと思い立ちAndroidにてバーコードを読み込めないかと調べてみる ネットで検索するとZXingライブラリというのを使う方法と、Google Playサービスを使う方法が紹介されていた 今回はGoogle Playサービスを使用しバーコードを読み込んでみた よく紹介されている方法はバーコード読み取り用のActivityを別に立ち上げ、その結果を取得する方法である しかしここでは同じActivity内でカメラを使用しバーコードを取得、表示する あくまで簡易的に処理、表示するためのものなのであしからず まずは外部ライブラリを使用するのでgradleを編集する dependenciesに以下を追加 implementation 'com.google.android.gms:play-services-vision:20.1.3' これはバーコードのためだけに入れているので、すべてのPlayサービスを読み込むplay-servicesが入っていれば追加する必要はない AndroidManifest.xmlにカメラ権限を追加 <uses-permission android:name="android.permission.CAMERA" /> Activityでカメラ権限を要求 private class requestPermission() {   final int REQUEST_CODE_CAMERA_PERMISSION = 0x01;   if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_CAMERA_PERMISSION);   } } クラスを作成しFrameLayoutを継承する これはレイアウト下にカメラの映像を表示するTextureView そしてオーバーレイで...

Notificationで押したボタンと受け取った内容が違う場合

AndroidのNotificationのボタンを作る際によく紹介されているのは以下のようなもの Intent intent1 = new Intent("Intent_Action"); intent1.putExtra(name1, value1); PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, (int)System.currentTimeMillis(), intent1, PendingIntent.FLAG_UPDATE_CURRENT); これをbuilderに setAction(pendingIntent1) するわけだが、ボタンを2つに増やすと送られてくるIntentが違うことがあった 2つ目の作りは変数部分の数字が違うだけで以下の通り Intent intent2 = new Intent("Intent_Action"); intent2.putExtra(name2, value2); PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, (int)System.currentTimeMillis(), intent2, PendingIntent.FLAG_UPDATE_CURRENT); このようにして登録すると何故か1番目のボタンを押しているにもかかわらず2番目のボタンのIntentが送られてくる場合がある 原因はPendingIntentの (int)System.currentTimeMillis() の部分にある この部分はRequestCodeとなっており、連続してpendingIntentを作成すると同じ時間の数字がRequestCodeになってしまう RequestCodeが同じになることで後の FLAG_UPDATE_CURRENT で同じものと判断されて上書きした上で発信されてしまう これを防ぐにはそれぞれのPendingIntentには別々のRequestCodeを割り当てることで、問題なく送信することができるようになる

base64で文字列化された画像のリサイズ用ツール

htmlではbase64により画像を文字列に変換することで 一々画像をアップロードしなくても直接ページに埋め込む事ができます ただ、表示サイズよりも大きな画像のままbase64化してしまうと、無駄に文字列も長くなってしまいます このページではbase64の画像を指定サイズにリサイズ(拡大、縮小)します 使い方 ・まだ画像がbase64化されていなければ画像ファイルの選択かドロップ ・既にbase64かされていれば上部のテキストエリアに文字列を入力 ・Width(幅)とHeight(高さ)を入力 ・Resizeボタンを押すと下部のテキストエリアにリサイズされた文字列と確認用に画像が表示されます ここにドロップでも可能 インターネット上の画像の場合 画像自体(https://~.png)を開き、右クリックしてFirefoxなら「要素を調査」をChromeなら「検証」を選択 そこからコンソールで下のフレーム内の文字列を実行すれば結果が出力される var img = document.querySelector('img');var canvas = document.createElement('canvas');canvas.width = img.width;canvas.height = img.height;var ctx = canvas.getContext('2d');ctx.drawImage(img,0,0);canvas.toDataURL(); このページでの直接取得やブックマークレットはCrossOriginで無理です Origin Width Height Resized

javascriptで指定色を等分したグラデーションの自動作成

分かりづらいタイトルなので実際のものを こんな感じ 実際のコードは以下 *枠線は除いてある <div style="background: linear-gradient(to right , pink 0 , pink 33.32% , palegreen 33.33% , palegreen 66.65% , lightskyblue 66.66% , lightskyblue 100%);"> 指定色 [ pink, palegreen, lightskyblue ] で等分したグラデーションになっている これをjavascriptで自動作成するには function gradientGen(colors) {     var texts = ['to right'];     var ratio = 100 / colors.length;     for (var i = 0; i < colors.length; i++) {         if (i != 0) {             texts.push(colors[i-1] + ' ' + ((ratio * i)-0.01) + '%');         }         texts.push(colors[i] + ' ' + ratio * i + '%');     }     texts.push(colors[colors.length-1] + ' 100%')     return 'linear-gradient(' + texts.join(',') + ')'; } var colorList = ['pink','palegreen','lightsk...

Qtでlibmpvでの動画再生

mpvはWindows/MacOS/Linux対応のメディアプレイヤーである SMPlayerなどのバックエンドとして使われるが単体でも再生が可能 そのmpvにはlibmpvというAPIが付属しておりアプリケーション内で再生や制御を行える 今回はこれを使用し動画再生アプリを作成する まずは.proに以下を追加 既にKeyがある場合はそれに追加で QT_CONFIG -= no-pkg-config CONFIG += link_pkgconfig PKGCONFIG += mpv x11 次にmain.cppのQApplicationの宣言の下辺りに以下を追加 setlocale(LC_NUMERIC, "C"); あとはクラスに書いていくのだが mpvで動画を再生するのには再生先(QWidget)が必要となる なのでQWidgetを継承したカスタムクラスの"Player"を作成し、まとめて書いてしまうことにする QtCreator(QtDesigner)で配置した場合はPlayerへの格上げを忘れないように ヘッダには以下のincludeを追加 #include <mpv/client.h> #include <mpv/render.h> #include <mpv/qthelper.hpp> あわせてprivateに以下を追加 mpv_handle *mpvHandle = nullptr; ソースのincludeの下に以下を static void wakeup(void *ctx) {     Player *player = (Player *)ctx;     emit player->mpv_events(); } そして以下を追加しrun_mpv()はPlayerの初期化の際に読み込む(コメントアウト部分は後述) void Player::run_mpv() {     mpvHandle = mpv_create();     if (!mpvHandle)     ...

Firefoxで改造アドオンのインストール失敗

無駄な時間を過ごしたので忘れないように書き留めておく とあるアドオンの改造を行ったがインストールが出来ない 基本的には公式からアドオンのxpiをダウンロードしてからzipとして解凍し 内部のファイルを改変、再びzipに圧縮してからxpiに戻してインストール が手順なのだが問題発生 「このアドオンは壊れているため、インストールできませんでした」 と表示されてしまう 英語表記では"this add-on could not be installed because it appears to be corrupt" アドオンのデバッグから一時的なアドオンとして読み込むと問題なくインストールできる これでよくあるパターンは圧縮時のミスで、解凍時のフォルダごと圧縮してしまうとアウト アーカイバで開いた時にmanifest.jsonが最初に表示されればオーケー これを確認したが問題はなかった 次に考えたのはファイル改変時のミスで、エンコードや内容を見直した UTF-8で出力されておりタブ文字をスペースに直したり、別のエディタを入れて保存してみたりもした それでも上記のエラーでインストールが出来ない 署名がないアドオンをインストールするにはFirefox Developer Editionでないといけないらしいが エラー内容からして違うのではないかと思いつつインストール どちらにしろ入れる必要はあったが、結局同じエラー 他にもzip圧縮率を変えてみたりして睡眠時間を削り 何時間も格闘した後にMDNの manifest.jsonのページ を見ていると   "applications": {     "gecko": {       "id": "addon@example.com",       "strict_min_version": "42.0"     }   }, この項目を見て思い出した 前にWebExtensionのアドオンを作った時にも書いたと   Firefoxでは認証されていないアドオンは「id」を指定...

AMDグラフィックボードのファンを自動制御する

夏が近づくと出てくるトラブルが PCの温度上昇 である 基本的に温度が上昇してもCPUやGPUがクロックを下げることで、温度上昇を抑制してくれるが それは性能に制限がかかるということであり、そもそも温度上昇は故障の原因なので是非とも回避したい ファン制御アプリは有名な fancontrol が存在するが、知る限りでは制御時に参照する温度は1つで しかも個別に制御することが出来ない なのでCPU温度はfancontrolに任せておき、グラフィックボードのファン制御は別のアプリで行うことにした 使用するアプリケーションは amdgpu-fan AURからインストールが出来る インストール(もしくは起動)すると /etc/amdgpu-fan.yml に設定ファイルが作成されるので、これを管理者権限で編集する 開くと speed_matrix: - [0, 0] - [40, 30] - [60, 50] - [80, 100] とあるが、カンマで区切られた左側が温度、右側がファン速度である この場合40度では30%のファン速度ということになる この数字の組は増やすこともできるので、より細かく制御することもできる 保存し終えたあとはサービスが自動起動になっていることを確認し、ベンチマークなどで温度上昇が抑制されるかを試してみればいい 確認  sudo systemctl status amdgpu-fan 自動起動の有効化  sudo systemctl enable amdgpu-fan WebGLによるGPUストレステスト向けサイト   http://www.fishgl.com/

Qtで作るAndroidアプリケーション

AndroidでQtアプリケーションを実行するまで でアプリケーションの実行ができるようになったので、実際にアプリケーションを作る際のポイントを記す 必要ないこともあるかと思うが、今現在動いているものである プロジェクトの作成  前ので書いたとおりプロジェクトの作成時に対象端末用のAndroidキットを指定する デザイナでの配置  Android上でデザインが変わることもあるが、ウィジェットは同じ様に配置できる  ただしレイアウト上に置かないと配置が崩れるので注意 AndroidManifest.xmlの配置  一旦実行した後にプロジェクトフォルダ内の android-build フォルダを開き AndroidManifest.xml をコピーしてくる プロジェクトフォルダに android-sources フォルダを作成しコピーした上記ファイルを貼り付ける Qtに戻りサイドバーのプロジェクトから「既存のファイルを追加」を選択し android-sources フォルダ内の AndroidManifest.xml を指定する アイコンの設定  上記で追加したAndroidManifest.xmlをダブルクリックでAndroid Manifestエディタで開かれる  「アプリケーションアイコン」で大中小のアイコンを設定できる Javaクラスを読み込む  Qtのコードのみで出来る部分もあるが、Androidの設定に関わることなど出来ないことも多い  そのためQtからJavaのコードを実行する仕組みが用意されている  AndroidManifest.xmlをダブルクリックでAndroid Manifestエディタを開きパッケージ名を確認  以下を参考にフォルダを作成 パッケージ名  org.qtproject.example.TestApp 作成するフォルダ  プロジェクトフォルダ/android-sources/src/org/qtproject/example/TestApp このフォルダ内に.javaファイルを作成 内容はアプリケーションによるが一応枠組みのサンプルを記載 サンプ...

AndroidでQtアプリケーションを実行するまで

イメージ
QtはAndroidアプリの作成に対応しており、PC用のアプリケーションと同じように作ることが出来る やりたいことによってはJavaのコードを書く必要もあるが 基本的なことは出来るので、普段Qtを使っている人にはいいだろう でもJavaが使えるのであればJavaで書いたほうがよっぽど楽で良い JDKのインストール  既にインストールされているかもしれないが、今現在入ってるものは   jdk8-openjdk  8   jre8-openjdk  8 Android Studioのインストール  これの設定画面にある  「Android SDK」->「SDK Platform」で 対象バージョンのSDKを入れる  別タブの「SDK Tools」で   Android SDK Build-Tools   Android SDK Platform-Tools   Android SDK Tools   NDK  の4つを入れる Qtのインストール  ManjaroにもQtとQtCreatorのパッケージは存在するが、それでは動かない  Android用のファイルが入っていないためにキットが検出されないのだ  そこで、 Qt公式 からインストーラのqt-opensource-linux-x64-5.12.2.runをダウンロードする  使用したのは上記のオフラインインストーラだが、 ここから オンラインインストーラをダウンロードしても問題ないかと思う ※5.12を入れたところ表面上は問題なかったが、実行時にQPushButtonの長押しなどで QMetaObject::invokeMethod: No such method QPushButton::inputMethodQuery(Qt::InputMethodQuery,QVariant) と出てしまい長押し処理が中断されてしまう現象が発生した 5.9では問題ないので、この問題が発生する場合は 最下の AndroidでQtアプリケーションを実行する方法Old を参照すること...

マジックSysRqキー(Magic SysRq key)の有効化と永続化

近頃、公式から許可をもらいスタンドアロン化した S.T.A.L.K.E.R. Anomaly というStalkerのModで遊んでいるが このゲームをやっていると急に止まることがある ゲームが落ちたりフリーズするだけではなく、PC自体がフリーズしてしまうのだ Alt+F4やAlt+Tabも効かないので、ゲームを閉じることもウィンドウを切り替えることも出来ない ゲームが悪いのか、Wineが悪いのか、中古のグラボが悪いのかはわからないが、突然なんの操作もできなくなるのは困る 経験則からファイルの保存を先延ばしにしたりしないし 最近のブラウザは異常終了後にタブの復元を行ってくれるのでこれらは問題ない しかし何より怖いのはSSDやHDDやUSBメモリの破損である 果たしてSSDが強制終了に強いのか弱いのかは知らないが、良い影響を及ぼさないのは確実だろう 実際に強制終了後の起動時にはfsckのログが多数流れるので心臓にもよろしくない そこで出来るだけ安全に再起動させるのが、このマジックSysRqキーである これはカーネルレベルでコマンドを実行させることで ウィンドウマネージャやX11がフリーズしても特定の操作ができるようになっている・・・・らしい この時使うキーがSysRqなのでマジックSysRqキーと呼ぶようだ 実行方法は以下のキーを一定時間を開け、上から順番に押していく  基本的にSysRqキーはAltとPrintScreenの組み合わせなので書いているが違う場合もあるらしい キー 意味 説明  Alt + PrintScreen + R   unRaw  キーボードの制御を取り戻す オマジナイ?  Alt + PrintScreen + E   tErminate  すべてのプロセスに正常終了命令を送る  Alt + PrintScreen + I   kIll  すべてのプロセスに 強制 終了命令を送る  Alt + PrintScreen + S   Sync  書き込み予定のキャッシュをすべて書き込む ...

Qtでのカスタムウィジェットの作り方

イメージ
Qtには便利なウィジェットが数多く用意されているが、それぞれに適した機能のみが実装されている 描画についてはQt Style Sheetsによって、強力なカスタマイズが可能だが 対応しているプロパティは限定的であり、動的な変更に向かない、また対象環境を考慮しづらいのが欠点である 対象環境を考慮しづらいというのは例えば、QLabelの背景色に白を想定し、枠線色をスタイルシートで黒に設定するとしよう これがもしユーザーのテーマの背景色が黒だった場合に色が同化し枠線の意味をなくしてしまう これを防ぐために背景色をスタイルシートで白に固定させると今度は文字色が被り、文字色を黒に設定する必要が・・・となってしまう 左から想定、テーマが黒、背景色を白指定 しかし、カスタムクラス化し描画やイベント時の動作を書き加えることで、より広範囲にカスタマイズすることが可能だ 例としてQSliderをカスタムクラス化し、文字を表示できるよう順を追って説明していく まず通常が画像のようになっているがこれに文字を追加するにはQSliderのカスタムクラスを作成する //ヘッダ class CustomSlider : public QSlider { Q_OBJECT public: explicit CustomSlider(QWidget *parent = nullptr); explicit CustomSlider(Qt::Orientation orientation, QWidget *parent = nullptr); protected: void paintEvent(QPaintEvent *e) //描画を行う }; //ソース CustomSlider::CustomSlider(QWidget *parent) : QSlider(parent) { } CustomSlider::CustomSlider(Qt::Orientation orientation, QWidget *parent) : QSlider(parent) { setOrientation(orientation); } CustomSlider:paintEvent(QPaintEvent *e) { QS...

Qt Creator 4.7が遅い

Qt Creator 4.7のテキスト編集が遅い Qt Creator 4.7にバージョンアップされて時間が経っている上に、既にArchの方では4.7.1が出ているので、解消されるかもしれないが念の為 Qt Creator 4.7でコードを書いていると、変数名や関数名などの色付けが遅れることが多発する それはまだ良いのだが、補完候補の表示も遅れるので非常に苦痛 解消するには メニューの [ヘルプ] から [プラグインについて] を押下し開いたウィンドウから ClangCodeModel のチェックを外し再起動 ただ、今後高速化の可能性もあるので、変更したことは覚えておくこと

Manjaro Linuxでパッケージのダウンロードが遅い場合の対処法

Manjaro Linuxでpacmanパッケージのダウンロードが遅い pacmanパッケージのダウンロードを行う際には自動的にミラーサーバからダウンロードが行われる しかし、このミラーが適切に設定されていないとダウンロードに非常に時間がかかる Manjaro XfceやMateエディションを使用している場合、pacmanのGUIフロントエンドとしてpamacがインストールされており、その設定画面からミラーの設定と更新ができる ここで更新したミラーサーバの内容は /etc/pacman.d/mirrorlist で確認できる しかし、ここで取得したにも関わらず知らぬ間にダウンロード速度が遅くなっている場合がある 上記のmirrorlistを確認してみると、日本から遠いミラーに設定されてしまっている これはGUIフロントエンドのpamacのサービスが定期実行されており、自動的にミラーの更新が行われている事が原因である サービスの内容は /usr/lib/systemd/system/pamac-mirrorlist.service で確認できる このファイルを上書きすることも出来るが、pamacが更新されると内容も戻ってしまう そのためドロップインファイルを作成することで適用させる  下記はその方法 まず適当なテキストエディタに上記 /usr/lib/systemd/system/pamac-mirrorlist.service の内容を貼り付け、その中の ExecStart=/usr/bin/pacman-mirrors -f8 と書かれているところを ExecStart=/usr/bin/pacman-mirrors --country all に書き換え   そうしたら端末で sudo systemctl edit pamac-mirrorlist を実行、するとおそらくnanoで編集が始まるので、上記で書き換えたテキストエディタの内容を貼り付けし書き込みを行う   ちなみにnanoエディタの下部に表示されているショートカットの ^ はCtrlキーを押すことである   つまり貼り付けの ^U は Ctrl+U 、書き込みの ^O は Ctrl+O でそれぞれ実行できる ...

PlayOnLinuxでインストールリストが表示されない場合の対処法

PlayOnLinuxでインストールボタンを押しても読み込み中のまま進まない場合の対処法 PlayOnLinuxにはインストールするアプリケーションを選択するリストがあるが インストールボタンを押しても読み込み中のまま表示されない 端末から開いてみると Exception in thread Thread-1: Traceback (most recent call last):   File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner     self.run()   File "mainwindow.py", line 111, in run     self.real_check()   File "mainwindow.py", line 78, in real_check     self.sendToStatusBar(_('Refreshing {0}').format(os.environ["APPLICATION_TITLE"]), True) KeyError: '0 ' このようなエラーが出力されている この場合の対処法は以下の通り /usr/share/playonlinux/python/mainwindow.py を管理者権限のテキストエディタで開く 例 Ubuntu gksudo leafpad /usr/share/playonlinux/python/mainwindow.py Ubuntu Mate gksudo pluma /usr/share/playonlinux/python/mainwindow.py Linux Mint 18 gksudo xed /usr/share/playonlinux/python/mainwindow.py 78行目の self.sendToStatusBar(_('Refreshing {0}').format(os.environ["APPLICATION_TITLE"]), Tru...

Qt Tips

Qt Code QtCreatorやQtアプリケーションで日本語入力する sudo apt-get install fcitx-libs-qt5 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/ 内の /libfcitxplatforminputcontextplugin.so を /Tools/QtCreator/lib/Qt/plugins/platforminputcontexts/ と /[version]/gcc_64/plugins/platforminputcontexts/ にそれぞれコピー デバッグログに出力 qDebug() << "Hello World";  >>Hello World int num = 50; qDebug() << "Number is" << num;  >>Number is 50 基本的な変数であれば直接表示してくれる カーソル位置に対象のウィジェットがあるか判定する関数 bool MainWindow::isTarget(QWidget *wid) {   if (!wid->isVisible())     return false;   return wid->rect().contains(wid->mapFromGlobal(QCursor::pos())); } EventFilterの引数にある*QObjectでは マウスカーソル位置のウィジェットを取得するので 対象のウィジェット内にカーソルがあるか判定したい時はこっち connect()やQTimer::singleShot()で変数を渡す QString str = "OK"; QTimer::singleShot(3000,[=](){ qDebug() << str; });   After 3sec >>OK  connect(pushButton,&QPushButton::clicked,[=]()...