順次、選択、そして繰り返し

プログラミングのことやITのこと、たまに演劇のことも書きます。

CI(メモ)

CIとは

  • 継続的インテグレーション(Continuous Integration)
  • アプリケーション作成時の品質改善や納期の短縮のための習慣のことである。
    • コードを修正する度にコンパイル、テスト、デプロイを行うこと。
なぜコードを修正するたびにコンパイル、テスト、デプロイをする必要があるか
  • 早期にバグの検知と原因箇所が発見しやすい
    • 10行コードを修正した後に発見するバグと100行コードを修正した後に発見するバグでは原因の範囲が異なる
    • 範囲が狭いほうがバグの場所がわかりやすい
しかし、手動でコンパイル、テスト、デプロイをするのは面倒
javac Test.java
java Test

そこでCIツールであるJenkins

Jenkinsのメリット
  • 繰り返し作業の自動化
    • 軽微なソースコードを修正したとしてもコンパイル、テスト、デプロイを自動化することで作業時間を短縮することができる
  • 属人化を防ぐ
    • コンパイルやデプロイといった作業をJenkinsに登録することでビルド・デプロイ手順を知らない人でもボタン1つで実行環境を更新することができる
  • プラグインによる機能拡張が豊富

数値リテラルについて

2進リテラル


Java7から先頭に0bを入れることで2進数として判定されるようになった。

ソースコード
int val1 = 20;
int val2 = 024;
int val3 = 0x14;
int val4 = 0b10100;

System.out.println("10進数:" + val1);
System.out.println("8進数:" + val2);
System.out.println("16進数:" + val3);
System.out.println("2進数:" + val4);
実行結果
10進数:20
8進数:20
16進数:20
2進数:20

アンダースコアがある数値リテラル


Java7から数値リテラルを扱うときに数字の途中に「_」を使用できるようになった。 桁数の大きな数値リテラルの可読性を高めるときに使用する。

ソースコード
int val5 = 2_0;
int val6 = 02_4;
int val7 = 0x1_4;
int val8 = 0b1_0_1_0_0;

System.out.println("10進数:" + val5);
System.out.println("8進数:" + val6);
System.out.println("16進数:" + val7);
System.out.println("2進数:" + val8);
実行結果
10進数:20
8進数:20
16進数:20
2進数:20

数値リテラルの中に「_」を使用する場合、以下の場所には使用できない。

  • リテラルの先頭、末尾は使用できない
  • 浮動小数リテラルにある小数点の前後には使用できない
  • float値やlong値を表すfやLなどの前には使用できない
  • 16進数で使用する0xや2進数の0bの途中及び前後には使用できない

NIO.2について

NIO.2(New I/O 2)とはJava7から登場した新しいファイルシステムインターフェースのこと。

Java6まではファイルの属性の取得・設定やディレクトリの監視をすることができなかったため、それらの処理ができるインターフェースをNIO.2として用意された。

NIO.2の関連パッケージ


java.nio.file

ファイル、ファイル属性及びファイルシステムにアクセスするためのインターフェースとクラスが提供されている。

Class or Interface 名前 説明
Interface Path ファイルシステム内のファイルを特定するために使用するシステムに依存するファイルパスを表す
Class Paths パス文字列パス文字列またはURIを変換してPathオブジェクトを返すstaticメソッドを提供
Class FileSystems ファイルシステム用のファクトリクラス。
Class FileSystem ファイルシステムへのインタフェースを提供し、ファイルシステム内のファイルやその他のオブジェクトにアクセスするための手段を提供する

Pathインタフェース

Paths.get()の挙動
//Paths.get()では環境に応じたパスを持ったPathオブジェクトを返す
//path1ではファイルセパレータが"/"から"\"に変換されている
Path path1 = Paths.get("test/hoge.txt");
Path path2 = Paths.get("F:\\GitRepository");
Path path3 = Paths.get("F:","GitRepository");

System.out.println("path1:" + path1);
System.out.println("path2:" + path2);
System.out.println("path3:" + path3);
Paths.get()実行結果
path1:test\hoge.txt
path2:F:\GitRepository
path3:F:\GitRepository
Pathインタフェースの主なメソッド
Path path4 = Paths.get("F:\\GitRepository\\hoge.txt");

//パスの文字列表現を返す
System.out.println("toString:" + path4.toString());

//名前要素シーケンスの最後を返す
System.out.println("getFileName:" + path4.getFileName());

