サーバー構築で詰まった話
はじめに
VPSでrailsで作成したサービスを公開する時、 サーバー(≒VPS)設定につまずきました。
初心者(=私)がサーバー設定につまずいた理由
僕が思うにサーバー設定が障害となる最大の理由は 今までやっていた開発(js、ruby、php・・・)と別の知識 が要求されることです。
1.ネットワーク系の単語の意味がわからない。(リバースプロキシ?、ポート?、vim?)
2.サーバー構築するために何をすべきかわからない。(DB設定、ファイアウォール・・・)
3.linuxコマンドの習熟度
上記3つはVPSを扱う上で初歩的な話だと思います。 ただ、私は全く知らずにVPSをの黒画面と格闘していました。
その他理由
加えて、サーバー構築を行なう場合、目に見える世界ではないので エラーが出た時、どう対処して良いのかわかりません。
logファイルを読めば対処出来るのですが、 logを読むという基本を意識していなかったので苦労した経験があります。
サーバー勉強しなくては
とまあ、つらつら書いてきましたが、
サーバーはhtml、js、rubyとは違った方面の知識が必要とされます。
なので、慣れるまでは概念やらコマンドやら勉強する必要があります。
このブログで少しずつまとめていけたらと考えています。
nginx 特徴
最近、nginxでサーバー構築を行っているので、メモがてらブログでまとめます。
webサーバーとは
ブラウザ(chromeやsafari)のリクエスト(例えば、http://www.hatena.ne.jp/にアクセス) に対して自身の返すデータを返す役割を持っています。
ブログを例に取ると、「はてなブログにある私の2月1日の記事」のリンクをクリックした場合、 2月1日の記事をアプリケーションに問い合わせをして記事(HTMLなど)を返す役割です。
つまり、ブラウザとアプリケーション(railsではアプリケーションサーバー) の橋渡しの役割をしています
nginxの特徴
1性能が高い
他のサーバー(僕はnginxしか知らないですが・・・) 同時接続数が増えても落ちづらいと言われています。
ググったら色々とあります。 Qiita記事
2ロードバランサ、リバースプロキシ
nginxはロードバランサ、リバースプロキシの設定が容易なのが特徴です。
3設定ファイルの構造がシンプル
ログファイルを確認するときは /logなど直下的にわかりやすいディレクトリ構造だと感じました。 (他のサーバーは知らないので
次回はリバースプロキシ、ロードバランサをまとめます。
【python】 numpyメモ
sqrt 平方根
import numpy as np np.sqrt([1,2,3]) # array([ 1. , 1.41421356, 1.73205081]) np.sqrt(2) # 1.4142135623730951
dot 内積
v1 = [1,2,3] v2 = [2,3,4] np.dot(v1,v2) #20
degrees radianを返す
np.degrees(3.14) #179.90874767107849 np.degrees(np.pi) #180 #np.piは円周率 (≒3.1415926)
power 累乗
np.power([1,2,3],2) #配列要素をそれぞれ2乗 #array([1, 4, 9])
正規表現 最短マッチ
最短マッチ
躓くことが多いのでメモ。
最短マッチを考える際には通常マッチから考えるとわかりやすい。
- 通常マッチは一番長いパターンをマッチ
- 最短マッチは一番短いパターンをマッチ
通常マッチは一番長いパターンと認識することが重要
例) テキスト例:「hoge」「hoge2」
ケース1 通常マッチケース /「.+」/ →この場合 「 と 」の範囲をマッチ。 テキスト例では「と」が一番長い範囲をマッチさせます。
ケース2 最短マッチケース /「.+?」/
→この場合 「 と 」のパターンの最短ケースを マッチさせます。 ポイントは量指定子(?や*)の前に? をつけることです。 (量指定子はなれるまであまり考えなくては良いかも)
hoge = "「hoge」「hoge」" puts hoge.scan(/「.+」/)[0] #→["「hoge」「hoge2」"] puts hoge.scan(/「.+?」/)[0] #["「hoge」"]
【rubyメモ】evalメソッド
evalとは
入力された文字列をrubyのコードとして解釈出来ます。 evalはKernel moduleに属しています。 kernel moduleはobjectクラスに属しているため、 全てのクラスで使用出来ます。
コード例
test = "aiueo" test2 = "test2" eval("puts test") #aiueo eval("puts 'test2") #test2
【ruby】yieldとブロックの関係
yield
メソッドの中でyieldを実行すると、受け取ったブロックを実行します。
コード例
ブロックとは method do |ブロック変数| ~ end で囲われている処理のことです。
yieldをわかりやすく明記するためにブロック変数を省略した形で書いてみました。
@count = 1 def yield_test puts @count # a @count += 1 yield # b puts @count # c end #ブロック yield_test do #yield_test実行 → a b cの順に実行される puts @count #b yieldからブロック処理実行 @count += 1 #c @countを1増やされる。 end #1,2,3と出力
yield処理を入れた際はブロック処理をmehodに追加することが出来ます。 追加処理を入れる際、便利な気がします。
ちなみにブロックが渡されたか判別するのは block_given? methodを用います。
@count = 1 def yield_test puts @count # a @count += 1 yield if bloc_given? # true→yield実行 今回はfalseなので実行されない puts @count # c end #ブロック yield_test #1,2と出力