粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

Atcoder173反省会(Bit全探索,strからchar変換,etc)

Python使用者です。慣れたらC++の訓練所としても用いたいなぁと思ってます,

Atcoder173所感

atcoder.jp

  • 数え方にまつわる問題が多い?A~Dを解いた。
  • C:全探索
  • D:中学入試っぽいパズル問題

20分遅れで始めたがギリギリ4問解けた。E,Fが時間内に解ける日は遠そう…

各設問の反省や学習事項

C:Bit全探索

maskを作成してnumpyで行列のAndを*演算子で取る手法を思いついた。OpenCV脳である。

自分的には初めてBit全探索を行った。正攻法ならitertoolsを使うらしい。

Pythonでお手軽にbit全探索を行う方法【itertoolsを使おう!】 | プログラミングの教科書

itertools.product( “候補となるオブジェクトの集合”, “選ぶ回数” )で書けるため以下のように簡単にできる。

print(list(itertools.product([0,1], repeat=2)))
#[(0, 0), (0, 1), (1, 0), (1, 1)]

今回,itertools.product([0,1], repeat=W)などと書けば簡単にBit演算表が作れていた。

2進数変換を用いたBit全探索

試験中はググる前に自分で書けそうなので自分で書いた。(時間がかかった)

大枠としては以下の通り。

for h in range(2 ** H):
    for w in range(2 ** W):
        # 各要素1 or 0 のiteratorリストを作る#ループさせる関数

iterのリストの作り方

hやwが特定の値の時にその値をH桁,W桁の2進数表記リストにしたかった。

hが3,Hが4の時 [0,1,1,1]のような出力が欲しい。

用いた要素は以下の3つ。

  • bin():2進数表記へ変換する関数。0b~~のstrで値を出してくる。
  • zfill(n):strの先頭をn桁になるまで'0'で埋めてくれる関数
  • split:'10010'みたいなstrを数のリスト[1, 0, 0, 1, 0]に変換する自作関数

まず,文字列を得るには:

# 7を4桁の2進数にする。binの後ろ二桁を抜き出して桁数に会うように0でfill
w0b = bin(7)[2:].zfill(4)

その後,

# splitは予約されていることが多いので関数名は別にするのが良い。
def split(word): 
    return [int(char) for char in word]  

# we got [0,1,1,1]
split(w0b)

余談:Str から Charの変換で沼った

for文で抜き出すか,iterで一個一個読むか? 後で考える。

D

ひらめき問題だったので今のとこ特に書くことなし。

  • .sort()は元の関数の順序を変えるので使わない
  • sortは基本昇順だがsorted(A, reverse=True)のように書けば降順になる
  • 復習:ソートの計算量はNlogN

Python Numpyを用いてナップザック問題をDPで解く(Atcoder例題)

Pythonでナップザック問題どうやって解くんだっけ?というときに参照するページです。 Atcoderなどリアルタイム性が必要なときはC++かPyPyで実装すること(戒め)

ナップザック問題説明

省略。Wikiとかを見てください。アルゴリズムの理解は以下の記事がわかりやすいと思います。

qiita.com

Atcoder問題例

2020年6月13日に行われた東京海上主催のAtcoderのD問題のために書き起こしました。

atcoder.jp

なお,私は Pythonでの高速化に失敗しTLEを連発し敗北しました。

解決策として Numpyを使いながらjitなどで高速化するか,Numpyを廃してPyPyで実装するか,C++に乗り換えるかしましょう。

PythonのDPコード Numpy有

入力は4つ,今回は入力は全て正の整数とします。唯一価値だけは非整数でも大丈夫です。

  • N:品物の数
  • W:重さの制限
  • weight:価値のリスト
  • weight:重さのリスト
def solveDP(N, W, value, weight):
    dp = np.zeros((N+1, W+1))
    
    for i in range(N):
        for w in range(W+1):
            if w >= weight[i]:
                dp[i + 1, w] = max(dp[i, w - weight[i]] + value[i], dp[i, w])
            else:
                dp[i + 1, w] = dp[i, w]
    
    return dp[N , W]

PythonのDPコード Numpyなし

以下のサイトから拝借しました。

Pythonで解くナップサック問題【動的計画法(DP)入門】 - nashidos’s diary

やってることは全く同じです。ただ,こちらはNumpyを使わないのでPyPyでも使えるという利点があります。 Atcoderではこちらを使いましょう(涙)。

