はやぶさの技術ノート https://cpp-learning.com 理系に役立つ情報 Sun, 04 May 2025 11:42:31 +0000 ja hourly 1 https://wordpress.org/?v=6.8.5 https://cpp-learning.com/wp-content/uploads/2018/07/cropped-halogo-32x32.png はやぶさの技術ノート https://cpp-learning.com 32 32 148340536 CSV編集に役立つVSCodeの拡張機能3選 https://cpp-learning.com/vscode-csv/ https://cpp-learning.com/vscode-csv/#respond Sun, 04 May 2025 11:42:31 +0000 https://cpp-learning.com/?p=8439 こんにちは。Visual Studio Code(以下 VSCode)ヘビーユーザーの”はやぶさ”@Cpp_Learningです。仕事でもプライベートでもVSCodeを愛用しています。

本記事ではCSV編集に役立つVSCodeの拡張機能を紹介します。

Rainbow CSV

CSVの各列の色を強調して表示できる拡張機能。

VSCodeでCSV編集

またVSCode下側にある「Query」をクリックすると「RBQL Console」が表示され、SQLのようなクエリを実行して、任意データ抽出からの別ファイルに保存までが簡単に行えます。例えば、下記のようなクエリを実行します。

SELECT a1,a2,a6 WHERE a6==”rain” & a1 >= “2013-12-30”

この「RBQL」が非常に便利なので、この拡張機能さえあれば、他は何も要らないという人がいるかも。その他の特徴や詳細な使い方については、下記の公式サイトをご確認ください。

Edit CSV

ExcelのようなテーブルUIでcsvファイルを編集できる拡張機能。VSCode右上の「Edit CSV」クリックすると下図の編集画面が表示されます。

VSCodeでCSV編集

一部のセルをサクッと編集したり、列を丸ごと削除する場合に便利です。

Excel Viewer

wijmoを搭載した拡張機能で、VSCode右上の「虫メガネ(Open Preview)」クリックするとプレビュー画面が表示され、Excelのようなフィルタ機能やソート機能が使えます。

VSCodeでCSV編集
はやぶさ
はやぶさ

この拡張機能でデータ全体を俯瞰してから、別の拡張機能やツールを使って、任意データ抽出や不要なデータ削除などをしています

Excel Viewerなので、拡張子が .csv だけでなく .xlsx.xlsm のファイルも扱えます。

まとめ

CSV編集に役立つVSCodeの拡張機能3選を紹介しました。最後に改めて、おすすめの拡張機能3選を列挙しておきます。

VSCodeのおすすめ拡張機能3選

VSCodeは優れたエディタですが、拡張機能を活用することで更に便利になります。

はやぶさ
はやぶさ

好きな拡張機能をインストールして、仕事効率を向上させましょう

https://cpp-learning.com/draw-nn/

https://cpp-learning.com/readme/

]]>
https://cpp-learning.com/vscode-csv/feed/ 0 8439
プライム感謝祭セールを完全攻略!事前準備やお得キャンペーンを徹底解説 https://cpp-learning.com/prime-kansya/ https://cpp-learning.com/prime-kansya/#respond Mon, 09 Oct 2023 22:32:12 +0000 https://cpp-learning.com/?p=8412 アマゾンユーザー必見のイベント「プライム感謝祭」の開催が発表されました!

アマゾンプライム会員限定の大セールです。

プライム会員歴8年の私がプライム感謝祭の攻略方法をまとめました。

  • プライム感謝祭解説
  • 事前準備の方法
  • お得キャンペーン情報

プライム感謝祭とは第二のプライムデー

アマゾンプライムデーで買った商品の箱積み

プライム感謝祭はプライム会員のみ参加できるセールです。

年に1度開催されるプライムデーとキャンペーン内容が似ていて、第二のプライムデーと考えていいです

アマゾンプライム会員の大感謝際の大規模セール、アマゾンプライム会員の年会費のもとが取れてしまうお得な大セールとなっています。

プライム感謝祭の開催期間はいつ?

  • 10/14(土)0:00~
  • 10/15(日)~23:59

2日間の開催です。一部のお得キャンペーンに関してはすでに始まっています。

プライム感謝祭の事前準備

  • プライム会員になる(無料体験でも参加可)
  • ギフト券をチャージする
  • Amazonアプリをインストールする
  • ポイントアップキャンペーンにエントリーする
  • Keepaを導入する

アマゾンプライム会員になる(無料体験でOK)

プライム感謝祭の大セールはプライム会員限定の大セールです。

有料のプライム会員ですが、30日間の無料期間がありプライム感謝祭のときだけ入ってセール終了後に退会しても大丈夫なんです。あらかじめ無料体験に入っておきましょう。

有料のAmazonプライム会員は以下の手厚いサービスを低価格で受けられます。

  • 送料無料
  • お急ぎ便
  • お届け時間指定
  • 本読み放題
  • 音楽聞き放題
  • アニメ・ドラマ見放題など

料金は2つのプランから選べます。

  • 600円/月
  • 5900円/年(月々約490円

年間払いだと、月換算ではカフェのコーヒーより安いです。

30日間無料でお試しできます。無料期間中の解約も可能で、プライムデーのときだけ入って無料体験期間中に退会すれば料金は発生しません。

プライム会員の詳細は「アマゾンプライム会員のメリット・デメリット」の記事でチェックしてくださいね。

ギフト券をチャージする(0.5%還元)

アマゾンで買い物をするなら事前にチャージをしておくとポイントが還元されるのでお得です。少しでもお得に買い物をしたい方はチャージキャンペーンによるポイント還元を狙いましょう。

現金払いでもクレジットカード払いでもOK。

ポイント還元にはキャンペーンへのエントリーが必要ですので注意してください。

アマゾンショッピングアプリをインストール(ポイント還元アップ)

Amazon ショッピングアプリ

Amazon ショッピングアプリ

AMZN Mobile LLC無料posted withアプリーチ

Amazonショッピングアプリは無料ダウンロードなのにポイント還元率がアップキャンペーンの対象です。セール前には必ずインストールしておきましょう。

ほしいものリストに追加しているとタイムセールのときに通知してくれます。

アプリからの決済でポイントアップなので、注意してください。

ポイントアップキャンペーンにエントリー

Amazonプライムデーでは買い物金額に応じてポイント還元キャンペーンを行うのも魅力のひとつ。

アマゾンセール時のキャンペーンには、ログインした状態で「ポイントアップキャンペーンエントリーページ」を開き、エントリーボタンを押します。

10秒もかからないので忘れないうちにポチッとエントリーしておきましょう。

  • Amazonプライム会員
  • Amazonショッピングアプリ

この2点は簡単にできて、併せて2.5%還元です。

Amazonのクレジットカードを作れば最大5.5%還元までいきますが、プライム感謝祭のために作る必要はありません。

価格推移をチェックできる「Keepa」を導入

アマゾンの価格チェックKeepa

アマゾンで販売される商品の価格推移をチェックできるブラウザ拡張機能「Keepa」を入れておけば、高値掴みすることはありません。

アマゾンで販売される商品の価格は変動しやすいです。セール期間中でポイント還元率が高いとはいえ、高値で購入すると損します。

全ての商品が安いわけではありません。セール直前に値上げをして割引で安く見せている悪質な商品に引っかからないようにしっかりと対策を。

>>Amazon価格チェックができるKeepaを導入する

アマゾンプライムデーのお得情報

プライムデー当日以外にも事前に始まっているキャンペーンがあります。ぜひチェックをしてください。

4ヶ月間「無料」で音楽聴き放題

アマゾンプライム会員限定で音楽聴き放題「Amazon Music Unlimited」が4ヶ月間無料になるキャンペーンを実施中です。

1ヶ月無料 → 4ヶ月無料(3,920円分無料)

プライムデーでは通常より無料期間が3ヶ月も長くお得です。音楽好きの方はこの機会にどうぞ。

キャンペーン期間は10/15まで

3ヶ月間「99円」でKindle本が読み放題

キンドルペーパーホワイト

2940円(月額980円×3ヶ月) → 99円

アマゾンプライム会員限定でKindle本の読み放題「Kindle Unlimited」が3ヶ月間が99円になるキャンペーンを実施中です。

感謝祭の終了と同時にキャンペーンも終了するので、感謝祭でKindle端末を購入してから入ろうと考えている方は入り忘れに注意。

 

プライムセールは3種類!目玉は数量限定タイムセール

プライム感謝祭りに参加する前にセールの種類を知っておきましょう。アセールは3種類あります。

  • 特選タイムセール:数量制限なし。あわてず買おう。
  • 数量限定タイムセール:数量制限あり。激安で激戦。
  • レジ割引・まとめ買い割引

特選タイムセールは24時間販売する「本日の特選品」です。タイムセールといいつつも24時間ありますし、商品の数量に制限がないのでゆっくり買うかどうか決めてOKです。

一番の目玉は数量限定タイムセールです。実質プライム会員による争奪戦なるセール会場で、一瞬で売り切れる商品が続出します。1つの商品につき最大8時間終了します。

セールの見落とし防止にウォッチリストを活用しよう

お目当ての商品のタイムセールが気づいたら開始されていたという状況にならないように「ウォッチリスト」を活用しましょう。

商品ページに「ウォッチする」ボタンを押しておくとセール開始前に通知が届きます。

気になる商品は全部ポチッと押しておきましょう。

売り切れでも「キャンセル待ち」で買える可能性あり!

在庫数はカートに入れられた時点で減っていきます。とりあえずみんな気になる商品をポイポイとカートに入れるので在庫数0となるのですが、なかには決済をせずキャンセルする人も出てきます。

キャンセル待ちでも商品が買える可能性は十分にあるので、どうしても欲しい場合はキャンセル待ちを活用しましょう!

逆に自分が気になる商品はとりあえず早くカートに入れることをおすすめします。

事前準備をしっかりしてプライム感謝祭を攻略しよう

プライム感謝祭を攻略するためには事前準備がとっても大切です。

アマゾンプライム会員の感謝際セールなので、アマゾンプライム会員になっておきましょう(無料体験でもOK!

セール当日は画面に張り付いていないといけないので、事前準備をしっかりしておきましょう。

>>プライム会員のメリット・デメリットを確認する

]]>
https://cpp-learning.com/prime-kansya/feed/ 0 8412
【アマゾンプライムデー2023年】完全攻略!事前準備やお得キャンペーンを徹底解説 https://cpp-learning.com/amazon-primeday/ Tue, 04 Jul 2023 08:20:44 +0000 https://cpp-learning.com/?p=7463 アマゾンユーザー必見のイベント「アマゾンプライムデー2023」の開催が発表されました!

