KHCの

KHC( https://twitter.com/we_can_panic )が140字を超えるツイートをするところ

何枚ものスクショからアクティブなウィンドウを切り出す(誇張)

↑これ仲間のタヌキに聞いたので信憑性は高いと思います。

 
 

なんか俺は知らんかったけど、Windowsのスクショって連続で撮れるらしい。
Alt+PrintScreenで「ピクチャ>スクリーンショット」っていうフォルダの中に画像が自動的に溜まっていくらしい。 みんな知ってた?知らんよね(見下し)。
あとWin+PrintScreenでいちばん手前のウィンドウだけスクショできるらしい。 すごe。
でも別にWin+Alt+PrintScreenで、特定のウィンドウだけ連続でパシャる(死語)ってのはできんらしい。フ~ン。。。  
 

↑を作っていきます

2時間くらいかかった。これ書くのは1時間くらい。
Pythonのバージョンは3.7で、ライブラリはconda installで入れた最新のやつです(2020/7/26現在)

作りました

"""
1. Alt+PrintScreenで、撮りたいウィンドウをクリップボードにコピー
2. Win+PrintScreenで画面全体を撮る
3. 1.で撮ったスクショを、「スクリーンショット」下に「master.png」という名前で保存
3. あとはWin+PrintScreenでスクショを保存していく
4. このプログラムを動かす。outputというフォルダができてそこに切り抜かれた保存される
"""

import os, re, time
import cv2
import tqdm
import numpy as np


def main():
  print("Start")
  SS_PATH = "ここにWin+PrintScreenが保存される場所のパスを入れてください。下のように..."
  # SS_PATH = "C:\\Users\\khc\\OneDrive\\画像\\スクリーンショット\\"
  SS_output_PATH = SS_PATH + "outputs\\"
  if not os.path.isdir(SS_output_PATH):
    os.mkdir(SS_output_PATH)

  SS_re = re.compile("スクリーンショット \\([0-9]+\\).png")
  SS_num_re = re.compile("[0-9]+")

  img_path_list = list(filter(lambda x: SS_re.match(x), os.listdir(SS_PATH)))
  img_path_list.sort(key=lambda x: int(SS_num_re.search(x).group()))

  mstr = imread(SS_PATH+"master.png")
  dcpl = imread(SS_PATH+img_path_list[0])

  top, bottom, left, right = find_place(mstr, dcpl)

  for img_name in img_path_list:
    img_in = SS_PATH+img_name
    img_out = SS_output_PATH+img_name
    trim_img = imread(img_in)
    imwrite(img_out, trim_img[top: bottom, left: right])

  print(len(img_path_list), "images has clipped at", SS_output_PATH)

def find_place(mstr, dcpl):
  h, w = mstr.shape[:2]
  first_pixel = mstr[0][0].sum()
  i_cdd, j_cdd = np.where(dcpl.sum(axis=2)==first_pixel)
  for i,j in zip(i_cdd, j_cdd):
    if np.all(mstr==dcpl[i: i+h, j: j+w]):
      print("find!")
      return i, i+h, j, j+w
  print("見つけられませんでした。。。")


def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8):
  try:
    n = np.fromfile(filename, dtype)
    img = cv2.imdecode(n, flags)
    return img
  except Exception as e:
    print(e)
    return None


def imwrite(filename, img, params=None):
  try:
    ext = os.path.splitext(filename)[1]
    result, n = cv2.imencode(ext, img, params)
    if result:
      with open(filename, mode='w+b') as f:
        n.tofile(f)
      return True
    else:
      return False
  except Exception as e:
    print(e)
    return False


if __name__ == '__main__':
  main()

説明

スクリーンショットのフォルダから自動保存された画像を持ってきて、同じフォルダに入ってるmaster.pngと一致してる部分をトリミングして保存してる。
なので一番小さい番号の画像の中にあるウィンドウがmaster.pngと完全に一致しないと見つけられなくて終了する。
↑のコメントで書いてる通りにやればたぶん一緒になるはずだけど。。。
撮りたいウィンドウに動画とか入ってると完全一致は難しいと思うから、そのときはmasterを自分で切り出して作ればいいんじゃないかな。(投げやり)
スクリーンショットのフォルダに保存される画像のナンバリングってフォルダを空にしてもリセットされんっぽい。人生みたいだね。

参考にしたサイト

ありがとうございました!

atom-runnerで日本語が表示されなかったので直した!!!!!!!!!!!

