モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

新規skylakeマシンを建造しXubuntu 16.04.1をインストール & mayuをコンパイルできた!

Linuxに最新のデバイスは全く良くない… そんなふうに考えていた時期が 僕にもありました

しかしながら、あまりにも32GBメモリが安いのでついつい、まぁ、どうせ将来的にはこれも古くなるんだし…的な発想で。 ASUSのH110M-A M.2とPentium G4500で作ってみました。

今まで使ってたのがCore i5の3470Sという微妙なヤツということもありますが、実際、実家マシンのPentium G2030を使っていて、Pentiumだからおっせーわと思ったことは、ほぼ思い出せないのです。大抵忘れきってる。 つまり、おいらの用途(ネットとお絵かきとライトなプログラミング)では、i5はオーバースペックというわけです。

さらに言えば、まぁなんつーか釈迦や老子の教えに少し従ってみたというか、せめてスペックに対してだけでも、少しづつ無意味な執著を減らしていけたらなぁと…それで、i3よりPentiumを選んでみました。

貼ってみたらなんかG4500の値段が高い感。Amazonのが売り切れてるせいでマーケットプレイスのが出てるようですね。コスパ高くて人気なんですかね?

さすがにまだ新しいためグラフィック周りはデュアルモニタなど現時点では宜しくないとのことなので、HWEを待つというのもなんなので前々から欲しかったNVidiaのGTX750Tiを買ってみました。ツクモ特価で10500円ぐらい。 念願のDisplayportがついたやつなのですが、このDisplayportは4K出来ないので実質あまり意味がないという。

今時950との価格差も詰まってきて750というのも躊躇したのですが、どうも安い950はファンが煩いのばかりのようで時期尚早と判断しました。結構長い人生で、特にパソコン関連では、将来を見据えた購入がろくな結果をもたらした記憶がないのですな。 4Kについてもどうせ、それが主流になる時はインテルオンボードで十分とか、超ローエンドでデスクトップならサクサクになるわけですから。

そういう意味では32GBのDDR4とかもどうなのか?と思わなくもないのですが、まぁこれはいいだろうということで。

信頼のブランドクルーシャルを購入しました。

何よりもまず、memtestでハマる

しかしながら最近はEFIが当たり前だそうで、それでmemtestはEFIではgrub2の起動リストに出ないということを知らず。 memtestが出ないため焦りまくりました。 これは結局のところ、

  1. XubuntuのUSBブートスティックを挿してUEFIセットアップ画面に入る
  2. Boot Menu(F8) を選択してブート選択、この時USBスティックはEFIとそうでないほうがでるので、EFIでないほうの項目を選ぶ。
  3. Failed to load COM32 file menu.c32 みたいなメッセージを出してコケるので、tabキーを押して候補を出してみる。
  4. たしかこのときmemtestがあるはずなので、memtestと入力してやるとmemtestが起動する

というわけでした。個人的に2パスでokということにしているので問題なく通過。6時間かかりました…

Xubuntu 16.04.1 をインストール

ここでもハマりました。普通に起動はしてインストーラーが立ち上がるのですが、mp3のプロプラソフトとかをインストールするかという項目にチェックを入れると、延々そこで止まってしまいます。 後にlameとか入れれば不要なんでここはチェック無しで!

ここでX(U)buntuとは関係ない個人的ハマりを迎える

気分転換でユーザー名を変えてみたんですよ。そしたらもうひどいめにあいました! chown -R で大丈夫だろとか思ったら、設定各所に自分のユーザー名を決め打ちしているので全部書き直しですわ… そしてシンボリックリンクも全部張替え…何か、自動で張り直してくれる方法はあるのでしょうか… 結局、自動張り直しソフトをpythonで自作するという有様です。

最後にmayuがコンパイルできず…しかし!ついにコンパイル

さて、mayuです。これがboost絡みと言う実にどうでもいいところで./configureすらできず… ここはまずこれで回避

 ./configure --with-boost-libdir=/usr/lib/x86_64-linux-gnu/

次にmakeすると以下のようなエラーで止まります

