読者です 読者をやめる 読者になる 読者になる

sidewalkcafe blog

日々是好日

BBQの代わりにプロキシチェック(PHP)

2chのBBQはゴタゴタがあった余波で外部参照ができなくなった。
便利だったのになあ・・・


使えなくなったのは仕方ないけど荒らしは待ってくれない
他のブラックリストを使って対処するしかない。
なのでそれに対応したコードを考えてみた。
(まあ、今までBBQだったアドレスを他のDNSBLのアドレスに変えれば良いだけなんだけどw)

<html>
<head>
  <title>DNSBLチェック</title>
</head>
<body>
  <form action="" method="get">
    テスト用IP<input type="text" value="" name="ip" /><br />
    <input type="text" value="" name="comment" />
    <input type="submit" value="コメント送信" />
  </form>
<?php
  $ip = '';

// IP取得
  if(isset($_GET['ip']) && $_GET['ip']!=null && filter_var($_GET['ip'],FILTER_VALIDATE_IP)){
    $ip=$_GET['ip'];
  }else{
    $ip = $_SERVER['REMOTE_ADDR'];
  }

// メインルーチン
  if(isset($_GET['comment']) && $_GET['comment']!=null){
    if(dnsbllookup($ip)){
      echo('ERROR! プロキシ経由のコメントは出来ません。<br>');
      echo('IP='.$ip);
      exit();
    }else{
      echo(htmlspecialchars($_GET['comment']).'<br>');
      echo('IP='.$ip);
      exit();
    }
  }

// DNSBLチェック
function dnsbllookup($ip){
  $dnsbl_lookup=array("all.rbl.jp",
    "bl.spamcop.net",
    "zen.spamhaus.org");
  if($ip){
    $reverse_ip=implode(".",array_reverse(explode(".",$ip)));
    foreach($dnsbl_lookup as $host){
      if(checkdnsrr($reverse_ip.".".$host.".","A")){
        return true;
      }
    }
  }
    return false;
  }
?>

$dnsbl_lookupに配列でDNSBLのアドレスを渡す。
有効なDNSBLDNSBL Lookupとかで探すと良い。
適当に使ってみたけど、抜けてるIPが多いので複数設定する必要がある様子。
とりあえず設定してある3つは2chで拾ってきたもの。

flipsnapで写真をランダム表示する

ネイティブJsでも使える

スマホでスワイプ操作が出来る便利で簡単なjQueryプラグイン「flipsnap」だけど
flipsnap.jsというのを書いた - Webtech Walker
jQuery必須ではなく、ソースはネイティブjsで書かれてたので普通のjavascriptで動いた(@version 0.6.2で動作確認)

そこから、ランダムに無限表示できるような実装を考えてた

DOM読み込み寺にflipnap適応

window.onloadではなくDOMContentLoadedを使ってます

window.addEventListener("DOMContentLoaded", function(){
  $flipsnap = Flipsnap("#demo");
}, false);

fstouchendイベントから現在地を取得

  $flipsnap.element.addEventListener('fstouchend', function(ev) {
    $newPT =ev.newPoint;
  }, false);
  • ボタン移動をする場合は、newPointの取得が出来ないので直接$newPTの値を加算・減算する

一番端に来た時に新しい写真を追加

  • 最大ブロック数の記録用変数($maxPT)を用意しておく
  • 現実的には通信ラグがあるので端から2〜3番目に来た時に追加読み込みするのが良いと思う
    if($newPT >= $maxPT){
      $maxPT ++ ;
      pushhtml();
    }

//写真追加
function pushhtml(){
  //データ(配列)の数を計算
  $dataleng = $photodata.length-1;
  //配列の中からランダムなidを取得
  $photoid = Math.round( Math.random()*$dataleng);
  //追加するPタグノードを作成
  var pNode = document.createElement('p');
  //imageオブジェクトを作成
  var image = new Image();
  //画像URLを指定
  image.src = $photodata[$photoid];
  //ノードに画像を追加
  pNode.appendChild(image);
  //親タグにノードを追加
  document.getElementById('demo').appendChild(pNode);
  //リフレッシュで全体の幅を再取得
  $flipsnap.refresh();
}
  • image.onloadで画像を読み込んでから配置する事も可能だけど、その場合はrefreshのタイミングも読み込み後に指定しないと、端まで移動ができなくなる


