2018年12月30日 星期日

k8s mongo stateful

type :LoadBalancer 可連外,但無法使用 cvallance/mongo-k8s-sidecar cvallance/mongo-k8s-sidecar

2018年12月20日 星期四

解 下載檔預設是gz


const request = require('request');
const zlib = require('zlib');
const concat = require('concat-stream');

const check_place_list = () => {
return new Promise(async (resolve, reject) => {
request("https://tcgbusfs.blob.core.windows.net/blobtcmsv/TCMSV_allavailable.gz")
.pipe(zlib.createGunzip())
.pipe(concat((stringBuffer: any) => {
// console.log(stringBuffer.toString());

}));
})
}

2018年12月17日 星期一

k8s 小工具

kubectl run -i --tty alpine --image=alpine --restart=Never -- sh
kubectl exec -ti alpine /bin/sh
apk add --no-cache curl

外部curl
kubectl run example -i -t --rm --restart=Never --image centos:7 -- curl -s http://ipinfo.io/ip


開mongo image
kubectl run -it --rm --restart=Never mongo-cli --image=mongo --command -- /bin/bash
root@mongo-cli:/# mongo "mongodb://mongo-0.mongo.db,mongo-1.mongo.db,mongo-2.mongo.db:27017/test"

2018年11月12日 星期一

gke k8s 筆記

https://cloud.google.com/sdk/gcloud/reference/config/set
設定 porject  跟 zone 才能抓到 叢集
To set the project property in the core section, run:
$ gcloud config set project myProject
To set the zone property in the compute section, run:
$ gcloud config set compute/zone asia-east1-b



2018年9月21日 星期五

Voice App 2018展望

smart speaker今夾應該是起點,
其實大家都是猜。

市面上smart speaker 百花齊放的,
最終比的還是 語音的辨識率,
而語音辨識率最終還是得來自語音辨識資料的大數據,
在這一點上,
我實在是不知道,
其他家要怎麼跟,
android(Google) iphone(mac)比,
而homepod(mac)的定價也實在是...


Google assistant 自已內部的sdk 居然就有兩版  Actions on Google v2 Alpha and Dialogflow Fulfillment Beta 好傻眼。
https://matthewayne.com/post/actions-on-google-v2-alpha-dialogflow-fullfillment-beta/
不過跟據diagflow的coder所撰寫的本文表示,
用dialogflow就對了,因為dialogflow會支援google assistant完整之外,還可以支援一堆平台,

雖然發現本篇是我在看actions on google之後,再度傻眼。
不過作者有清楚表達 actions on google 這個sdk之所以持續存在,主要是這個sdk 才是對google assistant 支援最完整的。

因為目前smart speaker 百花齊放的,
1.以未來性google home比較有機會
2.對平台有最大限度的支援
所以目前還是選dialogflow的sdk比較穩妥

但當 google home 打下江山之後,完整支援的actions on google會是好的選擇

不過當我看完 dialogflow 怎麼取 permission 時,我又變心了,因為它目前是用 http request 來取,也太麻煩了。

結論:
如果webhock要支不同的平台,例如 google assistant ; aws alxea ; line clova 等,
firebase cloud function 還是得依照不同平台來做設計,才會有完整的體驗。
例如 google home 就用 actions-on-google 其他的用 diagflow-fullfillment


2018年6月1日 星期五

google cloud storage + google Load balancing + google cloud dns + google cloud cdn + Letsencrypt free ssl cert

前言:
因為我的AWS到期了,我很多站要搬家,我的GCP 有credits 還沒用完,故決定搬到 GCP

問題點:
firebase hosting 有送 ssl ,網頁直接丟 public 就搞定了,原本是最理想的方案,結果,他一個專案只能有一個 public;而一個billing account 只能連 5 個 project,而我有很多站...]

解決方案:
1.function 的部份直接用 google cloud function  或 firebase function 處理

2.靜態網頁的部分,
google cloud storage 的bucket 可以直接在 dns 設定裡加 cname => www / c.storage.googleapis.com  => bucket: http://storage.googleapis.com/www.example.com/
就直接對應上去了。
https://jerrynest.io/cloud-storage-static-web/

but
https
就得靠
 google Load balancing  + google cloud dns + google cloud cdn

https://console.cloud.google.com/net-services/loadbalancing/

先去申請一個免費的ssl
https://www.sslforfree.com/
https://cloud.google.com/compute/docs/load-balancing/tcp-ssl/
直接申請https那個就好了。

2018年5月18日 星期五

web push 完整教學

https://thihara.github.io/Web-Push/

2018年3月22日 星期四

aws lambda 只有isomorphic-fetch傳上去可以正常跑出來

'use strict';

const fetch = require('isomorphic-fetch');


