Eureka

アクアリウムとかサカナクションのこと

整理整頓は大事だけど、ガン分けされると使いづらいって話

日常生活は整理整頓されているほうが好きですけども。
switchの写真/動画保存時のフォルダ構成がカオスなのに困っている方がいれば参考にどうぞ。

switchの動画分けるの面倒だよね?って話

 switchに挿しているSDカードを良くぶっ壊します。多分2~3枚は壊している。
なんでそんなに壊すの?と聞かれると多分扱いが雑だから…?なんでみんな壊さないのって思う。

 そんなわけでよく動画とかをバックアップします。あのswitchの30秒動画。セーブデータより動画が大事。思い出が大事。無くなったら無くなったで悲しまないとは思うけども。たまに見返して、"あーこの頃下手だったなぁ"とか、"会社の友達と社員の集いやってたなぁ"とか考える。

 しかしswitchの動画保存のフォルダ構成が中々管理しづらい。フォルダガン分け構成。年-月-日フォルダ構成となっている。出来れば年-月フォルダ程度にはできなかったのか。ある程度まとまったフォルダに格納されているとWindowsの標準再生で垂れ流しできるからさ。あと、写真と動画は別にしてもらいたいなぁ…。

 文句言っててもしゃーないし、プログラムをパチパチ書いた。スイッチの動画フォルダ(年-月-日フォルダ)を任意の写真フォルダと動画フォルダに移動する。って感じ。windowsの標準機能で何とかしたかったので、batのforfilesでええべ。

switchの写真/動画ってどこにあるの?

 マイクロSDを挿している場合は、マイクロSD優先で写真/動画が保存されていきます。switchからマイクロSDを抜いてパソコンに認識させると、確か3つぐらいのフォルダに分かれているはずです。(うろ覚え)
その中のAlbumというフォルダに、写真や動画が保存されています。フォルダ構成を気にせず、そのまま移動させたい場合は、Album配下のフォルダを切り取ってPCに移行すればOK。
Saveフォルダとあともう1つなんかあったと思いますが、まあ触ったら死にます。

 ちなみに、switchの本体ver11.0から本体とPCを直接繋いで写真/動画を持ってこれるようになったらしいです。この場合どんな感じで送られてくるのかは知りません。
topics.nintendo.co.jp

環境/利用言語と注意事項(絶対読んでね)

  • Windows10
  • bat(CMD)

 プログラムをポチポチしましたけど、プログラムに関する質問は一切受け付けておりません。「動画が消えたよ!」などの文句も受け付けません。読めば分かるけど、moveだから消えるわけねーんだよなぁ。HAHA

 プログラムを見ると分かるのですが、基本的に何か悪さをするような仕込みはしていないです。でも、途中でどうしても止めたい!!!ってなった場合は、コマンドプロンプトの画面を×で閉じるか、もしくはコマンドプロンプトの画面をアクティブにしてCtrl+Cを押下してbatを強制終了してください。上記を読んで「お前何言ってるの?」ってなる方は、そもそも実行しないでください。

プログラム
@echo off

REM FROMフォルダ配下をすべて確認し、該当する拡張子のファイルを移動するプログラム

REM 変数宣言
REM 最後に¥は不要
set FROM="【switchの動画ファイルが置いてあるフォルダ】"
REM 最後に¥必要
set TO_M="【動画 移動先フォルダ】"
set TO_P="【写真 移動先フォルダ】"

REM フォルダ確認を行いなければ作成する
if not exist %TO_M% mkdir %TO_M%
if not exist %TO_P% mkdir %TO_P%

REM FROMフォルダを確認し、存在しなければ異常終了させる。
if not exist %FROM% goto ERR01

echo "動画を移動します。"
forfiles /P %FROM% /s /M "*.mp4" /C "cmd /c move @path %TO_M%"

echo "写真を移動します。"
forfiles /P %FROM% /s /M "*.jpg" /C "cmd /c move @path %TO_P%"

echo "処理が終了しました。"
pause
exit

:ERR01
echo %FROM%"フォルダが存在しません。異常終了しました。"
pause
exit

使い方

1.プログラムをコピー

 コードブロックに記載されている@echo offから一番下のexit /bをコピーする。全文コピーする。

2.メモ帳に貼り付ける

 そのままWindows標準機能に入っているメモ帳を起動し、1でコピーしたプログラムを貼り付ける。

3.プログラムを一部変更する

 今のままだとプログラムが動作しないため、下記箇所を自分の環境のフォルダパスに合わせて修正する。

REM 変数宣言
set FROM="【switchの動画ファイルが置いてあるフォルダ】"
set TO_M="【動画 移動先フォルダ】"
set TO_P="【写真 移動先フォルダ】"

↓ 下記は例です。

REM 変数宣言
set FROM="D:\switch_video"
set TO_M="D:\game\movie\"
set TO_P="D:\game\picture\"

ちなみに、フォルダパスって何?とか、そういう質問も受け付けておりません。(ggrks)

4.拡張子を指定しながらプログラムを保存する

 メモ帳>ファイル>名前を付けて保存する。
 ファイルの種類を【すべてのファイル(*.*)】にする。
 ファイル名は【任意の名前.bat】とする。
 保存先はどこでもOK。
プログラムのアイコンが下記のようになっていればOK、テキストの状態であれば拡張子を指定して保存する方法が上手く行えていない。

f:id:cre5cent-nn00n_sunset195:20210827140629j:plain
icon
5.実行する

 4で保存したプログラムをダブルクリックすると、プログラムが実行されます。