def solveDP(N,W,v,w):
    dp = [[0]*(W+1) for j in range(N+1)] # DPテーブルの作成

    for i in range(N):
        for j in range(W+1):
            if j < w[i]: # 選ばない時
                dp[i+1][j] = dp[i][j]
            else: # 選ぶ時
                dp[i+1][j] = max(dp[i][j],dp[i][j-w[i]]+v[i])
                
    return dp[N][W]

ちなみに6/13に行われたこのコンテスト,Python勢には辛かったらしく,PythonでC問題を通したのが3人,Dが1人でした。

Pythonはプレミ。

ベイズの定理を用いてカルマンゲインを導出する(行列版)

Background

カルマンフィルタにはたくさんの導出がありますが, 自分的には大まかに以下の2つのパターンを把握していれば実用上は十分だと考えています。

(なお超初心者の場合はとりあえずコードを書いて動かして見た方が理解しやすいと思います。)

  1. 制御工学のオブザーバから入る方法
  2. ベイズの定理(ベイズフィルタ)から導く方法

オブザーバから導出するパターン

前者の例として,足立先生の「カルマンフィルタの基礎」をおすすめします。

カルマンフィルタの基礎

カルマンフィルタの基礎

ネタバレすると,証明は線形の(濾波型)オブザーバを設計し,ガウス分布で表される誤差が線形に伝搬する性質を用いて推定後の共分散を最小化するオブザーバゲインKを求める(平方完成)となっています。

似たアプローチとして超平面に垂線をおろす図形的なアプローチが合った気がしますが忘れてしまいました… 思い出したら書きます。

ベイズの定理から導くパターン

こちらは「確率ロボティクス」の書籍を見ると詳しくわかると思います。

以下のベイズの定理と,


p(x|z) = \dfrac{p(z|x)p(x)}{p(z)}

ガウス分布


f(x)=\frac{1}{(\sqrt{2 \pi})^{n} \sqrt{|\Sigma|}} \exp \left(-\frac{1}{2}(x-\mu)^{\mathrm{T}} \Sigma^{-1}(x-\mu)\right)

の式から導出できます。

ssk0109.hatenablog.com

ベイズの定理から多変数カルマンフィルタのゲインを導出

確率ロボティクスに倣って導出します。 基本的な流れは先程のブログとほぼ同じです。書きやすいように表記を少しいじっていますが,恐らく意味を大きく損なわないと思います。

前提

とりあえずよく見る線形状態方程式を仮定します。


x_{n+1}=Ax_{n}+Bu_{n}+\omega \\
y_{n} = Cx_{n}+\nu

 \omega,\nuはそれぞれシステムノイズと観測ノイズでその分散は, R,Qとします。

予測

予測にはベイズの定理を使いません。

nステップでの推定値の分布の平均を \mu_n 分散 P_nとすると, 予測値の分布の平均 \hat \mu_nと分散 \hat P_nは,


\hat P_n = P_{n|n-1} = A P_{n-1} A^\top + R\\ 
\hat \mu_n = \mu_{n|n-1} = A \mu_{n-1} + B u_n

となります。

計測更新

ベイズの定理から予測における推定値 \hat xとセンサ出力 yの分布からセンサ情報を考慮したときの推定値の分布 p(x|y)がわかります。


p(x|y) = \dfrac{p(y|\hat x)p(\hat x)}{p(y)} = \eta p(y|\hat x)p(\hat x)



ここで, \hat xは平均 \hat \mu_nと分散 \hat P_nガウス分布なので,


p(\hat x)=\lambda_1 \exp \left(-\frac{1}{2}(x_n-\hat \mu_n)^\top \hat P_n^{-1}(x_n-\hat \mu_n)\right)

また,観測の分布は


p(y|\hat x)=\lambda_2 \exp \left(-\frac{1}{2}(C x_n- z_t)^\top Q^{-1}(C x_n- z_t)\right)

と表せます。



したがって,ベイズの定理を用いてこれらをかけ合わせた場合の推定値の確率分布は


p(x|y) = \eta \lambda_1 \lambda_2 \exp \left(-\frac{1}{2}(C x_n- y_n)^\top Q^{-1}(C x_n- y_n) - \frac{1}{2}(x_n-\hat \mu_n)^\top \hat P_n^{-1}(x_n-\hat \mu_n) \right)

となります。

