bussorenre Laboratory

hoge piyo foo bar

envp - main関数3つ目の引数

昨日の俺 「知らんかった……( ゚д゚)ポカーン」

C言語のmain関数には引数が”3つ”存在する。

大体Cの入門書は int main() とかだし、ちょっと毛が生えてきて、引数を取って挙動を変えましょうとかだと、argc, argv を取るだけだと思うし、sublime TextのCのsnippet もargv までしか補完してくれないし、envp ってなんやねんΣ(゚Д゚)

crt1.cには以下のように書かれている。

extern int main (int, char **, char **);

この3つめの引数が いわゆるenvp で、"環境変数へのポインタ"らしい。 環境変数bashzsh

$ set

というコマンドで確認できる。いわゆる$PATHとかの事。 実際に引数を確認するプログラムを作成してみましょう。

#include <stdio.h>

int main(int argc, char *argv[], char *envp[])
{
    int i = 0;

    /*  argc の確認 */
    printf("argc = %d\n", argc);

    /* argv の確認 */
    printf("argv = [");
    for (i = 0; i < argc; i++)
    {
        printf("\'%s\' ", argv[i]);
    }
    printf("]\n");

    /* envp の確認 */
    printf("envp = [");
    for (i = 0; envp[i]; i++)
    {
        printf("\'%s\' ", envp[i]);
    }
    printf("]\n");

    return 0;
}

で、実行結果ですが、

