徒然なるままに生活しない為の備忘録

地方国公立大のM1。物理専攻。思いついたこととか、日々の日記とか。

Zoomにおける挙手の有用性

メモ程度に。

 

先日、就職活動の一貫としてとある企業の説明会にZoomで参加した。

その際「〇〇について知っている人は挙手ボタンをクリックしてください」という指示を受けた。

その時は、「挙手させたところで、聴衆の理解度に応じた説明の使い分けなんてしないんだから(事実そうだった)、主催者側の自己満にしかならないことさせるのやめてほしいなぁ。」という感想を持ったのだが、実は、けっこう有用なテクニックだったのではないか、と後から思った、という話。

 

というのも、挙手というアクションを参加者各位に取らせることにより

  • 〇〇について知ってる人は「ああ、いまから〇〇について話すのか」という風に、聞く準備ができる
  • 〇〇について知らない人は「〇〇なんて知らないぞ、注意して聞こう」という風に、傾聴することができる

という利点があることに、今更ながら気づいた。

 

これはZoomの挙手に限ったことではなく、オンサイトの説明会でも有用だと思う。

 

XENO(カードゲーム)をPythonで作ってみる

PythonでXENO(カードゲーム)を作ってみた。

作ってみたとは言っても、あくまで仕組みを作っただけで、対戦などはできない。

XENO公式ルール

www.happybrainwash.com

コード

~
dict_card = {'10:英雄':10, '9:皇帝':9, '8:精霊':8, '7:賢者':7, '6:貴族':6, '5:死神':5, '4:乙女':4, '3:占い師':3, '2:兵士':2, '1:少年':1}
list_card = ['10:英雄', '9:皇帝', '8:精霊', '7:賢者', '6:貴族', '5:死神', '4:乙女', '3:占い師', '2:兵士', '1:少年']
reincarnation = [] # 転生札
p1_hands = [] # 1人目のプレイヤーの手札
p2_hands = [] # 2人目のプレイヤーの手札
cemetery = [] # 墓地

game_end = False # ゲームが決着するかのフラグ
turn = True # ターンプレイヤーの決定
maiden = False # 4:乙女 が使用されているかのフラグ
sage = False # 7:賢者 が使用されているかのフラグ

class Deck:
    def __init__(self):
        self.deck = ['10:英雄',
                    '9:皇帝',
                    '8:精霊',
                    '8:精霊',
                    '7:賢者',
                    '7:賢者',
                    '6:貴族',
                    '6:貴族',
                    '5:死神',
                    '5:死神',
                    '4:乙女',
                    '4:乙女',
                    '3:占い師',
                    '3:占い師',
                    '2:兵士',
                    '2:兵士',
                    '1:少年',
                    '1:少年']

    def Rein(self): # 転生札を引く操作
        reincarnation.append(self.deck[-1])
        self.deck.remove(self.deck[-1])

    def shuffle(self): # シャッフルを行う操作
        import random
        random.shuffle(self.deck)

    def draw(self, turn): # ドローを行う操作
        drawed = self.deck[0]
        if turn:
            p1_hands.append(drawed)
        else:
            p2_hands.append(drawed)
        self.deck.remove(drawed)
    
    def sage_draw(self, turn=turn): # 7:賢者 の効果によりドローを行う操作
        def draw(trun, d):
            if turn:
                hands = p1_hands
            else:
                hands = p2_hands
            hands.append(d)
            self.deck.remove(d)

        for i in range(3):
            try:
                pass
            except:
                pass
        d1 = self.deck[0]
        d2 = self.deck[1]
        d3 = self.deck[2]
        print('7:賢者 の 効果 が 適用 されています')
        print('以下から一枚を選んでください')
        print('1\t', d1)
        print('2\t', d2)
        print('3\t', d3)
        val = input()
        if val == '1':
            draw(turn, d1)
        if val == '2':
            draw(turn, d2)
        if val == '3':
            draw(turn, d3)

