システムエンジニア兼IT講師の備忘録

技術やトレーニングテクニックなどを思いのままに発信していきます。

よく聞くけど意外とわからない言葉その2 「Web3階層」

こんにちは。

今回は、「Web3階層」という用語についてお伝えしていきます。

確かに良く聞く言葉ではあるんですが、「じゃあ説明してよ」と言われると意外とわからないものですよね。 というわけで、簡単に説明していきます。

実は、Web3階層には「Webアプリケーション」という用語がくっついて来ます。

Webアプリケーションとは?

現在、日常的にWebアプリケーションを利用していない人はほとんどいないでしょう。 ネットショッピングをしたり、SNSにつぶやきを投稿したり、スケジュール管理をしたり・・・ これらに共通するのは、Webブラウザを使って利用していることです。

通常、Webブラウザを利用して、いわゆる「アプリ」のように使えるサービスのことを 「Webアプリケーション」と呼んでいきます。「Amazon.co.jp」「Twitter」「Facebook」等が有名どころなのではないでしょうか。

じゃあWeb3階層って何?

一つ上の項目で、「Webアプリケーション」が何なのかというお話をしたと思います。 では、「Webアプリケーション」を作るにはどうしたら良いのでしょうか? f:id:bowtin:20180117102520p:plain

世の中にはいろいろなモノが溢れていますが、どれをとっても、微妙に作り方は異なると思います。 例えば、手帳はいろいろなメーカーが販売していて、いろいろな種類があり、おそらく会社ごとに作り方は若干違うでしょう。 ですが、何もかもが違うわけではなく、大まかで一般的な「セオリー」が存在するはずです。

Webアプリケーションを作るときも同じで、「こうするとイイよ」と先人たちが貯めてくれたセオリー、 これが「Web3階層」です。

Webアプリケーションはどうやって作るの?

「Webアプリケーション」を作るには、物理的なハードウェアも必要ですし、プログラマが開発したソフトウェアも必要です。 「ソフトウェア」のイメージがつかない人は、「業務用のアプリ」だと思って下さい。

まとめると、
どのハードウェアをどこに配置してどのハードウェアと繋げ、
各ハードウェアにはどんなソフトウェアをインストールするのか

このノウハウこそがWeb3階層です。

具体的には、下図のような構成が一般的です。 f:id:bowtin:20180117102836p:plain

簡単に説明しますと、
Webサーバ・・・例えるなら受付。お客さんからの要求を受け付け、すぐに答えられるものはその場で回答(応答)する
アプリケーションサーバ・・・Webサーバでは処理できないもの(難しい判断や処理等)を担当し、保存しなければいけない情報や、データベースから貰わなければいけない情報があればデータベースサーバと連携していく
データベースサーバ・・・単純に言うとデータの倉庫。ひたすらデータを綺麗に貯めこむだけ。

矢印をつけると、こんな感じになりますね。 f:id:bowtin:20180117102921p:plain

いずれのサーバも、基本的にはただのコンピュータを設置すると思ってもらってOKです。 但し、家電量販店などに売られている普通のパソコンではなく、 多数のユーザからのリクエストを同時に捌いてもパンクしないような高性能なコンピュータが選定されることが多いです。 基本的には、値段も高いですね。

じゃあソフトウェアは?

ソフトウェアも、自由に選んでOKです。 よくある構成はこんな感じです。

【無償製品で埋める場合】
Webサーバ・・・OSはLinux、WebサーバとしてApacheをインストール
アプリケーションサーバ・・・OSはLinuxアプリケーションサーバとしてTomcatをインストール
データベースサーバ・・・OSはLinux、データベースとしてMySQLあるいはPostgreSQL

Microsoft社製品で埋める場合】
Webサーバ・・・OSはWindows Server、WebサーバとしてMicrosoft IISをインストール
アプリケーションサーバ・・・OSはWindows Server、アプリケーションサーバ上記IISで問題なし
データベースサーバ・・・OSはWindows Server、データベースサーバはSQL Serverをインストール

というのが非常に多いですね。 もちろん、基本的に無償製品を利用するけど、データベースだけはOracle社のOracle Databaseを使う、なんてこともあります。