./a.out
argc = 1
argv = ['./a.out' ]
envp = ['TERM_PROGRAM=iTerm.app' 'TERM=xterm-256color' 'SHELL=/bin/bash' 'CLICOLOR=1'......(非常に汚い環境変数なのでお見せできません笑

となりました。環境変数は必ず hoge=piyo foo=bar という文字列で格納されているので、strtok関数などで分解してやると扱いやすいと思われます。

これは便利だ!!

PWDやHOMEなどの環境変数も入っているので、HOMEフォルダにアプリケーションの設定ファイル.ore_rcみたいなのを置けます。また、envpはfork/execしても変更されず引き継げますので(※要調査。変数をそのまま引き継ぐわけではなく、envpが格納されているメモリがexecにより書き換えられない?)

8年近く、Cのmain関数は引数2つだと思い込んでいたので、非常に勉強になりました。というか、反省しています。常識を疑うって大事(白目

openFrameworks 自分用まとめ

おはようございます。@bussorenre です。 ちょっと野暮用でopenFrameworksを使うことになり、それについて調べていた次第であります。

openFrameworks とは

  • メディア処理のライブラリを集めたC++ のToolkit
  • OpenGLやrtAudioなどのライブラリのラッパーライブラリ
  • MIT media Laboratory が中心となって開発しているオープンソースライブラリ
  • Mac OS X / windows / Linux / Arm Linux / iOS / Android に対応
  • 最新版は0.8.1 で、過去バージョンの後方互換性は無い。(2014年6月8日現在) です。

製品用のソフトウェアに使用するのに便利なのかどうかはわかりませんが、プロトタイプやちょっとした実験目的に使用するには非常に強力なライブラリだなーと思います。

元々Direct3D を全速力で追っていた人間としては、非常に扱いやすくシンプルなライブラリだなーと感じています。メディア処理を扱うため、使用言語は闇とかなんだとか言われるC++ですが、特別闇な事を感じること無く使うことが出来ます。(今のところは

日本語の入門記事とか

日本においては 田所 淳 (tadokoro) on Twitter という方が第一人者らしく、公式サイトの日本語版 http://openframeworks.jp も管理されておられますし、非常に役に立つスライドもslideshare で公開されています。非常に勉強になりました。多謝多謝m(_ _ )m

メディア・アート II 第1回: ガイダンス openFrameworks入門

メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション

メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF

Media Art II 2013 第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズム

Media Art II 2013 第5回:openFrameworks Addonを使用する

Media Art II 2013 第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv

Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL

授業用のスライドだと思うのですが、それをslideshare で公開されている多摩美術大学は先進的で素晴らしいと思います。一個人の強行かもしれませんが……笑

これを勉強するとどういうプロダクトが創れるようになるのか

kinect との連携

Interactive Puppet Prototype with Xbox Kinect on Vimeo

テッセレーション技術の応用と、3Dプリンタを用いたファッションジェネレーター。これは凄い。

Kinematics on Vimeo

プロジェクションマッピング

" chair " 3D projection mapping by Masaru Ozaki - YouTube

プロジェクションマッピングって普通のプロジェクターじゃ出来ないのかな???出来るなら気軽に試せて面白いと思うのでぜひやってみたい。

既存のグラフィックツールとどう違うのか

DirectX

おなじみMicrosoftDirectX こちらはゲームに特化しているというイメージが根強く、windows 系列以外での動作が非常に難しい。しかしwindows系で、強力なグラフィックカードを積んだパソコンに3D処理をさせるのには非常に強い。Kinectとの連携も強いらしい。

OpenGL

色々勉強したけれど、OpenGLそのものを直接叩くのは難しい(ぶっちゃけめんどくさい)ので、ラッパーライブラリを使うのはいいかもしれません…(どうせあとでOpenGLの知識が必要になってくるだろうし)

Unity 等のツール

完全にゲーム作成に特化しています。今回openFrameworksを選択した理由はゲームを創りたいという特化した目的ではないので、パスしました。

まとめ(というか感想)

デジタルとアートとの融合 なんてカッコイイことが言われていますが、その実態はまだまだ未知数です。今まで画面の中で閉じていたコンピュータグラフィックが、現実世界と交わり合うようになったら面白い事ができるかもしれない。というのは誰もが感じていることなので、その概要だけかじってみてもいいかもなーーって思いました まる

自分用 Swift 暫定まとめ(1)

ついにニュースでも取り上げられるようになった 若者のObjective-C離れ(笑)に対応するかのごとく、出てしまったSwift について、ある程度まとめました。

より詳細なドキュメントはiTunesストアにただで置いてあります。

実際にコンパイルして動作を確認するための Xcode 6 Beta は iOS Dev Center - Apple Developer から、「規約を更新したから同意してください」的なボタンを押すと、ダウンロード出来るようになります。

f:id:bussorenre:20140603102806p:plain

Hello World

println("Hello, Swift!!")

以上です。main関数などのエントリーポイントはありません。セミコロンで終わるステートメントでもありません。import も特に必要ありません。 組み込み関数??

変数宣言

var myInteger = 42
myInteger = 100
let myConstant = 0
var myDouble:Double = 0

test = 100  // エラー
myConstant = 100 // エラー

変数宣言はjavascript に似ています。 変数は先頭にvar、 定数は先頭にlet を明治します。varやletのない変数宣言はエラーとなります。当然ながらletで宣言した定数を変更するコードもエラーになります。

明示的に型を宣言する場合は、変数名の後にコロン(:)型名をつけます。Goっぽいですね。また、一度宣言した変数は型を変えることが出来ないようです。型キャストは出来ます。

var myInteger = 100
// myInteger  = 100.0  エラー
myInteger  = Int(100.0) // 型キャスト

配列と辞書型( array & dictionary)

var fruits = ["apple", "banana", "cherry"]
fruits[0] = "Orange"

var languages = [
    "C" : "old",
    "C++" : "too complex",
    "Python" : "too slow",
    "Objective-C" : "dead"
]
println(languages["Objective-C"])

文字列にシングルクォーテーションは使えない模様。Pythonjavascriptを足したような構文。また、辞書のキーにはあらゆる型が使える。

var floats = [
    1.0 : 100,
    2.0 : 200,
    3.0 : 300
]
floats[1.0] = 10000

C++のtemplate っぽい。と思っていたら空の配列、辞書宣言が以下のような感じだった。

let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()

非常に型が大事。Dictionary は、Dictionary という型(クラス?オブジェクト?)なのか、キーワードなのかまだわかりません(汗)

制御文

var individualScores = [43, 75, 100, 87, 23]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}

var n:Int = 100
while n > 1{
    n--
}
do{
    n++
} while  n < 100

var firstForLoop = 0
for i in 0..3 {
    firstForLoop += i
}

var secondForLoop = 0
for var i = 0; i < 3; ++i {
    secondForLoop += 1
}

ブロックはお馴染みの {}で作ります。Pythonのようコロンとインデントで識別ではありません。rubyのようなbegin end でもありません。while もdo-whileも、従来型のforもpythonっぽいforも使えます。

関数

func getGasPrices(item:Double) -> (Double, Double, Double) {
    return (3.59, 3.69, 3.79 * item)
}

複数の戻り値を返せる模様です。

クロージャ

swiftのクロージャーの表現は非常に写像っぽくていいと思いました。

func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

Int -> Int でINT型を引数にとってInt型を返す関数が創れるそうです。便利。

体力が尽きた/(^o^)\

研究の発表が明日じゃなかったらもうちょっとswiftやりたかった……木曜日くらいに続き書きますー。

研究生活、始めました

はじめましての方は、はじめまして。そうでない方はお久しぶりです。@bussorenreです。 この度、紆余曲折ありまして、大学四年になりました。四年生といえば、そう、研究活動なのですが、そこで得られた知見とか意見とか、読書ログとか、そういうのを残していくことにしました。

5月18日(今日の日付)から2月末くらいの卒業論文発表の日、卒業式くらいまで頑張って更新していきます。

自己紹介

General Info
  • Name - @bussorenre - (´・Д・)
  • University - 立命館大学 情報理工学部 (Ritsumeikan University, Major in Information Science )
URLs - no public information
Languages and skill Levels

"skill level" has 5 grade, 1 (beginner), 2(grammar), 3(no references), 4(responsible developer) and 5(wizard).
スキルレベルは大体はてなの採用基準を参考に改良しました。Cと日本語くらい5になりたいね。

ブログに研究活動を公開する理由

  • 研究活動の見える化
    大学生ってこういう風に研究してるんやーって見せるため(主に中高生とか)
  • 自己啓発。自己牽制。炎上抑止力の向上
    節度あるインターネットリテラシーをつけるため。大勢がネットを使い始めて、ノリでなんとかなる時代じゃなくなってきた。
  • 意見とか反応を得るため
    情報発信による更なる情報収集のスパイラルを狙う。(おかしいと思ったらコメントしてください><;)
  • 売名行為
    はい。売名です。売名なので、価値がある事を研究・調査して、書くというミッションを持っています。緊張感を持つためでもあります。
  • Open な活動への貢献
    Open Source や Open Education の活動に少しでも貢献出来たらいいなと思ってますがあくまで願望。世界に貢献するのはエンジニアの基本。

公開することによる懸念点とか

プライベートの管理をどうするか

大学に存在するプライベートな情報(外に出しては行けない情報)や、関係者個人に関わる情報は当然出せませんし出しません。万が一私の判断ミスで掲載してしまっていた事が発覚した場合、掲載を取り下げた上で関係各所に平謝りしに行く。 また、私個人のプライベート情報も出来る限り制限をかける。特にfacebook と LINEは絶対に公開IDにしない。

研究のアイデアが奪われてしまって勿体無いのでは

所詮、私は中堅私立大学の学部生なので、そんな夢みたいな超すごい事が自分にできるとは思っていない。公開してアイデアを奪われたりする危険性よりも、情報を発信しないデメリットのほうが大きいと考えた。夢みたいな話であるが、第三者から評価され、「パクルに値する研究」になった場合は色々ブログの方針を変えるかもしれない。

ちゃんとブログ更新するよね

頑張ります!!!!!!

研究概要

詳細は未定ですが方向性だけはとりあえず決定。

背景と問題意識

MOOCs(Massively Open Online Courses )の登場により、素晴らしい学習教材がオープンで提供されるようになったが、それらを用いて修了出来る受講者は登録者の約5%しか存在しない。MOOCsや反転授業は、学習者の学習意欲の上に成り立つ物であり、学習意欲が低い者には更なる学習定着率の低下を生むことになることが容易に予測される。如何に学習者のモチベーションを維持し、学習意欲を高めるかがMOOCs を始めとした、21世紀型教育の成功の鍵となると思われる。

対象

学習の動機付け

研究活動の目標

  • 海外実験に連れて行ってもらう
  • 後援会の奨学金が出るくらいには頑張る
  • 卒業する

こんな感じで1年間頑張っていこうと思います。よろしくお願いしますm(_ _ )m

Life is like BDD

こんにちは。@bussorenre です!最近Twitter を使うことがめっきり減りましたが、それでも@bussorenre です。よろしくお願いします!

さて、ここ一週間ほど”テスト”について勉強していました。というのも、自分の書くコードがもうクソすぎてクソすぎてやばかったので、抜本的な解決を図りたいと思い、テストについて勉強しました。RSpec Book と アジャイルサムライが僕の今の教科書です。

テストの超重要性についてものすごい勉強した所で、今必死にプロジェクトのテストコードを書き直しているところなのですが、ふとこんな時間になって思いました。

多くの人の人生ってウォーターフォール開発のようなもの。

海外ではどうか知りませんが、日本人はよく「人生設計」って言葉や、最近だと「キャリア」って言葉をよく使います。就活生だけかもしれませんが!!

最近の大学生は、入学直後にも、研究室に配属される時も、就職活動するときに「将来いついつにこうなってこうしてこうしてこれを(ry」って言うことを設計させられます。例えば、

22歳で卒業して就職して、28歳くらいで結婚して、30歳くらいで子どもを産んでもらって、60歳までバリバリ頑張って。みたいな。で、ソレを達成するために大学でどういう勉強してー就職こういう感じでーとかどうとか。

で、計画を立てたら、実行するわけですよ。これを。ちょっとでも違うルートの生き方をしようとすると社会からのはみ出し者みたいなレッテルを張られるから、みんな必死でこの通りに生きるわけですよ。それが、まぁ、例の滑稽な就活みたいなのを生み出すのかもしれませんが。

なんか、これって、ウォーターフォール開発みたいじゃないですか??途中で仕様変更が許されない恐ろしい人生開発。

世界は常に変化しているのにね。だから行き詰まって、鬱になったり閉塞感感じたりするんじゃないかな…??

ということで、人生をBDDとして考えよう

僕はかなりの欝思考の持ち主で、自殺を試みる事が何度もある。そのたびに、僕はよく「死に方」を意識して踏みとどまる。死とは自分の人生開発の完成を意味する。と思う。死とはこの世で最も完璧で美しい存在だ。よく、アーティストが人生の事を作品と捉えるが、アレと同じ考え方だろう。

つまり、人間はひとつの人生を完成させるために生きて死ぬのだと。

そして、これはアーティストに限らず、僕のようなエンジニアにも同じような考え方を当てはめることが出来る。

決められた時間(僕は多分80年くらいに死ぬのかな?)の中で最も素晴らしいプロダクトを生み出す。

大事なのはその過程ではなく、その成果なのだ。だって、僕らはいつ死ぬかわからないのだから、常に最高の成果を上げていなければならない。この辺は「常に動作するソフトウェアを提供する」というアジャイルな原則に似ていると思う。いつ終りが来るかわからないプロジェクトに、ウォーターフォールモデルを採用するのはおかしいよね。

一年を1イテレーションと考えると、新年の終わりと始まりに反省と計画を考える文化が世界中にあるのも納得出来る。まぁ、正直このイテレーションは大きすぎると思うので、僕はもうちょっと小さいイテレーション(クオーター制くらい)がいいと思うけど。笑

そして僕らは出来る限り無駄を省かなければならない。人生は限られているのだから、最小の労力で最大の効果を上げる必要がある。

よく聞く例が、「大学4年行ったけど、正直したい事じゃなかったんだよね。だから本当にしたい事するためにもっかい行くわ!」みたいな。これはこれで、僕は非常にいい選択だと思う。間違いに気がついたのだから、4年はロスするかもしれないけど、後々絶対いいプロダクトになるから。ここで、計画の変更は許されないから、このまま就職しようなんてなったら、なんで自分はこの仕事しているんだろうっていう意味のない悩みに悩まされ続けるんだろうな−とか思う。で、気がついた時には修正が間に合わなくなってしまう。それではダメだ。

人間はひとつのオブジェクトのようなものだ。あるメッセージに対して、どのような振る舞いを返すかが、その人の価値を決める。この価値は給与かもしれないし、人からの信頼かもしれないし、恋心かもしれないけれど、要は、人間は人間の振る舞いを評価する。その中身がどうなっていようが、知りようもないし、どうでもいいから。

だから人間は最初、習慣っていう物を身につけて、振る舞いを無理やり構築する。Red→Green の段階だ。これが子供時代にうまくできているといいんだろうけど、僕みたいに全然出来てない奴も居る。Green になろう!笑

テストが通り、Green になったら、次はリファクタリングをする。つまり、中身の改善。そのために知識をみにつけたり、色々な本を読んで色々な考え方を知ったり、自己を磨く。

で、出来たら、新しい仕様を身につけたりする。イテレーション毎にこの繰り返し。

なんか、人生って、BDD みたい。 いや、BDDが人生みたいなのか?? 

何を作ってもいい仕事なんて、なかなか無い。だったら、自分の本当に創りたいものを創るのが一番幸せ。 そしてソレが世界の役に立つなら尚更のこと。

人生ってきっとそういうことなのかもしれない。

ってBDD勉強しながら思った。

omniauth+fb_graph でfacebookのウォールに投稿する

こんにちは。@bussorenreです。 表題の通り、Ruby on Railsfacebook のウォールに投稿するための記事が日本語でも英語でもパッと見つからなかったので、自分でまとめてみました。

開発に使っている環境は以下のとおりです。

  • Ruby 1.9.3
  • Ruby on Rails 3.2.12
  • Mac Book Air (Mountain Lion)
  • 最終確認日:2013年3月16日

なお、今回はfacebook との認証のためにomniauthを使いますが、別にdeviseを使っても問題ないです。要はAccess_token が取得出来ればいいので…。

1 プロジェクトを作成する

rails new facebookpost

今回はfacebookpost という名前のプロジェクトを使用します。 githubにて今回のサンプルを公開しているので、良ければぜひお使いください。

https://github.com/bussorenre/facebookpost

2. Gemfile の修正

プロジェクトを作成したら、次にGemfile を開き以下の文句を追加します。

gem 'omniauth'
gem 'omniauth-facebook'
gem 'fb_graph'

Facebook に投稿する便利なgemは他にkoala などもあります。書き終わったらbundle installで。

3. ログインに用いるUser model の作成

次にUser model を作成します。今回はfacebook 認証でのみログインするような形のUserModel です。E-mailや、password などを実装したいときはこれに別途追加する形で問題ないと思います。

rails g scaffold users name:string facebookid:string desc:text token:text
rake db:migrate

本当はscaffold で生成するのではなく、ちゃんとuser model を作成して、用途に合わせてコントローラーを作るべきですが、今回はサンプルなので細かいことは気にしない。

僕はここで最もハマりました。 理由・原因は全くよくわからないのですが、アクセストークンを保存するフィードを、access_token:string にしたら一切動かなくなりました。名前が悪いのか、string だったのが悪いのか謎です。どなたか教えていただけると幸いです。

で、出来上がったmodel/user.rb に以下の文言を追加(バリデーションです)

VALID_FACEBOOKID_REGEX = /^[1-9][0-9]*$/
validates :name, presence: true,
                 length: { maximum: 48 }
validates :facebookid, presence: true,
                      format:     { with: VALID_FACEBOOKID },
                      uniqueness: { case_sensitive: false }
validates :token, presence: true

バリデーションはざっとこんな形。複数ユーザーが登録しないように、facebookid にはユニークな値のみ通すよう設定

4. facebook APPの作成

https://developers.facebook.com/ に飛んで、Facebook アプリを作成します。

f:id:bussorenre:20130312181201p:plain

Apps →アプリを作成を押します。

f:id:bussorenre:20130312181458p:plain

こんな感じで、アプリの名前とネームスペースを決定します。heroku で動かすときは、このチェックボックスを入れるといいかもしれません。

すると、App ID とApp Secret が生成されます。これ絶対使うので、他の人に知られないようにしてくださいね。

次に、callback のURL を指定します。

f:id:bussorenre:20130312182321p:plain

ざっとこんなかんじに。

次に、権限の付与をします。

f:id:bussorenre:20130312181823p:plain

Twitter と違い、facebook には非常に多くの権限フラグがあります。必要最小限のフラグのみを立てるようにしましょう。 自らのウォールに投稿したい場合のフラグは図の通り。もしかしたら余計なのが多いかも(email とか絶対要らない。

5. Omniauth によるログイン認証の実装

http://npb.somewhatgood.com/blog/archives/715 完全にこのサイトを参考にしました。すごいいい記事。

omniauth を用いてfacebook 認証をします。まず、config/initializers/omniauth.rb を新規作成し、以下のようにコードを書きます。

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook,"App ID","App Secret", scope: 'email,publish_stream'

end

ここのApp ID と App Secret は先程取得したものを各自書いてください。 もっとも大事なのは、アプリ側で権限をしっかり明記すること。これに僕は4時間くらいハマりました笑

次に、facebookログインへのリンクを作ります。これはどこに書いてもいいのですが、参考にした記事を見習ってviews/layouts/application.html.rb に書くことにしました。

  <div id="user_nav">
    <%= link_to "facebookでlogin", "/auth/facebook" %>
  </div>

次に、facebook からのcallback を受け取るアクションを作成します。今回はめんどくさいので、scaffold で生成した既存のUsers#new に当てようと思います。

config/routes.rb に以下のような文句を書きます。

  resources :users    # 多分書き込まれている
  root :to => 'users#index'

  match "/auth/:provider/callback" => "users#new"

書き換えたら、最後に、User Controller の編集。new アクションを大いに書き換えます。

def new
  @user = User.new

  # omniauth の情報を取得
  auth = request.env["omniauth.auth"]

  # ユーザーを探す
  if auth['provider'] == 'facebook'
    user = User.find_by_facebookid auth['uid']
  end

  # ユーザーが入ればそのユーザーでログイン
  # 今回はログイン処理省略

  # ユーザーがいなければ新規登録画面に移動
  @user = User.new

  if auth['provider'] == 'facebook'

    @user.facebookid = auth['uid']
    @user.name = auth['info']['name']
    @user.desc = auth['info']['description']
    @user.token = auth['credentials']['token']

    # fb_graph テスト
    me = FbGraph::User.me(@user.token)
    me.feed!(
      :message => 'Facebook に投稿するアプリのテスト!',
      #:picture => 'https://graph.facebook.com/matake/picture',
      #:link => 'https://github.com/bussorenre',
      :name => 'facebook Post Sample',
      :description => 'Facebook に投稿するアプリのサンプル'
    )
  end
end

(サンプルを作るのがめんどくさくなってきたので)アカウントの作成時に、facebook に投稿しちゃうことにします。(本当は# fb_Graph のテストという部分は、create アクションの中でやるべき。

omniauth がfacebook から持ってくる情報は、全部request.env["omniauth.auth"]に入っているので、そこからユーザー情報を全部引き出します。

そして、そのtoken を元に、Facebook への投稿を行います。ここでようやくFbGraph の登場。

Fb_graph に関しては公式のドキュメントが非常に充実しているので、詳しくはこっちを見て欲しいのですが(英語だけど全然読める!)フィードに流すための方法は上記のような感じです。簡単!