6.出力について

 「 1 個のファイルを移動しました。」と出力されている分に関しては、正常です。
 「エラー: 種類が "*.mp4" のファイルが見つかりません。」
 「エラー: 種類が "*jpg" のファイルが見つかりません。」と出力される場合は、FROMのフォルダに移動対象ファイルがない場合に出力されます。基本的に移動対象ファイルがない場合は、何もしないため特に問題はありません
 
 「【FROMで設定したフォルダパス】フォルダが存在しません。異常終了しました。」と出力される場合は、switchのビデオファイルを保存しているフォルダパスが存在しない、またはフォルダパスを誤っている可能性があるため確認してください。

確認

 プログラムが終了すると、「なんかキーを押してください」って言われるようにしました。まあなんかキーを押してください。すると真っ黒な画面は閉じられるかと。
 動画はプログラムで指定したTO_M、写真はTO‗Pへ移動しているかと思います。
 FROMで指定したところには、フォルダが残っています。フォルダの中身がないことを確認して削除するなりそのままにしておくなりどうぞ。

後記

 batをペチペチするのはいつ振りか…。プログラマになりたかったきよたろう、なぜかインフラに配属された結果、やけくそにbatを作ってた気がする。本当はJavaとかやりたかったんだけどなぁ。
 これを書いてて思ったけど、標準機能で使えるって結構便利だよね。WindowsOSならオールオッケーって感じ。

 これを作ってて気づいたけど、switchの写真/動画ファイル名の後ろのハッシュ値みたいなのがソフト認識番号なのね。今って写真と動画を一緒くたんになってるからソフトごとに分けるとかしてもいいかもなあ。リングフィットとゼルダスプラトゥーンってなってて、スプラの動画だけ見たいことはある。

 あと、全く関係ないけどヒステリックナイトガールの歌詞の「最低なんて言わないで『大変、遺憾』で大正解」って歌詞がめちゃくちゃ好きです。

ライダーになったらしい

最近になって公道に出る権利を得た。

親からは「取れ、金は出す」と言われ続けてたけど、高校から私立、道具の費用が尋常じゃなく高い部活、私立大学を出させてもらってる身からすると、もうなんかすみません大丈夫です。となっていた。

大学も奨学金使ってないわけで、働いてから「奨学金払うために辞められない」って人たち見ると、借金を背負わせないようにしてくれた親には感謝してる。

そもそもそんなに免許というものが必要じゃなかった。電車、バス、徒歩で大体どこにでも行ける。「30万円ぐらいの身分証明書」と会社の同期が言っていたのを聞いて、意味ないやん?ってなった。

そんなやつが突然免許を取ったのかと言うと、親の高齢化が原因。色々ある家庭なので有事の際の運転手がいないのは困る。そろそろ老人と自覚を持ってほしい父親は、未だに6〜7時間かけて車で宮城に帰ろうとする。兄貴は諸事情により免許を返納してしまった。頼む、公共交通機関を使ってくれ、仙台なら新幹線で1時間半だ。そこからレンタカーでええやないかい。と何度親を説得して失敗したか覚えてない。

「免許取らな〜」と思っていたけど社会人になって仕事が忙しく夜勤もあり安定しなかったため放置していたら、急遽やって参りましたコロナ禍。なんと、在宅勤務。お家最高やぞ〜!緊急事態宣言の合間合間に同期と会って「免許取るなら今じゃね?多分給料1ヶ月分ぐらいで行ける」と言われた。その後ノリで自動車学校に入校。

入校したはいいけど、緊急事態宣言があったもんだから激混みしてると言われた。最初の方は座学がメインでした。それでも社会人になって久々の座学で楽しかった。"教えてもらえる"って環境が楽しすぎるな。(seは基本調べろと言われるので)
座学が終わったタイミングで、徐々に入ってくる実技。初めての運転席。絶対に乗ることはないと思っていたのに…。
車に関しては一切失敗したり落ちることなく順調に進め、2020年10月~2021年3月で終了。免許センターもコロナ禍のため予約制となっており、落ちると次受けられるのは1ヶ月後とかになるのでめっちゃ勉強しました。
ここまでが普通自動車の話。

 

免許取得してから3日後に再度自動車学校に入校しました。
理由は普通二輪の免許を取得しようと思ったため。

 

自動車学校の受付の人が「あれ?え?」みたいな雰囲気で対応してくれたのが面白かった。流石に3日後に再度自動車学校に入ろうとするやつは異例だったようです。(一応)女なので、普通二輪の入校条件が2つありました。

  • バイクに跨って足がつくこと
  • バイクの引き起こしができること

当方小柄ではない女、バイクに足がつくのは余裕でした。当方運動しかできない女、バイクの引き起こしのコツを聞いて試してみたら普通に引き起こせました。ただ腰を壊しかねないのでマジでお勧めしない。私もピキッってなった。(バイクは200キロあります、ATだと230キロあります、馬鹿なの?)
この時点で200キロという未知の重さに振り回されていました。教官とかめっちゃ簡単に乗るけど、こんなん乗り回してるんか。

なんだかんだ言いつつも、教習が始まって最初にやることはバイクの取り回し。エンジンをかけずにバイクを動かすのですが、これが地獄だった。8の字にバイクを運んでいくんですけど、200キロ、ちょっと傾くたびに身体ごと持っていかれそうになったり潰されそうになったりして、まともに動けたもんじゃない。元運動部の気合で8の字はクリアした。