↑これを独自の方法で直したので紹介します。

試したこと

  • init.coffeeファイルに以下を追記
process.env.PYTHONIOENCODING = "utf-8";

→ 直らず。

  • .atom/configration.csonに以下を追記
runner:
  scopes:
    python: "python"

→ 直らず。

  • Styles.lessに以下を追記
.atom-runner pre{
  font-family: meiryo;
  font-size: 14px;
}

→ 直らず。

結果

  • 以下を変更したら直りました。
    .atom\packages\atom-runner\node_modules\ansi-to-html\lib\ansi_to_html.js の114行目
- this.input = typeof input === 'string' ? [input] : input;
+ this.input = [input];

 
 
 
 
 
やった~~~~~~~~~  
 
 
 
 
以上です。

 
 
 
 
 

追記:2020/08/02

今動かしたらまた表示がおかしくなってました。
もう知らん。

量子コンピュータを解説してみる(1)

最近量子コンピュータにハマってるので,ここらでアウトプットを計る.
(*10/25追記 内容を補強しました。間違ってることは書いてない...ハズ)

量子について

普通のコンピュータではシミュレーションできない動きをする。 (後述の「重ね合わせ」「もつれ」など)
なので、既存の問題を量子の動きに落とし込むことで、コンピュータでは到達できなかった物量・速度の問題を解くことができる(かもしれない)。
 
簡単にメリットだけ言うと、
「分岐がエグい数になってコンピュータでは計算できないことを量子でシミュレーションできる。」
 
例を挙げると、SSL通信を解読できる。
SSL通信の仕組みを簡単に説明すると、(ネットで浅く調べただけだから間違ってるかもしれないけど、)以下の流れになる。

1. サーバー側で「A」というデータを使って暗号化する  
2. 暗号されたデータと、「X」というデータを、クライアント側に送る  
3. 「X」は、クライアント側で持ってるデータを「B」として、「X=A*B」という値になっている  
4. クライアント側は、「X/B」を計算して「A」を求め、その値を使ってデータを解読する  
5. Xは2048ビットのデータ(600桁くらいの数字らしい)になっていて、それからノーヒントでA, Bを求めるのは現実的に不可能である  

この5. の根拠になっているのが「600桁くらいの数字を素因数分解するのには数十年単位で時間がかかる」という法則なんだけど、量子コンピュータならこれを数分単位で解くことができる(かもしれない)。  
既に一部で実用化され始めている。:
https://www.google.com/search?q=%E9%87%8F%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF&tbm=nws  

重ね合わせ

量子の不思議な性質その1.
量子は観測するまでどういう状態なのかわからない.
昔は「観測の際に当たる光とか電磁波のせいでブレが生じる」とか言われてたけど, そうじゃなくてマジで観測によって結果が変わるらしい.不思議だね.
とは言え状態は完全にランダムという訳ではなくて,85%でこの状態,15%でこの状態, みたいな確率が決まっている.
この「何%の確率でこれが出てきて,何%の確率でこれが出てくる」という状態が「重ね合わせ」と呼ばれている.
この重ね合わせができるのが量子コンピュータの強みで,例えば100個の量子ビットの重ね合わせ状態を古典コンピュータで再現しようとすると,100ビット*2100通りのメモリが必要になるが,量子コンピュータでは重ね合わせにより100ビットの容量だけで全部の状態を表せる.
ビットの操作だけで考えたら,量子コンピュータは古典コンピュータに比べて2100倍速いことになる.すごい.  
 

もつれ

量子の不思議な性質その2.
2つの量子をペアリングさせれば,片方を操作することでもう一方の量子の結果も変わるらしい.
この同期の速度は光よりも速くて,例えば日本からブラジルへの通信だと,光だと直線距離でも0.05秒のところ,量子もつれを利用すると0秒で行ける.すごい.  
 

量子コンピュータの操作

量子コンピュータには大きく2つパターンがあって、それぞれ「イジング型」と「ゲート型」と呼ばれている。
「イジング型」の方は、沢山のもつれた量子を使って、ある条件下の最適解を見つけるものらしい。
交通量の最適化などの方面で使われているとか。
KHCはもう一つの「ゲート型」の方をメインで学んでおり、こちらは「量子ビット」という量子の情報に対して「ゲート」と呼ばれる操作を加え、いろいろなこと(素因数分解を解いたり、「量子コンピュータを使った安全な通信」の実装)を行う。
実際にはこの「いろいろなこと」はまだアルゴリズムの研究段階であり、成果の数自体も少なく、要求される量子コンピュータのスペックも現実的ではない。  