まあこんなもんかな

1つのフォームに複数のボタンを設置して別々の処理をさせる(PHP+javascript)

書物

1つのフォームの中に複数のsubmitボタンを設置して、それぞれ違う処理をさせるページを作ろうとしたけれどもけっこう難しかった

目的

jsonデータの内容を表示、編集をフォームで簡単にしたかった

内容

  • 4つのグループにそれぞれ3種類の入力フォームを設置(タイトル・文章・URL)
  • グループ毎に「編集」「削除」ボタンを設置
  • 4グループをまとめて「編集」するボタンを設置

グループ毎の入力フォーム

PHPで複数のボタンを配置したときの処理(forやwhileで設置した複数のボタンを判別)
を参考に
各入力フォームとsubmitのname属性を配列にすることで、それぞれのグループを作る

for($i = 0;$i < 4;$i++){
echo <<<__HTML__
グループ{$i}<br>
タイトル<input type="text" name="title[{$i}]" value=""><br>
文章<input type="text" name="text[{$i}]" value=""><br>
URL<input type="text" name="url[{$i}]" value=""><br>
<br>
<input type="submit" name="submit[{$i}]" value="編集"><br>
__HTML__;
}

あとはkey($_POST['submit'])でボタンの押されたグループを班別して対応する配列を取り出す

$group =key($_POST['submit']);
$title = $_POST['title'][$group];
$text = $_POST['text'][$group];
$url = $_POST['url'][$group];

ボタンの種類

FORMで送信ボタンと戻るボタンを2つつけてそれぞれ遷移先を変えたい - その他(プログラミング) - 教えて!goo
を参考に、「編集」「削除」ボタンを実装。ボタン内にonclick処理を追加する

function sendMode(data){
 document.getElementById("editmode").value=data;
}
//グループ毎に設置
<input type="submit" name="submit[{$i}]" value="編集" onclick="sendMode(1)"><br>
<input type="submit" name="submit[{$i}]" value="削除" onclick="sendMode(2)"><br>

//グループの外に1つだけ設置
<input type="hidden" id="editmode" name="editmode" value="0">

ボタンクリックでjavascriptを呼び出し、隠しフォームの値を書き換える
submitとonclickの実行タイミングがわからなかったけど、とりあえず動いてるから良しとするw


あとは受け取った$_POST["editmode"]の値によって処理を振り分ける

switch ($_POST["editmode"]) {
    case 0:
        //全体編集処理
        break;
    case 1:
        //グループ編集処理
        break;
    case 2:
        //グループ削除
        break;
}

う〜ん、submitのvalue内容で振り分けた方がスマートかな?

完成?

<?php
//postなら各種処理
if($_POST){

//分岐処理
switch ($_POST["editmode"]) {
    case 0:
        //全体編集処理
		echo("全グループを編集しました");
        break;
    case 1:
        //グループ編集処理
		$group =key($_POST['submit']);
		$title = $_POST['title'][$group];
		$text = $_POST['text'][$group];
		$url = $_POST['url'][$group];
		echo("グループ".$group."を編集しました<br>");
		echo("タイトル=".$title."<br>");
		echo("文章=".$text."<br>");
		echo("URL=".$url);
        break;
    case 2:
        //グループ削除
		$group =key($_POST['submit']);
		$_POST['title'][$group]="";
		$_POST['text'][$group]="";
		$_POST['url'][$group]="";
		echo("グループ".$group."を削除しました");
        break;
}

//保存処理  通常はcase毎に行う
$datasave = $_POST ;
}

//データ呼び出し処理
$output = $datasave ;

