東京オリンピックで感じたことあれこれ

こんにちは。

今さら感満載ですが東京オリンピックを通じて、感じたことを吐き出しておこうと思います。

 

コロナ禍での開催について

これは正直降って湧いたような問題で、最適解はよくわかりませんが、やるならきちんとしてもらいたかった。きちんとと言うのは例えば『魅力のある大会で世界をテレビの前に釘付けにします』とか『想定される中で最適な感染対策を施し、大規模イベントのモデルケースにします』とか、そういうコロナへのアプローチのイメージです。そのためにも大会関係者は競技以外では一般人以上に節度のある行動をとってもらいたかった。なかなか難しいんでしょうが。

 

開会式

リオ五輪の閉会式の東京アピールが好きすぎて何十回も見たりしていました。

https://youtu.be/FNuqKVG781I

東京の開会式は期待していた同じテイストではなく残念だったのだけれど、まさに私の見たかった開会式が計画されていたらしい。

https://bunshun.jp/denshiban/articles/b1486

世界に見せたい日本はこっちだったなぁ。本当に残念。

 

トランスジェンダー

トランスジェンダーの選手が女子の種目に初出場とのこと。特に男性優位となりがちな競技では男女分けなんてしているからややこしくなるんじゃないかと思いつつあります。性別不問部門と厳格規定の女性限定部門に分ければ、前者が基本で男女関係なくなるし、後者で女性アスリートもある程度救えるんじゃないだろうか。トップレベルの将棋では何故か女性より男性が強いらしく、性別不問の棋士と女性限定の女流棋士という区分になっていると思いますが、同様の分け方です。

 

新しい芸術系種目

今回に限らないんですが、新しい芸術系種目は自分の中に基準が全くないからかあまり楽しめない傾向にあります。昔からある体操とかシンクロナイズドスイミング(アーティスティックスイミングというんですか?)だとなんとなくこっちがすごいとかわかるんですが、それがないですねえ。スポーツクライミングでもスピードを競う奴は楽しめる感じですが、難易度の高い壁とかは難しいことはわかりますが難しさの差がよくわからなくてピンとこない感じがありました。

 

金メダルを噛んだ市長

そもそも人が大切にしているであろうものを噛むと言う発想がまったくだめだわ。ましてやオリンピックの金メダル。私だったらメダル部分に触れるのも『触っても大丈夫ですか?』とおそるおそるになりそう。

 

などと言いつつリアルタイムで見たり結果を楽しみにしていた競技はなく、ニュースでたまたま流れてきた映像をみるぐらいでした。心から楽しめるオリンピックではなかったなぁ。そんな見方だからかもしれませんが。

「教養」とは学歴のことではなく、「一人で時間をつぶせる技術」のことでもある

こんにちは。

ここのところ、と言ってももう一年以上になりますがコロナのニュースばかりでげんなりしますね。

タイトルは中島らもの『今夜、すベてのバーで』の一文です。 コロナに対して公的な、あるいは企業の対策の問題は多くあるでしょうが、 一人ひとりに求められるスキルとして「一人で時間をつぶせる技術」があり、 また、世界中で「教養」が試されているのかもしれないとこの一文を読むと感じます。

教養というと高尚なもののように感じられますが、 「一人で時間をつぶせる技術」と思えばハードルは下がります。 いわゆる教養っぽい取り組みだけではなく、 DIYでなにか作ったり修理してみたり、お菓子を作って食べてみたり、 筋トレとかジョギングとかでストレスなく時間を使えるなら 「一人で時間をつぶせる技術」である「教養」があるといえるかもしれません。 このご時世ならオンラインで友人と会話を楽しむのも 「一人で時間をつぶせる技術」の拡張と考えられるかもしれません。

「教養(=一人で時間をつぶせる技術)」を磨いて感染症とともに生きる時代を乗り切りましょう。

