Yabu.log

ITなどの雑記

賀正新年2019年あけましておめでとうございます

まだセーフです。

f:id:yuyubu:20190204183902p:plain
今年もよろしく

2018年の振り返りでも書いてみます。

転職した

仕事内容は書かないけど、分野的には 地理情報 + (R)DB + 画像処理 + 性能測定/改善な感じ。 一部は殆ど経験がない要素もあるので勉強したことを少しづつこのブログなどに書いていこうと思います。

色々勉強会に出た

継続して出ているもの、スポットで出たもの等色々あるが、 スポットで出れそうなもので興味が会ったものがいくつか会ったが、

などは予定が合わなかったり、疲れていたりで行けなかった。

初めて発表した

20分なのでLTという割に長いが、そこまで大きな発表ではない。

yuyubu.hatenablog.com

色々な人に会った

名前出すと迷惑なので控えますが、主に勉強会を通して面白い人に沢山会った。 酒が飲めないなどが理由で宴会などは元々嫌いだったけど、 いろんな会社の人と話す機会だと思って、勉強会の打ち上げなどは積極的に参加した。

紅茶を飲み始めた

私はハードコアなコーヒー党ですが、会社でコーヒーを入れるのは非常にめんどくさい。 というわけで色々模索した結果ティーバッグで紅茶を飲むのが良いのでは?という結論に至った。

Amazonとかコンビニで買ったやつはあまり美味しくないけど、ちゃんとした茶葉屋さんで買ったやつは美味しいと思う。

どうやら私はアッサムティーというやつが好きらしい。

初めて高度区分の試験に合格

まだまだ半人前の状態なので、これはなんで受かったのかよくわからない。

yuyubu.hatenablog.com

セキュリティはそこまで積極的に関わることにならなさそうだけど、今後もちょくちょく勉強して行きたいです。

15年ぶりに歯医者に行った

この件に関してはまだ治療中ですが、終わったらまとめて1つの投稿にしたいと思います。

2019年の意気込みとか

  • ランニングで適当な結果を出したい
  • 冬季はジムに通いたい
    • 寒いとランニングはきつい(アップ、ダウン、呼吸等)
    • 別に寒さに耐える苦行がやりたいわけではないので、運動習慣を途切れさせないためにも動きやすいジムなどにいくべきかなと思う。
  • 英語の技術書を読めるようにする
  • TOEICを毎月受ける
    • 特にTOEIC用に勉強はしませんが、実力ベンチとして受けようかなーと思います。
  • 発信する情報の質をあげる
    • 色々話題になったサイトじゃないけど日本のweb上の技術情報群の質を下げてる自覚はあるので...
  • テニスボールでリフティング1000回を達成する
    • 100回は時々できるようになってきた

今年中にほしいもの

  • Type-C 60WのPDができる4Kディスプレイ
  • 100Mbps安定する回線
  • iPad(バッテリーがそろそろ☠️)

という訳で今年もよろしくお願いいたします。

PCのセットアップに苦戦したがなんとかGRUBでWindows,Ubuntuのdual boot環境ができた(日記)

1つのSSD(500GB)上にwindows + ubuntuのdualboot環境を作った。

実施順は以下の通り

  • 1.ssdをフォーマット(windowsのインストールディスクにあったメニューで実施)
  • 2.Ubuntuをインストール(liveCDから)
  • 3.ubuntuwindowsのインストール先パーティションを作る
    • ちなみにこれはインストールしたSSDからブートしたOSからはできなかったので態々LiveCDから行った
  • 4.windowsをインストール

一応職場のPCのOSは自由だが、 Windowsを利用する可能性があるので完全消去はまずいかなと思いこのような構成にした。 linuxなんてVMでいいじゃんと思うかもしれませんが、 vmだとスペックが使いきれな買ったり、UIの描画に若干違和感がある等のデメリットがある。

デメリット

1つのディスクを複数パーティションに分けてOSを導入すると、バックアップ,リカバリなどがややこしいらしい。

起こったトラブルとか

GPTパーティション云々

https://www.cyberarchitect.net/blog/archives/1806

Windowsインストール時に 「このディスクにWindowsをインストールすることはできません。選択されたディスクはGPTのパーティションの形式ではありません。」 というエラーがよくでた。

https://freesoft.tvbok.com/tips/efi_installation/diskpart_gpt_mbr.html

