visual studio codeでapache httpd 2.4をデバッグする

virtualboxvagrantを使用してcentos7の仮想環境を構築しvisual studio code
apache httpd 2.4をデバッグしてみたいと思います。

ホストオンリーアダプタを使用し、仮想環境のipアドレスを固定するため、 virtualbox側で ホストネットワークマネージャーの設定を行います。  f:id:kojima4994:20190914034728p:plain

Vagrant ファイル

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.hostname = "apache-test"
  config.vm.box = "centos/7"

  config.vm.network "private_network", ip: "192.168.56.12"

  config.vm.provider "virtualbox" do |vb|
    vb.cpus = 4
    vb.gui = true
    vb.memory = 1024 * 8
  end

  config.vm.provision "shell", inline: <<-SHELL
  sudo yum update -y
  SHELL
end

  作成したVagrantファイルから仮想環境を作成します。
ホスト

$ vagrant up

起動処理が完了したらログインをし、GNOME Desktopをインストールします。
ホスト

$ vagrant ssh

ゲスト

$ sudo yum group install "GNOME Desktop"

デスクトップを起動させます。(VirtualBoxGUIから行います)
ゲスト

$ startx

デスクトップが立ち上がったところで、必要なモジュール群をインストールしていきます。
ゲスト

$ sudo yum install gcc gdb apr-devel apr-util-devel pcre-devel

visual studio code rpmパッケージをダウンロードし、yumでインストールします。
ゲスト

$ sudo yum install code-xxxx.rpm

apache httpd apacheのサイトからソースコードをダウンロードし、インストールしていきます。
ゲスト

$ tar -zxvf httpd-2.4.41.tar.gz
$ cd httpd-2.4.41.tar.gz
$ CFLAGS="-g" ./configure --prefix=/usr/local/apache24/ --with-mpm-prefork
$ make
$ sudo make install

apache httpd2.4のインストールが完了しました。 次に、apacheのconfをテスト用に編集します。
/usr/local/apache24/conf/httpd.confに追記

SeverName apache-test:80
# 462行目コメント解除
Include conf/extra/httpd-mpm.conf

テスト用に子プロセスが1つしか立ち上がらないように修正します。
/usr/local/apache24/conf/extra/httpd-mpm.conf 28行目あたり

<IfModule mpm_prefork_module>
    StartServers 1
    MinSpareServers 1
    MaxSpareServers 1
    MaxRequestWorkers 1
    MaxConnectionPerChild 100
</IfModule>

コンパイル時にmpmをpreforkで指定しているのでpreforkの部分のみ書き換えます。
他のmpmを使用している場合は該当の部分を修正します。
以上でapacheの設定は完了です。
apacheを起動し、子プロセスのプロセスIDを確認しておきます。
ゲスト

# 起動
$ sudo /usr/local/apache24/bin/httpd
# プロセス確認
# 
$ ps auxf | grep httpd
root     18030  0.0  0.0  74668  2108 ?        Ss   18:26   0:00 /usr/local/apache24/bin/httpd
daemon   18031  0.0  0.0  76752  2132 ?        t    18:26   0:00  \_ /usr/local/apache24/bin/httpd

18031が子プロセスのIDです。

次にvisual studio codeの設定を行います。 C/C++プラグインを入れます。 f:id:kojima4994:20190914043209p:plain デバッグメニューからlaunch.jsonを作成し、下記の内容に編集します。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Attach",
            "type": "cppdbg",
            "request": "attach",
            "program": "/usr/local/apache24/bin/httpd",
            "processId": "18031",  // ← apacheの子プロセスID
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

デバッグメニューからアタッチを選択し、apacheの子プロセスにアタッチを行います。

アタッチされたことが確認できたらapacheへリクエストを送りデバッグすることができます。f:id:kojima4994:20190914043736p:plain

Laravel 5.5 バリデーション ルール 日本語

原文

Validation - Laravel - The PHP Framework For Web Artisans

accepted

検証中のフィールドは、yes、on、1、またはtrueでなければなりません。これは "利用規約"の承認を検証するのに便利です。

active_url

検証中のフィールドには、dns_get_recordPHP関数に従って有効なAレコードまたはAAAAレコードが必要です。

