エンターテイメント!!

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

Excelは嫌いだが役に立つ?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で覚えるデザインパターン

きっかけ

長くやってきた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")();

npmまとめ

npmとは

Node.jsの管理するためのツール。
Node.jsには多種多様なモジュールが存在するため、管理ツールとして作られた。

覚えるべきコマンド−基本編

初期化

npm init

プロジェクトを初期化するためのコマンド。
依存関係や汎用的な基本情報をもったpackage.jsonを作成するために使う。

いちいち決めるのが面倒くさい場合は、コマンドオプションとして-yをつければ、枠だけ用意されているpackage.jsonが作成される。

npm init -y

パッケージのダウンロード

npm install {モジュール名}

Node.jsで公開されているモジュールをインストールする。
モジュール名を記載しない場合、コマンド実行したときのカレントディレクトリにあるpackage.jsonを元に、ライブラリをダウンロードする。
また、コマンドオプションとして、--save--save-devを使用すると、インストールしたモジュールがpackage.jsonに記述される。

インストールしたモジュールは、プロジェクト内でしか使えない。
しかし、Typescriptなどの汎用的なものをどこでも使えるようにしたい場合、-gオプションを付与して、グローバル環境にインストールすることもできる。 グローバル環境にインストールされると、パスが通るため、何処でもコマンド実行することができる。
しかし、多様は厳禁!
グローバル環境にインストールしすぎると、管理ができなくなり、意図しない問題が発生する可能性が高い。
プログラミングと同じく、公開範囲は最小限にしておくのがいい。

覚えるべきコマンド−応用編

Help

このコマンドがなんなのか忘れるときがある。
IT系は覚えることがたくさんあるので、思い出すための方法は必ず覚える必要がある。
全部は覚える必要はない。
npmの全てのオプションは、以下のコマンドで確認できる。

npm help

特定のコマンドを知りたい場合は、下記のコマンドで確認できる

npm help {コマンド}

例えば、installコマンドを確認したい場合、npm help installとすることで確認できる。

オートコンプリート

これも覚えることを減らすために必要になる。開発効率をあげるためにも必須。

npm completion >> ~/.bashrc
source ~/.bashrc

これをすると、コマンドの入力補完が効くようになる。
例えば、npm insでTABを押すと、npm installに補完される。

npmのバージョン管理

今のバージョン確認

npm -v

npmのアップデート

npm install -g npm

npmでnpmをインストールできるというのは、奇妙な話だができる。 npmを複数バージョン管理したい場合、nvmなどを使う必要があるが、今回の説明からは省略する。

npmのデフォルト設定

npm install -yで設定されるデフォル値などを設定することができる。

npm config set init.auther.name {名前}

パッケージの検索

npms

npms

プロジェクトをコミット頻度、カバレッジ、ドキュメント量などの複数の質でスコアのランク付けをしてくれる。

npm Discover

npm Discover · see what everyone else is using

パッケージと一緒に使われるパッケージを検索できる。

パッケージ管理

インストールしたものを確認する。

npm list

ただし、サブパッケージをすべて表示するため、情報過多で見たい情報が見れない時がある。
そんなときは、階層制限をかけてあげるといい。

npm list --depth=0

上記コマンドで、最上位階層のパッケージ内容だけ確認できる。

ホームページ

パッケージのドキュメントが見たい場合は、ヘルプを見てもいいが、より詳しい情報はホームページにあることが多い。
その場合は、下記のコマンドで見れる。

npm home {パッケージ}

Githumリポジトリ

npm repo {パッケージ}

ドキュメント参照

npm docs {パッケージ}

現在のバグ一覧

npm bugs {パッケージ}

パッケージの削除

個別で取り除く場合

npm uninstall {パッケージ}

全部取り除く場合

npm prune

依存パッケージのバージョン固定

デフォルト設定のnpmだと、npm install --saveでは、メジャーバージョンの番号が固定される。

マイナーバージョンを固定したい場合
npm config set save-exact true

もしくは、shrinkwrapを使う。

npm shrinkwrap

