[ Content | Sidebar ]

Y8 2017 Spring in Shibuya に参加してきました

6月 3rd, 2017

先週の土曜日(2017/5/27)に行われていた Y8 2017 spring in Shibuyaに参加してきました。

昨年も参加したのですが、今年も皆様のトークは大変面白かったり、興味深かったり、胃が痛くなったり、とさまざまなお話があり、とても刺激的な一日となりました。

二次会も色々なコミュニティの色んな方と懇親できて大変楽しかったです。

たとえば、”PHP7をちゃんとする”とかで、いつかコミュニティご恩返しが出来ればいいなあとか、思いました。

スタッフの皆様、お疲れさまでした&ありがとうございました!!

シン・ゴジラ見てきました。

8月 8th, 2016

日曜日の夜中にシン・ゴジラを観てきました。
「私は見た!! あれは確かにゴジラだった!!!」

観劇後、数分間腰が抜けてしまい身動きが取れなくなり、動けるようになっても、あまりの高揚感に、電車に乗らず、1時間ほどかけて徒歩で帰宅して、更に1時間近くボンヤリしてから、この記事を書いています。

庵野監督の特撮ありはゴジラへの愛を通り越しての狂いっぷりが最高の映画だったと思います。

たった一回だけ「シン・ゴジラ」見た人間のネタバレ含む妄想しかないので改行後の閲覧注意
































































































ここからただの妄想です。

日本政府の奮闘及ばず、熱核兵器による攻撃が実施された場合、ラストシーンで描かれた通りなら既に熱核で焼かれたモノタチの塊ですので、おそらくですが、ゴジラはその攻撃に耐えきるでしょう。
(というかゴジラに通常兵器は疎か核兵器なんか余計に通らねえよが持論ですので)
かつ、SLBMのロジックを理解し、超長距離攻撃の能力を得、まず米潜水艦への報復攻撃を実施。
で、どうも、指揮系統を理解してる節(自衛隊現場指揮所の破壊とか最初の総理のヘリ落としてるとか)がありましたので、次に立川臨時政府への長距離攻撃。
次にワシントンや、国連本部等へ次々、あるいは同時に攻撃を行い、そして人類は終焉へ……

ここまで予見してた牧博士が用意した「たった一つの冴えたやり方」だったのかなとか

一回だけ見た人間が思いつく程度の妄想なんで、細かい所とは流してやってください……

時間作って、もう一回みてこようかなー

YAP(achimon)C::Asia Hachioji 2016mid in Shinagawa 7/3(日) に参加しました。

7月 3rd, 2016

抽選で漏れてしまったので、二日目だけでしたがYAP(achimon)C::Asia Hachioji 2016mid in Shinagawaに参加してきました。

聞いてきたのは、以下の通り。

個々の感想は、もっとテンション高くて、日本語うまい人たちに任せるとして、全体的に他の人のちゃんとした技術系のお話聞くのすごく楽しかったです。最高でした。

スタッフの皆様、会場を提供してくれたMS様、なにより主催のうずら様、お疲れさまでした&ありがとうございました!!

Tumblr V2 APIにPHPで画像を連続投稿する恥ずかしいサンプル

5月 11th, 2013

ふとアクセス解析とGoogle先生を見ると、公式翻訳より上位に居て、申し訳ない気持ちがいっぱいで胃がキリキリします。

とはいえ、悶えてるだけでは、何も解決しないので、自前で動かしているソースを公開しておきます。

前提として、L(M)AMP環境で、Zend_ProgressBarとかjqueryとか使って動かしているので、自力でインストールしてください。
あと、こんな辺鄙な所までたどり着いてる、諸兄らには詳細な説明は不要と思うので、なんかおかしくても、適宜なんとかしてください。

では、以下、恥ずかしいソースをだらだらと。

まずフォーム部分
[start.html]

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="UTF-8" xml:lang="UTF-8">

<head>
    <title> start </title>
</head>
<body>
    <form action='./post.php' method='post'>
        画像ディレクトリ名<input type="text" name="image_path" size=" 100" /><br />
        画像元url<input type="text" name="url" size="100" />(オプション)<br />
        tags<input type="text" name="tags" size="100" />(カンマ区切り)<br />
        <input type="submit" name="get_authkey" value="get_authkey" />
    </form>
</body>
</html>

プログレスバーを使うためのワンクッション
[post.php]

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="UTF-8" xml:lang="UTF-8">

