2019年07月15日

英語ができるとプログラミングの効率よくなる(仮説)

仮説というかほぼ間違いない事実なんですけども。

プログラミングに英語は必要なのか決着をつけようと思う | CodeCampus

同僚のインド人(Aさん)は普通に英語ができます。そして、新しい開発環境でもものすごいスピードで習得してアウトプットできます。

本人曰くプログラミングだけしていたいとのことなので根っからの開発好きなのは間違いない。

方や同じその環境で私が勉強しているのにいまだ追いつかない。いちいちリファレンスをみて、日本語の参考文献を見てようやくサンプルコードの意味が分かる。そんなレベル。

で結局のところ英語が分かれば参考書も必要ないというケースに何度か出くわした。
辞書レベルの知識で何とかなることが結構あるのね。

そういうことが積み重なると開発のスピードの差となって現れてきます。

英語圏の人にとって見たら、日常語で全部書いてあるイメージなんだろうな。

結論としてはもっと英語を身に着けたい。

2019年07月08日

20年前、今の自分を想像できなかった

20年でソフトウェア開発の景色はどのぐらい変わったのか? - Qiita

あと20年、いったいどうなっているんだろう。

あと20年頑張れるだけの、新しい何かを今、始める(育む)べきなんだよなぁ。令和元年だし。

2019年05月12日

VBAのPublicNotCreatableの設定をよくわからないまま使っていた

PublicNotCreatable って、クラスモジュールをブック外(アドイン外)VBAプロジェクトから見えるようにするってことなのね。

ならば基本的には全部 PublicNotCreatable にする必要なくて、Privateで アドイン内で完結するように作っていれば問題なし、と。

PublicNotCreatable

自作のアドインブックを見たら、無意味に PublicNotCreatable を設定しているのがあったので全部Privateに戻してる。コンパイルがOKだったので不都合ないでしょう。

2019年03月17日

dockerでSQLServer簡単に起動できた。

Docker (Linux 上の SQL Server を実行) で SQL Server のコンテナーの概要します。 - SQL Server | Microsoft Docs

SQL Server Management Studio(無料)はこちらからDLできます。
SQL Server Management Studio (SSMS) のダウンロード - SQL Server | Microsoft Docs

2019年03月01日

今年はクラウド活用します元年

サーバーレスパターン

サーバーレスっていうものにまだイメージわかない。

あとSAASとかPaasもよくわからない。


2019年02月08日

dockerとVMWareを同一ホストに入れるのを断念。dockerはVMWareのゲストOSのほうに導入することにする。(CPUの仮想化の仮想化を使う)。

dokerの普通のコンテナを使うとLinuxコンテナーを使うことになり、Windows版のdockerデスクトップをインストールすると HyperーVが有効化されてしまう。

そうなると、同一ホストではVmWareやらVirtualBoxは締め出されてしまう。これはいやだ。

となると、dokerをホストOSに入れることはリスクでしかない。

しかも そういう相性の悪さを考慮していないほかのアプリ、例えばNoxPlayerを起動すると ブルースクリーンで落ちる。Windows10が確実に落ちます。

以下の写真が久しぶりに見たブルースクリーン
2019-02-08_191807.png
昔に比べて落ち着いた青になっています。

100%になっても自動的に再起動してくれなくて1時間くらい待ちました。

というわけで方針変換し、ホストOSでdockerを動かす代わりにゲストOSで動かすことに決めました。
dockerクジラ君にはサヨナラです。
ホストOSから先にHyper-Vをアンインストールしたところ困った顔をしていました(以下の図)
2019-02-08_194001.png

新しいdockerの行き先の ゲストOSはWindows10 Pro 64Bit版 で決定です。メモリは12GB積むことにしました。
VmWareで起動したところ、初期状態では Hyper-Vプラットフォームが有効化できませんでした。
2019-02-08_192318.png

こういう時にはゲストOSの仮想マシンの設定の
仮想エンジンの VTの有効化をチェックします。
2019-02-08_192701.png

有効化した後でゲストOSを起動すると、ゲストOSの中でもHyper-Vが有効にできます。
さて、これでここに dockerを入れましょう。
2019-02-08_192924.png

2019年01月18日

Java使っていないの?じゃあアンインストールしようぜ!って自ら提案してくるJavaインストーラ嫌いじゃない

2019-01-18_211820.png

その後提案通りにアンインストールしました。 またの機会にはインストールすることを心に決めた。

2019-01-18_212501.png

2019-01-18_212529.png

そうはいっても eclipse IDE のスタンドアロン版が入っているので Java SDK はいつも入っているんだけどね。

2018年11月15日

これからのJavaはAmazon一択になるかも

【速報】マルチプラットフォームで利用可能なOpenJDKのAmazon Correttoが発表されました! | DevelopersIO

Oracleどうしようもないな、Oracleのライセンスも信じられない値段だ(と聞く)し。

2018年08月07日

サマータイムを日本で導入すると2時間なの?

コンピュータシステムのサマータイム対応を巡る二つの楽観論 - アンカテ

ヨーロッパ、ドイツを例にとると、
サマータイムは3月の最終日曜日に始まり、日本との時差は7時間。*今現在こちらですね*
10月の最終日曜日に終わり、日本との時差は8時間
つまりサマータイムを導入しているドイツでも+1時間の時差で調整しているんですね。

サマータイムについて

ところが日本のサマータイムの時差は2時間(と言っている)。
これに日本のサマータイムの2時間を加えて(減らして)考えると、ドイツとの時差はどうなるの、わけわからないよ。

サマータイムで日本中の電波時計がゴミになる(かも)という話 | mzsm.me

2018年05月15日

VB系がちゃんとカウントされているのできちんと標本採集したものだと思われる

PythonがJavaを抜く - PYPLプログラミング言語ランキング | マイナビニュース

どこかで動けば十分というなら、JavaよりPython ていう時代。

2018年04月21日

Javaの未来はどうなっちゃうんだろう

Java Future Release Notices

いまだにJava6あたりで開発しているものがあるのでそろそろバージョンアップをと思ったら、商用ライセンスが必要とかいったいどんな世界にJavaは進もうとしているのか。

2018年にJavaを利用している人は全員理解すべきことを説明してみる(追記あり) - orangeitems’s diary

あ〜、、これか(個人的感想)。SAP システムでJavaを使っている環境についてのヒアリングがあったものだから何のことかと思っていたけど話がここにつながるのか。CPUコア数に応じて課金されるわけで、、こりゃたまらん。

本の虫: Javaの権利にまつわるまとめがすごい

Oracleが企業のJavaユーザーに対しライセンス料徴収活動を進めている? | スラド デベロッパー

波紋呼ぶJavaサポート打ち切りの横で、IBMがちゃっかりバージョン8のサポートを2022年まで伸ばしているという話 - orangeitems’s diary

2018年03月07日

良かった。VB系は空気のような存在だね。今年はPython活用したい。

人気が下降しプログラマの求人も少ないプログラミング言語ワースト10は? 一方で仕事の多い言語は? CodementorXとCoding Dojoの調査結果 − Publickey

最近はC#で新規アプリを作ることが多くなってきた。
Javaは知らん(知ってるけどそういう意味じゃなくて)。JavaはOracleのさじ加減一つでどうにでもなる状況が見えてきたので今後どういう立場に落ち着くかわからんね〜

閑話休題。
Pythonを覚えたいんだけど、ただ覚えるだけだとつまらないので目標とか、こういうことできるよっていう餌がほしいなぁ。

将来的に MS Office のマクロ言語にパイソンが搭載されるっていう話はどうなっているのか。

2018年01月05日

関係ないと思うけど、QlikSense Desktop はとてもメモリーを食う

Googleが発見した「CPUの脆弱性」とは何なのか。ゲーマーに捧ぐ「正しく恐れる」その方法まとめ - 4Gamer.net

Download Free Data Visualization Development Platform

現代アプリは調子が悪くても他のアプリを巻き添えにすることはそうそうないが、このQlikSense (Desktop版) は セルフサービスBIを実現するツールなわけだが、うっかり大量のデータを、データソース間の結合をせずにそれぞれのデータ項目(ディメンジョン)を両方表示しようものなら CROSS JOINが発生し、一瞬でリソースを食い尽くす。そしてハングアップするのだが この時に 他のアプリの操作も何もできなくなる。最近使用したアプリではこの 暴れん坊ぶりは QlikSenseでしか見かけたことはない。本当にひどいったらありゃしない。タスクマネージャを立ち上げて無反応になったアプリを強制終了して、、、という手段すら 全く手を出せないような状態になるのだ。

もう去年の話なので 記憶にある限りだと以下の環境で発生した。
・QlikSense DeskTop 3.2
・Windows7
・メモリ8GB
・Corei5

思い出しながら記事を書いてメモとしておきます。


Googleが発見した「CPUの脆弱性」とは何なのか。ゲーマーに捧ぐ「正しく恐れる」その方法まとめ - 4Gamer.net

2017年12月21日

今更になってIE9での動作検証がしたくなったらどうする?

Webアプリサイトのデザイン一新を請け負って、完成させた。

見積もり要件には IE11で確認しますと書いておいたので必要ないのだが 無償で最新のEdgeや、FireFox、Chromeでも破綻無いことをチェックした。 完璧だと思っていた。

ふと、Webサイトのアクセスログを分析すると、利用者のブラウザーは半分がIE9からのアクセスだった。

数人だけが頻繁にIE9で利用しているだけかもしれないが、これは見過ごせないと思いIE9での動作チェックの方法を探していると以下のサイトを発見。

Free Virtual Machines from IE8 to MS Edge - Microsoft Edge Development

