お知らせ

  • シスキュー技術部

VBScriptでIE10を互換モードに変更する

noimage

VBScriptでIE10を互換モードに変更する

InternetExplore10を起動の際に互換モードで動作させるVBスクリプトを作成してみました。 InternetExplore10(IE10)はWindows8では標準、Windows7ではWindowsアップデートによってマイクロソフト社すすめる標準のブラウザになろうとしています。 しかし、かつてIE向けに対応されたWEBシステムなどで、互換性の問題が出てくる例もあるようです。 この互換性の問題を解決するために、IE10には開発者ツールを開いて、ドキュメントモードの変更を行うことで無事動作するという事例もありますが、このドキュメントモードの変更は、毎回ブラウザ起動のたびに手動で変更する必要があります。 この手動での変更をVBスクリプトを利用して、自動化してみます。 VBスクリプト例 ソースは下記の通りです。 ファイル名: LaunchIE10.vbs [vb] Option Explicit 'Define Dim WSHobj Dim waitie Dim quirkstype Dim siteurl Dim AryArgs 'Constant Const SEC=1000 Const DEFAULT_WAIT=3 Const DEVMODEkey="{F12}" Const TYPE5="%u" Const TYPE7="%7" Const TYPE8="%8" Const TYPE9="%9" Const STANDARD="%s" Const QUIRKS="%q" Const DEFAULT_URL="" Const IEPATH="""C:\Program Files\Internet Explorer\iexplore.exe""" 'Argument Check waitie=DEFAULT_WAIT siteurl=DEFAULT_URL quirkstype=TYPE5 If WScript.Arguments.Count <> 0 then Set aryArgs = WScript.Arguments If aryArgs.Count > 0 then siteurl=aryArgs(0) If aryArgs.Count > 1 then If IsNumeric(aryArgs(1)) = false Then waitie = DEFAULT_WAIT Else waitie = Cint(aryArgs(1)) End If End If If aryArgs.Count > 2 then Select Case aryArgs(2) Case "5" quirkstype = TYPE5 Case "7" quirkstype = TYPE7 Case "8" quirkstype = TYPE8 Case "9" quirkstype = TYPE9 Case "S" quirkstype = STANDARD Case "Q" quirkstype = QUIRKS Case Else quirkstype = TYPE5 End select End If End If Set WSHobj = WScript.CreateObject("WScript.Shell") 'run IE WSHobj.run IEPATH & " -new " & siteurl 'wait for IE Active WScript.sleep waitie*SEC WSHobj.Sendkeys DEVModeKey 'wait for DEVControl WScript.sleep waitie*SEC WSHobj.SendKeys quirkstype & DEVMODEkey [/vb] VBスクリプト解説 IE10で開発者モードに入るにはF12キーを押します。 そこから各互換性モードに入るためには、Altキーとバージョン番号の組み合わせになります。 最も古いブラウザとの互換性のためには、Internet Explorer 5 Quirksというモードが用意されていますが、これはAlt+Uの組み合わせになります。 このキーの組み合わせを、SendKeysというメソッドで擬似的にキー入力させています。 IE9標準モードであればAlt+9など、いくつかのバージョンが用意されていますが、上記VBスクリプトでは、Internet Explorer 5 Quirksというモードをデフォルトで選択するようになっています。 このスクリプトをそのまま実行すると、あたらしいIE10を立ち上げ、標準のホームページを開き、開発者モードに入ってInternet Explorer 5 Quirksにモードを変更して、開発者モードを終了します。 このSendkeysを使う都合で、IEが立ち上がるまで、立ち上がった後キー入力を受け付けるまでの二回、待ち時間を設けています。 標準では3秒みていますが、早いパソコンであれば、1秒ほどの待ち時間でも十分実行できます。この辺りはパソコンや、ページを開くまでの時間によって、適切な時間は変わってきます。 SendKeysはアクティブなウィンドウに対して、キー入力を送るメソッドですので、途中でIE10からフォーカスが移ってしまうと正常に動作しません。 このスクリプトでは積極的にフォーカスを取りに行っていないので、待ち時間中にフォーカスが移ってしまう場合は、改良する必要があるでしょう。 VBスクリプトに引数を与える方法 このVBスクリプトは三つの引数をとるように作成しています。 第一引数は、最初に開くwebサイトのURL。 第二引数は、待ち時間。単位は秒です。 第三引数は、互換モード。5であればInternet Explorer 5 Quirks、7であればInternet Explorer 7 標準という感じになっています。詳しくはスクリプトをご覧いただけるるとご理解いただけると思います。 このスクリプトファイルのショートカットを作り、プロパティのリンク先に、vbsファイル名に引き続くようにして半角スペースで区切りながら三つの引数を入力します。 上記スクリーンショットを例に挙げると、弊社コーポレートサイトを、3秒の待ち時間(合計6秒)を設けて開き、Quirksモードに変更する、というショートカットになります。 終わりに 本スクリプトは、動かないWebシステムをIE10で動作させるという保証はできません。 スクリプトでIE10の互換性モードを変更する、ということを実現するためのものです。 動作させる環境によって正常に動作しない場合や、スクリプト実行により何らかの損害を被った場合も一切の責任を負わないものとします。 スクリプトを精査したうえでのご利用をお願いいたします。 IE10で既存のWebシステムが正常に動作しないのは、さまざまな原因があり、システム側の問題、システムが利用しているライブラリの問題、IE10がこれまでのIEとの互換性よりも機能性をとった部分など、数えればいくらでもある可能性と、その組み合わせになっています。 単純にIE10の互換性モードを変更すれば動作するのであれば、このスクリプトもいくらか役に立つ場面もあるかもしれません。 Windows7でいつまでIE9がサポートされるのかはわかりませんが、Windows8では標準のブラウザでもあるので、IEのバージョンダウンだけでは解決できない時はやがてやってくるでしょう。 そのときシステムをIE10にむけて対応するのか、あるいはIE10が変化しているのか、他のブラウザで動作する場合は、他のブラウザを推奨するのか、対応として考えられることは様々ですが、一つの変わった解決策として参考にしていただければと思います。

  • シスキュー技術部

