nikkie-ftnextの日記

イベントレポートや読書メモを発信

イベントレポート | Pythonもくもく自習室 #10 @ Rettyオフィス #rettypy

はじめに

だんないよ、nikkieです。
5/26は#rettypyでもくもくしてきました。

 

勉強会の概要

Pythonもくもく自習室 #10 @ Rettyオフィス - connpass

この勉強会について

週末の昼下がりに、Pythonに関するやりたいことを各自持ち寄り、ゆるゆると「自習」を進めていく会です。

  • 本を読む
  • PythonDjangoなどのチュートリアルをすすめる
  • コミュニティの作業や執筆etc...
  • 他の参加者と情報交換をしたり学んだり
  • おいしいご飯と共に楽しむ(?)

など、Python使いおよびエンジニアライフのオアシス&知見を身につける「自習室」としてゆるくご活用いただければと思います。

※初心者歓迎です!(なお,ハンズオンなどはありません)

主催の @shinyorke さんいわく

3月以来ひと月ぶりの参加でした。
Web系(Django、Flask)、機械学習系(Deep Learning本、kaggle)、データ分析系(pandas)、電子工作系(ラズパイ)など、
バランスよくもくもく内容がわかれていました。

取り組んだこと

udemyの講座はセクション3を写経(セクション4の冒頭で時間切れ)。気づいた点としては

  • from flask import FlaskのFlaskは「クラス」。クラスをimportしているって感覚なかったなあ
  • お店のリスト→お店は辞書で表す→お店は商品のリストを持つ→商品はリスト
    なるほど、API叩くと辞書とリストが入り交ざったJSONが返ってくる裏には、こういう考えがあったのか
  • nameを指定してstoreを作ったら、できたことを示すために、storeを返す挙動にしている(storeの名前を確認でき、アイテムがないことも確認できる)
  • 決め打ちのAPIでよければ、セクション3の内容で作れる(サーバ止めるとデータ消えちゃうけど)

 

成果発表から

 

感想

ランチの時間、すごく楽しかったです。カレーが美味しかったし、Pythonの話ができたのが嬉しかった!
社内ではソロでPython書いているので、Pythonの話ができる人がいないんですよね。。

コードレビューしてくれる人がいないので、動いているけど自己流の書き方で不安を感じていますと話したら、
「動いていることに価値がある」「稼動期間が1年程度のプロダクトであれば多少汚いコードでも気にしすぎなくてよい」という考え方を教えていただき、目からウロコでした。
上の障害報告書の記事にも通じる考え方だと思います。
今は汚いコードでも、日頃の勉強を積み重ねることで、
次回似た内容のコードを書くときは数段レベルアップしたコードを書けるようになると信じ、取り組んでいきます。

みんなのPython勉強会のLT練習と宣伝もさせていただきありがとうございました。

もくもく会関係者と出席者の皆さま、1日どうもありがとうございました! お疲れ様でした。

イベントレポート | カイゼン・ジャーニー 著者による本読みの会 第05話「明日を味方につける」#kaizenJ

はじめに

だんないよ、nikkieです。
今朝は「カイゼン・ジャーニー 著者による本読みの会 第05話『明日を味方につける』」に参加してみました。

 

勉強会の概要

カイゼン・ジャーニー 著者による本読みの会 第05話「明日を味方につける」 - DevLOVE | Doorkeeper

「著者による本読みの会」 では、著者2人がカイゼン・ジャーニーを1話ずつとりあげて、内容を解説したり、深掘りしたり、脱線したりします。カイゼン・ジャーニーってどんな本なの?あの話のことをもっと聞いてみたい!という方、耳を傾けてみてください。
1話あたり 30分 。仕事の息抜きに、ぜひどうぞ。
カイゼン・ジャーニー』は私の仕事のやり方に大きな影響を与えている本です。
一人だと見えていないこともあるんだろうなと思い、偶然見つけた本読み会に参加してみました。
今回は「一人朝会」の章です。
 

