Twenties Dirtbag

イギリスの大学院で脳の勉強をしてきた25歳、今はボルダリングジムを経営中。基本的にどうでもいいはなしです。

フォトジェニックと女子

ここだけの話ですが、月の初めにやることの一つとして、ホストの友人のナンバーを確認する。があります。そして、おお、頑張っているなあ。と心の中で思います。

 

パンケーキ、わたあめ、ベーグル。いろんなものがカラフルになり、写真向きのモノを好んで選ぶような時代になっている。

 

という会話をそのホストの彼としていたんだけど、彼が言った

 

「まあでも、女の子ってフォトジェニックなものをインスタに撮ってupしたがるけど、何よりもフォトジェニックなのは、その女の子の"笑顔"だよね。」

 

と、会話のキャッチボールの中で出してきたセンテンスが忘れられない。その瞬間、液体窒素をかけられたような、寒気がした。

ただ、そういう系の発想のショートカットが若干うらやましかったりもする。

f:id:flowertyyyy:20170625223157p:plain

いじょう。

今週のお題「晴れたらやりたいこと」

今週のお題「晴れたらやりたいこと」

 

この時期、晴れたらとても暑いと思うので、クーラー付けた彼女の部屋で自分の16:9のディスプレイとMacを持ち込んで、涼しい思いをしていたい。

ローラーがついていない椅子で、1時間でできることを3時間位かけてダラダラやる。

 

「セブン行くけど、なにかいる?」

という質問に、

「アイスコーヒーのレギュラーで。ありがとう。」

という会話をして、20:50からレイトショーが始まるまでの時間を、ネットサーフィとプログラミングとコーヒーを8:1:1くらいの割合で行う1日がやりたい。

 

ちなみに、レイトショーはこれ:

 

 

未経験でクリエイティブ業界にはいった

普通にデートとかしてても本屋にいきたくなってしまったら、本屋に行きます。よくそこで

「本なんて、アマゾンで買いなよ〜」

ってめっちゃ言われます。そしてその通り、本はインターネットで購入しています。では、なぜ本屋にいくの?って言われるんですけど、その理由としては、、本屋に行くと潜在的欲求がわかりやすいから。です。

 

まあ例えるのであれば、「スタバどや族のための、東京のおすすめカフェ25選」という本を買いに蔦屋とかに行くじゃないですか、そうしたら、なぜか知らないけど「1億年前に流行っていた女子の口説き方」という本をつい手に取ってたりします。

そういうとき、自分の潜在的欲求に「1億年前」だったり「女子の口説き方」というのがあったりするのが、関係してるわけですね。

 

そういうのを知るために、人間は本屋に行く必要があるです。

 

これは先日、本屋さんに行った話。

 

プログラミングの本を探しに本屋さんにいったんですが、ふと気になって手に取った本は「3分でわかる海底ケーブルの話」とか「オーガニック革命」とかを手にとったりするんですね(そしてその後購入した)。ということは無意識レベルでそのカテゴリーに興味があったらしいくて、それがしれる。ということ

 

なので、そういった本屋にいくこと、っていうのが大事なんですね〜

 

さーて、本題にはいりますか。

 

未経験でクリエイティブ業界にはいりました。

 

 

以上ー。

 

4月からのNew Lifeてきなやつ

前に少しだけ触れてしまったので、いまこうやって簡単に書くと、4月の上旬に東京に引っ越しをしまして、とあるクリエイティブエージェンシーで働きはじめました。

同様にボルダリングはやっていくつもりですが。

 

このクリエイティブ業界的なもの、すごく脳科学に付随するというかRelateしていることが多くて(例えば、どうやって発想力を鍛えるかなど)とてもおもしろくなりそうです。

 

まあ、そんなカンジです。

 

いじょうー。

この人のような英語を話したいシリーズ

Sam Claflinというイギリス人俳優が話すような、イギリス英語を話せるようになってやるぜ!っていう意気込みで毎日、彼のインタービューとかを見ているんです。

 

それだけ、おわり。(笑)

 

こんな人工知能がほしいよ

LINEのタイムラインで、「女子が彼氏にしてほしい10のこと」というのが流れてきたので、見ていました。そこにはこんな事が書いてありました。

1. おはようと、おやすみのLINEがほしい
2. 背後からのハグ
3. 深く、長い会話
4. 一緒に写真をとること
5. 小さいことでも良いので、サプライズを
6. なぜ、彼女が好きなのかを伝えてほしい
7. 彼女のために時間を作って欲しい
8. 寄り添ってネットフリックスをみたい
9. ランダムキス
10. うそをつかないでほしい

 

というような10項目がありました、これが女子が彼氏にしてほしい10個のことのようです。もちろんこれは女子次第で個人差があり、まだまだこの他にもあるはずですよね。