年に1度開催されるアマゾンプライム会員限定の大セールです。

プライム会員歴7年の私がアマゾンプライムデーの攻略方法をまとめました。

  • アマゾンプライムデーの解説
  • 事前準備の方法
  • お得キャンペーン情報

アマゾンプライムデーとは年に1度の大セール

アマゾンプライムデーで買った商品の箱積み

アマゾンプライムデーは年に1度開催されるのアマゾンプライム会員のための大規模セールのこと。

アマゾンプライム会員の大感謝際の大規模セール、アマゾンプライム会員の年会費のもとが取れてしまうくらいお得な大セールとなっています。

(お得すぎて、有給休暇を使ってまで参戦しています…!)

アマゾンプライムデー2023の開催期間はいつ?

  • 7/11(火)0:00~
  • 7/12(水)~23:59

2日間の開催です。一部のお得キャンペーンに関してはすでに始まっています。

プライムデーの事前準備

  • プライム会員になる(無料体験でも参加可)
  • ギフト券をチャージする
  • Amazonアプリをインストールする
  • ポイントアップキャンペーンにエントリーする
  • Keepaを導入する

アマゾンプライム会員になる(無料体験でOK)

プライムデーの大セールはプライム会員限定の大セールです。

有料のプライム会員ですが、30日間の無料期間がありプライムデーのときだけ入ってセール終了後に退会しても大丈夫なんです。プライムデーは1年に1度の大セールなので、あらかじめ無料体験に入っておきましょう。

有料のAmazonプライム会員は以下の手厚いサービスを低価格で受けられます。

  • 送料無料
  • お急ぎ便
  • お届け時間指定
  • 本読み放題
  • 音楽聞き放題
  • アニメ・ドラマ見放題など

料金は2つのプランから選べます。

  • 500円/月
  • 4900円/年(月々約410円

年間払いだと、月換算でたったの410円!カフェのコーヒーより安いです。

30日間無料でお試しできます。無料期間中の解約も可能で、プライムデーのときだけ入って無料体験期間中に退会すれば料金は発生しません。

プライム会員の詳細は「アマゾンプライム会員のメリット・デメリット」の記事でチェックしてくださいね。

ギフト券をチャージする(最大2.5%還元)

アマゾンで買い物をするなら事前にチャージをしておくとポイントが還元されるのでお得です。少しでもお得に買い物をしたい方はチャージキャンペーンによるポイント還元を狙いましょう。

現金払いでもクレジットカード払いでもOK。

さらにAmazon Payを利用している方は、Amazon Payキャンペーンと併用可能で、最大2.5%還元です。

ポイント還元率 条件(プライム会員)
0.5% キャンペーン1にエントリー後
5,000円以上のチャージ
2.5% キャンペーン1キャンペーン2の両方にエントリー後
5,000円以上のチャージ
Amazon Payでギフト券残高払い

ポイント還元にはキャンペーンへのエントリーが必要ですので注意してください。

アマゾンショッピングアプリをインストール(ポイント還元アップ)

Amazon ショッピングアプリ

Amazon ショッピングアプリ

AMZN Mobile LLC無料posted withアプリーチ

Amazonショッピングアプリは無料ダウンロードなのにポイント還元率がアップキャンペーンの対象です。セール前には必ずインストールしておきましょう。

ほしいものリストに追加しているとタイムセールのときに通知してくれます。

アプリからの決済でポイントアップなので、注意してください。

ポイントアップキャンペーンにエントリー

Amazonプライムデーでは買い物金額に応じてポイント還元キャンペーンを行うのも魅力のひとつ。

アマゾンセール時のキャンペーンには、ログインした状態で「ポイントアップキャンペーンエントリーページ」を開き、エントリーボタンを押します。

10秒もかからないので忘れないうちにポチッとエントリーしておきましょう。

  • Amazonプライム会員
  • Amazonショッピングアプリ

この2点は簡単にできて、併せて3.5%還元です。

Amazonのクレジットカードを作れば最大7.5%還元までいきますが、プライムデーのために作る必要はありません。

AmazonカードでAmazonデバイスを購入すればMax15%還元

価格推移をチェックできる「Keepa」を導入

アマゾンの価格チェックKeepa

アマゾンで販売される商品の価格推移をチェックできるブラウザ拡張機能「Keepa」を入れておけば、高値掴みすることはありません。

アマゾンで販売される商品の価格は変動しやすいです。セール期間中でポイント還元率が高いとはいえ、高値で購入すると損します。

全ての商品が安いわけではありません。セール直前に値上げをして割引で安く見せている悪質な商品に引っかからないようにしっかりと対策を。

>>Amazon価格チェックができるKeepaを導入する

アマゾンプライムデーのお得情報

プライムデー当日以外にも事前に始まっているキャンペーンがあります。ぜひチェックをしてください。

4ヶ月間「無料」で音楽聴き放題

アマゾンプライム会員限定で音楽聴き放題「Amazon Music Unlimited」が4ヶ月間無料になるキャンペーンを実施中です。

1ヶ月無料 → 4ヶ月無料

プライムデーでは通常より無料期間が3ヶ月も長くお得です。音楽好きの方はこの機会にどうぞ。

キャンペーン期間は7/13まで

3ヶ月間「無料」でKindle本が読み放題

キンドルペーパーホワイト

2940円(月額980円×3ヶ月) → 無料

アマゾンプライム会員限定でKindle本の読み放題「Kindle Unlimited」が3ヶ月間無料になるキャンペーンを実施中です。

プライムデーの終了と同時にキャンペーンも終了するので、プライムデーでKindle端末を購入してから入ろうと考えている方は入り忘れに注意。

Kindle Unlimitedが3ヶ月間も無料になるのは今回が初めてで、かなり頑張っているキャンペーンです。

3ヶ月間「無料」でオーディブル

4,500円(月額1,500円×3ヶ月) → 無料

プロのナレーターが朗読した本を聞けるサービス。移動中など、本を広げるのが難しいときに便利なサービスです。

アマゾンのサブスクのなかでは月額料金が高めなので、お試しするなら無料期間が長い今がチャンスです。

2ヶ月「99円」で名作映画・ドラマが見放題

1980円(月額990円×2ヶ月) → 99円 

6チャンネルを対象に、最大90%オフで映画見放題。映画好きは過去作をこの機会に観るのはいかがでしょうか。

スタンプラリーで50,000ポイント当たるチャンス

スタンプを5つ集めるとポイントやAmazonデバイスが当たるチャンス!

  1. キャンペーンにエントリー
  2. プライム対象商品を購入
  3. プライムビデオを見る
  4. プライムミュージックを聞く
  5. プライムリーディングを読む

どれも簡単なので、暇つぶし感覚でやってみてください。(7/19まで)

アマゾンプライムデーセールは3種類!目玉は数量限定タイムセール

アマゾンプライムデーに参加する前にセールの種類を知っておきましょう。アマゾンプライムデーのセールは3種類あります。

  • 特選タイムセール:数量制限なし。あわてず買おう。
  • 数量限定タイムセール:数量制限あり。激安で激戦。
  • レジ割引・まとめ買い割引

特選タイムセールは24時間販売する「本日の特選品」です。タイムセールといいつつも24時間ありますし、商品の数量に制限がないのでゆっくり買うかどうか決めてOKです。

一番の目玉は数量限定タイムセールです。実質プライム会員による争奪戦なるセール会場で、一瞬で売り切れる商品が続出します。1つの商品につき最大8時間終了します。

セールの見落とし防止にウォッチリストを活用しよう

お目当ての商品のタイムセールが気づいたら開始されていたという状況にならないように「ウォッチリスト」を活用しましょう。

商品ページに「ウォッチする」ボタンを押しておくとセール開始前に通知が届きます。

気になる商品は全部ポチッと押しておきましょう。

売り切れでも「キャンセル待ち」で買える可能性あり!

在庫数はカートに入れられた時点で減っていきます。とりあえずみんな気になる商品をポイポイとカートに入れるので在庫数0となるのですが、なかには決済をせずキャンセルする人も出てきます。

キャンセル待ちでも商品が買える可能性は十分にあるので、どうしても欲しい場合はキャンセル待ちを活用しましょう!

逆に自分が気になる商品はとりあえず早くカートに入れることをおすすめします。

事前準備をしっかりしてアマゾンプライムデーを攻略しよう

アマゾンプライムデーを攻略するためには事前準備がとっても大切です。

アマゾンプライムデーはアマゾンプライム会員の感謝際セールなので、アマゾンプライム会員になっておきましょう(無料体験でもOK!

セール当日は画面に張り付いていないといけないので、事前準備をしっかりしておきましょう。

>>プライム会員のメリット・デメリットを確認する

]]>
7463
【2023年版】アマゾンプライム会員のメリット・デメリットを紹介! https://cpp-learning.com/amazon-prime/ Tue, 04 Jul 2023 07:47:56 +0000 https://cpp-learning.com/?p=7476 今や生活には欠かせない存在のネットショップ「アマゾン」。

私はアマゾンのヘビーユーザーで7年以上「アマゾンプライム会員」です。私が利用しているサブスクでは一番コスパがいいと感じています。

正直、入っておいて絶対に損はありません。

本記事では現プライム会員が「アマゾンプライム会員」になるメリット・デメリット・特典を紹介します。

アマゾンプライムの年会費は4,900円!1ヶ月あたりたったの410円

アマゾンプライムの人気の秘密は年会費の安さです。

年会費払いだと5,900円。月々500円以下でたくさんの特典を受けれることが魅力です。月額費払いより安いため、月額費払いでの加入がおすすめです。

