Nuflair+LectureというopenFrameworksのワークショップへGalaxy Galleryへ行ってきた[追記有り]

内容

Nuflair+Lecture
~openFrameworksを使ったAudio Reactiveな映像製作~
2013.4.14 (sun) at GalaxyGallery

http://www.galaxygallery.info/now/nuflair/

  • 1時限目(14:00-15:30) 休憩10分
    • oF(openFrameworks)とは、インストールと基本
  • 2時限目(15:40-17:10) 休憩10分
    • 基本的な描画
  • 3時限目(17:20-18:50) 休憩10分
    • 描画2
    • プログラミング基礎
    • 音との連携
  • 4時限目(19:00-20:30)
    • 音との連携2
    • 製作と発表

配布されたSamples目次

  1. emptyExample
    • コンパイル
  2. basicDrow
    • 簡単な描写
  3. basicDrow2
    • 少し複雑な描写
  4. hensu
    • 変数
    • 関数
  5. blending
    • 画像合成関数の紹介
  6. keyboard&if
  7. for & for2
    • for構文
  8. rectMode
    • 四角形の描写
    • `ofRotateZ()`Zはz軸(回転軸)を基準に回る
  9. rotate
    • `ofTransLate()`中心軸の変更
  10. scale
    • サイズの倍率
    • `ofMap()`関数 => 最小値と最大値を設定する
    • `ofPushMatrix()`と`ofPopMatrix()`で`ofScele`や`ofRotate`の影響を制御する
  11. basicAnimation
    • 動きを付ける
  12. basicEasing
    • マウス押下で動きをつける(イージング関数)
    • `testApp::mousePressed()`でマウス押下を検知
  13. simpleAudioInput
    • 音の取得`ofSoundStream`型を使用する
  14. simpleAudioInput2
    • 変化を付けてみる
  15. simpleAudioInput3
    • 閾値で制御する
  16. simpleVJ1-4,6
    • 13-15をまとめてやってみる
  17. simpleVJ5
    • アニメーションを加える
  18. simpleVJ7
    • 音量に応じて変わる
  19. simpleVJFinal
    • 全部のせ

Tips

main.cppで画面全体の設定をする

e.g) フィルターを画面全体にかけるなど

// 円をスムーズにする。
window.setGlutDisplayString("rgba double depth alpha samles>=4");
デバッグ

<<この感じがヒアドキュメントを思い出させる。

// var : 変数
// xcodeで変数の内容を表示させる
cout << var << endl;
画像の読み込み
img.loadImage()

感想

プログラミングの基礎についての事前通知が必要だったと思う

わりとマジで。明らかにプログラミングの基礎があることが前提な気がする。条件分岐とか初歩的なのも説明してたけど、はしょりすぎで理解してるのが前提の説明だったと思う。
IT勉強会なら普通だけど、Galaxy GalleryでC++のソースガリガリ書くとは思わんがなw
昨日Xcodeインストールしたばかりのバーのマスターには無理だろうて(実際にいた)。

高い

4,000円にしてはスタッフ3人(講師含む)は少ないかもなぁ。20人で全くの素人が4人いれば絶対無理だしなー。まあ素人の問題は上記と関係するけど。スポンサー募ればよかったんじゃね?みたいな。
さらにプラス500円のワンドリンクなら場所代も安くなってるだろうし、う〜ん、というかあの内容だったからどうしてもIT勉強会と比較するからダメなんだろうけども。。。

内容は大満足

プログラミングの基礎知識がある自分にとってはとても楽しかった。C++に触れる良いきっかけになった。特に音声の出力で色やデザインを変更できるところはサードアイがオープンしそうでかなりキテマス。
できたらslideshare.netにあげてくれないかな、今日のスライド。

途中まで制作したものをもうちょっと作って機会があれば映像をアップしてみたい。
個人的には大満足。

2013-04-15 1:52追記

このスライドよくまとまってる。たぶん同じのを使ってたような気がする。

Yahoo!オークション : このサーバーで操作できません。URLを確認してください。

2017/06/19追記

どうやらSSL化と並行してpageで始まるドメインは数字がつかない、 `page.auction.yahoo.co.jp` に移行し始めてるかもしれません。

