Saturday 11 February 2012

プログラマキャリアの見通し

僕が今まで何を考えてphpを書き始めて何をやってきたのか
僕がこれからプログラマとしてどうキャリアを築こうとしてるのかを軽くメモしておこう

そもそもなんでプログラムを書こうと思ったかは別の機会に

-2011 夏頃
「とりあえず書いてみよう」
phpを書き始める。phpにした理由は2つ
・仕事で使ってたのがphpで、少しは見慣れてる&周りに教えてくれる人がいる
・覚えるのが楽という噂

環境はプログラマの人のアドバイスでxamppを使って手間なしで作成。エディタは秀丸
codezineとかphp101を見ながら見ようみまねでコードを書く
やはりいきなり動いた!できた!っ感動がさくっと味わえるのはいいですね
けど仕事忙しい!っていってしばし放棄

-2011 年末
「全体像をつかみたい」
中断していたphpを再開。退職&帰国して時間がたくさんとれるようになる
まずは自分のキャリアのイメージを作るために概要をつかみたかった

 やったこと
プログラム周辺部の知識をざくっと学ぶ
「いいコード」とはとか、プログラムの動く仕組みとか、webの仕組みとか


-2012 初頭
「とりあえずサービス作る」
就職のために人に見せれるコード書こう!と思いつつ、学びたいこと優先に
ついでにお金も稼ごうとする

 やったこと
VPS借りてLAMP環境を構築。LINUXとかも学ぶ
依頼受けてwebサービス(というかphpちょっと使ったwebサイト)作る
そのためにHTML5、CSS、軽くバナーのデザイン、jqueryの使い方とか学ぶ。本当に軽く
CakePHPの勉強を始める
androidアプリ作りたいから次はJAVA勉強したいなーと思う


今考えてること
「就職どうしよう…」
プログラマとしての地位の確立のため、「できること」「基礎」を作ってから
「これからの技術」に手を出してトップランナーを目指す

就職は悩ましい
そもそもは安定収入+勉強効率upで就職したい!だったけど
・自分で見通せるようになって「やりたいこと」が増えてきた
・一番つまる最初の峠を超えた気がする
のでちょっと迷い始めた
チームとしての開発とか、総合的なプロモーションまで含めた知見はまだ得たいし
もちろんフリーとしての仕事からの収入がしょぼければせざるを得ないけどさ
ただとりあえず受託で開発だけします!って形の就職はもう選択肢から外そうかな

技術的には
あとひと月くらいCakePHPを深く勉強しつつ、今受けてるやつ+2,3のサイトリリース
その後はJAVAか新しい技術か就職してそこで要求されるものか…

正直JAVAはやめようかなと思っている
そもそもJAVA勉強したいのはandroidアプリ作りたいからなんだけど、いったんtitaniumとかphonegapとか試して必要性を感じたらでいいかなと
ということで、JAVAは優先度下げつつ就職活動の結果次第で変動ですな

そんな感じで頑張っていこう!

Forrest Gump見た

土日は少しは息抜きの時間をとろう!ってことで飲みにいくか映画を見るようにしています
抽象的思考に偏りがちなプログラマにおいては、具体的なものに触れる機会は意図的につくるべきだと思っています

というわけで、昨日は名作Forrest Gumpを初めて見ました

序盤から走って〜フォレスト!走るのよ〜みたいな
僕でも知っている台詞が出てきてテンションアップ!
最後まで興味深く見れました

感想としては、めまぐるしく変わる状況の中で、
変わらないものの価値がより強烈に表現されているなと

フォレスト自身の親友、社会的な立ち位置、ジェニーの境遇、アメリカ社会そのものが激しく変化していく中で、
フォレスト母の愛、フォレストの誠実さ、ジェニーへの気持ちは変わらないと

そして変わらないフォレストの誠実さは
ダン中尉、バッバ一家という先祖代々の脈々と受け継がれてきた、DNAレベルで刻み込まれてるように見えた生き方、生き様まで変えてしまう

