徒然日記

徒然なるままに書いていきます 固めのものからゆるい日常まで書きたいものを

研究室入退室管理システム Excel編

前回このような記事を作成しました。
cobaltic.hatenablog.com

…が結局API取得しなくちゃならないのは非常に面倒ですし、まとまって見ることが出来ません。
なによりも研究室に行かず家でダラダラしていると友人から「早くlabo inしろや」 というメッセージが届くようになって限界を感じました。

というわけで今回はExcelファイルに入退室記録を書き込みようなものを作成したいと思います。これで家でダラダラしていても煽られることはないはずです。

完成イメージはこんな感じです。
f:id:cobaltic:20190813183721p:plain

目次

プログラム

labo in

labo in の方のコードは以下のようなものです。下準備としてやることはlabo_manage.xlsxを作成するだけです。

import openpyxl
import datetime 
import os
from openpyxl.styles import numbers
from openpyxl.styles.fonts import Font
from openpyxl.styles import borders
os.startfile('C:\\***\\***\\labo_manage.xlsx')
  
d = datetime.datetime.today()
youbi = ["月","火","水","木","金","土","日"]
#d.weekday()では数字が吐き出されるのでそれに対応した曜日の配列を用意しておく
wb =openpyxl.load_workbook('labo_manage.xlsx')
sheet = wb.active
#初期設定-
if  sheet.cell(column = 1, row = 1 ). value == None :
    sheet.cell(column = 1, row = 1 ). value = '日付'
    sheet.cell(column = 2, row = 1 ). value = '曜日'
    sheet.cell(column = 3, row = 1 ). value = 'laboin'
    sheet.cell(column = 4, row = 1 ). value = 'laboout'
    sheet.cell(column = 5, row = 1 ). value = 'ラボ滞在時間'
    sheet.cell(column = 7, row = 1 ). value = '経過日数'
    sheet.cell(column = 7, row = 2 ). value = '滞在日数'
    sheet.cell(column = 7, row = 3 ). value = '総滞在時間'
    sheet.cell(column = 7, row = 4 ). value = '平均滞在時間(経過日数)'
    sheet.cell(column = 7, row = 5 ). value = '平均滞在時間(滞在日数)'
       
    for i in range (1,5):
        font = Font(b = True, sz = 12)
        sheet.cell(column = i, row = 1).font = font
        sheet.cell(column = 7, row = i).font = font
        sheet.cell(column = i ,row = 1).border = borders.Border(bottom=borders.Side(style=borders.BORDER_THICK, color='000000'))
    
    sheet.column_dimensions['A'].width = 13
    sheet.column_dimensions['C'].width = 11
    sheet.column_dimensions['D'].width = 11
    sheet.column_dimensions['E'].width = 13
    sheet.column_dimensions['G'].width = 22
    
    
    sheet.cell(column = 8, row = 1 ).number_format = numbers.FORMAT_GENERAL 
    sheet.cell(column = 8, row = 2 ).number_format = numbers.FORMAT_GENERAL 
    sheet.cell(column = 8, row = 3 ).number_format = numbers.FORMAT_DATE_TIME6
    sheet.cell(column = 8, row = 4 ).number_format = numbers.FORMAT_DATE_TIME6
    sheet.cell(column = 8, row = 5 ).number_format = numbers.FORMAT_DATE_TIME6

#-初期設定

for j in range(2,1000):
    if  sheet.cell(column = 1, row = j ).value == None :
            sheet.cell(column = 1, row = j ). value = '%s-%s-%s' % (d.year, d.month, d.day)
            sheet.cell(column = 2, row = j ). value = '%s曜日' % (youbi[d.weekday()])
            sheet.cell(column = 3, row = j ). value = '%s:%s:%s'  %(d.hour, d.minute, d.second)
            
            #それぞれのセルの書式設定をいじる
            sheet.cell(column = 1, row = j ).number_format = numbers.FORMAT_DATE_YYMMDD
            sheet.cell(column = 3, row = j ).number_format = numbers.FORMAT_DATE_TIME6
            sheet.cell(column = 4, row = j ).number_format = numbers.FORMAT_DATE_TIME6
            sheet.cell(column = 5, row = j ).number_format = numbers.FORMAT_DATE_TIME6
            
            
            print('%s時%s分%s秒%s曜日\n' % (d.hour, d.minute, d.second, youbi[d.weekday()]) + 'C' + str(j) + 'のセルに入力しました。')
            break   
wb.save('labo_manage.xlsx')

動きを簡単に説明すると#初期設定-から#-初期設定の部分ではコメントの通り初期設定をしています。
A1のセルが空白なら初期設定(セルの書式設定やフォントなど)をやってくれます。
f:id:cobaltic:20190813183850p:plain
これが
f:id:cobaltic:20190813183857p:plain
こう

labo out

import openpyxl
import datetime 
from openpyxl.styles import numbers
import os
os.startfile('C:\\***\\***\\labo_manage.xlsx')

   
d = datetime.datetime.today()
youbi = ["月","火","水","木","金","土","日"]
#d.weekday()では数字が吐き出されるのでそれに対応した曜日の配列を用意しておく

wb =openpyxl.load_workbook('labo_manage.xlsx')
sheet = wb.active
 

for i in range(2,1000):
    if sheet.cell(column = 3, row = i ).value == None :
            sheet.cell(column = 4, row = i-1 ). value = '%s:%s:%s'  %(d.hour, d.minute, d.second)
            sheet.cell(column = 5, row = i-1 ). value = '=D' + str(i-1) + '-C' + str(i-1) 
            sheet.cell(column = 8, row = 1). value = '=A' + str(i-1) + '-A2+1' 
            sheet.cell(column = 8, row = 2). value = '=SUMPRODUCT(1/COUNTIF(A2,A' +str(i-1) +'))'
            sheet.cell(column = 8, row = 3). value = '=SUM(E2:E' + str(i-1) +')'
            sheet.cell(column = 8, row = 4). value = '=H3/H1' 
            sheet.cell(column = 8, row = 5). value = '=H3/H2'        
            
            print('%s時%s分%s秒%s曜日\n' % (d.hour, d.minute, d.second, youbi[d.weekday()]) + 'D' + str(i) + 'のセルに入力しました。')
            break
                     
