生産技術者サラリーマンの日々

社畜サラリーマンが生産技術やお金の悩みを徒然と書くブログです。私の備忘録が共有できるとうれしいです

「評価をつける」という静かな苦行について

中間管理職になってから、毎年のように思う。
評価ほど“正しさ”と“人間関係”の間で揺れる仕事はない。

制度としては合理的に見えるのに、実際に点数をつける側に回ると、
どうしてこんなに胃が重くなるのか。その理由のひとつが、自己評価が高めの課員に、
現実の点数をどう伝えるか という問題だ。

「そこまでじゃないんだよな…」をどう伝えるか
自己評価が高い人は、自信もあるし、実際に努力している。
だからこそ、否定はしたくない。

でも正直に言えば、
「あなたが思うほど突出はしていない」
と感じる場面はある。

ただ、それをそのまま言えば角が立つ。
かといって曖昧に濁すと納得してもらえない。

さらに、会社の評価制度には 絶対評価と相対評価の矛盾 がある。
成果が悪くなくても、分布調整の都合で点数を下げざるを得ないこともある。

この“説明しづらさ”が、毎回の面談を難しくする。

高くつけても、低くつけても悩ましい
意外かもしれないけれど、
高い点数をつけるときも苦しい。

「8点です」と伝えても、
「いや、私は10点のはずだ」
と思っている人には響かない。

高くても不満。
低くても不満。

中間管理職とは、不満の吸収装置 なのだと痛感する。

それでも面談に向き合う理由
面談の席で、課員がまっすぐこちらを見る。

「もっとできていたと思うんですが」

その言葉に、
「あなたの“できていた”は標準レベルなんだ」
とは言えない。

でも、
「あなたの努力は確かに見ている」
という事実は伝えたい。

また、期初の設定がはじまる・・・・

確定拠出年金 途中経過 株高?の影響?

確定拠出年金を続けて、6年くらいたちます。
毎年、2万円、年24万円を投資しています。

ちょうど1年前は、20万円くらいのプラス評価になっていますが
その後はどうなっているかをお話しします

RESULT
結果

劇的に増えるこてはないですが、コツコツ投資すると結構増えるものですね、元本に対して、1.5倍に迫る運用利回りです。

金額が増えるとそれだけ効果があるのでしょうか?
それとも昨今の株高により評価があがったのでしょうか?

下手に貯金や学資保険するより、こちらで長期運用することが
いいのかなーって思いました。
但し、ほしいときにすぐ受け取れないってこてはありますが・・・

【PYTHON+WATCH DOG】を使ったファイル更新通知GUI

設備が異常通知した時に、ユーザー側にするようなシステム作りたいなと思っていたところPYTHONWATCH DOGでファイル監視ができるようなので、勉強がてら作ってみました。

目次

1.仕様的なやつ

仕様はこんなかんじです。
①監視したいファイル先のURLを入力

URL入力
URL入力

②ファイル更新されるまでは待ちの状態

待ちの状態

③ファイル更新(Alarm.csvが更新されたらエラーとする)
※本当は、最上面にPOPUPしたかったのですが、実力不足で断念しました。

通知
2.プログラム

がっつりまねさせてもらいました。まとめが分かりやすくて
すぐに利用できます。
ファイル監視には、WATCH DOG、そして、それらを通知するGUIは、PySimpleを利用しました。

ファイル監視

ssrv.net

GUI(ユーザーインターフェースを作成)

www.simugrammer.com

from watchdog.events import PatternMatchingEventHandler
from watchdog.observers import Observer
import os
import time
import PySimpleGUI as sg
import datetime

alarm_on = 0

def on_modified(event):
	alarm_on=1

	filepath = event.src_path
	filename = os.path.basename(filepath)
	print('%s が更新されました!' % filename)
	dt = datetime.datetime.today() 
	
	if filename == 'Alarm.csv':
		window['-mytext-'].update('エラー発生 。゚(゚´Д`゚)゚。')
		window['-mytext2-'].update('%s' % dt)