年額費 5,900円(1ヶ月あたり500円以下
月額費 600円

大学生・専門学生はほぼ同じ特典でさらに安い「プライムスチューデント会員」になることができます。

アマゾンプライム会員になる10個のメリット

  1. 配送料無料
  2. 配送の時間指定が可能
  3. 無料お急ぎ便
  4. 「プライムビデオ」で番組見放題
  5. 「プライムミュージック」音楽聞き放題
  6. 「プライムリーディング」Kindle本読み放題
  7. プライム会員限定の先行タイムセール
  8. 「アマゾンパントリー」たくさんの商品が1つの箱で届く
  9. 「アマゾンファミリー」おむつ・おしり拭き15%オフ
  10. 「プライムフォト」写真を何枚でも保存可能

配送料無料

アマゾンで買い物をすると通常2,000円以下の商品に関しては送料がかかります。しかし、アマゾンプライム会員だと2,000円以下の商品でも送料無料。

アマゾンプライム会員の約月々490円ですから、2,000円以下のちょっとした買い物を月1でするなら断然お得です。

配送関連の特典はプライムマークがついている商品のみ対応ですが、人気商品にはプライムマークが付いていることが多いです。

配送の時間指定が可能

仕事などでいつでも自宅にいれるわけではない場合、時間指定はとってはうれしいですね。自宅にいる時間に指定しておけば必ず受け取れます。

再配達はめんどくさいですし、宅配ボックスがあっても重たい荷物を自分で運ぶのはしんどいです。

無料お急ぎ便

「一刻も早く届いて欲しい」と急用の場合はアマゾンプライム会員ならお急ぎ便も無料です。

配送されるまでの時間を短縮したい場合、うれしいです。

プライム会員限定の先行タイムセール

アマゾンは年に数回大セールを開催します。大セールが実施されるときにプライム会員だとタイムセール会場に30分早く入ることができるのです。

アマゾンプライム会員でなくてもお得な買い物を楽しめるのですが、人気商品に関しては実質プライム会員でないと争奪戦に負けてしまうのが現状です。

またアマゾン1番の大セール「アマゾンプライムデー」はアマゾンプライム会員限定のイベントになります。

無料体験期間中でも先行タイムセールに参加できます。無料期間中に解約もできるので、とりあえずタイムセールを楽しみたい方は無料体験に登録してから挑むことをおすすめします。

「アマゾンプライムビデオ」アニメ・映画・ドラマ見放題

配送関連以外のサービスで一番使っているのが「プライムビデオ」。

深夜アニメでなかなかリアルタイムでは見れない作品や、映画館で見れなかった映画を自宅で鑑賞しています。

他の動画配信サービスに比べると観れる作品は少ないけど、プライムビデオがメインではないわりには大満足。

令和のテレビのリモコンには、プライムビデオのボタンが当たり前についているくらいの存在です。テレビのリモコンについていなくても、アマゾンファイヤースティックやプレイステーションを持っているとTVの大画面で観れます。

「プライムミュージック」音楽聴き放題

プライムミュージックで1億曲以上が無料で聴けます。

知らない洋楽ばかりではありません。福山雅治など人気ミュージシャンの曲も入っているので、何かしら聴きたい曲が入っているはず。

もっと音楽を聴きたい方向けには「Amazon Music Unlimited」という有料サービス(月額1,080円/プライム会員880円)があります。通常30日間は無料で音楽聴き放題です。

「プライムリーディング」Kindle本読み放題

Kindle本(電子書籍)数百冊が無料で読み放題になります。Kindle端末を持っていなくてもパソコンやタブレットからでも読めるのがいいですね。

ラインナップには最新のアニメ化した原作もあり、アニメをみて気になった漫画を読めます。

もっと本を読みたい方向けには「Kindle Unlimited」という有料サービス(月額980円)もあります。

「アマゾンパントリー」たくさんの商品が1つの箱で届く

日用品をアマゾンで買うなら「アマゾンパントリー」が便利です。

アマゾンはいろいろな店舗が出品しているショッピングモールため、個別に買い物をするとショップごとに段ボールが別々に届きます。段ボールも届く日時も別々だから結構大変です。

これを解消してくれたのが「アマゾンパントリー」。いろいろな種類の日用品を買っても1つの段ボールでまとめて届けてくれます。

商品1つ1つは安いのですが手数料が360円かかるのでお得感は少なめ。便利ですけどね!

「アマゾンファミリー」おむつ・おしり拭き15%オフ

赤ちゃんのいる家庭・これから生まれる家庭に便利なのがアマゾンファミリー。赤ちゃんの育児の必需品おむつ・おしり拭きがいつでも15%オフで購入できます。

おむつはスーパーなどで購入すると荷物になるのでアマゾンの利用がお手軽です。

逆にアマゾンファミリーは赤ちゃんのいない家庭だと使わない特典です。

「プライムフォト」写真を何枚でも保存可能

写真撮影が趣味の方に嬉しい「プライムフォト」。写真を何枚でも無制限に保存できるサービスです。家族5人まで共有することができます。

ただし、プライム会員をやめると保存データが回収できなくなるので使用する場合はプライム会員を退会しにくくなります。

アマゾンプライム会員のデメリット

特化したサービスには劣る

アマゾンプライム会員は安い金額で幅広いサービスを展開していますが、特化したサービスにはひとつひとつが劣ってしまいます。

  • 動画見放題
  • 音楽聞き放題
  • 本読み放題

例えば「動画見放題のサービスを探している」場合は動画配信サービスには劣ってしまいます。

ただアマゾンプライム会員は、いろいろなサービスと複合してみるとかなりお得には間違いありません。

プライムフォトを使った場合に抜けにくい

プライム会員になると撮影した写真を無制限に何枚でも保存ができるのですが、いざプライム会員を抜けると保存サービスも使えなくなるので写真を自分の手元にダウンロードしなおさなければいけません。

思い出の写真を無くすわけにはいきませんから、プライムフォトのサービスを利用するとプライム会員から抜けにくくなります。

特典がありすぎて使いこなせない

アマゾンプライム会員にはお得なサービスがいっぱいあります。うれしい悲鳴なのですが、正直全部のサービスを使いこなせません。自分に合ったサービスだけの利用でも十分満足なんですけどね。

私は配送関連・プライムビデオ・先行タイムセールだけでかなり満足しています。

アマゾンプライム会員になる方法

  1. アマゾンプライム公式サイトへアクセスする
  2. 「30日間の無料体験を試す」をクリックする
  3. サインインする
  4. 支払い方法・請求先住所を確認して「30日間の無料体験を試す」をクリックする

普段からアマゾンを利用している方ならクレジットカード情報がすでに入力済となっているので、登録は1分もかかりません。

30日間の無料体験期間がついていて、無料体験期間中も支払いをしている方と同じ特典を受けれます。もちろん無料期間中の退会も可能です。

退会時も無駄な引き留めが一切ないのであと腐れなくWEBからパパッと気軽に退会できるのがアマゾンのいいところですね。

大学生・専門学生必見「プライムスチューデント」

大学生・専門学生のみなさんはプライム会員になるのはちょっと待ってください。大学生・専門学生向けには「プライムスチューデント会員」があります。

紹介してきたプライム会員特典のうち「プライムファミリー」は対象外ですが、プライム会員と同じ特典(+限定特典あり)が社会人の半額である年間2,950円で受けれます。

さらにすごいのは6か月間も無料です!長すぎる無料期間にビックリ。

大学生・専門学生は「プライムスチューデント会員」が断然お得です。

まとめ:プライム会員で快適な生活をしよう

プライム会員になるメリットをまとめました。

  1. 配送料無料
  2. 配送の時間指定が可能
  3. 無料お急ぎ便
  4. プライム会員限定の先行タイムセール
  5. 「プライムビデオ」で番組見放題
  6. 「プライムミュージック」音楽聞き放題
  7. 「プライムリーディング」Kindle本読み放題
  8. 「アマゾンパントリー」たくさんの商品が1つの箱で届く
  9. 「アマゾンファミリー」おむつ・おしり拭き15%オフ
  10. 「プライムフォト」写真を何枚でも保存可能

アマゾンプライムのある生活は本当に快適です。アマゾンプライムの年会費は1度値上げをしましたが、アマゾンプライムを解約した人なんてほとんどいないのではないでしょうか。

正直年間5,900円でも安いと思えるくらいの特典を受け取っています。買い物がアマゾン派の方は入会してみると便利さにビックリすると思いますよ。

30日間の無料期間中に退会もできるので試してみてくださいね!

>>アマゾンプライムデーの攻略方法

]]>
7476
Golang × WebAssembly(wasm)入門 https://cpp-learning.com/golang-webassembly/ https://cpp-learning.com/golang-webassembly/#respond Tue, 21 Feb 2023 13:34:13 +0000 https://cpp-learning.com/?p=8289 こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。Go言語(Golang)やフロントエンドを勉強中です。

Golang × WebAssemblyについて勉強したので、備忘録も兼ねて本記事を書きます。

WebAssembly(wasm:ワズム)とは

WebAssembly(wasm:ワズム)とは、ブラウザ上で動作するバイナリ形式のことです。

C/C++、Rust、Go言語(Golang)などのプログラムからコンパイルおよびビルドすることで、ブラウザで動作するバイナリコード(*.wasm)を生成することができます。

GolangからJavaScriptを生成

少し脱線しますが、ブラウザ上で動作するアプリをGolang(以下Go)で開発したいなら、GopherJSを使って、GoからJavaScriptを生成するという手もあります。興味ある人は、以下の記事を参考にして下さい。

https://cpp-learning.com/gopherjs/

今回はGoからバイナリコード(*.wasm)を生成して、ブラウザ上で動かしてみます。

Go × WebAssembly(wasm)入門

Goの開発環境構築から説明します。

DockerでGolangの開発環境構築

まずは以下のコマンドで作業ディレクトリ:go-wasmを作成します。

$ mkdir go-wasm

次にDocker HubからGo公式イメージをpullしてきます。

$ docker pull golang:1.20.1

コンテナ起動時に、-vオプションでホストとコンテナ間のシェアディレクトリ(=作業ディレクトリ)を設定して、作業するのが楽です。

$ docker run -v ${pwd}:/go/src/app –name go-wasm -it golang:1.20.1

以下のコマンドでgo.modを作成します。

$ cd src/app
$ go mod init example.com/myapp

以降からはソースコードを書いていきます。

main.go

コンソールに文字列を出力するだけのシンプルなコードが以下です。

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello, Go Assembly!")
}

以下のコマンドで動作確認しておきます。

$ go run main.go

問題なければGOOS=js,GOARCH=wasmでコンパイル&ビルドして、main.wasmを生成します。