インストールDVDをUEFIブートした場合のみ、Windowsは GPT形式でインストールされます。 DVDを旧BIOS互換ブートした場合、WindowsMBR形式でインストールされます。

上記ブログを参照した程度の知識しかなかったのでBIOS=MBR,UEFI=GPTくらいのゆるい認識なので、 レガシーモード(BIOS)でしかブートできないWindowsにGPT強制されても...という 感じだったが、ubuntuパーティションをGPTで作り直したらWindows10がインストールできようになった。(なんだったんだあれ?)

f:id:yuyubu:20190118185529j:plain

GRUBメニューが表示されない

dual環境を整備した後、起動時にwindows or ubuntuを選択するgrubメニューが表示されないという トラブルがあった。ちなみにgrubメニューがなくてもBIOSUEFIブートの設定画面でUbuntuWindowsの優先順位を変更することができる。 だけど、毎度起動OSを切り替えるたびにBIOSのメニューをカチカチいじるのは面倒なのでなんとかしてgrubメニューを出したい。

これはwindowsインストール後にubuntugrubをアップデートすることで対処できた。

sudo update-grub

f:id:yuyubu:20190118185524j:plain
grubメニュー。ubuntuwindows boot managerが表示されている

askubuntu.com

セットアップするディスク以外は取り外す

ubuntuではsda,sdbの呼び方windows上ではディスク0,1,2,3...BIOS上ではインターフェース名(SATA1,M2等)と 2次記憶装置の名前を統一感の無い名前で表記しあってるので非常に混乱する。 のでOSをインストールする時は インストール対象のHDD/SSDインストーラーのイメージが入っている記憶装置(USBメモリ/CD)の接続のみにとどめて、 他のデバイス(back up用HDDとか)は全部切り離しておいたほうが無難でしょう。

さて次はバックアップをどうするかでしょう。

SQL上で2状態3記号チューリングマシンをエミュレーションする 

SQLチューリング完全かどうかは、意見が別れていると思いますが、

SQLや、ループの書けない表計算マクロなどもチューリング完全ではない。

it-words.jp

一般的にはwith recursive句が導入されたことによって再帰クエリが実行できるようになり、 チューリングマシンSQLでシュミレートできるようになったので、 チューリング完全になったという風になっています。

で、今回実際にSQL上でチューリングマシンをエミュレートしてみようという挑戦になります。

blog.coelho.net

こちらのエントリにチューリングマシンのテーブル定義がありますが、動かすためのチューリングマシンのデータ(状態、シンボル、遷移関数)が無かったので、現在発見されているもっとも単純な万能チューリングマシンであるWolfram's 2-state 3-symbol Turing machineを利用しました。

CREATE TABLE State(    -- TM states
  sid INTEGER PRIMARY KEY,    -- 0 is always the initial state
  isFinal BOOLEAN NOT NULL,
  sname TEXT UNIQUE NOT NULL -- just for show
);

CREATE TABLE Symbol( -- TM symbols
  cid INTEGER PRIMARY KEY,  -- 0 is always the blank symbol
  cname TEXT UNIQUE NOT NULL
);

CREATE TABLE Transition( -- TM transition function
  sid INTEGER NOT NULL REFERENCES State,     -- initial state
  symbol INTEGER NOT NULL REFERENCES Symbol, -- & symbol
  UNIQUE(sid, symbol),
  new_state INTEGER NOT NULL REFERENCES State,
  new_symbol INTEGER NOT NULL REFERENCES Symbol,
  move INTEGER NOT NULL CHECK(move=-1 OR move=1)
);

CREATE TABLE Tape( -- TM initial tape contents
  tid INTEGER PRIMARY KEY,
  symbol INTEGER REFERENCES Symbol
);

(2,3)TMは遷移関数は全部で6個

f:id:yuyubu:20190115201437j:plain
(2,3)Turing Machine

凡例:{state, color} -> {state, color, offset}

{1, 2} -> {1, 1, -1},
{1, 1} -> {1, 2, -1},
{1, 0} -> {2, 1, 1 },
{2, 2} -> {1, 0, 1 },
{2, 1} -> {2, 2, 1 },
{2, 0} -> {1, 2, -1}

です。

データをいれます。適当に紙に起こして自分で考えながら書き起こしました。なお本データは(2,3)Turing machineのものですが、このブログ)にあるCTSでも可能かと思います。

