【Excel】赤い太枠自動作成

設計書の記述内容を強調したり、
エビデンスの確認箇所を強調したりする際に
赤い太枠をよく使うのでマクロで作成します。

Sub RedBox()
'
' RedBox Macro
'
' 赤い太枠四角線を作ります。

    ActiveSheet.Shapes.AddShape(msoShapeRectangle, Selection.Left, Selection.Top, 96.75, 96.75).Select

    Selection.ShapeRange.Line.Weight = 2.25
    Selection.ShapeRange.Line.Visible = msoTrue
    Selection.ShapeRange.Line.Style = msoLineSingle
    Selection.ShapeRange.Line.ForeColor.SchemeColor = 10
    Selection.ShapeRange.Line.Visible = msoTrue
    Selection.ShapeRange.Fill.Visible = msoFlase

End Sub

【Excel】A1セル選択

納品物はA1セルにカーソルが選択されていないといけないことが多いので、
マクロでA1を選択します。

Sub TopCursor()
'
' TopCursor Macro
'
' A1にカーソルを合わせます。
'
    ' 画面のチラつきの防止設定を行う。
    Application.ScreenUpdating = False

    ' 全シート分繰り返す。
    Dim Sht As Worksheet
    For Each Sht In Worksheets
        ' シートを選択する。
        Sht.Select

        ' スクロールバーを上にする。
        Dim i As Integer
        For i = 1 To Windows(1).Panes.Count
            Windows(1).Panes(i).ScrollColumn = 1
            Windows(1).Panes(i).scrollRow = 1
        Next i

        ' A1セルを選択する。
        ActiveSheet.Cells(1, 1).Select
    Next Sht

    ' 先頭シートを選択する。
    Worksheets(1).Activate

    ' 画面のチラつきの防止設定を元に戻す。
    Application.ScreenUpdating = True
End Sub

SJISとUTF-8を一緒にgrep

JavaファイルだとSJIS、propertiesだとSJISまたはUTF-8の
どちらでも定義されている”氏名”という単語を
ファイル名と行数を出力しながらgrepしたい。

検索してみると下記のような方法が多かったです。

grep -rn `echo "氏名" | nkf -s` *.java *.properties | nkf -w

上記方法だと、入力値の”氏名”をSJISに変換してからgrepしているため、
SJISで書かれているJavaファイルしかgrepできないんじゃ?と思い、
for文を利用してみることに。
(そもそも上記方法だとなぜかgrepすら出来ず。なぜだろう。。)

for X in `find ( -name "*.java" -or -name "*.properties" )`; do nkf -w $X | grep -rn "氏名" | while read line; do echo "$X:$line"; done done
./Sample.java:15: //氏名を変換
./test_utf8.properties:1:#氏名を定義
./test_sjis.properties:1:#氏名を定義

これでファイル名と行数とそれに対するgrep結果が得られました。
findでHITしたファイルを一時変数に格納し、「nkf -w」で全てUTF-8に変換してからgrepしてます。
次にgrep結果をwhileで繰り返しながら一時変数(ファイル)とgrep結果を出力。

もうシェル作って引数取ればいいじゃないと思いますが、1行でやりたかったんです。

【Excel】個人用マクロブック

エクセルでいつも使うマクロを個人用マクロブックに保存しました。
保存場所は下記の通り。

C:ユーザー(アカウント名)AppDateRoamingMicrosoftExcelXLSTARTPERSONAL.XLSB

マクロを記録する際に「マクロの保存先」で「個人用マクロブック」を選択すると保存可能。
保存すると新規エクセル立ち上げる度に「PERSONAL.XLSB」が表示されていて邪魔なので、
エクセルの「表示」-「ウィンドウ」-「表示しない」を選択し、非表示にします。

【Eclipse】リモートデバッグ

ローカル環境でWebアプリケーションサーバを入れ、
その上でデバッグで動かしながら開発することはよくありますが、
他環境で動作しているWebアプリケーションに対してデバッグする方法。

前提条件として、デバッグ可能な状態でWebアプリケーションを起動していること。
Raspberry PiではTomcatが起動しているので、Tomcatを例にします。

  • デバッグモードでTomcat起動
    「$TOMCAT_HOME/bin/catalina.sh」を確認すると下記ようになっています。

    if [ "$1" = "jpda" ] ; then
      if [ -z "$JPDA_TRANSPORT" ]; then
        JPDA_TRANSPORT="dt_socket"
      fi
      if [ -z "$JPDA_ADDRESS" ]; then
        JPDA_ADDRESS="8000"
      fi
      if [ -z "$JPDA_SUSPEND" ]; then
        JPDA_SUSPEND="n"
      fi
      if [ -z "$JPDA_OPTS" ]; then
        JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS, server=y,suspend=$JPDA_SUSPEND"
      fi
      CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
      shift
    fi
    

    引数に「jpda」を与えるとデバッグ可能な状態で起動できます。
    自作シェルではそんな引数を受け取れるよう作成していないので、
    「catalina.sh」を直接呼び出します。

    /etc/init.d/tomcat.sh stop
    /tomcat/apache-tomcat-7.0.55/bin/catalina.sh jpda start
    
  • Eclipseの設定

    Eclipseから「実行」-「デバッグの構成」を選択。
    リモートJavaアプリケーションで右クリックして新規を選択。
    接続プロパティーのホスト:z-area.net または Raspberry PiのIP
    接続プロパティーのホスト:8000
    他はデフォルトのまま「適用」ボタン押下。
    「デバッグ」ボタン押下。
    

    ローカルのソースにデバッグポイントを置いて
    Webアプリケーションに接続し、デバッグポイントを通るような操作を行うと
    他環境のWebアプリケーションに対してデバッグできます。

    Eclipseから「デバッグ」ボタン押下してタイムアウトになる場合、
    サーバ側のFWでポート8000を許可する必要があります。

