Plastic Love – 竹内まりや 歌詞翻譯

作詞:竹内まりや 作曲:竹内まりや

突然のキスや熱いまなざしで
恋のプログラムを狂わせないでね
出逢いと別れ上手に打ち込んで
時間がくれば終わる don’t hurry!

別用突然地親吻或熱烈地凝視
讓我們的戀愛遊戲(程式)走火入魔誒
熟練地輸入相遇與分手
時間到了就結束 don’t hurry!

愛に傷ついたあの日からずっと
昼と夜が逆の暮らしを続けて
はやりの disco で踊り明かすうちに
おぼえた魔術なのよ I’m sorry!

被愛傷透了心的那天開始
一直持續著晝夜顛倒的日子
這是我在流行的Disco舞廳
跳舞跳到天亮時學到的魔法喔 I’m sorry!

私のことを決して本気で愛さないで
恋なんてただのゲーム
楽しめばそれでいいの
閉ざした心を飾る
派手なドレスも靴も 孤独な友だち

絕對不要真的愛上我
愛情什麼的只是遊戲
只要享受就好
用華麗的衣服跟鞋子裝飾我關上的心門
他們都是陪伴我孤單的好夥伴

私を誘う人は皮肉なものね
いつも彼に似てるわ
なぜか思い出と重なり合う
グラスを落として急に涙ぐんでも
わけは尋ねないでね

約我的人總是很諷刺
很像他(已經分手的那個他)
我不知為何把記憶重疊了
手中的玻璃杯掉落,我突然流下眼淚
但拜託不要問我為什麼

夜更けの高速で眠りにつくころ
ハロゲンライトだけ妖しく(あやしく)輝く
氷のように冷たい女だと
ささやく声がしても don’t worry!

在深夜的高速公路上快睡著的時候
只有鹵素燈魅惑人心地亮著
即使被用耳語說著「你真是個跟冰一樣冷的女子」也 don’t worry!

I’m just playing games
I know that’s plastic love
Dance to the plastic beat
Another morning comes

我只是在玩一個遊戲
我知道那是速食戀愛(雖然「速食戀愛」老派已經是死語了,但我一時想不到更好的)
跳著這個沒感情的節奏
迎接另一個早晨

I’m just playing games
I know that’s plastic love
Dance to the plastic beat
Another morning comes

我只是在玩一個遊戲
我知道那是速食戀愛
跳著這個沒感情的節奏
迎接另一個早晨

I’m just playing games
I know that’s plastic love
Dance to the plastic beat
Another morning comes

我只是在玩一個遊戲
我知道那是速食戀愛
跳著這個沒感情的節奏
迎接另一個早晨

「跟拍到你家」海外版插曲 『Home』- エイティア 歌詞翻譯

作詞:Ryu Matsuyama     作曲:maigoishi

Always worried about your future
And nothing goes right these days
Always searching for excuses
Only trying hard to be praised

總是擔心你的未來
最近沒有一件順心的事
總是在找藉口
只為了贏得稱讚而努力

You’re not the only one
Don’t be full of yourself
Let myself understand
All your happiness and pains
This is not a farewell
But a start of a new day

你不是一個人
不要自以為是
讓我理解
你所有的快樂與痛苦
這不是告別
而是嶄新的一天的開始

To our home sweet home
To our warm sweet home
To our hope to our road
To our warm sweet home
To our home sweet home
To our warm sweet home
To our hope to our road
To our warm sweet home

回到我們甜蜜的家
回到我們溫暖甜蜜的家
為了我們的希望與前進的道路
回到我們溫暖甜蜜的家
回到我們甜蜜的家
回到我們溫暖甜蜜的家
為了我們的希望與前進的道路
回到我們溫暖甜蜜的家

Always regretting your choices
And still thinking that nothing goes right
Always taking it all on yourself
Why do you think that nobody is on your side

總是在後悔你的決定
且還在想沒有做好任何一件事
你總是把所有事情攬在自己身上
你為什麼覺得沒有人站在你這邊

You’re not the only one
Don’t be full of yourself
Let myself understand
All your clamors and complaints
This is not a farewell
But a start of a new day

你不是一個人
不要自以為是
讓我理解
你所有的叫喊與抱怨
這不是告別
而是嶄新的一天的開始

