ブロックチェーンアプリケーション開発本の特徴

ブロックチェーンアプリケーション開発の教科書

ページ数が多くたくさんのことが書かれている。
ブロックチェーンの技術の歴史、技術解説、応用事例の紹介が充実している。
導入資料として最適だが、スマートコントラクトのサンプルコードが少ない。

堅牢なスマートコントラクト開発のためのブロックチェーン[技術] 入門

ブロックチェーンの技術解説が平易な言葉で書かれている。
暗号技術の解説、セキュリティプラクティスが充実している。
導入部の説明もありサンプルコードもあり、バランスが取れている。
セキュリティ回りの資料として最適。
ブロックチェーンをさくっと学ぶ資料としても最適。

はじめてのブロックチェーンアプリケーション

ブロックチェーンの導入部の説明がほとんどないが、スマートコントラクトのサンプルコードの解説が充実している。
スマートコントラクトの実装資料として最適。

屍の上の幸せ 第1話 謎の出社拒否

 「あの現場には絶対に戻りたくない。」

 Aさんはそう言い放った。Aさんは、以前いたプロジェクトで体調を崩し、私がいたプロジェクトに異動して来た。異動からしばらく経ったある日、体調も回復してきただろうから前のプロジェクトに戻るようにと上司から言われたとき、そう言った。そして、Aさんは会社に来なくなった。

 Aさんが言った「あの現場」は、社内でも有名な炎上プロジェクトだった。平日は毎日終電帰りで、休日も出勤している人がいると、私もそのプロジェクトにいる同期から聞いていた。ただ、そのプロジェクトにいたAさんが出社拒否してまで戻りたくないと意思表示するのを目の当たりにして、どうやら相当大変なことが起きていると初めて感じた。

 私の働いている業界では、終電帰りも休日出勤も珍しいことではない。私も、今いるプロジェクトで250時間残業した月もあった。ゴールデンウィークも正月休みもない年もあった。長時間勤務に加え、顧客、あるいは上司からの叱責で体調を崩す人もいた。しかし、あからさまな出社拒否は1件しか見たことがなかった。その1件の出社拒否は、退職の決まっている人が退職日まで会社に来ることを拒否するというもので、世間一般では出社拒否に当たらず大ごとではなかった。

 Aさんの出社拒否は退職の意思がない無断欠勤で、会社の就業規則に照らせば懲戒事由に当たる。そのリスクを取ってまで戻らないことを意思表示するというのは、尋常ではない。

 結局、Aさんが前のプロジェクトに戻ることはなかった。Aさんの主張が会社に通じたのかどうかはわからないが、気がついたらAさんはさらに別のプロジェクトに異動になっていた。

 この出来事からしばらく後、まさか自分が「あの現場」に異動することになるとは、当時は夢にも思わなかった。


―本文章の登場人物はすべて架空の存在であり、故人あるいは存命のいかなる人物とも無関係である。また、文章の背景をなす出来事は当時の現実におおむね依拠しているものの、改変が施された箇所や、想像によって創り出された箇所がある。

―本文中、差別表現と見なされかねない表記が若干あるが、登場人物のリアリティに照らし、どうかご容赦いただければと思う。差別助長を意図しての使用ではない。

―執筆にあたって参考にした文献・映像資料のうち主要なものの一覧を下に掲げる。

 ★文献(刊行年次順)
鶴見済完全自殺マニュアル』、1993年
ジム・E. レーヤー『メンタル・タフネス―ストレスで強くなる』、1998年
うつ気分障害協会『「うつ」からの社会復帰ガイド』、2004年
高橋祥友『自殺予防』、2006年
Scott Berkun『アート・オブ・プロジェクトマネジメント ―マイクロソフトで培われた実践手法』、2006年
苫米地英人『洗脳 スピリチュアルの妄言と精神防衛テクニック』、2008年
斎藤環『「社会的うつ病」の治し方―人間関係をどう見直すか』、2011年
弁護士法人Martial Arts『労働事件 使用者のための“反論”マニュアル―紛争類型別』、2011年
井上芳保・近藤誠・浜六郎・松本光正・名取春彦・梶原公子・竹中健・村岡潔『健康不安と過剰医療の時代』、2012年
森崎修司『なぜ重大な問題を見逃すのか? 間違いだらけの設計レビュー』、2013年
ウィリアム・K.クルーガー『ありふれた祈り』、2014年
昭文社 地図 編集部『山と高原地図 富士山 御坂・愛鷹山 2015』、2015年
見波利幸『心が折れる職場』、2016年
松浦寿輝『名誉と恍惚』、2017年

 ★映像資料(DVD)
ジェームズ・ヴァンダービルト『ニュースの真相』、2015年

IE操作

機能

Internet Explorerを起動し、Google検索を実行する。

前提

ソースコード

ScrennLogin.vbs

Option Explicit

'引数のチェック
if WScript.Arguments.Count < 2 then
    WScript.echo("too few arguments.")
    WScript.Quit(-1)
end if

Dim url
url = WScript.Arguments(0)

Dim researchWord
researchWord = WScript.Arguments(1)

if (Len(url) < 0) then
    WScript.echo("URL is not set.")
    WScript.Quit(-1)
end if

if (Len(researchWord) < 0) then
    WScript.echo("research word is not set.")
    WScript.Quit(-1)
end if
  
use_ie
  
' IE用 Subプロシージャ
Sub use_ie()
  
    Dim ie  ' IE用変数
    Set ie = CreateObject("InternetExplorer.Application")   ' IE起動
    ie.Navigate url  ' URL
    ie.Visible = True   ' IEの可視化
    waitIE ie   ' IEの起動待機
  
    ' キーワード入力
    ie.Document.getElementById("lst-ib").Value = researchWord
    WScript.Sleep 1000
    ' 検索ボタンクリック
    ie.Document.all("btnG").Click
  
