ビール片手にプログラム ~ そうだ!遊ぼう! ~

ただ飲みながら遊んでいる話。まじめなこととかはしません。

VagrantとVirtual Boxでローカル開発環境(CentOS/Apache/PHP)を用意して遊ぼう。

ちょっとPHP書きたい用事が出来たので、 今回はローカル開発環境を構築して遊ぼうと思います。

1. 今日のお供

伝説のホップSORACHIです。
キレの中にコクもあっていい感じです。

サッポロ Innovative Brewer SORACHI1984 ( ソラチ イチキュウハチヨン) [ 日本 350ml×24本 ]

2. 今回参考にしたサイト

私はただ備忘録として、遊んだ結果を書きたいだけな ので、本気でやりたい方はこちらを参考にされたほうが良いかと思います。

https://dotinstall.com/lessons/basic_localdev_win_v2 www.terasol.co.jp

3. ダウンロードとインストール

私のPCにはすでにVirtual BoxとVagrantは入っているので詳細は割愛しますが、
下記公式サイトからダウンロードしてインストールします。

www.virtualbox.org www.vagrantup.com

4. 仮想マシンを立ち上げる

まずは作業用のディレクトリを作成して作成したディレクトリに移動します。
今回はcentosというディレクトリを作成しました。

f:id:front-end:20190818102420p:plain
ディレクトリ作成

Vagrant Fileを作成します。

vagrant init bento/centos-6.8

f:id:front-end:20190818120304p:plain
Vagrantfile作成

Vagrant Fileを編集します。
35行目のコメントアウトをはずします。

f:id:front-end:20190818120511p:plain
Vagrantfileの編集

仮想マシンを起動します。

vagrant up

仮想マシンが起動できました。

f:id:front-end:20190818141816p:plain
仮想マシン起動完了

5. 環境設定をする

ここからは起動した仮想マシンSSHで接続して設定をしていきます。

(1) SSH接続

VagrantFileでコメントアウトをはずした箇所のIPで接続できます。

192.168.33.10

f:id:front-end:20190818142114p:plain
IP

IDとパスワードは両方vagrantです。

f:id:front-end:20190818142154p:plain
ID/PASS

接続できました。

f:id:front-end:20190818142301p:plain
接続完了

(2) OSアップデート

OSを最新状態にアップデートします。

sudo yum -y update

f:id:front-end:20190818142357p:plain
yum update

(3) Apacheのインストール

Apacheをインストールします。

 sudo yum -y install httpd httpd-devel

f:id:front-end:20190818143710p:plain
Apacheインストール

インストールできたらApacheのバージョンを確認してみます。

httpd -v

f:id:front-end:20190818143833p:plain
Apacheのバージョン確認

Apacheを起動します。

sudo service httpd start

f:id:front-end:20190818143956p:plain
Apache起動

サーバー起動時にApacheを自動で起動できるよう、下記設定をします。

sudo chkconfig httpd on

f:id:front-end:20190818144141p:plain
自動起動設定

(4) iptables の設定

今の状態だと、ポート80番と443番に接続できない状態なので、設定していきます。

sudo iptables -I INPUT 1 -m state --state NEW -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 2 -m state --state NEW -p tcp --dport 443 -j ACCEPT
sudo service iptables save
sudo service iptables restart
sudo iptables -L -n --line-number

f:id:front-end:20190818144850p:plain
iptables 設定

この状態でブラウザからIPをたたくと下記ページが表示されます。

f:id:front-end:20190818144956p:plain
Apacheインストール完了

(5) PHPのインストール

PHPをインストールしていきます。

sudo curl -OL http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo yum -y localinstall remi-release-6.rpm
sudo yum -y install --enablerepo=remi,remi-php56 php php-mysql php-xml php-pear php-pdo php-cli php-mbstring php-gd php-mcrypt php-common php-devel php-bcmath
php-v

f:id:front-end:20190818145839p:plain
PHPインストール

httpd.confを編集します。

