忍者ブログ

開発者ブログ

忍者ブログの元開発者が送る愛と感動と涙のスペクタクル。プログラムの開発日誌やタダの日記です。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

PHPで日本の祝日判定処理

来年久しぶりに国民の祝日があるらしいので、需要あるかな?と思ってソースを置いておきます。
ご自由にお使いください

2008年以降の日本の祝日の判定です。
2016年から始まる山の日も含まれています。
(今年から祝日が増えるのか!!!と思ってwktkした祝日です。がっかりしました)

2007年以前の過去で使用したい場合は5/4の扱いが変わるのでちょっと書き換える必要があります。

未来については祝日が増えるまでは変えなくて良いはず。
※mktimeを使っているので、環境によっては2038年までしか使えないかもしれません。

・祝日が増える/減る
・地球の自転がおかしくなる

などがあると修正が必要になります。


http://blog.cnobi.jp/v1/blog/user/b4abf043f09bcf5320cb1f40ab915475/1410183680


/*
* ZendX_Date_Holiday
*
* 2007年以降の日本の祝日を判定します
*
* 2006年より過去に遡った調査をする場合は要調整(5/4が国民の休日になる)
* wikipedia(http://ja.wikipedia.org/wiki/国民の祝日)とかで確認して$ddやkokumin()、spring()、autumn()辺りを調整してください
*
* @cateogry ZendX
* @package ZendX_Date
* @author misney <mizuno@ninja.co.jp>
*/
class ZendX_Date_Holiday {

/**
* 平日かな?
*
* @return boolean
*/
public static function isWeekday($y, $m, $d) {
if (self::isHoliday($y, $m, $d)) {
return false;
} else {
return true;
}
}

/**
* 祝日かな?
*
* @return boolean
*/
public static function isHoliday($y, $m, $d) {
$t = mktime(0,0,0,$m,$d,$y);
$w = date("w", $t);
$wc = intval($d / 7) + 1;

//祝日定義
$dd = array(
1=>array(1=>true, 'function'=>array('monday2')),
2=>array(11=>true),
3=>array('function'=>array('spring')),
4=>array(29=>true),
5=>array(3=>true, 4=>true, 5=>true),
7=>array('function'=>array('monday3')),
9=>array('function'=>array('autumn', 'monday3', 'kokumin')),
10=>array('function'=>array('monday2')),
11=>array(3=>true, 23=>true),
12=>array(23=>true),
);

//山の日は2016年から
if ($y >= 2016) {
$dd[8] = array(11=>true);
}

if (!empty($dd[$m][$d])) {//決められた祝日
return true;
}

//ハッピーマンデイや春秋分、国民の休日がある月は関数処理
if(!empty($dd[$m]['function'])) {
foreach ($dd[$m]['function'] as $func) {
if (self::$func($y, $m, $d, $w, $wc, $t)) {
return true;
}
}
}

//水曜日までは振替休日をチェック。
if ($w < 4) {
$_w = $w;
$_y = $y;
$_m = $m;
$_d = $d;
while($_w > 0) {
//1日の場合は前月末日を作成する
if ($d == 1) {
$t = $t - 86400;
$_y = date("Y", $t);
$_m = date("m", $t);
$_d = date("d", $t);
} else {
$_y = $_y;
$_m = $_m;
$_d = $_d - 1;
}

if (self::isHoliday($_y, $_m, $_d)) {
$_w--;
if ($_w == 0) {
return true;
}
} else {
break;
}
}
}
return false;
}

/**
* ハッピーマンデーかな?(第2月曜日)
*
* @return boolean
*/
private static function monday2($y, $m, $d, $w, $wc, $t) {
if ($w == 1 && $wc == 2) {
return true;
}
return false;
}

/**
* ハッピーマンデーかな?(第3月曜日)
*
* @return boolean
*/
private static function monday3($y, $m, $d, $w, $wc, $t) {
if ($w == 1 && $wc == 3) {
return true;
}
return false;
}

/**
* 春分の日かな?
*
* 前年2月の最初の平日に制定されるらしい。(官報に掲載される暦要項)
* 地球の運行状態が変化した場合などに変更される可能性はあるらしい(過去には無い)
*
* @return boolean
*/
private static function spring($y, $m, $d, $w, $wc, $t) {
$p = $y % 4;
switch($p) {
case '1':
$_d = '20';
break;
case '2':
if ($y < 2023) {
$_d = '21';
} else {
$_d = '20';
}
break;
case '3':
if ($y < 2056) {
$_d = '21';
} else {
$_d = '20';
}
break;
default:
if ($y < 2089) {
$_d = '20';
} else {
$_d = '19';
}
break;
}
if ($d == $_d) {
return true;
}
return false;
}


/**
* 秋分の日かな?
*
* 前年2月の最初の平日に制定されるらしい。(官報に掲載される暦要項)
* 地球の運行状態が変化した場合などに変更される可能性はあるらしい(過去には無い)
*
* @return boolean
*/
private static function autumn($y, $m, $d, $w, $wc, $t) {
$p = $y % 4;

switch($p) {
case '1':
if ($y < 2042) {
$_d = '23';
} else {
$_d = '22';
}
break;
case '2':
if ($y < 2075) {
$_d = '23';
} else {
$_d = '22';
}
break;
case '3':
$_d = '23';
break;
default:
if ($y < 2009) {
$_d = '23';
} else {
$_d = '22';
}
break;
}

if ($d == $_d) {
return true;
}
return false;
}

/**
* 国民の休日かな?
*
* 祝日と祝日に挟まれた日は祝日というオセロのような祝日。
* 2013年現在は9月21日or22日の火曜日にしか発生しない。
*
* @return boolean
*/
private static function kokumin($y, $m, $d, $w, $wc, $t) {
if (($d == 21 || $d == 22) && $w == 2) {
if (self::isHoliday($y, $m, $d-1, $w-1, $wc, $t) && self::isHoliday($y, $m, $d+1, $w+1, $wc, $t)) {
return true;
}
}
return false;
}

}

