30代半ばの事務職員がITエンジニアになった話

おおよそタイトルのとおり、30代半ばにしてITエンジニアのタマゴになってしまった会社員の話

【Windows】EFI Shell version xx [x.xxx]と表示されて起動しない

Windows10のPCを
立ち上げようと思ったら
いきなり

EFI Shell version xx [x.xxx]
Current running mode x.x.x
Device mapping table
 blk0 :BlockDevice - Alias (null)
          PciRoot(0x0)/Pci(0x11,0x0)/Sata(0x1,0x0)
 blk1
 ・
 ・
 ・
Press ESC in 1 seconds to skip startup.nsh, any other key to continue.
Shell>

DOS画面に表示され
Windowsが起動しない事象に遭遇

とりあえず

Shell>exit

exitと入れて終了させると


BIOS(UEFI)が起動


BIOSを終了すると
再起動するものの
またEFI Shellの画面で
エンドレス

原因


調べたところ、
EFI Shellとは
ブートするデバイスを選ぶ機能

この画面がでるということは
起動用の
ハードディスクが認識されていない
ということ


BIOS(UEFI)の画面のステータス
みたいなところを確認すると

HDD Not Present

の文字
確かにHDDが認識されていない…


今日び内臓HDDのみに重要なデータを
保管しているわけでもないので、
最悪ハードが死んでも
大丈夫といえば大丈夫だけど

やっぱり地味に痛い


そんなに古いわけでもないし
まさかハードディスク逝ってないよなぁ
まさかなぁ、とか思いながら
デスクトップのケースを開ける


SATAケーブルや電源ケーブルくらいなら
買い替えれば何とかなる
抜きさししたり、
別のポートにさしたり、、
少しづつ祈るような気持ちになってくる
のは否めない


そして

Blue-rayドライブにささってた
SATAケーブルを拝借して
ハードディスクにさし替えると
認識された!起動

「まぁそんなとこだよな」
という気持ちよりも
「よかったマジで」
のほうが最終的には
勝ったという
ちょっと焦った話

【Java】サーブレット・jsp間のデータ受け渡し方法と、SubmitしてPOST・GETでリクエストを送信するとデータが重複して送られてくる件

JavaでWebアプリケーションを開発中


たいがい多いのは
サーブレットjspを連携
させるパターン


サーブレットjsp間で
POST・GETで数値をやりとり
という概念を理解するのに
なかなか苦労した


っていうかPHPだったら
こんなに苦もなく
htmlに組み込んで書けるのに


とは思うけど今は
いろんな言語を覚えることが
きっと何かの役にたつ(はず)


で、いろいろ試行錯誤して考えたのが

可変の2次元配列でデータ受け渡し


2次元配列というと

String[][]

あたりが思い浮かぶけど
これは先に上限値を設定
しないといけないので
個人的には使いにくい


なので

ArrayList<ArrayList<String>>


可変の2次元配列を使用して
java側でDBのデータを取得し
サーブレットに送った上で
jspに渡したり


jspからPOST・GETで送られた
データをサーブレット
2次元配列として受け取ったり



具体的にはjsp側で

<form method="post">
<input type='text' name='y[]' value=''>
<input type='text' name='z[]' value=''>
<input type="submit" name="submit" value="submit">
</form>

的なかんじで
配列のデータをPOSTで送る



サーブレットでは

public static ArrayList<ArrayList<String>> x;
…
ArrayList<String> xx = new ArrayList<String>();
if なんちゃらかんちゃら
for なんちゃらかんちゃら
xx.add(request.getParameterValues("y[i]"));
xx.add(request.getParameterValues("z[i]"));
…
x.add(xx);

的なかんじで
受け取ったPOSTの配列を
可変2次元配列に格納する


受け取ったデータを表示すると
なぜか重複して送られてきている…
エラーはでてない


原因として目がいくのは
ifとかforのあたりなわけで
何度も見直したけど
たぶん間違いはない



よくよく挙動を見ると
1回目のSubmitでは
正常なデータで
2回目のSubmitで
重複したデータ


いつも2回目でおかしいと
思って止めてしまっていて
謎が解けなかったけど
3回目で送信すると
データが3重になった!


ということでやっと
変数が初期化されていない
ことに気づく

public static ArrayList<ArrayList<String>> x;
…
x = new ArrayList<ArrayList<String>>();
ArrayList<String> xx = new ArrayList<String>();
if なんちゃらかんちゃら
for なんちゃらかんちゃら
xx.add(request.getParameterValues("y[i]"));
xx.add(request.getParameterValues("z[i]"));
…
x.add(xx);


