読者です 読者をやめる 読者になる 読者になる

エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

Macでのスクリーンショット

開発環境
内容 ショートカット
全画面 command + shift + 3
範囲選択 command + shift + 4
アクティブウィンドウのみ 1. command + shift + 4
2. スペース
3. ウィンドウ選択

Windowsと全然違うから迷った。
ブログに画面内容を上げたいときに重宝する。

【Java9リリース前復習】不変コレクションの生成

Java 勉強

きっかけ

前書いた記事と同じ
環境準備も以前の記事を参照

suzaku-tec.hatenadiary.jp

環境準備の補足

Kitematicの Setting > Volumes を選択して、LOCAL FOLDER をバインドさせたいフォルダに指定する。
お好みだが、自分は、~/dev/notebooks を指定した。

f:id:suzaku0914:20170320181719p:plain

指定したら、念のためにコンテナを再起動する。

そうすると、HOME > WEB PREVIEW にコンテナの内容が表示される。
クリックすると、Webブラウザが立ち上がり、コンテナのファイル操作のためのサービスが立ち上がる。

不変コレクション

やっと本題。
Javaで不変コレクションを作成する場合、かなり手間があった。
実装するとなると、下記のような実装になるはず。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SampleList {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("武藤遊戯");
        list.add("遊城十代");
        list.add("不動遊星");
        list.add("九十九遊馬");
        list.add("榊遊矢");
        list = Collections.unmodifiableList(list);
        System.out.println(list);
    }
}

実行すると、下記のように表示される。

[武藤遊戯, 遊城十代, 不動遊星, 九十九遊馬, 榊遊矢]

試しに、要素を追加してみる。
ソースは下記の通り。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SampleList {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("武藤遊戯");
        list.add("遊城十代");
        list.add("不動遊星");
        list.add("九十九遊馬");
        list.add("榊遊矢");
        list = Collections.unmodifiableList(list);
        list.add("藤木遊作");
    }
}

不変リストなので要素追加できるわけはなく、下記のように実行時エラーになる。
コンパイルエラーに知れくれてもいい気はするが、話を進める。

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
    at SampleList.main(SampleList.java:16)

復習はココまで。
実際に、使うことは多い。
不変のコレクションを定数として使いたい場合がたまにあるので、知らなかった人はきちんと覚えておいたほうが良い。

Java9からの不変コレクション(List/Map/Set)

不変リスト

List<String> list = List.of("abc", "def");

この一行でOK。
試しに要素を追加してみる。
下記のソースで実施。

-> List<String> list = List.of("abc", "def")
|  Added variable list of type List<String> with initial value [abc, def]

-> list.add("Wryyyyyy!")
|  java.lang.UnsupportedOperationException thrown
|        at Collections$UnmodifiableCollection.add (Collections.java:1056)
|        at (#10:1)

追加できない!
ちゃんとできている。

これで、楽に定数宣言できる。

残りのコレクションも同様に紹介

不変マップ

Map<Integer, String> map = Map.of(1, "abc", 2, "def")

不変セット

Set<String> set = Set.of("abc", "def")

感想

とても簡単になった。
Guavaに近い形らしいが、使ったことないので、分からん!

【Java9リリース前復習】jshellまとめ

Java 勉強 開発環境 プログラミング

きっかけ

Java9のリリースまで半年をきったので、予習。
かなり前に触ったきり、使ってなかったので、予習を兼ねてやり直す。

環境準備

docker使ってJava9のイメージを使って試す。
使ったのは、java9-notebook

https://hub.docker.com/r/satoshun/java9-notebook/

起動したらexecボタンを押す。

jshell

jshellとは、JavaのREPLツール。

REPL

  • R : Read 読み込み
  • E : Eval 評価
  • P : Print 出力
  • L : Loop readへ

javaのバージョン

java -versionで内容を確認

# java -version
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+102-2016-01-21-001533.javare.4316.nc)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+102-2016-01-21-001533.javare.4316.nc, mixed mode)

jshell起動

etc/alternatives/jshell を実行。
そうすると下記の内容が出力され、jshellが起動する。

|  Welcome to JShell -- Version 9-ea
|  Type /help for help

お約束のHello World

まずは、Hello Worldの出力を確認してみる。
System.out.println("Hello World") を入力してエンターを押すと、下記の内容が出力される。

-> System.out.println("Hello World")
Hello World

ちなみに、タブ補完される。
System. を入力してタブ押下すると、下記の内容が出力される。