def Card(name, deck): # カードを使用して効果を適用し、手札から捨てるまでの操作

    def Hero(deck):
        pass

    def Emperor(deck):
        global game_end

        def emperor_turn(turn):
            global game_end
            if turn:
                hands = p1_hands
                player = 1
                opp_hands = p2_hands
                opp_player = 2
            else:
                hands = p2_hands
                player = 2
                opp_hands = p1_hands
                opp_player = 1

            if '10:英雄' in p2_hands:
                    print('プレイヤー', opp_player, 'が 10:英雄 を 持っていました\nプレイヤー1 の 勝ちです')
                    game_end = True
            else:
                print('プレイヤー', opp_player, 'が', opp_hands[0], 'を 捨てました')
                print('プレイヤー', opp_player, 'は 転生札 を 引きます')
                cemetery.append(opp_hands[0])
                opp_hands.clear()
                opp_hands.append(reincarnation[0])
                print('プレイヤー', opp_player, 'は', opp_hands[0], 'を 引きました')
                reincarnation.clear()

        if maiden:
            print('4:乙女 の 効果 に よって 無効 に なりました')
        else:
            emperor_turn(turn)

    def Spilit(deck):
        if maiden:
            print('4:乙女 の 効果 に よって 無効 に なりました')
        else:
            print('手札を交換します')
            exchanged1 = p1_hands[0]
            exchanged2 = p2_hands[0]
            p1_hands.clear()
            p2_hands.clear()
            p1_hands.append(exchanged2)
            p2_hands.append(exchanged1)
            print('プレイヤー 1 の 手札は\t', p1_hands)
            print('プレイヤー 2 の 手札は\t', p2_hands)

    def Sage(deck):
         global sage
         sage = True

    def Aristocrat(deck):
        global game_end
        if maiden:
            print('4:乙女 の 効果 に よって 無効 に なりました')
        else:
            print('プレイヤー 1 が', p1_hands[0], 'を 出しました')
            print('プレイヤー 2 が', p2_hands[0], 'を 出しました')
            if dict_card[p1_hands[0]] > dict_card[p2_hands[0]]:
                print('プレイヤー 1 の 勝ち です')
            if dict_card[p1_hands[0]] < dict_card[p2_hands[0]]:
                print('プレイヤー 2 の 勝ち です')
            if dict_card[p1_hands[0]] == dict_card[p2_hands[0]]:
                print('ゲーム は 引き分け です')
            game_end = True

    def Reaper(deck):
        if maiden:
            print('4:乙女 の 効果 に よって 無効 に なりました')
        else:
            if turn:
                discard = p2_hands[0]
                cemetery.append(discard)
                p2_hands.clear()
                print('プレイヤー 2 は', discard, 'を 捨てました')
                deck.draw(not(turn))
            else:
                discard = p1_hands[0]
                cemetery.append(discard)
                p1_hands.clear()
                print('プレイヤー 1 は', discard, 'を 捨てました')
                deck.draw(not(turn))

    def Maiden(deck):
        global maiden
        maiden = True
        pass

    def Soothsayer(deck):
        if maiden:
            print('4:乙女 の 効果 に よって 無効 に なりました')
        else:
            if turn:
                print('3:占い師 の 効果 に より プレイヤー 2 の 手札 が 公開 されます')
                print('プレイヤー 2 の 手札 は', p2_hands[0])
            else:
                print('3:占い師 の 効果 に より プレイヤー 1 の 手札 が 公開 されます')
                print('プレイヤー 1 の 手札 は', p1_hands[0])

    def Soldier(deck):
        global game_end
        list_card2 = list_card[::-1]
        if maiden:
            print('4:乙女 の 効果 に よって 無効 に なりました')
        else:
            print('相手プレイヤー の 手札 を 1~10 の 番号 で 言い当ててください')
            while True:
                val = input()
                try:
                    val = int(val)
                    if 0 < val < 11:
                        if turn:
                            if int(val) == list_card2.index(p2_hands[0]) + 1:
                                print('プレイヤー1 は プレイヤー2 の 手札 を 言い当てました!')
                                print('プレイヤー1 の 勝利 です')
                                game_end = True
                            else:
                                print('プレイヤー1 は プレイヤー2 の 手札 を 言い当てられませんでした…')
                        else:
                            if int(val) == list_card2.index(p1_hands[0]) + 1:
                                print('プレイヤー2 は プレイヤー1 の 手札 を 言い当てました!')
                                print('プレイヤー2 の 勝利 です')
                                game_end = True
                            else:
                                print('プレイヤー2 は プレイヤー1 の 手札 を 言い当てられませんでした…')
                        break
                    else:
                        print('1~10の整数値を入力してください')
                except:
                    print('1~10の整数値を入力してください')

    def Boy(deck):
        if maiden:
            print('4:乙女 の 効果 に よって 無効 に なりました')
        else:
            if '1:少年' in cemetery:
                if turn:
                    if '10:英雄' in p2_hands:
                        print('プレイヤー2 が 10:英雄 を 持っていました\nプレイヤー1 の 勝ちです')
                        game_end = True
                    else:
                        print('プレイヤー2 が', p2_hands[0], 'を 捨てました')
                        print('プレイヤー2 は 転生札 を 引きます')
                        cemetery.append(p2_hands[0])
                        p2_hands.clear()
                        p2_hands.append(reincarnation[0])
                        print('プレイヤー2 は', p2_hands[0], 'を 引きました')
                        reincarnation.clear()
                else:
                    if 'Hero' in p1_hands:
                        print('プレイヤー1 が 10:英雄 を 持っていました\nプレイヤー2 の 勝ちです')
                        game_end = True
                    else:
                        print('プレイヤー1 が', p2_hands[0], 'を 捨てました')
                        print('プレイヤー1 は 転生札 を 引きます')
                        cemetery.append(p1_hands[0])
                        p1_hands.clear()
                        p1_hands.append(reincarnation[0])
                        print('プレイヤー2 は', p2_hands[0], 'を 引きました')
                        reincarnation.clear()
            else:
                print('あなたは1枚目の1:少年を使用したため、効果は発動しません')

    effect_list = [Hero, Emperor, Spilit, Sage, Aristocrat, Reaper, Maiden, Soothsayer, Soldier, Boy]

    # カードを場に出す
    if turn:
        p1_hands.remove(name)
    else:
        p2_hands.remove(name)

    # 効果を適用する
    effect_list[list_card.index(name)](deck)

    # カードを墓地に送る
    cemetery.append(name)

