web-technical-blog

web開発に関する技術メモ

virtualboxでネットワーク設定でつまずいたのでメモ

macOSvirtualboxを作成して windows環境にそのイメージをインポートした際にネットワーク設定ではまった際のメモ

ホストオンリーネットワークの追加

[ファイル]→[環境設定]→[ネットワーク]→[ホストオンリーネットワーク]

[アダプター]
IPv4アドレス:192.168.33.1
IPv4ネットマスク:255.255.255.0

[DHCPサーバー]
サーバーを有効化にチェック
サーバーアドレス:192.168.33.100
サーバーマスク:255.255.255.0
アドレス下限:192.168.33.101
アドレス上限:192.168.33.254

elasticsearch+kibanaをCentOS7にインストールしてみた

macOSVM環境を構築して、elasticsearch(6.x)+kibana(6.x)をインストールした際のメモ

各種ソフトウェアのダウンロード

vagrantbox.es

box追加

  • centos7.2をインストール
$ vagrant box add centos7.2 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box

vagrantFile

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.0"
  config.vm.hostname = "192.168.33.10"
  config.ssh.insert_key = false
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.name = config.vm.hostname
    vb.memory = "2048"
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    vb.customize ["setextradata", :id, "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled", 0]
    vb.customize ["modifyvm", :id, "--cableconnected1", "on"]
  end
  config.vm.provision "shell", inline: <<-SHELL
    sudo systemctl restart network.service
    yum update -y
    yum install -y zsh vim tree telnet dstat git tig
  SHELL
end

vagrant up エラーする場合

Elasticsearch+kibanaのセットアップ

  • javaのインストールが必要
  • バージョン8以上のJavaが必要

Elasticsearch requires at least Java 8. Specifically as of this writing, it is recommended that you use the Oracle JDK version 1.8.0_73.

$ yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel

$ java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

Elasticsearch6.1.1インストール

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
  • Installing from the RPM repository
$ sudo vi /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
  • yumでelasticsearchインストール
$ sudo yum -y install elasticsearch
  • 起動設定
$ sudo vi /etc/elasticsearch/elasticsearch.yml
## ElasticSearchをインストールしたIPを設定
network.host: 192.168.33.10
http.port: 9200
  • elasticsearchを再起動
$ sudo service elasticsearch restart
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable elasticsearch.service

kibana6.1.1インストール

$ sudo vi /etc/yum.repos.d/kibana.repo

[kibana-6.x]
name=Kibana repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
  • yumでkibanaインストール
$ sudo yum -y install kibana
  • kinaba.ymlの設定
$ sudo vi /etc/kibana/kibana.yml
server.port: 5601
server.host: "192.168.33.10"
elasticsearch.url: "http://192.168.33.10:9200"
  • kibanaを再起動
$ sudo service kibana restart
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable kibana.service

firewalld設定

  • kibanaの5601ポート
  • elasticsearch9200ポート
$ sudo vi /etc/firewalld/zones/piblic.xml

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <port protocol="tcp" port="5601"/>    <!-- kibanaポート追加 -->
  <port protocol="tcp" port="9200"/>    <!-- elasticsearchポート追加 -->
</zone>
  • firewalldの設定反映
$ sudo systemctl restart firewalld

elasticsearchのインストールディレクト

  • /usr/share/elasticsearch

Plugin

  • kuromoji
    • Kibana上で日本語を正しく解析する際に必要となるプラグイン
cd /usr/share/elasticsearch
sudo bin/elasticsearch-plugin install analysis-kuromoji
curl -H "Content-Type: application/json" -XPOST http://192.168.33.10:9200/blog/article/2 -d '
{
    "title": "My Name Is Kitagawa",
    "content": "I love cat",
    "tags": ["red", "green", "blue", "orange"]
}
  • jsonで一括登録する方法
$ cat requests
{ "index" : { "_index" : "ropeway", "_type" : "event" } }
{ "test" : "fukuda" }

curl -X POST -H "Content-Type: application/x-ndjson" http://192.168.33.10:9200/_bulk?pretty --data-binary "@requests"

ElasticsearchとRDBとの比較

  • インデックス:データベース
  • マッピングタイプ:テーブル
  • カラム:フィールド
  • レコード:ドキュメント

golangでテストコードをかく

パッケージ構成

パッケージ構成は、大まかに分けて3種類...

One Package

  • Repository自体を単一のパッケージとみなす
  • Coverageが取りやすい
  • Libraryなど、簡素な構成で済むものに向いている
.
├── ctx.go
├── debug.go
├── error.go
├── handler.go
├── handler_func.go
├── jsonrpc.go
├── method.go
└── parse.go

Flat Package

  • 各パッケージの責務を明確にし、分割を行う
  • 機能ごとに分割しているイメージ
  • Go言語の標準パッケージの構成に親しい考え方
  • 階層を掘ったとしても、2階層ぐらいで落ち着く
  • パッケージの責務を明確にし、お互いに疎結合を心がける
  • Micro Serviceや、Middlewareなどに向いている
.
├── ctx
│   └── ctx.go
├── debug
│   └── debug.go
├── error
│   └── error.go
├── handler
│   ├── handler.go
│   └── handler_func.go
├── jsonrpc.go
├── method
│   └── method.go
└── parse
    └── parse.go