見えない権力や現状にしばられず、変わらぬ愛と誠実さを持ち続けて自由な個人として生きよう!
みたいなメッセージがこめられてるのかなと思ったり

しかしそんな生き方の象徴っぽいフォレストも、小さい頃の母親の言葉を真理として信じ込み、軍隊やアメフトの世界で完全に一つの駒に徹して生きているわけで
そんな一面があるからこそ、一般の人にも上述のメッセージが受け入れられやすくなるのかもしれない

キャラでいうとダン中尉がすきですね
プライドとフラットさの両立がいい感じです

あとベトナム戦争の映像見て東南アジアのあの気候が懐かしくなった
前はシンガポールという都会だったので、ああいう自然あふれるところに滞在したいな

そんなこんなで明日からはCakePHPを勉強するぞー

Friday 10 February 2012

[LAMP]さくらVPSにLAMP環境構築

以前の記事の続きです。


以前の記事でセキュリティ関連の対応をすませたので、
今回はwebサーバーとして動作するために必要なソフトを入れていきます
環境はさくらVPS、OSはCentOS5.6です


概要
・外部リポジトリを導入
・apache,mysql,php,phpmyadminをインストール
・apacheの設定
・phpの設定
・mysqlの設定
・phpmyadminの設定




まずは「wget」で登録する外部リポジトリのファイルを取得します


外部リポジトリの導入についてはこちらの記事でも触れています
※URLは2012/2/10現在、CentOS5、x86_64です(兄ちゃんの誕生日だ。。)
epel
$ wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
remi
$ wget http://rpms.famillecollet.com/el5.x86_64/remi-release-5-8.el5.remi.noarch.rpm
rpmforge
$ wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm


次に取得したリポジトリを登録
$ rpm -Uvh epel-release-5-4.noarch.rpm remi-release-5-8.el5.remi.noarch.rpm rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
ここでエラー発生
error: can't create transaction lock on /var/lib/rpm/__db.000
su権限じゃないとダメでした


続いて取得したリポジトリを無効化します
標準外のリポジトリはトラブルの元になる可能性もあるので、意図せず使用されないようにします
vi /etc/yum.repos.d/epel.repo
failovermethod=priority
enabled=0
↑ 1を0に変更
vi /etc/yum.repos.d/rpmforge.repo
failovermethod=priority
enabled=0
↑ 同様に1を0に変更


remiはデフォルトでenabled=0なので変更の必要なしです




それでは必要なものを一気にインストールします


# yum --enablerepo=remi,epel,rpmforge install httpd-devel php-devel php-pear mysql-server phpmyadmin
2回y/nでyを選択すれば完了するはずです


以下インストールしたものをメモとして残しておきます


  Installing     : php-common                                              1/28
  Installing     : httpd                                                   2/28
  Installing     : mysql-libs                                              3/28
  Installing     : apr-devel                                               4/28
  Installing     : libedit                                                 5/28
  Installing     : php-cli                                                 6/28
  Installing     : perl-DBI                                                7/28
  Installing     : php                                                     8/28
  Installing     : mysql                                                   9/28
  Installing     : php-mbstring                                           10/28
  Installing     : php-pdo                                                11/28
  Installing     : php-mysql                                              12/28
  Installing     : mysqlclient15                                          13/28
  Installing     : perl-DBD-MySQL                                         14/28
  Installing     : cyrus-sasl-devel                                       15/28
  Installing     : libtool-ltdl                                           16/28
  Installing     : libmcrypt                                              17/28
  Installing     : php-mcrypt                                             18/28
  Installing     : openldap-devel                                         19/28
  Installing     : expat-devel                                            20/28
  Installing     : db4-devel                                              21/28
  Installing     : mysql-server                                           22/28
  Installing     : php-devel                                              23/28
  Installing     : apr-util-devel                                         24/28
  Installing     : php-pear                                               25/28
  Installing     : phpmyadmin                                             26/28
  Installing     : httpd-devel                                            27/28
  Installing     : httpd-devel                                            28/28



