お知らせ

  • パソコン関連

ブラウザプラグイン時代の節目

noimage

ブラウザプラグイン時代の節目

ActiveX、Javaプラグイン、Flashプラグインと、Webブラウザ内で動作する様々な機能拡張が節目を迎えようとしています。Javaが今後のロードマップでJavaブラウザプラグインを廃止するという計画を発表しました。AdobeもFlashプレイヤーで再生するコンテンツを作成するアプリケーションをFlash ProからAnimate CCと名称を変更し、Flashプレイヤー以外でのコンテンツの作成を押し出していく方針です。またGoogleが今後Flash広告の出稿を受け付けない方針とすることも発表されました。Windows10の標準ブラウザEdgeではInternet  Explorerで動作したActive Xが動作しません。ブラウザプラグインは、Webアプリケーションを作成するためにHTMLとJavascriptの性能が貧弱だった頃、大きくブラウザの機能を向上させるために頻繁に用いられていました。Webプラグインがあれば、Webブラウザで指定のページを開くだけでパソコン本体で実行するような高度なアプリケーションを提供することができました。これは広く業務システムから、動画やゲームなどの配布に利用されました。ブラウザプラグインは個々のパソコンでのプラグイン以外のインストールが不要で、バージョンアップもサーバー側でコントロールすることができたため、ブラウザプラグインの利用は広まりました。転機はスマートフォンがこれらを一切サポートしなくなったことです。スマートフォン普及と時を同じくしてHTML5、javascriptライブラリの充実、WebGLなどの制定がありました。HTML5はCanvas要素とWebGLという動的なグラフィックスなどを扱う要素が追加され、これはビデオや3Dグラフィックスなどメディアの再生のためにブラウザプラグインを動作させる必要性を失わせるものでした。またWebSocketなど、ブラウザにサーバーなど他のコンピュータと通信する機能が追加され、ネットワーク機能はブラウザプラグインに頼らなくても可能となりました。JavaScriptライブラリが大きく進歩し、HTML5、WebSocketなどを組み合わせて様々なアプリケーションを構築できるようになりました。これに対してブラウザプラグインは大きなアドバンテージを示すことが難しくなり、また脆弱性の発見とアップデートをブラウザと別途に行うことでユーザーの負担も大きくなっている状態です。スマートフォンを除外したパソコンでの動作を前提とする業務用などの条件では、これからもブラウザプラグインは残っていくでしょう。広く多くの人に使ってもらう、という用途については、その立場を明け渡すことになりそうです。

  • パソコン関連

スマートフォンの性能比較

noimage

スマートフォンの性能比較

スマートフォン購入時にはいくつもある選択肢の中から、自分の用途や予算に適合したものを選択します。 写真撮影をしたければカメラの性能が良いものを、バッテリー容量の大きいもの、コンパクトなもの、音楽や写真を多く保存できるフラッシュメモリの大きいもの、プロセッサやメモリ容量の大きいものなど様々な要素があります。 カメラ性能や、大きさ、フラッシュメモリの多さなどは価格にストレートに反映しますし、実際に比較をすることも並べてみるだけで簡単です。 それ以外の性能、スピードや能力の部分において、例えばパソコンであればCore i3メモリ4GBに比べてCore i7メモリ8GBの方が高速、といった形で比べるのは難しいように思います。 例えば性能をベンチマークアプリで数値比較することは可能ですが、ベンチマークテストの数値自体が実際の体感スピードに応じている、とは限りません。 Androidはアプリの基盤がJavaなので、ガベージコレクションという方法でメモリの不要な部分を解放していく仕組みがあり、ガベージコレクションが行われている際の速度低下についてはAndroidのバージョンアップによって改善されて行っています。 ガベージコレクションについては、今動かしているアプリ以外にもバックグラウンドで動作しているメーカー独自のアプリやサービスの量でも動作する頻度が変わります。 バックグラウンドタスクが少なく、OSのバージョンが高いスマートフォンが、古いOSで倍の量のメモリを積んでいるスマートフォンに比べて高速で動作するということは十分ありえます。 プロセッサ能力も最高性能を出し続ける、というシチュエーションはあまりありません。ゲームなどではしばしばあるはずですが、ゲーム中のバッテリ消費が大きいのは誰もが体感していることと思います。 スマートフォンについて、操作していない時は画面が点灯しているしていないにかかわらず、プロセッサは限りなくスリープに近い状態で動作しており、この低電力性能がプロセッサの高速性よりも重視されて開発が進められています。 スマートフォン性能については、こう言った理由ではっきりとした数値による比較が難しいため、実際の利用者の声を聞いてみるなども参考になります。

  • パソコン関連