def main():
    global turn
    global game_end
    global maiden
    global sage
    maiden_count = 0 # 4:乙女の効果がターンをまたぐのでその処理用

    def turn_progress(turn):
        global sage
        sage_count = 0 # 7:賢者の効果がターンをまたぐのでその処理用
        if turn:
            hands = p1_hands
            player = 1
        else:
            hands = p2_hands
            player = 2

        print('プレイヤー',  player, 'の ターン です')
        if sage:
            if sage_count == 1:
                deck.sage_draw(turn)
                sage_count = 0
                sage = False
            elif sage_count == 0:
                sage_count += 1
                deck.draw(turn)
        else:
            deck.draw(turn)
        print('プレイヤー', player, 'の 手札 は')
        print(1, '\t', hands[0])
        print(2, '\t', hands[1])
        print('番号を選択して、どちらを使用するかを選択してください')
        print('墓地 を 確認 するには cemetary を 入力 してください')
        while True:
            val = input()
            if val == '0':
                print(cemetery)
            elif val == '1':
                if hands[0] == '10:英雄':
                    print('10:英雄 は 場 に 出すことが できません')
                else:
                    Card(hands[0], deck)
                    break
            elif val == '2':
                if hands[1] == '10:英雄':
                    print('10:英雄 は 場 に 出すことが できません')
                else:
                    Card(hands[1], deck)
                    break
            elif val == 'DEBUG':
                print('='*20)
                print('DEBUG MODE')
                print(deck.deck)
                print(p1_hands)
                print(p2_hands)
                print(cemetery)
                print('='*20)
            else:
                print('正しい値を入力してください')

    print("GAME START")
    deck = Deck()
    deck.shuffle()
    deck.Rein()
    print("転生札が設定されました")
    # print("DEBUG 転生札は", reincarnation[0])
    print("山札からカードを引きます")
    deck.draw(True)
    deck.draw(False)
    print("プレイヤー1 の 手札 は",p1_hands)
    print("プレイヤー2 の 手札 は",p2_hands)

    count = 0

    while True: # ターン進行
        print('-'*20)
        count += 1
        print('TURN', count)
        print('山札の残り枚数:', len(deck.deck))

        if not(deck.deck): # デッキ切れの場合の処理
            game_end = True
            print("デッキ枚数 が 残り 0枚 に なりました")
            print('プレイヤー の 手札 に よる 勝負 を 行います')
            print('プレイヤー 1 が', p1_hands[0], 'を 出しました')
            print('プレイヤー 2 が', p2_hands[0], 'を 出しました')
            if dict_card[p1_hands[0]] > dict_card[p2_hands[0]]:
                print('プレイヤー 1 の 勝ち です')
            if dict_card[p1_hands[0]] < dict_card[p2_hands[0]]:
                print('プレイヤー 2 の 勝ち です')
            if dict_card[p1_hands[0]] == dict_card[p2_hands[0]]:
                print('ゲーム は 引き分け です')
            game_end = True

        turn_progress(turn)

        if maiden: # 4:乙女の効果の処理
            if maiden_count == 1:
                print('4:乙女 の 効果 が 切れました')
                maiden = False
                maiden_count = 0
            else:
                maiden_count += 1


        if game_end: # ゲーム終了判定
            break

        turn = not(turn) # ターンの交代

