Angular Tutorial 2章

モジュール(P860)

Angularモジュール

以下のようにNgModuleで装飾されたもの。今回の例で言うと AppModule がそれにあたる。

app.module.ts

@NgModule({
  imports:      [ BrowserModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

Javascriptモジュール

import文 import {name, ...} from module のfromで取得している各ファイルのこと。今回の例でいうと、 app.component.ts などがそれにあたる。

app.module.ts

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent }  from './app.component';

@NgModule({
  imports:      [ BrowserModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

Javascriptモジュールファイルの中身は以下。外部で使う場合は 以下のようにexport をつける

app.component.ts

@Component({
  selector: 'my-app',
  template: `<h1>Hello {{name}}</h1>`,
})
export class AppComponent  { name = 'Angular'; }

コンポーネント(P875)

メインコンポーネントをカスタマイズしてみた。

app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  template: `<h1>Hello {{name}}{{user.name}}</h1>`,
})
export class AppComponent  {
  name = 'Angular';
  user: User = {
    id: "1",
    name: "yohei"
  }
}

class User {
  id: string;
  name: string;
}

パッケージインストール(P974)

パッケージjsonからインストール

npm install
npm install --production

パッケージJSONにないものをインストール。パッケージJSONにも追加する

npm install {package名} --save
npm install {package名} --save-dev

gae go 環境変数

app.yaml

env_variables:
  ENV: 'dev'

model.go

func init() {
    switch os.Getenv("ENV") {
    case "dev":
        err := godotenv.Load("kintone.dev.env")
        if err != nil {
            log.Fatal("Error loading .env file")
        }
    case "prd":
        err := godotenv.Load("kintone.prd.env")
        if err != nil {
            log.Fatal("Error loading .env file")
        }
    default:
        err := godotenv.Load("../app/kintone.dev.env")
        if err != nil {
            log.Fatal("Error loading .env file")
        }
    }
}

func newClient(ctx context.Context, appID string) *kintone.Client {
    log.Print("init Client")
    log.Print(os.Getenv("KINTONE_DOMAIN"))
    var httpclient *http.Client
    if ctx != nil {
        httpclient = urlfetch.Client(ctx)
    }
    client, _ := kintone.NewClient(
        os.Getenv("KINTONE_DOMAIN"),
        os.Getenv("KINTONE_USER"),
        os.Getenv("KINTONE_PASSWORD"),
        appID,
        httpclient,
    )
    return client
}

datastore gce

管理画面

gceのインスタンス設定画面ですべてのAPIを有効に変更

add

import "cloud.google.com/go/datastore"

func main(){
  datastoreClient, err := datastore.NewClient(ctx, ProjectID)
  if err != nil {
    panic(err)
  }
  e := Entry{
    Price: EntryPrice(1400000),
    Size:  2.2,
  }
  key := datastore.NameKey("Entry", "entry1", nil)
  _, err := c.Put(ctx, key, &e)
  if err != nil {
    panic(err)
  }
}

get

import "cloud.google.com/go/datastore"

func main(){
  datastoreClient, err := datastore.NewClient(ctx, ProjectID)
  if err != nil {
    panic(err)
  }
  var e Entry
  key := datastore.NameKey("Entry", "entry1", nil)
  err := c.Get(ctx, key, &e)
  if err != nil {
    panic(err)
  }
}

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
}