2限目からは実際にバイクに跨り操作していく。しかし少しでも車体が傾くと倒れるのです。跨って両足出して、クラッチ操作だけでよたよたと進むのですが、自転車しか乗ったことない私、フロントのブレーキングがきつ過ぎて転倒しました。これには教習中ずっと悩まされることになる。

3限目からは実走ということで、校内をトロトロと乗っていました。普通自動車の免許をATで取ったため、クラッチの概念やらシフトチェンジやらが理解できず、3速とかで普通に停車する、エンストする、シフトアップとダウンを逆にやってしまうなどなど。結構カオスな状況となりました。クラッチがあるだけで覚えることが多すぎるんだぁ。

それ以降、「なんで入校してしまったんや!!!」ってなるほど転倒、失敗を繰り返していました。とある方から「慣れるよ!」と言われていたけど、慣れる気配全然ない。なんなら交差点とかで曲がれないレベルだった。だって200キロ!傾けたら!倒れるじゃんか!!!

急制動は5回ぐらい落ちてるし、なんなら速度30キロ出して200キロの巨体と共に横転をキメてるわけで、教官の「コイツ…ヤバい…」って顔は忘れられない。急制動の後は、スラローム、S字カーブ、クランク、1本橋とか気が狂ってる。教習時間もオーバーしそうで、このペースだと30万ぐらい追加でかかるんじゃないかと思っていた。「そんなんだったらやめた方がいいなぁ」vs「先のこと考えて落ち込んでんなよ、とりあえず急制動頑張れよ」が戦って後者が勝ちました。

ブレーキ強いよ…のお墨付きをもらって(?)急制動をクリア、スラロームとかの前に8の字走行をやることになりました。この時の教官にめちゃ助けられた。
本来8の字走行なんて10分ほどやって終わりなのに、「曲がる感覚が分からん」と嘆く私のために丸っと1時限分8の字に費やしてくれました。この時にやっと「曲がる感覚」を覚えて気づく。もしかして、私慌てすぎ…?もしかして、合力って思った以上に強い…?気付きを得てからは、安定してバイクに乗れるようになりました。

その後は順調に実技を進めて、第2段階はノーミスでクリア。

卒検当日は、「1本橋得意だけど落ちたらどうしよう、スラロームとクランク接触したらどうしよう、急制動速度出なかったらどうしよう、転倒したらどうしよう」と突然弱気になりました。(全部検定中止事項)検定待つ間、他の教官から「大丈夫だよ~」とあやされてました。マジバブみ

自分の番になって、後方確認→乗車→ミラー調整→エンジンON→右後方確認→発進!!と思ったら突然エンスト。「????」ってなってたら、教官が「サイドスタンド上げた?」と一言。見事に下がったままでした。卒検の緊張って何をやらかすか分からないですね。
順調にコースを進めて最後に降車するときも、なぜかエンジン入れっぱなしのまま降りて慌ててエンジンを切るなどということがありました。エンストは減点だろうけど、エンジン切らないまま降車ってどうなんだろうなぁ。ホント卒検の緊張って何をやらかすか分からないですね。

無事82点ぐらいで合格し、その日のうちに免許を更新しに行き、バイク屋さんに納車日の調整を入れました。

納車日はマジでビビり散らかしていました。バイク屋さんの目の前坂だよぉ!!交差点エンストしたらどうしよう!!カーブ曲がれなかったらどうしよう!!と不安は尽きず。
原付に乗る父親に迎えに来てもらおうかと思ったけど、自分のペースで走りたいし、走行時のコミュニケーション方法がないから気を遣うし、って考えて結局一人で公道デビューすることにしました。

納車日にバイクの操作説明を受けて、「じゃね~(超軽いノリ)」って感じで見送られて勢いで公道デビューしました。選んだバイクが良かったのか、事前に行動デビューについて調べて「発進時はアクセル回せ」を実行できてたからかエンストはありませんでした。

公道デビューして真っ先に思った感想は、「段差怖えぇ~」でした。教習場内は歩道がないからコンビニやらガソスタやらに入るための乗り上げの衝撃にビビり散らかす。あと、速度が出ている走行は大して怖くないけど、低速で、駐車場に入る時がめちゃくちゃ怖い。心の中で「他人の車やバイクに接触したらどうしよう」と思っています。

そんなこんなで1年前はマジで公道に出る権利のなかった人間が、突然普通四輪/二輪免許を取得したという話でした。

運転の練習がてら行きたいところ。

PythonでTwitter通知Botを作った

唐突ではございますが、ふれんどしっぷをですとろいしたい。本当にしたいわけではないけど、いたずら感覚で仕掛けたい、そんな気分です。
はてなブログにはコードブロックが存在しないので、DiscordBotを作成した話とか誰も得しないんじゃないかと思っていたのですが、存在しているらしい。マジか。
そんなわけで、今回はコードも載せてみよう。汚いってダメ出しはいらない。誰かの参考になればいいな。

経緯

メインで活動しているSNLとは別に、実は時折別のチームでリグマに参加してたりします。
突如現れるへたくそな奴でも快く受け入れてくれる楽しいチームです、そして皆うまい…。
そこのリーダーが、突然「(SNLにある)Twitterに通知するBotほしいんだよね…」とのこと。残念ながらTwitterに通知するBotは私が作成したわけではない。
というわけで、再度一からPythonで作成してみた。興奮気味で「作る!作るよ!!!」って言ってた気がする。オタクかよ。