このexpの肩が極小値になる時がガウス分布の極大,すなわち分布の平均値,つまり最尤値になるので,


J = \frac{1}{2} \left( (C x_n- y_n)^\top Q^{-1}(C x_n- y_n) + (x_n-\hat \mu_n)^\top \hat P_n^{-1}(x_n-\hat \mu_n) \right)

が極大となる x_nを求めます。


一回微分して=0の条件から,


\dfrac{\partial J}{\partial x_n} \times 2 = C^\top (Q^{-1}+ Q^{-1} {}^\top) (C x_n- y_n) + (\hat P_n^{-1}+ \hat P_n^{-1} {}^\top ) (x_n - \hat \mu_n) = 0

よって共分散行列は対称行列より


C^\top Q^{-1}(C x_n- y_n) + \hat P_n^{-1}(x_n-\hat \mu_n) = 0

したがって推定値の平均は,


x_n = (C^\top Q^{-1}C +\hat P_n^{-1})^{-1} (C^\top Q^{-1}y_n+\hat P_n^{-1}\hat \mu_n)



また,分散はJの二階微分から明らかで,


P_n =  C^\top Q^{-1}C +\hat P_n^{-1}

となります。

式変形によるカルマンゲインの導出

先程の展開からカルマンゲイン K


x_n = \hat x_n + K (y_n - C  \hat x_n)

を満たすので,係数比較から以下のように導けます。


K =  (C^\top Q^{-1}C +\hat P_n^{-1})^{-1} C^\top Q^{-1}



見慣れた形と違いますね?この式に右から (C\hat P_n C^\top +Q)(C\hat P_n C^\top +Q)^{-1}をかけて整理することでよく見るカルマンゲインの式が得られます。


K =  (C^\top Q^{-1}C +\hat P_n^{-1})^{-1} C^\top Q^{-1}(C\hat P_n C^\top +Q)(C\hat P_n C^\top +Q)^{-1} \\
= (C^\top Q^{-1}C +\hat P_n^{-1})^{-1}(C^\top Q^{-1}C\hat P_n C^\top + C^top) (C\hat P_n C^\top +Q)^{-1}\\
= (C^\top Q^{-1}C +\hat P_n^{-1})^{-1}(C^\top Q^{-1}C + \hat P_n^{-1}) \hat P_n C^\top(C\hat P_n C^\top +Q)^{-1}\\
= \hat P_n C^\top(C\hat P_n C^\top +Q)^{-1}

長くなりましたが,これが確率ロボティクスの教科書に倣ったベイズの定理からのカルマンゲインの導出になります。

教科書のほうが丁寧なのでそちらを参照していただければと思いますが,研修中や電車の中など時間のあるときに自分で1から計算することで理解がより深まるのではないかと思います。

余談

はてなTex記法

はてなブログTex記法を書こうとすると通常の書き方から大きく変えることが多かったため,回避策として以下のブログを参考にしました。

7shi.hateblo.jp

親知らずなど抜歯後にも噛まずに食べられるもののおすすめリスト

先週末に下の埋没した親知らずを手術によって取り出しました。 はっきりいって人生1,2を争う痛さです。フガフガ。


親知らず抜歯後の食事

親知らずの抜歯,痛いですよね。

www.oho-dent.com

親知らず抜歯後の食事を妨げる要因として以下の2つが考えられます。

  • 顎の痛みがひどくて噛んだり飲んだりが難しい
  • 出血によって食べ物が血の味がする

無論,抜いた歯の状況(上顎か下顎か,埋没しているかどうか)によって抜歯後の状況は変わってきます。 一応参考までに載せます。

上顎・非埋没歯

上顎の非埋没歯の抜歯はあまり痛みを感じず,すぐに抜くことができます。

痛みも一時的で出血も1日程度で止むため2,3日すれば通常復帰できます。

私は抜いた日の晩にはラーメンを食べてました。


下顎・埋没歯

下顎は太い神経が近いため痛みがひどくなりやすく,埋没してる場合は切開なども入るので最悪です。3日間は顔がパンパンに腫れ,痛み止めとともに暮らしました。


母曰く出産の6割程度の痛みだそうです。お母さんたちすご…


ここで最大の問題となるのは抜歯後には痛みなどで噛んで食事をとることができないということです。

特に私の場合,縫合した部分が上の歯に引っかかって少なくとも抜糸までの14日間噛めない生活が続きそうです。