after:date

検証中のフィールドは、指定された日付の後の値でなければなりません。日付はstrtotimePHP関数に渡されます:

'start_date' => 'required|date|after:tomorrow'

byによって評価される日付文字列を渡す代わりに、日付strtotimeと比較する別のフィールドを指定することができます:

'finish_date' => 'required|date|after:start_date'

after_or_equal:date

検証中のフィールドは、指定された日付以降の値でなければなりません。詳細については、アフタールールを参照してください。

alpha

検証中のフィールドは完全に英字でなければなりません。

alpha_dash

検証中のフィールドには英数字、ダッシュ、アンダースコアを使用できます。

alpha_num

検証中のフィールドは完全に英数字でなければなりません。

array

検証中のフィールドはPHPでなければなりませんarray

before:date

検証中のフィールドは、指定された日付より前の値でなければなりません。日付はPHP strtotime関数に渡されます。

before_or_equal:date

検証中のフィールドは、指定した日付に等しいかそれより前の値でなければなりません。日付はPHP strtotime関数に渡されます。

between:min,max

検証中のフィールドは、指定された最小値と最大値の間のサイズを持つ必要があります。文字列、数値、配列、ファイルは、sizeルールと同じ方法で評価されます。

boolean

検証中のフィールドはブール値としてキャストできなければなりません。受け付けた入力されtrue、false、1、0、"1"、と"0"。

confirmed

検証中のフィールドには一致するフィールドが必要ですfoo_confirmation。たとえば、検証中のフィールドがあるpassword場合、一致するpassword_confirmationフィールドが入力内に存在する必要があります。

date

検証中のフィールドは、strtotimePHP関数に従って有効な日付でなければなりません

date_equals:date

検証中のフィールドは、指定された日付と等しくなければなりません。日付はPHP strtotime関数に渡されます。

date_format:format

検証中のフィールドは、指定されたフォーマットと一致する必要があります。あなたは使用する必要がありますいずれか dateまたはdate_formatフィールドを検証する際、両方ではありません。

different:field

検証中のフィールドは、フィールドと異なる値を持つ必要があります。

digits:value

検証中のフィールドは数値で、正確な長さの値でなければなりません。

digits_between:min,max

検証中のフィールドの長さは、指定された最小値と最大値の間でなければなりません。

dimensions

検証中のファイルは、ルールのパラメータで指定された次元の制約を満たすイメージでなければなりません。

'avatar' => 'dimensions:min_width=100,min_height=200'

使用可能な制約は、min_width、max_width、min_height、max_height、width、height、ratioです。

比率制約は高さで割った幅として表現されなければなりません。これは、次のような文またはfloatのいずれかで指定できます。3/2 1.5

'avatar' => 'dimensions:ratio=3/2'

このルールはいくつかの引数を必要とするため、このメソッドを使用してルールを流暢に構築できます。Rule::dimensions

use Illuminate\Validation\Rule;

Validator::make($data, [
    'avatar' => [
        'required',
        Rule::dimensions()->maxWidth(1000)->maxHeight(500)->ratio(3 / 2),
    ],
]);

distinct

配列を操作する場合、検証中のフィールドには重複する値があってはなりません。

'foo.*.id' => 'distinct'

email

検証中のフィールドは、電子メールアドレスとしてフォーマットする必要があります。

exists:table,column

検証中のフィールドは、指定されたデータベーステーブルに存在する必要があります。

存在規則の基本的な使用法
'state' => 'exists:states'
カスタム列名の指定
'state' => 'exists:states,abbreviation'

場合によっては、existsクエリに使用する特定のデータベース接続を指定する必要があります。これを達成するには、「ドット」構文を使用してテーブル名に接続名を追加します。

'email' => 'exists:connection.staff,email'

検証ルールによって実行されたクエリをカスタマイズする場合は、そのRuleクラスを使用してルールを流暢に定義することができます。この例では、|文字を使用して区切る代わりに、配列として検証ルールを指定します。

use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::exists('staff')->where(function ($query) {
            $query->where('account_id', 1);
        }),
    ],
]);

file

検証中のフィールドは正常にアップロードされたファイルでなければなりません。

filled

