三蔵開発メモ

Web開発やインフラ関連のメモを共有します

Goにおけるフォルダ(パッケージ)分け

Go言語の勉強を始めたので、基本のメモ。

環境

Go 1.12

フォルダ分け

Goはmain関数があるmainパッケージが処理の拠点として存在するが、 処理を切り分けたい場合はパッケージを作る。 以下の内容が書かれた、「main.go」というファイルがあるとする

package main

import (
    "fmt"
)

func main() {
    fmt.Println("hello world")
}

これをあえて以下のように切り分けたい場合

/prj
┣ main.go
┗ /print/print.go

print.goは以下のようにする

package print

import (
   "fmt"
)

func PrintHello(){
     fmt.Println("hello world")
}

main.goは以下のように書き換える

package main

import (
    "print"
)

func main() {
    print.PrintHello()
}

こちらのmain.goを実行すると最初に書いたmain.goと同じ動きをする。
fmtはprint側で呼び出して使っているため、importの必要がなくなる。
また、printとpackageに指定したprint.goを呼び出すときは、
importを使って呼び出す。
そうすると、「PrintHello」のように最初が大文字で設定してある関数はパブリックなため、
「パッケージ名.関数名」で呼び出すことができる。

その他

import(
   . "print"
)

上記のように「.」をimportするパッケージ前につけると、print.PrintHello()みたいにパッケージ名を前につけないで呼び出すこともできる。 「.」の代わりに「pri」とかつけてパッケージ名を指定のものに変えることもできる。

ネストしてるパッケージ

/prj
┣ main.go
┗ /print/printutil/print.go

上記のような階層にした場合は、

import (
"print/printutil"
)
main(){
  printutil.PrintHello()
}

上記のように呼び出す、print.goのパッケージ名はこの場合は「printutil」とする。

apache2.4でのpreforkのチューニング

apache2.2ではhttpd.confに設定する部分があったが、 2.4では場所が変わっていたためメモ。

sudo vi /etc/httpd/conf.modules.d/00-mpm.conf
-------------------------------------------------------------------------------------------
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so

#以下を追記
<IfModule mpm_prefork_module>
    StartServers 10
    MinSpareServers 10
    MaxSpareServers 10
    ServerLimit 10
    MaxClients 10
    MaxRequestsPerChild 50
</IfModule>
----------------------------------------------------------------------------------

上記設定値はawsのt2.microでwordpressを動かすときの設定。

QiitaにCentOS7 Laravel5.5 PHP7 mariadb 環境を構築する手順を書きました

主に開発環境等でLaravelを構築するための手順をqiitaに書きました。
上から順に追っていけば環境が構築できるように書いてあります。

qiita.com

MongoDBでレプリカセットを今のデータを保持したまま解除する方法

MongoDBのレプリカセットを解除しようとしたとき、
データを保持したまま解除する方法が分からなくはまった時のメモ。

localデータベースを削除

ホスト機で以下コマンドを実行

mongo
>use local
>db.dropDatabase()

confファイル変更 mongodb ver.2系の場合

vi /etc/mongod.conf
----------
# in replicated mongo databases, specify the replica set name here
replSet=replSetname
----------
↓
----------
# in replicated mongo databases, specify the replica set name here
#replSet=replSetname
----------

confファイル変更 mongodb ver.3系の場合

vi /etc/mongod.conf
----------
replication:
  oplogSizeMB: 1024
  replSetName: 'replSetName'
----------
↓
----------
#replication:
#  oplogSizeMB: 1024
#  replSetName: 'replSetName'
----------

mongoを再起動

service mongod restart

CentOS6,CentOS7,kvmでvmをコピーする方法と、ネットワーク周りの設定

vmのコピー

ホスト機で以下コマンドを実行

virt-clone --original [ベースのvmの名前] --name [新しいvmの名前] --file /var/lib/libvirt/images/[新しいvmのイメージファイル名].img