マイクロソフトが Windows7+IE8 、IE9, IE10 、IE11 および Windows10+Edge, Windows8.1+IE11 という 環境を 仮想マシンで提供してくれている。
利用に制限はあるが、ブラウザーの動作検証だけできればよいので最適なソリューションである。ただ、英語版IEだけなので日本語フォントが微妙に中国語の漢字フォントになってしまって見えたりするがそこは我慢。

さっそくVirtualBoxの仮想マシンをダウンロードしてテストしたところ案の定、最新のブラウザーに特化しすぎて IE9では従来と見かけが大幅に変わっているところを発見。WebのCSSの情報を見てホイホイ取り入れていると古いブラウザーの考慮が抜けてしまうという事があるという好例。

IE9でも、最新のブラウザで確認したのとほぼ同じ修正結果の同じイメージになるように後方互換性を取るためのスタイルシートを考えながらようやく妥協点を見つけてほっとしたところ。

・VirtualBox
仮想マシンソフトウェア はこちら Downloads – Oracle VM VirtualBox

2017年10月26日

FFFTP開発お疲れ様です

FTPクライアント「FFFTP」ついに開発終了か 6年前に“引き継いだ”開発者が表明 - ITmedia NEWS

今はもうWinSCPで十分な感じ。

WinSCPだとC#(.net)で組み込みFTP(SCP)ができるライブラリーがあるので プログラム中に高度なファイル転送処理を実装するのもお手軽簡単。

2017年08月07日

正規表現の先読み戻り読みの意味を考えて構文を暗記!

Perlの正規表現における「先読み/後読み」に関する私的まとめ - the code to rock

そんなことはどうでもよいという人は このページを戻るか、次の記事を先読みしましょう。
They don't care about it!

(? ) は これらの先読み (look a head )構文の 基本系であり、これに = で肯定(?=)、! で否定(?!)。
そして < を付けると 戻り読み( look behind ) となる。

一致した文字列は記憶されない(マッチの結果には現れない)。

一方 (?:)は 記憶されないが、マッチの結果には含まれる。

※EmEditor にて確認。


2017年06月23日

NPOIの最新版がNugetに置いてあった!! nuget万歳

NuGet Gallery | NPOI 2.3.0

私は nuget のパッケージをダウンロードして解凍して中身を取り出して自分で参照登録する派です。 IDEのアドオンとかでは管理しません。(できません)。


npoi本家の CodePlex は閉鎖が決まっているのでバージョンも2.2.1で止まっていたのでこれで終わりかと思っていたんだよ、、、NPOI - Home


個人的な希望として nuget のようにポータブルで利用できるライブラリがほしいのは DB2 のクライアントドライバー。 Oracleは 公式版があるけどDB2は ラッパーのORMapplerしかないじゃん?
あとは CrystalReport 。これも nuget を探し回っていくつかのアセンブリを手に入れて、ビルドエラーが出ないところまで行ったんだけど、実行時に ライブラリー参照(ファイルが見つからない)エラーが出るんだよ。結局使えない。ただしこの2つのミドルウェアはもともとインストーらが巨大。コンパクトなDLLにまとまるのか疑問である。
Oracleの公式ドライバーは本当によく頑張ったと思う。

ただまあ、Java方面を見ると これらはすべてポータブルに利用できるので .net も早くその域に到達してほしいと願っている。さらにはそれらが Linux でも動くことを。
とは言え自作ライブラリーDLLですら Win32APIを呼んでいるものがたくさんあるからLINUXでの動作はなかなか厳しいことは認める。


2017年06月14日

今年は更新なしかと思ったけど オラクル公式 ODP.net 管理ドライバーが出てたー(5月末に)

Oracle Client インストール不要、単体で DB接続可能な Oracle ODP.NET, Managed Driver。: NN Space BLOG-NN空間ブログ

NuGet Gallery | Official Oracle ODP.NET, Managed Driver 12.2.1100

ダウンロード履歴数を「引用」してしまいますが
まだ1万ダウンロード行ってません。
Version History
Version Downloads Last updated
Official Oracle... 12.2.1100 (this version) 9,347 2017年5月31日
Official Oracle... 12.1.24160719 153,844 2016年9月17日
Official Oracle... 12.1.24160419 101,273 2016年4月27日
Official Oracle... 12.1.2400 186,253 2015年10月14日
Official Oracle... 12.1.22 91,926 2015年6月23日
Official Oracle... 12.1.21 76,580 2015年1月16日


OracleのClientソフトウェアを一切インストールする必要がないので .net 開発でOracle接続する場合には超おすすめです。
DB2でもこういうポータブルなドライバー出してくれるといいんだけど、IBMって上下1バージョンくらいしか接続互換性ないんだよね、つらみ。

2017年05月05日

クエリーに囲まれた世界:LINQと共通表式

先日までは、Oracleで クエリー(とストアドプロシージャ)をゴリゴリ書いていました。 最新のOracleだったので共通表式も難なく使えました。

そこでの構文がしっくり来たところで 最近は SQL Server + C# + LINQ という案件も着手しました。
LINQは情報だけは集めていたものの、普段保守するVB.net案件が .net 2.0 から動作を保証しなければならず LINQはあきらめていました。

という事情があって、LINQの実践は初めてでしたが、すでにあるLINQ案件の改修だったのでそこにあるLINQの実際に動作するサンプルが大量にある状態。
これらを眺めながら少しずつ変更して覚えていったら意外とこれもすんなりと使えるようになりました。

結論:クエリー万歳。、、じゃなくて、何となくこの両者 LINQと共通表式が似ているなーとふと思ったんです。(GWなしで休日出勤しながら)

これ以外にも 売り上げ分析のデータ集計の案件などなどもあって、結局のところクエリーと毎日にらめっこしている日々だなと思った。

関係ないけど(なくもないけど)今までだったら .net の世界ではデータテーブル(データセット、データアダプター)っていうADOの世界がデータ操作の場だった(古い?)と思っていたんだけども、LINQによって 準備も手間もいらない、DBとリストを密に連携することが可能になってきた感じ。 この仕組みって Javaのパラダイムでいえば、サーブレットがJSPになったようなものなのかなとこれまた無責任にふと思う。

いろいろ調べてたらLINQってもう10年位前のテクノロジーなんだね。
特集:C#プログラマーのためのLINQ超入門(後編):LINQによるデータベース・アクセスとO/Rマッピング (3/3) - @IT
でもって、外部キーを追っかけて参照できるってのは これまた初めて知った。こういう仕組みは 確かServiceNow上でアプリ開発した時のテーブル設計にもあった気がする。

どんな開発環境でも、目指すところは似たようなところなんだなーとしみじみと感じる。


2017年04月20日

JavaScriptにはブロックスコープが無いって、初めて知ったよ。。

ECMAScript 2015 より前の JavaScript にはブロックスコープがありません
JavaScriptのインライン関数とスコープ | 株式会社シンメトリック公式ブログ |

他のC/Java系言語経験の次に、JavaScript開発を始めるにあたっての認識として、まずこの辺を頭に叩き込んでおくとあとあと悩まないで済むかも。

ECMAScript 2015 からは、let 文による変数宣言がブロックスコープとなります。
制御フローとエラー処理 - JavaScript | MDN

let で代入とか、いにしえのVBの時代を思い出します。。。。

2017年04月06日

[SQL]共通表式を使えば、ごちゃごちゃしたサブクエリを一掃できたり、再帰呼び出しができたりする。

新しい業界標準「SQL99」詳細解説

メモ。

共通表式のメリット
・1つのクエリーだけで使用するローカルな(使い捨て)ビューを定義できる

・そのため、サブクエリでごちゃごちゃしなくなるので、見通しが良い

・直前に定義した共通表式は、すぐ後で参照できる(カスケード参照できる)
 つまり、明細レベルでまとめて、1段階グループ化して、2段階グループ化して みたいなことがそれぞれをビューにすることなく、1つのクエリで完結する。そしてそのそれぞれを、最終的なSELECT文の中で別々の表として参照できる。

・自己参照のパターン(共通表式のUNION )を取ることで繰り返し参照ができる。これはViewでは実現できない共通表式ならではの使い方。これまでなら、クエリーでは実現できず ストアドプロシジャを書かなければならなかったケースがこれに該当する。

今までよりさらにSQLが楽しく活用できるようになる素晴らしい機能だと思う。

さらにPostgreSQLだと、WITH にDELETE文を記述できて、その削除結果をSELECTしたり、INSERTの対象にできたりするのでこれもものすごく便利だと思う。 SQL ServerやDB2やOracleでも使えるといいのに。
PostgreSQL WITH問い合わせ(共通テーブル式)

20170422_233829 もう一個特徴的なこと
・複数定義した共通表式のうち特定の式を最終SELECT句で参照しなくてもいい
 これがあるから、いままでワークテーブルを作らないとできなかったようなクエリーも1つのクエリーで完結できてしまう。ワークテーブル的に使えるのにテーブル定義は不要で、共通表式の定義だけで使える。なんて便利なんだ。

共通表式はかなり強力なクエリー構文だ。

2017年03月30日

実はみんな嫌いじゃなくて、愛着があるけど気に入らないところもあって、それでも使い続けている人が多いことの裏返しなんだと思うよ。

開発者に嫌われているプログラミング言語トップ25 | マイナビニュース

誤解を恐れずに言うけど、ワースト4より下位の言語って、この4つの言語より、マイナーで利用者が少ないよね。

VB6はすでに自分のところでもすべて .net に移植完了したけど、 Office VBA は いまだに改修案件がある。
Office のマクロのスタンダード言語を早く C# も使えるようにしてほしい(VB.netすら対応していないので無理なんだと思うけど)。 アドイン dll を開発するという選択肢は別として。





