数学的にどうなのさ?

大学時代にちょっと長く数学を勉強した人の雑記。数学のこと(主に統計)や趣味、メモなどが多くなります

副業レポ

副業概要

※詳細は秘密保持契約を結んでいるため書けないし,答えられません

  • 業務内容:将来予測
  • 業務環境:自宅で自宅PCで使用
  • 期間:1か月
  • 業務時間:基本土日祝日の3~5時間ほど
  • 報酬:本業の給料1か月分と同等
  • 依頼主:友人の上司
  • 納品物:予測結果と予測に使ったアルゴリズム概要

どんな感じだったのかをもう少し

きっかけは友人から副業しないか?というお誘いがあったからだった.
友人の職場で時系列予測をやらないといけなくなったのだが,データ分析系のスキルを持った人がいないとのことで,できないかと声をかけてもらったのだ.
じゃあやってみましょうということで,契約書等を書いて,先方と打ち合わせをして,ようやくデータを受け取ることができた.
とりあえず手法をいくつか試して,これでやろうと決めたら後は前処理の検討をしては分析結果を見て,また前処理検討に戻るの繰り返し.
最後に予測結果と技術的な部分のまとめを提出,いただいたデータは削除で終了という感じだった.

本業との兼ね合い

副業に興味あるって人だとここは気になるところだと思う.
一応,弊社の場合は副業はOKだが申請が必要だった.誰を相手に,どれくらいの期間で,何をやるのかを届け出て,許可をもらう必要があった.
許可が下りるのがギリギリになったけど,ここは何とか許してもらえた.
(正直,秘密でやってもバレへんやろ…とは思ったが…)
基本的には本業を優先,土日祝日のみ副業をするということで,ワークライフバランスにも気を使ってやるよということでお許しが出たけど,結局平日の仕事終わりに副業してたこともあったのは会社にはナイショ.
副業やろうとしている方は自身が勤めている会社ではどうなのかというのはチェックしといたほうがいいかと.(会社ともめないようにしときたいしね) (youtubeやtwitch配信で収益が発生すると届け出ないといけなさそうな雰囲気だったしなぁ…そんな人気ないだろって?そこは言わない方向で何卒)

感想

友人とやり取りしつつ進めることができたのでストレスはほとんどなかった.
むしろデータを頂く以上,自宅でできないかもと思っていたが,そこは友人が頑張ってくれたようだ.ありがたや.

分析に関しては,生データを触ることができたから確実に経験値は得られたと思う.前処理をデータの特性に沿って考えるのって大変.
ただしデータ量に対して検討する時間が短かったのが痛かった.
データ分析に関しては素人を相手にすることになっていたため,向こうの期待値の下を行ってるんじゃないかとひやひやものだったし,
技術的なことを(統計や機械学習の用語をできるだけ使わずに)説明してもなかなか理解してもらえなかったのもつらかった.

最後の方は基本土日祝日だけと思っていたけど,結局時間が足りなくて仕事終わったら副業してたしで腰をやってしまったし…

  • 酷いときは座ってても辛い,立ってても辛い,寝てても辛いし,便座に腰掛けるだけでも一苦労なレベル
  • ただしこれは副業があったからというより,日頃の運動不足の方が主原因

結局,土日祝日では休んだ気になれず,また趣味にかけられる時間が激減したのもあって,月曜日が本当につらかった…

とはいえ本業のお給料分は頂けることになったから,そこは良しとしよう.お金で大抵のことは我慢できるのである.

そして肉体労働系の副業やったら死んじゃうなって思いました.

2023年を振り返る~パチスロ編

今年も終わるということで

私個人の感想をつらつらと.
今年はスマスロで4号機北斗の拳のリメイク機がホールに導入されて大きな話題になった年でした.
またスマスロでなくても一撃性の高いゲーム性の機種が多く導入され,ホールに行くとやれあの機種が万枚だのコンプリート機能達成だのと一撃性が強調されているようなイメージが強い年でもありました.
私個人はAT機はあまり打たないので北斗の拳や戦国乙女等については語れることは皆無なんですが,某所での良台オブザイヤーでは上記の2機種がランクインしていましたし他も大体AT機でした.
私はAタイプ系が好きなんだけど,そんなに面白いのかなーと気になって年末を過ごしています.
では今年導入された台で私が打った台について記憶を頼りに感想を書いてみようかと思います.