流動食できちんと栄養をとるのは大変!

本来の流動食の定義と少しずれますが,ここでは噛まずに食べれるものを流動食と呼称します。

流動食生活7日目を終えた感想としては,きちんとカロリーを摂取するのがとても大変!ということです。

1日に必要なカロリー・栄養分

1日に最低限必要なカロリーを「代謝で使われる分」だと仮定します。

以下のサイトで説明されていますが標準体型の男性では1500kcal前後のようです。 女性や小柄な方は1200kcalでも良さそうですが,とにかくそれくらい必要なのです。

e-keisan.com

例えばウィダーゼリーやカロリーメイトのゼリー飲料などは100-200kcal程度しかありません。 1日に7~8個飲む必要がありますが,体感なかなかそこまでの量を飲めないと思います。

ゼリーだけで食事をするのは栄養価意外の面でも少しキツイです。(ただ,飲み物を飲んで200kcal取れるのは破格です。)

大塚製薬 カロリーメイト ゼリー アップル味 215g×24袋

大塚製薬 カロリーメイト ゼリー アップル味 215g×24袋

  • 発売日: 2016/05/23
  • メディア: 食品&飲料

なお,筆者は決して少食ではなく二郎系ラーメンが好物でヤサイマシマシを食える程度には胃の容量がある方で,単に食事を全てゼリー飲料に代替するのは結構辛いということだと思います。


流動食 Level1:完全な液体

  • ○:術後すぐに飲める
  • ○:飲みやすい
  • △:味が薄いと血がにじむ
  • ✖:カロリーが取りづらい

牛乳,飲むヨーグルト

最初に手を出したのが牛乳や飲むヨーグルトです。 どちらも,カロリーは60kcal/100ml 程度です。

  • 飲むヨーグルトは甘いので牛乳で割ってラッシー風にすると飲みやすい
  • 牛乳はプレーンなのでミロやココアなど味変がしやすい
  • 味が濃く,出血時も血の味を感じにくい
  • 牛乳だけで最低限の栄養をとろうとすると2L飲まなければ行けない

飲みやすいですがカロリーをとるのが大変です。 この他にもプロテイン飲料や豆乳もこのカテゴリに入ります。

コーンスープ(うらごし)

塩気に飢えていたときに飲んだので非常に美味しかったと印象に残っています。

カップスープや味噌汁も飲みましたが,具材が極力ないものを選ぶ必要があったり飲んでもたいしてカロリーを稼げないものが多かった中でコーンスープは重宝しました。

  • 液体系でカロリーがそこそこある(85kcal/dL)
  • 飲みやすく食事感もある
  • 一週間くらい飲み続けていると流石に飽きる

これは主戦力足り得るので常備しました。

栄養ドリンク・野菜ジュースなど

  • ビタミンなどを摂取するのには良い
  • 甘すぎるのでたくさん飲めない場合が多い
  • 味が濃いので出血してても美味しく飲める
  • 患部にしみる場合があり注意が必要

ジューサーがある人は生搾りのジュースを作っても良いと思います。

これも貴重な栄養源なので常備しました。

カロリーメイト ドリンク

常備その3。

  • 量あたりのカロリーが高く飲みやすい(牛乳の約二倍の効率)
  • ちょっと高い

朝食やちょっとしたエネルギー不足を補うにはもってこいでした。やカ神。


流動食 Level2:ゼリー状の食事

  • ○:食べやすく,一部食べごたえもある
  • ○:栄養価もそこそこ
  • ✖:高いことが多い

ゼリー飲料・ゼリー

ゼリー飲料は飲みやすく,カロリーもそれなりに取れるので最初の方はよくのんでました。

しかし想像以上にゼリーというのは飲みづらいものです。 牛乳を1L飲むのはそう苦ではないですが,ゼリーを1L飲むのはまぁまぁ大変です。

大塚製薬 カロリーメイト ゼリー アップル味 215g×24袋

大塚製薬 カロリーメイト ゼリー アップル味 215g×24袋

  • 発売日: 2016/05/23
  • メディア: 食品&飲料

  • 簡単に食べれる
  • ちょっと高め
  • たくさん食べるのに向いていない

豆腐料理

食べやすさ,味付けの多彩さ,食べごたえ全て◎の無敵超人,それが豆腐料理です。

私が食べてたスンドゥブは200kcal前後ですが,そこに生卵を割り入れることで栄養的にも幾分マシなものができます。