To our home sweet home
To our warm sweet home
To our hope to our road
To our warm sweet home
To our home sweet home
To our warm sweet home
To our hope to our road
To our warm sweet home

回到我們甜蜜的家
回到我們溫暖甜蜜的家
為了我們的希望與前進的道路
回到我們溫暖甜蜜的家
回到我們甜蜜的家
回到我們溫暖甜蜜的家
為了我們的希望與前進的道路
回到我們溫暖甜蜜的家

Line Bot 串接 OpenAI API

最近很紅的ChatGPT,如果也能在Line上面使用的話,是不是感覺更方便呢?我們就來串接ChatGPT的開發公司OpenAI提供的API到Line Bot上吧!

這個範例會用Express起一個web server,建立一個method POST且path為/webhook的route作為line的webhook,用來接收line傳來的events

首先你需要先到 Line developers console 點選「Create a new channel」建立一個新的Channel,類型選擇「Messaging API」。填寫完成送出後進入Channel設定頁,複製最下方的「Channel secret」。回到上方選擇「Messaging API」頁籤,複製最下方的「Channel access token」。

用NPM安裝 openai, @line/bot-sdk, express,require進檔案中

const { Configuration, OpenAIApi } = require('openai')
const line = require('@line/bot-sdk')
const express = require('express')

建立Line API需要的Config,將剛剛Line Channel的Token跟Secret填入,範例以環境變數帶入。

// line config
const lineConfig = {
  channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN,
  channelSecret: process.env.CHANNEL_SECRET
}

建立express,設定line bot所需的webhook路由以及訊息事件的handler。將程式碼上到主機上後,就可以繼續完成Line Bot的設定了。

const app = express()

// line webhook
app.post('/webhook', line.middleware(lineConfig), (req, res) => {
  Promise
    .all(req.body.events.map(lineEventHandler))
    .then((result) => res.json(result))
    .catch((err) => {
      console.error(err)
      res.status(500).end()
    })
})

// line message handler
function lineEventHandler (event) {
  const lineClient = new line.Client(lineConfig)

  return lineClient.replyMessage(event.replyToken, {
    type: 'text',
    text: 'Bot收到訊息囉'
  })
}

app.listen(3000)

Line developers console 選取剛剛新增的Channel,點選「Messaging API」頁簽,在下方的「Webhook URL」點選「edit」,填入你的Webhook網址並按下「Update」,完成後按下「Verify」,就可以檢查webhook有沒有正常運作了。

接下來首先要到OpenAI 註冊你的帳號,註冊完後,到API Keys頁面,點選「Create new secret key」,複製API Key,回到程式碼,建立OpenAI API需要的Config填入剛剛的API Key,範例以環境變數帶入。

const openAiConfig = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
})

新增一個function負責傳遞訊息給OpenAI API,並等待回傳的訊息。

async function askOpenAI (question) {
  const openai = new OpenAIApi(openAiConfig)

  // request
  try {
    // 使用text-davinci-003 model
    // const completion = await openai.createCompletion({
    //   model: 'text-davinci-003', // 看你要使用哪個model: https://platform.openai.com/docs/models
    //   max_tokens: 100,
    //   prompt: question,
    //   temperature: 0.1 // 這是一個 0 - 1 的數值,越靠近1回答會更多樣性,越靠近0回答會更可靠
    // })
    // return completion.data.choices[0].text.replace(/^\n+/g, '')

    // 使用gpt-3.5-turbo model (這個比較強)
    const completion = await openai.createChatCompletion({
      model: 'gpt-3.5-turbo',
      messages: [{ role: 'user', content: question }]
    })
    return completion.data.choices[0].message.content.replace(/^\n+/g, '')
  } catch (err) {
    console.log(err)
    return '抱歉我不知道'
  }
}

將剛剛的Handler function改成這樣,注意function的前面有加上了 async

async function lineEventHandler (event) {
  const lineClient = new line.Client(lineConfig)

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

  const result = await askOpenAI(event.message.text)
  // 將OpenAI回的訊息傳給使用者
  return lineClient.replyMessage(event.replyToken, {
    type: 'text',
    text: result
  })
}

