2013年4月26日金曜日

MacにMongoDBをインストールしてApacheに設定

MacにMongoDBを入れる

MongoDBをMacにインストール

$brew update
$brew install mongodb #mongodbがこれでインストル出来る
$brew upgrade mongodb #アップデートはこっち

apacheからMongoDBを利用できるようにする

apacheからMongoDBを利用できるようにするために、MongoDBのモジュールを生成します。

モジュールのインストール

#モジュールを生成する一時ディレクトリに移動
$cd ~/tmp
#http://pecl.php.net/package/mongo を参照してほしいモジュールをダウンロード
$wget http://pecl.php.net/get/mongo-1.3.7.tgz #書いてる時点での安定版
$tar zxvf mongo-1.3.7.tgz

モジュールのコンパイル

$cd mongo-1.3.7
$phpsize
$.configure
$make
$make test
$make install #インストール後インストール先が表示される
#例
#/Users/hoge/.phpenv/versions/5.4.10/lib/php/extensions/no-debug-non-zts-20100525

mongo.iniの追加

apacheにMongoDBの設定ファイルを追加します

$vim /Users/hoge/.phpenv/version/5.4.10/etc/mongo.ini
#以下を追加(pathはインストール先に合わせて変更)
$extension= /Users/hoge/.phpenv/versions/5.4.10/lib/php/extensions/no-debug-non-zts-20100525/mongo.so
#apacheを再起動して終わり
$sudo apache restart

2013年3月22日金曜日

HTML5とか勉強会に参加してきました


第37回HTML5とか勉強会  - ビギナー向けデバッグツール特集 - に参加してきました。

http://html5j.komasshu.info/al37th.html


内容に関しては、誰かがまとめてくれると思うので、感想を書いてきます。

1Chrome Devtoolsでデバッグ 吉川さん

Chromeでのデバッグはビギナー向けということでほとんど知ってる内容でした。
それでもショットカットキーとかは知らなかったので聞けてよかったです。

2  Safariでデバッグ 中島さん

 SafariはのデバッグツールはChromeのDectoolsに似た印象でした。
 デフォルトのユーザエージェントにAndroidがないのはさすがAppleですね。
 iOSのデバッグならSafariが一番というかSafari一択かな?

3 Firefoxでデバッグ 浅井さん

 Firefoxのデバッグというと「firebug」の印象しかなかったですが、デフォルトのデバッグツールも良さげでした。
 エラーメッセージ等が日本語が表示されるのは英語が苦手な身としては嬉しい!
 あと3D表示なんかもあって人のサイトを見るときはFirefoxのデバッグツールが一番いいかも。

4 IEでデバッグ 物江さん

 IE対応はいつだって苦労するイメージなので(やったことない)IEのデバッグツールがしっかりしてるのはいいですね。
 聞いた印象だとVSといろいろ似てたのでMS製品と仲が良いと使いやすそうだった。

5 Adobe Edge Inspectを利用してデバッグ 轟さん

 モバイル対応サイトのデバッグをしたことがないので、どうすごいのかイマイチわからなかった。
 それでも機能が豊富なのはわかったので、モバイルサイトのデバッグすることがあったら触ってみたいです。

まとめ

 少し前にCromeのdevtoolsについては勉強したことがあったのですが、他のブラウザのデ バッグツールはノータッチだったのでいろいろと勉強になりました。
特にIEのデバッグツールが想像よりもしっかりしてたのは驚きました。




2013年3月14日木曜日

MacにローカルのPHP開発環境を整える

MAMPとう開発環境があるのですが、今回はMongoDBが使いたいのでこれは使えないです。
(MAMPはMac, apache, MySQL, PHPの開発環境を整えるツール)
環境
 Mac 10.8.2
 HomeBrew インストール済み 

整えたい環境
Apache
PHP 5.4系
MongoDB(今回はまだ入れない);

サーバーは基本的には必要な場所以外はいじってないです。
以下に基本的なファイルの場所を示します。
/usr/local/Cellar/httpd/2.2.23/etc/apache2/httpd.conf 設定ファイル
/usr/local/Cellar/httpd/2.2.23/share/apache2/htdocs/ 公開ディレクトリ
/usr/local/Cellar/httpd/2.2.23/var/apache2/log/ エラーログ
Apacheインストール
       
$brew tap Homebrew/dupes
$brew install httpd
Macにはデフォルトでapacheが入っているのですが、今回は新しく入れた方を使いたいのでpathを追加。
 # .zshrcのPATHに追加
PATH = /usr/local/sbin/httpd  #pathに追加
$which httpd #参照しているhttpdを確認
/usr/local/sbin/httpd #これが出てれば成功 
phpenvインストール これはPHPのバージョンを切り替えるツールです。
今回はすぐには使わないけどどうせ後々使うので。
       
$ brew tap josegonzalez/php
$ brew install --HEAD phpenv
.zshrcに追加
if [ -f $HOME/.phpenv/bin/phpenv ]; then
    export PATH=$PATH:$HOME/.phpenv/bin
    eval "$(phpenv init -)"
