画像を簡単に中央寄せにする
下のようなHTMLの場合、
<div class="image"> <p><img src="/image/example.jpg" alt="example" /></p> </div>
もっとも多く用いられるCSSは
.image p { text-align: center; }
だと思いますが、
今回はもっと簡単な方法。
image img { display: block; margin: auto; }
また、右寄せ、左寄せの場合は下のようになる。
/* 右寄せ */ image img { display: block; margin-left: auto; } /* 左寄せ */ image img { display: block; margin-right: auto; }
.htaccessのBasic認証とIP制限の設定方法
.htaccessを利用しBasic認証で許可したIPアドレス以外からのサイトへのアクセスを制限する方法。
AuthType Basic AuthUserFile /path/to/.htpasswd # パスワードファイル AuthName "Please input your Account & Password" # Basic認証時のテキスト Require valid-user Satisfy Any # IPまたはID認証がOKなら許可する order deny,allow Allow from [許可するIPを記述] deny from all
これでアクセス元IPが許可IPの場合はBasic認証が表示されない。
[subversion]ローカルファイルは残しつつリポジトリ内を削除するコマンド
svn delete [ファイルまたはディレクトリ] --keep-local
--keep-local
オプションを使えばOK!
指定したURLのスクリーンショットを画像を取得し表示させるショートコード
指定したURLのスクリーンショット画像を生成するwordpressのプラグイン『BM Shots』がありますが、アクセスの度に画像取得を実行するのが嫌だったので自分のサーバに画像を保存し保存された画像を表示するようなショートコードを作成しました。
記載しているショートコードの利用は自由ですが、特にテストなど行っていないので利用される場合は、自己責任でお願いします。ショートコードの利用により生じた不具合などの責任は負いかねますので予めご了承ください。あしからず。
コード
<?php # functions.php // 指定URLのスクリーンショットを描画 function screenshotSc($atts, $content = null) { global $post; define('DS', '/'); // 画像保存ディレクトリ define('SCREENSHOT_DIR', '画像保存ディレクトリパスを記述'); extract(shortcode_atts(array( "base"=>'http://s.wordpress.com/mshots/v1/', "url" => '', "class" => 'line1', "alt" => '', "file" => '', "link" => '', "width" => '800', "height" => '533' ), $atts) ); if( empty( $url ) || empty( $file ) ) return null; /* 処理 */ $image_flag=false; $dir=SCREENSHOT_DIR; $date=$post->post_date; $year=date('Y', strtotime($date) ); $month=date('m', strtotime($date) ); $filename='http://'.$_SERVER['HTTP_HOST'].DS.'blog'.DS.'wp-content'.DS.'themes'.DS.'oniloq'.DS.'images'.DS.'screenshot'.DS.$year.DS.$month.DS.$file.'.jpg'; if( !file_exists($dir.$year) ) { mkdir($dir.$year); } if( !file_exists($dir.$year.DS.$month) ) { mkdir($dir.$year.DS.$month); } if( file_exists($dir.$year.DS.$month.DS.$file.'.jpg') ) { $image_flag=true; } if( !$image_flag ) { $url=$base.urlencode($url).'?w='.$width.'&h='.$height; $image=file_get_contents($url); file_put_contents($dir.$year.DS.$month.DS.$file.'.jpg', $image); } if( !empty($class) ) $class='class="'.$class.'"'; $img = '<img '.$class.' src="'.$filename.'" alt="' . $alt . '"/>'; if( empty($link) ) return $img; return '<p>' . '<a href="' . $link . '">' . $img . '</a>' . '</p>'; } add_shortcode("Screenshot", "screenshotSc");
記事内
記事内では下記の様なショートコードを記述する
[Screenshot url="http://google.co.jp/" file="filename" alt="google" link="http://google.co.jp"]
WEB制作で役立つカラーツール『0to255』
0to255:指定した色より明るい色と暗い色をグラデーションで表示してくれるサービス。
imap関数を使ってGmailのメールを取得する
以前、Gmailよりメールを取得し、データベースへ反映する機能の構築を実装したのでメモしておきます。はじめに、Gmailの設定でimapが有効になっていることを確認する。imapが有効になっていない場合は、有効にします。
imap関数の詳しい情報はPHP: IMAP - Manualを参考に!
<?php // 必要な定数を設定 define('GMAIL_HOST','imap.googlemail.com'); define('GMAIL_PORT',993); define('GMAIL_ACCOUNT','アカウント名'); define('GMAIL_PASSWORD','パスワード'); define('SERVER','{'.GMAIL_HOST.':'.GMAIL_PORT.'/novalidate-cert/imap/ssl}'); // メールボックスへの IMAP ストリームをオープン if (($mbox = @imap_open(SERVER."INBOX", GMAIL_ACCOUNT, GMAIL_PASSWORD)) == false) { // 失敗処理を記述... } // メールボックスの情報を取得 $mboxes=imap_mailboxmsginfo($mbox); // メッセージ数の有無 if( $mboxes->Nmsgs != 0 ) { // 情報を格納する変数を初期化 $mail=null; for( $mailno=1; $mailno<=$mboxes->Nmsgs; $mailno++ ) { // ヘッダー情報の取得 $head=imap_header($mbox, $mailno); // アドレスの取得 $mail[$mailno]['address']=$head->from[0]->mailbox.'@'.$head->from[0]->host; // タイトルの有無 if( !empty($head->subject) ) { // タイトルをデコード $mhead=imap_mime_header_decode($head->subject); foreach( $mhead as $key=>$value) { if( $value->charset != 'default' ) { $mail[$mailno]['subject']=mb_convert_encoding($value->text,'UTF-8',$value->charset); }else{ $mail[$mailno]['subject']=$value->text; } } }else{ // タイトルがない場合の処理を記述... } // 格納用変数の初期化 $charset=null; $encoding=null; $attached_data=null; $parameters=null; // メール構造を取得 $info=imap_fetchstructure($mbox, $mailno); if( !empty($info->parts) ) { // $parts_cnt=count($info->parts); for( $p=0; $p<$parts_cnt; $p++ ) { // タイプにより処理を分ける // [参考] http://www.php.net/manual/ja/function.imap-fetchstructure.php if( $info->parts[$p]->type == 0 ) { if( empty( $charset ) ) { $charset=$info->parts[$p]->parameters[0]->value; } if( empty( $encoding ) ) { $encoding=$info->parts[$p]->encoding; } }elseif(!empty($info->parts[$p]->parts) && $info->parts[$p]->parts[$p]->type == 0){ $parameters=$info->parts[$p]->parameters[0]->value; if( empty( $charset ) ) { $charset=$info->parts[$p]->parts[$p]->parameters[0]->value; } if( empty( $encoding ) ) { $encoding=$info->parts[$p]->parts[$p]->encoding; } }elseif($info->parts[$p]->type == 5){ $files=imap_mime_header_decode($info->parts[$p]->dparameters[0]->value); if(!empty($files) && is_array($files) ) { $attached_data[$p]['file_name']=null; foreach($files as $key => $file) { if( $file->charset != 'default') { $attached_data[$p]['file_name'].=mb_convert_encoding($file->text, 'UTF-8', $file->charset); }else{ $attached_data[$p]['file_name'].=$file->text; } } } $attached_data[$p]['content_type'] = $info->parts[$p]->subtype; } } }else{ $charset=$info->parameters[0]->value; $encoding=$info->encoding; } if( empty($charset) ) { // エラー処理を記述... } // 本文を取得 $body=imap_fetchbody($mbox, $mailno, 1, FT_INTERNAL); $body=trim($body); if( !empty($body) ) { // タイプによってエンコード変更 switch( $encoding ) { case 0 : $mail[$mailno]['body']=mb_convert_encoding($body, "UTF-8", $charset); break; case 1 : $encode_body=imap_8bit($body); $encode_body=imap_qprint($encode_body); $mail[$mailno]['body']=mb_convert_encoding($encode_body, "UTF-8", $charset); break; case 3 : $encode_body=imap_base64($body); $mail[$mailno]['body']=mb_convert_encoding($encode_body, "UTF-8", $charset); break; case 4 : $encode_body=imap_qprint($body); $mail[$mailno]['body']=mb_convert_encoding($encode_body, 'UTF-8', $charset); break; case 2 : case 5 : default: // エラー処理を記述... break; } }else{ // エラー処理を記述... } // 添付を取得 if( !empty($attached_data) ) { foreach( $attached_data as $key => $value) { $attached=imap_fetchbody($mbox, $mailno, $key+1, FT_INTERNAL); if(empty($attached)) break; // ファイル名を一意の名前にする(同じファイルが存在しないように) list($name, $ex)=explode('.', $value['file_name']); $mail[$mailno]['attached_file'][$key]['file_name']=$name.'_'.time().'_'.$key.'.'.$ex; $mail[$mailno]['attached_file'][$key]['image']=imap_base64($attached); $mail[$mailno]['attached_file'][$key]['content_type']='Content-type: image/'.strtolower($value['content_type']); } } // メールの削除 imap_delete($mbox, $mailno); } // 削除用にマークされたすべてのメッセージを削除 imap_expunge($mbox); // $mailを確認 var_dump( $mail ); }
Wordpressでプラグインを使わずにtwitterへ自動ツイートを実装してみる
TwitterOAuthライブラリ を使用している
ライブラリ使用方法の参考記事:PHP+OAuthでTwitter
TwitterへOAuthクライアントの登録
TwitterにOAuthアプリケーション情報を登録。アプリケーション登録等の手順は割愛。
→ Twitter Applications | dev.twitter.com
Twitterに過去記事を自動POSTする機能を実装
仕様
登録されている記事からランダムで1件取得しツイートするシステム
現在、期間指定などしていない
ツイートの間隔は、6時間に1ツイート
自動ツイートまで
→ クローンで実行されるファイル
→ ツイッターへPOSTを実行するクラス
→ Twitter OAuth ライブラリ本体
<?php // wordpress関数を使用できるように読み込む require_once('/home/www/htdocs/zukunasi.net/wp-load.php'); // ツイッターへのポストを実行するクラスを読み込む require_once (get_theme_root() . '/' . get_template() . '/libs/twitter.class.php'); // 短縮URLを取得するクラスを読み込む require_once (get_theme_root() . '/' . get_template() . '/libs/bitly.class.php'); $twitter=new TwitterClass(); $bitly=new BitlyClass(); // query... global $wpdb; $query="select ID, post_title from wp_posts where post_status = 'publish' and post_type = 'post' order by rand() limit 1;"; $post=$wpdb->get_row($query); $before='[過去記事]:'; $url=get_permalink($post->ID); // bit.ly api... $url=$bitly->__createShortUrl($url); $string=$before.$post->post_title.' - '.$url; if( strlen($string) > 140 ) { mb_substr($string, 0, 140); } // tweet... $twitter->__tweet($string);
<?php // 設定ファイルを読み込む require_once (get_theme_root() . '/' . get_template() . '/config.php'); // Twitter OAuth ライブラリを読み込む require_once (get_theme_root() . '/' . get_template() . '/libs/components/twitteroauth/twitteroauth.php'); class TwitterClass { var $twitter; function __construct() { $this->twitter=new TwitterOAuth( TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET, TWITTER_ACCESS_TOKEN_KEY, TWITTER_ACCESS_TOKEN_SECRET ); } function __tweet($string) { return $this->twitter->OAuthRequest( "http://api.twitter.com/1/statuses/update.xml", "POST", array("status"=>$string) ); } }
最後にクーロンを設定して完了。