投稿

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','lightskyblue']; gradientGen(colorList) このようになる +ばかりで汚いコードだが、順に説明 textsの初期化では方向を入れており、これを 'to left' にすれば右から左に  &

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)         throw "Failed Create mpv";     mpv_set_optio

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」を指定しなければならない ここに適当な文字列(ho