チートシート – こみなのメモ帳 / 趣味と実益のネタ帳 Tue, 04 May 2021 21:00:00 +0000 ja hourly 1 https://wordpress.org/?v=6.1.1 [play1-jobs]ジョブの使い方 /archives/786/ /archives/786/#respond Tue, 04 May 2021 21:00:00 +0000 https://www.komina.info/?p=786 概要

HTTPリクエストとは関係なく処理を行ないたいときに、非同期ジョブ機能がある。(もちろんHTTPリクエストをトリガにして実行することもできる)

準備

play.jobs.jobクラスを継承したクラスを用意する。(javaのバージョンが許せば無名クラスでも構わない)

public void doJob()メソッドを実装し、行ないたい処理を書く。
処理結果をTクラスで返したいときは、play.jobs.job<T>を継承し、public T doJobWithResult()メソッドを実装する。

実行する

すぐに実行

インスタンスを生成し、now(), in(), afterRequest() のいずれかのメソッドを実行する。

  • now()は、即時実行。
  • in(int)は、遅延実行。秒で指定する。
  • in(String)も、遅延実行。こちらは @Everyと同じ書式。
  • afterRequest()は、HTTPリクエスト中に意味を持つ。現在実行中のアクションが終了してから実行する。
    例えば、JPAでsave()、コミット後にジョブを実行したいときに有効。(play1.3から実装された)

runメソッドというのも存在するが使用してはいけない。面倒でもnow()メソッドを使うこと。

いずれのメソッドも、Promiseオブジェクトを戻り値に持つので、play.mvc.Controller.await(int) を用いてジョブの終了まで、リクエストをサスペンド状態にすることができる。サスペンド状態にすると、コネクションが解放されるので、次のリクエストを処理することができる。

応答に長時間かかるリクエストであっても、コネクションを占有しないで済むとされる。

実行完了まで待つ方法

Promise job = new MyJob().now();
job.get();

job.get()でジョブ終了まで待つ。Promise<V>だったら、Vが返却される。

アプリケーション開始時に実行

ジョブクラスに対し、@OnApplicationStartアノテーションを付与すると、アプリケーション開始時にジョブが実行される。処理結果は残らない。

アノテーションのasyncプロパティはデフォルトはfalseになっている。async=falseの場合、ジョブ処理が終了するまでアプリケーションは開始しない。
逆に、async=true に設定すると、バックグラウンドで動作する。

細かいこと

  • afterApplicationStart()イベント内より実行される。
  • 起動時にインスタンスが一度だけ生成され、スケジュール管理に残り続けるので勝手に消滅しない。
  • DEVモードでは最初のリクエストを受けたときに実行。
  • PRODモードではサービス起動時に実行。

アプリケーション終了時に実行

ジョブクラスに対し、@OnApplicationStopアノテーションを付与すると、アプリケーション終了時に実行される。
play.Play.stop()が実行されたときなので必ず実行されるとは限らない

onApplicationStop()イベント内より実行される。
インスタンスは終了時に生成される。

一定間隔で実行

ジョブクラスに対し、@Everyアノテーションを付与すると、引数に指定した間隔でジョブが実行される。

単位接尾辞例(意味)
d3d (3日ごと)
時間h1h (1時間ごと)
mn5mn (5分ごと)
s15s (15秒ごと)

引数に上記の間隔文字列ではなく、”cron.hoge” と指定すると、application.conf [cron.hoge] に設定した値を参照する。”never”とすると周期実行されないので、アプリケーションIDによって動作のON/OFFを分けることができる。

