#temanote

エンジニア、SREです

手軽にOAuth Tokenでslack投稿できるCLIツール slack-quickpostをつくりました

少し前はslackへの投稿といえばincomming webhookでしたが、slack app化が進むにつれ非推奨になりつつあります。
前は自由だったusernameとiconの指定ができない、channelが固定など普段使いするには手軽とは言えません

普段golangを書いていると手軽にslack-go/slackを利用してOAuth Tokenを利用してpostしているので、その感覚で使えるCLIツールを書きました

github.com

go get github.com/ToshihitoKon/slack-quickpost

でインストールできます。go 1.15以上が必要です。

テキストを投稿したい場合は

slack-quickpost --token "xorb-XXXXX..." --channel C____ --text "post text"

だけで投稿できます。tokenは環境変数SLACK_TOKENに入れておくと--tokenオプションを省略できます。

usernameとiconが指定できます。iconはemojiの場合は--icon "emojiname"、画像URLの場合は--icon-url https://~~を指定可能です。

slack-quickpost --channel C_____ --text "icon emoji" --icon "thinking_face" --username かんがえるひと

f:id:tkonsoy:20210911003812p:plain

テキストはファイル入力、スニペット出力も可能です。

slack-quickpost --channel C_____ --textfile testtext --icon "memo" --username メモ
slack-quickpost --channel C_____ --textfile testtext --snippet

f:id:tkonsoy:20210911004219p:plain

slack apiの仕様上、ファイルのアップロード時にはusernameとiconの指定が出来ないのでこれらのオプションは無視されます。

任意のファイルをアップロードすることができます

slack-quickpost --channel C_____ --text "記念動画" --file memory.mp4

Xmonadからi3へ移行した

タイル型といえばXmonadと思って使い続けてたけど、haskellわからないのであまり利点を活かしきれないのと、wayland移行を考えて後継が無いのでXmonadからi3(i3-gaps)へ移行しました

OS: ArchLinux
元環境: Xmonad / xmobar
新環境: i3-gaps(aur) / i3-status

移行手順

  • とりあえずi3を起動する
  • 手癖で操作してみて動かないものを設定して回る
  • 見た目気に入らない場所を直していく

見るドキュメントはもちろんi3 user's guide

i3wm.org

見るのは主に4. Configuring i36. List of commands

各設定メモ

👆がXmonad、👇がi3

レイアウト
内蔵レイアウトはあんまり強くなさそうなので、autotilingを起動させたらそれっぽくなったのでおまかせした

myLayout = onWorkspace "6" simplestFloat $
           toggleLayouts ( noBorders Full ) $
           gaps [(U,8), (D,8), (L,8), (R,8)] $
           spacing 3 $
           bsp ||| tall ||| grid
           where bsp  = emptyBSP
                 tall = ResizableTall 1 (2/50) (2/3) []
                 grid = Grid


# https://github.com/nwg-piotr/autotiling
# bsp tiling
exec_always --no-startup-id ~/.anyenv/envs/pyenv/shims/autotiling
# i3-gaps
gaps inner 10

ウィンドウ操作類
ワークスペース移動

((modm, xK_h), prevWS )
((modm, xK_l), nextWS )
bindsym $mod+l workspace next
bindsym $mod+h workspace prev

ウィンドウのワークスペース間移動

((modm .|. shiftMask  , xK_h), shiftToPrev )
((modm .|. shiftMask  , xK_l), shiftToNext )
bindsym $mod+Shift+l move container to workspace next
bindsym $mod+Shift+h move container to workspace prev

ウィンドウサイズ変更

((modm .|. controlMask, xK_l), sendMessage $ ExpandTowards R )
((modm .|. controlMask, xK_h), sendMessage $ ShrinkFrom R )
((modm .|. controlMask, xK_j), sendMessage $ ExpandTowards D )
((modm .|. controlMask, xK_k), sendMessage $ ShrinkFrom D )
bindsym $mod+Ctrl+l resize grow right 30 px
bindsym $mod+Ctrl+h resize shrink right 30 px