S&B 菜館 スンドゥブチゲの素 辛口 300g×5個

S&B 菜館 スンドゥブチゲの素 辛口 300g×5個

  • 発売日: 2015/08/03
  • メディア: 食品&飲料

  • 食べやすさ,味付けの多彩さ,食べごたえ全て◎
  • これに頼りすぎるかもしれない

甘酒

実家では風邪ひきの時に甘酒に卵を入れて煮込んだものをよく食べてました。 安い缶のやつではダメで,でろっとした濃いものを使ってください。うまいです。高いけど。

  • うまい
  • 高い


流動食? Level3:食事を刻む

  • 汁物の食事などをぐでぐでにするか,刻むなどして食べる

この段階まで来ると流動食?って感じですが食べた中ではワンタンが食べやすかったのでおすすめです。

イメージ画像がないので以下載せますが私が食べたのはチルドのワンタンです。

ワンタン しょうゆ味 32g×12個

ワンタン しょうゆ味 32g×12個

  • メディア: 食品&飲料

まとめ

手間を掛けないなら牛乳系と豆腐料理で凌ぐのが楽そうです。

スムージーやミキサーがあればもうちょっと幅が出て良いかもしれません。

短期決戦における1日の流動食メニュー例

現時点では以下のように落ち着きつつあります。

  • 牛乳系:速攻で飲める優秀なやつ
  • 野菜ジュース系:ビタミン担当
  • スンドゥブ+生卵:栄養補給
  • カロリーメイト(ジュース):足りないカロリーを調整

体調について

1日の摂取カロリーが少ないのでなんかやたら眠くなったり,一気に3キロ位痩せたりしました。俺の筋肉を返せ 多分致命的には悪くなってないはず。

ダイエットにも効果的でしょうが身体を壊しては元も子もないので気をつけて。

https://www.buzzfeed.com/jp/carolinekee/liquid-diets-cleanses-help-lose-weight-1

余談:ディスカバリーチャンネル

関係ないけど飢えといえばエドスタフォードのサバイバルを思い出します。 面白いので是非見てください。

youtu.be

番外編:失敗

お粥など

風邪ひきの定番といえばお粥です。 なんどかチャレンジしましたが,

  • 食えることは食える
  • ✖:血の味がつきやすくそうなると非常にまずい

ということで以後作るのはやめました。

ちねりうどん?

もう少しマシな選択肢として,うどんを細かくしたものをグデグデになるまで煮込むというのがあります。

  • めんつゆなどの濃い味付けで血の味が気になりにくい
  • それでもあんまり量は食べられなかった(~4日目の感想)

8日目とかならもっとガンガン食べれるのかな?

焼き鳥(しかも鶏皮)

途中で油分のカロリーが高いことに気づいて買いましたが,ただでさえ噛むのが大変な鶏皮をどうして噛まずに食えると思ったのか…

判断力の低下には気をつけなくてはいけません。もったいないので包丁で微塵にして飲みました。 ミキサーがあれば手っ取り早くカロリーを摂取できるかもしれませんね。

味は保証しませんが。

ポテチ

ポテチもカロリー面につられて買いました。 堅揚げポテトなんかは一袋500kcalを越す夢のカロリーダイナマイトなので粉状にして摂取するのを検討しましたが口の中をパサパサするので食べにくさもダイナマイト級で断念しました。

唯一味はポテチだったので味だけ見ればかなり良い体験でした。飲み込むまでが食事なんですけどね。

vscode上でマークダウンを使ってスライドを作る。(Marp, Reveal.js)

スライドをいちいちGUIで作るのはだるい,時々よくあることだと思います。

Markdown形式のメモをそのままスライドにする(実際はちょっといじるんだけど)手法について個人的な設定をメモ・紹介します。

Abstract

  • マークダウン形式で簡単に発表資料を作る。
  • 2020年5月現在,Marpがオススメできる。

本記事における環境

ossyaritoori.hatenablog.com

手法紹介・総評・雑感

Markdownでスライドのようなものを作成する手法にはいくつかあります。 例えば以下の記事でもいくつか紹介されてますね。

qiita.com

今回は手元のvscode上で書いてその場でPreviewしたいので以下のものを試しました。

  • Reveal.js:動きがかっこ良く,発表向け。スライドはカスタマイズしないと大味な感じ。
  • Marp:静的なスライド作成。設定がデフォルトでもそこそこ見やすい。