@Every("cron.hoge")
public class MyJob extends Job { ...
# %prodの時だけ実行する
cron.hoge=never
%prod.cron.hoge=3h

インスタンスは起動時に一度だけ生成され、アプリケーション実行中はずっと残りつづける。

定時に実行

ジョブクラスに対し、@Onアノテーションを付与すると、引数に指定した時間に実行される。引数はcron書式に準拠する。

day-of-weeka day-of-month については未実装なのでサポートされない。
例えば、@On("0 0 16 * * MON-FRI") のような設定をするとエラーになる。@On("0 0 16 * * ?") ならOK。

@Everyと同じく、”cron.hoge” のように指定すると、application.conf [cron.hoge] の設定を参照する。””空文字のときは定期実行されないので、アプリケーションIDによって動作のON/OFFを分けることができる。

@On("cron.hoge")
public class MyJob extends Job { ...
# %prodのときだけ実行する
cron.hoge=
%prod.cron.hoge=0 0 16 * * ?

おまけ

インスタンスは起動時に一度だけ生成され、アプリケーション実行中はずっと残りつづける。

定期ジョブの実行は、java.util.concurrent.ScheduledThreadPoolExecutorクラスで実現している。
sardineの日記 – scheduleAtFixedRate() の正確さ ここの情報をみると、あまり時刻に正確さを期待してはいけないのかもしれない。

いずれの方法でのジョブ実行もplay.jobs.Job.call()からの呼出となる。
そこでは、before, filter, afterといった処理が適宜呼び出されるようになっている。DBへのトランザクション開始もfilter内で解決されているようだ。

自前でトランザクション管理する際は、ジョブを記述しているクラスに対して@NoTransactionアノテーションを付ける。

@NoTransaction
public class MyJob extends Job { ...
]]>
/archives/786/feed/ 0
[php]PHPのチートシート(Web編) /archives/511/ /archives/511/#respond Wed, 28 Oct 2020 21:00:00 +0000 https://www.komina.info/?p=511
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

設定

アップロードするファイルサイズを大きくする

php.ini設定を下記のように変更する。

post_max_size = 16M
upload_max_filesize = 16M
file_uploads = On

POSTサイズの制限も影響を受けるので、php.iniとともに変更する。

バージョン表示を消す

PHPが出力するヘッダにはPHPのバージョン情報も含まれる。
PHPのバージョンを表示することはセキュリティ面から好ましいとは言えないので、特に理由がない限りはOFFにしておくのが好ましい。

expose_php = OFF

リクエストの取得

GETメソッドおよびPOSTメソッドによってブラウザより渡されるデータの取得方法について。

GETメソッド

システム変数、$_GET[ ]を参照する。

<input type="text" name="abc">

このようなフォームからリクエストを受け取る場合は次のように記述する。

$var = $_GET["abc"];

取得できない場合は、nullが返される。

POSTメソッド

システム変数、$_POST[ ]を参照する。

<input type="text" name="abc">

このようなフォームからリクエストを受け取る場合は次のように記述する。

$var = $_POST["abc"];

取得できない場合は、nullが返される。

GET、POST共通

システム変数、$_REQUEST[ ]を参照する。
$_REQUEST[ ]では、GETメソッド、POSTメソッド両方からのデータ取得が出来る。

本来POSTされるべきデータをGETで偽装された場合に区別できないので推奨されない。

チェックボックスの処理

チェックボックスでの複数チェックの状態を取得するには、HTMLは次のように記述する。

<input type="checkbox" name="abc[]" value="01">選択肢A
<input type="checkbox" name="abc[]" value="02">選択肢B
<input type="checkbox" name="abc[]" value="03">選択肢C

name属性を「abc[]」として配列表記にしておく。
PHP側でデータを参照すると配列変数として得られる。

次のように添え字ありでも構わない。

<input type="checkbox" name="abc[1]" value="01">
<input type="checkbox" name="abc[k001]" value="01">

このチェック状態を”hidden”にて次のフォームへ渡す場合も、同様に記述する。

<input type="hidden" name="abc[]" value="01">
<input type="hidden" name="abc[]" value="02">

ファイルの受信

フォームの記述は、で enctype=”multipart/form-data” を指定する。
ファイル選択は、<input type=”file”> にて配置する。

<!-- サンプル -->
<form enctype="multipart/form-data" method="post" action="getimage.php" >
 <input type="file" name="fileA">
 <input type="file" name="fileB">
 <input type="file" name="fileC">
 <input type="submit" value="送信">
</form>

PHP側では受け取ったファイルをテンポラリに保存する。
テンポラリを作るディレクトリは、php.iniで設定する。

; 設定例
upload_tmp_dir = "C:\xampplite\tmp"

スクリプトでは、$_FILES配列変数を参照することで、ファイルの詳細を得ることが出来る。
ファイルを1つ選び、残り2つは空欄で送信した場合の$_FILESは以下の通り。

fileA
namereadme.txt
typetext/plain
tmp_nameC:\xampplite\tmp\php31.tmp
error0
size2435
fileB
name
type
error4
size0
fileC
name
type
error4
size0
$_FILES[ ]

元ファイル名、サイズ、テンポラリファイルのパスが入っているので、これを利用する。
保存されたファイルはスクリプトの終了時に削除されるので、必要ならコピーしておく必要がある。

セッション

セッションを使用するとスーパーグローバル配列変数$_SESSIONを使用して、セッション機能を利用できる。

セッションの開始/破棄

明示的に開始する場合は、session_start()関数を使用する。
既にセッションが開始されている場合は保存されているセッションデータが読み込まれる。

session_start();

php.iniの設定で自動開始とすることもできる。

[Session]
session.auto_start = 1

明示的にセッションを破棄する場合は、session_destroy()関数を使用する。

session_destroy();

明示的に破棄しないとサーバに情報が残り続けるので、自動破棄する機構がある。
セッションの有効時間を何秒とするか、php.iniの設定

session.gc_maxlifetime = 1440;  // = 24min  (24 x 60sec)

期限切れセッションデータの物理削除処理(ガベージコレクション)の起動設定。
session_start()関数が呼ばれるたびに、以下の設定値を用いて確率試行が行われる。

// 1/100の確率でGC起動
session.gc_probability = 1
session.gc_divisor = 100

セッションデータの利用

スーパーグローバル配列変数$_SESSIONを使用する。配列と同じ扱いで良い。

$_SESSION['name'] = $name;   // セッションへ登録
if (isset($_SESSION['name'])) {
   print $_SESSION['name'].'さん、こんにちは!';     // 登録内容の利用
}

特定の要素を削除する場合は、unset()関数にて要素を削除できる。

unset($_SESSION['name']);

全ての要素を削除する場合は、新たに配列を割り当てる方が早い。

$_SESSION = array();

Smarty

有名なテンプレートエンジン。テンプレートは標準でファイルを使用する。ファイル以外のリソースを使用する場合は、register_resource()メソッドにて自前で用意した関数を登録する必要がある。

ファイル以外のリソースを使う

http://ml.php.gr.jp/pipermail/php-users/2004-March/021324.html
テンプレートをメモリーから読み込むサンプルが書かれているが、このままではNG。
$smarty->fetch("hensu:".$tmpl); としているが、$tmplの中身がそのままコンパイル結果の保存ファイル名になってしまう。
したがって保存ファイル名が、ファイル名として適切で無い状態になってしまうと落ちることがある。
参考: https://www.smarty.net/docsv2/ja/template.resources

“{” や “}” を本文で使う

Smrty処理しない範囲が決まっているなら、{literal}{/literal}タグで囲む。
スポット的ならそれぞれ、{ldelim}および{rdelim}が対応している。

]]>
/archives/511/feed/ 0
[php]PHPのチートシート /archives/509/ /archives/509/#respond Tue, 27 Oct 2020 21:00:00 +0000 https://www.komina.info/?p=509
【注意】
この記事は過去に別サイトで執筆したものを再掲載したものです。
内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。
 