$ GOOS=js GOARCH=wasm go build -o main.wasm main.go

wasm_exec.js

Go公式リポジトリからwasm_exec.jsをダウンロードして、作業ディレクトリに保存します。このjsファイルを使って、main.wasmをブラウザ上で実行します。

index.html

wasm_exec.htmlを参考に、index.htmlを作成します。

<html>

<head>
    <meta charset="utf-8" />
    <title>Go WebAssembly</title>
    <script src="wasm_exec.js"></script>
</head>

<body>
    <h1>Go WebAssembly</h1>
    <script>
        const go = new Go();
        let mod, inst;
        WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then((result) => {
            mod = result.module;
            inst = result.instance;
            document.getElementById("runButton").disabled = false;
        }).catch((err) => {
            console.error(err);
        });

        async function run() {
            // console.clear();
            await go.run(inst);
            inst = await WebAssembly.instantiate(mod, go.importObject); // reset instance
        }
    </script>

    <button onClick="run();" id="runButton" disabled>BUTTON</button>
    <!-- <button type="button" onclick="run()">BUTTON</button> -->
</body>

</html>

最終的な作業ディレクトリの中身は以下の通りです。

workspace
  └─go-wasm
      ├──go.mod
      ├──main.go
      ├──index.html
      ├──wasm_exec.js
      └──main.wasm

動作確認 -VSCode拡張機能のLive Serverでサーバー起動-

最後にローカルサーバーで動作確認をします。VSCode拡張機能のLive Serverを使えば、下記の3ステップでサーバーを起動できます。

Live Serverの基本的な使い方
  1. VSCodeでindex.htmlを開く
  2. 右クリック
  3. Open with Live Serverクリックでサーバー起動

適当なブラウザから http://127.0.0.1:5500/index.html にアクセスすれば、動作確認できます(以下ツイート)。

https://twitter.com/Cpp_Learning/status/1627283268738613250

サーバー止めるときは「右クリック⇒Stop Live Serverクリック」です。

はやぶさ
はやぶさ
ブラウザ上でGoのコードを実行できた!感動した!!

まとめ

Goのコードからwasmを生成してブラウザ上で実行する簡単な例を紹介しました。

はやぶさ
はやぶさ
本記事が Go × WebAssembly(wasm)入門したい人の参考になれば嬉しいです

以下 Goのオススメ書籍を紹介

]]>
https://cpp-learning.com/golang-webassembly/feed/ 0 8289
【Python】最適化フレームワークのCodable Model Optimizerで回帰モデルのパラメータ調整を自動化する https://cpp-learning.com/codable-model-optimizer/ https://cpp-learning.com/codable-model-optimizer/#respond Sun, 11 Sep 2022 08:02:18 +0000 https://cpp-learning.com/?p=8261 こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。

最適化問題を気軽に解くための最適化フレームワーク:codable-model-optimizer が非常に魅力的だったので、回帰モデルのパラメータ調整を題材に、使い方を解説します。

Codable Model Optimizerとは

Codable Model Optimizer に興味ある人は、Recruit Data Blog にある以下の公式ブログ記事を必ず読んでほしいです!

私自身の言葉で Codable Model Optimizer について、あれこれ書くことも考えましたが、蛇足だと判断しました。なので本記事では、公式ブログには無い「実用例」の説明に注力して書きます。

実践!Codable Model Optimizer

Codable Model Optimizer による「回帰モデルのパラメータ自動調整」について説明します。

正確には「回帰モデルの評価指標の1つである、決定係数(R2)が最大となるパラメータをCodable Model Optimizer で算出する」という表現が適切です。

インストール

以下のコマンドでインストールします。

pip install codableopt

依存ライブラリは numpy のみです。なので最低限の動作環境は以下の通りです。

  • Python >= 3.8
  • codableopt == 0.1.2
  • numpy >= 1.22.0

以降からソースコード書いていきます。

Import

まずはimportから

import numpy as np
import matplotlib.pyplot as plt

from sklearn.metrics import mean_squared_error, r2_score

from codableopt import Problem, Objective
from codableopt import DoubleVariable
# from codableopt import IntVariable, DoubleVariable, CategoryVariable
from codableopt import OptSolver, PenaltyAdjustmentMethod

np.random.seed(0)

説明変数と目的変数

適当な説明変数と目的変数を用意します。

# データ数
N = 20

# 真の関数
def true_func(x):
    y = 2 * x - 2 * (x ** 2) + 0.5 * (x ** 3)
    return y

# 説明変数
x = np.linspace(-5, 5, N)
# x = np.random.uniform(-5, 5, N)

# 目的変数
y = true_func(x) + np.random.normal(loc=0, scale=10, size=N)

# 可視化
plt.scatter(x, y, label="samples")
plt.plot(x, true_func(x), color="r", label="true_func")
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc="lower right")
plt.grid()
plt.show()

最適化フレームワークのCodable Model Optimizerで回帰モデルのパラメータ調整を自動化する

Problemオブジェクト作成

Problemオブジェクトを生成します。引数が is_max_problem=True の場合は最大化問題、False の場合は最小化問題です。

# set problem
problem = Problem(is_max_problem=True)

目的関数の設定

目的関数:y = b0 + b1x + b2x^2 + b3x^3 の最適値を算出します。正確には R2 を最大化するパラメータ b0~b3 を算出します。

# define model
def model(b0, b1, b2, b3, x):
    y_pred = b0 + b1*x + b2*x**2 + b3*x**3
    return y_pred

# define objective function
def objective_function(b0, b1, b2, b3, X, Y):
    Y_pred = []
    for x in X:
        y_pred = model(b0, b1, b2, b3, x)
        Y_pred.append(y_pred)

    # rmse = np.sqrt(mean_squared_error(Y, Y_pred))
    r2 = r2_score(Y, Y_pred)

    # return rmse
    return r2

最適化で利用する変数を定義

最適化で利用する各パラメータ b0~b3 が上下限-5.0~5.0の範囲の連続値だと定義します。

# define variables
b0 = DoubleVariable(name='b0', lower=np.double(-5.0), upper=np.double(5.0))
b1 = DoubleVariable(name='b1', lower=np.double(-5.0), upper=np.double(5.0))
b2 = DoubleVariable(name='b2', lower=np.double(-5.0), upper=np.double(5.0))
b3 = DoubleVariable(name='b3', lower=np.double(-5.0), upper=np.double(5.0))

# arguments
args_map = {
                'b0': b0,
                'b1': b1,
                'b2': b2,
                'b3': b3,
                'X': x,
                'Y': y,
            }

# set objective function and its arguments
problem += Objective(
                        objective=objective_function,
                        args_map=args_map
                    )
print(problem)

「チューニング対象のパラメータが連続値で、探索範囲を-5.0~5.0に設定」という表現の方が分かりやすいかも。

最適化の実行

ソルバーオブジェクトと最適化手法オブジェクトを生成し、最適化計算を行います。

# ソルバーを生成
solver = OptSolver()

# 最適化手法を生成
# generate optimization methods to be used within the solver
method = PenaltyAdjustmentMethod(steps=10000)

# 最適化実施
answer, is_feasible = solver.solve(problem, method)
print(f'answer:{answer}, answer_is_feasible:{is_feasible}')

answer:{‘b0’: 4.9598541557333915, ‘b1’: 2.468429435349079, ‘b2’: -1.9206374732463405, ‘b3’: 0.40126042390510896}, answer_is_feasible:True

回帰モデルとR2の評価

算出した回帰モデルのR2評価と可視化を行います。

y_pred = model(answer['b0'], answer['b1'], answer['b2'], answer['b3'], x)
r2 = objective_function(answer['b0'], answer['b1'], answer['b2'], answer['b3'], x, y)
print("r2:", r2)

# 可視化
plt.scatter(x, y, label="samples")
plt.plot(x, y_pred, color='g', label="model")
plt.plot(x, true_func(x), color="r", label="true_func")
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc="lower right")
plt.grid()
plt.show()

r2: 0.9529992755681892

最適化フレームワークのCodable Model Optimizerで回帰モデルのパラメータ調整を自動化する

以上 Codable Model Optimizer による「回帰モデルのパラメータ自動調整」の解説でした。

まとめ

最適化フレームワーク:codable-model-optimizer について、簡単な「実用例」を交えて紹介しました。開発者が意図した通り、最適化ソルバーを簡単に利用できました。

なお本記事で紹介できなかった機能もありますので、公式ドキュメントを是非チェックしてみてください。

はやぶさ
はやぶさ
開発者に感謝!ビジネス課題の最適化に活用できるか検討します

以下 オススメのPython書籍を紹介。

]]>
https://cpp-learning.com/codable-model-optimizer/feed/ 0 8261
【Go言語(Golang)】CollyによるWebスクレイピング入門から実践まで https://cpp-learning.com/go-colly/ https://cpp-learning.com/go-colly/#respond Sun, 14 Aug 2022 08:14:45 +0000 https://cpp-learning.com/?p=8207 こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。

Goのスクレイピングフレームワーク Colly を活用したWebスクレイピングをソースコード付きで紹介します。

 Collyとは

Collyとは、高機能かつ高速なWebスクレイピングを実現できるGophers向けフレームワークです。詳細については公式サイトをご確認ください。

Webスクレイピング入門

環境構築やWebスクレイピング前に確認すべきことを紹介します。

Go開発環境構築

はじめにgolang:1.14の開発環境構築をします。色んな構築方法がありますが、Dockerを使う場合は、以下の記事を参考にして下さい。

https://cpp-learning.com/gopherjs/

続いて、公式 README.md にある go.mod をダウンロードします。お好みですが、今回は一部変更した以下の go.mod を用意します。

module example.com/myapp

go 1.14

require (
	github.com/gocolly/colly/v2 v2.1.0
)

以下のコマンドでCollyをインストールします。

go mod download

以上で環境構築完了です。

事前確認【robots.txt】

スクレイピング対象のサイトが、クローラを禁止しているか否かを robots.txt で確認します。本サイト:はやぶさの技術ノートの場合は、以下のURLから確認できます。

robots.txt の説明は割愛しますが、中身を理解できない内は、クローラやスクレイピングなどを活用したサイトの情報抽出は控えた方が良いかと。

CollyによるWebスクレイピング入門【Step1】