wb.save('labo_manage.xlsx')


labo in側の列で入力がない場所の右上にlabo outの時間を書き込みます。
計算式もゴリ押しで代入していきます。計算式については最後の「参考にしたもの」の部分を参照してください。
問題点としては日付が変わるとうまくいきません。24時を越えての入退室はないと信じて。
…とはいえ一応対策できないことはなくて、日付も入力した上でセルの書式設定を後からhh:mm:ssなどにすれば、表示されるのは時刻だけだけど日付もちゃんと入っているので計算は出来ます。ただ書式設定を入力とは別で完全に後からいじらねばならず、使用頻度に対して手間がかかるだけだと思ったので見送りました。

実装

やることは前回記事と全く変わらないので完全にコピペしています。そのためファイル名が若干違いますがご容赦を。
細かいステップを説明すると
1. laboin.pyを発動するようなbatファイルの作成
2. laboin.batをグループポリシーでログオンスクリプトとして登録
3. laboin.pyをログオンディレクトリに置いてくる
になります。

1. laboin.pyを発動するようなbatファイルの作成
これの3番目の方法を参考にbatファイルを作成します。
WindowsでPythonの実行する4つの方法 - ちょっと便利なてっちーノート


2. laboin.batをグループポリシーでログオンスクリプトとして登録
これが一番わかりやすいと思います。
グループ・ポリシーを使って、コンピュータの終了時にコマンドを実行する:Tech TIPS - @IT

自分はシャットダウン時ではなくてログオフ時にしたかったので実際の登録場所は以下の記事を参考にしました。
Windows 2012 でログオン・ログオフ時間をイベントへ記録する。


そしてこれらの記事を参考にログオンスクリプト・ログオフスクリプトとして登録します。

…それだけのはずなのに何度やってもうまく発動しないので、


3. laboin.pyをログオンディレクトリに置いてくる
のステップをやります。

以下の図はログオンスクリプトにlaboin.batを登録しているだけの状態です。
f:id:cobaltic:20190628204850p:plain

他の設定を少しいじって(後述)実行すると以下のようなメッセージが吐かれます。

f:id:cobaltic:20190628204913p:plain

多分
①ログオンスクリプトのbatファイルが開く
②batファイルの処理としてpyファイルを開こうとするがないので開けない

というような流れなので参照ボタンを押して出てくる場所に以下のように実行されるべきpyファイルを置いてきたところ
f:id:cobaltic:20190628204932p:plain
上手くいくようになりました。

ちなみにログオンスクリプトに登録して、仮に失敗したとしても親切にエラーを吐いてくれません。
[GP]「実行中のレガシ ログオン スクリプトを表示しない」で利用されているレジストリ | Windowsレジストリ置き場
を参考にしてログオンスクリプトの実行を表示する に設定することで原因が明らかになりました。

この記事を書く上では以下の記事にお世話になりました。
はてなブログにソースコードを色付けして貼り付ける方法 - sonickun.log

Excelで複数条件で検索して複数結果を抽出・整理するような処理をしたいとき

データ整理をする際に結構多いシチュエーションだと思います。

けどサッと探してピッタリな記事がなかったので、備忘録もかねて書きます。 

完成イメージはこんな感じです。

  

f:id:cobaltic:20190718223423p:plain

 

鈴木1郎~鈴木100郎の中から複数の検索条件に合致するものを複数返してくれていますね。

サッと調べるとこういった記事が出てきますが、INDEX関数やVLOOKUP関数は複数条件を設定しても単一の答えしか返してくれません。

Excel2010: 複数列の条件に合致した値を取り出す(条件エリア不要)★SUMPRODUCT関数、INDEX関数 - 教えて!HELPDESK

 

しかも関数が複雑でわかりにくい。

今回紹介する方法は結構ゴリ押しです。

その分だけ分かりやすいと信じています。

 

[目次]

 

 

1.検索条件に一致しているかを判定

 各項目で個別に判定します。複数組み合わせると複雑になってしまうので。

ひとまずこんな感じのやつが目標です。

f:id:cobaltic:20190718232959p:plain

 

 完全一致の場合の処理

まずは一番簡単なH列の処理について。

H列の処理はこのようになっています。

=IF(H$3=D4,1,0) 

 

IF(条件, TRUE の処理, FALSE の処理)

条件を満たすときはTRUE の処理を返します。満たさないときは FALSEの処理 を返します。

IF関数のルールはこのような処理なのでH列は

 =IF(H$3=D4,1,0)

もしH3とD4が一致しているなら,1を返す,一致していないなら0を返す

つまり血液型がO型の人は1,そうでない人は0と返すだけの簡単な処理です。

 

 部分一致の場合の処理

次にF列とG列の処理について。

=だと完全一致のみを判定するので、趣味欄で散歩 を検索しても 散歩,読書の人は除外されてしまいます。

そこでワイルドカードである「*」を使います。

これを使うと1文字以上の任意の文字列として機能してくれます。

つまり「*阿部*」で検索すると阿部寛阿部サダヲのどちらかが含まれているものが判定されます。

 

しかし悲しいことにIF関数を使うと文字列「*阿部*」として検索されてしまうので、別の関数を使います。

というわけでF列の処理はこちら。

=COUNTIF(B4,"*"&F$3&"*") 

 

COUNTIF(範囲, 条件)

範囲の中で条件を満たすセルの数を数えます。

=COUNTIF(B4,"*"&F$3&"*") 

B4のセルが,F3が部分一致するならばB4のセルのみカウント(1を返す)

範囲の部分は相対参照、条件の部分は絶対参照なので、常に条件と一致しているか1セルだけ判定して一致していたらそのセルをカウント(1を返す)というわけです。

 

 複数の検索条件に一致していたら該当と表示する