sudo vi /etc/httpd/conf/httpd.conf

下記を追加します。

AddType application/x-httpd-php .php
LoadModule php5_module modules/libphp5.so

php.iniを編集します。

sudo vi /etc/php.ini
display_errors = On
default_charset = "UTF-8"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = Off
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.detect_order = auto

設定を変更したら、サーバーを再起動します。

sudo service httpd restart

f:id:front-end:20190818151032p:plain
サーバー再起動

PHPの実行確認をします。

cd /var/www/html
sudo vi phpinfo.php

下記内容を入力して保存します。

<?php
    echo  phpinfo();
?>

下記URLでブラウザからアクセスすると。。

http://192.168.33.10/phpinfo.php

PHPが実行できました!

f:id:front-end:20190818151451p:plain
PHP実行完了

6. ローカル開発環境(CentOS/Apache/PHP)構築完了!

ローカル開発環境(CentOS/Apache/PHP)の構築が完了しました。
とっても久しぶりにやったので、懐かしい感じでした。
これでPHPがかける!ということで、次回はPHPかいていこうかと思います。

Windows7のPower Shellをアップデートして遊ぼう。

ちょっとPower Shellが古くて怒られることが発生したので、
Windows7のPower Shellをアップデートして遊びたいと思います。

1. 今日のお供

黒ラベルサッポロ 黒ラベル [ 350ml×24本 ]

2. 今回参考にしたサイト

私はただ備忘録として、遊んだ結果を書きたいだけな ので、本気でやりたい方はこちらを参考にされたほうが良いかと思います。

qiita.com

3. 現在のバージョンの確認

Power Shellを起動して下記コマンドを入力します。

$PSVersionTable

f:id:front-end:20190818121817p:plain
現在のバージョンは2.0

4. ダウンロード

Windows Management Framework 5.0をダウンロードします。

aka.ms

f:id:front-end:20190818122446p:plain
ダウンロード①
f:id:front-end:20190818122553p:plain
ダウンロード②

5. インストール

ダウンロードしたzipを解凍して、Win7AndW2K8R2-KB3191566-x64.msuを実行します。

f:id:front-end:20190818122914p:plain
インストール①

f:id:front-end:20190818123016p:plain
インストール②

インストールが完了したら、再起動して確認します。
アップデートできました!

$PSVersionTable

f:id:front-end:20190818135025p:plain
アップデート完了!

6. Power Shellアップデート完了!

Power Shellのアップデートが完了しました。 これでもう怒られない!

SQL Developerをインストールして遊ぼう。

前回はOracle Databaseをインストールしましたが、
さすがにSQL*Plusでいろいろやっていくのは辛いので、
今回はSQL Developerをインストールして遊ぼうと思います。

1. 今日のお供

サッポロクラシックです。
北海道限定と書いてありますが、結構見るのは気のせい。。?
まぁおいしいのでうれしいんですけどね。

サッポロ 北海道限定サッポロクラシック 350ml×24缶×2ケース

2. 今回参考にしたサイト

私はただ備忘録として、遊んだ結果を書きたいだけなので、本気でやりたい方はこちらを参考にされたほうが良いかと思います。 blogs.oracle.com

3. まずはダウンロード

ダウンロードサイトはこちらになります。 www.oracle.com

ライセンスに同意してダウンロードします。

f:id:front-end:20190629125500p:plain
ダウンロード

4. インストールというか起動

ダウンロードしたファイルを任意の場所に解凍します。

f:id:front-end:20190629131846p:plain
解凍

SQL Developerはにインストーラは無いため、sqldeveloper.exeを実行します。

f:id:front-end:20190629132003p:plain
実行中

前のSQL Developerから設定を引き継ぐか聞かれますが、無いのでいいえを押下します。

f:id:front-end:20190629132226p:plain
引き継ぐものはありません。

起動できました!

f:id:front-end:20190629132435p:plain
起動完了!

5. DBに接続

画面左のOracle接続を右クリックし、接続の作成を押下します。

