日々の学びと煩悩

Windows と Mac をストレスフリーに使うための設定諸々

これまで全くの Mac ユーザー(小声)だったが、会社用に Windows も使うように。

最初のうちはデフォルトのまま我慢して使用していたが、調べてみると意外と Windows 設定の中でカスタマイズできる。

ということで、私が行った設定をまとめてみました。

PC は、ThinkPad / Windows10 です。

目次にしたので、気になるところだけでもピックアップしてみてください。

マルチOS 対応のキーボードを使う

いやいや、もう持ってるわーい、って人も多いかと存じますが、、、お薦めする理由あります。

Logicool のキーボード(MX Keys)とマウス(MX Master 2S)を使っています。

ロジクール アドバンスド ワイヤレスキーボード KX800 MX KEYS 充電式 bluetooth Unifying Windows Mac FLOW ワイヤレス 無線 キーボード 国内正規品 2年間無償保証
ロジクール MX MASTER 2S ワイヤレス マウス MX2100CR Bluetooth 無線 ワイヤレスマウス windows mac iPad OS グラファイト 国内正規品 2年間無償保証

一般にプログラマに人気なキーボードとして、HHKB がありますが、色々調べ、以下の理由で Logicool の MX keys にしました。
ちなみに、研究室では HHKB professional hybrid を使用していたのでしっかり比べた上での結論。

  • 3台までペアリング可能、ボタン一つで切り替えることができる。Mac と Windows 双方に対応。

HHKB は複数台ペアリングはできますが、OS による切り替えはできず、別途 USB ドライバを購入する必要があります。

  • ショートカットキーがたくさんある

スクリーンショットはもちろん、画面ロック(win + Lに対応) ボタンもあって楽です!
数字キーボードもあれば意外と使う。
HHKB はファンクションキーと組み合わせて色々やるんだと思いますが、私は中々慣れませんでした。

  • マウスとの相性抜群

Logicool オプションというソフトを使い、キーボードとマウスを簡単にカスタマイズできます。もちろん複数 OS 対応。

f:id:wimper_1996:20210426093051p:plain

ついでにマウスについて言うと、私は Virtual desktop 切り替えを Mac と Windows 両方で設定しており(下の写真参照)、操作感も同じなのでストレスが少ないです。マウスだけでも Logicool にすると結構便利です。

f:id:wimper_1996:20210426092912p:plain


  • 値段

結局これ。

HHKB 3万5千円と考えると、1万5千円の Logicool Keys が安く感じるバグが起こる。(キーボード全体でみると1万5千円は、高い方です。)

HHKB 確かに打ちやすくてクールですが、ごりごりプログラミングしないのであればコスパ的にも Logicool のキーボードで十分満足できるかな〜と個人的には思いました。

重要なのは

実際にお店で試打してみる

こと!好みは人それぞれなので!!


次からはキーボード、マウスに関わらず設定できる項目です。

(易) Mac と同じように 英数/かな を切り替える

まずは一番最初に設定したいところ。 Windowsよ、なぜ変換キーを左上に離した。

右下のタスクバー「あ / A」を右クリック → 「設定」 → 「キーとタッチのカスタマイズ」の順にクリック(英語表記でわかりにくくてすみません....) f:id:wimper_1996:20210426083112p:plain

  • 無変換キー:IME-off
  • 変換キー:IME-on

に設定 f:id:wimper_1996:20210426083616p:plain

これでOK です。まずは Mac と同じように変換できるようになっただけでだいぶウキウキ。

(少し難) Ctr ⇔ ⌘ となるようにする

お世話になっている先輩から教えていただいたAutoHotKey というソフトを使い、Ctr と Alt を入れ替えました。

例えばかなり頻繁に使うであろう以下のショートカットキー

操作 Mac Windows
コピー / ペースト ⌘ + C / ⌘ + V Ctr + C/ Ctr + V
全選択 ⌘ + A Ctr + A
新しいタブを開く ⌘ + T Ctr + T

からわかるように、Ctr を ⌘ と同じように使いたいことが多々あります。

が、現状、⌘ のキーは Windows では Alt が割り当てられているので、これを交換します。


導入と始め方自体は、インストールしたときのチュートリアルに従うだけで簡単にできます。

  1. デスクトップのどっかで右クリック → 「New」→ 「Autohotkey script」を選択 f:id:wimper_1996:20210426113045p:plain
  2. 編集する(中身はこちら
  3. 拡張子を .akh にして保存
  4. スクリプトを右クリックし、「管理者として実行」で、スクリプトを実行
    一番上の「Run」を押すだけでもできますが、うまく動作しなくなったときは管理者として実行すると直ることがあります f:id:wimper_1996:20210426112857p:plain:w350


スクリプト言語で命令を複数記述でき、本当に色んな操作ができて一見難しそうですが、とりあえずキーのリマッピングだけなら以下のように書けます。

変更前キー::変更後のキー

www.autohotkey.com


私のスクリプトはというとこちら、そのままコピペOKです。超シンプル。

実際に書いてるのは 5 行目から(最初の4行はデフォルトで入っている)で、Ctr と Alt キーを入れ替えています。

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
Ctrl::Alt ; ここから
Alt::Ctrl
return ; ここまで

記述するキーのリストはこちらがとてもよくまとまっています。

ahkwiki.net

が、更新されていない可能性もあるので、公式ドキュメントで確認することをお勧めします。


最後、起動時にファイルを実行するようにします。スクリプトとか作成せず、特定のディレクトリにショートカットを追加するだけでOKです。

  1. ahk ファイルを右クリックで「ショートカットを作成」
  2. ファイル名を指定して実行(Win + R) で shell:startup と入力
  3. 表示されたディレクトリに、ショートカットを追加 f:id:wimper_1996:20210426101540p:plain

(易) Mac と同じように 3 本指で仮想デスクトップを切り替える

Logicool のマウスを使ってなくても設定で変更可能!これはでかいのでは。

  1. 設定を開き検索から「touchpad(タッチパッド)」と入力
  2. 真ん中あたり「Three-finger gestures(3本指 ジェスチャー)」にてデスクトップ切り替えを選択

f:id:wimper_1996:20210426101711p:plain

(おまけ) Mac の方で画面分割ショートカットキーを設定する

Windows には Win + 矢印キー 、あるいはドラッグ and hold で簡単に画面分割できますが Mac にはないです。

画面分割、意外に便利なので私は Mac に Spectacle というソフトを入れ、Windows と同じようなキー(Opt + 矢印キー)を割り当てています。

f:id:wimper_1996:20210426081934p:plain:w400
トップバーにメガネマークが出てればOK。下のボックスにチェックをいれとくとMac起動と同時に立ち上がるのでよい

とっても簡単にできるのでおすすめです。

終わりに

ここまで読んでくださりありがとうございました、今のところ Mac と Windows で行っている自分の設定すべてです!

AutHotKey 割り当てを変更しすぎると、キーボードの表示と異なり逆に混乱することにもなりかねないので、これくらいでよいかなーと思っております。

何かもっと簡単なセッティングがあれば教えてください :)