if __name__ == "__main__":
    main()
~

問題点

ゲーム内容での問題点

  • そもそも対戦ゲームの体をなしていない
  • 2人対戦にしか対応していない
  • 乙女や賢者が連続で使用されたときの処理ができない
  • 騎士のナーフに対応していない

az-master.jp

コーディングでの問題点

  • ターンでの場合分けを多用しているのがまったくもってスマートじゃない
  • そもそもクラスの勉強をしたくてコードを書いたのだが、カードの効果は関数で書いてしまった上に、グローバル変数を多用しているのがあまり気に入らない
  • その他、行数を節約できる箇所が(多分絶対)多々ある

なにかアドバイスを頂けると幸いです

うまくいかない

最近、いろんなことがうまく行っていない。

 

何がうまく行っていないのか、なぜうまく行っていないのかをここに吐露することによって、精神の安定を図る。

 

①生活リズムが安定していない

寝る時間、起きる時間、食生活などなど、すべてがばらばらである。

なかなか寝付けないし、夜中何回も起きてしまうし、寝起きの気分も最悪である。

しっかりと対策しないといけないことなんだけど、具体的な解決案が浮かばない。

病院にでも行ってみようかな…。

食生活にしても、健康的な食事がなかなかできていない。これに関しては自力でなんとかなる気がする。

 

②対人関係がうまく行っていない

これは、かなりのバイアスがかかっているとは思う。

思うのだが、やっぱりうまく行っていない気がする。

ここに具体的なことを書くと、方々の悪口になってしまうので書かない。

うーん、こうやってどこにも相談相手がいないこともストレスの要因になっているのかも。

 

③勉強がうまく行っていない

これは単にやる気の問題ではあると思う。

勉強しなきゃ。

 

 

こう書いてみると、ちっとも具体的な解決方法を自分に提案できていないなぁ。

具体的な解決方法を書いてもいいんだけど、書いたらそれを絶対にやらなきゃいけない気がして、一層いやな気分になってくる。負のサイクルだ。

でもやっぱり、しっかりやることを書かないと、きっとやらないと思うので、書こう。

 

当面の目標

  • Python3の勉強。一日一章を目安に。
  • 力学と電磁気学の勉強。

 

だめだ。具体的なことは思いつくんだけど、きっとできないなってなってしまう。

思ったより深刻かも。

とりあえずは電通大の院試ときます。

クロージャ?ジェネレータ?

