いかにして問題を解くか

このサイトはGoogle Analyticsを利用しています。

Inkscape 3.10 ドキュメントの背景色の変更

目的

デフォルトのドキュメントの背景が白なので、白いものを描いた時になにも見えない。 そんな時にドキュメントの背景を変更するやり方を説明する。

背景色変更方法

f:id:katogiso-tech:20161023210513p:plain

メニューの[ファイル]->[ドキュメントのプロパティー]で図のようなダイアログを表示して、 ページタブの右下にある[背景色]をクリックすると色を変更できる。

Chart JS V2.0 Bar Chart Pattern Sample

目的

bar chart は標準で1色でのベタ塗りだが、 モノクロでも識別できるようにパターンを使って塗りつぶすようにする。

最終結果

f:id:katogiso-tech:20161010182453p:plain

解決方法

元々, backgroundColor にパターンを渡すとそれで塗りつぶせるようになっているので、 パターンをどこかで作って渡すだけで可能となる。

npm が使えて、使うことに抵抗がなければ

patternomaly

$ npm install patternomaly

でインストールすれば良い。

私は単純な事に npm を使うのがあまり好きではないので、 勉強がてら [patternomaly] を参考に少し javascript を記述してパターンを作成した。

主な修正点

修正点は

  1. パターン作成用の javascript を追加しbackgroundColorに指定し、
  2. borderWidth を 2 にした

こととなる。

パターン作成用 Javascript

少し長いですが、javascript を読めればそんなに大したことはやっていません。 そしてほとんど patternomaly と同じです。

主な違いは 2 点で、

  1. パターンの塗りつぶしが背景色に白をアルファブレンドしていたのを、白で塗りつぶしたこと
  2. pattern メソッド内部で shapeType で形を選択して、実行するあたり

です。 2 の方の違いは元のソースコードと見比べるとわかりますが、単純にしてしまいました。 Javascript は勉強中で、あまり正確に把握していないので問題があれば元のように書きなおしてください。

 function generateShape (size) {
     var canvas  = document.createElement('canvas');
     var context = canvas.getContext('2d');
     
     canvas.width  = size;
     canvas.height = size;
     
     return { canvas, context };
 }
 
 function square (width) {
     var shape  = generateShape(width);
     var height = width;
     
     shape.context.fillStyle = 'rgb(255, 255, 255)';
     shape.context.fillRect(0, 0, width / 2, height / 2);
     shape.context.fillRect(width / 2, height / 2, width / 2, height / 2);
     
     return shape.canvas;
 }

 function lineHorizontal (width) {
     var thickness = width / 4;
     var shape = generateShape(width);
     
     shape.context.fillStyle = 'rgb(255, 255, 255)';
     shape.context.fillRect(0, 0, width, thickness);
     shape.context.fillRect(0, thickness * 2, width, thickness);
     
     return shape.canvas;
 }

 function lineVertical (width) {
     let thickness = width / 4;
     let shape = generateShape(width);
     
     shape.context.fillStyle = 'rgb(255, 255, 255)';
     shape.context.fillRect(0, 0, thickness, width);
     shape.context.fillRect(thickness * 2, 0, thickness, width);
     
     return shape.canvas;
 }

 var shapes = {
     sq: square,
     lh: lineHorizontal,
     lv: lineVertical,
 };

 function pattern( bgColor, shape ){
     var patternCanvas  = document.createElement('canvas');
     var patternContext = patternCanvas.getContext('2d');
     var size           = 20;
     var outerSize      = size * 2;
     var shapeType      = shapes[shape];
     
     patternCanvas.width      = outerSize;
     patternCanvas.height     = outerSize;
     patternContext.fillStyle = bgColor;
     patternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height);

     pattern                  = patternContext.createPattern( shapeType(size, bgColor), 'repeat');
     patternContext.fillStyle = pattern;
     patternContext.fillRect(0, 0, outerSize, outerSize);

     patternFill           = patternContext.createPattern(patternCanvas, 'repeat');
     patternFill.shapeType = shapeType;

     return patternFill;
 }

backgroundColor への指定

必要なところを抜き出すと以下ように、

  1. backgroundColor に 上記の pattern メソッドを指定し、
  2. パターンだけだと境界が曖昧になるので、borderWidthで境界を表示する