初心者が 1ヶ月で 0 からWeb サイトを作り公開した話

もう1ヶ月以上前のことになりますが、学生生活も残すところわずか2ヶ月ほどのタイミングで、所属する専攻の外部向け研究発表会のWebサイトを作らせていただきました。

www.sk.tsukuba.ac.jp

それまでの経験

  • 言語は Python メインで、HTML と CSS 最低限レベル。javascript は触ったことあるけど忘れた
  • Figma を使ってモックアップ的なのを作成したことはある
  • Dash を使ったWebアプリもどきを作成したことがあるだけで、本格的なWebサイトなんてもってのほか

という、ほぼ Web サイト作成未経験者です。


ソースコードはこちらです!

github.com


ポイント

  • インスタンスを用いたカードアイテム(発表スライド)の生成
    PHPProgate で勉強。 発表スライドは 一人一人スプレッドシートに埋め込みリンクを入力してもらい、 API を利用してデータを読み込み。方法は後述
  • 研究分野タグの絞り込み
    → 一緒に開発したもう1人が自ら実装してくれました....。jQueryだけでいけるそうです。圧倒的感謝。
  • コメント機能
    → スライドにコメントを残す機能を、SQL 無しで実装しました。方法は後述
  • デザイン全体
    → 配色を含め、サイト全体のデザインは自分が担当しました。Figma を使ってあれこれデザインを考えるのが一番楽しかったかもしれない。


出来上がったサイトはトップページとかスマホ向けレスポンシブ対応になりきれていないし、普通にサイトとして未熟であることは重々承知です....。

ブログにするか大いに悩みました。でも、こんな人間でもにツールを使いこなせばここまでいけるよ、と少しでも誰かの参考になれたら良いなーと思い、記事にすることにしました。ちょっと長いので、気になったところだけでも見てみてください。




用いたツール


タスク管理ツールは Trello など人気なイメージだが、最近、今流行りの Notion にハマっててタスク管理ツールとして試しに導入。

エンジニア向けのタスク管理テンプレートが公開されているのでそれを有り難く利用するだけで、とても使いやすかった。

Notion については色々な情報が公開されているので詳しく言及しませんが、良い。(語彙力)

創業者自身が UI/UX デザイナーだからか、直感的な操作と機能性に優れている。逆に言うと機能が多いため、使いこなすのがちょっと難しいが、ありがたいことに無料のテンプレートが数多く公開されているので、どんどん使うべき。

欠点としては手書きができないことか....これができればiPad でノートとしても使えて最高....


Semantic UI について

Webサイトの見た目はほぼ Semantic UI に頼らせていただきました。

CSS フレームワークとしては Bootstrap が定番だと思いますが、「いかにも」感が出てしまうので余計なプライドが働いた。そこで、

  • モダンでおしゃれ (パッと見て初心者が作ったサイトだと分からない)
  • 使いやすい

ことを満たした都合の良いフレームワークはないか〜ないか〜と探して、辿り着いたのが Semantic UI。

選定にあたって参考にしたサイトはこちら

Semantic UI の使い方については最初は以下をはじめとする日本語のブログで大局観を掴み、慣れてきたらひたすら公式ドキュメントで必要な機能がないかを探した。

https://qiita.com/Yuta_Fujiwara/items/8abeda1b92dcaf505149

https://qiita.com/sandabu/items/336fe312acbec98d21e3

導入

CSS フレームワークを使用する方法は主にふたつ。

  1. ローカルに必要なファイル(cssとjs)をダウンロードする
  2. インターネット上に置かれているファイルをそのまま読み込む(CDN)
    CDNとは、Contents Delivery Network の略。
    【図解】CDNとは?仕組みと技術の基礎知識 | カゴヤのサーバー研究室

私は後者の CDN で導入した。Semantic UI の CDN のリンクは少々わかりにくいので注意。

semantic-ui.com


使った感想

それまで Bootstrap しか触ったことがなかった身として、複雑で動的な機能も、文法にしたがって jQueryを少し書くだけで実装できる点にとても感動した*1

それに気づいたのは後の方で、知識補強のためにこれまた Progate を使って jQuery を勉強した。そうすると、Semantic UI の凄さがよりわかる。

色々使ったけれど、ポップアップモーダルDimmer コンポーネントなど動きを含むモジュールを重宝した。

例えば Dimmer コンポーネントは、普通は hover イベントを実装して、css で装飾して....など手間がかかるところを、html において親要素に dimmable image、子要素に ui dimmerクラスを指定するだけで表示が変わる動作を簡単に実装できる。

<div class="blurring dimmable image">
      <div class="ui dimmer">
         <div class="content">
              <a class="ui inverted purple button" href="#guest-speakers">More</a>
         </div>
       </div>
       <img class="ui rounded image" src="img/about_guest.png">
