物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Python+matplotlib の plt.quiver で矢印を描画する

矢印を描画 matplotlib.pyplot.quiver

matplotlib.pyplot.arrowではなくmatplotlib.pyplot.quiverを使う。

矢印の始点(px, py)、矢印のベクトル(vx, vy)をquiverに与えればよいが、科学目的の場合デフォルトの引数だとやや問題が起きがちなので一つ一つ説明する。なお、矢印ごとに線の太さを変えることはできない。

基本コードは以下の通り。

import matplotlib.pyplot as plt

figsize = 5
fig, ax = plt.subplots(figsize=(figsize,figsize))

ax.quiver([0,1,2,3],[0,0,0,0],[0,1,2,3],[0,1,2,3])
ax.set_xlim(-1,6)
ax.set_ylim(-1,6)
ax.grid(alpha=0.4)
plt.show()

矢印のベクトルとして vx=[0,1,2,3], vy=[0,1,2,3] と与えているのに、ベクトル長はそうなっていない。仕様書によるとベクトル長は自動調整される。つまり、ベクトルの長さを10倍にしても、生成されるグラフは同じである。確認してみてほしい。

#ax.quiver([0,1,2,3],[0,0,0,0],[0,1,2,3],[0,1,2,3]) のかわりに
ax.quiver([0,1,2,3],[0,0,0,0],[0,10,20,30],[0,10,20,30])

これでは困るので、仕様書で提示された引数 angles='xy', scale_units='xy', scale=1 を使う。

scale_units='xy', scale=1 で vx, vyを軸のスケール通りに描画する、angles=xyで軸の向き通りに描画する (もっとも軸の正負を反転させるという特殊な事例でしか効かないが科学目的であれば設定しておいたほうが良いだろう)。

矢印の長さを軸通りに描画したコード

import matplotlib.pyplot as plt

figsize = 5
fig, ax = plt.subplots(figsize=(figsize,figsize))

ax.quiver([0,1,2,3],[0,0,0,0],[0,1,2,3],[0,1,2,3],angles='xy',scale_units='xy',scale=1)
ax.set_xlim(-1,6)
ax.set_ylim(-1,6)
ax.grid(alpha=0.4)
ax.set_aspect(1)
plt.show()

矢印のベクトル vx=[0,1,2,3], vy=[0,1,2,3] どおりに描画された。

次に、矢印の太さについて知るために、少し複雑なグラフを描いてみる。

import matplotlib.pyplot as plt
import numpy as np

xmax = 4.0
ymax = 4.0

figsize=15
fig,axs = plt.subplots(1,3,figsize=(figsize,figsize/4))
for ax,N in zip(axs,[5,10,25]):
    x = np.linspace(-xmax, xmax, N)
    y = np.linspace(-ymax, ymax, N)
    X, Y = np.meshgrid(x, y)
    U = np.cos(X)
    V = np.sin(Y)
    ax.quiver(X, Y, U, V,angles='xy',scale_units='xy',scale=1)
    ax.set_aspect(1)
    ax.set_xlim(5,-5)
plt.show()

quiverは、矢印の数(たぶん密度)が多くなると矢印の太さを自動調整する仕様である。科学目的だと勝手に変えられると困るので、引数 units='xy', width=0.1 を使って太さを制御する。

#ax.quiver(X, Y, U, V,angles='xy',scale_units='xy',scale=1) のかわりに
    ax.quiver(X, Y, U, V,angles='xy',scale_units='xy',scale=1, units='xy', width=0.1)

次に、矢印の色を制御する。色に相当する配列を作り第5引数にいれて、カラーマップを指定すれば良い。ここでは カラーマップ Reds を使った。

#ax.quiver(X, Y, U, V,angles='xy',scale_units='xy',scale=1, units='xy', width=0.1) のかわりに
    C = (U**2+V**2)**0.5
    ax.quiver(X, Y, U, V, C, angles='xy',scale_units='xy',scale=1, units='xy', width=0.1, cmap='Reds')

カラーマップの描画やその範囲指定も含めた全体コード(完成形)を示す。

import matplotlib.pyplot as plt
import numpy as np

xmax = 4.0
ymax = 4.0

figsize=15
fig,axs = plt.subplots(1,3,figsize=(figsize,figsize/4))
for ax,N in zip(axs,[5,10,25]):
    x = np.linspace(-xmax, xmax, N)
    y = np.linspace(-ymax, ymax, N)
    X, Y = np.meshgrid(x, y)
    U = np.cos(X)
    V = np.sin(Y)
    C = (U**2+V**2)**0.5
    im = ax.quiver(X, Y, U, V, C, angles='xy',scale_units='xy',scale=1, units='xy', width=0.1, cmap='Reds')
    fig.colorbar(im)
    im.set_clim(0,N*0.1)
    ax.set_aspect(1)
    ax.set_xlim(5,-5)
