誰もがiPhone付属イヤホンで声優のラジオを聞いているわけじゃない

声優のラジオでノイズひどい番組ありますよねって話。

僕は作業時にたまに声優のラジオ聞いてる。

基本的に内容はどうでもよくて、作業中だから内容なんて聞いてないし、適当に聞いてて疲れないラジオを探してたら声優のラジオに行き着いてた。

が、ちょっと前からヘッドホン環境にしてから、少し気になる音があることに気がついた。机にMCの手とかがあたった時の音だ。これかなり辛い。ヘッドホンだと直接脳に低音が来る。痛い。意図的ではないにしろ(たまにテンション上がって机叩く人もいるけど)あまりにも多いと聞く気なくす。

これはかなりの損失だ。オタクの人、ヘッドホンとか環境整えてるの容易に想像できて、おそらくその声優好きなんだろう人がラジオ聞いててまともに聞けてるのだろうか? ノイズがあって聞きづらいという状況を超える内容を提供するのって相当に難しくて、それを成し遂げてるの某podcastぐらいしか思いつかない。


と、愚痴ったところで何も変わらないだろうから適当な対策を考えてみる。


解決策は簡単で環境を下げればノイズも聞こえない。
iPhone付属のイヤホンで聞こう。外で聞こう。布教だ。
まともなのはイコライザーで低音切る事かな。


ハイレゾ環境を整えつつそれではラジオは楽しめないとは、声オタの人はすごいなぁと思いました。

CastOvenはどこへ消えた

ちょっと昔の研究で電子レンジ使ってる時に利用者はその前を動かないから電子レンジの窓にyoutubeから動画を引っ張ってくればいいじゃないかっていう研究があって

CastOven: CastOven: A Microwave Oven with Just-in-time Video Clips / 日常生活の待ち時間に合わせた コンテンツ提供システム|渡邊恵太のWebページ

今だとどうなるか妄想した


まずデバイスの問題として、電子レンジ使ってる間ずっとその前に立ってるとは考えられず、他のことしたり携帯いじったりしますよねと。なので動画を飛ばす先はスマホでいいでしょう


電子レンジで温める時、最近のは自動で良く、温めボタン押すだけであとは熱くなったら止まりますよってのが多い。この止まりますよはその都度温度を測ってるだけなので、終わり時間がはじめから正確に決まっているわけではない。そう考えると調度良い長さの動画を飛ばすのは難しい。それに人間先走って止めるときもある。日常利用には向かないように感じる


そこでお菓子作りである。お菓子作りにとって温め時間は正確に守らなければならない。早めに止めてしまってはダメなのだ。ここで先ほどの利用と逆の方向へと変化する。暇な時間動画を見るのではなく、人間を拘束するために動画を見せるのである。動画を見ることにより人間はお菓子作りにおいて適切な時間を守ることができる


だがお菓子作りのうまい人って空いた時間に片付けとかして要領よく調理する。書いているうちにお菓子作りにも合わないような気がしてきた


最初に戻ろう、電子レンジを使っている間、人間がその前から動かない状況があればいいのだ。あった。コンビニだ。業務用ゆえ時間は短いが、その短さゆえ他にやることがないこともある。これなら元の使い方で利用できる。動画は適当な広告で構わない。店員と二人で気まずい時間を過ごすよりずっといい。どうせレジの液晶を眺めていたのだ。眺める先が変わるだけだ


陳腐なところに着地してしまい面白くなさすぎて吐血した



時間をうまく使おうというコンセプト動画の最後で尺余りがある辺り最高にロックだ

PHPとMySQLを用いたまっとうなアンテナサイトの作り方

しばらく前にアンテナサイト作ってたんだけどまとまった記事がなかった気がするので雑記的に

基本的な仕組み

phpファイルでrssを取得→Mysqlに格納→Mysqlからデータを取ってサイトに表示

rssの取得

magpierssを使う

アンテナサイト入門【PHP】 | コケムスシェルター

ここをかなり参考にして

<?php
$num = 5;//RSS取得件数

date_default_timezone_set('Asia/Tokyo');
  
$rssUrl=array(
'http://x6xo.hatenablog.com/rss',//サイトurl

);
  
//magpierss
require_once('magpierss-0.72/rss_fetch.inc');
define('MAGPIE_OUTPUT_ENCODING','UTF-8');//encode
define('MAGPIE_CACHE_AGE','30');//cache
 
