Ubuntu14.04 Daily Buildで、Wacomペンタブレットのホイールにキーを割り当てる方法

現在、Ubuntu14.04 Daily Buildを試用しています。
初期設定をしていた際に気づいたのですが、Wacomペンタブレットのホイールにキーを割り当てる方法に、ちょっとした注意点があるようです。
というのも、タッチホイールへのマッピングボタンダイアログは、初期状態ではボタンマッピング表示がほぼ見えません。

不具合だろうと思われますし、実際不便に感じるので、不具合報告する予定です
不具合報告しました

(見つけにくいサイズになっている)キーマッピング領域

現象:
「左タッチホイールのモード#1(反時計回り)」にキー入力をマッピングしようとしたのですが、「キー入力の送信」領域をクリックしてからマッピングしたいキーを押すのかと思い、そのように操作したが、マッピングされません。

キーマッピング自体は、「すべての設定」->「ワコムタブレット」->「Map Buttons...」で設定します。
「Page_Downキー」がマッピングされるのを期待して、Page_Downキーを押下したのですが、タッチホイールにPage_Downキーがマッピングされません。

対処法としては、以下のふたつ。(どちらも同じものです)
1.
「キー入力の送信」領域をクリックすると、その右に、小さな領域が現れる。(何らかの文字の端と思われる、1pixel程度の黒い棒が現れるため、よく見ればそれとわかる。)
この、小さな領域をクリックして、マッピングしたいキーを押す。
タッチホイールに、キーがマッピングされる。

2.
「左ボタン#1」の左側の「なし」を押し下げて現れる選択肢で、「キー入力の送信」を選択する。
キーマッピング(「ボタン割り当て」)ダイアログが横に伸びて、「左タッチホイールのモード#1(反時計回り)」の「キー入力の送信」の横に、空白の領域が現れる
この空白の領域をクリックすると、「~クセラ~」(はみ出ていて前後を読み取れない)が現れるので、マッピングしたいキーを押す。
タッチホイールに、キーがマッピングされる。




ホイールにキーを割り当てる前
ホイールにキーを割り当てた後



Ubuntu14.04(Daily Build)を実機で使いはじめました

リリース前のUbuntu14.04を試し始めました。
日本語入力はまだ、デフォルトのAnthyのままです。




インストールまで

Ubuntu公式からデイリービルドのISOをダウンロードします。
私としては、LiveUSBにするのが、動作が早くてオススメなのですが、
「UbuntuのインストールUSBを作る簡単な方法は、
   インストール済みのUbuntuで『USBスタートアップディスクの作成』を使うこと」
だったりするので、Windowsユーザは無理せずDVDに焼くほうが簡単でよいと思います。

今回はIntel SSDの空き領域に新規パーティションを作って、そこをルート(/)にしました。
Ubuntu12.04あたりは、EFIシステムを導入するのにSSD(またはHDD)一台をまるまる使って自動パーティション設定でインストールするのが確実な方法でした。
パーティションを手動で切るとインストール後の起動に失敗することがあったのですが、今回はあっさりUbuntuの起動にも成功しました。

ハードウェア

ハードウェア構成はこちら
 デュアルディスプレイ・デュアルペンタブレットも問題なし。
ただしWacomタブレットのキー入力割り当てはちょっと難しい。不具合報告済み。

13.10で修正された、以下のUSBサウンドデバイスも正常に動作します。
Creative USBオーディオ Sound Blaster Play! SB-PLAY(MODEL NO SB1140)
PLANEX社製 USBオーディオ PL-US35AP

各種アプリケーションの導入

Skype

Skypeはパートナーリポジトリの有効化を行ってから普通にインストールしました。
sudo apt-add-repository "deb http://archive.canonical.com/ $(lsb_release -sc) partner"
sudo atp-get install skype -y


12.04環境で使っていた設定ディレクトリを引きついでみたところ、問題なく起動して自動ログインできました。