plt.show()

その他のサンプルコード

import matplotlib.pyplot as plt

px=[]
py=[]
vx=[]
vy=[]
colors=[]

for yi in range(10):
    for xi in range(10):
        px.append(xi)
        py.append(yi)
        vx.append(yi*0.1)
        vy.append(xi*0.1)
        colors.append((xi**2+yi**2)**0.5)

fig = plt.figure()
plt.gca().set_aspect('equal')
im = plt.quiver(px,py,vx,vy,colors, cmap='Reds', scale = 1,scale_units='xy',angles='xy')
plt.xlim(0,10)
plt.ylim(0,10)
fig.colorbar(im)
im.set_clim(0,16)
plt.savefig("save.pdf")
plt.show()

できる絵

pythonでquiverを使った矢印の描画

px=[0,1,2,3,4,5,6,7,8]
py=[0,1,2,3,4,5,6,7,8]
vx=[1,1,1,1,1,1,1,1,1]
vy=[0,0,0,0,0,0,0,0,0]
color=[-1,2,3,4,5,6,7,8,11]

import matplotlib.pyplot as plt
import matplotlib
import copy

cmap = copy.copy(matplotlib.colormaps.get_cmap("tab10"))
cmap.set_under('black')
cmap.set_over('black')

im = plt.quiver(px,py,vx,vy,color, cmap=cmap, scale = 1, scale_units='xy',angles='xy')
im.set_clim(0,10)

plt.xlim(-1,10)
plt.ylim(-1,10)
plt.colorbar(im,extend='both')
plt.gca().set_aspect('equal')
plt.show()

できる絵

漫画のEPUBファイルから画像をPythonで取得する方法

pypi.org

が便利だった。

pip install EbookLib でインストール

カバーebooklib.ITEM_COVERと、画像ebooklib.ITEM_IMAGEをそれぞれ開き、バイナリ形式で出力する。

import ebooklib
from ebooklib import epub
import os

book = epub.read_epub('filename.epub')

for image in book.get_items_of_type(ebooklib.ITEM_COVER):
    print(image.file_name,os.path.basename(image.file_name))

    with open(os.path.basename(image.file_name),"wb") as f:
        f.write(image.get_content())

for image in book.get_items_of_type(ebooklib.ITEM_IMAGE):
    print(image.file_name,os.path.basename(image.file_name))
    
    with open(os.path.basename(image.file_name),"wb") as f:
        f.write(image.get_content())

LINEとSlackの暗号化の話 LINEは本当に危険か?

LINEは危険という話をよく聞く。本当なのか。コミュニケーションツール Slack と比べてどうか。

Slackはすべてのデータをサーバー側と経路で暗号化しているため、仮にSlackが不正侵入されたり、通信経路で盗聴されても平文(暗号化前の元の文やデータ)が漏洩することはなさそう。

データの保護Slack では、基本的なセキュリティコントロールの一環として、保存データと転送中のデータをデフォルトで暗号化しています。また、可視性とコントロールをさらに高めるツールも提供しています。

slack.com

一方、LINEは以前は平文でデータを保存していたため、サーバが不正侵入されると平文が漏洩するという極めて危険な状態だった。流石にまずいということで、Letter Sealingという機能が追加され、これがONになってるトークグループトークに限り、一部の情報は暗号化されるよう(以下、Letter Sealingで保護されていれば安全という前提に立つ)。これで本当に安全か?

設定画面に「このトークルームではLetter Sealingが適用されています」と出れば暗号化されている。逆に出ていなければ暗号化されていない。LINEに侵入した不正な犯罪者やLINE内部の不正な従業員はデータを閲覧できてしまう。普段、暗号化されているかどうかを確認することは少ないはずで、安全が"確実に"保証されているとは言い難い状況だ。

LINEは、ユーザ間のトーク内容に対して、通信経路で暗号化が施されています。

※すべての内容は通信経路で暗号化されてる=通信経路で盗聴されても平文は漏れない。

また、ユーザ間トーク内容のうち、テキストメッセージ、位置情報、1対1のVoIPのメディアストリーム(音声とビデオ)は、LINE のLetter Sealing エンドツーエンド暗号化 (end-to-end encryption, E2EE)を用いて暗号化されています。

ファイルとして送信された、動画、音声は、現時点ではLetter Sealingの対象外となります。

※つまり、画像やファイルは平文で保存されている。

