2018年7月26日木曜日

趣味のランニング

3年ぶりのエントリーです㊗️
最後のエントリーが 2015年6月、ブログの存在ほぼ忘れていました😂

久しぶりに書きたくなり、3年を取り返すぐらいの素晴らしい投稿でも出来たら良いですが「趣味であるランニング」の内容になります😅😅

さて本題。

2011年春頃からスポーツジムに通い出し、8割スイミング、たまにトレッドミルでランニングといった具合で運動を始めました。

2013年秋頃からジム内を飛び出し街中へ出てランニングするようになったんですが、近所で一番走りやすいコースが「ラブホ街をグルグル回る」というキショいコースで、
数々のカップル(色んな愛の形)に気を使いながら何が楽しく走れるものか❗️、でも健康管理のためと続けていました。

趣味と言えるようになった転機は、2014年秋頃。
大阪城公園🏯を走る機会があったのですが、公園内の空気の良さ・走りやすさ・緑に囲まれた中を走る爽快さに魅了されてしまいました。
大阪城公園でランニングした事で「楽しい😆最高😆😆」と思えるようになり、練習もちゃんとするようになりました(自宅から4km離れた大阪城公園へわざわざ行って)。
それは今も変わりありません。

といっても10-15km (5:10/km - 5:20/km ペース)ぐらいを週に1、2回程走り、年間 1000km 前後といった中級ランナーですが、大きな怪我も無く、毎週大好きな大阪城公園を楽しく走っています。

ところが、2018年5月末に左足小指を豪快に骨折😵
6週間も走れない日々を過ごす羽目になりました。
この中断は本当に辛かったです。

好きな事が出来ない日々は、何をしても楽しく感じれないのでしょうか、
仕事もどこか楽しくなく、集中できません。
ランニングと仕事は相互に良い影響を与えながらサイクルしていたようなので、6週間ずっと些細な事でイライラ💢してた気がします。

今は怪我も治り、ランニングも再開😎
無理せず少しずつ元のペースに戻している最中ですが、
予期せぬ中断となる前より楽しさを感じている気がします。
好きな事ができるってのは、喜びでありホント感謝すべき事です。

長文ダラダラになってしまいましたが以上。

2015年6月3日水曜日

オススメの日課

[毎日自分に問いかけるべき6つの質問 ?]

- 目標に近づくための仕事ができたか?
- やめるべき悪い習慣はないか?
- 今日私のモチベーションを高めてくれたのは何か?
- 今日1日、なりたい自分だったか?
- 今日どんな失敗をして、そこから何が学べたか?
- 今日感謝することは何か?

今からでも遅くない、1日の終わりの自分への質問。

2015年1月3日土曜日

今年の抱負

