バニラ php で学ぶクリーンアーキテクチャ その 3 - Web 編

前回はクリーンアーチテクチャ (CA) の実装例として コマンドライン (CLI) のツールを作りました。 今回はそれを Web に変更する事で CA の良いところを見ていきます。 TLDR CA で作ると CLI から Web にしても "外側" だけの変更で済むよ 修正範囲も最少限…

バニラ PHP で学ぶクリーンアーキテクチャ その 2

前回はクリーンアーキテクャの各レイヤの説明をしました。 今回は実装の説明をしていきます。 今回はソースコードの説明をします。 まずは前回の商品情報管理ツールの仕様を再掲。 実行すると、指定された商品情報に税込価格を追加して表示する 税込価格は軽…

バニラ PHP で学ぶクリーンアーキテクチャ その 1

クリーンアーキテクチャの概要を PHP のサンプルコードを見ながら学びます。 対象 クリーンアーキテクチャの記事や本を見たけど腑に落ちなかった クリーンアーキテクチャの概念は分かったが実際にどう実装していくか、動くコードを見たい 基本的には素の PHP…

PHP でも関数型っぽく書く

なんとなく表題の事をやってみた。 とりあえず、 関数合成 部分適用 があればなんとかなりそうなので、作ってみる。 // 関数合成 function compose() { $fns = func_get_args(); $revFns = array_reverse($fns); return function ($initial) use ($revFns) {…

go の配列操作ライブラリを探す

go でそれなりに複雑なロジックを実装する時に欲しくなってくるのが配列操作ライブラリ。 何でも for でやるのが go way なのかもしれませんが、XXX.filter(...).map(...) とかやりたいですよね。 lodash みたいなのはないかと思って探してみたところ、一応…

webpack で実行可能な単一ファイルを作る

node.js で cli ツールを作った時に 簡単に実行する方法を考えてみました。 nexe を使う方法もありますが、ファイルサイズが大きくなるので javascript のコードのみまとめる事を想定します。 方針としては ライブラリも使いたいので webpack で単一ファイル…

node.js でライブラリを使わずに関数型する

node.js で関数型したい時には Ramda などの ライブラリを入れるのが一般的だと思いますが、 ちょっとしたツールを書く時には Ramda 入れるのも大げさに思える時があります。 で、よくよく調べてみると、map, filter, reduce はあるし、 部分適用も Function…

cfn-lint で CloudFormation のテンプレートの検証をする

CloudFormation のテンプレートを作っている時、 いちいちコンソールにアップして確認していたら時間がかかってしまう。 そんな時に便利なのが cli でテンプレートファイルの チェックをしてくれるcfn-lint。 使い方も簡単で $ cfn-lint validate ./cf-templ…

shell で tap 関数を作ってみた

ruby にtap メソッドというものがあって、 メソッドチェーンしてる時のデバッグに便利なんですが、 shell でパイプライン使ってる時の デバッグにも使えそうなので、作ってみました。 ただし、処理を入れる事はできなくて 標準エラーに内容を表示するだけで…

Swagger を試してみた

そろそろ手書きで API の仕様を作るのやめたいと思って swagger を試してみました。 swagger は別に単一のソフトではなくて、 Swagger Spec という仕様で書かれた定義書を 元にドキュメントを書いたり、コードを生成したりできるものみたいです。 Swagger Ed…

loadtest, httperf でお手軽負荷テスト

go で作った WebAPI サーバの速度検証をしてみました。 単に GET リクエストを投げるだけでよいので、JMeter でなくて お手軽にできるツールでやりました。 loadtest node.js 用のテストツールで 自分でリクエストを好きに定義できるのが特徴です。 例えば、…

python のスーパーセットな関数型言語 Coconut を試す

パイプライン演算子が使える言語がないか探していたところ Coconut というものを見つけました。 公式の説明を見ると 関数型言語で Python にコンパイルされる Python のスーパーセット なにそれ面白そう。 という事で、ちょっと触ってみました。 インストー…

インストール不要のチートシートツール cheat.sh

要は man の代わりに使うツールなんですが、 こいつのすごいところはインストールしなくても使えるところで、 例えば、ls の使い方を知りたい場合 $ curl cheat.sh/ls だけで OK です。 DL して使うコマンドラインツールもあるみたいなんですが、 サーバーが…

Go で errgroup を使って直列 vs 並列