f:id:onsanai:20201217093930p:plain

画像やファイルは平文で保存されているので、不正アクセスを受けると平文が漏れる。ん、やばくね?

linecorp.com

linecorp.com

ミスミで規格外の金属部品を3DCADデータから作れるサービス meviyを使ってみる

これまで、ミスミで売っていないような金属部品は、3D CADで作成→2D 図面に落とす→見積り依頼→不明点の解消→発注→製作→納品 という流れで制作していた。3Dから2Dに落とすところに相当な時間がかかることが問題だった。

ミスミのmeviy オンデマンド製造サービス は、このうち

→2D 図面に落とす→見積り依頼→不明点の解消→

の時間を極限までなくすものである。作った3D CADの図面をそのままインポートして解析し、製造可能かどうか判断し、材質ごとの納期・金額を即座に提示してくれる。

以下の情報は執筆時点のものである。最新情報は公式サイトを参照してほしい。

meviy.misumi-ec.com

切削加工を依頼するには、FAメカニカル部品から3DCADデータをアップロードし、切削プレートを選択、10秒かそこらで形状認識し、初期設定の材質での金額を提示してくれる。そこから「次に進む」で細かい設定や材質の変更を行う。

面粗さはRa6.3 (▽▽相当)、許容差はJIS B 0405 中級 である。ただし、±0.02以上の精度指定をすることも可能。

切削加工で作れる材質は、

  • 鉄・鋼系 (SS400、S50C、SS400焼鈍、NAK55)
  • ステンレス系(SUS303、SUS304)
  • アルミニウム系(A2017、A5052、A6061、A7075)
  • プラスチック系(ポリアセタール、MCナイロン、ベークライト、ふっ素、超高分子量ポリエチレン、ABS、PEEK)

である。

タップの指定はM2~M16の下穴相当にしておくと、自動で認識してタップ穴にしてくれる。ストレート穴に変更することも可能。皿穴もちろん可能。

表面処理は、SS400などは、四酸化三鉄皮膜、無電解ニッケル、三価クロメート処理が、アルミ系は白アルマイト、黒アルマイト処理が可能である。納期が+2日になる。

f:id:onsanai:20201207134542p:plain

実際に注文したスケジュールは

  • 11月27日(金) 20時 3DCAD図面完成
  • 11月27日(金) 22時 注文 納期6日間 12月5日(土)発送予定
  • 12月6日(日) 3時 発送のメール
  • 12月7日(日) 7時 請求書発行のメール (見積書・納品書・請求書がぞれぞれダウンロード可能に)
  • 12月8日(月) 午前 到着

であった。図面完成から発注までわずか2時間である。ただ、慣れると5分かそこらで出来る。

どの程度の複雑な加工が可能かは、当方の金属工作技術・3DCAD技術が低すぎて分からないが、5軸加工マシニングセンタで出来そうな部品は何でも作れそうである。ただし、片面はフラットである必要がある、フライス加工ができなければ不可、除去率が高いなどの加工が難しければ許容誤差が大きくなることもある。

図面製作者と、発注者が別の場合は、ユーザー設定から「発行型番の権限設定」で「発行型番の閲覧権限」を公開するに、「発行型番の購入制限」をどなたでも購入可能な型番を発行にしておけば良い。「見積もりを確定する」させると型番を取得できる。その後、発注者に型番を伝え、注文画面の「商品型番」に入れると発注が可能になる。

Tex revtex4-2.clsの入手方法

https://ctan.org/tex-archive/macros/latex/contrib/revtex

からZIPをダウンロードする。Google Chromeだと警告が出るので、無理やりダウンロードする。

展開すると以下のファイルが見える

revtex\aip
revtex\aps
revtex\auguide
revtex\sample
revtex\aip4-2.dtx
revtex\aip4-2.pdf
revtex\ltxdocext.dtx
revtex\ltxdocext.pdf
revtex\ltxfront.dtx
revtex\ltxfront.pdf
revtex\ltxgrid.dtx
revtex\ltxgrid.pdf
revtex\ltxutil.dtx
revtex\ltxutil.pdf
revtex\README
revtex\revtex4-2.dtx
revtex\revtex4-2.pdf
revtex\revtex-bst.dtx

revtex4-2.dtx に全部入っているらしいので、これをtexで展開する

tex revtex4-2.dtx

すると、以下のファイルが生成される。revtex4-2.clsも作成されている。

aps4-2.rtx
aps10pt4-2.rtx
aps11pt4-2.rtx
aps12pt4-2.rtx
apsrmp4-2.rtx
revsymb4-2.sty
revtex4-2.cls
revtex4-2.log

完成!