以降からGoのコードを書いていきます。スクレイピング対象のURLを指定して、HTMLから<title>要素のコンテンツを抽出します。

package main

import (
	"fmt"

	"github.com/gocolly/colly/v2"
)

func main() {
	// Target URL
	url := "https://cpp-learning.com"

	// Instantiate default collector
	c := colly.NewCollector()

	// Extract title element
	c.OnHTML("title", func(e *colly.HTMLElement) {
		fmt.Println("Title:", e.Text)
	})

	// Before making a request print "Visiting URL: https://XXX"
	c.OnRequest(func(r *colly.Request) {
		fmt.Println("Visiting URL:", r.URL.String())
	})

	// Start scraping on https://XXX
	c.Visit(url)
}

このソースコードを app.go という名前で保存し、以下のコマンドを実行すると、「訪問先のURL」と「タイトル」が表示されます。

$ go run app.go

Visiting URL: https://cpp-learning.com
Title: はやぶさの技術ノート|理系に役立つ情報

以上が Colly の基本的な使い方です。

html-css-cheat-sheet が最高なので、スクレイピング前に確認しておくと良い

CollyによるWebスクレイピング実践

スクレイピングの主な目的は、情報収集だと思うので、サイトから抽出した情報をデータベースやファイルに保存して、後から確認できるようにします。本記事ではスクレイピング結果をJSONファイルに保存する方法を紹介します。

スクレピング結果をJSONファイルに保存【Step2】

app.go を改良して、以下の機能を追加します。

  • HTTP のレスポンスステータスコード確認
  • スクレイピング結果をJSONファイルに保存

完成したソースコードが以下です。

package main

import (
	"fmt"
	"os"
	"log"
	"encoding/json"

	"github.com/gocolly/colly/v2"
)

type pageInfo struct {
	StatusCode	int		`json:"statusCode"`
	URL			string	`json:"url"`
	Title		string	`json:"title"`
}

func savePageJson(fName string, p *pageInfo) {
	// Create json file
	file, err := os.Create(fName)
	if err != nil {
		log.Fatalf("Cannot create file %q: %s\n", fName, err)
		return
	}
	defer file.Close()

	// Dump json to the standard output
	// err = json.NewEncoder(file).Encode(p)
	// if err != nil {
	// 	log.Fatal(err)
	// }

	// Dump json to the standard output
	enc := json.NewEncoder(file)
	enc.SetIndent("", "  ")
	err = enc.Encode(p)
	if err != nil {
		log.Fatal(err)
	}

	// Struct to json
	b, _ := json.MarshalIndent(p, "", "  ")
	fmt.Println(string(b))
	// fmt.Println(p)
}

func main() {
	// Target URL
	url := "https://cpp-learning.com"

	p := &pageInfo{}

	// Instantiate default collector
	c := colly.NewCollector()

	// Extract title element
	c.OnHTML("title", func(e *colly.HTMLElement) {
		p.Title = e.Text
		fmt.Println(e.Text)
	})

	// Before making a request print "Visiting URL: https://XXX"
	c.OnRequest(func(r *colly.Request) {
		p.URL = r.URL.String()
		fmt.Println("Visiting URL:", r.URL.String())
	})

	// After making a request extract status code
	c.OnResponse(func(r *colly.Response) {
		p.StatusCode = r.StatusCode
		fmt.Println("StatusCode:", r.StatusCode)
	})
	c.OnError(func(r *colly.Response, err error) {
		p.StatusCode = r.StatusCode
		log.Println("error:", r.StatusCode, err)
	})

	// Start scraping on https://XXX
	c.Visit(url)

	// Wait until threads are finished
	c.Wait()

	// Save as JSON format
	savePageJson("page.json", p)
}

本コード実行後に生成される page.json が以下です。

{
  "statusCode": 200,
  "url": "https://cpp-learning.com",
  "title": "はやぶさの技術ノート|理系に役立つ情報"
}

はやぶさの技術ノートから最新投稿の情報を抽出【Step3】

本サイト:はやぶさの技術ノートでは、最新投稿の情報をサイドバーで公開中です(下図参照)。

「はやぶさの技術ノート」の最新投稿記事

上図にある最新記事5つの「タイトル」と「URL」を抽出するコードが以下です。

package main

import (
	"fmt"
	"os"
	"log"
	"encoding/json"

	"github.com/gocolly/colly/v2"
)

type articleInfo struct {
	Title	string	`json:"title"`
	URL		string	`json:"url"`
}

func saveArticlesJson(fName string, a []articleInfo) {
	// Create json file
	file, err := os.Create(fName)
	if err != nil {
		log.Fatalf("Cannot create file %q: %s\n", fName, err)
		return
	}
	defer file.Close()

	// Dump json to the standard output
	enc := json.NewEncoder(file)
	enc.SetIndent("", "  ")
	err = enc.Encode(a)
	if err != nil {
		log.Fatal(err)
	}

	// Struct to json
	b, _ := json.MarshalIndent(a, "", "  ")
	fmt.Println(string(b))
	// fmt.Println(p)
}

func main() {
	// Target URL
	url := "https://cpp-learning.com"

	articles := make([]articleInfo, 0, 4)

	// Instantiate default collector
	c := colly.NewCollector()

	i := 0
	// Extract li class="new-entry-item"
	c.OnHTML("li[class=new-entry-item]", func(e *colly.HTMLElement) {
		i++
		fmt.Println(i)

		// Extract h3 element
		title := e.ChildText("h3")
		// title = e.DOM.Find("h3").Text()
		fmt.Println(title)

		// Extract href
		link, _ := e.DOM.Find("a[href]").Attr("href")
		fmt.Println(link)

		article := articleInfo{
			Title:  title,
			URL:    link,
		}

		articles = append(articles, article)
	})

	// Before making a request print "Visiting URL: https://XXX"
	c.OnRequest(func(r *colly.Request) {
		fmt.Println("Visiting URL:", r.URL.String())
	})

	// After making a request extract status code
	c.OnResponse(func(r *colly.Response) {
		fmt.Println("StatusCode:", r.StatusCode)
	})
	c.OnError(func(r *colly.Response, err error) {
		log.Println("error:", r.StatusCode, err)
	})

	// Start scraping on https://XXX
	c.Visit(url)

	// Wait until threads are finished
	c.Wait()

	// Save as JSON format
	saveArticlesJson("articles.json", articles)
}

要素だけでなく、id・class・hrefも指定してスクレイピングできます。本コード実行後に生成される articles.json が以下です。

[
  {
    "title": "【GopherJS入門】GoのソースコードからJavaScriptを生成",
    "url": "https://cpp-learning.com/gopherjs/"
  },
  {
    "title": "AutoMLライブラリのFLAMLで機械学習モデルの作成を自動化する",
    "url": "https://cpp-learning.com/flaml/"
  },
  {
    "title": "機械学習に関する図や資料の作成に役立つツールまとめ",
    "url": "https://cpp-learning.com/draw-nn/"
  },
  {
    "title": "【Isolation Forest】決定木で説明性・解釈性を考慮した異常検知",
    "url": "https://cpp-learning.com/isolationforest/"
  },
  {
    "title": "【KEY COFFEE】コスパ最強ドリップコーヒー「DRIP ON」のレビュー -仕事や勉強が捗る至高の一杯-",
    "url": "https://cpp-learning.com/key-coffee-dripon/"
  }
]

ページと最新投稿の情報を1つのJSONファイルに保存【Step4】

最後に、以下の情報を1つのJSONファイルに保存するコードを紹介します。

  • 【STEP2】で抽出した「ページ情報」
  • 【STEP3】で抽出した「最新記事」

完成したソースコードが以下です。

package main

import (
	"fmt"
	"os"
	"log"
	"encoding/json"

	"github.com/gocolly/colly/v2"
)

type articleInfo struct {
	Title	string	`json:"title"`
	URL		string	`json:"url"`
}

type pageInfo struct {
	StatusCode	int				`json:"statusCode"`
	URL			string			`json:"url"`
	Title		string			`json:"title"`
	Article	[]articleInfo	`json:"article"`
}

func savePageJson(fName string, p *pageInfo) {
	// Create json file
	file, err := os.Create(fName)
	if err != nil {
		log.Fatalf("Cannot create file %q: %s\n", fName, err)
		return
	}
	defer file.Close()

	// Dump json to the standard output
	enc := json.NewEncoder(file)
	enc.SetIndent("", "  ")
	err = enc.Encode(p)
	if err != nil {
		log.Fatal(err)
	}

	// Struct to json
	b, _ := json.MarshalIndent(p, "", "  ")
	fmt.Println(string(b))
}

func main() {
	// Target URL
	url := "https://cpp-learning.com"

	p := &pageInfo{}
	articles := make([]articleInfo, 0, 4)

	// Instantiate default collector
	c := colly.NewCollector()

	// Extract title element
	c.OnHTML("title", func(e *colly.HTMLElement) {
		p.Title = e.Text
		fmt.Println(e.Text)
	})

	i := 0
	// Extract li class="new-entry-item"
	c.OnHTML("li[class=new-entry-item]", func(e *colly.HTMLElement) {
		i++
		fmt.Println(i)

		// Extract h3 element
		title := e.ChildText("h3")
		fmt.Println(title)

		// Extract href
		link, _ := e.DOM.Find("a[href]").Attr("href")
		fmt.Println(link)

		article := articleInfo{
			Title:  title,
			URL:    link,
		}

		articles = append(articles, article)
		p.Article = articles
	})

	// Before making a request print "Visiting URL: https://XXX"
	c.OnRequest(func(r *colly.Request) {
		p.URL = r.URL.String()
		fmt.Println("Visiting URL:", r.URL.String())
	})

	// After making a request extract status code
	c.OnResponse(func(r *colly.Response) {
		p.StatusCode = r.StatusCode
		fmt.Println("StatusCode:", r.StatusCode)
	})
	c.OnError(func(r *colly.Response, err error) {
		p.StatusCode = r.StatusCode
		log.Println("error:", r.StatusCode, err)
	})

	// Start scraping on https://XXX
	c.Visit(url)

	// Wait until threads are finished
	c.Wait()

	// Save as JSON format
	savePageJson("hayabusa-new-articles.json", p)
}

本コード実行後に生成される hayabusa-new-articles.json が以下です。