メモ

  • ふせんでタスクの優先度を洗い出しているが、管理できておらず埋没してしまう。
    「締め切りを踏み抜く」

  • 朝会と朝礼の違い
    朝礼は一歩通行なニュアンス 偉い人が喋る
     朝会はメンバー自分たちでコントロール 自分ごと

  • チームとグループの差
    人が集まればチームになるわけではない
    寄せ集めのグループにすぎない お互い何やってるかわからない

  • 突っ伏した新人 一人で遅くまで
    個人で仕事をしていると溜め込みすぎて辞めてしまう
    「朝会で共有するのがいいということを表したい」 →江島と対比

  • 昨日やったこと
    今日やること
    困っていること
    チームメンバー6-7人で朝会を15-30分に収めるため上記の事項に絞る

  • 問題の共有だけでなくタスクの再計画(リファインメント)が重要
    スケジュールはメンテナンスするもの ←スクラムガイドにも書いてある

  • 明日を味方につける
    今日のタスクマネジメントは明日のタスクマネジメントである
    1週間すら読み切れないが、今日どこまで行けそうかは想像できる 今日できないことは明日へ
    今日と明日の間で境界を引いてやりくりする

  • 毎日のタスクのメンテナンス
    →リズム 1週間まとめての振り返り 翌週につなげる

  • 1on1
    最初はGoogleなどから
    1人1人と向き合っていく取り組み 面談ほど固くない
    何を考えているか

  • マネージャーの仕事として、メンバーが気持ちよく成果をあげられるようにする。
    コミュニケーションは必要
    日頃の会話の中でできるとベター
    毎週30分会話の時間をとる タイムボックスを区切ると流されなくなる
    慣れていなければコーヒータイムや雑談の延長でよい
    上司、部下で考えていることを共有する

  • メラビアンの法則

    「見た目/表情/しぐさ/視線等」の視覚情報が55% 、「声の質/話す速さ/声の大きさ/口調等」の聴覚情報が38%、「言葉そのものの意味/話の内容等。」の言語情報が7%


    メラビアンの法則とは - コトバンク
    1on1はフェイス・トゥ・フェイスが重要

  

感想

この章は「明日を味方につける」の意味がわかって鳥肌が立った章です。
それだけに「タスクマネジメント」に目が向きすぎていたかもしれません。

著者のお二人のお話は、タスクマネジメント以外の部分(この本を通してのエッセンスの部分)にも
目を向けるきっかけになったように感じています。
ふりかえりと同じで、他人の思考を取り入れることで自分の限界を越えていけるわけですね。

著者のお二人、本読みの会出席者の皆さま、素敵な機会をどうもありがとうございました。
今後も参加していきます!

 

イベントレポート | DjangoCongress Day1 #djangocongress

はじめに

だんないよ、nikkieです。
DjangoCongress Day1に参加してきました。
Django Girls Tutorialsをやった程度でDjangoの経験値が少なく、咀嚼しきれていない内容が多いです。
後々見返すために発表スライドをまとめておきます。

 

イベントの概要

DjangoCongress JPは日本で開催されるDjango Webフレームワークのカンファレンスです。
DjangoCongress JPは、Djangoでアプリケーションを開発している人、Djangoを学んでいる人などDjangoに関わる全ての人が参加できます。
参加する全ての人がDjangoについて交流し、出会い、学び、楽しみ、深い理解を得ることを目的にしています。
実務でDjangoを使えるようになりたいので、情報収集目的で参加しました。
フルスタックのDjangoは身近に聞ける人の少ない環境では敷居が高いと判断し、
Flaskでサーバサイドの開発をしています。)
 

聞いたTaiks

テストコードを書けば、(コード変更の)恐れを退屈に変えられるというケント・ベックの言葉、すごく印象的でした。
モダンなプログラマになって、テスト結果見せながら
「コード変更の影響? ないですよ」って言えるようになりたい。
 

speakerdeck.com

DjangoはSingle Page Applicationに不向き、Multiple Page Applicationに向いている。
フロントエンドの話になると言語関係なくついていけない(知識が足りない)という自分の課題が見えました。(pjaxって始めて知った)

 

speakerdeck.comミドルウェアに処理を持たせるというのは初めて知りました。
デプロイでハマってWSGIってなんだ?って悔しい思いをしたので
このスライドとソースコードをもとに、WSGIの理解を自分のものにしたい。

 

speakerdeck.comほかの人が自分と同じ失敗をしないように、失敗を共有するTalk
リファクタリング前後のコードを見返して、何が失敗でどう修正したか理解する必要あり。

 