これまでに各条件に一致しているかどうかを0or1で判定してきました。

という事で3つの検索条件に全て合致していたら和が3になっているはずですので

 =IF(SUM(F4:H4)=3,"該当","")

という処理をします。

各条件判定の和が3(すべての条件に一致)しているなら,「該当」と表示,そうでないなら「」と表示(空白のセル)

これだけです。

 

 

2.該当しているものを番号順に列挙

ここから先はこの記事を参考にしています。

関数で条件を満たす複数のデータを表から取り出す方法 [エクセル(Excel)の使い方] All About

 

ここでの目標はこんな感じです。

 

f:id:cobaltic:20190721114625p:plain

 

 

 該当者に連番を振る

=IF(I4="","",COUNTIF(I$4:I4,"該当"))

合わせ技です。

もし空白のセルなら,何もしない,そうでないならI4(該当判定列の一番上のセル)から処理している場所までにある「該当」の数を数える

これで該当している人の横に連番が振られていきます。

連番付けした列に対してMAX関数を使うことで該当人数も分かります。

MAX(数値1, 数値2 …)

数値1から数値2の中で最大値を返す。

=MAX(J:J)

とすればJ列(連番付けの列)の最大値を返してくれるので該当人数が分かります。 

 

該当者を連番に従って並び替え

下準備として並び替えたい場所に、1からオートフィルで連番を打っておいてください。

最期の処理はこちらです。

 =INDEX(A$4:D$103,MATCH($L3,J$4:J$102,0),1)

 

 INDEX(対象範囲, 行番号, 列番号) 

対象範囲の中から行番号列番号の交差するセルの参照を取得します。

説明の為に再掲。これはM列の処理になります。

=INDEX(A$4:D$103,MATCH($L3,J$4:J$102,0),1)

f:id:cobaltic:20190721114625p:plain

まず対象範囲はA$4:D$103 処理したいデータが入っているところです。

次に行番号

MATCH(検索値, 検索範囲, 照合の型)

照合の型検索範囲にある検索値と一致するセルの位置を取得するように指定できます。

を使います。

MATCH($L3,J$4:J$102,0) というのは

J4~J102(連番付けの範囲)にある数字L3(並び替え後の連番1)完全一致していたらそのセルの位置を取得 ということです。

 

そしてINDEXの処理に戻ると

 =INDEX(A$4:D$103,MATCH($L3,J$4:J$102,0),1)

列番号のところは氏名の所がもらえればいいので,A$4:D$103の範囲の1番目の列なので1を指定します。

つまり連番と一致している人の氏名を引っ張ってきているだけの処理です。

これで完成です。

 

3.もっとスマートにするために

 赤枠で囲った部分がイケてない

f:id:cobaltic:20190721121732p:plain

連番も手入力だし、枠が余ると参照エラーになってしまうのでここの部分をスマートにしていきます。

該当人数を越えたら非表示にする処理

 = IF(ROW()-2<=K$3,ROW()-2,"")

ROW()はそのセルの行位置を返してくれる関数ですので、-2とか良い感じの調整をして

該当人数を越えたら非表示 というゴリ押しです。

 

氏名の方も同様に

=IF(K$3>=L3,INDEX(A$4:D$103,MATCH($L3,J$4:J$102,0),1),"")

該当人数を越えたら非表示になるような処理をします。

 

最後にワークスペースを見えないところに移動して体裁を整えれば完成です。

f:id:cobaltic:20190718223423p:plain


各関数の処理については以下の記事を参考にしました。

エクセル の Tips 一覧

 

『天気の子』を見た感想

 『天気の子』初日極上音響をキメて来たので感想を書きます。

www.tenkinoko.com

 

 自己満足の為に書く記事なので作品をガッツリ見た前提で、自分が思ったことを書き連ねるだけです。

まだ見てないよって方は見てきてください。ここでは期待に十分応えてくれる作品だとだけ言っておきます。

見てないのにこのブログを読んでネタバレ喰らった!!!!ってなるのだけは避けてほしいです。

 

 

f:id:cobaltic:20190720021817p:image

予約で満席って初めて見ました。恐ろしや『天気の子』

 

[目次]

 

 

 

 

 

 

 

 

 

 

 

 

 

〈ネタバレ注意〉

 

 

[映画自体の感想]

まず初めに言っておくと新海誠監督の作品は『秒速5センチメートル』・『君の名は』 しか見てない程度の知識です。

好みで言えば『秒速5センチメートル』(特にコスモナウト)のほうが好きで、『君の名は』が大ヒットしたときには「まあ世間的に売れる作品だよね~」なんて斜に構えた感想を持っていた人間です。(もちろん『君の名は』も面白いと思ってます、好みの問題であって)

 

というわけで今回の『天気の子』はどっち寄りにしてくるのかな~なんて面でも楽しみにしていました。

そんなスタンスで見ていて「今回は半分良い意味半分悪い意味で面白い作品だなぁ」なんて思っていました。

そう、雨が3年間降り続けて冠水した東京を見るまでは!!!

ここで一気に引き込まれてしまいました。まさかそう転ぶとはね。

順当にヒナさんが帰ってきて大団円的な終わりかと思っていた。(むしろスガさんとかを考えるとちょっと可哀相じゃない?)

 

スガさんの「人柱一人でこの異常気象が治るなら安いもんだ」的なセリフで確かに~なんて思ってしまっていた。だって雨続きは嫌ですもの。

まあ話の展開的にヒナさんを連れ戻すんだろうけど、うまいこと万事解決!みたいになるかと思っていたので、冠水した東京を見てなにしてんねーーーーんって。

それでも尚それらに適応して暮らす人々、そしてその後のスガさんの「世界を変えてしまっただぁ?自惚れんな!世界なんか元々狂ってんだよ!!」みたいな言葉(うろ覚え)にこの作品の全て集約されていると私は勝手に受け取りました。

ここから先は思想的な話になるのでまた後で。

 

