【JavaScript】アロー関数わかりづらくない?

バリエーションが多すぎる

アロー関数は括弧、return、代入がそれぞれあったりなかったりと、見るたびに書式が異なります。
この書式が毎回違う(ように見える)ことがわかりづらい理由の気がしたので、アロー関数を構成する要素を整理してみたいと思います。

//以下全部アロー関数
const add = (a ,b) => a + b + 100;

// これもアロー関数
a =>  a + 100;

// このイカみたいな=()=>は何?くコ:彡
const add = () =>{
  let a = 100 + 2;
  console.log(a);
};

// { }が増えてreturnも増えた?
const add = (a) => {
  let result = a + 100;
  console.log(result);
  return result;
};

// ( )多すぎない?
((a, b) => console.log(a + b))(100, 200); 

そもそもアロー関数って何?

アロー関数は通常の関数式を簡潔に書く構文です。
以下がアロー関数の基本です。
アロー関数を代入する変数 = (仮引数) => {いろんな処理};

呼び出すときはこうなります。
アロー関数を代入した変数(引数);

実際に書いてみます。

// 通常の関数
function add(a, b) {
  return a + b + 100;
}
//add を呼び出して戻り値をconsole.logで出力する
console.log(add(1, 2)); // 103


// アロー関数にするとこうなる
const arrow_add = (a, b) => {
  a + b + 100;
};
//arrow_add を呼び出して戻り値をconsole.logで出力する
console.log(arrow_add (1, 2)); //103

()の有無について

アロー関数の引数の( )は、引数が1つの場合に限り省略できます。
引数がない、2個以上の場合は( )は必須になります。

// 通常の関数
function(a){
  return a + 100;
};

// ( )を付けたままのアロー関数
(a) => a + 100;

// 引数が1個ならば( )を省略できる
a => a + 100;

//引数が0個なので( )が必須
() => 100 + 2;

// 引数が2個以上でも( )は必須
(a, b)=> a + b;

// 引数が0個で代入するとイカができる =()=>  くコ:彡
const add = () => 100 + 2;

{ }の有無について

アロー関数が一つの式だけで構成されている場合、関数本体の{ }を省略することができます。

// 式が1つなので{ }を省略できる
a => a + 100;

// { }を書くこともできる
a => {
  a + 100;
};

// 式が複数なので{ }が必要
a => {
  let price = a + 100;
  console.log(price);
};

returnの有無について

rerurnを省略すると最初の式の評価結果が戻り値として返ります。
アロー関数が一つの式だけで構成されている場合、returnを省略することが多いです。

// returnしないと最初の式が戻り値になる
add = a => a + 100;
console.log(add(100)); // 200

// returnした値が戻り値になる
add = a => {
  let price = a + 100;
  price += 100
  return price;
};
console.log(add(100)); // 300

代入の有無について

アロー関数は式の代入をしない場合でも、コールバック関数や即時実行関数として使うことができます。

// 式をaddに代入している
const add = a => a + 100;
console.log(add(100)); // 200

// 即時実行するときは( )で囲んで、引数を入れた( )をつなげる
(a => console.log(a + 100))(100);  //200

// コールバック関数として使う
setTimeout(() => console.log(a + "秒経過しました"), a * 1000);

以上です

アロー関数を構成する要素を一つずつまとめてみました。
最初に書いたバリエーションも一つ一つの要素を見れば意外と難しいことはないように思います。

週報 2023/3/19~2023/3/25 じゃがいもの話

今週の振り返り

先週の週報を忘れていました… 先週&今週はRails系のプラクティスを進め、合間にテストとオブジェクト指向のプラクティスの書籍を進める感じでした。
レビューと提出物ラッシュでなかなか忙しかったです。
オブジェクト指向のプラクティスではOPPの歴史と発展の経緯を知ることでより理解が深まりました。

今週の成果

進めたプラクティス

  • 日報の言及機能を作る
  • テスト技法
  • TDD の基本を理解する
  • test-unit の基本を理解する
  • Railsでテストを書く
  • オブジェクト指向プログラミング

学習時間

累計:797時間

目標達成状況

❌週報を継続する
✅毎日学習を継続する
✅スポーツジムで運動する