2017年03月14日

ORA−オラ狂う

どうする?オラクル - 怒りを通り越してあきれるOracleユーザー:ITpro

最近はオラクルで、パッケージやファンクションやプロシージャを開発し続けています。

2017年02月22日

oracleのユーザー定義関数のDETERMINISTICオプションの有無をテストしようとして分かったのは、sysdate とか sysTimestamp は DETERMINISTIC な関数と同じように動くということ。

オラクルで、ファンクションを作っているときにパフォーマンスに効くだろうと思い。DETERMINISTIC オプションについて検証していました。
参考:
ファンクションの宣言および定義

意味:
DETERMINISTIC

同じパラメータ値を使用してファンクションが起動されたときは常に同じ値を戻すことをオプティマイザに示します(この前提が真でない場合は、DETERMINISTICを指定すると予測できない結果になります)。以前に同じパラメータ値を使用してファンクションが起動されている場合、オプティマイザは再度ファンクションを起動するかわりに以前の結果を使用できます。


「同じパラメータ値を使用してファンクションが起動されたときは常に同じ値を戻す」というのがいったいどの範囲で「常に」「同じ」なのかがずっと気になっていて
今回テストファンクションを書いたらなんとなく理解できた。
結論としては
「同じ1回のクエリー呼び出しの中で」
「クエリの特定の場所に記述された同一のパラメータ(もしくはパラメータなし)で呼び出された関数はクエリー中で何度呼び出しされても同じ値を返す」

たとえばこんな関数と
CREATE OR REPLACE FUNCTION SYSDATE_TEST
RETURN TIMESTAMP
PARALLEL_ENABLE
DETERMINISTIC
AS
BEGIN
RETURN systimestamp;
END;

もう一つこんな関数
CREATE OR REPLACE FUNCTION SYSDATE_TEST2
RETURN TIMESTAMP
PARALLEL_ENABLE
AS
BEGIN
RETURN systimestamp;
END;

を作って
以下のようなクエリーで呼び出してみよう
select
TO_CHAR(SYSDATE_TEST,'HH24:MI:SS.FF7') AS fncTS_D -- 関数の中でsysTimestampをDETERMINISTIC 呼び出し。

,TO_CHAR(SYSDATE_TEST2,'HH24:MI:SS.FF7') AS fncTS_N -- 関数の中でsysTimestampを 非DETERMINISTIC呼び出し

,TO_CHAR(systimestamp,'HH24:MI:SS.FF7') AS sysTS -- sysTimestamp をそのまま呼び出し
from scott.emp cross join scott.emp;

emp 表をcross ジョインしているのは 手ごろなサイズ(100レコード程度)のテーブルを作りたかったから。

結果は以下の通り。

2017-02-22_195010.png

systimestamp 自体は DETERMINISTIC で動いているのかそうでないのかよくわからなくなってしまった。

2016年11月16日

SendGridでメール送信超楽ちん

SendGrid | メールを成功の原動力に。

ただで使わせてもらっている(検証中)なので宣伝しておく。

C#でメール送信!SendGridを使って簡単に実装する方法 | SendGridブログ
C#のサンプルコードを拾ってきて自分用のAPIキーに書き換え、アドレスも書き換えするだけで実行すればメール送信できてしまう。

GITはインストールされていなくても全然問題ない
以下からダウンロードして使えばよい。
GitHub - SendGridJP/sendgridjp-csharp-example: SendGrid公式C#ライブラリの利用サンプル

以下のことだけよくよく注意して、まずは検証しましょう。

SendGridのライセンスは、譲渡・二次ライセンスが不可となっております。
SendGridの利用規約に同意していない方がSendGridの機能を利用してメールの送信等を行うと、利用規約に抵触しますのでご注意ください。


再販や、SendGridを自社サービスに組み込む際の注意事項を教えてください – サポート

2016年10月07日

[.net]デバッグビルドでは問題が出ないのにリリースビルドだと不具合。しかも Framework2.0 をターゲットにした場合だけ

。。。という件で、ターゲットフレームワーク2.0という環境での動作も切り捨てられず、一日中 デバッグしました。 リリースビルドに OutputDebugString を突っ込んでモニターしながら。

以下のようなところで不具合が出ていました。この場合、classBのオブジェクトを取得します。
Dim o as object
IF false Then
o = classA.getObject()
Else
o = classB.getObject()
Endif

classA,classBはともに static な function です。
このようなロジックの部分で、classA で参照している 外部ライブラリーの参照ができずにエラーとなっていました。
結局いろいろ試した結果、テスト的に以下のように書き換えるとエラーはなくなりました。
Dim o as object
IF false Then
o = Nothing
Else
o = classB.getObject()
Endif

そこで試しに、と classA.getObject()の代わりに
Private function getAObject() as Object
   return classA.getObject()
End Function
とした関数を定義し、

Dim o as object
IF false Then
o = getAObject()
Else
o = classB.getObject()
Endif
上記のようにしたところ、classA にかかわる参照エラーがなくなりました。
ちなみにこれが発生したのは ターゲットフレームワークが 2.0 のリリースビルドだけで
デバッグビルドの場合、もしくは フレームワークが4.0 の場合には リリース・デバッグどちらも問題なしでした。

debugではバッチリ。releaseしたら不具合が発覚。 • C言語交流フォーラム 〜 mixC++ 〜

2016年09月15日

VBAのプロジェクトパスワードを回避していると、VBAのデバッグ時に「呼び出しの履歴」が開かないという副作用があることを発見

Is there a way to crack the password on an Excel VBA Project? - Stack Overflow

上記のソースコードを コピペして、Sub unprotected() を呼び出すと
開いているすべてのVBAプロジェクトのパスワード入力ウィンドウが回避されます。

さて、その状態でVBAの開発は普通にできるのですが、デバッグ時に 「呼び出し履歴」のダイアログが表示されなくなることに気が付きました。
2016-09-15_214802.png
Sub unprotected() を呼び出さない場合は 問題なく使えるため、犯人は明らかでした。

というわけで、メモ。

2016年08月29日

Oracle Client インストール不要、単体で DB接続可能な Oracle ODP.NET, Managed Driver。

NuGet Gallery | Official Oracle ODP.NET, Managed Driver 12.1.24160419

昔のODAC(Oracle.DataAccess.*)ドライバーを使ったときの接続文字列と同じだったから、今回の ODP.net の移行は ファクトリークラス名称を変えるだけ(Oracle.ManagedDataAccess.*)で対応完了した。(その後の処理はすべてインターフェース経由なので 実装依存がないのだ)

Oracle Data Provider for .NET

DB2にはそういう(ポータブルな).net のプロバイダーはいまだにないんだよね。

Oracle Client(ODP.NET)を手っ取り早くインストールする方法について - 素敵なおひげですね

2016年08月18日

[.net] DateTime.Now の 精度はミリ秒がぎりぎり、マイクロ秒の精度はいい加減すぎる。そこからの精度の高いDateTimeの作り方。

C# time in microseconds - Stack Overflow

DateTime(Date)オブジェクトは long 型の Ticks の数によって一意に決まりますが、この DateTime.Ticks が 実際の時間の経過に対して マイクロ秒のオーダーで 追従していないことが発覚しました。

DateTimeオブジェクトを HH:mm:ss.fff の初期式で表示すると 最後のミリ秒の数値が以下
11:15:59.121
11:15:59.123
11:15:59.123
11:15:59.123
11:15:59.123
11:15:59.126
のように
123ミリ秒の表示が続くことが結構あったのですが、マイクロ秒の精度が十分にあるStopWatchオブジェクトで経過秒数を見ると DateTime.Now はミリ秒のオーダーからして精度不足という事実が分かりました。

しかしこれ DateTime の精度が悪いのではなく、Now で生成するときのロジックがミリ秒近辺の精度を無視して適当に時刻を生成しているようです。

そこで以下のようなプログラムを書いて検証してみました。

Module Module1
Sub Main()
Dim sw As New System.Diagnostics.Stopwatch()
Dim fw As New System.IO.StreamWriter(Format(DateTime.Now, "yyyyMMdd_HHmmss.fff") & ".txt", False)
Dim sb As New System.Text.StringBuilder(50 * 3000)
Const LC As Integer = 30000

sw.Restart()
For i As Integer = 1 To LC
sb.Append(Format(DateTime.Now, "HH:mm:ss.ffffff, "))
Next
sw.Stop()
Dim msg As String = String.Format("{0}ticks,{1}msで{2}個のDateTimeを生成", sw.ElapsedTicks, sw.Elapsed.TotalMilliseconds, LC)
fw.WriteLine(msg)
fw.WriteLine(sb.ToString)
sb.Length = 0
fw.Flush()
fw.Close()
fw.Dispose()
Console.WriteLine(msg)
Console.In.ReadLine()
End Sub
End Module


上記のプログラム実行にて生成された3万個の時刻を重複を省いたところ以下のように取得できました。(25個の異なる時刻でした)
マイクロ秒の位置の数値がかなり適当であることはよくわかるでしょう。(ほぼ1ミリ秒の間は常に同じ時刻となっている)
83649ticks,23.8003msで30000個のDateTimeを生成
22:00:37.188515
22:00:37.189517
22:00:37.190517
22:00:37.191519
22:00:37.192520
22:00:37.193521
22:00:37.194523
22:00:37.195524
22:00:37.196526
22:00:37.197526
22:00:37.198528
22:00:37.199529
22:00:37.200530
22:00:37.201532
22:00:37.202533
22:00:37.203534
22:00:37.204535
22:00:37.205536
22:00:37.206537
22:00:37.207539
22:00:37.208540
22:00:37.209541
22:00:37.210543
22:00:37.211545
22:00:37.212545