『君の名は』に出ていたキャラがちょくちょく出てきていたのもよかったですね。 

 

花澤香菜佐倉綾音が出ていた!しかも下の名前はそのままで!!

なんなら児童相談所に面会に来た時に名前が「花澤綾音」だったからもう一人は「佐倉香菜」なんだろうなってワクワクしてエンドロール見ていたのにカナ・アヤネとしか表示されなかった…

ちょろいリハーサルで婚姻届を書く会で、アヤネルが花澤さんの名前を書くみたいな気持ち悪い(褒め言葉)エピソードがあった気がするのですが、ようやく実現したんダァってオタク丸出しの感想です。誰かに伝わってほしい。

 

あと平泉成さん刑事役って見ると「細かすぎて伝わらないモノマネ選手権」の〈犯人に嫌な追い詰め方をするベテラン刑事役の平泉成〉しか頭に出てこなくて笑ってしまう 。

 

本田翼について前評判から少し心配していたのですが、あれはあれでありかなって思えるような感じでした。

 

[思想的な面の感想]

 もう一度言うとこの作品はスガさんの「世界を変えてしまっただぁ?自惚れんな!世界なんか元々狂ってんだよ!!」みたいな言葉(うろ覚え)が一番ズドンときました。

 

人間に関する定義で好きなものとしてドストエフスキーの『死の家の記録 (新潮文庫)』で登場する

人間というものは馴れる存在である。そして私はこれが人間を最も適切に定義していると思う

というものがあるのですが、冠水した東京でも人々は船をバスとして活用していたり、冠水した東京という異常に馴れていて、まさしくこれだなっと。

 

狂ってない世界という静的なものはなくて、絶えずどこかが狂い続けていく動的な世界として捉えるのが良いのかも。

概念をちゃんと理解できていない気がしますがデリダ差延という概念を借りるなら

瞬間の世界そのものだけを認識するなんて出来なくて、経時的な世界の変容・差異を通して、世界の在り方を認識できるので認識は遅延する

ということなんでしょうか。

世界なんか元々狂ってんだよ! 結構深い言葉な気がします。

 

 

あとはヒナさんを助けたこと東京が冠水したことについて。

いわばホダカ君のエゴによって世界は狂ってしまったわけだけれども、スガさんの言ってたように人柱として捧げるのが正解なのか。

 

これを考える多ために局所解大域解という便利な用語を導入します。

局所解と大域解を考える上で重要な二つのパラメータがあります。それは範囲と時間軸。

 

映画終盤という時間軸のなかで、ホダカ君の主観のみ(世界なんか関係ねぇ!)という範囲の、局所性の中で何をすべきかと考えるとヒナさんを助けるのはが正解(局所解)

  

でも日本全体で見れば助けたことは結果として多くの人が被害を被ってるだろうし、いつかホダカ君も過去の警察とのいざこざを理由にクビにされて、やさぐれてビール片手に「あの時助けなかったらヨォ…」なんてことを考える日が来るかもしれない。

そういった大域を考えるとヒナさんを助けるのは実は正解(大域解)ではなかったのかもしれない。

 

まあなんとなく伝わったと思いますがこれが局所解と大域解の違いです。

個人の幸福(不幸)が全体の幸福(不幸)になるのか、ベンサムの最大多数の最大幸福って本当??

なんて疑問を基点として局所解と大域解のどうやったら折り合いというものをつけられるんだろうなんてことをボンヤリと考えていてたわけです。

 

そんな中でスガさんの「世界を変えてしまっただぁ?自惚れんな!世界なんか元々狂ってんだよ」発言を聞いて安直にアダムスミスの国富論よろしく

個人個人が自分の局所解を追求することによって、神の見えざる手に導かれるかのように大域解に貢献するようになっている」じゃないか!?

なんて考えたけれどこれを書いているうちに冷静になりました。

 

個人の局所解の結果起こったテロとかは明らかに局所解が大域解を損なっているだろって思ってしまいました。

やっぱり論理も大事だけど感情も同じぐらい大事にしたいのでこれはダメそうです。

そもそも循環論法だったり定義・条件が足りないし自分の中で定まってなさすぎる気がします。

まだそこの部分を深く詰める必要があるなあなんて思いました。

 

ちょうど最近自分が考えていた局所解と大域解の折り合いというテーマに、ビビッとくる作品でした。結局これを書いて思考が整理されてきたけど、まだ局所解と大域解の折り合いに対する答えは出せそうにありません。

ヒナさんを助けた結果東京が海に沈んだ。その事実をこの記事を読んだうえで、皆さんがどう捉えるか知りたいものです。

 

まあ結論を一言で言えば自分好みの作品でした。

皆さんもぜひどうぞ!!!

スキューバダイビングのライセンスを取りに行ってきた

地球の7割は海に覆われてるそうで、それ即ちスキューバダイビングという海遊びを覚えれば地球を遊び尽くせること間違いなし。

みたいな思いと、単純に泳ぐのが好きでシュノーケリングはやったことがあるけどダイビングはないからやってみたーーい。とか、会話のネタになるなとか色んな想いを抱えてダイビングに行ってまいりました。1人で

f:id:cobaltic:20190711153027j:image

今回のお気に入り写真

1人じゃねぇじゃん!って思ったかもしれないけど、自分とインストラクターです。

 

概要

実施場所:伊豆

日程:7/10-11

費用:7万ぐらい

同行者:0人

 

[目次]

 

前書き

まずはなんで1人で行くことになったのか。

端的に言うなら、どうせなら体験ダイビングじゃなくて、ライセンスとるレベルまでやってみたいと思っていたから。

ただそうなると費用と日程がかさみ、「ダイビング?いいじゃん!俺もやってみたかったから行きたい!!」って言ってくれた人は多くおれども、費用と日程の話になると「そりゃキツイ」ということで同行者が誰も捕まらず。

君らのダイビングにかける情熱はその程度だったの!?

 

まあ1人で行くのもそれはそれでネタになるしいいかという精神で1人で行くことを決意。

 