shrinkwrapを使った場合、カレントディレクトリにnpm-shrinkwrap.jsonファイルが生成される。
このファイルは、package.jsonがあるときにnpm installしても、npm-shrinkwrap.jsonの内容でインストールが行われる。

更新されたパッケージを見つける

npm outdated

パッケージの使えるバージョン確認

npm view {パッケージ} versions

Javaエンジニアだった人がTypescript開発でハマったこと

書くに至った経緯

Typescriptを使って2ヶ月。
ある程度経験を積んだから、感じたことを書き記す。

使っているTypescriptは、2.1.4

はまったこと・悩んだこと

Promise

非同期のためのもの。
説明を聞くとなんとなく納得してしまうが、実際使うと分からんってことが多かった。
Javaにも似たライブラリがあるようだが、使ったことはなかった。
自分でJavaで近いソースを書いて覚えられた。
要するに汎用的なスレッド処理をしてくれるものなんだね。
Nodeは、全体的に非同期のものが多いので、ここらへんはきちんと抑えておく必要があると感じた。
今後やり始める人は、要注意!

EventEmitter

Javaの開発歴が長いおかげで、GUIのイベント管理系の知識がまるでない。
経験が薄いため、どうすれば管理し易いか、可読性が上がるのかの知見がない。
ソースを追うのにかなり苦労中(現在進行形)

なるべくイベント名を、呼び出し・登録側で書かせないのがいいのではなかろうか?と頭の中で感じた。
イベント専用のリスナー一個にすべきか迷ったけど、まとめたらまとめたでカオス化しそうな気がする。
どう管理するか、まだ答えが出せていない。

enum

Javaとは違い、書く要素には数値が割り当てられる。
JavaでStateパターン、Strategyパターンをenumを使って楽に実現していたが、TypeScriptではできないケースが多い。
そこらへんにヤキモキした。

オブジェクトの割当をしたかった。

型定義ファイルとexport interface

違いがよくわからないんだよね。。。
現在進行形で。
どっちにしろ、コンパイル後はファイル出力されないんじゃ。。。って思う。
export interfaceは、コンパイルの手助けをするもので、型定義ファイルは、コンパイル後に存在するであろうファイルのために作るって認識でいる。
な・・・何を言ってるのかわからねーと思うが、俺も何を言っているのか分からねぇ・・・

クラスの情報が取れない

なぜクラスの情報が取れないんだろうか?
JavaのようにClassクラスのオブジェクトが欲しい時があったが、それができなくてヤキモキした。
Classクラスって、改めて字面にするとものすごく分かりにくい。

Typescriptを使って個人的に思うこと

Javaと似ているけど、ところどころ通じないところがある。
マイクロソフトの.NET系の流れが色濃く残っている感じがする。
enumなんかまさにそう。

あと、型は便利なこともあれば、ない方がいいときもあると感じた。
厳密でないほうが嬉しいこともたまにある。
ただ、any型は多用すべきではないなと感じる。
型がないところに型の定義を追加したのがTypescriptなんだから、型がない方向にもっていくのはナンセンス!

TypeScritpでハマったこと tsconfig.json

開発環境

  • VisualStudioCode
  • TypeScript 2.0
  • gulp

ハマったこと

ファイルを新規作成したが、既存のソースコードを読み込めず、なぜなのかかなり悩んだ。
ソースに問題はない。
きちんと正しいものを参照しようとしており、他のソースは参照できている。

原因

tsconfigに新規追加したファイルを含めていなかったため、ビルド時にコンパイル対象になっていなかった。
そのため、既存にあるファイルを参照しようにも、「お前だれだ?」状態で存在しないやつが迫害されていたという状況。

反省点

きっちりビルド内容を把握しましょう。
環境の問題は、ハマると解決に時間がかかるので、内容をきちんと押さえましょう。

【書評】ゼロ秒勉強術

ゼロ秒勉強術~最短で受かる! 世界一シンプルな試験合格法

ゼロ秒勉強術~最短で受かる! 世界一シンプルな試験合格法

きっかけ

