読者です 読者をやめる 読者になる 読者になる

株式会社クイックのWebサービス開発blog

HAPPYなエンジニア&デザイナーのブログです

Docker-composeでCentOS7のコンテナを立ち上げてhttpdサービスを起動してみた

こんにちは、みっきーです。

先輩からDockerを引き継いだは良いものの、何がなんだかさっぱり・・・。
そこで今回は、Dockerで遊んだ記録を書きたいと思います。
途中、実行に失敗するのでご注意ください。

登場人物のステータス

  • みっきー(私):新卒1年目
  • みっちー   :SREチームの、さわやかイケメン先輩

環境

OS Docker Engine
CentOS7 1.12.3

概要

  • Docker-composeでCentOS7のコンテナを立ち上げる
  • コンテナを立ち上げた時点で、httpdサービスが起動してる状態にする

とりあえずやってみる

Docker Engineのインストール

$ yum update
$ curl -fsSL https://get.docker.com/ | sh
$ systemctl start docker

動かない!!
そういえばインストール時に作成されるグループに実行ユーザを登録しないとだめって言われたような・・・

ということでdockerグループにユーザを追加

$ sudo usermod -aG docker mikki
$ sudo usermod -aG wheel docker

ついでにwheelにdockerユーザを入れておくと、いちいちsudoしなくて済むらしいです。

切断再接続後、DockerEngine起動

$ systemctl start docker
$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) 

起動しましたぁ!

CentOS7のイメージをひっぱてコンテナを立ててみる

$ docker pull centos:7
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   67591570dd29        3 months ago        192 MB

$ docker run centos:7
$ docker ps -a
b9f8c5ca727a        centos:7            "/bin/bash"              18 seconds ago      Exited (0) 17 seconds ago                          elegant_banach

”Exited (0) 17 seconds ago”一瞬で落ちてるじゃーん!
Bashにアクセスしたいよー。ということで起動時にオプションを追加

$ docker run -it centos:7
[root@7cbf45351e50 /]#

CentOS7のコンテナを立ち上げることに成功! 簡単ですね♪

Apache2.4とphp5.6をインストール

# yum -y update
# yum -y install httpd
# yum -y install epel-release
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum -y install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd
# systemctl start httpd
Failed to get D-Bus connection: Operation not permitted

ん?
rootなのに??なんで??
どうやら、コンテナを立てる際に–privilegedを付けてあげないといけないようです。
詳しいことはこちらを参照
Docker privileged オプションについて - Qiita
CentOS7 に Docker をインストールし、CentOS7コンテナ上で Apache を起動する: ある SE のつぶやき

# exit
$ docker run -it -privileged centos:7 -p 8080:80 /sbin/init
Apache2.4とphp5.6をインストール
# systemctl start httpd

動いた!!

ここからやっとDocker-compose.yml作成

まずは、Dockerfileの作成

コンテナ内で行ったことをそのまま書き込み

FROM centos:7
MAINTAINER "mikki"

RUN yum -y update

# install apache2.4
RUN yum -y install httpd

# install php5.6
RUN yum -y install epel-release
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum remove php-*
RUN yum -y install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd

CMD docker-entrypoint.sh


docker-entrypoint.shの中身
#!/bin/bash
system enable httpd
system start httpd
system status httpd

docker-compose.yml作成

ここで問題発生。
私、yamlの書き方知りませんでした。。。
困ったぞと、お昼休みに歯磨きを始めたら救世主みっちーさんと出くわします。

私「みっちーさん。Dockerがゆうことを聞いてくれないんです(泣)」
    中省略(やりたいこと伝え中)
みっちーさん「とりあえずこうかけばいいよ!」

ババーン!

version: '2'
services:
  web:
    build: ./docker
    ports:
      - "8080:80"
    volumes:
      - ./:/var/www/html
    working_dir: /var/www/html
    privileged: true
    command: /sbin/init

やったーyamlクリアした-!
コレでやっと立ち上がるぞ!!と思ってbuild後upしたら

$docker-compose build
$docker-compose up
Starting masano_web_1
Attaching to masano_web_1