だけです。

また、パターンは

  1. 四角
  2. 水平線
  3. 垂直線

を選択できるようになっていて、それぞれ

  1. pattern( '#color', 'sq')
  2. pattern( '#color', 'lh')
  3. pattern( '#color', 'lv')

と指定すると切り替わります。

 var myChart = new Chart(ctx, {
     type: 'bar',
     data: {
         labels: [ "Day1", "Day2", "Day3" ],
         datasets: [
             <...>
             {
                 <...>
                 backgroundColor: pattern( '#' + pal[5], 'lh' ),
                 borderWidth:     2,
             }
         ]
     },
})

全体

gist13805da2122499a00f0369fd714a6e43

AVR AVR-AS

参考資料

AVR Libc

ここをベースにしてインストールする。

binutils

アセンブラとかが入っている。 avr-gcc もこれを使っている。

インストール先のディレクトリを適当に設定する。

$ mkdir /home/so/work/avr/local

Download

GNU Binutils

FTP サイトから最新の tar.gz をダウンロードして、展開する。

Install

展開したディレクトリに入って

$ ./configure --prefix=/home/so/work/avr/local --target=avr --disable-nls
$ make -j 4
$ make install

で出来上がるので、パスを通して使いやすくする。 make の -j 4 オプションは並列コンパイルオプションなので、環境に合わせて変更してください。

export PATH=$PATH:~/work/avr/local/bin

上記は bash の例で、~/.bashrc に書いておけば毎回設定する必要はありません。

Usage

avr-as usage tutorial

上記サイトを参考にして、動作確認をする。

.equ PORTB,0x18
.equ DDRB, 0x17

.org 0x00
reset:
rjmp main;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;
rjmp defaultInt;

defaultInt:
reti;

main:
sbi DDRB, 0;
cbi DDRB, 0;

end:
rjmp end;
avr-as -mmcu=attiny13a -o sample.o sample.s 
avr-ld -o sample.elf sample.o 
avr-objcopy --output-target=ihex sample.elf sample.ihex

.o, .elf はバイナリファイルで、バイナリエディタで確認する必要がある。 最後のihexはテキストデータで、"intel hex format"という形式であり、テキストエディタで普通に読める。

:100000000FC00DC00CC00BC00AC009C008C007C09B
:1000100006C005C004C003C002C001C000C01895DE
:06002000B89AB898FFCF6A
:00000001FF

intel hex format

一文字が16進数を表し、0x0-0xF(0-15) までが表現できる。 最初の ":" は行頭を示すフラグです。

Start code Byte count Address Recode type Data Check sum
: 10 0000 00 0FC00DC00CC00BC00AC009C008C007C0 9B
: 10 0010 00 06C005C004C003C002C001C000C01895 DE
: 06 0020 00 B89AB898FFCF 6A
: 00 0000 01 FF

上記の表のように分解でき、Recode type は

Recode type Description
00 Data
01 End of file

である。

hex ファイルの解析

AVR ATtiny13 の FlashROM は 1 word が 16bit なので、 2 Byte ずつアドレスが若い方から埋まっていく。

AVR が リトルエンディアンであるため DATA もリトルエンディアンになっており、 上位 1 Byte, 下位 1 Byte を入れ替えて解読する必要がある。

Address DATA OPECODE OPERAND0 OPERAND1 MNEMONIC
0x00 0x0FC0 0b1100 0b001111 RJMP
0x02 0x0DC0 0b1100 0b001110 RJMP
0x04 0x0CC0 0b1100 0b001101 RJMP
0x06 0x0BC0 0b1100 0b001100 RJMP
0x08 0x0AC0 0b1100 0b001011 RJMP
0x0A 0x09C0 0b1100 0b001010 RJMP
0x0C 0x08C0 0b1100 0b001001 RJMP
0x0E 0x07C0 0b1100 0b001000 RJMP
0x10 0x06C0 0b1100 0b000111 RJMP
0x12 0x05C0 0b1100 0b000110 RJMP
0x14 0x04C0 0b1100 0b000101 RJMP
0x16 0x03C0 0b1100 0b000100 RJMP
0x18 0x02C0 0b1100 0b000011 RJMP
0x1A 0x01C0 0b1100 0b000010 RJMP
0x1C 0x00C0 0b1100 0b000001 RJMP
0x1E 0x1895 0b1001010100011000 0b0000 RETI
0x20 0xB89A 0b10011010 0b10111 0b000 SBI
0x22 0xB898 0b10011000 0b10111 0b000 CBI
0x24 0xFFCF 0b1100 0b111111111111 RJMP

