nikkie-ftnextの日記

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

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

はじめに

だんないよ、nikkieです。
この週末はRettyさんの「Pythonもくもく自習室」に参加してきました。
 

もくもく会の概要

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

この勉強会について

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

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

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

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

2017年12月から毎月通っています。
おいしいご飯の場で色々教えていただけて助かっています。
今回は参加率が高く大盛況でした!

 

取り組んだこと

レコメンドシステムで使われる協調フィルタリングを実装してみました。
(人に説明できるまで理解するというのが目標でした)

協調フィルタリングアルゴリズムについて参考にしたスライド:

www.slideshare.net

勉強会の成果notebook
2018/03/10 Pythonもくもく自習室 #8 @ Rettyオフィス 成果発表:ユーザベースの協調フィルタリングの例を実装 · GitHub

 

実装に取り組んでの感想

numpyを使って実装するのははじめてでしたが、
ユークリッド距離は差を取ってlinalg.normで出せたのでロジック部分に集中できました。

スライドどおりのスコアにならなかったんですが、
スライドはあくまで説明のためのスコアということなんですね。

 

使ったスライドは評価が欠損した場合の処理が書いてあって、
実装する側にとってはわかりやすかったです。
ただ、評価の欠損がある(ユーザAのアイテム4への評価)ために、
似ているユーザが高く評価しているアイテムより
似ていないユーザが評価しているアイテム(=似ているユーザは未評価のアイテム)が
レコメンドされるという結果です。
「ユーザベース協調フィルタリングは似たユーザの評価で推測する」と説明するときに
違和感があるので、この欠損は埋めて説明するのがよさそうですね。
(欠損した評価を埋めると、似ているユーザの評価に一致することを確かめた)

 

もくもく会後に情報収集したところ以下のリポジトリを見つけました。

github.com

 

『情報推薦システム入門』という本には

ユーザ間の類似度には「ピアソンの相関係数
アイテム間の類似度には「調整コサイン類似度」

と書かれていました。(p.15, 19)
どちらの指標も評価の平均との差を考えているので、
高い評価しがちな人と低い評価しがちな人の評価が可能になっているそうです。

 

もくもく会感想

1月にLTした「Pillowでモザイクアート」のソースを使っている方がいらっしゃいました!

GitHub - ftnext/mosaic-art-python

400×400のサイズの画像にしか対応していなくて大変申し訳ございません。。。
自分のコードがほかの人の作りたいものを実現する一助になっていると知ることができ、
不完全な形でもアウトプットしてよかったと感無量です。
もっと使いやすくできるよう手を入れていきたいですね。
(numpyのlinalg.normは知っていれば色の「距離」の算出に使えましたし、
 2つの画像を比較する際に、コサイン類似度やピアソンの相関係数を使うこともできるのかなと妄想しています。。)

 

KaggleのRecruit RestaurantコンペのKernelを確認されている方がいらっしゃいました。
私も「探索的データ解析」(前処理でデータを可視化してどんな傾向があるか掴むこと)には不安があるので、その方と似た問題意識があります。
以下のKernelだと思うので、時間を取って見てみようと思います。

Surprise Me | Kaggle

 

自然言語処理でもくもくされている方が多かった印象です。
アニメネタで色々できそうな分野なので、業務とかモザイクアートとか調整して手を出したいところです。
トピックモデルの備忘録的リンク:

LDA for Pokemon analysis | haripo.com

 

運営者ならびに参加者の皆さま、今回も1日ありがとうございました!

 

イベントレポート | みんなのPython勉強会#33 前編 #stapy

はじめに

だんないよ、nikkieです。
「みんなのPython勉強会#33」のイベントレポートを2回に分けて送ります。(体力的な事情があります。。)
今回は個人的にありがたかった発表をピックアップします。

 

勉強会の概要

#33のテーマは
Python Fundamentals(Pythonの基礎体力)
基礎体力がテーマだったためか、前回より参加者が多かった感があります。
 
今回紹介するのはこちらの発表:

「入門書を読み終わったらなにしよう? 〜Python と WebAPI の使い方から学ぶ次の一歩〜」
岩崎 圭 (@laughk, 株式会社SQUEEZE)

今やプログラミング入門書の種類は豊富で、その気さえあれば誰でも手軽にプログラミングの学習を始めることができます。
しかしながら「入門書を読んでみたけれど、自分で何ができるのか今ひとつわからない」「じゃあ何をしよう?がうまく見つからない」なんてことはありませんか?
今回は WebAPI を扱うことを例に、プログラミングの入門書を読んだ次の1歩を踏み出すための課題の見つけ方と手の動かし方を紹介します。

 

入門書を読み終わったらなにしよう?

入門書の次のステップとして「自分にとって実践的なコードを書く」というアプローチを紹介。
  • 普段自分がやっていることをネタにする
  • 登場人物の整理:誰に何をやってもらうかを書かないとコードは書けない
  • PyPIにある便利なものに頼る
  • コードを書き始めたら、コードの見た目にはこだわらずに、やりたいことをとにかく実現させる

普段自分がやっていることをネタにする

よく使うWebサービスがあるとネタにしやすい(起こることがイメージしやすいため)
今回はGitHubのプルリク一覧をSlackに通知してみる

登場人物の整理

第1段階:GitHub & Slack

WebサービスPythonでどう使うか→ Web API
(注)入門書でよく扱われているスクレイピングAPIがないときの最終手段

第2段階:GitHub API & Slack API

PyPIにある便利なものに頼る

PyPIAPI用のサードパーティライブラリが公開されていることが多いのでチェックする

登場人物 第3段階:PyGitHub & slackpy

ライブラリの使い方はドキュメントを確認する。ただし隅々まで読む必要はない。
触りを読んだら雑に動かしてみる。対話画面でガチャガチャいじる感じ
さらに細かな部分はドキュメントを読む。試すとドキュメント読むの組合せ

ここまで来てようやくやりたいことの概略が整理される。

  1. PyGitHubでプルリク情報取得
  2. 取得したプルリク情報整形
  3. 整形データをSlackへ(slackpy)

トライ&エラーでひたすらコードを書く
インタラクティブシェルで小さく小さくトライ&エラー 小さく理解していく
こまめにprintで変数の値確認

コードを書き始めたら

「きれいに書け」「テストコード書け」は最初のステップでは置いておく。
とにかく書いてみるを大切にする。

 

感想

  • 「作りたいものを作るんだ!」と趣味でPythonを触っているので非常に参考になりました。
    週末の#rettypyでスライドの内容を追いかけてみてもいいかも。
  • 登場人物を整理するという話、開発する中で取り入れたいです。
    何か作ろうと思ったらすぐググってライブラリを探していましたが、
    大元の使いたいものはWeb APIですもんね。ライブラリはそれをラップしているに過ぎない
  • ドキュメントの使い方(全部読まない。必要なところだけつまんで、手を動かす)というのは実感にあった感じです。
  • 入門書の次のステップできれいに書くことやテストコードは置いておくという話でしたが、
    そのあたりが気になる私は中級者へ向かっているのかなと思います。
  • PyPIでライブラリが見つからないときは、GitHubを検索するといいらしい。
    (Issueに試行錯誤の跡があったり何かしら見つかるとのこと)
    →モザイクアートも探してみよう
  • Pythonデバッグするには:import pdb

    あとで読む PythonデバッグTips - Qiita

 

懇親会 & LT 

印象的だったのは「アウトプットしよう!」というLTと「PyTorch」のLT。
PyTorchはディープラーニングフレームワークの中ではチュートリアルが充実しているそうです。

参加者の方とも色々お話しでき、懇親会は楽しかったです。
1月のモザイクアートLTで記憶ありますと声かけてくださる方もいらっしゃいました。
アウトプットさまさまですし、お声がけいただけるのは本当にありがたいです。

今回の勉強会関係者と出席者の皆さま、貴重なお話とそれを聞く機会をありがとうございました。

(後編は近日中にあげます)

 