今日は、Python3について本格的に勉強を進めた。
その際、クロージャやらジェネレータやら、難解な用語が出てきたので、復習の意味も込めて、ここにまとめることにする。

教科書:「入門Python3」

入門 Python 3

入門 Python 3

  • 作者:Bill Lubanovic
  • 発売日: 2015/12/01
  • メディア: 単行本(ソフトカバー)


クロージャ(関数閉方)

クロージャとは、関数内関数の機能の1つで、その関数より外側の変数を記憶したり、変更したりすることができる。

def func(): # これがエンクロージャ
    x = 5
    def add(y): #これがクロージャ
        return y+x
    return add

f = func()
print(f(4))


xはfunc関数内で定義されたローカルな変数だが、クロージャを生成したことでxがadd関数内に記憶され、f(4)を呼び出した際にxが加算される、という仕組みになっている。

参考:
【Python】クロージャ(関数閉方)とは - Qiita


これ以上のことはよく分からなったし、正直これにどんなご利益があるかもわかっていない。今後の課題。


ジェネレータ

ジェネレータとは、シーケンス全体をメモリに格納するのではなく、その場その場の反復処理でシーケンスを生成するオブジェクトである。
普通、リストや辞書は全体がメモリに記憶されるが、そこまでメモリを確保できなかったり、最後まで取っておく必要がない場合は、こちらを使ったほうがいい場合もある。
また、通常の関数とは異なり、どこまでをジェネレートしたかを覚えているため、同じ命令をしても異なる挙動をみせることがある。

range()などは典型的なジェネレータである。
「入門Python3」では、range()を再現するコードが載っていた。

def my_range(first 0, last=10, step=1):
   number = first
   while number < last:
      yield number #returnではなくyieldするのがジェネレータ
      number += step

使用するには

ranger = my_range(1,5)
for x in ranger():
   print(x)
#1
#2
#3
#4
#5
# もう1回処理してもなにも起こらない
for x in ranger:
    print(x)


まあ、これについても、今の所使わなくて困っていないので、必要に迫られたら本格的に覚えようと思う。



その他覚えた便利なメソッド

  • デコレータ…関数の挙動を制御することができる
  • 内包表記…非常にPythonicな表記。リストなどの内部にfor文、if文を書くことによって簡単に要素を生成できる。
  • tryとexpect…エラーを回避できる。しかしよくわからない。

今日やったこと

明日やりたいこと

  • 「入門Python3」の第5, 6章

無題、あるいは無題であることの反省

無題。

すなわち、今日は特に感じたこと、もっと言えば「ブログ書きたい」と思ったことがなにもないということを意味している。

 

まったくもって反省すべきことである。

 

忙しかったり、最近諸々の事情で精神的に不安定であることも影響してはいるのだが、それでも、1日の中で何か言語化したいことを見つけるのは大事だと思う。

 

自分を取り巻く世界に対して敏感であれ。

 

あるいは、「特に何も感じない時間」を過ごしてしまったとも言える。

特に見たくもないYouTubeの動画をザッピングしてしまったりだとか、ご飯を食べてすぐ寝てしまったりだとか。

 

密度の薄い時間を過ごしてしまった。反省である。

 

 

今日やったこと

  • 信州大学大学院の過去問のゼミを行った。自分ができていると思っていた問題でも、別解を見つけたり、しょうもないミスをしてしまったことに気がつくことができた。
  • 研究成果報告書を書いた。書いたことがないのでかなり苦戦した。
  • 「Python3入門」の4章の前半を学習した。Pythonicなコードの書き方に驚かされた。内包表記って便利だなあ。

 

明日やりたいこと

  • 「Python3入門」の4章の後半を学習する。
  • 必ず1回は外に出る。散歩する。
  • 電通大学の大学院入試を少しずつとき始める。

365×1ではなく1×365

「明日からやろう」と
40回言うと、夏休みは終わります。 

 

これは有名な予備校「Z会」のキャッチコピーである。

 

これをはじめて見かけたとき、なんというか、感銘を受けた。