Wine

sudo add-apt-repository ppa:ubuntu-wine/ppa
sudo apt-get install wine1.7 -y
 
デフォルトではWine1.6がインストールされます。
最新の1.7.xを使いたい場合はリポジトリを追加したうえでwine1.7を指定してインストールします。
(どうやらWINE公式でもサポートが切れていると注意されていたUbuntu13.10までのWine1.4パッケージから、やっとアップデートが行われたようです。)

Revelationパスワードマネージャ

パスワードファイルを引き継いで起動した際に、ダイアログが登場しました。
次のセーブ時に自動的に、新しいバージョンの暗号化されたパスワードファイルに変更されるようです。



VirtualBox

Ubuntu14.04のパッケージは、VirtualBox4.3.6でした。既に4.3.8が出ていますが、まだ十分新しいです。
最新版を使いたい場合:
13.10の時と同じように、正式リリース前は一つ前のUbuntu用に用意されたパッケージまたはリポジトリを利用します。
(13.10の時は、Ubuntuが正式リリースされてもVirtualBoxパッケージとリポジトリが出なかったことも。)
パッケージおよびリポジトリの導入方法は、公式のDownloadsページにて。

その他

Ubuntu12.04と違い、rabbitvcs-nautilus tortoisehg-nautilus が標準リポジトリからインストールできます。

その他アプリケーションについても、必要だったUbuntu12.04での各種PPAの導入が不要なので、12.04からの移行は楽です。

アプレットへの日時表示

日時表示の設定は、13.10と同じく、Serendip Web Studio様がコマンドを紹介してくださっているので、それを実行します。
gsettings set com.canonical.indicator.datetime time-format "custom"
gsettings set com.canonical.indicator.datetime custom-time-format "'%x (%a) %H:%M'"



自作設定スクリプトの互換性

公開しているUbuntuセットアップスクリプト(Github)で設定を行いました。

ショートカット設定スクリプトが動作していないようです。
(サスペンドショートカット機能タイマースナップショットなどをショートカット指定するもの。)
調査中です。

他のスクリプトは問題なく動作しました。

その他


2014/03/20マウスポインタ以外がフリーズする不具合発生。20秒ほどで回復して、クラッシュのメッセージとともに不具合報告のダイアログ。
フリーズしたと思っても、少し待ってみたほうが良いようです。
一度発生しただけで、アップデート後には出現していません。


続いてLifereaフィードリーダーが初回起動時に落ちました。
不具合報告はしましたが、こちらはいろいろ無理な手で使っていたバージョンから設定ディレクトリを引き継いだので、単にそれが悪かっただけなのかもしれません。
落ちたのは初回だけで、2回目以降は設定を引き継いだ状態で問題なく使えています。
アップデート後、別アカウントを作って素のLifereaを起動したところ、問題なく起動しました。

ブラウザを「手動」で指定しないと使えません。これは以前までと変わらず。
これは今さらではありますが、不具合報告済み。

Lifereaのブラウザ設定

2014/03/22
Gedit+Anthyで日本語入力ができなくなる問題は別記事にて。不具合報告済み。

2014/03/29
これまで表示されていなかった、日本語変換候補が表示されるようになりました。

2014/04/13
fcitx-mozcに移行しました。

Canvasを使ってWebアプリケーションを作った備忘録

Canvasを使ったWebサービス「写真明るさ補正」を公開しました。
明るすぎる写真や暗すぎる写真の明度を調整できます。
補正機能はサーバに頼らず Canvas + JavaScript のみで構成されているため、補正の際に画像がサーバにアップロードされることはありません。



本サービスを作るにあたってCanvasを使用したわけですが、その際に起こったことやTIPSなどを備忘録としてまとめておきます。
Web上にあるCanvasの情報は、ゲームなどの用途が主なのか、触ってみた程度のレビューや表示までの手順は紹介記事が多く、私が今回欲しかった情報、特にピクセルデータを取り出して操作する方法の情報は十分とは言えませんでした。