検証中のフィールドは、存在する場合は空であってはいけません。

image

検証中のファイルはイメージ(jpegpngbmp、gif、またはsvg)でなければなりません。

in:foo,bar,...

検証中のフィールドは、指定された値のリストに含める必要があります。このルールでimplodeは配列を必要とすることが多いため、このメソッドを使用してルールを流暢に構築できます。Rule::in

use Illuminate\Validation\Rule;

Validator::make($data, [
    'zones' => [
        'required',
        Rule::in(['first-zone', 'second-zone']),
    ],
]);

in_array:anotherfield

検証の下のフィールドには、中に存在している必要がありanotherfieldの値。

integer

検証中のフィールドは整数でなければなりません。

ip

検証中のフィールドはIPアドレスでなければなりません。

ipv4

検証中のフィールドはIPv4アドレスでなければなりません。

ipv6

検証中のフィールドはIPv6アドレスでなければなりません。

json

検証中のフィールドは、有効なJSON文字列でなければなりません。

max:value

検証中のフィールドは、最大値以下でなければなりません。文字列、数値、配列、ファイルは、sizeルールと同じ方法で評価されます。

mimetypes:text/plain,...

検証中のファイルは、指定されたMIMEタイプのいずれかと一致する必要があります。

'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'

アップロードされたファイルのMIMEタイプを判断するには、ファイルの内容が読み込まれ、フレームワークMIMEタイプを推測しようとします。これはクライアントが提供するMIMEタイプとは異なる場合があります。

mimes:foo,bar,...

検証中のファイルには、リストされている拡張子の1つに対応するMIMEタイプが必要です。

MIMEルールの基本的な使用法
'photo' => 'mimes:jpeg,bmp,png'

拡張子を指定するだけで済みますが、このルールは実際にはファイルの内容を読み込み、そのMIMEタイプを推測することで、ファイルのMIMEタイプを検証します。

MIMEタイプとそれに対応する拡張機能の完全なリストは、次の場所にあります。 https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types

min:value

検証中のフィールドには最小値が必要です。文字列、数値、配列、ファイルは、sizeルールと同じ方法で評価されます。

nullable

検証中のフィールドは、次のようになりますnull。これは、null値を含むことができる文字列や整数などのプリミティブを検証する場合に特に便利です。

not_in:foo,bar,...

検証中のフィールドは、指定された値のリストに含まれていてはなりません。この方法は、ルールを流暢に構築するために使用されます。Rule::notIn

use Illuminate\Validation\Rule;

Validator::make($data, [
    'toppings' => [
        'required',
        Rule::notIn(['sprinkles', 'cherries']),
    ],
]);

umeric

検証中のフィールドは数値でなければなりません。

present

検証中のフィールドは入力データに存在する必要がありますが、空でもかまいません。

regex:pattern

検証中のフィールドは、指定された正規表現と一致する必要があります。

注意:regexパターンを使用するときは、パイプの区切り文字を使用する代わりに、特に正規表現にパイプ文字が含まれている場合は、ルールを配列で指定する必要があります。

required

検証中のフィールドは、入力データに存在し、空ではありません。次のいずれかの条件が当てはまる場合、フィールドは「空」と見なされます。

  • 値はnullです
  • 値は空の文字列です。
  • 値は空の配列または空のCountableオブジェクトです。
  • 値は、パスのないアップロードされたファイルです。

required_if:anotherfield,value,...

anotherfieldフィールドが任意の値と等しい場合、検証中のフィールドは存在し、空ではありません。

required_unless:anotherfield,value,...

anotherfieldフィールドが任意の値と等しい場合を除いて、検証中のフィールドは存在し、空ではありません。

required_with:foo,bar,...

検証中のフィールドは存在し、他の指定されたフィールドが存在する場合にのみ空ではありません。

required_with_all:foo,bar,...

検証中のフィールドは、指定された他のフィールドがすべて存在する場合にのみ存在し、空でない必要があります。

required_without:foo,bar,...

検証中のフィールドは、指定された他のフィールドが存在しない場合にのみ存在し、空でない必要があります。

required_without_all:foo,bar,...

検証中のフィールドは、指定された他のすべてのフィールドが存在しない場合にのみ存在し、空でない必要があります。