拍手[0回]

PR

Shinobiライティング GWキャンペーン



GW限定のキャンペーンが5月1日から始まりました。
初日はとても盛況だったようで、30,000文字オーバーの方が数名おりました。
(普段は3万超えると1位になることがほとんど。)

今回のキャンペーンは「投稿文字数によるデイリーランキング」です。
毎日AM0時~23時59分59秒までの投稿でランキングを行い、毎日1位~20位の方にポイントをプレゼントする企画です。
無理のない範囲でご参加いただければ幸いです。

拍手[1回]

Shinobiライティングにおける記事のチェック

こんばんは。misneyです。
先日お陰様で40歳になりました。
misneyは近頃、40歳男性として一人称をmisneyとするのは如何なものだろうと考えてみたりみなかったりしております。

本日は私が従事しているShinobiライティングにおける記事のチェックに関する記事を書こうと思います。

記事チェッカーの話

3月中旬~つい先日まで、投稿フォームに「記事チェッカー」というものを導入していました。
作成いただいた記事を投稿する前に「承認に関するチェック」と「誤字脱字のチェック」の2種類のチェックを行うものです。

記事チェッカーには3種類の目的がございます。

1.ライター様の承認率の向上
2.クライアント様への記事品質の向上
3.承認率向上によるオペレーターのリソース削減

記事チェッカーを導入した結果、評判は上々(私調べ)だったのですが、想定よりも効果が無かった点、近日中により高度な構文チェックを近日中に導入する予定がございまして、一時的に「承認に関するチェック」を外させていただきました。

より高度な構文チェックの導入がある程度進みましたら、また承認に関するチェックを導入したいと考えています。

高度な構文チェックの話

記事チェック導入後、個人的には初めて投稿された記事をじっくりと拝見しました。
残念ながら承認されなかった記事を拝見すると、稚拙な文章が多く見受けられました。
記事チェッカーの目的で書いた2の部分を疎かにすることは出来ません。
ライター様には大変申し訳ない気持ちではあるのですが、稚拙な文章というものは非承認とさせていただいております。

この稚拙な文章とはなんぞや?となり、調べてみました。
下記のような文章の場合、意味が解らない文章や稚拙な文章に見えてしまうようです。

