Basic認証の作り方

コマンドラインから、htpasswd -c .htpass loginnameと打ちます。

[vagrant@localhost admin]$ htpasswd -c .htpasswd password
New password:
Re-type new password:
Adding password for user password
[vagrant@localhost admin]$ ls -la
合計 12
drwxr-xr-x. 2 vagrant vagrant 4096 11月 15 00:33 2016 .
drwxrwxr-x. 3 vagrant vagrant 4096 11月 15 00:31 2016 ..
-rw-rw-r--. 1 vagrant vagrant   23 11月 15 00:33 2016 .htpasswd

続いて、.htaccessを作ります。

[vagrant@localhost admin]$ vi .htaccess
AuthType Basic
AuthName "Enter your ID & Password"
AuthUserFile /home/vagrant/contact/admin/.htpasswd
require valid-user
[vagrant@localhost admin]$ ls -la
合計 16
drwxr-xr-x. 2 vagrant vagrant 4096 11月 15 00:39 2016 .
drwxrwxr-x. 3 vagrant vagrant 4096 11月 15 00:31 2016 ..
-rw-rw-r--. 1 vagrant vagrant  122 11月 15 00:39 2016 .htaccess
-rw-rw-r--. 1 vagrant vagrant   23 11月 15 00:33 2016 .htpasswd

Mysql, config.php, functions.phpの設定

[vagrant@localhost ~]mysql -u root
create database contact_php;
grant all on contact_php.* to dbuser@localhost identified by 'hogehoge';

use contact_php

create table entries (
  id int not null auto_increment primary key,
  name varchar(255),
  email varchar(255),
  memo text,
  created datetime,
  modified datetime
);
[vagrant@localhost ~]$ mysql -u dbuser -p contact_php

config.php

<?php

define('DSN','mysql:host=localhost;dbname=contact_php');
define('DB_USER','dbuser');
define('DB_PASSWORD','hogehoge');

define('SITE_URL','http://192.168.33.10:8000/');
define('ADMIN_URL', SITE_URL.'admin/');

error_reporting(E_ALL & ~E_NOTICE);
session_set_cookie_params(0, '/contacts_php');
&#91;/php&#93;

function.php
&#91;php&#93;
<?php

function connectDb(){
  try {
    return new PDO(DSN, DB_USER, DB_PASSWORD);
  } catch (PDOException $e){
    echo $e->getMessage();
    exit;
  }
}

function h($s){
  return htmlspecialchars($s, ENT_QUOTES, "UTF-8");
}

Carbon インスタンス

// $dt = new Carbon();
// $dt = Carbon::now();
// $dt = new Carbon('2016-12-20 11:32:23');
//$dt = new Carbon('tomorrow');
//$dt = Carbon::today();
//$dt = Carbon::tommorow();
// $dt = Carbon::yesterday();
// $dt = Carbon::parse('2016-12-12 11:32:32');
// $dt = Carbon::create(2020,12, 12, 11, 32, 32);
$dt = Carbon::createFromFormat('Y/m/d H', '2016/12/20 20');

日時情報の取得

$dt = Carbon::now();
//echo $dt->year . PHP_EOL;
//echo $dt->month . PHP_EOL;
//echo $dt->day . PHP_EOL;
//echo $dt->hour . PHP_EOL;
//echo $dt->minute . PHP_EOL;
//echo $dt->second . PHP_EOL;
//echo $dt->dayOfWeek . PHP_EOL;
//echo $dt->dayOfYear . PHP_EOL;
//echo $dt->weekOfMonth . PHP_EOL;
//echo $dt->weekOfYear . PHP_EOL;
// echo $dt->timestamp . PHP_EOL;
// echo $dt->tzName . PHP_EOL;
echo $dt->format('Y年m月d日') . PHP_EOL;

日付判定

//var_dump($dt->isToday()) . PHP_EOL;
//var_dump($dt->isTommorow()) . PHP_EOL;
//var_dump($dt->isYesterday()) . PHP_EOL;
//var_dump($dt->isFuture()) . PHP_EOL;
//var_dump($dt->isPast()) . PHP_EOL;
//var_dump($dt->isLeapYear()) . PHP_EOL;
//var_dump($dt->isWeekday()) . PHP_EOL;
//var_dump($dt->isWeekend()) . PHP_EOL;
//var_dump($dt->isSameDay(Carbon::now())) . PHP_EOL;