ただ1人の思わぬ恩恵として2泊3日で取るコースなんですが、平日に1人で行くってことでマンツーマンで教えられるので、1泊2日で詰め込むことが出来ると言って頂けました。宿泊費が浮くしありがたいっ

 

2ヶ月ほど前からダイビングスクールを探し始めて、メールして色々聞いたりして粛々と動いてました。

 

今回お世話になったのはこちら

【伊豆/東京/埼玉】ダイビングライセンス取得ならSSI公認のシャークアイ

選んだ理由は検索して一番最初に見て、そのあと色々見たけどここが一番良かったから。

お値段も明瞭会計でそこまで高くなく、ライセンス取得後3ヶ月はレンタルが無料になるらしいってことで。

あとはダイビングの団体もいくつかあるようで、

ダイビング団体のPADI/NAUI/SSIの違いや比較 ライセンスの発行 | ダイビングラボ

ここはSSIってとこで最大手ではないけど指導がちゃんとしてるらしいのでそれも考えた要素。

アプリ入れてオンラインで学科講習も受けられたのも楽で良かったです。

ちなみにダイビングは浮力が勝手に取れるので泳げない人でも全く問題ないし、ウェットスーツがあるので寒くないですよ。

 

スケジュール

1日目

プール講習

海洋実習

 

始発電車に乗って鈍行に揺られること3時間で伊豆へ

f:id:cobaltic:20190711153302j:image

こういう雰囲気めっちゃ好き

 

f:id:cobaltic:20190711153245j:image

1日目の実施場所 リゾート感がすごい

 

この施設内にある25mプールでダイビングに必要な基礎的なスキルを色々教えてもらったり、学科試験受けたり

2泊3日コースだと1日目はプールだけらしいんですが、詰め込みコースなのでそのまま海洋実習へ


f:id:cobaltic:20190711153252j:image

海洋実習はこんな感じのところで。

この写真だと誰かと来てる感あるけど、自分とインストラクターのやつ…

この日は2回ダイブ。

 

スクールのお宿に帰ってゴロゴロ よく眠れた。

 

2日目

前日とは場所を変えて

基礎スキルを教わりつつ、海を楽しむ感じで3本ダイブ。
f:id:cobaltic:20190711153238j:image

お昼に食べた世界一美味いカップヌードルとオムライスおにぎり。

 

スクールのインストラクター見習い?みたいな人が合流してカメラで撮影してくれました。f:id:cobaltic:20190711153258j:image

 

f:id:cobaltic:20190711153255j:image

映え〜〜って感じですね。


f:id:cobaltic:20190711153248j:image

という訳で無事オープンウォーターダイバーのライセンスを取得できました。

 

 

費用詳細

講習費用 59400円

宿泊費 4320円

飲食費 2500円

交通費 4000円

 

総計 70220円

 

 

感想

ダイビング以前に、伊豆に向かう列車で海が見えて自分はテンション上がってたんですが、周りの人たちは寝てたりスマホ弄ってたりで、この人らにとっては「海を背景に通学・通勤する」ってのが「なんの変哲も無い日常」なのかぁって思っていきなり旅をしている感じを思い知りましたね。

日常に海のある暮らし いいじゃないですか。

 

で肝心のダイビングの感想

正直言うとプール講習の時結構怖かったんですよ。特にマスクに水入れるやつ。コンタクトだから目も開けられなくて、呼吸できるし安心って分かってても若干パニックになりかけて息が荒くなるし。

海に入ってもダイビングを嫌いにならずに入れるんだろうか…なんて考えていたけれど、いざ海に入ると一瞬で海の世界に引き込まれました。

 

まず想像以上に魚がたくさんいた!

泳いでる時に撮れた魚の写真を頂いたので紹介。

f:id:cobaltic:20190711165510j:image

(多分)ホウボウ

体の暗さと羽の鮮明な青さの対比が良い。


f:id:cobaltic:20190711165515j:image

ミナミハコフグの幼魚!

小ちゃくて鮮やかで可愛い〜〜


f:id:cobaltic:20190711165506j:image

何だったか忘れてしまった…

他にもウツボとかカニとか沢山の色んな生き物を見れました。(ウツボを見るとマリオ64思い出してちょっと怖い)

ダイブ毎に見た魚を解説してくれるのが非常に嬉しいです。

 

魚も勿論良いのだけど、揺らめきながら立ち昇る泡も見てて飽きないし、上を見上げると海と空の境界で絶えず変化する光の様相は空に敷き詰められた硝子が光を受けつつ割れ続けてるのを眺めてるよう。

 

普段は無意識にやってる呼吸も意識しないと海の中では肉体が皮膚に包まれたゴム風船として存在するので、空気を吸えば浮くし吐くと沈む。

 

呼吸と少しのキックだけで自由に三次元の中を移動できる。まさしく無重力の世界。

海から出ると体が重く感じます。実際機材も大分重いんだけど。

 

今まで何気なく眺めていた水平線の下にはまさしく別世界が広がっているんだなぁって思って海から上がって、陸からは平面に見える水面を眺めてシミジミとしてました。

 

これを書いてるうちに思ったこと!

上手く言えないけど自分は時々、皮一枚隔てて世界に存在してるってのが不思議で、「自分」と「世界」の境界ってものがよく分からなくなる。親指と人差し指の皮の内側は「自分」だけど、親指と人差し指の間の小さなスペースはもう「自分」じゃなくて「世界」って、こんな薄い肉皮一枚如きで「自分」と「世界」の境界が決まってるもんかなぁ…なんて風に時々考える。

 

でもダイビングしてる時は周りは水に包まれてるし、普段は無意識にしている呼吸も当たり前にはできなくて、自分の肉体を成している魚達が悠々と群居しているのを見ていた訳で…なんか自分と世界の境界は有るんだけど、無いんだなって思って

俺達は全身全霊で世界に存在している

当たり前過ぎて皆忘れてしまったことだ