<head>
    <script type="text/JavaScript" src="jquery-ui-1.8.23.custom/js/jquery-1.8.0.min.js"></script>
    <script type="text/JavaScript" src="jquery-ui-1.8.23.custom/js/jquery-ui-1.8.23.custom.min.js"></script>
    <link type="text/css" href="jquery-ui-1.8.23.custom/css/ui-lightness/jquery-ui-1.8.23.custom.css" rel="stylesheet" />
    <title> bulk post </title>
	<script type="text/JavaScript">
	<!--
	$(function() {
	    $('#progressbar').progressbar({
	        value: 0
	    });
	});
	
	function Zend_ProgressBar_Update(data)
	{
	    $('#progressbar').progressbar('value', data.percent);
        $('#progressdata').html(data.percent);
	}
	function Zend_ProgressBar_Finish()
	{
	    alert('post complate!');
	}
	-->
	</script>
</head>
<body>
<div id="progressbar"></div>
<span id="progressdata">0</span>/100
<?php
$request_param = '?';
foreach($_REQUEST as $key => $value) {
    $request_param .= $key.'='.urlencode($value).'&';
} 
?>
<iframe src="./bulk_post.php<?php echo $request_param;?>" style="left: -1000px; top: -1000px; width: 1px; height: 1px; position: absolute;"></iframe>
</body>
</html>

んで、本体
[bulk_post.php]

<?php
require_once('Zend/ProgressBar.php');
require_once('Zend/ProgressBar/Adapter/JsPush.php');

define("CONSUMER_KEY", '');
define("CONSUMER_SECRET", '');
define("OAUTH_TOKEN", '');
define("OAUTH_SECRET", '');

foreach($_REQUEST as $key => $value) {
  $_REQUEST[$key] = urldecode($value);
}

function oauth_gen($method, $url, $iparams, &$headers) {

  $iparams['oauth_consumer_key'] = CONSUMER_KEY;
  $iparams['oauth_nonce'] = strval(time());
  $iparams['oauth_signature_method'] = 'HMAC-SHA1';
  $iparams['oauth_timestamp'] = strval(time());
  $iparams['oauth_token'] = OAUTH_TOKEN;
  $iparams['oauth_version'] = '1.0';
  $iparams['oauth_signature'] = oauth_sig($method, $url, $iparams);
  print $iparams['oauth_signature'];  
  $oauth_header = array();
  foreach($iparams as $key => $value) {
    if (strpos($key, "oauth") !== false) { 
      $oauth_header []= $key ."=".$value;
    }
  }
  $oauth_header = "OAuth ". implode(",", $oauth_header);
  $headers["Authorization"] = $oauth_header;
}
    
function oauth_sig($method, $uri, $params) {

  $parts []= $method;
  $parts []= rawurlencode($uri);

  $iparams = array();
  ksort($params);
  foreach($params as $key => $data) {
    if(is_array($data)) {
      $count = 0;
      foreach($data as $val) {
          $n = $key . "[". $count . "]";
          $iparams []= $n . "=" . rawurlencode($val);
          $count++;
      }
    } else {
      $iparams[]= rawurlencode($key) . "=" .rawurlencode($data);
    }
  }
  $parts []= rawurlencode(implode("&", $iparams));
  $sig = implode("&", $parts);
  return base64_encode(hash_hmac('sha1', $sig, CONSUMER_SECRET."&". OAUTH_SECRET, true));
}
    
$img_dir = $post_caption = $post_body = $post_title = $_REQUEST['image_path'];
// 画像ディレクトリ名=投稿名になってるので、変えたければ変更してください。
$LOCAL_DIR="/your/img/path/".$img_dir;

if($_REQUEST['url'] != ''){
    $post_caption = '<a href="'.$_REQUEST['url'].'"> '.$post_caption.'</a>';
}
$TAGS = $_REQUEST['tags'];
$post_tags=mb_convert_encoding($TAGS,'UTF-8','auto');
$drc=dir($LOCAL_DIR);

$dir = scandir($LOCAL_DIR);
$dir_max = count($dir);

$adapter     = new Zend_ProgressBar_Adapter_JsPush(array('updateMethodName' => 'Zend_ProgressBar_Update', 'finishMethodName' => 'Zend_ProgressBar_Finish'));
$progressbar = new Zend_ProgressBar($adapter, 0, $dir_max);
$i=0;
while($fl=$drc->read()){
  $i++;
  $din=pathinfo($LOCAL_DIR.$fl);

  $filename=$LOCAL_DIR.$din['basename'];

  if(strlen($din['basename'])<=4 or $din['basename']  == ".DS_Store"){
    $progressbar->update($i);
    continue;
  }

  $headers = array("Host" => "http://api.tumblr.com/", "Content-type" => "application/x-www-form-urlencoded", "Expect" => "");
  $params = array("data" => array(file_get_contents($filename)),
      "type"  => "photo",
      "title" => $post_title,
      "tags"  => $post_tags,
      "caption" => $post_caption,
  );

  $blogname = "your.tumblr.com";
  oauth_gen("POST", "http://api.tumblr.com/v2/blog/$blogname/post", $params, $headers);

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_USERAGENT, "PHP Uploader Tumblr v1.0");
  curl_setopt($ch, CURLOPT_URL, "http://api.tumblr.com/v2/blog/$blogname/post");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );

  curl_setopt($ch, CURLOPT_HTTPHEADER, array(
      "Authorization: " . $headers['Authorization'],
      "Content-type: " . $headers["Content-type"],
      "Expect: ")
  );

  $params = http_build_query($params);

  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

  $progressbar->update($i);
}
$progressbar->finish();
curl_close($ch);	