same:field

指定されたフィールドは、検証中のフィールドと一致する必要があります。

size:value

検証中のフィールドは、指定された値と一致するサイズを持つ必要があります。文字列データの場合、valueは文字数に対応します。数値データの場合、valueは指定された整数値に対応します。配列の場合、sizeは配列の配列に対応しcountます。ファイルの場合、サイズはファイルサイズ(キロバイト)に対応します。

string

検証中のフィールドは文字列でなければなりません。フィールドも許可するnull場合は、nullableルールをフィールドに割り当てる必要があります。

timezone

検証中のフィールドは、timezone_identifiers_listPHP関数に従って有効なタイムゾーン識別子でなければなりません。

unique:table,column,except,idColumn

検証中のフィールドは、特定のデータベーステーブル内で一意でなければなりません。columnオプションが指定されていない場合は、フィールド名が使用されます。

カスタム列名の指定:
'email' => 'unique:users,email_address'
カスタムデータベース接続

場合によっては、バリデーターによるデータベース照会のカスタム接続を設定する必要が生じることがあります。上記のように、検証ルールとして設定すると、デフォルトのデータベース接続を使用してデータベースが照会されます。これを無効にするには、 "dot"構文を使用して接続とテーブル名を指定します。unique:users

'email' => 'unique:connection.users,email_address'
与えられたIDを無視する一意の規則を強制する:

場合によっては、一意のチェック中に特定のIDを無視することもできます。たとえば、ユーザーの名前、電子メールアドレス、および場所を含む「プロファイルの更新」画面を考えます。もちろん、電子メールアドレスが一意であることを確認する必要があります。ただし、ユーザーが電子メールフィールドではなく名前フィールドのみを変更した場合、ユーザーは電子メールアドレスの所有者であるため、検証エラーがスローされることは望ましくありません。

バリデーターにユーザーのIDを無視するよう指示するために、このRuleクラスを使用してルールを流暢に定義します。この例では、|文字を使用してルールを区切る代わりに、検証ルールを配列として指定します。

use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);

テーブルがプライマリキーのカラム名以外を使用しているid場合は、ignoreメソッドを呼び出すときにカラムの名前を指定できます。

'email' => Rule::unique('users')->ignore($user->id, 'user_id')
追加の句を追加する:

また、whereメソッドを使用してクエリをカスタマイズして、追加のクエリ制約を指定することもできます。たとえば、のは、検証し、制約追加してみましょうaccount_idです1。

'email' => Rule::unique('users')->where(function ($query) {
    return $query->where('account_id', 1);
})

url

検証中のフィールドは有効なURLである必要があります。

pythonで画像のアスペクト比を維持したままサイズ変更して余白を埋める

やりたいこと

540x700の画像を16:9の1920x1080に変更したい(比率は変えず)

 

540x700と縦の700の方が大きいので700を基準に計算

 

1080 / 700 = 約1.5

700 x 1.5 = 1050

縦のサイズが1050になる

横のサイズも540 x 1.5 = 810で810となる

 

そしたら1920x1080まで余白を黒くする

 

微妙な30の隙間の埋め方がわからないので、誰か教えてくれると嬉しいです。

 

以下コード

# -*- coding: utf-8 -*-
from PIL import Image

class image_aspect():

def __init__(self, image_file, aspect_width, aspect_height):
self.img = Image.open(image_file)
self.aspect_width = aspect_width
self.aspect_height = aspect_height
self.result_image = None

def change_aspect_rate(self):

img_width = self.img.size[0]
img_height = self.img.size[1]

if img_width > img_height:
rate = self.aspect_width / img_width
else:
rate = self.aspect_height / img_height

rate = round(rate, 1)
self.img = self.img.resize((int(img_width * rate), int(img_height * rate)))
return self

def past_background(self):
self.result_image = Image.new("RGB", [self.aspect_width, self.aspect_height], (0, 0, 0, 255))
self.result_image.paste(self.img, (int((self.aspect_width - self.img.size[0]) / 2), int((self.aspect_height - self.img.size[1]) / 2)))
return self

def save_result(self, file_name):
self.result_image.save(file_name)