ゲート

 
ゲートは「ブロッホ球」というのを使って考えるとわかりやすい.
↓のサイトのやつがいいかな?
Try Bloch!  

f:id:we_can_panic:20200319201902p:plain
Try Bloch!のスクショ

 
量子ってなんか回転してて,回転の方向が大事らしい.
(回転の方向は右ねじの法則みたいなのをイメージすればいいかな?)
ブロッホ球はその回転の方向を表すやつで,最初は上向きに回転している.
これを真横から見たときの矢印の位置が0か1かの確率を表している.上に行くほど0が出やすくて,下に行くほど1が出やすい.
最初は上向きなので,0が100%の確率で出るようになっている.
 
図の下の方にある四角いボタンがゲートで,ブロッホ球の矢印に対していろいろな操作ができる.
簡単に説明していくと,
 
* Xゲート
X軸(手前の水色の軸)を180°回転させる.
最初の状態からこのゲートをかけると下向きになるので,NOT(反転)ゲートとも呼ばれたりする.
 
* Yゲート
Y軸(右側の赤色の軸)を180°回転させる.
最初の状態からこのゲートをかけても,Xゲートと同じような動きしかしない.
 
* Zゲート Z軸(上に向いている黄緑色の軸)を180°回転.
最初の状態からこのゲートをかけても変化がない.(いちおう矢印の上の方が動いてはいるが・・・)  
* Hゲート
アダマールゲートというゲート.
綴りはHadamard.フランス語読みなので最初のHは発音しない.
X軸とZ軸を入れ替えるみたいな操作ができる.
具体的には,Y軸を時計回りに90°,Z軸を180°回転させる.
最初の状態からHゲートをかけると,矢印がこっちを指してくる.(怖いね)この状態で観測を行うと,重ね合わせ状態といって,0と1が50%の確率で出てくる状態になる.  
* Sゲート
Z軸を反時計回りに90°回転させるゲート.
H→S→S→Hの順番でゲートをかけると,矢印は下側を向く.(面白いね)
 
* S†ゲート
Sゲートの反対.
Z軸を時計回りに90°回転させる.  
* Tゲート
Z軸を反時計回りに45°回転させるゲート.
H→T→Hの順番でゲートをかけると,矢印は斜め方向を向く.
この状態で観測を行うと,0が85%くらい,1が15%くらいの確率で出てくる.面白いね.  
* T†ゲート Tゲートの反対.
Z軸を時計回りに45°回転させる.
 
実際の操作は90°や45°だけじゃなくて,いろいろな角度で3つの軸をそれぞれ回転させることができる.
PythonでCirq(シルク)とかblueqat(ブルーキャット?)とかのライブラリを使って量子コンピュータの操作を体験できる.いい時代になったものだ・・・(シン)

西洋の料理レシピを統計的に解析したデータで遊んでみる

前略.

『Cooking for Geeks』という本を読んだ.

その付録で以下のデータがついてきたので,いろいろ遊んでみようという内容.

https://www.cookingforgeeks.com/archive/cooccurrence/jpotter-ingredient-cooccurrence.csv

みんなが知らない食材の組み合わせをキミの手で見つけ出せ!

詳細

少しデータの説明.

西洋のレシピを分析し,同じレシピに使われている食材をカウントしたcsvデータ.

一行は[食材1, 食材2, 数値]というフォーマットになっている.数値は食材1と食材2がどの程度同じレシピで使われたかを示しており,0~1の範囲に正規化されている.0ならその食材たちが一緒に使われたレシピはなく,1ならすべてのレシピで一緒に使われている(もしくはどちらも使われていない)といった具合.

以下のコードを使い,関連度の低い食材を見つけて遊んでみる.

def getmin(word):
  global s, foodset
  assert word in foodset
  _s = list(filter(lambda l:l[0]==word, s))
  _s = sorted(_s, key=lambda l:float(l[2]))
  return _s

def G(word):
  return [" ".join(i[1:]) for i in getmin(word)]

if __name__ == '__main__':
  # get data
  global s, foodset
  s = [i.strip().split(",") for i in
                open("jpotter-ingredient-cooccurrence.csv")]
  s += [[i[1], i[0], i[2]] for i in s]
  foodset = set([i[0] for i in s])
  flg = False
  while True:
    word = input(":")
    if word == "reverse":
      flg = not flg
      continue
    if word == "exit":
      exit()
    if flg:
      print("\n".join(G(word)[:10]))
    else:
      print("\n".join(G(word)[::-1][:10]))
    print()