変数を初期化する
new ~ を追加して
やっと解決
これで費やした時間
実に約1日…



とりあえず動けばいいや的なノリで
コードを書いてしまうことが多くて
変数の宣言やら初期化やら
はしょってしまうことがあるのですが


やっぱりそれぞれにちゃんと
意味があって
まずは教科書通りにやらないと
時間を無駄にするんだなぁ、と教訓

【VBS】特定のフォルダにファイルが作成されたら自動的にメールに添付して送りたい

最近、ここに投稿するネタがないなぁ
とか思ってたわけですが、


ここのところもっぱら
つまらない資料作成と、
くだらない社内調整と、
意味のない打ち合わせに
終始していたから。


たとえ忙しかったとしても
アウトプットするものが
ないってことは
やはり無駄な時間を過ごしていた
と切に感じるのでありました。



で、久々にお題がでたわけで
(こういうのを待ってた)

サーバー内の特定のフォルダにファイルが自動作成されるので作成次第、メールで送りたい


環境はWindows Server
さて、どうするか。


タスクスケジューラを使うのは確定として
トリガーは?

ファイルが作成されたことをログからとる?

Windowsのシステムに関するログは
どこかにはあるんだろうけど、、
ハードルが高そうなので却下。


あとタスクスケジューラからの
メールも可能だけど
添付ファイルはつけられないっぽい
のでこちらも却下。


結局、

VBSでコードを書いて毎日実行


作成日付が当日のファイルがあれば
メールに添付して送付という
条件分岐をVBで書いて
VBSファイルにして保存
タスクスケジューラから毎日実行

'変数の宣言
Dim objFileSys
Dim objFolder
Dim objFile
Dim today
Dim AttachFlag

'メールを扱うオブジェクトを作成
Set objMail = CreateObject("CDO.Message")
'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
'フォルダを設定
Set objFolder = objFileSys.GetFolder("C:\xxx\test")
'当日日付の取得
today = Left(Now(),10)
'添付フラグ
AttachFlag = 0

'送信元
objMail.From = "xxx@xxx.co.jp"
'宛先
objMail.To = "xxx@xxx.co.jp"
'CC
objMail.Cc = "xxx@xxx.co.jp"
'FolderオブジェクトのFilesプロパティからFileオブジェクトを取得
For Each objFile In objFolder.Files
  '取得したファイルの作成日が本日ならをファイルを添付およびフラグON
  If Left(objFile.DateCreated,10) = today Then
    objMail.AddAttachment objFolder & "\" & objFile.Name
  AttachFlag = 1
  End If
Next
objMail.Subject = "件名"
objMail.TextBody = "本文"

'送信方法
objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
'SMTPサーバ
objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.x.x"
'SMTPポート
objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
'SSL通信をしない
objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
'SMTP認証
'objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
'SMTP送信ユーザ名 指定なし
'objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxx@xxx.com"
'SMTP送信ユーザパスワード 指定なし
'objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxx"
'タイムアウト 指定なし
'objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
'更新、必要な処理らしい
objMail.Configuration.Fields.Update
'添付ファイルがあればメールを送信
If AttachFlag = 1 Then
  objMail.Send
End If
'変数をリセット
Set objMail = Nothing
Set objFileSys = Nothing

【Windows】Start PXE over IPv4 および IPv6と表示されて起動しない

Windows10のPCを
立ち上げようと思ったら
いきなり

>>Checking Media Presence
>>Media Present
>>Start PXE over IPv4.

DOS画面に表示され
Windowsが起動しない事象に遭遇


しばらく待つと

>>Checking Media Presence
>>Media Present
>>Start PXE over IPv6.

IPv6に表示が変わり


さらに待つと
BIOSが起動


BIOSを終了すると
再起動するものの
またいちばん最初の画面で
エンドレス

回避方法


Windowsのブートには
デフォルトの
ハードディスク以外に
DVDやらUSB、
はたまた今やネットから
OSを起動できるらしい


Windows98の頃は
フロッピーからブートが
定番だったが進化したものだ


で、IPv4とか6の文字から
推測できるように
ネットからのOSブート機能が
原因らしい


おそらくWindowsのアップデート
あたりで、おせっかいにも
この辺の機能を触られて
おかしな挙動になった気がする


なので
BIOSの設定から

UEFI:IP4 GBE Family Controller     Enable
UEFI:IP6 GBE Family Controller     Enable

みたいな項目を見つけ出して
これを

UEFI:IP4 GBE Family Controller     Disable
UEFI:IP6 GBE Family Controller     Disable

