PHPの西暦→和暦変換

ini_set('display_errors', "On");

function wareki($year){

	$eras = array(
		array('year' => 2018, "name" => "令和"),
		array('year' => 1988, "name" => "平成"),
		array('year' => 1925, "name" => "昭和"),
		array('year' => 1911, "name" => "大正"),
		array('year' => 1867, "name" => "明治")
	);

	foreach($eras as $era){

		$base_year = $era['year'];
		$era_name = $era['name'];

		if($year > $base_year){
			$era_year = $year - $base_year;

			if($era_year === 1){
				return $era_name . "元年";
			}

			return $era_name . $era_year ."年";
		}
	}
	return null;
}

echo wareki(1989);

$ php index.php
平成元

なるほど、これは凄い

数字のカンマ、カンマ削除

$num = 100000;
echo number_format($num);

$ php index.php
100,000

カンマ除去

$num = "100,000";
echo str_replace(",", "", $num);

$ php index.php
100000

半角カナ→全角カナ

$str = "キャピタルメディア";
echo mb_convert_kana($str, "KV");

$ php index.php
キャピタルメディア

全角カナ→半角カナ

$str = "キャピタルメディア";
echo mb_convert_kana($str, "kV");

$ php index.php
キャピタルメディアva

カナ以外にも、数字、英字、スペースも変換できる。なるほど。

日付変換

$date = "20230321";
echo date("Y/m/d", strtotime($date));

php index.php
2023/03/21

$date = "20230321";
echo date("Y年m月d日", strtotime($date));

$ php index.php
2023年03月21日

ゼロパディング、前ゼロ除去

ゼロパディング

$num = 7;
$num2 = sprintf('%03d', $num);
echo $num2;

$ php index.php
007

前ゼロ除去
L intにキャスト

$str = "00070";
$str = (int)$str;
echo $str;

ltrim

$str = "00070";
$str = ltrim($str, 0);
echo $str;

php 文字列の結合

$intermediate = "-";
$var1 = "いつかは";
$var2 = "ゆかし";
$joined = $var1 . $intermediate . $var2;
echo $joined;

$ php index.php
いつかは-ゆかし

php 真偽値

$var = true;
if($var){
	echo "成功";
} else {
	echo "失敗";
}

$ php index.php
成功

$var = false;
if($var){
	echo "成功";
} else {
	echo "失敗";
}

$ php index.php
失敗

ifでtrue, falseを判定できる

pythonのdebug

pdbを使用できる

import pdb

def factorial(n, sum=0):
	if n == 0:
		return sum

	pdb.set_trace()
	sum += n
	print(sum)
	return factorial(n-1, sum)

if __name__ == "__main__":
	factorial(5)
$ python3 test.py
> /home/vagrant/dev/test/test.py(8)factorial()
-> sum += n
(Pdb) bt
  /home/vagrant/dev/test/test.py(13)<module>()
-> factorial(5)
> /home/vagrant/dev/test/test.py(8)factorial()
-> sum += n
(Pdb) list
  3  	def factorial(n, sum=0):
  4  		if n == 0:
  5  			return sum
  6  	
  7  		pdb.set_trace()
  8  ->		sum += n
  9  		print(sum)
 10  		return factorial(n-1, sum)
 11  	
 12  	if __name__ == "__main__":
 13  		factorial(5)
(Pdb) 

Pythonのテストコード

# coding:utf-8

import unittest
import fizzbuzz as fb

class FizzBuzzTest(unittest.TestCase):
	def setUp(self):
		pass

	def tearDown(self):
		pass

	def test_normal(self):
		self.assertEqual(1, fb.fizzbuzz(1))

	def test_fizz(self):
		self.assertEqual("Fizz", fb.fizzbuzz(3))

	def test_buzz(self):
		self.assertEqual("Buzz", fb.fizzbuzz(5))

	def test_fizzbuzz(self):
		self.assertEqual("FizzBuzz", fb.fizzbuzz(3))

if __name__ == "__main__":
	unittest.main()

メインコード

# coding:utf-8

def fizzbuzz(number):
	if number % 15 == 0:
		return "FizzBuzz"
	if number % 5 == 0:
		return "Buzz"
	if number % 3 == 0:
		return "Fizz"

	return number

if __name__ == "__main__":
	for i in range(1, 101):
		print(fizzbuzz(i)) 