ステータスバー
dozen2からi3内蔵status barに

barLeft <- spawnPipe $ "dzen2 -x 0 -w 700 -ta l " ++ dzen_opts
right <- spawnPipe $ "conky -c ~/.xmonad/conky/conky_config | dzen2 -x 700 -ta r " ++ dzen_opts

bar {
    font pango:monospace 10
    position top
    output primary
    status_command i3status --config ~/.config/i3/i3status.conf
}

アプリランチャー(rofi)

((modm, xK_p), spawn "rofi -show run" )
((modm, xK_e), spawn "rofi -show emoji" )
bindsym $mod+p exec --no-startup-id rofi -show run
bindsym $mod+e exec --no-startup-id rofi -show emoji

スクショ(import ~/tmp.pngをshell scriptにしてます)

((modm .|. controlMask, xK_4), spawn "/home/temama/.config/nukegara_scripts/ss.sh")
# マウス使うやつは--releaseをつけると良いらしい
bindsym --release $mod+o exec "~/.config/nukegara_scripts/ss.sh"

i3の設定からちょっとずれたもの

フォーカス外れたウィンドウが透過していたので透明度合いを調整したい
👉コンポジットマネージャーにpicomでした

# picom.conf
opacity-rule = [
  "100: focused",
  "90: !focused"
];

納得行ってない設定

  • mod+Ctrl+Spaceでフルスクリーンと切り替えたいのに出来てない、多分autotiling側
  • ウィンドウの横拡大縮小、フォーカス当たってるウィンドウの右端を移動させる設定なので一番右のウィンドウがアクティブなときは動かない(これはxmonadでも微妙な設定してた)
  • mod+Returnでフォーカス当たっているウィンドウを一番左上のウィンドウとswapするのが出来てない
  • 隣のworkspaceにウィンドウを飛ばすとき、先のworkspaceにもともとウィンドウが何かないとアクティブにならずに飛ばない(1から2に飛ばすとき、2にウィンドウがなかったら飛ばない)

サンリオピューロランドに行ってきました

f:id:toshihito_it:20210303002944j:plain

僕とサンリオ

申し訳ないことに、サンリオ知識はほぼ無です。
ポムポムプリンのゲームを昔児童館で遊んでいたり、ぐでたまを知っていたり、最近ガンダムとキティちゃんがコラボしていたり、という知識を知っている程度でした。

サンリオピューロランドについても、そういうテーマパークがあることを知ったのすらつい最近なくらいです。


見たもの

Go for it!~笑顔あつめて~

Go for it!~笑顔あつめて~ | 観る | サンリオピューロランド

キティちゃんとバッドばつ丸くん、そして案内役のお姉さんのショーでした

初めてキティちゃんとばつ丸くんの曲を聞いたんですけど、多分聞いたことない人が想像している数千倍格好良かったです。ばつ丸ラップ格好良いしあれ聞いて育った子どもたちの趣味完全にあっちに行っちゃうのでは?って感じのゴリゴリラップとダンスミュージックって感じでした。ばつ丸くんはまだわかるんですけど、次のキティちゃんのターンで「こんどは可愛く、みんなのことを応援します!」って言った直後にまた超良いダンスミュージックみの強い曲が来て笑ってしまいました。本気を感じました。

このショー自体がコロナ禍に入る前からやっていたものかはわからないのですが、みんなで「Go for it!」と掛け声を入れたいタイミングで「声は出さずに身振りで応援してね!」と時代に沿った煽りになっていたり、後半にはオンライン飲み会のような演出があったり、とにかく丁寧でした。

20分程度の小さなショーでしたが、素晴らしかったです。見られて良かったと思いました。

あと会場が結構広くてびっくりしました。ピューロランド内には4つほど園内イベントがあるシアターやステージがあるのですが、今回見たGo for it!は入口のメルヘンさから想像出来ないくらいしっかりしたステージと観客席の広さでした。開演前に音が大きくなるところとかライブ会場と全く同じ気持ちになった。
観客が子供たちなので、音も当然ライブ会場のような爆音というわけではなく、かといって小さすぎず会場についているスピーカーの適切な出力って感じで聞き疲れすることもなく、ショーに集中できる環境だったことも良いなと思いました。