牛肉

日本でもメジャーな食材.データでは"beef"がそれにあたる.

"ground beef"(牛ひき肉)もcsvに含まれていたので,正確にはブロック肉とか細切れ肉を意味してる.多分.

とりあえず関連度が高いもの10選.

:beef
red wine 0.944444444444444
tomato 0.923611111111111
beer 0.777777777777778
green beans 0.666666666666667
bayleaf 0.621621621621622
coriander 0.615384615384615
black pepper 0.611111111111111
hamburger buns 0.6
provolone cheese 0.5
carrots 0.491071428571429

赤ワインが牛肉の使われているレシピの94%で使用されている. 煮込んだりするんだろうか.(もしくは付け合わせのドリンクとして入っている?)

あとはトマトやgreen beans(さやいんげん),カリフラワーやチーズなど,それっぽい食材がランクインしている.(ビールは肉を柔らかくするので,たぶん煮込み用である.)

:ground beef
tomato 1
black pepper 0.533333333333333
ketchup 0.5
ketchup 0.377777777777778
yellow mustard 0.333333333333333
salsa 0.266666666666667
chili 0.266666666666667
flour tortillas 0.222222222222222
pinto beans 0.2
spaghetti sauce 0.181818181818182

ちなみに牛ひき肉だとこのような結果に.海外って合い挽き肉使わないの?

トマトが100%の確率で牛ひき肉の付け合わせに使われている. ケチャップが2つあるのは統計ミスだろうか.

全体的に,こっちはミートソース用な感じ.

次.使われてないやつ10選.

:reverse
:beef
blue cheese 0
coconut milk 0
cottage cheese 0
evaporated milk 0
halfandhalf 0
liquid smoke flavoring 0
mint 0
yellow mustard 0
chocolate 0.0173160173160173
shortening 0.0238095238095238

ブルーチーズ,ココナッツミルク,カッテージチーズなど合いそうにないものがランクイン.

ブルーチーズはクセが強く,ココナッツミルクは馴染みがなく,カッテージチーズ(ヨーグルトに酢を混ぜると出てくる)は風味が弱いんだろう.

また,牛ひき肉のときはtop10だったyellow mustardもある.食材同士の相性は悪くないはずなので,ソースに混ぜてみるのも面白いかもしれない(少なくともその下のchocolateよりは合いそうだが)

"halfandhalf"はミルクとクリームを混ぜたやつで,コーヒーとかに混ぜる用らしい.

ミルクもクリームも牛肉との相性は悪くないし,ソースとかに使われたりしないんだろうか?

あとはその下の"liquid smoke flavoring".燻製液らしいが,向こうではビーフジャーキーやローストビーフを作ったりしないんだろうか.カルチャーギャップが垣間見える.

halfandhalf

さっき出てきた謎食材.ミルクとクリームでよくない??

:halfandhalf
black pepper 0.833333333333333
chicken 0.5
pasta 0.333333333333333
parmesan cheese 0.333333333333333
white pepper 0.166666666666667
potatoes 0.166666666666667
olive oil 0.166666666666667
mushrooms 0.166666666666667
mozzarella cheese 0.166666666666667
dill 0.166666666666667

なるほど,どうやらパスタやサラダなどに使うものらしい.

"dill"は香草で,これもチキンサラダ(サラダチキン?)に使われるやつっぽい.

おそらく牛肉などに使うには,ミルクが多すぎるんだろう.

:halfandhalf
beef 0
bread crumbs 0
carrots 0
cayenne pepper 0
cinnamon 0
green onion 0
italian seasoning 0
leek 0
monterey jack cheese 0
nutmeg 0

ちなみに使われてない順だとbeefや"bread crumbs"(パンくず)がランクイン.

ニンジンには合いそうだと思うんだけどなー

tomato

汎用食材トマト.生や煮込みのイメージが強いが,オムレツとかに入れても意外とうまい.

:tomato
zucchini 1
yellow onion 1
tortilla chips 1
salsa 1
pinto beans 1
oregano 1
olives 1
lettuce 1
kidney beans 1
ground beef 1

どうやら向こうでもサラダ系が多いらしい.どれも数値が1なことをみると,トマトの汎用性の高さが窺われる.