f:id:front-end:20190629132830p:plain
接続の作成

必要な情報を入力し、テストボタンを押下します。
テストが成功しました。

f:id:front-end:20190629135022p:plain
テスト成功!

入力値を保存して接続ボタンを押下します。

f:id:front-end:20190629135157p:plain
保存して接続!

パスワードの入力が求められるので、入力します。

f:id:front-end:20190629135258p:plain
パスワード入力

6. SQL Developerインストール完了!

SQL Developerを使用して、Oracle Databaseへ接続できました!

f:id:front-end:20190629135358p:plain
接続完了!

次回こそはお酒ばっか飲んでないで、勉強したいと思います。

Oracle Database 12cをインストールして遊ぼう。

今回はOracleマスター取得に向けて、Oracle Database12cをインストールして遊ぼうと思います。

1. 今日のお供

伝説のホップSORACHIです。
キレの中にコクもあっていい感じです。

サッポロ Innovative Brewer SORACHI1984 ( ソラチ イチキュウハチヨン) [ 日本 350ml×24本 ]

2. 今回参考にした本

私はただ備忘録として、遊んだ結果を書きたいだけなので、本気でやりたい方はこちらを参考にされたほうが良いかと思います。

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎](試験番号:1Z0-061)完全詳解+精選問題集(オラクルマスタースタディガイド)

3. まずはダウンロード

ダウンロードサイトはこちらになります。 www.oracle.com

画面左下にある「基本リンク」のダウンロードを選択します。

f:id:front-end:20190609125934p:plain
Oracleサイト

「Database 12c Enterprise/Standard Editions」を選択します。

f:id:front-end:20190609130304p:plain
Database 12c Enterprise/Standard Editions

私の環境はWindowsなので、Windowsのものを選択します。

f:id:front-end:20190609130458p:plain
Windows

OTNライセンスに同意して、ダウンロードします。

f:id:front-end:20190609130648p:plain
ダウンロード

4. インストール

ダウンロードしたzipファイルを任意のディレクトリに解凍します。

f:id:front-end:20190609132640p:plain
解凍

setup.exeを実行するとインストーラが起動します。

f:id:front-end:20190609132908p:plain
インストーラ

今回は勉強用なので、セキュリティアップデートは受け取らない設定にして、次へボタンを押下します。

f:id:front-end:20190609133054p:plain
インストーラ

メールアドレスに対しての警告がでますが、「はい」を押下します。

f:id:front-end:20190609133207p:plain
警告

データベースの作成および構成を選択して「次へ」ボタンを押下します。

f:id:front-end:20190609133320p:plain
インストーラ

デスクトップ・クラスを選択して「次へ」ボタンを押下します。

f:id:front-end:20190609133443p:plain
インストーラ

新規Windowsユーザーの作成を選択して、情報を入力し、「次へ」ボタンを押下します。

f:id:front-end:20190609133619p:plain
インストーラ

パスワードを入力し、コンテナ・データベースとして作成のチェックをはずして「次へ」ボタンを押下します。

f:id:front-end:20190609133837p:plain
インストーラ

インストールボタンを押下します。

f:id:front-end:20190609134052p:plain
インストーラ

インストールが完了しました!

f:id:front-end:20190609150227p:plain
インストール完了

5. Oracle Database 12cインストール完了!

SQL*Plusで接続してみたら無事接続できました。
次回からはOracleマスター取得に向けて勉強していけたらと思います。

f:id:front-end:20190609150725p:plain
接続できました。

Angular.jsのチュートリアルをして遊ぼう ④サービス

今回は前回の続きでAngular.jsの公式サイトのチュートリアルのサービスの箇所を実施して遊ぼうと思います。
前回の記事で使用したコードを前提に作成していきますので、まず前回の記事から見ていただいたほうが良いかと思います。

1. 今日のお供

エビスのプレミアムエールです。
サッポロ ヱビス プレミアム [ 350ml×24本 ]

2. 今回参考にしたサイト