要件定義

ほとんどSNLにあるTwitter通知Botと同じようなのをご所望されていたので、要件は下記の通り。

  1. Discordに先頭【!tl】が入っていたらTwitterに連携
  2. Twitterに連携してほしいのは、Discord名前と内容
  3. Twitter上限文字数(140文字以上)はエラー返却

1.の!tlの流れは、前回作成したリグマ通知ボットでクリアしているため特に問題なし。
2.もリグマ通知ボットで取得で来ていたので問題なし。
3.も要するに内容の文字数をLENで取得して140文字だったらエラー返却すればいいので問題なし。

設計

PythonからTwitterに連携する方法ってググってみたら、OAuth認証&TwitterAPIでした。
下記のような感じで、とりあえずTwitterAPIを使うためにOAuth認証をしなければならないとのこと。

f:id:cre5cent-nn00n_sunset195:20200430174547j:plain
適当設計図
初めてGoogleSlide使いました。

TwitterAPIを利用するための下準備

ということでぇ↝、TwitterAPIを使うためにアクセストークンを取得したわけです。
こんだけ日本で流行ってるTwitterだし~、文献あるし~、余裕っしょって思ってたら大間違いでした。
キャプチャを貼り付ける元気はないので、簡単に箇条書きで書きます。

  • TwitterのDeveloperサイトにアクセスする。
  • Twitterのアプリを作成しようとすると、DeveloperToolを何に利用するか聞かれる。

 →Making a botにした気がする。

  • Twitterアカウントに電話番号を登録するのと、国、ニックネームを記載しろと言われる。
  • TwitterAPIを何に利用するのか聞かれる。

 → In your word/In English/Responce must be at least 200 characters
  私日本人やねん。私英語ダメやねん。最後なぜか200文字以内って訳してて、永久にアクティブにならないNextボタンと戦ってました。
ていうか、この後全部英語で、教養のなさを痛感しつつGoogle翻訳さんに手伝ってもらいながらTwitterアプリの生成まで行きました。

アクセストークンなどを取得

アプリを生成したら、Detailsをクリック→Keys and Takensを見て4つの良く分からない半角英数字の羅列を取得する。

f:id:cre5cent-nn00n_sunset195:20200430182948j:plain
APIKey
アクセストークンとかは、最初出ていないので「Generate」をして表示させます。
ちなみに、TwitterAPIを調べたんですが、色んなことができます…Twitterの機能片っ端からほぼ全部できるんじゃないかと思うほど。
アクセストークンがばれたら、それを連携しているTwitterアカウントが何しでかすか分からないのが怖い怖い。

コーディング

Twitterライブラリのインポート

今回Twitterライブラリを用いる予定だったので、あらかじめTwitterライブラリを落としておきました。
ちなみにDiscordとの連携も必要なのでライブラリを落とす必要があります。

#Twitterライブラリのインストール
pip install twitter
Twitter連携を行うプログラム

Twitter連携させるプログラムを作成します。
純粋に上記で作成したTwitterAppsを連携していあるアカウントに対して、「あいうえお」とツイートさせるプログラムです。

#Twitterのライブラリをインポート
import twitter

#Twitter連携を行うプログラム
def main():
    #TwitterAPIKey などを記載する
    Consumer_Key="********"
    Consumer_Secret="********"
    AccessToken="********"
    AccessTokenSecret="********"

    #取得したキーとアクセストークンを設定する。
    Oauth = twitter.OAuth(AccessToken,AccessTokenSecret,Consumer_Key,Consumer_Secret)
    twi = twitter.Twitter(auth=Oauth)

 #TwitterAppsを経由してTweetする
    twi.statuses.update(status="あいうえお")

    return
DiscordBotのプログラム

特に説明はしないのですが、基本テンプレのように下記を利用しています。
~~~と記載されている箇所にコーディングをしていきます。

#Discordのライブラリをインポート
import discord

#DiscordBot Tokenを入れる。
TOKEN = '**************'

# 接続に必要なオブジェクトを生成
client = discord.Client()

# 起動したらインタプリタにログイン通知が表示される
@client.event
async def on_ready():
①~~~

# メッセージ受信時に動作する処理
@client.event
async def on_message(message):
②~~~

#変数mesに入れた内容をDiscordBotが通知する
await message.channel.send(mes)

# Botの起動とDiscordサーバーへの接続
client.run(TOKEN)

①~~~には、プログラミング起動時に動かしたい内容を入れます。
私は基本的にDiscordに通知させたいわけではなかったので、print文などでインタプリタに表示させています。

②~~~には、させたいことをコーディングしていきます。
Discordの情報は【message】に入っているので、お好みのものを取得していきます。
message.content だと、メッセージの内容
message.author.name だと、メッセージを打ったDiscordユーザ名

今のところ私がやっていることは、「ある発言をしたら〇〇をする」なので、基本的にmessage.contentの中身を判定させて処理を行っています。
そのため【message.content】をStartsWith メソッドで先頭にコマンドがあるかを条件判定して処理を書いています。
※先頭以外を判定したいならre.searchを使ってます。

TwitterとDiscordのプログラムを合体させる

TwitterのプログラムをDiscordBotのプログラムの②~~~のところに記載すればいいのです。
そうすると、ユーザが何かを発言したら、Twitterに「あいうえお」ってツイートされます。あとは、要件を満たすようにプログラムを組んでいく。

