シェルスクリプトで日付が有効かをチェックし、開始・終了日間でループする
シェルスクリプトで、特定の日付間のログのみを抽出する等の処理をする際に、日付でループするコードの例です。
サンプルコード
loop_date.sh
#!/bin/bash # 有効な日付ではない場合は終了する関数 function check_date() { date -d "$1" || exit 1 return 0 } # 引数の数をチェック if [ $# -ne 2 ]; then echo "使い方: ./loop_date.sh 開始日[YYYYMMDD] 終了日[YYYYMMDD]" exit 1 fi # 日付が有効かをチェック check_date $1 check_date $2 # 開始日 < 終了日になっているかをチェック if [ $1 -gt $2 ]; then echo "開始日は終了日よりも前にしてください" exit 1 fi BEGIN=$1 END=$2 CURRENT=$BEGIN # 開始日〜終了日までループ while true; do # ここに日付毎の処理を書く echo "処理: $CURRENT" if [ "$CURRENT" = "$END" ] then break fi # 日付を1日インクリメント CURRENT=$(date -d "$CURRENT 1day" "+%Y%m%d") done
動作例
$ ./loop_date.sh 20151201 20151205 2015年 12月 1日 火曜日 00:00:00 JST 2015年 12月 5日 土曜日 00:00:00 JST 処理: 20151201 処理: 20151202 処理: 20151203 処理: 20151204 処理: 20151205 $ ./loop_date.sh 20151130 20151201 2015年 11月 30日 月曜日 00:00:00 JST 2015年 12月 1日 火曜日 00:00:00 JST 処理: 20151130 処理: 20151201 $ ./loop_date.sh 20151131 20151205 date: `20151131' は無効な日付です $ ./loop_date.sh 20151205 20151201 2015年 12月 5日 土曜日 00:00:00 JST 2015年 12月 1日 火曜日 00:00:00 JST 開始日は終了日よりも前にしてください $ ./loop_date.sh 使い方: ./date_loop.sh 開始日[YYYYMMDD] 終了日[YYYYMMDD]
参考URL
CSSで等幅フォントの指定
ウェブサイトやブログ記事でソースコードなどを掲載する場合の、等幅フォントの設定例です。
はてなブログの<pre class="code"></pre>
に適用されるCSSに、日本語にも強いソースコード向けの等幅フォントRicty Diminishedを追加しています。
pre.code { font-family: 'Ricty Diminished', 'Monaco', 'Consolas', 'Courier New', Courier, monospace, sans-serif; }
<pre class="code"> def main(): print "ABCDEFGH" print "おはよう" </pre>
参考URL
シェルスクリプトで正規表現マッチ
シェルスクリプトで引数による条件分岐をする際にif
文の列挙やcase
文を利用する場合は多々あると思いますが、
単純に引数のチェックのみを行いたいときはbashの正規表現マッチで調べるのが簡単です。
bashでの正規表現マッチ
例えば、第一引数が正規表現^h.+ge$
とマッチしているかを調べる場合には、以下のように記述します。
if [[ "$1" =~ ^h.+ge$ ]]; then
if
文内で=~
で比較すると正規表現比較になります。
このとき、正規表現はダブルクォートで囲わない点に注意。囲ってしまうと普通の文字列比較になってしまいます。
例
#!/bin/bash # 第一引数は start, stop, restartのいずれか if [ $# -ne 1 ];then echo "Usage: $ ./hoge.sh (start|stop|restart)" elif [[ "$1" =~ ^(start|stop|restart)$ ]]; then /path/to/hoge $1 else echo "不明な引数です: $1" exit 1 fi
参考URL
Rundeckでユーザの追加とプロジェクトへのアクセス権限の設定
Rundeckのデフォルトユーザはadmin
のみです。管理者が1人の場合はadmin
のみで十分ですが、複数人で管理する場合は適切な権限を付与するべきです。
そこで、特定のプロジェクトのみ閲覧・編集できるユーザを作成する場合は、設定ファイルを追加・編集することで対応できます。
この記事ではdeveloper
というユーザを作成し、SomeProject
とOtherProject
に対して全権限を設定する場合の手順を説明します。
動作環境
- Ubuntu 14.04 LTS
- Rundeck 2.6.2
ユーザの追加
develop
ユーザを追加し、ログインできるようにします。
$ sudo vi /etc/rundeck/realm.properties
# # This sets the default user accounts for the Rundeck app # admin:admin,user,admin,architect,deploy,build # 以下の行を追記 # ID: developer, PW: devpass の一般ユーザを作成 developer:devpass,user
上記設定ではパスワードが平文になっていますが、以下の手順でMD5のハッシュにすることも可能です。
$ sudo java -cp /var/lib/rundeck/bootstrap/jetty-all-7.6.0.v20120127.jar org.eclipse.jetty.util.security.Password developer devpass
devpass
OBF:1vn41vu91vo41xfj1vmy1vv11vny
MD5:dc067f8a150df19383bc33d7ac9032f7
CRYPT:de6e61/yPOdQg
$ sudo vi /etc/rundeck/realm.properties
# 平文ではなくハッシュ値のパスワードを登録
developer: MD5:dc067f8a150df19383bc33d7ac9032f7,user
特定プロジェクトへのアクセスを許可
Rundeckは/etc/rundeck/
以下の*.aclpolicy
ファイルを読んでいるので、今回はdeveloper
ユーザ用のaclpolicy
ファイルを追加します。
$ sudo vi /etc/rundeck/developer.aclpolicy
# developerユーザのプロジェクト毎のアクセス権限の設定 description: Project settings for developer user context: project: 'SomeProject|OtherProject' # SomeProjectとOtherProjectの2プロジェクトに対する権限の設定 # 上記プロジェクトに関する全権限を許可 for: resource: - allow: '*' adhoc: - allow: '*' job: - allow: '*' node: - allow: '*' by: username: developer --- # developerユーザのrundeck全般のアクセス権限 description: Rundeck settings for developer user context: application: 'rundeck' for: resource: - equals: kind: project deny: [create] # プロジェクトの作成は禁止 - equals: kind: system deny: [read] # システム情報の閲覧禁止 - equals: kind: user deny: [admin] # ユーザ情報の編集禁止 project: - match: name: 'SomeProject|OtherProject' # SomeProjectとOtherProjectの2プロジェクトのみ設定の閲覧可能 allow: [read] by: username: developer
ブラウザからdeveloper
ユーザでRundeckにログインし、SomeProject
とOtherProject
の2つが表示されたら成功です。
参考URL
Redmineのトップメニューにリンクを追加する
検証環境
Redmineのトップメニューにリンクを追加
Redmineの上部には、ホーム、マイページ、プロジェクト等のメニューが並んでいますが、ここに任意のメニューを追加する方法です。 プラグインを用いる方法が一般的だと思われますが、今回は手っ取り早くredmineのファイルを直接編集してしまいます。
Redmineのディレクトリに移動してredmine.rbをバックアップ
$ cd /path/to/redmine/lib/ $ cp redmine.rb redmine.rb-backup
redmine.rbを編集
$ vi redmine.rb
Redmine::MenuManager.map :top_menu do |menu| menu.push :home, :home_path menu.push :my_page, { :controller => 'my', :action => 'page' }, :if => Proc.new { User.current.logged? } menu.push :projects, { :controller => 'projects', :action => 'index' }, :caption => :label_project_plural menu.push :administration, { :controller => 'admin', :action => 'index' }, :if => Proc.new { User.current.admin? }, :last => true menu.push :help, Redmine::Info.help_url, :last => true # トップメニューにリンクを追加 menu.push :link1, "http://example.com/" menu.push :link2, "http://example.net/" end
これでWebサーバをリロードしてページを更新すると、トップメニューのプロジェクトとヘルプの間あたりにリンクが表示されます。
紹介しておいてなんですが、かなり横着な方法なので、参考URLの記事のようにプラグインを利用したほうがいいですね。