モンスターハンターワールド:アイスボーン

5号機の名機と評判の月下雷鳴を踏襲した機種ということで1回だけ打ってみました.まあ月下雷鳴も4~5回くらいしか打ってないですけど.
ATについては月下雷鳴の時も思いましたが面白かった記憶があります.強レア役ありきという感じになってなさそうな印象だったけど,解析見たらまた違う感想になるかも…
ただ通常時がきつく,リプ連しないと永遠にハマるんじゃないかと錯覚するくらい.

コードギアス 反逆のルルーシュ3 C.C.&Kallen ver.

前作のCCverはそこそこ打ってたので期待して友人と一緒に1回打ちました.
ゲーム性はCCverそのままの打感だったので慣れ親しんだ感じだったかな.CC揃いが押し順リプで隠れたりするっていうのも似た感じ.
ただリーチ目はちょっと微妙な感じかなーという印象でした.まあそういう台じゃない気もするけど.
もう数回は打ちたかったんだけどあまり導入数多くないのが辛い…

傷物語-始マリノ刻-

5号機の化物語の後継機みたいな話を聞いたので1回打ちました.
まあゲーム性は似てるかな…という感じに一瞬見えましたが,なんか違うなとなった記憶があります.
また,やはりというべきか5号機の倍倍チャンスほどの凄まじさは感じなかった.これはしかたないとは思う.
ただ勝てる気がしなかった,というのが一番残っている印象かな.降臨ノ儀で爆乗せできればまた印象が変わるかも.
とはいえ平打ちは無理かな.

ファミスタ回胴版!!

ディスクアップ,いやマッピーというべきか,そういうゲーム性ということで1回打ちました.
ただ初打ちでとんでもないハマりを喰らったんで安定性はディスクアップとかマッピーとかみたいな感じで,機械割102%以上だからって安定するわけじゃないってのはそうだなと.
これも打ち込みたかったんだけどまあまあ空いてない.導入数も少ないしね.

ひぐらしのなく頃に

5号機で一番打ち込んだ機種はひぐらしのなく頃に祭なんで,似たゲーム性だしひぐらし祭2とは別に打つことにはなるだろうから2回ほど打ちました.
打感はひぐらし祭2とは似た感じだし,ビタ押し難易度も理不尽にハマるところも似てるので違和感はない.
ただ同色BBの確率がものすごく低いということと,変に特化ゾーンや無限を付けたことで割が持っていかれててきついのは業だなという感じ.
あとシステム的にATの連荘は祭2よりもさらにしにくいといった印象.
今のところ負けてるけどもうちょい打ち込みたい機種.

魔法少女まどか☆マギカ [前編]始まりの物語/[後編]永遠の物語f-フォルテ-

長い…まどマギシリーズはすべて打ってるので嫌な予感はしつつも1回打ってみました.
まあ,うん,嫌な予感ってのは当たりますね…
1回で複数回分削れたり,一部で体力持ち越しができたりするとはいえ5戦突破形式はさすがに無理.そしてこれがゾーンほぼ無しで小役やCZで引いてくるボーナス経由じゃないと望めない.
つまり初あたりまで時間がかかり投資が嵩む.
肝心のATはというと,杏子がロング継続してくれるなら出るっていうのはわかるけど獲得できないしすぐいなくなる印象.上位ATにいれればわからないけど,そもそも引ける気がしないし.
そんで某ライターさんが言っててなるほどと思ったのは,2択ベルの存在.これがストレスの要因になるのは当然としても,押し順次第では2確でベル外れがでちゃうんですよね.ドキドキ感も取り上げるのはさすがにないわ.
残念ながらク〇台オブザイヤー候補と言われてもわるよ,としか言えない.
少なくとも平打ちはできない.

というわけで

以上が打った機種なんだけど,Aタイプ好きならエウレカとクランキーはどうしたと思われるだろう.導入数が少ないのと人気度のせいか座れてないのじゃ…この2機種とマジハロ8はなるはやで打ちたい.
Aタイプ系は6号機の規則上不遇な立場にあって大きく勝てる機種ではないかもしれないが,良い台がでることを祈っている私みたいな人もいるのでメーカーには頑張ってもらいたいなーと.