最後,因為我不想讓他每次都回我,尤其是如果將他加入群聊的時候,可能會很吵,因此我在Handler中再加入了一個判斷

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

// 改為

  if (event.type !== 'message' || event.message.type !== 'text' || !event.message.text.includes('村長')) {
    return Promise.resolve(null)
  }

這樣子的話,就只有訊息中包含了村長兩個字時,才會將訊息傳給OpenAI等回應。

MySQL 筆記

新增使用者

mysql> CREATE USER 'user_name'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';

移除使用者

mysql> DROP USER 'user_name'@'localhost'

修改使用者密碼

mysql> ALTER USER 'user_name'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';

查看使用者權限

mysql> SHOW grants for 'user_name'@'localhost';

授權使用者權限

#針對某資料庫開部分權限
maysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE ON db_name.*(or table_name) TO 'user_name'@'localhost';

#針對某資料庫開所有權限
maysql> GRANT ALL PRIVILEGES ON db_name.*(or table_name) TO 'user_name'@'localhost';

#針對所有資料庫開所有權限
maysql> GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'localhost';

重整關於權限的資料表

mysql> flush privileges;

Ubuntu ssh 安全性設定

起一台新的機器後,為了確保機器基本上有一定的安全性,我們可以在ssh登入這個環節加入一些門檻,增加登入的難度。

預計要做的設定有:更改ssh port號 -> 更改登入帳號 -> 關閉root登入 -> 關閉密碼登入

更改ssh port號

就像改門牌地址一樣,當對方不知道門牌地址時,就要一個一個門鈴去按按看,才知道要找的人住在哪間。當不知到ssh port號,要暴力登入時,就必須要一個一個port去試。

打開並修改ssh config:sudo vim /etc/ssh/sshd_config

找到 #Port 22,移除開頭的「#」號,把後面22改成想要的port號即可(列出使用中的port號 ss -tulpn | grep LISTEN 沒有列出的都可以用)。另外還可以新增 Protocol 2,使用更安全的ver2協定。修改完成後要重啟ssh服務:sudo systemctl restart ssh

重要:如果ufw防火牆有開的話(可以用 sudo ufw status 來檢查是否有開)記得要加上新的rule:sudo ufw allow <new ssh port>

更改登入帳號

首先先用 adduser <user name> 新增使用者名稱。room number, work phone, home phone, other 為選填。接著允許使用者使用sudo指令 usermod -aG sudo <user name>。再次打開剛剛ssh config文件 sudo vim /etc/ssh/sshd_config,新增一行 AllowUsers <user name>,修改完成後要重啟ssh服務:sudo systemctl restart ssh

關閉root登入

一樣打開ssh config sudo vim /etc/ssh/sshd_config,找到PermitRootLogin yes,改成no,修改完成後要重啟ssh服務:sudo systemctl restart ssh

關閉ssh密碼登入

這一步要介紹如何關閉密碼登入,只使用ssh key登入。只使用ssh key登入的好處是不會被try密碼,也省去打密碼的不便。不過,當不是使用自己的裝置登入,或是需要新增一台裝置時,稍微有點麻煩。

但這個步驟要小心一點,未測試完成前,請勿關閉console。若不慎無法登入時,可以試試看vps管理介面中的console功能來進入主機。

首先為剛剛新建立的新使用者,新增 /home/<user name>/.ssh 目錄,在這個目錄中新增 authorized_keys 檔案。authorized_keys中要填入要登入的機器的ssh key,長得像這樣:ssh-rsa AAAC4SDFasdfsdfsdfAAAA/xfvdfevvf.......sdfsdf= xxx@macbook.office

在要登入的電腦上用command line輸入 ssh-keygen,來產生ssh key。完成後輸入 cat ~/.ssh/id_rsa.pub 顯示key並將他複製起來。打開剛剛主機上的authorized_keys檔案,貼上key,多筆則用斷行來分開。

一樣打開ssh config sudo vim /etc/ssh/sshd_config,修改 PasswordAuthentication yesno,然後再重啟ssh服務:sudo systemctl restart ssh

更多保護措施

上面提到的ufw如果沒開的話,建議可以開一下,指令也相當簡單直覺。記得新增所需要的rules。另外,建議可以安裝fail2ban,若有人一直重複在嘗試登入,就會被暫時擋起來。