プログラマメモ2 - programmer no memo2

エクセル。自分自身からOFFSETで参照 2010/06/19

エクセルです。自分自身のセルから左となり、右となりのセルを参照して、判定します。
おそらく多分、この短いコードをすぐに思い出すことはないと確信するので、ここにメモしときます。

参考


自分自身の左隣を取得する
=OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())), 0, -1)


次に左となりと右となりを比較して一致するなら○、一致しないなら×を表示してみます。

文字列の比較はEXACTで。


=IF(EXACT(OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())), 0, -1),OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())), 0, 1)),"○","×")


結果こんな感じ




参考

エクセルのマクロで正規表現の練習 - VBAでもRegExp 2010/06/18

エクセルをたくさん使うと何か負けた気がしてしまう今日この頃です。
エクセルなんでもできますね。ほんと。

VBAで正規表現を使うという発想がなかなか浮かばなかったのですが、使えるようになるとかなり便利です。

今回は、テキストボックスのフォームをおいて、ボタンをクリックしたら、入力されたテキストの各行の先頭の空白を削除するというシナリオです。

実は、はまったのはRegExpにMultiLineというプロパティがあるのに気がつかなかったことです。
MultiLineはデフォルトではFalseです。このプロパティがTrueでないと各行の処理をしてくれません。

以下コードです。


Function MyReplace(patrn, target, rep)
Set regEx = CreateObject("VBScript.RegExp")
regEx.MultiLine = True 'デフォルトはFalse
regEx.Pattern = patrn
regEx.Global = True
regEx.IgnoreCase = True
MyReplace = regEx.Replace(target, rep)
End Function

Private Sub CommandButton1_Click()
Dim s
s = TextBox1.Text
'各行の先頭の空白を消します
s = MyReplace("^[ ]+", s, "")
' Debug.Print s

' セルに一行づつ書き出してます。
Dim lines
Dim p
lines = Split(s, vbCrLf)
p = 0
For Each Line In lines
Debug.Print Line
Range("H5").Offset(p, 0).Value = Line
p = p + 1
Next

End Sub

所定ディレクトリにあるbackupというディレクトリ以外のすべてをbackupディレクトリに移動します。- xargs使ってます。 2010/06/13

所定ディレクトリにあるbackupというディレクトリ以外のすべてをbackupディレクトリに移動します。
試したのはLinux CentOS5です。

こんな感じ


@backupが、backupフォルダです。最近の僕のはやりは@つけてフォルダをつくることなので@をつけてます。単にソートして上にくるからという理由なのだけれども。。。

コマンドは以下、正規表現で[^...]

ls|grep [^backup]|xargs mv --target-directory=backup
ls|grep [^backup]|xargs mv -t backup


mvの-tオプションはmacosxのデフォルトでは無理か...

mvのコマンドのman

以前、自分がためした試み

AJAX Search API をYAJLで使ってみます。 2010/06/07


アプリ経由でgoogleさんの検索結果が欲しいなと思いました。
JSONで取得することにして、簡単だー、と思っていたら、Objective-CでどうJSONって扱うのだろうというところでとまどいました。


こちらの記事を読んでYAJLを使ってみることに決定。

使用しているライブラリは、

ここまではいいのですが、Objctive-Cをよく理解できていない僕は、悩むわけでした。

なんとか、必要な情報をとるためのコードをこさえました。
参考

yajl-objcをとりこんだあとは、
これを忘れずに、
#import "YAJL.h"


Objective-Cってなかなか柔軟であることに気がつきました。
(いまさらですが...)

YAJLDocumentベースで作成してます。

コード
NSString *urlString = @"http://ajax.googleapis.com/ajax/services/search/web?q=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%A1%E3%83%A22&v=1.0&rsz=large&hl=ja";

NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:url];

NSError *error = nil;
YAJLDocument *document = [[YAJLDocument alloc] initWithData:data parserOptions:YAJLDecoderCurrentTypeDict error:&error];

NSLog(@"Root: %@", document.root);
NSLog(@"==================================");
NSLog(@"responseStatus==>[%@]", [document.root objectForKey:@"responseStatus"]);// ステータス200ならOK
id cursor = [[document.root objectForKey:@"responseData"] objectForKey:@"cursor"];// カーソル
{
NSLog(@"型を調べてみると==>[%@]", [cursor class]);
for (id o in cursor) {
NSLog(@" 型==>%@", [o class]);
}
}
id results = [[document.root objectForKey:@"responseData"] objectForKey:@"results"];// 検索結果

NSLog(@"型を調べてみると==>[%@]", [results class]);
for (id o in results ) {
NSLog(@" 型==>%@", [o class]);
NSLog(@" %@", [o objectForKey:@"cacheUrl"]);
NSLog(@" %@", [o objectForKey:@"content"]);
NSLog(@" %@", [o objectForKey:@"titleNoFormatting"]);
NSLog(@" %@", [o objectForKey:@"url"]);
}
[document release];


あとは型でチェックするコードを追加すればまあまあいけるかな。どうでしょうか。

えーと、一行で複数のテーブルのカウントを返すSQL 2010/06/05

SQLです。SQLは苦手です。
一行で複数のテーブルのカウントを返すSQLです。
見せてもらって、へーと、思ったのでメモ。

実験はH2で行ってます。

まず、テーブル作成

CREATE TABLE A ( id VARCHAR (10))
CREATE TABLE B ( id VARCHAR (10))
CREATE TABLE C ( id VARCHAR (10))

まあ、なんでもいいんだけど。

で、インサートでがんがんデータを入れます。

そしてカウント

select * from (select count(*) as a from A), (select count(*) as b from B), (select count(*) as c from C)


これで3つのテーブルカウントがとれます。

SQLに関しては、たまに絶望的にやる気をなくしてしまうことがあります。
どうしてかなーと考えると、きっと設定が面倒だからかな。