</div>

f:id:wimper_1996:20210322033602p:plain


(追記)
1ヶ月後、公式サイトを見たら、ui dimmer で 子要素 content クラスを囲めば良くなっていた。

Since 2.3 dimmers with content now only need a single wrapping content container.


注意点

semantic-ui のスタイルを変更する意味合いで、カスタムcssシートを用意していたのだが、ちょくちょく適用されない場面があった。(理解 & 実装力不足の可能性も大いにある...)

そんな時は仕方ないので、html の style タグで無理矢理指定した。


一例

/* 適用されない */
/* .ui.watching.button.right.floated {
  font-size: 12px;
  padding: 1em 0.8em;
} */

適用されないので html 内でスタイルを指定

<a class="ui watching button right floated" style="font-size: 12px; padding:1em 0.8em;"><i class="video icon"></i>発表動画を観る</a>


デザインについて

一応大学院ではサービス提供者と顧客の価値共創を研究したこともある身として、UI / UX デザインは Figma を駆使してあれこれ考えた。

流れは

ワイヤーフレームを作成する

  • 何を載せるページを作るか
  • 必要な機能・要件は何か

f:id:wimper_1996:20210322025143p:plain
実際に作ったワイヤーフレーム(超シンプル....)

② デザインカンプを作成する

  • サイトのベースカラー、メインカラー、アクセントカラーを決める www.m-hand.co.jp

  • 「整列・隣接・反復・対比」というデザインの4原則を守りデザインする

    デザインの名著


たったの2ステップ!?という感じだが、実際にやってみると些細な色の配色、フォントの大きさ、要素の配置、かなり悩む。デザインは本当に沼。

いろんな本やサイトを見て自分なりにシンプルで統一的な見た目になるよう心がけました。参考にしたサイトを列挙してみます。


スライドカードについて

https://www.sk.tsukuba.ac.jp/~msesympo/2020/presentation/student

発表資料を組み込んだカード1つはこのように書ける。が、これを学生分 40 個以上打ち込むのは地獄。そこで、PHP を用いて Card クラスを作り、for文でインスタンスを生成して自動化した。

<!-- card example -->
<div class="slide purple card" style="width: 400px;">
    <img src="../img/slide_example.png" width="100%"> <!-- Google スライドにする際は、ここを埋め込みリンクにすればOK -->
    <div class="content">
        <div class="header" style="margin-top: 40px;">(スライド番号).研究タイトル</div>
        <div class="ui grid">
            <div class="ten wide column time">
                <div>①発表時間1(Remoテーブル)</div>
                <div>②発表時間2(Remoテーブル)</div>
                <div>メニューのTime Tableをご確認ください</div>
            </div>
            <div class="six wide column student-name">発表者名</div>
        </div>
    </div>
    <div class="extra content">
        <div class="ui two column grid">
            <div class="column">
                <div class="ui tag labels">
                    <p><a class="ui tag label">研究分野①</a></p>
                    <p><a class="ui tag label">研究分野②</a></p>
                </div>
            </div>
            <div class="column youtube-icon">
                <div class="ui icon button" data-tooltip="研究に対する感想や応援等を、是非コメントください。"><i class="ui comment alternate icon"></i></div>
                <a class="ui watching button right floated" style="font-size: 12px; padding:1em 0.8em;"><i class="video icon"></i>発表動画を観る</a>
            </div>
        </div>
    </div>
</div>

f:id:wimper_1996:20210322040546p:plain:w350

画像の代わりに埋め込むスライド情報は、 Google スライドの埋め込みリンクを利用する。(下図参照)

Google スプレッドシートに自分で情報を入力してもらい、こちらの情報を参考に、 スプレッドシートのデータを変数として読み込んでいった。

f:id:wimper_1996:20210322042634p:plain


これにより、スプレッドシートの変更がそのままリアルタイムに反映され、学生自身による発表時間の変更やスライドの修正が可能となってとても便利だったと思う。


コメント機能について

コメントを残す機能は UI はもちろんのこと、セキュリティの管理、データベースの用意など、色々障壁がありそうで時間が足りなかった。そこで、ここでも Google 様に頼ることにした。

中身は Google フォーム、見た目は Semantic UI で粉飾する作戦。

Semantic-UI のコンポーネントを使用すれば、フォームチェック機能を実装することもできる。

f:id:wimper_1996:20210322120017p:plain
全て Semantic-UI のコンポーネントを使って実装

tekito-style.me

semantic-ui.com


Google & Semantic UI、恐るべし....


最後に

長々となってしまいましたが、ここまで読んでくださりありがとうございました😭

ちょうど自分の修士論文発表もあったタイミングで、短期間で学びつつ開発をしたので結構大変でした。反省点も改善点もめちゃくちゃあります。

でも初めて Web サイトを公に公開するというところまで自力でやらせていただき、シンポジウムを無事成功させることができた時は苦労が見事に美化されました。何よりデザインから考え、しかもいろんな人と協力しながら完成させることができたのでとても楽しかったです。


4月からはサポートエンジニアという全く違う職種に着くことになるけど、デザインとかプログラミングは今後も継続して行けたらいいな〜〜とか思いました。

*1:今時では当たり前のことかもしれないけれど....

いったん子どもに戻る

2020年、私は「専門性を高めること」を目標として、熱く掲げていた。Introspection and Resolution 2020」 などとカッコつけて称して。

wimper-1996.hatenablog.com


お前の目標なんて興味ないよって方、言いたいことは こちらです。


さて具体的な目標を振り返ってみる。

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

総評点はこちら。


70 点


ん?意外と高くね????


たしかに、

「プログラミングバリバリ頑張る!」「機械学習極める!」

と息巻いていた割に、


結局統計検定は受けてないし、目標としてたTOEFLにも全く届かず、

お前何達成したんだという感じではある。


実際この1年は、自分の無能さに打ちのめされる毎日で、