if __name__ == "__main__":

	sg.theme('DarkAmber') 
	layout = [  [sg.Text('設備エラーファイル参照先を入力してください:')],
        	    [sg.Text(), sg.InputText('お好きなURLをデフォルトで入れてください')],
            	    [sg.Button('OK'), sg.Button('キャンセル')] ]
	window = sg.Window('エラーメッセンジャー', layout)


	while True:
		event, values = window.read()
		if event == sg.WIN_CLOSED or event == 'キャンセル':
			w_state  = 0
			break
		elif event == 'OK':
			w_state  = 1
			print('あなたが入力した値: ', values[0])
			break

	DIR_WATCH = values[0]
	PATTERNS = ['*.csv']
	window.close()


	sg.theme('DarkAmber') 
	layout = [  [sg.Text('エラー情報: '), sg.Text(size=(30,1), key='-mytext-')],
        	    [sg.Text('発生時刻: '), sg.Text(size=(30,1), key='-mytext2-')],
            	    [sg.Button('終了'), sg.Button('表示リセット'), sg.Button('非表示')] ]
	window = sg.Window('エラーメッセンジャー', layout)
	
	if w_state == 1:

		event_handler = PatternMatchingEventHandler(PATTERNS)
		event_handler.on_modified = on_modified
		observer = Observer()
		observer.schedule(event_handler, DIR_WATCH, recursive=True)
		observer.start()

		while True:
		
			event, values = window.read()

			if event == sg.WIN_CLOSED or event == '終了':
				observer.stop()
				break
			elif event == '表示リセット':
				window['-mytext-'].update('')
				window['-mytext2-'].update('')
				#window.normal()

			elif event == '非表示':
				window.minimize()
			
			elif alarm_on == 1:
				print('%s toota' % alarm_on)
				alarm_on = 0
				window.normal()

		observer.join()
	window.close()

確定拠出年金 経過報告 あんまり変わってない?

約1年前に確定拠出年金のブログを書いたのですが、
あれから運用としてどのくらいよくなったのか見比べてみた。

inusan0424.hatenablog.com

当時の預金額は、59万円、入金初回から約9%、直近1年で29%と
なかなかの利回りでした。

ちょうど1年後の今の結果はこちらです。

1年たったけど、変わってない。増えてない。

単純に預金分資産が増えただけで利回りは初回入金からあまり変わってないですが、直近1年は約5%にとどまっています。
もちろん、1年前の直近1年が29%とおかしなことになっているとは思いますが、5%なら良い方だと思いますが、今後の伸びしろが気になります。

第7波コロナ被弾 家族感染

 7月の初旬から第7波が来ている。もちろん、自分とは関係ないとは思えないが、それなりに対策も取っているし飲み会や蜜になるような場所へはいけない。

8月から特に過去最大を記録し、帰省を考えて飛行機まで予約していたが、実家の両親の仕事の関係上、帰宅して万が一感染すると迷惑がかかるだけでなく、最悪、感染すると帰れないことを危惧して帰省をあきらめた。

飛行機は、2週間前であったんで、半額くらいはかえってきたので
よかった。


夏休みの連休の予定がまったくなくなったので何を使用か・・・と
考えた朝8月15日、息子の食欲がない。
私は息子の学童のお弁当作りで気づいていなかったが、嫁さんがびっくりしていた。なんと、38.5度の体温。。。。おいおい、風邪か!?

学校は休みだし、学童かこの前いったイオンしか心当たりがない。
普通は病院が休みであるが昨今の事情により、なんと病院が結構対応してくださっている状況であり、大変感謝

急いでいくが、発熱患者はかなりまたされる。嫌がる息子を押させて
抗原検査。15分後、「陽性」との連絡。。。。
これから、隔離(自宅療養)& 家庭内感染を想像したらぞっとした。

食料、生活雑貨はたまたま前日にたっぷり買っていた。
しかし、18日嫁&娘、そして私も19日陽性と診断を受けました。


症状としては、インフルエンザと同じ感じです
発熱、のど、せきで、38度から数日で37度まですぐ下がりますが、
21日の時点で37度前半をウロウロしている状態で、なかなか回復しないです。子供たちはなぜか1日で全回復している。若さでしょうか・・・

19日を1日とすると28日まで自宅待機で連休明けの1週間は
会社を「病欠」でお休みとなります。。。。


ちなみに、症状が軽症の患者は、厚生労働省からSNS
メッセージが来て、COCOAに登録してくださいとかしか来ないです。

【PYTHON+OPENCV】防犯カメラプログラム

防犯カメラ

1.防犯カメラプログラムの概要

■物体検出
以前作成したプログラムです。背景画像と現在の入力画像を差分から閾値以上差異があれば何かしらの物体が来たとして、録画を開始する

inusan0424.hatenablog.com