これを以下のように、時刻の初期値は DateTime.Now であるものの、
そこから先は 正確なタイマーを使って 時差を .AddTicks していくことでマイクロ秒オーダーの正確さを
実現できました。オブジェクトはDateTime のまま、精度向上です。
赤字が修正箇所。TimeSpanのTicksは一般化されたものであり、マシン個別のStopwatch.GetTimestampの Ticks の数値は互換性がないのでそれをアジャストするロジックが入ります。

Module Module1
Sub Main()
Dim sw As New System.Diagnostics.Stopwatch()
Dim fw As New System.IO.StreamWriter(Format(DateTime.Now, "yyyyMMdd_HHmmss.fff") & ".txt", False)
Dim sb As New System.Text.StringBuilder(50 * 3000)
Const LC As Integer = 30000
Dim startDt As DateTime = DateTime.Now
Dim startTick As Long = System.Diagnostics.Stopwatch.GetTimestamp

sw.Restart()
For i As Integer = 1 To LC
Dim addTick As Long
addTick = CLng(TimeSpan.TicksPerSecond * (Stopwatch.GetTimestamp - startTick) / Stopwatch.Frequency)

sb.Append(Format(startDt.AddTicks(addTick), "HH:mm:ss.ffffff, "))
Next
sw.Stop()
Dim msg As String = String.Format("{0}ticks,{1}msで{2}個のDateTimeを生成", sw.ElapsedTicks, sw.Elapsed.TotalMilliseconds, LC)
fw.WriteLine(msg)
fw.WriteLine(sb.ToString)
sb.Length = 0
fw.Flush()
fw.Close()
fw.Dispose()
Console.WriteLine(msg)
Console.In.ReadLine()
End Sub
End Module


この結果は 「63922ticks,18.1875msで30000個のDateTimeを生成」で、3万個のうち1万5千個は異なる時刻を生成できました。( 書式を ffffff(1マイクロ秒の精度) から (0.1マイクロ秒の精度の)fffffff にすると 3万通りの時刻を生成できました)。
なお、生成速度はばらつきがあるので 「精度が高いのに速い」という事ではありません。

fffffff が.net の DateTimeに対して Format 指定可能なもっとも細かい単位 の 1Tick (=100 nano second = 0.1 マイクロ秒) となります。

2016年07月05日

自作のエクセルVBAマクロの過負荷?でエクセルが調子悪くなった、の図

2016-07-05_222722.png

セル範囲選択などしても、選択範囲が描画されない
マウスカーソルがずっと砂時計
エクセルが終了できない
右クリックメニューのアイコンが侵入禁止のやつに代わっている

もうここまで来ると プロセスを強制終了するのみ。

2016年06月16日

順調に手元のエクセルVBAマクロが太り、デコンパイルしても1700KBを下回らなくなった。

今年の3月にはDecompileして900KB程度だったExcelのマクロブックが今はおんなじことしても1200KB以下にならない。: NN Space BLOG-NN空間ブログ

日々コードは増え続ける一方で、あんまり削減されることがないからなぁ。

一時期デコンパイルしても2000KBオーバーの時があったのですが、関数をエクセルの関数として呼び出せないように(呼び出す必要がないので)、
Option Private Module ' ユーザー定義に出さない
という宣言を各モジュールに追加したところ、その時限りで大幅なダイエットに成功。その後また太りだしている。

今後はもう、増え続けるしかないのだろう。

今のところ、サポートEXCELを2000からとしているのですが、2007以降に限定する決心ができれば 圧縮形式のブックに変更してもうちょっとサイズダウンできると思っている。

2016年05月30日

ソースコードが仕様

ドキュメントをなくしてもうまくいく? 〜 人に依存するリスクへの対処とは | Social Change!

ソースコードから仕様だけを読み取るには、ソースコードができるだけビジネスロジックだけ、ビジネスルールだけを記述するようにできていることが望ましい。それ以外のフレームワーク的要素とかは、できるだけ隠蔽し、他のビジネスロジックと共通化する。

ってことを考えて独自フレームワークとかライブラリを作ってきた。でも最近は人様のソースコードを読む機会も増えて、自己満足の世界がとても狭いことに何度も何度も気づかされて方向性がぶれてきそうな感じ。

ドキュメントの構造化による,良いドキュメントの作成方法:新春特別企画|gihyo.jp … 技術評論社

2016年04月27日

VBAでもここまでできるんだなという事を再確認したすごいまとめっぷりの記事

昨日までJavaJavaしてた人がいきなりExcelのVBAを実装する羽目になったときのためのメモ - Qiita
↑これ。

基本から応用まで全部入り!みたいな。 確かにJavaからVBAに入る人はどこまでがVBAでできて、どこからダメになるのかがよくわかるのではないかしらん。

個人的にVBAでここまでできないのはいまいち!というものを上げると
・オブジェクト型変数に代入するには setステートメントを使用しなければならないこと
・変数の宣言と同時に初期化ができないこと
・return で戻れないこと
などがあげられますね。

VBAは過去のオフィスのVBAとの互換性のために、あえて進化しない道を選んだのではないかと思うほど 変わっていない。

だが、いろいろなことはVBAでできる。
リンク抜粋
Release VBA-Web v4.0.21 ・ VBA-tools/VBA-Web ・ GitHub

コンストラクタで引数を入れたい | 愚者の経験

2016年04月03日

EXCEL 2010 VBA Modal Form 表示の時に変な挙動を見つけてしまった

確認したのは Windows7+EXCEL 2010 の環境。(Windows10+Excel2013 では発生しない)。

確認の方法はいたって簡単。VBAでどんなフォームでもいいので、
Form1.Show vbModal
として呼び出してモーダル表示しておく。(この操作をVBAエディタから行ったのならばいったんここでVBAエディタを閉じておく)

そして、タスクバーに表示されている起動中のエクセルアイコンを右クリックするだけ。

すると、なぜかVBAエディタが表示されてデバッグ表示で中断した状態になる。実行を中断するとモーダルフォームが消えてしまう。気を付けて実行を継続(F5)すると フォームは生きたまま残る。

なんじゃこれ、この挙動に意味があるとは到底思えない。

2016年03月24日

vb.net に悪いところがあっても使い続けます

VB.NETが糞であると思うたった一つの理由。あと最弱無敗の神装機竜 - ぐちったっていいじゃないSIerだもの、あと・・・

・大文字小文字を区別しない

たったこれだけのことだけど確かにねぇ。そうだね。

VB特有の Option ステートメントか何かで 厳密に区別するようにできないものかね。もしくは 宣言の名前の前に「この名前は大文字小文字を区別する」のような 書き方ができるようになるといいのかも。いかにもVB脳的な考え方だね。MustInherit とか Overloads とかいちいち書かせることによる区別だね。

まあでもVBのこの特徴のおかげで大文字小文字気にせずにタイプして自動修正で楽ができるからこれはこれでいいと思っていたよ。

むしろ大文字小文字の違いだけで別のもの扱いされてしまうとかえって紛らわしいことがあるしね。

VB.net が C# と比べて機能的に不遇なのは認める。

正直にねいうとね、C#のサンプルコードしかなくてもそこからVB.netに書き下すのがへっちゃらなくらいになってしまっているのですよ。
だから何も困らない。

2016年02月29日

フォルダ・ファイル

ファイルシステムにおける名指しと解釈:XPathを使って - 檜山正幸のキマイラ飼育記

全然関係ないですが、Windows のレジストリでは \のあるなし が明確に使い分けされます。
\がある場合はキーで、無い場合は キー配下のエントリーです。

レジストリにキーまたはエントリを追加する

「EXCEL VBA」2つのセルの間の長方形Rangeを取得する方法を今まで知らんかった。。。

cells(1,1) と cells(3,5) の間の Rangeオブジェクトがほしい場合

昨日までだと

cells(1,1) -> "A1"
cells(3,5) -> "E3"

すなわち 必要なRange -> Range("A1:E3")
みたいな回りくどいことをしていたが、

なんと、 一発でできることが分かった。(ExcelVBAでできて 当たり前のことだったのですが)
Range(cells(1,1), cells(3,5)) と記述することで Range("A1:E3") と等価です。
尚、当然ながら 2つのセルは同じシートに存在する必要がある。つまり Range( sheet1.cells(1,1), sheet1.cells(3,5)) は正しく動作するが Range( sheet1.cells(1,1), sheet2.cells(3,5)) はエラーになる。


こんな簡単なことだったのに、どうして今まで気が付かないまんまあまつさえも「 ColumnIndexから 列番号のアルファベットを取得する関数」を作って喜んでいた自分が恥ずかしい。

恥のついでにその自作関数を置いておきますね。

Public Function idx2Alphabet(ByVal colIdx As Long) As String
Dim alphaBeta As String: alphaBeta = ""
Dim col As Long: col = colIdx
Dim fx As Long
Do While col > 0
fx = (col - 1) Mod 26
If fx >= 0 Then
alphaBeta = chr(64 + (fx + 1)) & alphaBeta
col = (col - (fx + 1)) / 26
End If
Loop
idx2Alphabet = Trim(alphaBeta)
End Function

テストする場合は
idx2Alphabet(2147483647) -> FXSHRXW 'Long型の上限
idx2Alphabet(16384) -> XFD 'Excel 2010 の上限
idx2Alphabet(256) -> IV 'Excel 2003 形式の上限


これの逆関数:idx2Alphabet もあります