「プログラミング向かねえ」と日々血反吐を吐き地べたをのたうち回っていた。

しかし半年以上毎日十何時間もPCと向き合った結果、

のたうち回っていたかに見えた足跡はどうやらカタツムリのスピードで気づかない緩やかな斜面をジリジリ進んでいたらしく、

  • Docker を使ってデータ分析を行う
  • Jupyter Notebook から離れてスクリプトファイルや mlflow で再現性のある実験を行う
  • クラスを用いた実装を行う
  • 第二著者ではあるものの、分析担当として学会論文を投稿


など、1年前には全くお手上げ状態だったことができるようになっていた。


もちろん、プログラマーにとっちゃこんなの当たり前というのも知ってるし自分がプログラミング出来るなんて微塵も思っていないのだが、

そんなの比較してたらキリがなくて一生自分を褒めてあげることはできない。


他人ではなく過去の自分と比較


これは私が大事にしている価値観の一つだ。




さて、研究についてはここまでにしといて、(なげえ)

2020年はなんで悪くなかったかというと 私にとって「視野を広げる」ことができた年だったからだ。

きっかけはこの二冊(画像クリックできます)


1冊目「ユダヤ人大富豪の教え」に、こんな節がある

大富豪「人生で成功してお金持ちになりたければ、まず、自分が魂を打ち込める中を見つけること。それに最大限のエネルギーを注ぐべきだ。残念ながら多くの人間は、この作業をやらない。」

僕「あのう、僕は自分の好きな分野が今ひとつ見つからないんです。そういう人は、どうやって好きなことを見つければいいんですか?」

大富豪「時間をかけて、人生のリハビリさえやれば、きっと見つかる。自分の好きなことを日常的に少しずつやることだ。小さい頃から自分が好きだったことを思い出して、それをやってみることだ。」


ハッとした。 私は、小学校の頃は(上手とかはおいて)絵が好きで、

漫画が好きで友達と描いていて、

本も好きで中学まで毎日駅前の図書館に通って本を読んでいた。


それが気づいたら中学受験からの大学勉強というレールに乗り、

「勉強が全能」と思い込み、

大学に入るとアニメ漫画本全てほとんど読まなくなっていってしまっていたのだ。


13歳からのアート思考での一節(要約)

絵を上手に描くことが出来る人は「花職人」であり、「アーティスト」ではない。

物事を自分の視点で捉え直して、表現の花を咲かすことが出来る人が、真の「アーティスト」であり、その力は不明瞭かつ変化が激しい今日のビジネスにおいて、必要不可欠なスキルである


この本については、以前ブログに紹介しているので是非

wimper-1996.hatenablog.com


危ねえ。このまま、薄っぺらい人間のまま、社会人を迎えるところだった。

てなわけで、私は就職までは、いったん子どもに戻ることに決めたのである。



映画を週に2本ペースで観たり(半年で83本観ました、評価トップ映画は↓のリンクから)

https://filmarks.com/users/aya1023blue

f:id:wimper_1996:20210109001658j:plain:h450
映画記録アプリFilmarksお勧めです。お気軽にフォローどうぞ!

よりアートの教養を深めたり

美術館に足を運んだり

f:id:wimper_1996:20210109002207j:plain:h450
横浜美術館「トライアローグ」

絵もはじめました。(小声)

f:id:wimper_1996:20210109072636j:plain:h350
10年ぶりに鉛筆を買った。

言いたいこと


ユダヤ人大富豪の教え、おすすめです。

「人生豊かにして〜〜」「幸せになりて〜」って思う方全てにヒントがあるはず。

こういう自己啓発本ってなんかいけ好かん。って思うこともあると思うんですけど、なんなら私もそのタイプなんですが、

悔しながら心に刺さる言葉が多くて自分の行動を省みるきっかけとなりました。

幸せな金持ちになるのに、最も大切なのは、豊かさ意識を持つことだ。私が若い頃にあった金持ちは、どうも何かが違うと感じていた。よく観察していると、彼らは、人生は豊かになるようにできていると信じているようだった。....彼らは、豊かさ意識を持っているので、それに引き寄せられるようにお金が集まるのだ。

f:id:wimper_1996:20210109073549j:plain:h350
付箋の量で今年1位の本です。

もうひとつ、今年響いた言葉を残します。

Work harder on yourself than you do on your job. If you work hard on your job, you can make a living. If you work hard on yourself, you can make a fortune. - Jim Rohn



おかしいな。新年の目標を描くつもりが、ただの振り返りになった。まあいいか。

2020年、お疲れ様でした。

ブログ書いたら地味に感想言ってくれる人とか、本お勧めしてくれる方とかいて、素直に嬉しいです。

全部読むので映画本漫画、どしどしお勧め教えてくだいまし。


今年もどうぞよろしくお願いします🤲

アーティストの生き方

って結構憧れませんか。私だけですか。

イラストレータや漫画家、歌手とかそういう、

自分にしか表現できない夢中にできるものを持っていて、観ている人に直接的に感動を与えられる人。

wimper-1996.hatenablog.com



私はRADWIMPSが好きなのだが、初めて「最大公約数」を聞いた時は鳥肌が立った。


何を求めるでもなく 無理に意味を添えるでもなく つまりは探しにゆこう 二人の最大公約数を


「自分と相手との最大公約数」なんて、どうやったらそんな天才的な発想生まれるねん。


アーティストとは、歌や絵を創り出す才能やスキルが必要不可欠な、特別な存在だと思っていた。



それが最近、この本のおかげで少し見方が変わった。



f:id:wimper_1996:20201216224403p:plain

amzn.to



中高生向けに優しく書かれていそうだし、

要は「各々の自由な視点で美術作品を鑑賞しましょうね」とかそういう俗っぽいことを強調するだけでしょうかね、

と全然期待せずに読んだ。






が、気持ちいいくらいに完璧に裏切られた。

本書の概要をざっくりいうと