module.exports.hello = (event, context, callback) => {

fetch('https://xxxx/graphql', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
query: `
{
}
` }),
})
.then(res => res.json())
.then(res => console.log(res.data));
const response = {
statusCode: 200,
body: JSON.stringify({
message: 'Go Serverless v1.0! Your function executed successfully!',
input: event,
}),
};

callback(null, response);

// Use this code if you don't use the http event with the LAMBDA-PROXY integration
// callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });
};

2018年3月17日 星期六

serverless 開資源只會跑第一次

serverless 開資源只會跑第一次

2018年3月16日 星期五

chatbot的未來在車用系統

現在的chatbot應用平台(line fb messenger telegram slack....),根本無法讓chatb ot作良好的應用。
在有眼有手有腳可用的情況之下,
app 或 pwa 的solution,
都可以讓任何情況應用的更好,
其實現有2018.03以前做的都是玩具而已。

什麼情況會沒有眼手腳可用?
就是開車啊!

所以chatbot的殺手應用,肯定是車用系統。



2018年2月25日 星期日

serverless gcp (google cloud functioin)

參考這個。
開新的 project
要下載keyjson 註明在 serverless.yaml裡

sls deploy 
service: serverless-85332

provider:
name: google
runtime: nodejs
project: serverless-85332 //這裡要註意,要和你的project名稱一樣
# the path to the credentials file needs to be absolute
credentials: ~/.gcloud/keyfile.json
後記:
bug:
因為想查 google cloud functions 有沒有台灣,所以下載 gcloud,但是不知道為何,目錄權限得一直自已開啟。


functions:
line_notify_cpc:
handler: handler.line_notify // handler 的命名,gcp不允許的樣子
events:
- http:
method: get
path: line_notify_cpc

2018年2月10日 星期六

使用 botframework + botbuilder-linebot-connector + serverless(AWS lambda) + botbuilder-mongodb-storage 連 mongodb cluster 開發 LineBot 入門 2

https://github.com/Wolke/linebot-serverless-MongoDbStorage-LineConnector-typeScript-starter-Kit