RJMP のオペランドは2の補数なので、0b111111111111 は 10進数で表現するなら -1 です。

Inkscape 3.10 画像の切り抜き

内容

画像をクリップ加工する方法を説明する。

クリップ

作業は

  1. 図形(四角形など)を描く
  2. コンテキストメニューの"フィル/ストローク"を選択する
  3. フィルはなし(無色)とする。
  4. ストロークは着色する。
  5. 元図と図形を両方選択(Shift + クリック)する。
  6. メニューの [オブジェクト]->[クリップ]->[設定]を押す。
  7. メニューの [ファイル]->[PNG画像にエクスポート]を選択する。

の順番となる。

図形を描く

矩形ツールなどを選択して、領域を指定する。

f:id:katogiso-tech:20160926000459p:plain

コンテキストメニューの"フィル/ストローク"を選択する

領域の塗りつぶしをなくして、枠だけにします。

  • フィルはなし(無色)とする。
  • ストロークは着色する。

f:id:katogiso-tech:20160926000452p:plain

元図と図形を両方選択

Windows みたいに Ctrl + クリックではなく、Shift + クリックする。

クリップ設定

メニューの [オブジェクト]->[クリップ]->[設定]を押す。

f:id:katogiso-tech:20160926000502p:plain

PNG としてエクスポートする

メニューの [ファイル]->[PNG画像にエクスポート]を選択する。

f:id:katogiso-tech:20160926000450p:plain

AVR Emulator Spec. I

仕様

AVR マイコンを採用したのは流行りのフィジカルコンピューティングでよく使われているのと、 V-USBを使いたいからです。

USB の波形をオシロスコープとかでしっかり見たこともないから、 波形も見られそうだしちょうど良いかと思っています。

参考資料

基本的には ATtiny13 仕様書と命令の仕様書です。 遊びでエミュレータをつくろうとしている割には命令セットが多いかもと思い始めています。

ATtiny13 仕様書

http://www.atmel.com/images/doc2535.pdf

Instruction Set Manual

http://www.atmel.com/Images/Atmel-0856-AVR-Instruction-Set-Manual.pdf

About AVR Emulator to study in Javascript

目的

このソフトの目的はウェブブラウザ上で動く AVR マイコンアセンブラエミュレータを実装することです。 ただし、完全にエミュレートする事は主眼に無く、マイコンの動作を勉強するのに役立てばと思っています。

動機

Chart.js,D3.js などの使い方を調べているうちに、 そもそもJavascriptを真面目に記述したことがなかったので勉強がてら手を出しました。

でもだらだらと文法書いても面白くないので、誰かの役にたつもので候補に上がったエミュレータになりました。

進捗

まだまだ書き始めたばかりで、設計もきちんとできていないのでまだ参考にならない。 現状はJavascript の勉強でしかないのですが、記録として記事にします。

現状の成果

  • Github pages に上げてあります。

https://katogiso.github.io/avr_emu/

とりあえずの使い方

f:id:katogiso-tech:20160925174820p:plain

アクセスするとテキストエリアにアセンブラが記載されていて、 その下にボタンが4つあり、それで操作する。

clear

単純にテキスト表示をクリアするだけ、実用性は今のところ無い。

load

テキストエリアのアセンブラを内部に取り込む。 取り込んだ結果はFlags, Flash ROM の表示に反映する。

next

サイクルを進める。 自走モードは存在しないので、ひたすらクリックする。 将来は自走モードをつける予定です。

reset pc

PC を 0 にします。

サンプルのアセンブラでやっていること。

  1. 汎用レジスタのR09に0xA(0d10) をロード
  2. AND は未実装なので変化なし。
  3. JMP で 0 に戻る。

全く実用性が無い内容となっています。

今後の展望

もう少し使える命令を増やして、D3js を使ってもっと見た目を向上させます。 やっぱり見た目は大事です。