園内のショップで打っているハート型のペンライトは、会場内のショーに合わせて自動で色が変わる仕組みで、子どもたちが振っていると一体感があって見ていて楽しかったです(流石に僕は買わなかった)。これが税込み1500円で売っているのはすごい良いですね。僕が光り物大好きなので子どもたちも大好きなはず。思い出にもなるし。

ピューロスイーツパーティ

【2021/1/8(金)~3/9(火)】ピューロスイーツパーティ | 観る | サンリオピューロランド

こちらはイベントスペースのショーではなく、園内中央のピューロビレッジがライトアップされ、園内のBGMとともに演出と映像を楽しめる5分ほどのイベントです。 園内が薄暗くなり、鳴り響く曲に合わせて各所のモニターにながれる映像、連動して光る会場内の照明、プロジェクタースポットライトで床や天井に浮かぶ見知ったキャラクターやいちごなどのメルヘンモチーフ、完成度の高すぎるメルヘンDJボックスです。

しかも園内演出に合わせてスタッフさんたちが小さく踊っている様子も端目に見ることができました。ダンサーさんのような派手なパフォーマンスをしているわけではなく、小さくステップを踏みながら手を回したり、外に向けたり、程度の本当に小さな踊りではありましたが、サンリオピューロランドの世界観を作る大切なパーツだと思えました。実際ピューロランド内のスタッフの皆さんは衣装もさながら、その場にいる大人として違和感のない立ち振舞いをしていたように思います。

子どもが持っている世界観を崩さずに提供するテーマパーク、大人が見ても感じるものはたくさんありました。

ぐでたま・ザ・ム~ビ~ショ~

ぐでたま・ザ・ム~ビ~ショ~ | 観る | サンリオピューロランド

ぐでたまはもともと知っていたので気になって見に行きました、正直最初想像していたのは、青少年科学館とかで流れている映像の定期上映時間の気持ちでした。

時間10分前に並んでおいて入室、着座、少し古めかしい映画館のようなコンセプトの部屋でぐでたま監督が作った映画を見るのだと言います。 そこに現れたぐでたま監督は、等身大の卵、スクリーンの左下にちょこっと居ました。 ぐだぐだして、結局映画を作り直すことに。しかもシアターにいるお客さんを巻き込んで。 順番にランダムにあてられて、質問に答えるという形で提供されるネタをつなぎ合わせて映画を作っていく話でした。 いやそんな綺麗に「こういう話でした」なんてまとめられないレベルのぐだぐだなぐでたまだったんですが、面白かったです…。すごかった。独特のテンポと観客側との会話の中の伏線を回収してオチをつける話の上手さ。良いショーでした。

ぐでたまタウン

ぐでたまタウン入国審査を終え、ぐでたまタウンに入りました。なかで出来ることはいくつかのゲームと写真撮影スポット観光です。ゲームの中には「アツアツの鉄板にぐでたまを落とそう!」というお前正気か?なゲームもあったりして楽しかったです。どれも体自体を動かしたり、卵型の専用コントローラーで遊んだり、風変わりなアトラクションがたくさんありました。楽しかったです、

買ったもの

ポムポムプリンのカチューシャ

かわいい〜〜〜、垂れ耳カチューシャ天才ですよね、重心がすこし下がることによってカチューシャ耳の違和感が無になる上にシンプルにたれ耳がかわいい、ズルいです。 周りが付けてるの見てかわいい〜〜って思ったので僕も付けてみました、無敵になれた気がしますね。俺のカバンにはポムポムプリンのカチューシャ入ってるけど君は?

f:id:toshihito_it:20210303003002j:plain

大学中退して現職SRE

人生いろいろあるけど元気に生きていこうな!