【Raspbian】ShellShock対策

bashに脆弱性が発見されたらしく、Rapspberry Piも対策してみました。

x='() { :;}; echo vulnerable' bash -c 'echo this is a test'

上記コマンド実行した際に「vulnerable」がコンソールに出ると要対策。

vulnerable
this is a test

というわけで最新版にアップデートします。

apt-get update
apt-get --only-upgrade install bash

再度コマンド実行して対策できたか確認します。

x='() { :;}; echo vulnerable' bash -c 'echo this is a test'
this is a test

「vulnerable」が表示されていなければ問題なし。
アップデートしただけで対策完了。

【サクラエディタ】正規表現

正規表現でメモ。

  • 1つ目の/までを検索

    ^[^/]*/
    

    先頭から/を含まない0文字以上の文字列を持ち、/で終わる文字列を検索。

  • /を含まない1行を検索

    ^[^/]*$
    

    先頭から/を含まない0文字以上の文字列を持つ文末までの1行を検索。

  • HTMLタグのtdタグのみを検索

    <td[^>]*>|<[^>]td>
    

    <tdで始まる>を含まない0文字以上の文字列を持ち、>で終わる文字列を検索。
    または
    <で始まる>を含まない0文字以上の文字列を持ち、td>で終わる文字列を検索。

【Oracle】実行計画SQLPlus

Oracleの実行計画を取得した時のメモ。

sqlplus DBユーザ名/DBパス名@サービス名

SQLPlusだけで実行計画を取得します。
通常のSQLPlusではautotraceをoff、termoutをonにすると綺麗に取得できます。

-- ログ初期設定
set autotrace on
set echo off
set timing on
set time on
set termout off
set feedback 1
set colsep 't'
set pagesize 30000
set linesize 30000
set trimspool on

col PLAN_PLUS_EXP format a200;

spool trace_test.log;

prompt ======================
prompt  実行計画
prompt ======================
prompt 【対応前】
SELECT XXXX FROM TEST_TBL;

prompt ======================
prompt  実行計画
prompt ======================
prompt 【対応後】
SELECT YYYY FROM TEST_TBL;

set autotrace off
spool off;

2回以上同じSQLを実行する際は以下のコマンドを実行し、
キャッシュと共有プールから履歴を削除すると良い。
ただし、他の人がSQLを実行していると影響がでてしまうので、
環境を占有していることが条件となる。

ALTER SYSTEM FLUSH BUFFER_CACHE;
ALTER SYSTEM FLUSH SHARED_POOL;

【Oracle】実行トレース取得

Oracleの実行計画を取得した時のメモ。

sqlplus DBユーザ名/DBパス名@サービス名

SQLPlusにログイン後に測定したいSQLを投げる。

ALTER SESSION SET SQL_TRACE=TRUE;
SELECT COMPANY_CD, USER_ID, SLIP_NO FROM TEST_TBL;
ALTER SESSION SET SQL_TRACE=FALSE;
exit;

tkprofコマンドでトレースファイルから実行計画を取得する。

# DIAGNOSTIC_DESTの初期化パラメータによる
cd $ORACLE_HOME/diag/rdbms/DB名/インスタンス名/trace
# 実行計画を取得
tkprof トレースファイル名 出力ファイル名 explain=DBユーザ名/DBパス名

tkprofはオプションでパフォーマンスの悪い順に並べたりできるようです。

【Oracle】データエクスポートとインポート

Oracleデータ復旧をメモしたので、
ついにでOracleデータエクスポートとインポートメモ。

#!/bin/sh
# 環境設定
DB_INF="DBユーザ名/DBパスワード@サービス名"
# エクスポート
exp ${DB_INF} FILE=[テーブル名].dmp LOG=[テーブル名].log TABLES=([テーブル名]) ROWS=Y INDEXES=Y GRANTS=Y CONSTRAINTS=Y STATISTICS=NONE TRIGGERS=N QUERY="WHERE [カラム名] = '[値]' "
#!/bin/sh
# 環境設定
DB_INF="DBユーザ名/DBパスワード@サービス名"
# インポート
imp ${DB_INF} FILE=[テーブル名].dmp LOG=[テーブル名].log TABLES=([テーブル名]) ROWS=Y INDEXES=Y GRANTS=Y CONSTRAINTS=Y STATISTICS=NONE

オプション一部整理。

  • 実行モード
    FULL/OWNER/TABLES

    FULL:データベース指定
    OWNER:ユーザ指定
    TABLES:テーブル指定
    
  • 移行対象
    ROWS/INDEXES/GRANTS/CONSTRAINTS/TRIGGERS/STATISTICS/TRIGGERS

    ROWS:表データ移行フラグ、Nにすると表定義のみ(デフォルト:Y)
    INDEXES:索引移行フラグ(デフォルト:Y)
    GRANTS:権限移行フラグ(デフォルト:Y)
    CONSTRAINTS:制約移行フラグ(デフォルト:Y)
    STATISTICS:統計情報移行フラグ、移行したくない場合はNONEを指定
    TRIGGERS:トリガー移行フラグ、エクスポート時のみ指定可能(デフォルト:Y)
    
  • その他

    QUERY:エクスポート条件条件