アート思考とは何で、どうやるのか


についてを、伝統的な西洋美術史に大きく影響を及ぼした6つの20世紀の現代アート作品を取り上げ講義形式で解説されている。


本書に取り上げられている作品はどれも超有名な作品ばかりだから、読んでいて眠くなるような細かい美術のウンチクはなく、「13歳からの」と謳っているように非常に読みやすい。

むしろ20世紀の現代アートに至るまでの歴史は、科学技術や社会情勢の変化と密接に絡んでいて目から鱗な話ばかりだった。

例えば、「上手な絵とは?」と言えば、大体の人はこのようなリアルな絵を思い浮かべる

f:id:wimper_1996:20201216225247p:plain
フェルメール真珠の耳飾りの少女」(1665 ~ 1666)


要は、実物を出来るだけ見えるままに再現した「写実的な絵」だ。

遠近法を多用したルネサンス期を代表する初期の西洋美術は、非常に描写が細やかで立体感・奥行きまで正確に表現されている。

しかし、19世紀に「あるもの」が普及したことにより、アーティスト達は自身の存在意義を問われ、「アートとは何か?」という「探究の根」を伸ばし始める。

そして、本書で取り上げられる現代アート作品をはじめとして、これまで美術という殻を破るような作品がどんどん編み出されていく。


  • 20世紀を代表するアーティストがどのように思考し「探究の根」を張り巡らせ、本書で紹介される作品という「花」を編み出したのか。
  • パブロ・ピカソの作品はこれまでとどう違うのか?
  • 一度は目にしたことがあるようなアメリカン・ポップアートはこれまでの美術の常識をどう覆したのか?


f:id:wimper_1996:20201216110230p:plain:w300
パブロ・ピカソアヴィニョンの娼婦たち」(1907)


f:id:wimper_1996:20201216110846p:plain
アンディ・ウォーホルマリリン・モンロー」(1962)


このような話は美術に触れる学生にとって足算するくらい当然の知識なのだが、それ以外の専攻の人はほとんど知らないのではないだろうか*1


この本を読んで、アートそのものに関する技術以上に、学んだことがある。

それは、アート思考を通じて

誰もがアーティストになれる



ということだ。



「アーティスト」は、目に見える作品を生み出す過程で、以下の3つのことをしています。
1. 自分だけのものの見方で世界を見つめ、
2. 「自分なりの答え」を生み出し
3. それによって「新たな問い」を生み出す


「アート思考」は、こうした思考プロセスそのもののことであり、


ビジネスだろうと学問だろうと人生だろうと、『自分なりの考え』を持つために必要な思考

であるということ。



絵を上手に書いたり、美しい造形物を作る人が、アーティストではない*2

正解を追い求めるのではなく、「自分なりの視点」で探究し、「自分なりの答え」を表現する人が、アーティストである。


それは例えば、

ユーザーが見やすいサイトを作ろうとするWebデザイナーや、

何か新しいアプリケーションやプロダクトを作る開発者はもちろんのこと、

  • 新しいビジネスを創り出す
  • 新規企画案を考える
  • 自分の考えをSNSで発信する

ことをしている人も、「自分なりのものの見方」という「表現の花」を咲かせているアーティストなのだということ。






「いや違うだろ、『アーティスト』なんてカッコつけたこと言ってんじゃねえ」「じゃあこのブログ書いてるお前はアーティストかいな」と思われた方。


分かる。私は自分がアーティストだなんて言えん。



「アーティストと呼べるかどうか」は本質的ではなくて、

「アーティストっぽく考える(=アート思考)」ことができるかどうかが重要なのです。

というわけで、決意したこと。


  • 社会人になって、目の前のタスク、言われることをただこなすだけにならない。
  • ブログや日記などを通じて定期的に「考え」「表現する」



もし共感してくれて実際に本読んでくれたら嬉しいです! 感想をこっそり寄せてくれたらもっと喜ぶ。


ここまで読んでくださりありがとうございました〜

*1:もちろん、私もこの本を読んで初めて知った。

*2:アンディ・ウォーホルマリリン・モンロー」なんかは、見ての通りオリジナルではない

Dockerfile が書けない人のための環境構築方法

もう環境構築で悩まされたくない!そう願ってデータ分析においても Docker を使って環境構築する人が多くなってきたのではないでしょうか。

amalog.hateblo.jp

ただ、

  • Kaggle のイメージは重すぎ

  • 必要最低限のパッケージが入った自分の研究用の環境を構築したい

こう思う人も多いはず。
一方で Docker 初心者にとっては

Dockerfile の書き方がわからん。

という問題があります。(私だけ?)

どうするか色々悩んで調べて、「Poetry と Docker を組み合わせる」という方法に行き着きました。 環境構築にあたり、以下の記事を大いに参考にさせていただきました。

qiita.com

イメージはこんな感じで、Poetry で自分の好きなパッケージをインストールし、作ったオリジナル環境 (virtualenv)を、Docker上に構築する。

f:id:wimper_1996:20201014090538p:plain


環境は github にアップロードしています。

github.com


Poetry とは

python-poetry.org

日本語訳もあります

Poetry とは、Python のパッケージ管理ツールのことで、Python で何か新しいパッケージをインストールする際、既にある環境に合わせて最適なバージョンのものを勝手にインストールしてくれる*1大変ありがたいやつです。

Python のパッケージ管理ツールとしてはこれまで Pipenv が有力でしたが、lock ファイルの構築が遅かったりするらしく新鋭の Poetry を雄す記事も見かけるようになりました。

ここでは Poetry を使っていますが、Pipfile を使ってもほぼ同様に環境構築ができるはず。

簡単な使い方

コマンドリストはシンプルでわかりやすいので、見てみることをお勧めします。

基本

  • pip install の代わりに poetry add
  • pip uninstall の代わりに poetry remove

最初このようにいくつかパッケージのバージョンを指定するとする

$ poetry add sklearn=="0.23.1"