www.slideshare.netデモあり、サンプルコードありと、非常に力の入ったTalkでした。
ユーザ認証はこれまでノータッチでしたが、認証バックエンドというものを今回学べました。
ネット上に転がっているフィールド混同のサンプルコードには要注意。

 

slideship.comDRFは触ったことのない状態で聞きました。
DRFが使えたらこんな感じになるのかとおぼろげながらイメージできました。
Serializer使うほうが、Flaskのjsonifyでdict作るよりも扱いやすそうな印象です。
DRFという選択肢も用意するため、素振りしていきたいところ。

 

聞いていないTalks

▼データベースバックエンドについてのTalk

DjangoCongressJP 2018 の発表資料(2018-05-19) · GitHub

 

speakerdeck.com

speakerdeck.com

 

感想

Djangoの深さを体感した1日でした。Tutorialの先にこんなにも様々な世界が広がっているとは!
(JSなどフロントエンドの技術もDjangoの世界を広げるのに一役買っているんですね)

実はチケット譲っていただけて参加できています。譲っていただきありがとうございました!
この機会を自分のものにするために気合を入れて素振りをしないといけません。

来年も予定しているそうなので、もう少し参加者の人数を広げていただけるとうれしいです。
運営、発表者、参加者の皆さま、ありがとうございました。1日お疲れさまでした。

 

 
 

イベントレポート | 「Python入門者向けハンズオン」にメンター参加してきました #pynyumon

はじめに

だんないよ、nikkieです。
5/12に「Python入門者向けハンズオン」でメンターに挑戦してきました。

Python入門者向けハンズオン #7 - connpass

 

メンター参加の経緯

2017年11月くらいからPythonを趣味ではじめ、2018年には業務でも使い始め、
入門者から中級者へ進んでいるかなと感じています。
ここまで来られたのは、Pythonのコミュ二ティでいろいろ教えていただいたからです。

入門者から多少進んでいるだけの自分からも
入門者の質問に答えられることはきっとあると考えてメンターとして申し込みました。
自分が教えていただいたことを新しく入ってきた人にも伝えていくことで
コミュニティが回っていくんじゃないかなと考えています。
 
入門者向けハンズオンは過去に参加していたものの、スクレイピングについて予習して臨みました。

https://gist.github.com/ftnext/f44b4bc5dd4c21cc74e223c01ae47fa6

 

感想

  • 月並みですが、教える側のメンターもめちゃくちゃ勉強になりました。

    例えば「importとfrom ... importって何が違うんですか?」と聞かれて、うまく説明できず

    人に説明できるレベルでは理解していなかったと痛感しました。

  • 答えられない質問は他のメンターの方に聞いてサポートをいただきました。

    メンターの皆さんにも支えていただき、感謝です。ありがとうございました。

 

メンター参加して学んだこと

  • VSCodeの統合ターミナルが便利(Atomと違って拡張追加不要)
  • pyenvはディレクトリごとにPythonのバージョンを分けられるが、
    仮想環境も必要(pyenv-virtualenv)
  • FizzBuzz:狭い条件(15で割り切れる)ほどif文のはじめでチェックする
  • スクレイピング実行中のコードの変数の値を見るにはpdbがある
  • requests.getでページが取れたことはstatus_codeで判断できる
  • BeautifulSoupのget_textとtextは同じ

VSCode導入と、pdb試すのは近日中にやってみます。

「robot.txtを確認してスクレイピングしていいかを判断する」という
スクレイピングのお作法を懇親会で教えていただきました。
 

おわりに

業務で使うためのスクレイピングのプログラムや
ご自身が普段から見ているサイトをスクレイピングするプログラムを作っている方がいらっしゃいました。

中にはブログでイベントレポートをアップしている方もいらっしゃいます!

m4usta13ng.hatenablog.com


ハンズオンの後も作ってみたよという方は
数カ月後にある「入門者の集い」でLTしていただければと思います。
アウトプットが勉強になることは保証します。

入門者ハンズオン出席者の皆さま、運営の皆さま、
どうもありがとうございました。半日お疲れさまでした。

イベントレポート | 第27回 Pythonもくもく会 #mokupy (Azure VMにFlaskアプリをデプロイ)

はじめに

だんないよ、nikkieです。
4/30の#mokupyでAzureのVMCentOS)に
FlaskアプリケーションをデプロイしてHello Worldしてきました。

 

勉強会の概要

この勉強会について

