クラウドサーバを GMO クラウドから Amazon Web Service の EC2 に移行するに当たって、今までの RSS クローラを修正。
正直ものすごい修正した。
Twitter API で特定のアカウントのツイートを取得する方法、修正版
「Twitter API で特定のアカウントのツイートを取得する方法」ですが、タイムアウトして情報が取れないことがあり、その辺りを改良しました。
<?php require_once 'TwistOAuth.phar'; $consumer_key = '{your-consumer-key}'; $consumer_secret = '{your-consumer-secret}'; $access_token = '{your-access-token}'; $access_token_secret = '{your-access-token-secret}'; $connection = new TwistOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret); $count = 3; $max_length = 25; function get_tweet($screen_name){ global $connection, $count, $max_length; $ret = ""; // connect try{ $user = $connection->get('statuses/user_timeline', array('screen_name' => $screen_name, 'count' => $count, 'exclude_replies' => 'false', 'include_rts' => 'false',) ); } catch (TwistException $e) { fputs(STDERR, "Error : $screen_name , " . date("Y/m/d H:i:s") . "\n"); $text = '<h4><a href = "https://twitter.com/@' . $screen_name . '">@' . $screen_name . '</a></h4>'; $text .= '<ul class = "tweet"><li>取得失敗</li></ul>' . "\n"; return $text; } // get user names. $screen_name = htmlspecialchars($user[0]->user->screen_name, ENT_QUOTES, 'UTF-8', false); $names = "<h4>" . htmlspecialchars($user[0]->user->name, ENT_QUOTES, 'UTF-8', false) . ' <a href = "https://twitter.com/@' . $screen_name . '">@' . $screen_name . "</a></h4>\n"; $ret .= $names; $ret .= '<ul class = "tweet">'; // get tweets. foreach ($user as $value){ $screen_name = htmlspecialchars($value->user->screen_name, ENT_QUOTES, 'UTF-8', false); $post_date_utc = htmlspecialchars($value->created_at, ENT_QUOTES, 'UTF-8', false); $post_date = timezone_change_ja($post_date_utc); $text = htmlspecialchars(mb_substr($value->text, 0, $max_length, 'UTF-8'), ENT_QUOTES, 'UTF-8', false); $link = '<a href = "https://twitter.com/' . $screen_name . '/status/' . $value->id_str . '">'; $ret .= "<li>" . $post_date . " " . $link . $text . "</a></li>\n"; } $ret .= "</ul>\n"; return $ret; } /* Twitterからのタイムゾーンを日本時間(東京)に変換するq $time = timezone_change('Tue Jul 12 06:27:46 +0000 2011'); echo $time{"tm_year"}; */ function timezone_change_ja($timezone = null){ $year = $month = $day = $hour = $minute = $second = null; if(!empty($timezone)){ $date_arr = explode(" ", $timezone); $year = intval($date_arr[5]); if($date_arr[1] == "Jan"){ $month = 1; }else if($date_arr[1] == "Feb"){ $month = 2; }else if($date_arr[1] == "Mar"){ $month = 3; }else if($date_arr[1] == "Apr"){ $month = 4; }else if($date_arr[1] == "May"){ $month = 5; }else if($date_arr[1] == "Jun"){ $month = 6; }else if($date_arr[1] == "Jul"){ $month = 7; }else if($date_arr[1] == "Aug"){ $month = 8; }else if($date_arr[1] == "Sep"){ $month = 9; }else if($date_arr[1] == "Oct"){ $month = 10; }else if($date_arr[1] == "Nov"){ $month = 11; }else if($date_arr[1] == "Dec"){ $month = 12; } $day = intval(sprintf("%d", $date_arr[2])); $arr = explode(":", $date_arr[3]); $hour = intval(sprintf("%d", $arr[0])); $minute = intval(sprintf("%d", $arr[1])); $second = intval(sprintf("%d", $arr[2])); $time = mktime($hour, $minute, $second, $month, $day, $year); $time = $time + 60 * 60 * 9; # 9時間進める //$date = localtime($time, true); return date("Y-m-d H:i", $time); //return $date; }else{ return false; } } ?>
取得失敗の例外発生時に、スクリーンネームと「取得失敗」を戻り値にして返して、標準エラー出力にエラー内容を出力するようにしました。
このため PHP の実行文も変わります。
エラー内容を itawoerror.log に追記していきます。
php ./itawotweet/itwt_cjpn.php > ./www/itawotweet/itwt_cjpn.html 2>> itawoerror.log
ログは定期的に自分のメールアドレスに送るようにシェルスクリプトを書きました。
#!/bin/sh if [ -s ./itawoerror.log ]; then cat -v ./itawoerror.log | mail -s "itawotweet error log" {your-mail-address} rm -f itawoerror.log fi
これを cron に登録します。
AWS の CloudFront で WordPress を稼働してて、かつ ec2 間に SSL 通信をしている場合
Twitter API で特定のアカウントのツイートを取得する方法
Twitter API を使って、特定の(指定した)アカウントのツイートを取得する方法です。
作ってみたのが以下のサイトです。
https://www.bass-world.net/itawotweet/
https://developer.twitter.com/en.html からAPI キーを取得する
https://developer.twitter.com/en.html からアクセスして、
- consumer_key
- consumer_secret
- access_token
- access_token_secret
を取得します。どんなアプリを作るのか、英作文しないといけないけどがんばって!
TwistOAuth の取得
https://github.com/mpyw/TwistOAuth から TwistOAuth を入手します。
TwistOAuth.phar を今から作るプログラムと同階層においてください。
[Perl][Javascript]ファイルをドラッグ&ドロップでサーバにアップロードする
ファイルをドラッグ&ドロップしてサーバにアップロードする方法がやっとわかりました。
肝は以下のところです。
function uploadFile(file){ var formData = new FormData(); formData.append('file', file); $.ajax({ async: true, type: 'POST', contentType: false, processData: false, url: 'dndtest.cgi', data: formData, dataType :'html' }).done(function(){});
ファイルをドラッグ&ドロップしてファイル名などを取得する方法は結構ネットにあがっていますけど、実際にそのファイルをサーバにアップロードする方法を解説するサイトがなく、苦労しました。
- FormDataを使う。
- ajaxでPOSTする。
ファイルをアップロードする箇所は以下の通りです。
my $q = new CGI; my @fps = $q->upload('file'); my @fnames = $q->param('file'); my $idx = 0; foreach my $fname(@fnames){ $fname = basename($fname); copy($fps[$idx], "./test/$fname"); $idx++; }
$q->upload()を使うということになかなか気づきませんでした。
以下がソースです。複数ファイルのドラッグ&ドロップにも対応しています。
“[Perl][Javascript]ファイルをドラッグ&ドロップでサーバにアップロードする” の続きを読む
2018年版 ウェブサイトを30分でレスポンシブ(スマホ対応)に90%実装する方法
手軽にウェブサイトをレスポンシブウェブデザイン(iPhoneなどのスマホに対応)にする方法です。
右側にメインコンテンツ部、左側にサイドメニューがある一般的なデザインで、スマホで見るとサイドメニューをメインコンテンツの下に表示するようにします。
スマホの判別は
@media screen and (max-width: 48em),screen and (max-device-width:480px)
でやります。
ホントは画面サイズによっていろんな要素の最大幅・最小幅を設定した方がいいのですが、とりあえずこれで80%対応できます。
凝りだすとたいへんなんですよね~。だから費用対効果のいいところでやめます。(笑)
“2018年版 ウェブサイトを30分でレスポンシブ(スマホ対応)に90%実装する方法” の続きを読む
Apacheウェブサーバで画像ファイル等をブラウザにキャッシュさせる
ブラウザのキャッシュを活用する
Google アナリティクスのレポート→行動→サイトの速度→速度の提案で、
ブラウザのキャッシュを活用する
静的リソースの HTTP ヘッダー内で、有効期日や最大経過時間を設定すると、ブラウザがネットワークからではなくローカル ディスクから以前にダウンロードしたリソースを読み込むようになります。
次のキャッシュ可能なリソースでブラウザのキャッシュを活用してください:
で、どうすればキャッシュさせるか調べてみました。
“Apacheウェブサーバで画像ファイル等をブラウザにキャッシュさせる” の続きを読むGoogle アナリティクスで画像を最適化する
今回のエントリは次のの前振りです。
Google アナリティクスでウェブサイトの画像を最適化(圧縮)できるのをご存知でしょうか?
レポート→行動→サイトの速度→速度の提案
にあります。
SiteLockがいい感じ
脆弱性診断&マルウェア駆除のWebセキュリティサービス「SiteLock」 がいい感じです。
チェックするのが面倒臭いXSS脆弱性や、数多く見つかるソフトウェアの脆弱性の中からどれが自分に関係のある脆弱性か、診断してくれるのがいい。
書籍やネットで調べた情報を元に、気を付けてアプリケーション作っても、脆弱性が全て駆除できたとは言えない。
実際、自分で作ったSHA暗号化ツールが、最初はGoogleの1ページ目に載っていたのに、ちょっと機能を追加したらGoogleで検索されなくなった。
なんでだろうと思っていて、たまたまGMOクラウドのSiteLockの宣伝があって、試しに導入してみたら、XSS脆弱性があるとの診断。
それに倣ってツールを修正したら、またGoogleの1ページ目に載るようになりました。
SHA-1/SHA-256/SHA-512暗号化ツール作成
改修を頼まれた仕事で、ユーザIDとパスワードがソースに直書きだったので、暗号化して持つことに。
ところが暗号化できるサイトがなかなか見つからなかったので、自分で作りました。
はじめは Digest.pm を use すればいいんだろ、と思ってましたが、GMOクラウドには Digest.pm が入ってなかった。
ていうか、CPAN 自体も入ってなかった。
コーディングよりも環境整備に時間を取られました。
2017.2.7追記
これと今後の改修のためにローカル環境にXAMPPとActivePerlをインストールしました。
CPANからDigest::SHAを使えるようにするのに時間と手間を取られました。