日々の学びと煩悩

Introspection and Resolution 2020

あっという間に2020年。

去年は、大学院の研究科を変えたこともあり、授業研究就活とめまぐるしく、これまでの人生で一番早く過ぎ去った1年間であった。

関わった全ての皆様に感謝します。

今後の記録のためにも、月並みですが、自己内省(self-introspection)と新年の抱負(New Year's Resolution)を書きます

※ (追記1/4) 具体目標追加

Introspection 2019

2019年、自分の中で地味に以下の目標を掲げていた

  • 本気で就活をする

    • 将来何をやりたいのか、どうなりたいのかを明確にする
  • 結果にこだわる

    • 研究で結果を出す (論文を出して国際学会に行く)
    • 統計の知識を身につけ、統計検定1級を取る
    • データ分析コンペで結果を出す
    • Webシステム開発の技術を身につける

やったこと(時系列順)



  • 自己分析を通じて自分の将来像を熟考した
  • 春学期5つ以上のグループワークと個人発表課題をこなしつつ、国際学会に論文を投稿してみた → ドバイで口頭発表、論文賞をいただけた
  • 上と同じタイミングで、とある外資IT会社の説明会になんとなく行ってみたら理念等々に惹かれ、そのまま選考を受けた。→ 技術職に内定をいただけた
  • 研究とは別に研究室のプロジェクト人生初の「Webアプリケーション開発」に携わらせてもらった(現在も)
  • 人生初のフルマラソンに出場し、それに向けてランニングなど練習した → 4時間15分切りできた
  • アウトプットとしてブログを始めた

できなかったこと



  • 統計検定1級 → フルマラソンと受験日が被っていた*1
  • KaggleやSignateなどのデータ分析コンペに挑戦するも、挫折 → 授業や研究との両立無理だった
  • ランニングしつつも太った。

総評して、達成度は70点くらいだと思う。

もっとも成長したこと



色々目標はあったのだが、予想外にも

自分は恵まれている

と思えるようになった「精神的成長」が一番大きな成長かもしれない。


去年は正直初めて、「家族」の応援というか支えを実感した。

自分の両親は元来自身の激動の人生経験が由来となりかなり偏屈で凝り固まった考えを持ち、それを子供にも押し付けようとする姿勢が本当に嫌でたまらなかった*2

その経験があり、私はこれまで達成したことは全部「自分の努力のおかげ」と思い込んできた。

しかしながら自己分析というか自分の人生を内省してみると、そのような半強制的教育も「自分のようにはさせたくない」という人生経験に基づいた親なりの愛情の裏返しであり、不器用なりに一生懸命考えた結果なんだなぁとか、

自分のために色々犠牲にしてきたこととか、

学費を捻出してくれるありがたさとか

なんか色々見えてきたことが多かった。



今年と去年と比べたら、考えられないくらい濃密な経験をさせてもらえたが、

これもひとえに周りの人々のおかげだったと実感している。

自己分析は、現所属研究室の先輩やOBの方々が忙しい中、付き合ってくださった結果だし、

国際会議の賞についても、指導教員および他大学の共同研究者の方から論文の書き方・論理の詰め方をみっちり指導していただけた結果。

Webアプリ開発には研究室のM2の先輩にかなり頼った。

様々なことにチャレンジさせ応援させてくれる周りの人々・状況に感謝することで、物事をポジティブに、謙虚に捉えられるようになった。

それに対して「自分は恵まれている」と考え、

さらに貪欲に色々な人から様々なことを教わることで成長し、

さらに機運も高まるサイクルが生まれる。



正直いって、自分が外資ITに内定をいただけるとは思っていなかった。

「それは結果が付いてきた人だから言えることでしょ」といわれそうだし、それも一理ある。

でも、少しの結果の捉え方次第で自分の普段の意識が変わるなら、運気が高まる方にした方がいいに決まってる

やっている行動や起こっている出来事全て

「どうせ偶然」

と、ひねくれた見方をするよりも、 「自分が積極的にチャレンジし、周りが助けてくれた結果」と思う方が、また同じようにチャレンジして、チャンスを作り出せると思う

ポジティブに。そして、アグレッシブに。



New Year's Resolution 2020



色々達成できたこともあるけど、総評「70点」としているように、

できなかったことも多い。



データ分析コンペは最たるもので、タイムマネジメント能力/純粋な自分の能力不足を実感させられた。

Web開発も、ニッチなフレームワークDashについての実践力はついたが、

より定番なDjango、さらにRubyJavascriptといったWebアプリ開発言語については真っさらだ。



それを踏まえて今年の目標は、

専門性を高めること

もちろん引き続き、「感謝」を忘れずに。

雑草精神で泥臭く日光求めるうちに違う景色が見えるように。



具体的な目標は、

  • 6月の統計検定準1級に合格する
  • 機械学習のテーマにチェンジし、結果を出す
  • 週3回以上の筋トレと有酸素運動
  • 週に1冊(=1年で50冊)本を読む。本を読むときは偏った主張に啓蒙しないよう異なる著者のもの2冊読む
  • 英語(留学しないけどTOEFL受験、目標100点)

11月の統計検定1級を逃してしまったので、6月の検定に目標をシフト。

そして、去年は社会科学系のテーマで国際学会に出させてもらったが、やはりデータ分析に興味があるので研究室のボスに相談しテーマをチェンジさせてもらった。

ので、こっちで結果を出す。

正直まだまだ実力不足なところが多すぎて、自分の成長を第一に優先してしまいそうだが、学んだとは後輩に還元しようと思う。

優れた先輩がそうしてきたように。



プライベートの目標に関しては割愛。

体重増加は自己管理能力低下の現れだと思うので、そろそろ本気で怠慢と向き合う。

11月は人生最後?のフルマラ*3再度出ようか検討中。

また、人間としてのを深みを出すための効率的な読書と、非帰国子女ながらも将来のチャンスを逃さないための英語学習を続けていこうと思う。

(p.s)

就活に関しては、本気で行きたいと思ったところから内定をいただいたが、ゴリゴリのエンジニアではないので、研究を通じて技術力を高め、他の会社も引き続き見ようと思っています。

(p.s)

そういえばブログの更新は不定期になってきているし、更新時間は1時間に収められていないしだが、引き続きアウトプットは意識して頑張ります!

wimper-1996.hatenablog.com

ここまで読んでいただいてありがとうございました。

2020年もどうぞよろしくお願いします!

f:id:wimper_1996:20200102050850j:plain
2019.12.31. 年末論文合宿の終わりに研究室より(富士山!!)

*1:統計検定は準1級以上は受験日が年1回

*2:人生勉強ができないとだめから東大へ行け、とかは最たるものである

*3:つくば市内で開催されるフルマラソン、筑波大生は早期応募期間がある

for文で変数名を取得する

やりたかったこと

複数のデータフレームを新たに定義し、作成した時(df_ex1, df_ex2...)、最終的にそれらのデータフレームの辞書を作成したい。

こんな感じ↓

df_dict = {'df_ex1': (df_ex1の中身), 'df_ex2': (df_ex2の中身)...}

そのために、

データフレームの変数名('df_ex1', 'df_ex2'...) を次々とfor文で取り出したい

# 準備
# なんか適当に2つのデータフレームを作る

> df_ex1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'data1': np.arange(4)})
> df_ex1
  key  data1