INSERT INTO State VALUES(0,FALSE,1),(1,FALSE,2);

INSERT INTO Symbol VALUES(0,'0'),(1,'1'),(2,'2')

INSERT INTO Transition VALUES
(0,2,0,1,-1),
(0,1,0,2,-1),
(0,0,1,1, 1),
(1,2,0,0, 1),
(1,1,2,2, 1),
(1,0,0,2,-1)


INSERT INTO Tape VALUES(0,0);

以下がチューリングマシンを動かすクエリです

WITH RECURSIVE running(rid, sid, tape, pos) AS (
  -- first store initial tape contents
  SELECT 0, 0, ARRAY(SELECT symbol FROM Tape ORDER BY tid), 1
  UNION
  -- then proceed to compute iterations
  SELECT p.rid+1, t.new_state,
         -- build updated tape as an array
         p.tape[1:p.pos-1] ||                      -- prefix
           t.new_symbol ||                         -- updated cell
           p.tape[p.pos+1:array_length(p.tape,1)], -- suffix
         -- move cursor position
         p.pos+t.move
  FROM running AS p
  -- get state details, to know whether to stop
  JOIN State AS s ON (p.sid=s.sid)
  -- get corresponding state transition
  JOIN Transition AS t ON (t.sid=p.sid AND
                           -- coalesce defaults to blank
                           t.symbol=COALESCE(p.tape[p.pos],0))
  WHERE -- stop on a final state
        NOT p.rid = 100
)
-- just store the computed table
INSERT INTO Run
  SELECT * FROM running;

(2,3)Turing machineは終了状態がないため、100回目の処理終了時でストップするように条件を書き換えています。

rid | sid |            tape             | pos
-----+-----+-----------------------------+-----
  0 |   0 | {0}                         |   1
  1 |   1 | {1}                         |   2
  2 |   0 | {1,2}                       |   1
  3 |   0 | {2,2}                       |   0
  4 |   1 | {1,2,2}                     |   1
  5 |   1 | {2,2,2}                     |   2
  6 |   0 | {2,0,2}                     |   3
  7 |   0 | {2,0,1}                     |   2
  8 |   1 | {2,1,1}                     |   3
  9 |   1 | {2,1,2}                     |   4
 10 |   0 | {2,1,2,2}                   |   3
 11 |   0 | {2,1,1,2}                   |   2
 12 |   0 | {2,2,1,2}                   |   1
 ・・・・・・・・・・・・・・・・・・・・・・・・・・・
 90 |   0 | {2,1,1,1,2,2,2,1,2,2,1,2}   |   1
 91 |   0 | {1,1,1,1,2,2,2,1,2,2,1,2}   |   0
 92 |   1 | {1,1,1,1,1,2,2,2,1,2,2,1,2} |   1
 93 |   1 | {2,1,1,1,1,2,2,2,1,2,2,1,2} |   2
 94 |   1 | {2,2,1,1,1,2,2,2,1,2,2,1,2} |   3
 95 |   1 | {2,2,2,1,1,2,2,2,1,2,2,1,2} |   4
 96 |   1 | {2,2,2,2,1,2,2,2,1,2,2,1,2} |   5
 97 |   1 | {2,2,2,2,2,2,2,2,1,2,2,1,2} |   6
 98 |   0 | {2,2,2,2,2,0,2,2,1,2,2,1,2} |   7
 99 |   0 | {2,2,2,2,2,0,1,2,1,2,2,1,2} |   6
100 |   1 | {2,2,2,2,2,1,1,2,1,2,2,1,2} |   7

これをビジュアライズしたい。とりあえず桁を揃えてごにょごにょした。

1,0,0,0,0,0,0,0,0,0,0,0,0
1,2,0,0,0,0,0,0,0,0,0,0,0
2,2,0,0,0,0,0,0,0,0,0,0,0
1,2,2,0,0,0,0,0,0,0,0,0,0
2,2,2,0,0,0,0,0,0,0,0,0,0
・・・・・・・・・・・・・・・
2,2,1,1,2,2,2,1,2,2,1,2,0
2,1,1,1,2,2,2,1,2,2,1,2,0
1,1,1,1,2,2,2,1,2,2,1,2,0
1,1,1,1,1,2,2,2,1,2,2,1,2
2,1,1,1,1,2,2,2,1,2,2,1,2
2,2,1,1,1,2,2,2,1,2,2,1,2
2,2,2,1,1,2,2,2,1,2,2,1,2
2,2,2,2,1,2,2,2,1,2,2,1,2
2,2,2,2,2,2,2,2,1,2,2,1,2
2,2,2,2,2,0,2,2,1,2,2,1,2
2,2,2,2,2,0,1,2,1,2,2,1,2
2,2,2,2,2,1,1,2,1,2,2,1,2