変数をとって、日時を比較

$dt1 = Carbon::create(2020, 10, 1);
$dt2 = Carbon::create(2020, 11, 1);

// var_dump($dt1->eq($dt2)) . PHP_EOL;
//var_dump($dt1->gt($dt2)) . PHP_EOL;
//var_dump($dt1->lt($dt2)) . PHP_EOL;
//var_dump(Carbon::create(2010, 10, 10)->between($dt1, $dt2)) . PHP_EOL;
//echo $dt1->max($dt2) . PHP_EOL;
//echo $dt1->min($dt2) . PHP_EOL;

日付計算

// echo $dt->addYear(). PHP_EOL;
//echo $dt->addYears(3). PHP_EOL;
//echo $dt->subYears(3). PHP_EOL;
//echo $dt->addWeekdays(3). PHP_EOL;
//echo $dt->addWeekdays(3)->addWeekHours(3)->addWeekMinutes(3). PHP_EOL;

コピーメソッド

$dt = Carbon::now();
echo $dt->copy()->addYear() . PHP_EOL;
echo $dt . PHP_EOL;

日時指定

//echo $dt->startOfDay() . PHP_EOL;
//echo $dt->endOfDay() . PHP_EOL;
//echo $dt->startOfMonth() . PHP_EOL;
//echo $dt->endOfMonth() . PHP_EOL;
//echo $dt->startOfWeek() . PHP_EOL;
//echo $dt->endOfWeek() . PHP_EOL;
//echo $dt->next(Carbon::MONDAY) . PHP_EOL;
//echo $dt->previous(Carbon::MONDAY) . PHP_EOL;
//echo $dt->firstOfMonth(Carbon::MONDAY) . PHP_EOL;
//echo $dt->lastOfMonth(Carbon::MONDAY) . PHP_EOL;
//echo $dt->nthOfMonth(3, Carbon::MONDAY) . PHP_EOL;

日時の差

$dt1 = Carbon::create(2020, 10, 1);
$dt2 = Carbon::create(2020, 11, 1);

//echo $dt1->diffInDays($dt2) . PHP_EOL;
//echo $dt1->diffInHours($dt2) . PHP_EOL;
//echo $dt1->diffInMinutes($dt2) . PHP_EOL;
//echo $dt1->diffForHumans($dt2) . PHP_EOL;

setTestNow()を使った判定