今年はタコ負けしてるので来年は良い感じになるといいな.良いお年を.

WSL上のDocker上で動いてるjupyterにアクセスしたい

概要

以下のページでWSL上にDockerの環境を立ち上げた.

lua0810.hatenablog.com

これだけでもいろいろできるのだが,何かの開発をしようとすると結構面倒.
そこでとりあえずDocker image内でjupyterを立ち上げて,そこにWindowsからアクセスする方法をメモしておく.

Docker imageの作成

少し面倒だが,以下のような内容のDockerfileファイルをWSL上に作成する.

FROM nvidia/cuda:11.8.0-base-ubuntu22.04

RUN apt update
RUN apt install python3.10 -y
RUN apt install python3-pip -y
RUN pip install jupyterlab

FROMは元となるDocker image,以降は追加で処理するコマンドをRUNで指定する.
内容としては、python3.10とpython3-pipをインストールして,jupyterlabをインストールする.
そしてこのDockerfileがある場所で以下を使ってビルド作業を行う.

docker build -t jupyter .

これでDocker imagesを実行してもらうと,jupyterというコンテナができている.

Docker runの実行で注意すること

必要なのはホスト側とコンテナ側のポート接続が必要になる.こうしないとホスト側でそのポートを認識できなくなる.実行例は以下.

docker container run -it --rm --gpus all --publish 18888:8888 jupyter

色々とオプションを付けてるが,ここで重要なのは--publish 18888:8888で,ホストの18888ポートとコンテナの8888ポートを接続することになる.

jupyter lab立ち上げ時に注意すること

後はコンテナが立ち上がったらjupyterlabを立ち上げるだけなのだが,ここでも注意点がある.
以下が大丈夫なコマンド.

jupyter lab --ip=0.0.0.0 --allow-root

--allow-rootは無いとつけないとエラーが起きる.
--ip=0.0.0.0は無いとアクセスができない.原因はよくわからない.

とりあえずこれでDocker上で実行しているjupyterにアクセスできるようになる.

もっと簡単にしたい

あれこれと実行時に指定していくのは結構面倒なので,それを簡略化する方法を記載する.

コンテナに入った後にjupyter labを立ち上げる部分を省略する

Dockerfilesを以下のように修正する.

FROM nvidia/cuda:11.8.0-base-ubuntu22.04

RUN apt update
RUN apt install python3.10 -y
RUN apt install python3-pip -y
RUN pip install jupyterlab
RUN cd mnt
RUN mkdir host_src

CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root"]

RUN cd mntRUN mkdir host_srcは別のところで使うので一応記載している部分.
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root"]はこのコマンドをコンテナ立ち上げ時に実行する命令文になっている.
これでコンテナ立ち上げ時に毎回jupyterlabを手動で実行する必要がなくなる.

docker-composeの利用

後はやりたいこととして - ホストとコンテナのport接続 - ついでにホスト側のディレクトリをコンテナ側でマウントしてソースコードを読み込めるようにする

この2点を自動化することになる.
これらを行うのにdocker-compose.ymlを利用する.
以下のページを参考にdocker-compose.ymlを作成してみた.

qiita.com

version: '2.21'

services:
  jupyter:
    container_name: jupyter
    build:
      context: .
    ports:
      - '18888:8888'
    volumes:
      - type: bind
        source: /home/lua/src
        target: /mnt/host_src

各箇所の解説は上のページを参照してもらいたい.
ともかくこれで開発は少し楽ができることが分かった.docker-compose.ymlはGPUの利用宣言なんかもできて便利.

最後に

VSCodeを利用するともっと楽できるかもしれないとのことなので,今度はそっちについても調べてみようと思う.

wsl上のUbuntuにdocker環境を作ってみる

概要

職場で作る必要が出てきたので.ただ職場はproxy周りの問題だと思うがうまくインストールできなかった. そこで自宅PCでやってみて問題の切り分けをやろうというのが裏の目的.

環境

  • OS: windows10 Pro
  • WSL内のOS: Ubuntu

wslの準備

準備は以前まとめていたのでこちらを参照. lua0810.hatenablog.com

dockerのインストール準備

下記を参考にインストールを行った. docs.docker.com

まずはdocker.iodocker-docdocker-composepodman-dockerをアンインストールする.

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

次にアップデート関係.

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

