gcp stackdriver

実装

// Sample stdlogging writes log.Logger logs to the Stackdriver Logging.
package main

import (
        "log"

        // Imports the Stackdriver Logging client package.
        "cloud.google.com/go/logging"
        "golang.org/x/net/context"
)

func main() {
        ctx := context.Background()

        // Sets your Google Cloud Platform project ID.
        projectID := "YOUR_PROJECT_ID"

        // Creates a client.
        client, err := logging.NewClient(ctx, projectID)
        if err != nil {
                log.Fatalf("Failed to create client: %v", err)
        }
        defer client.Close()

        // Sets the name of the log to write to.
        logName := "my-log"

        logger := client.Logger(logName).StandardLogger(logging.Info)

        // Logs "hello world", log entry is visible at
        // Stackdriver Logs.
        logger.Println("hello world")
}

参考

https://cloud.google.com/logging/docs/setup/go?hl=ja

zendesk webhook 追加

管理画面

ターゲット作成

  • 設定場所
    設定 > 機能拡張 > ターゲット追加 > HTTPターゲット

  • 設定内容
    webhookの通知先

トリガ作成

ビジネスルール > トリガ
前ステップで作成したターゲットを指定する

sendgrid handson

API Document

https://sendgrid.com/docs/API_Reference/api_v3.html

イベント

drop

bounce

送信したメールが何らかの理由で宛先に届かない

種類

  • soft bounce
    smptのレスポンスが400番台
  • hard bounce
    smtpのレスポンスが500番台

バウンスリスト

  • Suppressions > Bounces
    から確認できる。ハードバウンスの時のみ、このリストに入る
  • リストから削除することもできる
  • リストにあるメールは、送信時にドロップ(送信されない)される

Subscription管理

  • 設定画面との連携がわからない。勝手にヘッダに入るようになるという理解で良いか?
  • previewが更新されない

ライブラリ

どこまでをライブラリと言っているのかがわからない

テンプレート

  • レガシーテンプレート
  • トランザクションテンプレート
    • テンプレートIDを指定してメールを送れる
    • 配信停止のリンクをテンプレートにどのように組み込めば良いか?

独自ドメイン(ホワイトラベル)

  • 何も設定しないと sendgrid.net 経由となるのを変更する(SPFとDKIMはSendgridのドメインで解決される)

参考

https://sendgrid.kke.co.jp/docs/Tutorials/index.html

golang ftp

package main

import (
    "bytes"
    "log"
    "net/http"
    "os"
    "time"

    ftp "github.com/secsy/goftp"
)

func main() {
    err := downLoadFile()
    if err != nil {
        log.Fatal(err)
    }
}

func downLoadFile() error {
    config := ftp.Config{
        User:               "{ユーザーID}",
        Password:           "{パスワード}",
        ConnectionsPerHost: 10,
        Timeout:            10 * time.Second,
        Logger:             os.Stderr,
    }
    client, err := ftp.DialConfig(config, "172.19.2.12")
    if err != nil {
        panic(err)
    }

    // Download a file to disk
    readme, err := os.Create("readme")
    if err != nil {
        panic(err)
    }

    err = client.Retrieve("test.csv", readme)
    if err != nil {
        panic(err)
    }

    return nil
}

gce バッチ処理

gce

インスタンス作成

os: centos

起動スクリプト
startup-script

#! /bin/bash
sudo systemctl start nginx.service
go run /var/app/go/main.go

goインストール

// wgetインストール
yum install wget

// golangインストール
// 方法1
sudo yum install -y golang

// 方法2
cd /usr/local/src
sudo wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
sudo tar -C /usr/local/ -xzf go1.8.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

// nginx install
sudo yum install -y nginx
sudo chkconfig nginx on
sudo systemctl start nginx.service

nginx

インストール

sudo yum install -y nginx
sudo chkconfig nginx on

設定

/etc/nginx/nginx.conf

server {
    listen       80;
    server_name  hostname;

    location / {
        fastcgi_pass  127.0.0.1:9000;
        include       fastcgi_params;
    }
}

起動

sudo systemctl start nginx.service

スクリプト

helloworld

package main
import (
    "fmt"
    "net"
    "net/http"
    "net/http/fcgi"
)
func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
}
func main() {
    l, err := net.Listen("tcp", "127.0.0.1:9000")
    if err != nil {
        return
    }
    http.HandleFunc("/", handler)
    fcgi.Serve(l, nil)
}