f:id:ossyaritoori:20200520121123g:plain
VScode上でPreviewしたReveal.jsのスライド例。動きの制御も記述できる上に,発表者用ツールも作成可能。

f:id:ossyaritoori:20200520121329p:plain
Marpで作成したスライドのPreview。ほぼデフォルトのものを使用。比率やスライドのカラーリング,図の配置など比較的設定しやすい。

ということでReveal.jsよりも今回はMarpを重点において紹介します。

Marp書き方

Marpの基礎的な文法について述べます。

まずはvscode-marp拡張機能からインストールしてきます。

スライドを構成する最小要素は

---
marp: true
---

# ページ1
`---`でスライド追加

---

# ページ2

です。ここから設定を追加していきます。

現時点での個人設定例

  • themeをgaiaに
  • headerとfooterを追加
  • 16:9に
  • ページナンバーをつける
  • 図を中央に表示
---
marp: true
theme: gaia
header: ''
footer: '@ossyaritoori'

size: 16:9
page_number: true
paginate: true
---

<!-- コメント:画像を中央に配置する centerコマンドを有効に -->
<style>
img[alt~="center"] {
  display: block;
  margin: 0 auto;
}
</style>

一部,個別に見ていきましょう。

スライドのテーマ

デフォルトではスライドのテーマは以下の3つのようです。

  • default: 白色中央寄せ
  • gaia: クリーム色タイトル上部固定(一番使いやすい)
  • uncover: 書式なし

また,サブテーマというものがあり,各ページごとに設定できます。 gaiaの場合はデフォルト含めて4種類あります。

f:id:ossyaritoori:20200520124159p:plain
gaiaのサブテーマ。上からinvert,gaia,lead。

書き方は以下の通り。全体をいじるか,1スライド毎に設定もできます。

<!-- 全体を色反転 -->
<!-- class : invert -->


<!-- 1スライドを色反転 -->
<!-- _class : invert -->

個人的に使えると思ったのは,タイトルを色反転かつ中心揃えにすることで,以下のように書けます。

<!-- タイトル用書式:色反転+中央寄せ -->
<!-- _class : lead invert-->

ページ番号

古い記述ではpage_numberを用いていますが,2020年5月のv0.13.0では, paginate: trueのみでページ番号をFooterの位置に出現させられます。

全体のページ数をカウントして表示するのも欲しいですね。

図を中央に配置する

  • デフォルトでは図は左に配置されます。
  • 改行なしで並べると図は下面を揃えて左右に並びます。

テンプレにある書き方をすることで図を左右中央揃えに制御できます。上下も中央揃えにしたいですね。

図の貼り付け・サイズ調整

図はMarkdown,htmlの両方の記法が使えます。

縦・横を指定して画像を貼る

他の文献では![倍率%](画像url)で画像のサイズ調整ができたようですが,手元のv0.13.0ではまだできません。 代わりに,![w:300](画像URL)と書いています。

元のサイズとの比を見るより横幅などで指定した方がよく見えます(縦指定でも可)。

背景として画像を貼る

また,![bg w:300](画像URL)のようにbgを入れることにより背景画像としても指定できます。 これはデフォルトで中央揃えです。

f:id:ossyaritoori:20200529180349p:plain
画面を左右に分割したときのレイアウト。

また背景と文章を分割することも出来,以下のように書きます。

# 背景 右50%領域に
![bg right:50% cover](sky.jpg)
  • cover(default): 縦か横に合わせる
  • contain(fit):はみ出ないように合わせる
  • auto:オリジナルサイズで貼る

おそらくよくつかうのはcoverかcontainだと思います。

数式

数式はKatex形式をサポートしているようです。 今の所特に語ることはないですが,項目として残しておきます。

サンプルスライド(自分テンプレート)

---
marp: true
theme: gaia
header: 'header text'
footer: '@ossyaritoori'

size: 16:9
paginate: true
---


<!-- コメント:画像を中央に配置する centerコマンドを有効に -->
<style>
img[alt~="center"] {
  display: block;
  margin: 0 auto;
}
</style>

<!-- タイトル用書式:色反転+中央寄せ -->
<!-- _class : lead invert-->


# タイトルスライド

- 日付:名前
- 概要:
    - Issue1
    - Issue2

--- 

## 普通のスライド
- Problem1
- Answer1

こうなります。