とまった・・・。
ブラウザからアクセスできず、bashに入ってサービスが立ち上がってるか確認しても動いてない!!
次の日の朝、みっちーさんが出勤してきてそうそうにヘルプを出すことに。

私「みっちーさんみっちーさん動かないよぉ。あ、おはようございます。」
みっちーさん「おはよー。うーん。ちょっと調べてみるね。」

ということで、救世主みっちーさん、Dockerを触ったことがなかったのに色々調べてくれました。


概念的な話
そもそも、Dockerfile には「コンテナ”起動時”に実行してほしいコマンドは書かない」
(らしいです)
→ サービスの起動とか、コンテナが立ち上がった時にやってほしいことは、ここでは書くべきでは無いらしいです。
※ ここで書くのは、コンテナイメージを作る=docker compose build した時に、実行してほしい内容(rpmのinstallとか、ファイルのコピーとか)を書く。
じゃあサービスの起動はどーしたらいい?
→ Centosの起動時に、サービスが自動で立ち上がるようにすれば良い。
  = CMD systemctl enable httpd って書いてあげれば良い。
みたいです。
全部グーグルせんせーの受け売りですが・・・

docker-compose.yml の編集 (とりあえずこんな感じで

# vi ./docker-compose.yml
version: '2'
services:
  web:
    #build: ./docker
    build: /home/micchi/docker
    ports:
      - "8081:80"
    volumes:
      - ./:/var/www/html/micchi_test
    working_dir: /var/www/html/micchi_test
    privileged: true

Dockerfile の編集 

# vi ./docker/Dockerfile
FROM centos:7
MAINTAINER "micchi"

# install apache2.4
RUN yum -y install httpd

# install php5.6
RUN yum -y install epel-release
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum remove php-*
RUN yum -y install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd

# enable service.
RUN systemctl enable httpd

# exec.
CMD ["/sbin/init"]

動いた-!!
自分でDockerfileやcomposeを書いたことがなかったので、すごくいい勉強になりました。
覚えちゃえばDockerなんて怖くないですね!お強い味方になりますね!!
開発環境も作り放題の配布し放題です~!

これで少しは、インフラ音痴を脱却できるといいなぁ。

ブラックサンダー買いに行きたいので、今日はこの辺で失礼します(`・ω・́)ゝ

EmacsからSpacemacsに乗り換えました

こんにちは、五所です。

最近、EmacsからSpacemacsに乗り換えました。

f:id:aimstogeek:20170209100723p:plain

結論としては、非常に快適です。

EmacsVimに対する想い

Emacsは、拡張性が非常に高いです。 エディタの枠を超えて、ファイラー、Gitクライアント、ターミナルエミュレーター、Webブラウザ、画像ビューア、などで使えます。 またタグジャンプや auto-complete.el を使えばIDEとしての機能も満足できます。

Vimは、圧倒的なテキスト編集の速さが売りです。UIが優れています。

EmacsではCtrlキーを常に押している必要がありますが、Vimではモードの切り替えの概念があるため、カーソル移動時と入力時の指の使い方が全く異なります。 これが心地よく、キーコンボを入力するのは、まるで格ゲーをしているような気分にさせてくれます。

Spacemacs

spacemacs.org

両者を統合したのがSpacemacs(正確に言えばEvilパッケージ)で、 Emacsの高い拡張性の上で、VimのUIを実現しました。 またSpaceキーを起点としてEmacsのコマンドを発行することで、より速く効率的なキーバインドを実現しています。

公式サイトでは

The best editor is neither Emacs nor Vim, it’s Emacs and Vim!

と言っています。

日本語の紹介記事もちらほらあります。

spacemacsについて ~~spacemacsが最強で最高で神エディタであると思い始めた件~~ - Qiita

Vimも秘伝のタレも飲み込むEmacsの超強力ディストリビューションSpacemacsまとめ - Qiita

少しだけ紹介すると、

  • Space f f でファイルを開く
  • Space g s で Git status
  • Space w w で ウィンドウ切り替え
  • Space w - で ウィンドウ水平分割

など、かなり直感的です。

日本語入力について

※ ここからはLinuxでの話です。Macの方は別の解決策があるんじゃないかなと思います。Windowsは(ry

Vimは、日本語入力との相性の悪さが随所で指摘されています。

特にターミナルで使っている時は、モード切り替えによって、インサートモードからノーマルモードに移行すると、日本語入力のままになるので不便です。

これを防ぐために、

.vimrc

autocmd InsertLeave * call system('fcitx-remote -c')

という設定もありますが、特定のIMEに依存した挙動をあまり入れたくはありません。

Emacsでは、 mozc パッケージを使うことによりEmacs上で日本語を入力できるようになります。

Emacsが日本語入力を制御するので、非常に柔軟な挙動が実現できています。

またMozcはGoogle日本語入力オープンソース版なので、使いやすいでしょう。

SpacemacsでEvilモードを使ってVimキーバインドを再現している時は、ターミナルのVimの日本語入力より数段快適です。

下記のような挙動です。

  • ノーマルモードに切り替えると、自動的に日本語入力OFF
  • インサートモードに切り替えると、自動的に日本語入力ON

で、これはSpacemacsとはあまり関係が無いのですが、EmacsでMozcを動かす設定です。

~/.spacemacs

(defun dotspacemacs/layers ()
  ;; (中略)
  (setq-default
   dotspacemacs-additional-packages '(
                                      mozc
                                      )
  ;; (中略)
   dotspacemacs-install-packages 'used-only))


(defun dotspacemacs/user-config ()
  ;; (中略)

  ;; Mozc settings
  (set-language-environment "Japanese")
  (setq default-input-method "japanese-mozc")
  (setq mozc-candidate-style 'echo-area)

  (defun mozc-start()
    (interactive)
    (set-cursor-color "blue")
    (message "Mozc start")
    (mozc-mode 1))

  (defun mozc-end()
    (interactive)
    (set-cursor-color "gray")
    (message "Mozc end")
    (mozc-mode -1))

  (bind-keys*
   ("<henkan>" . mozc-start)

  (bind-keys :map mozc-mode-map
             ("q" . mozc-end)
             ("C-g" . mozc-end)
             ("C-x h" . mark-whole-buffer)
             ("C-x C-s" . save-buffer))

  )

Mozcが有効になっている時は、カーソルの色を変えています。もっと分かりやすい色にしないと。

また、自分はUSキーボードを使っているので、下記の設定で右AltをHenkanキーにリマップしています。

~/.xmodmap

! Clear alt mapping
clear mod1

! Alt_R => Henkan
! Set Henkan to Fcitx & Emacs IME activation key
keycode 108 = Henkan Henkan NoSymbol NoSymbol

Mozc自体のインストールは下記です。Archはパッケージ名が fcitx-mozc と競合するので注意。

# Arch
sudo pacman -S emacs-mozc

# Ubuntu / Debian
sudo apt-get install emacs-mozc

これで、日本語入力ができるようになりました。

ススメ

Emacs派も、Vim派も、そうでない方もSpacemacsをぜひ試してみて下さい。

インストールは、GitHubのREADMEに従えば、迷うことは無いと思います。

github.com

Vue.jsの流行とネイティブアプリフレームワークWeex、そして台頭する中国語コミュニティについて

こんにちは。五所です。

最近は時代についていこうと、フロントエンドの情報収集をしています。

React, Redux, AngularJS, ES6, Webpack, Gulp, Babel, Yarn...

情報収集すればするほど、頭がいっぱいになるのですが、その過程で感じたこと、考えたことをつらつら述べさせて頂きます。

Vue.jsについて

github.com

Vue.jsは近年非常に盛り上がりを見せているJavaScriptフレームワークです。

特に2016年にすさまじい勢いで伸びました。

GitHubのスター数は2016年だけで26400獲得し、2017年1月21日現在では40000スターを超えています。

risingstars2016.js.org

Vue.jsは

  • the 10th most starred JavaScript project on GitHub
  • the 3rd most starred among all projects in 2016

とのことです。

medium.com

思想的にはReactに近く、仮想DOM、コンポーネント志向、シンプルなエコシステムなどが特徴です。

Weexについて

github.com

Weexは、Vue.jsを使ったiOS/Android用ネイティブアプリのフレームワークです。

ReactにおけるReact-nativeに相当するものですね。

開発しているのは、中国のアマゾンと言われ、Tencentと並ぶ中国最大のIT企業Alibabaです。

こちらのIssueにある通り、Weexは既に中国最大の通販サイトTaobaoのモバイル版で本番投入されています。

github.com

Vue.jsと合わせて今後も注目していく必要がありそうです。

台頭する中国語コミュニティ

こちらのHacker newsで指摘されている通り、WeexのGitHubでの意見交換は主に中国語で行われています。

we are using Weex for our app on production. Weex is pretty solid platform | Hacker News

作っているのが中国企業なので、当然といえば当然ですが。もちろん英語での議論もあります。

また、上述のVue.jsでも時折中国語でIssueが立ちます。Vue.jsの作者(Meteorの作者でもあります)が中国人であるためでしょうか。

github.com

ただし、単にこのIssueを立てた方が英語を使わないだけで、他のIssueはだいたい英語です。

Vue.jsとは関係ありませんが、SpaceVimの開発者も中国人で、QQのチャットルームがあり、Gitterでの会話も中国語+英語です。

github.com

SpaceVim/SpaceVim - Gitter

個人的な話

個人的な話で恐縮ですが、自分の通っていた一橋大学で、何人かの中国人国費留学生と友人になりました。

日本語上級、TOEFL110点以上、GPA4など秀才ばかりでしたが、 北京大学清華大学には(学力的に)絶対に入れないため、一橋大学に国費留学という道を選んだそうです。

認めたくはありませんが、これが事実です。

世界中の優秀なエンジニアと競争できるよう、日々勉強していかないといけないと思っています。

Visual Studio Codeの導入

フロントエンド開発 エディタ VSCode

はじめまして。マークアップエンジニアのsatopiiです。

ここ数年間テキストエディタSublime Textでコーディングしていましたが、Visual Studio Code(以下VSCode)ってどんなエディタなのか気になったので環境を整えてみました。

(2016/12/19追記)

インストールした拡張機能

Visual Studio Marketplaceにリンクしています。

ユーザー設定

CSSCombを有効化するためユーザー設定に以下の内容を追記。

{
  // CSS, scssファイル保存時にCSSCombを実行
  "csscomb.formatOnSave": true,
  // CSSComb設定ファイルのパス指定
  "csscomb.preset": "/path/to/.csscomb.json"
}

CSSプロパティオーダー並び替えはこちらのcsscombを参考にしています。

キーボードショートカット

[
  // CSSComb
  {
    "key": "cmd+shift+c",
    "command": "csscomb.execute"
  },
  // Runner
  {
    "key": "cmd+shift+,",
    "command": "extension.runner.start",
    "when": "editorTextFocus"
  },
  {
    "key": "cmd+shift+.",
    "command": "extension.runner.stop"
  },
  // FontSize Shortcut
  // 拡大のデフォルト設定が`cmd+=`に設定されている。
  // Macの日本語キーボードで使えないので別のキーに変更。
  {
    "key": "cmd+u",
    "command": "fontshortcuts.increaseFontSize"
  },
  // join-linesの機能がver 1.8.0から追加されたので、
  // キーボードショートカットを編集(ctrlキー使いなら変更不要)

  {
    "key": "cmd+j",
    "command": "editor.action.joinLines",
    "when": "editorTextFocus && !editorReadonly"
  }
]

Runnerのショートカット設定はMac の Visual Studio Code で C/C++/C# を実行するを参考にしました。

VSCodeのここが好き

  • 日本語化されている!
  • もうターミナルいらない?
  • gitを活用しやすい・見やすい!

もうターミナルいらない?

例:gulpを実行する1

  1. cmd+shift+pでコマンドパレットを開き、taskと入力
  2. 「Tasks: Run Tasks」→「default」を選択するとgulpが実行される

f:id:aimstogeek:20161214143719j:plain

f:id:aimstogeek:20161214143726j:plain

f:id:aimstogeek:20161214143735j:plain

実行されました༼ԾɷԾ༽✧

Runner Extensionでシェルスクリプトも実行可能

shファイルを開いてRunnerのショートカットを使えばコマンドが実行されます。

例:gulpを実行する2

f:id:aimstogeek:20161214143741j:plain

cmd+shift+,(設定したショートカット)

f:id:aimstogeek:20161214143746j:plain

実行されました༼•̀ɷ•́༽✧

gitを活用しやすい・見やすい!

gitを覚えたてなので、コマンド怖い病から抜け出せていません。
SourceTreeは重たいし、できれば使いたくない…。
そんな私を支えてくれるGitバー。

  • 追加・修正・削除したファイルが一覧になって見やすい
  • 修正した箇所のDiff表示がステキ
  • ファイル名の横にreset()、add()アイコンがあり、修正前の状態に戻したりステージングに上げることができる
  • ステータスバーの左にmaster/ブランチ名が表示されていてわかりやすい、切り替えやすい

f:id:aimstogeek:20161214143751j:plain

f:id:aimstogeek:20161214143756j:plain
コミットメッセージ入力欄があるので、メッセージはそこへ!

f:id:aimstogeek:20161214143801j:plain
「…」アイコンをクリックすると、gitコマンドメニューが表示されます。

まだcommit, pull, pushくらいしか覚えていない私には、今のところこれで充分かな、と。

VSCodeでできたらいいな

  • マウスも使う派なので、選択したテキストをドラッグしたい!
  • 全角英数字(+指定した任意の文言)をハイライトする拡張ほしい!

後者の拡張(AlwaysHighlight)はSublime Textで重宝していたんですよね。
絶対必須ではないけれど、全角英数字以外にも全角記号やダミー文言をハイライトしておくと、原稿をチェックしやすくなるという…。

できたらいいなという点は一旦目を瞑り、しばらくVSCodeをメインに使ってコーディングしていこうと思います。

PHPでStrategyパターンを考えてみよう

甘い食べ物は好きですが、マカロンさんとはいい関係を築けていません。

11月中旬にチームにジョインしたフルーツパーラーと申します。
アプリケーションエンジニアをしています。

最近触った事や、気になる事、深掘りしたい事を書いていこうと思います。
記念すべき初回のテーマは!!!

ジャーーーン!!

デザインパターン

硬い。。。硬いですね。初回にしては。 いや、初回だから。ですね。

という事で、 先人の知恵を元に、いかにもありそうな実装に落として、理解を深めようと思います。

デザインパターン関連の書籍はJavaで書かれたサンプルが多く、PHPで書かれたサンプルソースはとても少ない印象です。 PHPデザインパターンを利用したコードをさくっと手元で試したい。という方に向けてコードを書いて行きます。 こういう風にかける、というアイディアもコメントで頂けますと幸いです。

デザインパターンとは

デザインパターンとは、GoFGang of Four)が提唱した23個のパターンを指します。 1995年に書かれた本(通称GoF本)は、言語自体が進化した今となっては古いという声もありますが、 設計や実装の知恵として非常に参考になると思います。

各パターンに名前が決まっている事から、 ○○パターンで実装を考えているという言葉だけで実装する処理をイメージ出来るメリットがあります。

以下 wikipediaデザインパターン」より引用

それぞれのパターンは、プログラマの間で何度も繰り返し考え出されてきた。

したがって、それは最善の解決策ではないかもしれないが、
その種の問題に対するトレードオフを考慮した、典型的な解決策ではある。

さらに、コストがかかるかもしれない問題解決を実際に行う前の先行調査として、
大変役に立つ。

パターンに名前が付いていることが重要である。
なぜなら、名前が付いていることで問題や解決策を記述したり、
会話の中で取り上げたりすることができるようになるからである。

今回試すパターン

今回はポリモーフィズムで処理を行うStrategyパターンで進めます。

※ソースはページ下部にすべて記載しています。

Strategy パターンとは

Strategyとは「戦略」を意味します。

書籍やネットでは、条件によって、XML/JSONで出力切り替え、またはXML/CSVのインポートという内容をよく見ます。 ちょっと違う方向で進め、こういうケースでStrategyパターンが利用出来るか?を実証していきます。

◯◯を□□する。という処理があった場合に、◯◯の部分をStrategyとして実装しておくことで、 ◯◯の切り替えを簡単に行えるようにします。

Strategy パターンのメリット

Strategyパターンでは、処理の分離を行う事で、新たな処理を追加しても、既存の処理に影響なく実装を行えます。

1つの処理内に複数の処理が存在しない事から、if/switchの条件分岐が少なくなり、コードの可読性が向上します。 複数の関数を動的に切り替える。という風に考えるとイメージしやすいです。

1つの送信処理の中で、メール送信、SMS送信(他社APIを利用)、Push通知送信が存在した場合に、 新たに何らかの送信処理を追加すると、条件分岐が増え、修正作業が難しくなる事は容易に想像がつきます。

今回の実装

例として、1ユーザに、メールを送信する、SMSを送信する、Push通知を送信するという流れです。

実際に送信する部分は省略していますが、validationをどこにいれるか、例外処理をどこに持つか。 という事を考えると楽しくなりますので、お時間があれば手元でいろいろ試して見て下さい。

登場クラスの役割

  • User

    • メール送信ユーザの情報を保持
  • MessageStrategy

    • 各送信種類の親クラス
  • MessageContext

    • 各送信種類を内部で保持し、クライアント側(クラス利用者)から呼び出される
    • Strategyパターンの肝となるクラス
  • ConcreteMailMessage

    • メール送信処理を行う
  • ConcreteSMSMessage

    • SMS送信処理を行う
  • ConcretePushNotificationMessage

    • Push通知送信を行う

処理の説明

// 送信対象のテストUserインスタンス
$user = new User('Pさん', 'test@example.com', '090xxxxyyyy');
  • 作成した$userをMail送信クラスに注入します
// Mail送信
$strategy = new ConcreteMailMessage($user);
  • 作成したMail送信処理を、コンテキストクラスに注入
// Contextクラスにstrategyクラスを注入
$contextMessage = new MessageContext($strategy);
  • 送信処理
// 送信処理 注入されたオブジェクトのsend()メソッドをcall
$contextMessage->send();
  • 出力
// mail->to(Pさん) と出力される

SMS / Push通知に切り替える場合は

  • SMSを送信したい場合は、SMSに切り替えるだけ
// SMS送信
$strategy = new ConcreteSMSMessage($user);
  • Push通知を送信したい場合は、Push通知に切り替えるだけ
// Push通知
$strategy = new ConcretePushNotificationMessage($user);

簡単に切り替えられます。

まとめ

シンプルな条件分岐なので冗長に見えるかもしれませんが、 簡単に切り替えられた事が分かると思います。

各処理が別々で機能していますので、追加で新しい種類の送信処理を実装しても 既存の送信処理に影響はありません。

補足説明

実は、直接具象クラス->send()を実行する事も出来ます。 しかし、メール、SMS、Push通知のすべてがsend()メソッドを持っているかどうかは 実際に内部を見るまでわかりません。

// コンテキストクラスを利用しなくてもsend()する事は出来るが。
// インスタンスがsend()メソッドを持っている保証はない。クラス内を見るまで判断出来ない
$strategy->send();
// mail->to(Pさん) と出力される

コンテキストクラス(MessageContext)のコンストラクタで タイプヒンティングを行いインターフェースを統一しています。 それによって、send()メソッドが保証されます。

まとめのまとめ

簡単に書きたいと思って説明を書き始めましたが、硬いですね。
うまくお伝え出来ない部分も多々ありますので、下にソース全文を貼ります。
お手元で遊んで見て下さい。

それでは〜!

  • 実際に試したい方は以下ソースをご利用下さい。
<?php

/**
 * 送信対象のUserクラス
 */
class User {
    private $name;
    private $mail;
    private $tel;

    /**
     * 仮に利用するpropertyを定義
     * User constructor.
     * @param $name
     * @param $mail
     * @param $tel
     */
    public function __construct($name, $mail, $tel) {
        $this->name = $name;
        $this->mail = $mail;
        $this->tel  = $tel;
    }

    /**
     * 仮に名前だけ出力するためにgetter設置
     * @return mixed
     */
    public function getName() {
        return $this->name;
    }

}

/**
 * 抽象クラス
 * Class MessageStrategy
 */
abstract class MessageStrategy {
    protected $user;
    public abstract function send();
    public abstract function __construct(User $user);
}

/**
 * コンテキストクラス
 * Class MessageContext
 */
class MessageContext {
    private $strategy;

    /**
     * MessageContext constructor.
     * @param MessageStrategy $message
     */
    public function __construct(MessageStrategy $message) {
        $this->strategy = $message;

    }

    public function send() {
        $this->strategy->send();
    }
}

/**
 * 具象クラス(Mail)
 * Class ConcreteMailMessage
 */
class ConcreteMailMessage extends MessageStrategy {
    public function __construct(User $user) {
        $this->user = $user;
        // mailに関する前処理
        // ...
    }

    public function send() {
        echo 'mail->to('. $this->user->getName(). ')'. PHP_EOL;
    }
}

/**
 * 具象クラス(SMS)
 * Class ConcreteSMSMessage
 */
class ConcreteSMSMessage extends MessageStrategy {
    public function __construct(User $user) {
        $this->user = $user;
        // smsに関する前処理
        // ...
    }

    public function send() {
        echo 'sms->to('. $this->user->getName(). ')'. PHP_EOL;
    }
}

/**
 * 具象クラス(PushNotification)
 * Class ConcretePushNotificationMessage
 */
class ConcretePushNotificationMessage extends MessageStrategy {
    public function __construct(User $user) {
        $this->user = $user;
        // Push通知に関する前処理
        // ...
    }

    public function send() {
        echo 'push->to('.$this->user->getName(). ')'. PHP_EOL;
    }
}

// ------------------------------
// 実際に利用するイメージです
// ------------------------------

// 送信対象のテストUserインスタンス
$user = new User('Pさん', 'test@example.com', '090xxxxyyyy');

// Mail送信
$strategy = new ConcreteMailMessage($user);

// $strategyにどのクラスを代入するかでMail / SMS / PushNotification とsend()の振る舞いを変える
// SMS送信
// $strategy = new ConcreteSMSMessage($user);

// Push通知
// $strategy = new ConcretePushNotificationMessage($user);

// Contextクラスにstrategyクラスを注入
$contextMessage = new MessageContext($strategy);

// 送信処理 注入されたオブジェクトのsend()メソッドをcall
$contextMessage->send();

// コンテキストクラスを利用しなくてもsend()する事は出来るが。
// インスタンスがsend()メソッドを持っている保証はない。クラス内を見るまで判断出来ない
$strategy->send();

// mail->to(Pさん) と出力される

Excel作業の効率化 ~ショートカットと操作~

Excel ショートカット Windows データ分析

はじめまして。エンジニア見習い中のdaikingです。

私はこれまで、レポート作成・データの分析などの仕事をしていました。当時Excelにどっぷり浸かっていたので、今回は効率良くExcelを使い倒すための小ワザをいくつか紹介したいと思います。
全部は紹介しきれないので、自分の周囲でもこれははずせないと意見が上がったものを抜粋します。

注意)Windowsのショートカットです

こんな方におすすめ

  • データ分析でExcelを効率良く使いたい方
  • レポート作成をExcelで楽に済ましたい方
  • ショートカット大好きな方

目次

1. ショートカット
2. 操作

ショートカット

  • 使用頻度"高"のショートカット

ショートカットキー 説明
Alt + A + M 重複削除
Alt + D + S 並び替え
Alt + D + P + F ピボット
Alt + W + F + F 枠固定
Alt + H + O + I 列幅最適化

ここで取り上げたものは10回/日レベルの使用頻度です。
オフィスのアクセスキーなのか、Altを打った後ツールバーのナビに従うかは好みで使い分けてます。

  • 頻度低いがイケてるショートカット

ショートカットキー 説明
Alt + O + H + R シート名変更
Alt + E + L シート削除
Alt + Shift + F1 シート追加
Ctrl + Shift + & 罫線
Ctrl + Shift + \("ろ"の部分) 罫線消す

シート・罫線などはマウスに頼りがちですが、慣れると間違いなく便利です。

操作

  • 方向キー使わずシート内をすばやく操作

ショートカットキー 説明
Ctrl + 方向キー 現在のセルより"大きく"(※1)移動する
PageUp/PageDown マウスホイールを使用せず、シート上部・下部に移動する
Ctrl + Home A1セルに移動する
※1. 現在のセルより、指定の方向に向かって空でないセルまで移動

  • オートフィルタ使用時の項目操作

ショートカットキー 説明
Alt + ↓ 選択肢をプルダウンで表示
Space 選択肢のチェックボックスのオン・オフ切り替え
PageUp/PageDown/Home/End 選択肢をジャンプして上下に移動
Esc 表示されたプルダウンを閉じる


最後に

以上で紹介したものは、 手に馴染むことが非常に重要だと思います。
毎回調べてたらマウスの方が早い!

私もプログラミングの勉強を始めた当初は、cd?ls??pwd???と頭が混乱していましたが、
徐々に考える前に手が動くようになってきました。


これからExcel操作と格闘していく方、過去に格闘したけどマウス派の方で、
これこれ!って思うものが少しでもあれば嬉しいです!

次回は、ここでご紹介したショートカットや操作を用いながら
実際に何かのアウトプットに向かっていくフローを紹介できればと思います!

64bit版Windowsに32bit版のAccess入れたらODBC設定がちょっと面倒だった話

Windows MySQL Access

こんにちは。sanamekoです。鍋の美味しい季節ですね。
きのこをたくさん入れるともっと美味しくなりますよね。

さて、本日は、タイトルどおり、「64bit版Windowsに32bit版のAccess入れたらODBC設定がちょっと面倒だった話」をしたいと思います。

前提条件

Accessで、ODBCを使って業務システムのDB(MySQL)に接続している
・使用しているPCは64bit版のWindows
・64bit版のAccess2013をインストール済
・64bit版のMySQLドライバをインストール済

なぜAccessを32bit版にしたいのか

理由としては、ズバリ『64bit版Accessは何かと不具合が多いため』です。不具合については割愛しますが、これが一番の理由でしょうか。
また、私以外のメンバーは32bit版のAccessを使っており(OSも32bit)、作成したAccessファイルを共有することも多いので、環境を揃えたほうが良いなと思いました。(←最初に気付くべきでしたね)

最初にやったこと

・64bit版Accessをアンインストール
・PC再起動後、32bit版をインストール

を行いました。
(正確には、Office系は全部32bitまたは64bitで揃えなきゃいけないので、
WordやExcelなども全部まるっとアンインストールしました。)

これで終わりでしょ~簡単簡単!と思っていましたが、違いました。

MySQLに接続できなくなった!

さっそくAccessでいつものようにデータ抽出をしようとクエリを実行しますが、エラーが出てしまいました。

どうやら、64bit版のWindowsには、64bit版と32bit版の両方のODBCドライバが存在しているようです。
今回、Accessを32bit版にしたことによって、ODBCドライバも32bit版のほうで設定し直す必要があります。

追加で対応したこと

MySQLのドライバも32bitに入れ替える必要があるので、まず次の作業をします。

・64bit版のMySQLドライバをアンインストールし、32bit版をインストールする

次に、32bit版のODBCドライバの設定を行います。
コントロールパネル > 管理ツール > データソース(ODBC)から確認できるのは、64bit版の設定だけなので、

・コマンドで、<%windir%\SysWOW64\odbcad32.exe>を実行し、32bit版のODBC設定画面を立ち上げる
ODBCを設定し直す

という方法を取ります。
これでようやく、AccessからMySQLに接続できるようになりました。

同じような境遇の方がいるか分かりませんが、参考になれば幸いです!