1.漢字を使わない
2.主語、述語の関係性が無い
3.助詞の連続使用
4.ら抜き・さ入れ表現
5.誤字脱字
6.表記ゆれ
7.修飾語・修飾節の乱用
8.接続詞の乱用
9.同一文末表現の多用
10. 文体(ですます調等)の揺れ

弊社には存在しないチェック項目もありまして、このような構文チェックのフィルターを追加していこうと考えております。

導入予定は数週間~数カ月後です。
もしライター様がこちらの記事を見られましたら、是非上記のような点にお気をつけいただければと思います。


拍手[0回]

Wordpressのブルートフォース攻撃(不正ログイン)について

今日、Wordpressで不正ログインが!なニュースを良く見かけました。

私は仕事柄数千のWordpressを扱っているので良く攻撃が来ております。(幸いにも不正ログイン成功はありません)
最近攻撃のログを取っていたので攻撃の傾向を書いておきます。

使用するログデータの取得期間は2013/08/20~2013/08/29です。
期間中の攻撃確認数は413,467件。


攻撃者の特徴

特徴は3種類くらいあります。(恐らく別人。)

1.ユーザー名adminかAdministratorでくるタイプ
2.ユーザー名をドメイン名に指定して来るタイプ
3.ユーザー名を取得して(/?author=1とかで)来るタイプ

使用されるアカウント

アタックで良く見かけるアカウントの情報です。
Wordpressのログインアカウントに以下を使用していると危険です。気をつけましょう。

使用されたアカウント名攻撃回数
admin216,003
host名115,363
administrator72450
Admin5,006
ニックネーム3,941
※Host名は例えば shinobi.jp であれば shinobiをアカウントとして使ってきます
※ニックネームはちゃんと変えてないとアカウントと同じになってしまってる場合あり。
※第6位は root で54件でした。以下極端に減ります。


日付別攻撃回数

攻撃数です。
昨日今日のことが取り上げられてましたが、私のところは逆に減少傾向かも?
土日は休んでるみたいです。

2013/8/20117,861
2013/8/21104,085
2013/8/2265,336
2013/8/233,634
2013/8/245,277
2013/8/251,597
2013/8/261,052
2013/8/2732,025
2013/8/2834,274
2013/8/2948,326
使用されるパスワード

使用されたパスワードは約4,500種類ありました。
テキストファイルに纏めましたので、不安な方は使用しているパスワードが該当しないか調べてみてください。

使用されてるパスワード.txt


Wordpressはログインを許してしまうとPHPの設置が出来てしまうため、かなり大きな被害が出ます。
共有のCMSサービスに限らず、全てのWordpressに危険が色々存在しますので再度確認した方が良いかも知れません。


拍手[1回]

nutch2.0を触ってみる 第1回「インストール編」

こんにちは。misneyです。

今日はnutch2.0が出たということで、少し触ってみました。

nutchというのは簡単に言うと、検索エンジンを作れるオープンソース。
GoogleやYahooのような本格的な検索エンジンが作れてしまうのです。

今回は検索エンジンを作るというよりも、被リンク網を作成することが主目的です。
link:が使えなくなって久しいですよね・・・w

では、さっそくnutch2.0をインストールしてみます。
nutch2.0のチュートリアルページを見ながら進めてみます。
※ちなみにCentOSを使ってます。

nutch2.0を使うために以下が必要になるそう。

1. JDK
2. Apache Ant
3. Apache Maven
4. Apache Gora
5. Apache HBase

■JDK インストール

# wget http://download.oracle.com/otn-pub/java/jdk/6u33-b03/jdk-6u33-linux-x64.bin
# chmod a+x jdk-6u33-linux-x64.bin
# ./jdk-6u33-linux-x64.bin
# vi /etc/profile
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
# source /etc/profile


■Apache HBaseインストール + 実行