そこで、「女子が彼氏にしてほしいこと」のデータを集めまくって、それをビッグデータとします。そしてそれを人工知能のロボットに学習させて、Siriのように

こんにちは、今日の天気は晴れです、前回のサプライズから28日経過しているので、今日は小さいサプライズをしましょう。

とサジェストしてくれる、Siri的な人工知能ロボットを開発しましょう。こうすることによって、女子の幸福度が全体的に上がるはずです。

それと反比例して、男子の幸福度は下がりますが。f:id:flowertyyyy:20170222005951p:plain

結構、「彼女に何をすれば喜んでくれるのか?」という問は、男からしたら比較的カロリーを要する思考でございます。なので、なるべく避けたい、そしてその結果、何もしないというところに行き着きます。そうして最終的に彼女が女子会に行ったときに彼氏をディスる繰り返しです。

 

なので、ではそのカロリーの使う思考活動をロボットに任せましょう。というのが今回のブログ内容でした。

 

今こうやって図にもしてみましたが、女子がやってほしいことをSiriくんが提案してくれるのですが、提案してくれてもやりたくないものもあります。例えば、ぶっちゃけ、おはようとお休みのLINEはしたくありません。もうSiriくんが勝手にLINEを起動してパターンを決めて送信してくれるのが1番ありがたいですね。そういうBotも開発しましょう。

 

どうでしょう、いい感じにHappyになれそうじゃないですか。ちょっと寝る前にこのような変なことを思いついて3秒位でなにも考えずにかいているので、まとまってないんですけど、こんな感じで、どうでしょうか。

では、ねます。

 

おわり。

 

 

 

 

 

OF:雪のなかで人影が遊ばせたらエラーが出た話

openFrameworksを勉強する際に、とても参考にしているのがこここじ研(openFrameworks)なんですが、この、「雪のなかで人影が遊ぶ」を実行していこうとした際に、エラーが出たので他のやり方でやってみた結果を書いていきます。

 

上のリンク先の「シルエットと雪との相互作用を実現」というところの、シルエットをポリゴンに変換する際のこちら↓

// make a polygon shadows[j].get()->clear();
shadows[j].get()->addVertexes(shadowLines[j]);
shadows[j].get()->triangulatePoly(30);
shadows[j].get()->setPhysics(1.0, 0.5, 0.1);
shadows[j].get()->create(world2d.getWorld());

 

のところで、「signal SIGABRT」というエラーが出てきてビルドはできたのですが、Workしない状態となってました。そのエラーの原因をいろいろとGoogle itしたのですが、なかなかこれと言った解決のためのKeyが手に入らなかったので、計算量が多いためのコマ落ちかな。と自分の中で勝手に結論を出してしまい、別の方法でやることにしました。

f:id:flowertyyyy:20170220183604p:plain

 

それは、単純に分析した輪郭線の位置情報を

 

    for(int i = 0; i < finder.nBlobs; i++){
        for(int j = 0; j < finder.blobs[i].pts.size(); j++){
            ofPoint pos = finder.blobs[i].pts[j];
            ofPtr<ofxBox2dCircle> circle = ofPtr<ofxBox2dCircle>(new ofxBox2dCircle);
            circle.get() -> setup(world2d.getWorld(), pos.x, pos.y, 3);
            ContourCircles.push_back(circle);
        }
    }

 

これで取得して、そこに半径3の円をおいているという状態です。これだと実行できました。(おそらくポリゴンをつくるより正確性は下がりますが。)
f:id:flowertyyyy:20170220185059p:plain


参考:
Amazon CAPTCHA

#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    // window
    ofBackground(80, 80, 120);
    ofSetWindowShape(640, 480);
    
    // box2d
    world2d.init();
    world2d.setFPS(60.0);
    world2d.setGravity(0, 2);
    
    // snow
    snow.load("snow.png");
    snow.setAnchorPoint(0.5, 0.5);
    
    // ground
    world2d.createGround(0, 480, 640, 480);
    
    // setup OpneNI
    kinect.setup();
    kinect.setRegister(true);
    kinect.setMirror(true);
    kinect.addDepthGenerator();
    kinect.start();
    minDist = 500;
    maxDist = 1500;
    shadowImage.allocate(640, 480);
    invertImage.allocate(640, 480);
    
    //  shadow of a person
    for (int i = 0; i < MAX_BLOBS; i++){
        shadows[i] = ofPtr<ofxBox2dPolygon>(new ofxBox2dPolygon);
    }
}

