2013年4月28日日曜日

AD 情報取得のための Java プログラム

前回は AD 認証を行うサンプルを紹介しましたが、今回は AD から情報を取り出すサンプルを紹介します。AD にはいろいろな情報がありますが、今回はユーザの名前、アカウントID、メールアドレスを抽出するプログラムを紹介します。 import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.AuthenticationException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchResult; import javax.naming.directory.SearchControls; /**  * JNDI の LDAP インタフェースを用いて...

2013年4月16日火曜日

AD認証の Java プログラム

AD認証のJavaプログラムを書く機会があったので、紹介。 import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.AuthenticationException; import javax.naming.directory.InitialDirContext; /**  * JNDI の LDAP インタフェースを用いて AD認証を実行  *  * 引数1:AD 接続先 URL  * 引数2:AD のドメイン名  * 引数3:ユーザID  * 引数4:パスワード  */ public class adauth {     public static void main(String args[]) {         Hashtable env = new Hashtable();         // Contextファクトリ  ...

2013年4月14日日曜日

多忙なSEのためのTODO管理

みなさんはTODO管理をどのように実施しているでしょうか。手帳やノートを活用している人も多いと思いますが、最近はスマートフォンでTODO管理ができるアプリも増えていますので、それらを活用している人も多いと思います。 私は iPhone を使っていますが、AppStore にはすごくたくさんのTODO管理アプリがあります。日々多忙なSEにとって、どのようなアプリが最適なのか考察してみたいと思います。 完全に個人的な解釈ですが、TODO管理には2つのパターンがあると考えています。 ①それ単独で完結するタスクのTODO管理 ②プロジェクト単位にまとめられたタスクのTODO管理 例えば、「作業表作成」や「○○会議資料作成」といった単発のタスクは①、○○プロジェクトに関する「技術調査」、「PJ計画書作成」、「要員調達」といったタスクは②に当てはまります。 もしあなたがPMや上級SEでなく、プロジェクトに組み込まれた1担当者の立場であるなら、①のTODO管理ができていれば十分と思われます。なぜならそういう立場であれば、通常は1つのプロジェクトに専任することが多く、またプロジェクトに関わる様々なタスクは、PMや上級SEが運営するPJ管理の中で指示されることになるからです。 もしあなたがPMや上級SEであり、プロジェクトの様々なタスクを整理して実施するだけでなく、同時に複数のプロジェクトの管理もしなければならない立場であるなら、①と②の両方のTODO管理が必要になるでしょう。 そしてTODO管理のアプリに関しても、①のみの管理のために最適なアプリと、①と②の両方の管理のために最適なアプリがあると思います。 今回は①のみの管理のために使える(と個人的に思っている)iPhoneアプリを紹介したいと思いますが、その前にアプリ選定の前提条件を説明します。 すべてのTODO管理を...

2013年4月13日土曜日

Apache の KeepAliveTimeout の設定

Apache を利用している Web システムが、突然レスポンスが返ってこなくなる、あるいは異常に遅い、こんなトラブルに遭遇した経験はないでしょうか? ・サーバが死んでいるわけではない。 ・サーバ負荷が高いわけでもない。 ・ブラウザでアクセスしたときは、レスポンスがなかなか返ってこない。 このようなレスポンス遅延の症状が出たとき、考えられる原因はいくつかあるのですが、可能性が高い原因として Apache の KeepAliveTimeout の設定があります。 KeepAliveTimeout は、1つのクライアント(ブラウザ)が、コネクションを占有できる時間を設定します。通常ブラウザが Web ページにアクセスしたときは、HTML ページをロードした後、そこから参照される CSS や画像等のファイルを次々と読み込むことになります。このとき、最初の HTML ページをロードする際に使用していたコネクションを解放せず、その後のファイルの読み込みにもそのコネクションを利用したほうがはるかに効率的です(なぜならネットワーク処理において、コネクションの確立が一番コストのかかる処理だからです)。このため、KeepAliveTimeout の設定は、1ページの読み込みにかかる時間+α程度の時間を設定するのが定石です。 ところが、Apache...

2013年3月1日金曜日

Struts1.3+EJB3.0 の lookup 方式およびパフォーマンス

レガシーStruts(Struts1.3)の Action クラスで EJB3.0 を呼び出す場合、インジェクションができないので lookup で呼び出す必要があります。WebLogic11g の場合ですが、以下のように記述できます。 ■インタフェース @Local @Remote public interface MyBean ■EJB @Stateless(mappedName = "MyBean") public class MyBeanEJB implements MyBean { ■lookup Context ctx = new InitialContext(); MyBean ejb = (MyBean)ctx.lookup("MyBean#" + MyBean.class.getName()); この記述で、一見正常に動作しているように見えましたが、1つ問題が発生しました。負荷テストを実施した際、この EJB の利用部分でものすごくパフォーマンスが悪いことが判明したのです。EJB 自体はStruts と同じサーバ(ローカル)で稼働しているため、普通にローカル呼び出しになっているのですが、その前段階の lookup が異常に遅いことが判明しました(負荷がかかった状態で、10sec...

2013年2月27日水曜日

jQueryMobile の popup で iframe を表示した際に自動的に閉じる方法

かなり特殊な構成になりますが、jQueryMobile の popup パネルを表示し、そこに iframe で別ページを表示するサイトを作成したときに、少し苦労したところがあるので、記録しておきます。 その popup をあるイベントをトリガーに自動的に閉じる動作をさせたかったのですが、jQueryMobile のマニュアルを参照しながら、以下のコーディングをしました。   $("#popupPanel").popup("close"); しかしこれでは、うまく動作する端末としない端末がありました(このときは Android では動作したのですが、iPhone では動作しませんでした)。この popup("close") ですが、ある条件のときには、どうやら history.back() の動作をしているようなのです。もちろん通常の popup であれば、history.back() はパネルを閉じるのと同じ効果が出ます。しかし今回作成したのは、内部に iframe で別ページを表示した popup パネルであり、その内部でいくつか遷移が行われている状態です。このため、いくら popup("close") を呼び出しても、iframe 内の履歴が戻るだけで、いっこうにパネルが閉じないのです。 いろいろ調べた結果、以下のおまじないを記述することで、閉じる動作をすることができました。  ...

2013年2月25日月曜日

スマホサイトのiframeの高さ問題

先日OperaがレンダリングエンジンとしてWebkitを採用するというニュースが話題になりました。競争による技術革新が阻害される可能性も指摘されているようですが。。。SEの立場から正直な感想を言わせてもらうと、複数ブラウザの検証とギャップを埋めるコーディングほど無駄な作業はないなーと思うので、レンダリングエンジンが統一されて開発者の負担が軽減されるのであれば、大歓迎です。とは言え、ブラウザによる微妙な違いは、まだ当分悩むことになりそうですが。。。 先日、スマホサイトのiframeの高さがうまく調整できないという問題に直面しました。 <iframe width="100%" ・・・> として、高さを指定せずに iframe を表示した場合、うまく内部のコンテンツの高さにあわせて高さを調整してくれる端末と、そうでない端末がありました。調べてみると、 iPhone ・・・ OK Android 2.* ・・・ OK Android 4.0 ・・・ NG という結果でした。Android の iframe にはバグも多いという記事も見たことがありますが、こんなものなのでしょうか。iframe 内のコンテンツの高さを計算して高さをそろえる手法もあるようでしたが、内部が別ドメインであるなど、ややこしい問題もあったので、このときはそれらしい高さを...

2013年2月24日日曜日

Oracle で暗号化

以前、Oracle 上で暗号化をしなければいけない案件があり、ちょっと苦労したのでメモ。トライしたのは、SHA1のハッシュ化です。 まず、DBMS_CRYPTOパッケージの HASH 関数を利用するために、Oracle アカウントに権限を設定します。 grant execute on DBMS_CRYPTO to MYACCOUNT; DBMS_CRYPTOパッケージについては、PL/SQL から利用するサンプルはたくさん見つかったのですが、SQL のみで実行するサンプルがなかなか見つかりませんでした。試しに、以下の SQL で実行してみました。 select UTL_RAW.CAST_TO_VARCHAR2(   UTL_ENCODE.BASE64_ENCODE(     DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW('mypassword', 'JA16SJIS'), DBMS_CRYPTO.HASH_SH1)   ) ) from dual; そうすると、以下のエラーが出てうまくいきません。 「ORA-06553: PLS-221: 'HASH_SH1'がプロシージャではないか、または未定義です」 それは確かにそうなんですが。。。いろいろ調べた結果、DBMS_CRYPTO.HASH_SH1の値は3であることが判明しましたので、 select UTL_RAW.CAST_TO_VARCHAR2(  ...

Oracle パスワードが期限切れで接続できない

半年ほど前に導入したシステムから、以下のエラーが発生しました。 ORA-28001:パスワードが期限切れです 調べてみると、なんと Oracle は 11g になってからデフォルトで 180日になっているじゃないですか!「ORA-28001」で検索すればいくらでも情報はあるのですが、「Oracle導入時の注意点」ではちっとも見かけなかった情報でした。。。こういった勝手な仕様変更に腹が立つのは私だけでしょうか? 以下の方法で復旧しました。 1. DBサーバ上で sqlplus sys/<管理者パスワード> as sysdba で sqlplus を起動 2. 以下のコマンドを実行して該当アカウントを復旧   SQL> alter profile default limit password_life_time unlimited;   SQL> alter user <ユーザID> identified by <パスワード>;   SQL> alter user <ユーザID> account unlock; ちなみにトラブルとなったのは JBoss サーバでしたが、この対処のみで自然と復旧することができました。また、トラブルとなったユーザ以外にも、有効期限が切れている(または切れそうな)ユーザを、以下の...

Smartyでサニタイジング

PHPのサイトでテンプレートエンジンとしてSmartyを利用している場合、クロスサイトスクリプティング対策としてのサニタイジングのために、HTMLコードのエスケープ処理を行います。エスケープ処理の方法としては、以下のサイトがよくまとまっていると思います。 http://k-holy.hatenablog.com/entry/php-advent-2012 私も試しに $smarty->escape_html = true; の設定をしてみたのですが、なぜかエスケープされる場合とされない場合があります。おかしいな~と思っていろいろ試していると、 {$this->name}<br/> の箇所で {$this->name} <br/> のように、{$・・・}の後にスペースを1つ入れるとちゃんとエスケープするようになりました。いったいどんな仕様なのやら。。...

2013年2月23日土曜日

Format系オブジェクトのマルチスレッド問題

運用中のJavaのシステムが、ある日突然おかしな日付(1970年とか)を出力する、そんなトラブルに遭遇した場合は、DateFormat オブジェクトの使い方をチェックしたほうが良いかもしれません。 class DateUtil {     static SimpleDateFormat myFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");     public static String format(Date date) {         return myFormat.format(date);     } } うっかりこんなコードを書いてしまう人はかなり多いと思います。しかし、Format系のクラスはマルチスレッド対応していないため、Web系のユーザが多いシステムで利用された場合、ごくまれに誤動作を起こし、おかしな出力になったりします。しかもこの現象は、そこそこユーザが多いシステムでも年に数回だったりするので、やっかいです。この場合、Format系のクラスは毎回 new で生成してやる必要があります。 class...