主にPythonに関するやりたいことを各自持って来て、進めていく感じのゆるい会です。 もくもく開発をして情報共有したり、交流を深めることができればと思っています。 是非お気軽にご参加ください。(Python初心者の方でも大歓迎です!)

Pythonもくもく会御三家の一つ#mokupy。(※一個人の認識です)
GW開催ということもあってか盛況でした。
今回はお昼に食べたハンバーガーが美味しかった・・・(しみじみ)
 

取り組んだこと

以下の記事を参考に、AzureにLinuxVMを構築し、
Hello WorldするFlaskアプリケーションをApacheとmod_wsgiとで動作させました。
(以降では「30分記事」と呼びます)

qiita.com

https://twitter.com/ftnext/status/990861840501489664

https://twitter.com/ftnext/status/990861840501489664

 

業務でPaaSにデプロイしたところ、POSTするエンドポイントが500内部サーバエラーとなりハマっています。
代替手段が必要そうなので予習してみました。

 

VM作成

30分記事とバージョンを揃えるためCentOS6.8で検索。
CentOSは6系と7系でコマンドが変わる認識。大きな読み替えは無しで進めた方が成功しやすいと考えた。)
D2s_v3 Standardで動くものがあったので、費用を抑えるために
CentOS-based 6.8 HPC Rogue Wave Software (formerly OpenLogic)」を選択。

▼作成手順の参考

Azureに仮想マシン(CentOS)を構築する | OSS on Azure 技術ブログ

 

環境構築

mod_wsgiについて./configureするところですが、
Pythonを/usr/local/bin/python3.6にインストールしているので、
赤字のように修正が必要だと思います。

./configure --with-apxs=/usr/sbin/apxs --with-python=/usr/local/bin/python3.6

(修正せずに進めたところ、/usr/local/bin/python3: No such file or directory というエラーが出た)

 

Apacheとmod_wsgiの設定
SSLまでやる余力がなかったため、30分記事を流用できず、Apacheのconfで一番苦労しました。
(mod_wsgiについてはadapter.wsgiを使いました)
Apacheのconfはmod_wsgiのドキュメントをもとにしました。
(Flaskのドキュメントにもwsgi関連の説明ページがあったが、
 簡略化されすぎていてほとんど初めてconf書く人間には理解できなかった。。)
 
ドキュメントの通りに書いても以下のエラーが出ていたのですが、
Invalid command 'WSGIScriptAlias', perhaps misspelled or defined by a module not included in the server configuration  
mod_wsgiがロードされていないらしいので、以下を参考に LoadModule の行を追加しました。

[Python] mod_wsgiを使ってPython3.6をApacheで動かす(CentOS6系) - YoheiM .NET

(なぜ30分記事と違ってロードされないのかは不明)

 

落とし穴:Azureのネットワークセキュリティグループの設定

Apacheのconfのエラーが消せたと思ったら、次はHello Worldのページが表示されない。。
error_logにも出てこないので、リクエストがVMまで届いていない感じ。
→80番ポートへのHTTPアクセスを許可する必要がありました。

Azure Portal を使用した VM へのポートの開放 | Microsoft Docs

 

束の間の安息と次なる課題

Hello Worldできたので「やったか!?」と思いきや
Hello Worldする別のGETアクセスポイントを追加すると500エラー。

これはブラウザからのアクセスによるのではなく、pythonコマンドでファイルを実行しても発生する。

今回は時間切れなので、引き続き取り組んでいきます。

 

感想

  • 環境構築がブラックボックスすぎて、エラーが自己解決できない不安あり。
    (アクセスポイント増やしたところFlaskアプリが動かなくなったのは
     環境構築に起因した問題でないことを祈るのみ)
  • VM作り直すたび、./configureからmakeするの大変だよなあ。(何回も繰り返したくない。。)
    →Docker使えばいいんじゃないか? Dockerに俄然興味出てきた。

 

ハマっている事象:WebAppsのFlaskにPOSTすると500エラー

最後にVMで構築することになった経緯を書いておきます。

PythonのWebサーバを立てよう
VM構築するよりPaaSの方が構築が簡単らしい
チュートリアルのとおりにやったら短時間でHello Worldできた

Azure に Python Web アプリを作成する | Microsoft Docs

→POSTのエンドポイント追加してみたら内部サーバエラー