foreach ($rssUrl as $no => $rss_url) {
    if ($rss_url != '') {
    //URLからRSSを取得
    $rss   = @fetch_rss($rss_url);
      if ($rss != NULL) {
            for ($i=0; $i<count($rss->items); $i++) {
          $rss->items[$i]["site_title"] = $rss->channel["title"];
          $rss->items[$i]["site_link"] = $rss->channel["link"];
        }
        //itemsを格納
        $rssItemsArray[] = $rss->items;
        }
    }
}

$concatArray = array();
if (is_array($rssItemsArray)) {
    for($i=0;$i<count($rssItemsArray);$i++){
    $concatArray = array_merge($concatArray,$rssItemsArray[$i]);//配列を統合する
  }

    foreach ($concatArray as $no => $values) {

        //RSSの種類によって日付を取得
        if($values['published']){$date = $values['published'];}
        elseif($values['created']){$date = $values['created'];}
        elseif($values['pubdate']){$date = $values['pubdate'];}
        elseif($values['dc']['date']){$date = $values['dc']['date'];}
        $date=date("Y-m-d H:i:s",strtotime($date));

        //Filter
        $nowtime = date("Y-m-d H:i:s",strtotime( "now" ));//現在時刻の取得
        if($date > $nowtime){//未来記事の排除
        }elseif(preg_match("/AD/", $values["title"])){//広告記事の排除
        }elseif(preg_match("/PR/", $values["title"])){
        }else{
        
            //値の定義
            $title=$values["title"];
            $link=$values["link"];
            $site_title=$values["site_title"];
            $site_link=$values["site_link"];

            //記事ごとに必要な項目を抽出
            $rssArray[]=array($date, $title, $link, $site_title, $site_link);
        }//
    }//

    //ソート
    function cmp($a, $b) {
        if ($a[0] == $b[0]) return 0;
        return ($a[0] > $b[0]) ? -1 : 1;
    }
    if($rssArray) { usort($rssArray, 'cmp'); }
    if(count($rssArray) > $num){$count=$num;}
    else{$count=count($rssArray);}

    for ($i=0; $i<$count; $i++) {
        $date=date("Y-m-d H:i:s",strtotime($rssArray[$i][0]));
        $title=$rssArray[$i][1];
        $link=$rssArray[$i][2];
        $site_title=$rssArray[$i][3];
        $site_link=$rssArray[$i][4];
        $datelink = "<div>$date";
      $titlelink = "<a href='$link'>$title</a>";
      $site_titlelink = "<a href='$site_link'>[$site_title]</a></div>";
      echo "$datelink$titlelink$site_titlelink</div>";//(確認用)
    }
}
?>

これで更新情報を取ってこれる

f:id:x6xo:20140924202749p:plain

Mysqlへの格納

Mysqlで適当なテーブルを作る

create table rss (id int not null auto_increment primary key,title varchar(255),link varchar(255),site_title varchar(64),site_link varchar(64),date datetime);   

f:id:x6xo:20140924202935p:plain

項目はこれくらいあれば十分でしょう
では接続してデータの格納です
先ほどのindex.phpの最初にMysqlへの接続のコードを付け加えます

try {
  $dbh = new PDO('mysql:host=localhost;dbname=rss;unix_socket=/tmp/mysql.sock','dbuser','PASS');
} catch(PDOException $e) {
  var_dump($e->getMessage());
  exit;
}

これで接続出来ました

最後に

//切断
$dbh = null;

で接続を切断します

ではデータを格納しましょう。場所はechoのあとです

//格納
$stmt = $dbh->prepare("insert into rss (title,link,site_title,site_link,date) values (?,?,?,?,?)");
$stmt->execute(array($title,$link,$site_title,$site_link,$date));

実行してみます

f:id:x6xo:20140924202959p:plain

これで格納できているのがわかります
ここまででphpMysqlにデータを格納することが出来ました。あとはこれを自動的に実行するようなcronを作成すれば何もせずともデータベースに更新情報が格納されます

データの表示

sqlを作ってデータを表示させます。適当にテーブルで囲ってみました

<?php
//接続
try {
  $dbh = new PDO('mysql:host=localhost;dbname=rss;unix_socket=/tmp/mysql.sock','dbuser','maekawa');
} catch(PDOException $e) {
  var_dump($e->getMessage());
  exit;
}
?>
<html>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>rss</title>
<body>
<?php

date_default_timezone_set('Asia/Tokyo');

$sql = "select * from rss order by date desc limit 10";//10件表示
echo '<table>';
$stmt = $dbh->query($sql);
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $data) {
  $date = date("m/d H:i",strtotime($data['date']));
  $title = ($data['title']);
  $link = ($data['link']);
  $site_link = ($data['site_link']);
  $site_title = ($data['site_title']);
  echo "<tr><td>$date</td><td><a href='$link'>$title</a></td><td><a href='$site_link'>[$site_title]</a></td></tr>";
}