//html書き出し
?>
<html lang="ja-JP">
<head>
<meta charset="UTF-8" />
<script>
function sendMode(data){
 document.getElementById("editmode").value=data;
}
</script>
</head>
<body>
<h2>複数ボタンフォーム</h2>
<form method="post" action="">
<hr>
<?php
//グループ毎のフォーム書き出し
for($i = 0;$i < 4;$i++){
echo <<<__HTML__
グループ{$i}<br>
タイトル<input type="text" name="title[{$i}]" value="{$output['title'][$i]}"><br>
文章<input type="text" name="text[{$i}]" value="{$output['text'][$i]}"><br>
URL<input type="text" name="url[{$i}]" value="{$output['url'][$i]}"><br>
<br>
<input type="submit" name="submit[{$i}]" value="編集" onclick="sendMode(1)"><br>
<input type="submit" name="submit[{$i}]" value="削除" onclick="sendMode(2)"><br>
<hr>
__HTML__;
}

//全体編集・隠しフォーム・フッタ
?>
<input type="hidden" id="editmode" name="editmode" value="0"> 
<input type="submit" name="submit" value="全体編集"><br>
<hr>
</form>
</body>
</html>
  • 削除処理は保存内容を呼び出しunset()を使う
  • 保存はcase毎に処理を分ける

今年もお世話になりました(年賀状の賀詞)

日記

年賀状の季節です〜(古い)


という訳で、そないな訳で・・・
今年も年賀状書かなく茶と思って賀詞を調べたんだけど
色々更新箇所があったので前の記事を追加修正

年賀状の賀詞 - sidewalkcafe blog
全部76種類!(四文字の賀詞のみ)
毎年違う賀詞を使ってもほぼ一生いける!w

追加分

賀詞 読み 意味
生龍活虎 うりゅうかつこ 生気に満ち活気にあふれていること。
鶴寿千歳 かくじゅせんざい 千年生きる鶴のように長生きをする。
佳景瑩春 かけいえいしゅん うつくしくあざやかな春の風景
熈光豊楽 きこうほうらく 光のひろまりはゆたかにうきうきさせる。
熈祥煌春 きしょうこうしゅん きらきら光る春を大いによろこぶ。
気新光照 きしんこうしょう 春には大気も新しくなり日光も明るさを増す。
慶賀光春 けいがこうしゅん かがやく春をよろこびいわう。
慶祥麗春 けいしょうれいしゅん うるわしい春を大いによろこぶ。
光風動春 こうふうどうしゅん 光と風が、春を運んでくる。
寿祥佳春 じゅしょうかしゅん うつくしい春をことほぎよろこぶ。
春風発物 しゅんぷうはつぶつ 春の穏やかで暖かい風が、この世のすべての物を成長させる。
春和景明 しゅんわけいめい 春は気候が和らぎ景色も明るい。
頌佳青陽 しょうかせいよう よき春の光り(初春)をたたえる。
新春僥嬉 しんしゅんぎょうき 新しき春、このさいわいをたのしむ。
人和年豊 じんわねんぽう 平和で豊年。
瑞祥芳楽 ずいしょうほうらく かんばしい音色に大いによろこぶ。
瑞色含春 ずいしょくがんしゅん めでたい兆しが春の気配を含んでいる。
草木萌動 そうもくほうどう 草や木が芽生え始める。
鳥歌花舞 ちょうかかぶ 鳥鳴き花咲く春の形容にいう。美しい春の情。
年豊人楽 ねんぽうじんらく みのりが豊かで人々が楽しむ。
萬古清風 ばんこせいふう 大昔から変わることのない清らかな風格。
萬物光輝 ばんぶつこうき 春の訪れとともにあらゆるものが生き生きとする。すべてのものが輝く。
芳春凱喜 ほうしゅんがいき 芳しい春を迎え、心もやわらぎよろこぶ
鳳鳴朝陽 ほうめいちょうよう 元旦に鳳凰が朝日に向かって鳴くとその年は縁起がよいとされている。
陽光彩雲 ようこうさいうん 吉兆の日の光。
龍騰虎躍 りゅうとうこやく 龍が飛び立ち、虎が躍り上がる。沸きかえるような活気に満ちていること。
龍騰鳳鳴 りゅうとうほうめい 龍騰虎躍に同じ。
龍飛鳳舞 りゅうひほうぶ 龍が飛び鳳が舞う。
龍鳳呈祥 りゅうほうていしょう 龍や鳳はめでたいことの象徴。ということから、おめでたいを表現。
麟鳳亀龍 りんほうきりゅう 想像上の動物で、太平の世に出現するというめでたいもの。
麗煌韶春 れいこうしょうしゅん うつくしくかがやくうららかな春
麗春澄陽 れいしゅんちょうよう うるわしい春にすんだ日の光

