2014年10月1日水曜日

第41回「sqlで文字列から1バイトを取り出す。」

select get_byte(カラム名::bytea, 1) from テーブル名;

第40回「sqlでnullを確認する」

select coalesce(カラム名, 'null') as カラム名_nullchk from テーブル名;

2014年7月9日水曜日

第39回「excel関数 セル値のアドレスからセル値を参照する」

第39回「excel関数 セル値のアドレスからセル値を参照する」です。

  A B C D E F
1 1 a aa aaa   ddd
2   b bb bbb    
3   c cc ccc    
4   d dd ddd    
5 2 e ee eee    






 
F1セルは、
=INDIRECT(ADDRESS(MATCH(1,A:A,0)+3,COLUMN(A1)+3,))

A列の「1」を検索一致したセルから、列+3、行+3のセル値を表示する。












第38回「シェルの一部をリダイレクトする」

第38回「シェルの一部をリダイレクトする」です。

標準出力と標準エラー出力をまとめて、ファイルに出力し、元に戻す。

######
test.sh
######
exec 3>&1 >file 2>&1
command

exec 1>&3 2>&1
command

0,1,2,3はファイルディスクリプタを表している。

0,1,2は予約されている。
ファイルディスクリプタ0(標準入力)
ファイルディスクリプタ1(標準出力):画面出力
ファイルディスクリプタ2(標準エラー出力):画面出力

「2>&1」は、「2 の出力先を、1 の出力先と同じものに設定」を表す。

3>&1
ファイルディスクリプタ1(標準出力):画面出力
ファイルディスクリプタ2(標準エラー出力):画面出力
ファイルディスクリプタ3:画面出力★設定

>file
(1>fileと同意味)
ファイルディスクリプタ1(標準出力):file出力★設定
ファイルディスクリプタ2(標準エラー出力):画面出力
ファイルディスクリプタ3:画面出力

2>&1
ファイルディスクリプタ1(標準出力):file出力
ファイルディスクリプタ2(標準エラー出力):file出力★設定
ファイルディスクリプタ3:画面出力

1>&3
ファイルディスクリプタ1(標準出力):画面出力★設定
ファイルディスクリプタ2(標準エラー出力):file出力
ファイルディスクリプタ3:画面出力

2>&1
ファイルディスクリプタ1(標準出力):画面出力
ファイルディスクリプタ2(標準エラー出力):画面出力★設定
ファイルディスクリプタ3:画面出力

2014年6月30日月曜日

第37回「vbaからexcelシート名を確認する」

第37回「vbaからexcelシート名を確認する」です。

Sub SheetChk()
    Dim ws As Worksheet
    For Each ws In Worksheets
        'If ws.Name = "Sheet1" And ws.Visible Then MsgBox ws.Name, vbInformation
        MsgBox ws.Name, vbInformation
    Next ws
End Sub



2014年6月29日日曜日

第36回「batからvbsファイルの先頭に変数を追加する」

第36回「batからvbsファイルの先頭に変数を追加する」です。

バッチファイルからvbsファイルの先頭に変数を追加して複数ファイルを作成します。

#######
test.bat
#######
@echo off
setlocal enabledelayedexpansion

set i=1

for /f  %%l in (test.txt) do (
echo Private Const TMP = "%%l"> dst_!i!.vbs
echo;>> dst_!i!.vbs
type test.vbs >> dst_!i!.vbs

set /a i=!i!+1
)

endlocal

第35回「vbsからvbaマクロを呼び出す」

第35回「vbsからvbaマクロを呼び出す」です。

EXCEL標準モジュールのマクロvbaをvbsから呼び出します。

#######
test.vbs
#######
Dim ExcelApp
Dim ExcelBook
Dim FilePath

FilePath = "C:\work\test.xls"

Set ExcelApp = CreateObject("Excel.Application")
Set ExcelBook = ExcelApp.Workbooks.Open(FilePath)
'ExcelApp.ActiveWorkbook.Worksheets("Sheet1").select
ExcelApp.Visible = True