来週の目標

  • 週報を継続する
  • 毎日学習を継続する
  • スポーツジムで運動する

    一人ガムトーク

    じゃがいもの話

    去年、じゃがいも植えたんですよね。
    ポテトバッグというものの存在を知って子供と一緒にやってみたんです。
    3月だかに植えて、毎日水やって、7月末ごろに収穫。
    ついでにミニトマトと紫蘇も植えたりしてプチ家庭菜園を楽しんでたんです。
    しかし、全滅とまではいかないもののかなり残念な結果でした。
    去年の夏はとにかく暑すぎたんですよね。トマトは実が全部割れたり黄変したりしてしまいました。
    じゃがいもは暑さでダメになりそうだったので少し日陰に入れていたんですが、今度は日当たりが良くなかったせいか、実は出来ていたんですが全部ミニトマトサイズでした。
    あんまり小さいと毒がある可能性もあるらしいので食べることもできず。
    唯一紫蘇だけはわさわさ生えたんでそれはまぁ良かったけど、やっぱり実がなるもので成功したいんですよねー。
    今年はトマト再チャレンジしたいです。(じゃがいもはもういいかな・・・)

以上、じゃがいもの話でした。

privateなメソッドは何故テストしないのか?

自動テストについて学ぶ

Fjord Boot Campで自動テストのプラクティスに入りました。
過去の質問の中に、『privateなメソッドは何故テストしないのか?』という質問がありました。
結構発展的なトピックだと思うのですが、自分の中ではすんなり理解できた気がしました。
というのも、最近"単体テストの考え方/使い方"という本を読み進めていて、テストするべき対象について学んでいたからです。

なので、"privateなメソッドは何故テストしないのか"について、質問の回答も踏まえて自分なりに説明してみたいと思います。

そもそもテストの対象じゃないから

まず、テストの対象とするべきなのは外から見た振る舞いであり、実装の詳細ではありません。
実装の詳細をテストするようになると、テストが壊れやすくなります。
壊れやすいテストはプロジェクトが大きくなるほど重荷になり、やがて放置され、テスト自体が形骸化するような事態にまで発展してしまう可能性があります。

実装がおかしい可能性が高いから

実装の詳細であるはずのコードをテストしたいと感じるときは、そもそも実装の仕方に問題がある可能性が高いです。
例えば、外からアクセスする必要があるならそれはpublicにする必要があるし、privateなメソッドがテストしなくちゃならないほど重要な機能を担っているなら、クラスとして切り出してテストするべきということです。

publicなメソッドのテストで足りるはずだから

本来のテスト対象であるpublicなメソッドのテストが十分に行われていれば、privateなメソッドを使っている部分のテストも同時に済んでいるはずです。
そうでない、ということならば見直すべきはpublicなメソッドのテストの方かもしれません。

以上です

「慣習的にやらないことになっているから」という説明もありましたが、何故そのような慣習になっているかを知ることが大切なんじゃないかと思いました。
一番のポイントはテストするべき対象は外から見た振る舞いの部分ってことだと思います。

週報 2023/3/5~2023/3/11 の話

今週の振り返り

引き続きRailsのプラクティスを進めています。
ひたすら手を動かしていられるので楽しいです。
各プラクティスで1つくらい難解な部分がありますが、bingを活用するようになって学習効率が劇的によくなりました。
bingで検索すると正確な情報と情報源のwebページが取得できるので普通にGoogle使うよりも早いです。
AIが間違った情報を出してくることもあるので情報の精査は必要ですが、世の中がAIでどんどん便利になっていくのを感じます。

今週の成果

進めたプラクティス

  • devise を使ってユーザー認証を実装する
  • ActiveStorage で画像アップロードを実装する
  • コメントを付けられるようにする
  • 日報の言及機能を作る

学習時間

今週:42時間
累計:750時間

目標達成状況

✅週報を継続する
✅毎日学習を継続する
✅スポーツジムで運動する

来週の目標

  • 週報を継続する
  • 毎日学習を継続する
  • スポーツジムで運動する

一人ガムトーク

もしもの話