$dt = Carbon::now();
$birthday = Carbon::create(1990, 10, 1);
Carbon::setTestNow(Carbon::create(2020, 10, 1));
echo Carbon::now() . PHP_EOL;
if($birthday->isBirthday(Carbon::now())){
  echo ':)' . PHP_EOL;
} else {
  echo ':<' . PHP_EOL;

Composerとcarbon

composer
Composerをインストールします。

curl -sS https://getcomposer.org/installer | php

続いてcarbonをインストール

[vagrant@localhost php]$ php composer.phar require nesbot/carbon

carbon.php

require 'vendor/autoload.php';

use Carbon\Carbon;

$dt = new Carbon();
echo $dt . PHP_EOL;
[vagrant@localhost php]$ php carbon.php
2016-11-14 11:24:43
[vagrant@localhost php]$ date
2016年 11月 14日 月曜日 11:24:53 JST

a-html5


%e7%84%a1%e9%a1%8c

	<p><i class="fa fa-html5" aria-hidden="true"></i> html5<p>
	<p><i class="fa fa-html5 fa-lg" aria-hidden="true"></i> html5<p>
	<p><i class="fa fa-html5 fa-2x" aria-hidden="true"></i> html5<p>
	<p><i class="fa fa-html5 fa-5x" aria-hidden="true"></i> html5<p>

fontawesomeはフォントなので、cssで装飾することも可能です。

	<style>
	body { background: #ddd; }
	.my_icon {
		font-size: 48px;
		color: #e3771b;
		text-shadow: -1px 1px 0 rgba(255,255,255,0.6);
	}
	</style>
</head>
<body>
	<p><i class="fa fa-html5 my_icon" aria-hidden="true"></i> html5<p>
</body>

リスト

<ul>
		<li><i class="fa fa-home"></i> Menu 1</li>
		<li><i class="fa fa-caret-left"></i> Menu 2</li>
		<li><i class="fa fa-bar-chart"></i> Menu 3</li>
	</ul>
	<ul>
		<li><i class="fa fa-home fa-fw"></i> Menu 1</li>
		<li><i class="fa fa-caret-left fa-fw"></i> Menu 2</li>
		<li><i class="fa fa-bar-chart fa-fw"></i> Menu 3</li>
	</ul>
	<ul class="fa-ul">
		<li><i class="fa fa-home fa-fw"></i> Menu 1</li>
		<li><i class="fa fa-caret-left fa-fw"></i> Menu 2</li>
		<li><i class="fa fa-bar-chart fa-fw"></i> Menu 3</li>
	</ul>

回転

        <p><i class="fa fa-apple"></i> Apple</p>
	<p><i class="fa fa-apple fa-rotate-90"></i> Apple</p>
	<p><i class="fa fa-apple fa-rotate-180"></i> Apple</p>
	<p><i class="fa fa-apple fa-rotate-270"></i> Apple</p>
	<p><i class="fa fa-apple fa-flip-horizontal"></i> Apple</p>
	<p><i class="fa fa-apple fa-flip-vertical"></i> Apple</p>

	<p><i class="fa fa-refresh fa-spin"></i> Apple</p>
	<p><i class="fa fa-spinner fa-spin"></i> Apple</p>
	<p><i class="fa fa-spinner fa-pulse"></i> Apple</p>

枠線、左右寄せ

<p><i class="fa fa-apple pull-right"></i> Apple</p>
	<p><i class="fa fa-apple fa-border fa-5x"></i> Apple</p>

アイコンを重ねる

       <p>
	<span class="fa-stack">
	 <i class="fa fa-square-o fa-stack-2x"></i>
	 <i class="fa fa-flag fa-stack-1x"></i>
	 </span>
	 Apple</p>

session storageとlocal storage

web storageは同一オリジンでデータを保存しています。同階層、下ディレクトでも使えます。sessionStorage(タブが閉じられるまで)とloacalStorage(ブラウザ自体に保存)の二種類があります。chrome developer toolのapplicationパネルで確認できます。

%e7%84%a1%e9%a1%8c

      <script>
      (function(){
        if (typeof(Storage) === "undefined"){
          alert("web storage not supported");
        } else {
          // console.log("supported");
          // var s = sessionStorage;
          var s = localStorage;
          s.setItem('name', 'okada');
          console.log(s.getItem('name'));
        }
      })();
      </script>

setItemと削除

      <script>
      (function(){
        if (typeof(Storage) === "undefined"){
          alert("web storage not supported");
        } else {
          var ls = localStorage;
          var ss = sessionStorage;

          ls.setItem('yamada', 20);
          ls.setItem('kimura', 69);

          ss.setItem('color', 'pink');
          ss.setItem('shape', 'cube');

          // removeItem(key)
          // clear()

          ls.removeItem('yamada');
          ss.clear();
        }
      })();
      </script>

lengthとkey

      <script>
      (function(){
        if (typeof(Storage) === "undefined"){
          alert("web storage not supported");
        } else {
          var s = localStorage;

          s.setItem('okamoto', 90)
          s.setItem('murata', 60)
          s.setItem('ito', 50)

          for (var i = 0; i < s.length; i++){
            console.log(s.key(i) + ':' + s.getItem(s.key(i)));
          }


        }
      })();
      </script>

JSON(javascript object nation)

      <script>
      (function(){
        if (typeof(Storage) === "undefined"){
          alert("web storage not supported");
        } else {
          var s = localStorage;

          var user = {
            name: 'yoshida',
            score: 50
          };

          s.setItem('user', JSON.stringify(user));
          console.dir(JSON.parse(s.getItem('user')));
        }
      })();
      </script>

データの整合性

      <script>
      (function(){
        if (typeof(Storage) === "undefined"){
          alert("web storage not supported");
        } else {
          var s = localStorage;
          s.setItem('name','kurumada');

          window.addEventListener('storage', function(e){
            console.log(e.key + ':' + e.oldValue + '->' + e.newValue);
          });
        }
      })();
      </script>

union, uniq, key, value

集合演算に関するメソッド

      <script>
        (function(){
          
          var a = [1, 2, 5];
          var b = [5, 2, 8];
          var x;

          // x = _.union(a, b);
          // x = _.intersection(a, b);
          // x = _.difference(a, b);
          x = _.uniq([2, 5, 2, 10, 5]);

          console.log(x);

        })();
      </script>

オブジェクト判定のメソッド

      <script>
        (function(){
          
          var x;
          var user = {
            name: 'yamamoto',
            score: 88,
            web: 'http://google.com'
          };

          // x = _.keys(user);
          // x = _.values(user);
          // x = _.invert(user);
          x = _.has(user, "name");
          // isEmpty, isString, isNull, isNumber
          console.log(x);

        })();
      </script>

データ生成のメソッド

        (function(){
          
          var x;
          
          // x = _.range(1, 11, 2);
          x = _.random(10);

          console.log(x);

        })();

メソッドをつなげるchainとvalue

      <script>
        (function(){
          
          var x;
          
          var a = [2, 5, 10, 8];
          x = _.chain(a)
              .shuffle()
              .map(function(num){
                return num * 2;
              })
              .value();

          console.log(x);

        })();
      </script>

underscore.js

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Underscore.js</title>
  </head>
  <body>
      <script src="underscore-min.js"></script>
      <script>
        (function(){
          var x;
          x = _.shuffle([2, 8, 10, 3]);
          console.log(x);
        })();
      </script>
  </body>
</html>

eachとmap

<script src="underscore-min.js"></script>
      <script>
        (function(){
          /*
          _.each([2, 5, 8], function(num)){
              console.log(num * 2);
          });
          */

          var x = _.map([2, 5, 8], function(num){
              return num * 2;
          });
          console.log(x);

        })();
      </script>

find,filter,contain

      <script>
        (function(){
          
          var a = [2, 5, 8, 42, 12];
          var x;
          /*
          x = _.find(a, function(num){
            return num > 5;
          });
          */
          /*
          x = _.filter(a, function(num){
            return num > 5;
          });
          */
          x = _.contains(a, 10);
          console.log(x);

        })();
      </script>

groupBy, countBy

      <script>
        (function(){
          
          var a = [1, 2, 5, 8, 42, 12];
          var x;
          /*
          x = _.groupBy(a, function(num){
            return num % 3;
          })
          x = _.countBy(a, function(num){
              return num % 2 == 0 ? 'even' : 'odd';
          });
          */
          x = _.sortBy(a, function(num){
              return Math.sin(num);
          });

          console.log(x);

        })();
      </script>

shell script

linux shell script
シェルスクリプトを操作していきます。

[vagrant@localhost shell]$ echo $SHELL
/bin/bash
[vagrant@localhost shell]$ vi hello.sh

vimを使って、hello.shを書き込みます。正常終了でexit 0とします。コメントは#を使います。

#!/bin/bash

echo "hello world"
exit 0

実行権限を与えます。

[vagrant@localhost shell]$ chmod +x hello.sh
[vagrant@localhost shell]$ ./hello.sh
hello world

変数

#!/bin/bash

s="hello"
echo $s$s
exit 0

数値演算はバッククォート`(shift + @)expr `で処理します。

#!/bin/bash

x=10
echo `expr $x + 2`
exit 0

掛け算は、\でエスケープが必要です。()も\( $x + 5 \)と\のエスケープが必要です。
echo `expr $x \* 2`

配列は添え字を使います。全ての要素は@を使います。

a=(2 4 6)
echo ${a[2]}

echo ${a[@]}
echo ${#a[@]}
exit 0

代入、要素の追加

a[2] = 10
a+=(20, 30)

-eqで正しいか否かの条件分岐を行っています。0は正常、1は不正となります。
-eq, -ne, -gt, -ge, -lt, -le、=, !=, -nt, -ot, -e, -dなどのコマンドがあります。

#!/bin/bash

test 1 -eq 2; echo $?

test -e new.sh; echo $?
論理演算子には、-a(and),-o(or),!などあります。

ifの条件分岐

#!/bin/bash

x=70
if test $x -gt 60
then
 echo "ok!"
fi
x=70
if [ $x -gt 60 ]; then
 echo "ok!"
else
 echo "soso.."
fi

case条件分岐

signal="red"
case $signal in
 "red")
  echo "stop!"
  ;;
  "yellow")
  echo "caution"
  ;;
  "green")
  echo "go!"
  ;;
  *)
  echo "...."
  ;;