JavaとJavaScriptの違い

noimage

JavaとJavaScriptの違い

JavaとJavaScript、同じようにJavaとついているし、JavaScriptとJavaは同じもの?派生?省略形?など、はっきりした区別はつきにくいと思っている方も多いかもしれません。 同じもののように見えるこの二つのプログラミング言語ですが、Java誕生のからの動向を知っている筆者には同じものには全く見えないので、違いを説明して欲しいと言われると何から説明していいのか、と戸惑ってしまうぐらいに違います。 Javaとは 先に誕生したのはJavaで、SunMicrosystems(今はOracleに吸収合併)によって開発、リリースされました。 Javaの基本的な思想はWrite Once, Run Anywhare、一度プログラムを書けば、どんなパソコン、ワークステーション、サーバー、モバイル機器でも動作する、を目指すものです。 動作するパソコン、ワークステーション、サーバー、それぞれが異なるOSや、ハードウェア構成になっていますが、それをJava仮想マシンという仕組みが差異を吸収し、同じようにプログラムが動作すること、これは大々的に注目されることになりました。 専門的になりますが、Java専用に設計されたコンピュータの仕様を作成し、それを個々のOSの上に構築するのがJava仮想マシンです。 このJava仮想マシンが構築できる環境であれば、パソコンの枠にとらわれずどの機器でもJavaで作成されたプログラムを動作させることができる、というものです。 わかりやすく現在の例に例えれば、Androidスマホ、iPhone、パソコン、同じ内容のアプリでもそれぞれに合わせて作成する必要があります。一つの目的に対して3つのプログラムを作成する必要があります。 これを一つのプログラムを作成すれば、どの機種でも動作するなら、プログラムコード作成、テストの工程はおよそ1/3まで圧縮されます。 画期的です、これがJavaです。センセーショナルな登場でした。 当時はスマートフォンは影も形もありませんでしたが、 Windows、Mac、Linux、そして開発元のSunMicrosystemsのSolaris、それぞれで同じプログラムで動作するアプリが作れるのです。 ただ、機種に依存したフル機能が使えないということで、パソコンで動作するクライアントアプリについては選択肢の一つ、という存在感です。 AndroidはGoogleが開発したJava仮想マシンが搭載されていて、アプリはJavaで開発し、動作するようになっています。 JavaScriptとは JavaScriptはNetscapeというブラウザに搭載された、Javaのような文法で開発できるスクリプト言語としてリリースされました。 スクリプト言語とはプログラミング言語の中でも容易に開発できる手軽さと素早さを求めるものです。 スクリプト言語にはコンパイルというプログラミング言語で書かれたテキストを、機械語に翻訳する工程が必要ありません。 コンパイル言語はコンパイラが正しい機械語コードを出力して初めて動作しますが、スクリプト言語はテキストを作成すればそれをそのまま実行することができます。 Javaのような文法で書ける、ということ以外、Javaらしさはありませんので、どう同じに見ればいいのかわからない、と筆者は思ってしまう原因になります。 JavaScriptの興隆 JavaScriptは仮想マシンでなくブラウザに搭載されたスクリプトエンジンで動作し、基本的にブラウザの中でのみ動作するものです。 WWW(ワールドワイドウェブ)が普及し、ブラウザ上で動作するアプリケーション、ウェブアプリには熾烈な競争が生まれました。 Webサイトにアクセスして、そのままアプリケーションが実行できるとすれば、CD-ROMによる配布やインストールなど利用開始するための様々な手順を省略し、誰でもすぐに使い始めることができるからです。 JavaScript登場当時、JavaによるJavaアプレット、Internet ExplorerのActive X、AdobeのFlashなどが鎬を削っていました。 JavaアプレットやActive Xはパワフルで、パソコンで直接に動作するアプリケーション(ネイティブアプリ)のように振る舞うので、官公庁、大企業始め、様々なところで活用されました。 Flashは主に画像、動画などを得意とするメディア系、JavaScriptはGoogleがGmailなどで実用アプリなどを、SNSなどのネットサービスが採用して作成している、という大まかな枠組みがありました。 Active Xは機種依存性が強く、JavaアプレットやFlashは各ブラウザに対応したプラグインが必要、JavaScriptはスクリプト言語ゆえに簡易なものが中心、というそれぞれにデメリットがありました。 その中でHTML5規格が正式化してブラウザで表現できるものが一気に広がり、主にWebkit系のブラウザであるSafari、ChromeがJavaScriptエンジンを発展させ、最終的にスマートフォンの普及が大きくそのバランスを崩しました。 Javaアプレットを動作させるプラグイン、Internet Explorerでしか動かないActive X、Flashプラグイン、これらすべてを持たないスマートフォンのブラウザが数年で数十億台出荷され、ブラウザアプリはJavaScriptの一強となりました。 JavaScriptはそのスクリプトエンジンの強力化によって、Google Appsなどの業務で実用に耐えうるものを生み出すまでになり、ウェブアプリ開発の主流となっています。 Javaの立ち位置 Javaを実行するJava仮想マシンは、非常に堅牢な造りとなっていて、強力で安定的なアプリケーションやサーバを開発することができます。 またオブジェクト指向など言語の設計が新しいのもあり、ガーベージコレクションなどによって旧来の言語から複雑な部分を取り除きプログラマの負担を減らすことにも力を入れています。 JavaコンパイラがJava仮想マシン用の機械語コードを作成しますが、このJava仮想マシンを高度に実装すれば、堅牢かつネイティブのアプリケーションとほぼ同等の実行速度が得られます。 クライアント・サーバ型のシステムでサーバ側がJavaを利用しての構築には沢山の事例があります。堅牢性というのは複数のクライアントの要求を処理するサーバ側にとってとても重要な部分になり、それも大きな理由の一つです。 Java開発にはIBMが作ったEclipseという非常に優れた開発環境があることも、プロジェクトとしてJavaを選択する理由の一つでもあるでしょう。 クライアント作成という分野ではあくまで一つの選択肢ではありますが、Java開発者がサーバーからクライアントまでをEclipseを利用して作成できるのは大きな意味があります。 近年はAndroidによってJava開発者の人口は増えていると思われます。 JavaとJavaScriptは大きな差があり、それぞれが適切な場所に使われることで、メリットを最大に引き出せるようになっています。 参考:SESエンジニアとは?仕事内容や必要なスキル、企業の選び方を解説 | SES業務管理の統合ツール Fairgrit®公式サイト

  • シスキュー技術部

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~ おわり。

  • パソコン関連

Java7の脆弱性とその対処

noimage

Java7の脆弱性とその対処

今年1月10日にJava7Update10までのバージョンに脆弱性が発見されました。 これについて、すでに攻撃方法も確立しており、Webブラウザから不正なApplet(ブラウザを介して実行される、Javaのプログラム)を実行すると、外部からプログラムを実行されてしまいます。 緊急性を要する危険な脆弱性として、報告されています。 各セキュリティ機関ではWebブラウザでのJavaの利用を無効を推奨する事態となっていました。 1月13日Oracle社より、修正済みのJava7Upadate11がリリースされています。   Java のバージョンの確認 上記ページで現在インストールされているJavaのバージョンを確認します。 Java7であった場合は下記のリンクからJava7Update11をダウンロードして、インストールしてください。   Java7Update11が適用できる場合はできるだけ早い適用が勧められます。 すぐ適用が難しい場合は、 各種ブラウザーで Java (applet) を無効にする方法 上記記事などを参考にブラウザでの実行を無効にすることをお勧めします。 今回Javaアプレットに発見されている脆弱性で、Java自体が危険なわけではありません。