株匏䌚瀟LIFULLのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟LIFULL

株匏䌚瀟LIFULL の技術ブログ

å…š664ä»¶

Apple原理䞻矩者の倧坪です。 「Google先生に"Facebook Paper Origami"日本語蚘事でお䌺いをたおた結果が䜕故これほど少ないのか」 ず疑問に思う今日この頃です。ひょっずしお私䞀人だけが錯乱しおいるのでしょうか。 ずいう根本的な疑問からは目をそらしお、昚日芋぀けた文章に぀いお玹介したす。 Paperでもっずもわかりやすい「新むンタラクション」はiPhoneを傟けるこずで、画面より倧きな画像を閲芧する“tilt-to-explore”でしょう。䞋の動画の52秒あたりから それが初めお披露された時の様子は以䞋のようだったずのこず。 “Everyone’s jaws just dropped,” remembers Michael Reckhow, who was sitting beside Matas that afternoon. “Everyone started exchanging these glances that were like: ‘What did he just do?’” 匕甚元 Facebook Paper Has Forever Changed the Way We Build Mobile Apps | Wired Enterprise | Wired.com いいかげんな蚳Matasの隣に座っおいたMichael Rechhowはこう語る。「みんな顎が倖れるほど驚いた。お互い顔を芋合わせお”今圌はなにをやったんだ”ず蚀わんばかりだった」 しかしここで驚くべきはその結果だけではない。"tilt-to-explore"を開発したMike Matasはプログラマヌではなく、Objective-Cは知らない。圌はOrigamiを䜿っおそのプロトタむプを䜜り䞊げたのです。 プロトタむプ䜜成にOrigamiを䜿うこずのメリットは、このように衚珟されおいたす。 “With your typical programming language, you have to type in a bunch of code and hit ‘compile,’ and a minute later, you see what you built,” he says. “It’s almost like you’re trying to learn how to play the piano and you have a piano where you hit a couple of keys and then hit a compile button and a minute later you hear what you played.” Origami changes this. 匕甚元前掲蚘事ず同じ 普通のプログラミング蚀語では、山ほどコヌドを曞いお「コンパむルボタン」を抌す。するず䞀分埌にその結果をみるこずができる。これはたるでピアノの緎習をしおいるのに、鍵盀を叩いおから䞀分埌に音が聞こえるようなもんだ。Origamiはこれを倉えた。 OrigamiはQuartz Composerで䜜られおおり、パラメヌタやパッチ「䜕か」をしおくれる単䜍ですの結合やパラメヌタを倉曎すれば、即座にその結果が動䜜に反映される。このツヌルを䜿っおの"tilt-to-explore"の開発はこんな颚に行われたずのこず。 Matas had the idea one evening at home — after attempts to add an automatic “Ken Burns effect” to Paper failed to, well, pan out — and the next morning, he spent a few hours mocking it up with Origami. 匕甚元前掲蚘事ず同じ 自動的に Ken Burns Effect が぀くような機胜を実珟しようずしお倱敗した埌、 Matasは家で良いアむディアを思い぀いた。そしお次の朝数時間䜜業しおOrigamiのtilt-to-exploreのモックを䜜り䞊げた。 さお、ここからは 「そうかヌ。デザむナヌの皆さん、Origami䜿っおがんばっおねヌ」 ず他人ごずのように考えおいた゚ンゞニアの皆さんの顔が青くなるような話がでおきたす。 Paperの実装方法を考えおいお気が぀いたのですが、あのアプリは芋かけよりずっず耇雑にできおいる。少なくずもApple暙準郚品を持っおきお「はいできたした」ずいう類のものではない。 *1 Engineer達は、そのアプリを䜜り䞊げるためにOrigamiずは別のTool-Tweakずいう名前-を䜜り䞊げたそうです。このツヌルはただ公開されおいたせん There are times when the app runs literally dozens of physics simulations that all work in concert — Grant worked on an animation that involved 42 virtual springs — and Tweaks provides a way of instantly changing the behavior of each and every one of these simulations. 匕甚元前掲蚘事ず同じ アプリ内郚ではお互いに協調しあう物理シミュレヌションが䜕ダヌスも同時に動いおいるこずがある。䟋えばGrantは仮想的なバネが42個必芁なアニメヌションを䜜ったこずがある。Tweakを䜿えば、そうした蚈算のパラメヌタを即座に倉曎するこずができる。 初期バヌゞョンのPhoto Viewerは、車の䞭で䜿うず振動やら加速床で倉な動きをしたずのこず。 “When we first built it, it felt pretty good in your hand,” he says. “But we noticed that, the more places we took it, it began to fall apart.” With Tweaks, as he rode home on the Facebook shuttle, he could instantly adjust and readjust the filters used to eliminate any irrelevant movement, identifying what worked and what didn’t without having to rebuild and recompile. 匕甚元前掲蚘事ず同じ 最初に䜜った時、普通に䜿うぶんには䞊手く動いた。しかしいろんな堎所で䜿っおみるず問題が芋぀かった。垰宅するために乗っおいたFacebookシャトルバスの䞭で、Tweakを䜿いコンパむルなしでフィルタヌの調敎を行い、䜕がうたくいっお䜕がうたくいかないかを芋぀けるこずができた。 シャトルバスの䞭でそんなデバッグしたら車酔いするじゃないか、ずか蚀っおいる堎合ではありたせん。ただ芳ぬtweakを䜿えば、どこでもパラメヌタチュヌニングができおしたうのです。぀たり圌らは 「こんな耇雑なモデルのデバッグは倧倉だから、モデルを簡単にしよう」 ではなく 「こんな耇雑なモデルのデバッグは倧倉だから、デバッグを簡単にするツヌルを぀くろう」 ず考え実際に䜜ったわけです。 Ok, ゚ンゞニア同士諞君。話はただ終わっおいない。 このように、Paperの動䜜は、かなり耇雑な蚈算の䞊に成り立っおいるので通垞のアプリの䜜り方ではうたく動かないずのこず。UIに関連するタスクは党お同䞀CPUコアで動かし、他のタスクは別のコアに任せる必芁がありたす。そうした「タスク毎のCPUコアぞの割圓」を柔軟に行うため、圌ら自身でアプリ゚ンゞンを開発したそうです。名前はないそうですが この名無しのアプリ゚ンゞンを䜿えば、どのタスクをどのコアに割り圓おるかが现かく制埡できる。これによっお、写真をスクロヌルしおいくずきに、前の写真がただ開き終わっおないうちに凊理を䞭断し、別のCPUコアでデコヌドした画像をスムヌズに衚瀺できるずのこず。぀たり圌らは 「このむンタラクションは今のCPUじゃスムヌズに動かないから、止めよう」 ではなく 「このむンタラクションは今のCPUじゃスムヌズに動かないから、動かす為の゚ンゞンを䜜ろう」 ず考え、実行した蚳です。 圌らが䜜り䞊げたツヌルはOrigamiだけではなかったのですね... などず曞いおいるずだんだん気が滅入っおきたす。あれですよ。 マリアナ沖海戊 の前に日本の造船所で䞀生懞呜空母を䜜っちゃいるけれど、倪平掋の向こう偎では䞀週間に隻空母が竣工しおいたような状況を思い浮かべたりするわけですよ。 いや、倧䞈倫。別に我々はFacebookず喧嘩をしおいるわけではない。Tweakや名無しのアプリ゚ンゞンもい぀かきっずOpen Sourceずしお公開されるこずでしょう。それらを䜿い、デザむナヌず゚ンゞニアがideaず知恵を合わせれば、きっずPaperチヌムが「公開するんじゃなかった」ず埌悔するようなむンタラクションが実装できるに違いない,,ず無理矢理か぀前向な蚀葉をもっおこの文章を締めくくるのでした。 *1 : 具䜓的にどう耇雑かは こちらのペヌゞ を参照しおください。
叀川です。 前回 から少し時間がたっおしたいたしたが、独自゜ヌトを実珟の続きで、search component plugin を䜿っお実珟する方法を、二回に分けお玹介したす。solr が持っおいる怜玢の機胜をすべお満たした実装は難しいので、 他のコンポヌネントずの組み合わせ グルヌピング凊理 分散怜玢 はあきらめお、ずにかく怜玢にヒットしたドキュメントを望みの順番で返すこずができるsearch component を䜜成するこずを目的ずしたす。 今回はたず、solr の search component plugin の䜜り方を玹介したす。前回ず違い、ずりあえずこうすれば動いたずいう感じなので、間違えおいる点あれば、ご指摘いただければ幞いです。 Search Component の䜜成 solr におけるデフォルトの怜玢コンポヌネントは、SearchComponent クラスを継承しお実装されおいたす。 solr/core/src/java/org/apache/solr/handler/component/SearchComponent.java SearchComponent.java のコヌドを芋るず、以䞋4぀の関数を実装すればよいこずが分かりたす。 public abstract void prepare(ResponseBuilder rb) throws IOException; public abstract void process(ResponseBuilder rb) throws IOException; public abstract String getDescription(); public abstract String getSource(); 次に、Solr の怜玢コンポヌネントの本䜓 QueryComponent.java をベヌスに、分散ず、グルヌピングに関連する郚分を陀いたクラス MyQueryComponent.java を䜜成したす。 solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java package jp.co.homes.searchcomponent; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.*; import org.apache.solr.common.util.NamedList; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.ResultContext; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.schema.FieldType; import org.apache.solr.search.QParser; import org.apache.solr.search.QParserPlugin; import org.apache.solr.search.QueryParsing; import org.apache.solr.search.ReturnFields; import org.apache.solr.search.SolrIndexSearcher; import org.apache.solr.search.SolrReturnFields; import org.apache.solr.search.SyntaxError; import org.apache.solr.handler.component.SearchComponent; import org.apache.solr.handler.component.ResponseBuilder; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; public class MyQueryComponent extends SearchComponent { public static final String COMPONENT_NAME = "my_query" ; @Override public void prepare(ResponseBuilder rb) throws IOException { SolrQueryRequest req = rb.req; SolrParams params = req.getParams(); if (!params.getBool(COMPONENT_NAME, true )) { return ; } SolrQueryResponse rsp = rb.rsp; ReturnFields returnFields = new SolrReturnFields( req ); rsp.setReturnFields( returnFields ); int flags = 0 ; if (returnFields.wantsScore()) { flags |= SolrIndexSearcher.GET_SCORES; } rb.setFieldFlags( flags ); String defType = params.get(QueryParsing.DEFTYPE, QParserPlugin.DEFAULT_QTYPE); String queryString = rb.getQueryString(); if (queryString == null ) { queryString = params.get( CommonParams.Q ); rb.setQueryString(queryString); } try { QParser parser = QParser.getParser(rb.getQueryString(), defType, req); Query q = parser.getQuery(); if (q == null ) { q = new BooleanQuery(); } rb.setQuery( q ); rb.setSortSpec( parser.getSort( true ) ); rb.setQparser(parser); rb.setScoreDoc(parser.getPaging()); String[] fqs = req.getParams().getParams(CommonParams.FQ); if (fqs!= null && fqs.length!= 0 ) { List<Query> filters = rb.getFilters(); filters = filters == null ? new ArrayList<Query>(fqs.length) : new ArrayList<Query>(filters); for (String fq : fqs) { if (fq != null && fq.trim().length()!= 0 ) { QParser fqp = QParser.getParser(fq, null , req); filters.add(fqp.getQuery()); } } if (!filters.isEmpty()) { rb.setFilters( filters ); } } } catch (SyntaxError e) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); } } @Override public void process(ResponseBuilder rb) throws IOException { SolrQueryRequest req = rb.req; SolrQueryResponse rsp = rb.rsp; SolrParams params = req.getParams(); if (!params.getBool(COMPONENT_NAME, true )) { return ; } SolrIndexSearcher searcher = req.getSearcher(); if (rb.getQueryCommand().getOffset() < 0 ) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "'start' parameter cannot be negative" ); } long timeAllowed = ( long )params.getInt( CommonParams.TIME_ALLOWED, - 1 ); SolrIndexSearcher.QueryCommand cmd = rb.getQueryCommand(); cmd.setTimeAllowed(timeAllowed); SolrIndexSearcher.QueryResult result = new SolrIndexSearcher.QueryResult(); searcher.search(result,cmd); rb.setResult( result ); ResultContext ctx = new ResultContext(); ctx.docs = rb.getResults().docList; ctx.query = rb.getQuery(); rsp.add( "response" , ctx); rsp.getToLog().add( "hits" , rb.getResults().docList.matches()); } @Override public String getDescription() { return "my query component" ; } @Override public String getSource() { return "$URL: dummy $" ; } } コンパむル 以䞋のjarファむルにpathを通しお、䞊蚘ファむルをコンパむルしお、homes-serch-component.jar を䜜成したす(jar ファむル名は䜕でも構いたせん) solr-4.6.1/example/solr-webapp/webapp/WEB-INF/lucene-core-4.6.1.jar solr-4.6.1/example/solr-webapp/webapp/WEB-INF/solr-core-4.6.1.jar solr-4.6.1/example/solr-webapp/webapp/WEB-INF/solr-solrj-4.6.1.jar 蚭定 前回同様、䜜成したjarファむルをcollection1フォルダのlib以䞋にコピヌしたす。 cp homes-function-search-component.jar solr-4.6.1/example/solr/collection1/lib solrconfig.xml の、hilighting コンポヌネント蚭定の埌に、今回䜜成した MyQueryComponent にアクセスするための蚭定を远加したす。これで、 http://localhost:8983/solr/collection1/my_select にアクセスするずMyQueryComponentにク゚リが枡されるようになりたす。 <searchComponent class = "solr.HighlightComponent" name = "highlight" > <highlighting> <!-- 省略 実際にはhighligの蚭定がある--> </highlighting> </searchComponent> <!-- 远加分 --> <searchComponent name = "MyQueryComponent" class = "jp.co.homes.searchcomponent.MyQueryComponent" /> <requestHandler name = "/my_select" class = "solr.SearchHandler" > <arr name = "components" > <str> MyQueryComponent </str> </arr> </requestHandler> 動䜜確認 solr を起動したす。solr には前回投入したむンデックスが既に存圚しおいるず仮定したす。 cd ./solr-4.6.1/example java -jar start.jar & 通垞のsolr怜玢selectず、新しく䜜成したmy_selectの怜玢結果が同じであるこずを確認したす。 select http://localhost:8983/solr/collection1/select?echoParams=none&q=*:*&fl=x,y,myfunc(x,y,1,2,3,4,5,6)&sort=x asc,y desc <result name = "response" numFound = "1000006" start = "0" > <doc> <str name = "id" > id828205 </str> <float name = "x" > 0.0 </float> <float name = "y" > 999.0 </float> </doc> <doc> <str name = "id" > id91438 </str> <float name = "x" > 0.0 </float> <float name = "y" > 998.0 </float> </doc> <doc> <str name = "id" > id628349 </str> <float name = "x" > 0.0 </float> <float name = "y" > 998.0 </float> </doc> </result> my_select http://localhost:8983/solr/collection1/my_select?echoParams=none&q=*:*&fl=x,y,myfunc(x,y,1,2,3,4,5,6)&sort=x asc,y desc <result name = "response" numFound = "1000006" start = "0" > <doc> <str name = "id" > id828205 </str> <float name = "x" > 0.0 </float> <float name = "y" > 999.0 </float> </doc> <doc> <str name = "id" > id91438 </str> <float name = "x" > 0.0 </float> <float name = "y" > 998.0 </float> </doc> <doc> <str name = "id" > id628349 </str> <float name = "x" > 0.0 </float> <float name = "y" > 998.0 </float> </doc> </result> グルヌピングや、分散怜玢以倖は同じはずなので、圓たり前ですが同じ結果が取埗できおいたす。 次に、グルヌピングを行うク゚リを実行しおみたす。 select http://localhost:8983/solr/collection1/select?group=true&group.field=x&echoParams=none&q=*:*&fl=x,y,myfunc(x,y,1,2,3,4,5,6)&rows=2 <lst name = "grouped" > <lst name = "x" > <int name = "matches" > 1000006 </int> <arr name = "groups" > <lst> <float name = "groupValue" > 1.0 </float> <result name = "doclist" numFound = "997" start = "0" > <doc> <float name = "x" > 1.0 </float> <float name = "y" > 4.0 </float> <float name = "myfunc(x,y,1,2,3,4,5,6)" > 87.0 </float> </doc> </result> </lst> <lst> <float name = "groupValue" > 2.0 </float> <result name = "doclist" numFound = "975" start = "0" > <doc> <float name = "x" > 2.0 </float> <float name = "y" > 5.0 </float> <float name = "myfunc(x,y,1,2,3,4,5,6)" > 138.0 </float> </doc> </result> </lst> </arr> </lst> </lst> my_select http://localhost:8983/solr/collection1/my_select?group=true&group.field=x&echoParams=none&q=*:*&fl=x,y,myfunc(x,y,1,2,3,4,5,6)&rows=2 <result name = "response" numFound = "1000006" start = "0" > <doc> <float name = "x" > 1.0 </float> <float name = "y" > 4.0 </float> <float name = "myfunc(x,y,1,2,3,4,5,6)" > 87.0 </float> </doc> <doc> <float name = "x" > 2.0 </float> <float name = "y" > 5.0 </float> <float name = "myfunc(x,y,1,2,3,4,5,6)" > 138.0 </float> </doc> </result> グルヌピング関連の郚分を削陀したので、my_select の方は、groupを指定しおも、通垞の怜玢が行われおいるこずが分かりたす。 たずめ グルヌピングや分散凊理を陀けば、SearchComponent は意倖ずシンプルな構造でした。次回は、MySearchComponent.java に 以前 玹介した 自䜜のCollectorクラスを䜿う方法を組み蟌んで、独自゜ヌトを実珟したす。
サムです。前回の「 GameController.frameworkを぀かっおG550ゲヌムパッドずSpriteKitゲヌムを接続しおみよう 」に匕き続き今回は、接続したG550のボタンに応じたむベントを取埗しおみたす。 0. 前回たで GameController.frameworkを぀かっおG550ゲヌムパッドずSpriteKitゲヌムを接続しおみよう 1. ポヌズリスタヌト䞀時停止ず再開のむベント たず、すべおのゲヌムコントロヌラには、ポヌズボタンがありたす。 このボタンはほずんどのゲヌムでは、ゲヌムの䞀時停止、および再開ずいうむベントが走るず思いたす。 このむベントには、コントロヌラオブゞェクトの controllerPausedHandler プロパティにブロック凊理を远加するこずで可胜になりたす。 GameController.framework自䜓には、ゲヌムの䞀時停止におけるナヌザむンタヌフェヌスは提䟛されおいたせん ポヌズボタンを抌したずきのゲヌム停止などは、自分たちで実装する必芁がありたす。 2. A/B/X/Yボタン、Dパッド、L/Rトリガヌのむベント 今回䜿甚しおいるゲヌムコントロヌラは G550 です。このコントロヌラは GCGamepad クラスを䜿いたす。 他にも GCExtendedGamepad クラスずいうGCGamepadクラスず比べるず、ボタン数が倚いゲヌムコントロヌラもありたす。 すべおのボタンのむベントを取埗するには、 GCGamePad オブゞェクトの valueChangedHandler プロパティにブロック凊理を远加するだけです。 この凊理では、ボタンが抌されるたびにむベントが発生しお、抌されたボタンの凊理が実行されたす。 ボタンの同時抌しなどのむベントを蚭定したいずきに぀かいたしょう ボタンごずのむベントを蚭定したい堎合は、ボタンオブゞェクト自䜓に valueChangedHandler プロパティにブロック凊理を远加するだけです。 これで、ボタンのステヌタスを芋匵るこずが出来たす。 たずめ ゲヌムコントロヌラは、 GCGamePadクラスだけではなくGCExtendedGamepadクラスも必ず実装 したしょう 䜕のコントロヌラを䜿うかは、ナヌザが決めるこずですからね。 これらの゜ヌスコヌドは GitHubで公開 しおおりたす。 参考、匕甚元 Apple Developer - Game Controller Programming Guide
こんにちわ、瀟内でアゞャむル掚進をしおいる非゚ンゞニアな鈎朚です。 2014/3/19 第2回「 Scrum Masters Nightスクラムマスタヌズナむト 」の参加レポヌトです。 今回はダフヌ株匏䌚瀟さんのオフィスで開催、同䌚堎で行われた懇芪䌚もスポンサヌ付きで「タダ」これは参加するしかありたせん。ずいうこずで行っおきたした 基本的に 第䞀回目 ず同じオヌプンスペヌス方匏で行われたした。 今回は最初のテヌマずしお、 チヌムのメトリクスに぀いお スプリントゎヌル(ストヌリヌ)どうしおたすか スクラムマスタヌのキャリアパス チヌムがプロセスを気にするためにどうすればよいか が遞ばれたした。 どれも気になるテヌマではあったのですが、「スクラムマスタヌのキャリアパス」を遞択したした。 スクラムマスタヌのキャリアパス たずテヌマの背景ずしおあったのが、同じような圹割の人を増やしたいが、スクラムマスタヌの先のキャリアが芋えない。 キャリアを重ねた先に個人ずしお、䌚瀟ずしお䜕があるのかずいう疑問です。 スクラムマスタヌには次の2タむプがいるず思いたす。 チヌム䞭からスクラムマスタヌずいう圹割をたかされたタむプ 掚進圹やコヌチずしおスクラムマスタヌを専任しおいるタむプ どちらも初期段階はチヌムを成功に導き、スクラム開発を導入しおいく。 そしお、少しず぀スケヌルを倧きくしおいく。コヌチであれば、埌任者を育おるなどなど。 けれど、そうしお導入が枈み自己組織化が完党にされたら、スクラムマスタヌの仕事はなくなりたす。 ずするず、元の゚ンゞニアやプランナヌに戻るのかたた新たな珟堎を求めおさたよい歩くのか 完党な自己組織化ずいうのがあり埗るかはおいずいお・・・。 なんだか、やっぱり先が芋えたせんスクラムマスタヌ。 スクラムマスタヌの圹割 スクラムマスタヌはどんなチヌムや組織で圹割を果たしおいるのか、䜕をしおいるかずいう点に぀いおも話しをしたした。 スクラムマスタヌは手法が目的にならないように、 スクラムのプロセスを守る人 チヌムを新しい方向に導いお行く人 チヌムがよい仕事が出来るようにする人 倖的芁因からチヌムを守る人 などず、䞀般的に蚀われおいたす。 スクラムマスタヌは、チヌムの実行力や自己組織化を高めおいくのが圹割です。 ※䜆し、チヌム内でリヌダヌシップを発揮しおはならない。 そしお、「※」の郚分が重芁で、埓来型のリヌダヌずは異なったファシリテヌション胜力ずコミュニケヌション胜力が求められたす。たた、なにか具䜓的な成果物ずいうものは生み出したせん。 スクラムマスタヌのスキルパス そんなスクラムマスタヌに求められるスキルパスはどんなものでしょうか スクラム開発を含めたさたざたなフレヌムワヌクに関する知識 CIや開発基盀を改善する手法に関する知識 Fearless changeや組織パタヌンなどの組織に関する知識 コヌチング、ティヌチング、メンタリング、ファシリテヌションの胜力 謙虚さ 人たらし 組織やチヌムからの信頌 などなど、プロゞェクト管理に必芁な知識、盞手を気持ちよく動かすこずができる胜力ず気持ちを匕き出すコミュニケヌション胜力が必芁であるずいう意芋が出おきたした。 最終ゎヌルはマリッサ・メむダヌ では、そんなスクラムマスタヌのゎヌルは䜕でしょう Dreamforce 2013の蚘事 でYahoo!CEO マリッサ・メむダヌが、自身の仕事に぀いおこんな颚に語っおいたのが印象に残っおいたす。 なにか倧きなプランを立おお、それを瀟員にやらせるずいうこずではなく、どんなアむディアがあるのかを聞き、アむディアを実行するように蚱可するのが私の圹割。 道をクリアにし、障害物を取り陀き、仕事がやりやすいような環境を䜜るこず。チヌムが攻撃をしお、゚グれクティブがディフェンスをするこずが理想の姿 なんだかこれっおスクラムマスタヌ的ではありたせんか スクラムマスタヌを぀き぀めおいくず、チヌムのあり方だけではなく組織のあり方ずいうずころも考えなくおはなりたせん。 CEOは究極ですが、人材育成、評䟡制床、組織倉曎ずいった「組織のデザむン」たで行うのが最終目暙かもしれたせん。 やはり瀟倖の方ずの亀流は楜しい いろんなバックグラりンドの方ず同じテヌマで語るず、それたでずは違った芖点を芋぀けるこずができたり、自分の考えの敎理や裏付けができたす。 この経隓をその堎限りのものにせず、次のステップぞ぀なげおいくこずができるようになればず思いたした。 スポンサヌの耳元でささやいおくださった 高橋さん 、運営者のみなさた、参加者のみなさた、楜しい時間をありがずうございたした 次回は、4月21日に開催予定。 もちろん次回も参加したいです。ですが、い぀か匊瀟でも開催したいっなどず、次のステップぞ぀なげるための発蚀を残し぀぀、今回のレポヌトを終わりたいず思いたす。
サムです。今日はGameController.frameworkに぀いお軜く觊れたす。 GameController.frameworkは、MFiのiPhone/iPod/iPadずBluetoothたたは物理接続したコントロヌラの入力をアプリケヌション偎に受信できるものです。 そこで、2013/12/24にロゞクヌルから発売された「G550 パワヌシェル コントロヌラ + バッテリヌ」を䜿っお、SpriteKit + GameController.frameworkに぀いお曞きたす。 0. 今回の環境 OS X Version: 10.8.5 Xcode Version: 5.0.2 Development Target: 7.0 Devices: iPhone 5S, G550 1. GameController.frameworkの远加 Xcodeのプロゞェクトから TARGET > General > Linked Frameworks and Libraries で GameController.framework を远加したす。 2. import SKSceneクラスを拡匵しおあるシヌンにGameControllerを远加したす。 3. ゲヌムパッド甚のプロパティを宣蚀 たず、ゲヌムパッドのクラスオブゞェクトにはタむプありたす。 GCGamepad Class こちらはずおもシンプルなゲヌムパットクラスで、次のコントロヌルを結び぀けおいたす。 Two shoulder buttons. Four face buttons arranged in a diamond pattern. One directional pad (D-pad). GCExtendedGamepad 䞀方のGCExtendedGamepadクラスは、GCGamepadクラスずは事なり、より倚くのコントロヌルに関連しおいたす。 Two shoulder buttons. Two triggers. Four face buttons arranged in a diamond pattern. One directional pad. Two thumbsticks. G550はGCGamepadクラス甚のゲヌムパッド なので、次のように宣蚀したす。 4. ゲヌムパッドの接続、切断を怜出を通知するコヌドを远加 ゲヌムパッドは、Bluetoothで接続されおも、ケヌブルを介しお盎接接続されおも、ゲヌム䞊では同じように動䜜されたす。 ゲヌムパッドが接続たたは切断されたずきは、GameController.frameworkからNotificationが発生するので、これを受け取るセレクタヌを甚意したす。 この通知は、ゲヌムコントロヌラの接続切断が倉曎されるたびに呌び出されたす。 4-2. ワむダレスゲヌムパッドの堎合 ワむダレスコントロヌラは、通垞ゲヌムの倖で接続されたすBluetoothゲヌムパッドずかを利甚したずき そのため、ゲヌムの起動前に接続しおおくたたは、接続した埌にゲヌムを再起動する必芁がありたす。 けれども startWirelessControllerDiscoveryWithCompletionHandler クラスメ゜ッドを䜿うこずで、ゲヌム内でゲヌムパッド優先、無線含むを盎接接続するこずもできたす。 この怜出プロセスを実行するず、新しいコントロヌラが自動的に怜出され、ゲヌムパッドずしお接続されたす。 怜出プロセスは自動的にタむムアりト30秒くらいされたすが stopWirelessControllerDiscovery クラスメ゜ッドを呌び出すこずで、珟圚実行されおいる怜玢プロセスを停止させるこずができたす。 これらのクラスメ゜ッドは、 アプリケヌションで適切なナヌザむンタヌフェヌスを蚭蚈 しお、提䟛する必芁がありたす。 ※䟋えば、ゲヌム蚭定ずかに「ワむダレスコントロヌラず接続する」的な項目を远加したりずか たずめ 以䞊で、GameController.frameworkを䜿っおG500ゲヌムパッドに接続するこずができたす。 次回は、ボタンのむベントを取埗しおみようず思いたす。 これらの゜ヌスコヌドは GitHubで公開 しおおりたす。 参考、匕甚元 Apple Developer - Game Controller Programming Guide
Apple原ry) 倧坪です。 さお、 前回 はずにかくOrigamiを動かしたずころで終わっおいたした。今回は「ではRender in Imageの䞭では䞀䜓䜕をしおいるのか」に぀いお曞きたす。ずはいえここで曞くこずはかなりの掚枬が混じっおいたすので、間違っおいる点に぀いおはご指摘いただけるずうれしいのです。Render in Imageをダブルクリックするずこんな画面になっおいたのでした。 ここで描画したものが、iPhoneの画面䞭に衚瀺されおいたす。ではここでは䜕をしおいるのか。右䞋のほうから芋お行きたしょう。 たずClearパッチの順番がになっおいるので、最初に画面がクリアされたす 次に順番がであるずころの"Layer"パッチの内容が描画されたす。 "Layer"パッチのImageずいうずころには"Image"パッチから線が぀ながっおいたす。前回の最埌ではこの"Image”パッチに奜きな画像を指定したのでした。 ここだけみるず、指定した画像がiPhoneの䞭に衚瀺されるだけです。ではどのように「クリックで拡倧、瞮小」しおいるのかを芋お行きたしょう。 䞀番巊に"Interaction 2"ずいうパッチがあり青い線がLayerたで䌞びおいたす。このパッチはLayerに察しおナヌザが行った操䜜(クリックずかドラッグずか)を怜知しお教えおくれるもののようです。でもっおそのClickから線が䌞びお"Switch"の"Flip"にはいっおいる。぀たりここに䜕かが入っおくる床に、スむッチがOn/Offが切り替わる、ずいうこずなのでしょう。On/Offずいう出口から今床は"Bouncy Animation"のNumberずいう口に線が぀ながっおいる。 ここからは想像ですが、このパッチはNumberにはいった倀を元に「びよよヌん」ずいう倀倉化を぀けおくれるものではないか。Patch Inspectorを䜿っお䞭を芋るずFriction,Tensionずいう぀の倀がありたす。これを倉えるこずで「びよよヌん」の様子が倉わりたす。 でもっおその出口は"Transition"に぀ながっおいる。説明を読めば、Transitionは0からの間の倀を受け取っお、それをStart ValueからEnd Valueたでの倀に倉換するずのこず。Bouncy Animationは0からの間で倀をびよんびよんさせるのですが、画像の倧きさを衚すのにそれだけではこたる。ずいうわけでこのTransitionを䜿っお必芁な範囲の倀を取り出すわけです。 ずいうわけで、"Transition"の出口が"Layer"の"Scale"に぀ながっお、ようやくこれで 「画面をタップするたび、画像がびよよヌん、ず倧きくなったり小さくなったりする」 が実珟できたわけです。 理解を深めるために、ここからいじっおあれこれやっおみるずいいかもしれたせん。なんずいっおも「操䜜をするず䜕かの反応がある」のは楜しい。 䟋えばScaleパッチの出口の぀なぎ先をLayerパッチのSaleからAlphaにかえるず䜕がおこるか画像をタップする床に明るくなったりがんやりしたりするはずです。じゃあタップするず同時に明るさず倧きさを、、ず考えはじめるずFacebookが提䟛しおいるAlpha And Scaleに戻っおくるわけでした。ああ、長い道のりでした。 ここたで読んで、実際に䜕か手を動かしおくれる人がいるかどうかはなはだ疑問に思っおいるわけですが、次の事実は動かしようがない。 Paperで䜿われおいるほずんどのアニメヌションは、Origami䞊でプロトタむプされ、そのあず実際のアプリ開発を行うプログラマヌに枡された。 匕甚元 Facebook Develops A Photoshop For Interaction Design, And It's Free For Anyone To Use | Co.Design | business + design Facebook Paperを䜿っおいるず、现郚にたで考慮が行き届いおいるこずに驚きたす *1 。もちろん「あら」を探すこずは可胜です。しかしそれより良いものをデザむンするこずができるか、ず問うのはおそらく無駄ではない。 たた゚ンゞニアずしおは、その実装に驚くほどの工倫がなされおいるこずも感じ取れる。 Cocoacontrols を芋れば、いく぀かPaperに觊発されたモゞュヌルがあるこずがわかる。しかしそれらを䜿えばそのたたPaperができるわけではもちろんない。それどころか、Paperたでの距離の遠さを思い知らされるこずになりたす。 実はそうした掚枬が間違いではないこずを瀺す蚘事を芋぀け、愕然ずしおいるずころです。䞀人で愕然ずしおいるのは「もったいない」ので次はその内容に぀いお玹介できれば、ず。 *1 : 具䜓的には、 こちらのサむト で詳しく考察されおいたす
株匏䌚瀟ネクストの藀原です。 今からちょうど3ヶ月ほど前、「 クリ゚むタヌの日、ただいた開催䞭 - 株匏䌚瀟ネクスト ゚ンゞニアBlog 」におご玹介したした「 クリ゚むタヌの日 」ですが、ただいた、第4四半期(1月3月)の合宿期間䞭で、今回は12チヌム、34人のクリ゚むタヌが、新たなサヌビス・技術ぞのチャレンゞをしおいたす。 さお、「クリ゚むタヌの日」の掻動の趣旚ですが、 「既存サヌビス・技術の枠組みを飛び越えた自由な発想からむノベヌションの創造」 「各メンバヌの興味あるサヌビス・技術ぞのチャレンゞを通しおの個人の成長ずネクストの創出力向䞊」 この2぀を目的ずしお、最倧7日間を費やしお研究・開発を行っおいたす。 それでは、各チヌムの掻動状況の䞀郚をご玹介したす。 Node.jsチヌムはたずは二人でスタヌト。圧倒的な速床を目指したす。 こちらではArduino+Unityで光の怜知ずシミュレヌションをやっおいるようです。 センサヌに手をかざすず画面䞊には・・・ iPhoneアプリを䜜成䞭䜕かゲヌムをしおいるようにも芋えたすが・・・ もう䞀぀iPhoneアプリ。前回に匕き続きUXにこだわりを持ったアプリの開発䞭です。 開発䞭のものを芋せおいただきたしたが、すぐにでも䜿っおみたいず思いたした こちらは黙々ず䜜業䞭ですね。 テヌマは「レスポンシブりェブ」ずのこず。 ホヌムズくんの新しいコンテンツ䜜成䞭どんなものが出来䞊がるんでしょう こちらは、「クリ゚むタヌの日」サむトのリニュヌアルチヌム。 近々新しいコンテンツを皆さんにも芋おいただけるようにしたいですね  こんな感じで各チヌムそれぞれ思い思いの方法で、新しいサヌビスを生み出すこずや、新しい技術の取り組みに党力を泚いでいたす。今月末には成果報告䌚を実斜する予定で、どんなものが出来䞊がるのか、どんな新しいモノが芋られるのか、倧倉楜しみにしおいたす。
Apple原理䞻矩者の倧坪です。 Facebookが「むンタラクションデザむンのPhotoshop」を公開したぞヌず 驚いたのが月の始め 。さお䜿っおみようず思っおはみたけれど肝心のQuartz Composerの䜿い方を完党に忘れおいる。ずはいえ 「むンタラクションデザむナヌず名乗るからにはこれくらい䜿えなくちゃね」 などず蚀いっぱなしで終わるのはいかがなものかそもそもお前はい぀からむンタラクションデザむナヌに぀いお語れるようになったのだ、ずいう根本的は疑問は無芖 ずいうわけで、たずOrigamiを䜿うたでの手順を曞きたす。 自分が「正しいコンピュヌタ」を持っおいるこずを確認する。「正しいコンピュヌタ」ずはMacです。はお、Windows PCっおなんのこずですか錯乱 Origamiのペヌゞ に行く。ここからペヌゞの䞋半分に曞いおある手順です。 Appleの開発者登録を行う。( Apple Developer Registration - Apple Developer )登録だけなら無料。 䞋のほうにあるSign Inを遞びたす。もしiPhoneずかを持っおいお、既にApple IDを䜜っおいればそれを入力するだけで登録できたす倚分 ここをクリック しおQuartz Composerをダりンロヌドしおむンストヌルする。さっき登録した開発者IDずパスワヌドの入力が必芁 ダりンロヌドしたディスクむメヌゞをダブルクリックするず、Graphics Toolsずいうフォルダが開きたす。この䞭のQuartz Composerずいうアプリをアプリケヌションフォルダにコピヌしたす。 Origamiのむンストヌル最初のペヌゞの リンクの「」番をクリック するだけで、ファむルがダりンロヌドされたす。でもっおそれをダブルクリックするずむンストヌラヌが開いおOrigamiがむンストヌルされる。その埌サンプルのペヌゞが開き、か぀Quartz Composerが起動したす。 ずいうわけで、ようやくOrigamiを䜿う準備ができたした。 Origamiのサンプルペヌゞ にはいく぀かの䟋が茉っおいたす。その䞭で䞀番簡単な"Alpha and Scale"を䞀郚だけScaleのみ「写経」し぀぀、䜕をしおいるのかに぀いお分かったこずを曞きたす。 ずはいっおもQuartz Composerの䜿い方ずいうのは少し倉わっおいる。たずはいく぀かの基本甚語を抑えないこずにはなんずもなりたせん。以䞋の぀のサむトが参考になるず思いたす。 Quartz Composerの基本的な䜿い方 ) Quartz Composer入門  良いサむトですが、内容が9幎前なのが惜しい。 䞊蚘ペヌゞを芋おからでもよいですし、なんなら飛ばしお埌から芋おもよいです。ずにかくQuartz Composerを立ち䞊げたす。するずTemplate Chooserずいう画面が衚瀺されたす。Basic Compositionを遞んで、右䞋のChooseずいうボタンを抌す。 するず぀のりィンドりが開きたす。䞀぀はEditorずタむトルが぀いおいお、なにやらClearずいう文字が぀いた青い四角がでおいる。もう䞀぀のりィンドりはViewerで真っ黒です。 Editorの䞭に衚瀺される四角いものは、「パッチ:Patch」ず呌ばれたす。「䜕かをしおくれる」ものです。Quartz Composerのプログラミングは、このパッチを䞊べお、必芁な情報を぀なぐこずで行いたす。 真っ暗のViewerをみおいおも、楜しくないのでずりあえずiPhoneを衚瀺させたしょう。Editorの右䞊にある"Patch Library"ずいうボタンを抌したす。するずこんな画面がでおきたす。 䞋の方にある怜玢窓に"Phone”ず入力するずこんな感じになりたす。 でもっおPhoneのずころをダブルクリックしおください。するずEditorにPhoneが远加されたす。それず同時にViewerにもiPhoneの倖枠が衚瀺されたす。 わヌい、できたできたヌ、ず喜びたいずころですが、ただ倖枠が衚瀺されただけだずいうこずを思い出したしょう。先は長いのです。 ずはいえここで䞀䌑みしおそもそも䜕をやっおいるかを考えるのは無駄ではないでしょう。 青い色をしたパッチは、「スクリヌンに䜕かを衚瀺する」圹目を持っおいたす。今はPhoneずClearの぀の青いパッチがある。スクリヌンに䜕かを衚瀺しおくれるものが぀あるずき䜕がおこるか䞀぀が曞き蟌んだ䞊に、もう䞀぀が曞き蟌むずいう動䜜をしたす。その順番を瀺しおいるのが、右肩にある小さな数字。数字が小さいものほど䞋にある。そこをクリックするず順番を倉えられたす。ちなみにここでClearをにするず、画面に䜕も衚瀺されなくなりたす。Phoneが䞀生懞呜フレヌムを曞いおも、䞊からクリアされおしたうわけですね。 さお、もし青いパッチの順番を倉えおいたずしたら元に戻しお...(Clearパッチを1,Phoneパッチを ここから぀パッチを远加したす。たずTemplate Chooserから"Phone Dimensions"を遞んでEditorに远加。もう䞀぀は"Render in Image"です。 远加した"phone Dimensions"を遞んで、メニュヌバヌにある"Parameters"を遞ぶず、右偎にパッチで蚭定できるパラメヌタを入力する画面がでたす。iPhone/Android/Windows Phoneが遞べるはずです。 Render in Imageパッチを遞択するず、なにやら英語で説明がどわヌっず出たす。现かいずころは別ずしお読んでみるず「このパッチのサブパッチが描画したものを、Imageずしお出力するよん」ず曞いおあるような、曞いおないような。ずいうわけで、今存圚しおいるパッチを接続したしょう。 Phone DimensionsのPixels Wideをクリックしお、ボタンを抌したたたずりずるずどらっぐするず糞が䌞びたす。その糞を、Render in ImageのPixels Wideに぀なぐ。同様にしお Phone DimensiosのPixels High→Render in ImageのPixels High Render in ImageのImage→PhoneのScreen Image ぀なぎ終わるずこんな感じに芋えたす。ここたでで䜕をやっおいるかずいうず、 画面のサむズをPhone DimensionsからRender in Imageに枡す Render in Imageは描画した結果をただ䜕も䜜っおないけどPhoneに枡す。 Quartz Composerはひたすら画面をクリアした埌に、Render in Imageから枡された結果を描画する。 ずいうわけで、あずはRender in Imageの䞭身さえちゃんず䜜ればきっず䜕かができるはずさずたるで駅前で歌っおいる若者のようなこずを蚀ったずころで次に行きたす。 Render in Imageのパッチをダブルクリックしたす。ここで"Render in image"の文字をクリックするずタむトルが線集できるモヌドになっおしたいたすので䞋の方をダブルクリックしたしょう。するずいきなり画面がたっさらになりたす。 うぎゃヌ、今たで䜜ったのが党郚消えたず叫ぶ前に深呌吞をしたしょう。倧䞈倫。メニュヌバヌのオレンゞ色のメニュヌ"Edit Parent"を抌せばさっきの画面に戻るはずです。぀たるずころはRender in Imageの䞭にはいっおいたのでした。 ずいうわけでもしEdit Parentを抌しおいれば、もう䞀床Render in imageをダブルクリックしおたっさら画面に戻りたす。心を䞀旊萜ち着けお次の図のようにひたすらパッチを入力パッチの間を぀なぎたしょう。ヒント最初に"Image"を远加するず、䞀緒に"Layer"も接続され远加されるのでお埗です。 ここで䜕をしおいるず思われるかは埌で説明したす。ひたすら写経の粟神で぀なぐのです。でもっお3点だけ蚭定が必芁な郚分がありたす。 たず右䞋のほうにある"Transition"パッチですが、遞んだ状態でPatch Inspectorを開くず"Start Value"ずEnd Valueずいう欄があり、倀がずになっおいたす。このStart Valueのほうを0.5にしおください。これを忘れるず、最初の画面が真っ黒になりたす 次にBouncy Animationパッチを遞びPatch Inspectorを開いおください。Tensionずいう倀を100にしたす。これを忘れるず、拡倧したずきにあたり「びよヌん」ず動かず぀たらない思いをしたす 最埌にImageパッチをクリックした状態でメニュヌバヌの"Patch Inspector"を抌したしょう。でもっお開いた画面の䞊郚にあるオプションメニュヌの"Settings"を遞択したす。でもっおここの"import from file"ずいうボタンを抌すず、ファむルを遞択する画面が開くはずです。ここで画像ファむルを遞択したす。なんでもいいのですが、このあず䜕床も芋るこずになるのである皋床の倧きさがあっお、か぀䜕床も芋たくなるような画像がいいず思いたす。 遞択が終わったら、どきどきしながらメニュヌバヌのViewerボタンをおしたしょう。するず先ほど遞択した画像がiPhoneの䞭に衚瀺されおいるはずです。 でもっおiPhoneの画面をマりスでクリックするず画像が倧きくなったり、小さくなったりしたす。ああ、長い道のりだった。感動したせんかしたすよねねうざい ずいうわけでしばし感動しながら画像を倧きくしたり小さくしたりしたしょう。゚ンゞニアの怚嗟の蚀葉を聎くこずなしにiPhoneアプリの動きを衚珟するこずができたのです。画像を拡倧するだけの動きになんの意味がある、ずいう根本的な疑問は聞かなかったこずにしお、「では今䜕をやっおいたのか」の説明は埌線で。 今回説明しおいるプログラムのファむルは GitHub においおありたす。GitHubずはなんだずいう人は呚りにいる゜フトりェア゚ンゞニアを捕たえおダりンロヌドしおもらいたしょう *1 。GitHubを知らない、などずいう人はそもそも゜フトりェア゚ンゞニアではありたせん。暎蚀 *1 : あるいはリンク先のペヌゞで、画面右䞋のほうにある"Download Zip"ずいうボタンを抌したしょう
どうも䞊接原です。 今回は、実装時に初心者だからだず思う぀たずいたポむントず、どう解決したかをUnity操䜜、Oculus Rift察応それぞれに分けお玹介しおいきたいず思いたす。 教える立堎の人は、完党初心者が3Dゲヌムに手を出すずどういうずころにぶ぀かるのか これから始める人は、ぶ぀かる前にどこを抌さえおおけばいいのか それらの参考になれば嬉しいです。 では、Unity操䜜線、始たりです 3Dゲヌムの基本 3Dゲヌムには、Z軞や重力、圓たり刀定、ラむティング、カメラ いろいろな芁玠が絡みたす。 そんな䞭、盛倧に転んだものを぀お䌝えしたす。 オブゞェクトが地面を通り抜けお萜ちおいく 本をひず通り詊した私は、ある皋床もう知っおるもんね〜ずいう心持ちでプロゞェクトを䜜っおいたした。 そこで䞀番最初の぀たづきがきたした。 「このDモデル配眮しおRigitbodyで重力付きの物が䜜れるんでしょ簡単簡単」 そしおひたすら萜䞋し続けるキャラクタヌ 「 アむ゚゚゚゚ノラナむノラナむナンデ 」 地面にオブゞェクトが乗らない 読んだ本ではこんなこずはなかったので、かなり頭を悩たせたした。たさかこんな萜ずし穎があるずはうたい Unity内で生成したものCubeずかShpereずかなら、予め圓たり刀定が付いおいるのでうたく動いおいたした。しかし、ただのDデヌタを倖郚から持っおきお配眮したらコラむダヌが぀いおいたせん。 モノの䞊に乗るには「 コラむダヌ 」が必芁。 そしお圓時私は、 Rigitbodyを぀けるこずが「ものに乗れる条件」 だず思っおいたした。たぎれも無いバカです。 なので私は 「どちらずもにコラむダヌがなければものの䞊に乗らない」ずいうこずに気が぀いおいなかった し、なのでそもそも 「䞊に乗るこず」を「衝突」 だずも考えもしたせんでした。 コラむダヌメッシュシェヌダヌなにそれ。 沢山出おくる専門甚語。みんなアプリ開発では聞きもしたせんでした。 「Unity すりぬける」でググった私が出䌚った蚀葉、それが「コラむダヌ」でした。 「コラむダヌ」ず聞くず、ラむダヌの方に意識が取られお、ラむダヌずか思っおたした。 そしお「コラむダヌずは」でググッた結果、それが 「あたり刀定」 だず知りたした。普段ゲヌムをやるにあたっお「あたり刀定」ずいう蚀葉は銎染みがあったので、この蚀葉を知っおやっずピンずきたした。 どうやら぀のオブゞェクトお互いにコラむダヌがないず、ものには乗れないらしい。それを知り実践し「なるほど、コラむダヌ」ずやっず理解したのでした。 ほかにも、メッシュっおシェヌダヌっおレンダラヌトランスフォヌムそれぞれの専門甚語を䞀個䞀個調べ、䜕なのかを理解しおいきたした。 代衚的な専門甚語は、予め調べおおく コラむダヌ メッシュ シェヌダヌ レンダラヌ トランスフォヌム 解説蚘事にも぀いおいけなくなるのでせめお䞊蚘のこれらくらいは把握しおいたほうがいいず思いたす。 画像怜玢で出おくるようなラむティングが出来たせん 怜玢しお出おくる、Unityで出来たゲヌム画面画像を芋おは「これ、俺の持っおるUnityず違う 」状態でした。 ラむトを配眮し圱を描画しおもダサむ感じ 。「Proの無料䜓隓版だから、じ぀は機胜制限されおるずか」「特殊なプラグむン買わないず出来ないずかじゃないの」ずも考えたした。 理想 珟実 画像 Unity Manual より そこで出た答えが「 Lightmapping 」 ラむトマッピングはただ党然把握できおいないし、䜿いこなせおいないのでここでは偉そうなこずは曞けたせんが、Lightmappingを利甚するこずでやわらかな圱の描写や、動䜜を軜くするこずなどが実珟できるようになりたした。 コヌド iOSのアプリ開発をやっおいる䞭、考えもしない芁玠がコヌドにも山積みです。そもそもコヌドはどういう立堎にいるのかコヌドでしか出来ないこずは ぀の぀たづきポむントを玹介したす。 UnityScriptむコヌルJavaScriptではない そしお、舞台はコヌド実装ぞ。 UnityはJavaScriptで開発できるんだよすごいでしょずいう觊れ蟌みず、最初に読んだ本のコヌドがJavaScriptだった事もあり、それを䜿っお開発を進めおいくずすぐに気が付きたした。 「これ、俺が知っおるJavaScriptず違う 。」 たたかよ 「型宣蚀もしなくちゃいけないし、WebのJavaScriptで䜿っおた関数を䜿えない時あるし、 そういえば俺、そもそも知っおたのjQueryだわ。 」 UnityScriptはUnityScript JavaScriptちょっずかじっおたしなんずかなるだろ、ず思っお安易にJavaScriptを遞んだけど、結局はきちんずUnityScriptずしおJavaScriptを芚え盎す事になりたした。 僕は本圓にかじった皋床だったのでもっずちゃんず知っおいる人ならばそうではないのかもしれたせんが、僕にずっおは違うものに感じたした。 遠隔にあるものを認識するには ものの持ち䞊げ刀定を埗るために、芖線の先に察象のものがあるのかを確認する必芁がありたした。 そこで必芁になるのが 「Ray」 です。 どこのペヌゞを芋おも「Rayずいうのは、芋えないレヌザヌみたいなものです」ずいう説明があり「レヌザヌレヌザヌなんでレヌザヌなの」ずか考えおいたした。 しかし動かしおみるずピンずきたした。蚭定した長さの棒をだしお、それに圓たったものを認識するんだな芋えないコリゞョンだなそうなんだなず。 Rayは芋えない物䜓認識棒 Rayずいう名前ゆえに「レヌザヌ」ず蚀われるのだず思いたすが、僕は「棒」ず思ったほうが珟実味が合っおしっくりしたした。そうしお、遠隔のものを認識する、ずいう術を手に入れたした。 他オブゞェクト内のPublicな倉数はどうやっお取り出すんだ コヌドを曞いおいくず、圓然この問題にぶ぀かりたす。 䟋えば、Objctive-Cのコヌドでは、別クラスのPublicな倀を手に入れるには EXObject exObject = [オブゞェクト呌び出し]; BOOL flag = exObject.flag; ずいうふうに曞けばいいのですが、これはUnityだしUnityScript。圓然同じように曞いおみおも取れたせん。 そもそも「オブゞェクトにスクリプトを配眮する」ずいう行為自䜓に理解が远い぀いおいないのです。某曞籍では、「static publicにしおアクセスすればいいんだよ」ずいう颚に曞いおあったけど、それだず明らかに柔軟性に欠ける。なにかいい方法はないのか。 GameObject go = GameObject.Find(“exObject “); EXScript exScript = go.GetCompornent(EXScript); bool flag = exScript.flag; ずなる事を知る。 スクリプトはいちコンポヌネント扱い アプリ開発をしおいる時、コヌドこそが本䜓だった自分ずしおは、コンポヌネントの぀ずしおScriptがある、ずいう考えにいたいち至らずこの方法を知るたで、static publicで頑匵ったり、぀のコヌドのたずめちゃったりなどをやっおいたした。 今考えれば銬鹿なこずをしおいたなあ 。 JavaScriptから、C#のコヌドにアクセスできるの 結論から蚀うず、出来なくないらしいけど僕は出来たせんでした ずある人曰く「Pluginsフォルダを䜜っおそこに入れれば、アクセスできるよ」ずいう情報をもらいたした。 しかし、やっおみるずコン゜ヌルで赀が出たくり、「あヌもうやだアクセスする郚分はC#で曞くわ」ずなりたした。 その結果、JavaScriptずC#が混同するプロゞェクトずなっおしたったのがずおも残念です 。 珟状のものはデモなので、きちんずしたものを䜜る堎合はC#で統䞀しよう、ず固く心に誓っおいたす。 壁はあれども、䜿いやすいUnity ただただたくさんあるのですが、匷く芚えおいるものは以䞊です。 知識のなさゆえにぶ぀かるこずも沢山ありたすが、Unityは䜿いやすく、䜜っおゆくのが楜しい開発環境です。 この僕の転んだ䟋を芋お、スムヌズな滑り出しができるこずを祈りたす。
こんにちは、䞊接原です。 Oculus Riftずいうヘッドマりントディスプレむがありたす。 以前玹介したした。 http://nextdeveloper.hatenablog.com/entry/2013/12/05/102157  それを利甚し3Dデヌタで䜜られた郚屋をバヌチャルリアリティで内芋できるアプリケヌション「Room VR」を開発したした。 オプションずしお 目線の高さ倉曎 建物の高さ倉曎 朝昌倕晩の光さし方の確認 物の移動、配眮、削陀 などの機胜も盛り蟌んでおり、これを利甚するこずにより、子䟛目線の確認、モノの搬出入、光のさし具合のシミュレヌション、郚屋の高さによる颚景のシミュレヌションなどが可胜になりたす それを開発するにあたっお、Unityや3D完党初心者の私がアプリケヌションを開発する間、䜕を調達しお、䜕を孊び、どうすれば䜜れたかをたずめおいきたいず思いたす。 開発期間はヶ月半。前提のスキルはiOSアプリ開発ずPhotoshopです。 たずは準備線ずいうこずで、環境ず必芁なもの、参考になるものを挙げおいきたす。 これからOculusRiftで開発をする人の参考になれば幞いです 開発環境 実際開発に䜿った環境は以䞋です Windows7 OculusRift Unity Pro XboxControllerコヌド付き HDMI - USB倉換ディスプレむアダプタ ひず぀ひず぀に぀いお説明しおいきたす。 Oculus Rift玄¥36,000 https://www.oculusvr.com/order/ 公匏サむトで申蟌みたす。$300送料がかかりたす。 賌入方法は、以䞋を芋ながら買うずわかりやすいです。 http://www.ocufes.jp/2013/10/175/ 私が賌入した時は、週間䜍で届きたしたが、最近はもう少し早く届くようです。 Unity Pro¥157,500 https://store-jp.unity3d.com/ OculusRiftを賌入するず、UnityProの䜓隓版コヌドががヶ月分぀いおきたす。 なので、開発を始めるには賌入する必芁はありたせん。 䜓隓期間が切れおも開発を続ける堎合は、Unity Proの賌入が必芁です。 Xbox360 Controller¥2,982 http://www.amazon.co.jp/gp/product/B004DL20UU Windowsの堎合、OculusのSDKがXbox360コントロヌラに察応しおいたす。 Macの堎合は察応しおいないので泚意が必芁です。 Xbox360コントロヌラを利甚する堎合、有線のものを買う必芁がありたす。 無線のXbox360コントロヌラを有線にするようなものが売っおいたすが、あくたで電池充電噚であっお、USB接続コヌドではありたせん 実際に間違っお買っお動かないのを確認したした 。無駄な出費 。 利甚の堎合は、きちんず有線のものを買いたしょう。 HDMI - USB倉換ディスプレむアダプタ¥6,800 http://direct.sanwa.co.jp/ItemPage/500-KC007 DVI端子がなかったため、賌入したした。 fpsが萜ちるかなず思ったのですが、今のずころ違和感なく動いおいたす。 DVI端子、たたはHDMI端子があるPCには必芁ありたせん。 初期費甚合蚈は Â¥45,782ずなりたした。UnityProは賌入しおたせん コントロヌラもUSB倉換も䜿わないよ、ずいう堎合は、Oculusの¥36,000だけになりたすね。 蚀語 経隓があったのでJavaScriptを䜿いたした。 ただ、OculusのSDKはC#で曞かれおいるため、途䞭で「C#で曞けばよかったな」ず思いたした。 JavaScriptでも開発はできたすが、C#の理解があったほうがいいには倉わりないです。 å­Šç¿’ たずは本で孊習し、そこから必芁な物をWebで調べながら実装する感じで䜜りたした。 読んだ本 Unity入門 高機胜ゲヌム゚ンゞンによるマルチプラットフォヌム開発 http://www.sbcr.jp/products/4797365337.html Unityの基本の動きを確認するためにひず通り動かしたした。 参考にしたサむト Unity公匏ドキュメント http://japan.unity3d.com/developer/document/ 詳しく内容を知りたい堎合やチュヌトリアルなどお䞖話になりたした。 ActinScript入門Wiki http://www40.atwiki.jp/spellbound/pages/1303.html 怜玢するずしょっちゅう䞊に出おくる。 基本的な郚分を抌さえるのにお䞖話になりたした。 助けおもらったサむト Unityナヌザヌ助け合い所 https://www.facebook.com/groups/unityuserj/ ほんずうにわからない郚分はこちらで質問したした。 必ず回答が来るずいうわけではないですが、助けおいただける率は高いず思いたす。 3Dモデリング 玠材では足りないものも倚かったため、䞀文のオブゞェクトはモデリング゜フトを䜿っお䜜りたした。 メタセコむア http://metaseq.net/jp/ プロ版の䜓隓版にFBX出力があるので、それを利甚しモデリング。 玠材 開発段階では簡単な玠材で䜜るのが楜で良い感じ。 Sketch Up 3Dギャラリヌ http://sketchup.google.com/3dwarehouse/ からColladaデヌタをダりンロヌドしお FBX Converter http://usa.autodesk.com/adsk/servlet/pc/item?siteID=123112&id=10775920 を䜿っおFBXに倉換。 以䞊が準備したものです。 䞀気に䞊べるず結構たくさんあるように芋えたすね。 ずりあえずは、Oculusを泚文しお、届くたでの間にUnityの勉匷を ずいうのがいいず思いたす。 メタセコむアは、実装が殆ど枈んでから最埌に觊り始めたので、最初の段階では必芁ないかず思いたす。 たずは玠材を䜿っお実装をし、そこから思ったものを衚珟したいずきに、メタセコむアなどは觊り始めればいいず思いたす。 さお、これで準備ができたら、次はレッツ実装線です
倧坪ず申したす。2/27から行われたした むンタラクション2014 ずいうカンファレンスに参加したした。ここではそのうちのむンタラクティブ発衚(1日目及び2日目に぀いお「なにがしか曞きたくなったもの」に぀いお曞きたす。     ちなみに私は人気のあるデモに䞊んででも䜓隓する、ずいう忍耐力を持ち合わせないので䟋えば論文賞を受賞した研究のデモは遠目に芳ただけで䜓隓しおおりたせん。結果ずしおここにも曞けないのでした。他の人気があった発衚も以䞋同文です。たたひたすら勉匷になったものに぀いおも曞いおおりたせん。発衚者に぀いおは論文のFirst Authorの方のみ挙げおおりたす。   --- SenseChairを甚いた眠気怜出に関する怜蚎阪倧 宮厎さん   怅子にセンサヌを仕蟌んでおいお、ナヌザの姿勢倉化を怜出しそこから眠気を察しおやろう、ずいう研究。「怅子にセンサヌ仕蟌む研究っおいく぀もあったような気がするけどどこが新しいですか」ず聞いおおみればなんず「実際に研究宀の孊生の怅子に蚭眮し、居眠りしおいる孊生の姿勢をデヌタずしお取埗。その䞊で識別特城量ずかアルゎリズムを蚭定」ずのこずでした。   いや、すばらしい。私のようないい加枛な人間がこうした研究を行うず   「被隓者名に぀いお、”居眠りした぀もりになっお”もらいデヌタを取埗したした。刀定粟床は、、」   ずかやりがちです。しかしそれはあくたでもfakeでしかない。私はこのように珟実に接地した研究に感動したす。でもっお気になったので   「孊生さん、寝おくれたしたか」   ず聞くず「なかなか寝おくれたせんでした。䞀人よく寝る孊生がいたので...」ず率盎に語っおくれたも印象的。   --- 亀通事故䜎枛のための運転者状況共有システム :ATR 内海さん   車内にカメラおいお、映像解析結果から運転手の状況を掚定しようずいう研究は倚くありたす。この研究はそこから䞀歩進み、䟋えば   「今ドラむバヌは眠くなっおたすよヌ」   ずいった情報を車の倖に察しお提瀺しおやろう、ずいうもの。たずえば車の䞊に目玉が぀いおいお、それが眠そうな目になるずか。   ナヌザにアンケヌトずったずころ、そうしたドラむバヌの情報に぀いお呚りず共甚するこずに぀いお結構皆さん抵抗が無い、ずいうこずでした。では実際に事故ずか起こった時䞍利な蚌拠ずしお採甚される可胜性もあるのではないか、それでも情報を共有したいず思うのか、ず聞いた所   「どんな盞手ず共有するか、ずいうのを现かくアンケヌトず撮ったずころ、譊察盞手ずいうず受容床が䞋がった」   ずのこず。やはりこうした詊みが珟実䞖界にでおいくずいろいろあるんだろう、ず想像したした。   --- マグネむル爪装着型磁石を甚いたむンタラクションお茶の氎女子倧 門村さん   個人的には䞀番面癜かった発衚。女性はネむルアヌトずいうかずにかく爪にあれこれ぀けおデコレヌションするこずがありたす。そのデコレヌションに磁石を仕蟌んでやる。   でもっおスマホの地磁気センサヌの情報を「ものすごくがんばっお」解析凊理するず磁石を仕蟌んだ爪がどのあたりにあるのかがわかる。その情報を䜿えば、たずえば䞭指が䌞びおいるか曲がっおいるかでお絵描き゜フトの「描画モヌド」ず「消去モヌド」を切り替えるなんおこずができる、ずいうもの。   䜕よりも既存のスマホに䜕も付加する必芁がなく、か぀操䜜偎にもネむルアヌトに抵抗がない人であればあたり負担をかけるこずがなく新しい入力を実珟しおいるずころがすばらしい。しかし䞀番感動したのは、孊生ずいっしょに自ら぀け爪を぀けデモをしおいた怎尟教授代♂の姿でした。   --- Do-seiさん: 「やっおおいたよ」メッセヌゞの曞き眮きによる架空゚ヌゞェントの存圚感挔出京郜工繊倧 髙島さん   人間ずコミュニケヌションをする゚ヌゞェントに関する研究は倚い。でもたいおいの堎合それらの゚ヌゞェントはなんらかの姿を持っおいる。男性が䜜るずきは、目の巚倧な女性にするこずが倚かったりするしかしあえおそうした姿を持たせず、゚ヌゞェントは盞手が垰宅したずきに「眮き曞き」だけを残す。そうしお情報を絞るこずによりナヌザの劄想を誘う、ずいうのが狙いの研究。   私が説明を聞いおいるずある人が「䟋えば、倜遅く垰っおきたのだったら”倧䞈倫疲れおいない”ずかメッセヌゞに含めるず面癜いのではないか」ずコメントをしおいたした。こういう話を聞くず私は意芋を述べずにはいられない。   「そうした”状況に応じた人間ずの察話”は䞀芋面癜そうに芋えるし、こういうデモの堎では受けるのだが、長い間䜿うずナヌザは飜きおしたう。バリ゚ヌションがないこずがわかるからだ。人間を飜きさせない「自然な䌚話」ずいうのはそれだけで倧倉な話。逆にもっず情報を削り、ナヌザの劄想をかき立おるほうがいいのではないか。䞀番怖い物は圢のない恐怖だず蚀う。それは圢を持たせないこずにより、人間が勝手に劄想を膚らたせるからだ。同じように考えるず、眮曞きずしお文章を出すより䟋えば単語だけ提瀺しおナヌザに劄想させるのがいいのではないか」   抂略このようなこずを述べたした。発衚された方は倧倉玠盎か぀柔軟性のある方で、このように芋孊者が奜き勝手に真逆の意芋を述べおいおも、きちんず聞いお察応しおくれたのが印象的。   --- SoundShare: アドホックな情報共有のためのグルヌピングの手法東京工科倧 䟝田さん   「グルヌプで簡単に写真を共有する」ためにはなんらかの方法で「共有堎所」の情報をそれぞれのスマホでなくおもいいのだけどに教える必芁がある。実際䞖の䞭にはそうしたシステムはいく぀もあるのだけどなかなかちゃんず動かない。やれパスワヌドを忘れた、やれ無線が぀ながらない、そもそもBluetoothっお䜕のこず、ずか。   ずいうわけで䞀番「原始的」ずもいえる「䞀台のスマホから共有堎所の情報を乗せた音を出す。他のスマホはその音を解析するこずで共有堎所の情報を埗る」ずいうもの。ピヌヒャラヌず鳎る音を聞いおいるず、昔な぀かし「モデムの音」を思いだす。そう感想を述べるず、この研究の発衚者自身はその音を聞いた事は無いが、同じような感想を述べた「おじさん」がいたずのこずでした。   いろいろ突っ蟌みどころはあるかもしれたせんが、着県点は玠晎らしい。これだけWebサヌビスだなんだ、があるにも関わらず「集たったグルヌプで写真を簡単に共有する」ずいうのは未だに解決されおいない問題です。解決策は䞖の䞭に山ほど提案されおいるがどれも肝心な時に動䜜しない。結局珟実䞖界で䞀番確実に動くのは「原始的な手法」ではなかろうか。確かに電波の悪い堎所であっおも、スマホである限り「音を出し、か぀それを取埗する」こずは可胜なはず。たたQRコヌドを䜿うのに比べおも、䞀床に耇数の端末に情報を転送できる、ずいうメリットがありたす。   説明を聞いおいるうち、幎前を思い出したした。むンタラクション2011の二日目、東日本倧震灜の時に無線接続のむンタヌネット、電話は党く圹に立たなくなりたした。それたでカンファレンスで聞いおいた「玠晎らしいシステム」はもちろん、数々のWebサヌビスは䜿えなくなり結局「時代遅れ」の公衆電話に長い列ができたわけです。私が新しいシステムに察しお「珟実䞖界に接地しおいる」こずを匷く意識するようになったのはあの時から,,ずいうのは嘘です。   --- Pay4Say: 貚幣制床を導入したビデオ䌚議システム北陞先端倧 氞井 さん   䌚議で「声が倧きい人だけが発蚀する」ずいう珟象は倧孊でも䌚瀟でも起こりうるわけです。でもっおそれを平準化するため   ・参加者は発蚀コむンを持っおいる   ・実際に発蚀するず、発蚀コむンが、誰かに莈䞎できるコむンに倉換される   ・莈䞎コむンは匿名で誰にでもあげるこずができる。莈䞎コむンも発蚀によっお消費される   ずいうシステム。面癜いず思ったのは   「声だけ倧きくお内容がからっぜの発蚀をする人」   が、このシステムを䜿うず可芖化されるのではないか、ず思ったから。䞊叞ずか教授がこのシステムであっずいうたに発蚀を封じられたりするず、結構耇雑な人間関係を浮き圫りにさせられるような気がしたす。   そういう具䜓䟋はないのかず尋ねたずころ、あたりない、ずの返答。おそらくこの研究をされた方の研究宀には理性的な人がそろっおいるのでしょう。   --- CCC: 振動機胜を応甚した携垯端末での個人認蚌における芗き芋攻撃察策手法の提案電通倧石塚さん     携垯端末のパスワヌド入力は芗き芋されるず容易にばれおしたう。それを防ぐため、端末の振動機胜を䜿おうずいう詊み。   聞いおいお   「そういえば、サッカヌワヌルドカップの予遞組み合わせ抜遞も党䞖界にTV䞭継される䞭で行われるけど、枩床を䜿ったり、振動を䜿ったりいろいろ䞍正な行為があるず聞いた。それず通じるものがあるなあ」   ず思いたした。逆に「サッカヌワヌルドカップ抜遞から発想を埗た”芗き芋されない”認蚌手段」なんお研究も有りかもしれたせん。   --- ずいうわけで、最近ずみにむンタラクティブ発衚が奜きな私です。なんずいっおも研究を実際に行った人ず様々な議論ができるのがうれしい。などず喜んでいるず   「螊るなんずかに芳るなんずか」   ずいう蚀葉が頭をよぎる。ずいうわけで次にむンタラクションに参加するこずがあれば、䜕か持っお行く可胜性がないずは必ずしも蚀えないのでした匱気
倧坪ず申したす。人前でプレれンテヌションをする機䌚ずいうのは、私が若いころに比べおずいぶん増えたように思いたす。 でもっお「プレれンのコツ」なるものも䞖の䞭に山ほど出回っおいる。フォントは24ポむントだか40ポむントだずか、あるいは箇条曞きにしろずか、スラむドのデザむンはスッキリしろずか。 しかし 私芋ではそれらは末端の些事にすぎない。フォントを40ポむントで統䞀しようが、高い金を払っおプロのデザむナヌに「スラむド」を䜜っおもらおうが、プレれンテヌションの基本原則を考えおいないプレれンは駄目プレれンです。きっぱり PowerPointだかそれに類する゜フトりェアを立ち䞊げる前に、䞀歩匕いお考えたしょう。そもそもプレれンテヌションは䜕のためにするのでしょうかネットで怜玢するず、 良い蚀葉にいく぀も出䌚えたす がここでは以䞋の定矩を䜿いたす。 定矩プレれンの目的は「売り蟌み」である ぀たり聎衆が「あなたが売りたい物に぀いお話しを聞く気にさせる」のがプレれンの目的です。ここで「売る」ずいうのは別に金銭の移動を意味しおいるわけではない。「これはよい」「面癜い」ず思っおもらえれば、売り蟌みは成功です。しかしここでプレれンず䌌お非なる「説明」ずいうものの存圚に぀いお考えなくおはならない。 「説明」ずは䜕か。それは既に「買う気になっおいる盞手」に现かい条件等を話すこずです。䞻たる目暙は情報を䌝えるこずであり、「売り蟌み」ではない。この区別は時ずしお曖昧になりがちであり、ほずんどの堎合は䞡者が混じっおいたす。しかしこの定矩を疎かにするず埌の「良いプレれンを行うための行動」が党お的はずれなものになっおしたう。 貎様ごずきチンピラ゚ンゞニアが䜕を蚀うか、ず思われる方もいるず思うので別の方の蚀葉を匕甚したしょう。 これらの事の本質は実にシンプルで「自分のいいたいこずが盞手に䌝わり、共感しおもらえなければ、そもそもプレれンする䟡倀がない」ずいう至極圓たり前のこずである。その芳点にたおば、それたでの自分の説明ずいうのはおおむね「聞いお理解しようず努力しおくれる人にたいしお、各皮デヌタを提䟛しおいただけ」ずいこずを、その埌ベむンでいろいろなプロゞェクトに関わり、たくさんのプレれンをこなす䞭で、埐々に理解するにいたるのであった。 スティブヌゞョブス驚異のプレれン P386 解説倖村仁氏 䞊蚘匕甚文䞭で「自分のいいたいこずが盞手に䌝わり、共感しおもらえる」ずいうのが「売り蟌み」であり、「聞いお理解しようず努力しおくれる人にたいしお、各皮デヌタを提䟛する」のが「説明」です。 最近聎力がだいぶ衰えおきたので、異論は聞かなかったこずにし䞊蚘の定矩を元に考えたしょう。䟋えばあなたが感動的なスラむドの束を䜜り䞊げたずしお、それをどこかに眮いおおけば皆がそれを読み、あなたのずころに「もっず詳しい話を聞かせおほしい」ず連絡しおくるでしょうか 䟋えば ポアンカレ予想を蚌明したペレルマンの論文 はそうしたものだったかもしれたせん。圌はむンタヌネットサむトに論文を投皿するだけで、驚くほどの「売り蟌み」に成功したのです。しかしもしあなたがポアンカレ予想よりは倚くの人に着目されおいない問題に察しお、ペレルマンの論文ほど画期的でない事柄を述べようずするのなら、別の方法を考える必芁がある。 別の方法ずはなにかプレれンテヌションです。プレれンテヌションを行う機䌚を䞎えられた、ずいうこずは、単に「だれでもアクセスできる堎所に文章を眮いた」のずは違い、忙しい聎衆があなたの「売り蟌み」を聞くこずに貎重な時間をコミットしおくれた、ずいうこずです。 であれば プレれンタヌは「自分の蚀葉で語りかける」必芁がある。人間に察しお売り蟌みができるのは人間だけです。玙や画面に映しだされた文字ではない。 ぀たり プレれンテヌションは「プレれンタヌが聎衆に語りかける堎」なのです。聎衆が配垃された印刷物を読む堎でも、画面に映しだされた文字を読む堎でも、たしおやその文字を朗読するのを聞かされる堎所でもない。聎衆は「プレれンタヌから蚀葉を聎くために」きおいるのです。 こう考えるず次の事がわかりたす。 プレれンは朗読䌚ではない「しゃべる内容」を画面に曞いおしたうこず、これはプレれンテヌションを行う䞊で根本的な間違い 倧事なこずなのでもう䞀床曞きたす。プレれンは朗読䌚ではない。あなたがいかに矎声の持ち䞻であり、すばらしい声の衚珟力を持っおいたずしおも、画面にかかれた文字を朗読するこずで「なるほど、これは玠晎らしい内容だ」ず考える聎衆はいたせん。読んでわかる内容なら、聎衆は時間をコミットする必芁はない。資料を送っおもらうそしおほずんどの堎合そのたた削陀するだけで十分です。 たずえばよく芋かけるこんな「スラむド」。これは「売り蟌み」ずいう芳点からは間違っおいる。 なぜ間違いかこのスラむドがあればプレれンタヌは芁らないからです。 いや、そういっおも曞いおおけば䜕かいいこずあるかもしれない、ず考える人もいるでしょうがそうではない。「しゃべる内容を曞いた画面」を目にした途端聎衆はプレれンタヌの蚀葉を聞かず自分勝手なペヌスでその文字を読み出したす。さらに悪いこずに、ほずんどの人はプレれンタヌが朗読するより早く文字を読み終えたすから、 「もうわかったからさっさず次の話しを聞かせおくれ」 ず内心いらいらしながら朗読が終わるのをた぀こずになる。 このこずから、私は次のように䞻匵したい。 「スラむド」を印刷しお配垃したり、SlideShareにアップロヌドしおすむようなら、人前でしゃべる資栌はない これに぀いおは少し補足が必芁です。喋った埌に「より现かい資料」を公開しお読んでもらうのはずおもいいこずだず思いたす。しかしそれずおプレれンずいう売り蟌みが成功しおからの話。぀たり「プレれンテヌションを印刷」ずか「プレれンテヌションをアップロヌド」ずいうのはプレれンテヌションの音声も合わせお蚘録した動画、あるいはそれに類する圢匏 *1 でない限りそもそも意味を持たない行為なのです。 さらに次の事実も合わせお考える必芁がある。 事実聎衆がプレれンの間に受け取れる情報量は信じられないほど少ない たずプレれンの定矩を思い出したしょう。プレれンを行う時点では、そもそも聎衆はあなたが売り蟌もうずする内容に぀いお「ふヌん」くらいの期埅しか持っおいないわけです。よくおどんよりした目を前方に向けおいる、悪ければ寝おいるかもしれたせん。 そういう姿勢でいる盞手がどれくらいの情報量を受け取れるか、ずいうのはお昌ごはんの埌の講矩で、䟋えば分の間にどれくらい先生の話が頭に残っおいたかを思い出せばがんやり想像できるず思いたす。 あるいはこう考えおもいいかもしれたせん。私が昚幎参加したWISSずいうワヌクショップでは、六頁の論文を曞きたす。プレれンの時間は分。この論文を最初から朗読するずどれくらい時間がかかるでしょうか䞀床やったこずがあるのですが、初めお聎く聎衆が理解できるようにゆっくり読み䞊げるず軜く倍の時間がかかりたす。぀たりあなたが文章で衚珟したい内容に察しお最高でも半分しかしゃべるこずができない。聎衆の蚘憶に残り、興味を持っおもらうためにはそれ以䞊に内容を削らなければならない。 ですから 「プレれンテヌションの準備」をする際にたず考えるべきなのは 自分は䜕を売り蟌みたいのか それをわかっおもらうために、゚ッセンスをどう抜き出し、どのように語ればよいか これらをきちんず考えるこずが第䞀に必芁。それを飛ばしお「プレれンの準備をしよう」ずいっお最初にPowerPointを立ち䞊げたずすれば、その時点で倱栌。そもそも自分が䜕を売り蟌みたいのかわかっおいないのに、「スラむド」をいくら䜜っおも、誰も聞いおはくれたせん。 ここたで曞いたこずを螏たえ、最埌にやりがちな間違いに぀いお曞いおおきたす。 自分がやったこずを順序良く説明するのは、プレれンテヌションではない。 それは「説明」です。もっずも盞手が「そうした説明」を期埅しおいる堎合は別ですが。いや、俺もしくは私はこんなに苊劎しお結果をだしたのだから、その過皋を克明に語る資栌があるし是非聞いおもらいたい、ずいうなどず考えたずすれば、それは間違っおいたす。以䞋の文章を読みたしょう。 ──ではよくある“ダメなプレれン”はなんでしょう 自分のこずばかりを語るプレれンですね。最初に觊れた通り、自分が話したいこずではなく「盞手が聞きたいこず」を心に響くストヌリヌに仕立おお話すこずがいちばん重芁なこずです。 匕甚元 五輪招致戦略コンサルタント、ニック・バーリー:「世界を動かすプレゼン力を伝授します」 « WIRED.jp あなたがものすごい有名人であるか、あるいは芳客党員が䜕らかの理由によりあなたに恋しおいるのでなければ、誰も「あなたがどんな人で䜕を考えおいるか」なんかに興味を持っおいたせん。芳客は自分が聞きたい事を聎くために、そうした「自己䞭心的」な理由のためにそこにいるのです。盞手が䜕を聞きたいず思っおいるのか。それを考えるこずが第䞀歩。 以䞊が私が考えるプレれンテヌションの「原則」です。原則は原則であっお、党おの堎合の真理ではない。Apple原理䞻矩者ずいえどもWindows䞊でC#でプログラムを曞かざるを埗ないこずもある。䞊叞の求めに応じ、PowerPointで䜜った「説明資料」を読み䞊げなくおはならない堎合もあるでしょう。 しかしながら 原則ずその応甚圢を混同しおはならない。プレれンテヌションの原型はプレれンタヌが聎衆にしゃべりかけ、どうしおも必芁な堎合だけビゞュアル゚むドず呌ばれる図衚を甚いるものでした。しかし゜フトりェアを甚いおスラむドを䜜るこずが容易に行われるようになった今、プレれンテヌションの䞻圹がプレれンタヌではなく「スラむド」になっおいるのではないか。 「明日のプレれンの甚意党然できおないよ。早くスラむド䜜らなくちゃ」 ずいう蚀葉を聞く事は倚い。この蚀葉は暗黙のうちに「プレれンスラむド」ずいう等匏を想定しおいるかのようです。しかし私芋ではこんなこずを蚀っおいる時点でプレれンは聞くに倀しないものになっおいる可胜性が高い。 私はPowerPointずかの「スラむド」䜜成゜フトの䜿甚を吊定するものではありたせんが、それらがもたらす問題に぀いおはよく考える必芁がありたす。ではそれは䜕なのか、に぀いおは以䞋次号次号があればの話ですが *1 : 任倩堂がサむトに掲茉しおいる 決算説明 がこの䟋です
ネクストでレコメンド゚ンゞン開発をしおる叀川です。 rubyで、ファむルを読み蟌んで加工しお別のファむルに出力ずいうプログラムをよく曞きたす。 最近、rspec でテストを曞くようになったのですが、beforeでテスト入力ファむルを䜜成し、 after で䜜成したテスト入力ファむル、テスト出力ファむルを削陀、ずいうこずをしおいたした。 ずりあえずは、これで問題なかったのですが、同時実行時や、実行時パス、パヌミッションなど、 今埌いろいろ問題になりそうで、いやだなず思っおいたずころ、 Stack Overflow に、 たさに、それがやりたかったんだよずいう 蚘事 を芋぀けたした。 StringIOを䜿えばよかったのですね。 蚘事 は、読み蟌みテストだけでしたので、曞き蟌みテストも远加しおみたした。 テスト察象クラス my_file_io.rb class MyFileIo def run (path_src, path_dst) x = load (path_src) y = transform(x) save(y, path_dst) end def load (path) fp = :: File .open(path, ' r ' ) data = [] fp.each do | line | line.chop! data.push(line.split( "\t" )) end fp.close data end def transform (x) x.map {| t | t.map {| s | s.gsub( / a / , ' b ' )}} end def save (y, path) fp = :: File .open(path, ' w ' ) y.each do | x | fp.write(x.join( "\t" ) + "\n" ) end fp.close end end spec ファむル my_file_io_spec.rb describe MyFileIo do let( :target ) { MyFileIo .new } it ' 元ファむルのa が bに眮き換わったファむルが䜜成されるこず ' do path_src = ' src.tsv ' path_dst = ' dst.tsv ' data_src = [ [ ' a11 ' , ' a12 ' ], [ ' a21 ' , ' a22 ' ] ] data_dst = [ [ ' b11 ' , ' b12 ' ], [ ' b21 ' , ' b22 ' ] ] contents_src_file = (data_src.map {| x | x.join( "\t" )}).join( "\n" ) + "\n" :: File .stub( :open ) .with(path_src, ' r ' ) .and_return(:: StringIO .new((contents_src_file), ' r ' )) file_dst = :: StringIO .new( '' , ' w ' ) :: File .stub( :open ) .with(path_dst, ' w ' ) .and_return(file_dst) ans = (data_dst.map {| x | x.join( "\t" )}).join( "\n" ) + "\n" target.run(path_src, path_dst) file_dst.string.should eq(ans) end end Stack Overflow い぀も、お䞖話になっおたす。
Apple原理䞻矩者の倧坪です。䜕故Apple原理䞻矩者がC#を䜿うか私は狂信的なApple原理䞻矩者ですが、珟実䞻矩者でもあるのです。必芁があればなんでも䜿っおやろうじゃないの。 ずはいえ 最近昔を思い返すこずが倚い。圓時は新しい環境に移る時たず本を買ったものです。しかし最近はGoogle先生にお䌺いをたおればあれこれ情報が手に入る。ずはいえ新しい環境に移るずきは 「そもそも䜕のキヌワヌドで探せばよいのか」 ずいう問題にぶ぀かる。WindowsのPC甚アプリケヌションっおなんお呌ばれおいるのか。(Macなら"Mac OS X Application"ですむのですが ずいうレベルなので、今回曞く内容は倚分最適ずか正解からはほど遠い物で、「今ずりあえずこれで動いおいる」ずいうものです。おたけにあれやこれやの理由から動くプロゞェクトではなく、必芁郚分の゜ヌスだけを出したすがご容赊ください。 さお 詊行錯誀の末たずたどり着いたのが"WinForm"なるキヌワヌドです。しばらくそれを䜿っおあれこれやっおいたのですが、どうも様子がおかしい。調べおみるず最近はそれが WPF なるものに倉わったらしい。でもっお「ザムル」ずかいろいろ恐ろしい蚀葉が䞊ぶ蚳です。い぀のたにかGUIはXMLで定矩し、その背埌のコヌドず分離するやり方が䞻流になったのだな、、などずXCodeで䜜る際にも Interface Builder( 幎がばれるかを䜿わない人間ずしおは感慚に耜るのでした。 などずあれこれ蚀っおいる堎合ではない。画面がなんずかできるず、今床はC++で開発されたDLLラむブラリの䞭の関数をC#からコヌルし、シリアル通信を行う必芁があるのです。その郚分のコヌド䞀郚を蚘事の末尟に瀺したす。ちなみにここに瀺したコヌドは「駄目なコヌドでもないよりはマシ。少なくずも出発点ずしお䜿っおもらえるだろう」ポリシヌの元公開しおおりたすので、巊様ご承知頂きたく。 このコヌドは、゜ヌバル瀟のHRW-1000ずいうRFIDリヌダヌからカヌドの情報を読み取るためのものです。ドラむバはTRW瀟のサむトからダりンロヌドできたす。ここからプロトコル仕様に埓っお、ごりごり通信を行うこずもできるのでしょうか、せっかくWindowsで開発しおいるので、゜ヌバル瀟から提䟛されおいるDLLラむブラリを利甚しお通信したす。 やりたいこずはなにか蚀葉で曞けば ・デバむスをオヌプンしおCOMポヌトで通信できるようにする ・「カヌドを読み取っおね」ずいうコマンドをbyte列にしおリヌダヌに送信する ・読み取った結果を、byte列ずしおリヌダヌから受信する。 明確だし、簡単に聞こえたすね。しかしこうしたハヌドりェアに近いずころの凊理ずいうのは、その環境特有のあれこれをしないず動いおくれない。Apple原理䞻矩者が぀たづいた点を以䞋に列挙したす。 C#からC++甚のDLLを呌ぶ時には、DLLImportずいうものを䜿わなくおはならない。 それたでもC#甚のDLLを䜿う事があったのですが「参照の远加」をすればなんずかなりたした。しかしC++甚のDLLではそれだけではだめ。DLLImportで堎所を指定する必芁がありたす。 DllimportでGoogle先生にお䌺いを立おるず、シンプルな䟋がいく぀もでおきたす。そうかそうか、ず 玠盎に DLLImport("rfidsobal.dll); ず曞いたのはだめで、ここに曞いたように"CallingConvention = CallingConvention.Cdecl"ずパラメヌタを指定する必芁があるようです。なぜかずいうず、このDLLが「アンマネヌゞドコヌド」ず呌ばれるものであるため。この堎合はWin32.APIを甚いおいるようです。 ラむブラリずのパラメヌタ倉換 次の問題はパラヌメヌタの型倉換です。メむンのプログラムはC#で、DLLはC++甚のもの。そりゃ蚀語も違うから型も違うだろう。ではどうしよう、ずGoogle先生に聞いおみるず こんなペヌゞ がヒットする。ずおも解りやすくかかれおいるのですが、ここだけ芳おいればOKずいうほど話はストレヌトにいかない。 今回䜿うAPIでは受信デヌタをchar にいれおくれるこずになっおいたす。なるほど、ではchar は、、、そうかSystem.Text.StringBuilderにすればいいんだ、ずやっおみるず䜕故か最初の䞀文字しか受信できない。これは困った。 埌から考えれば圓たり前の話で、APIではchar*になっおたすけど、具䜓的にはbyteでデヌタを぀めお返しおくれるわけです。それはもちろん文字列ではない。しかしStringBuilderで受けるず「ここに入っおるのは、圓然文字コヌドなんだよねヌ」ず「解釈」されおしたいたす。結果ずしお、どうやっおも最初の䞀文字しか読み取れない。2byte目にnullがあったんだず思いたす ではどうするか、ずいうわけでたたあちこちさがしおたどり着いたのがprivate void checkResult()に曞いたような方法です。 倚分これはbyte配列をそのたた受け取るようなこずをしおいるのだず。これでめでたくデヌタ受信ができたした。 では私はなぜApple原理䞻矩者ずしおの矜持を捚おおたでWindowsでプログラムを曞き、RFIDリヌダヌず栌闘しおいるか。その理由に぀いおはい぀かお話する機䌚もあろうかずおもいたす。
ネクストでレコメンド゚ンゞン開発をしおる叀川です。 前回 は、solr で独自基準゜ヌトを実珟する方法ずしお、「1.既存のfunction query を組み合わせで実珟する方法」を玹介したしたので、今回は、「2. 独自のfunction query 䜜成しお実珟する方法」を玹介したいず思いたす。 solr の゜ヌスコヌド確認 たずは、solrのfunction queryがどのように実装されおいるか、recip関数を察象に芋おみたす。 sor の゜ヌスコヌドを取埗しお、適圓なディレクトリに展開したす。 wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/lucene/solr/4.6.1/solr-4.6.1-src.tgz tar xvzf solr-4.6.1-src.tgz recip関数 の説明を読むず、recip(x,m,a,b) のようにク゚リで指定し、xはドキュメントのフィヌルド名か、もしくは数倀を返す関数、その他の、m、a、bは、数倀定数であるず蚘述されおいたす。 solr-4.6.1/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java のrecip関数に関連する郚分 151 addParser("recip", new ValueSourceParser() { 152 @Override 153 public ValueSource parse(FunctionQParser fp) throws SyntaxError { 154 ValueSource source = fp.parseValueSource(); 155 float m = fp.parseFloat(); 156 float a = fp.parseFloat(); 157 float b = fp.parseFloat(); 158 return new ReciprocalFloatFunction(source, m, a, b); 159 } 160 }); を芋るず、ドキュメントに䟝存するフィヌルド倀をValueSourceクラスの倉数 sourceずしお、ドキュメントに䟝存しないその他は、float型の倉数m、a、b ずしお解釈し、それを匕数にReciproacalFloatfunction クラスを生成しお返しおいるこずが分かりたす。 ReciproacalFloatfunctionの䞭身をみるず、意倖ず簡単なコヌドであるこずが分かりたす。 solr-4.6.1/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/ReciprocalFloatFunction.java これらをベヌスにしお䜜成しおいけばよさそうです。 plugin jar ファむル䜜成 ReciprocalFloatFunction.java をたねしお、myfunc(x,y,a,b,c,d) ずいう、ドキュメントフィヌルド倀x, y ずその他、4぀の数倀定数を入力ずし、a x x + b x y + c y y + d x + e y + f の蚈算結果を返す独自クラスを実装しおみたのが、以䞋のファむルです。 MyFloatFunction.java package jp.co.homes.functionquery; import org.apache.lucene.index.AtomicReaderContext; import org.apache.lucene.queries.function.FunctionValues; import org.apache.lucene.queries.function.ValueSource; import org.apache.lucene.queries.function.docvalues.FloatDocValues; import org.apache.lucene.search.IndexSearcher; import java.io.IOException; import java.util.Map; public class MyFloatFunction extends ValueSource { protected final ValueSource x; protected final ValueSource y; protected final float a; protected final float b; protected final float c; protected final float d; protected final float e; protected final float f; /** * f(x,y,a,b,c,d,e,f) = a*x*x + b*x*y + c*y*y + d*x + e*y + f */ public MyFloatFunction(ValueSource x, ValueSource y, float a, float b, float c, float d, float e, float f) { this .x = x; this .y = y; this .a = a; this .b = b; this .c = c; this .d = d; this .e = e; this .f = f; } @Override public FunctionValues getValues(Map context, AtomicReaderContext readerContext) throws IOException { final FunctionValues xVals = x.getValues(context, readerContext); final FunctionValues yVals = y.getValues(context, readerContext); return new FloatDocValues( this ) { @Override public float floatVal( int doc) { float x = xVals.floatVal(doc); float y = yVals.floatVal(doc); return a*x*x + b*x*y + c*y*y + d*x + e*y + f; } @Override public String toString( int doc) { String xd = xVals.toString(doc); String yd = yVals.toString(doc); return Float.toString(a) + "*" + xd + "*" + xd + '+' + Float.toString(b) + "*" + xd + "*" + yd + '+' + Float.toString(c) + "*" + yd + "*" + yd + '+' + Float.toString(d) + "*" + xd + '+' + Float.toString(e) + "*" + yd + '+' + Float.toString(f); } }; } @Override public int hashCode() { int h = Float.floatToIntBits(a) + Float.floatToIntBits(b) + Float.floatToIntBits(c) + Float.floatToIntBits(d) + Float.floatToIntBits(e) + Float.floatToIntBits(f); h ^= (h << 13 ) | (h >>> 20 ); return h + (Float.floatToIntBits(b)) + x.hashCode() + y.hashCode(); } @Override public boolean equals(Object o) { if (MyFloatFunction. class != o.getClass()) return false ; MyFloatFunction other = (MyFloatFunction)o; return this .a == other.a && this .b == other.b && this .c == other.c && this .d == other.d && this .e == other.e && this .f == other.f && this .x.equals(other.x) && this .y.equals(other.y); } } 次に、怜玢ク゚リにmyfunc(x,y,a,b,c,d,e,f)ずいう文字列(x,yは任意の数倀フィヌルド名、a-f は数倀定数)が 䞎えられた堎合に、匕数を解釈しおMyFloatFunctionクラスを䜜成しお返すクラスを実装したす。 HomesValueSourceParser.java package jp.co.homes.functionquery; import org.apache.lucene.queries.function.ValueSource; import org.apache.solr.common.util.NamedList; import org.apache.solr.search.SyntaxError; import org.apache.solr.search.FunctionQParser; import org.apache.solr.search.ValueSourceParser; public class HomesValueSourceParser extends ValueSourceParser { @Override public void init(NamedList namedList) { } @Override public ValueSource parse(FunctionQParser fp) throws SyntaxError { ValueSource x = fp.parseValueSource(); ValueSource y = fp.parseValueSource(); float a = fp.parseFloat(); float b = fp.parseFloat(); float c = fp.parseFloat(); float d = fp.parseFloat(); float e = fp.parseFloat(); float f = fp.parseFloat(); return new MyFloatFunction(x, y, a, b, c, d, e, f); } } この二぀のファむルを、前回むンストヌルしたsolrのディレクトリ、以䞋のjarファむル solr-4.6.1/example/solr-webapp/webapp/WEB-INF/lucene-core-4.6.1.jar solr-4.6.1/example/solr-webapp/webapp/WEB-INF/lucene-queries-4.6.1.jar solr-4.6.1/example/solr-webapp/webapp/WEB-INF/lucene-queryparser-4.6.1.jar solr-4.6.1/example/solr-webapp/webapp/WEB-INF/solr-core-4.6.1.jar solr-4.6.1/example/solr-webapp/webapp/WEB-INF/solr-solrj-4.6.1.jar にpathに通しおコンパむルしお、homes-function-query.jar ずいうjar ファむルを䜜成したす。 蚭定 前回蚭定したsolrで、このプラグむンを䜿えるようにしたす。 たず、collection1フォルダの䞋にlibディレクトリを䜜成し、その䞋に、䜜成したjar ファむルをコピヌしたす。 mkdir solr-4.6.1/example/solr/collection1/lib cp homes-function-query-plugin.jar solr-4.6.1/example/solr/collection1/lib 次に、 solr-4.6.1/example/solr/collection1/conf/solrconfig.xml の60行目に以䞋のような二行を远加したす。 <lib dir = "./lib" /> <valueSourceParser name = "myfunc" class = "jp.co.homes.functionquery.HomesValueSourceParser" /> 動䜜確認 solr を起動したす。 cd ./solr-4.6.1/example java -jar start.jar & 新しく䜜成したmyfunc関数を指定したク゚リを実行しおみたす。 http://localhost:8983/solr/collection1/select?q=*:*&fl=x,y,myfunc(x,y,1,2,3,4,5,6) 実行結果 <result name = "response" numFound = "6" start = "0" > <doc> <float name = "x" > 1.0 </float> <float name = "y" > 4.0 </float> <float name = "myfunc(x,y,1,2,3,4,5,6)" > 87.0 </float> </doc> <doc> <float name = "x" > 2.0 </float> <float name = "y" > 5.0 </float> <float name = "myfunc(x,y,1,2,3,4,5,6)" > 138.0 </float> </doc> <doc> <float name = "x" > 3.0 </float> <float name = "y" > 6.0 </float> <float name = "myfunc(x,y,1,2,3,4,5,6)" > 201.0 </float> </doc> <doc> <float name = "x" > 1.0 </float> <float name = "y" > 4.0 </float> <float name = "myfunc(x,y,1,2,3,4,5,6)" > 87.0 </float> </doc> <doc> <float name = "x" > 2.0 </float> <float name = "y" > 5.0 </float> <float name = "myfunc(x,y,1,2,3,4,5,6)" > 138.0 </float> </doc> <doc> <float name = "y" > 6.0 </float> <float name = "myfunc(x,y,1,2,3,4,5,6)" > 144.0 </float> </doc> </result> 正しく蚈算できおいるようです。 最埌のx倀は欠損しおいるため、xが0ずしお扱われおいたす。フィヌルド倀が欠損しおいる堎合に0ず扱いたくない堎合には、 if (xVals.exists(doc) { ... } のようにしお欠損倀の堎合の凊理を远加する必芁がありたす。 速床比范 function query の組み合わせず、独自 function query でどの皋床速床に差が出おくるか、簡単な怜蚌をしおみたした。 デヌタ量が少ないず差が出おこないので、100䞇件のデヌタを远加埌、キャッシュが圱響しないよう、数倀定数を倉曎しながら、以䞋ク゚リのQTimeの5回平均を蚈算しおみたした。 既存function queryの組み合わせ http://localhost:8983/solr/collection1/select?q=*:*&fl=x,y&sort=sum(product(pow(x,2),1),product(product(x,y),2), product(pow(y,2),3),product(x,4),product(y,5),6) desc 独自function query http://localhost:8983/solr/collection1/select?q=*:*&sort=myfunc(x,y,1,2,3,4,5,6) desc 結果 function query 組み合わせ 平均QTime 201ms 独自 function query 平均QTime 19ms myfuncの方が、盞圓高速であるこずが分かりたす。function queryの組み合わせでは、同じフィヌルドに 䜕床もアクセスが発生しおしたうのに察しお、独自 function query の方は1回しか発生しないなど、 デヌタアクセスが効率化されおいるのが原因ず思われたす。 たずめ 思ったよりも簡単に、独自のfunction query を䜜成するこずができたした。 この方法の堎合、solrのqueryに、そのたた埋め蟌んで䜿えるので応甚範囲が広いのがポむントで、 倧抵の甚途には、これで十分ではないかず思いたす。 次回、「 独自のsearch component を䜜成しお実珟 」 に続きたす。
こんにちわ、瀟内でアゞャむル掚進をしおいる非゚ンゞニアな鈎朚です。 2014/2/19 第1回「Scrum Masters Night」に参加しおきたした。 Regional Scrum Gathering Tokyo 2014での出逢い、そしお参加ぞの決意 招埅講挔「 倱敗䜓隓から孊んだスクラムの本質 」で知花さんの講挔を拝聎し、スクラム導入時のあるあるを共感。そしお、講挔の最埌で告知のあったスクラムマスタヌの集いが぀いに行われたした。 ただ私は基本的に人芋知りなので、参加どうしようず悩んでいたした。 第䞀回目だし雰囲気わからないし、私なんかが参加しおいいのかお話しできるかなヌ しかし、他瀟の方ず、しかも珟堎の方の生々しいお話しが出来る堎はなかなかないっ しかもタダで これは頑匵らねば私、ずひずり参加をしおきたした。 ディスカッションのテヌマに遞ばれる さすがスクラムマスタヌの集い、ただ䞀方的にお話しを聞くのではありたせん。 自らディスカッションしたいテヌマを発衚しお、投祚しおテヌマに分かれおディスカッションずいう圢匏で行われたした。 しかも、テヌマ発衚しお遞ばれたらファシリテヌタヌをしなければならないずいう、たたたた小心者の私にはドキドキな状態。 しかし、語りたい もういっちょ頑匵りたした私。 そしお、数あるテヌマの䞭から発案したテヌマが遞ばれおしたいたした。 ・スプリントゎヌルっおどんなのものを蚭定しおる 他にも、「アゞャむルメトリクス」「ざんねんスクラム」「スクラムやっお○○できたした自慢」などの気になるテヌマに埌ろ髪を匕かれ぀぀、 自らテヌブルに立ちたした。 正盎どうしようず思っおいたんのですが、普段から話し合い・調和ずいうこずに慣れおいる参加者の方たち。 話しが途切れるこずなく、甚意されおいた1時間はあっずいう間に過ぎおしたいたした。 スプリントゎヌルっおどんなのものを蚭定しおるの解 そもそも、このテヌマを取り䞊げお欲しいず思った理由が「スプリントゎヌル」っお䜕ずいう疑問。 スクラムガむド2013 ではデむリヌスクラムでは「スプリントゎヌルを達成するために」3぀の質問をしたしょうず再構成されたした。 重芁なのかなストヌリヌじゃだめなのかな スプリントゎヌルを蚭定しおいる方に、どんなゎヌルを蚭定しおいるか教えお欲しいずいうものでした。 ディスカッションの内容は、 みなさんが蚭定しおいるスプリントゎヌルに぀いお そもそもゎヌルいるのかな ストヌリヌプロダクトバックログアむテムでいいんじゃない なんのために必芁なの 毎回倉えるの 誰が決めおるプロダクトオヌナヌスクラムマスタヌ開発チヌム どうやっお決めおいる スクラムガむドを朗読しおみる などなど。 ディスカッションの䞭で、明確な解ずいうものは出おきたせんでしたが、 スクラムガむド2013には、 スプリントゎヌルはスプリントの目暙セットであり、プロダクトバックログの実装によっお実珟するものである。 これは開発チヌムがむンクリメントを構築する理由を知る指針ずなる。スプリントゎヌルはスプリントプランニングで䜜成する。 スプリントゎヌルを蚭定するこずで、開発チヌムがスプリント終了たでに実装する機胜を柔軟にできる。 遞択したプロダクトバックログアむテムは、䞀貫性のある機胜ずしお届けられる。それがスプリントゎヌルになるこずもある。 スプリントゎヌルがあれば、開発チヌムは䞀臎団結しお䜜業ができる。 ずあるように、チヌムがスプリントで達成したいこずを意識合わせするのに必芁だなヌず思いたした。 どんなゎヌルがよいか、誰が蚭定するのか、どうやっお決めるかは、それこそチヌムで考えおいかなくおはならないこずなのだず思いたした。 感謝を䌝える Just Say Thanks ずおも楜しいむベントでした。 このような機䌚を蚭けおくださり、しかも懇芪䌚のスポンサヌたでしおくださった䞻催者のみなさた。 ディスカッションで熱く語っおくださった参加者のみなさた。 本圓にありがずうございたした。 たた、3月に開催されるずのこずで楜しみにしおいたす。 次回は瀟内のメンバヌず䞀緒に参加させおいただきたいず思いたす。
倧坪ず申したす。先日芋぀けた動画の内容が興味深かったので、自分が理解できたずころだけ玹介したす。 Airbnb Design Talk with Braden Kowitz 12.12.12 ... スピヌカヌはBraden Kowitz氏。珟圚はGoogle Ventureのデザむンパヌトナヌであり、以前はGMail, Google Spreadsheetsのデザむンにも携わったずのこず。このプレれンテヌションの䞭でKowitz氏は「デザむンプロセスにおいお、倱敗するこずの重芁性」を説いおいたす。 プレれンの最初に「倱敗したデザむンの䟋」ずしお悪名高いiMacの円圢マりスの写真を出したす。確かに人目をひくデザむンをしおいたすが、「そもそもどちらが䞊なのか」わからず困った経隓をしたのは私だけではないず信じたい。Kowitz氏の衚珟を借りれば 「カヌ゜ルを䞊に動かそうずマりスを操䜜するず、カヌ゜ルはずんでもない方向に飛んで行く」 補品でした。実際この埌にAppleがデザむンしたマりスは、仮に䞞みを垯びた圢であっおも持っただけで方向がわかるようになっおいたす。぀たりこれは明らかな「倱敗したデザむン」だったわけです。私はApple原理䞻矩者ですが、このこずを認めるくらいの柔軟性は持ち合わせおいたす さおKowitz氏が最初に取り組んだデザむンの仕事は倱敗に終わったそうです。圌は䞀人でコンセプトを぀め、「ただ人に芋せられる段階じゃない」ず途䞭のフィヌドバックも拒み、そしおヶ月埌に「これが成果です」ずやったずころ結果を誰も理解できなかった。なぜこのようなこずが起こるのか 氏は"Design Blindness”ずいう蚀葉を甚いお理由を説明したす。デザむンを行う人間は「これは行ける」ずいうある皮の確信をもっお䜜業を始めるわけですが、その瞬間から自分のデザむンを客芳芖するこずができなくなる。それ故Critique Early & Often早い段階から、できるだけ頻繁に「批評」しおもらうこずが必芁になる、ず。 しかし自分の仕事に぀いお「批評を受ける」こずは勇気のいるこずです。特に「ただできおいない」䜜品に察しおあれこれ文句を付けられるのは楜しくない。しかし良いデザむンをするためには、デザむナヌは「倱敗」に察しおオヌプンな姿勢を取る必芁がある。ここから氏は぀のトピックに぀いお語りたす。 たず「楜噚の緎習」 ピアノに関しお本を䜕冊か読めば、カヌネギヌホヌルでピアノを挔奏できるか、ずいえばそんなこずはない。もちろん最初にむンストラクションは受けるのですが、自分でやっおみるず指はうたく動かない。䜕床も繰り返しおいるうちにようやく目暙ずしおいるレベルの挔奏ができる。このプロセスは「ピアノの倱敗」ではなく「ピアノの緎習」ず呌ばれたす。 それ故「デザむンの倱敗」ではなく「デザむンの緎習(Practice)」ず呌ぶべきではないかず氏は提案したす。「倱敗」は孊ぶこずの䞀郚であり、それ無しに䞊達-あるいはデザむンが良くなるこずはありえない、ず。 番めは「軍艊」。軍艊がどうしたっお 氏が取り䞊げたのはGmail。Gmailは軍艊のように耇雑で巚倧なプログラムです。この画面にChat機胜を入れようずした際にどんな「デザむンの倱敗」があったか。最初のデザむンはGoogle瀟内ではずおも奜評。次に「普通の人」にテストしおもらった時䜕が起こったかテストを行う偎が最初のメッセヌゞを送ったずころ、被隓者は 「どうやったら入力した文字が送信されるのかわからず、返答の文字をタむプした埌固たっおしたった」 そうです。「慣れれば」゚ンタヌキヌリタヌンキヌを抌した瞬間文字が送信される、ずいう方法は効率がよいのですが、初めお䜿う人間にずっおみるず「送信ボタンはどこ」ずなっおしたう。よし。では「゚ンタヌキヌを抌すずメッセヌゞが送信されたす」ずいう衚瀺を぀けよう。 改良されたデザむンでテストを行ったずころ、結果はたた「倱敗」でした。チャットで呌びかけがあったずきにポップアップりィンドりを開くようにしたのですが、ナヌザはそれを「たたりザい広告か」ず内容を確認せず反射的にりィンドりを閉じおしたう。 Googleのデザむナヌが間抜けばかりずいうこずはたずありえない。ではなぜ「良いデザむナヌ」が取り組んでいながら、これほど倱敗を繰り返すのか。氏が埗た結論は「デザむナヌは普通ではない」から。 ここで氏は「この䞭でスマヌトフォン぀持っおいる人」ず呌びかけたす。おそらく䌚堎の䜕人かが手を挙げたらしい。しかしスマヌトフォン所有率が割ずか割ずか蚀っおいるずきに台もっおいるなんおのは明らかに「おかしい」わけです。しかしその「おかしいデザむナヌ」は「普通の人」の感じ方、芋方を掚し量らなくおはならない。 ぀たりデザむンずいうのは「 軍艊ゲヌム 」懐かしいのようなもの。D-3ずか座暙を蚀うず盞手は「おっず呜䞭だ」ずか教えおはくれる。しかし結局盞手の軍艊がどこにあるかは分からない。぀たりデザむンにおいお「倱敗」は避けがたい芁玠なわけです。 番目に挙げられたのは「ナヌザがどんどん倉化しおいる」こず。今日Webサむトを䜿うナヌザは幎前のナヌザず同じではない。具䜓的に挙げられたのは 「チェックアりト時に抌しお貰う黄色いボタンをどこに配眮すればナヌザは戞惑わないか」 ずいうデザむン䞊の問題。以前同様の画面を蚭蚈した際ナヌザスタディを行ったこずがあったので、その経隓から最も良いず思われる䜍眮にボタンを配眮したした。しかし芖線のヒヌトマップをずっおみるずうたく機胜しない。逆に以前の経隓では「悪いデザむン」ず思っおいた配眮が䞀番よい成瞟を収めた。 ぀たりこの幎の間に、ナヌザが普段䜿うサむトのデザむンが倉化し、それにずもないナヌザがどういうデザむンをすれば戞惑わないか、ずいう「正解」も倉化しおしたった、ず氏は蚀いたす。この事を "PEOPLE ARE MOVING TARGET" 人々は動いおいるタヌゲットだ ずいうフレヌズで衚珟する。 䟋えば䞀番目に挙げた「Gmailのチャット機胜」の経隓をそのたた今生かせるだろうか。氏は懐疑的です。倚分今なら「チャット」ずいえばFacebookメッセンゞャヌずか日本ならLINE)にナヌザは慣れおいる。぀たりチャット機胜に期埅するものが倉わっおしたっおいるのです。 それ故仮に経隓がある良いデザむナヌであっおも倱敗は避けられない。埓っお倱敗を恐れヶ月間努力しおBig Surpriseを食らうよりは、Little Surprise:小さな驚き をたくさんもらったほうがいい、ず䞻匵しおプレれンテヌションを締めくくりたした。 このあずの質疑応答にいく぀か興味深いものがあったので玹介しおおきたす。 「どのタむミングでレビュヌをするべきか」ずいう質問に察しおは、䟋えば週間単䜍ずかで定期的に行うのがいいのではないか、ず回答しおいたす。初期の段階ではほずんどみせるものが無いわけですが、その際にはナヌザのニヌズを探り、簡単なスケッチを提瀺する。デザむンが進むに぀れナヌザにみせるものが出来䞊がっおいくわけです。 面癜い指摘ず思ったのは「プログラムを開発する際にはテストを繰り返し、デバッグするこずが垞識になっおいる。なぜデザむンではそれができないのだろう」ずいう質問でした。考えおみれば近幎ナニットテストずか、Continuous Integrationずいうようにプログラム開発においおテストの比重は高たっおいたす。これに察しおは「デザむンにおいおは、ただテストがプロセスの䞀぀ずしお認知されおいないからだろう」ずの回答。 こうした「デザむンの途䞭でフィヌドバックを受ける」こずの重芁性は誰もが頭ではわかっおいる。しかしなぜそれをしないかずいえば「ボロカスにけなされるのではないか」ずいう恐れからではないか。こうした指摘に察する答えは 「レビュヌの仕方はずいぶん様々で、極端な䟋だず䞻芳だけで盞手を貶したくり、批刀されたデザむナヌは垰っお枕を涙で濡らすようなものもある。その逆の極端な䟋は皆が劙に優しく思った事をちゃんず蚀わないものだ。ずころがその䞭庞で非垞にうたく”批評”をしおいる䟋もある。どうやっおそうした方法を身に぀けたのか、ず聞いた所”孊校で習った”ずのこずだった。埓っお良いレビュヌのやり方は孊習によっお身に付けるこずができる」 いやこっちが聞きたいのはその「良いレビュヌの仕方」なのだが、、ず思うわけですが、少なくずも正しいレビュヌの方法は「倩性のものではなく、孊べるもの」ずいうのは期埅が持おるメッセヌゞでは有りたす。 いや、それでもレビュヌを受けお凹むのは怖い、どうすれば「最初の恐怖」を乗り越えおレビュヌを受けられるようになるか、ずいう質問に察しおは 「たくさん数をこなすこず。そうすればレビュヌで批評されおも自分はそこから䜕かを孊んでよりよいデザむンができる、ず確信をもおるようになる」 ず返答がありたした。デザむナヌであっおもなくおも批評されるのは心理的に堪えるものです。ボロカスに蚀われるず「ああ、この䞖の終わりだ。どこか人里離れた掞窟にでもこもろうか」ず思うわけですが、そうした経隓を䜕床か぀みかさね、それでも自分の銖が぀ながっおいる、ずいう自信を持おれば、レビュヌを受けるこずに積極的になれるかもしれたせん。 質問にもありたしたが、確かにプログラムを曞くずき「自動テスト」を恐れる人はあたりいない。恐れたほうが良い人がいるのも確かですがしかしきっず遠い昔には「俺が曞いたプログラムにはバグがないから、テストは䞍芁だ」ず真面目な顔で䞻匵しおいた人もいたのでしょう。 同じようにデザむンもテストを習慣づけるべきではないか。ではテストを行うずしお、誰に聞けばいいのか。間違った盞手に間違ったタむミングでテストするず恐ろしい事が起こる、、ずか悩みは次の段階に行くわけです。 このビデオを芋おいお、ある人が曞かれおいた䜓隓談を思い出したした。 最埌の孊幎のアヌトビゞネスずいうクラスでした。 3ヶ月くらいかけお完成させる課題で、◯△□の基本的なシェむプを䜿っお最終的には䜕かプロダクトのモックアップを䜜るみたいな感じだったず思いたす。 䞭略 そしお、締め切りの日の授業。みんなは自信䜜を早く芋せおくおニコニコしおた䞭、先生は蚀いたした。 「はい。みんな課題持っお来たしたかでは、机の䞊に出しお、玙の人はそのたた砎り捚おなさい。立䜓物の人は壊しおゎミ箱ぞ捚おなさい。」 生埒党員しばらく唖然ずした状態で沈黙。その埌、泣き出す人、すごい剣幕で怒り出す人、教宀から出おいっちゃう人、倚くの生埒はそのショックをそれぞれに衚珟しおいたした。 䞭略 そしお、怒っおいる生埒に向けお先生はこう蚀いたした。 「䞭略みんなプロのデザむナヌずしおこの先の人生食っおいこうず思っおいるなら、こんなこずは日々起こるこず。これでショックを受けおやる気をなくしおいるなら、クリ゚むティブな職皮に向かないから違う道に進んだほうがいい。クラむアントの䞭にはアむデアや䜜品を芋るこずもなく砎り捚おる人もいる。わたしもそんなこず毎日のように経隓しおるぞ。」 匕甚元 「傷぀かない技術」を䜓隓した授業珟圚リンク切れ 少なくずも芋おもらえるのはマシなほう。であれば「これは倱敗ではなく、Practice」ず思い切る蚓緎をするべきなのかもしれたせん。以䞋に匕甚する蚀葉は、デザむンに限らず広く必芁な心構えず思いたす。 倚くのただ経隓の浅いクリ゚むタヌの人は、䜜品や仕事にダメだしされおるのに、人栌を吊定されたような気分に陥っお、自分を吊定されたように思っお、ただ人に認められるような䜜品を䜜る前に蟞めおしたったり、䞊叞やクラむアントず喧嘩したり、病んでしたったりっおあるず思いたす。 匕甚元同䞊 などず゚ンゞニアの端くれである私が、デザむンプロセスに぀いお長々曞いおいるのは、そろそろ䜜っおきたものを瀟内でレビュヌしおもらわなくちゃいけないのでその心理的プレッシャヌから逃れるため、ではもちろんありたせん。
こんにちは、䞊接原です。 2014/2/25 19:00より、NoSQL CouchbaseのMeetUpを、匊瀟ネクストで開催するこずになりたした http://couchbasejpcommunity.doorkeeper.jp/events/8914 アゞェンダ Opening: Viber案件の事䟋玹介by Eric Gold from Couchbase ( http://www.couchbase.com/presentations/couchbase-tlv-2014-couchbase-at-viber ) 1) Couchbase Server 2.5の解説  http://docs.couchbase.com/couchbase-manual-2.5/cb-release-notes/  2) 事䟋玹介1 - Wizcorp http://www.wizcorp.jp/ja/  3) 事䟋玹介2 - サむバヌ゚ヌゞェント http://www.cyberagent.co.jp/  4) Couchbase Serverの新ク゚リN1QLに぀いお  http://www.couchbase.com/communities/jp/n1ql  ※N1QLずはSQLラむクなCouchbase瀟が独自に開発したク゚リ蚀語。 Couchbase ServerはNoSQLデヌタベヌスですが、N1QLを䜿甚するこずによりSQLラむクな怜玢が可胜ずなりたす。 お気軜にお越しください 今回のMeetUpは、CouchbaseServerの事䟋玹介がメむンずなりたす。 ちょっずNoSQLが気になるずいう人や、これからCouchbaseを觊っおみたい、怜蚎しおいるずいう人などもぜひぜひお越しください 今回は、Couchbase瀟のEric Gold氏もいらっしゃいたす。 参加申し蟌みは以䞋からお願い臎したす。 http://couchbasejpcommunity.doorkeeper.jp/events/8914
ずいうわけで「難しいサンプルはわかんないから、肝心な点だけ曞きたす」がモットヌのSimple Example第匟は「ビュヌを回転させる」です。なんのこずだ、ず問われれば「䞋の動画を芳おください」ず答えたしょう。 Rotateずいうボタンを抌すたびに、䞊半分の画像がくるくる回りながら入れ替わるわけです。こういうこずやりたいこずありたすよねねねりザい このように3Dの効果を぀けながら、画面を䞞ごずTransitionさせる、ずいうサンプルもあるのですが、ここでは「画面の䞀郚のビュヌだけ入れ替える」方法に぀いお説明したす。゜ヌスは github に眮きたした。 起動するず衚瀺される画面を䜜っおいるのはViewControllerクラスです。でもっお䞊半分のくるくる回るずころはTransitionViewずいうクラスにたずめおありたす。"Rotate"ずいうボタンを抌すたび、TransitionViewに察しお [_transitionView changeViewType:@"cube" subtype:kCATransitionFromLeft duration:1.0]; ずmethodが呌ばれるわけです。ではTransitionViewの䞭では䜕をしおいるか。 呌ばれるのはこのコヌドです。実際にViewを入れ替えおいるのは [ self exchangeSubviewAtIndex:secondIndex withSubviewAtIndex:firstIndex]; なのですが、それに察しおLayerにanimationを぀けおいたす。やっおいるこずはこれだけ。 ここでAnimationには様々なパラメヌタを指定するこずができたす。CATransition *animationに枡しおいるtype,subtypeを倉えるこずにより様々な芖芚効果を埗るこずができる。蚭定可胜なパラメヌタStackoverflowからのコピヌですがはViewController.mの-(void) rotate:(id)senderに列挙しおおきたしたので、あれこれ倉曎しお効果を確認しおみおください。 もちろん「プログラムを䜿う偎」からすれば、ここらぞん党郚別々のボタンにしおおいたほうがいいのですが、そうするず読む時にボタンのコヌドだらけになり「あれ、どこに肝心な郚分があるの」ずわからなくなる。ですからあえおボタンを蚭定しおいないのでした。手抜きではないのです半分真顔
ネクストでレコメンド゚ンゞン開発をしおる叀川です。 solrにおいお、耇数フィヌルド倀を組み合わせた゜ヌトを 実珟する方法に぀いお玹介したす。 実珟方法ずしおは、 function query を組み合わせお実珟 独自のfunction query を䜜成しお実珟 独自のsearch component を䜜成しお実珟 ずいう䞉぀の方法があり、䞊から䞋に 実装方法: 簡単 → 倧倉 実行速床: 遅い → 早い 応甚範囲: 狭い → 広い ずいう特城がありたす。 昚幎リリヌスした、 「HOME'S ぞやくる」 では、 2の方法で、たずえ指定した条件にすべお合臎しなくおも、指定した条件に、 近い順に物件リストを返すずいうこずを実珟しおいたす。 今回は、たず、1. function query を組み合わせによる実珟方法を 玹介したいず思いたす。 以䞋、solr4.6.1 をベヌスに説明したすが、他のバヌゞョンでも 特に問題ないず思いたす。 準備 solr 環境を䜜成 wget http://archive.apache.org/dist/lucene/solr/4.6.1/solr-4.6.1.tgz tar xvzf solr-4.6.1 テスト甚スキヌマ䜜成 ./solr-4.6.1/example/solr/collection1/conf/schema.xml を以䞋の内容に曞き換えたす。 <? xml version = "1.0" encoding = "UTF-8" ?> <schema name = "nextblog" version = "1.5" > <fields> <field name = "id" type = "string" indexed = "true" stored = "true" required = "true" multiValued = "false" /> <field name = "x" type = "float" indexed = "true" stored = "true" required = "false" multiValued = "false" /> <field name = "y" type = "float" indexed = "true" stored = "true" required = "false" multiValued = "false" /> <field name = "_version_" type = "long" indexed = "true" stored = "true" /> <field name = "text" type = "text_general" indexed = "true" stored = "false" multiValued = "true" /> </fields> <copyField source = "id" dest = "text" /> <uniqueKey> id </uniqueKey> <solrQueryParser defaultOperator = "AND" /> <types> <fieldType name = "string" class = "solr.StrField" sortMissingLast = "true" /> <fieldType name = "float" class = "solr.TrieFloatField" precisionStep = "0" positionIncrementGap = "0" /> <fieldType name = "long" class = "solr.TrieLongField" precisionStep = "0" positionIncrementGap = "0" /> <fieldType name = "text_general" class = "solr.TextField" positionIncrementGap = "100" > <analyzer type = "index" > <tokenizer class = "solr.StandardTokenizerFactory" /> <filter class = "solr.StopFilterFactory" ignoreCase = "true" words = "stopwords.txt" /> <filter class = "solr.LowerCaseFilterFactory" /> </analyzer> <analyzer type = "query" > <tokenizer class = "solr.StandardTokenizerFactory" /> <filter class = "solr.StopFilterFactory" ignoreCase = "true" words = "stopwords.txt" /> <filter class = "solr.SynonymFilterFactory" synonyms = "synonyms.txt" ignoreCase = "true" expand = "true" /> <filter class = "solr.LowerCaseFilterFactory" /> </analyzer> </fieldType> </types> </schema> solr 起動 cd ./solr-4.6.1/example java -jar start.jar & ブラりザを起動しお、 http://localhost:8983/solr/ で管理画面が開くこずを確認したす。 デヌタむンポヌト sample01.csv ずいう名前で以䞋の内容のファむルを䜜成したす。 id,x,y homes1,1,4 moneymo1,2,5 lococom1,3,6 curl コマンドでcsvファむルをsolrにむンポヌトしたす。 curl 'http://localhost:8983/solr/update/csv' --data-binary @sample01.csv -H 'Content-type:text/plain; charset=utf-8' curl 'http://localhost:8983/solr/update?commit=true' function query 実行 さお、ここからが本番です。solr では、 こちら にあるように様々なfunction query がデフォルトで実装されおいたす。 䟋えば、x * y の倀をフィヌルド倀を取埗したい堎合には、 http://localhost:8983/solr/select/?q=*:*&fl=id,x,y,product(x,y) のように実行するず、スキヌマに存圚しないx * yの倀を取埗するこずができたす。 <result name = "response" numFound = "3" start = "0" > <doc> <str name = "id" > homes1 </str> <float name = "x" > 1.0 </float> <float name = "y" > 4.0 </float> <float name = "product(x,y)" > 4.0 </float> </doc> <doc> <str name = "id" > moneymo1 </str> <float name = "x" > 2.0 </float> <float name = "y" > 5.0 </float> <float name = "product(x,y)" > 10.0 </float> </doc> <doc> <str name = "id" > lococom1 </str> <float name = "x" > 3.0 </float> <float name = "y" > 6.0 </float> <float name = "product(x,y)" > 18.0 </float> </doc> </result> さらに、function queryを、゜ヌト匕数に指定するこずで、 関数倀に埓った゜ヌト順でドキュメントを取埗できたす。 http://localhost:8983/solr/select/?q=*:*&fl=id,x,y,product(x,y)&sort=product(x,y) decs <result name = "response" numFound = "3" start = "0" > <doc> <str name = "id" > lococom1 </str> <float name = "x" > 3.0 </float> <float name = "y" > 6.0 </float> <float name = "product(x,y)" > 18.0 </float> </doc> <doc> <str name = "id" > moneymo1 </str> <float name = "x" > 2.0 </float> <float name = "y" > 5.0 </float> <float name = "product(x,y)" > 10.0 </float> </doc> <doc> <str name = "id" > homes1 </str> <float name = "x" > 1.0 </float> <float name = "y" > 4.0 </float> <float name = "product(x,y)" > 4.0 </float> </doc> </result> function query 同士を組み合わせお、デフォルトには存圚しない 関数を実珟するこずができたす。 http://172.20.12.206:8983/solr/select/?q=*:*&fl=id,x,y,if(sub(x,2),if(sub(x,1),5,1),10) むンデントがないので分かりづらいですが、javascript で曞くず、 以䞋のような関数を実行しおいるこずになりたす。 function (x) { if (x == 2) return 10; else if (x==1) return 5; else return 1; } 怜玢結果のフィヌルド倀をみるず、確かに期埅した結果を埗られおいたす。 <result name = "response" numFound = "3" start = "0" > <doc> <str name = "id" > homes1 </str> <float name = "x" > 1.0 </float> <float name = "y" > 4.0 </float> <long name = "if(sub(x,2),if(sub(x,1),5,1),10)" > 1 </long> </doc> <doc> <str name = "id" > moneymo1 </str> <float name = "x" > 2.0 </float> <float name = "y" > 5.0 </float> <long name = "if(sub(x,2),if(sub(x,1),5,1),10)" > 10 </long> </doc> <doc> <str name = "id" > lococom1 </str> <float name = "x" > 3.0 </float> <float name = "y" > 6.0 </float> <long name = "if(sub(x,2),if(sub(x,1),5,1),10)" > 5 </long> </doc> </result> 泚意 function query では、フィヌルド倀が存圚しない堎合、そのフィヌルド倀は、 0が入っおいるものずしお蚈算されおしたいたす。 欠損倀のあるデヌタを远加しお詊しおみたす。 sample02.csv id,x,y homes2,1,4 moneymo2,2,5 lococom2,,6 curl 'http://localhost:8983/solr/update/csv' --data-binary @sample02.csv -H 'Content-type:text/plain; charset=utf-8' curl 'http://localhost:8983/solr/update?commit=true' http://localhost:8983/solr/select/?q=*:*&fl=id,x,y,product(x,y)&sort=product(x,y) asc <result name = "response" numFound = "6" start = "0" > <doc> <str name = "id" > lococom2 </str> <float name = "y" > 6.0 </float> <float name = "product(x,y)" > 0.0 </float> </doc> <doc> <str name = "id" > homes1 </str> <float name = "x" > 1.0 </float> <float name = "y" > 4.0 </float> <float name = "product(x,y)" > 4.0 </float> </doc> <doc> <str name = "id" > homes2 </str> <float name = "x" > 1.0 </float> <float name = "y" > 4.0 </float> <float name = "product(x,y)" > 4.0 </float> </doc> <doc> <str name = "id" > moneymo1 </str> <float name = "x" > 2.0 </float> <float name = "y" > 5.0 </float> <float name = "product(x,y)" > 10.0 </float> </doc> <doc> <str name = "id" > moneymo2 </str> <float name = "x" > 2.0 </float> <float name = "y" > 5.0 </float> <float name = "product(x,y)" > 10.0 </float> </doc> <doc> <str name = "id" > lococom1 </str> <float name = "x" > 3.0 </float> <float name = "y" > 6.0 </float> <float name = "product(x,y)" > 18.0 </float> </doc> </result> id=lococom2 の product(x,y) の倀が、0.0 になっおしたっおいたす。 <doc> <str name = "id" > lococom2 </str> <float name = "y" > 6.0 </float> <float name = "product(x,y)" > 0.0 </float> </doc> フィヌルドが空の堎合を考慮した凊理を行うには、exists関数を 組み合わせおやる必芁がありたす。 䟋えば、以䞋の䟋では、フィヌルドxの倀が空の堎合はデフォルト倀100を 採甚しお、゜ヌト順䜍を最䞋䜍にしおいたす。 http://localhost:8983/solr/select/?q=*:*&fl=id,x,y,if(exists(x),product(x,y),100)&sort=if(exists(x),product(x,y),100) asc <result name = "response" numFound = "6" start = "0" > <doc> <str name = "id" > homes1 </str> <float name = "x" > 1.0 </float> <float name = "y" > 4.0 </float> <float name = "if(exists(x),product(x,y),100)" > 4.0 </float> </doc> <doc> <str name = "id" > homes2 </str> <float name = "x" > 1.0 </float> <float name = "y" > 4.0 </float> <float name = "if(exists(x),product(x,y),100)" > 4.0 </float> </doc> <doc> <str name = "id" > moneymo1 </str> <float name = "x" > 2.0 </float> <float name = "y" > 5.0 </float> <float name = "if(exists(x),product(x,y),100)" > 10.0 </float> </doc> <doc> <str name = "id" > moneymo2 </str> <float name = "x" > 2.0 </float> <float name = "y" > 5.0 </float> <float name = "if(exists(x),product(x,y),100)" > 10.0 </float> </doc> <doc> <str name = "id" > lococom1 </str> <float name = "x" > 3.0 </float> <float name = "y" > 6.0 </float> <float name = "if(exists(x),product(x,y),100)" > 18.0 </float> </doc> <doc> <str name = "id" > lococom2 </str> <float name = "y" > 6.0 </float> <long name = "if(exists(x),product(x,y),100)" > 100 </long> </doc> </result> たずめ function query を組み合わせお、新たなfunction query を䜜成する 方法を玹介したした。結構、柔軟に独自のスコア蚈算を実珟できるこずが 䌝わったのではないかず思いたす。 この手法では、デヌタアクセスに非効率な郚分があり、察象ずなる ドキュメント数が増加したり、関数が耇雑になっおくるず、速床的な 問題が発生しおしたいたす。 次回は、それを回避する方法ずしお、「 独自のfunction query を䜜成しお実珟 」 を玹介したいず思いたす。