esac

while文

i=0
while [ $i -lt 10 ]
do
 i=`expr $i + 1`
 echo $i
done

for文: `seq 1 100`

a=(1 2 3 4 5)
for i in ${a[@]}
do
 echo $i
done

コマンド引数を使うと柔軟にプログラムを書けるようになります。
ユーザからの入力を受け付ける。

while :
do
 read key
 echo "you pressed $key"
 if [ $key = "end" ]; then
  break
 fi
done

ファイルの読み込み

i=1
while read line
do
 echo "$i: $line"
 i=`expr $i + 1`
done <$1

関数

function hello(){
 echo "hello"
}

hello

sed

unix系には入っているテキスト処理の仕組みで、パターンスペースで処理を行います。

[vagrant@localhost sed]$ sed --version
GNU sed 4.2.1版

Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

GNU sed home page: .
General help using GNU software: .
E-mail bug reports to: .
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

sedコマンド

[vagrant@localhost sed]$ sed -e '3d' names.text
1 yamada
2 yokoi
4 hirose
5 inui

バックアップを作成し、元ファイルを上書き

[vagrant@localhost sed]$ sed -i.bak '3d' names.text
[vagrant@localhost sed]$ cat names.text.bak
1 yamada
2 yokoi
3 sakamoto
4 hirose
5 inui