#DiscordとTwitterのライブラリをインポートする
import discord
import twitter

#TwitterAPIKey
Consumer_Key="*******"
Consumer_Secret="*******"
AccessToken="*******"
AccessTokenSecret="*******"

#DiscordBot Tokenを入れる
TOKEN = "*******"

# 接続に必要なオブジェクトを生成
client = discord.Client()

# 起動したらインタプリタにログイン通知が表示される
@client.event
async def on_ready():
    print('ログインしました')
    print('Discord-Twitter-PostBotを起動します。')

# メッセージ受信時に動作する処理
@client.event
async def on_message(message):

    CommandTrigger="!tl"
    Twitter=140

    # メッセージ送信者がBotだった場合は無視する
    if message.author.bot:
        return

    if message.content.startswith(CommandTrigger):
        #取得したキーとアクセストークンを設定する。
        Oauth = twitter.OAuth(AccessToken,AccessTokenSecret,Consumer_Key,Consumer_Secret)
        twi = twitter.Twitter(auth=Oauth)

        #コマンドは投稿しない、ディスコードネームに置換する
        message.content=message.content.replace(CommandTrigger,message.author.name+":")

  #140文字以下か判定する
        if len(message.content) <= Twitter:
            #Twitterに投稿
            twi.statuses.update(status=message.content)
        else:
            mes="Twitterへの投稿に失敗しました、文字数を減らしてください。"
            await message.channel.send(mes)

# Botの起動とDiscordサーバーへの接続
client.run(TOKEN)

Discordの発言の先頭に【!tl】が入っていた場合、Twitterに通知するプログラムの完成。
ステップ数も多くないので、ある程度学んでしまえばすぐに作成できるなぁーって印象。

後記

最近仕事が安定しているからか、暇で暇で…。
プログラミングがしたいっていうか、暇つぶしがしたかっただけです…。その暇つぶしがたった2日で終わるとは考えていなかった。
こう…色々学ぶと「あーあのTwitterで仲いい人出す方法は、このAPI使ってるのかー」とか「tweet削除するやつはこうやって組むのかー」とか、仕組みが分かるのは楽しいです。
スプラトゥーン3が出たら、Twitterにスケジュール流すアカウントでも作成しようかな。
依頼してくださったとあるチームリーダの方、またテストに付き合ってくださった方、ありがとうございました。
なんかプログラミングするためのネタをくれーえ!

Pythonでスプラトゥーン2のリグマ募集DiscordBotを作った

熱帯魚が水槽から飛び出して、地面で煮干しのように干からびている光景を目にした飼い主の気持ちを答えよ。

夏あたりからPythonを使ってDiscord Botを作成したことのアウトプットをつらつらと。ちなみにこの記事を書いては止めてを繰り返して2ヶ月以上経っている。
なお、以下、プログラミングコードなどは載ってない…はず。(理由は汚い&見たまま記法なのでコードブロックがない。)

 

 

経緯

超大型台風が来て、関東全域が停電になるっていうから暇つぶしにできることを探した結果である。「え、ゲームできないじゃん?テレビも見れないじゃん?暇じゃん?」ってなりました。ネットも使わずにやれる暇つぶしはないかと考えた結果、そうだプログラミングをしよう!となる思考回路。
チームへリグマを募集するようになって気づく。@everyone入れるのがめんどくせぇと。ルールを調べるのがめんどくせぇと。ステージを打ち込むのがめんどくせぇと。Twitterクライアントを入れていないため、@everyoneが入ってないと募集を見逃す。
全てにおいて、まず「めんどくせーぇ」と言うことに定評がありすぎるため、なんとかならんかなぁと考えていました。

その結果がコレである。

運用について

チームのリーダーがbotを作っていたので色々調べる。なぜか最初に運用の方法調べました、作って運用に金かかるってなると非常に萎えるので。
結果として、botHerokuを使えば無料で動かせそうってこと、Pythonも無料で触れそうってことが分かりました。
最近は無料で何でもできる世の中でうれしい限り。言語をPythonにした理由はネットに転がっている文献が非常に多かったので、コピペで作れるかなって思ったの。RubyでもJavaScriptでも何でも良かったって言えば良かった。

 

要件定義

んじゃぁーとりあえず要件を決めようってこって、下記としました。

  1. 冒頭に【.tl】、文章内に【@everyone】を入れる
  2. botを叩いた人の名前を入れる
  3. ナワバリまたはリグマのステージを通知する
  4. ルールと今のステージと次のステージまで分かるようにする

本当はリアクションで参加表明通知とかさせたかったんですけど、めんどくさくなってしまったので入れませんでした。なるべく早めにリリースをすること、多分そうしないと頓挫する。

 

環境設定

Python初心者だったためPythonのインストールとエディタを確認する。Pythonはなぜか3.*と2.*があったんだけど、あれは何なの?よく分からないけど、バージョンは高いほうがいいべってことで【Python 3.7.4】をインストール。インストールの方法はQiita様に聞きました。

エディタは何にしようかなー、メモ帳でもいいんだけどいいのないかなー?って思って色々ググったところ【PyScripter】というのが良さげだったのでインストール。無料のくせに…とても使いやすいです、ありがとう。

Pythonをインストール後、Discord Bot用のプラグインがいるとのことでインポートを実施しました。

ついでにDiscordのサーバを立てる。無料で建てられるなんて初めて知ったぞ。
自分のサーバを建てた後は、Botをサーバ上に作成してトークンを生成しました。
ちなみにここまでを台風の前日にクリアしました、ネット環境必須のところなので。

 