Chart JS V2.0 Line Chart Point Style II

サンプルの内容

以前のサンプルでは凡例の周りが、チャート内でポイントを結ぶ線になっている。 そのため、個人的に不満が残る結果だったのを修正する方法を説明する。

options.legend.labels.generateLabels を利用する方法の説明となる。

f:id:katogiso-tech:20160918233534p:plain

これが、

f:id:katogiso-tech:20160918233533p:plain

こうなります。微妙ですが大きな違いです。

最終結果

f:id:katogiso-tech:20160918232025p:plain

mulit line chart からの主な修正点

変更点は

options.legend.labels.generateLabels

を追加する。つまり、以下のようになる。

options: {
    legend: {
        labels: {
            generateLabels: function(chart){
                return  chart.data.datasets.map( function( dataset, i ){
                    return {
                        text:           dataset.label,
                        fillStyle:      dataset.backgroundColor,
                        hidden:         !chart.isDatasetVisible(i),
                        lineCap:        dataset.borderCapStyle,
                        lineDash:       [], 
                        lineDashOffset: 0,
                        lineJoin:       dataset.borderJoinStyle,
                        lineWidth:      dataset.pointBorderWidth, 
                        strokeStyle:    dataset.borderColor,
                        pointStyle:     dataset.pointStyle,
                        datasetIndex:   i  // extra data used for toggling the datasets
                    };
                })
            }
        }
    },
}

ドキュメントの該当箇所

公式ドキュメントの

Legend label Configuration や、 Legend Item Interface を参考にする。 ただし、公式ドキュメントに記載されてないこともある。 そこはソースコードで補完する必要があった。

generateLabels

generateLabels メソッドを使って凡例を生成しているが、 凡例の図の設定に、点を結ぶ線の設定で描画している。 これが諸悪の根源である。

該当箇所は以下の通り。

generateLabels: function(chart) {
    var data = chart.data;
    return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {
        return {
            text:           dataset.label,
            fillStyle:      (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),
            hidden:         !chart.isDatasetVisible(i),
            lineCap:        dataset.borderCapStyle,
            lineDash:       dataset.borderDash,
            lineDashOffset: dataset.borderDashOffset,
            lineJoin:       dataset.borderJoinStyle,
            // This parameter, "borderWidth" is not good.
            lineWidth:      dataset.borderWidth, 
            strokeStyle:    dataset.borderColor,
            pointStyle:     dataset.pointStyle,
            // Below is extra data used for toggling the datasets
            datasetIndex: i
        };
    }, this) : [];
}

これを利用して lineWidth を datasets[*].pointBorderWidth に変更する。

  • fillStyle は今回 Array では設定してないから三項演算子を省略
  • lineDash, LineDashOffset は不要なので無効化
  • lineWidth は dataset.pointBorderWidth に置き換える
options: {
    legend: {
        labels: {
            generateLabels: function(chart){
                return  chart.data.datasets.map( function( dataset, i ){
                    return {
                        text:           dataset.label,
                        fillStyle:      dataset.backgroundColor,
                        hidden:         !chart.isDatasetVisible(i),
                        lineCap:        dataset.borderCapStyle,
                        lineDash:       [], 
                        lineDashOffset: 0,
                        lineJoin:       dataset.borderJoinStyle,
                        //This parameter is changed from borderWidth to pointBorderWidth.
                        lineWidth:      dataset.pointBorderWidth, 
                        strokeStyle:    dataset.borderColor,
                        pointStyle:     dataset.pointStyle,
                        datasetIndex:   i  // extra data used for toggling the datasets
                    };
                })
            }
        }
    },
}

戻り値

公式ドキュメントにある説明では、以下のように 10 アイテムのようになっているが、 元々のメソッドの最後にある datasetIndex は抜けている。 これが無いと凡例をクリックして、表示・非表示を切り替える機能が使用不可能となる。

{
    text:           String, 
    fillStyle:      Color,
    hidden:         Boolean,
    lineCap:        String,
    lineDash:       Array[Number],
    lineDashOffset: Number,
    lineJoin:       String,
    lineWidth:      Number,
    strokeStyle:    Color
    pointStyle:     String
}

全容

gistf80573512b84c2f5e118088f0fe4b9e8