f:id:ossyaritoori:20200521191618p:plain
普通に使えそう。使います。

Marpの参考資料

  • 基礎的な文法(vscode版に準拠しておらず,動かないコードもある)

qiita.com

  • Advancedな内容

www.slideshare.net

  • 自分でMarpのThemeをカスタマイズする

blog.okazuki.jp

  • Marpの開発に関わる話

tech.speee.jp

余談:GIF画像をキャプチャするソフト

Reveal.jsの紹介に使った,スクリーンをGIFでキャプチャするソフトです。 結構便利。

www.screentogif.com

オンラインで友人とボードゲームが遊べるボードゲームアリーナをやってみた所感

ボードゲームアリーナとは

という自宅待機民にうってつけのサービスです。 一部人気ゲーム(カルカソンヌ等)は有料ですが,無料のものだけでも十分に楽しむことができると思います。

ボードゲームはセットアップや片付けが大変なので非常に便利です。

f:id:ossyaritoori:20200502205707p:plain
プレミアムでしか卓を建てられないゲーム一覧

同じ様な紹介記事を書いているかたがこちら。

thecongress.hatenablog.com

環境と登録方法

PC版はインストールも不要で非常に便利です。Google連携が楽かなと思います。

  • 動作環境:ブラウザ上で動く(スマホアプリがβリリース中)
  • GoogleFacebookアカウントと連携,もしくはメールアドレスで登録
  • usernameとパスワード決めておしまい!

boardgamearena.com

友達と遊ぶまでに必要なステップ

  1. 友人にアカウントを作ってもらう
  2. 「username」を検索してフレンド追加

でOKです。

ボードゲームアリーナを友達とプレイする方法! - せいたかのっぽの備忘録

(補足)画面共有をすれば1人分のアカウントでもできるかもしれませんが

「今すぐプレイ」から以下のように追加していきます。

f:id:ossyaritoori:20200502213910p:plain
画面上部にこの様なウィンドゥが現れます。

ゲーム画面に移行後,相手が「承認」してくれるのを待ちます。

ゲームを受ける人は,画面上に出てくるポップアップから承認をします。

友人と遊ぶ際の通話環境

プレミアム会員になるとビデオやチャットを使えますが,普通に外部のサービスで通話すればいいです。

使ったことがあるのは以下の通りです。

  • LINE:手軽,大体の人が持っている。
  • Skype:年代によっては結構な人が持っている。
  • Zoom:画面共有がルール解説に非常に便利。近年普及したので持っている人は多いかもしれない。
  • discord:音声通話の品質が高い。あまり使ってる人がいない?

2人ゲーム初プレイ所感

ここから本題ですがいくつかのゲームを2人でやったのでその感想についてレビューしていきます。

なお,筆者のボードゲーム経験は中程度(~30種類程度)である程度ボードゲーム慣れしている側の意見です。

  • 運要素がある程度強いゲームの方が盛り上がりやすい印象
  • ガチガチの戦略ゲームはよほど雑談ができる人じゃないと厳しいかも?

こいこい

  • プレイ時間:30分~(ルールを熟知してるなら半分以下でできる)
  • 難易度:☆

花札のプレイ方法の一種。ルールは任天堂準拠らしいです。

www.nintendo.co.jp

  • 動きと基本的な役を覚えれば良いので簡単です。
  • ただ,ゲームとしては単調寄り。こいこいの駆け引きで頑張って盛り上げてください。

タルギ

  • プレイ時間:60分~
  • 難易度:☆☆☆

商人になって「資源」を集めつつ,得点になる「部族カード」を購入していくゲーム。

f:id:ossyaritoori:20200502224712p:plain
タルギのプレイ画面。中央の3*3のサプライから資源や勝利点を入手していき点数を競うゲーム。

  • ボードゲームによくある設定なので,中級者的にはプレイの難易度は比較的低い
  • 各カードの効果や最終得点のボーナス点など勝敗を左右する要素が非常に多く,最適な立ち回りを考え出すと結構難しくなる
  • どのカードがサプライに置かれるか,山札をめくって入手するなどのランダム要素もある程度あり,やってて楽しかった

それはオレの牧場だ!(Battle Sheep)

  • プレイ時間:~20分
  • 難易度:☆

16匹いる羊を分割していって領地を広げる陣取りゲーム。

f:id:ossyaritoori:20200502233430p:plain

  • 囲碁っぽい。
  • 簡単だけど戦略性が高い。