ExcelApp.Run "test.xls!Macro1()"

'ExcelBook.Close True
'ExcelApp.quit

Set ExcelApp = Nothing
Set ExcelBook = Nothing

2014年6月27日金曜日

第34回「vbsから開いているIEを操作する」

第34回「vbsから開いているIEを操作する」です。

既に開いているIEのウィンドウ、タブがGoogleだったら、閉じます。

#####
ie.vbs
#####
Option Explicit

Private FSO
Private Browser
Private ProgName
Private BrowsersArray(),c

Set FSO = CreateObject("Scripting.FileSystemObject")
c = 0
For Each Browser In CreateObject("Shell.Application").Windows
    ProgName = FSO.GetFileName(Browser.FullName)
    If LCase(ProgName) = "iexplore.exe" Then
        ReDim Preserve BrowsersArray(c)
        Set BrowsersArray(c) = Browser
        c = c + 1
    End If
Next

Set FSO = Nothing
If c > 0 Then
    For Each Browser In BrowsersArray
        'WScript.Echo Browser.LocationURL
        'WScript.Echo Browser.LocationName
        If Browser.LocationName = "Google" Then
            Browser.Quit
        End If
    Next
End If

2014年6月15日日曜日

第33回「コマンドプロンプトからgrepする」

第33回「コマンドプロンプトからgrepする」です。

grepの代わりにfindstrコマンドを使用します。
パイプを組み合わせて使うと便利です。

> dir | findstr .txt
2014/06/15  00:26                35 hoge.txt

第32回「WindowsバッチファイルからTailする」

第32回「WindowsバッチファイルからTailする」です。

findの行数が3フィールド目に表示されるので、for tokensで3フィールド目(%%C)でsetし、
引き算して、moreします。

######
tail.bat
######
@echo off
set LINE=2
set FILE=hoge.txt
for /F "tokens=1,2,3 USEBACKQ" %%A in (`find /V /C "" %FILE%`) do set FL=%%C
set /A TAIL=%FL%-%LINE%
more +%TAIL% %FILE%
pause



第31回「Windowsバッチファイルから最新ファイルのみ表示する」

さて、第31回のお題は「Windowsバッチファイルから最新ファイルのみ表示する」です。

「dir /O-D /B パス」を指定。
/O-D 日時の新しい順に表示
/B ディレクトリ名とファイル名のみを表示

##################
newdayfile_echo.bat
##################
@echo off
set BATDIR=%~dp0
for /F "USEBACKQ" %%A in (`dir /O-D /B "" %BATDIR%`) do (
set FILE=%%A
goto break;
)
:break
echo %FILE%
pause

第30回「Excel関数でCase文させる」

さて、第30回のお題は「Excel関数でCase文させる」です。

=CHOOSE(1+SUM((A1={"一","二","三"})*{1,2,3}),"other","one","two","three")

A1が一なら、one
A1が二なら、two
A1が三なら、three
A1が一、二、三以外なら、other
になります。

2014年6月7日土曜日

第29回「Windowsバッチファイルからftpで自動取得させる」

さて、第29回のお題は「Windowsバッチファイルからftpで自動取得させる」です。

パスワードは手入力で、複数サイトで使いまわすようにします。

###########
autoftp.bat
###########
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set BATDIR=%~dp0
set USER=root
set /P IN_PASS=rootパスワード:

echo > %BATDIR%ftp.txt
echo > %BATDIR%ftp.log

set CRLF=^


set FTP1=!CRLF!^
open localhost!CRLF!^
%USER%!CRLF!^
%IN_PASS%!CRLF!^
bin!CRLF!^
mget aaa*.txt!CRLF!^
bye

set FTP2=!CRLF!^
open 127.0.0.1!CRLF!^
%USER%!CRLF!^
%IN_PASS%!CRLF!^
bin!CRLF!^
mget bbb*.txt!CRLF!^
bye


set FTP1 | more +1 > %BATDIR%ftp.txt
ftp -i -s:%BATDIR%ftp.txt >> %BATDIR%ftp.log