//指定したインデックスに対するパス要素を返す。0番目はルートに最も近い要素
System.out.println("getName(0):" + path4.getName(0));

//パス内の要素数を返す
System.out.println("getNameCount:" + path4.getNameCount());

//パスのルートを返す
System.out.println("getRoot:" + path4.getRoot());

//親ディレクトリのパスを返す
System.out.println("getParent:" + path4.getParent());

//開始インデックスから終了インデックス-1の要素を取得
System.out.println("subpath0-2:" + path4.subpath(0, 2));
System.out.println("subpath1-2:" + path4.subpath(1, 2));

Path path5 = Paths.get("./hoge.txt");

//冗長な名前要素を削除したパスを返す
System.out.println("normalize:" + path5.normalize());

//パスを表すURIを返す
System.out.println("toUri:" + path5.toUri());

//絶対パスか判定絶対パスの場合はTrue
System.out.println("isAbsolute:" + path5.isAbsolute());

//絶対パスを返す
System.out.println("toAbsolutePath:" + path5.toAbsolutePath());

//既存ファイルの実際のパスを返す
try {

    //既存ファイルの実際のパスを返す
    System.out.println("toRealPath:" + path5.toRealPath());
} catch (IOException e) {

    e.printStackTrace();
}

//パスの結合(引数が絶対パスの場合は引数の値が返ってくる)
Path path6 = Paths.get("hogehoge");
Path path7 = Paths.get("test");
System.out.println("resolve:" + path6.resolve(path7));

//指定されたパス間の相対パスを返す
System.out.println("relativize:" + path6.relativize(path7));
実行結果
toString:F:\GitRepository\hoge.txt
getFileName:hoge.txt
getName(0):GitRepository
getNameCount:2
getRoot:F:\
getParent:F:\GitRepository
subpath0-2:GitRepository\hoge.txt
subpath1-2:hoge.txt
normalize:hoge.txt
toUri:file:///F:/GitRepository/AppRepository/workspace/JavaWork/./hoge.txt
isAbsolute:false
toAbsolutePath:F:\GitRepository\AppRepository\workspace\JavaWork\.\hoge.txt
toRealPath:F:\GitRepository\AppRepository\workspace\JavaWork\hoge.txt
resolve:hogehoge\test
relativize:..\test

Filesクラス

ファイル、ディレクトリなどを操作するクラス staticメソッドだけで構成されている

Filesクラスの主なメソッド
Path path1 = Paths.get("hogeDir");
Path path2 = Paths.get("F:\\GitRepository\\AppRepository\\workspace\\JavaWork\\hogeDir");
Path path3 = Paths.get("hoge.txt");

//ファイルの存在確認
System.out.println("exists:" + Files.exists(path1));

try {
    //2つのパスが同じファイルを検出するかテストする
    System.out.println("isSameFile:" + Files.isSameFile(path1, path2));
} catch (IOException e) {

    e.printStackTrace();
}

//このパスがディレクトリかテストする
System.out.println("isDirectory:" + Files.isDirectory(path1));

//通常ファイルかテストする
System.out.println("isRegularFile:" + Files.isRegularFile(path1));

//読み取り可能かテストする
System.out.println("isReadable:" + Files.isReadable(path3));

//実行可能かテストする
System.out.println("isExecutable:" + Files.isExecutable(path2));

Path path4 = Paths.get("hogeDir2");

try {
    //ディレクトリの作成
    Files.createDirectory(path4);

    //ディレクトリの削除
    Files.delete(path4);

    //ディレクトリが存在した場合は削除する
    System.out.println("deleteExists:" + Files.deleteIfExists(path4));

} catch (IOException e) {

    e.printStackTrace();
}

Path path5 = Paths.get("hoge2.txt");
Path path6 = Paths.get("hoge2copy.txt");

try {

    //コピーする
    Files.copy(path5, path6, StandardCopyOption.REPLACE_EXISTING);

    //移動またはリネームする
    Files.move(path6, path5, StandardCopyOption.REPLACE_EXISTING);


    //ファイルデータの読み込み
    List<String> list = Files.readAllLines(path3);

    for(String str : list) {
        System.out.println("読み込み行:" + str);
    }


} catch (IOException e) {

    e.printStackTrace();
}
実行結果
exists:true
isSameFile:true
isDirectory:true
isRegularFile:false
isReadable:true
isExecutable:true
deleteExists:false
読み込み行:ほげほげほげ
読み込み行:ホゲホゲホゲ

