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

ゼロパディング

$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)

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

PHPのエラーと例外処理

ini_set('display_errors', 1);

$fd = fopen("c:/temp/abc.txt", "r");
echo "継続処理";

a();
echo "継続処理";

$ php index.php

Warning: fopen(c:/temp/abc.txt): failed to open stream: No such file or directory in /home/vagrant/dev/test/index.php on line 5
継続処理
Fatal error: Uncaught Error: Call to undefined function a() in /home/vagrant/dev/test/index.php:8
Stack trace:
#0 {main}
thrown in /home/vagrant/dev/test/index.php on line 8

### set_error_handler

set_error_handler(function($errno, $errstr, $errfile, $errline){
	print("エラーが発生しました。$errno, $errstr <br>");
});

$fd = fopen("c:/temp/abc.txt", "r");

$ php index.php
エラーが発生しました。2, fopen(c:/temp/abc.txt): failed to open stream: No such file or directory

### Exception
例外が発生しそうな処理には、try, catch, finallyを使う

set_error_handler(function($errno, $errstr, $errfile, $errline) {
    if (!(error_reporting() & $errno)) {
        return;
    }
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
});


try {
	$fd = fopen("c:/temp/abc.txt", "r");	
} catch(Exception $e){
	echo "例外が発生しました。".$e->getMessage();
}

Rockey Linux

OSS Linux distribution
RedHat Enterprise Linux8のクローンとして開発されており、CentOS/AlmaLinuxと変更点はない
yumリポジトリが提供、コミュニティ中心の発展
Azureでの配布がない、セキュアブート対応もない
ミラーリポジトリはAlmaLinuxの方が多い

現場ではRockey Linuxの方が採用が多いみたい