2017年5月31日水曜日

JavaScriptでメモリーリークを調査する

ちょっとした経緯で、JavaScriptにおけるメモリーリークを調べることとなりました。
C言語だとメモリーリークは分りやすいですが、JavaとかC#になるとガベージ・コレクションになるので、本来的にはメモリー管理から開放されるはずですが、そうでもないようです。
また、JavaとJavaScriptでも少し、ポイントが違いそうです。

ちょっとググってみて、こちらに当りました。
4 Types of Memory Leaks in JavaScript and How to Get Rid Of Them

JavaScriptだと、変数定義しなくても使えてしまいますが、そのあたりで、グローバルスコープになったりするようです。関数定義した場合も、うっかりで発生しがち。
GCなのにメモリーリークが発生する経緯にも触れられており、ポイントも4つに絞っているので、最初に読むには良い感じです。

AngularJSに特化していますが、次の記事も秀逸です。
Fixing Memory Leaks in AngularJS and other JavaScript Applications

jQuery含めた、他のライブラリーとの共用によるメモリーリーク発生のメカニズム等、こちらも分りやすく書かれています。デバッグ手法にも触れられており、参考になります。


こちらもケースが限られていますが、サーバーとの同期に関するメモリーリークがこちら。
Simple Server Polling in AngularJS Done Right

サーバーからのデータロードに失敗した場合のハンドリングを正しくしないと、メモリーリークが発生するという話です。


JavaScriptは手軽にコーディングでき、サードパーティーのライブラリーも充実しているだけに、C言語よりも遥かに問題特定に時間がかかる印象を受けました。
そう言えば、V4あたりのVisual Basicも、結局はSet XX = Nothingとしないとメモリー開放されなかったり、C言語の動きを理解していないといけなかったのを思い出しました。
プログラミングも、楽になったようで、環境が複雑になった分、いろいろと別の課題が出てきているようです。


具体的な デバッグはこれからですが、備忘録がてら、書いておきます。

2017年5月23日火曜日

JavaScriptをテストする

最近は、MEANだか何だかで(ってもうだいぶ経ちますね)、JavaScriptがいろいろと役に立つようです。node.jsだとサーバーサイドもJavaScriptで、JavaとJavaScriptの違いもようやく理解できてきました。

そんな中、JavaScriptってどうやってテストするのかな、JavaだとJUnitだったけど、、、と思い立ち、ちょっと調べてみました。

こちらには、各種言語の単体テスト用フレームワークが揃っていて、勉強になります。
List of unit testing frameworks


COBOLやFORTRAN、C/C++用のものもあって、便利な世の中になったなーと隔世の感があります(といっても、実業務では、過去の資産用に、リグレッションテスト用にテストスクリプトを用意する、なんてことは易々とはいかず、現実にはいろいろと苦労がありますが)。

JavaScriptは最近の言語なので、いくつも用意されていますね。サーバーサイドもJavaScriptの可能性があるので、クライアント/サーバー双方をカバーしているものが対象ですが、どれがよいか、迷ってしまいます。


こちらのサイトでは、そんな中、QUnit、YUI Test、JSTestDriverを取り上げていました。
JavaScript のユニット・テストを実行するためのツール

記事を読むと、QUnitは、jQuery開発チームでも利用されているようです。
node.jsでも使えるようなので、まずは選択候補でしょうか。
QUnit: A JavaScript Unit Testing framework.


YUI Testは、Yahooの提供するAPIのようで、インターネット接続環境が必要そう。

3つ目の、JSTestDriverは、複数ブラウザーでの動作確認が出来ます。ブラウザー対応確認にはちょうどよい感じです。

ググってみると、以下の記事に当りました。どうやら、Eclipse環境でJavaScriptをテストするのに使えるようです。
eclipseでJavaScriptの単体テストをする


あと、ちょっと変った記事としては、

JUnit(Java)でJavaScriptをテストする。


でしょうか。JUnitに慣れている方、JavaとJavaScript両方を同じ方式でテストするには、JUnitという選択肢もあるかもしれません。



