とっしぃのTech Memo

PHPとかサーバとか他色々言語のメモ的な。あとはたまにガジェットとか。

boot2dockerのポートフォワードで一瞬ハマる

ご無沙汰しております。 とっしぃです。

ホントにブログ続けられてる人ってすごいと思います。

こんな適当な、ぐぐればそこら中に転がってそうなネタでも 書かないことには続けられそうにないのでメモがてら書いておきます。

まぁDockerもboot2dockerもだいぶ今更感のあるネタではあるんですが、 今更感があるだけにちゃんと触ったことないのもどうかと思ってやりはじめたというのがきっかけです。

boot2dockerとは

とりあえず前提から。

  • macとかwindows上で、virtualboxVM使ってその上でDockerを動かすためのクライアント
    • 公式
    • 参考 qiita.com

Dockerとは

コンテナ技術による仮想環境ツール

VMみたいなサーバまるごと仮想化ではなく、コンテナという単位で動作するので色々サクサク。

Docker - Wikipedia

ちなみに言語はgoで書かれてるらしい。

本題

ポートフォワーディングのこと

本題です。

このboot2dockerを使ってDockerのコンテナをローカルのmac上で構築、httpサーバを動かした時に、 いくらやってもローカルのmacからhttpでアクセスできない、と。

Dockerのポートの設定としては、

  • Dockerfileに書く

EXPOSE 80 443

  • docker runする時に-pオプションでホストとバインドする
 $ docker run -p 8080:80 image_name

があるんですが、とりあえず上記設定をしてローカルのterminalから

$ curl localhost:8080

とやっても一向に取得できない(´・ω・`)

調べてみると、boot2dockerはVirtualBox上のVMで走ってるので、 VMのポートフォワード設定もしないといけないらしい。

なんかCLIからもいけるみたい。

$ VBoxManage controlvm "boot2docker-vm" natpf1 "nginx,tcp,127.0.0.1,8080,,80"

GUIコンソールから見てみても確かにできてるぽい。

もっかいチャレンジ。



.
.
.


取得できない(´・ω・`)

なんでやねん(´・ω・`)





ん?そういえばVM上でboot2dockerが走ってるってことは、

コンテナのポート -> VMのポート -> ローカルのポート

って3段階(2段階?)のポートフォワーディングかましてるってことか

つまり現状だと

コンテナ:80 -> VM:8080 -> ローカル:8080

になっちゃってるわけか。

さっきVirtualBoxでやった設定は、VM:80 -> ローカル:8080だから、

コンテナ:80 -> VM:80 -> ローカル:8080

にしないとダメってわけね。納得。



ということでdocker runのオプションを

docker run -p 80:80 image_name

にしてみたら見事に取得できた。

多分これがLinux上とかだと コンテナ:80 -> ローカル:8080 だけでいいんだろうな。

とりあえず解決したのでこれからDocker使ってAPIサーバとWebサーバとDBサーバ立てて フロントはReactでAPIはgoでとかやろう。

夏だしgolang始めてみました

ご無沙汰してます。

とっしぃです。

一度書くの止まっちゃうともう無限に止まっちゃうんですよねブログ。

その円環の理を破るためにもたまには更新します。

まえがき

最近の業務的には特にネタになるようなものがなく、淡々と改修やらなんやらやってたんですが、 プライベート、というかtwitter界隈でよく目にしていたgolang(GO言語)がなんか良さそうってんで ちょっとやってみっかと思ったのでその話でも。

なんでgolang

そもそもなんでgolangかっていうとこなんですが、理由は何点か。

  • 就職した時から転職するまではずっとjavaだったけど最近はphpjavascript、たまにbashくらいしか触ってなくて、もっかい静的な言語やりたいと思った
  • ちょっとしたサービス作りたくて、バックエンド・フロントエンドと考えたらバックエンドはAPIサーバ、フロントエンドはjsでのSPAが理想型(個人的には)だなーと思った
  • APIサーバだったらViewとか要らなくて、CakePHPやらLaravelやら、RoRやらDjangoやら、Expressやらは要らない、つまりphpとかrubyとかpythonじゃなくていい
  • だったら静的言語にしよか
  • でも今更Javaもなー。記述量は多かったしモダンさはないよね。仕事ならともかく趣味なら趣味に走ろう
  • js界隈、python界隈の人がgolanggolang言ってて気にはなっていた
  • 同じく名前よく聞いていたのはRustだけど、これはホントに文献なくて困った
  • んじゃもうgolangかなぁ

てな感じ。

調べてたらあのカヤックさんもgolang推進派ぽくて、これは今後やっといて損はないのかなとも。

www.kayac.com

golangてどんな言語やねん

ものすげーざっくりと、

  • 静的型付け言語
  • C系言語、Python辺りに影響を受けたらしい Go (プログラミング言語) - Wikipedia
  • セミコロン要らない
  • スライスっていう便利な配列みたいなのがある
  • ループはforだけ
  • switchで式が使える
  • switchでbreakいらない
  • runeなんていう厨二心をくすぐる型がある(int32と同じらしい)
  • 例外(Exception)がない
  • 構造体(struct)がある
  • 型定義ができる(type)
  • 継承がない
  • interfaceはある
  • 変数定義と代入を同時にやる:=って演算子がある
  • 並列処理が得意らしい
  • goルーチンてのがある

とりあえず何すりゃいいんだろう

まずはここと

golang-jp.org

ここ見ながら、

golang.jp

この演習やればよさそう

A Tour of Go

あとWeb系やるなら

qiita.com

とか

Atom(エディタ)の設定

qiita.com

とかって感じすかね。

今後

サービスの進捗とかgolangの発見とかあったらまた都度書いていきます。

CentOS7系のコマンド

おはようございます。

最近はCentOSとCoreOSが混ざって大変なとっしぃです。

「DockerとCoreOSの決別」みたいなエントリが、
「DockerとCentOSの決別」に見えてもうわけわからんことになってました(´・ω・`)