0   A      0
1   B      1
2   C      2
3   D      3

> df_ex2 = pd.DataFrame({'key': ['X', 'Y', 'Z'], 'data2': np.random.randn(3)})
> df_ex2
  key     data2
0   X -0.237526
1   Y -1.585649
2   Z  1.106063



(やり方) ローカル変数の一覧を辞書として返す組み込み関数locals()と、異なるオブジェクトのラベルを表す識別子id()を利用する

> for df in [df_ex1, df_ex2]:
    df_val_k = [k for k, v in locals().items() if id(v) == id(df)]
    df_val_v = [v for k, v in locals().items() if id(v) == id(df)]
    print(df_val_k)
    print(df_val_v[0])
    print('-------')

# 結果

['df_ex1', 'df']
   key  data1
0   A      0
1   B      1
2   C      2
3   D      3,
-------
['df_ex2', 'df']
    key     data2
0   X -1.738926
1   Y  0.573350
2   Z -0.403480


df_val_k[0]としてあげれば、データフレームの変数名が取得できる



さてここで、間違い↓

> for df in [df_ex1, df_ex2]:
    df_val_k = [k for k, v in locals().items() if id(k) == id(df)]
    df_val_v = [v for k, v in locals().items() if id(k) == id(df)]
    print(df_val_k)
    print(df_val_v)
    print('----')

# 結果
[]
[]
----
[]
[]

何もなくなる

id(k) == id(df)と一致するものがなかったということ

何をやってるのか

そもそもlocals()で取得されるローカル変数の辞書は、

  • key:変数名
  • value:変数の中身

