Zoomにおける挙手の有用性
メモ程度に。
先日、就職活動の一貫としてとある企業の説明会にZoomで参加した。
その際「〇〇について知っている人は挙手ボタンをクリックしてください」という指示を受けた。
その時は、「挙手させたところで、聴衆の理解度に応じた説明の使い分けなんてしないんだから(事実そうだった)、主催者側の自己満にしかならないことさせるのやめてほしいなぁ。」という感想を持ったのだが、実は、けっこう有用なテクニックだったのではないか、と後から思った、という話。
というのも、挙手というアクションを参加者各位に取らせることにより
- 〇〇について知ってる人は「ああ、いまから〇〇について話すのか」という風に、聞く準備ができる
- 〇〇について知らない人は「〇〇なんて知らないぞ、注意して聞こう」という風に、傾聴することができる
という利点があることに、今更ながら気づいた。
これはZoomの挙手に限ったことではなく、オンサイトの説明会でも有用だと思う。
XENO(カードゲーム)をPythonで作ってみる
PythonでXENO(カードゲーム)を作ってみた。
作ってみたとは言っても、あくまで仕組みを作っただけで、対戦などはできない。
XENO公式ルール
コード
~ 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() ~
問題点
うまくいかない
最近、いろんなことがうまく行っていない。
何がうまく行っていないのか、なぜうまく行っていないのかをここに吐露することによって、精神の安定を図る。
①生活リズムが安定していない
寝る時間、起きる時間、食生活などなど、すべてがばらばらである。
なかなか寝付けないし、夜中何回も起きてしまうし、寝起きの気分も最悪である。
しっかりと対策しないといけないことなんだけど、具体的な解決案が浮かばない。
病院にでも行ってみようかな…。
食生活にしても、健康的な食事がなかなかできていない。これに関しては自力でなんとかなる気がする。
②対人関係がうまく行っていない
これは、かなりのバイアスがかかっているとは思う。
思うのだが、やっぱりうまく行っていない気がする。
ここに具体的なことを書くと、方々の悪口になってしまうので書かない。
うーん、こうやってどこにも相談相手がいないこともストレスの要因になっているのかも。
③勉強がうまく行っていない
これは単にやる気の問題ではあると思う。
勉強しなきゃ。
こう書いてみると、ちっとも具体的な解決方法を自分に提案できていないなぁ。
具体的な解決方法を書いてもいいんだけど、書いたらそれを絶対にやらなきゃいけない気がして、一層いやな気分になってくる。負のサイクルだ。
でもやっぱり、しっかりやることを書かないと、きっとやらないと思うので、書こう。
当面の目標
- Python3の勉強。一日一章を目安に。
- 力学と電磁気学の勉強。
だめだ。具体的なことは思いつくんだけど、きっとできないなってなってしまう。
思ったより深刻かも。
とりあえずは電通大の院試ときます。
クロージャ?ジェネレータ?
今日は、Python3について本格的に勉強を進めた。
その際、クロージャやらジェネレータやら、難解な用語が出てきたので、復習の意味も込めて、ここにまとめることにする。
教科書:「入門Python3」
- 作者: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…エラーを回避できる。しかしよくわからない。
無題、あるいは無題であることの反省
無題。
すなわち、今日は特に感じたこと、もっと言えば「ブログ書きたい」と思ったことがなにもないということを意味している。
まったくもって反省すべきことである。
忙しかったり、最近諸々の事情で精神的に不安定であることも影響してはいるのだが、それでも、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円を目標に、上のデータを参考にしつつ食事スタイルを確立していきたい。