-> System.
Logger                 LoggerFinder           arraycopy(             class                  
clearProperty(         console()              currentTimeMillis()    err                    
exit(                  gc()                   getLogger(             getProperties()        
getProperty(           getSecurityManager()   getenv(                identityHashCode(      
in                     inheritedChannel()     lineSeparator()        load(                  
loadLibrary(           mapLibraryName(        nanoTime()             out                    
runFinalization()      runFinalizersOnExit(   setErr(                setIn(                 
setOut(                setProperties(         setProperty(           setSecurityManager(    

Javaをやっているとセミコロン(;)が必要なんじゃないかと思うかも知れないが、いらない。

変数を使ってのHello World

-> String str = "Hello World"
|  Added variable str of type String with initial value "Hello World"

-> System.out.println(str)
Hello World

でけた!

jshell終了方法

/exit を入力する。

-> /exit
|  Goodbye

コマンド

コマンド 説明
/list 入力したソースを一覧表示する
/edit 名前またはIDで参照されるソースを編集する(外部エディタの設定が必要)
/drop 名前またはIDで参照されるソースを削除する
/save ファイルにスニペット・ソースを保存する
/open ソースの入力としてファイルを開きます
/vars 宣言された変数およびその値をリストします
/methods 宣言されたメソッドおよびその署名をリストします
/types 宣言された型をリストします
/imports インポートされたアイテムをリストします
/exit jshellを終了する
/reset jshellの入力内容をリセットする
/reload リセットして関連する履歴をリプレイします
/classpath クラスパスにパスを追加します
/history 入力した内容の履歴
/help jshellに関する情報を取得します
/set jshell構成情報を設定します
/retain 後続のセッションに対してjshell構成情報を保持します
/? jshellに関する情報を取得します
/! 最後のスニペットを再実行します
/< id > IDでスニペットを再実行します
/-< n > n回前のスニペットを再実行します

コマンドを試す

随時追加予定

/list

まずは、準備として下記を入力

-> String a = "123"
-> System.out.println(a)

そしたら、/list を入力する。

-> /list

   1 : String a = "123";
   2 : System.out.println(a)

今まで入力した内容が出力される。
宣言した変数名とか処理を忘れてしまった場合は、これを使って確認するわけだね。

/edit

クラスや変数を、設定した外部エディターで編集できる。
外部エディターを設定してない場合、下記のようなエラーになる。

-> /edit
Exception in thread "main" java.awt.HeadlessException: 
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
    at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:205)
    at java.awt.Window.<init>(Window.java:535)
    at java.awt.Frame.<init>(Frame.java:422)
    at javax.swing.JFrame.<init>(JFrame.java:224)
    at jdk.internal.jshell.tool.EditPad.<init>(EditPad.java:55)
    at jdk.internal.jshell.tool.EditPad.edit(EditPad.java:118)
    at jdk.internal.jshell.tool.JShellTool.cmdEdit(JShellTool.java:1141)
    at jdk.internal.jshell.tool.JShellTool.lambda$new$23(JShellTool.java:732)
    at jdk.internal.jshell.tool.JShellTool.processCommand(JShellTool.java:550)
    at jdk.internal.jshell.tool.JShellTool.run(JShellTool.java:492)
    at jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:287)
    at jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:260)
    at jdk.internal.jshell.tool.JShellTool.main(JShellTool.java:250)

使い方は、以下の通り。

/edit <name>

参考サイト

[Java9 新機能] jshell入門 - Qiita

JavaにREPLがやってくる - mike-neckのブログ

MacにJava9を入れてjshellを動かすまでのメモ - SHIBUYA 3%

LaTeXまとめ

ドキュメント

LaTeX

Windows想定で説明
Mac使える人なら、たぶん説明しなくてもいいはず。

LaTexとは

LaTeX - Wikipedia

環境準備

Tex

TeX Liveをインストール

Installing TeX Live over the Internet - TeX Users Group

install-tl-windows.exe または install-tl.zip のどちらかを落とす。
install-tl.zip を落とした場合は、解凍後 install-tl-windows.batを実行する。
インストーラが起動したら、後は指示に従えばOK。

エディタ

基本、なんでもいい。
記述は、テキストエディタでも問題ない。
オススメは、VisualStudioCodeか付属品のTeXword editorがいい。
Atomもいいが、ターミナルがwindowsだと難しいので、あんまりオススメできない。
生成のコマンドを入力するので、ターミナル入力ができるエディタがオススメ。

PDF ファイルビューア

PDFファイルをロックしないものであればなんでもいい。
多くのサイトで進められているのは、SumatraPDFみたい。

PDFファイル生成方法

platex、dvipdfmxの実行

  1. platex {ファイル名}
  2. dvipdfmx {ファイル名}

platexを経由してPDFを出力する。
PDF以外にも出力できるので、他に出力したいものがアレば、こちらを使う。

ptex2pdfの実行

ptex2pdf -l {ファイル名}

一発でPDFを出力できる。
PDF出力をするなら、こちらを優先して使ったほうがいい。

数式関連

行内数式

数式は $ で囲む。
そすると、文字列が斜めに表示される。

別行立て数式

\begin{equation}  
\end{equation}  

で囲む。
そうすると、文字列が斜めになり、行末に番号が割り振られる。

数式番号がいらない場合、

\[  
\]  

で囲む。

上付き文字

「c の2乗」のような上付きは c^{2} のように書く。 上付きが1文字だけの場合は c2 でも可

下付き文字

「a の i 番目」のような下付きは a_{i} のように書く。
下付きが1文字だけの場合は a_i としてもかまいません。

スペース

数式中では,いくら数値と単位の間に空白を入力しても無視される。

ローマン体

科学論文のルールでは,単位は斜めのイタリック体ではなく直立したローマン体で書く。
数式中の英字は通常はイタリック体になるが、\mathrm コマンドを使うとローマン体の英字を出力できる。

分数

\frac{分子}{分母}で記述する。

円周率

\pi は π

括弧

\left( …… \right)は中身に応じて大きさが変わる括弧。

積分記号

\int積分記号 ∫
\int_{下限}^{上限}

平方根・立方根 (\sqrt)

文字列がかけないので、書かない。
使い方は、\sqrt{x}

総和・総乗 (\sum, \prod)

\sum は和の記号 ∑
\prod は積の記号 ∏

無限大 (\infty)

\infty は ∞
インフェルニティ使いなら一発で覚えられる。

三角関数 (\sin, \cos, \tan)

書いたそのまま。

対数 (\log)

これもそのまま

パッケージ(拡張機能

パッケージを使って機能拡張できる。
基本的な機能は、既に容易されている。

パッケージのインストール

sty ファイルが用意されている場合

LaTeXがインストールされた配下か、パスがとおている箇所。

sty ファイルが用意されていない場合

dtx や insファイルから、sty ファイルが含まれたパッケージを生成する必要がある。

レポート

タイトル

\title{タイトル名}  
\maketitle

他にも

\author{著者}  
\date{日付} → 作成日  

といったオプション的な内容の設定も可能。

章立て

\section{章名}

番号は自動的に出力される。番号が不要なら \section*{……} にする。

段組み

二段組にしたい場合、文書クラスのオプションに twocolumn を加える。

\documentclass[twocolumn,(オプション)]{(文書クラス)}

オプションは省略可能。

箇条書き

番号を振らない箇条書き

\begin{itemize}  
  \item {アイテム名}  
  \item {アイテム名}  
\end{itemize}

番号を振る箇条書き

\begin{enumerate}
  \item {アイテム名}  
  \item {アイテム名}  
\end{enumerate}

目次の付け方

\tableofcontents

文献リスト

\begin{thebibliography}{99}
\item
  出力内容
\end{thebibliography}

リンク

\label{ラベル名}でラベリングし、\ref{ラベル名} でリンクを作成する。
\pageref{ラベル名}で、指定したラベル名の\labelがあるページ数を出力できる。

参考サイト

TeX Live/Windows - TeX Wiki

Firefox52 アップデート機能内容まとめ

ブラウザ 開発環境

https://www.mozilla.jp/static/images/firefox/logos/header-logo-wordmark.png

提供開始日

2017年 3月 7日

更新内容

公式サイト

詳しくは、公式サイト見たほうが正確

Firefox 52 for developers - Mozilla | MDN

使うだけの人は、リリースノート見たほうが分かりやすい。
※自分はこっち側なので、こっちの情報をまとめる

Firefox 52.0 リリースノート

目立った変更内容

  • WebAssembly への対応
  • HTTPSページでの入力に警告
  • タブを別の端末へ送る
  • XP/Vistaのサポート打ち切り

WebAssembly への対応

ブラウザーをネイティブ並みの速度にするための対応。
具体的には、ブラウザーでネイティブコードを実行できるようにする対応が行われた。
MicrosoftGoogleMozillaAppleなどの共同で開発に取り組んでいるWeb標準規格で、今後のWebのあり方にかなりインパクトがあると感じている。
以前に調べたことがあるので、下記を参照。

suzaku-tec.hatenadiary.jp

HTTPSページでの入力に警告

Googleの威光をかなり強く受け継いでいる。
HTTP サイトで個人情報を入力しにくくさせる対応ですね。

タブを別の端末へ送る

タブのコンテキストメニューに、「タブを端末に送る」が追加された。

f:id:suzaku0914:20170311071523j:plain

バイスの複数保持者が今後増えることを見越した対応ですね。
自分は、PC+スマホ2台持ち。
もちろん、すべてブラウザーFirefox
たまにスマホでみたサイトをPCで見たいことがあるので、嬉しい対応。

この対応が入ったので、今後は端末間の連携としての役割もブラウザが担っていきそう。

XP/Vistaのサポート打ち切り

Vitaは早すぎな気がしないでもないが、サポート打ち切りは同意。
もう、家のPCはWindows10まで移行済みなので、全然痛くない。
痛いのは企業側かな?
どっちにしろ、XP/Vita使っているようなところは、淘汰されるのも当然か。

感想

WebAssemblyが現実味を帯びてきたのを感じる。
今後の展開は、要注目。
あとは、マルチデバイスの連携が充実していくことを願う。

Excelは嫌いだが役に立つ?DB活用法

DB ドキュメント

きっかけ

下記の記事に触発されたのと、情報処理技術者試験のDBスペシャリストを受けるにあたって書きたくなったから書いた。

tsukaeru-excel.hateblo.jp

Excelに対する考え

はっきり言うと、Office系のソフトは好きじゃない。
データをバイナリ管理しているため、差分が全然わからないんだよね。
何が変わったのか分からないから、すごくイライラすることをいっぱい感じてきた。
主に仕事で。

データを整える

DBでいうところの正規化された状態にすること。
そうすることで、分析しやすい状態になる。

データベースの鉄則

データベースとは、複数の主体で共有、利用したり、用途に応じて加工や再利用がしやすいように、一定の形式で作成、管理されたデータの集合のこと。 広義には人が紙に書いてまとめたものなどを含む場合もあるが、今日では、単にデータベースといった場合はコンピュータ上で作成、保管され、専用のソフトウェア(データベース管理システム)によって管理されるものを指すことが多い。文脈によってはデータベース管理システム(DBMS:DabaBase Management System)のことをデータベースということもある。

1行目にタイトル、2行目以降がデータ

これ鉄則。
見出しは1行目に集約させる。
グルーピングの関係で1行にできない場合は、2行にしてもいいが、分析しにくくなる。
DBも一緒。

1件1行

データが複数行に渡ることがあるが、それは分析にしくくなる。
DBだと第一正規形の状態。

空白行は不可

空白行が入るとデータが分断されていると判断され、集計・分析ができなくなる。
DBだとすべてからのレコードはありえない。
無意味なレコードは作っちゃらめぇぇぇぇ!

別の意味合いのデータ群を作る場合は、シートを分けるか、別ファイルにまとめる。

表記を揃える

表記がずれていると集計・分析するときに苦労する。
例えば、1987年09月生まれの人を抽出したいとする。
ちなみに、1987年09月は、俺の誕生月。

  • 198709
  • 1987-09
  • S62-09
  • 09-1987
  • 87-09
  • 1987-9

抽出しようにもパターンが多すぎて、抽出側が頭を使わなければいけない。

セル結合しない

セルが結合されていると、正しくデータが抽出・分析できない。
データとしてExcelを使う場合、なるべく使うべきではない。

他の補足

セルの背景色

つけてもいいけど、つけすぎ注意。
目がチカチカする。
カラフルなExcelほど見にくいものはない。
使う色は、3色くらいにしたほうがいい。

インデックス

データとは関係なくても、通し番号は必ずつける。
ポケモン図鑑でいうところの全国図鑑の番号だ。
これがあることで、一発でアクセスすることができる。

日本のデータベースの考え

意外とポケモンで養われるのではないかと思った。
ポケモン図鑑がデータベースって考えられる。
案外、データベースって考えは、IT分野の人じゃなくても受け入れられそうな気がする。

Typescriptで覚えるデザインパターン

プログラミング 勉強 JavaScript デザインパターン

きっかけ

長くやってきたJavaから離れ、サブウェポンとしてTypescriptを仕事で使いながら覚えることに。
新しくことへの挑戦になるが、基本的な考え方が変わらないと感じた。
つまり、汎用的な考えを抑えることができれば、使う言語が変わったとしても問題はないと感じて執筆に至る。

デザインパターンとは

デザインパターンとは、「オブジェクト指向において、よく使われる設計をパターン化したもの」です。
これを適用させると、プログラムが再利用しやすく、かつ読みやすいものとなります。
デザインパターンを正しく理解するためは、オブジェクト指向の知識を持っていることが大前提

デザインパターン関連サイト

サルでもわかる 逆引きデザインパターン 第1章 はじめてのデザインパターン はじめに

デザインパターン入門 - IT専科

デザインパターン (ソフトウェア) - Wikipedia

geechs-magazine.com

ここでのデザインパターン

一番有名なGoFの23のパターンのことを指すものとする。
パターンは大別して、生成・構造・振る舞いに別れ、全て合わせて23パターン存在する。

生成

パターン名 概要
Abstract Factory 関連するAPI群のインスタンスを生成する方法を提供する。
Builder オブジェクト生成を抽象化して、オブジェクトを生成する。
Factory Method サブクラスにインスタンス生成をさせる。
Prototype インスタンスを複製する。
Singleton 生成できるインスタンスを1個に制限する。

構造

パターン名 概要
Adapter インタフェースが一致しないクラスを再利用する。
Bridge 機能と実装の階層を分離する。
Composite 再帰的なオブジェクト構造を表現する。
Decorator オブジェクトを機能を拡張するための構造を提供する。
Facade 複雑な処理を呼び出す入り口を提供して、煩雑な処理を簡略化させる。
Flyweight インスタンスで共有可能なものを共有して、生成コスト・使用メモリを抑える。
Proxy プロキシを使って、インスタンスの生成やアクセス管理する。

振る舞い

パターン名 概要
Chain of Responsibility 処理をチェーンのようにつなげて、処理を順次的に処理する。
Command 命令をオブジェクトとして処理させる。
Interpreter 構文解析結果を表現するクラスを提供する。
Iterator 複数のオブジェクトに順次アクセスする。
Mediator 複数のオブジェクトを集中管理する。
Memento オブジェクトの状態を保管して復元可能にする。
Observer オブジェクトの状態変化を通知する。
State 状態に応じて処理内容を切り替える。
Strategy アルゴリズムを入れ替えるにする。
Template Method 処理の流れを親クラスで実装し、詳細な処理をサブクラスで実装させる。
Visitor 複数のオブジェクトを監視・追加・変更する

デザインパターン

よく使うものだけ確認
暇だったら追加しておくかも

Singleton

export default class Singleton {

    private static instance: Singleton;

    /** コンストラクタ隠蔽 */
    private Singleton() {};

    public static getInstance(): Singleton {
        if(this.instance) {
            return this.instance;
        }

        this.instance = new Singleton();
        return this.instance;
    }
}

Factory Method

abstract class Creator<P extends Product> {

    abstract factoryMethod(): P;

    create(): P {
        return this.factoryMethod();
    }
}

abstract class Product {
    private name: string;
    setName(name: string) {
        this.name = name;
    }
    getName() {
        return this.name;
    }
}

class ProductG extends Product {
    private no: string;
    constructor(name: string, no: string) {
        super();
        this.setName(name);
        this.no = no;
    }
    getNo(): string {
        return this.no;
    }
}

class GCreator extends Creator<ProductG> {

    factoryMethod(): ProductG {
        return new ProductG("FREEDUM", "X10A");
    }
}

let factory = new GCreator();
let g = factory.create();
console.log(`name: ${g.getName()} no: ${g.getNo()}`);

ちなみに、この工場はフリーダムガンダムを生成する。

Strategy

ほぼStateと一緒。

class Strategy {
    strategy(name: string): () => void {
        return this.strategyArr[name];
    }

    private strategyArr: {
        [key: string]: () => void;
    } = {
        "fusiion": () => console.log("E・HERO フレア・ウィングマン"),
        "syncro": () => console.log("スターダスト・ドラゴン"),
        "xys": () => console.log("No.39 希望皇ホープ"),
        "pendulum": () => console.log("オッドアイズ・ペンデュラム・ドラゴン"),
    }
}

let strategy = new Strategy();
strategy.strategy("syncro")();