後はバージョンを指定しなくても勝手に依存関係を踏まえた最適なバージョンを入れてくれる

$ poetry add pandas

f:id:wimper_1996:20201014002938p:plain:w500

パッケージをインストールする際の依存関係は lock ファイル(poetry.lock)に記録される。

gitなどで pyprojeck.tomlpoetry.lock が共有されていれば、そのディレクトリをそのまま自分の手元へクローン(コピー)し、以下のコマンドを実行すれば、その環境がそのままインストールされる。

$ poetry install

この環境を Docker 上で行うというわけだ。

Docker を用いた環境構築方法

  1. Poetry が入ったまっさらなコンテナを構築する
  2. コンテナ内のターミナルに入り、好きなパッケージをインストールする
  3. 保存し、コンテナ環境をアップデートする

Dockerfile はこのように、最もシンプルな python:3.7-slim のイメージを元に作成されています。

FROM python:3.7-slim

ENV PYTHONUNBUFFERED=1

WORKDIR /workspace

COPY poetry.lock pyproject.toml ./

    # Git のインストール
RUN apt-get update && apt-get -y install git

    # poetry のインストール
RUN pip install poetry

# Poetry で導入したパッケージ(pyproject.toml)を全てインストール
RUN poetry config virtualenvs.create false \
  && poetry install

RUN pip install jupyter_contrib_nbextensions && \
    jupyter contrib nbextension install --user && \
    jupyter nbextension enable highlight_selected_word/main &&\
    jupyter nbextension enable hinterland/hinterland && \
    jupyter nbextension enable toc2/main

コメントアウトにて書いてあるまんまですが、

COPY poetry.lock pyproject.toml ./

にて環境構築に必要な2つのファイルを Docker 環境にマウントし、

RUN pip install poetry

にて poetry を Docker にインストールします。


RUN poetry config virtualenvs.create false \
  && poetry install

Poetry は自動で virtualenv を作成し、そこに環境を構築してくれますが Docker内に仮想環境を作ってもしょうがないので virtualenv 作成を false とします。
そして、RUN poetry install により pyproject.toml に既に記載のパッケージをインストールするよう、Docker に命令させます。


というわけで、実際に環境構築。


1. Poetry が入ったまっさらなコンテナを構築する

ディレクトリ内にて、以下コマンドより イメージのビルド → コンテナの起動

$ docker-compose up build


f:id:wimper_1996:20201014093812p:plain


一番最初の段階では、 poetry に何も書かれていないので何もインストールされないです。
と言いたいところですが、poetry には先に Scikit-learn (バージョン管理の説明の便宜上)と、JupyterNotebook 使用を想定して Jupyter 環境と、必須な拡張機能をいくつかインストールしています。

[tool.poetry.dependencies]
python = "^3.7"
scikit-learn = "0.23.1"

[tool.poetry.dev-dependencies]
autopep8 = "^1.5.2"
jupyter = "^1.0.0"
jupyter-nbextensions-configurator = "^0.4.1"
jupyter-contrib-nbextensions = "^0.5.1"
jupyterthemes = "^0.20.0"


Dockerfile の以下の部分で、拡張機能を有効化

RUN pip install jupyter_contrib_nbextensions && \
    jupyter contrib nbextension install --user && \
    jupyter nbextension enable highlight_selected_word/main &&\
    jupyter nbextension enable hinterland/hinterland && \
    jupyter nbextension enable toc2/main


入れている拡張機能

  • 入力補完
  • 変数のハイライト機能
  • 目次

拡張機能について詳しくはこちらの記事

Jupyter 知っておくと少し便利なTIPS集 - Qiita

コンテナが立ち上がると同時に、Jupyter Notebook ブラウザが起動するので https:// から始まる部分を丸ごとコピーしてブラウザに貼り付ければ JupyterNotebook にアクセスできます。


2. コンテナ内のターミナルに入り、好きなパッケージをインストールする

コンテナ内のシェル(bash)に入るためのコマンドは
docker exec -it [CONTAINER ID または CONTAINER NAME] /bin/bash

docker-compose.yaml にて コンテナ名を指定しています

services:
  app:
    container_name: "poetry-example"

JupyterNotebook が起動しているターミナルとは別に、新しいターミナル(タブ)を開いて、以下を打つ

$ docker exec -it poetry-example /bin/bash
root@2c8334962160:/workspace#


念のため、CONTAINER NAME または CONTAINER ID を確認するには以下のコマンド

# CONTAINER ID を確認
$ docker container ls
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                    NAMES
aac318175543        poetry_example_app   "jupyter notebook --…"   3 minutes ago       Up 3 minutes        0.0.0.0:8881->8881/tcp   poetry-example


今 Poetry にインストールされているパッケージを以下のコマンドで確認できます

$ poetry show


f:id:wimper_1996:20201014095858p:plain


新しいパッケージをインストール

$ poetry add numpy pandas


f:id:wimper_1996:20201014100331p:plain:w400

ここで pyproject.toml を見てみると、最初はなかった pandas と numpy がバージョン指定された状態で上書きされていることがわかります。

[tool.poetry.dependencies]
python = "^3.7"
scikit-learn = "0.23.1"
numpy = "^1.19.2"
pandas = "^1.1.3"

あとは自分の好きなパッケージを入れていけば、好きな環境ができあがります。


3. 保存し、コンテナ環境をアップデートする

poetry.toml を保存し、ターミナルを Control + C で一旦コンテナを停止させます。
そして再び

$docker-compose up --build

を実行しましょう。そうすることで、Dockerfile の poetry install が実行され、先ほど追加したパッケージが反映された新しいPoetry 環境ができあがることになります。

インストールに失敗した場合

ここで、たまにパッケージインストールに失敗することがあります。

そんな時は、インストールに必要な linux のソフトウェアが足りないと言われていることが多いです。 f:id:wimper_1996:20201014100852p:plain
ここでは、

error: command 'gcc' failed with exit status 1