直列 vs 並列シリーズ第 3 弾。 あんまり errgroup を使ったサンプルがなかったのでやってみた。 package main import ( "fmt" "io/ioutil" "net/http" "sync" "time" "golang.org/x/sync/errgroup" ) func createUrl(sec int) string { return fmt.Sprintf(…

PHP の Guzzle で直列 vs 並列

前やった node.js の Promise で直列 vs 並列を php でやってみた。 素の php だと非同期処理はめんどくさいので 今回は Guzzle を使ってみた。 Guzzle は非同期もできる http クライアントだけど、 Guzzle Promises を使えば 一般的な処理も非同期で書ける…

AWS の ECS & Fargate でゆるいバッチ環境を作る

仕事で以下のようなバッチを作る事になったのでその記録をメモしとく。 月 1 回実行 内容は手動でやってた作業を自動でやって結果をメールするだけ 実行には 30 分ほどかかる 全然クリティカルじゃない エラーが発生しても連絡があってから再実行すればよい …

typescript の async/await で直列 vs 並列

typescript でちょっとやってみました。 http://httpbin.org/delay/{delay} というのは delay 秒待ってからレスポンス返してくれる URL です。 /* * serial vs parallel */ import request from 'request-promise-native'; function createUrl(sec: number):…

コマンドラインで json を作る

json をパースするツールとして jq というのがありますが、 その反対、json を作るツールとして jo というのがあります。 使い方 引数でキーと値を指定する $ jo key=value {"key":"value"} 配列を作るときは -a オプションをつける $ jo -a 1 2 3 [1,2,3] …

fselect で SQL ライクにファイルを検索する

fselect という ツールを見つけて、面白そうだったんで触ってみた。 主な機能はこんな感じ SQL like な検索 正規表現も使える 出力フォーマットの変更可能(json, csv...) mp3 対応 早速インストールして fselect のリポジトリで試してみる。 $ fselect name,…

Elixir がよかった件

昨年は いま学ぶべき第二のプログラミング言語はコレだ! 未来のために挑戦したい9つの言語とその理由 の記事がきっかけで Rust, Haskell をやって非常によかったので この流れで残りの Elixir もやってみた。 テキストはもちろんこれ 最速で知る! Elixirプ…

色々な言語で偶数自乗和 その2

TL;DR Haskell ならパイプライン演算子を自分で定義できるよ java8 import java.util.stream.IntStream; public class Main { public static Integer evenSquareSum(Integer n) { return IntStream.range(1, n) .filter(n1 -> n1 % 2 == 0) // variable n is…

色々な言語で偶数自乗和

TL;DR パイプライン演算子いいね このごろ新しく言語を見る時、Hello world の次くらいに偶数自乗和を 作る関数を定義してる。Ruby で書くとこんな感じ。 def even_square_sum(n) (1..n) .select {|n| n % 2 == 0} .map {|n| n * n} .inject {|acc, n| n + a…

git rebase -i をちょっと楽にするエイリアス

git

いつもいつも git rebase -i HEAD^^ を打つのが めんどくさいので作ってみました。 使用例 git irebase → git rebase -i HEAD~2 git irebase 5 → git rebase -i HEAD~5 数字をつけるとその数さかのぼる git irebase ^^^ → git rebase -i HEAD^^^ ^ や ~ だけ…

MODx の管理画面ツールバーにボタンを追加する

MODx の管理画面をカスタマイズした時のメモです。 最後の doLayout() が分からなくてハマったので注意。 MODx.on('ready', function() { var buttons = []; buttons.push({ text: 'hello', handler: function () { alert('hello'); // 実行させたい処理をこ…

vim のインサートモードで行頭をトグルする

vim

vim を使ってて、emacs みたいに C-a で行頭と空白以外の最初の文字を トグルしたかったので作ってみました。 function! ToggleBol() let col = virtcol('.') let cmd = (col == 1) ? '^' : '0' execute "normal! " . cmd endfunction inoremap <C-a> <C-o>:call Toggl</c-o></c-a>…

twig で配列の数をカウントする

php

ちょっと検索しただけでは分からなかったので。 ほとんど参考サイトのコピペですが。 {% if my_list|length > 10 %} ... {% endif %} 参考 Code Fails: Twig template: find the length of an array

ubuntu に samba を入れる

もう少し簡単にファイル共有できないかと思い、 ubuntu に samba を入れてみました。 いつも通り、 apt-get を使います $ sudo apt-get install samba 共有するディレクトリを作成し、 だれでも読み書きできるようにオーナー、権限を設定します。 $ sudo mkd…

ubuntu に Symfony2 をインストール

Symfony2 を ubuntu にインストールした時のメモ まず、 Symfony を落としてきて展開 mkdir ~/temp cd ~/temp wget http://get.symfony.com/Symfony_Standard_Vendors_2.3.1.tgz tar -zxvf Symfony_Standard_Vendors_2.3.1.tgz sudo mv Symfony /var/www で …

ubuntu の Apache で Userdir を使えるようにする

デフォルトでは各ユーザの ~/public_html にアクセスできないようなので 設定を追加しました。 cd /etc/apache2/mods-enabled sudo ln -s ../mods-available/userdir.conf userdir.conf sudo ln -s ../mods-available/userdir.load userdir.load apache を再…

MySQL を外部接続できるようにする

前回で MySQL をインストールしましたが、 外部から接続するために設定が必要だったのでメモ。 まず、普通に接続しようとすると以下のエラーメッセージが出ました。 SQL Error (2003) Can't connect to MySQL server で、設定ファイルを編集します。 sudo vi…