構築(台風当日)

朝から豪雨、きっと新宿も豪雨だったでしょう。
まず真っ先に電気がつくことと水が出ることを確認して、朝ご飯を食べて少しゲームしました。飽きてきた頃合いでPCを起動し、Discord Botの作成を実施しました。

コードなどはQiitaに聞いてください笑

 1時間ほどで自分の発言に反応するDiscord Botが作成できました。コードは当たり前のようにコピペです。
要件の1と2はクリアできたので、本格的にスプラトゥーンの情報を取得しようと考えました。

Discord Botの作り方を調べてる時点で、ステージAPI*1があることは分かっていたので、とりあえずGoogleさんに「Python WebAPI 取り方」って聞いてみた。速攻でQiita様が答えてくれました。良くある天気予報を取るやつが上がってきたので改変をしてステージ情報のJSON*2を落としてくるようにしました。
ここら辺からが非常に厄介で、インフラしかやってこなかったため「じぇいそんとは…?でぇたけいしき…?」と猿が初めてプログラミング触ったんか?レベルでひたすら調べ続けてました。結果としてよく分からんけど、なんか配列くさいやつ。全部をインタプリタに出力したら、とりあえずステージらしきものが取得できてました。ここから添字を追加してお目当てだった「今」と「次」のステージ情報を取得。

残りは、「自分の発言に反応する」プログラムと、「ステージ情報を取ってくる」プログラムをがっちゃんこして完成。テッテレーン

なお、豪雨暴風で非常にお外はうるさかったのですが一切停電などは起きず、私は一体何をしてるんだと…。 

 ここまでやってとりあえず寝ました。要件は満たせているけど、APIを借りているサイトの要件(User-Agentの明記)が済んでいなかったので、後日記述しました。

 

テスト

しないよ、してないよーーー!!!!!!

一応軽く時間跨ぎとかした程度です、情報が間違えているとすれば…API側()。
軽くAPIに渡す引数が正しいか、とかそういう程度のテストです。

 

リリース

前述しているが、サーバはHerokuを使うことにしていました。Qiita様様で「DiscordBot Heroku アップロード」で全てが解決した。めちゃくちゃ時間かかったけど…。
まずHerokuにアップロードするための3種のファイルの書き方が分からなかった。地味に大文字小文字も判定されてて、アップロードして起動しているのに無反応だったりして…。
インタプリタぽいものがどこにあるかも分からないし、動かない理由がどこに出力されているの?!って感じでてんやーわんやーしてました。
なお、調べて色々Try&Errorをしてしまったため、明確に記載できない。する気もない。コマンドを全部コピーして、今でも無心でアップロードしてますw

 

後記

色々書きましたが、適当です。「頑張ったね、自分」という気持ちを込めて笑
なお製作には約3日ほどの人日となります。Pythonとか業務で使ってる人なら半日あれば終わるんじゃないか説。

実はリリースしてから「もしかして余計な事してない?!」とか「頑張って作ったけど使われなかったらどうしよう」などと突然不安になりましたw チームリーダーや運営の方々、アイコンを描いてくださった方…結構な人を巻き込んでいた気がする。本当にすみません、そしてありがとうございます!運用の方法を調べる前に、まず許可取ってから動こうな?

半年ほど運用していますが、なんだかんだチームメンバから使われているのを見て嬉しい次第でございます。やっぱツールは作っても使ってもらわなきゃ意味がないのでね…。使っていただき、ありがとうございます!! 

 

ファイルサーバが突然死んでしまったお話

適当に、忘れるな。2019年、年末を。

最終的には復旧してる。だらっと文章を書く癖があるので、結論から言うと、運用設計はしっかり、特にバックアップは大切だと身をもって実感したというお話。知ってはいたよ、でも身を持って実感できた。

弊社には、よく分からない理由で構築された2つのサーバ環境がある。一つは社員が繋ぐRDS環境。もう一つはインフラ検証用の環境。作った方々は社内におらず、いいタイミングで事業所勤務になった私が管理することになった。管理することになったはいいが、引継は一切ない、正しいかも定かではない設計書、毎週月曜日の早朝はメンテ日ね☆と記載された謎の運用ルール、ベンダのサポートが有効になってるかも分からない。

詳しくは省くが、とある日、ファイル共有が問題になることがあった。ストレージのアクセス権の関係上見せたい人に資料を見せられないとのこと。検証環境のリソースが空いていたこともあり、そこにsambaでファイル一時共有サーバを構築した。大前提として「一時共有」のためと念押しして置いたにも関わらず、それはいつの間にか業務情報を格納するファイルサーバに昇華していた。

そしてそれは突然起きた。いつもは現場に出ていて、たまたま帰社した時に「昨日からファイルサーバに繋がらないです…。」と別部署の後輩から突然報告を受けた。たまにネットワーク的に繋がらない場合もあるが、昨日からってなると期間が長すぎる。直属の後輩君が不慣れながらも仮想化環境にログインしVMを確認して一言『4号機のVM全部死んでますね』「おんやぁ…(震え)」

まだ脳みそが沸いてる私は「まぁ4号機(物理サーバ)が死んだら3号機とかに移せばいいんじゃない?」と甘く見積り、とりあえず物理サーバを目視で確認しに行く。すると、物理サーバは正常稼働していた。やっとここで事の重大さに気づく。死んでいたのはNAS*1で……、そしてディスク障害でなかった。

