2017年11月27日月曜日

Cordovaでスマホアプリを開発する(1)

スマホアプリを作ろうと思い立ちました。

以前、Android SDKでAndroidアプリを作ったことはあるのですが、そのときは、開発環境はEclipseに、コーディングはJavaでした。
当然ながらiPhoneには使えない訳ですが、Appleの開発者になるには、年1万円維持費がかかるので、そこまでは、そのときは不要だったため、それはそれで良かった訳です。

でも、次作るときは、PhoneGapを使って、AndroidとiPhone両方に対応するアプリを作ってみようと決めていました。

で、アプリを作るネタが久方振りに見つかったので、是非チャレンジしようと。

そんな感じで、ちょっと調べてみると、PhoneGapがCordovaとして利用可能なことが分りました、今更ですが。

開発環境を作ってみたいと思います。
とりあえず、以下の記事を見つけました。Node.jsはインストール済でしたので、そのままCordovaをnpmでインストール。
Cordovaの開発環境を作成する手順

問題なく、サーバーの稼動確認まで終了です。

Node.jsが前提になっていることからも、折角なので、今回は、MEANスタックで作ろうかと。

ということで、次は、MongoDBです。

2017年7月5日水曜日

Androidの動作を速くする

Nexus7を購入してから大分経ちました。
で、使っていると、結構、ストレスを感じます。

そんな訳で、何とか速く出来ないか、これまで試行錯誤してきたわけです。
まずは、お作法通りにGoogle先生に問合せてみました。

スマホ(Android)の動作が重い・遅い時に行う11の高速化方法
【手動でアプリを終了する意味はない】「Android端末の高速化」に役に立つこと10個&立たないこと3個
Androidスマホを高速化する即効ワザ


ええ、いろいろチェックしましたとも。
でも、残念ながら、一向に速くなりませんでした。

OSを5にアップデートしているので、そのせいかもしれません、なんて、少し諦めてもいました。
わたしの使い方に最適なNexus7のAndroidバージョンは?


で、今日もウェブブラウザーを使っていたら、それだけでガクガクと動作が遅くなるわけです。
もう限界。最新機種に買い換えよう。
そう思っていたとき、ふと、左上の通知エリアを除いてみると。。。

え?

そこにあったのは、いろんなアプリのアップデートの痕跡でした。
私はiPhoneを使っているので(&AndroidはNexus7だけなので)、アプリのアップデートは手動でやるものだと思っていました。ですが、どうやら、Androidでは、アプリが自動更新されるようなのです。

ここで閃いた私。
これをOFFれば、速くなるかもしれない。

そこで、数ヶ月ぶりに意を決して、再度Google先生に訊いてみます。
Androidアプリを勝手に更新させない、自動アップデートを止める設定方法

ありました!!!
たった1つの設定。これを自動から手動に変えてみます。





結果。
今までの動きが嘘のように軽くなりました!
サクサク動いてくれます。
うれしい。。。


なんか、今まで悩んできたのが嘘のようです。
バカバカしいほど簡単な問題でした。

という訳で、Nexus7はもう暫くは使い続けることにします。

2017年6月22日木曜日

SoEを理解する

前回、SoRの今後なんてことを書き走ってしまいましたが、よくよく考えると、SoRはなんとなくイメージ(これまでの企業システム)できるものの、SoEの理解が不十分なことに気がつきました。

そんな訳で、Google先生の登場です。SoR、SoE、SoIあたりでキーワード検索してみます。

SoEとSoRの分類ってどうなの?
実は身近なSoE 「絆のためのシステム」といわれるその意味とは
私論: システム・オブ・エンゲージメント(SoE)


うーん、やっぱりよく分りません。
かなり、バズワード化しているように感じます。


ですが、元々の出典は、2011年に、Geoffrey Mooreさんが言い出したことは分りましたので、原著に当ってみることにします。以下が、引っかかってきました。
Geoffrey Moore - The Future of Enterprise IT


やはり、原点に立ち返るのは良いことです。何となく、2011年時点で、Geoffrey Mooreがどのような考えでこの言葉を用いたか、少し理解できた気がします。
その、何となくの理解を、備忘録がてら書いてみると以下のような感じでしょうか。

スライド20(p.19)を意訳すると、
  1. 現在のITは、大別して、2通りのシステムに分けられる
    1.  System of Record:Our interstate highway system。企業基幹システム同士が相互に繋がる。IT黎明期より投資され、完成されている。[1]
    2. System of Engagement:The next frontier。この10年で爆発的に起こった、SNSやブログ、Twitter等の個人消費者向けのエリア。[2]
  2. 企業システムは今後、個人消費者対応(Consumerization)が必要
    1. サーバー仮想化、ホスティング、SaaS、PaaSといったインフラ面の進化[3]
    2. 情報検索、簡易コミュニケーション、位置情報、動画といったアプリケーション面の革新[4]
  3. 企業内でのSoE推進
    1. ピラミッド型の組織から、コミュニケーション(Communication)-共同(Coordination)-協業(Collaboration)を中心としたネットワーク型の組織へ。[5]
    2. Global-Mobile-Social-Virtualの原則を元にした、組織の中間層へのIT投資を。[6]
    3. Early wins from moments of engagement.[7]

