[PowerShell] 連想配列をソートしてforeachで一個づつ取り出す

PowerShell で連想配列を用いた時のソート&foreach のサンプルがなかなか探せなかったのでメモします

とある連想配列

PS C:\> $tbl = @{
>>       k00 = "orange";
>>       k01 = "peach";
>>       k02 = "apple"
>>  }

出力は簡単

PS C:\> $tbl

Name                           Value
----                           -----
k01                            peach
k02                            apple
k00                            orange

ソートの出力も簡単

PS C:\> $tbl.GetEnumerator() | Sort-Object Value

Name                           Value
----                           -----
k02                            apple
k00                            orange
k01                            peach

# もしくは

PS C:\> $tbl.GetEnumerator() | sort Value

Name                           Value
----                           -----
k02                            apple
k00                            orange
k01                            peach

これを一つづつ取り出して処理したい

単に foreach で取り出すとき

PS C:\> foreach( $k in $tbl.Keys ){
>>   Write-Output $k
>>   Write-Output $tbl[ $k ]
>>   Write-Output '-----'
>> }

k01
peach
-----
k02
apple
-----
k00
orange
-----

さらにソートして foreach で取り出すとき

PS C:\> $tbl.GetEnumerator() | sort Value |
>>   ForEach-Object{
>>       Write-Output $_.Name
>>       Write-Output $_.Value
>>       Write-Output '-----'
>>   }

k02
apple
-----
k00
orange
-----
k01
peach
-----

ForEach-Object を使いました ただの foreach() でも出来ると思うんですけど、私的用途が満たせたので、これ以上は調べてないです

検索で、「powershell foreach ソート -perl」 などで検索しても、日本語の情報があまり出てこなかったので、参考になれば幸いです(^^)


[PowerShell] 32bitと64bitの使い分け

PowerShellにはちゃんと 32bit版と 64bit版が備わっています

Windows2008 R2
Windows2012 R2
共に同じ場所にあります(~o~)

64bit版
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

32bit版
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe

デフォルトの64bitマシンであれば、コンソールで

> powershell

とすると、64bitモードが立ち上がります

これはどういうことかというと、64bitのアプリから使うライブラリなどは、64bitでないとダメってことです

何にはまったかというと、PowerShell から System.Data.OracleClient に接続するとき

たとえDBサーバが 64bit Oracle だったとしても
Oracle Client はデフォルトでは 32bit になっているようです

powershell から oracle に接続しようとしたときこんな感じになります

# アセンブリのロード
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient")

# 接続
$conn_str = "Data Source=saoDB;User ID=sao;Password=password;Integrated Security=false;"
$ora_conn = New-Object System.Data.OracleClient.OracleConnection($conn_str)

# インスタンス
$ora_cmd = New-Object System.Data.OracleClient.OracleCommand
$ora_cmd.Connection = $ora_conn

# データベースに接続
$ora_conn.Open()

(参考)powerShellからOracleを使う(接続・切断)
http://harikofu.blog.fc2.com/blog-entry-114.html

このDB接続直後に、64bit のPowerShell だと
こんなエラーが出ます

"0" 個の引数を指定して "Open" を呼び出し中に例外が発生しました: "Oracle クライアント ライブラリを読み込もうとしましたが、BadImageFormatException が発行されました。この問題は、32 ビットの Oracle クライアント コンポーネントが
インストールされている環境で 64 ビット モードを実行すると発生します。"
発生場所 行:1 文字:22
+ $ora_conn.Open <<<< ()
    + CategoryInfo          : NotSpecified: (:) []、MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

問題解決方法は2つ

既存の稼働環境に影響を与えない様にするという意味では
不毛ですが後者を選択すると波風立てずにコトを済ませられます


[Oracle]テーブル・カラム名が不明でもDBに入っている値を検索したい

見知らぬデータベースを渡され、中を解析したい時…

ありますよね?ありますよね!?

全テーブルの全列に入っている値を横断検索したいという要求、あるんじゃないでしょうか?

探したら同じことを考えている人が居ました

方法は2種類
一つは dmp 出力して、テキスト検索 をするというもの
だいぶ力技ですけど、確かに、確実に検索できますね…

もう一つの方法は、PL/SQL で全データを総検索 するというもの

この方法、
やってみると、良い感じに動きます
お勧めです
テーブル名やカラム名が判らなくても、動きますしね!

めっちゃ感激したので、この記事にも SQL を載せておきます

このサンプルでは、全ての値に 「あ」 が入っているデータを検索します
どのテーブルの、どのカラムに、何件入っているかが判ります

う、嬉しい~!!!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
declare
 sSQL VARCHAR2(128);
 sDATA VARCHAR2(500);
 type cursor_type is ref cursor;
 cur_search cursor_type;
 vCount INTEGER;
 ERR_CODE NUMBER := 0;
 ERR_MSG VARCHAR(255);
