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」とする。
CentOS7とapache2.4で/tmp直下にファイル等を保存したりしたい時
privateTmp機能をoffにする
※セキュリティが下がるのでなるべく注意
/lib/systemd/system/httpd.service --- PrivateTmp=true ↓ PrivateTmp=false --- systemctl daemon-reload systemctl restart httpd
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> ----------------------------------------------------------------------------------
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の方は元のVMのMACアドレスで、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
vagrant plugin install vagrant-vbguest vagrant vbguest vagrant reload
その3、guest additionsを入れなおす
その1でも、その2でもうまくいかなかったら、
CDからguest additionsを入れなおしたらうまくいった。
まず、VirtualBoxのGUIで対象のVagrantのVMを選択し、
設定→ストレージ→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をセットして起動
VirtualBoxのGUIでVMを起動し、右クリック→表示→ウィンドウが出る→ツールバーの「デバイス」を選択→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が消えてしまうらしい。
(実際フォルダが空になってました)
その時は少し手間ですが入れなおすのがよさそうです。