Public Function alphabet2Idx(ByVal colName As String) As Long
Dim iL As Long: iL = Len(colName)
Dim retVal As Long: retVal = 0
For iL = 1 To iL
retVal = retVal + Idx(Left(Right(colName, iL), 1)) * 26 ^ (iL - 1)
Next
alphabet2Idx = retVal
End Function
Private Function Idx(ByVal alphabet As String) As Long
Idx = Asc(UCase(alphabet)) - Asc("A") + 1
End Function



つまり alphabet2Idx(idx2Alphabet(x)) = x が 成り立ちます。
逆関数のほうがすごくシンプルなので idx2Alphabet のほうだってもっとシンプルにできそうだけどこれで卒業とします。

2016年02月28日

「EXCEL VBA] 隠しきれたと思っていたがひょっこり現れた関数名の一覧を念入りにもう一回隠す方法

エクセルVBAでマクロをどんどん作るようになると、以下のように「マクロ」の一覧にたくさん出てきてこれはうざい、何とかせねば、となるのが最初の壁でしょう。

macro2016-02-28_221326.png

これは比較的簡単で、Public Sub *** な関数がここに列挙されます。
なので、Public Function *** にしてしまえばいいのです、乱暴ですが。その際、Fuctionの流儀にしたがって戻り値を定義したりする必要は一切ありません。
もしくは Publicである必要がなければ Private Sub *** にしてしまうのもOKです。

され、これで 上記の図のように マクロの中のすべての関数を隠ぺいできた気になっていました。
ところが最近気が付いたのは、マクロを別ブックにしてさらにアドオン化した後で実は ユーザー定義関数の一覧にすべてのPublic 関数が表示されてしまっていたのです!!これはいかん。遺憾。
2016-02-28_222324.png

ググってみたところ以下の記事を発見。
vba - How can I hide Protected Excel AddIn Functions from Appearing in Insert Function Dialogue Box? - Stack Overflow
対処方法はとても簡単で Option Private Module の宣言を各モジュールに追加するだけ。

実際にやってみたところEXCEL2000からでもこれが有効であることを確認できた。

Javaをチラ見する - きしだのはてな

VBA応用(マクロの起動にプロシージャ名を表示させなくする。)
ここにうまくまとまってます。

2016年02月12日

Windows 10で Shell_NotifyIcon Lib "Shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean が動作しない問題は今は治っているようだ

Windows10でバルーンチップが表示されない ってのは周知の事実だということはわかった。: NN Space BLOG-NN空間ブログ

ふと過去の自分の記事を見返していて、これって今どうなんだろうって やってみたら
以下のように右下から出てきた。この前は何も出てこなかったから最新のWindows10では改修がなされているということだ。
trayi2016-02-12_223030.png

しかしながら違和感がある。これは通知は右から出てくるような流儀に変わったのだろうか?
Shell_NotifyIcon は、システムの常駐アイコン(システムトレイ)の場所からバルーンチップで出てくるのが慣習だったはずだが、タスクバーを左に縦置きしたとしても Shell_NotifyIcon のメッセージは右下から出現してくる。はっきり言って予想外の位置からのメッセージは認識しづらい。

プログラムで特別な対応をしなくてもメッセージが出てくるように治っていることについてはまあ良しとするけれども出てくる場所がそこかいな。

VBAの「参照設定」で同じGUIDだったら、パスが違ってても それらの環境違いで同じブックを利用可能かもしれない!

[EXCEL VBA] .QueryTables.Add のオブジェクトのTextFilePlatform プロパティについて: NN Space BLOG-NN空間ブログ

↑この前の こちらの記事では
MSCOMCTL.OCX の参照先が、
C:\Windows\SysWOW64\MSCOMCTL.OCX
↑ 64BitWIndowsに32bit EXCEL の場合

C:\Windows\System32\MSCOMCTL.OCX
↑ 32ビット Windows に 入れたエクセルの場合

と異なるので 64Bit Windows + 32Bit Excel の環境で作った 参照設定を持っているファイルは 後者の環境では 読み込みエラーになるという結論にしていましたが、あれからいろいろ試した結果 どちらも同じブックで参照エラーなしで行けることが分かりました。

それは、AddFromGuid(sGUID, vMajor, vMinor) メソッドを使う方法です(たぶん)
Excel VBA を学ぶなら moug モーグ | 即効テクニック | 参照設定を自動的に行う
こちらで自動的に(手作業ではなく プログラムで)ブックに参照設定を追加する方法が紹介されています。
この方法を使うと自分の検証した環境ではさらに自動的に、環境違い(参照先のOCXのパスが異なる)でも参照エラーにならずにマクロが使えることが分かりました。
これが成立する前提条件はあまり多くを確かめていませんがおそらくは、各システムに登録されたOCXは同じMajor,Minorバージョンを持っているほうがより動作しやすいだろうなとは考えられます。

Excel VBA を学ぶなら moug モーグ | 即効テクニック | タイプライブラリのGUIDやバージョンを取得する

2016年01月25日

C#もVB.netもアセンブリーを作ってしまえば同じもの

やっぱりC#の方がいいの?VB.NETとC#の勉強環境から案件状況まで | ポテパンフリーランス

VB.netでクラスライブラリを作って C# で参照とか。

最近は 参照設定なしでアセンブリをロードして リフレクションでメソッドを呼び出すのが便利とか思っている。

2015年11月03日

Visual Studio Community 2015 も引き続き無料(非・エンタープライズ用途の場合)なのね

Download Microsoft Visual Studio Community 2015 from Official Microsoft Download Center

Visual Studio 2015 製品の概要

というわけで自宅のPCに入れました。

すると、以前入れていたVS2013 と共存しました。容量くうなぁ。



2015年10月30日

Windows10でバルーンチップが表示されない ってのは周知の事実だということはわかった。

Windows10でバルーンチップが表示されない

自作プログラムでも、バルーンチップが何も表示されなくなって調べたけど解決策はないのか?


Basic use of Shell_NotifyIcon in Win32 - CodeProject

TETSUCOM 現代のIT開発雑記: VBAからシステムアイコントレイを使う

2015年10月28日

EXCEL VBA で「真のグローバル変数(long型に限る)」を使う

Truly Global Variables With SetGetProp
↑ここにすべて書いてあります。サンプルのソースコードから必要なところだけコピーして自前のマクロに取り込みました。

エクセルが起動している間ずっと変数を保持してくれる。それが 真のグローバル変数だとしましょう。
記事にも書いてありますが、モジュールに Publicの代わりにGlobalと記述して得られるグローバル変数は確かに、ブック(プロジェクト)をまたいで エクセル起動中共通で使える変数なんです(ScopeはGlobal)。
でもその変数を定義しているブックを閉じたり、開きなおすと 初期化されてしまいます。真のグローバルじゃない!(Life Time は Globaじゃない!)

Excelプロセスが起動中はずっと保持し続けるような真のグローバル変数はエクセルが持つべきなのです。( レジストリーでもいいじゃないかという話はちょっと違うので今回はしません)。

エクセルが起動したら初期化し、あとは何度ブックを開こうが閉じようが 共通の変数を参照する。
そのために上の記事が言っていることは、プロセス(エクセル)のプロパティへ値を突っ込め!ということです。ただしLONG型の数値しか保持できませんが。

とりあえず、習作として コピーしたロジックをもとに 同じブックを開いた時にエクセルに追加したカウンター用プロパティへ ブックを開くたびにインクリメントして、特定の同じファイルを開いたらそれを何度開いたかを表示する仕組みにしてみました。
これの使いどころは常駐させているエクセルマクロが「リロード」されるようなシチュエーションを検知できるってことです。通常めったにないことですが やろうと思ったらリロードさせることは簡単でした。この機能が有効に働いていることも確認できました。

めでたし、めでたし。

上の記事の説明していることはエクセルに限らない(ウィンドウハンドルを持っているプロセス全般について同じ)なので 起動中のプロセスに 何らかのタグ付けをしてLONG型の値を持たせることもそれを変更することも可能なわけです。
発想を変えると、プロパティ名称そのものをString型のValueだとみなせば 文字列の値もプロセスに付与できるってことです(よね?)。

検証(からそのまま実装)完了。

・・・ていう感じで日々、マクロに機能が追加されていくのであります。
10年前くらいから作り始めたツールを今も拡張を続けている: NN Space BLOG-NN空間ブログ

2015年10月06日

10年前くらいから作り始めたツールを今も拡張を続けている

基本的にマイクロソフトプラットフォームばかりだが・・・

1.エクセルのマクロメニューツール(日々拡張) 'VBA/Win32API

2.連続圧縮ツール(ほぼ更新なし、決定盤)'WSH/VBS(これだけは当ブログで公開しています)

3.DB閲覧、テーブル操作スクリプト自動生成などなど多機能ツール 'VB.net/framework 2.0,4.0両対応


自分の作業効率をアップさせ、ストレスを減らすこれらのツールはなくてはならないものとなっている。

Java(Script)系が弱いので、もっとそれらを活用したツールを作りたいと思っている。つかず離れずでやってます。

2015年10月05日

7-Zip 15.08 beta で Linux ファイルシステム[ext3/ext4]・イメージ・ファイルの展開に対応。 いったいどこまで進化するのか 7-zip

7-Zip / Discussion / Open Discussion:7-Zip 15.08 beta

早くベータが取れてほしい。そうしたら社内できっと使えるようになる。

2015年09月26日

エクセルのバグをまたしても発見してしまった(サーバー共有フォルダ内のファイルの埋め込み時のファイル名化け問題)

Excel2010,2013どちらも発生。
対象ファイルは テキストファイル .txt など。 エクセルファイル .xls は化けない。

・手順(条件)