となっている。

id(k)はつまり、データフレームの名前(key)の識別子だから、データフレームの中身ではない



(蛇足)識別子は厄介

wimper-1996.hatenablog.com

> for df in [df_ex1, df_ex2]:
     print(locals().keys())

# 結果
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__builtin__', '__builtins__', '_ih', '_oh', '_dh'......)

なんか色々混じっているが、これらは全て「キー」であって中身ではない。



if id(v) == id(df) の条件部分では、

for文で取り出しているデータフレームの「中身」の識別子が一致するかどうかを条件としなくてはならない。

つまりlocals().keys()のidではなくて

locals().values()のidがdfのidと等値かどうか



そして最後、

データフレームの変数名df_val_kはキーkで取り出し、

逆に変数の中身(データフレーム)df_val_vvaluevで取り出すことができる

idとは一体なんなのか

以前、過去記事でデバッグの見方を記録した際、変数名の取得の方法をメモしていた

wimper-1996.hatenablog.com

肝心の変数名取得のところはここ

get_var_name = [k for k, v in locals().items() if id(v) == id(df_local)]
var_name = get_var_name[0]

df_localは、for文内などのローカルな空間内locals()でのデータフレームの変数名

だが、これを何も見ずにまた書こうとすると間違える。



id(k) == id(df_local)と書いてしまったり、

[k for k, v]ではなく[v for k, v]と書いてしまったり



これの原因は、idをちゃんと理解していないからだな〜と思って調べ出したらなんか深すぎてとまらなかったのでidについてまとめることにした。

(本当は、for文における変数の取り出し方をまとめようと思ったのに....)

idとは

オブジェクトの "識別値" を返します。この値は整数で、このオブジェクトの有効期間中は一意かつ定数であることが保証されています。有効期間が重ならない 2 つのオブジェクトは同じ id() 値を持つかもしれません。 組み込み関数 — Python 3.8.1 ドキュメント

ちょっと調べてみると、こんな記事を見つけた。

qiita.com

pythonにおける演算子isは、idが同一かどうかを指すらしい。

> var1 = [1, 2, 3]
> var2 = [1, 2, 3]
> id(var1) == id(var2)

# 結果
False

これを見た私

「全てのオブジェクトには、識別子が与えらる変数の中身が同じだろうとなかろうと、異なる識別子が与えられるんだ!」

そこで、実験

> var1 = 'hoge'
> var2 = 'hoge'
> id(var1) == id(var2) # 予想:False

# 結果
True




ファ!?




なんでやねん、どゆこと?識別子、一緒じゃん…

色々こんがらがってしまったが、

考えてみると「id」が等しい、すなわちオブジェクトが全く等しいものはそりゃあるような気がする。

私の理解は

イミュータブルなオブジェクトで値が等しいと、idは等しくなる

というもの。

イミュータブルとは、 変更できないオブジェクトのこと。

(イミュータブル) 固定の値を持ったオブジェクトです。イミュータブルなオブジェクトには、数値、文字列、およびタプルなどがあります。これらのオブジェクトは値を変えられません。別の値を記憶させる際には、新たなオブジェクトを作成しなければなりません。 用語集 — Python 3.8.1 ドキュメント

逆にミュータブルとは、変更できるオブジェクトのこと。

例としては、

ミュータブルなオブジェクト

  • list型
  • dict型
  • class 定義文

イミュータブルなオブジェクト

  • str型 文字列
  • int型などの数値
  • タプル

idは、異なるオブジェクトを参照する識別子だから、

hogeというイミュータブル(変更不可能, つまり固有なオブジェクトそのもの)な変数が2つあったら、識別できない

というのが私の理解になっている (間違っていたら指摘お願いします...)。



例えばこれなんかは

> var1 = 'hoge'
> var2 = var1
> id(var1) ==  id(var2)
> id(var2)

# 結果
4550558808
True

これは、var1とvar2が「同じオブジェクト」を「参照」しているためidが等しくなる。

2行目が、var2 = 'hoge'となっても、var1 と var2の参照先は固有のイミュータブルのオブジェクトであるからidが変わらない、ということ。



しかし、リストなどのミュータブルなオブジェクトは、後から要素を書き換えることが可能なため、var1とvar2で初期値が同じ[1, 2, 3] だとしても1つ1つのオブジェクトに最初から異なるidが割り振られる

という理解でいる(これまた間違ってたら指摘お願いします)。



ちなみに

> var2 = str(var2) + 'ee'
> id(var2)

# 結果
4568577224