クアルト

  • プレイ時間:~10分
  • 難易度:☆

相手にコマを選ばせる,複雑化した四目並べ

f:id:ossyaritoori:20200502233700p:plain
4×4のマスで同じ高さ,色,形,穴のある無しでビンゴを作らせないように駒を選ぶ

  • 色,形状などの複数の条件を気にする四目並べ
  • 簡単だけど戦略性が高いっぽい。

キャントストップ

  • プレイ時間:~20分
  • 難易度:☆

サイコロを降ってその和を使って複数のルートからゴールを目指すすごろく?的なゲーム。

f:id:ossyaritoori:20200503001741p:plain
キャントストップのプレイ画面,4つのサイコロから2組の和を選び,該当するマスのコマを進める。

  • 運要素や駆け引き要素が強く初心者でも盛り上がりやすい
  • サイコロの出目の確率について知っているとちょっと戦略的になる?

バトルフォーヒル

  • プレイ時間:20分~
  • 難易度:☆☆☆

兵隊カードと爆撃カードを駆使して相手の陣地へと攻め込むカードゲーム調。

  • 攻撃や補給などのルールが地味に分かりづらかった
  • どういう戦略が良さそうか初プレイではわからなかった

まとめ

プレイし次第追記します。

今の所は

  • キャントストップ

が手軽で運要素で盛り上がれそうなので初心者とやる分にはおすすめです。

どうやらwikiがあるのでここも参照したほうが良いかもしれません。

w.atwiki.jp

anacondaを使った仮想環境上のjupyterがmoduleをimportできない問題の解決 / jupyter上で環境を切り替える

起こった問題

  • condaで作った仮想環境上であるパッケージ(lightgbm)をインストールした
  • コマンドライン上で起動したpython環境では動く
  • がjupyter notebook上からはそのようなmoduleはないと言われた

要は入れたはずのライブラリがnotebookからインポートできないという状況になりました。

原因

  • 仮想環境上にはjupyterを入れてなかった
  • base環境のjupyterが起動し,仮想環境上でのライブラリ追加が

解決策

したがって簡単なことですが,これだけです。

  • 仮想環境上にjupyter notebookを入れる。
conda install jupyter notebook

余談ですが,juptyerのnotebook上でも戦闘に!をつけた行はコマンドライン上の入力として実行されるので,notebook上で

!pip install ~~

と実行しても良いです。

ただし,condaはyes/noの入力が必要になるので

!echo y|conda install ~~

とすること。

注意点:condaとpipをまぜるな

anacondaとpipでは扱うパッケージの形式が異なり,混ぜると環境を壊す恐れがあります。

https://cdn.juku.st/entry_images/5368/original/3c02421dae59735fbe1a9e2ee17958227702cc65.jpg

https://insilico-notebook.com/conda-pip-install/

jupyter上で仮想環境を切り替えられるようにする

バクを調べてる時に知ったのですが,jupyer上でKernel→Change Kernelの欄から仮想環境を切り替えることができて非常に便利です。

qiita.com

手順概略

手順は,

  1. base環境で,pip install environment_kernels
  2. jupyter notebook --generate-configで.jupyter以下に設定を作成(すでに出ている場合は変更なし)
  3. 生成されるjupyter_notebook_config.pyに下記を追記
c.NotebookApp.kernel_spec_manager_class = 'environment_kernels.EnvironmentKernelSpecManager'
c.EnvironmentKernelSpecManager.env_dirs=['C:/Program Files/Anaconda3/envs/'] # envsが保存されている場所

最後に使いたい環境にjupyterを入れpip install environment_kernelsを実行で完了です。

condaとpipをまぜるなといったそばからこれですが,environment_kernelsをcondaで入れている文献を見てないので仕方なくやってます。 best solutionでないのは確か。

ハマリぽいんと

3つ目の手順でenvsが保存されている場所というのが厄介で,windows機の場合,\エスケープする必要があります。

したがって,わたしの場合は

c.EnvironmentKernelSpecManager.conda_env_dirs = [ 'C:\\Users\\username\\AppData\\Local\\conda\\conda\\envs\\' ]

としなくてはいけませんでした。あと,最後に仮想環境上でのpip installを忘れないようにというのもポイントです。

これができると,環境ごとにコマンドプロンプトを立ち上げなくていいので気持ちが楽になります。