コマンドファイルの作成

[vagrant@localhost sed]$ vi ex1.sed
[vagrant@localhost sed]$ sed -f ex1.sed names.text
1 yamada
2 yokoi
4 hirose
5 inui

アドレスの種類


[vagrant@localhost sed]$ sed '3d' names.text
1 yamada
2 yokoi
4 hirose
5 inui
[vagrant@localhost sed]$ sed '!3d' names.text
sed: -e 表現 #1, 文字数 2: 未知のコマンドです: 「3」
[vagrant@localhost sed]$ sed '3!d' names.text
3 sakamoto
[vagrant@localhost sed]$ sed '1d;3d' names.text
2 yokoi
4 hirose
5 inui
[vagrant@localhost sed]$ sed '1,3d' names.text
4 hirose
5 inui
[vagrant@localhost sed]$ sed '1~2d' names.text
2 yokoi
4 hirose
[vagrant@localhost sed]$ sed '$d' names.text
1 yamada
2 yokoi
3 sakamoto
4 hirose

追加コマンド

[vagrant@localhost sed]$ sed '3p' names.text
1 yamada
2 yokoi
3 sakamoto
3 sakamoto
4 hirose
5 inui
[vagrant@localhost sed]$ sed -n '3p' names.text
3 sakamoto
[vagrant@localhost sed]$ sed '3q' names.text
1 yamada
2 yokoi
3 sakamoto
[vagrant@localhost sed]$ sed '1i\--start--' names.text
--start--
1 yamada
2 yokoi
3 sakamoto
4 hirose
5 inui
[vagrant@localhost sed]$ sed '1i\--start --' -e '$a\-- end --' names.text
1 yamada
2 yokoi
3 sakamoto
4 hirose
5 inui
-- end --

Yコマンドによる置換

[vagrant@localhost sed]$ sed 'y/y/Y/' names.text
1 Yamada
2 Yokoi
3 sakamoto
4 hirose
5 inui
[vagrant@localhost sed]$ sed 'y/yo/YO/' names.text
1 Yamada
2 YOkOi
3 sakamOtO
4 hirOse
5 inui

sコマンドで文字列の置換、フラグgですべての文字列を置換します。&の置換もあります。
sed ‘s/\([-5]\) \(.*\)/\2’items.text

ホールドスペースとは、パターンスペースの裏バッファのようなものです。
h:hold -> パターンスペースをホールドスペースに
g:get -> ホールドスペースからパターンスペースに
x:exchange -> パターンスペースとホールドスペースを交換