個人的には特に縛りはないので、まずはQUnitあたりに手を出してみようかと思ったのですが、こんな記事も見つけてしまいました。
Testing the MEAN stack


Karmaってのが書いてあります。 JasmineやMochaにも言及しつつ、Karmaを薦めているようです。
AngularにはProtractorというEnd to Endのテストツールもあるようです。
Testing AngularJS With Protractor and Karma - Part 2

もう少し読み解いて、何が良いのか見極めたいのですが、とりあえず今日は備忘録がてらここまで。



2017年3月15日水曜日

ibatisでPersistenceExceptionエラーが出る

とあるWebアプリについて、モジュールをもらったのでローカルにセットアップ中です。jdbcでデータベース接続するので、Tomcatのserver.xmlにリソース定義して接続させてみます。

ibatis.exceptions.PersistenceExceptionエラーが発生しました。


。。。うーん。よく分りません。
試しにリソース定義した部分をコメントアウトするとアプリケーション側でエラーハンドリングされるので、リソース定義自体は問題ないようです。

対象のデータベースはDB2です。driverClassName="com.ibm.db2.jcc.DB2Driver"として、db2jcc.jar、db2jcc4.jarもlibフォルダーに置いています。

可能性としては
  • JARが読み込めていない
  • サーバーにアクセスできない

があります。ちょっとググってみると、次の記事に当たりました。
DB2 and MyBatis Connection refused: connect. ERRORCODE=-4499, SQLSTATE=08001

気になったのは「i already did set DB2COMM to TCPIP but still doesnt work」の箇所です。DB2COMMをセットする???

探してみると、次の記事がありました。
DB2 インスタンスの通信プロトコルの設定

要するに、DB2COMMにTCPIPをセットしてあげないと、ポートをLISTENしてくれないようです。
言われたとおりにしてDB2を再起動。

SQL5043N  DB2COMM 環境変数で指定されている 1 つ以上の通信プロトコルに対するサポートを正常に開始できませんでした。 ただし、コアのデータベース・マネージャーの機能は正常に開始されました。

うーん、まだ素直に動いてくれません。
このエラーを見てみると、「例えば、このメッセージが返される 1 つの理由として、SVCENAME データベース・マネージャー構成パラメーターが正しく設定されていないことが考えられます。」とありました。
確認すると、確かに、SVCENAMEがブランクです。


ということでSVCENAMEを設定して、再度DB2再起動。


すると漸くibatisエラーはなくなりました。
どうも、DB2側で、サーバー接続可能なように設定する必要があったようです。DB2コマンドからは接続できたので問題ないと思っていたのですが、どうも違ったようです。


初歩的なところで躓いてしまいましたが、備忘がてらメモしておきます。

2016年12月18日日曜日

Ubuntuから印刷する

以前から、Illustratorで作成していた年賀状をUbuntu上でも作成できるように、という野望はあったのですが、結局1年間手付かずでした。
これではいけないと思い、今年こそはチャレンジしてみます。

ということで、Illustratorの代替品やデータコンバート手順についての記事を探っていましたが、ふとした疑問が。

そういえば、そもそも、自宅のプリンターに、Ubuntuから印刷できるのか

これが担保されないと、そもそもの計画が台無しになってしまいます。Illustrator問題解決の前に、まずはこちらに作業を振り替えます。

自宅のプリンターはエプソンですので、UbuntuとEPSONをキーワードに検索してみます。

How to install Epson printer drivers on Ubuntu 16.04?

なんか出来そうです。言われたとおり、リンク先からドライバーをダウンロードしてみることにします。
検索してみると、自分のプリンターの型番はありませんでしたが、前後型番違いは掲載されています。
それを開いて、ダウンロードしてみることにします。

。。。でも、どれをダウンロードしてよいか分かりません。RPM? LSB? DEB?何ですか、それは。
久しぶりにUbuntuを触ることもあり、ギャップが甚だしい。