今、情報処理技術者試験DBスペシャリストの試験勉強をしているが、もっと効率的で楽に合格できるような方法ないの?
助けて、ドラえも〜ん!っ的な感覚で本屋を回っていたときに目に入って来たので購入した。
ちなみにドラえもんは、大山のぶ代の声で再生。

決して、リゼロに影響されて、ゼロがつくものに目が行って衝動買しちゃった(ノω・)テヘって感じではない。
ちゃんと自分に必要だと思ったから買いましたよ。たぶん。。。

目次が胡散臭くなかったので、一回読んで見たくなった。

内容

目次

  • 序章 飛ばし読みこそが早く深い記憶・理解を可能にする
  • 1章 ゼロ秒解答
  • 2章 ゼロ秒解読(理論編)
  • 3章 ゼロ秒解読(実践編)
  • 4章 ゼロ秒試験
  • 5章 ゼロ秒勉強
  • 終章 「ゼロ秒勉強術」から「ゼロ秒仕事術」へ

まとめと感想

1章 ゼロ秒解答

ゼロ秒解答とは、すぐに分かる・思い出せる状態。
悩んだ結果の答えは、大抵間違っている。
身に覚えがある。

全てを悩まず答えるのは至難の業。
だから合格ラインに到達できるものをスラッと解答できるようにしておく。
上記をやる上で、過去問が超重要。
難易度の把握、傾向の対策を過去問から読み取る。

勉強する際は、教材を一つに絞る。
そうしないと点数が取れない。
理由は、下記のロジックに陥るから。

  1. 試験対策のために別の参考書を買う
  2. 問題範囲が広がる
  3. 質が落ちる
  4. ゼロ秒解答ができない
  5. 点数が取れない
  6. 参考書を買う(ループ)

範囲と質はトレードオフの関係にある。

2章 ゼロ秒解読(理論編)

ゼロ秒解読とは、止まらずに読むこと。
分からないところや、読む気がないところは、飛ばす。
全体を見たときに読み取れれば、問題ない。

全部を理解しないことで、脳の一時記憶領域に貯まる情報を減らして、効率的に処理する。
PCと処理形態は一緒。

3章 ゼロ秒解読(実践編)

ゼロ秒解読で重要なのは、繰り返すこと。
分かる/分からないを意識してやることが大事。

分かりたい欲求をコントロールすること。
なんでも今すぐやるとオーバーヒートする。もう限界だ!!状態になる。(ドラゴンボール劇場版のメタルクウラみたいになる)

やり方

  1. 目次で全体把握
  2. タイトル・見出しで読む箇所を選別
  3. 読む
  4. 文書構造を理解

実施後の後作業

読みやすくなるように編集する。
本に記入するようなことを勧めていたが、怖くてできないのが心情。
貧乏人の悪クセなのかな?
ものすごくやりたくない。
電子データ化してあれば、気兼ねなくできる。

4章 ゼロ秒試験

本を読んでも、大抵の人はわかったつもり・覚えたつもりであることが多い。
いざ説明するとボロが出る。

ゼロ秒試験は、自分の理解度を知るための仕組みで、思い出す作業をする。
何かしたら、思い出すことを習慣化する。
思い出せる=解答ができるので、解読とセットで実施すること。

林修も、全部即回答ではなく、記憶を辿ってそこから解を導くことが多い。
問題の解答コメントで、「どこかの本で読んだ記憶が〜」ってのが多い印象を受ける。

そういえば、子どもの頃、1時間宿題をしなさいって言われてた。
だけど、1時間も勉強したくないから、参考書の問題を高速で解いて、1時間分の課題をこなしたように見せていた記憶がある。
確か、算数だった。
20問の計算問題+文章問題2問を5分位で解いて、後はゲームするなどして遊んでいた。
今思えば、これがゼロ秒試験だったのかも知れない。

5章 ゼロ秒勉強

ゼロ秒勉強とは、勉強するまでにかかる時間をゼロにすること。
結構タイトル詐欺なので注意。