これは、var2が異なるオブジェクト「hogeee」を参照するようになったため、idが変わったと考えられる

以下の記事が非常に参考になった↓

Python で変数に代入するってなに? | Mastering Python



まぁ、ここまで細かく理解しなくても困ることはあまりないかもしれないが、重要なことは

  • 変数はオブジェクトを「参照するラベル=id」にすぎない
  • idは、基本的に異なる変数に対して異なる値が割り振られる。が、ミュータブルなオブジェクトが全くの同値だった場合、例外的に同じidとなる

20代にしておきたいこと

最近23歳になった。

やはり20歳と比べると特別感は薄いけれど、自分は毎年、一つずつ歳を重ねることを意外と冷静に受け止めている。

それでも誕生日っていうものはやはり、妙に特別で非日常な感じがする。23歳になったことだしなんかいい本読みたいな~と思って手に取ったこれ。研究室においてある本。

20代にしておきたい17のこと (だいわ文庫)

20代にしておきたい17のこと (だいわ文庫)

  • 作者:本田 健
  • 出版社/メーカー: 大和書房
  • 発売日: 2010/04/15
  • メディア: 文庫


20代にしておきたい17のこと。 実はこれは半年以上前、大学院に入り今の研究室に正式に所属したての5月くらいに一回読んでいる。

半年ぶりに、23歳のこのタイミングで読み直してみると、受ける印象がまた少し変わっていた。

当時付箋を貼っていたいくつかは

「うーんまぁ重要だけど普通だな」

と思ったり、

逆に貼っていなかったページに共感したり。

やっぱり本は時間を置いて読んでみるもん。

さて、この本には20代にしておきたい17のことが紹介されている。どれも大事なこと。

まーどれも大事なんだけども。17個って多いよな。そんな毎日17個のことも考えてられん。

というわけで、23歳という今このタイミングで読んで私が改めて共感し、今後の人生でも気にしていこうと思った7つを備忘録として残すことにする。

…と思ったんだけど、書いててかなり量が多くなってしまったので、今回は本当に大事にしようと思ったこと2 つだけ。

一流のものに触れる



人生は自分が触れたものになる



と著者は主張しているが、その通りだと思う。

文句や愚痴を漏らす人に多く囲まれていると、自分もどんどんネガティブになる。

一流のものに囲まれて、一流のものに触れていると、(自分が故意に遠ざけようとしない限り)一流に近づいていく。

一度きりの人生、自分が憧れている世界はどんなところだろうか?



これは人によっても違うし、一流の仕事をするだけが人生ではない。

  • 一人でリモートで場所を選ばず働く
  • 仲間とスノボをしながらリゾートバイトで生活する
  • インスタグラマー

ほんと色々。

じゃあ私はどんな人と過ごしていきたいか?

社会を良くしようと思っていて、日々自分がやっていることを誇りに楽しんで仕事に取り組んでいる人が多いところ



で過ごしたいと思っている。



…修飾語が長い。

まず、将来の選択肢として「そもそも 組織に属するかどうか」

が考えられる。

組織に属さない人は、私の中で大きく分けて3つ

  1. 歌手や作家・デザイナー・アスリート・有名人など、エンターテイメントで価値を生み出す人
  2. 起業家
  3. フリーランス


私は芸術の才能は皆無だからアーティストなどは無理。

そして、起業家。

起業家には、起業家の血が流れている気がする。

「起業」という行動は、努力や、日々ただ過ごすだけではやろうと思えないだろう。

最初は「革新性」「カリスマ性」「柔軟性」「度胸」「知識」全てが必要で、ちょっと頭がおかしい(良い意味)くらいの人がやるものだと思っている。

うん、自分にはこんな大胆さもない。



最後に、フリーランス。主にフリーランスエンジニア。

これは正直なところ「すごいな〜」「いいな〜」と思う。

情報科学のバックグラウンドを持たない私にとって、

プログラミングという、現代のイノベーションに不可欠な技術を身につけ、場所を選ばず価値をもたらせるのは素晴らしいことだと思う。



そんなに羨ましいと思ってるなら、さっさと、質の高いプログラミングスクールに行ってエンジニアになれよ、という話にもなるんだけど、

なんかそう単純な話でもないのだ。


理由の1つは「強い人が多すぎる」

Twitterなどで、色んなが色んな場で活躍しているツイートを見ると、

少子高齢化とはいえ日本には本当に優秀なエンジニアが底抜けとなくいるな〜と思える。