ここは恥を忍んで、日本語のページで分かりやすいものがないか再度探してみます。そもそも、EPSON自体が日本メーカーだし。

Linux(Ubuntu)でもプリンタドライバはあるよ!

おぉ、なんて親切な。ここを読んでみると、以下の記述が。

Ubuntuであれば、「.deb」で、Ubuntuソフトウェアセンターからインストールできます。

コマンドを叩かなくても、GUIで出来ちゃうらしいです。感激。
言われたとおり、順番にリンクを辿っていきます。

セイコーエプソン株式会社のLinuxドライバーダウンロードについて
ドライバーダウンロード

ありました!!自分のプリンターで、ドライバーがあることを発見。
何種類かあるので、「DEB」でCPUに合うものをダウンロードすると、ソフトウェアセンターが起動し、そのままINSTALLボタンでインストール完了。
あっけないくらい、簡単に出来ました。

後は、System Setting ->Printer ->Addで、私の場合はNetwork Printerで選択して、テスト印刷して動作することを確認。


まずは一歩前進です。

2016年11月28日月曜日

VB.NETで実行モジュールだと動かない

VB.NETでプログラムを作成し、無事、デバッグ環境で確認完了。
次は、いよいよ本番環境です。
で、念のため、実行モジュールを、自分の端末で動かしてみました。

DBに接続できません。

え。
さっきまで、デバッグでは動いていたのに。

頭がついてきません。
そんなときには、いつものグーグル先生です。
.NETで作成したEXEがODBCエラーで動かない。


いや、そこは分っています。やってます。

Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応


んー、なんかよく分らないけど、コンパイルの問題かもしれないのでコンパイルの設定を確認します。気になる箇所がないか、チェック。

見当たりません。
「詳細コンパイルオプション」があるので、そこも確認。すると、ターゲットCPUがx86です。これでも大丈夫なはずなのにーと思いつつ、PCのCPUと同じのx64に変更し、再度、実行モジュールをビルド。


動きました!!!!!


なんでこんなことで???というのが正直な感想で、まだ頭の整理がついていませんが、備忘がてら、メモしておきます。



2016年11月20日日曜日

iOSがバージョンアップしたらIP電話が動作するようになった件。

先日、予期せずして、iOSのバージョンが10に更新しました。というか、誘導されて更新してしまいました。

いろいろと不具合があったので、非常に迷惑なのですが、1点だけ良くなったことがありました。

IP電話が待ち受け画面に出るようになった 

そうなんです。これまでは、iPhoneでは、SIMカード以外の電話機能は、プッシュ通知しかされませんでした(所謂、普通のアプリと同じ)。なので、

  • 着信が来たら、画面に誰から来たか(画像登録していればその写真が)表示される
  • 着信が来たら、バイブレーションし続ける

なーんてことが、なかった訳です。なので、着信に気づかないことが結構ありました。
これが、OSのバージョンアップによって、SIMカード以外の電話アプリでも、ちゃんと機能するようになりました。

当たり前ですが、やっと電話として正常に機能し始めました。


IP電話にして各位から不評だったので、これは一歩前進です。

2016年11月16日水曜日

VB.NETでADODBの参照設定をする

久しぶりに、VB.NETで開発しようとしています。
まずは、空のソリューションを作成するところから。
続いて、データベース接続クラスを用意します。この前作ったものがあるので、それをコピーしてきます。ここで、いったんビルドして確認します。

エラー。

見てみると、ADODB.Connectionの型定義が見つからないようです。
前はどうやったんだか。ログに残していないので、グーグル先生に聞くところからです。

Microsoft Visual Basic での ADO の使用


はいはい。
ソリューションのプロパティから何かやった覚えがあるのですが、そうではなく、「プロジェクト」⇒「参照の追加」⇒COMのタブから、Microsoft ActiveX Data Objects x.x Libraryで一番最新のやつを選んどく、ということでしたね。

これで無事、ビルド完了。


こんなことも忘れてしまっている今日この頃です。
やっぱり、先日のiPhoneのこともあるし、記録に残しておくようにしよう。