各サーバは、物理的に別れている可能性もありますが、物理的には別れていない同一のコンピュータ、ということもあります。

結局、Web3階層は論理的な話だと思って頂ければOKです。

さいごに

結局のところ、Web3階層はただの「セオリー」です。 型破りな構成にしても良いですし、まったくの新しい概念を生み出しても良いです。 もちろん、ハードルは高いでしょうけれども。

では、今日はこの辺で!

VBScriptで「ファイルを開く」ウィンドウを開く

みなさんあけましておめでとうございます!

先日、VBScriptでコードを組んでいまして、 どうしても「ファイルを開く」ウィンドウを開きたかったのですが、 どうやらVBScript自体にはそういった機能が無いようです。

InputBoxを使ってファイル名をフルパスで入力してもらうとか、 色々小技はありそうですが、どうも使い勝手が悪いと感じました。

そこで、ちょっとした裏技を入手しましたのでご紹介します。

Excelを開いて、Excelの「ファイルを開く」ウィンドウを使う

Microsoft Excelには、「ファイルを開く」ウィンドウが備わっているので、 VBScriptからExcelを開いた上でこのウィンドウを表示させ、 あとからExcelをしっかり終了してやればOKという寸法です。

コードはこんな感じになります。

'①Excelを開く
Set excel = CreateObject("Application.Excel")

'②Excelそのものを使いたいわけではないので、Excelは非表示がオススメ。
'Trueにすれば表示できます
excel.Application.Visible = False

'③Excelの「ファイルを開く」ウィンドウを呼び出し、ファイルパスを戻り値として受け取る
openFileName = excel.Application.GetOpenFileName("ログファイル, *.log")

'④Excelを終了する
excel.Quit

'これで、変数openFileNameにはファイルのフルパスが保存されているので、
'好きなように使う(例えばメモ帳でファイルを開く、など)
WScript.CreateObject("WScript.Shell").Run "notepad.exe" & openFileName

コードの③部分の解説になりますが、開くファイル形式はなんでも大丈夫です。 たとえば、スクリプト内でJSONのファイルが開きたい!ということであればこのようになります。

openFileName = excel.Application.GetOpenFileName("JSONファイル, *.json")

この関数の引数のうちの前半は、ウィンドウ上で表示されるファイル形式名ですので、自分や利用者がわかればなんでも良いです。 後半は、見ての通り拡張子です。txtでもxlsxでも、あるいは自分の独自のファイルでもいけます。

あくまでも、Excelの「ファイルを開く」を利用してファイルパスを取得するだけですね。

ちょっとした注意点ですが、この引数は全部で一つの引数ですのでご留意ください。 "メモ帳, .txt"であって、"メモ帳", ".txt"ではありません。 ちょっと気持ち悪いですが。

それでは、今日はこの辺で。

VMware Workstation Playerで使えそうな設定まとめ

こんにちは!

※この記事はVMware Workstation Player 12.0および14.0で動作確認しています

マシンの仮想化を行うためによく用いられているVMware。 私は会社で、検証用の環境としてしょっちゅう活用しています。

さて、私はVMwareを使うときに良くイメージそのものをコピーして使うことが多いのですが、 毎回こういう警告が出てきてウザったく感じたわけであります。

まず、イメージをコピーしましたか移動しましたか、っていう警告。 f:id:bowtin:20171219135736p:plain

それから、ちょっとおまけですがVMware player自体の更新メッセージ

f:id:bowtin:20171219135734p:plain

これらを消す方法と、その際の注意点について解説していきます。

更新メッセージの消し方

こちらのほうが話がシンプルなので、先に書きます。

1.VMware Workstation Playerを開きます。

2.[Player] -> [ファイル] -> [環境設定]を開きます。 f:id:bowtin:20171219140031p:plain

3.下記画像の2つのチェックボックスを外しましょう。 f:id:bowtin:20171219140143p:plain
これで毎回表示されないはずです。

戻すときは、同様の手順でチェックボックスをONにしてやれば大丈夫です。

「コピーしましたか、移動しましたか」メッセージの消し方

こちらは消すだけなら簡単ですが、ちょっとした注意事項があります。

まずは消し方から。

1.仮想マシンのファイルが保存されているフォルダを開きます。