つまり gcc というコマンドが足りないと言われているので、ネットで 「error: command 'gcc' failed with exit status 1」と検索しましょう。そしたら必ず、誰かがコマンドを教えてくれています。


今回の場合だと例えば Dockerfile に

RUN apt-get -y install gcc python3-dev python3-pip libxml2-dev libxslt1-dev zlib1g-dev g++

と書いて保存 → もう一度イメージのビルドからコンテナを起動し直す → poetry add
というステップを踏みましょう


(つぶやき)

このようなインストールエラーに遭遇して検索した回答のほとんどが linux ベースの記法(apt-get install)で、pip install とは互換性がない。

Docker を使っていて個人的にありがたいと思うのは、Docker 環境そのものは Linux ベースなのでこのコマンドをそのまま Dockerfile にコピペできること。

最後に

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

Docker でデータ分析を行う方々の参考になれれば嬉しいです。

*1:カッコよく言えば、依存関係を解決してくれる

データフレーム全体のデータ型をastypeで一括変換したかった

が、全然されない。なんでや!!となったのでメモ。

状況

数値データを前処理して、ある特定の列に含まれる文字を置換 → 型を object から int (あるいは float) に変更したい

その後列同士を引き算して特徴量を作りたかったが TypeError、文字列は置換して数値データにしたハズなのになんで??? めっちゃ詰まった。

# d 列だけ型が違う
print(df.dtypes)
# a    int64
# b    int64
# c    int64
# d    object

# 前処理して変換(したつもり)
df = df.replace({'7..4': 74, '10未満': 10}).astype('int64')
# 新しい特徴量を作成したかった
df['d-a'] = df['d'] - df['a']

# TypeError: Cannot compare types 'ndarray(dtype=int64)' and 'str'

原因

replace メソッドではデータフレーム全体に対して特定の要素を複数置換させることができるが、astype メソッドは、全ての列の型が一致していること が必要。特定の列だけ型が違っていた場合、全体変換することができない。

(例)

OK な例

print(df.dtypes)
# a    int64
# b    int64
# c    int64
# d    int64

df_f = df.astype('float64')
print(df_f.dtypes)
# a    float64
# b    float64
# c    float64
# d    float64

NG な例

print(df.dtypes)
# a    int64
# b    int64
# c    int64
# d    object

df_f = df.astype('float64')
print(df_f.dtypes)
# a    int64
# b    int64
# c    int64
# d    object

解決策

前処理で値を変換した後、

  1. データフレーム全体で変換する場合列を指定する
  2. 列個別に astype で変換する (元のデータフレームを変更)
# 1
df_icol = df.astype({'d': 'int64'})
# 2
df['d'] = df['d'].astype('int64')

結論:データフレーム全体を操作するときは注意

普通、データフレームに対する処理は列ごとにする。なぜなら特徴量が列ごとにあることが多いから。

今回なんでデータフレーム全体を処理したいかと言うと、ワイドフォーマット形式のパネルデータを扱っていたから。

  • パネルデータとは:複数の個体が複数時点に渡って観測されているデータ。(例) 2013-2015年の大学の学部別志願者数・受験者数
  • 時系列データとは:一つの個体が複数時点に渡って観察されているデータ。(例) 株価
  • ワイドフォーマットは、時点がカラム、行が1サンプルになっている横並びデータのこと。

具体的に自分が扱っていたデータは、下図のように、一定期間ごとに観測された患者の検査値データがあって、検査の種類ごとにデータが分かれていた。

f:id:wimper_1996:20200916115734p:plain

データの型は1つのデータフレームの中で統一のものだったので、一気に型変換や値の抽出を行いたかったのだ。

上で遭遇したエラー以外にも、例えばデータフレーム全体に条件式を適用させようとしても、想定通りにならないことがある。

(例) BMI 値が外れ値となっている患者(行)を抽出したい。

通常、列に条件式を適用させれば抽出することができる。

#  '2008-10' に BMI 値が45以上の人を抽出
df[df['2008-10'] > 45]

f:id:wimper_1996:20200916120534p:plain
条件に合う行が抽出される

# データ全体に条件式を適用させようとする
df[df > 45]

f:id:wimper_1996:20200916120629p:plain
抽出されない

ただこのサイト では、要素で抽出できる例があった。

どうなんだろう、、、 結局自分は、カラムごとに for 文を回して、条件に合うインデックスを検索して抽出する方法を取った。

内容が間違っていたら、指摘いただけると嬉しいです。

参考: https://note.nkmk.me/python-pandas-dtype-astype/

内定者インターンで学んだこと

もう 2 週間前のことで若干今更感ですが、先月丸々 1 ヶ月 (7/1 ~ 7/31)、このご時世に、就職先企業へ内定者インターンに行かせていただきました。

インターンは元々心待ちにしていましたが、それはもう期待以上のものだったので、久々にブログへ。

何が期待以上だったかって、業務内容以上に、仕事の意義とかやりがいとかそこらへんについて、私の思っていた「やりがい=仕事内容」以上のものが見えた (きがした) からです*1

そもそもの経緯

私の就職先である某外資IT企業 (A 社とする) では、入社前に全員、配属先の中のチームの一つに 1 ヶ月内定者インターンをするというユニークな制度がある。


インターンの配属先は、選考時の面接官であったマネージャーのチームとなることが多い。そしてインターン後、人事の方に感想と配属希望をフィードバックし、それとマネージャーとの意見も踏まえ、最終的な入社後の配属先が決まる。

この制度は本当に有り難い。

もちろん、配属先のチームや仕事内容が自分に合っているか事前に見極めることができることは大きい。合わなかったら人事に希望が言える。

ただ私は最近、特に就職先を 5 月に決めて以降、

サポートエンジニアという、来年からは今の研究分野とはまた異なる世界に踏み入れることになり

正直、残りの大学院生活や研究に対するモチベーションがかなり薄れていた。