久々のブログです。
2015年になり、今月末に37歳になります(・ε・` ) 

一年の計は元旦にありという事で、今年の目標を 3 つ掲げました。

1. 何事にも自らリーダシップを取って行動する

仕事の話です。
今の会社に入って1年5ヶ月経ち、人や仕事にすっかり慣れ、一定水準の信頼と実績は出来てきたと感じています。
しかし、まだまだ全然納得いかない点があります。
提案型の営業が非常に弱かったり、プロジェクトを進めるのが下手過ぎたり、思いつきで挙げても結構大きな問題がいくつも出てくるのです。
昨年までは自分でやってる仕事はこなしていても、全体的な事に関してはかなり観察しているだけでした。

しかし観察していても、誰もリーダシップ取らない、後回しになってスピード感や危機感が無い、やると決めても抜けモレが目に余る、かなり我慢の限界でした。

今年は自ら変えて行こうと決めました。
同じ考えの人と年末年始話が出来、一人では当然出来ませんし、すぐ改善効果が見える事は無いと思います。
容易では無いミッションであることも自覚しています。
ただ、少しずつ長いスパンで会社、そして個々の意識を変えて行く。

2. プライベートをとことん楽しむ

仕事ばかりの人生じゃつまらないので、プライベート面でも目標を掲げてみました。
今年は色んなライブや好きなテクノパーティに行こうと思います。
良い曲、良い音はライブより勝るものは無いと思ってます。
ここ数年で音楽を生で聴く機会がめっきり減ってしまっていたのですが、今年はもっと堪能したいと思います。

3. フルマラソンを完走する

昨年末初めてハーフマラソンに参加して完走しました。
またランニング好きのメンバーでリレーマラソンにも 2つ程参加し、良い成績を収める事が出来ました。
30 歳を過ぎて新陳代謝が悪くなってきたのを実感し出して、それから肥満防止や健康維持目的でランニングやスイミングを継続的に続けて来ましたが、特にランニングは楽しくて趣味になりました。
今年は昨年応募したけどハズレた大阪マラソン、または神戸マラソンに是非当たって、完走したいと思います。

2014年10月5日日曜日

郵便番号データ+検索について考えてみた

郵便番号データ、郵便番号検索についてエントリをしてみようと思う。

この郵便番号データってやつは、様々なアプリで必要な場面が多い。
日本郵便が提供していてダウンロード可能であるが、市区町村統廃合等の理由により月1度なり最新化されるので、 ある時点で取得しても、そのうち最新データでなくなってしまう。

こういった問題の解決方法の一つとして、AjaxZip3 というプロダクトもあって メンテナンスも AjaxZip3 側でしていただけるので、 コレを使えば、郵便番号検索は凄く簡単に実装出来るし、常に最新のデータを参照出来る。

自分もこの AjaxZip3 は 5年前ぐらいから数回使っていて、 便利だなと思う。
しかし、個人的にただ一つ物足りないのは、郵便番号7ケタ入力しないと住所補完してくれない点。
Google 日本語入力 のようなサジェスト機能を用いて、インクリメンタル検索出来れば、もっと使いやすいなと個人的には思う。

AjaxZip3 が対応してくれれば嬉しいんだけど、たぶんこの先も対応されないと思うので、常に最新の郵便番号データを使いつつ(※1)、郵便番号検索する際はインクリメンタルに出来るようにする(※2)には、自分で実装するしか手立ては無さそう。

※1 はお決まりな方法やけど、実際に作ってみた。
※2 は別の機会に公開するかも。

[動作環境]
  • CentOS release 6.5 (Final)
  • MySQL 5.1.73
#!/bin/sh
# ====================================================================
# $Id$
#
# Description:
#  郵政省郵便番号(zip_codes) を最新化します。
#
# Usage:
#   ./renew_zipcodes.sh
#
# Date        Author      Description
# --------------------------------------------------------------------
# 2014-10-05  Seiji Hojo  新規作成
#
# ====================================================================

# 設定ファイル読み込み
. "./config/renew_zipcodes.ini"

# ====================================================================
# 前処理
# ====================================================================

# clean
find ${TMP_DIR} \( -name "KEN_ALL.CSV" -o -name "ken_all.zip" \) -print0 | \
xargs -0 --no-run-if-empty rm 2>/dev/null

# ====================================================================
# 本処理
# ====================================================================

# zip ファイル取得
wget ${ZIP_ALL_URL} -P ${TMP_DIR}

# zip 解凍
cd ${TMP_DIR}
unzip $(basename ${ZIP_ALL_URL})

# テーブル再作成
${MYSQL_CMD} < ${SQL_DIR}"/drop-create-zipcodes.sql"

# データ投入
${MYSQL_CMD} <<SQL

-- Shift_JIS ファイルを読み込む
SET character_set_database=sjis;

-- 郵政省郵便番号(zip_codes) に最新データ投入
LOAD DATA INFILE "/tmp/KEN_ALL.CSV"
INTO TABLE zip_codes
FIELDS
    TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
LINES
    TERMINATED BY '\r\n'
IGNORE 0 LINES
;

-- 「以下に掲載がない場合」は消す
UPDATE zip_codes
SET address = NULL
WHERE address = '以下に掲載がない場合'
;

SQL

# ====================================================================
# 後処理
# ====================================================================

# clean
find ${TMP_DIR} \( -name "KEN_ALL.CSV" -o -name "ken_all.zip" \) -print0 | \
xargs -0 --no-run-if-empty rm 2>/dev/null

# end
exit 0


[補足・注意]
コピーして使っても構いませんが、一切責任持ちません。
動作テストはしてますが、cron 実行とかはまだ試していません。

[参考]
AjaxZip3
https://code.google.com/p/ajaxzip3/
AjaxZip3 設置サンプル(お試し出来ます)
http://ninkigumi.com/ajaxzip3/
郵便番号データダウンロード - 日本郵便
http://www.post.japanpost.jp/zipcode/download.html

2014年10月4日土曜日

CakePHP で独自の親クラスを作成する場合の注意点

CakePHP で、全てのコントローラに共通な内容であれば AppController に記述すれば良いけれど、
全てのコントローラに共通する内容で無かったり、ある特定のドメインや機能で共通化を図りたい場合、どう解決するか?
まず思いつくのが AppController と各コントローラの間に独自親コントローラ (以下、DomainController) を作成する方法。
CakePHP でコントローラを作成する場合、AppController を継承して作成するが、
AppController を継承した DomainController を継承してコントローラを作成するようにする。

AppController
全てのコントローラに共通するプロパティやメソッドを定義。

DomainController
ある特定のドメインだけに共通するプロパティやメソッドを定義。

各コントローラ(以下、MyController)
自身に必要なロジックだけを記述。

継承関係が適していればそうしたいけれど、この方法だと DomainController で定義した components, uses といったプロパティが自動マージされず、 DomainController を継承している MyController で参照出来ない。
AppController を直接継承している MyController では、これらプロパティは CakePHP が自動でマージしてくれるて参照出来るのに。。。
DomainController でも共通化ロジックを書くために components, uses といったプロパティを定義する必要があるので、自動マージしてくれないとせっかく共通化したのに MyController で同じ記述しないといけない(全てじゃないにしろ)。。。

何故か?
原因を探ろう。

自動マージされず参照出来ない理由は AppController の親クラス Controller の $_mergeParent にあります。
Controller クラスをソースコード読めば、AppController を直接継承している MyController では自動マージが行われるのかが逆に分かります。
ちなみに Controller::$_mergeParent の値を AppController から DomainController に変えると、今度は AppController で定義している uses などが自動マージされなくなって参照出来なくなる(当たり前)。

ちょっと前置きが長くなったけれど、これを解決する方法は調べると複数あったけれど、
自分は下記のようなアプローチでこの問題を解決するようにした。
class DomainController extends AppController {

    /**
     * コンストラクタ
     * 
     * @see Controller::__construct()
     */
    public function __construct($request = null, $response = null) {

        // uses, components をマージ

        $this->uses = am($this->uses, array(
            'User',
            'Label',
         ));

         $this->components = am($this->components, array(
            'Me.AuthTest',
         ));

    }

    // 以下、共通ロジックなど ...

}
class MyController extends DomainController {

    public $uses = array('Employee');

    public $components = array('Search.Prg');

    public function index() {

        debug($this->uses); // User, Label, Employee + AppController::uses
        debug($this->components); // AuthTest, Search + AppController::components

    }

}


[参考]
CakePHPで独自に定義した親クラスでのComponentとHelperのマージ
http://qiita.com/uda0922/items/e9501c46f5b4cd91106a
$componentsと$helpersと$uses — CakePHP Cookbook 2.x ドキュメント http://book.cakephp.org/2.0/ja/controllers.html#components-helpers-uses

Trello を使って仕事をもっと楽にしよう

随分ひさしぶりの更新です。

今日は 2012 年ぐらいから使ってきていて、無くてはならない Trello というツールの紹介と、
自分なりの使い方を簡単に紹介しようと思います。

Trello は有名なツールで、 もっと分かりやすく説明されているページが世の中に多数ありますが、 大まかに書くと「●●する」といった大小様々な仕事を、ホワイトボードに付箋を張って管理していくようなイメージのツールです。

付箋を「カード」という形で表現し、 それを優先順位やタスクの種類等によって色分けしたり、 タスクの進行状況を「グループ(リスト)」で分けたり出来ます。
パソコン、タブレット、スマートフォンでもアプリがあって、 どの端末でも書けます、見れます。
どの端末で書いても、他の端末でその内容がスグ見れます。

そんな素敵なツールです。 

自分の使い方はこんな感じ(左:パソコンで見た画面、右:iPhoneで見た画面)

  


自分は大きく分類すると6種類ぐらいの仕事をしていて、
その場所もデスク、上の階、別の店舗、客先等と様々。
この何処でも書けて見れて、直感的に触れる Trello は素敵過ぎます。

「カード」を色分け出来るんですが、自分は仕事の種類を分けるのに使っています。
「グループ(リスト)」は進行状況を管理しています。
5つ作っていて、下記のように使っています。

 ・Idea & Memo
その名の通り、アイデアやメモを管理するグループ

・Things Comming Up
言わば Todo の事。
でも ToDo って言われると MustDo みたく「やらないとイケない」ってイメージがあったので名前変えましたw

・Today
今日のタスク。 ここは帰る時には無くなっている状態ですね。

・Doing & Waitng
ここは現在進行中のタスク。何とかなう!ですねw

・Done
終わったタスク(お疲れ様でした)

「カード」は、パソコンならマウスで掴んで別のグループに移動出来ます。
タブレットやスマホなら指でスワイプして移動出来ます。
凄く直感的で、Trello 知らない人でも、こういうツール使った事無かった人でも
教えたら結構すぐ使えるようになって、数日経てば普通に使っています。

特にテンパってる人向けの救世主的解決方法だと思うので、
もっと信仰してみようかなwww

[参考]
海外注目クラウド 3/100「Trello」
http://cloud-plus.biz/blog/?p=265

カード型タスク管理ツール「Trello」で行うタスク管理のご紹介
http://news.ko-zu.com/trello/

2014年5月10日土曜日

CakePHP で複数のデータベースのテーブルを Join する

先日、複数のサブシステムを統合した社内システムを開発してリリースした。
裏話というか Tips になるけど、
開発に着手しはじめ、技術仕様について考えていた時、もっとも考え込んだのはデータベース。
複数のサブシステムのあるシステムなので、サブシステム毎にデータベースを分けて管理したいと思っていた。

共通化出来るエンティティ群と4つのサブシステム毎にあるエンティティ群をリンクする必要がある事が分かり、
リンクが必要な際はデータベースが異なるテーブル同士を JOIN して。。。
しかし CakePHP で複数データベースを取り扱った事が無く、
また CakePHP のモデル同士を繋ぐアソシエーションの設定や Model->find のオプションで、異なるデータベースのテーブル同士の JOIN が可能なのかも知らなかった。
Model->query で出来るのは分かるけど、非常に便利なアソシエーションや Model->find で出来ないと CakePHP の恩恵が半減するので調べてみたところ、Model->find でも異なるデータベースの JOIN が出来るのが分かったのが大きかった。

実際に実装に組み込んだものだが、例として共通テーブルの Shop と、サブシステムAの Report テーブルを JOIN してみる。
※実際はもっとリファクタリングして共通化したりしているけれど
class Shop extends AppModel {

    public $useDbConfig = 'commons';

}

class Report extends AppModel {

    public $useDbConfig = 'sub-a-systems';

    public $belongsTo = array(
        'Shop' => array('type' => 'INNER'),
    );

}

class ReportsController extends AppController {

    public $uses = array('Report');

    public function index() {

        $model = $this->{$this->modelClass};

        $reports = $model->find('all', array(
            'fields' => array(
                'Report.*',
                'Shop.name AS shop_name',
            ),
            'joins' => array(
                array(
                    'type'       => 'INNER',
                    'tables'     => 'commons.shops',
                    'alias'      => 'Shop',
                    'conditions' => 'Report.shop_id = Shop.id'
                ),
            ),
            'recursive' => -1,
        );

    }

}
そう、ただ joins オプションの tables プロパティの値にテーブル名を入れれば出来るようでしたwww
もし同じような事を検討している人がいたならば、参考になれば幸いです。

[参考]
モデルの属性 — CakePHP Cookbook 2.x ドキュメント http://book.cakephp.org/2.0/ja/models/model-attributes.html