Post

プログラミング

2018-12-09 10:25:43

PHPで学ぶデザインパターン - Strategy

概要この記事はPHPで学ぶデザインパターン Advent Calendar 2018の記事です。 今回はStrategyパターンについてかきます。 Strategyパターンとは?Strategyパターンは、アルゴリズムの切り替えを容易にするようなパターンです。異なる処理をそれぞれ別のクラスに定義するため、 処理を動的に選択できるだけでなく、条件分岐を減らすことも可能としてします。OCP(open/closed principle)に忠実なパターンの一つでもあります。 実装例単純な例でStrategyパターンの実装を見てみます。 <?php class Context { priv...

プログラミング

デザインパターン PHP GoF strategy

2018-12-08 17:37:17

PHPのインターフェースとタイプヒンティング

概要この記事はPHP Advent Calendar 2018の記事です。(ちょっと早めに投稿しています) インターフェースはメソッドの実装を保証する”契約”的意味合いの他、タイプヒンティングによって実装を抽象に依存させる(=実装の切り替えをしやすくする)こともできる。 インターフェースの定義・実装基本的なインターフェースの定義と実装。 <?php interface Action { public function say(); } class Superman implements Action { public function say() {...

プログラミング

PHP interface type hinting

2018-12-04 21:49:55

anyenvでインストールしたrbenvでbundlerをinstallしたときにパスでハマった

概要 anyenvでインストールしたrbenvでbundlerをinstallしたときにパスでハマった話。 ハマったことanyenvでrbenvをインストールしてrubyを使っているのですが、bundlerをインストールする際に、 gem install bundler と何も考えずに打つと、bundlerが/usr/local/bin/以下に配置されてしまう。 意図したパスでないためgemでinstallしたchefとか使おうとするとコケる。 解決策rbenv exec gem install bundler rbenvで導入しているrubyのgemを実行するように指定する。 所感パスを冷静...

プログラミング

anyenv gem rbenv ruby

2018-12-01 23:15:50

PHPで学ぶデザインパターン - Factory・Factory Method・Abstract F...

この記事はPHPで学ぶデザインパターン Advent Calendar 2018の記事です。 概要Factory・Factory Method・Abstract Factoryについてかきます。 Factoryパターンについて知るまずはFactoryパターンについてざっくり説明します。 interface Robot { public function say(); } class BlueRobot implements Robot { private $color; public function __construct($color) {...

プログラミング

デザインパターン GoF PHP abstract factory factory factory method

2018-12-01 00:57:36

正規表現の基本

概要正規表現の基本。ERE(Extended regular expression)で扱える記法の中でよく使いそうなやつをまとめる。 文字クラス[文字列] 文字列の中の任意の一文字と一致 Ex: [きつね] きつねたぬきねこ き,つ,ね,き,ね [^文字列] 文字列の中にない任意の一文字と一致 Ex: [^きつね] きつねたぬきねこ た,ね,こ [文字列-文字列] 任意の文字範囲にある一文字と一致 Ex: [あ-ん] きつねたぬきcat き,つ,ね,た,ぬ,き \d 10進数数字と一致 Ex: \d りんごが10個 1, 0 \D 10進...

プログラミング

ERE 正規表現

2018-11-15 14:39:15

Golangのインターフェース概要

概要Golangのインターフェースについてまとめる。 Golangのインターフェースとは 特定のメソッドの型だけを列挙した型 インターフェースFooで宣言したメソッドが全て実装されている構造体は、型Fooとして扱うことができる。 インタフェースを使うとポリモーフィズムを実現することができる インターフェースの定義type <型名> interface { <メソッド名(<引数の型>, ...)(<戻り値の型>, ...) } // Ex. type Human interface { say() string } インターフェースの特徴イ...

プログラミング

Golang

2018-11-13 21:13:03

Golangのポインタ概要

概要Golangのポインタの基本では参照渡しと値渡しの違いの観点からポインタについて書いたが、それ以前にポインタを扱っているうちに混乱してきたため、ポインタの概要をまとめる。 ポインタ型とは メモリー上のアドレスを記憶する変数の型のこと ポインタ型の定義 *を使って定義する var s *string // 変数sはstring型のポインタ。型は*string アドレス演算子と間接参照演算子アドレス演算子 & 任意の値からポインタ型を生成し、アドレスを得る 間接参照演算子 * ポインタ型変数から値を参照する(デリファレンス) ポインタ型変数package main impor...

プログラミング

Golang

2018-11-13 15:43:42

Golangでの変数定義・宣言のパターンまとめ

概要Golangでの変数定義・宣言のパターンをまとめる 変数の定義・宣言における注意 1文字目が大文字の場合は、他のパッケージからも見える変数 1文字目が小文字の場合は、そのパッケージでしか見えない変数 変数の定義・宣言Variable declarationsvar i int fmt.Printf("%T", i) // int var a, b, c string fmt.Printf("%T", a) // string fmt.Printf("%T", b) // string fmt.Printf("%T", c) // string var s = "Hello World...

プログラミング

Golang

2018-10-04 15:24:31

Golangの関数についてー関数値/コールバック関数/無名関数

概要Golangの関数において、以下3つについてまとめる。 関数値として扱う場合の関数 関数を引数として扱う関数 無名関数の定義 関数値 クロージャー 関数値として扱う場合の関数package main import ( "fmt" "testing" ) func sayHi() string { return "Hello" } func main() { greetA := sayHi() greetB := sayHi fmt.Println(greetA) fmt.Println(greetB()) } コールバック関数package m...

プログラミング

Golang callback 関数 無名関数

2018-09-20 16:32:36

Jestで始めるJavaScriptのテスト

概要Jestを使ってJavaScriptのテストをかいてみる。 準備jestとESModulesを使いたいのでbabel-preset-2015をインストールしておく。(babel-jestはjestに用意されている。) npm install --save-dev jest babel-preset-2015 .babelrcの中身はこんな感じ。 { "presets": ["es2015"] } package.jsonはこんな感じ。 { "scripts": { "test": "j...

プログラミング

ES5 JavaScript babel babel-jest ESModules jest

2018-09-03 12:48:54

Golangのポインタの基本

概要Golangのポインタ基礎についてまとめる。 前提 変数とメモリの関係についてイメージできる程度の知識 ポインタとは何かポインタは変数のアドレスを指す。変数のアドレスを通じて呼び出し元の変数の値を変更することができる。 GolangではC言語ライクなポインタは用意されている。Golangでのポインタでは、変数Tのポインタは*T型で、ゼロ値はnilとなる。 package main import "fmt" func main() { i := 10 // &(アドレス演算子)を使い、変数のアドレスにアクセスする // 変数pointerに変数iのアドレスを格納...

プログラミング

Golang ポインタ 値渡し 参照

2018-08-15 12:36:20

CircleCI2.0でPHPUnitのコードカバレッジを出力する

概要CircleCi2.0でPHPUnitのコードカバレッジを出力する 環境 CircleCi2.0 docker docker-compose PHPUnit6系 PHP7.2系 手順phpunit.xmlの設定を調整するカバレッジの対象としたいソースを指定する。 <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">./app</directory>...

プログラミング

Docker CircleCI CircleCI2.0 phpunit

2018-07-17 01:05:15

JavaScriptで始めるアルゴリズム

概要JavaScriptでアルゴリズムを学ぶ。 サーチのアルゴリズムリニアサーチリストや配列のデータに対して、先頭から順番に比較を行っていくアルゴリズム。 配列の長さ分処理を繰り返し、目的のデータに到達したら処理を終了する。目的とするデータが後ろにあるほど処理が遅くなる。 const targetData = 5; const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; (function () { for (let i = 0; i < data.length; i++) { if (targetData == data[i])...

プログラミング

Algorithm バイナリーサーチ リニアサーチ バブルソート セレクションソート

2018-06-15 11:31:46

GraphQLとは

GraphQLとは Facebookが開発 APIのためのクエリ言語 APIのリクエストのデータ形式とレスポンスのデータ形式が似ているため、ユーザーフレンドリー RESTはアーキテクチャ(設計)であり、GraphQLは言語(DSL)である REST APIとGraphQLの比較REST APIのAPI形式エンドポイントに対して、HTTP動詞でリクエストを投げる curl https://api.bmf-tech.com/v1/configs [ { "id": 1, "name": "title&q...

プログラミング

API HTTP REST GraphQL

2018-06-11 21:36:02

Atom×TidalCycles×SuperColliderでライブコーディングをはじめる

概要プログラミングで音楽をつくってみたいと思い、音響プログラミングに手を出してみた。 準備 Mac Atom Git Homebrew Haskell Tidalcycles SuperCollider Mac、Git、Atom、Homebrewは既に用意されている前提で話を進める。 HomebrewでHaskellとTidalCyclesをインストールするbrew install ghc brew install cabal-install cabal update cabal install cabal-install cabal install tidal Atomにtidalcycl...

プログラミング

Atom Git haskell homebrew tidalcycles

2018-06-08 22:41:42

SPAを構築したときにハマったこと

概要以前、LaravelにSPAを組み込む時に考えたディレクトリ構成とnginxのconfファイルというタイトルの記事を書いたが、そこで記載したnginxのconfが不十分だったため、改めて問題点を整理、解決した。 前提 History API nginx SPAを構築したときにハマったことnginxの設定リロードしても常にindex.htmlを返すように設定する必要がある。こんな感じでtry_filesを使ってconfを設定する。 location / { try_files $uri $uri/ /index.html; } jsファイルなどのソースのパスindex.h...

プログラミング

Nginx SPA

2018-06-08 02:18:43

DIとサービスロケーター

概要DIとService Locatorの違いについてまとめる DIとは デザインパターンの一種 依存性注入 オブジェクト間の依存性を分離 オブジェクトの実行時に必要なオブジェクトが注入されるようにする テストしやすくなる DIパターンの実装DIパターン(コンストラクタインジェクション)を実装してみる。なお、DIパターンには、コンストラクタインジェクション、セッターインジェクション、メソッドインジェクションなどコンストラクタ以外からDIする方法もある。比較のためにDIではないパターンとDIのパターンの両方を実装する。 DIではないパターン<?php class SlackNotif...

プログラミング

DI サービスロケーター デザインパターン

2018-05-13 19:19:01

ダック・タイピングとは

概要ダック・タイピングについてまとめる ダック・タイピングとは 動的型付けオブジェクト指向プログラミング言語において、オブジェクトができることはオブジェクトそのものが決定する インターフェースの全てのメソッドを持つオブジェクトは、インターフェースを実装していなくともオブジェクトはインターフェースを実装しているとみなせる、ということ If it walks like a duck and quacks like a duck, it must be a duck. 参考  Wikipedia - ダック・タイピング

プログラミング

ダック・タイピング

2018-05-11 11:52:09

ソフトウェア開発の法則

概要ポステルの法則 Jon Postel 送信するものに関しては厳密に、受信するものに関しては寛容に ポステルがTCPを規定したRFC793にて記載された1節が一般化されたもの インターネットの通信における原則 パーキンソンの法則 Cyril Northcote Parkinson 第1法則  仕事の量は、完成のために与えられた時間をすべて満たすまで膨張する 第2法則 支出の額は、収入の額に達するまで膨張する 「パーキンソンの法則:進歩の追求」にて提唱された法則 コンピューターへの応用 データ量は与えられた記憶装置のスペースを満たすまで膨張する パレートの法則 Virfredo...

プログラミング

ソフトウェア開発

2018-05-13 16:00:43

ポリモーフィズムとは

概要ポリモーフィズムについてまとめる ポリモーフィズムとは Poly(複数の)Morphism(形状) 複数の異なる型に対し、共有のインターフェースを提供すること 引数を受け取ったインスタンスがクラスによって違う振る舞いをすること ポリモーフィズムの種類 アドホック多相 関数が異なる型の引数に対してそれぞれ異なる実装を持つ 多重定義、関数のオーバーロードによって実現 パラメータ多相 型指定のないコードが書かれ、それぞれの型に対して透過的に使用できる場合 型を引数として渡すことで様々な型に適用することができる ジェネリクスやテンプレートによって実現 部分型付け 共通の上位型を持つ複数の...

プログラミング

ポリモーフィズム