NASが沈黙している、パワーオンスイッチを押しても反応がない、電源障害だ、バックアップ取ってない、ファイルサーバのデータが…!データがぁ! などと脳内で色々考えていましたが、たった一言声を出せたのは「ヤバイ…」だけ。本気でヤバイ時って語彙力無くすよね。

そもそも、サーバもNASもEOS*2を迎えていてベンダサポートは受けられない状態。要するに終わった。さようならファイルサーバ内のデータ。とりあえず上司に報告をしました。「NASの電源が逝ってました。どーやっても動きません。」『ええ…?どうにかならない…?』どうにかしてよと言いたいのはこっちである。

 

壊れた筐体と同じ筐体が1台ある。それも絶賛運用中ではあるが、社員が使っているサーバのNASではなかった。これを止めて外側を使えば…、HDDのデータを復旧させることができる…?しかし、私の知見の中でそんなやり方の前例はない。しかし他に思いつく手立てがなかったので、上司の許可を得てレッツ行き当たりばったり復旧。

以下、壊れた筐体はNAS1、動いていた筐体はNAS2表記となります。

作業フローは結構簡単。

  1. 検証用VMを全部止める
  2. 物理サーバーを止める
  3. 生きているNAS2を止める
  4. 死んでるNAS1と生きてるNAS2のHDDを入れ替える
  5. NAS2(中身はNAS1)を起動
  6. 物理サーバを起動
  7. ファイルサーバを起動しデータを取得する

 

NASのHDD入れ替えまでは余裕でした。入れ替えてNAS起動するときが1番心臓に悪かった。エラービープ音で一撃死、私の心臓も停止します、頼むー動けー動けーとひたすら祈ってました。ガチ祈りしてたら後輩が冷めた目で見てきた。祈りの力はすげぇんだぞぉ?!

無事立ち上がった筐体のディスプレイには、NAS1と記載されている。良かった良かった、HDD認識してフォーマットかけるような仕様じゃなくて良かった…。上司がボソっと「人間でいうと脳の取り換えっこだねぇ…」とかほのぼの言っていた。ちょっと黙って。

LANを挿してWebコンソールから状態を確認するが繋がらない。PINGも通らない。おんおん(?)しながら再度サーバルームに入って筐体のディスプレイを確認するとLAN1のIPが164.254.100.100。リンクローカルアドレスぅ…。LANケーブルとノートPCを持ってサーバルームに突撃し、ノートPCのアドレスを164.254.100.101/24に固定しNAS2とLANケーブルでつないでWebコンソールに接続、繋がったー!!!

IPアドレスをリンクローカルアドレスから社内のIPアドレスに変更して、PINGを確認して疎通OK。物理サーバを起動して、ストレージを確認すると何にもなぁぃ?!仕方なく新規でストレージを追加する…が、作成者じゃないからフォルダパスがわかんねぇ。ホントどうでもいいんですけど、開発者はさ、ちゃんとさ、設計書書けよ!マジで。

NAS2のWebコンソールからフォルダの情報を確認し、ネットワークストレージの設定を物理サーバに入力して読み込ませる。物理サーバからネットワークストレージを参照して、ファイルサーバのvmxファイルを探して、インベントリ登録を行って起動して終了!!!と思ったら、VM側からエラー…。よく読むと「インベントリが重複してるよ!」とのこと。
NAS障害のせいで、アクセス不可と記載されているインベントリを片っ端から削除、削除、削除。何もなくなったところで、お目当てのファイルサーバのvmxファイルをインベントリ追加する。

インベントリに追加できればこっちのもの、VMをパワーオンする!応答がない!質問に答えろとのこと、サマリから「VMコピーしたん?」って聞かれていたので「したよ!」と半ギレで嘘の回答しておく。

VMも無事起動したので、社内ネットワークからファイルサーバにPINGを送る…、通じないorzなんでこう、ワンステップごとに繋がらない事象が発生するのか。
IPを確認すると、全く違うアドレスが登録されている。Linuxの「/etc/sysconfig/network-scripts/ifcfg-eth****」を確認、ちゃんとIPは振られてるのに…?あ、MACアドレスが違うのねー、ということでMACアドレスを直してnetwork restart。無事接続できて復旧。

ファイルサーバ内のファイルを確認し、接続断が起きた時点のファイルは残っているということが分かり、とりあえずクビにはならなかったよ、セーーーーーーフ。
色々書いたけど自分への備忘録でしかない。作業時間は4時間ぐらい、行き当たりばったりだったけど早かったほうだと思う。
忘れちゃいけないバックアップ、設計考えるのも重要だけど…めんどくさがらずファイルレイヤでもいいからバックアップすりゃドタバタしなかったんや…。

上司に「さすがフルスタックエンジニア」と言われました、フルスタックエンジニアのお給料はもっと高いです、お金をください。
迷惑をかけた別部署の後輩にはケンタッキーおごっておきました、おいしかったです。

*1:Network Attached Storage ネットワーク上のHDD

*2:End Of Support

iPhoneのバックアップを取ってCドライブを逼迫させたお話。

iPhone11を購入したらPCのCドライブが逼迫した話。

iPhone7を発売当初購入して、そろそろ充電がやばいなーとか思っていました。でも7で不便してないし…と思って最新版のiPhoneを見て色が可愛かったので即予約しました。

iPod nanoの第3世代を彷彿とさせる色ですね。Greenとpurpleで悩んでGreenにしました。大満足。