入手

すぐに始めるにはXAMPP環境が便利。

比較演算子

  • 型変換が自動で行われる以外は、C言語などの比較演算子と同じ。
  • 厳密チェックのために”===”,”!==”という演算子が用意されている。
    • ’10’が数値なのか、’1’と’0’から成る文字列なのか、区別される。
    • nullと ” も厳密比較しないと同じとして扱われる。
演算子意味
===オブジェクトの型も含めて一致している
!==オブジェクトの型も含めて一致していない

変数

通常、厳密な型チェックは行われない。

変数が数値型かどうか

変数の値がinteger型かどうか確認するには、is_int()関数を用いる。

$val1 = 10;
$val2 = '20';
if (is_int($val1)) { .... }
if (is_int($val2)) { .... }

文字列

文字列から数値を取得

  • intval()、floatval()、doubleval()関数を使う。
  • intval()関数では、第二引数で基数を指定できる。
$imm = intval($str);

16進文字列を数値に変換

  • intval()関数の基数を指定する。
$imm = intval('1234', 16);

文字列をセパレータで分解する

  • split( ), spliti( ), explode( )関数を使う。
  • split( ), spliti( )は、セパレータ文字の指定で正規表現が使える。
  • spliti( )はアルファベットの大文字と小文字を区別しない。
  • explode( )は正規表現が使えない代わりに高速。