t$ python3 test_fizzbuzz.py
..F.
======================================================================
FAIL: test_fizzbuzz (__main__.FizzBuzzTest)
———————————————————————-
Traceback (most recent call last):
File “test_fizzbuzz.py”, line 23, in test_fizzbuzz
self.assertEqual(“FizzBuzz”, fb.fizzbuzz(3))
AssertionError: ‘FizzBuzz’ != ‘Fizz’
– FizzBuzz
+ Fizz

———————————————————————-
Ran 4 tests in 0.002s

FAILED (failures=1)

CakePHPのbeforefilter

beforeFilterはControllerで使用するコールバックメソッドで、主に共通化したい処理を記述
メソッドの中身よりも先に実行される

function beforeFilter(Event $event){
	処理...
}

sample
cake/src/Controller/BeforeController.php

namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\Event;

class BeforeController extends AppController {
	public $text = "samurai";

	public function beforeFilter(Event $event){
		$this->text = 'hogehoge';
	}

	public function index(){
		this->set('text', $this->text);
	}
}

beforeFilterははじめに呼び出されるため、Authなどのユーザ認証やエラー内容の設定に適している。

	public function beforeFilter(Event $event){
		$this->Auth->config('authenticate', ['Form']);

		$this->Auth->config('authenticate', [
			'Basic' => ['userModel' => 'Members'],
			'Form' => ['userModel' => 'Members'],
		]);
	}

なるほど、どのタイミングで処理を行うかってことね。

implements

interfaceとは: そのクラスに実装しないといけないメソッドをまとめたパッケージのようなもの。複数ファイルを作成する際に決まったメソッドを実装してほしい時に使える

interface Template {
	public function setVariable($name, $var);
	public function getHtml($template);
}

class Hoge implements Template {
	public function setVariable($name, $var){

	}

	public function getHtml($template){
		
	}
}

PostgreSQL innerjoinとleftjoin

テーブルとテストデータ作成
CREATE TABLE companies(
id bigint primary key,
name varchar(50) NOT NULL,
tel varchar(50)
);

CREATE TABLE employees(
id bigint primary key,
company_id bigint,
name varchar(50) NOT NULL,
age integer,
FOREIGN KEY (company_id) references companies(id)
);

INSERT INTO companies(id, name, tel) VALUES
(1, ‘株式会社ほげ’, ’00-0000-0000′),
(2, ‘株式会社ふが’, ’00-0000-1111′),
(3, ‘株式会社ぴよ’, ’00-0000-2222′);

INSERT INTO employees(id, company_id, name, age) VALUES
(1, 1, ‘テスト太郎’, 25),
(2, 1, ‘テスト次郎’, 20),
(3, 2, ‘テスト三郎’, 30),
(4, null, ‘テスト五郎’, 40);

### 内部結合(inner join)
結合条件に一致するレコードだけ表示
testdb=# SELECT
testdb-# e.id AS employee_id,
testdb-# e.name AS employee_name,
testdb-# c.id AS company_id,
testdb-# c.name AS company_name
testdb-# FROM employees e
testdb-# JOIN companies c ON c.id = e.company_id;
employee_id | employee_name | company_id | company_name
————-+—————+————+————–
1 | テスト太郎 | 1 | 株式会社ほげ
2 | テスト次郎 | 1 | 株式会社ほげ
3 | テスト三郎 | 2 | 株式会社ふが

### LEFT JOIN
左外部結合。左テーブルを全て表示し、結合条件に一致しない右テーブルはNULLとして結合
testdb=# SELECT
testdb-# e.id AS employee_id,
testdb-# e.name AS employee_name,
testdb-# c.id AS company_id,
testdb-# c.name AS company_name
testdb-# FROM employees e
testdb-# LEFT JOIN companies c ON c.id = e.company_id;
employee_id | employee_name | company_id | company_name
————-+—————+————+————–
1 | テスト太郎 | 1 | 株式会社ほげ
2 | テスト次郎 | 1 | 株式会社ほげ
3 | テスト三郎 | 2 | 株式会社ふが
4 | テスト五郎 | |

### LIGHT JOIN
testdb=# SELECT
testdb-# e.id AS employee_id,
testdb-# e.name AS employee_name,
testdb-# c.id AS company_id,
testdb-# c.name AS company_name
testdb-# FROM employees e
testdb-# RIGHT JOIN companies c ON c.id = e.company_id;
employee_id | employee_name | company_id | company_name
————-+—————+————+————–
1 | テスト太郎 | 1 | 株式会社ほげ
2 | テスト次郎 | 1 | 株式会社ほげ
3 | テスト三郎 | 2 | 株式会社ふが
| | 3 | 株式会社ぴよ
(4 rows)

なるほど、これは勉強になる。