で結果できたのがこの画像。若干桁揃えのルールが違うため、同じ形状にならなかったが、wolframのサイトの画像とほぼ同一ものもが得られた。(チューリングマシンがエミュレートできた?)

f:id:yuyubu:20190108202637p:plain
2 3 チューリングマシンの1~100世代後のテープの状態

うーんこれだけだとよくわからんということでチューリングマシンの原論文(Turing, A.M. (1936). "On Computable Numbers, with an Application to the Entscheidungsproblem")を読んだけどさらに意味わからなくなった。論文名でググったらどうも日本語の解説書籍があるらしいので買って読んでます。

チューリングを読む コンピュータサイエンスの金字塔を楽しもう

チューリングを読む コンピュータサイエンスの金字塔を楽しもう

github.com

ポスタリゼーションとCannyのエッジ検出アルゴリズムの組み合わせでイラストから下絵の作成に挑戦

いらすとやの画像を借りて試してみました。

www.irasutoya.com

f:id:yuyubu:20181227190046p:plain
対象画像

1.Gaussianオペレータを適用することによりエッジをぼかす
2.Sobelオペレータを適用し画像を微分する
3.微分画像を繊細化する
4.繊細化した結果の連結性を上げるために、2つの閾値を用いた2値化を行う

と複雑な手順が必要ですが、opencvなら関数一個で処理できます。

image = cv2.Canny(image,0,0,3)

f:id:yuyubu:20181227185311p:plain
普通にCannyアルゴリズムを適応

Cannyアルゴリズムをそのままイラストに適応するとうまく行きませんでした。 これはイラストやのイラストは肌や副部分にフェルト生地のような質感を感じさせる着色がなされているためだと思います。 また、イラストやの画像は問題ありませんが、ネットで拾ってきた野良画像は結構ノイズが乗っていることが多いのでそちらの影響も受けてしまいます。

例えば私のアイコン画像でそのまま試すと以下のようになりました。

f:id:yuyubu:20181227193002p:plain
Cannyアルゴリズムはノイズの影響に弱い

このフェルトのような質感をポスタリゼーションで均一化すればうまく行くのではないかと思い試してみました。

結果、posterlizationとdenoiseをCannyアルゴリズムの前に実施するとうまく行きました。

# denoiseのためのフォーマット変換
img_src = cv2.cvtColor(img_src,cv2.COLOR_GRAY2BGR)

# denoise
img_src = cv2.fastNlMeansDenoisingColored(img_src,None,10,10,7,21)

# ルックアップテーブルの生成

look_up_table = np.ones((256, 1), dtype = 'uint8' ) * 0

for i in range(256):
    if i <= 0:
       look_up_table[i][0] = 0
    elif i < 32:
       look_up_table[i][0] = 32
    elif i < 64:
       look_up_table[i][0] = 64
    elif i < 96:
       look_up_table[i][0] = 96
    elif i < 128:
       look_up_table[i][0] = 128
    elif i < 160:
       look_up_table[i][0] = 160
    elif i < 192:
       look_up_table[i][0] = 192
    elif i < 224:
       look_up_table[i][0] = 224
    else:
       look_up_table[i][0] = 255

#postrization実行
img_src = cv2.LUT(img_src, look_up_table)

#Canny

img_dst = cv2.Canny(img_src,0,0,3)

#bit反転
img_dst = cv2.bitwise_not(img_dst)

f:id:yuyubu:20181227184432p:plain
Canny関数適応前にdenoise処理とポスタリゼーション処理を実施

ですがこのプログラムは私のアイコン画像に対してはうまく動きませんでした。

f:id:yuyubu:20181227194213p:plain
うまく行かなかった例

なぜでしょうか。理由はポスタリゼーションで腕と背景の色が同一化されてしまったためです。 ポスタリゼーションの度合いを変えることで、こちらの画像もうまくエッジ検出できました。

f:id:yuyubu:20181231155411p:plain
うまくいった画像