という呪術廻戦 5 (ジャンプコミックス)にある東堂の台詞を思い出して、なんとなく腑に落ちた。

自分と世界の境界は勿論有るんだけれど、世界に屹然と存在している訳じゃなくて、絶えず世界の中に自分を全身全霊で存在させている。纏めるならこんな感じだろうか。ダイビングを通してまさかこんな思想を獲得することになるとは思ってもいなかった。

 

 

 

というわけで話は若干逸れましたがダイビングにすっかり魅了されてしまいました。

ボッチ受講も結果的にマンツーマンでじっくりと指導してもらえたので、本当に良かったです。

次のステップアップコースも同じ講習費用らしいのでバイト頑張りたいと思います。

 

7万は正直キツかったけれどやって良かったです。これを読んだ皆さんも是非とも非日常の世界に潜りましょう!!!

研究室の入退記録を自動ツイートできるようにしてしまった話

タイトルの通りです。
ログオン・ログオフ時に自動的にツイートして入退記録が出来るようにしてしまいました。
ちなみにWindowsです。

全体の大まかな流れは

のお手軽3ステップです。

2.コード書き書き

実際に書いたコードはこちら!

import tweepy
import datetime

#ステップ1で取得したAPIKeyを以下に入力
CK = 'XXXXX' #CK=consumer_key
CS = 'XXXXX' #CS=consumer_secret
AT = 'XXXXX' #AT=access_token
AS = 'XXXXX' #AS=access_secret

auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)
api = tweepy.API(auth)

#ツイート
d = datetime.datetime.today()
api.update_status('%s年%s月%s日' % (d.year, d.month, d.day)
+ '%s時%s分%s秒' % (d.hour, d.minute, d.second)
+ 'にラボin!\n 今日も一日頑張るぞい')

時間の部分は以下の記事を参考にしました。
Python: 現在の日付・時刻の取得と出力 - datetimeクラスの属性、today()、strftime()メソッド | Yukun's Blog

ラボoutの方も適当に文言を変えるだけです。
実行結果はこんな感じです。

なかなか健康的なラボライフでございます。


3.ログオン・ログオフ時に発動するように設定

細かいステップを説明すると
3.1 laboin.pyを発動するようなbatファイルの作成
3.2 laboin.batをグループポリシーでログオンスクリプトとして登録
3.3 laboin.pyをログオンディレクトリに置いてくる
になります。


3.1 laboin.pyを発動するようなbatファイルの作成
これの3番目の方法を参考にbatファイルを作成します。
WindowsでPythonの実行する4つの方法 - ちょっと便利なてっちーノート


3.2 laboin.batをグループポリシーでログオンスクリプトとして登録
これが一番わかりやすいと思います。
グループ・ポリシーを使って、コンピュータの終了時にコマンドを実行する:Tech TIPS - @IT

自分はシャットダウン時ではなくてログオフ時にしたかったので実際の登録場所は以下の記事を参考にしました。
Windows 2012 でログオン・ログオフ時間をイベントへ記録する。


そしてこれらの記事を参考にログオンスクリプト・ログオフスクリプトとして登録します。

…それだけのはずなのに何度やってもうまく発動しないので、


3.3 laboin.pyをログオンディレクトリに置いてくる
のステップをやります。

以下の図はログオンスクリプトにlaboin.batを登録しているだけの状態です。
f:id:cobaltic:20190628204850p:plain

他の設定を少しいじって(後述)実行すると以下のようなメッセージが吐かれます。

f:id:cobaltic:20190628204913p:plain

多分
①ログオンスクリプトのbatファイルが開く
②batファイルの処理としてpyファイルを開こうとするがないので開けない

というような流れなので参照ボタンを押して出てくる場所に以下のように実行されるべきpyファイルを置いてきたところ
f:id:cobaltic:20190628204932p:plain
上手くいくようになりました。

ちなみにログオンスクリプトに登録して、仮に失敗したとしても親切にエラーを吐いてくれません。
[GP]「実行中のレガシ ログオン スクリプトを表示しない」で利用されているレジストリ | Windowsレジストリ置き場
を参考にしてログオンスクリプトの実行を表示する に設定することで原因が明らかになりました。

この記事を書く上では以下の記事にお世話になりました。
はてなブログにソースコードを色付けして貼り付ける方法 - sonickun.log


更なる改良点としては滞在時間算出したり、Excelに書き込むようにしてみたりとかで管理とか色々発展できそうですね。
けど今回はここまでで勘弁してください。なんでこんなものを作ってしまったのか、自分も今後も使い続けるかは謎です。

追記:
なんかシャットダウンがすごい遅くなってたのですが、laboaout.batファイルのpauseを消したところ解決しました。

『プロメア』を見て思ったこと

『プロメア』という映画を見てきました。

f:id:cobaltic:20190619165524j:plain



promare-movie.com

 

友達が「男のロマンが詰まった見るエナジードリンクだから見てこい」なんて激推ししてくるもんだから、自分もホイホイ見に行ってこれは男のロマンが詰まった見るエナジードリンクですわぁってなってきました。

 

 

自分は『キルラキル』しか見たことなかったけど、このツイート見てなんとなく納得できた。

キルラキル』も『プロメア』も王道展開なんだけどぶっ飛んでてゴリゴリに熱くなれるし、なんやこれ…なんやこれ!みたいになれる特濃なすごい好きな作品。

「見るねるねるねるね」みたいな感じだろうか、色使いも似てるし。

 

 

この映画見たよってTwitterで呟いたら感想ブログ書いてくれや!って言ってもらって最初はこれは見てもらわないと面白さ分からないから無理だよー書けないよーってなってたけど結局書いてます。

というのも『インタステラー』とか『帰ってきたヒトラー』みたいな循環構造?を持った映画が最近好きだなって思ってたのに、物語の構造自体は単純な『プロメア』という作品を見て激熱になったことで物語に対する認識をいろいろ改めさせられたのです。

改めさせられたというか凝り固まってた思考がもみほぐされたって感じですけど。

 