MACアドレス確認

ホスト機で以下のコマンドを実行し、新しいMACアドレスを控える

sudo virsh domiflist [新しいvmの名前]
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet1      bridge     br0        virtio      zz:zz:zz:zz:zz:zz

サーバー内の設定(CentOS6の場合)

ゲスト機でネットワーク情報を書き換える

vi /etc/sysconfig/network-scripts/ifcfg-eth0
----------
#マックアドレスを上記のものに書き換え
#uuidもuuidgenして出力されたものに書き換え
#ipアドレスも新しいものに書き換え
----------

さらに、こっちのファイルも書き換える

vi /etc/udev/rules.d/70-persistent-net.rules
--------------
# PCI device 0x8086:0x100e (e1000) (custom name provided by external tool)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="zz:zz:zz:zz:zz:zz", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
--------------

上記のようになっていて、eth0の方は元のVMMACアドレスで、eth1の方は上記で確認したMACアドレスになっているはずなので、
eth0の方を削除して、eth1をeth0にする

サーバー内の設定(CentOS7の場合)

eth0イーサネット有効化、 ipアドレス変更 ネットワーク再接続 サービス再起動

nmcli c m eth0 connection.autoconnect yes
nmcli c modify eth0 ipv4.addresses 192.168.0.100/24 
nmcli c down eth0; nmcli c up eth0 
systemctl restart network

再起動

reboot

再起動して完了
virtualboxの複製の場合でもMACアドレス書き換え以下の手順は共通。

Vagrant VirtualBox CentOSで共有フォルダをマウントしてくれないときに試した方法

VirtualBoxのアップデートなどをすると、
guest additionsが更新されたりして、うまく既存のVMのマウントがされなくなってしまうことがあったので、
試したことメモ。

その1、vagrant vbguestでguest additonsをアップデート

ホスト機のコマンドプロンプトで以下を試す

vagrant plugin install vagrant-vbguest
vagrant vbguest
vagrant reload

これで無事アップデートされればOK

その2、カーネルアップデート

その1だけだとうまくいかない場合は、 ゲストVMカーネルをアップデートするとうまくいく。
ゲスト機で以下のコマンドを試す。

sudo yum install kernel-devel gcc

コマンドプロンプトVM再起動

vagrant plugin install vagrant-vbguest
vagrant vbguest
vagrant reload

その3、guest additionsを入れなおす

その1でも、その2でもうまくいかなかったら、
CDからguest additionsを入れなおしたらうまくいった。

まず、VirtualBoxGUIで対象のVagrantVMを選択し、
設定→ストレージ→IDEコントローラーにCDを空で追加する(プラスボタンを押すと追加できる)

ゲスト機内で必要パッケージ追加
sudo yum install bzip2 kernel-devel
sudo yum install kernel kernel-tools
カーネルバージョン確認
sudo yum list installed | grep kernel

kernelとkernel-develのバージョンが一緒になっていればOK

guest additionsのCDをセットして起動

VirtualBoxGUIVMを起動し、右クリック→表示→ウィンドウが出る→ツールバーの「デバイス」を選択→Guest Additions CDイメージの挿入
ゲスト機にログインして以下のコマンド実行

sudo mkdir /media/cdrom
sudo mount /dev/cdrom /media/cdrom
cd /media/cdrom
sudo sh VBoxLinuxAdditions.run

無事インストールされるはずなので、
その後コマンドプロンプトvagrant reloadすれば完了。
マウントもされるはず。

まとめ

guest additonsはゲスト機とホスト機のバージョンが違うと、
vagrantは自動で最新に更新してくれるらしいが、
そこで既存Ver削除→新Verインストールと手順を踏んでいて、
既存削除後新Verをインストールするときにこけると、guest additionsが消えてしまうらしい。
(実際フォルダが空になってました)
その時は少し手間ですが入れなおすのがよさそうです。