イベントレポート | 実務で使う自然言語処理をする #サポーターズCoLab

はじめに

だんないよ、nikkieです。
「実務で使う自然言語処理をする」のイベントレポートをお送りします。

 

勉強会の概要

【サポーターズCoLab勉強会】実務で使う自然言語処理をする - サポーターズCoLab

イベント概要

今回のテーマは「実務で使う自然言語処理をする」。

(中略)

しかし、「ちょっとお試しでデータを調べてみる」などの用途にはディープラーニングで頑張るよりも、

もっと簡単にできることがあります。

今回は、「実務のための自然言語処理」を掲げて、「まず第一歩」に踏み出す方法を話します。

具体的にはPythonで次のことをします。

  • 形態素分割と単語カウント

  • 文書からキーワード抽出

  • 文書カテゴリ分類

機械学習を案件で使う関係で勉強していますが、
自然言語処理は手薄だったので、全体像をつかみたいという思いで参加しました。
 

まとめ 

実務のための自然言語処理は3ステップと理解しました。

  1. テキストを機械学習に持ち込むために形態素分割で単語にバラす
    (登場頻度を数えるなどする)
  2. 単語の中から、ラベル付けされたテキストに固有なキーワードを抽出する
    (今回は重みスコアを計算してキーワードを抽出)
  3. ラベル付けされていないテキストをカテゴリに分類する

資料はこちらです。

www.slideshare.net

 

ソースコード

GitHub - Kensuke-Mitsuzawa/sample-codes-supporters-tutorial

 
以下トピックごとにメモを元にまとめます。

形態素分割

辞書データと形態素解析モデルからなる。
モデルはMecab、Kuromoji、Juman++がよく使われている。
 触ってみるならMecabらしい
辞書データはIPA辞書、IPA-neologd辞書、Juman辞書がメジャー。
 IPA-neologd辞書にはWebの新語が取り入れられているらしい

 

日本語は単語の間にスペースが入らないので、形態素分割が必要になる。
(思わず「確かに」と言ってしまった)

(そういえば、私は以下のチュートリアルMecab触ってました。)

AIが入ったBotの作り方を学ぼう - Part4 形態素解析と食品データベースで食品とその栄養価を特定する - Qiita

 

キーワード抽出

形態素の集計では意味がない単語(例:する、なる、ある)があるのでキーワード抽出が必要

ラベルの付いたテキストをいくつか持っている前提。(ラベルは2つの想定)
ラベルごとに単語が出てきた回数をカウントし、別のラベルとの間で回数の差分を取る。
 プラスであればラベルに固有であると考える。
 差分が0や負はどこにでも出てくるからラベルにとっては重要ではないと考えられる。

ラベル分けは主観が入ってくる。(主観でやっていくしかない)

 

カテゴリ分類

テキストの内容を考慮してカテゴリに分ける(ニュースが国際、スポーツと分かれる感じ)
今回はキーワードについていた重みスコアを使う(スコアリングベース)
 SVMや深層学習でもできるらしい

利用可能なラベル付きデータは重み付けスコア作成データと評価用データに分ける
(メモ:これは機械学習の考え方)

 

感想 

自然言語処理、意外と簡単じゃんと思えました。
感想ツイート見てアニメごとによく出る単語とか集計したいなとか考えちゃいます。

ソースコードが公開されているので、近日中に手を動かす予定です。
Pythonのコードの書き方としても参考になると期待しています)

参加者の方は自然言語処理に携わるエンジニアが多かったようです。
楽譜をキャプチャして自動で演奏するシステムを作った方がいらっしゃり、印象に残っています。

今回の勉強会関係者と出席者の皆さま、どうもありがとうございました。

イベントレポート | 第25回 Pythonもくもく会 #mokupy

はじめに

マキアかわいい! nikkieです。(さよ朝みた)
今月も #mokupy にお邪魔してきました。

 

勉強会の概要

この勉強会について

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

 
 

取り組んだこと

  • pandas記事にいただいたコメントの動作確認

  • Python機械学習プログラミング』読書メモ

  • モザイクアートのプログラムのバグ修正