挿入>オブジェクト>ファイルから:アイコン表示
2015-09-26_020415.png
という設定で、ネットワーク共有データを埋め込みし、「ファイル保存」する。

すると、保存後のタイミングで埋め込んだファイル名が化ける。
2015-09-26_020315.png
手元で確認した .txt / .zip / .jpg は化けた。 .pdf / .xls は化けなかった。 いったいどういう理屈だ。

この埋め込み元のファイルをデスクトップなどにコピーしてから同様に埋め込み・ファイル保存を行うと今度は化けない。

2015年09月23日

思えばEPPLUSには助けられたなー

EPPlusとNPOIで使い分けをするようになってきた: NN Space BLOG-NN空間ブログ

以前プロジェクト開始前に、適当に見繕ったのがEPPLUSだった。その時はいろんな問題が出るとは思わずこれでいけるやろと軽く考えていた。

しかしプロジェクトでEPPLUSを使いだしていろいろテストしていくうちにこれじゃああかん(エクセルファイルが壊れてしまう)という事象にたくさんぶち当たり、EPPLUSフォーラムにもたくさん投稿した。
そんなこんなでバージョン4.0がリリースされた後も何度かバージョンアップして今の4.04になったあたりでプロジェクトも無事に収束し これじゃあアカンと思っていたバグも修正されてそこそこ使えるライブラリーになったEPPLUS.
そこから全くバージョンアップの雰囲気がない。まるで自分のプロジェクトに合わせていろいろバージョンアップしたかのような動きとも思える。今となっては。

ただEPPLUSは .net Framework 2.0 では動かないので、素のWindows7 を前提にした環境では EPPLUS の動作を推奨しにくい。
そこはマア諦めているので そういうところには NPOIを使う。 これも 幾分バージョンアップしてそこそこの ものになっている。使い込んでみると設計思想も見えてきて使いこなすことができそうに思えてきた。しかし使いやすいライブラリではない、NPOI.

2015年09月17日

PDFの構造を理解して自前でPDFを生成する

詳細PDF入門 ー 実装して学ぼう!PDFファイルの構造とその書き方読み方 - プログラムモグモグ

なんかすごく面白そう。

2015年09月04日

EPPlusとNPOIで使い分けをするようになってきた

NPOIもEPPLUSもClosedXMLもなんかいまいち。: NN Space BLOG-NN空間ブログ ←と思っていたのが1年以上前。あれから NPOIも EPPLUS も程よく進化しました。

.net Framework 2.0 しか使えない環境(4.0以上に上げずらい環境)もしくは *.xls ファイルを使うように強制されている ・・・ NPOI を使う。

・.net Framework 4.0 以上が使える環境もしくは *.xlsx を使うことに支障がない状況 EPPLUS を使う。

プログラミングしていてストレスの無い設計思想だと思うのは EPPLUS 。

最近NPOIの NPOI 2.2.0 というアルファー版が出た。 読み込みだけなら *.xlsx もイケるそうだが 試していない。

それぞれどちらかの環境に限定できればどちらを選んでも支障はない。
xlsx 読み込んで xls に変換したいとかその逆がしたいとか そういうことは避けて通るしかないけども。ちゅーか、そういうのはEXCELでやって。

2015年08月25日

いまさらになってみたことのないEXCEL VBAでのエラーメッセージをたくさん見るようになった

関数またはインターフェイスが予約されているか、または Visual Basic でサポートされていないオートメーション タイプが関数で使用されています。
関数またはインターフェイスが予約されているか、または Visual Basic でサポートされていないオートメーション タイプが関数で使用されています。 - Google 検索


現在アンロードできません
現在アンロードできません - Google 検索

微調整していくうちにバランスがどんどん変わっていく・・・・

制御不能だ、これ。しかもPCごとに挙動が違うからあっちを直すとこっちがおかしくなるみたいなことが多発。困り果てる。

2015年08月24日

Excel VBA : ActiveSheet オブジェクトがなぜ WorkSheet 型じゃなくて Object型なのかが分かった気がするよ、、、

今まで気が付かないでいたというのも幸せだったのかもしれないが、
・ワークシート
の位置に
・グラフ
を置くこともできます。
グラフのほうは WorkSheet ではなくて、 Chart オブジェクトです。

つまりEXCEL VBAがマクロで動作する環境の中では ActiveSheet は この両方のオブジェクトを格納できる必要があるのでOBject 型変数になっています。・・・という理解にようやく本日たどり着きました。

ActiveCell は Range だし、 ActiveChart はもちろん Chart ActiveWindow が Window 型で
ActiveWorkbook は Workbook 型。
それなのに、結構使う WorkSheet については ActiveSheet オブジェクトの型は 不定のObject型。
何とかならなかったのかねぇ・・・・

もっと早くに気が付いていたかった!


2015年08月23日

EXCEL VBA : UserForm の ウィンドウハンドル: hWnd の安全確実な求め方

EXCEL VBA で UserFormを扱うときに困るのが、Formのプロパティに ウィンドウハンドルが無い、ということです。
それを自前で備えてしまいましょうという方針なのが以下の記事。素晴らしい。

VBAでUserFormのウィンドウハンドルを取得する方法

・以下を定義部に宣言
Private Declare Function WindowFromAccessibleObject Lib "oleacc.dll" _
(ByVal IAcessible As Object, ByRef HWND As Long) As Long

・以下をそれぞれのUserFormの中に記述。
Public Property Get hWnd() As Long
WindowFromAccessibleObject Me, hWnd
End Property


Windows9x系では使えないそうですが、今更のことなので無視できます。
GetActiveWindow とか、FindWindow とか を使うと一抹の不安がありますが上記方法は確実です。

MySQL 5.7の罠

MySQL 5.7の罠があなたを狙っている

たぶん社内で使っているのは5.6だろうから次回気を付けます。

なにこれ不思議。無重力状態でT字ハンドルを回し外すと起きる現象
予想外のT字ハンドルの動きに驚きを隠さなかった。
みんなのコメントにある地磁気回転もきっとこんな風にして起きるんだろうなというのも同意。(実際には違う理屈だと思うが)。
タグ:わなわな

2015年08月19日

GUIアプリで、コンソールにメッセージを書く 〜 ほぼ9年越しに解決策を見出した

ウィンドウズアプリで標準出力ログをテキストに書く: NN Space BLOG-NN空間ブログ
↑9年前、
・コンソールアプリ(のコンパイル)だと、コンソールに文字を出せるがコンソールウィンドウが出ちゃう
・ウィンドウズアプリ(のコンパイル)だと、コンソールに文字が出せない。でもリダイレクトでファイルには出力できる。

そういう結論だった。

しかし以下の記事を見つけてようやく考えを改めた
VB.NETで、Console-Window Hybrid Applicationを作る。: Windows Script Programming
↑今から5年間の記事

・ウィンドウズFormアプリ(のビルドを)をやめて、コンソールアプリビルドとしてWindowsフォームアプリケーションを作成する
・リンク先の記事のように エクスプローラから直接起動された場合には、コンソールウィンドウを非表示にし、コマンドプロンプトなどから起動された場合にはそのままにしておくことで コンソールへ文字の表示が可能。

素晴らしい。

2015年08月17日

7-Zip 15.06 beta was released.

7-Zip / Discussion / Open Discussion:7-Zip 15.06 beta

もうそろそろかなぁ。正式版リリース。

2015年08月16日

EXCEL VBA: Range("A1") の 省略記法として [A1] という書き方があることを初めて知った

Dim r As Object
Set r = [A1] ' = Range("A1") と同等

[A1:C3] などもかける。
まあ、親オブジェクトをはっきりさせた書き方ではないので一時的にタイプ数を節約したいときくらいしか役に立たないだろうけど。

似たような書き方で、定数で初期化した配列も作成できるということも同時に知った。
Dim arr As Variant
arr = [{2,4,6,7}] 'Variant(1 to 4) に 初期値を代入したものと同じ
arr = [{"2",4}] '"文字列", 数字 混在配列も可能(変数がVariant型なので)

2015年08月12日

EXCEL NPOI の GetFormat のパラメータに設定可能なフォーマット文字列は Excel VBAでいうところの NumberFormat であって NumberFormatLocal じゃなかったという件と書式文字列についてわかったことをだらだらとまとめてみた

NumberFormatLocalとNumberFormatの違い:エクセルマクロ・Excel VBAの使い方

VBAで数値の書式設定を行うNumberFormatLocalプロパティ ってものがあるんですが、これ 見たことがある人はいると思いますが以下の設定です。
nf2015-08-12_223449.png

セルにはそれぞれ
123456
-1236456
0
と記入し、以下の書式文字列を設定すると 上記のように表示されます。
\#,##0_);[赤](\#,##0);"ゼロ"

書式文字列が長くなると、もはや手に負えなかったのですが 最近分かったのは書式文字列は
プラスの数値の書式;マイナスの数値の書式;ゼロの書式
という風にセミコロンで区切って最大3つ書けます。
つまり 上記例でいうと
123456 → プラスの書式 → \#,##0_) → \123,456
-1236456 → マイナス書式 → [赤](\#,##0) → (\ 1,236,456)
0 → ゼロ書式 → "ゼロ" → ゼロ

まずマイナスの書式から分析すると、
・赤字で
・3桁区切りで
・先頭に¥記号を付けて
・数値の両側を()で囲う
という書式です。

次にプラスの書式
・3桁区切りで
・先頭に¥記号を付けて
・マイナスの時につけた 閉じかっこ)の分 の位置をずらすために 閉じかっこ分の位置を空白に

最後にゼロの書式
これ、無くてもいのですが たとえば固定文字列の ”ゼロ” と書けば その文字がそのまま表示されます。