無効に変更


BIOSを保存&終了して再起動
無事、Windows起動


しかし、中級者以上ならいざ知れず
初心者がこんな画面に出くわしたら
絶対対処しきれないと思うのだが…


とは言え、現代は
ほかのデバイスからいくらでも
ネットにアクセスできるから

GooGle先生に聞けば
たいがい何とかなるか

【SQL】新年になったらデータが消えた SYSDATEとADD_MONTHS

新年あけまして出社早々、
データが消えたとかでお怒りの
電話をいただきました。


テーブルとSQLの仕様

※DBはOracle
テーブル構造

NENGETU
201810
201811
201812

データをとってくるSQL

SELECT * FROM TABLE WHERE NENGETU BETWEEN TO_CHAR(ADD_MONTHS(SYSDATE, -27), 'YYYY') * 100 + 4 AND TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'YYYY') * 100 + TO_CHAR(SYSDATE, 'MM') -1

こんな感じで3年前の4月から先月までのデータをとってくる

が、

よく見ると

TO_CHAR(SYSDATE, 'MM') -1

単純にシステム日付の月からマイナスしている
そうすると計算結果は

201800


つまり201603から201800までの
データをとってくるSQLになり
ほとんどの "データが消えた"


なので

TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'MM') 

ADD_MOTNHSをつけてあげることで
ちゃんと201812となるように修正



2018年から新たに動きはじめた
システムで年度が変わるまで
気づかなかったという
お粗末な話…

Linux(Ubuntu)にいれたMySQLにWindowsのEclipseからアクセスする ~その3~ Eclipseの文字コード設定

同じLANの中でつかっている
Linux内のMySQL
別のWindowsPCの
Eclipse環境からアクセスし、
MySQLサーバーへの
読み書きまでできました。


しかしながら
英数字なら問題ないのですが
日本語は文字化けという
はい、お約束のエラー発生。


Eclipse側の設定


EclipseでのJavaアプリケーション開発は

サーブレットでDBにアクセス
DBの値を取得
取得した値を変数に格納
PostまたはGetでjspファイルに送る
jspはサーブレットからPostまたはGetで値を受け取り
画面に表示

今のところ、こんな方式


ところが、
jspにPost・Getで受け渡す際、
受け取り側ではUnicode
文字を解釈してしまうとのことで
これが文字化けの原因らしい


なので
サーブレット側には
文字コードエンコードの指定を入れて

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 request.setCharacterEncoding("UTF-8");

jsp側にも

<form method="post" accept-charset="UTF-8">

データを送る際の文字コードを指定

System.out.println(request.getParameter(変数));

コンソールに変数を出力してみると
文字化けが解消しているので
Eclipse側はこれで解決


もちろんMySQLにも
まだまだ設定が必要

Linux(Ubuntu)にいれたMySQLにWindowsのEclipseからアクセスする ~その2~

同じLANの中でつかっているLinux内の
MySQLに別のWindowsPCの
Eclipse環境からアクセスを試みます。

前回Eclipse側の設定をしましたが、
まだエラーがでているので
MySQLの設定を確認します。

MySQLの権限を確認


Eclipse側の設定を変更し
再度接続を試みるもエラー発生

ただエラーの内容が変わっていて

 Access deny なんちゃら

つまりアクセスが拒否されているので
MySQLの設定を確認



MySQL側の設定は
MySQLに外部ホストから接続できるように設定する – ABC Blog
を参考に

 192.168.1.xxx

のアドレスからの接続を許可する
ユーザー、user1を作成


が、訳もわからず
とりあえず手本どおりに
コマンドを入れていたため

 GRANT ALL PRIVILEGES ON 'client_data'.* TO 'user1'@'192.168.1.%' WITH GRANT OPTION

となっていた


実際の環境にはclient_dataという
スキーマはなく
そこになんでも操作可能!
な権限をつけても意味がなかった
というわけ


なのでこちらを実際のスキーマ

 GRANT ALL PRIVILEGES ON 'testdb'.* TO 'user1'@'192.168.1.%' WITH GRANT OPTION

に変更し
やっと接続成功

SSLの設定をFalseに


接続はできたものの
ワーニングメッセージが発生

WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. 

どうやらMySQL5.5以降では
SSL通信をするかしないかを
明示しなければならないらしい


ワーニングなので
放っておいても接続はできるが
エラーにも詳しく書いてあるので

DriverManager.getConnection("jdbc:mysql://192.168.1.xxx/testdb?useSSL=false", "user1", "password");

と変更
ワーニングメッセージ解消