[1]スライド3(p.2)より
[2]スライド6(p.5)より
[3]スライド8(p.7)より
[4]スライド9(p.8)より
[5]スライド12(p.11)より
[6]スライド13(p.12)より
[7]スライド19(p.18)より

ちなみに、Consumerizationは、GartnerによるIT用語に挙がっていますが、適切な日本語は分りませんでしたので、適当に訳しました。
Consumerization is ...

一番最後の3-3は、何となく分るのですが、良い訳が思いつかなかったため原文のままとしています。「先んずるものがSoEを制する」みたいなのかもしれませんが、ここが理解のポイントかもしれません。

いずれにしろ、原著(と思われるもの)に当ったお陰で、Geoffrey Moore氏の主張としては、SoEは個人消費者向けサービスエリアを指し、企業ITシステムのConsumerizationや、企業組織のSoE化が必要だと言っているのだと理解しました。
バズワードが最終的にどこかに落ち着くように、今後、SoEという言葉自身の意味合いが変っていくのかもしれませんが、2011年時点の方向性としては腑に落ちた気がします。


最後に、私的には、スライド17(p.16)が一番しっくりきたように思います。
  1. SoRは効率性を高める
    1. 世界経済の楚となっている
    2. コストや品質、契約の履行を重視している
  2. SoEは効果を高める
    1. 世界中のビジネス上の複雑な関係性を指し示す
    2. オンラインでの消費者との交流を形づくる
  3. 正しいアーキテクチャー
    1. SoEは、SoRを土台にして、SoRと接しながら稼動する
    2. その接点に、ITインフラの進化(クラウド化)が発生する

SoRはSoRとして今後も必要なこと、SoRとSoE双方が必要なこと、SoRとSoEの接点として、クラウドが必要とされることが、シンプルに纏められています。
これからは全てSoEだったり、何でもかんでもクラウド、といった訳ではないということで、とりあえず、SoEというバズワードへの対処法の整理はいったん完了。

2017年6月14日水曜日

SoRの今後

人工知能だの、SoE等の言葉が巷で溢れる昨今ですが、そんな中、SoRのシステムは今後どうなっていくのか、なんてことに思いを馳せたりしてします。

 そんな中、少ないなりにも自身の経験や知見から気になるのは、改修に改修を重ねられてきた既存仕様だったり、現行システムが前提としている業務運用をどうやって担保していくかという点です。いくつかの業務パッケージの刷新に立ち会ったり、銀行システムのメインフレームから新アーキテクチャーへの移行等といった話を見聞きする中で、既存仕様が結構トラブルのポイントというか、課題の1つであるとの認識を強くしています。

自身が関った業務アプリケーションの業務ノウハウも、若手にはなかなか吸収されないなぁという印象があったのですが、組織の自助努力で簡単に解決出来るものではなく、旧くて新しい問題であろうと思います。

今もちょうどそんな場面に接していて、気になったのでソフトウェア・モダナイゼーションについてググってみました。

英語でググったのもあるのですが、いつもは表示される、日本語のWikiが上がってきません。仕方ないので、Wikipedia英語版の記載を開いてみます。
Software modernization

このページからも、日本語ページに行けません。日本語の該当ページがないようです。

意外に思いながらも、英語版を読んでみます。なかなか、我が意を得たりの記載がありました。

Primary issues with a legacy system include very old systems with lack of documentation, lack of SMEs/ knowledge on the legacy systems and dearth of technology skills in which the legacy systems have been implemented. Typical legacy systems have been in existence for more than two decades. Migrating is fraught with challenges:
そうなんですよね。
結局、どこも、文書が最新版でなかったり、業務知識が受け継がれず、ソースコードが最新仕様という中で、ソフトウェアを最新技術に置き換えなければいけない訳です。

なんてことを感慨深げに考えていたら、日本語のページがあるのに気が付きました。
ITシステムのモダナイゼーション、二つの落とし穴


どうやら、日本ではITモダナイゼーションという言葉で通じるようです(Wikipediaには載っていないようです)。
また、記事中には、従来型モダナイゼーション手法として、リライト、リビルド、リプレースと言った用語が使われています。 他の「ITモダナイゼーション」の紹介ページでも同様の用語の使用があるので、ある程度一般化しているのかもしれません。

他方、英語の記事で引っかかったものを見てみると、若干相違があるようです。
A Fast Track to Modernizing VB6 Code to .NET

こちらで使用している用語は「Software Modernization」で、Rewrite、Replace、Re-use、Transformだそうです。


私が見聞きしたプロジェクトは、リビルドなり、Transformを、段階的なステップを経ずに、一気にしようとしていたように思います。このため、非常な困難に直面したのかなと。


これを踏まえ、SoRのシステムは、今後どのような命運を辿るのでしょうか。
ちょっと直ぐには思いつかないので、今日はこの辺りで。

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コマンドからは接続できたので問題ないと思っていたのですが、どうも違ったようです。


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