配列

動的配列、連想配列、の機能を持つ。

配列の定義方法

$sample = array('a', 'b', 'c');

配列にキーが存在するか

  • array_key_exists()関数を用いる。
  • 存在しないキーを用いて値を取得しようとしてもエラーにはならない。nullとなる。
if (array_key_exists('name', $sample)) {
    // 存在する
}

ある変数が配列かどうか

  • ある変数が配列かどうかを確認するには、is_array()関数を用いる。
  • 配列ならtrueを返す。
$result = is_array($table);

配列からの特定の要素を削除する

unset( )関数を用いる。

$sample = array('while'=>7, 'bule'=>2, 'red'=>1);
unset($sample['white']);

配列の要素数を調べる

count( )関数、もしくはsizeof( )関数を用いる。

$i = count($sample);
count()関数について
  • 配列もしくはCountableインタフェースを実装したオブジェクトの要素数を返します。
  • 普通の変数であれば1。nullであれば0を返します。
  • 第二引数でモードを指定することもできる。
    • 省略するとCOUNT_NORMAL。指定変数の要素数のみ返す。
    • COUNT_RECURSIVEを指定すると再帰的にカウントする。

計算

四捨五入、切り捨て、切り上げ

  • それぞれ、round( )、floor( )、ceil( )関数で行う。
  • 小数点以下の処理となる。(round( )のみ桁指定可能)
  • 例えば、100の倍数になるようにするならば下記のようにして対応する。
$result = floor($value / 100) * 100;
$result = ceil($value / 100) * 100;
$result = round($value, -2);
]]>
/archives/509/feed/ 0
Windowsバッチのチートシート /archives/75/ /archives/75/#respond Mon, 11 Nov 2019 11:20:26 +0000 http://www.komina.info/?p=75 変数
%0

バッチのフルパスが設定されている。
バッチの置かれているカレントディレクトリは、%~dp0
常にバッチが置かれているディレクトリをカレントディレクトリにしたいときは下記のようにする。

cd /d %~dp0
%1,%2,%3,…

指定された引数が設定されている。
for%*を使うと%1以降の全ての引数が参照できる。コマンドライン引数を順次参照したいときに便利。

for %%f in (%*) do (
    rem そのまま
    echo %%f
    rem ファイル名のみ
    echo %%~nf
    rem 拡張子のみ
    echo %%~xf
    rem 参考: https://pentan.info/server/windows/cmd/dp0.html
)
%cd%

現在の作業中のディレクトリ

%date%

現在の日付。yyyy/MM/dd形式。書式を変えたいときは下記の変数の加工によって部分を切り貼りする。

%time%

現在の時刻。hh:mm:ss.SS形式。書式を変えたいときは下記の変数の加工によって部分を切り貼りする。

変数の加工

%ymd:~0,4%

substr相当。
変数ymdの0文字目から4文字を切り出す例。ymd20201231が入っていた場合は2020が切り出される。

%ymd:~-4,2%

応用編。
マイナス値の場合は末尾から数える。ymd20201231なら1231の頭2文字、12が切り出される。

%ymd:-4,-1%

応用編2.
第二引数がマイナス値の場合は末尾n文字が捨てられる。ymd20201231なら1231の末尾1文字か捨てられ123が切り出される。

%ymd:0=o%

置換。
例は”0″を”o”と置き換える意味。ymd20201231なら、2o2o1231になる。

特殊文字の記述

記述方法
TABコードテキストエディタの場合はそのままTABコードを記述すればよい。
ダブルクォート“”。2回連続して記述。
%コマンドプロンプトの場合はそのまま記述。
バッチファイル内で文字列として使用するときは2回連続して記述しないと変数を示す予約語として解釈されてしまう。

文字入力

set /p 変数名=メッセージ

使用例

@echo off
set user_age=
set /p user_age=年齢を入力してください...
echo あなたの年齢は %user_age% 才です.

実行結果

年齢を入力してください…22
あなたの年齢は 22 才です.