set FTP2 | more +1 > %BATDIR%ftp.txt
ftp -i -s:%BATDIR%ftp.txt >> %BATDIR%ftp.log

del %BATDIR%ftp.txt

::pause

ENDLOCAL

2014年3月28日金曜日

第28回「権限とcksumを同時に表示させる」

さて、第28回のお題は「権限とcksumを同時に表示させる」です。

「ls -l」と「cksum」の結果を同時に表示して、ファイルの一意性を確認します。

for file in `find . ! -type d -print`
do
printf "%s %s %s %s %s %s\n" `cksum $file | awk '{print $1" "$2}'` `stat -c "%A %G %U %n" $file`
done

第27回「プログラムのシステムコールをトレースする」

さて、第27回のお題は「プログラムのシステムコールをトレースする」です。

プログラムがまともに動いているか確認するときに使ったりします。

strace -p PID

特定のシステムコールのみトレースするときは、
strace -p PID -e open
strace -p PID -e trace=open,read

gdbでデバッグする前に、open,read,writeするところから、
問題の箇所のあたりをつけることに役立ちます。

2014年3月27日木曜日

第26回「Port、PID、プロセス名、ファイル名から紐づく情報を表示する」

さて、第26回のお題は「Port、PID、プロセス名、ファイル名から紐づく情報を表示する」です。

あるPort番号で開いているPIDをkillしたい
プロセスが使用しているPort番号を知りたい
ファイルをしているプロセス名を知りたい
Port、PID、プロセス名、ファイル名のいづれか1つがわかれば、それに紐づく情報を表示できるのが、lsofコマンドです。
lsofコマンドは、fuser、netstatコマンドを含んだようなコマンドです。

lsof ファイル名
lsof -i:ポート番号1,ポート番号2
lsof -c プロセス名
lsof -p PID

2014年3月21日金曜日

第25回「ps x | grep で自コマンドを表示させない」

さて、第25回のお題は「ps x | grep で自コマンドを表示させない」です。

「ps x | grep processname」でプロセスを絞りこむと、自コマンドまで表示されてしまいます。
ps x | grep processname | grep -v grepでもいいのですが、
ps x | grep [p]rocessname
とすると、自コマンドは表示されません。
評価されるときは「ps x | grep processname」になっていますが、
実行コマンドは「ps x | grep [p]rocessname」なので、grepにヒットしないという仕組みです。

第24回「複数の条件をgrepする」

さて、第24回のお題は「複数の条件をgrepする」です。

grepする条件が複数あるときは、egrepとパイプを使います。

egrep "条件1|条件2|条件3" ファイル名

第23回「条件に一致しない行を正規表現で削除する」

さて、第23回のお題は「条件に一致しない行を正規表現で削除する」です。

ログファイルには、ものによってログレベルがあり、INFO、WARN、ERRORなどあります。
[ERROR]という行だけがほしいとき、[ERROR]以外の行を正規表現で選択し、削除します。

^(?!.*[ERROR]).+$

テキストエディタ(サクラエディタなど)で正規表現も取り扱えるので、重宝します。

2014年3月7日金曜日

第22回「拡張子が異なるファイルに同じ処理をする」

さて、第22回のお題は「拡張子が異なるファイルに同じ処理をする」です。

拡張子が異なるファイルに同じ処理をするには、for 変数 in 値リスト;do;コマンド;doneを利用します。
$ more hoge*
::::::::::::::
hoge1
::::::::::::::
hoge1
::::::::::::::
hoge1.bk
::::::::::::::
hoge1.bk
::::::::::::::
hoge2
::::::::::::::
hoge2
::::::::::::::
hoge2.bk
::::::::::::::
hoge2.bk
::::::::::::::
hoge3
::::::::::::::
hoge3
::::::::::::::
hoge3.bk
::::::::::::::
hoge3.bk
$ for file in hoge?
> do
> echo "### $file ###"
> diff $file ${file}.bk
> done
### hoge1 ###
1c1
< hoge1
---
> hoge1.bk
### hoge2 ###
1c1
< hoge2
---
> hoge2.bk
### hoge3 ###
1c1
< hoge3
---
> hoge3.bk