ちなみにここを参考というかこの通りにやっています
ウェブ開発者のための、1時間でできるLAMP環境構築術(CentOS編)




続いてapacheの設定


余計なモジュールの停止
$sudo vi /etc/httpd/conf/httpd.conf
下記部分をこのように設定します

ここに概要があるので、ここを見つつ良くわからないものを調べてみると良いかと
# Example:
# LoadModule foo_module modules/mod_foo.so
#
#LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_alias_module modules/mod_authn_alias.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
#LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_default_module modules/mod_authz_default.so
#LoadModule ldap_module modules/mod_ldap.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
#LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule logio_module modules/mod_logio.so
#LoadModule env_module modules/mod_env.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
#LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
#LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
#LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
#LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule info_module modules/mod_info.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule suexec_module modules/mod_suexec.so
#LoadModule disk_cache_module modules/mod_disk_cache.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule mem_cache_module modules/mod_mem_cache.so
#LoadModule cgi_module modules/mod_cgi.so

これでかなり使用メモリが削減されます


次は同時アクセス数の設定

下記の部分ですね。内容は先ほどのページをご参考に
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   10
ServerLimit      256
MaxClients       30
MaxRequestsPerChild  800
</IfModule>


apachを起動してみます
# service httpd start



mysqlの設定


まず起動します
# service mysqld start


続いて専用スクリプトで設定
# /usr/bin/mysql_secure_installation
最初はパスワードはないので何もいれずリターン
続いてrootパスの設定、その後は全てyで問題なし




phpmyadminの設定


ランダム文字列の設定が必要です
$ sudo vi /usr/share/phpmyadmin/config.inc.phpip

下記部分を入力します
$cfg['blowfish_secret'] = 'ここに適当な文字列'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

後は接続元のipを指定します

$ sudo vi /etc/httpd/conf.d/phpmyadmin.con

<Directory "/usr/share/phpmyadmin">
  Order Deny,Allow
  Deny from all
  Allow from 127.0.0.1
  Allow from ここに追加
</Directory>
これでphpmadminに接続できます

最後に各ソフト自動起動の設定をします
# chkconfig httpd on
# chkconfig mysqld on
設定確認
# chkconfig --list|grep -E "httpd|mysql"
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off
上のようになってればOK!



ついでにやったこと
vimの導入
screenの導入




そのうちやりたいこと
eAccelaraterの導入




反省
最初は全て調べて全体像を理解しながらやっていたが、
途中からあまりの進みの遅さにいらいらして一気にやってしまいました
これから徐々に勉強していかなきゃ…

[LAMP]さくらVPSセキュリティのために最初にやること

共有サーバーからVPSに乗り換えるにあたり、
LAMP環境の構築過程をメモしながら進めていきます
まずはLAMP環境と関係ないセキュリティ関連まとめ


やることの全体像
・ユーザー権限の設定
・公開鍵による認証に変更
・denyhostの導入
・ファイアウォール設定




ざっくりとユーザー権限関連の設定

とりあえずさくらのVPSコントロールパネルにログインし、VPSサーバーを起動

最初にログイン用のユーザーを作成し、root権限でのログインを禁止します
その後ssh認証を禁止し、公開鍵での認証に変更します

ターミナルでssh接続
$ ssh -l root [IP]
警告の後yesを入力→パスワードを入力でログイン

まずは「passwd」でrootのパスワードをデフォルトから変更
# passwd
Changing password for user root.
New UNIX password: 
Retype new UNIX password: 
passwd: all authentication tokens updated successfully.
新規の入力、確認の入力で完了

「useradd」で作業用アカウントを作成「passwd」でパスワード設定
# useradd hoge
# passwd hoge
Changing password for user hoge.
New UNIX password: 
Retype new UNIX password: 
passwd: all authentication tokens updated successfully.