この辺のことを最近ようやく知ってエクセルすげーと思うようになりました。いまさらですが。


閑話休題。

というように書式はVBAでみるとNumberFormatというプロパティに格納されています。
最近NPOIも使ってエクセルファイルを作っていますが 書式設定にもこだわるようになった結果、いったいどんな書式を設定すれば思い通りになるのかをわかりあぐねていたところ
こういうライブラリーは英語圏のソフトウェアなのでNumberFormatLocalではなく NumberFormat の値をまねすればよい結果になるというところまでわかってきました。これらのプロパティは片方に突っ込めばもう片方は自動評価されるようです。
なので英語版で作って日本語の書式を気にする必要もないということです。

つまり、
range("G14:G16").NumberFormatLocal で得られる \#,##0_);[赤](\ #,##0);"ゼロ" という文字じゃなく

range("G14:G16").NumberFormat で得られる $#,##0_);[Red]($ #,##0);"ゼロ" がいいということです。特に色の指定については。
そこで NPOI で .GetFormat( "$#,##0_);[Red]($ #,##0);""ゼロ""" ) するわけですが どうしたことか
作ったファイルを実際に開くと通貨記号が $ のまま表示されます。色も出ない。
これはおそらく EXCEL VBA では勝手に色指定や通貨記号の変換を NumberFormat と NumberFormatLocal の間でやっているのでしょうね。
対してNPOIでは正しいものを設定しないといけないわけか。

結局 NPOI では \#,##0_);[赤](\ #,##0);"ゼロ" を実現するために
.GetFormat( """\""#,##0_);[Color3](""\"" #,##0);""ゼロ""" ) としました。
これをNPOIで設定したセルの書式をエクセルにて 見直すと [Color3]が[色3] に置き換わって見えます。ここらあたりがEXCELのローカライズの凄さかな(ローカライズが微妙なところはいくつもあるけどそれはさておき)。


本の虫: Lenovoのファームウェアがファイルシステムを改ざんするクソ仕様なので絶対に使ってはいけない
→HDDを暗号化していればBIOSからそんな真似はできないね。


そして、書式設定をもっと詳しく掘り下げたい場合はこちらがお勧め
Custom Number Formats, Date & Time Formats in Excel & VBA; NumberFormat property
ココを見て初めて知ったのが Number Scaling の コンマ, の役割。
書式の最後に,を重ねることによって1000単位で割り算した結果を表示してくれる。
123456という数字に 0, という書式を付けると 123 と表示される。0.####,, だと 0.1235 と表示される。

さらに / (分数書式)
0.5 という数字に #/# という書式を付けると 1/2 (最も近い分数 、この場合ジャストの分数) で表示される。

セルに文字を充填する*【アスタリスク】
これは正直使いどころが分からないが 0.5 という数値に 0.0*= という初期を付けると 0.5======= とセル幅いっぱいに = が充填される。

4番目の書式は文字列だった!
サイトからの抜粋になるけども以下のようにすると
"[Blue]#,###.00; [Red](0.0#); [Green]0.00; [Magenta]@"
文字列はマゼンタ色(Magenta)で表示される。

これらはあくまでも数値そのものをいじらずにセル上での表示の方法だけを制御しているってこと。
ここまでできると、「条件付き書式」でなくても簡単な色付け、書式わけができてしまうね・・・・

表示書式が微妙に高機能なせいで条件付き書式でできるところもカバーしてしまいどっちで設定するのがいいのか悩ましい場面もありますが知っておいて損はないでしょう。

2015年07月21日

イメージ通りのプログラミングができるころには陳腐化していることもある

イメージ通りのプログラミングができるようになるまでにはけっこう時間がかかる - shi3zの長文日記

なんだかんだで、入社以来VB(S|A|.net)?,C#,Java(Script)あたりをメイン言語にして10年以上たつ。

その昔はC(++), Fortran とか。

JavaScript - クラスの落とし穴1 - プロパティの初期化 - Qiita

JavaScript - クラスの落とし穴2 - メソッドとクロージャ - Qiita

2015年05月11日

まだJavaScriptのことがよくわかっていないが、わかった気がする

(function(){
var nums = "りんご,ミカン,ダイコン";
var numAry = nums.split(",");
for (var i in numAry){ alert(i); }
})();
 ↑これで、いったい何が alertで表示されるでしょうか。
正解はここをクリック(3回OKボタンを押してください)

そこで以下のように書き換えると、ようやく思った通りになった。
(function(){
var nums = "りんご,ミカン,ダイコン";
var numAry = nums.split(",");
for (var i in numAry){ alert(numAry[i]); }
})();

正解はここをクリック(3回OKボタンを押してください)

・JavaScriptは何でも連想配列
・連想配列のキーになるシンボルのことをプロパティという
・for in はオブジェクトのプロパティを走査する記法
JavaScript の配列と連想配列の違い - IT戦記

オブジェクトにはプロパティをあとからでも、あらかじめでも付け加え放題。

JavaScript - for in文とfor文  - Qiita

実用的?変態的!?JavaScriptの実用的なショートコーディングをまとめてみた: がおさんち 技術部屋

変態すぎるJavaScriptコード・・・ | IDEA*IDEA
↑Worldっていうリンクをクリックすると動きます。すげえ、JavaScriptのフラクタル構造といっていいのか。

JavaScript - for-inとObject.keysの違いを正しく知る - Qiita


雨にも負けず 風にも負けず 雪にも夏の暑さにも負けぬ 丈夫な体を持ち 欲... : 2ch 思わず笑う 秀逸なコピペ 集(急)【※周りに人がいないことを確認!】 - NAVER まとめ

雨にも負けず
風にも負けず
雪にも夏の暑さにも負けぬ
丈夫な体を持ち
欲は無く
決して怒らず
いつも静かに笑っている


そういう人に
仕事丸投げして帰りたい

2015年04月06日

NT Coreさんの CFF Explorer(Exe ファイルのPEヘッダとかを見たり)のツールがすごい

NTCore's Homepage

こういうのって有料なものが多いですが、無料です。

そして管理者権限を必要としませんので、使いやすいです。

しかもこれ、.net の EXEにも対応しているという優れもの。

何も考えずにExeを解析できます。

ほかにも関連ツールだと
PE Tools | SourceForge.net
こんなのとか PE Explorer: EXE File Editor, Resource Editor, DLL View Scan Tool, Disassembler. こんなのが見つかりましたがあんまり試しておりません。


NTCore CFF Explorer が もっともベストな PE header editorであると、このスレッドで語っているのを信用しました。
c - Tools to read PE headers for binaries - Stack Overflow

自分でも最近になって、EXEのビルド日をファイルのタイムスタンプからではなくてPEヘッダから取り出して表示するプログラムを作ってみたんだけど、どうも時差があるみたい。(エクスプローラの表示とずれることがある)。でも、これって内部のPEヘッダ情報が正しくて ファイルのタイムスタンプのほうが間違っているんだろうなと思う。そして、極めつけはどんなに古いEXEでもタイムスタンプを更新してしまえば新しく見えてしまうということ。
最近XMLファイルを変換するのに MSXSL.exeを使うんだけど、こいつが古かったので新しいのがほしかったからいろいろ検索するんだけども見つかるのはやっぱり古い。ダウンロードしてみてファイルのタイムスタンプを見てここ数年の日付が付いていてももっと古い時のファイルのSHA-1とかと同じ、つまり同じファイル。
そこでこのプログラムでビルド日を見たらどれもすべてが2001年の8月だったりして、ああ、これが本当の作成日なんだなと(時差があっても1日違うくらいのものなので気にしない)

たとえばこういうところにいまだに公開されているMSXSL.exeの最新版をゲットしてきたとします。
Download Command Line Transformation Utility (msxsl.exe) from Official Microsoft Download Center
+Detailsを開くと以下のことが書いてあります。
Version:2.0
File Name:msxsl.exe
Date Published:9/19/2004
これを見ると、2004年にリリースされているように見えますね。

でもですね、このファイルのデジタル署名のプロパティを見ると
‎2001‎年‎9‎月‎14‎日 4:07:28
と書いてあるので実際はこれより古い時期に作成されているわけなんです。

そこで、自作のPEヘッダからのビルド時刻の取得ツールをかますと
2001/08/29 05:33:13
という日時が出てきます。

つまりこれがそのEXEファイルを作った日。 これ以上さかのぼって古いものは出てこないし、どんだけ新しいタイムスタンプを持っていてもこの日が一緒なら(またはハッシュが一緒なら)、おんなじファイルってことです。

結論を言うと XSLT変換のためのツール MSXSL.exe は もう14年近くもそのままの状態で使い続けているということです。
まあ、実際には参照する先のDLLとかで動きが変わっていくためにこのようなEXEは長寿命でいられるということの証なんだと思いますが。

そして、NTCore's Homepage index のほかのアイテムを見ても(名前からして)面白そうなツールをいろいろ見つけて非常に楽しいです。

ツールのみならずこの方いろいろな記事を書いておられるので、また読んでみたいです。
NTCore's Homepage articles
ブログの更新は2年前に止まっていますがこの状態でまだ参照できるうちに見ておくべき素晴らしい記事だと直感します。

2015年01月26日

気が付けば Excel2013のとあるバグが治っていた 撤回。なおっていなかった。

Exclel2013 VBA の 右クリックメニューに追加した メニューの OnActionに 記述したメソッド内に CommandBars.FindControl があると、初回呼び出しで落ちる: NN Space BLOG-NN空間ブログ


上記のエラーが、現時点のWindowsUpdate済み Windows8.1+Office2013の環境では発生しなくなっていました。 バグ回避(VBAのほうで対策をする)に深入りしなくてよかった。。。。。