溜まった細々としたタスクをこなす時間にしました。

  

(1) pandas記事にいただいたコメントの動作確認

qiita.com

前回の #mokupy の経験を上記のQiita記事にまとめています。
そこにいただいたコメントについて、自分で手を動かして確認しました。

確認結果:
dataframe_max_pranctice_see_advise-20180224.ipynb · GitHub

確認した事項は近日中にQiitaに上げます。

 

(2) 『Python機械学習プログラミング』読書メモ

読書会に行くために5章を読み進めていたのですが、読書会参加は泣く泣く断念。
備忘のために簡単にまとめておきます。
これは課題なのですが、数学的なところの理解が薄いです。

  • 4章に引き続き次元削減:特徴抽出
    (4,5章はこの本の中では前処理手法を扱っている部分)
    ・主成分分析(PCA)
    ・線形判別分析(LDA)
    カーネル主成分分析
  • PCAとLDA
     
    主成分分析
    PCA
    線形判別分析
    LDA
     
    線形変換法
    アルゴリズム 教師なし 教師あり
    見つけ出そうとするもの
    分散がもっとも大きい
    直行成分軸
    クラスの分離を最適化する
    特徴部分空間
    scikit-learn
    PCAクラス
    LinearDiscriminant
    Analysisクラス
  • カーネル主成分分析
  • 線形に分離できないデータを変換し、
    線形分類器に適した新しい低次元の部分空間に射影する
  • 考え方:データ→より高次元の空間に射影する非線形写像→高次元空間でPCA適用
    カーネルトリックを使うことで、高次元空間に写像することなく、
     元の特徴空間において2つの高次元の特徴ベクトルの類似度を計算できる
  • 新しいサンプルを射影するたびに、元のトレーニングデータセットのサンプルと
    新しいサンプルの間の類似度を計算する
    (PCAでは射影行列、LDAでは変換行列だ手に入っているので、
    元のトレーニングセットを新しいサンプルの射影に使うことはないと理解している)
  • scikit-learnのKernelPCAクラス

 

(3) モザイクアートのプログラムのバグ修正

Slackのアイコンでモザイクアートが作れなかった問題、解決しました。

github.com

現状のコードの問題点は安易なコピペを繰り返したこととの認識に至りました。
関数にまとめることを億劫がり、既存の関数やファイルをコピーして
処理ごとに固有の設定値や参照ファイル名を変更して対応してきてしまった。
そのつけを払わなければいけない時期のようです。

今回の修正でも修正に使う関数をコピーしてファイルごとに持たせていましたが、
途中でその関数を修正しなくてはならず、
ファイルごとに持たせるというのが愚かなことと思い知りました。
モジュール化はまだよくわかっていないのですが、
1箇所にまとめたほうが変更に強いということは体験しました。

 

感想

#PyNyumon でLT見ましたと言ってくださった方がいらっしゃり、嬉しかったです。
業務で使う機械学習の勉強で手一杯といった状況なのですが、
もっといいコードを書くための練習としてモザイクアートに取り組んでいきたいですね。

情報収集という面では
Dashというデータ可視化によさそうなライブラリの情報と
DjangoCongressの話が聞けました。

主催の皆さま、出席者の皆さま、どうもありがとうございました。

週末ログ | #pyhack と キカガク脱ブラックボックス講座

はじめに

だんないよ、nikkieです。
この土日は機械学習の基礎固めに使いました。
学んだことを手短にまとめます。

経緯

 

学んだこと

  • 重回帰分析の数学部分

  •  scikit-learn使い方
    (1)modelを宣言
    (2)model.fitでパラメタ調整
    (3)model.scoreで予測精度を確認
    (4)model.predictで予測
  • モデルの構築に入る前にデータを確認すべき
    (i) 分布の確認:seabornでdistplot
    (ii) 相関関係の確認:seabornでpairplot
      モデルの予測精度がなかなか上がらないのでデータを見たら、
      説明変数が使いにくい分布だった、ないしは
      説明変数と目的変数の間に相関がなかったというのは冷や汗モノすぎる。。
  • train_test_splitで学習用データと性能評価用データに分けるとき
    random_stateパラメタを固定して、ランダムだが毎回同じように分ける。
    =再現性を確保する
  • テストデータはテストのときにしか使わない。
    学習用データのスケーリングには学習用データの平均と標準偏差を使った。

 