この内部サーバエラーが解決できない。。

  • 何が原因かがわからない。(スタックトレースが見られていない。期待しているものは見られないのかもしれない)
  • Kuduを使うとIISスタックトレースは見られた。IISはまったく経験がなく提示している情報がつかめない。

今回診ていただいたところ、IIS関連(web.config)の設定ではないかという話ですが、
POSTだけ500エラーという挙動はやはり謎。
診ていただきありがとうございました。

 

もくもく会参加者の皆さま、1日お疲れさまでした&ありがとうございました。

 
 
 

イベントレポート | Global Azure Bootcamp 2018@Tokyo #jazug

はじめに

だんないよ、nikkieです。
4/21は「Global Azure Bootcamp 2018」に参加してきました。
4/22のブログ執筆時点で確認したセッションスライドやLTスライドをまとめます。
セッション中のメモをレポート記事にするときに参照する意図です。
(直近の優先事項が完了次第、聴講セッションにフォーカスしたレポートを公開する予定です)

 

勉強会の概要

Global Azure Bootcamp 2018@Tokyo - connpass

Global Azure Bootcampとは?

Global Azure Bootcampとは世界中の Azure コミュニティが世界180ヶ所以上で一斉に開催するMicrosoft Azureのコミュニティイベントです。

 
Azureは業務で使うことが多いです。
自分の経験がVMやAzure MLなど一部の分野に偏っているので、
Azureの全体感がつかみたくて参加しました。
 

感想

  • LogicApps、気になります!
    コーディング不要で色々なサービスを連携させられるそうなので、ライフハック的なことができそう。
    好きなアニメの公式アカウントのツイートを見逃し、こんなイベントあったのか。。orzってなることが多いので、
    定期的にチェックしてSlackに通知する機能がほしかったところ。
    課題解決優先でLogicAppsでまず組み、素振りとして自力実装という進め方でやってみよう。
    LogicAppsで扱えるものの一部にAzure MLやCognitive Servicesがあり、
    いままで触っていたのはAzureのごくごく一部なんだと実感。
  • アーキテクチャセンターのドキュメント確認したことない状態で業務でAzure触ってきたとか恐ろしや。
    読めばAzureをもっと効果的に使い倒せそう
  • 月100ドル、3ヶ月分のクーポンいただけるんですね! LogicApps試します!!
    大盤振る舞いにただただ感謝 人

 

聴講したセッションのスライド

www.slideshare.net

 

www.slideshare.net

 

www.slideshare.net

 

www.slideshare.net

 

 

聴講していないセッションのスライド

www.slideshare.net

 

www.slideshare.net

 
 

LTスライド

www.slideshare.net

 

speakerdeck.com

 

speakerdeck.com

 

kamoppusan.hatenablog.com

 

s2terminal.hatenablog.com

 

▼seosoftさんのLTで言及されていた「Cognitive Services と Bot Service で作る業務アプリケーション (2018 年 4 月版)」のダウンロードリンク

http://download.microsoft.com/download/9/7/8/978ED1D1-A670-47A7-B478-5C0FEC542204/Hands-on-12-CognitiveServices_and_BotService_for_InternalApp.pdf

 

運営の皆さま、登壇者の皆さま、参加者の皆さま、
貴重なお話とそれを聞く機会をありがとうございました。
長時間のブートキャンプお疲れさまでした。

イベントレポート | (第87回)Python mini Hack-a-thon #pyhack

はじめに

だんないよ、nikkieです。
土曜日は#pyhackに参加してきました。(3月は#rettypy優先したので2月以来の参加)

 

勉強会の概要

(第87回)Python mini Hack-a-thon - connpass

この勉強会について

基本的に毎月開催です。スプリントのゆるい版みたいな感じで各自自分でやりたいことを持ってきて、勝手に開発を進めています。参加費は無料です。 初めての方も常連さんもぜひご参加ください。

独学している身としては猛者同士のちょっとした会話からも勉強できる場です。
なるべく毎回行きたいなあと思っています。

取り組んだこと

『仕事ではじめる機械学習』の7章(映画のレコメンドの章)を写経しました。
1月から3ヶ月ほど弊社にてレコメンドシステムの開発に携わっていたので、
振り返って総括するために写経することにしました。(どうやるべきだったか知りたかった)
開発ではAzure Machine LearningでMicrosoft謹製のレコメンドアルゴリズムを使って実装したのですが、
レコメンド予測モデルがブラックボックスすぎるので理解を深めたいという気持ちもありました。
 