第21回「拡張子を削除する」

さて、第21回のお題は「拡張子を削除する」です。

拡張子削除はrenameコマンドを利用します。

rename .txt "" *.txt
*.txtに該当するファイル名から.txtを""(削除)する意味になります。

2014年2月17日月曜日

第20回「2重起動チェックをする」

Cronで処理完了していないのに、またCronが実行して、2重起動しないようにしてください。。
さて、第20回のお題は「2重起動チェックをする」です。

2重起動チェックはfuserコマンド(使用しているプロセス表示)と、awkのNF(フィールド数表示)を利用します。

[check.sh]
#!/bin/sh
fuser a.sh 2>/dev/null | awk '{ exit NF }'
if [ $? -gt 1 ] ; then
echo '複数起動中…'
exit
fi
sleep 1000

check.shを起動中にcheck.shを起動すると、
exit NFが終了ステータス($?)になり、2(プロセス数)となります。(1つ起動していれば、1になる)
[ $? -gt 1 ]は、$?が1より大きいときに、
echo '複数起動中…'
になります。(1つ起動したときは、echoされない。2つ以上でechoされる。)
2>/dev/nullの標準エラーは、awkのNF(フィールド数表示)にカウントさせないようにしています。

2014年2月11日火曜日

第19回「PerlでUNIXコマンドを実行する」

シェルコマンドを愛用しているので、Perlのソース見てもよくわかりません。。
さて、第19回のお題は「PerlでUNIXコマンドを実行する」です。

UNIXコマンドをPerlで加工できれば、使う機会が増えると思いました。

[test.pl]
#!/usr/bin/perl
my $ret;

$ret=`ls -1`;
print $ret;

[実行結果]
a.sh←printの結果
test.pl←printの結果

[test2.pl]
#!/usr/bin/perl
my $ret;

$ret=system "ls -1";
print $ret;

[実行結果]
a.sh←systemの結果
test.pl←systemの結果
0←printの結果

``(バッククォート)だと、標準出力されず結果を返り値に設定します。
system関数だと、標準出力されて実行プログラムのステータスコードを返り値に設定します。
``(バッククォート)またはsystem関数の後、$?を指定すると実行プログラムのステータスコードになります。
シェルスクリプトをPerlで実行するにはこんな感じです。
$ret=`./a.sh`;
$ret=system "./a.sh";

2014年2月8日土曜日

第18回「Officeのリボンが使いづらいので、Office 2003 スタイルに変更する」

MicrosoftのWindows、Officeが年々使いづらくなっていっているように
(シンプルではなくなっている)感じます。。

いまさらですが、Officeのリボンになってからといい、
どこに何があるやらわけわかんないです。
Office 2003 のシンプルメニューで、文字を羅列しててくれと感じます。

「Office 2007-2013 オールドスタイルメニュー」アドインを使えば、
リボンから解放されます。

第17回「ファイル名を指定すべき引数を標準出力(標準入力)で実現するハイフン(-)」

diff ファイル名1 ファイル名2 の「ファイル名2」を標準出力にするお話です。

さて、第17回のお題は「ファイル名を指定すべき引数を標準出力(標準入力)で実現するハイフン(-)」です。

diff file1.txt file2.txt | diff file3.txt -

ハイフン(-)のところは、ファイル名を指定しないといけないのですが、
ハイフン(-)が「diff file1.txt file2.txt」の標準出力になり、
file3.txtとdiffができます。

つまり、
diff file1.txt file2.txt > file.tmp
diff file3.txt file.tmp
みたいに、file.tmp作らなくてもいいので、
環境に優しい作りになります。

2014年2月7日金曜日

第16回「grepで複数条件を除外して表示する」

変なエラーがでていないか確認してください。。

さて、第16回のお題は「grepで複数条件を除外して表示する」です。

