visual studio codeでapache httpd 2.4をデバッグする
virtualboxとvagrantを使用してcentos7の仮想環境を構築しvisual studio codeで
apache httpd 2.4をデバッグしてみたいと思います。
ホストオンリーアダプタを使用し、仮想環境のipアドレスを固定するため、 virtualbox側で ホストネットワークマネージャーの設定を行います。
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"
デスクトップを起動させます。(VirtualBoxのGUIから行います)
ゲスト
$ 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++のプラグインを入れます。 デバッグメニューから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 } ] } ] }
Laravel 5.5 バリデーション ルール 日本語
原文
Validation - Laravel - The PHP Framework For Web Artisans
accepted
検証中のフィールドは、yes、on、1、またはtrueでなければなりません。これは "利用規約"の承認を検証するのに便利です。
active_url
検証中のフィールドには、dns_get_record
PHP関数に従って有効なAレコードまたはAAAAレコードが必要です。
after:date
検証中のフィールドは、指定された日付の後の値でなければなりません。日付はstrtotime
PHP関数に渡されます:
'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
検証中のフィールドは、strtotime
PHP関数に従って有効な日付でなければなりません
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'
検証中のフィールドは、電子メールアドレスとしてフォーマットする必要があります。
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
検証中のファイルはイメージ(jpeg、png、bmp、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_list
PHP関数に従って有効なタイムゾーン識別子でなければなりません。
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クラスを拡張する事に関して
こちらの記事を参考に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に検索条件をセット
こんな感じでよいのか謎