■時間計測
なにかしらの物体が来たと判断したら、録画を開始するが一定時間録画したら録画を終了する。dt_now = datetime.datetime.now()関数で時間情報を取得し、dif = dt_now - stack_todayにて差分を計算し、閾値以上の時間がたったら録画を終了する。

今回ラズベリーパイを使用するが、電源を切ると内部で時刻を記憶できず、時間が止まってしまうため、注意が必要です。

arakoki70.com

2.使用したカメラ

画像処理を行うカメラには、個人的にはオートフォーカスは使用せず、画像処理を実施する環境化で露光、ズーム(範囲)、焦点距離をマニュアルで調整し、固定します。

3.プログラム

import cv2
import numpy as np
import time
import datetime

# 画像取得の定義
cap = cv2.VideoCapture(0)
fps = int(cap.get(cv2.CAP_PROP_FPS))
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 変数の定義
global video_star
video_start = 0
before = None # 前回の画像を保存する変数
red = (0, 0, 255) # 枠線の色
kernel = np.ones((7, 7), np.uint8)#カーネルの指示
th = 60#背景差分の閾値
dif_sec = 0
dif_sec_th = 30#rec video time


if __name__ == '__main__':
    rec = 0
    while True:
        today =datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S") 
        dt_now = datetime.datetime.now()
        yer = dt_now.year
        mon = dt_now.month
        day = dt_now.day
        hor = dt_now.hour
        min = dt_now.minute
        sec = dt_now.second

        #not detect camera
        if ret == False: break
        if video_start == 1:
            time.sleep(1/fps)
            video.write(frame)

        #gray scle
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        if before is None:
            before = gray.astype("float")
            continue

        #現在のフレームと移動平均との差を計算
        cv2.accumulateWeighted(gray, before, 0.5)
        mask = cv2.absdiff(gray, cv2.convertScaleAbs(before))

        mask[mask < th] = 0#二値化処理
        mask[mask >= th] = 255#二値化処理
        d_mask = cv2.dilate(mask, kernel)#膨張処理
        e_mask = cv2.erode(d_mask, kernel)#収縮処理

        #輪郭のデータを得る
        contours = cv2.findContours(e_mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]
        
        # 差分があった点を画面に描く
       for target in contours:

            if w < 30: continue # 小さな変更点は無視
            if rec == 0:
                print("video start" + today)
                video_start = 1
                file = "/home/pi/Videos/" + str(yer) +"_"+ str(mon) +"_"+ str(day) +"_"+ str(hor) +"_"+ str(min) +"_"+ str(sec) + ".mp4"

                stack_today = dt_now
                fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
                video = cv2.VideoWriter(file, fourcc, fps, (w, h))
                rec = 1
                
    # 録画開始
        if rec == 1:
            dif = dt_now - stack_today # 時間の差分
            dif_sec = dif.seconds # 秒を計算
            
            if dif_sec > dif_sec_th: # もし、閾値以上の時間がたったら
                vide_start = 0# 録画終了
                rec = 0
                video.release()
                print("video end")
                               
        cv2.imshow("Frame", frame)
        key = cv2.waitKey(1)
        if key == 27:
            break
        elif key == 0x73:#s key
            if rec == 0:
                print("video start" + today)
                video_start = 1
                file = "/home/pi/Videos/" + str(yer) + str(mon) + str(day) + str(hor) + str(min) + str(sec) + ".mp4"
                fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
                video = cv2.VideoWriter(file, fourcc, fps, (w, h))
                rec = 1
        elif key == ord("e"):
            if rec == 1:
                rec = 0
                video_start = 0
                print("video end")
                video.release()

    cap.release()
    cv2.destroyAllWindows()

【Python】PDFの情報をエクセルで抽出する

1.やりたいこと

 PDFのデータをエクセルに移して、データ化したい。PDFの文章を選択してコピー、そのあとエクセルに張り付けするとこんな風に一列になってしまいます。
pdf
excel

1か所ならまだしも、複数ある場合はさすがに手動で修正するのはつらい。ってなことで、なんかよい方法がないかと探していたらPythonにそのような機能があるということで実際にトライ。

参考

bunkyudo.co.jp

2.実装

import tabula

file = "MIL-STD-1560C.pdf"
tabula.convert_into(file, "tabula.csv", stream=True ,output_format="csv", pages='77-78')

pages = 'all'
とするとすべてのページを一括で全てCSVに変換できました。
出力

https://blog.hatena.ne.jp/inusan0424/inusan0424.hatenablog.com/config/design/detail