仮想環境作って写経スタートと思いきや。。
pip installに失敗するエラーが発生。(pipのバージョンも上げられず、原因不明)
かしゅーさんに診ていただきつつ、Python3.6系を導入してpip installはできるようになりました。
かしゅーさん、ありがとうございました!
venvに代えてvirtualenv使おう。pipのバージョンアップも自動で適用されるところに魅力を感じる。
 

写経

  • 推薦システム構築に使うライブラリ:fastFM
  • ユーザIDと商品IDはカテゴリ変数として扱う。(→One-hot Encoding)
  • データは3種類
    ユーザ情報(例:ユーザID=U001の名前はnikkie、男性、、)
    レーティング情報(例:ユーザU001が映画M12345を☆5(=最高評価)と評価)
    映画情報(例:M12345はタイトルが『さよ朝』、公開が2018年、、)
  • pandasを使ってデータを探索
    pd.mergeでDataFrameの同じ名前の列同士を内部結合。
    古い映画ほど評価データの数が多い。(古い映画ほど多くの人が評価)
    映画ごとの平均評価を出す上では、評価の数が100以上のようにフィルターをかける必要あり
    ユーザ1人あたりの評価した映画数の中央値は65本(平均が106本なので、数多く見ている人に引っ張られている)
    ユーザ1人あたりの評価値の平均は25%〜75%が☆3台:(▲)
    →平均評価が高い映画を評価しているユーザの属性など、もっと探索は深められそう
  • アルゴリズムMCMCを採用(ハイパーパラメタが少ないのが長所)
    レーティング情報だけを用いる
    イテレーション回数を300までで変化させ、平均二乗誤差やハイパーパラメタの様子を見ると、100回程度で収束している
    行列を圧縮する次数rankを変化させて平均二乗誤差(性能指標)を見ると、rank=32以降は収束している(ユーザの映画への評価値を予測しているので、平均二乗誤差が求まる)
    (▲)から、ユーザごとに平均評価値にばらつきがあったので標準化する
  • イテレーション回数とrankが決まった後は、ユーザ情報と映画情報も加える
    加える特徴量の数パターン用意し、平均二乗誤差を比較する
    →ユーザの年齢、性別、評価した年、映画の公開日を加えるとよさそう
  • pandasでの処理の書き方勉強になる
    movie_stats = lens.groupby('title').agg({'rating': [np.size, np.mean]})
    list(filtered_lens.drop('rating', axis=1).T.to_dict().values())
    lens['date'].apply(str).str.split('-').str.get(0)
  • Cell 21に不要なコードありませんか?
    (不要と思う点1箇所目)同内容の繰り返し
    lens['year'] = lens['date'].apply(str).str.split('-').str.get(0)
    lens['release_year'] = lens['release_date'].apply(str).str.split('-').str.get(2)
    (不要と思う点2箇所目)y_predに代入していないfm.fit_predict、不要じゃないでしょうか?
    fm.fit_predict(X_mf_train, y_mf_train_norm, X_mf_test)
    MCMCでは学習と予測をセットで行うfit_predictメソッドしか提供されていないそうなので、
    上記の箇所とy_predへの代入の箇所で全く同じことを重ねて行っている認識。
    指摘箇所を削ったところ、結果は変わらずに待ち時間は減った(ただし体感)。
  • p.156に誤植発見(Cell21が正しい)
    誤:y_mf_train_norm = scaler.fit_transform(np.array(y_mf_train)).ravel()
    正:y_mf_train_norm = scaler.fit_transform(np.array(y_mf_train).reshape(-1, 1)).ravel()
  

感想

人に説明できるレベルでは理解できていない感じ。もう少し取り組んでみる。

pandasの書き方は大変勉強になりました。使いこなせるよう自分でもこのデータ探索してみよう。

fastFMはチュートリアルがあるようなので、手を動かしてみたい。

Tutorials — fastFM 0.2.10 documentation

Azure MLのレコメンドのサンプルデータをfastFMで動かして
同じ結果を得られることを確認してはじめて脱ブラックボックスかなと思う。

 

nobolisさんの三角グラフ、画像をRGBで表すのによさそう。

 

運営及び参加者の皆さま、1日どうもありがとうございました!