「usermod -G wheel」で追加したユーザーをwheelグループに設定
# usermod -G wheel hoge

viで"su"を編集
# vi /etc/pam.d/su
#auth           required        pam_wheel.so use_uid
このコメントを外す 

「visudo」でsudoの設定を変更
# visudo
## Allows people in group wheel to run all commands
#%wheel  ALL=(ALL)       ALL
↑下の行のコメントを外す

一旦接続を切って、今作ったアカウントで接続してみる。成功

新規ユーザーでコマンドのパスを通す
$ vi .bash_profile
/bash_profileを編集する
これの下に
# User specific environment and startup programs

PATH=$PATH:$HOME/bin
これを追加して保存する
PATH=$PATH:/sbin
PATH=$PATH:/usr/sbin
PATH=$PATH:/usr/local/sbin
最後にこれで反映
$ source ~/.bash_profile



続いて公開鍵暗号方式による認証の設定

キーのペアを作成し、公開鍵をサーバーにコピーする
「ssh-keygen」でキーのペアを作成
$ ssh-keygen
Generating public/private rsa key pair.
キーの名前を入れる。そのままでよければそのまま。その後パスフレーズを入れる
Enter file in which to save the key (/Users/RM/.ssh/id_rsa): hoge
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in hoge.
Your public key has been saved in hoge.pub.

次に公開鍵"hoge.pub"の内容をサーバー側にアップ
ディレクトリを作成
$ mkdir -p ~/.ssh
パーミッションを700に設定
$ chmod 700 ~/.ssh
autorized_keyを作成し開き、hoge.pubの内容をコピー&ペースト
$ vi ~/.ssh/authorized_keys
authorized_keysのパーミッションを変更
$ chmod 600 ~/.ssh/authorized_keys
※この過程でパーミッション変更をしないと後で
Permission denied (publickey,gssapi-with-mic)のエラーの原因になります

ここで公開鍵認証での接続がどうしてもうまくいかない…
ログインできなくなるとやたら反応の遅いVPSコントロールパネル内からの操作になるので
パスワード接続をいったん可にして試行錯誤…


最終的にはauthorized_keysがただしくコピペできてなかったというオチ
時間返して!
これは難関だと思い公開鍵暗号方式の認証用エントリまで書きました




続いてdenyhostの導入


定期的にログをチェックして、接続失敗しているipを自動的に拒否してくれます


epelリポジトリを登録していない場合はまず登録します
方法はこちらの記事を参照


続いてインストール
$ sudo yum -y --enablerepo=epel install denyhosts


完了したら起動し、自動機同設定を行います
起動

$ sudo /etc/init.d/denyhosts start
starting DenyHosts:    /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/etc/denyhosts.conf
自動起動設定
$ sudo /sbin/chkconfig denyhosts on

これで自動的に接続失敗を繰り返すipをはじいてくれます
常に許可したいipがある場合は下記に記載します
$ sudo vim /var/lib/denyhosts/allowed-hosts


最後にファイアウォールの設定

iptablesを設定します
さくらVPSだとデフォルトでインストールされています

まずは初期設定を見ておくといいと思います
$ sudo iptables -L
何も設定されていない状態です

では設定ファイルを記述します
このファイルは新規作成になります
$ sudo vi /etc/sysconfig/iptables

webサーバー用にSSH,ftp,http,httpsをあける設定は下記のように記述します
*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
 
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# HTTP, FTP1, FTP2, SSH
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22    -j ACCEPT
 
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
 
COMMIT

※sshのポートを変更している場合は最後の22を設定通りに変更します

これで再起動すれば完了
$ sudo /etc/rc.d/init.d/iptables restart
設定の確認
$ sudo iptables -L

これでいったん完了!
結構さくさく進みますが、各部の詳細の理解を進めたいところです