追記ここまで



オークションが再出品できない

このサーバーで操作できません。URLを確認してください。

こんなメッセージが出て再出品ができなくなりました。
なんでかこんなことにハマッてしまったので備忘録。

いや、言われた通りにすりゃいいだろ

そうです。その通り。
URL確認すれば良いんです。

ただ、自分と同じくツール使ってる(作ってる)人とかはハマったかもなぁ

地味にYahoo!の仕様変更?

http://page3.auctions.yahoo.co.jp/
このドメインだけ、仕様が変わっています。

  1. エンコードEUC-JPからUTF-8
  2. 再出品ページはhttp://pageinfo3.auctions.yahoo.co.jp/

いや、page3ドメインだけなので全体的に仕様変更する気なのか、サーバー移転の関係なのかわからん。
なにがしたいんだよお前ら。



障害対応の皆様、ご苦労様でした。
現場からは以上です。

CakePHPで開発するVimmerにオススメの設定

はじめに

私の設定はまとめてここに置いてあります。
comeonly/spf13-vim

spf13/spf13-vimというVimディストリビューションを使っているので、インストールしたあと、spf13氏のリポジトリを私(comeonly)のものに差し替えてもらえれば同じ設定になります。

前はcarlhuda/janusを使ってたんですが、カスタマイズしにくいのと、neocomplcacheとかVundleとか新しいのを使いたかったのでやめちゃいました。

上記spf13-vimから追加したもの

世界中のVimerがtpope氏の恩恵を受けてるはず。今見たら4つもプラグイン入れてるわ。。。今回の記事とは関係ないですが便利なプラグインです。

後述しますが、phpとhtmlがまざってても綺麗にインデントします。forkしてCakePHP用にタブの設定を弄りました。

CakePHPのコーディング規約をPHP_CodeSnifferでチェック、Syntasticで該当箇所を表示

綺麗なコードってどうやって書くんだろう・・・謎でした。コーディング規約ってのがあるらしいんですよ。

CakePHP 2.3 の新機能 ServerShell の話 - Shin x blog
この記事読んで、コーディング規約って大事なんだなぁと思って、なんとかSyntasticで表示してくれないかなぁってのが実はきっかけであります。

必要なもの

  1. PEAR
  2. PHP_CodeSniffer
  3. scrooloose/syntastic

ここまでの設定は以下が詳しいです。とてもわかりやすく参考になりました。この場を借りて御礼申し上げます。
Vim初心者によるVim導入記録(CodeSnifferインストール+シンタックスチェック syntastic設定編) | Code Life




さて、ではここまででsyntasticでエラーが表示できるようになっているかと思います。
ここからがCakePHP用の設定。

方法は2つ。

1) PHP_CodeSniffer側の設定を変更する
デフォルトの規約をCakePHPに設定します。ちなみにインストール時はPEARの規約が設定されているそうです。

$ phpcs --config-set default_standard CakePHP

これだけ。

2) syntastic側の設定を変更する
syntasticがphpcsを呼ぶ時の引数に --satandard=CakePHP を指定します。

let g:syntastic_php_phpcs_args = '--report=csv --standard=CakePHP'

以上


HTMLの混ざったctpファイルでも綺麗なインデントをさせる

CakePHPで開発しててctpファイルが見にくいことがあるんです。そもそもphpをガリガリ書いちゃダメなんだろうなぁ、わからんけど。
なんにせよ、インデントが残念でイライラする。どうにかしたい。。。

相変わらずstackoverflow.com最高です。

After looking really really hard into all solutions, I found out this plugin:

http://www.vim.org/scripts/script.php?script_id=604

It seems to have solved my problems!!!!!

Correct indentation of HTML and PHP using Vim - Stack Overflow

この記事にありました。
Vundleが入っていれば

Bundle 'php.vim-html-enhanced'

でOK。

ただ、この設定だとshiftwidth=3という誰得設定。。。
それからCakePHPの規約はハードタブなのでその3点だけ変更したのがこちら。

Bundle 'comeonly/php.vim-html-enhanced'

g=G で快適。


PHP全般で便利な関数

ここで見かけたやつです。

