hagetak's blog

どうも、はげたかです。

2017年の振り返りと2018年の抱負

2017年の振り返りと2018年の抱負

2017年の振り返りといっても、目標やテーマを挙げていないので今年の抱負に対して2017年はどうであったか、を述べたいと思う。

3つのテーマ

2018年は、下記の3つのテーマをあげる。

  1. 生活改善
  2. インプット・アウトプットの習慣づけ
  3. 実戦投入力を高める

1. 生活改善

2017年の振り返り

社会人2年目となり、社会に出て1.5年ほど経った。振り返りとはいえないが、現状3つの課題が現れた。

  • 無駄遣い
  • 以前より体力が衰え、風邪をひいた
  • 体重が5kg増えた

2018年の抱負

無駄な出費を抑える

無駄遣いに対する2018年の抱負である。

まずは何に出費しているのかを現状把握するためにマネーフォワードに入力する習慣をつけている。(2017年12月中旬より)

そこから予算を立て月の出費を計画的に利用できるようにしていきたい。

抱負ということで定量的な目標を立てたいが、予算を立てていないため目標を示すことができない。

2月に月の出費の計画を立てられたらその計画に沿って実現できているか、を目標として捉えたい。

健康面

下記2つの課題は共通していることが多いため健康面として捉える。

  • 以前より体力が衰え、風邪をひいた
  • 体重が5kg増えた

心身を鍛えるためにランニング・筋トレの習慣づけをする。2017年12月から週2でランニングしている。これを継続する。

定量的な目標としては、腹痛・頭痛以外の熱・咳などの風邪を引いた回数 0 が目標である。 また、体重に関しては後に体脂肪率を測り体脂肪率の数値を目標とする。これは筋トレによる筋肉量の増加(増量)とダイエットの減量はトレードオフのためである。

2. インプット・アウトプットの習慣づけ

2017年の振り返り

インプット

インプットを"定期的"に行うことはできなかった。

数十の本を買い、最後まで読み切ったのは10冊もいっていないと思う。読了率は50%いっていないと思う。

2016年、一度も勉強会・セミナーに行ったことなかった。しかし、2017年は幾つかのセミナーや勉強会に参加することができ、そういった面において個人的に評価できる。

技術の流行り・廃りの流れが早いフロントエンド技術に対してまったくもってキャッチアップできていない。仕事に関する技術はキャッチアップ・技術の習得はきちんとできているが、仕事に関係しない技術に関しては全然手を付けることができなかった。

アウトプット

2017年、本ブログの投稿数は削除したものを含めず2記事となっている。

これまでの投稿ペースに比べ圧倒的に低くなり、放置状態となっていた。

上記に記載したインプットで、いくつかアウトプットのネタになるものがある。しかし、記事にすることせずアウトプットしなかった。

2018年の抱負

技術のinput/outputを"習慣化"したいと思う。

僕が技術ブログの最も参考にしているブログがある。下記記事では、id:kakku22 さんは、現在週1回のブログ投稿を習慣化している。

http://kakakakakku.hatenablog.com/entry/2017/11/27/202252

重すぎず・軽すぎず、クオリティを担保できる記事を投稿できるペースを考えると、2週間に1記事を習慣化(未定)する。

この辺については、「ブログを書く習慣」というテーマで別記事にしたいと思う。(この記事でブログを書くに当たってのグラウンドルールをきっちりと決める)

アウトプットの習慣化をつけることで、必然的にインプットされると思う。2週に1回の投稿(未定)でインプット・アウトプットのサイクルを回したい。

3. 実戦投入力を高める

先程紹介した id:kakku22 さんの振り返り記事に「実戦投入力を高める」という目標があった。僕もこれを目標する。

実戦投入力を高めるとは、 id:kakku22 さんの一昨年の振り返り記事によると下記のようです。

ようするに「幅広く勉強してるけど,実際にプロダクションにリリースしてないよね(自サービスに限らず)」ということです.自分でも薄々感じていたことではありますが,刺さりました.膝から崩れ落ちそうになりました.よって今年の目標は「実践投入力を高める」です.実践投入するからこそ深く知る必要があるし,絶対に困難もあるので,大きく成長できます.「実践投入力」って言葉は凄く気に入っています.実戦投入力!