改行の出力

echo. または echo; または echo:

一時停止

pause

「続行するには何かキーを押してください . . .」
と表示して何か入力があるまで停止する。

timeout

「■ 秒待っています。続行するには何かキーを押してください …」と表示し、指定の秒数停止する。
例)timeout /t 5 5秒間経過 or 何かキーが押されたら続行する。
例2)timeout /t 3 /nobreak 「■ 秒待っています。終了するには CTRL+C を押してください …」と表示し、3秒間停止する。

非同期実行

通常は実行ファイル名だけ書くところを、startコマンドを使うと非同期実行となる。

start notepad.exe

呼び出し方と終わり方

exit [結果コード]

呼出元の親バッチも道連れに終了する。

exit /B [結果コード]

/Bオプションを付けると呼出元に処理を戻しつつ、結果コードを返す。
呼出元で %ERRORLEVEL%で 結果を評価できる。

cmd /C piyo.bat

/Bオプションなしで作られたバッチの結果コードを得たいときは、cmd /C コマンドで呼び出す。

call piyo.bat
cmd puyo.bat

普通に子バッチを呼び出すときは、call cmd コマンドを使う。

ディレクトリの移動

pushd

ディレクトリの移動。
UNCパス(共有フォルダ)上でも移動ができる。
※cdコマンドでUNCパスへ移動できない。

popd

pushdとセットで使う。pushdで移動する前のディレクトリに戻る。一時的にディレクトリを移動するときに便利。

強制コピー

copy /y

メッセージも不要ならnulへリダイレクトする。

copy /y > nul

ステートメント

if (式) コマンド

条件判断を行う。(式)がtrueのとき、コマンドを実行する。
コマンドが複数に渡る場合は、goto文を使って実現する。

式の例(1) ファイルが存在するか

exist %1
if exist foo%1.txt goto skip
  copy foo.txt foo%1.txt
:skip

式の例(2) 文字列比較

'%1'=='a'

式の例(3) 否定

not '%1'=='a'

goto (ラベル)

指定ラベルの書かれた行へジャンプする。
ラベルは、コロン(:)で始まる英字で指定する。

goto proc1
echo 実行されない
:proc1
exit

call (ラベル) (引数…)

指定ラベルの書かれた行へジャンプ
引数も一緒に渡すことができる。

call hello john
:hello
echo Hello, %1 !
exit /b

call (バッチファイル名)

バッチの呼出もできる。

コードページ

コマンドプロンプトはコードページMS932(≒ShiftJIS)がデフォルトですが、必要に応じてコードページを変更できる。
呼び出すプログラムの出力がUTF-8固定といった場合、そのままだと文字化けしてしまうが、事前に切り替えておくと文字化けを回避できる。

chcp

現在のコードページを表示する。

chcp 932

コードページをMS932にする。

chcp 65001

コードページをUTF-8にする。

コマンドプロンプト起動

コマンドプロンプトを起動した際に、作業に合わせてパス設定や任意のコマンドを実行して準備をしておきたい場合がある。その方法について。

(1) Windowsの検索から「コマンド プロンプト」を探し、ファイルの場所を開く。コマンドプロンプトのショートカットが存在するので、これを任意の場所にコピーする。

(2) コピーしたショートカットを右クリック>プロパティを開く。ショートカットの欄に、/k オプションで実行したいバッチファイルを指定する。

/kオプションなしでバッチファイルを指定するとバッチの終了と共にコマンドプロンプトも閉じてしまう。

Tips

ファイルの結合

copyコマンドを使うとファイルを結合することができる。プラス記号で結合したいファイルを指定する。

copy file1.txt + file2.txt + file3.txt  result.txt

ファイル名にスペースなどを含む場合は、コーテーション(””)で囲む。

ファイルを並べ替えて処理

for /F "delims=" %%x in ('dir /b %src_dir% ^| sort') do (
   echo %%x
)

%src_dir%の示すディレクトリ内のファイルをソートして、1ファイルずつ処理するループ。バッチの中なので、%%xのように%を二重に記述している。

/F "delims="in(…)の中身を行単位で処理する意味になる。

パイプ記号はハット^でエスケープしている。

]]>
/archives/75/feed/ 0