PHP: ブロックオブジェクト
vim組み込みのオブジェクトに似たもの
aP - PHPブロック(タグを含む)
iP - PHPブロック内部のテキスト

vaP - 現在のPHPブロックをタグを含んで選択する
ciP - 現在のPHPブロック内のテキストを変更する
yaP - 現在のPHPブロックをタグを含んでコピーする
自分の.vim/ftplugin/php.vimの中で提供してる

(PHP)プログラマのためのVIM (9) - PHP向けカスタマイズ - おぎろぐはてな

その提供してるってのがこれ。

" Function to locate endpoints of a PHP block {{{
function! PhpBlockSelect(mode)
    let motion = "v"
    let line = getline(".")
    let pos = col(".")-1
    let end = col("$")-1

    if a:mode == 1
        if line[pos] == '?' && pos+1 < end && line[pos+1] == '>'
            let motion .= "l"
        elseif line[pos] == '>' && pos > 1 && line[pos-1] == '?'
            " do nothing
        else
            let motion .= "/?>/e\<CR>"
        endif
        let motion .= "o"
        if end > 0
            let motion .= "l"
        endif
        let motion .= "?<\\?php\\>\<CR>"
    else
        if line[pos] == '?' && pos+1 < end && line[pos+1] == '>'
            " do nothing
        elseif line[pos] == '>' && pos > 1 && line[pos-1] == '?'
            let motion .= "h?\\S\<CR>""
        else
            let motion .= "/?>/;?\\S\<CR>"
        endif
        let motion .= "o?<\\?php\\>\<CR>4l/\\S\<CR>"
    endif

    return motion
endfunction
" }}}

" Mappings to select full/inner PHP block
nmap <silent> <expr> vaP PhpBlockSelect(1)
nmap <silent> <expr> viP PhpBlockSelect(0)
" Mappings for operator mode to work on full/inner PHP block
omap <silent> aP :silent normal vaP<CR>
omap <silent> iP :silent normal viP<CR>

vim-settings/.vim/ftplugin/php.vim at master · andreiz/vim-settings · GitHub

要らないかなーとか思ってたんですが、リファクタリングする時はかなり便利かも。

PHPでヤフーにログインする

一連の続き。もうほとぼり冷めたし、そうすぐに仕様変えないだろうからと思って公開します。Github使ってたらかっこ良さそうなので、そっちで公開します。よろしくです。
comeonly/yahoobrowser · GitHub
公開してから知りましたが、こんなちょっとしたコードならGistが良かったんですかね。まいっか、いずれちゃんとしたプロジェクトとして公開できるようにがんばろう。

使い方

<?php
//yahoo_browserを置いたパス
require_once 'path/to/yahoo_browser.php'

//Yahoo!のアカウント名
$id   = 'foo';
$pass = 'bar';

$yahoo_browser = new YahooBrowser($id, $pass);
if (empty($yahoo_browser->cookies)) {
    die('ログインできませんでした。');
}
$yahoo_browser->getBody('http://www.yahoo.co.jp');
echo $yahoo_browser->body;
echo $yahoo_browser->cookies;
?>

で、取得できたクッキーをデータベースに保存するなりして使い回せばよいかと。

ソース

問題点

HTTP_Requestはもう古くってHTTP_Request2というものに変わっています。ただ、その影響が結構広範囲なので手が付けれていません。で、PHP 5からクラスの生成には&(アンパーサンド)なくてもポインタを指すらしい(うろ覚え)のでその影響で、HTTP_Request内で幾つか以下の様なエラーが出ます。

Deprecated: Assigning the return value of new by reference is deprecated in /Applications/MAMP/bin/php/php5.3.6/lib/php/HTTP/Request.php on line 794

その際は&(アンパーサンド)を削除してもらえればOKです。

こういうのを誰かにForkしてもらえたら良いのかな。まだGitをよく分かってませんのでいろいろつっこみ頂戴できればありがたいです。時間が取れればHTTP_Request2バージョンも取り組んでみたいですが。

コンソールで自作shellを実行するとパーミッションエラーになる

結構はまりました。原因がわかるまで意味がわからず時間をくってしまったので書いておきます。

症状

こんな感じのエラーがだーーーっとでまくり。