インプットしたことをサービス・事業にアウトプットすることである。更に噛み砕いて「自ら提案してサービス・事業にアウトプットすること」を目標にする。

会社でこれに当てはまることを先輩がしており、先輩はJenkinsを導入した。その中で、僕はJenkins の Job を作成し、環境整備していたが、「Jenkinsを導入しよう」と呼びかけられる側になる。

少しハードルを下げ、「他者に提案 => 他者(他プロジェクト)で利用」も実戦投入したことにしよう。

CakePHP のプロジェクトでコーディング規約に沿っているか自動チェックをする

CakePHP のプロジェクトでコーディング規約に沿っているか自動チェックをする

概要

よくプルリクエストで、コーディング規約に沿っていない箇所をご指摘頂く。コーディング規約はあらかじめ決まっているため、事前に気づくことができる。

プルリク => レビュー => 修正(コーディング規約に沿っていない箇所) => レビュー => ・・・

1サイクル(レビュー => 修正)が増えるので、当然、自分やレビュー者にも負担がかかり、時間も無駄にしてしまう。(そしてコミットログを汚すことにもなる)

ということで、コーディング規約チェッカー(PHP_CodeSniffer 2.0.0)を導入してみては?と提案いただいたので導入してみる。

ココで得られること

  • PHP_CodeSniffer のインストール
  • CakePHP 用のルールをセット
  • 簡単なカスタマイズができる(インデントに Tabを許可する)
    • Tabs must be used to indent lines; spaces are not allowed

コーディング規約一覧

PSR-0

http://www.infiniteloop.co.jp/docs/psr/psr-0.html

PSR-1

http://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.html

PSR-2

http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html

CakePHP2

https://book.cakephp.org/2.0/ja/contributing/cakephp-coding-conventions.html

PHP_CodeSniffer 2.0.0

Composer のインストール

Composer とは、PHPのパッケージ管理ツールである。詳しくは、以下を参照すること。

http://qiita.com/atwata/items/d6f1cf95ce96ebe58010

# composer のインストール ※ 既にインストール済みの場合はSKIPすること
curl http://getcomposer.org/installer | php 

# 利用している shell の設定ファイルに環境設定を書き込み
vim ~/.zshrc

################ 以下を記述 #####################

# For Composer, Uses vendor's bin.
export PATH="$PATH:$HOME/.composer/vendor/bin"

################ ここまで #######################

# 変更した設定ファイルを読みこむ
source ~/.zshrc

CodeSniffer をインストール

composer global require "squizlabs/php_codesniffer"
composer global show --installed | grep php_codesniffer