まぁそれはおいといて、



ちょこちょこVagrantで適当なVM作って遊んで捨てるのが日課……ではないですが
そんなことしてまして、

そういえばCentOS7出てコマンドも色々変わって大変とか聞くけどまだ触ってないな−

と思い、Vagrantならちょこっと入れて遊べるのでやってみました。



まぁVagrantの使い方は色んなとこで詳しく載ってるので今回は割愛。

……どうでもいいですけど「かつあい」ってタイプしたはずが「かあつあい」になってて、
変換したら「加圧愛」。
加圧トレーニング中のはるな愛が浮かんでしまって今脳内が大変です。
……どうでもいいですけど。



んで、とりあえずターミナルで他のサーバの作業とこんがらがるのが怖いのでhostnameだけでも変えとくかーと思って

$ sudo vim /etc/sysconfig/network

って打ってみると、

# Created by anaconda

……ん?

NETWORKING=yes
HOSTNAME=localhost.localdomain

みたいな感じじゃないの?

ここからして違うのかーと、7系への道のりが長そうだなと思ってしまったわけです。


ちなみにhostnameの変更は

$ sudo vim /etc/hostname

で、中身は

localhost.localdomain

わかりやすい。



あと大きいのはserviceコマンドですよね。

serviceとchkconfigが一緒になって、systemctlに統合されたのはいいんですが、
まず「systemctl」が打ちにくいっていう(´・ω・`)

serviceは1単語だけどsystemとctlで2単語っぽいのがね。
あと英単語なら子音子音て続くのあんまないけど略語になると子音だらけで打ちづらい。


までも6系までは色んな設定ファイルの場所覚えて変更箇所覚えないといけなかったのが、
今度は基本的にコマンドでやるみたいな方針ぽいので、そこは--helpでどうにかなりそうなのがいいかな。



業務だとしばらくは6系だろうから頭の切り替えが辛いけどそこはしょうがないね……。



# 追記
こんなのあった。
iptabled > firewalldとかNICのUP/DOWNとかファイルシステムの変更とか色々あんのね。
もっと触ってこ(´・ω・`)


CentOS6とCentOS7の比較表 - Qiita

vimのtags設定(セミコロンの意味的な)

vimrcでtaglistの設定をごちゃごちゃといじくってる時に、下記サイト


Re: vimの勉強〜タグジャンプの勘どころ〜 - daffy log - 永遠に未完成

2009-07-22 - daffy log

を見つけて、

最後のセミコロン重要。