コンピューターサイエンスの知識がほとんどない自分が活躍できる土俵ではない。

私は、「かけ算」でやってくつもり。



あとは多分、スキルを身につけてどう稼ぐかよりも、

スキルを身につけてどう社会を良くするか



が自分にとって大事なのかなぁと思った。



日本って今、少子高齢化だの、IoT技術も中国や米国と比べて遅れてるだの、暗いニュースだらけ。

こんな問題は、私みたいなミジンコの力ではどうにもならない

せめて私は組織を通じて、社会に貢献したい。

やばいやばい言っても何も状況は良くならないんだから、

せめて、前向きに、

ひとつひとつ、

人と力を合わせ、

テクノロジーにより世の中の「不」を解決していきたいもんだ。



また、私は

多種多様な人との交流が人生を豊かにする


と思ってる。

世界を含め、できるだけいろんな人と、交流していきたい。

もちろんリモートで仕事をしていてもいろんな人と関わりは持つだろうが、

組織を通じた「繋がり」はやはり大きいのではないか*1

タラタラ述べてしまったが、そんな感じで考えてみると、私にとっては所属する会社はすごく重要になってくる



私にとっての「一流の人」が多いかどうか。

より具体的には

  • 価値創造や課題解決に本気で取り組んでいる人
  • 深い専門知識を有している人
  • ユーモアがある人
  • 自分の得た経験を他人に還元することを厭わない人

この観点で見ているし

これは、就活の軸の一つにもなっている。

自分の門を開く鍵を持ち、チャンスが来たら、つかむ



7年前。私が16歳だった時。

初めてスマホを持った。

まだそのころはInstagramなんて存在も知らない。

それより前はガラケー

好きな人とはメール、友達との連絡先交換はアドレス帳。

たった7年間では想像もつかないくらい、常識も変わったなぁと思う。

当時は、数学が嫌いで、コンピューターなんて一部オタクがやるもんだと思っていた。

エディタを使って四苦八苦しながら楽しんでいる今と比べたら、なんという変化。

そう、

未来がどうなってるかなんてわからない


のである。

何かの偶然が、自分のキャリアを決定づける可能性は大いにありえる。

私はこれはむしろ機会だと思っているし、

積極的にそれに飛び込んでいきたい。




肝心なのは、「良い」偶然を引き寄せること。

そのために行動し、準備する必要がある。

  • 社会の流れや大きな問題に敏感であるための「オープンさ」
  • やりたいこと・面白そうなものが見つかったらそれに飛び込むという「チャレンジ精神」
  • チャンスがきたら掴むための「準備」

これは、私が大事にしている計画された偶発性理論の一部でもある。

後日紹介したいなと思うので取っておこう。



自分の価値観をタラタラ述べてしまったポエムになってしまったが

誕生日だししょうがない。



人生全力で生きていくぞ〜〜〜

*1:まぁいずれは、のびのびと自由に働きたいと思うようになることも否めないんだけど。

おすすめのカラーパレット生成ツール

微力ながら、現在の研究室ではWebアプリケーションの開発に携わっている。

内容の具体的な説明は除くが、私が担当しているのは、データの集計および可視化で、 フロント部分を重点的に担当している。

使っているのはPythonフレームワーク言語Dashで、グラフが綺麗に描写できるモジュールPlotlyをベースにしている。詳しくはこちら

wimper-1996.hatenablog.com




最初はDashの文法を学んでデータを集計・可視化するのに必死だったが、ある日先輩に

そろそろベースカラー決めない???

と言われて、「ハッ!!!」っとなった。

確かに、デフォルトのカラーを使っててWebアプリの見た目(カラー)になんとなく統一感がない……

そもそもWebデザインも初心者でデザインの設計もわかっていなかった…

Webサイトの配色は、そのサイトの特徴を決める大事な要素で、本来なら一番最初に決めるべきもの。

  • メインカラー
  • ベースカラー
  • アクセントカラー

この3つがある。この中で、最初に決めるのが

「メインカラー」と「アクセントカラー」の2色。

このサイトをめちゃくちゃ参考にさせていただきました。ぜひ。

これだけ守れば見やすくなるデザインの基礎 - Speaker Deck

メインカラーは、Webサイトのテーマカラーともいうべき色で、企業のロゴのカラーと同じすることも多い。

サイト全体の25%を占める。
落ち着いた色=明度が低い色 が良いっぽい。

アクセントカラーは、出し惜しみする。強調したい所に使う。

アクセントカラーは、メインカラーに対して目立つように、色相において反対に位置する色 = 補色を選ぶのが良さそう。