ゼロにするには、やる行動の明確化が大事。 事前のやる気は、勉強には必要ない。
やらないことの理由にしたいだけ。

勉強は、根性論でなんとかできるものではない。
仕組み作りが大切。
頑張るってのは、長続きせず、諦めたときの気休めくらいにはなる。

仕組み化する場合は、なるべく問題のハードルを下げること。
下げすぎてもダメ。
ゾーンに入るくらいの適度な難易度が一番いい。
「ゾーン」のことを「フロー」っていう輩がいるけど、俺は断固ゾーン派!
やっぱり黒子のバスケの影響がでかい。

太くて濃い大きな字を上手く利用する。
太くて濃い大きな字は、読みやすく、簡単だと思い込むため、物事を覚えるときは効果的。
この言葉を見て、男性器を思い出すヤツは、俺だけだろうか?

終章 「ゼロ秒勉強術」から「ゼロ秒仕事術」へ

勉強ができない人=自分を知らない人
メタ認識ができてない。
メタと言われると遊戯王を思い出す。
遊戯王でのメタの意味は、環境トップへの対策のこと。
ここでは、勉強できない箇所への対策って意味だったはず。 メタ認識して、弱点を減らすことが大切。

自信過剰はダメ。
全てにおいて、良い結果は生まれない。
日頃の鍛錬を怠ることが、一番悪影響が出る。
自信過剰で負けるパターンは、よく思いつく。
DIOとか吉良吉影とか。
負けたくなければ、自信過剰は捨てるべきだ。

全体を通して

気づかない内に、飛ばし読みすることが増えているなと、読みながら思った。
一番大切なのは、繰り返しすること。
繰り返しを多くやるために、ゼロ秒で行動を起こすことの重要性が説かれていると感じた。

ゼロ秒にとらわれて、目的を見失わないようにしないといけないなと思った。
目的を見失って行動したら、意識高い形だもんね。
意識高い形にだけは、死んでもなりたくないから気をつけないと。

ITエンジニアが飲んではいけない飲み物

きっかけ

ある飲料水を飲んだら、酷い自体に落ちた。
自分への戒めと他のエンジニアの助言のために書く

問題の商品

日清食品ピルクル

www.nissin.com

問題になった減少

飲んで数時間後、お腹の調子が。。。
数日便秘だったこともあり、強烈な便意が。。。
たぶん、下剤並みの威力があるんじゃないかな?

下記のサイトによると、カゼイ菌・ナトリウムが入っているらしい。

ピルクルの便秘への効果と飲み方について!

問題は、カゼイ菌のようだ。
通常の乳酸菌は、乳酸菌は胃酸や胆汁で死滅してしまうらしいが、カゼイ菌は耐性が強く死滅することがないらしい。
ゴキブリみたいな菌だな。。。
そして、生きたまま腸内に運ばれることによって、整腸効果、つまり排便作用が働く。

カゼイ菌については、下記サイトに詳しく書いてあるので、参考にしてみて。

L・ガゼイ菌の効果・効能

善玉菌として働いた際に、乳酸と酢酸が分泌され、便が押し出されるらしい。

飲んだ時間帯

これが最悪だった。
朝の出社前。
そして、便意が来たのが、出社時間の1時間あと。
知らない人が多いかもしれないが、東京のソフトウェア開発のビルのトイレって空いていることが少ない。
特に朝と昼は、開いているトイレは奇跡に近い。

おかげで、「お外の世界にこんにちは」思想な物体を必死に食い止めながら、いろんな階のトイレを探した。
開いているトイレを見つけた時は、昇天するような気持ちだった。

じゃ、どうすればいいんだってばよ?

トイレを確保した状態で飲む。これしかない!
トイレで飲むわけにも行かないので、なるべく家で飲んだほうがいい。
ただし、一人暮らしの人に限る。
たまに家族が入っていてダメな時があるからな。

得た教訓

  • 排便を促す時は家でやる
  • 便秘にならないようにする
  • 開いているトイレに入ったら神に感謝する
  • エンジニアはお腹が弱い
  • 朝・昼の排便は要注意