私はただ備忘録として、遊んだ結果を書きたいだけなので、本気でやりたい方はこちらを参考にされたほうが良いかと思います。

angular.jp

3. カートサービスを作成する

今回は商品の詳細ページに[購入]ボタンを追加し、商品に関する情報をカートに保存するためのカートサービスを作成していきます。

まずはカートのサービスを作成します。

f:id:front-end:20190608115058p:plain
サービスを選択

cartと入力して。。

f:id:front-end:20190608115154p:plain
cart

cartサービスが作成されました。

f:id:front-end:20190608115306p:plain
cartサービス

4. カートサービスを定義する

カートサービスに商品の追加・商品の参照・商品の削除が出来るよう設定していきます。

(1) どこからでもDIできるようにします。

@Injectable({
  providedIn: 'root'
})

f:id:front-end:20190608120027p:plain
DIの設定

(2) 商品情報格納用の配列を追加します。

items = [];

f:id:front-end:20190608120158p:plain
配列の追加

(3) 商品に対するメソッドを追加します。

  // 商品の追加
  addToCart(product) {
    this.items.push(product);
  }

  // 商品リストの取得
  getItems() {
    return this.items;
  }

  // 商品リストのクリア
  clearCart() {
    this.items = [];
    return this.items;
  }

f:id:front-end:20190608120511p:plain
メソッドの追加

5. カートサービスを使用する

商品詳細ページに購入ボタンを追加し、購入ボタンを押下した場合、カートサービスに商品が登録されるようにしていきます。

(1) 商品詳細ページがカートサービスを使用するよう設定します。

product-details.component.tsにカートサービスをインポートし、コンストラクタで注入します。

import { CartService } from '../cart.service';
  constructor(private route: ActivatedRoute,
              private cartService: CartService) { }

f:id:front-end:20190608121403p:plain
カートサービスのインポート