20150129_213555 今確認したところ治っていませんでした。なぜだ・・・・
しかし、起動時のマクロ読み込みで固まっていたように見える事象は改善していました。
以下の文章は読み飛ばしてください。


現在のバージョンは以下の通り。(2013のバージョン情報の確認は 「アカウント」から入ってみるのがどうにも解せない。今まではヘルプ、だったと思う。)

なぜか当方の環境 15.0.4675.1003 のほうが公式アナウンス 15.0.4675.1002 より新しいのだがなぜだ・・・(MSOの右のバージョンの数値は あっているのでこちらなんだろうな、MSよ、ここも不具合じゃないか?)

Office 2013 または Office 365 の更新プログラム

2015-01-26_232536.png

2015-01-26_232643.png

以上、メモ。

ちなみに以下の不具合はいまだに2013でも発生。
Excelのひどいバグに悩まされた一日(Excel 2003,2010,2013 いずれも不具合あり)Ctrl+D, FillDown にまつわるバグ的挙動: NN Space BLOG-NN空間ブログ

2014年12月18日

SQL Server2008 R2のディスクの使用量の円グラフの色が意味不明な順に割り当てられていて、とても誤解を生みやすい

sql2008-2014-12-18_092429.png

2014-12-17_183057.png

ここから表示する以下のディスク使用量の円グラフについて

トランザクションログを切り捨てる前と後の比較の図になります。
右側の円グラフで表示される水色の部分の示す意味が逆転していますよね?

used-green-2014-12-17_133651.png
上は、トランザクションログがいっぱいの状態です。
[緑=使用済み」

下は、データベースのバックアップを取ってトランザクションログを切り捨てた状態です。
「緑=未使用」
used-blue-2014-12-17_135131.png

なぜ同じ意味に 同じ色で示さないのでしょう?わけが分からない。
左の円グラフも色の示す意味が異なるのがさらに意味不明です:
「緑=未割り当て」。

混乱する。。。[色さえ違えば問題ないだろ?的な発想」はひどい、ちゃんとユーザビリティテストをしたのか?。



2014年12月13日

RelaxTools、進化を続けているね〜

ファイルの一覧からファイルをコピーする | RelaxTools Addin for Excel 2007/2010/2013

自分の知る限りではこの機能を使えたのは ClipboardProcessor くらい。
YGGDRASILL SOFT - Software download
このコマンドで実行
ファイル取得コマンド
コピーしたファイル名(絶対パス)をファイルのコピーに変換
CTRL + ALT + G


窓の杜 - 【NEWS】クリップボード内のテキストをファイル保存できる「ClipboardProcessor」

自分も実装して見たい機能と思っている。

関係ないけど、エクスプローラーでファイルを選択⇒右クリックの送る
だと、ファイル数に制限があるから、[選択したファイルが何か」を検出するAPIがないか探しているんだけどよく分からないまま。

2014年12月06日

VBAのString関数でハマった : String(1,vbNewLine ) で何を得られる?

Office TANAKA - Excel VBA関数[String関数]
構文
String(num,character)
引数numには、文字をいくつ並べるかを指定します。
引数characterには、並べる文字を示す文字コード、または文字を指定します。

解説
引数characterで指定した文字コードに該当する文字、または引数characterで指定した文字列の先頭文字を、引数numで指定した回数並べた文字列を返します。


解説のとおりなんですが、

String(3,"あ" )
-> あああ

じゃあ
String(3, vbNewline ) は?
vbNewline & vbNewline & vbNewline と等価な文字列(改行3つ)が得られますか?
いいえ、答えは
vbCr & vbCr & vbCr と等価な文字列です。

これも解説のとおりなんですが
vbNewline の実体は vbCrLfに 等価です。 (日本語環境の一般的なWindowsでは)。
これはさらに vbCr & vbLf と等価です。

ここまで分解すると説明のとおり、 vbCr & vbLf という2つの文字をつなげた文字列の先頭文字を3回繰り返したものが得られたというわけです。

以下の事実は、知っていても忘れてしまうのでメモ(VBA環境)
LEN("A") = 1
LENB("A") = 2 // 1じゃないかって? VBAは UNICODEですからこれが正解
LEN("あ") = 1
LENB("あ") = 2
LEN(vbNewline) = 2
LENB(vbNewline) = 4

2014年11月18日

Visual Studio 2013でのOfficeアドイン開発

Download the Microsoft Web Platform

【Excel改造】Visual Studio 2013でのOfficeアドイン開発【準備編】 | Developers.IO

Microsoft Office Developer Tools for Visual Studio 2013 が利用可能。

ITpro編集長日記 - 怖いオープンなマイクロソフト:ITpro

2014-11-18_212929.png
↑なんだか余計なものがいっぱい導入された。

2014-11-18_213004.png
↑アドインテンプレートは一番下だった。

2014-11-18_213443.png
↑当方環境では オフィス2013のみインストールしていましたが、アドインテンプレートは2010も見つかりました。

間違いなくVisual Studio Community 2013 はPro相当だ

Visual Studio Community 2013 続き(クリレポ導入): NN Space BLOG-NN空間ブログ

これが無料なんて、信じられんが本当のことだと思ってありがたく使うしかない。

2014年11月15日

VS2013 のPRO相当が無償で個人利用可能になったそうなのでインストールしてみた

Free Dev Offers

Microsoft、“Professional”相当の無償版「Visual Studio Community 2013」を公開 - 窓の杜

vs2013update4-2014-11-15_035053.png

会社でもVS2013 PROを使っているから、自宅でも使えると便利。しっかし、Amazon涙目じゃなかろうか。もう売れないでしょうほとんどがPROで間に合うだろうから。

インストール後、再起動したら
VmWare-Player が起動できなくなっていた。
Hyper-V2014-11-15_042523.png

どうも、「全部入り」で導入したために Hyper-Vが有効化され、それと共存できないようです。orz...

Windowsスマートチューニング (301) Win 7/8/8.1編: Hyper-VとVMwareを共存させる | マイナビニュース
そこでこういったカスタマイズが必要になるようです。

こちらの スクリプトを使用してHyper-Vを無効にして再起動したところ、VmwarePlayerが起動でき、VisualStuioも(HyperVなしで)利用可能になりました。
2014-11-15_045036.png

でも、このままだと英語版です。
日本語言語パックを入れればいいのですが、多少問題がありました。
「Visual Studio 2013 Community Edition」が無償提供! | アイビースター
こちらを参考に、WindowsUpdateを済ませ、再度言語パックの導入。

こちらの記事も参考にさせていただきました:
Visual Studio の全機能を無料で使える Visual Studio Community 2013 を早速インストールしてみた: ある SE のつぶやき

言語パックを導入したら:
Visual Studio を起動して、TOOLS >> Options >> Environment >> International Settings で、Language を「日本語」に設定


jpn2014-11-15_052453.png

Visual Studio Community 2013の日本語紹介ページに重大な記述漏れ - はつねの日記

セットアッププロジェクトについてはこちらを参考にする予定なのでリンクを貼っておきます。
Visual Studio Community 2013をインストールしてみた〜セットアッププロジェクトが無い!! | 吟遊詩人の戯言

あと気になった記事:
C# の IndexOf における長音符と「ゝ」について - Qiita
2009-11-11 - 当面C#と.NETな記録

2014年11月14日

EPPlus4.0がようやくRC版に

EPPlus-Create advanced Excel spreadsheets on the server - Download: EPPlus 4.0 RC

機能出たてほやほやでしたので、今までのベータ版から切り替えてみました。

感想は、、、、あともうちょっと!(デグレードあり)

デグレードしたところが重大な問題があるので、本番運用で回避できない限りは使えません。
昨日から一日調べていましたが回避策今のところなし。

2014年11月08日

DB2 -tvf でスクリプトファイル読ませて、ユーザー定義関数作っていたんだけど、セミコロンが邪魔して関数を作れなかった。

IF ~ THEN
RETURN X;
END IF;
とかのブロック記述がどうしても出来なくて、仕方ないからすべてをCASE 文で実装していたんだけども、どうやらショートサーキットじゃないみたいで(DB2は)、パフォーマンスの問題が出てきてしまったので、何が何でもブロック構文で書き直したくて 一日悩んでいたがようやく分かった。

DB2 -tvf だと セミコロンで終了してしまうのだ。

だから DB2 -td%% -vf として、セミコロンで終わらないように、そして%を記述したときに終わるように指定してあげる必要があった。
さて、定義は出来るようになったのだが、この定義がDB2からどのようにスクリプトにエクスポートされるかが気になった。

つまりDB2LOOKである。これで、DB2に登録したユーザー定義関数を出力してみた。
その結果 最初に書いたような形の関数は
IF ~ THEN
RETURN X;--
END IF;--
と、行コメントのダブルハイフンがセミコロンの後ろについていた。何これ、自分はこんな風に書いていないぞ、てことはつまり、、、、
というわけでこれを逆輸入し DB2 -tvf オプションに戻してそんな感じで 関数を記述したところ見事にそのままで 通るようになった。

見た目はいまいちだし、タイプ量が増えるからあんまり良くないけど、ほかの記述と共存できるからこれで良いなと思った。

ほんと、DB2(IBM)製品の エラーメッセージって分かりにくい。
えらーメッセージを見てもどのようにプログラムを直すべきかはほとんど分からない。

今日の ノウハウ
;--


・おすすめ楽天ショップ1:trendyimpact楽天市場店
・おすすめサプリショップ:iHerb.com
・おすすめ楽天ショップ2:上海問屋
Powered by さくらのブログ