green chile pepper,tomato,1
feta cheese,tomato,1
cumin,tomato,1
cucumber,tomato,1
corn,tomato,1
coriander,tomato,1
chili,tomato,1
chili beans,tomato,1
black beans,tomato,1
beer,tomato,1
italian seasoning,tomato,0.954545454545455

"ground beef"以下のデータも出してみた.

ビールとトマトの数値が高いのが意外.どう使うんだろうと思って調べたら,トマトジュースとビールを使ったカクテルのレシピっぽい.

どっちもフレッシュなイメージがあるので,合いそうっちゃ合いそう.

逆順.

:tomato
corn syrup 0
cranberries 0
evaporated milk 0
halfandhalf 0
leek 0
lemon pepper 0
poultry seasoning 0
pumpkin 0
rolled oats 0
romano cheese 0

今度はゼロが多い.

意外と両極端な食材なんだな.

"corn syrop"は,コーンシロップというコーンから作られたシロップらしい.

その下にはクランベリーや"evaporated milk"(エバミルク.練乳みたいなやつ)など,甘い系の食材が続く.

あと"rolled oats"(グラノーラみたいな,ローストした大麦)は確かに合わないだろうな.水分比率が違いすぎるし,トマトのエキスをグラノーラに染み込ませてもあまり美味しくなさそう.

leek(ポロネギ)やromano cheese(ヤギのチーズ)は,ローストチキンとかパスタとかで使われると思うが,データに偏りがあるんだろうか.


飽きたので以上!みんなも遊んでみてね!

scrapbox.ioからdynalist.ioへ移った話

 

記事書くの何日ぶりだろうな.

久しぶりにはてなブログへログインしたら,広告(90日以上更新されていないブログに貼られるやつ)が出ていた.蜘蛛の巣みたいだなと思った.

 


さて表題の件であるが,KHCはもともとscrapbox.ioではなくdynalist.ioを使用していた.だから今回は出戻った形になる.

行き来する理由を説明する代わりに,以下の比較表を見てほしい.理由が何となくわかるから.

 

 


あかん表の出し方わからん

 

 


それぞれのいいところと悪いところをリストにまとめたので目を通してほしい.

行き来する理由とかは考えなくて良いです.すみません.

 

 

Dynalist

KHCが最初に見つけたサービス.

それまでにevernoteとかも使ってみたけど性に合わなかった.

KHCははっきりとしたリスト構造が作れるやつがいいのだ.

 
 Dynalistのいいところ
  • 操作が直感的
  • リスト構造が作りやすい
  • リストが折りたためる
  • リストの管理がしやすい

 

dynalistはとにかくシンプル.便利なメモ帳.

またリストが折りたためるところが実にいい.scrapboxにはない機能で,KHCにdynalist移行を決めさせた一番の要因.

あとリストをフォルダ分けできる.

リストの管理画面がシンプルになるし,なにより探しやすい.

フォルダの欠点を挙げるとすればモバイル画面からの操作性に難があるってところかな?KHCはモバイルでリストの編集はあまりしなかった.

 

Dynalistの悪いところ
  • 図が貼れない
  • 数式を記述するコマンドが打ちにくい 
  • ハイライトやテーマなどの修飾ツールが少ない
  • 共同編集がしづらい

 

これくらいかな?scrapboxに移ったのは図が貼れないのが大きい.いちおう有料プランに入れば画像のアップロードが可能になるが,英語で手続きして,支払い方法を用意して・・・ってやるのが少々面倒臭い.将来は全部PayPayとかで済ませられるといいですね.

結局図を貼る機会はあまりなかった.図に関してはまだまだアナログの方が手軽なツールだと言える.

 

でも数式はよく使う.Dynalistで数式を書くには,$$ f=mv^2 $$というふうに「$$」で囲む必要がある.まあまあ面倒臭い.今は「すうしき」で単語登録して使用している.

あとハイライトとか,テーマとかがscrapboxに比べて少ない.特にハイライトを多用する人は少し困るかも.KHCはwebページをダークテーマにするchrome拡張機能を通してページを閲覧しているが,ハイライトを使うと文字色と被ってしまう.またハイライトの付け方もscrapboxの方が容易い.

 

 


先日高専のブックハンティングにて購入してもらった哲学の本を読んだ。

KHCはこの本を読むのが楽しみすぎて、「この本を読むから」という理由で新しいゲームを始めなかったり、本が購入されていないか毎日図書室に通ったりしていた。見上げた図書委員である。

感想は読み終わってから書きます。 哲学系の本はとてもじゃないけど何日か掛けないと読めないから。