'tags'オプションに指定するセミコロンは便利なのに割と知られていないので紹介してみた。詳細は :help file-searching

って書いてあったので実際に調べてみた。

:help file-searching

をとりあえず叩いてみる。

1637 2) Upward search:
1638 Here you can give a directory and then search the directory tree upward for
1639 a file. You could give stop-directories to limit the upward search. The
1640 stop-directories are appended to the path (for the 'path' option) or to
1641 the filename (for the 'tags' option) with a ';'. If you want several
1642 stop-directories separate them with ';'. If you want no stop-directory
1643 ("search upward till the root directory) just use ';'.
1644 /usr/include/sys;/usr
1645 will search in:
1646 /usr/include/sys
1647 /usr/include
1648 /usr
1649
1650 If you use a relative path the upward search is started in Vim's current
1651 directory or in the directory of the current file (if the relative path
1652 starts with './' and 'd' is not included in 'cpoptions').
1653
1654 If Vim's current path is /u/user_x/work/release and you do
1655 :set path=include;/u/user_x
1656 and then search for a file with gf the file is searched in:
1657 /u/user_x/work/release/include
1658 /u/user_x/work/include
1659 /u/user_x/include

あ、ちなみにVimCentOSに7.4入れたやつです。
neocomplete使いたかったので(*´艸`*)


んで多分L1639の最後のThe辺りからがそれっぽいこと書いてそう。

まずはGoogle翻訳にぶち込んでみましょう。

';'ストップディレクトリはと( 'path'オプションのために)パスに、または( 'タグ'オプション用)のファイル名に付加されます。必要に応じていくつかのストップディレクトリがで区切り';'。

日本語でおk(´・ω・`)


拙い英語力(しかも読むのonly)で超意訳してみると、

「上方向に検索するならセミコロンで区切って、そのストップディレクトリ指定するといいよ。
ストップディレクトリ指定しない(Rootディレクトリまで遡る)ならセミコロンだけつけてね」

ということだろうか。


と思ってもうちょい検索したらこんなん出てきてしまった。

2) 上向き検索:
この方法ではディレクトリを指定すると、そのディレクトリから上に遡ってファイ
ルを探す。上向き探索の上限となるディレクトリが指定できる。それはパス (オプ
ション 'path') かファイル名 (オプション 'tags') の末尾に ';' で区切って指定
する。複数のディレクトリを指定したいときはそれらを ';' で区切る。上限ディレ
クトリを指定したくないときは (ルートディレクトリまで上向き検索したいとき)
';' だけを付ける。

Vim documentation: editing


めっちゃわかりやすい!!!


でもまぁさっきの超意訳とそんなに違うことは言ってない気がする。

よかったよかった。

VimのNeobundleで「neobundle#rc() is deprecated function.」

お久しぶりです。とっしぃです。

最近家庭の事情もありましてなかなか記事が書けてないです(´・ω・`)


でとりあえず軽いテーマが一つあったのでちょろっと更新。



普段使ってるエディタは基本的にVimなんですが、最近部署が変わったこともあって新しいMacBookProが支給されたのでそれにもVimの設定しとこうと思ったわけです。

そしたら

[neobundle] neobundle#rc() is deprecated function.
[neobundle] It will be removed in the next version.
[neobundle] Please use neobundle#begin()/neobundle#end() instead.

なんだこれ(´・ω・`)


上のメッセージをよく読んでみると、


neobundle#rcは次のバージョンでなくなるから、neobundle#begin()/neobundle#end() 使ってね


と。


調べてみるとまぁちょこちょこ出てきますね。

ここ(
neobundle#rc()がdeprecated functionになる場合 - Qiita
)を参考に

call neobundle#begin(expand('~/.vim/bundle/'))
NeoBundleFetch 'Shougo/neobundle.vim'
call neobundle#end()

これで出なくなりました。やったね!


他の参考:

Shougo/neobundle.vim · GitHub

VimでNeoBundleのアップデートに伴いプラグインのデフォルトブランチをmasterに変更 - rcmdnk’s blog

MySQLのクエリキャッシュ

ご無沙汰しております。とっしぃです。


私事になりますが5月末に結婚しました(๑╹ڡ╹๑)
式が終わって6月頭にちょっとした旅行、8月に引っ越しと、
未だかつてないバタバタ具合で行っておりました。