修正分

熈祥煌春 きしょうこうしゅん よみがなの修正(きょうしょう→きしょう)
敬寿歳旦 けいじゅさいたん よみがなの修正(けんじゅ→けいじゅ)
新春万福 しんしゅんばんぷく 新春萬福に同じなので削除統合
長樂萬年 ちょうらくばんねん ちょうらくまんねんと同じなので削除統合

たった4行でTwitterのユーザー情報を取得する(PHP+TwitterOAuth)

書物

TwitterOAuthでログイン機能を実装したのだけれど
ユーザー情報取得で手間取ったのでメモ
<参考>
PHP - TwitterOAuthの正しい使い方 - Qiita


リンク先にあるように

$TwitterOAuth->OAuthRequest("http://api.twitter.com/1.1/statuses/update.json","POST",array("status"=>$tweet));

という記載は長いしややこしいので以下の通りに直したのだけれど

<?php
require_once('path/to/twitteroauth.php'); // TwitterOAuth
$TwitterOAuth = new TwitterOAuth('コンシューマキー', 'コンシューマシークレット', 'アクセストークン', 'アクセスシークレット');
$userinfo = $TwitterOAuth->get('users/show', ['id'=> 'ユーザid(数字)']); // ユーザidでユーザ情報を取得
var_dump($userinfo);
?>

エラーが出た

Parse error: syntax error, unexpected '[' in xx行

'['(角括弧、スクエアブラケット)は使えませんだって・・・


色々調べて、どうやら連想配列で渡せば良いとわかったので以下のように修正

$userinfo = $TwitterOAuth->get('users/show', array('id'=> 'ユーザid(数字)'));

無事動きましたとさ

その他

TwitterOAuthから取って来たデータはオブジェクト型になってるので、そのまま連想配列で取り出す事ができない。

echo($userinfo['name']);

とすると

Fatal error: Cannot use object of type stdClass as array

怒られた^^;


連想配列に変換する方法もあるけど、そのまま抜き出す事も可能

echo($userinfo->name);

これでOK
え、基本だって?
知らなかった^^;


多重になってる所は連続して記載すればいける

echo($userinfo->entities->url->urls[0]->expanded_url);

なんで途中で配列になってるの?w


[AD]

ドスパラが運営する新情報サイト【ものテク】毎日更新!

Windows上ではflockの挙動が違う(PHP)

書物

WindowsローカルにXAMPPを入れてテストしていたのだれども
flockで上手くいかなかったのでメモ

LOCK_NBが使えない

PHPmanualには

PHP: flock - Manual

<引用>
operation は以下のいずれかとなります。

共有ロック(読み手)とするには LOCK_SH をセットします。
排他的ロック(書き手)とするには LOCK_EX をセットします。
(共有または排他的)ロックを開放するには LOCK_UN をセットします。

上の操作のいずれかに LOCK_NB をビットマスクとして追加すれば、 ロック中に flock() でブロックを行わないことができます (Windows ではサポートされていません)。

とあり、windowsではサポートされてないと書いてある。
けど、これだけじゃなかった・・・

LOCK_EXでfile()やfile_get_contentsが使えなくなる

自分で排他的ロック(LOCK_EX)したファイルにfile()やfile_get_contentsでアクセスできない
読み込んだ場合、空白を返してくる


これに気付かず、テストではまっちゃったよ・・・^^;


ロックしたファイルの読み込みはfgetsを使いなさいって事なのなか?

その他

PHP5.3.2以降は、fclose()でロックを自動的に解除する機能がなくなった。