echo "</table>";

//切断
$dbh = null;
?>

f:id:x6xo:20140924204607p:plain

あとはお好きに表示させればいいと思います

index.php

<?php

try {
  $dbh = new PDO('mysql:host=localhost;dbname=rss;unix_socket=/tmp/mysql.sock','dbuser','PASS');
} catch(PDOException $e) {
  var_dump($e->getMessage());
  exit;
}

$num = 5;//RSS取得件数

date_default_timezone_set('Asia/Tokyo');
  
$rssUrl=array(
'http://x6xo.hatenablog.com/rss',//サイトurl

);
  
//magpierss
require_once('magpierss-0.72/rss_fetch.inc');
define('MAGPIE_OUTPUT_ENCODING','UTF-8');//encode
define('MAGPIE_CACHE_AGE','30');//cache
 
foreach ($rssUrl as $no => $rss_url) {
    if ($rss_url != '') {
    //URLからRSSを取得
    $rss   = @fetch_rss($rss_url);
      if ($rss != NULL) {
            for ($i=0; $i<count($rss->items); $i++) {
          $rss->items[$i]["site_title"] = $rss->channel["title"];
          $rss->items[$i]["site_link"] = $rss->channel["link"];
        }
        //itemsを格納
        $rssItemsArray[] = $rss->items;
        }
    }
}

$concatArray = array();
if (is_array($rssItemsArray)) {
    for($i=0;$i<count($rssItemsArray);$i++){
    $concatArray = array_merge($concatArray,$rssItemsArray[$i]);//配列を統合する
  }

    foreach ($concatArray as $no => $values) {

        //RSSの種類によって日付を取得
        if($values['published']){$date = $values['published'];}
        elseif($values['created']){$date = $values['created'];}
        elseif($values['pubdate']){$date = $values['pubdate'];}
        elseif($values['dc']['date']){$date = $values['dc']['date'];}
        $date=date("Y-m-d H:i:s",strtotime($date));

        //Filter
        $nowtime = date("Y-m-d H:i:s",strtotime( "now" ));//現在時刻の取得
        if($date > $nowtime){//未来記事の排除
        }elseif(preg_match("/AD/", $values["title"])){//広告記事の排除
        }elseif(preg_match("/PR/", $values["title"])){
        }else{
        
            //値の定義
            $title=$values["title"];
            $link=$values["link"];
            $site_title=$values["site_title"];
            $site_link=$values["site_link"];

            //記事ごとに必要な項目を抽出
            $rssArray[]=array($date, $title, $link, $site_title, $site_link);
        }//
    }//

    //ソート
    function cmp($a, $b) {
        if ($a[0] == $b[0]) return 0;
        return ($a[0] > $b[0]) ? -1 : 1;
    }
    if($rssArray) { usort($rssArray, 'cmp'); }
    if(count($rssArray) > $num){$count=$num;}
    else{$count=count($rssArray);}

    //必要な件数分だけHTML整形
    for ($i=0; $i<$count; $i++) {
        $date=date("Y-m-d H:i:s",strtotime($rssArray[$i][0]));
        $title=$rssArray[$i][1];
        $link=$rssArray[$i][2];
        $site_title=$rssArray[$i][3];
        $site_link=$rssArray[$i][4];
        $datelink = "<div>$date";
      $titlelink = "<a href='$link'>$title</a>";
      $site_titlelink = "<a href='$site_link'>[$site_title]</a></div>";
      echo "$datelink$titlelink$site_titlelink</div>";//(確認用)
        
        //格納
        $stmt = $dbh->prepare("insert into rss (title,link,site_title,site_link,date) values (?,?,?,?,?)");
        $stmt->execute(array($title,$link,$site_title,$site_link,$date));
        
    }
}
?>

ということで久しぶりのプログラムでリハビリを兼ねて書いてみた

華々つぼみ作品にみるキャラクター認識性

僕は美術部系四コマ作品を盲目的に買ってしまうという癖があって、ちょっと前に目をつけたのが「放課後アトリエといろ」(以下アトリエ)って作品

同著者の「コドクの中のワタシ」(以下コドク)って作品はきららで読んでてるんだけど、コドクのキャラを全然認識してないことに気づいたので何となく書く

コドクの中のワタシ (1) (まんがタイムKRコミックス)

コドクの中のワタシ (1) (まんがタイムKRコミックス)

なんでコドクの方はキャラを把握できないかを考えると、基本的に主人公と他のキャラが一対一の関係しか持ってなくて、前回の記憶なんてとうになくてお前誰だよってキャラが多数いるきららの中で、キャラの関係性を覚えておくのはとてもつらい。前に出てきた単語を覚えながらやるしりとりみたい