{
  "statusCode": 200,
  "url": "https://cpp-learning.com",
  "title": "はやぶさの技術ノート|理系に役立つ情報",
  "article": [
    {
      "title": "【GopherJS入門】GoのソースコードからJavaScriptを生成",
      "url": "https://cpp-learning.com/gopherjs/"
    },
    {
      "title": "AutoMLライブラリのFLAMLで機械学習モデルの作成を自動化する",
      "url": "https://cpp-learning.com/flaml/"
    },
    {
      "title": "機械学習に関する図や資料の作成に役立つツールまとめ",
      "url": "https://cpp-learning.com/draw-nn/"
    },
    {
      "title": "【Isolation Forest】決定木で説明性・解釈性を考慮した異常検知",
      "url": "https://cpp-learning.com/isolationforest/"
    },
    {
      "title": "【KEY COFFEE】コスパ最強ドリップコーヒー「DRIP ON」のレビュー -仕事や勉強が捗る至高の一杯-",
      "url": "https://cpp-learning.com/key-coffee-dripon/"
    }
  ]
}

以上の【STEP1~4】で任意サイトから複数の情報を抽出して、1つのJSONファイルにまとめて保存する所までガイドできたと思います。

まとめ

Goのスクレイピングフレームワーク Colly を活用したWebスクレイピングをソースコード付きで紹介しました。

本記事のソースコードを改良すれば、任意サイトから複数の情報を抽出して、1つのJSONファイルにまとめて保存する所まで、できるようになると考えています。

はやぶさ
はやぶさ
本記事が、GoでWebスクレイピングしたい人の参考になれば嬉しいです

以下 オススメ書籍を紹介。

]]>
https://cpp-learning.com/go-colly/feed/ 0 8207
【GopherJS入門】GoのソースコードからJavaScriptを生成 https://cpp-learning.com/gopherjs/ https://cpp-learning.com/gopherjs/#respond Sat, 11 Jun 2022 06:38:46 +0000 https://cpp-learning.com/?p=8158 こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。Go言語(Golang)やフロントエンドを勉強中です。

GoのソースコードからJavaScriptを生成できるGopherJSについて勉強したので、備忘録も兼ねて本記事を書きます。

GopherJSとは

GopherJSについて、公式ではGoからJavaScriptへのコンパイラと紹介しています。

GopherJS – A compiler from Go to JavaScript

GopherJS compiles Go code (golang.org) to pure JavaScript code. Its main purpose is to give you the opportunity to write front-end code in Go which will still run in all browsers.

引用元:gopherjs|公式GitHub

実際に使ってみると、以下の特徴があるので、個人的にはGo to JavaScriptを実現するライブラリ兼アプリという表現の方が”しっくり”きます。

GopherJSの特徴
  • GopherJSの作法に従って、Goのプログラムを書く必要があり、ライブラリまたはフレームワークという印象
  • コンパイラ以外の機能もCLIで提供

GopherJS入門 -環境構築-

最初にDockerでGo開発環境を構築します。以下の記事も参考にして下さい。

https://cpp-learning.com/go-docker/

まずは適当な場所にプロジェクトフォルダ:docker-gopherjs を作成します。最終的には、以下の構成になります。

workspace
  └─docker_gopherjs
      ├──Dockerfile  # 今回は使わない
      ├──go.mod
      ├──go.sum
      ├──README.md
      ├──index.html
      │
      ├─css
      │  └─style.css  # 今回は使わない
      ├─go
      │  └─app.go
      │
      └──js
          └─app.js

DockerでGo開発環境構築

以下のコマンドでGo公式イメージをDocker Hubからpullします。Goの最新バージョンを使いたい人は、タグを 1.17 から latest に変更して下さい。

$ docker pull golang:1.17

ホスト(Windowsマシンとか)とコンテナ間のシェアフォルダで作業するのが好きなので、以下のコマンドでコンテナを起動します。

$ docker run -v [host側のディレクトリパス:コンテナ側のディレクトリパス] -it [イメージ:タグ]

今回は以下の通りです。

$ docker run -v C:/Users/hayab/workspace/docker-gopherjs:/go/src/app -it golang:1.17

pwdを用いた以下のコマンドでもOKです。

$ docker run -v ${pwd}:/go/src/app –name go-goptuna -it golang:1.17

以降からはコンテナに潜って作業します。VSCode拡張機能の Docker 使うのがオススメです。

GopherJSパッケージのインストール

最初に go.mod を作成します。

$ go mod init example.com/myapp

続いて gopherjs をインストールします。

$ go get github.com/gopherjs/gopherjs

gopherjs コマンドを叩いて、コマンド説明などが表示できれば環境構築完了です(下図参照)。

GopherJS入門

GopherJS入門 -GoからJavaScriptを生成-

以降からはGoのコード書いていきます。

JavaScriptの関数を呼ぶ

js.Global.Call()でJavaScriptの関数を呼ぶことができます。例えば、alert関数を呼ぶときは、以下のように書きます。

package main

import (
  "github.com/gopherjs/gopherjs/js"
)


func main() {
  // アラート表示
  // JavaScriptの alert関数:alert('Hello, JavaScript') に相当
  js.Global.Call("alert", "Hello, GopherJS!")
}

コンソール出力

コンソール出力は、Go標準パッケージのfmtがそのまま使えます。

package main

import (
  "fmt"
)


func main() {
  // コンソール出力
  // JavaScriptの console.log('clicked') に相当
  fmt.Println("Hello, JS console")
}

JavaScriptのdocument.hoge()

JavaScriptでいう以下のコードは、js.Global.Get().Call()で対応できます。

  • document.write(“Hello world!”)
  • document.addEventListener(‘click’, func())

例えば、以下の通りです。

package main

import (
	"fmt"
    "github.com/gopherjs/gopherjs/js"
)


func callAlert() {
	// アラート表示
	js.Global.Call("alert", "Hello, GopherJS!")
}


func onClick() {
	// マウスクリックで自作関数をコール
	// JavaScriptのdocument.addEventListener('click', func())に相当
	js.Global.Get("document").Call("addEventListener", "click", callAlert)
}


func writeHello() {
	// JavaScriptの document.write("Hello world!"); に相当
	s := "<strong>GoからJavaScriptを生成する!</strong>"
	js.Global.Get("document").Call("write", s)
}


func main() {
	// コンソール出力
	fmt.Println("START, App")

	writeHello()
	onClick()
}

Goの関数をJavascriptから呼ぶ

Goで作成した自作関数をJavascriptから呼ぶときは、js.Global.Get().Set()を使います。

package main

import (
	"fmt"
    "github.com/gopherjs/gopherjs/js"
)


func callAlert(s string) {
	// アラート表示
	js.Global.Call("alert", s)
	// js.Global.Call("alert", "Hello, GopherJS!")

	// コンソール出力
	fmt.Println("Alert! " + s)
}


func myGoFunc() {
	// JavaScriptからGoの関数:callAlertを呼べるようにする
	js.Global.Get("document").Set("myGoFunc", callAlert)
}


func main() {
	// コンソール出力
	fmt.Println("START, App")

	myGoFunc()
}

上記のコードをapp.goという名で保存します。

GoからJavaScriptを生成-

先ほど保存したのapp.goからJavaScriptを生成します。

ビルド -Go to JavaScript-

以下のコマンドでapp.goからapp.jsを生成できます。

$ gopherjs build app.go -o ../js/app.js

簡単ですね。

コマンドを忘れたときは、-hを使えば、ガイドしてくれます。

$ gopherjs build -h

index.html

最後に適当なindex.htmlを作成します。

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />

    <title>GopherJS テスト</title>

    <!-- <link rel="stylesheet" href="./css/style.css"> -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/water.css@2/out/dark.css">
    <!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/water.css@2/out/light.css"> -->
    <!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@exampledev/new.css@1/new.min.css"> -->
    <!-- <link rel="stylesheet" href="https://siongui.github.io/tipitaka-romn/cscd/tipitaka-latn.css"> -->

    <script src="./js/app.js"></script>
</head>

<body>
    <!-- Add your site or application content here -->
    <!-- <div id="app"></div> -->

    <header>
        <h1>GopherJS テスト</h1>
        <p>Hello, GopherJS!</p>
    </header>

    <h2>GopherJSとは</h2>

    <a href="https://github.com/gopherjs/gopherjs">GopherJS</a> とは
    <strong>Go</strong> のソースコードを <strong>JavaScript</strong> に変換するライブラリ兼アプリです。
    <p></p>

    <h2>マウスクリックのイベント駆動</h2>

    <h3>1. ピュアなJavaScript</h3>
    <p>以下の<mark>ボタン</mark> をクリックすると、ピュアな<strong>JavaScript</strong>の処理が走ります</p>

    <button type="button" onclick="alert('Hello, JavaScript!')">
        ボタン
    </button>

    <!-- <input type="button" name="btn" value="クリック" onclick="btnClick('Hello, JavaScript!')" /> -->

    <h3>2. GopherJSで生成したJavasSript</h3>
    以下の<mark>BUTTON</mark> をクリックすると<strong>GopherJS</strong>で生成した<strong>JavaScript</strong>の処理が走ります</p>

    <button type="button" onclick="myGoFunc('Hello, GopherJS!')">
        BUTTON
    </button>

    <!-- <input type="button" name="btn" value="クリック" onclick="myGoFunc('Hello, GopherJS!')" /> -->

</body>

</html>

適当なブラウザでindex.htmlを開いて、動作確認したときの様子が以下です。

https://twitter.com/Cpp_Learning/status/1535496974279254016

はやぶさ
はやぶさ
本当にGoからJavaScriptを生成できた!感動した!!

まとめ

GoのソースコードからJavaScriptを生成できるGopherJSについて、色々試した内容をまとめました。本記事が、誰かの参考になれば、嬉しいです。

ただ正直に言えば、Golangもフロントエンドも勉強中なので、中途半端な知識で本記事を書いています。なので不適切な記述があれば、優しく教えて頂けると嬉しいです。

はやぶさ
はやぶさ
バックエンドだけでなく、フロントエンドも強くなって、クールなアプリを開発したい!頑張ります!!

