web-technical-blog

web開発に関する技術メモ

centOS7をvagrantでインストールした際に固定IPアドレスが有効にならなくてはまったのでメモ

Vagrantファイルの編集(以下の記述が必要)
    config.vm.provision "shell", inline: <<-SHELL
        sudo systemctl restart network.service
    SHELL

勉強会等で集めた資料

Geeks Who Drink in Tokyo–Go Go Golang Edition!

CA.go #1

CA.kt #1

CAMPFIRE Growth Hack #2

春の脆弱性祭り

Realm meetup #23

APIドキュメンテーションツールを使いこなす【Api Blueprint編】

Data Engineering and Data Analysis Workshop #1

Go勉強会メモ(#ca_go)

[概要]

サイバーエージェントのメディアサービスを担当している
Goエンジニアによる勉強会

[その他]

シリーズもので何回もやっていく予定との事
FRESH!にて生放送(以下を参考)
freshlive.tv
developers.cyberagent.co.jp

[タイムテーブル]

『sync.Poolで爆上げメモリ効率』
『知っておきたいinterfaceとreflect』
『今更だけどGob』
golang profilingの基礎』

================================================
『sync.Poolで爆上げメモリ効率』パフォーマンスチューニングについて

  • sync.PoolはGo1.3から標準パッケージに入った
  • パフォーマンスチューニングでメモリアロケーションを減らすのは超大事
  • sync.Poolでできることはメモリを上手いこと使いまわせる
  • メモリを捨てずに再利用することで新しくメモリを確保しなくて済む
  • sync.Poolを使用した場合と使用しない場合でのベンチマークを実施した結果はsync.Poolを使用した場合の方がメモリのアロケーションが少ない(メモリの無駄使いをしていない)

■実用的な使い方について(知見)

  • 用途に応じて適切な初期化する
  • Resetメソッドは使っておいた方が良い
  • 何でもとりあえずPollという話ではない
  • 高頻度で使いまわすでかいオブジェクトで使用するのがよいみたい

================================================
『知っておきたいinterfaceとreflect』←自分はあまり理解できる内容ではなかった...
■What is a Go interface(Go interfaceとは何か)

  • Goの中には色々なタイプがある大きく分けて2つある(concretetypeとabstracttypes)
  • interface{}

■Why usin an interface?(なぜinterfaceを使うのか)

  • GenericAlgorithm
  • HidingImplementationDetail
  • InterceptionPoint

■Go interface in Ownd!(Owndというサービスでどのあたりで使用しているのか)

  • MarshalHtml
  • type assertions
  • interfaceはメソッドの集合体ではなく、小さく使う(Rob Pike in his Go Proverbs)

■Where is the reflect?(refletcについて)

  • type assertions(*partially)
  • "Reflection is never clear"(ww)

================================================
『今更だけどGob』
Golang

  • サーバーサイド全般がGolang
  • API、データ連携、ログ集計、データ収集..etc
  • Recommendation以外はほとんどGolang
  • 大きなファイルを読んでDBに入れるバッチも

golevedb
bigcache

■Gobって?

  • gob形式のバイナリ変換
  • RPCのようなNW経由でのデータのやちとり(Golang同士でないと駄目)
  • ファイルへのデータ保存
  • データ定義不要,self-describing、効率的
  • 構造変更が可能

■encoding/jsonは?

  • []byteへのEncoder、Decoderがある
  • 両者でTypeが一致しなくても良い
  • gobと使い方は変わらない?

 GobEncode/JsonEncodeとGobDecode/JsonDecodeでベンチ比較
 ※Gobの方がメモリ、アロケーションを見ても効率的

■protobufは?

■注意点

  • interface使う時は注意(事前にgob.Registerする必要がある)

■まとめ

  • Golang専用のシリアライザー
  • 定義不要で効率的に利用可能
  • interface使う時は注意(事前にgob.Registerする必要がある)

================================================
golang profilingの基礎』
■Profiling of golang

  • GolangのProfilingを行うパッケージ
  • CPU、Memory、goroutineなどの情報を収集
  • protocol buffer形式でプロファイルを保存
  • `go tool pprof`によりプロファイルを分析

■CPU Profiler

  • 関数の実行時間をプロファイリング
  • CPU Profiler以外のProfilerはLookupで呼び出し
  • heap(Heap Profiler)

モリーのプロファイリング

  • goroutine(Goroutine Profiler)

 実行中のgoroutineのプロファイリング

  • block(Blocking Profiler)

 同期処理でwaitingしているgoroutineをプロファイリング
 ※runtime.SetBlockProfileRateを1以上に設定することで有効化

  • mutex(Mutex Profiler) go1.8から追加

 同期処理をブロックするmutexのみをプロファイリング
 ※runtime.SetMutexProfileFractionを1以上に設定することで有効化

■Relational Packages

  • runtime/pprof
  • net/http/pprof
  • HTTP Server用のプロファイラ
  • github.com/pkg/profile

 `runtime/ppfor`をより簡単に利用できるようなwrapper

■Check Point

  • runtime.mallocgc

 メモリアロケーションが多く発生している

  • runtime.chanrecv,sync.Mutex

 ロック処理により多くの待ちが発生している

  • syscall Read/Write

 ioの読み書きが大量に発生している

 ヒープサイズの小ささにより、GCの発生が頻繁に発生している

■Go Debug Options

  • Memory Allocator Trace

 GODEBUG=allocfreetrace=1

  • Garbage Collector Trace

 GODEBUG=gctrace=1

  • Scheduler Trace

 GODEBUG=schedtrace=1000 ./

JenkinsでGitにPush時に自動ビルドさせる

# --- jenkinsユーザーにスイッチ
su -s /bin/bash jenkins
# --- .sshがなければディレクトリ作成(/var/lib/jenkins/.ssh)
mkdir ~/.ssh;
cd ~/.ssh
# --- 秘密鍵の作成(パスワードが聞かれるが無視)
ssh-keygen -t rsa
# --- 権限600に設定
chmod 600 id_rsa

# --- 公開鍵(id_rsa.pub)をGitHubへ登録する
https://github.com/settings/keys
GitHubの「SSH Keys」にアクセスして「New SSH Key」を押す

# --- GitHubにSSHアクセスする
ssh -T git@github.com
git ls-remote -h git@github.com:masahiro-yoshitachi/xxx.git HEAD
※上記のどちらかのコマンドを実行すると、known hostsが追加されてGitHub側の設定は完了

simple-it-life.com

apache2.2でSSL通信をさせるように設定した際のメモ

ローカル環境にSSL通信を設定した際のメモ

# ssl通信ができるようにmod_sslをインストール
# yum -y install mod_ssl

# vi /etc/httpd/conf.d/ssl.conf
# ssl通信(443)の設定()
<VirtualHost _default_:443>
DocumentRoot "/var/www/html/webroot"
### 省略 ###
RewriteEngine On
RewriteRule ^/$ /xxx/index.html [R,L]
</VirtualHost>

# --- ssl通信(8080)の設定
<VirtualHost *:8080>
DocumentRoot "/var/www/html/management"
### 省略 ###
RewriteEngine On
RewriteRule ^/$ /xxx.php [R,L]
</VirtualHost>

CentOS6系にPostgreSQL9.4をインストールした際のメモ

久しぶりにPostgreSQLを使用する機会が発生したのでメモ。

CentOS release 6.9 (Final)
PostgreSQL 9.4

# リポジトリの追加
# wget http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-3.noarch.rpm
# yum localinstall pgdg-centos94-9.4-3.noarch.rpm

# インストール
# yum install postgresql94-server.x86_64 postgresql94.x86_64 postgresql94-libs.x86_64

# データベースの初期化
# service postgresql-9.4 initdb
Initializing database:                                     [  OK  ]

# サービス起動
# service postgresql-9.4 start
Starting postgresql-9.4 service:                           [  OK  ]

# パスワード設定
# su - postgres
-bash-4.1$ psql
psql (9.4.12)
Type "help" for help.

postgres=# alter user postgres with password '*****';
ALTER ROLE
postgres=# \q

# postgresql.confの設定
# vi /var/lib/pgsql/8.4/data/postgresql.conf
# --- postgresqlの時刻合わせ
timezone = 'Asia/Tokyo'
# --- 他からのアクセスを許可
listen_addresses = '*'

# pg_hba.confの設定
# vi var/lib/pgsql/9.4/data/pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             192.168.56.0/24         trust
# IPv6 local connections:
host    all             all             ::1/128                 ident

データベースの作成とテーブル作成とユーザー権限について

--ユーザー作成
CREATE ROLE webrole LOGIN;
CREATE ROLE nobody  LOGIN;

--データベース作成
CREATE DATABASE testdb WITH TEMPLATE = template0 ENCODING = 'UTF8';
ALTER DATABASE testdb OWNER TO webrole;

--テーブル作成
CREATE TABLE t_img_vote
(
  id serial NOT NULL, -- シーケンス
  pen_nm character varying(256), -- ペンネーム
  illust_nm character varying(128), -- 作品名
  email character varying(256), -- メールアドレス
  open_flg boolean NOT NULL DEFAULT false, -- 公開フラグ(0:非公開 1:公開)
  img_nm character varying(256), -- 画像ファイル名
  ip_addr character varying(64), -- IPアドレス
  vote_at timestamp without time zone DEFAULT now(), -- 投稿日時
  created_at timestamp without time zone DEFAULT now(), -- 作成日時
  update_at timestamp without time zone DEFAULT now(), -- 更新日時
  CONSTRAINT t_img_vote_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);

ALTER TABLE t_img_vote
  OWNER TO webrole;
COMMENT ON COLUMN t_img_vote.id IS 'シーケンス';
COMMENT ON COLUMN t_img_vote.pen_nm IS 'ペンネーム';
COMMENT ON COLUMN t_img_vote.illust_nm IS '作品名';
COMMENT ON COLUMN t_img_vote.email IS 'メールアドレス';
COMMENT ON COLUMN t_img_vote.open_flg IS '公開フラグ(0:非公開 1:公開)';
COMMENT ON COLUMN t_img_vote.img_nm IS '画像ファイル名';
COMMENT ON COLUMN t_img_vote.ip_addr IS 'IPアドレス';
COMMENT ON COLUMN t_img_vote.vote_at IS '投稿日時';
COMMENT ON COLUMN t_img_vote.created_at IS '作成日時';
COMMENT ON COLUMN t_img_vote.update_at IS '更新日時';

CREATE INDEX idx1
  ON t_img_vote
  USING btree
  (open_flg);
  
CREATE INDEX idx2
  ON t_img_vote
  USING btree
  (img_nm);

--権限設定
ALTER TABLE t_img_vote OWNER TO webrole;
GRANT ALL ON TABLE t_img_vote TO webrole;
GRANT SELECT,UPDATE ON TABLE t_img_vote_id_seq TO nobody;
GRANT SELECT,INSERT ON TABLE t_img_vote TO nobody;

hacknote.jp
qiita.com

CentOS6でIPv6を無効にする

vagrantvmを構築し、postgresの設定を行うとIPv6でアクセスしに行こうとしたのでIPv6を無効にした

# /etc/modprobe.d/にdisable_ipv6.confというファイル設定ファイルを作成する
# ファイル名は任意の名前でOK
# vi /etc/modprobe.d/disable-ipv6.conf
options ipv6 disable=1

# 下記も設定(上記を設定していれば不要みたいだが)
# vi /etc/sysconfig/network
NETWORKING_IPV6=no

# ipv6tablesの停止
# chkconfig ip6tables off

# OS再起動
# reboot

# IPv6が無効になっていることを確認
# ifconfig
※inet6 addr:から始まるIPV6アドレスが表示されていなければ無効になっている

blog.redbox.ne.jp