もしも魔法が存在したら、なんてことを考えたことがあります。
魔法って登場するストーリーにもよりますけど、魔力が必要とか精霊と契約すると使えるとか、なんだかんだ制約があって万能ではないですよね。
現実に魔法が出てきたら魔法学とか魔法の研究者みたいな存在もいたりして、ちゃんと理論だったものもあるんじゃないかと思うんですよ。
けがを治す魔法だったら細胞を活性化させるのか、時間を巻き戻すのかみたいなロジックがあると思うし、炎の魔法なら空気を可燃性のガスに分解してから魔力(魔法的なエネルギー)を電気エネルギーに変換して着火するみたいな、アルゴリズムがあるんじゃないかなぁと想像してます。
で、そういう考え方をすると魔法とプログラミングは似てるんじゃないの?と思うんですよね。
OSという精霊の下で、電気エネルギーをマシンパワーに変換して、CPUという杖を使い、人知を超える力を発揮させるみたいな。
魔法を理屈のわからない不思議な力って捉えるならば、最近のAIなんて一般人から見たらもはや魔法じみてきてますよね。
スマホだって大昔の人からしたら十分魔法ですし、AIだってちょっと前までSFの世界の話でした。
だんだん現実のテクノロジーがファンタジーの世界に近づいている気がして、大変わくわくします。
魔法が使えるようになりたいとまでは言わないけど、人間の寿命がもっと延びて、自分たちで2100年のテクノロジーを享受できたら嬉しいなぁと思います。

以上、もしもの話でした。

WhisperでYoutube動画を文字起こしして、Chat-GPTで要約してみた

はじめに

この記事はやってみた感想がメインの記事です。
AI使ってこんなことができるのね~というのが主題なので、技術的な話、特にやり方に深く言及するものではありません。

背景

最近ChatGPTが熱いですね!
というか画像生成AIもガンガン進化してますし、AI界隈が今まさに産業革命を起こそうとしています。
私もbing AIがあまりにも便利なのでGoogle検索の頻度が激減しています。
プログラミングに関する話題もbingに聞いて、情報の正しさをGoogleで確かめるような使い方になってきました。
そんな中で先日、ChatGPTとWhisperのAPIが公開されました。
OpenAI、安価な新APIで事業拡大へ? その先の野望とは | ギズモード・ジャパン
お値段もとってもリーズナブルになったので、私もAPI使ってみたいなぁと思い、Whisper+ChatGPTでYouTubeの動画を要約してみました。

ChatGPTって?

ChatGPTは、OpenAIによって開発された自然言語生成モデルです。GPTは「Generative Pretrained Transformer」の略で、大量のテキストデータを学習して、人間のような文章を生成することができます。ChatGPTは、特に会話形式のテキストに特化しており、チャットボットなどに使用されます。

ということです。
実はこの文章もAIに説明してもらったものです。
「ChatGPTを知らない人にもわかりやすく説明してください」という入力に対しての出力が上の文章になったんですね。
このようにChatGPTはユーザーが普段使う言語で要求した内容に対してテキストで答えることができます。
以前からAPIは公開されていたのですが、価格的な問題がありました。
今回新APIが公開されたことで個人のプログラムの中にこの機能を取り入れることが現実的になりました。

Whisperって?

Whisperは、OpenAIが文字起こしサービスとして公開した無料の音声認識モデルです。Webから収集した68万時間分の多言語音声データを教師付きデータで学習させており、高い精度で入力した音声を文字起こしすることが可能になっています。

こちらもAI製文章です。
入力した人間の発言を文章に直してくれるわけです。
私が試したところGladiaのAPIを通すと30分の動画の音声が1分かからないくらいで文字に変換されました。
人間はせいぜい1.5倍速動画の文字起こしくらいしかできませんので、革命的な速さと言えます。漢字の誤字などは多少存在しますが、精度もかなり高いように感じました。

やってみる

実際にやってみます。
作業の流れとしてはこんな感じになります。

  1. Paper space gradientでノートブックを作る
  2. Youtubeの動画から音声をダウンロードする
  3. Whisperを使って文章化する
  4. DeepLを使って文章を英語化する
  5. ChatGPTに文章と命令を与える
  6. ChatGPTの回答をDeepLで日本語に直す