なのでこのブログ(ただのメモですけど)もだいぶ滞ってしまいました(´・ω・`)


色々と一段落はしたので、またちょこちょこと更新していこうと思います。


その一発目として、今までめんどくさそうと思ってあんまり手を出してこなかったMySQLのクエリキャッシュについてのメモでも。


クエリキャッシュで何ができるのか

MySQLのクエリキャッシュでは、発行されたSQLのうち、SELECTステートメントのテキストを結果と共に格納します。
全く同じクエリを受け取った際には、その格納されたクエリキャッシュの中から結果を返し、一からクエリの解析や実行を行いません。

参考:
MySQL :: MySQL 5.1 リファレンスマニュアル :: 4.12 MySQL クエリ キャッシュ

クエリキャッシュの設定

まずは現在クエリキャッシュが有効かどうかを調べます。

mysql> show variables like 'query_cache_%';

もしくは

# mysqladmin -uroot -p variables | grep query_cache

その結果のうち、
query_cache_size
を見て、値が 0 でなければ有効な状態です。

これが 0 だった場合にはこれを設定しなければなりません。

Linuxで一般的な設定ファイルの場所である

/etc/my.cnf

の [mysqld]セクションに、

query_cache_size=16M

と記述し、mysqlを再起動します。
値は環境によって変わりますが、後々稼働状況を見て変更していくのでもいいと思います。


query_cache_size以外にも、

query_cache_limit
query_cache_min_res_unit

と言った項目も設定できます。

query_cache_limitはキャッシュする結果のサイズ上限を、
query_cache_min_res_unitはキャッシュするデータのブロック単位サイズを表します。


参考:
[ThinkIT] 第6回:query_cache_sizeの違いによるパフォーマンス比較 (1/3)
MySQL :: MySQL 5.1 リファレンスマニュアル :: 4.12.3 クエリ キャッシュの設定

効果測定

mysql> show status like 'Qcache%';

もしくは

# mysqladmin -uroot -p extended-status | grep Qcache

などとして、現在のキャッシュ状態を確認します。

Qcache_free_blocks 1  空きブロック数
Qcache_free_memory 5489800  空きメモリサイズ(バイト)
Qcache_hits 1944  クエリヒット数
Qcache_inserts 649  キャッシュされたクエリ数
Qcache_lowmem_prunes 0  メモリが足りずにキャッシュから削除されたクエリ数
Qcache_not_cached 171  キャッシュされなかったクエリ数
Qcache_queries_in_cache 649  キャッシュされているクエリ数
Qcache_total_blocks 1353  キャッシュ内のブロック数

これのうち、
Qcache_free_memory
Qcache_lowmem_prunes

を見ることで、キャッシュを必要としているクエリとそのクエリに対するメモリサイズが分かります。
これにより、必要に応じてキャッシュサイズの増減を行います。


おわりに

今まではWebアプリのパフォーマンスといえば、まずはアプリケーションの作り、次にWebサーバ(Apache、Nginx)の設定辺りでなんとかなってきたんですが、
ここにきてやっぱりMySQLのチューニングって大切なんやな(´・ω・`)ということがよく分かりました。

この業界の第一線で戦う諸兄方にとっては今更かよと言った内容だと思いますが、そこにこうやって少しずつでも近づいていけるように
これからも貪欲に知識・経験を吸収していかないとなーと思った次第です。

SSL証明書の発行

お久しぶりです。とっしぃです。

長らく間が空いてしまいました。
まぁそれというのも来月辺り、ちょっと人生的な大きなイベントがあってその準備に奔走してるというのがあるんですがそれはまた別の話として。

今回もまた備忘録的なメモです。

たまーにサーバのSSL証明書発行するんですが、その度にコマンドとか忘れるのでとりあえずここに書いときます。

  • 鍵作成
openssl genrsa 2048 > server.key
openssl req -new -key server.key > server.csr
  • 証明書作成
openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
openssl req -text < server.csr
  • 証明書確認
openssl x509 -text < server.crt

※コマンドオプションの意味とかはまた追記するかも。



ちなみに略語は

CSR Certificate Signing Request(署名要求)
CRT Certificate
DER Distinguished Encoding Rules形式
PEM Privacy Enhanced Mail形式

ということだそうです。