Java備忘録① ~ファイル入出力と文字コード~

noimage

Java備忘録① ~ファイル入出力と文字コード~

「FileWriter」というテキストをファイルに書き出すクラスがあります。 Java初心者の僕は、なんとな~くこの「FileWriter」を使っていました。 それで問題なく動いていたからです。 が・・・。 この「FileWriter」、出力するファイルの文字コードセット指定ができないんですね~。 というか、OSのデフォルトのエンコード方式で自動変換されてしまいます。 文字コードを意識しないでいいという点は、一見便利なようにも思えますが、 かえって問題を引き起こす原因にもなりかねませんな~。 なので、普段から文字コードを意識してコーディングする方がよさそうですね。 というわけで、文字コードを指定する場合は、 「FileWriter」の代わりに「OutputStreamWriter」を使用するといいでしょう。 [java] // FileOutputStreamオブジェクト生成(出力ファイルの指定) FileOutputStream fo = new FileOutputStream("file.txt"); // OutputStreamWriterオブジェクト生成(文字コードの指定) OutputStreamWriter ow = new OutputStreamWriter(fo, "UTF-8"); // 書き出す内容をセット ow.write("Hello Work!!"); // ストリームの解放 ow.close(); fo.close(); [/java] こんな感じでしょうか。 ちなみに、「FileWriter」と同じようにファイル読み込み手続きを簡略化した 「FileReader」というクラスも文字コードが指定できません。 代わりに「InputStreamWriter」を使って云々かんぬんする必要があるワケですが・・・。 ま、便利なのも考えモノですね~、という初心者の感想ですです。 というわけで、今回はこれにて失礼。

  • 超科学戦隊オレ一人