ちなみにこのシーンはドラッグも含めて中毒患者が発生する原因についての、主人公による考察の場面です。 前後を含めて引用すると…

 アル中の要因は、あり余る「時間」だ。国の保障が行き届いていること がかえって皮肉な結果をもたらしていることになる。日本でもコンピュー タの導入などによって労働時間は大きく短縮されてくる。平均寿命の伸び と停年の落差も膨大な「空白の時間」を生む。「教養」のない人間には酒 を飲むことくらいしか残されていない。「教養」とは学歴のことではなく、 「一人で時間をつぶせる技術」のことでもある。
 要因は完璧なまでにそろっている。

私はほとんどお酒を飲みませんが、飲まれる方はお気をつけください。

毎日積立投信をセットしてみた件

こんにちは。

投資は10年ぐらいなんとなくインデックス運用で続けているのですがブログやなんかで手持ちの資産をオープンにするのは憚られるものです。とはいえ新規で始める分にはまあいいかなという感覚。

ということで見せる用の運用ということでSBI・バンガード・S&P500インデックス・ファンドを毎日1,000円積み立てることにしました。個人的にはNYダウでもMSCIのオールカントリーとかコクサイとかでもよかったんですが、まぁ、その辺は気分です。

ちなみに証券会社の流行はSBIか楽天と承知しているのですが、私のメインはマネックスです。10年ほど前、投資を始めようと思った時にマネックスとSBI同時に手続きを始めて先に開通したというだけの理由です。そのうち精査してもいいかもしれません。

 

RGBをリアルタイムで入れ替えて表示するツールをPythonで作ったよ

こんにちは。

私、色盲というのか色弱というのか色が苦手で、困ることはそんなに多くないのですが時々「こんなツールがあると助かるなあ」というときがあります。それも基本的にパソコン上での作業は、学生時代に見つけた「色々の色」を使うと概ね事足ります。

forest.watch.impress.co.jp

あともうちょいほしい機能としてはタイトルの通り、RGBを入れ替えて表示するというものがあります。ディスプレイの色は光の三原色であるRGB(=赤、緑、青)の強さを0~255の256段階で決定し、組み合わせることで表現されます。私の見え方ではRGBでいうとRに対する感度が弱く、Rの有無が識別のポイントになっている色同士の区別が難しいようです。例として…

f:id:mamiske:20210407005122p:plain

3つの数字は文字の色をRGBで示しています。①と②はR=255かR=0かの違いですので、瞬時で識別が難しいです。たとえば今の職場では図面のルールとして形状は①の色、寸法線は②の色となっています。多くの人はRに対する感度が高く、①と②は大きく違う色と認識されることが多いようなので認識に大きなギャップがあります。この線はどっちだ?というのを瞬時に見分けられると便利です。

Windows標準で拡大鏡というツールが入っていて色の反転ができますが、それは①と②を③と④に変えるものです。結局R=0かR=255かが識別のポイントなので、瞬時で判別が難しいです。多くの人にとっては全く違う色でしょうが、私にとって赤は目立たなく、黒と見間違うぐらい地味な暗い色なのです。一方でRとBを入れ替えて⑤と⑥にするとB=255かB=0かが識別のポイントになっているので簡単に識別できます。

人類の98%ぐらいの人には不要だと思いますが、この色を入れ替えるツールをPythonで作ってみました。ラジオボタンで選んだ変換をします。

import tkinter as tk
from tkinter import *
from PIL import ImageGrab, Image, ImageTk
import pyautogui as pgui
import numpy as np

root = tk.Tk()
root.geometry("300x200")
root.title("RGB Switcher")

cont_bln = tk.BooleanVar()
cont_bln.set(False)

img_size = 200
img_half = img_size / 2


# ラジオボタンのチェック確認用
var = tk.IntVar()
var.set(0)