Canvas画像が壊れる

サイズの大きな画像(4608x3456ピクセル 約3.5MBのJPEG画像)を読みこませるとCanvasの画像データが壊れる問題が発生。
画像データが壊れる原因は、ChromeのCanvasなどの実験的アクセラレータでした。
以前、Chromeの非推奨な高速化を有効にしていたのを忘れていました。
アクセラレータを解除すると、大サイズ画像の表示が正常化しました。
思い出せばすぐ解決できましたが、実際には思い出すまで時間がかかってしまいました。

1MBを超える画像ファイルをダウンロードさせる

1MB以上の大きな画像ファイルをダウンロードさせる際、FireFoxでは問題なかったのですが、chromeではブラウザのタブがクラッシュしてしまいました。(タブが紫の停止表示になる)
原因を探すと、以下のような情報が。

「DataURI はファイルの中身を全て文字列に展開するというやや乱暴な方法であり、大きなファイルを扱うには向いていません。(試した限りでは、2MB 程度の DataURI で Chrome がクラッシュします: 図5)」(http://teikyo.tumblr.com/advent-2011-12-07)

「なお,canvas要素のサイズが大きくなるにつれて,データスキーム形式の文字列もそれに比例して長くなる.この時chromeにおいては長さが1MBを超えたhref属性を指定し,リンクを表示させようとした場合にブラウザがクラッシュするケースがあるので注意する.この問題が発生する場合は次のtoBlobを用いた方法を検討すると良い.」(http://www.h2.dion.ne.jp/~defghi/canvasMemo/canvasMemo.htm#h11)

というわけで、dataURLを直接ダウンロードさせるのではなく、Blobに変換してからダウンロードさせるように変更することで、chromeでもダウンロードが可能になります。

ExplorerCanvasなどIE環境でのCanvasではできないことがある

HTML5.JPの Canvasの使い方 を読むと、ExplorerCanvasを読みこめばすべて解決するかのような雰囲気ですが、当然そのようなことはなく。
(IE8以前のCanvas非対応ブラウザが存在しないかのように書いてあるMicrosoftのサイトのほうが酷い。 )
画像やアニメーションといった通常使用はともかく、画像のピクセル情報取得や画像ファイル出力は使用できません。また、これらCanvasの機能を利用した実装であるJS-Image-ResizeJS-Image-Filter-ddnも使用できないことになります。
というのも、ExplorerCanvasには生ピクセルデータ取得するgetImageData()やjpeg画像を吐き出すgetDataURL()が実装されていません。

latest log様 uupaa-excanvas.js と ExplorerCanvas(excanvas.js) の違い によると、これはVML+Silverlightに生のピクセルデータにアクセスする方法がないからとのことです。

FlashCanvasは getDataURL() を実装していますが、getImageData()はPro(商用利用は有償)でしか使用できないとのこと。
一覧は FlashCanvasのサポートAPIリスト ページで見ることができます。

どうやら uuCanvas.js ならば、フリーでFlashベースのピクセルAPIサポートが使えるようです。ただし、他のCanvas実装と違い、Canvasを利用するためのAPIに標準と異なる部分があるようで、利用するためにはひと手間必要なようです。

仕方がないので画像補正Webサービスのリリース時点ではIE9以降のみサポートとしましたが、 IE で HTML5 Canvas が使えるかどうかを調べる方法 によるとIE9でもCanvasを使用できない場合がありそうで、追加の調査が必要なようです。

画像の輝度と彩度を変えるJavaScriptライブラリを公開しました(Canvas用)

画像の輝度と彩度を変えるJavaScriptライブラリ JS-Image-Filters-ddn をGithubにて公開しました。
Github Pagesでデモを公開しています。
また、このライブラリを使用したWebサービス「写真明るさ補正」を公開しています。

デモページのスナップショット

ddnを作るにあたって、JavaScriptで画像をリサイズする JS-Image-Resizer をベースにさせていただきました。
メソッドのインターフェイスも JS-Image-Resizer に近いものにしました。
既に JS-Image-Resizer を使っている方は、使い方が理解しやすいかと思います。

まだ追加したい機能もあるのですが(ワーカースレッド実装・画像変換アルゴリズムの選択肢など)、JavaScriptで画像の輝度・彩度を操作するには十分かと思います。


使い方

詳しい使い方は、Githubで直接 JS-Image-Filters-ddn サンプルページのコードを見ていただければわかると思います。

大まかな流れとしては、
 ソース画像ファイル
 ->Imageオブジェクト
 ->Canvasハンドル+Canvasコンテキストハンドル
 ->ImageDate(縦横サイズ+ピクセル情報)
 ->ImageDateのdata配列(ピクセル情報)
と変換してから本ライブラリにピクセル情報を操作させて、
 ->変換済みdata(ピクセル情報)
 ->ImageDate(縦横サイズ+ピクセル情報)
 ->ImageDateをCanvasに描画
となります。

ここでは本ライブラリの引数について解説します。
例としてBrightness(輝度)を紹介していますが、Chroma(彩度) も基本的には同じです。
 

本機能のオブジェクトを作成

obj_brightness = new Brightness(
 
 
image.width, image.height, true, '', 0, true,
 
 
function(buffer){ cb_my_rewrite(buffer); });

引数: ソース画像のwidth, ソース画像のheight, ソース画像のアルファチャンネルの有無, 変換アルゴリズムの指定, 変換の重み付け, ワーカー使用の有無, コールバック関数

「ソース画像のwidth, ソース画像のheight, ソース画像のアルファチャンネルの有無」
で、ソース画像の情報をbrightness機能に伝えます。

「変換アルゴリズム」
は、無指定ではデフォルトの関数を使用します。今のところひとつしか搭載されていないので、選択肢はありません。

「変換の重み付け」
変換の強さを制御します。
値は -100 ~ 0 ~ +100までです。
Brightnessでは、-100が最も暗く、+100で最も明るくなります 。

「コールバック関数」
変換終了後に呼び出される関数を指定します。
変換済み画像情報が、配列bufferとして、コールバック関数の引数に渡されます。
通常は、画面再描画の関数を登録します。


画像操作の実行

obj_brightness.brightness(dataToBrightness, value);

引数: ソース画像のピクセル情報の配列, 変換の重み付け(オプション)

「ソース画像のピクセル情報の配列」
変換ソース画像を渡します。
各ピクセルの色データがRGBA(またはRGB)順に並んでいるだけの、単純な1次元配列です。
Canvasコンテキストのdata形式です。
例えば以下のようにして、画像を持っているCanvasから取得することができます。
var dataToBrightness = h_Canvas_context.getImageData(0, 0, image.width, image.height).data;


「変換の重み付け(オプション)」
変換の強さを制御します。
値は -100 ~ 0 ~ +100までです。
この引数は省略することができます。省略した場合、オブジェクト生成時に指定したデフォルト値が使用されます。


TIPS: 元画像データ用に表示されないCanvasを用意する

加工した画像だけ表示すればよく、元画像のデータは持っていてもブラウザ上に表示する必要はない場合があると思います。
ページのHTMLに書きこんでhiddenなどで隠すこともできますが、JavaScript側だけで使うCanvasをHTMLに持たせるのはあまり好ましいとは思えません。
下記の方法により、ページ上に存在しないCanvasをJavaScriptで作成することができます。

//src_canvas = document.getElementById('source_canvas');
src_canvas = document.createElement('canvas');
src_ctx = src_canvas.getContext('2d');

jQuery UIのスライダーで操作中の変化を検出


JavaScriptを使ったスライダーは、ライブラリにまとめられたものから生のJavaScriptまで数多くありますが、今回はjQuery UIのスライダを使用することにしました。


このスライダーは、yonchangeイベントを監視するだけでは操作中の変化を検出できません。マウスドラッグによる操作を終えてはじめてonchangeが発行されるため、ユーザの操作に動的に反応することができません。
そして、onchange以外を監視しているデモコードをあまり見かけません。

まず、jQuery UI公式ページのSliderデモおよび同デモのソースコードを参考にします。
デモコードの通りにしたところ、jQueryおよびjQuery UIを読み込むことができず「 $ is not defined. 」エラーに出会うことになってしまったので、Google APIから引っ張ってくるように書き換えました。

jQuery
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

jQuery UI
<link rel="stylesheet"href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
(上記jQueryのバージョンは2014/01時点のものです)

また、初期値の設定などはこちらのサイト様で詳しく説明されています。下のサンプルを作る際、参考にさせていただきました。

jQuery UI公式デモでは「スライド中に変化があったとき値を取得する」機能を使用していません。
使う場合は、下記のデモコードのようにします。

なお、console.logの出力が見られるコンソールは、Firefox/Chromiumの場合、Ctrl+Shift+Iで出すことができます。


デモコード:
<html>
<head>
 
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8" />
 
<title>jQuery Slider</title>

 
<!-- スライダに必要なjQueryUIなどの読み込み -->
 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
 
<link rel="stylesheet"href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
 
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
 
<script>
 
// スライダを初期化
 
$(function() {
 
 
 
// スライダーを作成
 
 
 
$('#slider').slider({
 
 
 
 
min: 0,
 
 
 
 
max: 100,
 
 
 
 
step: 2,
 
 
 
 
value: 50,
 
 
 
// スライダーの操作終了時に呼び出される
 
 
 
change: function(e, ev) {
 
 
 
 
console.log('changed slider :' + ev.value);
 
 
 
 
$('#num').val(ev.value);
 
 
 
},
 
 
 
// スライダーの初期化時に初期値を取得
 
 
 
create: function(e, ev) {
 
 
 
 
$('#num').val($(this).slider('option', 'value'));
 
 
 
},
 
 
 
// スライド中に変化を取得する
 
 
 
slide: function(e, ev) {
 
 
 
 
var s_val = $(this).slider('option', 'value')
 
 
 
 
console.log('changing slider' + s_val);
 
 
 
 
$('#num').val(s_val);
 
 
 
}
 
 
});
 
});
 
</script>

</head>
<body>
 
<input id="num"type="text"size="5" readonly>
 
<div id="slider"style="width:200px;"></div>
</body>
</html>

ソースコードをWebページへ表示できるよう変換するWebサービスを公開

ソースコードを表示可能なHTMLに変換するWebサービス「SSSH」を公開しました。
(Standalone Static Syntax Highlight builder の略です。)

SSSHを使うと、ソースコードを静的なHTMLに変換することができます。
  • ソースコードに含まれる、HTML特殊文字をタグに置きかえる。
  • タブ空白や半角空白が潰れないように置きかえる。
  • 簡単なシンタックスハイライトを付けることもできる。
ソースコードを静的なHTMLとして出力するので、CodeMirrorSyntaxHighlighterのようにライブラリを読み込む必要はありません。

SSSHにコードを張り付けるとハイライトされる

「Webサービス」というほど大げさなものではありませんが。
公開にはGithub Pagesを使用しています。

使い方

サイトに書いてあるとおり、必要なのは3ステップのみです。
・「ソースコード」にコードを貼る
・「プレビュー」「HTML」に結果が表示される
・「HTML」をコピーして、コードを表示したいページに貼り付ける


仕組み

興味のある方がいればお読みください。当然ながら、Githubのプロジェクトページに行けばコードは全文を公開しています。
一言で説明すると、上部のtextareaに入力されたテキストを、ゴリゴリと正規表現パースしているだけです。
いちおう、各部の解説としては、

・HTML特殊文字を変換
一部の文字はそのままではWebページで表示できないので単純置換。
特に "<>"など。(静的Webページなのでセキュリティはこの程度)

・半角空白とタブ空白を、表示およびコピーペーストできるようタグ付け
半角のHTML表現は何種類かある中から「&ensp;」(文字nと同じサイズ)を選択。
タブ空白は<span>で囲んで表示されるよう保護。ついでに文字コードによる表現の「&#x0009;」に変換。

・タグに色付け
"<>"で囲われた範囲はすべてタグ扱い。
 タグ内の予約語を色付け。(予約語は、ハードコーディングされている数単語のみ。)

・JavaScriptへの色付け。
"<script>"に囲われた範囲がJavaScript。
C系言語用関数 syntax_c_like() に予約語リストと共に渡す。
あまりJavaScriptとしての扱いをしていない。
syntax_c_likeは文字列( "hello"や'world' )およびコメントアウトをハイライトしてくれる。

・ユーザの入力検出
textareaの変化、上部オプションの切り替えでコールバック関数が呼ばれると、上記の変換を最初からかけ直す。キャッシュなどは行なっていない。

・改行に<br />を付与する
・コード全体を<div>の領域の筥で区切って囲う

といった感じです。
本当にあらためて解説するような特別なことは何もしていないという...。
正規表現で済ませて、真面目な構文解析をしていません。そのため、トリッキーなJavaScriptを渡されると結果がおかしくなることもありますが、サンプルコードを表示用にハイライトするには十分な能力があります。
(あと、そういった結果を見つけたら報告をいただけると嬉しいです。)

Virtual MIDI Piano Keyboardを使う (Ubuntu 12.04)

作曲およびその勉強を始めようと思ったのですが、音を覚えていない状態でMIDIシーケンサに入力するのは思った以上に難しいことが判明しました。
そこで、何らかのピアノをエミュレートするソフトウェアを導入して、作曲時に音を確認するのに使おうと考えました。

VMPK (Virtual MIDI Piano Keyboard)とJACK

参考にしたのは以下のサイト様です。
「Ubuntu Weekly Recipe 第150回 MIDIとUbuntuの素敵な出会い(2)
 ソフトウェアシンセサイザで演奏してみる
Ubuntuの音楽関係を検索すると、いつもgihyoのサイトに辿り着きます。


Virtual MIDI Piano Keyboard

インストールはコマンド一発で終了です。
sudo apt-get install vmpk -y

Timidityを導入

VMPKが出力するMIDI情報で音を鳴らすために、Timidityを導入します。
sudo apt-get install timidity

起動してみる
timidity -iA

終了方法から遅延対策まですべてgihyo「ソフトウェアシンセサイザで演奏してみる 」記事のまま対処します。
音が出ることを確認するだけならば、「JACKサウンドサーバで使う場合」として紹介されているコマンドのオプションでtimidityを起動すれば、それで十分かと思います。

TimidityとVMPKを繋げる

VMPKとTimidityを関連付けます。
これが終わると、
VMPK -> Timidity -> JACK -> ALSA -> サウンドデバイス
という流れでサウンドデバイスから音が出るようになります。



キーボードの割り当て

キーボードのz〜mまでが、左側のド〜シの鍵に割り当てられています。a〜lまでが、鍵盤上の位置に対応するよう、飛ばし飛ばしの配置で黒鍵に対応。
キーボードのq〜pが、右側のド〜ソ〜ミまで対応しています。数字キーが、やはり黒鍵に対応。

ComfyUIでXYZ-PlotするワークフローのサンプルとTips(ComfyUI-XYZ-Stitch)

 ComfyUIでAutomatic1111的なXY-Plotをしたいのだが、ComfyUIデフォルト機能には用意されていない。     カスタムノードが必要となるのだが、Webには古いとか何故か動かないとかなXY-Plotパッケージの使ってみた系記事か、githubに上げられた...