その昔ロシア人のおっちゃんが昔話の構造を分析したところ31のパターンの組み合わせに過ぎないってことが分かったらしくて

 ウラジーミル・プロップ - Wikipedia

 『プロメア』も物語はかなり王道 悪く言えば単純かもしれないけれど、こんなに魅力的な作品に仕上がってるわけで、物語の良さってのは物語の構造だけでは決まらない。

 

ここでいう「ロボとか超作画とか美少年とか堺雅人が見れるほか、絶対にここでしか見れない滅殺開墾ビーム」を集めたとしても『プロメア』が出来上がるかといえばそうではないと思うんですよ。

 

ゲシュタルト心理学とかシステム論で

 全体は部分の総和ではない

という考え方があるようですが、これは今回『プロメア』を見て、感想をどう書こうかな~なんて考えてるうちに強く痛感したことで、

ロボ!超作画!!美少年!!!堺雅人!!!!滅殺開墾ビーム!!!!!!

なんて部分だけ伝えても『プロメア』という作品の魅力を伝えられないのですよ。

『プロメア』を知りたいなら『プロメア』を見てくれ こうとしか言えないって感じですね

ちなみにこういう考えを総称して全体論ホーリズム)って言うらしいです。

ホーリズム - Wikipedia

 

神は細部に宿る

 とは良く言ったもので物語のどこに価値があるかと言ったら、作品の構造ではなくてむしろむしろ表現の仕方にあるんじゃないんでしょうか。当然確固たる作品の構造という大本があってそれに付随する細部があるわけですけど。

 

そう考えるとこういうブログも「表現という営み」においては自分の言葉で書いてる時点で価値があるのかもしれない。他の人の感想ブログとか見ると あぁ~自分のいいたいこと全部代弁してくれてる~ ってなって自分がわざわざ書かなくてもいいなってなりがちだけど、自分なりに表現する ということが大事なんですね。

 

 こんな素晴らしいことに気づかせてくれた『プロメア』みんな見ような!!!!

見てる最中はこんな小難しいこと考えないで、情報の奔流に身を任せてキメられる作品です!!!!!!!

 

最後に一言

CV堺雅人がちょくちょく古美門研介にしか聞こえなかったのでリーガルハイでガッキーに滅殺開墾ビームを食らわせてほしいです。

 

 

「分類」とは何か ~醜いアヒルの子の定理~

突然ですが問題です!

 「似ている」とは、「分類する」とはなんでしょう?

問いが抽象的過ぎたので、具体的に問うと「アヒル」「白鳥」「ミサイル」の中で似ているものを客観的に選んで、その理由を考えてみてください。

 

 

f:id:cobaltic:20190520231323p:plain

 

 

 考えましたか? 

多分「アヒル」と「白鳥」が一番良く似ているって考えるんじゃあないんでしょうか。

両方とも生きてるし、なんなら生物的な違いも正直良く分からない。

しかしそれは、我々があくまでも「主観」に囚われているからであるということを「醜いアヒルの子の定理」を題材にして示し、その意味を考えていきたいと思います。

 

 

 

醜いアヒルの子の定理の概要

醜いアヒルの子定理」とは理論物理学者の渡辺慧さんが示したもので、その概要は

任意の異なる二つの概念は、他の任意の異なる二つの概念と同じ度合いの類似度を持っている

 

最初の例で言うならば「アヒルと白鳥の似ている度合い」と「アヒルとミサイルの似ている度合い」は同じぐらいということ。

「アヒル」と「白鳥」は似ているし、「アヒル」と「ミサイル」は似てないだろ と思うことでしょうのでこれからどうして「似ている」のかを概略的に説明していきます。

 

 まずは「飛べる」「生き物」という観点で類似度を考えていきましょう。

f:id:cobaltic:20190521175131p:plain

 この図で言うと

ミサイルは「飛べる」が「生き物」ではないのでα1に該当し、白鳥は「飛べる」し「生き物」なのでα2に該当し、アヒルは「飛べる」ではないが「生き物」なのでα3に該当します。

 

f:id:cobaltic:20190521175231p:plain

 

ここで説明を楽にするために1つ用語を取り入れます。

  「分類可能な最小領域」をアトム(集合素)として、類似度の判定はアトムをもちいます。α1~4までのアトムがありますが、そのうちどの一つに該当しているかということを「1位の該当要素」とします。同様に「どの2つのアトムの複合に該当しているか」を「2位の該当要素」とします。

つまり1位の該当要素の候補はα1~4の4つあり、ミサイルの1位の該当要素はα1となります。

2位の該当要素としてはα1とα2の複合領域(α1α2)、α1とα3の複合領域(α1α3)、α1とα4の複合領域(α1α4)の3つです。

というような考え方で該当要素を書き出して共通している部分を持ってして2つの類似度を計測できるというわけです。

 

というわけで最初の議論に立ち戻り「アヒルと白鳥の類似度」と「アヒルとミサイルの類似度」を比較してみましょう。

 

以下が、アヒルと白鳥の類似度を調べたものです。

  

f:id:cobaltic:20190520231013p:plain

2位の共通要素が1つ、3位の共通要素が2つ、4位の共通要素が1つですね。

 

 では続きまして、ヒルとミサイルの類似度を調べてみましょう。

 

f:id:cobaltic:20190520231032p:plain

2位の共通要素が1つ、3位の共通要素が2つ、4位の共通要素が1つですね。

 

 というわけで「アヒルと白鳥の類似度」と「アヒルとミサイルの類似度」は等しいことが示せました。

そういう例を持ってきただけでしょ?という話ではなくて「醜いアヒルの子の定理」は

任意の異なる二つの概念は、他の任意の異なる二つの概念と同じ度合いの類似度を持っているという定理です。比較する対象が何になろうと、類似度の調査に用いる要素に何を使っても揺るぐことはありません。細かい証明はあとでやることにしてここからはその意義を語っていきたいと思います。

 

醜いアヒルの子の定理がもたらす意味

 これを使えば

