カテゴリー別アーカイブ: コマンド

フロントエンドの開発でファイルプロトコル(file://…)ではなくHttpプロトコル(http://)を使う


※ローカルにApacheを立ててバーチャルホストを作って云々という話ではありません。


背景

フロントエンドの開発において、htmlファイルをサクッとブラウザで開けば(file://…)、Javascript, css が動くというのはとてもメリットだと思うのですが、実際にサーバにアップロードしてアクセスするときにはほぼ100% Httpプロトコル(http://)でアクセスすると思います。そういった環境をローカル開発でも使うといいと思います。

file://hoge/fuga/index.html」などをブラウザ確認するとファイル内で imgタグ, scriptタグ, linkタグ などは以下のように 相対パス で書くことになると思うのですが、それをサーバにアップする時に 絶対パス に直すということをしている人は多いと思います。

<img src="img/hoge.png">
<link rel="stylesheet" href="css/hoge.css" />
<script src="js/hoge.js"></script>

その際、いちいち変換するのは面倒くさいので、pythonやrubyで動かせる簡易Webサーバを立ち上げてHttpプロトコル(http://…)で開発をしましょうという話です!

前提条件

  • Python or Rubyがインストールされているマシンを用意する(Macなら大丈夫。windowsはpythonとか入っていても起動できるかは謎)

  • ファイル構成

/tmp/workspace/
├── index.html
└── js/
    └── app.js
<html>
<head></head>
<body>
<h1>テストページ</h1>
<script src="/js/app.js"></script>     <!-- 絶対パスapp.jsを指定している -->
</body>
</html>

Pythonを使った例

ドキュメントルートとなるディレクトリへ移動する
$ cd /tmp/workspace

Webサーバを立ち上げる(3000はポート番号なので開いているPortなら何番でもOK)
$ python -m SimpleHTTPServer 3000

ブラウザを立ち上げて http://localhost:3000 へアクセスすると index.html が表示されます!

Rubyを使った例

ドキュメントルートとなるディレクトリへ移動する
$ cd /tmp/workspace

Webサーバを立ち上げる(3000はポート番号なので開いているPortなら何番でもOK)
$ ruby -run -e httpd . -p 3000

ブラウザを立ち上げて http://localhost:3000 へアクセスすると index.html が表示されます!

PHPを使った例

ドキュメントルートとなるディレクトリへ移動する
$ cd /tmp/workspace

Webサーバを立ち上げる(3000はポート番号なので開いているPortなら何番でもOK)
$ php -S localhost:3000

ブラウザを立ち上げて http://localhost:3000 へアクセスすると index.html が表示されます!

さらなるTips

Python、Rubyの場合は デフォルトの index.html がない状態でフォルダ指定してアクセスすると、DirectoryIndexが表示されファイルリストを見ることができます。
今回の場合は以下のように js フォルダにアクセスすると

http://localhost:3000/js

以下の様な画面が出力されます。(Rubyを使った場合)

Ruby-webrick-directoryindex

参考サイト

ワンライナーWebサーバを集めてみた -Qiita

空のディレクトリをgit管理下に入れるワンライナー(empty directories)


背景

chefを利用する機会が増えてきて汎用的な社内クックブックを作る状況が増えてきた昨今、

knife コマンドでクックブックをジェネレートするコマンドを実行すると

$ knife cookbook create COOKBOOK_NAME -o site-cook-books

バババっと以下のように基本的なディレクトリ構成で出力されるが、幾つか のディレクトリがある。

COOKBOOK_NAME
├── CHANGELOG.md
├── README.md
├── attributes
├── definitions
├── files
│   └── default
├── libraries
├── metadata.rb
├── providers
├── recipes
│   └── default.rb
├── resources
└── templates
    └── default
        └── sudoers.erb
attributes/, definitions/, files/default/, libraries/, proiders/, resources/ がそれぞれ空のディレクトリになっている

gitは空のディレクトリを管理下に置けないので、Railsに習って .keep という空ファイルを置くことにした。
(全てのリポジトリでディレクトリ構成の見た目を変えたくなかったので空のディレクトリもgit管理下に置くことにした。)


空のディレクトリに.keepを作るシェルのワンライナー

参考:
find/xargsを使った検索に便利なコマンド一覧

findで空のディレクトリを検索して、空のディレクトリに対して.keepという空ファイルをtouchで作成する。
Redhat系とUNIX(BSD)系では使えるオプションが違うようなので以下の用プラットフォームに合わせて実行する。

  • Redhat系
    -i オプションを指定することで ‘{}’で xargsに渡される値を取得できる
$ find . -type d -empty -print0 |xargs -0 -i touch '{}'/.keep
  • Unix系(MacOS)
    -Iオプションで % という文字列を xargsに渡される値として参照できるようにする
$ find . -type d -empty -print0 |xargs -0 -I % touch %/.keep

[Linux CentOS]CentOS6.4でネットワーク周りのTips


まずは・・・

CentOS5系列とはちょっと違う点がいくつかあったので備忘録のために、ネットワーク周りで気になったことをまとめてみます。
意外と違う部分があったのでちょいハマりした。。。

DNS resolveの設定について(参照キャッシュDNSサーバの設定)

Redhat系のLinuxのCentOSなどはこれまで「/etc/resolve.conf」に「nameserver」を定義することで設定できていた。6.4では定義することで有効になるけど、OSを再起動するなどネットワークが再起動するときにresolve.confに書いた内容が消えてしまうという現象が発生した。

【解決方法】
ネットワークインターフェース(ifcfg-eth0など)の設定ファイルににDNSキャッシュサーバの定義を追加すれば良い

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
  [以下を追記]
  DNS1=**.**.**.**
  DNS2=**.**.**.**

上記の定義を入れることで、「/etc/resolve.conf」にも「nameserver」の項目が追加され上記IPアドレスが設定される


NetworkManagerについて

CentOS6系列ではデフォルトでNetworkManagerというプロセスが動いているようです。(インストール時にX-windowパッケージに付随してインストールされるようです)
このプロセスはifcfg-eth0の定義を変更する場合など変更を検知して、動的に設定反映するデーモンです。
またKVMでゲストOSをネットワークブリッジで利用する場合、このデーモンが動いていると制御できないようです。
http://www.02.246.ne.jp/~torutk/linux/centos6/installmemo.html

そういった理由からNetworkManagerは停止しました!(自動起動も停止)

# /etc/init.d/NetworkManager stop
# chkconfig --level 2345 NetworkManager off

番外編(ネットワーク周りのコマンド)

  • ifup
    インターフェースを個別に有効にするコマンド。以下のようにするとeth1のインターフェースが有効になる
# ifup ifcfg-eth1
  • ifconfig
    ネットワークインターフェースごとのIPなどの情報を確認するコマンド

  • ping
    ネットワークの疎通を確認するコマンド

 ping **.**.**.**
  • arp
    -a オプションと同時に使用して、IPアドレスに対応するMacアドレスを確認するために利用

サーバの設定をしていてサーバがDHCPなどに意図せず変更されてしまった場合にリモートアクセスするためにはIPを調査して特定しなければならない。

ネットワーク上でどのIPが有効かを調べるためのスクリプトを以下のようなPerlで書いた。
単純にpingをネットワークのIP全てに対して一度叩くスクリプトです。
このスクリプト実行後に「arp -a」を実行することで対応するIPとMacアドレスの一覧が見られます。この対応があるIPが現在のネットワークで有効なIPアドレスとなります。

#!/usr/bin/env perl
use strict;
use warnings;

for my $n (1..255) {
    print $n."\n";
    system 'ping -c 1 -t 1 192.168.100.'.$n;
}

きょうはここまで・・!

Mac で Ruby環境構築(rbenv でのインストールから rbenv-gemset )


【追記】 2014/03/17

rbenv-aliases というrbenvのプラグインを入れておくと、 .ruby-version で指定するときに ruby2.0.0p… などの p… 以降を指定せずに 2.0.0 などで指定しておけば p… 以降はよしなに判断して最新のものを適用してくれる。

【追記】2013/12/18

‘-k (–keep)’ オプションを使うことでrbenv配下のディレクトリにRuby本体のソースもダウンロードしてくれる。
そして、pry-docをインストールするとpry上からRubyのソース(C実装)を確認できる。
pry-docでカジュアルにRubyのソースコードを読む

% RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install -k 2.0.0-p353

【追記】 2013/05/23

Ruby2.0 以上をrbenv + ruby-buildでビルドするときに日本語環境とSSL環境を有効にする方法。
1.9までは「CONFIGURE_OPTS」だったのに「RUBY_CONFIGURE_OPTS」という環境変数で指定してあげないとダメみたい。

% RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 2.0.0-p195 

参考:MacにRubyをインストールする時のメモ


以前に書いた記事でも
Ruby環境構築(Mac rbenv編)
rbenvによる環境構築を書いたのですが、新たにマシンをセットアップするということで改めてまとめてみました。
OSは Mountain Lion です!!

rbenvなどのインストールからちょっと中断まで

基本的な流れは以前の記事と同じです。

% brew install rbenv
% brew install ruby-build
% eval "$(rbenv init -)" >> ~/.zshenv

% brew install openssl
% brew install readline 

## 以前は成功した、「brew link」コマンド何故か以下のWarning。。。
% brew link openssl
Warning: openssl is keg-only and must be linked with --force
Note that doing so can interfere with building software.

% brew link readline
Warning: readline is keg-only and must be linked with --force
Note that doing so can interfere with building software.

「brew link」ではreadline, opensslを /usr/local/bin にリンクを張るために行なっているのですが、「keg-only」のWarningが出てしまう。「–force」を使えばLinkは通るけど「brew doctor」ではまたWarningが出る。

homebrewについてはこのへん参考
一旦保留ということにしておこう。


rbenvでRubyをインストール

【参考】
* rbenvでのビルドに再挑戦(成功)
* rbenv & ruby-build の使い方メモ

上記で「brew link」ができなかったので明示的に「brew –prefix FORMULA」でパスを指定してインストールする。

しかし、またまたエラー。。。GCC周りがおかしいようです。AppleはGCCの仕様が変わってコンパイルできなくなることが多いなー。。

% CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 1.9.3-p286

Downloading yaml-0.1.4.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/36c852831d02cf90508c29852361d01b
Installing yaml-0.1.4...
Installed yaml-0.1.4 to /Users/takaesu-m/.rbenv/versions/1.9.3-p286

Downloading ruby-1.9.3-p286.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/e2469b55c2a3d0d643097d47fe4984bb
Installing ruby-1.9.3-p286...

BUILD FAILED

Inspect or clean up the working tree at /var/folders/yx/11hj2qx50z56bw5dx05_ggvm0000gn/T/ruby-build.20130211111658.95876
Results logged to /var/folders/yx/11hj2qx50z56bw5dx05_ggvm0000gn/T/ruby-build.20130211111658.95876.log

Last 10 log lines:
compiling regenc.c
compiling regerror.c
compiling regexec.c
compiling regparse.c
regparse.c:582:15: error: implicit conversion loses integer precision: 'st_index_t' (aka 'unsigned long') to 'int' [-Werror,-Wshorten-64-to-32]
    return t->num_entries;
    ~~~~~~ ~~~^~~~~~~~~~~
1 error generated.
make: *** [regparse.o] Error 1
make: *** Waiting for unfinished jobs....
  34.95s user 13.27s system 102% cpu 47.008 total

ググってみるとこの記事を発見。ページ下部の部分に参考になる内容が!!
Cannot compile ruby 1.9.3

Ruby環境 rbenv mac

「brew tap」コマンドはhomebrew に参照するリポジトリを追加するものです。
この内容でやっていることは

  1. berwをアップデート
  2. 「homebrew/dups」をhomebrewで参照するリポジトリとして追加
  3. 「apple-gcc42」をインストール。
  4. 「apple-gcc42」を環境変数の CC としてExport
  5. brewを使ってrubyをインストール

4番目のExportまで行ったら、再度以下のコマンドでRubyをインストール

% CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 1.9.3-p286

無事インストール出来ました!!

なお、「rbenv install」の前にCONFIGURE_OPTSをつけるのはMacOSXのみのようです。
brew linkができていたら、readlineやopensslを個別に指定しなくても、以下のようにできるようです。

CONFIGURE_OPTS="--with-opt-dir=/usr/local" rbenv install 1.9.3-p286  

rbenv-gemsetの設定

インストールなど
% brew install rbenv-gemset
所定のディレクトリで試してみる
% cd ~/workspace

rbenv gemset create [version] [gemset名] でgemsetを作成
% rbenv gemset create 1.9.3-p286 commands

gemsets作成確認
% rbenv gemset list
1.9.3-p286:
  commands

この設定で以下のディレクトリにgemsetができる
% ls -l ~/.rbenv/versions/1.9.3-p385/gemsets
total 0
drwxr-xr-x  7 takaesu-m  staff  238  3 12 11:27 commands

gemsetsを利用するため「.rbenv-gemsets」を作成する(内容は commands と使用したいgemset名を入れる)
該当ディレクトリより下位はcommandsというgemsetsを利用する
% echo commands > .rbenv-gemset

アクティブなを確認する
% rbenv gemset active
commands

mechanizeというgemをインストールしてみる
% gem install mechanize

gemインストール確認
% gem list
*** LOCAL GEMS ***

domain_name (0.5.7)
mechanize (2.5.1)
mime-types (1.21)
net-http-digest_auth (1.2.1)
net-http-persistent (2.8)
nokogiri (1.5.6)
ntlm-http (0.1.1)
rbenv-rehash (0.3)
unf (0.0.5)
unf_ext (0.0.6)
webrobots (0.1.0)

これでひと通り
rbenv + rbenv-gemset の インストール手順完了です。

関係のない一言

  • 「rbenv local」便利らしい!!