# cd /etc/yum.repos.d/
# wget http://archive.cloudera.com/redhat/cdh/cloudera-cdh3.repo
# yum install hadoop-hbase hadoop-hbase-master hadoop-0.20-namenode hadoop-0.20-jobtracker hadoop-0.20-secondarynamenode hadoop-0.20-tasktracker hadoop-zookeeper
# vi /etc/hbase/conf/hbase-evn.sh #以下の行のコメントアウトを外す
export HBASE_MANAGES_ZK=true
# vi /etc/hbase/conf/hbase-site.xml #<configuration>の中に以下を追加
<property>
<name>hbase.zookeeper.quorum</name>
<value>127.0.0.1</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.property.maxClientCnxns</name>
<value>200</value>
</property>
# service hadoop-0.20-datanode start
# service hadoop-0.20-jobtracker start
# service hadoop-0.20-namenode start
# service hadoop-0.20-secondarynamenode start
# service hadoop-0.20-tasktracker start
# service hadoop-hbase-master start


■Apache Mavenインストール

# wget ftp://ftp.riken.jp/net/apache/maven/binaries/apache-maven-3.0.4-bin.tar.gz
# tar zxf ./apache-maven-3.0.4-bin.tar.gz
# mv /usr/local/src/apache-maven-3.0.4 /usr/share/maven
# vi /etc/profile
export M2_HOME=/usr/share/maven
export M2=$M2_HOME/bin
export PATH=$PATH:$M2
# source /etc/profile


■Apache Gora インストール

# wget ftp://ftp.meisei-u.ac.jp/mirror/apache/dist/gora/gora-0.2-src.tar.gz
# tar zxvf ./gora-0.2-src.tar.gz
# cd ./apache-gora-0.2/
# mvn clean compile


■Apache Antインストール

# cd /usr/local/src
# wget http://ftp.riken.jp/net/apache//ant/binaries/apache-ant-1.8.4-bin.tar.gz
# tar zxf ./apache-ant-1.8.4-bin.tar.gz
# cp -R /usr/local/src/apache-ant-1.8.4 /usr/share/ant
# vi /etc/profile
export ANT_HOME=/usr/share/ant
export PATH=$PATH:$ANT_HOME/bin


■nutch2.0 インストール

# cd /usr/local/src
# mkdir ./nutch2.0
# cd ./nutch2.0
# wget ftp://ftp.riken.jp/net/apache/nutch/2.0/apache-nutch-2.0-src.tar.gz
# tar zxvf ./apache-nutch-2.0-src.tar.gz
# vi conf/nutch-site.xml #<configuration></configuration>の中に以下を追加
<property>
<name>storage.data.store.class</name>
<value>org.apache.gora.hbase.store.HBaseStore</value>
<property>
<property>
<name>http.agent.name</name>
<value>nutch2.0</value>
</property>
# vi ivy/ivy.xml #108行目付近にある下記の記述のコメントアウトを外す
<dependency org="org.apache.gora" name="gora-hbase" rev="0.2" conf="*->default" />
#vi conf/gora.properties
gora.datastore.default=org.apache.gora.hbase.store.HBaseStore
# ant

BUILD SUCCESSFUL
Total time: 3 minutes 33 seconds



ふう。インストールだけでおなかいっぱい。
他にもSolrやらなんやら使えるみたいですが、まずはチュートリアル通りにそろえてみました。

正常にインストール出来れば以下のように表示されます。


# cd /usr/local/src/nutch2.0
# ./runtime/deploy/bin/nutch
Usage: nutch COMMAND
where COMMAND is one of:
inject inject new urls into the database
hostinject creates or updates an existing host table from a text file
generate generate new segments to fetch from crawl db
fetch fetch URLs marked during generate
parse parse URLs marked during fetch
updatedb update web table after parsing
updatehostdb update host table after parsing
readdb read/dump records from page database
readhostdb display entries from the hostDB
solrindex run the solr indexer on parsed segments and linkdb
solrdedup remove duplicates from solr
parsechecker check the parser for a given url
plugin load a plugin and run one of its classes main()
junit runs the given JUnit test
or
CLASSNAME run the class named CLASSNAME
Most commands print help when invoked w/o parameters.


拍手[0回]

画像RSS

おまとめボタン

忍者カウンター

忍者ビジター

忍者アド

ブログ内検索

最新コメント

プロフィール

HN:
mizuno
HP:
性別:
男性
職業:
主に侍などを少々
趣味:
競馬
自己紹介:
母子手帳の仮死と書かれてる場所に丸されてます。

フリーエリア

忍者ツールズプロフィール

忍者ツールズプロフィールは終了しました