上でシェアしたスライドにあるように、なるべく色は増やしたくない。

それでも増やしたいときは、明るさと鮮やかさ(明度と彩度)は固定して、色相だけ変化させると、トーンが一緒で統一感のある色が得られる。


ちなみにここで、色の表現についてちょっと補足しておく。ここまでで「明るさ」「鮮やかさ」「色相」というワードで色を説明してきた。

これは、HSB空間の考え方に基づく。

HSBは、「色相(Hue)」「彩度(Saturation)」「明度(Brightness)」の3つで表現するもの。

f:id:wimper_1996:20191126003653p:plain




他の表現としてメジャーなものとしてRGB空間があるが、これは「原色の組み合わせ」で色を表現する。

各要素を変動させた時に色がどう表現するのか素人には予想しづらい。

HSBだと、色自体を「Hue(色相)」の部分で決め、あとは明るさと鮮やかさを調整するだけだと考えれば直感的にもわかりやすい。


さて、ここまででメインカラーとアクセントカラーの決め方を簡単にさらっと言ったけど、

色の組み合わせって考えるの結構難しい…



私の場合、グラフを2種類使い、それぞれ目立たせたい項目があったので、アクセントカラーを2色選びたかった。

そうなると、


「ベースカラーとアクセントカラーは補色の関係がいいのか〜」

「今のアクセントカラーの明度彩度に合わせてもう一つのアクセントカラーを考えると、暗すぎるんだよな〜」

「あと共同研究先のHPカラーっぽいのをベースカラーにしたいけどもうちょっと暗い方がいいかな〜」

などなど色々考えることが多くて悩んでしまった。

こんな時の、カラーパレットジェネレーター。


カラーパレット生成ツールは、Webデザインだけじゃなくて、パワポの配色考えるときにも役立つはず!

さぁ、どれを使おう!!!!




【2021年版】もう配色デザインには迷わない!すごい無料カラーパレットツール72個まとめ - PhotoshopVIP


いや、多すぎやろ…どれを使えばええんじゃ




しょうがなく、色々試してみた。

最終的に私は2つのツールを使ってWebアプリの配色を決めたので、ここに共有。

基準は、

  • HSBを自分で簡単に調整できるか
  • 画像から色を抽出できるか
  • 直感的に操作が簡単か

だった。

全て兼ね揃えているのが意外と少ない。

色の調整がマウスホバーで微修正しないといけなかったり、

1つの色を選ぶと、他に選択できる色が限定されたり、

一方的に色がレコメンドされるだけでこちらで明るさ調整できなかったり。


色々試してみた結果、良かったのが

coolors.co

https://color.adobe.com/ja/create/color-wheel/color.adobe.com

こちらの2つ。

1つ目「Coolors」は、会員登録が必要だけど、登録する手間を差し置いてもお勧めできる。

複数のカラーを固定して、それに合ったカラーパレットを自動で生成してくれるツール。

  • スペースキーでリコメンドされる色を切り替え
  • いいなと思った色を保存できる

色の調整も簡単。使いやすい。


2つ目は、Adobeが提供する無料ツールで、会員登録も不要。

いいなと思ったのが、

  • 補色や類似色など、タイプを選択できる
  • 画像から抽出した色も反映される(coolorsでは数値をコピペして貼り付けする必要がある)

ただ、ある特定の色を固定するのがちょっとめんどくさいというか、

ベースカラーは設定できるはずなのだが他の色を変化させるとベースカラーも変わってしまうのが欠点。

f:id:wimper_1996:20191126015503p:plain


私は、両者を駆使して、共同研究先のWebサイトから色を抽出したり、補色どれかなー、どれくらいの鮮やかさがいいかなー

と、試行錯誤して

最終的にFigma*1というUIデザインツールを使って簡単にWebページのパターンに落とし込んで、

研究室の皆さんにアンケートをとってテーマカラーを決定した。

というわけで、ようやくWebアプリのデザインカラーが決まったので、これからどんどん反映させてくぞ〜〜




Webデザインももっと色々勉強していかなければ…

ここまで読んでくれてありがとうございました!

*1:Figmaと同列のツールとして、Sketchがある。Figmaは無料で使えてオンラインでもpcでも使えてオススメ

Keep Looking, Don't Settle.

最近は、よくこんな話を見聞きするようになった。



急速にIoT化が進み、インターネットで全世界が繋がっている今のご時世、