Changed current directory to /Users/{{USER_NAME}_/.composer
You are using the deprecated option "installed". Only installed packages are shown by default now. The --all option can be used to show all packages.
squizlabs/php_codesniffer    2.8.0   PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined s...

# 使えるかチェック
phpcbf --version
PHP_CodeSniffer version 2.6.1 (stable) by Squiz (http://www.squiz.net)

CakePHP2 用のルールを取得

上記のインストールの他に、CakePHP用のコーディング規約ルールを取得しなければいけない。

https://github.com/cakephp/cakephp-codesniffer/

CakePHP2 のルールを取得するには、 update-fxer-2 を取得する。

master は CakePHP3用でPSR-2 を準拠しているため全く異なる

# 好みの場所にインストールする
# 僕の場合は、 ~/.sniffs/{{Intalled Coding Rules}}
cd ~/
curl -LO https://github.com/cakephp/cakephp-codesniffer/archive/update-fxer-2.zip
unzip update-fxer-2.zip -d sniffs
cd ~/.sniffs/

# ~/.sniffs/{{NAME}} になるので正しい名前を命名する
# ※ ここでバージョン指定{{CakePHP2}} したいが、エラーになる.><;
mv cakephp-codesniffer-update-fxer-2 CakePHP

# 削除忘れずに
rm ~/update-fxer-2.zip

取得したルールを反映させる

# 取得したルールセットを反映させる
phpcs --config-set installed_paths ~/.sniffs/                           

# 反映を確認する
phpcs -i
The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz, Zend and CakePHP2

phpcbf -i
The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz, Zend and CakePHP2

実際に使ってみよう。

phpcs --standard=CakePHP /PATH/TO/CAKEPHP_APP/app/Controller/AppController.php

----------------------------------------------------------------------
FOUND 7 ERRORS AND 1 WARNING AFFECTING 5 LINES
----------------------------------------------------------------------
 33 | ERROR   | [ ] Expected 1 space before curly opening bracket
 36 | ERROR   | [x] Tabs must be used to indent lines; spaces are not
    |         |     allowed
 36 | WARNING | [ ] Possible useless method overriding detected
 36 | ERROR   | [ ] Missing function doc comment
 37 | ERROR   | [x] Tabs must be used to indent lines; spaces are not
    |         |     allowed
 37 | ERROR   | [x] Opening brace should be on the same line as the
    |         |     declaration
 38 | ERROR   | [x] Tabs must be used to indent lines; spaces are not
    |         |     allowed
 39 | ERROR   | [x] Tabs must be used to indent lines; spaces are not
    |         |     allowed
----------------------------------------------------------------------
PHPCBF CAN FIX THE 5 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------

インデントのタブの指摘が多すぎる。うあああああ。

インデントにタブ利用を許可するカスタマイズする

cd ~/.sniffs/CakePHP 
cp ruleset.xml ruleset.xml.org                                                      

# 62行目の'<rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>'をコメントアウト
vim ruleset.xml

### こうする
 <!-- <rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/> -->

diff ruleset.xml ruleset.xml.org 
62c62
<  <!-- <rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/> -->
---
>  <rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>
phpcs --standard=CakePHP /PATH/TO/CAKEPHP_APP/app/Controller/AppController.php

----------------------------------------------------------------------
FOUND 3 ERRORS AND 1 WARNING AFFECTING 3 LINES
----------------------------------------------------------------------
 33 | ERROR   | [ ] Expected 1 space before curly opening bracket
 36 | WARNING | [ ] Possible useless method overriding detected
 36 | ERROR   | [ ] Missing function doc comment
 37 | ERROR   | [x] Opening brace should be on the same line as the
    |         |     declaration
----------------------------------------------------------------------
PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------

これで、インデントのエラーが消え、本質的なコーディング規約を見ることができる。

CakePHP2 実践入門 (WEB+DB PRESS plus)

CakePHP2 実践入門 (WEB+DB PRESS plus)

CakePHPで学ぶ継続的インテグレーション

CakePHPで学ぶ継続的インテグレーション

PHPフレームワーク CakePHP 3入門

PHPフレームワーク CakePHP 3入門

AtomユーザがPHPStormに乗り換え、PHPStormのキーマップをAtomで説明

AtomユーザがPHPStormに乗り換え、PHPStormのキーマップをAtomで説明

概要

これまでAtomユーザだったが、会社でPHPStormを買ってもらった。PHPStormは、PHPに特化したIDEである。これで捗る...と思いきや、PHPStormとAtomのショートカットの違いで少し苦戦。

ということで、本記事はAtomでよく使うショートカットキーを、PHPStormに当てはめ説明していく。

f:id:hagetak:20161118173714p:plain

基本操作

最近開いたファイルを一覧

これは便利すぎる。

Command + E

同一単語を選択

Atom でいう、「Command + D」。同一単語を編集するときにすごく便利。 変数名をあとから変える時とか、これを多用しています。

Control + G

同一単語を全選択

上のControl + G を強化したもの。一括置換的なのは危険なので、基本的に同一単語を選択しまくって、編集が多いですね。

Control + Command + G

警告の解決方法を提示

Alt + Enter

最初のうちはかなり警告が来ますが、いらない警告はどんどん無効にする。 で、この無効にする作業を含めて、すべてキーボードで完結できるのはすごく便利。

コマンドパレット的な

Atom の コマンドパレット的(Command + Shift + P)な。 Plugin のあの機能を使いたい。でもショートカットがわからないって時によく使うやつ。 補完(検索)が強力なので、基本的にこの検索で飛べますよね。

Command + Shift + A

例えば、「左に行番号ほしい」と思ったら、

  • コマンドパレットを表示

Command + Shift + A

  • それっぽいワードで検索

number

  • それっぽいワードを発見

Show: Line number

まさにそれっぽい。それを選択すると、Preferences に飛ぶので、チェックを付ける。 (Enable, Disable 選択をココでできれば最高なのだが)

git Command

Git command などもここでちゃちゃっとできますね。

検索

おなじみ

Command + F

全検索

Command + Shift + F

全検索機能が強力で、結果も一瞬でその場に飛べてプレビューできるので素敵。ただ、下の検索結果が邪魔。Escape 連打しても消えない。。。

下にコンソールとか検索結果が出てうざい

Shift + Escape

ちょっとしたTerminal を使いたい

Alt + F12

こんなん覚えられない。F12までやりたくないって場合は、コマンドパレットを使っちゃいましょう。一瞬です。

Command + Shift + A ===> terminal

編集中

定義されているメソッド・クラスの内容を確認

このメソッドってなんだっけ、何が返ってくるんだっけって時に利用。 これを使わなくても良いようなメソッド名をつけるべきだが、現実はうまくいかない。

Command + Y

リファレンス表示

きほんてきい

Control + J

コード補完

入力中補完は効きますが、一度止めてしまうと補完が効かなりますよね。 再補完させるためのショートカットキー。

Contorl + Space

(自分の環境ではSpotLight がでてきたので、Spotlight のキーボードショートカットキーを変更した。 ※ 厳密には Alfred を別のショートカットキーを使っているので、無効にした。)

やさしいPHP 第3版 (「やさしい」シリーズ)

やさしいPHP 第3版 (「やさしい」シリーズ)

アップロードされたファイルをどこまでバリデーションするか(PHP)

アップロードされたファイルをどこまでバリデーションするか(PHP

概要

CakePHP1.3プロジェクト で、アップロードされたファイルを加工する必要があった。その際、アップロードされたものをどこまでバリデーションを行うか、が問題である。

ここが長すぎたら Controller が肥大化し( ValidationClass を作っても良いが)、 簡単なバリデーションだといつか痛い目にあう。

スクリプト

簡易的ではあるが、僕は以下のようにバリデーションを行う.

class AdminController {

    /**
     * アップロードファイル([].csv)を受け取る.
     * @return 
     */
    public upload_file()
    {
        // POST 以外は受け付けない(cake1.3)
        if (empty($this->data)) {
            echo 'POST ではありません.';
            return false;
        }

        // 変数が存在しているか確認.
        // これを抜きにすると, `is_uploaded_file()` で Warning が発生
        if ( !isset($data['ThisModel']['row_file']['tmp_name']) || !isset($data['ThisModel']['row_file']['name'])) {
            echo 'ファイルが見つかりません.';
            return;
        } 

        // アップロードファイルか確認
        if ( !is_uploaded_file($data['ThisModel']['row_file']['tmp_name'])) {
            echo '不正なアップロードです.';
            return;
        }

        // アップロードファイルをゴニョゴニョ
        $uploaded_fp = fopen($this->data['ThisModel']['row_file' ]['tmp_name'], 'r');
    }
}

良いアイディアが有りましたら、コメント頂けると幸いです。

メタプログラミングとは - Rubyを例に説明

[メタプログラミング]最近良く聞く、メタプログラミングとは

最近、メタプログラミングという言葉をよく聞く。といっても、結構前からだが、意識し始めたのは最近。

メタってなんだよ、メタってと思っていた時期がありましたが、ようやくなんぞやと調べる気になった。

ruby の技術力を少しずつ上げていきたいので、ruby を例に説明する。

メタプログラミングとは

meta_programming_08.rb

class Rabbit
  class << self
    def colors
      [:black, :brown, :white, :mixed]
    end
  end
end
 
p Rabbit.colors

また、クラスメソッドを定義することは、現場のコードでしばしば見られるパターンなのに、> 実際は複雑であることも理由の一つです。Ruby初心者からすると、「class << self」のよう> なコードを見たら、ギョッとすることでしょう(私もそうでした)。

コンパイルなしに実行できる

ゲッターとセッターを自動生成

いくつものインスタンス変数があり、それぞれにゲッター/セッターを定義するのは面倒である

そこで、このメタプログラミングを用いて、(実行時に)自動生成させる

class Item
    def get_price
        @price
    end
    def set_price v
        @price = v    
    end

    def get_name
        @name
    end
    def set_name v
        @name = v        
    end
    # インスタンス変数の数だけセッターとゲッターが存在する
end
class Item
    def define_accessor *plist
        self.class.class_eval do
            plist.each do | property|
                define_method "get_#{property}" do
                    @property
                end
                define_method "set_#{property}" do |v|
                    @property = v
                end
            end
        end
    end
end

item = Item.new
item.define_accessor "price", "name", "category"
item.methods.grep(:get_price)

個人的にこれはよく書けたな、と自画自賛をしたいところだが、ネストが深い。

さいごに

ざっくりメタプログラミングというものを知った。動的にメソッドを追加することなのかな。初見では、メリットが分かりづらかったが、セッター・ゲッターの例から少し便利さを知ることができた。

こうしたほうが Ruby っぽい。こうしたほうが綺麗。テクニックなど、教えて下さい。

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

冪等性(べきとうせい)とは

冪等性(べきとうせい)とは

ココ1年くらいで、冪等性(べきとうせい)という言葉を何度も聞いた。 ついに業務でもこの言葉が出てきたので、改めて意味を調べてみることにする。

冪等性とは

冪等性とは、ある操作を1回行っても複数回行っても結果が同じであることをいう概念である。

よく例にあげられるのは、i = 0i = i + 1 である。

var i = 0; // i は必ず 0 になる:冪等性が保たれる


// 実行する度に i が 1 足される。(実行回数によって、 i の値が変わってしまう)
// :冪等性が保たれない
i = i + 1 

他に例を挙げるなら、 copy も同様である。

copy a.txt b.txt # copy できた

copy a.txt b.txt # 既に b.txt があるため、copy できない overwrite b.txt? (y/n [n])

インフラと冪等性

この概念をインフラ構成に組み込んだのが、ChefAnsible などである。 システムの機能を変更するなら、サーバーをぶっ壊して、新しく作りなおすというものである。

サーバに nginx がインストールされていれば、繰り返しインストールすると、エラーが返ってくる

を何度実行しても Nginx がインストールされて起動した状態に収束し、何回も繰り返しインストールされたり、既にインストールされているからといってエラーになったりすることはありません。
ほとんどの場合、 Chef の動作は冪等性が保証されていますが、 Script や Execute などの DSL は書き方によっては冪等性が保証されないことがあります。
ですのでレシピを書く際は冪等性が保証されるように意識的に作り込んでください。

from: http://blog.schoolwith.me/chef-re-introduction/

REST と冪等性

  • GET

/show/1

API の種類にもよるが)これは、必ず ID の値が 1 のデータが返ってくる。 何度も、show/1 にリクエストを送っても、 1 のデータが返ってくる。

  • DELETE

/delete/1

id が 1 であるデータが削除される。これも冪等性が保たれる。

おわかりだろうか。

冪等とは「ある操作を何回行っても結果が同じこと」を意味する数学用語です。たとえばPUTとDELETEは冪等ですので、PUTやDELETEを同じリソースに何回発行しても、必ず同じ結果(リソースの内容が更新されている、リソースが削除されている)が得られます。
安全とは「操作対象のリソースの状態を変化させないこと」を意味します。リソースの状態に変化を与えることを副作用といいますので、安全は「操作対象のリソースに副作用がないこと」とも言います。たとえばGETには副作用がないので、GETを同じリソースに何回発行してもリソースの状態は変化しません。

http://blog.ruedap.com/2011/03/25/http-method-post-put-idempotence

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

実践編

http://blog.schoolwith.me/chef-re-introduction/

さいごに

冪等性。冪等性を理解するのは、難しい。実際に AnsibleChef を使ってみることで、有り難みが理解できるのかな。

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

PHPで時刻の範囲内で処理を行う。

はじめに

卒業制作をしていて、証券取引所の取引可能時間内(9:00 - 15:00)で取引が行うようにする必要があった。 範囲内で作業を分けるようなTipsがなかったの、執筆してみる。

コード

<?php

// date('Y-m-d **:**:**') で範囲を設定する
$start_date = date('Y-m-d 9:00:00');
$end_date = date('Y-m-d 15:00:00');
$today = date('Y-m-d h:m:i');

// 計算できるようにミリ秒にする
$start_time = strtotime($start_date);
$end_time = strtotime($end_date);
$today_time = strtotime($today);

if($start_time <= $today_time && $today_time <= $end_time){
  // start_date <= today <= $end_date
  echo 'inner';
} else {
  // !start_date <= today <= $end_date
  echo 'outer';
}

パーフェクトPHP

パーフェクトPHP

プログラミングPHP 第3版

プログラミングPHP 第3版