msgstream.h:205:7: error: ‘setp’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
   setp(m_buf, m_buf + SIZE);

ググったら似たようなエラーを出す別のソフトのコンパイルの例があり、それではthisポインタを指定してやればいいと出たのでmsgstream.hの全部のsetpをthis->setpに書き換え。 そうしたらコンパイルが通りました。

なお、確か14.04の時も何かコンパイルが通らなくて書き換えた記憶があるんで、大元のソースからコンパイルするにはいろいろ書き換えないとダメかもですね… たしか、そういう内容の記事を以前書いたような記憶もあるのですが。

正直、OSアップグレードの度にmayuが動かなかったらどうしよう…とビビリ上がっているので、ここまで高機能でなくていいのでわかりやすいソースで自作したいという気持ちがフツフツと湧いてきたり。

あと変えたとこ

相変わらずfcitxのmozcアイコンがでかすぎるので、20x20pxぐらいにリサイズしたもので/usr/share/fcitx/mozc/icon/mozc.pngのショートカットを置き換えました。そうしないと日本語入力のたびにリサイズが毎回入るのでうざくてかなわないのです。

新マシンの感想

以前使っていたi5 3470Sと比べると、グレードダウンになるわけですから多少覚悟はしていたのですが、意に反してなかなかサクサクです。シングルスレッド性能では上回ってるっぽいのでそういうことなんでしょうか?それともメモリの速度が上がったからなのでしょうか? あるいはグラボをプロプラではなくそのままのnuveauドライバで使ってるからでしょうか。 心配していたサウンドもネットも全く問題ありません。昔は、新しいマザボなんぞにLinux入れようもんなら運良く動いても、オンボLANが使えない音が鳴らないは普通でしたけどね…いい時代になりました。

Xubuntuも日本語関連殆ど何もいじってないのですが、何も考えずとも日本語がこうしてバリバリ書けています。恐ろしい時代だ。

気が大きくなって、/tmpにtmpfsなラムディスクを1GB、ブラウザのキャッシュに2GB割り当てるという豪勢過ぎる構成。こういうことが簡単にできるからLinuxはやめられない…

ともかく、大満足の新型ローコストマシンとなりました。(今のところ)

MyPaintにPolyfilltoolを実装しています

MyPaint私家版にさらにPolyfilltoolを実装ッ!(途中)

イデアとしてはこうです。

「brushlibを弄ってポリゴンフィルを付けるのは面倒だが、pycairoで描いてそのサーフェスをgdk.pixbufに変換しさらにそれをmypaintのレイヤのメソッドload_surface_from_pixbufで流しこめば簡単に出来るのではないか?」

…と思って、思い立ったらガマンできない堪え性のないワタクシ *1は早速着手しました。

と思ったんですが、着想はよかったものの、中々上手く行かず。pycairo、gtk、そしてmypaintのクラス群と、分からない要素の数々がオイラを責め立てる…

しかし数日間の苦闘の後!!

遂に!!

遂にレイヤに描画することに成功しました!!!

f:id:dothiko:20160313141327j:plain

まだUIは作ってないけどグラデも出来る!

f:id:dothiko:20160313143914j:plain

Cairoにはメッシュグラデも実装されており、UIさえ作ればグフフのフっと…*2