要約

  • 大学卒業するのめちゃめちゃえらいけど、中退がえらくないわけじゃないよ、がんばって
  • ちゃんと生きてお仕事してます
  • SREっていうちょっとおもしろい座組の組織にいます
  • 3000文字くらいです

この記事は公立はこだて未来大学AdventCalendar2020 その2 14日目の記事になります。

adventar.org

公立はこだて未来大学複雑コースの @Tkon_sec です。
temama (@Tkon_sec) | Twitter

数学について行けず中退しました。
半年前にThinkPad X390を買ったのですが、色々合って5回ほどメインボードを交換してもらいました。環境失うことに何も抵抗がなくなった。

大学中退のその後(ご参考までに)

大学を中退する方法についてはご存知だと思うので割愛
18年後期から休学し、19年前期をもって退学、就職のため関東へ引っ越して現職場へ秋入社して社会人2年目に入ったところです。

18年前期には既にほぼ大学を諦め、アルバイトをしつつ遊び歩きました。人生20年で一番楽しかった。
18年後期に休学すると共に、19年春に就職を目指してふわっと就活をはじめました。

ふわふわ就活の内容は以下です

  • バイト先で社員にしてもらえないか交渉
  • 気になる企業やイベントで知り合った人のいる会社のインターンや面接に申し込んでみる
  • ハローワーク

結果19年春に就職することは叶わず、函館でアルバイトしつつ遊んで暮らす日々を継続しました。正直楽しかったのであんまり苦でもなかったです。

そもそも僕はエントリーシートや応募用紙等を書くのが特に苦手かつ嫌いな人間で、かつ嫌いなことを絶対やりたくない人間なのでまともにエントリーシートを出せた企業はそこまでありません。中には会社の人からぜひ申し込んでねって直接言われてぜひぜひ〜って答えたのに最後までエントリーシートを送れなかった企業もあります、ごめんなさい

そんな中とある会社のありえん楽なエントリーフォームがあって、深夜テンションか何かでほぼ文章を書かずに送ったらインターンに通り、そのまま採用して頂けました。
名前を面白法人カヤックと言います。

面白法人カヤック

いま自分が社員として働けているのが不思議なくらいふわっとした採用で未だに困惑してはいるのですが、きっと運が良かったのと評価されるものがあったんだなぁ…というふわふわしてる気持ちで働いています。
一応言っておくと誰でも採用してくれる場所ってわけじゃないです(当然)、ちゃんと採用基準とか色々ある上で採用して頂けているので、ご縁があったことに感謝しております。

いまちゃんと中退を考えている方々は僕よりは固いものを持っていると思うので、それくらいの固さならなんだかんだ生きていけると思うので頑張ってほしいです。
中退と聞くとどうしても人生のレールから脱線した身分のように思えて病んでくるんですが(僕は病んだ)、大学をちゃんと卒業した方々は努力家ですごい偉いのは間違いないけど、だからといって中退した人間が底辺かと言われると絶対そうじゃないと僕は思うので、我を見失わずに生きていきましょう。

言うて病み始めている人にはなかなか周りの言葉は刺さらないので、良い方向に進むことを願っております。

現職、SREというお仕事について

さてそんなふわふわした経緯で働いているのですが、現在の私の所属はSREといいます。
きっと聞き馴染みが無い方の方が多いと思います。略さない名称は「Site Reliability Engeneering」で、日本語でいうと「サイト信頼性エンジニアリング」です。

Googleが提唱するエンジニアの分類で、詳しい説明はこの本に全部乗っています。というか現状SREの細かい定義その他の全ての情報源はこの本です。
O'Reilly Japan - SRE サイトリライアビリティエンジニアリング

何をするかというと、サイト(あるいはサービス)の信頼性を高めるための開発作業を行うエンジニアです。
信頼性とは何かというと、例えばそのサービスがいつでも使えること、サービスから返ってくる結果が正しいことなど、サービスが正常な状態を担保する、というような内容です。
例を上げると、Google検索が頻繁に利用できなくなったり、検索結果が望ましいものでは無かった場合はGoogle検索の信頼性は下がった状態と言えます。