def pil_to_tk(pil_image):
    global var
    im = np.array(pil_image)
    im_swap = im.copy()
    if var.get() == 0:
        im_swap[:, :, 0], im_swap[:, :, 2] = im[:, :, 2], im[:, :, 0]
    elif var.get() == 1:
        im_swap[:, :, 0], im_swap[:, :, 1] = im[:, :, 1], im[:, :, 0]
    elif var.get() == 2:
        im_swap[:, :, 1], im_swap[:, :, 2] = im[:, :, 2], im[:, :, 1]
    elif var.get() == 3:
        im_swap[:, :, 0], im_swap[:, :, 1] , im_swap[:, :, 2] \
                   = im[:, :, 2], im[:, :, 0] , im[:, :, 1]
    elif var.get() == 4:
        im_swap[:, :, 0], im_swap[:, :, 1] , im_swap[:, :, 2] \
                   = im[:, :, 1], im[:, :, 2] , im[:, :, 0]
        
    pil_img_swap = Image.fromarray(im_swap)

    # Tkinter画像オブジェクトをPIL画像オブジェクトから生成
    tk_image = ImageTk.PhotoImage(pil_img_swap)
    return tk_image


def cont_func():
    global cont_bln
    global tk_image
    global img_half
    if cont_bln.get() == True:
        x, y = pgui.position()
        pil_image = ImageGrab.grab ( bbox = ( x - img_half,
                                              y - img_half,
                                              x + img_half,
                                              y + img_half )
                                     )

        # PIL画像オブジェクトをTkinter画像オブジェクトに変換
        tk_image = pil_to_tk(pil_image)
        canvas.create_image(
        tk_image.width() // 2,
        tk_image.height() // 2,
        image=tk_image)
        root.after_idle( root.after, 0, cont_func )
        
def cont_pressed():
    global cont_bln
    if cont_bln.get() == False:
        cont_bln.set(True)
        root.after_idle( root.after, 0, cont_func )
    else:
        cont_bln.set(False)

# マウスポインタの位置を取得
x, y = pgui.position()
# マウスポインタ周辺の画像を取得
pil_image = ImageGrab.grab ( bbox = ( x - img_half,
                                      y - img_half,
                                      x + img_half,
                                      y + img_half )
                             )
# PIL画像オブジェクトをTkinter画像オブジェクトに変換
tk_image = pil_to_tk(pil_image)

frame = Frame(root, bd=1)
cont_btn = tk.Button(frame, text = "実行/停止", command=cont_pressed)
cont_chk = tk.Checkbutton(frame, variable = cont_bln, text = "実行中")
canvas = tk.Canvas(frame, width=img_size, height=img_size) 
rad_btn0 = tk.Radiobutton(frame, value=0, variable=var, text='RGB->BGR')
rad_btn1 = tk.Radiobutton(frame, value=1, variable=var, text='RGB->GRB')
rad_btn2 = tk.Radiobutton(frame, value=2, variable=var, text='RGB->RBG')
rad_btn3 = tk.Radiobutton(frame, value=3, variable=var, text='RGB->GBR')
rad_btn4 = tk.Radiobutton(frame, value=4, variable=var, text='RGB->BRG')

frame.grid(row=0,column=0)
canvas.pack(side=LEFT)
rad_btn0.pack(side=TOP)
rad_btn1.pack(side=TOP)
rad_btn2.pack(side=TOP)
rad_btn3.pack(side=TOP)
rad_btn4.pack(side=TOP)
cont_btn.pack(side=TOP)
cont_chk.pack(side=TOP)

root.attributes("-topmost", True)
root.mainloop()

参考にしたもの
NumPyでRGB画像の色チャンネルを分離して単色化、白黒化、色交換 | note.nkmk.me
[Python][Windows] Pythonでスクリーンキャプチャを行う - Qiita
【Python】ラジオボタン(Radiobutton)を作成する | 鎖プログラム
Python 3.x - Python3 Tkinter after()について|teratail
Tkinter 入門: 2. Widget を配置しよう
Python&tkinterで周期処理をしたいんだけどうまく行かなかった話と解決方法 - ウォーミングアップ

ちなみに何言っているかわからないかもしれませんが、いつも紛らわしいパワーポイントとエクセルのアイコンを見て
f:id:mamiske:20210407010206p:plain
「お前らホンマに違う色やったんやなあ」と思いました。

KiCADがもうすぐ日本語表示できそうなことに気づいた話

こんにちは。