fi
php-buildのインストール
$ brew install php-build
php-buildはデフォルトではApacheモジュールに対応してないので以下を追加。
# /usr/local/share/php-build/default_configure_options に追加 
--with-apxs2=/usr/local/sbin/apxs
phpのインストール
$php-build 5.4.5 ~/.phpenv/versions/5.4.5
#エラーがでたらその都度必要な物をインストール
これでPHPのインストールができたのでapacheにPHPを設定していきます。
以下をapacheのhttpd.confに追加(PHPの設定なのでファイルを分けてもいいですが、今回は分けずに記述)
LoadModule php5_module        libexec/libphp5.so

        AddType application/x-httpd-php .php
        AddType application/x-httpd-php-source .php

        
                DirectoryIndex index.html index.php
        

最後にサーバーを再起動して完了
sudo apachectl restart サーバー再起動
起動時にerror先ディレクトリがないと起動できない場合があるのでその場合はディレクトリを手動で作成してください。
これでローカルでPHPを動かすことができると思います。
MAMPと違って環境を作るのは大変ですが、一度環境を作ってしまえばDBを選べたりと融通が効くので作る価値があると思う。
次はMongoDBをインストールしてPHPにモジュールを設定します。

2013年2月24日日曜日

さくらVPS契約後ログイン環境を整えるまで

作業はmacのターミナルで行なってます。

サーバーにアクセスする

契約後届くメールに書いてあるIPアドレスとパスワードを使用してrootとしてログインする。
       
ssh root@xxx.xxx.xxx.xxx
#パスワードを聞かれるのでメールで送られてきたrootのパスワードを入力
#ログイン後ソフトウェアのアップデートを確認
yum update
ログインできたら言語設定を日本後に変更
「/etc/sysconfig/i18」を編集して以下のようにすることで言語設定を日本語に
       
LANG="ja_JP.UTF-8"
SYSFONT="latarcyrheb-sun16"

サーバーで使用するアカウントを作成する

rootでログインを禁止するために普段使うアカウントを作成します。
rootでのログインを禁止したい理由はおそらく以下のようなことだと思います。

  • ユーザの権限を管理したい
  • アカウント名がrootということがわかっているので総当たり攻撃でログインしやすい
  • 間違って設定ファイルを編集しない
※個人の解釈です

ユーザの追加方法

       
  useradd user_name
  passwd user_name

先ほど作成したアカウントでsudoコマンドを使用可能にする

       
  usermod -G wheel user_name
  visudo 
  #開いたファイルで次の行を有効化(105行目付近)
  %wheel  ALL=(ALL)       ALL

今作成したアカウントでのログインを試す。
rootでのログインを無効にしたあとにログインができないと困るので必ず試してください。

#ローカルで
ssh user_name@@xxx.xxx.xxx.xxx
#パスワードを求められるでの先ほど設定したパスワードを入力
#以下サーバー側
#root 権限で編集を行う
sudo -s
#設定ファイルを変更する前にはバックアップをとる
cp /etc/ssh/sshd_config  /etc/ssh/sshd_config.bak
vim /etc/ssh/sshd_config
#root でのログインを禁止
PermitRootLogin no #コメントアウトされてるのでyesをnoに変更後有効化
#編集が終わったら反映させる
service sshd restart

これでsshでrootでのログインができなくなったはずです。

sshでパスワードでのログインではなく、公開鍵認証を利用してログインする

パスワードでのログインよりも、公開鍵認証でのログインのほうが安全性が高いためこっちを利用します。

#鍵の保存場所を作成
mkdir ~/.ssh
cd ~/.ssh
#鍵の作成、今回はRSA暗号方式を利用
ssh-keygen -t rsa 
#パスフレーズを聞かれます
#パスフレーズは設定しないことも可能ですが、その分だけセキュリティが低下します
#~/.ssh/ の中にid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が作成されていれば成功
chmod 600 id_rsa.pub #公開鍵の権限を変更
#公開鍵を転送サーバー側に転送
scp ~/.ssh/id_rsa.pub  user_name@xxx.xxx.xxx.xxx:~/.ssh/authorized_keys
# :以下は転送先を指定します公開鍵の名前は「authorized_keys」が一般的らしい
#転送に失敗した場合はサーバーで先に.sshフォルダを作成してみてください
#ファイル転送はsftpでも問題はないです

#公開鍵でログインできるか確認
ssh -i user_name@xxx.xxx.xxx.xxx

公開鍵でログインができたら今度はパスワードでのログインを禁止します

#サーバー側
sudo -s
#設定ファイルを変更する前にはバックアップをとる
cp /etc/ssh/sshd_config  /etc/ssh/sshd_config.bak
vim /etc/ssh/sshd_config
#yesをnoに変更
PasswordAuthentication no
#編集が終わったら反映させる
service sshd restart

これでパスワードでのログインを禁止して公開鍵認証でログインするようになりました。

2013年2月4日月曜日