<?php
SplFileInfo::openFile(/app/tmp/cache/persistent/myapp_core_cake_console_):failed to open stream:Permission denied in /lib//FileEngine.php line 293
?>

で、/app/tmp/cache/modelの中身を削除して実行すると、今度はブラウザ側で同じエラーが表示される。

原因

/app/tmp/cache/model/app/tmp/cache/persistent内のキャッシュファイルのパーミッションが644になっている。
自分の環境だとブラウザからのアクションで生成されるキャッシュファイルは所有権がnobodyになっていて、コンソールからCakeシェルを実行するときは当然のようにhoge(ユーザー名)になってるわけです。

対策

/app/Congfig/core.phpmaskパラメーターを追加する。これでキャッシュファイルの生成時のパーミッションを設定することができます。

/app/Congfig/core.php
<?php
/**
 * Configure the cache used for general framework caching.  Path information,
 * object listings, and translation cache files are stored with this configuration.
 */
Cache::config('_cake_core_', array(
    'engine' => $engine,
    'prefix' => $prefix . 'cake_core_',
    'path' => CACHE . 'persistent' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666
));

/**
 * Configure the cache for model and datasource caches.  This cache configuration
 * is used to store schema descriptions, and table listings in connections.
 */
Cache::config('_cake_model_', array(
    'engine' => $engine,
    'prefix' => $prefix . 'cake_model_',
    'path' => CACHE . 'models' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666
));
?>

参考にしたサイト

  • stackoverflow

You can resolve this by adding a mask to your config in core.php

Cache::config('default', array(
    'engine' => 'File',
    'mask' => 0666,
));

cakephp - SplFileInfo::openFile(/app/tmp/cache/persistent/cake_core_cake_console_):failed to open stream:Permission denied in /lib/.../FileEngine.php line 293 - Stack Overflow

最近このサイトよく見ますね。数値です、文字列の"0666"だとおかしくなっちゃいます。実はこれでハマった。

  • Cake Book

When using the FileEngine you might need to use the mask option to ensure cache files are made with the correct permissions.
Caching — CakePHP Cookbook v2.x documentation

マニュアルにもちょっとだけ書いてある。

外出先から(ルーター越しに)iTunesの曲を聞く

Apple TVがあるやん、とかお手頃なNASが最近出てきたよ、とか、規約的にグレーだよ、とか、はい、そうなんです。でも一家に一台くらいMacBook余ってるっしょ?どうやって有効に使いますか?という話題。我が家は1台余ってるMacBookiTunesの再生とファイルサーバー専用に使っています。


が、HDL2-Aシリーズ | ネットワークハードディスク | IODATA アイ・オー・データ機器これ出てきてこの記事書く気無くしてしもた。


ほとんどは以下を参考にしてもらえればOK。
SSHは標準で「リモートログイン」という機能がある。

これだけでOK。だけど、証明書発行したりしてパスワード認証なしにするとセキュアだよって話はhttp://goo.gl/MYaDAで。
SSHなしでVPNだけでは動かないのでご注意を。なんでそんなしたかというと、私ってこの仕組で動作する経路をまったく理解してなかったわ〜。あっはっは〜。

(6) DAAP over SSH Port Forwarding (iTunes music共有)
上記プリンタ共有と同様に「Network Beacon」を使用する。iTunes music共有を有効にしているPCのアドレスを事前に知る必要がある。また、ここで述べる方法では、LAN内の複数の共有先を認識することはできない。LAN内で複数の共有先があったとしても、どれか1台にのみアクセスできる。主に自分のオフィスのPCを共有することを想定している。

「Network Beacon」を使ってlocalhostをproxy hostにする 。
(Network Beaconの設定)
Service Name: (任意)(ここでは"daap_on_SSH"とする)
Service Type: _daap._tcp.
Port Number: 3689
Text Record: (Empty)
Enable Host Proxy: (Checked)
Host Name: localhost
IP Address: 127.0.0.1