突出した才能や、ユニークな趣味があってそれをソーシャルメディアで発信すれば、多くの人の目にとまるチャンスがある。

Tic Tok、インスタグラム、ツイッター、ブログ…

こういったSNSをうまく活用し、個々の才能を発信することで確立された「知名度」「信頼」という価値は、

「企業で稼ぐ」だけでは確立されるものではなく、

簡単に代替されるものではない。

例えば唯一無二の才能を持つ落合陽一教授が 「〜〜やるのでお金貸してください」と一声クラウドファンディングを呼びかければ、
すぐにでも色々な人から何百万というお金が集まる。

これが、知名度」「信頼」という、現代の強力な価値

貨幣そのものの価値は、どんどん薄れている。

つまりもう、企業という固定の組織に所属して稼ごうなどというのは時代遅れで

いかにひとりの「個」として突出できるか、が勝負になっている。



ざっとまぁこんな感じの内容。

残念ながら私は凡人の中の凡人で、プログラミング、芸術、スポーツ、趣味など、あらゆる分野で突出した才能は全く持ち合わせていない。

親のせいにすることはすごく気が引けるけど、私は小さい頃から「勉強しろ」と言われて育ってきた。

勉強して知識を身に付けることが、尊いことだと思い込んでいた。

だからこれまで、スポーツや個人的な趣味とか興味をやり貫いたことはない。

小学校の頃は漫画と絵を描くのが大好きで
「マンガ家になりたい」なんて思っていたこともあったけれど、

勉強しろという我が家の教育方針と中学受験に伴ってアッサリやめてしまった。

それに、マンガ家で将来やっていけるとも全く思っていなかった。

算数が苦手で、よく父親に教えてもらっていたけれど、

私ができないことを理解してくれずに高圧的な指導を受けたことによる嫌悪感も重なり、

情報系に全く興味がわかず*1

とことん普通に勉強を重ね普通に勉強する人間になった。

だからこそ、スポーツとか、芸術とか、幼少期から興味を持ったものを続けている人のことを私はとても尊敬してしまうし、

劣等感も抱く。

特に、

など、人に代替され難いスキルを持っている人。

自分のやりたいことを自由に突き詰められる世の中になった反面、凡人にはとことん生きにくいような、そんな世の中になったなぁ。とふと思うことがある。

輝かしい才能や、誰にも負けない個性を持つ人はいいけど、
じゃあ何もない凡人はどうすればええねん。

凡人大変。

そう思いません?

じゃあどないするねん、

今のところ、それに対する答えは



自分を信じて、探し続けろ



え、なんじゃそれ、なんだか答えになってるような、なってないような…

先生!勉強できません!どうすれば良いですか!とすがったら、

「そんなん努力だ!」


と言われたみたいな…



「働かずに適当に好きなことやって過ごすのが楽しい」

そういう声もあるし、それはその通りである。確かに旅行や遊びは楽しい。全く否定しない。

大学院の前の冬に一ヶ月、ひとりで白馬に行き、スノボのリゾートバイトを経験したことがあるのだけれど、

そこでは日本にワーキングホリデーに来ている外国人がたくさんいて、

そして毎日スノボとゲレンデバイトで生活している人や、 旅をしている人、
これから海外でワーホリをしようとする日本人もたくさんいて

みんな純粋に人生を楽しんでいるようだった。

私も正直、海外で1年間楽しくワーホリもありだなあ、とバイトしているときは思った。絶対英語も身につくし。



だけど、やっぱり大学に戻って、自分のスキルを基に世の中にインパクトを与えている多くの人たちを見て、

やっぱり自分も、世の中に影響を与えたいと思ってしまった。


かの有名な、スティーブ・ジョブズスタンフォード大学卒業式での演説*2

You've got to find what you love. And that is as true for your work as it is for your lovers. Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do.
If you haven't found it yet, keep looking. And don't settle.
As with all matters of the heart, you'll know when you find it, And like any great relationship, it just gets better and better as the years roll on.

So keep looking. Don't settle.



一度しかない人生。何も世の中で活躍せず、遊んで過ごすって、すごく勿体無くないか。

死ぬとき、少しでも「あいつがいてよかった」

そう言われて死にたいじゃないか。

自分はどうしても、そういう人間らしい。

達成欲と貢献欲が大きい、欲張りな人間らしい。

自分がやりがいを感じること、自分にしかできないことを探求し続けて、世の中を良くするための技術とサービスを謙虚に学びつづけていこうと思う。

