Pietでカラーゴルフ(有彩5色+白)をした
この記事は KMCお絵かき Advent Calendar 2016 - Adventar の 19日目*1の記事です。 前回の記事は @kurimotz による 【クリスマス】「クリスマスケーキ」イラスト/Motz [pixiv] でした。
はじめに 〜経緯〜
KMCでは描け麻雀というものを不定期で行っています。 描け麻雀は、勝者が敗者に好きなお題の絵を描かせることが出来るという麻雀です。 8月頃にこの描け麻雀を行ったのですが、僕が絵を描くのをずっとサボってしまい *2、 この12月に、4ヶ月遅れでこのように提出する運びとなりました。
このときのお題は「輿水幸子」「すずしい」でした。 お題が出されたのは8月だったので、「すずしい」というお題がでるのも頷けます。 8月にとった涼しげな仕事を12月に遅れて幸子が嫌々やらされる…みたいな絵を描くのも頭を よぎったのですが、結局Pietを描いてしまいました。*3
つくったもの
Pietで絵を描くのは過去に何度もやったことがあるので、 今回はいつもと違う制限をつけて描いてみようと思いました。
Pietは 有彩色18色 + 白黒 の計20色 によって 計17の命令が使える高級な言語なのですが、 実は理論上は上手く有彩色5色を選べば、全ての命令が表現できます*4。 プログラミング界隈ではコードゴルフというコードの短さを競う遊びがあり、 Pietではコーデル数の少なさ=コードの短さがよく部内でも競われています。 Pietの場合は別の方面、つまり色数の少なさ(カラーゴルフ)で競うこともできるのですが、 この方面に関してはKMC内ではあまり研究は盛んではなく、 どのようなものが出来るのか気になったのもあり、このようにやってみることにしました。
完成品がこちらです!! 実行すると「すずしい」と出力する、涼しい顔で締め切りを破る輿水幸子です。
(Pietの仕様を十分に満たしたUTF16のPiet処理系で正常に動作します。 (例えば、PietDevでは「要素数の足りないrollでスタックの先頭を消費する」という仕様に沿わない実装があるので動作しません。 未定義な処理は、「何もしない」というのがPietの正しい仕様なのです。dama氏のPidetや 自作のUltraPietでは正常に動作します) )
ひと目で分かる解説
「いしずす」の順でスタックに積み、最後に逆順に出力しています。
カラーゴルフについて
色が少ないことによって以下のような制約ができます。
- 黒を使用しない場合、方向転換、終了処理がかなり面倒くさくなる。
- 基本的に一つの命令は一つの遷移にしか割当たらないので、欲しい命令を実行する時にその色遷移を頑張って作る必要がある。
- 今回の場合 例えばduplicate命令は黄->紫の遷移でしか表現できない
- 備考:18有彩色の場合は当然18個の遷移で表現できる
- 実感として18色フルで使うほうが10倍くらいの情報を詰め込める気がする。
- 今回の絵くらい大きければ、「もしも締め切りに間に合わなかったら桜の木の下に埋めてもらっても構わないですよ」くらいは詰め込められそう。
一応、色が少ないことで以下のようなメリットはあります。
- ファイルサイズが小さくなる。
- 色が多くないのでデザイン的に綺麗なものが出来る*5。
- 達成感がある。
今回の幸子の絵により、5色カラーゴルフは十分に可能であるということは示されたと思います。 今後カラーゴルフをする人口が増えることを望んでいます。
Piet用のお役立ちプログラム
今回の特殊なPietを描くにあたって実装したプログラムを公開します。 まず、絵を一番近いPiet18色に変換するプログラムとして
をPython3で書きました。 まず下絵を描いてそれを徐々にPietにしていったのでこういうプログラムは大事です。
次に、どの5色を選べば17命令を達成できるかを調べるプログラムとして
をC++で書きました。 結果的に17命令を達成できる5色の選び方は4通りあることが分かりました。 このプログラムの結果から使用する5色を決めて書きました。
さいごに
もしも間に合えばこの絵のメイキングについて、 コミックマーケット91の サークル「いっと☆わーくす!」に、 寄稿しようと考えているので、コミケに行かれる方は是非手に取ってくださいまし。
“サークル「いっと☆わーくす!」は、コミックマーケット91で「木曜日 西地区 "み" 27b」に配置されました!” https://t.co/WGZfdLcc2b
— 友利のな(のな なの)@木曜西み27b (@nonamea774) 2016年10月28日
明日*6の12/20のアドベントカレンダーは、@maztani による 【KMCお絵かきAdventCalendar】Illustrator で星輝子 - mz-log です。 彼はめっちゃすごい。
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
ごちうさ速報Botを作った
この記事は KMC Advent Calendar 2016 及び ごちうさ Advent Calendar 2016 の15日目の記事です。
KMC Advent Calendar の前回の記事は uiureoさんの記事…はまだないので、その前の記事は walkureさんのゼネコンを九ヶ月で辞めた話 - (。・ω・。)ノ・☆':*;':* でした。 ごちうさ Advent Calendar の前回の記事は kivantiumさんの きんモザ・ごちうさ聖地巡礼記 - kivantium活動日記 でした。
はじめに 〜デキるエリートの場合〜
みなさんは、最新の社会情勢や時事が知りたい時、どうしていますか? テレビをつけてニュースを見ますか? それとも Yahoo!トップのニュースを見ますか? デキるエリートはそんな俗世的で時間のかかることはしません。
デキるエリートはまず「1」と検索窓に打ち込みます。
素晴らしい。
誰でもこの方法で ご注文はうさぎですか? 第1羽「ひと目で、尋常でないもふもふだと見…
を見つけられます。
デキるエリートはこの ニコ動のごちうさ1期一話 を見て最新の社会情勢をたったの30秒で把握します。
12月14日23時現在のごちうさ速報です pic.twitter.com/zowi9c8W1l
— ごちうさ速報 (@gochiusa_sokuho) 2016年12月14日
上の動画は 実際の2016/12/14/23時のごちうさ1羽の開始30秒です。 たかがアニメ動画と侮ることなかれ、この30秒で例えば
- 音楽:世界に一つだけの花がトリプルミリオンを達成したこと
- 政治:野党が内閣不信任案を出す模様であること
- 外交:オスプレイが沖縄近海に着水したこと
- 芸能:ノンスタ井上が当て逃げしたこと
- スポーツ:鹿島アントラーズが3-0で勝利したこと
- アニメ:ごちうさ3期を待ち望んでいること
などのように様々なジャンルの社会情勢が分かってしまいます。
ごちうさ速報
このニュース速報は「ごちうさ難民」と呼ばれる人たちが投稿しています。 ご注文はうさぎですか? 第1羽「ひと目で、尋常でないもふもふだと見抜いたよ」とは にも詳しい説明がありますが、 ごちうさの「心をぴょんぴょんさせる性質」に救われ、この動画を毎日見続け、ごちうさという安住の地を手に入れた人々のことです。 やがて彼らはこの動画のコメントで情勢を報告しあうようになり、この動画を見るだけで昨今の情勢が分かるレベルまでに成長することとなったのです。
12月04日19時現在のごちうさ速報です pic.twitter.com/q5YantTUlM
— ごちうさ速報 (@gochiusa_sokuho) 2016年12月4日
12月4日19時、我らがチノちゃんの誕生日には、一面シアン一色になりました。
ごちうさ速報は誰もが自由に書き込めるという性質上中立性があるといえます。 例えばテレビニュースの場合、スポンサーなどの影響で中立な放送をすることは難しいでしょう。 恣意的なニュースを流すことも可能ですが、日本中の人々が視聴するお茶の間のテレビ等とは異なり、 ごちうさ難民を扇動するニュースを流すメリットは皆無であるので、そのようなニュースは紛れ込みにくいといえます。 (逆に言うと、「ごちうさ3期決定!」「ゆゆ式二期決定!」などのように扇動するメリットのあるニュースはたまに紛れ込みます。)
Bot化
このように有用なごちうさ速報をもっと簡単にシュッと確認できるようにしたいものです。 そこで、ごちうさ1羽を定期的に観察し呟くtwitterのBotを作成することにしました。 以下、 KMCアドベントカレンダーらしく、そのPython3での実装について技術的なことを記述します。
ログイン
def login(mail_tel, password): s = requests.session() s.post('https://account.nicovideo.jp/api/v1/login?site=niconico', params={ 'mail_tel': mail_tel, 'password': password, }) return s
requestsモジュールを用いると簡単にログインできます。 引数のメールアドレスやパスワードはご自分のものをどうぞ。
コメント取得
ニコニコ動画のAPIについては、 ニコニコ動画APIとは 等に 掲載されていますが、詳しい使い方についてのドキュメントはあまり整備されておりません。 更にネットで検索して得られる情報は古いものや誤っているものも多く、 結局のところ実際の通信内容を見てコードに落とし込むのが一番手っ取り早いです。
def get_comments(thread_id, s, ok_time=3100, version="20090904"): movie_info = s.post("http://flapi.nicovideo.jp/api/getflv/{thread_id}".format(thread_id=thread_id)) qs = parse_qs(movie_info.text) ms, user_id, userkey = qs["ms"][0], qs["user_id"][0], qs["userkey"][0] optional_thread_id = qs["optional_thread_id"][0] thread_info = s.get("http://flapi.nicovideo.jp/api/getthreadkey?language_id=0&thread={thread_id}".format(thread_id=thread_id)) found = re.findall(r'threadkey=(.+)&force_184=(.+)', thread_info.text) threadkey, force_184 = found[0] xml = """<packet> <thread thread="{thread}" version="{version}" user_id="{user_id}" threadkey="{threadkey}" force_184="{force_184}" scocomments="1" with_global="1" /> <thread_leaves thread="{thread}" user_id="{user_id}" threadkey="{threadkey}" force_184="{force_184}" scocomments="1" >0-24:100,1000</thread_leaves> </packet>""".format( version=version, thread=thread_id, opt_thread=optional_thread_id,user_id=user_id, threadkey=threadkey, force_184=force_184) comments = requests.post("http://nmsg.nicovideo.jp/api/", data=xml) founds = re.findall(r'<chat (.+?)>(.+?)</chat>',comments.content.decode("utf-8")) comments = [] for info, found in founds: found = found.replace("\u3000", " ") #全角空白 vpos = int(re.findall(r'vpos="(\d+)"', info)[0]) date = int(re.findall(r'date="(\d+)"', info)[0]) mail = re.findall(r'mail="(.+?)"', info) mail = mail[0] if mail else "" if len(found) > 30 or len(found) < 4 or vpos > ok_time: continue comments.append([found, vpos, date, mail]) comments.sort(key=lambda x: x[1]) return comments
引数の thread_id には ごちうさ1羽は、http://www.nicovideo.jp/watch/1397552685 ですので、 1397552685 が入ります。 s には先程のログインで作成したrequestsのsessionが入ります。 ok_timeは、ごちうさ速報は開始31秒*1なので、31*100の3100を入れます。
getflvAPI,getthreadkeyAPIにて動画情報、視聴ユーザー情報、コメントサーバー情報を取得し、 判明したコメントサーバーに生成したxmlを投げることで最近のコメント一覧のxmlを取得しています。 コメントには以下の3つの属性があり、
属性名 | 意味 |
---|---|
vpos | コメントが動画上で表示される時刻 |
date | コメントが投稿された時間 |
ue shita red cyan big など、文字への修飾 |
vposでソートし、処理しやすい配列の形で返却します。
動画生成
コメントを取得できたので、後はその情報を元にして動画を生成するだけです。 動画の生成には moviepy を用いると楽ちんです。 結論としては analyze_mp4.py · GitHub みたいな関数を作れば ニコニコ動画を再現できます。 make_textclip関数でコメントをmailとvposを元にして動画に合成します。 コメントのフォントに際しては、フォント変化と明朝化DR10行固定:meg_nakagamiのブロマガ - ブロマガ に詳細が載っています。 再生環境によってフォントは変わるようですが、今回は実行パスと同階層に置いた hiragino.ttc を合成することにしています。 テスト用の非公開動画を投稿し、コメントを投げて感覚を掴み、それを元にしたノリでコメントを流しています。
動画投稿
結論としては twitter72.py · GitHub のtweet関数のような感じで投稿できます。 tweepy 等を使ってもよかったのですが、mp4の投稿はうまくいかなかったので、twitter公式ドキュメント などを参考にして実装しました。
実際のコード
以上をまとめると、
が、最終的にコードとして完成されます。
ログイン情報やトークンをまとめたファイル gochiusa_token
を作り、
あとは環境さえ揃っていれば $python3 gochiusa_sokuho.py mp4
で動画生成からツイッター投稿までできるようになります。
運用
以上のコードにより、目的のBotが完成しました。
Tweets by gochiusa_sokuho Follow @gochiusa_sokuho
このBotは一日に2回、30秒の動画を投稿し、 一時間に一度コメントをチェックして更新があればコメントを呟いています。 全部呟くと流石にキリがないので、赤色で大文字のもののみ呟くようにしています。
まとめ
こうして我々は社会情勢を簡単に知ることができるようになりました。 更に毎日投稿しているので、先程のチノちゃん生誕祭のように気になった日のアーカイブをいつでも確認できるようになりました。 毎日欠かさず情報を提供してくれるごちうさ難民のみなさまには感謝の意しかありません。 ごちうさ1羽 は、現在7777777回再生を突破*2し、その人気はまだまだ健在です。 これからも心をぴょんぴょんさせていきましょう。
明日のKMCアドベントカレンダーは pastak さんによる「多分ポエム」、 明日のごちうさアドベントカレンダーは hideo54 さんによる 「青山ブルーマウンテンさんから学ぶ対原稿術」です。
それでは また来るよ、マスター。
みーくんは起床のプロ
この記事は、がっこうぐらし! Advent Calendar 2016 - Adventar の 12/5 についての記事です。 昨日の記事は @utgwkk の めぐねえにはなれない僕らだから - 私が歌川です でした。
はじめに
みーくん と言えば、ショッピングモールの籠城生活が印象的かと思います。 彼女(達)の籠城生活は精神的につらいものであるはずですが、 精神力を強くもち、みーくんは生き延びることができました。 それにはきっと生活習慣も大きく関わっていたでしょう。 特に、規則正しい生活習慣には規則正しい起床が不可欠です。 この記事では、みーくんの籠城生活の起床のコマを参考にして よい起床方法を考察しようと思います。
みーくんの起床(7話 まいにち より)
まず、彼女はめざまし時計により起床します。 その後、中座し目をゴシゴシし、カーテンを開け朝日を浴び、目を覚まします。 そして、リンスとシャンプーで紙を洗った後、着替え、 ダンボール机の上にてカロリーメートと水を朝ごはんに食べます。 いただきます、ごちそうさまは欠かしません。
まず、明らかに彼女は規則正しく起床しています。 僕は二度寝をよくしてしまい、遅刻することが多々あります。 それに、そもそも起きるのが午後だったりして、一日を無駄にしてしまうことも多いです。 そうすると精神的にどんどん辛くなっていきます。
見習うべくは、彼女の理想的とも言える起床方法です。 まず、めざまし時計。 これをセットすることで高確率で所望の時間に起床することができます。 こういう文明の利器は須らく使うべきです。 次に、中座して目をゴシゴシしている。 こうすることで、まず体が急に起き上がることで夢の内容を忘れることができ、 二度寝をしたいと思う要件の一つ、「見た夢の続きが気になる」を無くすことができます。 目をゴシゴシすることで、目やにが落ち、目が開きやすくなります。 そして、彼女は朝日を浴びます。 朝日を浴びることで体は起床に対して前向きになることは、理解できると思います。 このように段階的に起きることによって、起床を確かなものにしています。 一度起床してしまえば、規則正しい生活習慣を送るのも容易いものです。 さらに、彼女は着替え、朝ごはんを食べています。 着替えてから朝ごはんを食べるという順番は、一見不思議なものに思えるかもしれませんが、 ご飯を食べると眠たくなることは分かりきっていることなので、 先に着替えを済ましておくことで、それを回避していると考えれば理解できるでしょう。 「いただきます」「ごちそうさま」 と声に出すことで更に目が覚めます。 他にも考察すべきことがあるとすれば、彼女の寝る態勢が仰向きであることでしょうか。 この寝方は、起きる動作に最も移行しやすい態勢です。
まとめ
みーくんは起床のプロ
さいごに
毎日起床失敗しているのでみーくんを見習って起床のプロになりたい。 次の記事は 12/9 に @京橋ひよわ による がっこうぐらしの避難生活 | ひよわのらくがき です。 くるみちゃんかわいいよね
参考
Macで(Windows風に)アプリをキーボードで切り替えるJXAを書いた
したいこと
Windowsでは以下の操作が簡単にできますがデフォルトのMacでは実現できません。
- Win+0~9 キーで数字の対応するタスクバー(MacでいうDock)の位置のアプリの起動/切り替え
- Win+↑でアプリの画面最大化
- Win+←→ でアプリを画面の右(左)半分にフィットさせる
Win+←→キーなどは、shiftltなどのアプリを入れることでも再現することができますが、 それではDockをキーボードで簡単に操作することはできません。 また、SplitViewを使う手もありますが、他のアプリとの切り替えがめんどうなのであれはダメです。 以上の操作を実行するAppleScriptを書いてキーボードショートカットに割り当てて爆速開発環境にしたいわけです。
具体的には、
- Ctrl + 0~9キーで対応するDockの位置のアプリを起動/切り替え
- Ctrl + ↑キーで現在のアプリの画面を最大化する
- Ctrl + ←→キーで現在のアプリを左右に寄せる
- Ctrl + ↓ キーで隣のアプリと切り替え
- Ctrl + _ キーでiTunesと切り替え
の操作ができるようにしたいわけです。
手順
$brew cask install karabiner
で、キーバインドのために Karabiner を入れる。$brew install cliclick
で、shellからクリック操作をエミュレートできるcliclickを入れる。(/usr/local/bin/cliclick
にcliclickが配置されているようにする)- Karabinerを開き、private.xml(キーバインド割当設定)を生成する
- gist.github.com をprivate.xmlに書く。
- gist.github.com を
~/.mv_windows.js
に書く。 - Karabinerで先程生成したキーバインドを設定する。
- うまく動作しない場合はKarabinerのアクセシビリティが正しいかを確認する。
- キーバインド完成!!
感想
初めてAppleScriptを書いてみようとして文法がアレだったのでJavaScriptで書きました。 JXAの日本語情報(特にDock周り)がとても少なかったのでなかなかめんどかったです。
600kmくらいママチャリを漕いだら9月が終わってしまっていた
概要
九州の横断(新門司->USA->別府),愛媛の横断(八幡浜->東予港),滋賀の横断(琵琶湖一周)を漕いだという話です.
9/11 出発日前日
- この日はシャドウマッピングをUnityで実装しました. www.slideshare.net
- サークルのメンバーが九州に行く機運が高まっていたので せっかくなので僕は自転車で行きたいなーと思いたちました
- フェリーを予約して,早めの就寝.
- 宿:部室
9/12 九州へ(出町柳->大阪南港 +64.0km 総計64.0km)
- 途中に日本橋があったので寄りました.
フェリーだ! pic.twitter.com/QWzapKtzwJ
— むらため(607.5km) (@paradigm_9) 2016年9月12日 - 体調:初日なので余裕
- 宿:フェリー
9/13 USAへ(新門司(福岡)->USA(大分) +51.7km 総計137.3km)
- 九州住みのKMC部員と別府まで目指すも途中でバテてUSAで終了
USAにきました pic.twitter.com/k8QCgEHo03
— むらため(607.5km) (@paradigm_9) 2016年9月13日 - USAから電車で別府に行き更に他の部員(電車に乗って楽をする人たち)と合流
- 体調:快晴過ぎて日焼けして温泉に入れなかった(><).
- 宿:5kくらいのホテル
9/14 別府へ(USA(大分)->別府(大分) +56.0km 総計193.3km)
- 朝は雨が降っていたのでメンバーで別府地獄めぐり
- 午後は別府まで自転車で山越え.2時間くらいコンビニすら無い区間があってやばかった.
- 宿:雨が降ってきたので入ったネカフェ
9/15 博多観光
- そにっく往復を用いて博多へUターンして観光
- 太宰府,博多タワーetcを観光
- 宿:深夜に別府に帰ったのでカプセルホテル
9/16 松山へ(八幡浜(愛媛)->松山(愛媛) +64.5km 総計257.8km)
- フェリーで別府->八幡浜へ向かい,夕やけこやけラインをひたすら進む
- 日本ではここでしか生産されないらしいポポーなどを購入
- 浜がきれいかなーとか思っていたら消波ブロックしかなかった(><)
- 宿:松山の部員宅
9/17 ~ 9/20 松山観光
- ランタン祭り,大神輿総練,道後温泉などを満喫
- 途中で台風が来てヤバみ
9/21 京都へ帰還1 (松山(愛媛)->東予港(愛媛) +68.4km 総計 326.2km)
- ぐるっと海岸線を廻って港へ
- 宿:フェリー
9/22 ~ 9/23 京都へ帰還2 (大阪南港->出町柳 + 64.3km 総計390.5km)
- 体調:瀕死
9/24 琵琶湖一周 (➰ +217.0km 総計 607.5km)
- 締めに軽く琵琶湖を一周しました(ママチャリでも半日半くらいでできる)
- 体調:死
9/25
- 体調:死
9/26
- 体調:あし
9/27
- 体調:よろし
こころえ
- 一日にママチャリで走れる距離は70km.(それ以上すると翌日に負担が出る)
- 自転車グローブは必須.(これがないと手にマメが出来て痛い)
- 大阪のオバちゃんみたいにサドルにクッションを引いた.(確実にお尻が痛くなる)
- 一日でも日焼けはするので日焼け止めは大切.(でないと温泉で疲れを癒せなくなる)
- 運がよいと自転車を漕ぐときは雨が降らない.(そして僕の運はよいです)
- 400km漕いだあとでも琵琶湖は一周できる.(但し翌2日死ぬ)
- ロードバイクの方が自転車の5倍くらい効率が良い
- 公共交通機関の代わりに自転車を使用しても費用は結局同じ(フェリーで自転車代が余分にかかったり,水分補給費等が高かったり)
まとめ
- 沢山の人の支えのお陰で適当すぎる計画でも無事で済みました.とても感謝.
- 公共交通機関は神.
夏休み1日目
まだ記録管理用のslackbot/アプリも作っていないのでここに記録することになります. 今日は何もしませんでした. @nonamea774 に水飲み鳥を送りつけました. あと,TensorFlowやってる人が多いのでやってみたいと思いました. 特定の絵師の特徴とかを機械学習させたら楽に絵師を検索できたりするのかな. 575とかダジャレとかも判定させたりしたいですね.
まとめ
今日は 9 時間寝ました.
朝6時に寝て昼3時ころに起きたでしょうか.
形式的な朝ごはん,昼ごはんは食べておりません.
昼過ぎに起きると体調はあまり芳しくない様子.
更に追加で22時から25:20まで3:20寝ました.
この睡眠は快適でした.
そりでは,無限に練りをしまつ.