End Sub
  
' IEがビジー状態の間待ちます
Sub waitIE(ie)
    Do While ie.Busy = True Or ie.readystate <> 4
        WScript.Sleep 1000
    Loop
End Sub

実行.bat

@echo off
set URL=https://www.google.co.jp/
set RESEARCH_WORD=abc

cscript ScrennLogin.vbs %URL% %RESEARCH_WORD%

ファイルの文字コード解析

機能

Javaファイル、XMLファイル、プロパティファイルに対して、文字コードの解析とBOMの有無の判定をする。

入出力

入力

入力フォルダ内に解析対象のファイルを格納する。
入力画面

出力

出力フォルダ内に「Result_実行日時.txt」が出力される。
出力画面

Result_20180127135351.txt
C:\input\SJIS.java	UTF-8 BOM無
C:\input\UTF-8.java	UTF-8 BOM無
C:\input\UTF-8.properties	UTF-8 BOM無
C:\input\UTF-8.xml	UTF-8 BOM無
C:\input\UTF-8BOM.java	UTF-8 BOM有

前提

ソースコード

extractEncoding.js

var TARGET_FOLDER = "C:\\input";
var RESULT_FOLDER = "C:\\output"
var FILE_PATTERN = /\.java$|\.xml$|\.properties/;

main();

function main() {
    var shell = new ActiveXObject("WScript.Shell");
    var resultFileFolder = shell.ExpandEnvironmentStrings(RESULT_FOLDER);
    var resultFileName = "Result_" + formatYyyymmddhhmmss(new Date) + ".txt";
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var resultTextStream = fso.GetFolder(resultFileFolder).CreateTextFile(resultFileName);
    for (var filePaths = new Enumerator(getFilePathsRecursive(fso.GetFolder(TARGET_FOLDER), FILE_PATTERN)) ; !filePaths.atEnd() ; filePaths.moveNext()) {
        resultTextStream.WriteLine(getFileCharCode(filePaths.item()));
    }    
    resultTextStream.Close();
    Editor.FileOpen(resultFileFolder + "\\" + resultFileName);
}

function formatYyyymmddhhmmss(date) {
    var ret = "";
    ret += date.getFullYear();
    ret += ("0" + (date.getMonth() + 1)).slice(-2);
    ret += ("0" + date.getDate()).slice(-2);
    ret += ("0" + date.getHours()).slice(-2);
    ret += ("0" + date.getMinutes()).slice(-2);
    ret += ("0" + date.getSeconds()).slice(-2);
    return ret;
}

function getFilePathsRecursive(folder, pattern) {
    var array = [];
    for (var files = new Enumerator(folder.Files) ; !files.atEnd() ; files.moveNext()) {
        var file = files.item();
        if (pattern.test(file.Name)) {
            array.push(folder.Path + "\\" + file.Name);
        }
    }
    for (var subFolders = new Enumerator(folder.SubFolders) ; !subFolders.atEnd() ; subFolders.moveNext()) {
        var newArray = array.concat(getFilePathsRecursive(subFolders.item(), pattern));
        array = newArray;
    }
    return array;
}

function getFileCharCode(filePath) {
    var charCode = "";
    var stream = new ActiveXObject("ADODB.Stream");
    stream.Open();
    stream.Type = 1;
    stream.LoadFromFile(filePath);
    if (stream.Size > 1) {
        stream.Position = 0;
        switch (bytes2hex(stream.Read(2))) {
            case "feff":
                charCode = "UTF-16 BOM有(BE)";
                break;
            case "fffe":
                charCode = "UTF-16 BOM有(LE)";
                break;
        }
    }
    if (charCode === "" && stream.Size > 2) {
        stream.Position = 0;
        switch (bytes2hex(stream.Read(3))) {
            case "2b2f76":
                charCode = "UTF-7 BOM有";
                break;
            case "efbbbf":
                charCode = "UTF-8 BOM有";
                break;
        }
    }
    stream.Close();
    if (charCode === "") {
        Editor.Sleep(20);
        switch (Editor.GetCharCode()) {
            case 0:
                charCode = "SJIS";
                break;
            case 1:
                charCode = "JIS";
                break;
            case 2:
                charCode = "EUC";
                break;
            case 3:
                charCode = "UTF-16 BOM無";
                break;
            case 4:
                charCode = "UTF-8 BOM無";
                break;
            case 5:
                charCode = "UTF-7 BOM無";
                break;
            case 6:
                charCode = "UTF-16BE";
                break;
            case 7:
                charCode = "CESU-8";
                break;
            case 8:
                charCode = "Latin1";
                break;
            case 90:
                charCode = "CP_ACP";
                break;
            case 91:
                charCode = "CP_OEM";
                break;
            default:
                charCode = "Unknown";
                break;
        }
        Editor.FileClose();
    }
    return filePath + "\t" + charCode;
}

function bytes2hex(bytes) {
    var doc = new ActiveXObject("Msxml2.DOMDocument");
    var element = doc.createElement("hex");
    element.dataType = "bin.hex";
    element.nodeTypedValue = bytes;
    var hex = element.text;
    return hex;
}

実行.bat

"C:\Program Files (x86)\sakura\sakura.exe" -M="C:\tool\extractEncoding.js"

インストール時の留意点

  • extractEncoding.jsの文字コードSJISにする。
  • 入力フォルダパス、出力フォルダパスに日本語を使用しない。

参考文献

qiita.com