java.nio.file.attribute

ファイル及びファイルシステム属性にアクセスするためのインターフェースとクラスが提供されている

Class or Interface 名前 説明
Class FileTime ファイルのタイムスタンプ属性の値を表す
Interface FileAttribute 新しいファイル・ディレクトリを作成するときに自動的に設定できるファイル属性を表すオブジェクト
Interface BasicFileAttributes すべてのファイルシステム実装で必要となる基本的な属性を表すオブジェクト
Interface DosFileAttributes DOS属性をサポートするファイルシステムで使用される属性が追加されている
Interface PosixFileAttributes POSIX標準ファミリをサポートするファイルシステムで使用される属性が追加されている
Files.geAttribute()の挙動
Path path1 = Paths.get("hoge.txt");

try {

    //作成日
    Object obj1 = Files.getAttribute(path1, "creationTime");

    //最終更新日
    Object obj2 = Files.getAttribute(path1, "lastModifiedTime");

    //サイズ
    Object obj3 = Files.getAttribute(path1, "size");

    System.out.println("creationTime:" + obj1);
    System.out.println("lastModifiedTime:" + obj2);
    System.out.println("size:" + obj3);

} catch (IOException e) {
    
    e.printStackTrace();
}
Files.geAttribute()実行結果
creationTime:2017-07-26T12:38:49.578851Z
lastModifiedTime:2017-07-26T14:55:17.263971Z
size:38
BasicFileAttributesの挙動
Path path1 = Paths.get("hoge.txt");

try {

    //BasicFileAttributesでメタデータを取得するパターン
    BasicFileAttributes attr = Files.readAttributes(path1, BasicFileAttributes.class);

    System.out.println("creationTime:" + attr.creationTime());
    System.out.println("lastModifiedTime:" + attr.lastModifiedTime());
    System.out.println("size:" + attr.size());


} catch (IOException e) {
    
    e.printStackTrace();
}
BasicFileAttributes実行結果
creationTime:2017-07-26T12:38:49.578851Z
lastModifiedTime:2017-07-26T14:55:17.263971Z
size:38
DosFileAttributesの挙動
Path path1 = Paths.get("hoge.txt");

try {

    //DosFileAttributesでメタデータを取得するパターン
    DosFileAttributes dosAttr = Files.readAttributes(path1, DosFileAttributes.class);

    //アーカイブ属性の値を返す
    System.out.println("isArchive:" + dosAttr.isArchive());

    //隠し属性の値を返す
    System.out.println("isHidden:" + dosAttr.isHidden());

    //読み取り専用属性の値を返す
    System.out.println("isReadOnly:" + dosAttr.isReadOnly());

    //システムの属性の値を返す
    System.out.println("isSystem:" + dosAttr.isSystem());


} catch (IOException e) {
    
    e.printStackTrace();
}
DosFileAttributes実行結果
isArchive:true
isHidden:false
isReadOnly:false
isSystem:false

ディレクトリアクセス関連メソッドの挙動

ディレクトリ・ファイルの配置状態

f:id:sndstudy:20170727234940p:plain

FileSystem fs = FileSystems.getDefault();

//ルートディレクトリを取得する
Iterable<Path> dirs = fs.getRootDirectories();

for(Path name: dirs) {

    System.out.println("RootDir:" + name);

}

Path path1 = Paths.get("hogeDir");

try {

    System.out.println();

    //ディレクトリ内を探索する(サブディレクトリ含む)
    Files.walk(path1).forEach(System.out::println);

    System.out.println();

    //ディレクトリ内を探索する(サブディレクトリは含まない)
    Files.list(path1).forEach(System.out::println);

} catch (IOException e) {

    e.printStackTrace();
}

try {

    System.out.println();

    //パスに対して条件を指定して合ったパスのみで構成されるストリームを返す
    Files.find(path1, 2, (path, attr) -> path.toString().startsWith("hogeDir\\hogehoge1")).forEach(System.out::println);;

} catch (IOException e) {
    e.printStackTrace();
}

Path path2 = Paths.get("hoge.txt");