Multiple Packages

.
├── controller
│   ├── debug
│   │   └── debug.go
│   └── handler.go
├── jsonrpc.go
├── model
│   ├── ctx
│   │   └── ctx.go
│   ├── error
│   │   └── error.go
│   ├── marshal
│   │   └── unmarshal.go
│   └── method
│       └── method.go
└── view
    └── index.html.tpl

DDD(ドメイン駆動設計) Domain-Driven Design

  • 顧客と開発者が業務を戦略的に理解し、共通の言葉を使いながらシステムを発展させる手法
  • DDDでは大規模な1つのシステムとデータベースで構築するのではなく、業務にとって適切な独立したシステムに分割する

レイヤードアーキテクチャ

  • ドメインロジックと、それ以外(DBやViewなど)を切り離すのが目的

Lightweight DDD

src/
└── myapp
    ├── application
    ├── domain
    ├── infrastructure
    ├── interfaces
    └── library
  • 4つのLayerで構成

    • Application
    • Domain
    • Infrastructure
    • Interface(s)
  • Application Layer

    • Domain layerの処理をまとめInterface Layerに提供
    • Flat Packagesの思想でパッケージ分割
    • interパッケージに活用し、共通ロジックを隠蔽
  • Domain Layer
    • Domain Layerは、他Layerには依存しない
    • Entityや、Enum,Interfaceを提供
  • Infrastructure Layer
    • GAEのライブラリをWrap
    • 基礎的な処理を保持
      • Logging
      • Validation Rule
      • World Filtering
      • Value Get/Set in Context
      • Persistence
  • Interface Layer
    • JSON-RPCのHandler群
      • Search.FindProducなど
    • Original Error定義
      • 32044:Not Foundなど
    • Interceptor群
      • Contextに色々詰める
      • Action Loggerなど
    • その他
      • Startup処理、状態取得

最適なパッケージ構成

相互参照せずに快適に開発を進められるパッケージ構成を見つけるのは難しい

第1ケース

プロジェクトルートに展開する

.
├── db.go
├── errors.go
├── handler.go
├── main.go
└── model.go

概要

  • ほぼ全てのファイルをプロジェクトルートに展開するやり方、mainパッケージに集約する
  • utlity的な共通処理も、構造体もinterfaceもその実装も、全て同じ階層にあれば、パッケージを切る必要がない

特徴

  • CLIツールや小さめのサーバー、あるいは小さめのパッケージなどには適している

デメリット

  • 中規模以上のAPIサーバーを用意するとなると厳しい
  • 20個以上とかファイルが乱立すると分かりにくくなる

第二ケース

MVC

.
├── main.go
├── clients
├── config
├── controllers
├── models
└── views
  • 他の言語のアプリケーションフレームワークを使用しているとよく見るやつ
  • あくまでもプロジェクトルートが綺麗なだけ

  • 例えば、modelsディレクトリの直下に行った時は、本当はこうしたい

.
├── main.go
├── clients
├── config
├── controllers
├── models
    ├── article
    └── user
└── views
  • リソースごとにパッケージを区切りたくなるが、これでは大体相互参照の問題にぶつかる
  • article.goとuser.goなど、構造体やそれに付随する実装を全てmodelsディレクトリ直下に展開するという流れがある

  • 小さめのAPIなら許容できなくいが、主要APIとして利用されるサーバーコードを書くときはリソースが多くなり、goのソースコードのファイルが多くなる

参考URL

https://speakerdeck.com/mercari/ja-golang-package-composition-for-web-application-the-case-of-mercari-kauru

PyCharmでpythonを動作させてみた

  • python2.系とpython3.系をwindows環境にインストール
  • virtualenvで切り替えが可能なのでいいかも...
C:\Users\xxxx>python
Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)]
 on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> ^Z


C:\Users\xxxx>py -2
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

goのglideを使用してみた

  • GOPATHは以下に設定 /User/xxxx/go/

  • glideを使うときはGOPTAHに注意!

  • GOPATH/src配下にプロジェクトがないと動かない!!

  • パッケージ構成は以下のようにした

myproject
├── glide.lock
├── glide.yaml
├── main.go
└── vendor
    └── github.com
        └── go-easylog
            └── el
                ├── README.md
                ├── logger.go
                ├── logger_test.go
                ├── rotator.go
                └── rotator_test.go
  • glide initで初期化
$ glide init
  • glide getでパッケージの追加
$ glide get github.com/go-easylog/el

$ cat glide.yaml
package: myproject
import:
- package: github.com/go-easylog/el

$ cat glide.lock
hash: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
updated: 2017-11-30T17:38:28.956562+09:00
imports:
- name: github.com/go-easylog/el
  version: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
testImports:
  • vendor配下が作成していない場合は以下のコマンドでインストール
glide install

Windows7 64bit版でGo言語のクロスコンパイルを試す

環境

C:\lib\src\awesomeProject>go version
go version go1.8.3 windows/amd64
C:\lib\src\awesomeProject>go env
set GOARCH=amd64
set GOBIN=
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\lib
set GORACE=
set GOROOT=C:\Go
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
・・・省略・・・

Goでクロスコンパイル

set GOOS=linux
set GOARCH=amd64
go build -o hello hello.go