2014年8月10日日曜日

Bourne ShellでCGI

Get,Post,Putで渡されたパラメータを取得するBourne ShellによるCGI
設定ファイルはcgi.configに記入しておく。
受け取るパラメータは18~19行目のように取得する。
Apacheからのデータは以下の環境変数を介して受け取る。
  • REQUEST_METHOD:GET,PUT,POST,DELETEが入る
  • QUERY_STRING:GETの場合のパラメータ
  • CONTENT_LENGTH:PUTの場合のパラメータの長さ
31行目はヒアドキュメント内でのコマンド例として無駄にechoしています。

#! /bin/sh
BASE_DIR=`dirname $0`
BASE_DIR=`cd ${BASE_DIR} && pwd`                   # Change to full path
BASENAME=`basename $0 | sed -e "s/\.[^.]*$//"`     #Except extension
CONFIG="${BASE_DIR}/cgi.config"
if [ ! -f "${CONFIG}" ]; then
  echo "Content-type: text/html"
  echo ""
  echo "<html><body>${CONFIG} is not found.</body></html>"
  exit
fi
. "${CONFIG}"

PARMS=`echo ${QUERY_STRING} | tr \& "\n"`
if [ "${REQUEST_METHOD}" = "POST" -o "${REQUEST_METHOD}" = "PUT" ]; then
  PARMS=`dd bs=${CONTENT_LENGTH} | tr \& "\n"`
fi
USER=`echo "${PARMS}" | grep user | cut -d= -f 2 | nkf --url-input`
DATE=`echo "${PARMS}" | grep date | cut -d= -f 2 | nkf --url-input`

cat <<END
Content-type: text/html

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>${CONFIG_TITL}E</title>
  </head>
  <body>
    <div>Input parameters
    <div>`echo "${PARMS}"`</div>
    <div>User:${USER}</div>
    <div>Date:${DATE}</div>
  </body>
</html>
END
定義ファイルcgi.configには以下のように設定。
CONFIG_TITLE="CGI Sheel Test"

2014年8月7日木曜日

Shell Scriptのテンプレート

Bourne Shell Scriptのテンプレート
機能
  • スクリプトと同じパスにある設定ファイルを読み取る。
  • 設定ファイルは引数で上書き可能
  • 設定ファイル内に定義された動作可能なHostでのみ実行可能
  • 日付が変わったら前日のログファイルは日付きのファイルに退避
  • 同じユーザーが引数も含めて同じスクリプトの複数起動を防止
  • ログには日時を追加して記載
Mac OS 10.9.4, FreeBSD 9.1-RELEASE-p15, Ubuntu Server 14.04で動作確認しました。

#! /bin/sh

set -e                                             # Terminate at error
set -u                                             # Error if undefined variable

# System Variables
BASE_DIR=`dirname $0`
BASE_DIR=`cd ${BASE_DIR} && pwd`                   # Change to full path
BASENAME=`basename $0 | sed -e "s/\.[^.]*$//"`     #Except extension
HOST=`hostname | cut -d"." -f 1`
USER=`whoami`
TODAY=`date +%Y%m%d`

# echo with time stamp in front.
log() {
  NOW=`date +%Y\/%m/%d\ %H:%M:%S`
  echo "$*" | sed -e "s|^|[${NOW}] |"
}

log "Start!"