補足

結果

あなたは、今後6ヶ月間の生産計画を作成することができます。動物のデザイン数を増やす、季節限定アイテムを作る、セットやバンドル商品を導入するなど、月ごとに目標を設定することができます。また、認知度を高めて新しい顧客を獲得するために、マーケティングやプロモーションに時間を割くことができます。ブランド構築に注力し、ハンドメイドアイテムを他と差別化する独自のスタイルを確立することが大切です。時間と労力はかかりますが、根気よく続けることで、ハンドメイドで月収10万円という目標を達成することができます。'

動画の内容と照らし合わせると「だいたい合ってる」という感じの印象を受けます。
しかし、具体的な数字の話や質問者さんへのリスペクトなど、何かうまみ成分が大きく抜け落ちているような印象を感じました。
この辺はプロンプト(命令)を改善することで良くなるかもしれませんが、動画に含まれる人間の感情や情熱をWhisperの文章化だけで表現するのは難しいかもしれません。
ですが、議事録の要約やざっくりニュースを知りたいなどの用途でなら十分に活用できる可能性を感じました。

アドバイザーとしてのChatGPTの能力は?

今回対象にした動画はハンドメイドについての質問に対してアドバイザーである和田まおさん(神)が回答しているという内容です。 ではChatGPTに相談者と同じ質問をしたらどんなアドバイスをしてくれるのでしょう?実際にやってみました。

こんにちわ(^^)vハンドメイド製品の売り上げが伸び悩んでいるとのこと、残念ですね。まず、売上が低いからと言って、自分には才能がないのではと落胆しないでください。特にハンドメイドのような競争の激しい市場では、ビジネスを成功させるためには時間と努力が必要です。ここでは、より多くの人に知ってもらい、売上を伸ばすためのヒントをいくつか紹介します。
InstagramFacebookTwitterなどのソーシャルメディアプラットフォームを通じて、ショップや商品のプロモーションを検討しましょう。魅力的で目を引く投稿を作成し、ターゲットオーディエンスを惹きつける関連ハッシュタグを使用します。これは、あなたの個人的なネットワーク以外の潜在的な顧客にもアプローチするのに役立ちます。
「注目商品」や「セール品」など、minneの機能を活用する。これらの機能は、あなたの商品をより多くの潜在的な購入者の目に触れさせることができます。商品ラインアップの充実に力を入れる。動物が売れていないのであれば、違う客層にアピールできそうな新商品を作るなどして、商品の多様化を図りましょう。また、動物が売れていない理由を特定し、改善策を見つけるのもよいでしょう。例えば、よりユニークなデザインにしたり、カラーバリエーションを増やしたりするのもよいでしょう。
最後に、忍耐強く、粘り強く努力することです。半年という時間は、繁盛するビジネスを確立するために必要な時間ではありません。努力を続け、顧客や友人からのフィードバックを求めて、ビジネスの改善と成長に役立てましょう。これらのヒントが役立つことを願っています。そして、あなたのハンドメイドビジネスの旅の成功を祈っています。

まぁまぁいいこと言ってるじゃん?とぱっと見で思いますが、minneにユーザーが自発的に動かせる注目商品機能とかセール品機能ってないですよね。
そして何より言ってることが薄っぺらい!具体性がない!
ユニークなデザインにしたりカラーバリエーションを増やすなんてのはみんな当たり前にやってるんだよ!
でも売れないから、わからないからもがき苦しんで、そんな中で日々何かを生み出す小さな喜びを握りしめて、ハンドメイドが止められないでいるんだよぉぉ!
うおぉぉぉぉぉ!!!

まとめ

熱くなってしまいましたが、ChatGPTさんはハンドメイドについて詳しい知識がないから当たり障りのないことしか言えないんですよね。
対して元動画を見ると汎用AIじゃ到底出せないようなデータや経験に基づいたアドバイスがじゃぶじゃぶ出てくるんです。やはり神。
でもChatGPTに新たにハンドメイドに関するいろはを学習させてあげればもっと精度の高い的を得た回答が出てくるのも確かです。仏教を学んだ仏AIなんてのも登場しています。 HOTOKE AI - Mechanical Buddha equipped with gpt-3.5-turbo is here to assist you with your inquiries.