所感

@terapyonさんと@NaoY_pyさんに
キカガク講座をおすすめしていただいたのが大きかった。
本当にありがとうございました!


Python使いが集まる #pyhack の環境はすごく学びがあると実感。
継続して参加して、Pythonで食べていけるように力をつけたいです。

イベントレポート | Azureもくもく会@新宿 No.16 #あずもく新宿

はじめに

だんないよ、nikkieです。
Azureについてのもくもく会に参加し、業務で必要になりそうなところを予習してきました。
手短にまとめます。(翌日につなげるためのメモ書きという感じになりそうです)

勉強会の概要

Azureもくもく会@新宿 No.16 - connpass

Azureもくもく会@新宿ってなに?

  • みんなで集まって、Microsoft Azureに関する作業をする会です。
  • 新しい機能を試したり周りと相談したりしてAzureを楽しみましょう。

Cognitive ServicesやAzure Machine Learningを利用した開発でAzureを触ることが多いです。
インフラまわりは情報が追いきれていない身にとっては
こういった場で作業することでインプットができるのでありがたいです。

やったこと

  1. Azure Machine Learningでデプロイした学習済みモデル(API)をPythonでコールする
  2. デプロイした学習済みモデルの再学習のやり方を調査

 

デプロイした学習済みモデルをPythonでコール

学習済みモデルのデプロイのイメージはこちらを参照ください。

qiita.com

DEPLOY WEB SERVICEをクリックした後の画面で、
API HELP PAGE→REQUEST/RESPONSEから
APIコールのサンプルコードが参照できます。(C#Python、R)

Python2系のコードをコメントに沿ってPython3系向けに書き直し、エラーを潰していました。
(コメントにurllib2をurllibに置き換えるよう書いてあるのですが、
 文字通り受け取ってはいけませんでした。トラップそこそこあるじゃん。。)

過去にCognitive Servicesを呼び出したコードを参考に書き換え、動くことを確認しました。

Python入門者でもComputer Vision APIを叩くのは怖くない - Qiita

デプロイした学習済みモデルの再学習のやり方を調査

こちらは調査が収束しておらず、だいぶ混乱しています。

参照したドキュメント

わかったこと

  • トレーニング実験と予測実験がある
  • Web サービスとして予測実験をデプロイする
    →再学習のバッチ処理API呼び出しから実行できるらしい

引き続き調査すること(未解決の事項)

  • 実験の下部にSET UP WEB SERVICEが表示されないことがある。
    サンプルをコピーしたときや一からモデルを作るときは表示されるが、
    実験をコピーしたときは表示されない(DEPLOY WEB SERVICEとなっている)
  • SET UP WEB SERVICEからRetraining Web Serviceを選択した場合と
    Predictive Web Serviceを選択した場合の違いがあやふや
  • ドキュメントの記述と噛み合わないように感じるのは無料枠だから?
    (ドキュメント中のスクショから判断すると、
     無料枠でのデプロイがClassicにあたるらしい)


以上です。運営者、参加者の皆様、どうもありがとうございました。
Azureの知見を広めるため、継続して参加していこうと思います。

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

はじめに

だんないよ、nikkieです。
今回はもくもく会で取り組んだことを記事にしてみます。

もくもく会の概要

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

この勉強会について

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

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

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

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

 2017年12月からもくもく会に行って趣味でPythonを書いています。
#rettypyはちょくちょくお邪魔しています。
作業スペースが広くておしゃれで快適です。

取り組んだこと

今回は「Pillowでモザイクアート」のプログラムのアップデートに取り組みました。

  1. モザイクアートの前処理のプログラムをクラスを使って書き直し
  2. Slackのアイコンでモザイクアートが作れなかった件の原因調査

成果発表に使ったnotebookはこちらです。
http://nbviewer.jupyter.org/gist/ftnext/4915f414e967ce991d42a277617490a7

 

モザイクアートの前処理のプログラムをクラスを使って書き直し

モザイクアートを作る前に、素材に使う画像を代表する色を計算しておきます。
代表する色は平均値、中央値、最頻値に対応しています。

読みやすいコードよりも機能追加を優先した結果、
平均値で前処理をするプログラム、中央値で前処理をするプログラム、
平均値で前処理をするプログラムとファイルが分かれています。

平均値で前処理をするプログラムをコピーして数行変えて
中央値で前処理をするプログラムとしたという経緯から、これらのファイルの差分は数行です。

3ファイルに分かれているよりは1ファイルにまとめたほうがかっこいいと思い
クラスを使って書き直してみました。
学生時代や業務でクラスを書いた経験がほとんどないので、
理解を深めたかったというのもあります。

インスタンスメソッドはなんとなくわかる(selfを使ったやつという認識)のですが、
クラスメソッドとスタティックメソッドがだいぶ不安な感じです。

Pythonで、呼び出し方によってメソッドの振る舞いを変える - Qiita

(クラス名.メソッド名でクラスの中で呼び出しているメソッドは
 スタティックメソッドでいいのかな?
 デコレータつけてないけど動いてるのはなんでだ?)
クラスの中のスコープも理解が怪しいです。
手元に参考になりそうな本がなさそうなので、学習教材を探してみます。(PyQもいいかも)

必ずしもクラスを使う必要はなかったかもしれないというアドバイスをいただいたので
今後関数でも共通化してみて比較します。
オブジェクト指向は設計をしっかり考えないと後々苦しむことになるそうです)