2.中はこんな感じになっているので(実際のファイル名は伏せています)、.vmxと拡張子のついたファイルを探して下さい。 f:id:bowtin:20171219140727p:plain

3.このvmxファイルをメモ帳などで開きます。

4.中は設定ファイルになっているので、下記の記述を追加しましょう。

uuid.action  = "keep"

または

uuid.action = "create"

これで毎回確認は出なくなるはずです。 上記二点の違いは後述します。

uuid.action = "keep"とuuid.action = "create"の違い

この設定には、「UUID」が深く関わってきます。 まあざっくり、マシンを一意に識別するための128ビットのIDだと思って頂ければOKです。

よくある製品ライセンスなんかも、このUUIDが同一であれば同一マシンとみなしているケースが非常に多いです。

ただ、VMwareはマシンの仮想化を行いますので、イメージをコピーしてしまった際に UUIDも同様にコピーしてしまうと、コピーしたイメージと元のイメージを同時に起動したときに問題が起こる可能性があります。

ちなみに、VMwareではUUIDが同じであればMACアドレスも同じになるようなので、 同一ネットワーク内に同一UUIDが存在するとマズい、と思ってもらえればOKですね。 uuid.action = "keep"では上記のような動きになります。

f:id:bowtin:20171219142527p:plain

コピー時にUUIDを新規生成するようにするためには、uuid.action = "create"を使います。 そうすれば、同一ネットワーク内で起動しても大丈夫です。

但し、製品ライセンス等UUIDを参照するようなプログラムがあった場合、 コピー元と同じようには動かない可能性があります。 f:id:bowtin:20171219142530p:plain

というわけで、VMイメージファイルをコピーした際に UUIDだけは新規生成するのが「コピーしました」設定、 同一UUIDを保持するのが「移動しました」設定になります。

同一ネットワーク内で起動させることがなければ、現状どちらでも問題ないように感じます。

ではまた。

わかりやすく説明するための「例え」と「喩え」

こんにちは!

今日は、トレーニングやOJTの手法について意見をメモ書き程度に述べていきます。
※個人的な体験に基づいた意見になります

身の回りにある教育

近年では、多くの企業が「若手の育成」を重視し始めています。
OJTやメンター、トレーナー制度などを導入している会社もあります。
そのため、先輩社員として後輩の育成をある程度任されてしまう、なんていうケースも多々あります。

わかりやすい説明のしかた

かく言う私もかなりの若手で、一般的な企業で言えばまだまだ教育される立場なわけですが、
業務柄、他の社員の育成に関わる場面があります。

その中で、「なぜか伝わらない」、「わかってもらえない」ことが多く
相手に何かを説明しようとするときに「たとえ話」が重要であることに気づきました。

なぜ、「たとえ話」が重要なのか?

一言で言うと、「相手の経験と関連付けてあげる」ことが重要です。
人間誰しも、新しいことを学ぶのはとても大変です。
ですが、既知の事柄と似ていることなら簡単に学習できる!と思いませんか?

この性質を利用することが非常に重要かつ効率の良い学習や習得に繋がると私は考えます。



じゃあ、どんなたとえがいいの?

とは言っても、とりあえずたとえを出せば良いわけではありません。

先程も書いたように「相手の経験と結びつける」ことが重要です。
つまり、相手を知る必要があります。

相手の「趣味」「勉強してきた内容」「知っている事」を加味したうえで
たとえを出しましょう。
例えば、若者向けであれば「最近の雑誌」だとか「最近のゲーム」だとか。
中年の方向けであれば「家庭の話」や「前職の話」など。
できるかぎり、相手にとって身近な内容に置き換えて説明しましょう。
そのためには、前もって相手との雑談やコミュニケーションで、その人の知識を引き出しておくことが必要ですね。

一歩進んだたとえ話:「例え」と「喩え」

「たとえ」には、漢字が二種類あります。
例え」と「喩え」です。
※「喩え」と「譬え」は同義とされている事が多いので省きます

「たとえ話」を出す際には、「例え」と「喩え」両方を出したほうが良いです。
喩え」は比喩であり、相手の身近なものに置き換えて説明するのがコレに当たります。
例え」は実例ですね。実際の業務などに即した実例を話しましょう。