同じエラーがたくさん出ていて、
ひょっこり違うエラーを紛れ込んでいる可能性があるので、
同じエラーを除いて表示して確認していきます。

grep -v -e エラー1条件文字列 -e エラー2条件文字列 *.log
or
grep -v エラー1条件文字列 *.log | grep -v エラー2条件文字列

いつも心の中では、変なエラーがでないように祈っています。。

2014年2月4日火曜日

第15回「ExcelをWordに貼り付けるVBAマクロ」

コマンド単位の作業は、テキストファイルがいいです。

さて、第15回のお題は「ExcelをWordに貼り付けるVBAマクロ」です。

第14回のお題「Excelの取り消し線を取り除いてテキストに貼り付ける」で
Excelの複数シートをWordに貼り付ける作業を自動化します。

※Visual Basic Editor→ツール→参照設定→Microsoft Word Object Libraryにチェックする
Option Explicit
Sub ExceltoWord()

Dim ObjWord As Word.Application
Dim WordDoc As Object

Set ObjWord = CreateObject("Word.Application")
ObjWord.Application.Visible = True

Set WordDoc = ObjWord.Application.Documents.Add

WordDoc.ActiveWindow.Selection.TypeText Text::="■■■Sheet1■■■" & vbCrLf
MaxRow = Worksheet("Sheet1").cells(Rows.Count,20).End(xlUp).Row
Worksheets("Sheet1").Range("T5:T"&MaxRow).Copy
WordDoc.ActiveWindow.Selection.TypeText Text::="■■■Sheet2■■■" & vbCrLf
Worksheets("Sheet2").Range("A1:A10").Copy
WordDoc.ActiveWindow.Selection.Paste

'取り消し線削除
ObjWord.Selection.Find.Text= ""
ObjWord.Selection.Find.Font.StrikeThrough = True
ObjWord.Selection.Find.Replacement.Text = ""
ObjWord.Selection.Find.Forward = TRUE
ObjWord.Selection.Find.Wrap= wdFindContinue
ObjWord.Selection.Find.Execute ,,,,,,,,,,wdReplaceAll

'txtで保存
WordDoc.SaveAs2 Filename:="test.txt", FileFormat:=wdFormatText, InsertLineBreaks:=True
ObjWord.Quit

Set WordDoc = Nothing
Set ObjWord = Nothing

Application.CutCopyMode = False

End Sub

※MaxRowの20はTを表しています。
自動化できるところは自動化して、シンプルにできるところはシンプルにするがいいです。。

2014年1月31日金曜日

第14回「Excelの取り消し線を取り除いてテキストに貼り付ける」

コマンド単位の作業は、テキストファイルがいいです。

さて、第14回のお題は「Excelの取り消し線を取り除いてテキストに貼り付ける」です。

Excelの手順書だと関数が使用されていると、
コピペしにくいからテキストに貼り付けておきます。

Excelでは取り消し線もあり、そのままテキストに貼り付けると
取り消し線部分もテキストに貼り付けてしまいます。

Excelでは取り消し線部分文字は消せませんが、Wordでは以下の方法で消すことができます。
検索→書式→取り消し線にチェック→全て置換
上記の方法で、ExcelからWordにコピーし、取り消し線部分文字をけして、テキストファイルに貼り付けます。

Excel、テキストの得意分野を理解して、使い分けます。。

2014年1月22日水曜日

第13回「一行コマンドで複数コマンド実行」

tar zxvf *.tgzで複数の圧縮ファイルを解凍できません。。

さて、第13回のお題は「一行コマンドで複数コマンド実行」です。

tarコマンドを複数実行するのは面倒なので、こんな時はお世話になるのはxargs、awkです。

・ls *.tgz | xargs -n 1 tar zxvf
もしくは、
・ls -1 *.tgz | awk '{print "tar zxvf "$1}' | sh

一行野郎に今宵も男泣き。。

2014年1月21日火曜日

第12回「Perlモジュールをインストール」

Perlモジュールが足りません...

さて、第11回のお題は「Perlモジュールをインストール」です。