カートサービスに商品を追加するメソッドを追加します。(何故か下線が引かれていますが。。

  addToCart(product) {
    window.alert('Your product has been added to the cart!');
    this.cartService.addToCart(product);
  }

f:id:front-end:20190608125435p:plain
カートに追加

商品詳細画面に購入ボタンを追加します。

<button (click)="addToCart(product)">Buy</button>

f:id:front-end:20190608125618p:plain
購入ボタンを追加

(2) カートページを作成します。

まずはカートコンポートネントを作成して。。

f:id:front-end:20190608125742p:plain
カートコンポーネント

app.module.tsにカートコンポーネントのルーティング(URLパターン)を追加します。

{ path: 'cart', component: CartComponent },

f:id:front-end:20190608125914p:plain
app.module.ts

カートページにカートサービスの商品情報が表示されるように設定します。

import { Component, OnInit } from '@angular/core';
import { CartService } from '../cart.service';

@Component({
  selector: 'app-cart',
  templateUrl: './cart.component.html',
  styleUrls: ['./cart.component.css']
})
export class CartComponent implements OnInit {
  items;

  constructor(private cartService: CartService) { 
    this.items = this.cartService.getItems();
  }

  ngOnInit() {
  }

}

f:id:front-end:20190608130240p:plain
cart.component.ts

カート画面に商品情報を表示するよう設定します。

<h3>Cart</h3>

<div class="cart-item" *ngFor="let item of items">
  <span>{{ item.name }} </span>
  <span>{{ item.price | currency }}</span>
</div>

購入ボタンを押下するとカート画面に商品が追加されるようになりました。

f:id:front-end:20190608130827p:plain
カート画面完成!

6. サービスが使えました!

きちんと書いているのに、何故かエラーの下線がでたりしましたが、なんとか実装が完了しました。
とりあえず、Angularのチュートリアルはここまでとして、次回は何か違うことが出来たらいいなぁ。と思います。

Angular.jsのチュートリアルをして遊ぼう ③ルーティング

今回は前回の続きでAngular.jsの公式サイトのチュートリアルのルーティングの箇所を実施して遊ぼうと思います。
前回の記事で使用したコードを前提に作成していきますので、まず前回の記事から見ていただいたほうが良いかと思います。

1. 今日のお供

韃靼そば茶ハイです。 中身は勿論金宮です。 伊藤園 伝承の健康茶 韃靼100%そば茶 ティーバッグ 14袋 キッコーミヤ焼酎キンミヤパック 1800ml

2. 今回参考にしたサイト

私はただ備忘録として、遊んだ結果を書きたいだけなので、本気でやりたい方はこちらを参考にされたほうが良いかと思います。

angular.jp

3. 商品詳細コンポーネントを作成する

今回は前回作成した商品一覧から商品詳細ページを表示できるようにしますので、まずは商品詳細のコンポーネントを作成します。

f:id:front-end:20190602173952p:plain
新規コンポーネントの作成

product-detailsと入力して。。

f:id:front-end:20190602174051p:plain
product-details

product-detailsコンポーネントが作成されました。

f:id:front-end:20190602174149p:plain
product-detailsコンポーネント

4. app.module.tsにpathを設定する

商品詳細のpathを設定します。
RouterModule.forRootに下記を追加します。

{ path: 'products/:productId', component: ProductDetailsComponent },

f:id:front-end:20190602174545p:plain
pathを追加します。

5. 商品一覧画面のリンクを修正する

商品一覧画面に上記で設定したパスへのリンクを追加します。

(1) 繰り返し処理時に配列内のインデックスを変数に格納します。

<div *ngFor="let product of products; index as productId">

f:id:front-end:20190602180245p:plain
index

(2) リンクを修正します。

[routerLink]="['/products', productId]"

f:id:front-end:20190602180555p:plain
リンクの修正

6. リンクを確認する

リンクを押下すると。。

f:id:front-end:20190602180825p:plain
リンク押下

該当のインデックスのURLに遷移し、product-detailsが表示されました。

f:id:front-end:20190602180927p:plain
表示できました!

7. 商品情報を表示する

URLと全商品情報をもとに商品情報を表示していきます。

(1) 全商品情報を取得します。

import { products } from '../products';

f:id:front-end:20190602182048p:plain
全商品情報を取得

(2) URL取得用にActivatedRouteを取得します。

import { ActivatedRoute } from '@angular/router';
constructor(private route: ActivatedRoute) { }

f:id:front-end:20190602182313p:plain
ActivatedRoute

(3) 商品情報用の変数を宣言します。

product;

f:id:front-end:20190602182434p:plain
product

(4) 商品情報変数に対象の商品情報を代入します。

      this.route.paramMap.subscribe(params => {
        this.product = products[+params.get('productId')];
      });

f:id:front-end:20190602183311p:plain
商品情報を代入

(5) 画面に表示します。

<h2>Product Details</h2>
<div *ngIf="product">
  <h3>{{ product.name }}</h3>
  <h4>{{ product.price | currency }}</h4>
  <p>{{ product.description }}</p>
</div>

f:id:front-end:20190602183357p:plain
product-details.component.htmlの修正

商品情報が表示されました!

f:id:front-end:20190602183513p:plain
表示されました!

8. ルーティングが使えました!

細かいところは分かっていませんが、こうしてチュートリアルをやっていくと便利ですね。Angular。
次回はデータ管理のところをやれたらいいなぁ。

Angular.jsのチュートリアルをして遊ぼう ②コンポーネント

今回は前回の続きでAngular.jsの公式サイトのチュートリアルコンポーネントの箇所を実施して遊ぼうと思います。
前回の記事で使用したコードを前提に作成していきますので、まず前回の記事から見ていただいたほうが良いかと思います。

1. 今日のお供

前回に引き続き、北海道ビールです。
苦味とのど越しがいいですね。 サッポロ 北海道生ビール [ 350ml×24本 ]

2. 今回参考にしたサイト

私はただ備忘録として、遊んだ結果を書きたいだけなので、本気でやりたい方はこちらを参考にされたほうが良いかと思います。

angular.jp

3. コンポーネントとは

コンポーネントとは要するにUIを再利用するために作成するパーツのことです(ざっくり)
前回使用したproduct-list.componentもまさにコンポーネントでして、コンポーネントは3つの要素から成り立ちます。

コンポーネントクラス:データと機能を処理する要はJS
② HTMLテンプレート:UIのHTML
コンポーネント固有のスタイル:UIのCSS

product-list.componentだとこういった構成になります。

f:id:front-end:20190602130607p:plain
product-listのコンポーネント構成

4. コンポーネントを作成・表示する。

ここからは新しく商品アラートコンポーネントを作成していきます。

(1) スターターファイルを作成します。

appディレクトリを右クリックして「Angular Generator」の「Component」をクリックします。

f:id:front-end:20190602133442p:plain
Component

表示された入力フォームに「product-alerts」と入力します。

f:id:front-end:20190602133558p:plain
product-alerts

products-alertsのスターターファイルが作成されました。

f:id:front-end:20190602133727p:plain
スターターファイル

(2) product-alerts.component.tsの修正

コンポーネント(今回でいえばproduct-list)から商品情報を受け取るよう、product-alerts.component.tsを修正していきます。

①2行目に下記を追記します。

import { Input } from '@angular/core';

f:id:front-end:20190602134531p:plain
inputの追加

②親コンポーネントから受け取るプロパティ名を指定します。

@Input() product;

f:id:front-end:20190602134928p:plain
プロパティ名を指定

(3) product-alerts.component.htmlの修正

product-alerts.component.htmlの中身を下記に書き換えます。

<!-- 価格が700円より大きい場合表示します。-->
<p *ngIf="product.price > 700">
  <button>Notify Me</button>
</p>

(4) product-list.component.htmlの修正

product-listに上記で作成した、product-alertsコンポーネントを表示するよう修正します。

  <app-product-alerts [product]="product"></app-product-alerts>

f:id:front-end:20190602135609p:plain
700円より大きい場合、product-alertsのボタンが表示されました

5. コンポーネントのイベントを設定する。

[Notify Me]をクリックしたときにproduct-listコンポーネントまでイベントを発行するよう、product-alertsコンポーネントを設定します。
通知動作はproduct-listコンポーネントで定義します。

(1) product-alerts.component.tsの修正

コンポーネントへイベントを渡せるよう、product-alerts.component.tsを修正していきます。

①3行目に下記を追記します。

import { Output, EventEmitter } from '@angular/core';

②親コンポーネントへ渡すイベントを定義します。

@Output() notify = new EventEmitter();

f:id:front-end:20190602140610p:plain
product-alerts.component.ts

(2) product-alerts.component.htmlの修正

notify.emit()メソッドを呼び出すイベントバインディングを設定します。

<button (click)="notify.emit()">Notify Me</button>

f:id:front-end:20190602141237p:plain
product-alerts.component.html

(3) product-list.component.tsの修正

[Notify Me]ボタン押下時のイベントを設定します。

  onNotify() {
    window.alert('You will be notified when the product goes on sale');
  }

f:id:front-end:20190602141608p:plain
product-list.component.ts

(4) product-list.component.htmlの修正

product-alertsコンポーネントから、イベントを受け取れるよう、product-list.component.htmlを修正します。

<app-product-alerts
  [product]="product" 
  (notify)="onNotify()">
</app-product-alerts>

f:id:front-end:20190602141902p:plain
product-list.component.html

(5) 実行!

Notify Meボタンを押下すると。。イベントが実行されました!

f:id:front-end:20190602142000p:plain
Notify Me!

6. コンポーネントが使えました!

今回はチュートリアルにあるとおり、コンポーネントを使用しました。
コンポーネントと子コンポーネントのInput、Outputの概念は少し分かりにくかったのですが、下記サイトを見ると分かりやすかったです。 dev.classmethod.jp

次回はルーティングが出来たらいいなと思います。