try {

    //ファイル内のすべての行を読み取る
    System.out.println("line():" + Files.lines(path2).map(word -> word.length()).collect(Collectors.toList()));
} catch (IOException e) {
    e.printStackTrace();
}
ディレクトリアクセス関連メソッドの実行結果
RootDir:C:\
RootDir:D:\
RootDir:E:\
RootDir:F:\

hogeDir
hogeDir\hogehoge1.txt
hogeDir\hogehoge2.txt
hogeDir\hogehoge3.txt
hogeDir\hogehogeDir
hogeDir\hogehogeDir\hogehoge4.txt

hogeDir\hogehoge1.txt
hogeDir\hogehoge2.txt
hogeDir\hogehoge3.txt
hogeDir\hogehogeDir

hogeDir\hogehoge1.txt
line():[6, 6]

自作PCについて(メモ)

やりたいこと
  • マルチディスプレイ(ゆくゆくは3画面4画面にしたい)
  • プログラミングするには不自由ないスペック
  • 仮想環境立てても支障がないスペック
パーツ
パーツ 製品名 値段(ざっくり) 備考
OS Windows10 Home 64bit 15,000円 DSP
マザーボード - 15,000円 PCI Express x16スロットが複数あれば良
CPU Intel Core i5 7400 23,000円 -
メモリ CMK16GX4M2A2666C16 15,000円 16GB(8GB*2)
SSD - 10,000円 256GB
HDD - 7,000円 1TB
グラフィックボード - 10,000円 -
PCケース K282 RC-K282-KWN1-JP 7,000円 -

AWS CodeCommitでGitリポジトリを作ってみる

AWS CodeCommit はAWSが提供している完全マネージド型サービスで
プライベートGitリポジトリを簡単にホスティングできるサービス。

Gitの勉強がてらに使ってみようと思う。

AWS CodeCommitの無料枠について

内容 制限
リポジトリ 無制限
1ファイルの最大サイズ 2GB
ストレージ 50GB/月
Gitリクエスト数 10,000リクエスト/月

※上記の無料枠は最初の5人のアクティブユーザまで

個人利用だったらこの無料枠内で収まると思う。
また、GitHubみたいに公開せずに無料でGitリポジトリが使えるのがいい感じ。

AWS CodeCommitでリポジトリを作ってみる

1.「今すぐ始める」を押下する

f:id:sndstudy:20170703210449j:plain

2.「リポジトリ名」と「説明」を入力して、「リポジトリの作成」を押下する。
f:id:sndstudy:20170703210637j:plain

3.リポジトリの接続方法を確認する。
(※今回はHTTPSで接続する)
f:id:sndstudy:20170703210827j:plain

4.リポジトリが作成されていることを確認する。
f:id:sndstudy:20170703211347j:plain

↑ここまでがリポジトリの作成。
↓ここから先が作成したリポジトリに接続するための準備手順。

5.リポジトリに接続したいIAMユーザにAWS CodeCommit関連のポリシーを付与する。
(※ここでは「AWSCodeCommitFullAccess」を付与しているが本当は権限の範囲を狭めたほうがいい)
f:id:sndstudy:20170703211443j:plain

6.IAMユーザの認証タブから
「AWSCodeCommitのHTTPS Git認証情報」の
「生成」を押下する。
f:id:sndstudy:20170703211859j:plain

7.リポジトリに接続するための
「ユーザ名」と「パスワード」を確認する。
(※「証明書のダウンロード」を押下すると「ユーザ名」と「パスワード」が記載されたCSVファイルがダウンロードできる。)
f:id:sndstudy:20170703212337j:plain

8.ユーザがアクティブになっていることを確認する。
f:id:sndstudy:20170703212627j:plain

↑ここまでがリポジトリに接続するための準備手順。
↓ここから先がリポジトリへの接続手順。

9.接続したいリポジトリのURLを取得するためAWSCodeCommitにアクセスして、
「クローンURL」を押下する。
f:id:sndstudy:20170703212810j:plain

10.「HTTPS」を押下する。
f:id:sndstudy:20170703213109j:plain

11.「クローンURL」をコピーする。
f:id:sndstudy:20170703213214j:plain

12.Git Bashを用いてリポジトリのクローンをする。
f:id:sndstudy:20170703213302j:plain

13.7で確認した「ユーザ名」と「パスワード」を入力する。
f:id:sndstudy:20170703213428j:plain

14.リポジトリのクローンが成功したことを確認する。
f:id:sndstudy:20170703213529j:plain

Bluemix 大勉強会 - The Developer Focus - に参加してきた