「俺と阿部寛」って「阿部寛とローマ人」ぐらい似てる~~

って堂々と言えるようになります。

 

テルマエ・ロマエ

テルマエ・ロマエ

 

いやどう考えても「阿部寛」と「ローマ人」は似てるし、「俺」と「阿部寛」は似てない。 

 

まあそんなことより大事なことは

真に客観的な視点というものは存在せず、主観を排することができない ですね。

醜いアヒルの子の定理のどこがおかしいって「要素全てを同等に扱っている」ことですよね。日常生活においては「生きている」を「飛べる」より重要視したりする「価値基準」が入り込んでいるわけです。

つまり人間は純粋な論理でいえば本来「分類」は出来ないはずですが、「何が重要であり、何が重要でないか」ということを決定することで、重要な要素を抽出して「分類」ができるということです。

ということは人間は何かを判断するうえでは常に何らかのバイアスに囚われているとも言えるでしょう。むしろその偏りが程々にあるからこそ「意見」というものは有意であるのです。

「分類」をするということは自分が何を重要視しているという世界観の表明に他なりませんです。

裏をかいたことを格言っぽく言うなら

全てを見ようとすることは何もみないことと同じ

でしょうか。

 

逆に言えば「分類」という営みを通して「何を重視しているか」を知ることが出来ます。

アメリカ人と日本人という分類はどのように行われているのか?とか

自分が就職したいと思った企業と就職したいとは思えなかった企業の分類は?

好きな食べ物と嫌いな食べ物の分類は?

 

などなど「分類」ないし判断の場面は大小問わず多くあります。

そういった問から自分でも気づけなかった思想の構造を浮かび上がらせることが出来るやもしれません。

 

そしてこれは思想的側面だけでなく工学的にも非常に有意義な定理です。

この定理が発見される以前は認識と価値を分離したものとして考えていましたが、この定理によって

特徴を抽出することはどの特徴を重視するかを決定することに他ならないと明らかになり、コンピューターの機械学習の進歩にも貢献しています。

この定理により,対象のある側面を重視し他を無視する という主観的規準なくしては,分類などの判断はコンピュータも人間もできない.また,特徴選択や次元削減など,一部の特徴を特に重視する操作が機械学習にとって本質的であることをこの定理は示唆している.

変わりゆく機械学習と変わらない機械学習(https://www.jps.or.jp/books/gakkaishi/2019/01/74-01seriesAIphys2.pdf)より

 

またこの定理を発見した渡辺彗さんの著書「認識とパタン」のはしがきを最後に添えたいと思います。

一方では、ギリシャ以来の伝統的哲学の中の一つの中心的課題である不変者に関する論争に関連させながら、他方では、最近発達したコンピューターを用いるいわゆるパタン認識という技術がいかに可能になるかという問題を解明したいと思います。(中略)もしも、理科に興味のある読者が、平素小馬鹿にしている哲学にも学ぶべき多くの発想の泉のあることに気づかれ、また、文科に興味のある読者が、新しい科学・技術と交流することにより哲学が生々と若返り得ることに気づかれるならば私は満足です。

 

 

醜いアヒルの子の定理の証明

 細かい計算は飛ばしますが、証明のアウトラインだけを示していきます。(詳しく知りたい人は参考文献を参照)

 

今回の例では分類に用いる要素として「生き物」と「飛べる」を用いましたが、もう一つ勘案してみましょう。なんでもいいです。「阿部寛が好き」でもいいんです。

f:id:cobaltic:20190521090840j:image

 するとアトムは8個になります。このように分類に用いる要素(factor)をfとするとアトムnの個数は2^fとなります。

 

ここで1位のアトムが異なる場合を考えます。片方の1位のアトムをαxもう片方をαyとでもしましょう。

当然1位の共通要素はありません。

2位の共通要素はαxαy の1つですね。

3位の共通要素はαx・αy以外の中から1つ選んでαx∪αy∪選んだ1つ とすればいいのでアトムが全部でn個あるとしたらnー2個だけありますね。

組み合わせで言えば

f:id:cobaltic:20190521174259p:plain

4位の共通要素はαx∪αy∪選んだ1つ に加えてさらに1つ選べばいいので組み合わせの数は 

f:id:cobaltic:20190521174319p:plain

というようにやっていくと以下のような式が成り立ちます

 

f:id:cobaltic:20190521094653p:plain

 

したがってn個のアトムがある時、共通要素は2^n-2 になるということです。

 

 今回の例において簡単にするために二つでしか分類していなかったけれど、「飛べる生き物」なんてものは蝶も蝉もいるわけでそれらを区別するには多くのアトムが必要になります。そして同語反復的ではありますが

区別できる=1位のアトムが異なる なので必ず

区別できている任意の2つの概念の類似度は2^n-2 となるという訳です。

 

我々はこの世界にある多くの物体・概念を膨大な分類要素をもって区別していますが、分類要素の重要性をすべて同一視するとそもそも分類なんてものは不可能になる ということです。

 結果として

任意の異なる二つの概念は、他の任意の異なる二つの概念と同じ度合いの類似度を持っている

などという一見間違っている定理が成り立つのです。

 

参考文献

ポケット図解 構造主義がよ~くわかる本 (Shuwasystem Beginner’s Guide Book)

ポケット図解 構造主義がよ~くわかる本 (Shuwasystem Beginner’s Guide Book)

 

 今回の定理が示したことをことを拡大すると人間は無意識のうちに持っている「構造」のようなものがあり、思考は常に社会制度や文化などの「構造」に囚われているということです。この考えが構造主義の基礎です。そこの部分を更に深めたいときにお勧めの本。醜いアヒルの子の定理もこの本で知りました。

 

 

認識とパタン (1978年) (岩波新書)

認識とパタン (1978年) (岩波新書)

 

 醜いアヒルの子の定理を発見した渡辺慧さんの本。

分類のより理論的な部分を知りたい方にお勧めの本です。発売日の通り内容としては現代では基礎となっている部分です。