# User Variables
CONFIG="${BASE_DIR}/${BASENAME}_${HOST}_${USER}.config"
if [ $# -eq 1 ]; then
  CONFIG="$1"
fi
if [ ! -f "${CONFIG}" ]; then
  echo "${CONFIG} not found"
  echo ""
  exit 1
fi

. "${CONFIG}"

# Log file
LOGDATE="${TODAY}"
if [ -f "${LOG}" ]; then
  LOGDATE=`perl -MPOSIX -le 'print strftime "%Y%m%d", localtime((lstat)[9]) for @ARGV' $LOG`
  LOGDATE=`echo ${LOGDATE} | cut -d" " -f 1`
fi
if [ "${LOGDATE}" -lt "${TODAY}" ]; then
  echo "move log file from ${LOG} to ${LOG}.${LOGDATE}" | tee -a "${LOG}"
  mv "${LOG}" "${LOG}.${LOGDATE}"
fi
log "Config file:${CONFIG}" | tee -a "${LOG}"
NOW=`date +%Y\/%m/%d\ %H:%M:%S`
cat "${CONFIG}" | sed -e "s|^|[${NOW}] Config=|" | tee -a "${LOG}"

# Verify host
if [ `echo ${HOSTS} | grep ${HOST} | wc -l ` -eq 0 ]; then
  log "Not allowed on this host." | tee -a "${LOG}"
  exit 1
fi

# Prevent multiple instance
GREP_PS="$0 $*"
if [ $# -eq 0 ]; then
  GREP_PS="$0"
fi
PROCESSES=`ps -o pgid,pid,tty,time,command | grep "${GREP_PS}" | awk '$1==$2' | wc -l`
log "No. of proceeses ${PROCESSES}" | tee -a "${LOG}"
if [ ${PROCESSES} -gt 1 ]; then
  log "Already running this script" | tee -a "${LOG}"
  ps -o pgid,pid,tty,time,command | grep "${GREP_PS}" | awk '$1==$2' | tee -a "${LOG}"
  log "Abort!" | tee -a "${LOG}"
  log "" | tee -a "${LOG}"
  exit 1
fi

#do something

log "Complete!" | tee -a "${LOG}"
log "" | tee -a "${LOG}"





定義ファイル デフォルトはスクリプト名.config
#! /bin/sh

LOG_DIR=${BASE_DIR}
LOG=${LOG_DIR}/${BASENAME}.log
HOSTS="allow_host1 allow_host2"

2014年7月19日土曜日

Mac/Ubuntuで任意のフォルダからWebサーバーを立ち上げる方法

こんな簡単な方法があるのですね。

cd target_path
python -m HTTPServer 8000 
これでlocalhost:8000でアクセス出来ます。
ポート番号を既に使っていれば8000を別の使っていないポートに変えて下さい。

2014年5月19日月曜日

Titanium Mobileでパスワードが認証されない場合の対処

Titanium MobileでCLIなどをアップデートしようとしてもパスワードが認証されない場合にターミナルから以下のコマンドを入力する必要がありました。 また、アップデート時に実行ユーザー名は変更出来ないので管理者権限を持つユーザーでTitaniumを起動する必要があるようです。 sudo chown -R $USER /usr/local Titanium Studio, build: 3.2.3.201404181442 Mac OS 10.9.3

2014年2月21日金曜日

Meteor on Nitrous.IOで簡単CRUDアプリ

Webアプリ開発を劇的に省力化出来ると言われるMeteorで簡単なCRUDアプリを作ってみました。 更に60秒で開発環境を作れると触れ込みのNitrous.IOを使って省力化。
データの保存は気にしていませんでしたがMongoDBになりました。
Node.jsもMongoDBも全く知らない筆者がNitrous.IOアカウント作成後にインストールからアプリ公開までに掛かった時間は 12時間ぐらいで驚異的です。

やりたい事は
  • 無料、ただ、ゼロエン
  • 出来るだけ簡単にサーバー上に開発環境を準備する
  • 使うのはHTML/CSS/JavaScriptだけ
  • 追加、表示、編集、削除(CRUD)が出来る1ページだけのアプリ
    • 格好良く言えばSingle Page Application, SPAと言ふ
    • 入力フォーマット確認など一切無し!
先ずは使った技術の簡単な紹介

Meteor
  • Open Source
  • Node.jsをベースにした全部入りフレームワーク
  • クライアント側もサーバー側もJavaScriptで記述
  • HTML, JavaScriptコードを編集するとクライアントをリロードせずに自動更新
  • データが更新されるとクライアントをリロードせずに自動更新
    • 正直に言ってデモを見ても魔法のようで何が起こっているのかさっぱり分かりませんでした。
  • 出来上がったアプリは1コマンドでTAR化して移動可能 
  • 出来上がったアプリは1コマンドでmeteor.comで公開可能
    • 認証すら不要ってどうゆ〜事?

Nitrous.IO
  • 384MBメモリ、750MBストレージが無料
    •  GitHubやFacebookとリンクしたり紹介すると使えるリソースが増える。
  • 開発言語はRuby on Rails, Node.js, Python/Django, Go, PHPから選べる。
    • サーバーは普通にLinuxなのでShellとかPerlとかも使えます。
  • Web IDEを使う事でiPadやChromebookでも開発が出来る
    • 普通にSSHやFTPも使えますし専用アプリもあり
 ではではアカウントを作ってBoxを作った後の作業から
  1. 環境準備
    1. Nitrous.IOでアカウント作成
    2. Meteorには1GBのストレージが必要で作りたてではポイント(N2Oと呼びます)が足りません。 GitHub のアカウントと連携させるなどしてポイントを増やして下さい。
    3. Box(サーバー)を立ち上げたら以下のコマンドでMeteorを準備
      parts install meteor
      npm install -g meteorite
      # for debug
      npm install -g node-inspector 
      
  2. プロジェクト作成
    • より簡単にする為にTwitter BootStrapとjQueryも使いましょう。
    • meteor create プロジェクト名
      cd プロジェクト名
      meteor add bootstrap
      meteor add jquery
      
  3. 開発
    1. HTMLの全体構造
    2. <head>
      </head>
      
      <body>
        <div class="container">
          {{> tables}}
          {{> send}}
        </div>
      </body>
      
      <template name="send">
        <form>
        </form>
        <input type="button" id="send" value="登録" />
        <input type="button" id="update" value="更新" />
        <input type="button" id="cancel" value="中止" />
      </template>
      
      <template name="tables">
        <table>
          <thead>
          </thead>
          <tbody>
            {{#each items}}
              <tr></tr>
            {{/each}}
          </tbody>
        </table>
      </template>
      
    3. JavaScriptの構造
    4. Items = new Meteor.Collection('items');
      
      if (Meteor.isClient) {
        Template.ibeacons.items = function () {
        };
        
        Template.send.events({
          'click #send': function (evt, tmpl) {
          },
          'click #update': function (evt, tmpl) {
          },
          'click #cancel': function (evt, tmpl) {
          }
        });
        
        function clearForm(tmpl) {
        }
        
        Template.ibeacons.events({
          'click .modify': function (evt, tmpl) {
          },
          'click .delete': function () {
          }
        });
      }
      
      if (Meteor.isServer) {
        Meteor.startup(function() {
          if(Items.find().count() === 0) {
            // Itemsが0件だった場合、追加
            Items.insert(
            );
          }
        });
      }
       
  4. デプロイ
  5. コマンド一つでmeteor.comに公開される。
    meteor deploy --password プロジェクト名.meteor.com
  6. 削除
  7. 削除もコマンド一つ
    meteor deploy -delete プロジェクト名.meteor.com
  8. その他
    1. Meteorプロセスが残っているか確認
      ps -ef | grep meteor | grep node 
      
    2. Meteorプロセスが残っていれば強制終了
      kill -9 `ps ax | grep meteor | grep node | awk '{print $1}'`
      
    3. デバッグ
      1. プロセス起動時前にオプションを追加
        NODE_OPTIONS="--debug" meteor
        
      2. 別ターミナルでデバッガーを起動
        $ node-inspector                                                                                                                
        Node Inspector v0.7.0-2                                                                                                                                            
           info  - socket.io started                                                                                                                                       
        Visit http://127.0.0.1:8080/debug?port=5858 to start debugging.
        
      3. http://hostname/debug?port=5858にアクセスするとデバッグ出来るらしい、、、


疲れたので今日はここまで。

2014年1月20日月曜日

指定した日数以前のファイル削除

例えば14日以前のファイルを削除する場合はこんな感じで。

LOG_PATH=~/log

LOG_KEEP_DAYS=14

find ${LOG_PATH} -name '*.log'  -mtime +${LOG_KEEP_DAYS} -exec rm -f {} \;


先ずはダミーファイルを用意して動作確認してから使う事を強く推奨します。

動作確認 : Solaris 8

2014年1月19日日曜日

Pentaho Data Integration, 巨大なXMLファイルの読み込み

Pentaho Data IntegrationでXMLファイルを読み込むにはGet Data from XMLとXML Input Stream(StAX)があります。
600MBぐらいある巨大なXMLファイルをGet Data from XMLで読み込むとjava.lang.OutOfMemoryError: Java heap spaceでエラーが出ました。 メモリ割当を2.5GBまで増やしても解決しません。


この様な大きなファイルの場合、XML Input Stream(StAX)を使う事が推奨されています。
ただXML Input Streamでは親子関係のデータを取るには以下の様にステップを組み合わせる必要があります。