6/21(水)開催の「Bluemix 大勉強会 - The Developer Focus -」に
参加してきました。

The Developer Focusという名の通り、開発者目線でのセッションが多かったです。

内容のレベルはBluemix初心者~中級者と書かれていたので
Bluemixを一度も触ったことが無い私は丁度いいぐらいの内容だったと思う。
(クラウドサービスではAWSを触っているので一旦AWSのサービスでいうところの……ってな感じで変換しながら聞いてた。)

しかしサービス以外の設計思想の部分でブロックチェーンなどの話をされていたときは
理解が追い付かなかったと感じた。
(やっぱりブロックチェーンについて理解する必要があるな……)

タイトル 概要や所感
Bluemixのロードマップや見どころ Watson関連のサービスでは全てのAPI・学習済みWatsonがBluemix上で提供されるようになる。
IaaSサービスでは最新のGPUが最安値で使えるようになる。
今から始める方向け!Bluemixの概要とアプリの作り方 CloudFoundly→PasSサービス。
AWSでいうとBeanstalkみたいなもの。
Bluemixで提供されているサービス・APIを組み立ててアプリを作成するイメージ。
各サービスの接続情報は「バインド」という仕組みで持っている。
今から始める方向け!Bluemixの概要とアプリの作り方
Bluemix Top10 サービス解体新書 Bluemixでよく使われているサービスのTop10紹介。
インスタンス数では「SDK for Node.js」が1位。
実行環境ではNode.jsが人気みたい。
Bluemix Top10 サービス解体新書
基幹システムとクラウドのつなげ方 IBMi(オンプレ)とBluemix(クラウド)をどう繋げるかの話。
DataConnectによるデータを統合する話。
20分でキャッチアップするBlockchain ~Hyperledger Fabric最新動向 Hyperledger FabricはThe Linux Foundationによってオープンソース化されたブロックチェーン基盤。
始めるにはDockerのイメージかBluemixのサービスからできる。
開発ツールとしてHyperledger Composerがある。JavaScriptで開発が可能。
DSX(Data Science Experience)ではじめるデータサイエンス DSXはBluemix上で提供されているデータ・サイエンス系分析の開発・実行環境のサービス。
データの取得先としてAWSサービスからも可能。
サーバーレス・アプリ開発のはじめ方 OpenWhiskの話。The Linux Foundationによってオープンソース化されている。
言語はNode.js・Python・Swift・Java・Docker(その他言語)。
Bluemix内外のサービスとの連携が簡単(SlackやGitHubなどのサービス連携が標準である。)
関数(アクション)をつなげる(シーケンス)ことも可能。
Watson IoT Platform全貌解説 Watsonと名前がついているがAIの機能は無い。
センサーデータの蓄積や可視化は有意義。
AIを使う前段階にWatson IoT Platformを使用するイメージ。
Watson IoT Platform全貌解説
Deep Security on Bluemix IaaSによるセキュリティ対策について クラウドではサーバの要塞化(多層防御)が必要。
サーバのインスタンス起動時にウイルス対策のソフトインストールするなどが必要。
バインドについて考えてみた CloudFoundlyのバインドについての話。
BluemixでのAPI公開の最初の一歩 APIConnectでAPIの定義をすることで
ポータル(APIのアクセス制限について)・マニュアルを自動で作成してくれる。
CloudFoundlyのAPIGatewayはBluemix内部で使う場合に有効。CloudFoundly同士をつなげるイメージ。
Node-REDのロードマップや見どころ GUIでノード(処理)をつなげて作成する(ASTERIA WARPみたいな感じ?)。PC・タブレットで操作可能。JavaScriptで複雑な処理を書くことが可能。
The Linux Foundationによってオープンソース化されている。
提供ノード数は1000近くある。JSONファイルからフローを読み込ませることも可能。
Watson Visual Recognition Tool で カンタン画像認識 大トロ・中トロ・赤身・サーモンの画像(教師データ)を用意して学習させるデモがあった。
簡単に画像認識のクラスを作れる。
Watson visual recognitionで簡単画像認識

ILについて(メモ)

IL 命令の実行例 - IL(.NET Framework の中間言語) | ++C++; // 未確認飛行 C
Standard ECMA-335
命令一覧
Ildasm.exe チュートリアル
Ildasm.exe (IL 逆アセンブラー)
CIL(MSIL) Opcode