そんなこんなで機種変かける前にバックアップを取ったりパスワードめもったりして変更に準備万端。機種変してバックアップから戻して~と…。

iOSが13になっていましたが、25日辺りにマイナーバージョンアップが配信されるようで…、念のため11でもバックアップを取っているときに気づいた。

なぜかCドライブが逼迫していると…。

最近アプリケーションとかインストールしてないし、なぜなぜ状態…。

色々調べてると容量が多いのはユーザプロファイル内…?全部プロパティ開いても50GBも容量ないぞ…?隠しファイル…?隠しファイルを表示させて見てみると、やっぱりApple…orz

原因はiPhoneのバックアップ…。

iTunesから、編集>設定>デバイスでバックアップを全部削除して容量が落ち着きました。iPhoneのバックアップってiTunesが入っているドライブにインストールされるんかねぇ?容量空き空きのDドライブにとってほしいものです…。

自分用備忘録。

SAKANAQUARIUM 2019 (834.194) 6.1ch Sound Around Arena Session IN MAKUHARI Messe

そんなこんなで4月6/7日の幕張ライブに当選しました。正直、期待なんてしていなかった。なぜならSakanazukan Seminarの続きだと思っていたし、前回のライブから2ヶ月、唐突に告知されるアルバム、そして延期。「あ~チケット売れないからアルバムツアーにしちゃおうってやつね」心の中で毒づいて、ライブ行ってつまらなかったらファンクラブ退会しようとまで思ってた。

こちとら6年間ずっっっっっとアルバム待ってるんだぜ?毎回毎回ライブに行って「アルバム出します」って詐欺、何回聞いたと思っているのか。ファンだって愛想を尽かす。と思っていました。けどめちゃくちゃ楽しかった。ライブもだけど色々と楽しくて残しておきたくなった。

6日は、会社の行事があったのでそれが終わってから会場に向かいました。17時半とかについて悠々と会場入り。グッズ買いたかったけど、まぁいっか。っていうわけで割愛。

以下はすべて7日の出来事。

何を思ったか、13時に海浜幕張に集合と言ってしまった。2月のライブを思い出せよ。グッズ並んでなかっただろ…。真面目なお友達と行ったので、しっかり13時に集合。地獄のごとく混みまくってる海浜幕張駅東方神起のファンイベントと被っていた模様。

ゆるゆると幕張メッセに向かって、クジを引き、グッズに並び購入、その後コインロッカーを借りて荷物を預けて暇をする。この時点で時間はまだ14時。開場まで時間つぶしをすることに…。とりあえずおなか減ったので腹ごしらえをすることにして、海浜幕張駅に戻りました。唐突にたこ焼きが食べたくなったんだ…。調べたら海浜幕張駅に銀だこあった、ラッキー。

たこ焼きだけだと、すぐおなか減りそうだったのでパン屋でパンを購入しました。そしてジャニーズ大好きな友達から聞いたライブの前に飲むとよいと言われたアミノバイタル ゼリードリンク」を探しに薬局巡りをすることにしました。どのアーティストでも言えるんですが、ライブはスポーツですよね。すぐに見つかって2つ購入して暇に…。

海浜幕張って何度かライブで来ているのですが基本幕張メッセにしか行きませんでした。千葉ロッテマリーンズの本拠地だし…ということでZOZOマリンスタジアムに行くことに…。友達がELLEのライブで行ったことあるそうなので案内してもらいつつ転売ヤーがすごかったなどの話を聞きました。お互いシステムエンジニアなので日の当たる中散歩するの久しぶりだった気がする。日中帯ヒッキー決めてるぜ。

7日はたまたま試合はやっておらず、閑散としていました。横浜スタジアムよりも広々していて待ち合わせしやすそーだなーというのが印象。犬の散歩とかランニングしてる人とかいた。ベンチがあったので休憩しつつ購入したパンを食べてました。2列つながったバスとか通ってるの見て「乗りたいw」と騒ぎ立てる始末。

少しベンチでお話ししてたら友達が「海の匂いがする」と…。そういえば海近いんだっけー?ってことで浜辺へ行きました。ちなみに私は花粉症のためマスク着用。海の匂いには気づかなかった。ZOZOマリンスタジアムの近くはすぐに砂浜!海!少し暖かったけど泳ぐのには寒いし人いないべーと思ったのですが、結構人いました。多分同じように時間潰している魚民さんかな。

のんびり浜辺を散歩して、時間を見たら16時前。そろそろ着替えておくかー!と思って幕張メッセに戻ってコインロッカーに向かい購入したグッズを取り出してトイレに向かうと長蛇の列。仕方なくアウトレットまで行き、トイレを借りて着替えました。

そのあとのどが渇いたのでサンマルクカフェで飲み物をテイクアウトして、幕張メッセ近くの原っぱでのんびり…。大阪ミックスジュースを購入しました。あっっっま。ジャニーズ大好きの友達が「バナナは何でも勝つ」って言ってたけどホントにそうだなーってしみじみ思うぐらいのバナナ。陰ってきて少し寒かったなあ。

友達がキョロキョロ辺り見回して「桜咲いてたら花見になったんですけどねー」って呟いてた。私も花見したかったんだよー、友達とのお散歩楽しいよ…来年誘いたいなー。

30分前ぐらいになったのでゆるゆる会場入り。

そんなわけで以下はセトリと感想のため、ネタバレ回避のために伏せておきます。

続きを読む