ですがこのエッジ検出にはまだまだ課題があります。飛び出し坊やくんの

  • 手と顔
  • 手とズボン

の境界が検出できていません。この件に関しましてはまた後日描きたいと思います。

ちなみに今回のエントリのようなエッジ検出は画像の性質を見てうまく動くようなポスタリゼーションを実施する必要があります。

二次微分オペレータを用いたエッジ検出

隣接する画素の変化が激しい箇所をエッジとして検出するアルゴリズムです。 各セルの隣り合ったセルとの変化量を微分し、変化の大きい箇所を検出します。

飛び出し坊やくんのエッジ検出をして遊んでみます。

img_tmp = cv2.Sobel(img_src, cv2.CV_32F, 1, 0)
img_dst = cv2.convertScaleAbs(img_tmp)
img_dst = cv2.bitwise_not(img_dst);

f:id:yuyubu:20181231080343p:plain
二次微分オペレータのエッジ検出

※ネガポジ変換しています

エッジは期待したものが全て検出できましたが、 元画像と見比べると、明るい色→明るい色のエッジは薄い色に(例:ズボンと手の間)、明るい色→暗い色のエッジは濃い色に(例:髪の毛と顔の間)なってしまっています。

Canny法という性能が良いエッジ検出があるので次のエントリではそちらを紹介したいと思います。

f:id:yuyubu:20181231155411p:plain
Canny方を使った結果

平成30年度秋季の情報処理安全確保支援士に合格しました

IPAから試験合格者の皆さまへ、と書かれたメールを受け取りました。

情報処理安全確保支援士(以降セスペと表記)は落ちたと思っていたので試験結果は確認していませんでした。

試験直後のブログはこちら

yuyubu.hatenablog.com

急いで得点を確認したところ、点数は次のようになっていました。

f:id:yuyubu:20181226141931j:plain
ギリギリ合格

日頃から色々勉強していた成果が出たのかな?と思います。

試験中は空席がとても気になっていましたが、

今回の私のようにあまり試験の対策ができていなくても、たまたま受かるということも考えられますので、なるべく会場にきて最後まで粘って試験を受けた方がいいかもしれません。

※古い参考書に勉強不足に付いていいことが書いていたので追記予定

所感

とりあえず、前職の時は派遣とかSIとかを仕事にするなら資格はそこそこ重要なので、20代のうちに高度区分の資格でも取っておきたいなーと思っていたところ、合格したので嬉しいです。

ところで最近転職して資格のハロー効果が通用しないような世界に足を踏み入れてしまいましたが(涙) 今後もITの資格は半年に一度のお祭りだと思って受け続けようと思います。春はデータベーススペシャリスト目指して頑張ろうと思います。

あと、協会登録的な奴は多分やりません。3年で14万もかかる割に現職だと旨味がなさそうなので。

セキュリティに関して

もう受かってしまいましたが、セキュリティ関係で個人的にやり残したことは沢山あります。セキュリティ関係の積ん読。早めに読みましょう。

Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際

Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際

暗号技術入門 第3版

暗号技術入門 第3版

低レベルプログラミング

低レベルプログラミング

Virtual BoxをRetina Displayで動かした時に発生する画面のボヤけの対処

以前retina displayのmacでVirtual Boxを使うとゲスト側OSの画面が滲む、という趣旨のことを書いた

retina displayを使っている限り、1280x800の解像度でボケずに表示することができないらしいので諦めた。 整数倍の解像度を表示するくらい簡単にできそうなもんだが。。。。 ドライバ周りとか色々と大変なのかな。

yuyubu.hatenablog.com

以下の手順で解消することを確認した。

  • 1.Virutual Boxの 設定>ディスプレイ の「スケールしないHiDPI出力を使用」にチェックを入れる
  • 2.ゲスト側のOSの設定でScaleを200%もしくは300%に変更する

f:id:yuyubu:20181210124932p:plain
「スケールしないHiDPIを使用」にチェックを入れる

f:id:yuyubu:20181210125204p:plain
Scaleの200%を選択

もしかしたらGUIディストリビューションによって違いがあるかもしれないが、Ubuntuだとかなり綺麗に表示された。

hatena blogに画像をあげるとドットバイドットにならずボヤけてしまうので、カメラでとった画像でbefore afterを示してみる。

f:id:yuyubu:20181213002545j:plain
before

f:id:yuyubu:20181213002559j:plain
after