void ofApp::makeSnow(float x, float y, float size){
    // create a new circle
    ofPtr<ofxBox2dCircle> circle = ofPtr<ofxBox2dCircle>(new ofxBox2dCircle);
    
    // set attributes to this circle
    circle.get() -> setPhysics(1.0, 0.5, 0.1);
    circle.get() -> setup(world2d.getWorld(), x, y, size);
    circle.get() -> setVelocity(ofRandom(-1.0, 1.0), ofRandom(-1.0, 1.0));
    
    // add this circle to "circles" vector
    circles.push_back(circle);
}

bool objectkiller(ofPtr<ofxBox2dBaseShape> shape) {
    float yPos = shape.get() -> getPosition().y;
    return (yPos >= 500);
}

//--------------------------------------------------------------
void ofApp::update(){
    // shadow
    kinect.update();
    unsigned short *depthData = kinect.getDepthRawPixels().getData();
    unsigned char *shadowData = shadowImage.getPixels().getData();
    for (int k = 0 ; k < 640 * 480; k++) {
        shadowData[k] = (minDist < depthData[k] && depthData[k] < maxDist)? 255:0;
    }
    shadowImage.flagImageChanged();
    invertImage = shadowImage;
    invertImage.invert();
    
    // find contours
    shadowImage.threshold(threshold);
    for(int i = 0; i < ContourCircles.size(); i++){
        ContourCircles[i]->destroy();
    }
    ContourCircles.clear();
    finder.findContours(shadowImage, 1000, 640*480/4, 4, false);
    for(int i = 0; i < finder.nBlobs; i++){
        for(int j = 0; j < finder.blobs[i].pts.size(); j++){
            ofPoint pos = finder.blobs[i].pts[j];
            ofPtr<ofxBox2dCircle> circle = ofPtr<ofxBox2dCircle>(new ofxBox2dCircle);
            circle.get() -> setup(world2d.getWorld(), pos.x, pos.y, 3);
            ContourCircles.push_back(circle);
        }
    }
    
    /*
    numShadows = finder.nBlobs;
    for (int j = 0; j < MAX_BLOBS; j++) {
        shadowLines[j].clear();
        shadows[j].get()->clear();
        if (j < numShadows) {
            //  make a contour
            for (int k = 0; k < finder.blobs[j].pts.size(); k+=60){
                shadowLines[j].addVertex(finder.blobs[j].pts[k]);
            }
            shadowLines[j].close();
            shadowLines[j].simplify();
            //  make a polygon
            shadows[j].get()->clear();
            shadows[j].get()->addVertexes(shadowLines[j]);
            shadows[j].get()->triangulatePoly(5);
            shadows[j].get()->setPhysics(1.0, 0.5, 0.1);
            shadows[j].get()->create(world2d.getWorld());
        }
    }
     */
    
    // make a new snow
    if (ofRandom(0, 100) < 40) {
        makeSnow(ofRandom(-40, 680), -40, ofRandom(5, 10));
    }
    
    
    // box2d
    ofRemove(circles, objectkiller);
            
    //update the world
    world2d.update();
}

//--------------------------------------------------------------
void ofApp::draw(){
    shadowImage.draw(640, 0, 640, 480);
    // draw shadow
    ofSetColor(80, 80, 120);
    //ofSetColor(255, 255, 255);
    invertImage.draw(0, 0, 640, 480);
    //  draw contours
    /*
    ofSetLineWidth(3);
    ofSetColor(140, 140, 200);
    for (int j = 0; j < numShadows; j++){
        shadowLines[j].draw();
    }
     */
    //shadowImage.draw(0, 0, 640, 480);
    
    // draw contours
    finder.draw(0, 0, 640, 480);
    
    
    // draw the ContourCircles
    ofSetColor(255, 255, 255);
    for(int i = 0; i < ContourCircles.size(); i++){
        ContourCircles[i]->draw();
    }
    

    
    // draw each circle
    ofSetColor(255, 255, 255);
    for (int i = 0; i < circles.size(); i++) {
        ofPoint pos = circles[i].get() -> getPosition();
        float size = circles[i].get() -> getRadius()*10.0;
        snow.draw(pos, size, size);
    }
    
    // draw the number of circles and fps
    ofSetColor(255, 100, 100);
    char buf[100];
    sprintf(buf, "%ld circles", circles.size());
    ofDrawBitmapString(buf, 20, 20);
    sprintf(buf, "%5.2f fps", ofGetFrameRate());
    ofDrawBitmapString(buf, 20, 40);
    sprintf(buf, "%1d fps", threshold);
    ofDrawBitmapString(buf, 20, 60);

}

//--------------------------------------------------------------
void ofApp::keyPressed(int key){
    switch(key){
            case '+':
            threshold ++;
            if(threshold > 255) threshold = 255;
            break;
            case '-':
            threshold --;
            if(threshold < 0) threshold = 0;
            break;
            
    }

}