これを避けるためのエンジニアリングとして、わかりやすいものとしてはインフラの適切な増強作業があります。
大抵のサービスが利用不能になる原因の多くはインフラ周りなことが多く、SREはインフラエンジニアと間違えられがちではあります。
しかし実際には、SREは信頼性を上げるためであれば様々なレイヤーを渡り歩くことがあります。ボトルネックになるのがサーバーサイドのアプリケーションであればそれを直し、フロントにあるならフロントを直し。
しかしこれでは後手後手に周ることになりますし、本来はそれぞれのアプリを開発している人が対応すべき問題です。

そこでSREはいくつかのアプローチを取ります。
一つは機能開発のペースを落とさせることです。新機能の開発を止め、新たなデプロイを止めればアプリに起因する問題の発生率は下がります。空いた開発者の作業時間で残っている問題を洗い出し、解決させることも出来ます。

他には、アプリ開発の中で不具合を入れないための仕組み、ツール等を作ることです。
テストを回すのがわかりやすいですね。CircleCIや、最近ではGitHub Actionsなんかを活用しています。アプリの開発フローにテストが無い、あるいは不十分であれば追加する作業またはツールの作成を請け負います。
また、デプロイの手順や手法についても信頼性を損なわない手段があれば取り入れるなどします

このような作業を行うことで、サービスは不具合発生の割合が下がり、緊急対応に割くリソースは減り、アプリの開発者はより機能の開発に集中できるようになります。
特に不具合時の緊急対応はSREが行うことが多いため、緊急対応が減ることでSREが緊急対応以外に使えるリソースが増えます。この時間で信頼性を上げるためのツールを作成するなどの前向きな作業が出来るようになります。

エンジニアの皆様は信じられるのは公式ドキュメントと中の人とソースコードだけ、ということをご存知だと思いますので、SREについて気になった方は是非オライリーのSRE本を読んで頂ければと思います。僕がどれだけテキトーなことを言っているかわかると思いますので…。

ちなみに僕の話ですが、今年はAmazonLinux1がEoLを迎えるとのことでとにかく様々なアプリを別の場所に載せ替える仕事などをしています。楽しい。
SRE感はまだあまりないです、きっと来年からもっと楽しくなってくると思います。

おわりに

カヤックでもアドベントカレンダーの記事を順次公開しています、先輩社員のフロント/サーバーサイド/インフラ/解析など様々な分野のありえん強い話がたくさん読めるので、気になった方はこちらも是非よろしくお願いします。
Tech KAYAC Advent Calendar 2020 - KAYAC engineers' blog

あと大学ちゃんと卒業しようとして頑張っている方々、すっごい偉い。本当に尊敬してます。

就職して一ヶ月が経ちました

大学を中退し、秋から働いています。 一ヶ月経ったので今の気持ちを残して置きます

変化

Twitter頻度が減った

就職先は余り公開していないのですが、知っている人は知っているしどこまでバレているかわからないので、投稿する内容には常に会社の名前が付くと意識してTwitterをするようになりました。

結果技術系の投稿がほぼ消え去り、アイマスやCUE!や声優のRTが増えました。

自分で付けた枷とは言いつつ流石にちょっと窮屈なので、気楽にやっていけど度合いを探していこうと思います。

趣味の時間が増えた

周りの友人濃度が減ったので、一人の時間が増えました。就職とほぼ同時期に始まったCUE!の生放送を毎日見たり、PS4のゲームをやったり、料理をしたりしつつ毎日8時間寝るような文化的な生活が送れています。

プログラミングの楽しさを久々に思い出した

プログラミングが好きと言いつつも手を動かすことは余り多くなかった自分がここまで楽しいと思えることに驚いています。

本当に僕はプログラミングで食っていくんだろうか、中学の頃に周りと違う自分に酔って得たステータスに縋っているだけなんじゃないだろうかとずっと思っていましたが、今はプログラミングが好きだと自信を持って言えます。