回路図用のCADはいろいろ触ってみていて、無償のCADではKiCADが一番使いやすいなぁと思っていたのですが、日本語がうまく使えないのがネックでした。 フォントを持っていないのか、日本語のフォントをマージしてビルドしないと使えないようでした。以下のようなサイトを参考にしながらマージビルドにチャレンジして、だいたい途中でめんどくさくなってビルド済みのものを拾ってきては使っていました。現在正式版の最新が5.1.9に対して5.1.4の対応。 crl.sbd.bz

で、何とか日本語対応せんものかとあちこち検索かけていたらツイッターにこんなのが…

おおっ、と思ってNightly Buildをインストールすると確かに日本語表示が。

f:id:mamiske:20210113212435p:plain
KiCAD日本語表示

表示を見るとバージョン5.99。正式にはメジャーバージョンが上がってKiCAD 6.0での対応かな。これでだいぶ不満が解消します。

Python&tkinterで周期処理をしたいんだけどうまく行かなかった話と解決方法

こんにちは

回路の評価用に素人ながらPythonとtkinterを使ってツールを作っています。定期的、周期的にシリアル通信でコマンドを送信したくて色々試していました。調べて簡単に見つかるものはじわじわずれていったり、tkinterで使うと処理が帰ってこなくなったりするケースのものばかりだったのです。

そこでとりあえずうまくいった方法を。

import tkinter as tk
from tkinter import *
import time

root = tk.Tk()
root.geometry("200x50")
root.title("連続動作確認")

cont_bln = tk.BooleanVar()
cont_bln.set(False)

def cont_func():
    global cont_bln
    global cont_start  
    if cont_bln.get() == True:
        now = time.time()
        timediff = int ( ( now - cont_start ) * 1000 ) # msec
        next_count, tmp_time = divmod ( timediff, 1000 )
        next_time = 1000 - tmp_time
        # ここに処理を入れる
        print ( str(next_count) + " " + str(next_time) + " " + str(now) )
        root.after( next_time, cont_func )
        
def cont_pressed():
    global cont_bln
    global cont_start
    if cont_bln.get() == False:
        cont_bln.set(True)
        cont_start = time.time() # UNIX時間(秒)
        print ( "START " + str ( cont_start ) )
        root.after( 1000, cont_func )
    else:
        cont_bln.set(False)


frame = Frame(root, bd=1)
cont_btn = tk.Button(frame, text = "連続/停止", command=cont_pressed)
cont_chk = tk.Checkbutton(frame, variable = cont_bln, text = "連続動作中")

frame.grid(row=0,column=0)
cont_btn.pack(side=LEFT)
cont_chk.pack(side=LEFT)

root.mainloop()

ボタンを押すと1秒ごとに処理が走ります。チェックボックスの状態をそのままフラグとして使っているので、現状では動作中にチェックを外すと止まることになっています。実際使っているものからチャカっと切り出したので変なのが残っている気もしますが。

例えば以下のOK例と比べると、私の環境では少し毎回の精度が悪いようなんですが、なにか乱れる理由あるんですかねぇ。長期的にずれなければ毎回は多少ずれても良かったのでそのまま使っています。ちなみにあまり理解できていないこともありますが、リンク先の方法を使おうとすると処理が帰ってこない状態でした。

qiita.com

テクテクテクテクからテクテクライフへ

こんばんは。

以前テクテクテクテクというスマホのゲームがあって、結構好きで遊んでいましたがサービス終了していました。

「売上高900万円に対し、営業赤字が8億600万円」という状況で事業が継続できなかったようです。これはこれで適切に利益を得ないと結果的にユーザーにサービスを提供し続けられない、顧客のためにもならないという教訓があるようにも思いますが。

それはともかくそのころの反省も生かして?テクテクライフとしてこの10月1日にサービス開始したとの情報を受け、早速ダウンロード。BGMも懐かしく、早速通勤経路を塗っていました。プレイしながら思い出したことは、区画を完全に塗りつぶすとご褒美がもらえるので狭い区画の多い地域を攻めるのがよかった気がします。今回も有効かな?そうだ京都行こう。

www.tekutekulife.com