オブジェクト指向の勉強を進め、クラスを使うタイミングを見極められるようになりたいですね。

Slackのアイコンでモザイクアートが作れなかった件の原因調査

Python入門者の集いの懇親会でモザイクアートのライブデモをしたとき
Slackのアイコンをモザイクアートにしようとすると
エラーが発生して落ちるという問題がありました。

Slackのロゴでモザイクアートを作成しようとしたところ、IndexErrorが解決できない · Issue #12 · ftnext/mosaic-art-python · GitHub

今回調査したところPillowでopenしたImageのmodeが原因とわかりました。

Pillowでopenしたらピクセルの色はRGBAで扱えると思い込んでいたのですが、
Slackのアイコンはインデックスカラーでした。

インデックスカラー - Wikipedia

そのため、ピクセルの値を取得するとRGBAの4要素のタプルではなく
1つの値(インデックスカラーを指す値)しか取れませんでした。

画像の平均値もインデックスカラーを指す値の平均値になるため、
RGBAの4要素を想定してモザイクアートを作ろうとするプログラムでは
index out of rangeのエラーとなっていました。

convertでRGBAに変換すると、モザイクアートにできることまで調べられたので
今後実装します。(openした後にmodeをチェックしてRGBAでなければconvertする想定)

感想

業務で機械学習をやっているのですが、統計のバックグラウンドがないのが
弱点になるように感じています。
機械学習はやってみてうまく動けばいいという実際的なスタンスなので
 統計の分野ではただし書きが付く平均値代入も抵抗なく使うようです。
 機械学習をやっていると言っても、統計のバックグラウンドの有無で
 話が噛み合わないことがあるんじゃないかと考えています)

可視化手法をまとめられていた方がいらっしゃり、
自分の弱点を補うための一歩目となるような発表でした。
Qiita記事化を楽しみに待っています。

 

経理の業務を楽にしたいということでPythonを勉強されている方がいらっしゃいました。
業務ではExcelファイルで突合せをされるそうです。
私が実装するなら、pandasでExcelファイルを読み込んで突合せの処理を実装するかと思います。
Python歴は浅いですが、浅いなりに他の人のPython学習をサポートできたらなと思います。
もくもく会で助言がいただけてすごくありがたいので、自分も微力でも還元していきたい)

 

今回もありがとうございました。