MacVimにZenCodingプラグインを導入する手順

MacVimでZenCodingをするためのプラグインをいれたのでメモ。

ZenCodingとはHTML,CSSのコーディングを楽にするツールです。

今回はMacVimでZenCodingを行うためのプラグインである「ZenCoding.vim」を導入します。

1.プラグインをダウンロード

 ZenCoding.vimの「公式サイト」の下の方にあるプラグインをダウンロード。



2. プラグインの導入 

ダウンロードしたzencoding-vim.zipを解答すると、「autoload」「doc」「plugin」フォルダがあるが、「autoload」「plugin」フォルダをホームディレクトリ直下にある「.vim」フォルダ内にコピーします。
 これで導入が完了。
※ネットで検索するとautoloadフォルダの中はzencoding.vimだけコピーすればいいと書いてありましたが、これだけだと補完がうまくいかなかった。更新された時に依存するファイルが変わったのかもしれません。


3.動作確認


vimを起動して挿入モードで「html:5_」と入力して挿入モードのまま「CTRL+ y + , 」を入力すると

<!DOCTYPE html> 
<html lang="en">
<head>   
     <meta charset="UTF-8">
     <title></title>
</head>
<body>

</body>
</html> 

が展開されます。

Zencodingのチートシート
「http://zen-coding.googlecode.com/files/ZenCodingCheatSheet.pdf」


2013年2月3日日曜日

2012年12月6日木曜日

一人Advent Calendar 5日目

5日目といいつつ6日の朝です。

4日目の記事も完成してないんですけどとりあえず5日目書きます。

1,2,3日とひたすらYAMLファイルを解析していたのですが実際はどうやって解析するかというのをJYamlのソースを少し見てみます。

Yamlの解析はデータの種類を把握しないといけないので流れしては

1 データ読み込み
↓
2 データ構造理解
↓
3 データを理解した構造に合わせて変換

でいいと思います

今回は
 
 Yaml.load(new File("test.yml"));
を呼び出したとして処理を追ってみます。

まずはYamlクラスのloadメソッドです
 
public static YamlConfig config = YamlConfig.getDefaultConfig();

public static Object load(File file) throws FileNotFoundException{
   return config.load(file);
}
loadメソッドは様々な引数に対応してましたが、今回はFileを引数に取るのだけを追っていきます。
YamlConfigのloadメソッドに処理を委譲しているようなのでそちらへ。

YamlConfig
 
public Object load(File file) throws FileNotFoundException{
  return load(new YamlDecoder(new FileInputStream(file), this));
}

public Object load(YamlDecoder dec){
  dec.setConfig(this);
  Object ret = null;
  try {
    ret = dec.readObject();
  } catch (EOFException e) {}
  return ret;
}

どうやらloadメソッドにYamlDecoder以外の引数を渡すとYamlConfigクラスの中でYamlDecoderに変換してYamlDecoderを使ってloadを行っているみたいです。
どうやら複数データをシリアライズしている時と1つのデータをシリアライズしている時で呼ぶ方は違っても結局内部では同じメソッド使ってるみたいです。
(落ち着いて考えたら当たり前だった・・・)

次はYamlDecoderクラスのreadObjectメソッドですね。(setConfigメソッドはYamlConfigを渡してYamlDecoderクラスから参照できるようにしているだけだったので省略)

YamlDecoderクラス
 
public Object readObject() throws EOFException{
  try {
    JYamlParserEvent event = new JYamlParserEvent(createLogger(), this);
    if (parser == null){
      parser = new YamlParser(in,event);
      firstDocument(parser, event);
    }else{
      parser.setEvent(event);
      if (!nextDocument(parser, event))
        throw new EOFException();
    }
    
    Object ret = event.getBean();
    
    if (ret == null)
      throw new YamlException("Document is empty.");
    return ret;
  
  } catch (EOFException e) {
    throw e;
  } catch (YamlException e){
    e.setLineNumber(parser.getLineNumber());
    hrow e;
  }
}
最初に呼ばれた時、YamkParserを初期化してfirstDocumentメソッドをそれ以外はnextDocumentメソッドを呼ぶ出しているみたいです。
解析としてはやっていることは同じはずなのでfirstDocument側だけ追います
 
void firstDocument(YamlParser p, YamlParserEvent event){
  try {
    while (p.comment(-1,false));
            
    if (!p.header())
      p.document_first();
    else
      p.value_na(-1);
    }catch (SyntaxException e){
      event.error(e,e.line);
    }catch (IOException e){
      throw new YamlException(e);
    }
}
ここから先はすべてメソッド追っていくと長くなるのでそれぞれのメソッドでなにをしていたかだけ書いていきます、まずはcommentでコメントかどうか判定します。またコメントの前にもtabが使われていたらエラーがでるようになってました。

headerメソッドは---から始まるかどうかを判定してました。


まだここまでしか見れてないですが、ここから先は実際にデータを読み込んで解析してデータを指定されている構造に直せば解析は終わりだと思います。
とりあえず今日はここまでで。