例を示すと、こんな感じです。
説明したい内容:「月報は給与に反映されるから、月報を毎日しっかり時刻を記録してね」
対象者:アルバイト経験のある新入社員
喩え:「アルバイトとかでも毎日タイムカード押すよね。あれが無いとお給料もらえないよね?だからしっかり時間は記録しようね!」
例え:「例えば、業務を開始した時間を9:00としたら、ココに9:00って書いてね。退勤した時間が18:00だったら、ココに18:00って書いてね。そうすると、8時間労働したことになるよね。これを元にお給料が出るよ」

まあ、さすがに給料の話でたとえが必要な人はいないかもしれませんが、
いずれにせよ、相手の経験と関連付けること、それから実際の値を見せることが重要です。

更に進んだ話:「たとえ」は複数用意しよう!

人によっては、自分が用意したたとえでスッキリ納得してくれないかもしれません。
ですので、「たとえ」はできれば複数用意しておきましょう。

JavaでString文字列を==で比較してはイケナイと言われる理由

こんにちは!今日は少々マニアックな話になります。

Javaで文字列を比較するとき、==で比較してはイケナイというのは良く聞く話ですね。

本当かどうか、ちょっと試してみましょう。

String型の変数を2つ用意し、同じ文字列を格納して比較する

String str1 = "Hello World";
String str2 = "Hello World";

System.out.println(str1 == str2);

結果:true

となります。

あれ?大丈夫じゃん????

では、以下のケースを試してみましょう。

String型の変数を2つ用意し、加工して同じ文字列の状態にしてから比較する

String str1 = "Hello";
String str2 = "Hello World";

str1 = str1 +  "World";

System.out.println(str1 == str2);

結果:false

となります。 結果的に両方共"Hello World"という文字列を格納していますが、falseです。

なぜなのか

==は、基本的に「同じ文字列であるかどうか」を判定します。

ですので、実は下記のように文字列が加工されない場合はあまり問題無いです。

String str1 = "Hello World";
String str2 = "Hello World";

System.out.println(str1 == str2);

問題になるのが、文字列に加工が入る場合です。

String str2 = "Hello";

str2 = str2 +  "World";

この時、実は内部ではコレが起こっています。

String str2 = new String(str2 + "World");

つまり、全くの新しいオブジェクトを生成しています。

あとは、よくある動きですね。

String str1 = "Hello World";
String str2 = new String("Hello World");

System.out.println(str1 == str2);

結果:false

となります。

ちなみに、このケースでも

System.out.println(str1.equals(str2));

と、equalsメソッドを使ってやればシッカリと内部文字列の比較ができます

まとめ

・Stringにおける==は、文字列の比較を行うようになっているため、文字列に加工が入らない限りは問題は起こりにくい

・ただ、明示的にnew String()が行われた場合の==はオブジェクトの比較を行う

・文字列の加工は、裏でnew String()を行う

・結論として、何があるかわからないので、基本的にequals()メソッドを使えばとりあえず安全!

よく聞くけど意外とわからない言葉その1 「クライアントサイドスクリプト」「サーバサイドスクリプト」

こんにちは!

 

当ブログでは、主に初心者の方をターゲットに、

「よく聞くし、わかった気になってるけど意外と説明できない言葉」をいくつかご紹介していきます。

 

IT業界にこれから入ろうとしている方、入ったばかりの方、よかったら読んでみて下さい。

 

第一弾として、今日は

「クライアントサイドスクリプト「サーバサイドスクリプト

をご紹介します。

 

たとえ話から行きましょう。

 

みんながバラバラの方法で申請を出すと大変!

皆さん、仕事をする上で何かしら、定期的に提出しているものってありますよね。

まずはそれを思い浮かべて下さい。

例えば、週報、月報、報告書、経費精算、申請書とかそういうものです。

 

共通している点は、「誰かがチェックしている」という点ですね。

とくに申請書なんかは、上司等がチェックして承認することが多いですね。

 

f:id:bowtin:20171207005154p:plain

 

さて、普通の会社は一般社員さんのほうが、人数面でチェック係となる上司よりも多いわけです。

 

申請をしてくる社員さんそれぞれが、みんなバラバラな書き方で送りつけてきたらどうでしょう。

 