新しい環境にPerlモジュールがなくて、Perlプログラム実行時に怒られました...

1.お目当てのPerlモジュールがあるかを確認
find `perl -e 'print "@INC"'` -name '*.pm' -print | grep Perlモジュール名

2.お目当てのPerlモジュールをインターネットからダウンロード

3.Perlモジュールをインストール
perl ./Makefile.PL
make
make test
make install

4.インストールされているか確認
find `perl -e 'print "@INC"'` -name '*.pm' -print | grep Perlモジュール名

無事、Perlプログラムを実行できました。

2014年1月13日月曜日

第11回「GDBでプロセスにアタッチ」

プログラムの仕様に詳しくなるには、デバッグしかないですよ…

さて、第11回のお題は「GDBでプロセスにアタッチ」です。

単体試験や、設定値にどんな値が入っているか知るために、
GDBでプロセスにアタッチします。
1.make時にデバッグオプションを付けてコンパイル
CFLAGS = -g …
もしくは、
cc -c -g …
2.プロセスPIDを確認
% ps x | grep プロセス名
PID プロセス名
3.gdb起動
% gdb
4.ソースコードがあるディレクトリを指定
directory ソースコードのディレクトリパス
5.プロセスにアタッチ
attach プロセスPID
6.試験が終わったら、デタッチ
detach
quit

補足 GDBの基本操作
1.ソースコード表示
list
list filename:num
2.値表示
p 変数名
3.ブレークポイント
b 行番号
b 関数名
b ファイル名:行番号
4.ステップアウト
n
5.ステップイン
s
6.ブレークポイントまで継続
c
7.実行
r
8.ブレークポイント確認
info b
9.設定
set 変数=値
10.実行中の関数レベルを表示
where
11.ブレークポイント削除
d ブレークポイント番号
12.関数の呼び出しスタックの一覧を表示
info stack
13.存在しているスレッドの一覧を表示
info Thread

プログラミングの基本は、デバッグの繰り返しです。

第10回「SQLエラー発生させる」

DB異常系の試験は嫌なんじゃ。。

さて、第10回のお題は「SQLエラー発生させる」です。

SQL失敗の試験で手っ取り速いのが、権限を削除させます。
1.DBに接続
2.エラーを発生させるTableのDMLの権限を削除
=> REVOKE SELECT ON table名 FROM ユーザ名;
もしくは、
=> REVOKE UPDATE ON table名 FROM ユーザ名;
もしくは、
=> REVOKE INSERT ON table名 FROM ユーザ名;
もしくは、
=> REVOKE DELETE ON table名 FROM ユーザ名;
3.試験を実施
4.権限を付与(元に戻す)
=> GRANT SELECT ON table名 TO ユーザ名;
もしくは、
=> GRANT UPDATE ON table名 TO ユーザ名;
もしくは、
=> GRANT INSERT ON table名 TO ユーザ名;
もしくは、
=> GRANT DELETE ON table名 TO ユーザ名;

DB詳しくないから、壊すとややこいから、
異常系の試験は嫌なんじゃ。。

第9回「プロセスを停止(kill -STOP PID)、Tableロック(LOCK table)」

3年経過しました。

さて、第9回のお題は「プロセスを停止(kill -STOP PID)、Tableロック(LOCK table)」です。

結合試験では、デバッガが使わない範囲で、
プログラムを苛めないといけません。

ある設定値を確認したいのに、処理が速すぎて確認できないときに、
プロセスを停止(kill -STOP PID)して確認します。
1.プロセスPIDを確認
% ps x | grep プロセス名
PID プロセス名
2.プロセスを停止
% kill -STOP PID
3.試験を実施
4.プロセスを再開
% kill -CONT PID

プロセスのTableアクセス手前でプロセスを停止したい場合は、
Tableロック(LOCK table)します。
1.DBに接続します。
2.Tableをロック
=> LOCK table名;
3.試験を実施
4.ロックを解除
=> UNLOCK table名;
もしくは、
=> rollback;

異常系の試験をどうにかこなすために、
頭を悩ます日々が続きます…