begin
 for vRec in (select COLUMN_NAME,TABLE_NAME from USER_TAB_COLS where DATA_TYPE like '%CHAR%')
 loop
  begin
    open cur_search for 'select count(*) as cnt from ' || vRec.TABLE_NAME || ' where ' || vRec.COLUMN_NAME || ' like ''%あ%''';
        fetch cur_search into vCount;
        if vCount > 0 then
          dbms_output.put_line(vRec.TABLE_NAME || '.' || vRec.COLUMN_NAME || ':' || vCount || '件あり');
        end if;
        close cur_search;
  exception
   WHEN OTHERS THEN
    ERR_CODE := SQLCODE;
    ERR_MSG  := SUBSTRB(SQLERRM,1,255);
    dbms_output.put_line('error:' || ERR_CODE || ' ' || ERR_MSG || ' ' || vRec.TABLE_NAME || '.' || vRec.COLUMN_NAME);
  end;
 end loop;
end;

DBの構造を解析するツールは結構探せばあるのですが、データの中身となると、調べるのは手間ですよね…
このSQLには助けられました~

話は変わりますが、
DB系のクライアントツールで、わたしがよく使っているのは A5:SQL Mk-2 (フリーソフト)です

Oracle, SQLServer, MySQL など多くのDBに対応しています
一番うれしいのは、Oracle への接続に、Oracle Client が無くても接続できる所ですね

OCI経由か、直接 IPアドレスなどを指定して接続するかを選択できる!!

ER図も自動生成してくれるし、
めっちゃ、現場で役立ってます


[C++/CX] MVP Community Camp 2014大阪で「VC++まわりの非同期処理」セッションしました

MVP Community Camp 2014大阪にて、VC++系のセッションをさせて頂きました

MVP Community Camp 2014大阪会場
http://atnd.org/event/E0024087 (リンク先は削除されている模様です)

当日利用した資料はこちら!


 pptx版はこちら  ←セッション時の私的メモが欄外に載っています
 PDF版はこちら

序盤はわたしの追体験発表みたいになってしまいました
同じような疑問を持っている人や、その人なりの解釈の手助けになる様であればと思って記載しています

後半部分は、VC++での非同期処理の触りだけになっていますが
非同期での例外や中断など、C++/CXのWIndowsストアアプリでは興味深い仕組みが色々あるので
この続きになる情報も、もっと自分なりに勉強して発信していきたいなー


Anonymous Struct of C

Hi,

It is very tedious to think about the name of a struct when you use to struct only once.
In such a case, Anonymous structure comes in handy.

It is assigned to the anonymous struct

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
struct{
        char    1st_name[0x80];
        char    2nd_name[0x80];
 
    } name_tbl[] = {
        { "Isami",   "Kondou" },
        { "Toshizo", "Hijikata" },
        { "Kogorou", "Kathura" },
    };
 
    for( i = 0; i < sizeof( name_tbl ); i ++ ){
        printf( "%s\n", name_tbl[ i ].1st_name );
        printf( "%s\n", name_tbl[ i ].2nd_name );
    } 

This code is very straightforward!

This method is effective only when there is no necessity that you use 2 times and this structure.


[Git] ローカルを強制上書きして、作業をなかったことにしたい

ローカルの作業が何やらおかしくなったから
リモートのファイル内容に戻したい~という時
以下のコマンドでさくっと戻りました

1
2
git fetch origin
git reset --hard origin/master

ツールなどで強制的にsyncさせようとしても

failed to sync this branch

という悲しいお知らせが出て、結局 Git Bash に行くことになりますので……

(参考リンク)


C,C++,C++/CLI sample program

Hi,

C program

1
2
3
4
5
6
7
8
c00.c
#include <stdio.h>

int main()
{
    printf("This is a native C program.\n");
    return 0;
} 

compile

> cl.exe c00.c

C++ program

1
2
3
4
5
6
7
8
c01.cpp
#include <iostream>

int main()
{
    std::cout << "This is a native C++ program." << std::endl;
    return 0;
}

compile

> cl.exe /EHsc c01.cpp

C++/CLI program

1
2
3
4
5
c02.cpp
int main()
{
    System::Console::WriteLine("This is a Visual C++ program.");
}

compile

> cl.exe /clr c02.cpp

That is very interesting!


Lightning Talk:How to program C++/CX

Hi,

The other day, I spoke about C++/CX in Lightning Talk.

Click here for article

PPTX-How to program c++/CX

PDF -How to program c++/CX

Take care!


Hello World

Hi,

I’m Sao Haruka :)

Japanese programmer

I have started this English blog since Jan 28, 2014.

Thank you.


[Oracle] 直前のSQLを再実行する

OracleのコマンドラインでSQLを実行させるときのメモ

直前のSQLコマンドを実行は / (スラッシュ)
この場合、直前のバッファの内容は表示しません

1
SQL> /

直前のバッファの内容を表示して実行するのは run コマンド

1
SQL > run

直前のバッファの内容を修正するには edit コマンド
タイプミスなどを修正できます
ただし、環境変数 “_editor” にエディタの設定をしておく必要があります

1
2
SQL > define  _editor=vi
SQL > edit

(参考)