そしてDockerの公式GPGキーを入手.

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

次はリポジトリのセットアップ.

echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

そしてもう一回アップデート.

sudo apt-get update

Dockerのインストール

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Dockerの起動確認

sudo docker run hello-world

以下のような出力が得られれば大丈夫らしい.

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

GPUを使えるようにしたい

こちらを参考にした. qiita.com

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

$ sudo yum install -y nvidia-container-toolkit
$ sudo systemctl restart docker

そしてDockerの実行環境下でGPUが認識しているかを確認.

docker run --gpus all nvidia/cuda:10.0-base nvidia-smi

まとめ

自宅PCではWSL上のUbuntu環境にDockerをセットアップすることは簡単にできた.
会社PCではDocker関係のインストール時にエラーが発生していたのでおそらくproxy周りの問題なのだろう.
これで問題の切り分けはできたので,後は面倒なproxy周りの設定を見直していきますかね…

ChatGPTぱないねって話

概要

話題のChatGPT使ってみたんですよ,ええ.
仕事で使えるかもしれないというので,フレーム補完手法のFILMという手法を調べてて.
ソースコードあるじゃんってなって見たけどよくわからんしTensorFlowで書かれてるし,PyTorch版もあったんだけどよくわからんってなった.
こりゃ理解するのに時間かかりそうだな,となっていたんだけど,ChatGPTさん速攻でそれらしいコード書いてくれてすげーなってなってる.

ChatGPTの回答

import torch
import torch.nn as nn

# 中間フレーム数
N = 5

class FrameInterpolationModel(nn.Module):
    def __init__(self):
        super(FrameInterpolationModel, self).__init__()
        # 特徴抽出器
        self.feature_extractor = nn.Sequential(
            nn.Conv2d(3, 64, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(64, 128, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(128, 256, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(256, 512, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(512, 512, 3, padding=1),
            nn.ReLU()
        )
        # 中間フレーム生成器
        self.middle_frame_generator = nn.Sequential(
            nn.Conv2d(1024, 512, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(512, 256, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(256, 128, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(128, 64, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(64, 3, 3, padding=1),
            nn.Sigmoid()
        )
        # モーション補間器
        self.motion_interpolator = nn.Sequential(
            nn.Conv2d(512, 512, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(512, 256, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(256, 128, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(128, 64, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(64, 2, 3, padding=1)
        )

    def forward(self, x0, x2):
        # 特徴抽出
        feat0 = self.feature_extractor(x0)
        feat2 = self.feature_extractor(x2)

        # モーションベクトルの推定
        motion_vector = self.motion_interpolator(torch.cat([feat0, feat2], dim=1))
        motion_vector = torch.tanh(motion_vector) * 2.0

        # 中間フレームの生成
        x = torch.cat([feat0, feat2], dim=1)
        middle_frames = []
        for i in range(N):
            # 重み
            w = (i+1) / (N+1)
            # 中間特徴量の生成
            x_i = nn.functional.grid_sample(x, self._get_grid(motion_vector * w))
            # 中間フレームの生成
            middle_frame_i = self.middle_frame_generator(x_i)
            middle_frames.append(middle_frame_i)

        return middle_frames

    def _get_grid(self, motion_vector):
        batch_size, _, h, w = motion_vector.size()
        # グリッドの生成
        xx = torch.arange(0,

途中で切れちゃってるけど,ここまでのコードをあまり時間をかけずに作ってくれるのやべーな.コード書く人そのうち駆逐されそうだ.

Windows上でAnaconda無しでpymc3は動くのか?

概要

Anacondaの従業員200名以上の企業利用が有償化してしばらく経ちます.
今までは普通のPythonでのらりくらりとやっていけていた.
しかしベイズ統計の勉強したくてpymc3を導入しようとするとすべてAnaconda前提でインストール方法が書かれている.
本体はpipでインストールせよとのことだったので普通のpythonでもいけるんじゃね?と思ったがダメそう?という感じ.
結論から言うとMinicondaとかWSL使うといけそうだということ.この辺りは後述.

続きを読む

WSL2でAlmalinux

概要

以前AlmalinuxをVirtualBox内に構築した.

lua0810.hatenablog.com

ただWLSにも興味があったのでこちらでも構築してみることに.使い勝手が良かったらこっちに移行しましょうかね.

続きを読む