サーバポート=3689(daap)
ローカルポート=3689
(ターミナル)ssh –L 3689:server_address:3689 user@sshd_address
iTunes) 共有している音楽の検索が有効になっていれば、自動的に”daap_on_SSH”の名前で認識される。音楽リストを読み込むと共有先の名前も本来のものに変更される。
※上記の方法ではあくまで特定の一つの共有先にしかアクセスできない。しかも相手のIPアドレスを知らなければforwardingできない。これに対して、例えば、RNSplicerなどを使うと、ローカルエリア内の全ての共有先にアクセスできるようになる。

#7 SSH Port Forwardingあれこれ(2)Mac編 - 誰かさんのMac Life

補足すると、
server_address: 家においてきたMacのアドレス(通常だとグローバルIP)
sshd_address: 通常だとルーターでポートフォワーディングなんかしてるんだろうから、server_addressと同じ。
Network Beaconの設定
ダウンロードはこちらから

Network Beaconはクライアント側(外出先の端末)ですよ。

しかしこのサイト良く出来てるわー。遠隔でやりたいことここ見りゃほとんど出来るもの。
#7 SSH Port Forwardingあれこれ(2)Mac編 - 誰かさんのMac Life

AndroidiPhoneでこの方法を試す

いや、そもそも無理なんでした。これって、通常同一ネットワーク内でしかアクセスできないBonjourNetwork Beacon使ってアクセス可能にする方法。単純にSSHポートフォワーディングはAndroidでもできるけど、Bonjourネットワークに接続できるわけないわな。

iPhoneVPNで接続できたって記事を見かけたけど持ってないので詳しく調べてないのでわかりません。

AndroidでSHHならConnectBotってのがおすすめ。上記の記事にも書いてあるセキュアなVPNとかするのにも重宝する。

FormヘルパーのdateFormat

マニュアルシンプルに書き過ぎやーん!!!404 Not Found
view内に以下のようにする。

<?php echo $this->Form->input('field', array('dateFormat' => 'YMD')); ?>

ほんとにマニュアルはよく読みましょうと自分に何度も言ってあげたい。


















































CakePHP における型 フィールドのプロパティ
primary_key serial NOT NULL
string varchar(255)
text text
integer integer
float float
datetimetimestamp (Y-m-d H:i:s)
timestamp timestamp (Y-m-d H:i:s)
time time (H:i:s)
date date (Y-m-d)
binary bytea
boolean boolean
number numeric
inetinet

404 Not Found

postgreSQLの型がtimestamp without time zone の場合は時間が表示されました。以下のように$option['type']で回避ができますが、型はきっちり決めたほうがよいのではないかと。

<?php echo $this->Form->input('field', array('type' => 'date', 'dateFormat' => 'YMD')); ?>

このままだと月の表示は英語表記になる。単純に数字にしたい場合は以下のように設定する。
日本語対応のFormHelper::datetime() - 24時間CakePHPのような便利なヘルパーもあるみたい。

<?php
// cake -> view -> helper -> form.php
// 2129行目あたり、オリジナルをコメントアウトして以下のように変更した。
case 'month':
     if ($options['monthNames'] === true) {
        $data['01'] = __('01', true);
        $data['02'] = __('02', true);
        $data['03'] = __('03', true);
        $data['04'] = __('04', true);
        $data['05'] = __('05', true);
        $data['06'] = __('06', true);
        $data['07'] = __('07', true);
        $data['08'] = __('08', true);
        $data['09'] = __('09', true);
        $data['10'] = __('10', true);
        $data['11'] = __('11', true);
        $data['12'] = __('12', true);
        // $data['01'] = __('January', true);
        // $data['02'] = __('February', true);
        // $data['03'] = __('March', true);
        // $data['04'] = __('April', true);
        // $data['05'] = __('May', true);
        // $data['06'] = __('June', true);
        // $data['07'] = __('July', true);
        // $data['08'] = __('August', true);
        // $data['09'] = __('September', true);
        // $data['10'] = __('October', true);
        // $data['11'] = __('November', true);
        // $data['12'] = __('December', true);
     } else if (is_array($options['monthNames'])) {
          $data = $options['monthNames'];
     } else {
          for ($m = 1; $m <= 12; $m++) {
               $data[sprintf("%02s", $m)] = strftime("%m", mktime(1, 1, 1, $m, 1, 1999));
          }
     }
break;