とりあえず描画部分のコードだけ置いときますね(´・ω・`)

MyPaintソースの様々な部分からのコピペ多し…

            sx, sy, ex, ey = self._get_maximum_rect(None)
            sx = int(sx)
            sy = int(sy)
            w = int(ex-sx+1)
            h = int(ey-sy+1)
            surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
            cr = cairo.Context(surf)
            _draw_node_polygon(cr, None, self.nodes, ox=sx, oy=sy,
                    color=self.foreground_color)
            surf.flush()
            pixbuf = Gdk.pixbuf_get_from_surface(surf, 0, 0, w, h)
            layer = lib.layer.PaintingLayer(name='')
            layer.load_surface_from_pixbuf(pixbuf, int(sx), int(sy))
            del surf, cr

            tiles = set()
            tiles.update(layer.get_tile_coords())
            rootstack = self.doc.model.layer_stack
            dstlayer= rootstack.deepget(rootstack.current_path)
            dstsurf = dstlayer._surface
            for tx, ty in tiles:
                with dstsurf.tile_request(tx, ty, readonly=False) as dst:
                    layer.composite_tile(dst, True, tx, ty, mipmap_level=0)

            bbox = tuple(dstlayer.get_full_redraw_bbox())
            dstlayer.root.layer_content_changed(dstlayer, *bbox)

これが出来ると何が良いのか?と申しますと、かつてgimpがメインだった頃一時期凝っていた「パス塗り」が、gimpよりも遥かに簡単に手間なく出来てしまう点。

あと、このpixbuf変換 + レイヤ操作をマスターすれば…OpenCVを使った何らかの操作すら可能だろう…ということ…!!(利根川幸雄風

*1:いや〜この性格、マジに物理学者とかでなくてよかったですな…地球破壊爆弾とか思いついたらどうなっちゃうんだろ。オイラの頭が悪かったことに地球人類は感謝しなければならないと思う

*2:思ったんだけどまだpycairoでは対応してないみたい orz

BeautifulSoup4で突然なんだかエスケープされるようになったので対処

あ…ありのまま 今 起こった事を話すぜ!

「おれは xml-rpcでfc2から取ってきた記事をbs4にかけたと
思ったら すべてのタグが<とかでエスケープされていた」

な… 何を言っているのか わからねーと思うが 

おれも 何をされたのか わからなかった…

というわけでなんなんざましょ?理由はわからないのですが、もしかして何かfc2側が変わったのか? それともライブラリ側のアップデートで挙動が変わったのか?

いやまさかスタンド攻撃ではないよな…

今まで動いていた自作スクリプト…すなわち最初にヒットする自ブログの画像を最適アスペクトの最適サイズに切り取り縮小して自動アップロードするというモノなのですが、それが突然動かなくなりました。

そんなわけで色々調べた結果、こういう風にして回避することにしました。

    b=BeautifulSoup(entry['description'].encode(CHARSET)) # <-ここで勝手に&lt;されてる
    imgs=b.find_all('img') # エンコードされているので当然、タグとはみなされない
    if len(imgs)==0:
        # it may be prettify error?
        print('[INFO] no image found,but try prittify(formatter=None)') 

        b=BeautifulSoup(b.prettify(formatter=None)) # <- これだ!このformatter=Noneでprittifyして再度突っ込む!
 
        imgs=b.find_all('img') # <- これは動く

要するにprettifyのformatterをNoneにして再度突っ込むみたいな適当な逃げにしてみました。 一応動くのでこれでいいや…

MyPaintのレイヤ切り替えを超高速化するたったひとつの冴えたやりかた

MyPaintにおいて、レイヤ切り替えはちょっともっさり。これがMyPaintの宿命だと思い込んでおりました。が…

gui/stategroup.pyのStateクラスのクラス変数、autoleave_timeoutをデフォの0.8から0.1とかにするとめっちゃ高速化します。

これはまさかして…拘束具…?

ってかユーザー設定で変更できたほうがいいなぁ(^^;

追記

確かに軽快ですが、速すぎて、今までの切り替えでは何のレイヤか見えていたのだけど、殆ど見えないので何のレイヤかわからなくなる罠 (>_<)

名前をちゃんと付ければいいのだけども…結構このブリンク表示?に依存していたのだなぁと思いました。

外部ターミナルにデバッグ情報などを表示してみた

当たり前なのかもですが (& よくわかってないので迂遠な使い方かもですが) 最近ようやくttyの使い方に気づいたのでメモっておきます。

ターミナルエミュレーターやコンソールでttyってやるとその端末のデバイスファイルが出るわけですが、当然、それに対してechoなどするとそっちに行くわけです。

これ便利だな〜と思いますがイマイチ使いドコロが分からなかったのです、というのも他の端末のウィンドウから特定の端末のウィンドウのttyを知る方法が無いような気がしたわけです。

そこで思いつきました!xfce4-terminalでは(あと他のターミナルでも)-eとかで起動時コマンドを受け付けるわけですよ。

だからデバッグ対象のソフトを立ち上げる前に、xfce4-terminalを立ち上げて起動時にtty > /tmp/ユニークなファイル名 して、それでそのファイルをcat ユニークなファイル名 で変数に受けて、

デバッグ対象のソフト > ユニークなファイル名 2&1

とするとそのソフトの出力が全部そっちにいってprintデバッグですごい便利じゃないですか?

さらにwmctrlを使って、自動でその端末の画面をサブモニタに飛ばしてしまえば超便利だ!!

こんな面倒なことをせず、最初から元のサブモニタに端末を置いて、そっちで起動するというのも最初に思いつきましたが、これだとターゲットのプログラムもサブモニタ側で起動しちゃうのでよろしくないわけです。WMにもよるんでしょうけど…

って今思ったけどターゲットのプログラムをwmctrlでプライマリに飛ばすのもアリか…(汗

そんなわけでMyPaint開発で使ってるシェルスクリプトがこちら

#!/bin/sh

branch="my_build"
std_err="2>&1"

#====================#
while [ "$1" != "" ];do

    case $1 in
    -b | --branch)
        branch=$2
        shift 1
        ;;
    -c | --current-branch)
        branch="CURRENT"
        ;;
    -e | --no-std-error)
        std_err=""
        ;;
    -o | --remain-open)
        remain_open=1
        ;;
    * )
        echo $1 is unrecognized option
        ;;
    esac

shift 1
done
#--------------------#


INSTALLDIR=$HOME/python/others/mypaint_src/mypaint
curdate=`date +"%y%m%d-%H%M%S"`

cd $INSTALLDIR
if [ "$branch" != "CURRENT" ];then
    result=`git branch | grep "\* ${branch}"`
    echo $result
        if [ "$result" = "" ];then
            shownotify -t mmypaint -m "mypaintのブランチが${branch}ではありません"
            exit 1
        fi
fi

ttyfile=/tmp/mypaint_${curdate}_tty
title=my_mypaint_${curdate}

# launch terminal emulator.
xfce4-terminal -e "bash -c \"tty > ${ttyfile}\";bash" -H --title="$title"

# move terminal window
wmctrl -r $title -e 0,1920,-1,-1,-1

./mypaint > `cat $ttyfile` 2>&1

rm $ttyfile

if [ "$remain_open" != "" ];then
    wmctrl -c $title
fi

なんか書き方がださいというか恥ずかしい気もしますがなんというか備忘録的なモノとして…

ちなみに、この手法では何故かpudbとかncurses使ったソフトは2>&1するとアカンっぽい?(なんで?)

それにしても…いや〜、LinuxってっていうかPC-UNIXってほんと素晴らしいですね!(シベリア超特急の人風)

私家版改造MyPaintがなんだかエライことになってきた件

機能つけすぎてわけわからんわ〜という感じになりつつあり… (^^;

github.com

↑なんか比較的カッコいいリンクが作れたので、これで参ります。

当私家版MyPaintでは様々な機能を実験していますが、その中でもひたすらインクツールを改良しまくっています。いや、改良になってればいいんですがね…

正直、誰かいいのを実装してくれないかと「ようすをみている…」のですが

f:id:dothiko:20160211165654j:plain

とりあえず、現在まだ私家版にしかない機能としては

Inktool

  • ノードの複数選択 (ADJUSTフェーズ時に、空白キャンバスでシフトキーを押したままドラッグで枠選択、もしくはCTRLキーを押したままノードをクリック)
  • キャンバス上での筆圧変更 (シフトキー押したままでノードの上で上下もしくは左右にドラッグ)
  • ノードの位置を平均化する (当然ながら選択中のノードにしか効果がない、ノードが一つしか選択されていないときは全体を平均化)

セーブ関連

  • ファイル名末尾にバージョンっぽい番号を付けて保存するインクリメンタルセーブ機能

デバイス関連

  • ペンタブのスタイラスをひっくり返して消しゴムにすると、ツール(Mypaintでは、モードというほうが正しいのかな…)も同時に切り替わる機能。なぜか現時点のmypaintは、ブラシのみでツールは切り変わらない。

アシスト機能

  • フリーハンドの描線を平均化して安定化するスタビライザー機能。 (手ブレ補正を最大にしたよりさらにストロークが遅くなるので、必要なときだけ使うようキーボードでトグルにしました)

次の計画を忘れないようにメモ

さて細かいバグフィックスやモデファイアキーを押下した時の反応なども修正していかねばなりませんね。

それが完璧中の完璧と感じられたら(とてもウッカリさんなワタクシの場合、これでようやく人並みの完成度です)、いよいよ小分けにして(これもまた動作確認して、それもgit merge可能かどうかなど)pull requestしていこうかと思います。

しかしそれ以前に私家版としての次は、超高速セーブか…これは当ブログではすでにMyPaint 1.1の時に実験済みですが、1.2ではautosaveという機能が付いて、これがほぼ同じ仕組みなのです。そして当時嘆いていたdirty tileを得られない件、これはすでに解決しております。だから、基本的には楽勝の筈…

しかし、この機構はautosaveにしか使われず、ドキュメントの保存は今までどおりのものなのですね。

現状のMyPaintの保存は大きく分けて通常のora保存とautosaveです(一枚絵の実質エクスポートは横に置いておくとして)

そこに、「プロジェクト保存」みたいなモードがあれば、いいんじゃないかなぁと…

さて、その他、いくつか手法が考えられます。

  • Mypaint専用のバイナリ保存ファイル形式を作る事。しかし、これはいかにも後々祟る感じがしますね。メンテナンスで。
  • xcfを吐くプラグインを作る!これは悪くないですが、Source atopなどはどうするのか?(勝手に付けたのをgimpで読み込まれるとクラッシュするでしょうねぇ…)

うーん、やっぱり「プロジェクト保存」がいいのかも(^^)

VAIO SVT1311AJにUbuntu 15.10をインストールしてみる

さて、何故か最近ノートづいているワタクシですが。 今度はVAIO SVT1311Aだ!

f:id:dothiko:20160205231807j:plain ↑インストール直後のバニラなUbuntu 15.10

最近メモリが安くなっていたため、サクッと4GBのキングストンのDDR3L PC-12800を購入して8GBに増量…はいいのですが、後になって12GB積めることを知り愕然。まぁ、気分的に4GBがデュアルチャネルじゃないような気がするので、いいけど…

さて、Ubuntuをインストールするにあたり気にしたのは、SSD構成です。デフォで積んでるmSATAの32GBを、IRSTのRAID構成ではなくここにシステムを収納したいわけですね。

よく分からなかったのですが取り敢えず、なんかBIOS画面とは違うのですが出てくるRAID設定画面でRAIDをすべて排除。プレーンな構成にします。やり方は忘れましたが、かなり簡単でした。

しかし残念なのはBIOSでもブートがHDDからしか設定出来ないのですね。SSDはダメです。まぁ、こんなことはLinuxなら無問題なわけですけど(^^)

その後、UbuntuをUSBから起動してインストール開始。ここで、/dev/sdb1がSSDです。こっちにマウントポイントを/で指定。そして、当然ながらブートローダーは/dev/sdaのHDDに入れます!HDDはスワップの8GBと残りに分け、/homeにマウント。これでOK。

後はオイラの好みとしては。SSDの消耗を避けるため、

  • /home/share/var,/home/share/tmpを作成。
  • そして/etc/fstabで
/home/share/var /var none bind 0 0 
/home/share/tmp /tmp none bind 0 0 

そしてリブートしないうちに sudo rsync -av /var/ /home/share/var して整合性を取り即リブート!無事起動、というわけでございました。

1.4GHzのi3ですが、CPUパワーとしてはC2Dの2.53GHzに匹敵するっぽいですね。これでどこまでやれるか、一度試してみたく思います。