# example
if __name__ == "__main__":
image_aspect('./test_dir/test.jpg', 1920, 1080)\
.change_aspect_rate()\
.past_background()\
.save_result('result.jpg')

Vue.jsのフォーム入力バインディング

Vue.jsを触ってみて2日目(laravel)

フォーム変更時の値の取り方が分からずやっと分かったのでメモ

 

<template>
<div>
<p>{{ maguro }}</p>
<input class="input" v-model="maguro" v-on:input="updateValue($event.target.value)">
</div>
</template>

<script>
export default {
name: 'maguro',
data () {
return {
maguro: ''
}
},
methods: {
updateValue: function (value) {
console.log(value);
}
}
}
</script>

 

pythonのlambdaで再帰処理

pythonのlambda

n%で「当たり」とした時に当たりまで何回失敗したかを計測するlambda関数を作ってみる。

import numpy as np
count = lambda i : (lambda i, f: f(i, 1, f))(i, lambda i, c, f: f(i, c+1, f) if np.random.rand() > i else c)

print(count(0.1)) # 10%が成功するまでの回数

解説

i = %を数値表記したもの

c = 成功するまでのカウンタ

f = 再帰関数

横に長いので分割

lambda i : (lambda i, f: f(i, 1, f)) #A(関数)
(i, lambda i, c, f: f(i, c+1, f) if np.random.rand() > i else c) #B(引数)

1. count(n)で呼び出した際にAの引数iへnが渡される。

2. Bの第一引数が1.から受け取ったiが渡される。

3. Bの第二引数が再帰関数としてfに渡される。

4. この2つの引数をAの中にあるlambdaへ渡す。

5. Aの中のlambdaは2.と3.の引数を受け取り再帰関数を実行する。

6. rand()がnを下回るまでcを加算しながら繰り返す。

 

みたいな感じだと思う。
数学は苦手だから本当に10%までに失敗した計測できてるかはあんまわからない。

取り敢えず再帰出来てよかった。

RubyのFileクラスを拡張する事に関して

qiita.com

こちらの記事を参考にFileクラスを拡張しようと思い、下記の様なコードを実装

class File
alias_method :__open__, :open

def open()
'extend'
end
end

p File.open('test.txt')
#<File:test.txt>

 

この状態で実行すると既存のFile.openの動作が返ってきてしまう。

原因は上書きしたいopenメソッドの引数

def open()

def open(*args)

とし、パッケージ名の修飾とシグネチャを合わせる必要があるようです。
また、クラスメソッドを上書きするのでインスタンスメソッドではなくクラスメソッドを定義する必要があるようです。

なので下記の様に実装します。

class File
class << self
alias_method :__open__, :open
end

def self.open(*args)
'extend'
end
end

p File.open('test.txt')
#extend

すると拡張することが出来ました。

勉強になりました。

CakePHP3でページング時に検索条件を保持

Controller

public function list()
{
if ($this->request->is('POST')) {
$this->Session->write(['requestSearchConditions' => $this->request->data]);
$this->redirect(['action' => 'list']);
}

//LIKE検索リスト
$searchLike = [
'login_name', 'user_name'
];
$searchConditions = [];
$requestSearchConditions = $this->Session->read('requestSearchConditions');


//検索条件配列作成
foreach ($requestSearchConditions as $column => $value) {

if (empty($value)) {
$this->set($column, '');
continue;
}

$this->set($column, $value);
if (array_search($column, $searchLike) !== FALSE) {
array_push($searchConditions, [$column . ' LIKE' => '%'. $value . '%']);
} else {
array_push ($searchConditions, [$column => $value]);
}

}

$query = $this->Recruits->find()->where($searchConditions);

try {
$this->set('recruits', $this->paginate($query));
} catch (NotFoundException $e) {
$this->redirect(['action' => 'list']);
}
}

 

POST送信時に検索条件をSessionにセット、1ページ目に飛ばすよう処理
これで検索時の条件を保持

ページングはGETで行われるのでページめくりの際は検索条件が更新されない

ページめくりをするとView側で入力していた検索条件がクリアされてしまうのでSessionから検索条件の配列を作成している時にViewに検索条件をセット

 

こんな感じでよいのか謎