wimper-1996.hatenablog.com


意気揚々とこんな目標を掲げてみたけどところがどうだ、上半期が過ぎた今、統計検定を受けるモチベーションはほぼ無くなってしまった。

ソフトウエアエンジニアとしても就職しない。


サポートエンジニアになって、自分は人生でどんなことを達成できるんだろう

こんな漠然とした不安というか劣等感というかなんかモヤモヤしたものを抱えていた。


そんな私のインターンの密かな目標は以下の 3 つ。

  1. 徹底的にサポート技術に向き合う。そして、サポートエンジニアという仕事のやりがいを知ること。それを踏まえて残りの学生時代の過ごし方を改めて考えること。

  2. 尊敬できる人はいるか*2。そして、メンターさんを見つけること*3

  3. 色々な社員さんに積極的に話を聞き、コネクションを作り、自分の入社後のキャリアを思い描くこと。


結果どうだったか

率直に言って、

予想以上に充実していた



それはもう怒涛の 1 ヶ月で、光の如く過ぎ去っていった。

リモート:出社 = 2 : 1 くらいの割合だったが、それでも毎日出社とほぼ変わらないくらいの活動をさせてもらえ、上に掲げた目標は全て達成できたと自負できる。

目標の振り返りはここでは置いといて、主に1と2に関連して、学んだことを。

※ 断りとして、この感想はあくまで私が配属された1つのチームに関してのものであり、チームそれぞれのカルチャーや業務内容は異なると思います。

サポート業務は、想像以上に奥深いかも


サポート業務 = お問い合わせ対応


と一言でまとめるのは全くもって的外れだった。

私は「Azure Active Directory」という、組織メンバーのID管理を担うサービスのサポート担当だったが、

扱うサービスの大枠は1つと言えど、そもそも「技術の最後の要」ということもあり、ググったら出てくるような簡単な問題は多くない。検証環境を構築して問題を検証したりログを解析することが基本だ。

その上で、関連する技術は

  • 認証システム
  • ネットワーク通信
  • オンプレミスとクラウド
  • Azure を用いた仮想環境

など、多岐に渡り、それぞれ深い理解を要する。

ただこのようなエンジニアリングスキルだけでなくて、

  • お客様の問題やニーズの把握能力
  • 最適解を最速で出す能力
  • タスク管理能力
  • 文章力
  • わかりやすく伝える力
  • 英語力

など、コンサルティング会社でも十分通ずるようなビジネススキルをも求められるのだ。


サポート歴 20 年のマネージャーさんが言ってくれた言葉は胸に刺さっている。

巷では開発職が偉いだの思われているかもしれないが、サポートエンジニアはソフトウエアエンジニアも見ないようなプロダクトコードを確認することもあるし、非常にクリエイティビティな仕事だと思っている。誇りを持って欲しい。


私、そして、世間が思っている以上に「サポート業務」は可能性のある仕事なのかもしれない。

「人 ⇆ 仕事のやりがい」 かも


上で述べたサポート業務のやりがいはもちろんだが、こっちの方が自分的には発見。

「共に働く人が(技術的にも人間的にも)尊敬できる」と「仕事のやりがい」は、互いに影響するのでは?ということ。

ここでいう私にとっての「尊敬できる人」とは

  • 技術力が高いこと。しかし、それをひけらかすことなく、他者に貢献することを厭わないこと
  • 評価される、されない に関係なく行動できる人
  • 愚痴を言わず、大変なときこそユーモアや周りへの気遣いを忘れない人

私の本当に勝手な認識だが、配属されたチームの人はほぼこんな人達で、正直びっくりしてしまった。

みんな、絶対忙しいのに、チームの誰かしらを日々サポートしているのだ。


チームの抱えるお問い合わせ件数は、クラウド利用数の増加に伴い、毎月のように過去最大を更新しており、1人1日何件もの問題を解決している。

(私は最終的にはお問い合わせ対応をやらせてもらったが、まだ一日1件が限界だと思った。中には10件以上対応する人もいるから信じられない。)



そんな日々で、毎日仕事へのモチベーションを保つのは、正直少し大変なことではないかと思うのだ。


でもチームの中には

教え教えられることで共に成長しよう


というカルチャーが根付いていた。


自分みたいな凡人インターン生の基本的な質問にも、自分の業務の合間ですぐに Teams で返事をしてくれる。

私だけじゃなくみんなに対してそうだ。もはや仏の領域 (真顔)。


そんなことを各メンバーがされたら

「このチームのために頑張ろう!!」とか、

「お世話になったこの人のために頑張ろう!!」とか、

「 この人のように成長したい!」とか

たとえ仕事が大変でも、そんな気持ちに自然となりそうなのだ (実際私はなった)。


そしてそれが、自分の仕事、働くことのやりがいに繋がるのではないか。




人と環境が良いということは、質が高く充実した仕事ができているということ。他人に貢献しようとか、業務以外にも楽しい企画をしようとか、そんな空気ができていること。


また逆に質が高く充実した仕事ができているということは、気持ちに余裕ができ、楽しいことをしようとか人に貢献しようとかそういう気持ちが生まれやすいということ。



自分の例は極端かもしれないが、

もし、就職先を検討する際、自分のやりたいことと仕事内容が食い違うとか、複数の企業で悩んだとき


  • そこで働く人達は自分にとって尊敬できる人か?


そんな観点で見直してみることは意外とありかもしれない。

人は、その仕事のやりがいと環境が産んだ産物だから。



f:id:wimper_1996:20200814191522j:plain
インターン最終日にまさかのプレゼント

*1:たかが 1 ヶ月のインターンでのことなので、もちろん入社してからまた価値観変わる可能性大あり

*2:そりゃ技術的に優れている人は本当にたっくさんいるだろうが、人間的にもという意味で

*3:実はメンターメンティー制度なるものがあり、下っ端でも、メンターになってもらえるよう社員さんにお願いできる。そして、その期限はなし