JavaでByRef

noimage

JavaでByRef

JavaでByRef ByRef・・・つまり参照渡し。 要は、あるメソッドに対し、パラメータとして渡しつつも、 その値を変更したいって場合の話よ(o´・∀・)y~ Javaにはこれがない。 結論からいうと、配列とかコレクション型を使うと、これに似たことができるって話よ。 下の方にサンプルを載せておきます。 .NETばっかりやってると、 あまりにも至れり尽くせりなので、「ほえ~」てな気分で、 なーも考えないでポコポコ作ってしまえる場面がいくつかあって、 そのひとつが、ByRefだと思ふ。 久しぶりにJava触って、ByRefしたいときがあったので、それをメモる。 そういえば、JavaにはByRefなんてねーわ!ちゅう話です。 そうです。ByRefなんて、そもそも、普通の、プリミティブな言語には、ねーのです。 .NET Framework様は、お便利なので、ByRefがあるのです。そーいうことです。 そもそも、そんなお便利なものがあること自体、どうか、と思い始めた。 つまり、ある関数に対し、渡したはずのパラメータの値を、関数自身が変えやがるってことです。 よう考えたら、これは、恐ろしいことです。 たとえば、こういうことです。 親が、アホの息子に、1000円札を渡して、お使いに行かせたら、 アホの息子は5万円のレアなトレカを買ってきたよ。むろん、支払いは親のカードでな! くらいの恐ろしさです。 わかるな(o´・∀・)y~ でも、まぁ、それが必要なときもあるわけよ。 JavaでByRefしたいときもあるわけよ。 配列の要素に対しては、ByRef的な動きが実現できる。 以下、サンポォ(sample) ---------------------------------------------------------- /** * 親の金を、親に黙って勝手に使ったりしない一般的なガキのプログラム */ publis static void main(String[] args) { // プリミティブなint型変数i     int i=0; // ガキに渡す前     System.out.println(“金=” + i); // NotByRefというガキに、iという小遣いを渡してみる     NotByRef(i); // ガキは小遣いを変更していない件     System.out.println(“金=” + i); } // パラメータiを勝手に変更しそうでしない一般的なガキ private static void NotByRef(int i) { // iを変更してみるものの…実はこれは呼び出し元では変更されない     i += 1; } ---------------------------------------------------------- ---------------------------------------------------------- /** * 親の金を勝手に変更しくさるクソガキのサンプルプログラム */ publis static void main(String[] args) { // 配列変数i     int[] i = new int[1]; // iの0番目を0円で初期化     i[0] = 0; // ガキに渡す前     System.out.println(“金=” + i[0]); // メソッドByRefというクソガキに、iという小遣いを渡してみる     ByRef(i); // ガキによって小遣いが変更されている件     System.out.println(“金=” + i[0]); } // パラメータiを勝手に変更するクソガキ private static void ByRef(int[] i) { // 親にもろた金を自在に操る     i[0] += 1; } ---------------------------------------------------------- というわけで、配列とかを渡してやると、ガキはこの内容を変更しまくり(o´・∀・)y~ へー。 まったくどうでもええわ。 オレがやりたいのは、こんな作業ではないので、 こんなことを改めて知ったところで、まったくモチベーションはあがらんよ。 そうだ、会社を興そう。 以上。

  • 超科学戦隊オレ一人

Javaでソケット通信(ジャバソケ)

noimage

Javaでソケット通信(ジャバソケ)

ソケット? ソケット通信? ハ?ナンスカソリャ(o´・∀・)y~ たぶん、恐らく、普通のIT戦士ならば知っていること。 ぼかぁ、なんちゃってエンジニアなので、知りませんでした。 でも、ソケット通信するプログラムを作らにゃならんことになりました。 そこで、今回えんやこらしたいきさつを、ここにメモります。 ソケット通信とは何か。 何かしらのデータを、何かしらの仕組みでやりとりすることらしい。 ふぅん。それってパケット通信とどう違うの?ヨクワカラナイネ。 えんやこらしたあげくに、僕は以下のように理解しました。 引きこもりニートが、毎日、母親に夕飯を部屋まで届けてもらうケースを考えます。 すると、以下のような手続きが想定できますね。 (1)お母さんは、ニートの部屋のドアをコンコンする。 (2)ニートが、「なんの用じゃババア!」と返事する。 (3)お母さんは、「夕飯持ってきた、ここ置いとくで」と言う。 (4)ニートが、「わかった」と返事する。 これを、ソケット通信で例えると、以下のようになります。 ニート・・・ソケットA 夕飯・・・データ お母さん・・・ソケットB ふむふむ。 データを持ってくる人がいて、 データを受け取る人がいて、 コンコン→なんの用じゃ→置いとくで→わかった。という流れがある。 ほほぅ。べりぃイージーれすねぃ(o´・∀・)y~ で、こういうやりとりを、プログラムではどうするかっちゅうと、 Javaでは簡単にでけますた。 今回作る必要があったのは、受け取る側。 つまり、引きこもりニートを作りました。 以下、サンポォソース(サンプルソース) /** * ええ年こいて働きにも出んと、毎日部屋に引きこもって、 * 夕食はお母さんに部屋まで届けてもらっているニートのプログラム * めんどくさいのでエラー処理は省いています。ニートはめんどくさがりです。 * * @author KaZ */ public class Neet { // ニートの本体     public static void main(String[] args) { // ニートはポートを開きます(ニートポート5000番)         ServerSocket neetSocket = new ServerSocket(5000); // 働きにも出んとコンコンされるのをただただ待ち続けます while(true) { // お母さんにコンコンされます             Socket mamaSocket = serverSocket.accept(); // メシを受け取る準備をします(モノもらうときだけは一丁前に動きます)             InputStream inStream = mamaSocket.getInputStream(); byte[] meshi = new byte[ 100 ];    // 100バイト分の受け取り皿を用意 // メシを受け取ります(中身はともかく、くれるもんはもらう主義です)             inStream.read(meshi, 0, 100); // 受け取ったので閉じます             inStream.close(); // もちろんお母さんはもう不要なので追い出します             mamaSocket.close();    // 入ってくんな!でていけババア! // ほくほくしながらメシをのぞいてみます             String meshiNoNakami[] = new String(meshi);    // 中身を文字列にしてみる // メシの中身を文字列で出力             System.out.println(meshiNoNakami); } } } きゃっほう!ニートの生活ってイージー!イージー!(o´・∀・)y~ しかし、驚くべきことに、 このプログラムはうまく動かない場合があるのです。 それは、お母さんが、なかなかメシを渡さないイジワルババアの場合です。 例えるならば、じらすかのようにオカズ、一皿ずつ渡されるとき。 そうです。お母さんは、 必ずしも、一回の手続きでメシを全品くれるとは限らないのです。 だから、以下の一行をループ処理に書き換えます。 // メシを受け取ります(中身はともかく、くれるもんはもらう主義です) inStream.read(meshi, 0, 100); ↓↓↓↓↓↓↓↓↓ // 一時的な変数をご用意 int ima_moratta_sara = 0;    // たった今受け取った皿の数 int imamadeno_sara = 0;        // 今まで受け取った皿の数 // メシが全品そろうまで、受け取り続ける while(メシが全品そろわない限り)    // ここの条件はお好みで { // たった今受け取った皿の数を覚えておきます ima_moratta_sara = inStream.read(meshi, imamadeno_sara, 100 - imamadeno_sara); // 今まで受け取った皿の数に加算します     imamadeno_sara += ima_moratta_sara } これで、ニートは腹いっぱいメシを食えるちゅうことですね(o´・∀・)y~ おわり。

1 2