【PHP】JpCarbonで祝日判定
前にCarbonを使った日付処理を公開しました。
仕事で祝日を判定する処理が必要なり調べたところ、Composerで「JpCarbon」という祝日を判定できる記事を見つけました。
祝日を判定し祝日であれば、何の祝日なのか表示する
require 'home/○○○/bin/vendor/autoload.php'; use Carbon\Carbon; use JpCarbon\JpCarbon; $dt = new Carbon('2018-12-23'); $st = JpCarbon::createFromDate($dt->year, $dt->month, $dt->day)->holiday; echo $st;
祝日でなければ結果は何も表示されません。
【CentOS7】firewallでポート制御しよう
Apacheサーバーをロードバランサーを使って負荷分散をした際に「memcached」利用することになりました。
memcachedはセキュリティの関係上、IP制限を設定しないといけないためその設定方法をメモ。
ポートの許可
firewall-cmd --add-service=http --zone=public --permanent firewall-cmd --add-service=https --zone=public --permanent firewall-cmd --add-service=mysql --zone=public --permanent
特定のIPだけを許可
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="許可するIPアドレス" port protocol="tcp" port="11211" accept"
↑「11211」はmemcachedのポートです。
設定完了後、下記の反映コマンドを実行することでポート制限が有効になります。
firewallの設定を反映
firewall-cmd --reload
firewallの設定を確認
firewall-cmd --list-all-zones
firewallの起動/停止/確認
service firewalld start service firewalld stop service firewalld status
Apache2.4でのWebアクセス制御
とある事情で国内のみのアクセス制限することになり、下記のサイトからIPリストを取得
早速「.htaccess」で設定したら、サイトが落ちかけました。。。
「.htaccess」はアクセスがあるたびに設定内容を読み込むため、国内のIPリストを4000行書くと、サーバーが応答不能になるほど重くなります。
CentOS7標準の「firewall」で設定しようと思いましたが、検索エンジンを回避方法がわからず。。。
※ユーザーエージェントで回避するみたいですが、設定がよくわからなひ(汗
vhost.conf
<VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot /example ServerName example.com <Directory "/example"> Options FollowSymLinks AllowOverride All Include /etc/httpd/conf.d/iplist </Directory> </VirtualHost>
バーチャルホストの設定を「/etc/httpd/conf.d/vhost.conf」に書いています。
「example」というフォルダが対象(サンプルなので各自の設定に書き換えてください。
4000行もipを書くため別ファイルに分けました。
iplist
SetEnvIf User-Agent "Googlebot" bok SetEnvIf User-Agent "Slurp" bok SetEnvIf User-Agent "msnbot" bok SetEnvIf User-Agent "bingbot" bok <RequireAny> Require all denied Require env bok Require ip 1.0.16.0/20 Require ip 1.0.64.0/18 Require ip 1.1.64.0/18 # #続きのipをここに記載 # </RequireAny>
設定エラーがでないか「configtest」で確認
service httpd configtest
Syntax OK
と表示されれば問題ないので、Apacheを再起動させます。
service httpd restart
サイトが落とせないのであれば、下記のコマンドで反映できます。
service httpd graceful
【jQuery】プログラミングサンプル集
jQueryを書くときに忘れやすいコードをまとめて紹介していきます。
※随時更新します。
イベント関係
チェックボックスの状態確認
if($("#id").prop('checked')) { /*チェック済み*/ }else{ /*チェックなし*/ }
該当のチェックボックスにチェックをつける
$('#id').prop('checked',true); /*チェックをはずすとき*/ $('#id').prop('checked',false);
チェックボックスにチェックが入ったものだけを取得し配列に格納
var ids = []; $( '#checkbox:checked' ).each( function() { ids.push( $( this ).val() ); });
セレクトボックスを選択する
/*optionのvalueが1になっている項目に選択*/ $('#id').val(1);
セレクトボックスの選択をはずす
$('#id' option').attr('selected', false);
ID名の取得
$('#id').attr('id');
クラス名の取得
$('#id').attr('class');
クラス名の判定
$('#id').hasclass('class名');
表示/非表示の交互に切り替え
$('#id').toggle();
form値を取得してajaxでPOST
var formdata = $('#formname').serialize(); $.ajax({ url: url, type:'POST', dataType: 'text', data : formdata, }).done(function(data) { /*成功時の処理*/ }).fail(function(XMLHttpRequest, textStatus, errorThrown) { /*失敗時の処理*/ })
form値を追加
var formdata = $(form).serializeArray(); formdata.push({param1: 'value1', param2: 'value2'}); $.ajax({ url: url, type:'POST', dataType: 'text', data : formdata, }).done(function(data) { /*成功時の処理*/ }).fail(function(XMLHttpRequest, textStatus, errorThrown) { /*失敗時の処理*/ })
.onイベントの使い方(動的に追加したものも判定
$(document).on('click', '#button', function(){ /*ここに処理記述*/ });
コンソールにログを出力
console.log('サンプル');
デバックダイアログを表示
alert('サンプル');
formのsubmitボタンを押したときにajaxでさらにPOSTしたときの動作について
WordPressのプラグインをカスタマイズすることがあり、
どうしてもフックができなくて致し方なく、submitボタンを押したときにajaxで追加でPOSTする処理を入れました。
しかし
PCだと正常に動作するのに、スマホだとエラー(undefinedエラー)になり更新されない現象が判明。
なので、一時的に非同期処理しないようにajax部分に「async:false」を追加すると反映されることが確認できました。
var formData = $('form').serialize(); $.ajax({ type: "POST", dataType:"text", url:"sample.php" data: formData, async: false, }).done(function(res){ }); });
似たようなサンプル作り、同じ現象になるか試したいと思います。
↓↓↓
プログラムのサンプルと結果を追記しました。
テスト結果「ダメなパターン」
index.php
<html> <head> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> </head> <body> <form method="POST"> <input type="text" name="txt" value=""> <input type="submit" id="testpost" value="POST実行"> </form> <script type="text/javascript"> $(document).ready(function(){ $(document).on('click', '#testpost', function(){ var formData = $('form').serialize(); $.ajax({ type: "POST", dataType:"text", url:"ajaxpost.php", data: formData }).done(function(res){ alert("ok"); }).fail(function(jqXHR, textStatus, errorThrown){ alert("ng"+jqXHR.status+':'+textStatus+':'+errorThrown); }); }); }); </script> </body> </html>
ajaxpost.php
※テストでファイル作成しただけなので、何も記述しなくても問題ないです。
ajaxpost
「async: false」をなしで、スマホでテストした結果「ng」のほうに飛んでしまいます。
「jqXHR.status」「textStatus」「errorThrown」でエラーを出力してみると、
jqXHR.status=0 textStatus=error errorThrown=
エラーの詳細が書かれてません。。。
似たようなエラーが出た場合は、「async: false」を追加、または、ajaxだけでPOSTする処理に変更したほうが良いかもしれません。
そもそも、2重POSTする時点でおかしいですが、似たようなエラーに遭遇された方に参考になれば嬉しいです。