以上、何かを探して、こんなネットの片角にまでたどり着いてしまった人の一助となればいいと思います。

Tumblr API v2にphpで投稿

9月 8th, 2012

9月の頭に、Tumblr1 API v1の提供が終わり、ベーシック認証が使えなくなった。

そのため、今まで、downloadしてきた画像をまとめて、Tumblrに投げるのに使っていた、スクリプトをAPI v2に対応させる必要が出てきた。

早速、このあたりで、アプリを登録し、consumer keyとconsumer secretを取得。

これを使って、access token keyとaccess_token secretをTwitterと同じように、PEARのHTTP/OAuthで取得して。Twiterと同じようにスクリプトの中に直書きして、投稿しようとしていたのだけど、テキストは出来るけど、画像を投稿すると何故か401が返る。

あれ? とおもい、ブラウザで表示させるようにすると、取りに行くたびにaccess token keyとaccess_token secretが違う。

1セッションだけ? そんな馬鹿なと思いつつも、IDとパスワード投げればいいXAuthの申請をTumblr supportに出してみる、が数時間したら却下される。

support曰く「XAuth使わなくても出来るよ!」

でも、401返るよなーと、首をひねりつつ、さらに調べて見ると、バイナリをpostする時には、一ひねり入れなきゃいけない記事をみつける、が、英検4級で止まってる俺には難し過ぎるよ、と、途方に暮れていたら、androidで同じように困ってるディスカッションにぶつかり、その中に、動いてるphpでのソースをgithubに上げてる投稿を発見。

ありがたやありがたやとソースを拝借し、無事、ふたたび大量投降が出来るようになりました。

先人達に100万の感謝を

参考URL:
http://brainbackup.net/post/post-images-to-tumblr-using-phonegap-and-jsoauth.html
https://groups.google.com/forum/#!topic/tumblr-api/iUI1IM1khQw
https://gist.github.com/1649885

レビューをしたまともなソースじゃなくて、必要最低限の機能が乗っかってるだけの上に、githubから拝借したソースメインで、参考にはならないと思うけど。一応ソースも乗っけておく

    define("CONSUMER_KEY", '');
    define("CONSUMER_SECRET", '');
    define("OAUTH_TOKEN", '');
    define("OAUTH_SECRET", '');
    
    function oauth_gen($method, $url, $iparams, &$headers) {
        
        $iparams['oauth_consumer_key'] = CONSUMER_KEY;
        $iparams['oauth_nonce'] = strval(time());
        $iparams['oauth_signature_method'] = 'HMAC-SHA1';
        $iparams['oauth_timestamp'] = strval(time());
        $iparams['oauth_token'] = OAUTH_TOKEN;
        $iparams['oauth_version'] = '1.0';
        $iparams['oauth_signature'] = oauth_sig($method, $url, $iparams);
        print $iparams['oauth_signature'];  
        $oauth_header = array();
        foreach($iparams as $key => $value) {
            if (strpos($key, "oauth") !== false) { 
               $oauth_header []= $key ."=".$value;
            }
        }
        $oauth_header = "OAuth ". implode(",", $oauth_header);
        $headers["Authorization"] = $oauth_header;
    }
    
    function oauth_sig($method, $uri, $params) {
        
        $parts []= $method;
        $parts []= rawurlencode($uri);
       
        $iparams = array();
        ksort($params);
        foreach($params as $key => $data) {
                if(is_array($data)) {
                    $count = 0;
                    foreach($data as $val) {
                        $n = $key . "[". $count . "]";
                        $iparams []= $n . "=" . rawurlencode($val);
                        $count++;
                    }
                } else {
                    $iparams[]= rawurlencode($key) . "=" .rawurlencode($data);
                }
        }
        $parts []= rawurlencode(implode("&", $iparams));
        $sig = implode("&", $parts);
        return base64_encode(hash_hmac('sha1', $sig, CONSUMER_SECRET."&". OAUTH_SECRET, true));
    }
    
    $img_dir = $post_caption = $post_body = $post_title = $_REQUEST['image_path'];
    $LOCAL_DIR=$img_dir."/";
    
    if($_REQUEST['url'] != ''){
        $post_caption = '<a href="'.$_REQUEST['url'].'"> '.$post_caption.'</a>';
    }
    $TAGS = $_REQUEST['tags'];
    $post_tags=mb_convert_encoding($TAGS,'UTF-8','auto');
    $drc=dir($LOCAL_DIR);
    while($fl=$drc->read()){
        echo __LINE__."<br />¥n";
        $din=pathinfo($LOCAL_DIR.$fl);
    
        $filename=$LOCAL_DIR.$din['basename'];

        //.拡張子より短いファイル名をスキップ
        if(strlen($din['basename'])<=4 or $din['basename']  == ".DS_Store"){
                continue;
        }
    
        $headers = array("Host" => "http://api.tumblr.com/", "Content-type" => "application/x-www-form-urlencoded", "Expect" => "");
        $params = array("data" => array(file_get_contents($filename)),
            "type"  => "photo",
            "title" => $post_title,
            "tags"  => $post_tags,
            "caption" => $post_caption,
        );
        
        $blogname = "hogehoge.tumblr.com";
        oauth_gen("POST", "http://api.tumblr.com/v2/blog/$blogname/post", $params, $headers);
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_USERAGENT, "PHP Uploader Tumblr v1.0");
        curl_setopt($ch, CURLOPT_URL, "http://api.tumblr.com/v2/blog/$blogname/post");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
        
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            "Authorization: " . $headers['Authorization'],
            "Content-type: " . $headers["Content-type"],
            "Expect: ")
        );
        
        $params = http_build_query($params);
        
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        
        $response = curl_exec($ch);
        $status=curl_getinfo($ch,CURLINFO_HTTP_CODE);
        if (curl_errno($ch)) {
                echo "curl_error($c)\n";
        }
        echo $respon;
    }
    curl_close($ch);