我直接解擇這個架構好了

  1. serverless.yml 這個就serverless 的設定,得配合我開在AWS 上的 mongo cluster ,才能讓 aws lambda 存取。http://wolke-codes.blogspot.tw/2018/01/serverless-aws-lambda-aws-mongodb.html
  2. bot/bot.ts bot 的流程... 可以參考我在IT鐵人的不負責任教學:https://ithelp.ithome.com.tw/users/20046160/ironman/1510
  3. handler.js :這個是serverless 的預設的 function 定義的地方。
    'use strict';
    
    var config = require("./conf");//讀取你的設定
    var bot_dailog = require("./bot/bot")//將bot 流程 require 進來。
    var botbuilder_linebot_connector_1 = require("botbuilder-linebot-connector");
    var botbuilder_mongodb_storage_1 = require("botbuilder-mongodb-storage");
    var builder = require('botbuilder');
    var connector = new botbuilder_linebot_connector_1.LineConnector({
      hasPushApi: false,
      // your line
      channelId: process.env.channelId || config.channelId,
      channelSecret: process.env.channelSecret || config.channelSecret,
      channelAccessToken: process.env.channelAccessToken || config.channelAccessToken
    });//產生connector
    
    
    var bot = new builder.UniversalBot(connector) //產生 bot
    
      .set("storage", new botbuilder_mongodb_storage_1.MongoDbStorage({
        DatabaseName: config.DatabaseName,
        collectionName: config.collectionName,
        mongoIp: config.mongoIp,
        mongoPort: config.mongoPort,
        // mongoIp: "ds125578.mlab.com",
        // mongoPort: "255xx",
        // username: config.username,
        // password: config.password
      }));
      bot_dailog.default(bot)//將bot流程套用
    
    
    
    
    module.exports.line = (event, context, callback) => {
      connector.serverlessWebhock(event) //記得加 connector.serverlessWebhock(event) 就可以了。
    const response = { statusCode: 200, body: JSON.stringify({ message: 'Go Serverless v1.0! Your function executed successfully!', input: event, }), }; callback(null, response); // Use this code if you don't use the http event with the LAMBDA-PROXY integration // callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event }); };
     

使用 botframework + botbuilder-linebot-connector + serverless(AWS lambda) + botbuilder-mongodb-storage 連 mongodb cluster 開發 LineBot 入門 1

名字超長的一篇教學,
為什麼會搞到這麼長,
就是經驗而已。


  1. botframework: ms 出的一個開放 chat bot 的一個套件,有官方網站 dev.botframework ,但不幸沒有支援日台泰三國愛用的Line。
  2. botbuilder-linebot-connector : 小弟做的一個connector,連上 botframework的 bulider 不需要 dev.botframework 的官網帳號,就可以來開發bot了。
  3. serverless(AWS lambda) :會選用serverless ,純粹是經驗,因為之前開一個 AWS EC2 micro 的機器,差不多10個使用者,同時在和bot溝通時,就有明顯的delay了,故改用serverless架構,來必免這個scale的問題。
  4. botbuilder-mongodb-storage : 小弟做的一個 mongodb storage for botframework 用的,主要是將 bot state 存在 mongo上使用。
  5. mongodb cluster : 這看你自已的選擇,用 mlab 或是 mongodb altas 或是自已架,都是不錯的選擇。不過請注意 line 有replayToken 會失效的問題,建議不要取存時間過長,導致失效而發不出去。
我的選擇是直接 serverless (AWS lambda 東京) + 開AWS mongodb cluster (https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#SecurityGroups:groupId=sg-db38a1a2;sort=groupId )東京,因為Line 的 bot 機房就在東京。






2018年2月9日 星期五

lambda subnet (serverless )設錯 網域 會連不到...



Select the VPC Subnets that Lambda should use to set up your VPC configuration. Format: "subnet-id (cidr-block) | az name-tag".





subnet-44e59e0d (10.0.0.0/19) | ap-northeast-1a Private subnet 1A

2018年2月8日 星期四

linebot + serverless + typescript 開發時的小問題


serverless 的 serverless offline 套件每次都會從重啟 webpack ,如果是typescript就會重新組譯很久,至少超過1秒,導致我的 linebot reply token 失效。

用 handler.js ,不要寫handler.ts

2018年2月6日 星期二

免費 mongo host mlab .com

https://mlab.com/
有500mb
測試好用

要注意 db 的 user,從
database => users 這裡開的才能用const mongoString = 'mongodb://myUserAdmin:xxxx@ds125578.mlab.com:25578/abcxxxx

2018年1月31日 星期三

serverless (AWS lambda) + AWS mongodb cluster

照這個教學
https://s3.amazonaws.com/quickstart-reference/mongodb/latest/doc/MongoDB_on_the_AWS_Cloud.pdf


  1. 選 new VPC 
  2. 會到 cloudformation
  3. 下一步
    1. Availability Zones <=要全選
    2. Number of Availability Zones <=全部
    3. Allowed Bastion External Access CIDR Allowed CIDR <= 0.0.0.0/0
    4. Key Pair Name <= key選本機原有的就好了<=之後還要從本機copy到,他開的機器,做ssh 的測試。
    5. MongoDB Admin Username  ...
    6. MongoDB Admin Password ...
  4. 下一步
  5. 約20分鐘
  6. 會開出兩台 ec2
    1. LinuxBastion <= 測試你的 mongo cluster 用的
    2. PrimaryReplicaNode0 <= mongo cluster 只有 vpc 能連
  7. pdf 的測試方式為
    1. scp -i key .... 到 LinuxBastion
      scp –i mykey.pem mykey.pem ec2-user@Bastion-public-ip:/home/ec2-user/mykey.pem
    2. ssh  - i key PrimaryReplicaNode0的ip
    3. mongo 
      mongo
      use admin
      db.auth("admin", "YourAdminPassword") rs.printReplicationInfo()
      rs.status()
  8. 應該都正常了
===lambda
    1. 我直接改這個範例做測試
      https://github.com/serverless/examples/tree/master/aws-node-rest-api-mongodb

    2. service
      : aws-node-rest-api-mongodb

      provider:
      name: aws
      region: ap-northeast-1 //記得region 要設對,不然找不到 sg
      runtime: nodejs6.10
      vpc:
      securityGroupIds:
      - "sg-db38a1xx" //加這個
      subnetIds:
      - "subnet-39dd6bxx" //加這個
      - "subnet-44e59exx" //加這個

      functions:
      createUser:
      handler: handler.createUser
      events:
      - http:
      path: user
      method: post
      cors: true
      vpc:
      securityGroupIds:
      - "sg-db38a1xx" //加這個
      subnetIds:
      - "subnet-39dd6bxx" //加這個
      - "subnet-44e59exx" //加這個


    3. securityGroupIds  <= 來自ec2 => PrimaryReplicaNode0 => Security groups
       => 點進去 => 看 Source
    4. Subnet ID <= 來自ec2 => PrimaryReplicaNode0 => Subnet ID 
    5. sls deploy
endpoints:
  POST - https:// x.execute-api.ap-northeast-1.amazonaws.com/dev/user
  PUT - https://x.execute-api.ap-northeast-1.amazonaws.com/dev/user/{id}
  DELETE - https://x.execute-api.ap-northeast-1.amazonaws.com/dev/user/{id}
  GET - https://x.execute-api.ap-northeast-1.amazonaws.com/dev/user/{id}

照這個試試吧!
結束!


2018年1月27日 星期六