以下 オススメ書籍を紹介

]]>
https://cpp-learning.com/gopherjs/feed/ 0 8158
AutoMLライブラリのFLAMLで機械学習モデルの作成を自動化する https://cpp-learning.com/flaml/ https://cpp-learning.com/flaml/#respond Mon, 21 Mar 2022 12:53:58 +0000 https://cpp-learning.com/?p=8110 こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。

今回はAutoMLライブラリのFLAMLを使い、機械学習モデルを自動作成する方法を紹介します。

AutoMLとは

AutoMLとは、Automated Machine Learningの略称で「手動で行っていた機械学習関連のあらゆる作業を自動化すること」を英語でクールに言ったものです。

本サイトで公開しているAutoMLの記事が以下です。

https://cpp-learning.com/optuna-pytorch/

https://cpp-learning.com/tune-sklearn/

https://cpp-learning.com/automl-lale/

本稿はAutoML記事の第4弾になります。

FLAMLとは

FLAMLとは、Microsoft製の高速なAutoMLライブラリ(A Fast Library for Automated Machine Learning & Tuning)です。

特にFastの部分がポイントのようですが、詳細については公式サイトをご確認ください。

実践!FLAMLで機械学習モデルの自動生成

FLAMLで、どれだけ手軽に機械学習モデルを自動生成できるのか実践してみます。

インストール

最初に以下のコマンドで FLAML をインストールします。

pip install flaml

以降からコードを書いていきます。

Import

まずはimportから

import pickle
import numpy as np
import matplotlib.pyplot as plt

from sklearn.manifold import TSNE
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score

# import flaml
from flaml import AutoML
from flaml.data import get_output_from_log
# from ray import tune

【前準備】データセット作成

こちらの記事と同じデータセットを作成します。

# make dataset
x, y = make_classification(
                n_samples=300,
                n_classes=2,
                n_features=5,
                random_state=0
            )

# split dataset (train:test = 7:3)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42)

このコードで作成したデータが下図です(可視化コードは割愛)。

t-SNEで次元圧縮して可視化

上図のデータ(2クラス)を分類するモデルを、FLAMLで自動生成します。

AutoMLの設定

最初に 探索時間、Metric、Task などを設定します。

automl = AutoML()

settings = {
    "time_budget": 30,            # total running time in seconds
    "metric": 'accuracy',         # metric
    "task": 'classification',     # task type
    # "estimator_list": ['rf','lgbm', 'xgboost'],  # list of ML learners
    "log_file_name": 'automl.log',  # log file name
    "log_training_metric": True,  # whether to log training metric
    "seed": 1,                    # random seed
}

estimatorリスト を設定しない場合は、 以下がデフォルト設定(=探索対象)となります。

estimators (task type is classification)
  • lgbm
  • xgboost
  • xgb_limitdepth
  • catboost
  • rf
  • extra_tree
  • lrl1

手動ではツライ「複数の Estimator を比較する作業」を、AutoMLが自動でやってくれるので、「気になる Estimator 2~3個のみを比較したい」などの理由がないなら、デフォルト設定で良いと思います。

FLAMLがサポートしている Metrics Estimators については、以下を参考にしてください。

 学習&探索

scikit-learn 同様、 fit で学習 します。scikit-learn と異なる点は、「Estimator選定」や「ハイパーパラメータ調整」などの探索も fit で完結することです。

automl.fit(X_train=x_train, y_train=y_train, **settings)

[flaml.automl: 03-05 02:47:52] {2068} INFO – task = classification
[flaml.automl: 03-05 02:47:52] {2070} INFO – Data split method: stratified
[flaml.automl: 03-05 02:47:52] {2074} INFO – Evaluation method: cv
[flaml.automl: 03-05 02:47:52] {2155} INFO – Minimizing error metric: 1-accuracy
[flaml.automl: 03-05 02:47:52] {2248} INFO – List of ML learners in AutoML Run: [‘lgbm’, ‘rf’, ‘xgboost’, ‘extra_tree’, ‘xgb_limitdepth’, ‘lrl1’]
[flaml.automl: 03-05 02:47:52] {2501} INFO – iteration 0, current learner lgbm
[flaml.automl: 03-05 02:47:52] {2617} INFO – Estimated sufficient time budget=432s. Estimated necessary time budget=10s.
[flaml.automl: 03-05 02:47:52] {2669} INFO – at 0.1s, estimator lgbm’s best error=0.0619, best estimator lgbm’s best error=0.0619
[flaml.automl: 03-05 02:47:52] {2501} INFO – iteration 1, current learner lgbm
[flaml.automl: 03-05 02:47:52] {2669} INFO – at 0.1s, estimator lgbm’s best error=0.0524, best estimator lgbm’s best error=0.0524
[flaml.automl: 03-05 02:47:52] {2501} INFO – iteration 2, current learner lgbm

(略)

[flaml.automl: 03-05 02:48:20] {2501} INFO – iteration 94, current learner lgbm
[flaml.automl: 03-05 02:48:20] {2669} INFO – at 28.2s, estimator lgbm’s best error=0.0190, best estimator lgbm’s best error=0.0190
[flaml.automl: 03-05 02:48:20] {2501} INFO – iteration 95, current learner extra_tree
[flaml.automl: 03-05 02:48:22] {2669} INFO – at 30.0s, estimator extra_tree’s best error=0.0333, best estimator lgbm’s best error=0.0190
[flaml.automl: 03-05 02:48:22] {2895} INFO – retrain lgbm for 0.0s
[flaml.automl: 03-05 02:48:22] {2900} INFO – retrained model: LGBMClassifier(colsample_bytree=0.5853444225011881, learning_rate=1.0,
max_bin=255, min_child_samples=10, n_estimators=4, num_leaves=5,
reg_alpha=0.04962236929536828, reg_lambda=1.4517932110796898,
verbose=-1)
[flaml.automl: 03-05 02:48:22] {2277} INFO – fit succeeded
[flaml.automl: 03-05 02:48:22] {2279} INFO – Time taken to find the best model: 8.27527928352356
CPU times: user 7.69 s, sys: 591 ms, total: 8.28 s
Wall time: 30 s

設定通りの30秒で学習および探索が終了しました。96回試行した結果、LGBMがベストモデルだったようです。

ベストモデルの確認

以下のコードでベストモデルの情報を確認できます。

print('Best ML leaner:', automl.best_estimator)
print('Best hyperparmeter config:', automl.best_config)
print('Best accuracy on validation data: {0:.4g}'.format(1-automl.best_loss))
print('Training duration of best run: {0:.4g} s'.format(automl.best_config_train_time))

Best ML leaner: lgbm
Best hyperparmeter config: {‘n_estimators’: 4, ‘num_leaves’: 5, ‘min_child_samples’: 10, ‘learning_rate’: 1.0, ‘log_max_bin’: 8, ‘colsample_bytree’: 0.5853444225011881, ‘reg_alpha’: 0.04962236929536828, ‘reg_lambda’: 1.4517932110796898}
Best accuracy on validation data: 0.981
Training duration of best run: 0.0111 s

今回の問題設定なら、ベストモデルを探索するのに 0.0111sec あれば十分だったようです。

はやぶさ
はやぶさ
はえー

AutoML ログ

AutoMLの過程は automl.log に記録されます。以下のコードで可視化もできます。

time_history, best_valid_loss_history, valid_loss_history, config_history, metric_history = \
    get_output_from_log(filename=settings['log_file_name'], time_budget=240)

plt.title('Learning Curve')
plt.xlabel('Wall Clock Time (s)')
plt.ylabel('Validation Accuracy')
plt.scatter(time_history, 1 - np.array(valid_loss_history))
plt.step(time_history, 1 - np.array(best_valid_loss_history), where='post')
plt.show()

FLAMLで機械学習モデルの作成を自動化する

feature importance(特徴量重要度)

以下のコードで feature importance(特徴量重要度)を可視化できます。

plt.barh(
            automl.model.estimator.feature_name_,
            automl.model.estimator.feature_importances_
         )

FLAMLで機械学習モデルの作成を自動化する

今回はダミーデータなので、重要な特徴量を把握した所で、何の旨味はありませんが、特徴量重要度や特徴量選定を重要視するケースもあります(下記参照)

https://cpp-learning.com/sklearn-feature-selection/

推論

scikit-learn 同様に predict で推論 します。

y_pred = automl.predict(x_test)
print('Predicted labels', y_pred)
print('True labels     ', y_test)
# print(y_test-y_pred) # 真値と予測値の差分

Predicted labels [0 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 0 1 1 0 1 0 0 1 1 1 1 1]
True labels          [0 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1]

今回のテストデータの場合、真値と推論結果で異なるのは2か所でした。

モデルの評価

モデルの評価レポート作成には、scikit-learn のAPIを使うのが楽です。

# print precision, recall, f1-score, support
print(classification_report(y_test, y_pred))
print("score:", accuracy_score(y_test, y_pred))

FLAMLで機械学習モデルの作成を自動化する

問題設定が簡単だった可能性もありますが、複数のEstimator のハイパーパラメータをチューニングしながら、ベストモデルの探索が30秒(=設定時間)で完了しました(前述した通り、結果的には 0.0111sec の探索時間で十分だったようですが)。

くるる
くるる
すごい!
はやぶさ
はやぶさ
素敵!!

フクロウも人間も驚きの性能です。AutoML恐るべし、FLAMLすげー。

学習済みモデルの保存

学習済みモデルは、以下のコードで保存できます。

# pickle and save the model
with open('automl.pkl', 'wb') as f:
    pickle.dump(automl, f, pickle.HIGHEST_PROTOCOL)

FLAMLに関係なく、オブジェクトを pickle で保存するのは、よくやる処理です

学習済みモデルの読み込みと推論

先ほど保存した 学習済みモデル:automl.pkl を読み込んで、学習にも評価にも未使用なデータを分類するコードが以下です。

# load pickled model'''
with open('automl.pkl', 'rb') as f:
    my_automl = pickle.load(f)
    
# 適当なデータを作成
my_data = np.array([[1, 2, 3, 4, 5]])

# 推論
my_pred = my_automl.predict(my_data)
print("result:", my_pred)  #  result is 0 or 1

result: [1]

以上で、FLAMLの実践は終了です。

まとめ -FLAMLで機械学習モデルの作成を自動化-

AutoMLライブラリのFLAMLを使い、機械学習モデルを自動作成する方法を紹介しました。

