pryのlsバグる問題
こんな感じになってしまう
解決方法
export PAGER=" less --raw-control-chars -F -X"
使い捨てのKubernetes環境が欲しく、ローカルにKubernetesをインストールしようとした。
本番環境ならkubeadm一択なんだろうけど、サクッと構築するだけなら1台で完結するクラスタがいいなと思いminikubeがイケてそうだったので試したメモ。
ただ手元の環境がM1なのでamd64のイメージが動作しない。arm64のKubernetes環境作っても色々ハマりそうなので多少遅くなってもamd64のクラスタがほしい。そこでDockerのバックエンドに使っているlimaに頼ることにした。
公式サイトを見ましょう
まずはlimaで公式のexamples/docker.yamlをインストールして、そことマウントされたDockerのSocketを利用してminikubeをインストールする方法。
minikube start --driver=docker --container-runtime=containerd
が、何回やっても失敗する。 Issue立てていたが仕様上無理とのこと。
ので諦めてオススメされた方法で試してみる。
lima shell ubuntu
で中に入り、普通にDockerとminikubeをインストールminikube start
してk8s環境を構築するよさげ
❯ kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-6d4b75cb6d-667z4 1/1 Running 0 2m46s kube-system etcd-minikube 1/1 Running 0 2m59s kube-system kindnet-j4pzm 1/1 Running 0 2m46s kube-system kube-apiserver-minikube 1/1 Running 0 2m59s kube-system kube-controller-manager-minikube 1/1 Running 0 2m59s kube-system kube-proxy-lnvv2 1/1 Running 0 2m46s kube-system kube-scheduler-minikube 1/1 Running 0 2m59s kube-system storage-provisioner 1/1 Running 0 2m57s
デフォルトだと最低限のログしか出ないのでエラー時に対応しづらい。
以下のようにするとめっちゃ細かくログを出力してくれる。
minikube start -v=1 --alsologtostderr
エラーで終了してしまった場合とかは minikube logs --file=error.txt
で直近のログをファイルに保存できる。
minikube delete --all --purge
「$」記号の後に整数が来る。例えば
¢100 makes $1
という例文があったとして、$1
を抽出したい。
この場合は肯定後読み(Positive lookbehind)正規表現機能を使う必要がある。
let str = "¢100 makes $1."; alert(str.match(/(?<=\$)\d+/)) // 結果: 1
(?<=Y)X は X の前に Y がある場合にのみマッチすることを意味する
否定後読み(Negative lookbehind)を使う。 (?<!Y)X は X の前に Y がない場合にのみマッチすることを意味する
let str = "¢100 makes $1."; alert(str.match(/(?<!\$)\d+/)) // 結果: 100
Railsはデフォルトだとapp/modelsにモデルファイルを生成する。
それはルールなので別にいいのだが、プロジェクトが成長するに従って10ならいいが50を超えてくるとかなりキツくなる。
そこでディレクトリをapp/models以下に作成して階層化したい。ディレクトリ別にグルーピングしたい
が、ググってもDB構造の階層化ばかりでフォルダを分ける記事が全然見当たらなかったのでメモ
例えばこれは通常のPostモデル app/models/post.rb
class Post < ApplicationRecord end
.model_name
でそのモデルの命名規則などがわかる
irb(main):014:0> Post.model_name => <ActiveModel::Name:0x0000000114a6d2f8 @collection="posts", @element="post", @human="Post", @i18n_key=:post, @klass=Post (call 'Post.connection' to establish a connection), @name="Post", @param_key="post", @plural="posts", @route_key="posts", @singular="post", @singular_route_key="post", @uncountable=false>
まあそうなるわな
まずは app/models/admin.rb を作成して以下
module Admin end
で app/models/admin/post.rb を作成して以下
class Admin::Post < ApplicationRecord end
これだけで後は Admin::Post
でアクセス出来る
irb(main):021:0> Admin::Post.new (0.1ms) SELECT sqlite_version(*) => #<Admin::Post:0x0000000115264830 id: nil, title: nil, date: nil, body: nil, created_at: nil, updated_at: nil>
だがこれだけではめでたしめでたしとはならない。form_withでフォームを作成するともれなくURLが想定ではなくなってバグるため。
もともとPost
を Admin::Post
にディレクトリ作っただけなので、ルーティングやコントローラー周りは階層化するつもりはない。
しかし同様に .model_name
すると route_key が「admin_posts」になってしまってるじゃないか。。。
irb(main):014:0> Post.model_name => <ActiveModel::Admin::Post:0x00000001141bd180 @collection="admin/posts", @element="post", @human="Post", @i18n_key=:"admin/post", @klass=Admin::Post (call 'Admin::Post.connection' to establish a connection), @name="Admin::Post", @param_key="admin_post", @plural="admin_posts", @route_key="admin_posts", @singular="admin_post", @singular_route_key="admin_post", @uncountable=false>
app/models/admin.rb にメソッドを追加する
module Admin def self.use_relative_model_naming? true end end
でRailsをリロードすると route_key
が posts
に戻っている!
irb(main):023:0> Admin::Post.model_name => <ActiveModel::Name:0x0000000117305ee0 @collection="admin/posts", @element="post", @human="Post", @i18n_key=:"admin/post", @klass=Admin::Post (call 'Admin::Post.connection' to establish a connection), @name="Admin::Post", @param_key="post", @plural="admin_posts", @route_key="posts", @singular="admin_post", @singular_route_key="post", @uncountable=false, @unnamespaced="Post">
他にも色々見えないところで変わってるらしく、ただモデルの場所をフォルダ分け考えているなら全然あり
ちなみにRailsのモデルを階層化しろって話はRails1.2時代から指摘されてたっぽい。ウケる
ゲームしてると目の前の自分の画面を共有したいことがある。PCの画面だと画面共有押せばすぐに共有できるが、ニンテンドースイッチ自体にはその機能がないためできない。
そこでキャプチャボードを使ってPCを通すことで画面共有できるようになったのでやり方でメモ。
これがないと始まらない。自分は旧型を使用したが新型でも可能。当然映像出力機能のないスイッチライトは不可。
今回は録画機能とか要らないのでとりあえず安さ重視でコレを買った
Type-Cケーブルも(短いが)付属している点がGood
これも必須。なぜならスイッチ本体に配信機能が無いため。
今回自分はM1 Macbookを使った。
アプリケーションとしては以下
普段は1本で十分だが、1本多く使うので注意
まずは構成図のように配線をする。
次にOBSをダウンロードしてインストール。設定していく
画面を開いたらウィザードみたいなのが表示されるが今回はOBS本体で配信、録画をしないのでキャンセルする
ここではOBSでゲームの映像、音声を扱えるようにするのがゴール。
OBS画面の左下の方にあるソースを右クリックして「映像キャプチャデバイス」を選択
そのまま「OK」をクリック
デバイスをキャプチャボードのやつ(自分の場合はMiraBox Capture)にしてプリセットから「1280x720」を選択する。
これでOBSでスイッチの映像が扱えるようになった。
が、これだけだとゲームの音声が入らず無音配信になってしまうので音声も入れるようにする。
同様にソースを右クリックして「音声入力キャプチャ」をクリック
わかりやすいように「ゲームの音声」とかの名前にして「OK」クリック
デバイスを同様にキャプチャボードのやつ(自分の場合はMiraBox Capture)にして「OK」をクリック
これでOBSでゲームの音声も扱えるようになった。が、イヤホンをパソコンにつけてもゲームの音が聞こえない。
これはデフォルトではゲームの音声が出力の対象外になっているため。配信では音が流れても自分が無音でゲームは流石にツラいため以下の設定を行う。
画面下の方の「音声ミキサー」ウィンドウよりゲームの音声のサブメニューボタン「︙」をクリックして「オーディオの詳細プロパティ」をクリック
すると「オーディオの詳細プロパティ」ウィンドウが表示されるので「ゲームの音声」の音声モニタリングを「モニターと出力」にする。するとゲームの音声が聞こえるはず。
最終的なOBSのウィンドウは以下のようになるはず。
これを満たしていればOBSの設定は完璧
次はDiscordの設定
悲しいことにMacOSのセキュリティ上そのままではゲームの音声を画面共有で流すことができない。そこでDiscordの拡張機能をインストールする必要がある。
まずはDiscordの設定を開き「音声・ビデオ」を選択
画面共有の欄にインストールボタンがあるのでインストール。
が、最近のMacOSだとさらにセキュリティが厳しくなっており、「現在のセキュリティ設定では、システム機能拡張のインストールは許可されていません」と言われてそのままではインストールできない。そこで以下の記事を参考にセキュリティレベルを一旦下げてインストール出来るようにする。
最終的に以下のように「アプリケーションから音声をキャプチャする準備が整いました」と表示されればインストール完了である。
ちなみにDiscord自体の音声設定はこんな感じでOK。いつもどおりで特に画面共有するからと言って変えることは他にない。
これでようやく配信できるが、このままOBSの画面を配信しても編集画面が映ってしまう。
MacOSの場合はWindowsみたいにOBSとDiscordが連携していいように画面を加工してくれないので、自分でゲーム画面だけのウィンドウを作成し、それをDiscordに画面共有させる必要がある。
まずはMac画面の右上のマニューバーからOBSのアイコンをクリックし、「全画面プロジェクター(番組)」を選択しディスプレイをクリック
すると全画面でゲームの画面が映し出される。が、Discordは全画面のウィンドウを画面共有できないので、ウィンドウの緑ボタンをクリックして全画面表示を解除する
で、DiscordをOBSと同じディスプレイスペースに置いた状態でDiscordの画面共有ボタンをクリックし全画面表示させたゲーム映像だけのウィンドウを選択する
「Go Live」をクリックすると晴れて配信が開始される。やったね!
が、このままだとMacのウィンドウのタイトルバーも同時に映ってしまう。なんかダサい。
そこで一度縮小化したゲームのウィンドウを再度全画面化する。こうしても1度画面共有されていれば解除されることはない。
これで相手からはゲームの映像だけが画面共有される。