チェックをする上司は毎日終電でしょうね。

f:id:bowtin:20171207005156p:plain

 

予めフォームを決めておいて、それに書いてもらう

そこで、大抵の会社は「フォーム」を使いますね。

「名前を書く欄」「金額を書く欄」「理由を書く欄」等を予め作っておいて、その通りに書いてもらえば楽チンなわけです。

f:id:bowtin:20171207005159p:plain

 

Webの世界に置き換えてみよう

実は、Web界で利用されている技術も全く同じ発想なのです。

Webの世界は、サーバとクライアントに別れます。

申請を通す「上司」が「サーバ」で、申請をあげる「社員」が「クライアント」です。

 

例えば、SNSなどで新規ユーザ登録をするとき、最近では「パスワードの文字数は8文字以上、大文字小文字を混ぜてね」などのルールがありますよね。

 

クライアントが本当にその条件を満たしてパスワードを設定してきたかどうかは、サーバが判断しているのでしょうか?

f:id:bowtin:20171207005201p:plain

 

う~ん。サーバにやらせるのは非効率ですね。しかも、Webは同時に何百人もの人がアクセスしてくるわけですから、なおさらです。

「8文字かどうかなんてお前がチェックしてから持って来いや!」って話ですね。

 

 

というわけで、用意されているのがクライアントサイドスクリプト

こいつは、Webサイト等にアクセスした時点で、自動的にサーバから送られます。

f:id:bowtin:20171207005203p:plain

 

 

Google ChromeInternet Explorer等のブラウザと呼ばれるソフトウェアが、送られたプログラムを解析し、ユーザが入力してきたデータなどをチェックしてからサーバへ送信していきます。

 

これに対し、サーバ側でしかできないような処理(例えば、全員のデータの一元管理等)を、サーバサイドスクリプトと呼んでいきます。

 

うまくできていますね・・・。

 

ちなみに、プログラミング言語もそれぞれでわかれていることが多く、

クライアントサイドは近年ではJavaScriptが多く

サーバサイドはJavaPHPC#

というように、様々な言語が用いられています。

 

ブラウザを使って、サーバからクライアントサイドスクリプトの内容を確認する方法もありますが、長くなってしまうのでそれはまたの機会にしましょう。

 

ではまた!

 

 

 

 

 

Java SE 9の新機能!jshellって何?

こんにちは!

 

Java SE 8が発表され、あれよあれよと言う間にもうJava SE 9の発表。

ついでにJava EE 8なんかも発表されちゃってます。

 

時代についていくのは大変ですが、せっかくなのでJava SE 9の魅力を一つ、ご紹介したいと思います。

 

Javaの学習はめんどくさい!?

実は私はよく新入社員研修講師として登壇したりしていまして、よく「Javaの勉強ってめんどくさいんですが、何かいい方法無いですか?」なんていう相談をもらいます。

 

う~ん。確かに。

テキストエディタでやってるとしたら、メモ帳出して、class定義して、mainメソッドなんていうよくわからないオマジナイを書いて、やっとSystem.out.println()。

最後にjavacでコンパイルして、javaで実行。

 

まさにその通り、めんどくさいですね!

 

実はこれを解決するとんでもないモノが・・・。

 

jShell

Java SE 9 をインストールすると、インストールディレクトリの中にbinフォルダがありまして、その中にjshell.exeっていうファイルがあります。

f:id:bowtin:20171205172207p:plain

こいつですね。

f:id:bowtin:20171205172237p:plain

 

そのまま実行してやると・・・

この通り。

f:id:bowtin:20171205172739p:plain

あとは、クラス定義とかめんどくさい手順はすべて省いて、いわゆるmainメソッドの中に書きたいものをコマンド感覚でじゃんじゃん書いてやればOKです。

 

Hello Worldもこの通り。

f:id:bowtin:20171205172837p:plain

 

計算もこんな感じ。

f:id:bowtin:20171205172848p:plain

f:id:bowtin:20171205172852p:plain

 

変数は、実はSystem.out.println()すら省いてしまって変数名だけ書いてしまってもOKです。

 

お手軽に試して見ては如何でしょう?

 

Java SE 9のダウンロードはこちらから!!