今月中には次世代モデルGPT-4が発表されるという話もありますし、AIの進化速度は凄まじいです。まだまだ目が離せない状態が続くんじゃないでしょうか。

週報 2023/2/26~2023/3/4 先生の話

今週の振り返り

今週からRailsのプラクティスに入りました。
Railsのプラクティスは結構細かく区切られているのと、以前Railsチュートリアルをやっていたこともあり、だいぶ進めやすかったです。
deviseは今回初めて触ったのですが、認証があまりにも簡単に完成して驚きました。
ライブラリを知っているかどうかで作業効率が全然違うなと感じました。

今週の成果

進めたプラクティス

  • Railsの基本を理解する
  • Railsi18nを理解する
  • kaminari を使ってページング処理を実装する
  • devise を使ってユーザー認証を実装する

学習時間

今週:33時間
累計:708時間

目標達成状況

✅週報を継続する
✅毎日学習を継続する
✅スポーツジムで運動する

来週の目標

  • 週報を継続する
  • 毎日学習を継続する
  • スポーツジムで運動する

一人ガムトーク

先生の話

正直、先生という存在にポジティブな感情を持ったことがあまりないです。
変な先生にばっかり当たってきた気がします。
小学校では何故か子供に嘘ばかり教える先生にあたったり、中学校ではあまりにも言動が変なので途中でクビになり、それでも出勤してきたため警察沙汰になった先生だったり。
周りの先生もそれらを遠巻きに見ているだけだったのでやはり印象が良くないです。
そんな中でも唯一尊敬できたのが中学で1年間だけお世話になった先生でした。
ちょっと熱血入ってる男の先生でしたが、生徒の話を一生懸命に聞き、子供扱いせずに応えてくれるとてもいい先生だなと感じていました。
ある時、学校に不審者が入ってきたことがあったのですが、その先生が竹刀を持ってものすごいスピードで走っていき、毅然とした態度で対応していました。
幸いけが人も出ず、不審者も警察に引き取られ無事に終わったのですが、やはり生徒たちの間で「先生かっこよかったな」と話題に上がっていました。
中学の友人から聞いた話ではその後教頭職に就いたということで、さすがだな~と思っていたのですが、現在は校長先生として働いているそうで、立派な人はふさわしい立場についているのだなぁと感心しきりです。
いつかどこかで会うことがあればまたお話を聞きたいと思う、唯一の先生かもしれません。

以上、先生の話でした。

週報 2023/2/19~2023/2/25 楽器の話

今週の振り返り

今週は風邪を引いてしまい最低限のことしかできませんでした。
そんな中でもなんとかSinatraのプラクティスが完了しました。
次はSinatraラクティスで作ったアプリをDBに対応させるのですが、こちらは現在レビュー待ち。
空いている時間は"単体テストの考え方/使い方"を引き続き読み進めています。

今週の成果

進めたプラクティス

  • Sinatra を使ってWebアプリケーションの基本を理解する
  • WebアプリからのDB利用

学習時間

今週:15時間
累計:675時間

目標達成状況

✅週報を継続する
✅毎日学習を継続する
❌スポーツジムで運動する

来週の目標

  • 週報を継続する
  • 毎日学習を継続する
  • スポーツジムで運動する

一人ガムトーク

楽器の話

さほど上手ってわけでもないんですが、一応ギターが弾けます。
というのも学生の頃バンドを組んでいて、ギターとボーカルをやらせてもらっていました。
ギターソロとかはほとんどギターのメンバーがやっていたので私はコードをジャンジャカ弾くだけ。なのでやってた年月のわりに大して成長もしなかったんですよね。
社会人になってからはすっかり弾かなくなり、愛用のギターは実家の押し入れに眠っています。
この前ふと思いついて実家でギター探したんですが、エレキギターは残ってたもののアコギとアンプはいつの間にか捨てられちゃっていました。
青春の思い出だったのになーとちょっとしょんぼりしました。
とはいえ自宅に持って帰るのは嫌なのでまぁ捨ててもらって正解だったかも・・・ 以上、楽器の話でした(オチがなくてごめんなさい!)