手動ではツライ、機械学習関連の以下の作業を自動化できるのが素敵でした。

  • Estimator選定
  • ハイパーパラメータ調整
  • ベストモデル探索

他のAutoMLライブラリと探索速度を比較したことはありませんが、Fast な印象を受けました。

はやぶさ
はやぶさ
FLAML便利なので、今後も積極的に活用したいと思います
]]>
https://cpp-learning.com/flaml/feed/ 0 8110
機械学習に関する図や資料の作成に役立つツールまとめ https://cpp-learning.com/draw-nn/ https://cpp-learning.com/draw-nn/#respond Sun, 20 Feb 2022 05:41:27 +0000 https://cpp-learning.com/?p=8058 こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。

今回は機械学習に関する図や資料づくりに役立つサンプルやツールを紹介します。

ML Visuals

ML Visuals とは、機械学習コミュニティの健全な発展を支援するために、無償で使える100種類以上の図を公開しているGoogleスライドです。

図をダウンロードして、そのまま使うも良し、編集して使うも良しです。下図のように自由にプレゼン資料やブログに張り付けることができます。

CNNやNNのアーキテクチャ図

機械学習の図
  • NN:Neural Network(ニューラルネットワーク)
  • CNN:Convolutional Neural Network(畳み込みニューラルネットワーク)

自然言語処理

機械学習の図

データセット分割やアンダーフォット、オーバーフィットの図解

機械学習の図

draw.io

draw.io とは、フローチャートやネットワーク図、UML などを描くための高機能作図ツールです。

以下の記事にあるグラフやパイプライン(ワークフロー図)は draw.io で作図しました。

https://cpp-learning.com/pytorch-geometric/

https://cpp-learning.com/automl-lale/

開発体制に合わせて、好きな draw.io を使用して下さい。

NN-SVG

NN-SVGとは、NNやCNNのアーキテクチャ図をインタラクティブに作成できるツールです。機械学習リサーチャーの時短や教育のサポートを目的としたツールなので、無償で使うことができます

オンラインで作成した図はsvgファイルでエクスポートして、そのまま下図のようにWebサイトなどに貼り付けることができます。

NN-SVGで作図したCNN

NN-SVGで描いたCNN

※上図はsvgをjpgに変換してから張り付けています

VSCode + Markdown Preview Enhanced

機械学習アプリなどの README や スライド を Markdown のみで作成するなら、VSCode + Markdown Preview Enhanced がオススメです。

参考までに、以下の記事に関する README やスライドを作成したので、公開します。

https://cpp-learning.com/gradio/

README

以下が作成した”README.md”です。

# ML_SamplePy

"ML_SamplePy" is a tutorial of Deep Learning with Python.

## Demo

You will develop image classification applications.

![](https://cpp-learning.com/wp-content/uploads/2020/07/gradio.png)


## Features

You can develop web applications in `3 minutes` by using [Gradio](https://github.com/gradio-app/gradio).

## Requirement

* python >= 3.7
* gradio

## Installation

Install gradio with pip command.

```bash
pip install gradio
```

## Usage

For more information, please visit  [here](https://cpp-learning.com/gradio/).


## Note

Sample code is tested in `jupyter notebook` (and google colab) .

## Author

* Hayabusa
* R&D Center
* Twitter : https://twitter.com/Cpp_Learning

## License

"ML_SamplePy" is under [MIT license](https://en.wikipedia.org/wiki/MIT_License).

GitHubなどに公開しときのイメージは、以下から確認できます。

README by Using Markdown Preview Enhanced

READMEなにそれ?どうやって書くの?という人は以下の記事を参考にして下さい。

https://cpp-learning.com/readme/

スライド

以下が作成した”Slide.md”です。

---
presentation:
  # プレゼンテーションのテーマ
  # === 使用可能なテーマ ===
  # "beige.css"
  # "black.css"
  # "blood.css"
  # "league.css"
  # "moon.css"
  # "sky.css"
  # "solarized.css"
  # "white.css"
  # "none.css"
  # "night.css"
  # "serif.css"
  # "simple.css"
  theme: night.css

  # プレゼンテーションの「通常の」サイズ、アスペクト比は、
  # プレゼンテーションが異なる解像度に合うように拡大縮小されたときに
  # 保持されます。パーセント単位で指定できます。
  width: 960
  height: 700

  # コンテンツの周りで空のままにしておくべきディスプレイサイズの係数
  margin: 0.1

  # コンテンツに適用できる最小/最大の拡大倍率
  minScale: 0.2
  maxScale: 1.5

  # 右下隅にコントロールを表示
  controls: true

  # プレゼンテーションの進行状況バーを表示する
  progress: true

  # 現在のスライドのページ番号を表示
  slideNumber: true

  # スライドの各変更をブラウザの履歴にプッシュする
  history: false

  # ナビゲーションのキーボードショートカットを有効にする
  keyboard: true

  # スライド概要モードを有効にする
  overview: true

  # スライドの垂直方向の中央揃え
  center: true

  # タッチ入力を備えたデバイスでタッチナビゲーションを有効にする
  touch: true

  # プレゼンテーションをループする
  loop: false

  # 文字方向を右から左(RTL)に変更する
  rtl: false

  # プレゼンテーションが読み込まれるたびにスライドの順序をランダム化する
  shuffle: false

  # フラグメントをグローバルにオン/オフにします
  fragments: true

  # プレゼンテーションが埋め込みモードで実行する、
  # 例: 画面の限られた部分に埋め込む
  embedded: false

  # ?キーが押されたときにヘルプオーバーレイを表示する
  help: true

  # スピーカーノートをすべての視聴者に表示するかどうか
  showNotes: false

  # 次のスライドに自動的に進むまでのミリ秒。
  # 0に設定すると無効になります。
  # この値はスライドのdata-autoslide属性を使用して上書きできます
  autoSlide: 0

  # ユーザー入力後に自動スライドを停止する
  autoSlideStoppable: true

  # マウスホイールによるスライドナビゲーションを有効にする
  mouseWheel: false

  # モバイルデバイスのアドレスバーを非表示にする
  hideAddressBar: true

  # iframeプレビューオーバーレイでリンクを開く
  previewLinks: false

  # 遷移スタイル
  transition: "default" # none/fade/slide/convex/concave/zoom

  # 遷移速度
  transitionSpeed: "default" # default/fast/slow

  # ページ全体のスライドの背景の遷移スタイル
  backgroundTransition: "default" # none/fade/slide/convex/concave/zoom

  # 現在のスライドから表示するスライドの数
  viewDistance: 3

  # 視差背景画像
  parallaxBackgroundImage: "" # 例: "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"

  # 視差背景サイズ
  parallaxBackgroundSize: "" # CSS構文, 例: "2100px 900px" - 現在のところ、Pixelのみサポートされています。(%とautoは使用しないでください)

  # スライドごとに視差背景を移動するピクセル数
  # - 指定されない限り自動的に計算されます
  # - 軸に沿った移動を無効にするには0に設定します
  parallaxBackgroundHorizontal: 200
  parallaxBackgroundVertical: 50

  # スピーカーノートを有効にする
  enableSpeakerNotes: false
---

<!-- slide -->
## ML_SamplePy

"ML_SamplePy" is a tutorial of Deep Learning with Python.

<!-- slide -->
## Demo

You will develop image classification applications.

![](https://cpp-learning.com/wp-content/uploads/2020/07/gradio.png)

<!-- slide -->
## Features

You can develop web applications in `3 minutes` by using [Gradio](https://github.com/gradio-app/gradio).

<!-- slide -->
## Requirement

* python >= 3.7
* gradio

<!-- slide -->
## Installation

Install gradio with pip command.

```bash
pip install gradio
```

<!-- slide -->
## Create DL App -Step 1-

### Import

```python
import gradio as gr
import torch
from torchvision import transforms
import requests
from PIL import Image
```

### Ioad model

```python
model = torch.hub.load('zhanghang1989/ResNeSt', 'resnest50', pretrained=True)
model.eval()

response = requests.get("https://git.io/JJkYN")
labels = response.text.split("\n")
```

<!-- slide -->
## Create DL App -Step 2-

### Predict

```python
def predict(inp):
    inp = Image.fromarray(inp.astype('uint8'), 'RGB')
    inp = transforms.ToTensor()(inp).unsqueeze(0)
    with torch.no_grad():
        prediction = torch.nn.functional.softmax(model(inp)[0], dim=0)
    return {labels[i]: float(prediction[i]) for i in range(1000)}
```

### Make & Run UI

```python
inputs = gr.inputs.Image()
outputs = gr.outputs.Label(num_top_classes=5)
interface = gr.Interface(fn=predict, inputs=inputs, outputs=outputs)

interface.launch()
```

<!-- slide -->
## Usage

For more information, please visit  [here](https://cpp-learning.com/gradio/).

<!-- slide -->
## Note

Sample code is tested in `jupyter notebook` (and google colab) .

<!-- slide -->
## Author

* Hayabusa
* R&D Center
* Twitter : https://twitter.com/Cpp_Learning

<!-- slide -->
## License

"ML_SamplePy" is under [MIT license](https://en.wikipedia.org/wiki/MIT_License).

このコードで作成したスライドの一部が下図です。

Markdown Preview Enhancedで作成したスライド

VSCode + Markdown Preview Enhancedでスライド作成
VSCode + Markdown Preview Enhancedでスライド作成
VSCode + Markdown Preview Enhancedでスライド作成

今回は未使用ですが、PlantUML や Mermaid なども扱えるので、簡単な作図ならコードのみで完結できます。

PlantUMLで作成できる図の例

UML_モデル図

PlantUMLの”UML”って何?という人は以下の記事を参考にしてください。

https://cpp-learning.com/uml/

ツールの使い分け

ケースバイケースですが、ツールの使い分けの例も紹介します。

機械学習に関する資料を作成する場合のツールの使い分け
  1. まずは ML Visuals を確認
  2. 簡単な図は、ML Visuals を参考にしつつ、draw.io で作図
  3. 詳細なCNNやNNの作図には、NN-SVG を使用
  4. コードのみで作図するなら、PlantUML、mermaid などを使用
  5. READMEやスライド作成には、Markdown Preview Enhanced を使用
はやぶさ
はやぶさ
ツールを上手に使って作業効率化を目指しましょう!
]]>
https://cpp-learning.com/draw-nn/feed/ 0 8058