「夏休みは40日あります」と聞くと、莫大な時間があって、なんでもやれそうな気がしてくる。しかし、人間莫大な時間があっても、なかなか大それたことはできない。

時間があることは、必要条件であって十分条件ではないのである。

 

「2021年の抱負は?」

と質問されたとき、ついつい「365日」という莫大な時間を想像して、なんでもできそうな気がしてくる。ので、大それたことを言ってしまう。

 

そんなことはない。

 

365日が1回来るのではない。

1日が365回来るだけだ。

 

1日というのは短いものである。

 

なんとなく布団でスマホをいじっていたら昼が過ぎ

遅い朝ごはんを食べてYouTubeを見ていたら日が沈み

そろそろ勉強しないとと思って勉強を始めるがなかなか集中できず

気がつけば夜は更け、「あーあ。今日何もやってないな」と嘆く。

 

これが365回続けば1年が終わってしまう。

 

こうしないためにも、

 

① 具体的かつ時間制限のついた目標を立てる

 

② 目標のための行動を習慣化する

 

③ 1日の終わりや1週間の終わりにフィードバックを行う

 

などが大事になってくる。

 

ということで、新しいコーナーを開設します。

 

今日やったこと

H30年信州大学大学院物理学ユニットの過去問を解いた。

http://azusa.shinshu-u.ac.jp/~yonupa/nyushi/2018_masterII_physics.pdf

力学の剛体の問題が難しかった。剛体を解析力学を用いて解く、といった内容の問題はあまり解いたことがないため、苦労を要した。

電磁気学の問題では、ベクトルポテンシャルの扱いをすっかり忘れており、復習が必要だと感じた。

量子力学の問題は非常に簡単ではあったものの、終盤の答えに詰まってしまった。

熱・統計力学の問題は簡単だった。

第1回1人暮らし食料会議

ここ半年、コンビニ弁当や外食ばっかりになってしまい、金銭面でも健康面でも良くない生活を送ってしまっている。

 

という訳で、

・外食やコンビニ弁当よりも安く済ますことができ

・比較的健康的で

・手間がかからない

食材や調理方法を考えていきたいと思う。

 

一応、最近では、鍋や豚汁を作って食べることはしていたのだが、いかんせん調理が面倒なのと、肉を使ってしまうとコスパが悪くなってしまうという理由から、最近では作らなくなってしまった。あと、一人暮らしで一気に料理すると、際限なく食べてしまうというデブ特有の理由もある。

 

一応、ベンチマークとして、僕が数回作った豚汁について分析を行う。

 

<材料と値段>

(いずれも有効数字一桁程度)

・ブラジル産豚こま肉大パック 400円

・大根 1/2本 100円

ごぼう 1本 100円

・にんじん 1本 80円

・キャベツ 1/4玉 80円

・こんにゃく 1パック 100円

合計 900円弱

 

これを1日で平らげるので、大体1食あたり300円である。

あれ、思ったよりも安い。面倒くさい調理さえすればこんなもんなのか…。

 

 

そして、使っていきたい食材は以下の通り。

・卵……最強のコスパフードにして完全栄養食。1個あたり20円。

・納豆……栄養満点かつそのまま食べられる。1パックあたり30円。

・ビタミンちくわ……近所のSEIYUで売っている。3本で80円。そのまま食べられる。

・米……実家などから無限に供給される。コスパや手間の少なさが相まって最強に見えるが、食い過ぎて太る。チャーハン食い過ぎ、ダメ、絶対。

・キャベツ……炒めものや味噌汁に。サラダではなかなか食べないので挑戦してみたい。半玉80円。

・食パン……チーズトーストが最強に美味しい。が、そこまでコスパは良くない。体感、500円のとろけるチーズが大体6枚切×3で消費されることを考えると、6枚切チーズトースト1枚あたり80円。これを2枚一度に食べるので160円。まあでも、外食よりは遥かにマシである。

 

自分でまとめてみて、かなり参考になった。

1日1000円に食費を抑えたいので、1食にかけられる食費は300円ということになる。そこで、300円を目標に、上のデータを参考にしつつ食事スタイルを確立していきたい。