ド素人がプロトタイピングスクールに入ったらどうなったか＆宿題公開

プロトアウトスタジオという、プログラミングスクールではなく、プロトタイピングをアウトプットするというスクールに参加し始めた人の記事です。


下記の記事内容に賛同して、参加してみました。


「プログラミング学習はもう古い。「令和」時代のイノベーションを担う日本初のプロトタイピング専門スクールを開校」
https://prtimes.jp/main/html/rd/p/000000005.000020328.html

「プログラミング学習はもう古い」って言ってしまった件について」
https://note.com/n0bisuke/n/n214f041ee558



私は完全な文系人間です。
元々IT企業の営業職として働いており、営業時代の経験は以下のブログで発信しています。
https://it-sales-note.com/

プログラミングは、ProgateのJavaScriptコースを2周やった程度。
その状態で「プロタイピングできたらもっと仕事に活かせる！」と考えて入学してみました。
（これが甘かった・・・）


そして、「学ぶぞ！」と意気込んで講義に参加したところ


第0回 宿題：APIをつなげる基礎
第1回 講義：LINE Bot
第1回 宿題：LINE Bot+APIで表現してアウトプット


・・・・何が何だか全くわからない。。。。


文系的な例えをすると、
中学校の英語の文法を教科書2周読んだ状態で、
大学の外国語学部に入学して
「英語の文献を読んでそれの感想を英語で書いて英語でディスカッションしましょう」
という講義を選択してしまったような気後れ感・・・

急ぎ勉強する必要があります・・・

ただ、プロトアウトスタジオの考えとしては、
「中身は理解することよりもとにかく形にして世に出すこと」
を重視しているとのことです。

『文法も発音もめちゃくちゃでいいから、とにかく相手に伝わればいい』
という感じでしょうか。


一方でプログラムは正しく書かないと「その文法はエラーだぞ」と
必ず怒られてしまうのが英語と違う怖いところですが・・・



このプロトアウトスタジオですが、
「宿題の内容をSNSで公開せよ、未完成でも失敗作でもいいから全世界へ公開せよ」
という宿題が出ています。
ということでエラーで怒られまくっている醜態をこの記事で公開致します。。。


できていないこと、自分のショボさを強制的に世の中に発信させられるって
普通の人は日常生活では経験しないので精神的にけっこうしんどいのです。


が、「完成度を求めずに素早く世にリリースする」のがプロトタイピング（※）
でもあります。
この修行に早く慣れる必要がありそうです。



※この記事を書きながら、Google Glassのラピッドプロトタイピングを思い出しました。
　Google Glassの最初のバージョンの試作機の作成期間は1日以下だった、という話。
　http://www.aoky.net/articles/tom_chi/rapid_prototyping_google_glass.htm



それでは、下記、宿題への取り組み内容です。
（ここから下は自分でも何をやっているのか全く意味不明です・・・）

-------------------

第0回の宿題「APIをつなげる基礎」で作ったプログラムと、第1回の講義内容で作ったLINE Botプログラムを組み合わせてみたものの、うまく動きませんでした。

ソースコードは下記の通りです。

```server.js
'use strict';

const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;

const config = {
    channelSecret: '', //←ここにはLINEのチャンネルシークレットを入力している
    channelAccessToken: ''//←ここにはLINEのチャンネルアクセストークンを入力している
};

const app = express();

app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない)
app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);
    //ここのif文はdeveloper consoleの"接続確認"用なので後で削除して問題ないです。
    if(req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff'){
        res.send('Hello LINE BOT!(POST)');
        console.log('疎通確認用');
        return; 
    }
    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

const client = new line.Client(config);

function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  //↓↓LINEで入力をもらってからの処理
  let replyText = '';
  let requestText = event.message.text;
  const axios = require('axios');
 
  axios.get(`https://qiita.com/api/v2/tags/${requestText}`)
  .then(function (response) {
    // handle success
    replyText = response;
  });

  //↑↑LINEで入力をもらってからの処理

  return client.replyMessage(event.replyToken, {
    type: 'text',
    text: replyText //実際に返信の言葉を入れる箇所
  });
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);

```

下記のような流れを考えてました。
①event.message.textで取得した値をrequestTextという変数に格納する
②Qiita APIのURL「https://qiita.com/api/v2/tags/xxxxx」の
　xxxxの部分にrequestTextをくっつけてAPIリクエストを投げる
③APIで取得したresonseをreplyTextという変数に格納する
④LINE BotでreplyTextを出力する


が、出力されたエラーは下記です。

```console
PS C:\Users\Desktop\protoout\line-bot> node server.js        
Server running at 3000                                             ot\
[ { type: 'message',
    replyToken: '931af69f9ca94f23a8afb36439e43cbf',                mae
    source:                                                        s:1
     { userId: 'Ud0e928eaf56d8ac9f4091fd3da585c00', type: 'user' },' },                                                                  
    timestamp: 1585227790851,                                      ect
    mode: 'active',                                             } }nct
    message: { type: 'text', id: '11670058670472', text: 'Java'    han } } ]                                                         aile
(node:24648) UnhandledPromiseRejectionWarning: Error: Request f    onsailed with status code 400                                     ne-bdle
    at HTTPClient.wrapError (C:\Users\maeka\Desktop\protoout\li       ne-bot\node_modules\@line\bot-sdk\dist\http.js:83:20)          ers\
    at HTTPClient.instance.interceptors.response.use.err (C:\Us\htters\maeka\Desktop\protoout\line-bot\node_modules\@line\bot-sdk\dist\http.js:19:88)                                            7)  
    at process._tickCallback (internal/process/next_tick.js:68:e re7)                                                             asyn
(node:24648) UnhandledPromiseRejectionWarning: Unhandled promisch we rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a projectmise which was not handled with .catch(). (rejection id: 3)     not
(node:24648) [DEP0018] DeprecationWarning: Unhandled promise ret cojections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

```

URL文字列の作り方が悪いのか、
responseを取得できていないのか、
エラーの切り分けができておりません・・・