slack通知

package main

import (
    "bytes"
    "log"
    "net/http"
)

func main() {
    const url = "https://hooks.slack.com/services/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"
    body := []byte(`{"text":"hello from gcp"}`)
    req, err := http.NewRequest("POST", url, bytes.NewBuffer(body))
    if err != nil {
        log.Print(err)
    }
    req.Header.Set("Content-Type", "application/json; charset=UTF-8")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Print(err)
    }
    defer resp.Body.Close()
}

gce起動スクリプト

startup-script

#! /bin/bash
// nginx 起動
sudo systemctl start nginx.service

// golang 起動
go run /var/app/go/main.go

angular IE対応

エラー

IEで以下のエラーが発生。画面が表示されない。

オブジェクトは ‘assign’ プロパティまたはメソッドをサポートしていません。

修正

以下のコメントアウトを外す必要がある

bukatsu_report/angular-app/src/polyfills.ts

/** IE9, IE10 and IE11 requires all of the following polyfills. **/
// import 'core-js/es6/symbol';
// import 'core-js/es6/object';
// import 'core-js/es6/function';
// import 'core-js/es6/parse-int';
// import 'core-js/es6/parse-float';
// import 'core-js/es6/number';
// import 'core-js/es6/math';
// import 'core-js/es6/string';
// import 'core-js/es6/date';
// import 'core-js/es6/array';
// import 'core-js/es6/regexp';
// import 'core-js/es6/map';
// import 'core-js/es6/weak-map';
// import 'core-js/es6/set';

参考

https://stackoverflow.com/questions/45630084/object-doesnt-support-property-or-method-assign-ie11-while-using-angular4

angular4 package.json

{
  "name": "angular-app",
  "version": "0.0.0",
  "license": "MIT",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular-devkit/schematics": "0.0.34",
    "@angular/animations": "^4.4.6",
    "@angular/cdk": "^2.0.0-beta.12",
    "@angular/common": "^4.4.6",
    "@angular/compiler": "^4.2.4",
    "@angular/core": "^4.4.6",
    "@angular/forms": "^4.2.4",
    "@angular/http": "^4.2.4",
    "@angular/material": "^2.0.0-beta.12",
    "@angular/platform-browser": "^4.2.4",
    "@angular/platform-browser-dynamic": "^4.2.4",
    "@angular/router": "^4.2.4",
    "@ngui/sortable": "^0.4.1",
    "angular4-drag-drop": "^1.1.2",
    "core-js": "^2.4.1",
    "hammerjs": "^2.0.8",
    "material-design-icons": "^3.0.1",
    "ng2-dnd": "^4.2.0",
    "rxjs": "^5.4.2",
    "zone.js": "^0.8.14"
  },
  "devDependencies": {
    "@angular/cli": "1.4.9",
    "@angular/compiler-cli": "^4.2.4",
    "@angular/language-service": "^4.2.4",
    "@types/jasmine": "~2.5.53",
    "@types/jasminewd2": "~2.0.2",
    "@types/node": "~6.0.60",
    "codelyzer": "~3.2.0",
    "jasmine-core": "~2.6.2",
    "jasmine-spec-reporter": "~4.1.0",
    "karma": "~1.7.0",
    "karma-chrome-launcher": "~2.1.1",
    "karma-cli": "~1.0.1",
    "karma-coverage-istanbul-reporter": "^1.2.1",
    "karma-jasmine": "~1.1.0",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.1.2",
    "ts-node": "~3.2.0",
    "tslint": "~5.7.0",
    "typescript": "~2.3.3"
  }
}

npm

// バージョン確認
npm -v

// グローバルにインストールする場合のインストール先確認
npm root -g

// パスを通す(.bash_profile)
export PATH=$PATH:/Users/00990310/.npm-global/bin

// グローバルにインストールしたパッケージ全削除
npm ls -gp --depth=0 | awk -F/ '/node_modules/ && !/\/npm$/ {print $NF}' | xargs npm -g rm

// グローバルにパッケージインストール
npm install -g @angular/cli

// グローバルにインストールされたパッケージの確認
npm ls -g

// グローバルから削除
npm uninstall -g @angular/cli