PHP: flock - Manual

<引用>
バージョン 説明
5.3.2 ファイルのリソースハンドルを閉じたときにロックを自動的に解放する機能が削除されました。 ロックの解放は、常に手動で行わなければなりません。

その為、LOCK_UNで明示的に解除する必要がある
・・・のだけれど、注意事項が^^;


PHP5.3.2以降ではfcloseで自動的にアンロックされない - 徳丸浩のtumblr

<以下引用>

ロックした状態でファイルに書き込みをしたい場合、アンロックしてからfcloseするまでの間に、バッファに残っていたデータが *ロックされない状態で* ファイルに書き込まれる可能性があるからです。したがって、アンロックの前に、明示的にfflushを呼び出してバッファの内容をはき出すようにすべきです。

との事。
なのでファイルを閉じるときは

fflush($fp);           // バッファを吐き出す
flock($fp, LOCK_UN);   // ロックを解除
fclose($fp);           // ファイルを閉じる

という記載が必要


[AD]
企業サイトや人気サイトの運用実績多数!月額1,000円(税抜)~の高スペックレンタルサーバーヘテムル

適当に

新聞

弱い人につけ込む詐欺


#がんビジネス 事故情報をお寄せください - Togetterまとめ
気をつけよう甘い言葉と暗い罠

妖怪ウォッチと教育


『妖怪ウォッチ』が子供社会を救う? ~ 問題の可視化、許しと共存 ~ - Togetterまとめ
問題と人格を切り離して考えるのは議論でも重要だよね

まだやってるんだ・・・


【食品】銀座ウエストさんの判断。応援の声とその他の声。 - Togetterまとめ
安全性が確認されたものを批判するのは科学的じゃない

反原発ビジネス


【なぞなぞ】パンはパンでも食べられないパンは? - Togetterまとめ
付加価値をつけて高く売るのは商売として良いんだけど
基本的な科学力もなく、弱者を痛めつけるような言論は支持しない

デング熱のこと


デング熱も怖いけどこんなデマが拡がるのも怖い。去年のデング熱の国内での感染者数はゼロだよ!
去年までの感染は海外からの持ち込みだったんですね

オタクを放送禁止用語


アニメ規制派は根拠なく感情論...TVタックル問題回を検証する | ニコニコニュース
確かに公然と人格批判されてるので、障害者批判と同じく禁止にすべきですね

日本人的本音と建前をわからないロシア外交官


ロシア大使館「米国が落とした原爆の慰霊祭に参加しました」→非難殺到 - Togetterまとめ
確かに広島の慰霊行事は内向きでアメリカ批判はしないけど
ちゃんと誰がやったかは分かってやってる
アメリカ統治時代はGHQ批判が禁止(言論弾圧です)だったので
その習慣が残ってるのかもしれないね

さすがユダヤ


ほお

南京と慰安婦論争について


ジョンお姉さん慰安婦論争と南京論争を語る - Togetterまとめ
感情的にならず資料にあたって客観的に評価すべきですね
だから慰安婦は人権問題と言うのではなくて
強制連行があったかどうかの評価をきっちりすべき

ゲーム教育


漫画だってゲームだって教育に役立つという例

まだ分かってない人達


福島の人に叱られるマトモに言い返せない元反原発連合"ペケ"と"のま" - Togetterまとめ
実際に差別を受けてる福島県人に対して「お前はわかってない」とのたまう、本当に分かってない人達

福島県産を使っています


安全が確認された福島産原乳のバターは使用します、と宣言した銀座ウエストさんを攻撃するベクレルフリー系の人々の様子と、その解説。 - Togetterまとめ
本当はこういう事を言わなきゃいけないという事が異常なんだけどね
でも、売上が上がってるみたいだから大多数の人は分かってるんだねえ

がんの免疫抗体


がん退治する抗体発見 血液中から岡山大 - 47NEWS(よんななニュース)
人間の免疫は全ての病気に対応できるようになってるって言うけど
がんも例外ではないんだね
このままがんも完治できるようになれば良いんだけどねえ・・・