大学の周りの人たちほど没頭できているわけじゃないし趣味も他に沢山あるけど、プログラミングが楽しいと思ったことは事実として忘れずに働いていきたいです。

与信枠が増えた

カードの与信枠が30万から50万になりました。そのままあとからリボ申請を出して脳汁出ました。

当分の目標は奨学金含む借金類の返済です。

意識

自分は大学退学という言ってしまえば人生のレールからの脱線組であり、社会人としてもあまりにも未熟で会社の名前を背負うことはまだ出来ません。なのでしばらくはひっそりと生活しています。

いつか社会人としても会社の人間としても自信を持てる頃になったら社名を出してOSS活動やコミュニティへ参加してみたいと考えています。

RaspberryPi 3B+/Raspbian LiteでBluetoothオーディオレシーバー作成

参考 qiita.com

Raspbian LiteでのBluetoothレシーバーの構築に成功したのでメモ

検証環境

  • Raspberry Pi 3B+
  • Raspbian Lite
    • 2019-04-08-raspbian-stretch-lite

Raspbian Liteセットアップ

Raspbianのセットアップ、インターネットへの接続は省略

パッケージのインストール

# apt update && sudo apt upgrade
# apt install bluez pulseaudio-module-bluetooth mpd

mpdの有効化

mpdはpulseaudioを建てるためだけに利用します

/etc/mpd.conf

デフォルトで有効になっているalsaコメントアウトし、pulseaudioのコメントアウトを外す

#audio_output {
#   type        "alsa"
#   name        "My ALSA Device"
#   device      "hw:0,0"    # optional
#   mixer_type      "hardware"      # optional
#   mixer_device    "default"   # optional
#   mixer_control   "PCM"       # optional
#   mixer_index "0"     # optional
#}

audio_output {
    type        "pulse"
    name        "My Pulse Output"
#   server      "remote_server"     # optional
#   sink        "remote_server_sink"    # optional
}

mpd有効化

# usermod -G bluetooth mpd
# systemctl enable mpd

bluetooth設定

bluetoothのコントローラーにaudio-sinkを追加するための権限をbluetoothグループに渡す

/etc/dbus-1/system.d/bluetooth.conf

bluetoothのpolicyにorg.bluez.MediaPlayer1の行を追加

  <policy group="bluetooth">
    <allow send_destination="org.bluez"/>
    <allow send_interface="org.bluez.MediaPlayer1"/>
  </policy>

/etc/bluetooth/audio.conf

デフォルトだとファイルがないので新規作成してA2DP関連のProfileを使えるように設定

[General]
Enable=Source,Sink,Media,Socket

bluetooth.serviceを再起動、mpdを起動してペアリング
showでAudio Sinkがあることを確認、なければmpdかpulseaudioが建っていない可能性アリ

# systemctl restart bluetooth
# systemctl restart mpd
# bluetoothctl
[NEW] Controller XX:XX:XX:XX:XX:XX raspberrypi [default]
[Bluetooth]# show
Controller XX:XX:XX:XX:XX:XX
    Name: raspberrypi
    Alias: raspberrypi
    Class: 0x0c0000
    Powered: yes
    Discoverable: no
    Pairable: yes
    UUID: Headset AG                (00001112-0000-1000-8000-00805f9b34fb)
    UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
    UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
    UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
    UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
    UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
    UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
    UUID: Audio Source              (0000110a-0000-1000-8000-00805f9b34fb)
    Modalias: usb:xxxxxxxxxxxxxxx
    Discovering: no
[Bluetooth]# discovering on
(Bluetooth接続したい機器から接続、失敗してログにMACアドレスが出るのにtrustとpair)
[Bluetooth]# trust YY:YY:YY:YY:YY:YY
[Bluetooth]# pair YY:YY:YY:YY:YY:YY
(再び機器から接続)

以降は機器側から接続するだけでOK

これでBluetoothレシーバーとして機能するはず。
pulseaudioを建てるためだけにMPDを使ってるのが悔しい