mac+mongoose+php

5月 24th, 2012

ちょっと遊んでみたら結構ハマったのでメモ

環境

MacOSX 10.6.8

前提

macportsがインストールされてる事
web共有が止まっている事

やった事

apache と PHP インストール
$ sudo port install php5 +fastcgi

<a href="http://code.google.com/p/mongoose/downloads/list">ここ</a>からソースを拾ってきて解凍する。
解凍したものを移動
$ mv /Users/hoge/Desktop/mongoose /usr/local

mongooseインストール
$ cd /usr/local/mongoose
$ make mac

mongoose.conf作成
$vi mongoose.conf
 listening_ports 80
 document_root /Users/hoge/Sites
 enable_directory_listing yes
 access_log_file access_log.txt
 error_log_file error_log.txt
 cgi_interpreter /opt/local/bin/php-cgi
 cgi_pattern **.php$

mongoose起動
$ sudo ./mongoose

起動確認
ブラウザでhttp://localhost/ とアクセスして見る。

php確認
$ vi /Users/hoge/Sites/test.php
<?php phpinfo(); ?>
ブラウザでhttp://localhost/test.php とアクセスして、phpinfoが表示されればOK。

天気がいいので娘を撮ってみた

3月 24th, 2012


お日さまは最高の光源

実家猫

1月 10th, 2012

年末年始に実家で猫撮ってきました。結構カメラ構えて追いかけてたんですが、あんまり撮らせてくれなかったのが残念です。
※日本語カテゴリーだとうまくリンクされてなかったので再投稿

Zend Frameworkで好きな時に404出す方法

11月 28th, 2011

なにもいじってないErrorControllerのまま、404にするコード。

throw new Zend_Controller_Router_Exception('Not found',404);

ErrorControllerをちょっと変えないと、Zend__Exceptionの第二引数にエラーコード置いても判断材料にしてくれないので、ErrorControllerに投げる前の処理のソースを追って行ったらZend/Controller/Plugin/ErrorHandler.phpの260行目あたりから、
Exceptionごとの分岐が書いてあったので、そのまま使ってみた。
というか、Zend__Exceptionで投げさせて、エラーコードで切り替えさせてくれよ……

PHPでFizzBuzz問題

2月 24th, 2011

ふと思うところがあって、プログラマの適正検査?らしい FizzBuzz問題を解いてみた。

<?php
$i = 1;
do {
  if(is_int($i/15))
  {
    echo 'fizzbuzz';
  }
  elseif(is_int($i/3))
  {
    echo 'fizz';
  }
  elseif(is_int($i/5))
  {
    echo 'buzz';
  }
  else
  {
    echo $i;
  }
  echo ",";
  $i ++;
} while($i <= 100);

is_intの存在を思い出すのにややかかったので、2分でもないし、ワンライナーでも無いけど、剰余(%)は使ってないからいいことにする。
三項式つかえば、短くなりそうだなあ……