対してアトリエの方はキャラが学年ごとに分かれてて、一年生三人あとは二・三年二人づつでその二人が仲いいって感じで書かれてる。故に自然とグループとして相互的に結びつき連想的に覚えられる。英単語ひとつ覚えるより三つぐらい集めて文章作ったほうが覚えやすいのと同じだ

コドクは吸血鬼とシスター以外のペアがなく思い出す起点となるものが無い。起点となるものは多い方がいい。ハーレム作品に、幼なじみ・妹・委員長・男の娘みたいなお決まり配置はありきたりだけど、キャラの認識性で考えると思い出すのは容易になる。ある程度のフレームワークにそって作られてる感じ。この作品でのあれはあの子みたいな

例えば、コドクの二次創作作ると考えると、その大部分は主人公を含むものになるだろう。逆にアトリエだと学年ごとのカップリングが多くてその他もちらほらといった感じだと思う(個人的には部長と二年生を期待)
カップリングの多様性ってのはキャラクター認識性のための起点の豊富さだと考える

ってことでアトリエの復活はないですかね

Kindle無料本を考える

だれでも手軽に出版できるKindleを利用して無料本を出版しているを多数見かける
しかし、どうしてその内容で出したんだ、と思うようなのが多いのも事実である

そんなのブログに書けばいいじゃんぐらいの内容なのが目立つ
なのでなぜKindleというプラットフォームを選んだのか推測してみる

ブログに書いても誰も読んでくれないし、だったら無料本として出版して目を引こう
無料本にすればその手のbotに紹介されて人の目には触れやすくなる
ランキングに入るには150DLもあれば十分なので競合は少なくまともなタイトルさえついていればランキングに入って自己満足できる
でも、ダウンロードした人間が皆読んでいるとは考えられない
どれだけの人間が読んでいるかを考えると、誰も見ないブログに書くのとそう大差なく思える

じゃあどうしよう、僕は私はKindleを使って読んで欲しいんだよ内容のない文章をさ

対応を考えるとKindleは現在のシステムだと購入履歴を参照しにくくKindleで無駄に埋め尽くすのはあまり嬉しくありませんねといった状態なので、Amazon側で管理を何とかして貰いたいです。Kindleだけ別とかにして貰えないですかね
まあ個人ではどうにもならんですが

他媒体でサンプルや連載などをやってKindleでパッケージとして販売ぐらいが最適かと

面白い本あったら教えて下さい

夏のタイムマシン作った

久しくコード書いてなかったのでリハビリがてら昔作ったやつを sinatra + heroku に移行させた

夏のタイムマシン

f:id:x6xo:20140608101907p:plain

Twitter の昔のツイート検索の url 作ってるだけなので仕組みは単純。Twitter の検索の仕様がちょっと変わってたぐらい
フロー型のコンテンツって昔のやつ見返すとちょっと面白い

KindlePaperwhite の雑感

KindlePaperwhite 買って一ヶ月ほど経過したので適当な雑感

すごい目にやさしい

僕はすごく目が悪い。視力は良いんだけどスマホの画面見ると死ぬほど目が痛くなる人間だ。でも KindlePaperwhite なら問題なかった。買う前はモノクロのゲームボーイぐらいの画面みたいなの想像してたけどもっと紙の印刷に近いものだった

書籍のダウンロード早い

漫画とかでなければサッと入ってる、Kindle のアプリと比べると差は歴然

サイズ感

4コマ漫画はキツイかな。下から掲載誌、iPad2、単行本 、KindlePaperwhite

f:id:x6xo:20140602202505j:plain

漫画と文章混じりの構成だとつらい

漫画で紹介、文章で解説みたいな構成だと漫画部分を読み込むのに時間がかかってそのまま落ちることがある。そんなのはアプリの Kindle で読んだほうがいいかもしれない

文字の濃さ

対談本とかだと文字の濃さ変えてたりしてて薄すぎて読めない事がある。普通の書籍は文字の大きさとフォントしか変更できない。文字の濃さを変えられるのは PDF のファイルを見るときだけだ

ブラウザ(体験版)

体験版だしあまり期待はできないけど、今のWebページのスクロールって主流に相性悪すぎる。スクロールなしでページごとに飛ばせるなら価値は見いだせるかも
これも濃さがつらい。Twitter とか見るとツイート読めない。Web でも PDF 見る時みたいな文字の濃さを設定できたらいいと思う


ちょっとアレなところもあるけど電車乗る時はだいたい持ってるし良いヤツだと思う