ハッカソン初参戦! 技術力もなく、発想力もないけど、とりあえず挑戦してみる!
明日初めてハッカソンに参加。
今の時点で自分が動かせるコードを見直してみたけど、ほぼ全てコピペだから「ほうほうそうだったな」ぐらいになってしまってるけど大丈夫なのか。。。
明日はとりあえず動くものを作って発表するというところを目標としてやってみる!
デモから考える
動くことを最優先に
買物に対する意識が変わってきた
コロナ前の良くて8割、悪ければ6割ぐらい
必需品は戻ってきているが、大型SCのような休日に買い物にいくようなところは戻って来ていない
休日の買い物=本来の買い物
必要なものを買うのではなく、買い物そのものが楽しいという体験
内製化しようとしていることは少ないし、内製化しているところもうまくいっていないところもある(イオンとか)
ベンダー任せは似たり寄ったり
なぜなら課題解決が優先だから
【楽しさから考える】
アイデアソン
組み合わせて考えていくのって面白い。
でも傾向として自分で出したアイデアに引っ張られがちだなー
それと何かを組み合わせる方向で考えてみよう
ChatGPT面白い
'use strict';
// ########################################
// 初期設定など
// ########################################
// モジュールの読み込み
const line = require('@line/bot-sdk');
const openai = require('openai');
const express = require('express');
const PORT = process.env.PORT || 3000;
// 設定
const config = {
channelSecret: process.env.CHANNEL_SECRET || '●',
channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN || '●',
};
// クライアントの作成
const client = new line.Client(config);
const gptConfig = new openai.Configuration({
organization: process.env.OPENAI_ORGANIZATION || "●",
apiKey: process.env.OPENAI_API_KEY || '●',
});
const gpt = new openai.OpenAIApi(gptConfig);
const makeCompletion = async (userMessage) => {
const prompt = {
role: "system",
content: `## あなたはユーモラスな人です。
## userが「どこ」で「何を」買ったと短い文を送ってきます。
## 伝わるか伝わらないかぐらいに省略し、必ず3文字のアルファベットにして下さい。
## 基本的には頭文字を取る形でいいですが、くすっと笑えるようにして下さい。` // プロンプトを入力
};
userMessage.unshift(prompt);
console.log(userMessage);
return await gpt.createChatCompletion({
model: "gpt-3.5-turbo",
messages: userMessage,
temperature: 0.5,
n: 1
});
};
// メッセージイベントの処理
async function handleEvent(event) {
// テキストメッセージ以外は無視
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
const userMessage = [{
role: "user",
content: event.message.text
}];
// ChatGPT APIにリクエストを送る
try {
const completion = await makeCompletion(userMessage);
// レスポンスから返答を取得
const reply = completion.data.choices[0].message.content;
// ChatGPT APIからの返答を受け取り、テキストメッセージとスタンプを一度に送信
await client.replyMessage(event.replyToken, [
{ type: 'text', text: reply },
{ type: 'sticker', packageId: '789', stickerId: '10865' }
]);
return Promise.resolve(null);
} catch (error) {
// エラーが発生した場合はログに出力
console.error(error);
return Promise.resolve(null);
}
}
const app = express();
app.get('/', (req, res) => res.send('Hello LINE BOT! (HTTP GET)'));
app.post('/webhook', line.middleware(config), (req, res) => {
if (req.body.events.length === 0) {
res.send('Hello LINE BOT! (HTTP POST)');
console.log('検証イベントを受信しました!');
return;
} else {
console.log('受信しました:', req.body.events);
}
Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});
app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);
今のところこのプロンプトが一番面白そう
あなたはユーモラスな人です。\n' +
' ## userが短い文を送ってくるので、3文字のアルファベットにして下さい。\n' +
' ## 基本的には頭文字を取る形でいいですが、伝わるか伝わらないかぐらいでくすっと笑えるようにして下さい。\n' +
' ## また、なぜ?と聞かれたら解説してあげて下さい。'
LINEBot内で送った画像を拡大させたかったけどどうも無理っぽい
GYAZOのサーバーに上げてそこから取ってくる形に変更。
ChatGPTが指示したこと無視するけど、なんならそっちの方が面白かったりするから甘えてみる。
動いた!
画像はAPIで連携させれば拡大出来るかもしれないけど、今の技術じゃ無理!まずは見てもらう事を目的に!
記事の製作に入ります!
よく考えたら休日という概念完全に抜けてたわ!
動画に音楽付ける方法が追い込まれながら分かった。
音楽付くと全然ちがうな
NODE-Red
どんなサービス?分岐が出来る?
MAKE
やっぱりDALL-Eは使えるようになりたいな。
最終できたのはこれ
'use strict';
// ########################################
// 初期設定など
// ########################################
// モジュールの読み込み
const line = require('@line/bot-sdk');
const openai = require('openai');
const express = require('express');
const PORT = process.env.PORT || 3000;
// 設定
const config = {
channelSecret: process.env.CHANNEL_SECRET || '●●●●●●●●●●●●',
channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN || '●●●●●●●●●●●●',
};
// クライアントの作成
const client = new line.Client(config);
const gptConfig = new openai.Configuration({
organization: process.env.OPENAI_ORGANIZATION || "●●●●●●●●●●●●",
apiKey: process.env.OPENAI_API_KEY || '●●●●●●●●●●●●',
});
const gpt = new openai.OpenAIApi(gptConfig);
const makeCompletion = async (userMessage) => {
const prompt = {
role: "system",
content: `## あなたはユーモラスな人です。
## userが「どこ」で「何を」買ったか送ってくるので、「どこでなにを」までを3文字にまとめて下さい。
## くすっと笑えるまとめかたにして、面白い解説も下さい。` // プロンプトを入力
};
userMessage.unshift(prompt);
console.log(userMessage);
return await gpt.createChatCompletion({
model: "gpt-3.5-turbo",
messages: userMessage,
temperature: 0.5,
n: 1
});
};
// 画像メッセージの処理
async function handleImageMessage(event) {
// 画像のURLを指定して送信
const imageUrl = 'https://i.gyazo.com/784ae1f305617baf1bf16d5cedb96809.jpg';
const imageMessage = {
type: 'image',
originalContentUrl: 'https://i.gyazo.com/244d4737c6940ba0f3ef33f85f835533.png',
previewImageUrl: 'https://i.gyazo.com/244d4737c6940ba0f3ef33f85f835533.png'
};
const textMessage = {
type: 'text',
text: `画像が送信されました。\n画像のURL: ${imageUrl}`
};
await client.replyMessage(event.replyToken, [imageMessage, textMessage]);
}
// メッセージイベントの処理
async function handleEvent(event) {
// テキストメッセージ以外は無視
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
const userMessage = [{
role: "user",
content: event.message.text
}];
// ChatGPT APIにリクエストを送る
try {
const completion = await makeCompletion(userMessage);
// レスポンスから返答を取得
const reply = completion.data.choices[0].message.content;
// ChatGPT APIからの返答を受け取り、テキストメッセージとスタンプを一度に送信
await client.replyMessage(event.replyToken, [
{ type: 'text', text: reply },
{ type: 'sticker', packageId: '1070', stickerId: '17849' }
]);
return Promise.resolve(null);
} catch (error) {
// エラーが発生した場合はログに出力
console.error(error);
return Promise.resolve(null);
}
}
const app = express();
app.get('/', (req, res) => res.send('Hello LINE BOT! (HTTP GET)'));
app.post('/webhook', line.middleware(config), (req, res) => {
if (req.body.events.length === 0) {
res.send('Hello LINE BOT! (HTTP POST)');
console.log('検証イベントを受信しました!');
return;
} else {
console.log('受信しました:', req.body.events);
}
Promise.all(req.body.events.map(async (event) => {
if (event.type === 'message') {
if (event.message.type === 'image') {
// 画像メッセージの処理
await handleImageMessage(event);
} else if (event.message.type === 'text') {
// テキストメッセージの処理
await handleEvent(event);
}
}
})).then((result) => res.json(result));
});
app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);
プロトペディアのフォーマットに沿って作ると楽だけど、プレゼンはやりにくい。他人が作ったスライド使って発表しているような感覚。
今回はセルフロープレする時間もなかったから仕方ないか。
やっぱり動画って効果的だな。
確認してなかったけど、僕が発表していたとき、バックミュージックは聞こえていたのだろうか。
アイデアソンコピー