才能がない分、雑草精神という大きな武器を生かして。

  • 大学受験期直前の模試で最高学府E判定を叩き出した凡人が諦めなかった結果それなりに肉薄し、結果として雑草根性が形成されたこと。

  • 苦手な数学・物理を全力で学び、理系基礎力を身につけたこと。

  • あさきゆめみしをきっかけとして、古典(今は全く勉強していない)にどハマりし、「徒然なる」「あはれなり」など、英語では捉えきれない繊細な日本語の美学を学んだこと。

  • 何かを0から作り上げるやりがいを知った、大学での課外活動。

  • バイオマテリアルについて3年から研究し、バイオ研究が自分に向かないと悟ったこと。

そして、大学院から専攻を変えたこと。

Connecting the dots.



今までの人生全てが「オンリーワンの私」を形作っていると信じて、これからも自分の道を進もうと決意した、とある11月の初旬の話でした。

*1:専門知識を身に付けたいという拘りと文系の職業に対する興味がゼロだったので、理系に進んだけど。今プログラミングしてるけど。

*2:私の一番好きなスピーチ

Dashで機械学習ができるWebアプリを作る [ラスト]

Dashを使って、機械学習をさせるWebアプリケーション作ろうStep5!ラスト!

いやー長かったですね。

ようやく完成です!

またまたおさらいします。一応ね。

Step1: タイトルとデータアップロードの枠だけ作り、cssでいい感じに表示させる

wimper-1996.hatenablog.com

Step2: 単純な線形モデルを作り、グラフとスコアを表示させる

wimper-1996.hatenablog.com

Step3: モデルを選択するドロップダウンを作って、選択したモデルに応じて出力結果が変わるような動的なページを作る

wimper-1996.hatenablog.com

Step4: ファイルをアップロードし、データフレームとして表示させる

wimper-1996.hatenablog.com

ラストはここ!!↓

Step5: アップロードしたデータを読み込んで学習させるようにする


今回のステップを経ると、無事、完成品ができます!

最初、何もグラフとして表示されていたなかった淡白なページに、

データがアップロードされ…

自動的にデータの中身を読み込んで学習されるようなアプリになりました。

f:id:wimper_1996:20191105133239g:plain

今回は、前回、callbackのOutputとしてdash_table.Datatableの中身を返しましたが、

今回はそれをInputとして、モデルの学習に使います。 かっこよく言ってchain callbackってやつ。

コールバックの全体像はこんな感じ

f:id:wimper_1996:20191105133415p:plain

スタートはデータのアップロードから。

それとは別にモデルの種類を選択するドロップダウンも作って、

その両方の情報を機械学習に使う。

そろそろ、callbackの雰囲気も掴めてきたのではないでしょうか?

Step3では、ドロップダウンで選択したモデルを値としてInputして、学習させていました。

この時データは、一番最初にdf = pd.read_csvで読み込んでいました。

が、今回は、手動でアップロードし、data_tableに送られたデータの情報がInputとして追加で必要になります。

@app.callback([Output('rmse-sentence', 'children'),
               Output('r2-sentence', 'children'),
               Output('residual-plot', 'figure')
               ],
              [Input('model-dropdown', 'value'),
               Input('output-data-upload', 'data')]
              )
def update_result(model_name, dict_data):
    # コールバックが起こるがまだデータはアップロードされていないので、例外処理を行う
    if dict_data is None:
        raise dash.exceptions.PreventUpdate

    # アップロードしたデータテーブルの中身を読み込む
    df = pd.DataFrame(data=dict_data)

data_tableに格納されているデータの型はdict型で、pd.DataFrame(data=)でデータフレームに変換することができます。

あとのモデルを学習させる続きは、Step3と一緒です(雑)

終わりに

これでようやく完成しました〜〜

ここまで見てくれてありがとうございました!

へ〜こんな簡単にアプリ作れるんだ!と実感してくれたら嬉しいです。

今回、モデルは2つしか使っていませんが、

ドロップダウンを増やしたり、

パラメータを変化させたり、、、

簡単な前処理も施せるかも。

ここから、色々機能を追加できると思います!

ぜひ色々試してみてください。

私はちなみに、学習モデルとして勾配ブースティングと決定木のアンサンブルモデルであるXGboostも付け足してみて、

loading機能も加えてちょっとお洒落にしてみました。

f:id:wimper_1996:20191106020039g:plain

やっぱり、スコアは3つのモデルの中でxgboostが一番よかった。

若干自己満な感じあるけど、楽しかったからよし。笑

ここまで読んでくれてありがとうございました〜〜!!!