<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>おれのエンジニア力がそんなに高いわけがない</title>
<link>https://ameblo.jp/noritaka-okada/</link>
<atom:link href="https://rssblog.ameba.jp/noritaka-okada/rss20.xml" rel="self" type="application/rss+xml" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<description>おもに並以下の技術ネタを書いてるのでそれなりの人が読んでも幸せにはなれません。</description>
<language>ja</language>
<item>
<title>test</title>
<description>
<![CDATA[ <div style="WIDTH: 325px"><a href="http://stat.ameba.jp/user_images/20140203/11/noritaka-okada/71/bd/p/o0320024012833847838.png"><img alt="ピグライフ スナップショット" src="https://stat.ameba.jp/user_images/20140203/11/noritaka-okada/71/bd/p/o0320024012833847838.png" border="0"></a><div style="TEXT-ALIGN: right"><a href="http://life.pigg.ameba.jp/user/noritaka-okada/" target="_blank">→ピグライフのお庭へ</a></div></div><br><div>本文はここから</div>
]]>
</description>
<link>https://ameblo.jp/noritaka-okada/entry-11763874134.html</link>
<pubDate>Mon, 03 Feb 2014 11:42:29 +0900</pubDate>
</item>
<item>
<title>[node.js]特定の処理のときだけclusterを使いたい</title>
<description>
<![CDATA[ やってみた。<br><br><pre class="program"><br>var cluster = require('cluster');<br>var cpus = require('os').cpus().length;<br><br>// メインプロセスの処理<br>function main() {<br>    console.log('main start ==================================');<br><br>    cluster.on('exit', function(worker, code, signal) {<br>        console.log('worker exit.', worker.id);<br><br>        for (var id in cluster.workers) {<br>            return;<br>        }<br><br>        // 全workerの処理が終了<br>        console.log('finish!!');<br>    });<br><br>    cluster.on('fork', function(worker) {<br>        // workerに送信<br>        worker.send({ id: worker.id, signal: '処理を開始して' });<br><br>        // workerから終了通知を受け取る<br>        worker.on('message', function(msg) {<br>            var w = cluster.workers[msg.id];<br><br>            w.send({<br>                id: w.id,<br>                signal: 'exit'<br>            });<br>        });<br>    });<br><br>    for (var i = 0; i &lt; cpus; i++) {<br>        cluster.fork();<br>    }<br>}<br><br>if (cluster.isWorker) {<br>    process.on('message', function(m) {<br>        // masterから受信<br><br>        if (m.signal === 'exit') {<br>            // masterから終了通知されたらworkerをexit<br>            return process.exit(0);<br>        }<br><br>        // workerの処理<br>        console.log('workerだよん');<br>        process.send({ id: m.id, status: '処理終わったよ' });<br>    });<br><br>    return;<br>}<br><br>main();<br><br>setTimeout(function() {<br>    main();<br>}, 3000);<br></pre><br><br>普段は1プロセスで動いてる場合を想定していて、<br>mainという関数を実行するときだけclusterを起動して処理を分散させます。<br><br>実行結果↓<br><pre class="program"><br>main start ==================================<br>workerだよん                                 <br>workerだよん                                 <br>worker exit. 1                               <br>worker exit. 4                               <br>workerだよん                                 <br>worker exit. 2                               <br>workerだよん                                 <br>worker exit. 3                               <br>finish!!                                     <br>main start ==================================<br>workerだよん                                 <br>workerだよん                                 <br>worker exit. 5                               <br>worker exit. 5                               <br>workerだよん                                 <br>workerだよん                                 <br>worker exit. 8                               <br>worker exit. 8                               <br>workerだよん                                 <br>workerだよん                                 <br>worker exit. 7                               <br>worker exit. 7                               <br>workerだよん                                 <br>workerだよん                                 <br>worker exit. 6                               <br>finish!!                                     <br>worker exit. 6                               <br>finish!!                                     <br></pre><br><br>2回目がなんかおかしい。なぜか2回ずつ動いてる。<br>結構悩んだんだけど、気付いたら至極単純なミスだったんだけど、<br>cluster.on(type, fn);<br>したら<br>EventEmitterにaddListenerされるので<br>2回目はexit, forkイベントに2つずつリスナーが存在していたという罠。<br><br>いや、罠でもなんでもなくて気づくのに時間かかっただけなんだけど。。。<br><br>ということで<br>cluster.onする前にremoveListenerしましょうね、というお話でした。
]]>
</description>
<link>https://ameblo.jp/noritaka-okada/entry-11545425335.html</link>
<pubDate>Wed, 05 Jun 2013 15:19:54 +0900</pubDate>
</item>
<item>
<title>[node.js]Object.seal(obj)とかObject.freeze(obj)とか</title>
<description>
<![CDATA[ コンストラクタで宣言されていないプロパティへのセットを防ぎたくていろいろ探してたところ<br><a href="http://msdn.microsoft.com/ja-jp/library/ie/ff806192(v=vs.94).aspx">Object.seal 関数 (JavaScript)</a><br>というのを見つけたので試してみた。<br><br><pre class="program"><br>function User() {<br>    this.name = undefined;<br><br>    Object.seal(this);<br>}<br><br>var user = new User();<br>user.name = 'まどか'; // セットできる<br>user.age = 14; // セットできない<br>                            <br>console.log(user); // =&gt; { name: 'まどか' }<br></pre><br>いい感じ。<br><br>さらにObject.freeze(obj)を使うとwritableがfalseになるので、<br>書き込み不可なオブジェクトを使いたい場合にはいいかも。<br><br><pre class="program"><br>function User(name) {<br>    this.name = name;<br><br>    Object.freeze(this);<br>}<br><br>var user = new User('ほむほむ');<br>user.name = 'まどか'; // セットできない<br>user.age = 14; // セットできない<br>                            <br>console.log(user); // =&gt; { name: 'ほむほむ' }<br></pre><br>うんうん。
]]>
</description>
<link>https://ameblo.jp/noritaka-okada/entry-11504007950.html</link>
<pubDate>Wed, 03 Apr 2013 15:03:34 +0900</pubDate>
</item>
<item>
<title>node.jsで行処理</title>
<description>
<![CDATA[ <a href="http://paulownia.hatenablog.com/entry/2012/09/29/024439" target="_blank">node.jsで行処理 - NullPointer's Blog</a><br><br>を参考にイベント駆動な行処理を書いてたんですが、<br>100行毎になんか処理させる　みたいなことがやりたくなったので<br>ちょっとだけ細工してみた。<br><br>LineReader側<br><pre class="program"><br>LineReader.prototype._onStreamData = function(chunk) {<br>    this.rs.pause();<br>    this.buf += chunk;<br><br>    var self = this;<br>    (function searchLine() {<br>        var i = self.buf.indexOf('\n');<br>        if (i &gt;= 0) {<br>            var line = self.buf.slice(0, i + 1);<br>            self.buf = self.buf.slice(i + 1);<br>            self.emit('line', line, searchLine);<br>        } else {<br>            self.rs.resume();<br>        }<br>    })();<br>};<br><br></pre><br><br>ロジック<br><pre class="program"><br>var list = [];<br><br>reader.on('line', function(line, callback) {<br>    list.push(line);<br><br>    if (list.length &lt; 100) {<br>        return callback();<br>    }<br>    <br>    hogehoge(list, function() {<br>        list = [];<br>        callback();<br>    });<br>});<br><br></pre><br><br>という感じ。<br>lineイベントを発火するときに一緒にsearchLineを渡すことで<br>次の行を読むタイミングをロジック側に任せてます。<br>で、ロジック側では一定数（↑では100件）までは溜めるだけにしておいて<br>溜まったらhogehogeを実行！<br><br>あんまり良いやり方じゃないかもしれないけどね。<br><br><br>
]]>
</description>
<link>https://ameblo.jp/noritaka-okada/entry-11414549858.html</link>
<pubDate>Tue, 27 Nov 2012 20:57:41 +0900</pubDate>
</item>
<item>
<title>[MongoDB]forEachとJavaScriptで複雑な問い合わせを実現する。</title>
<description>
<![CDATA[ 今日の午前中の成果。<br><br><pre class="program"><br>&gt;db.Hoge.find();<br>{_id:1, part1:{code:A, name:madoka}, part2:{code:B, name:homura}, part3:{code:A, name:madoka}}<br>{_id:2, part2:{code:B, name:homura}, part4:{code:C, name:mami}}<br>{_id:3, part1:{code:B, name:homura}, part2:{code:A, name:madoka}}<br></pre><br>のようなデータに対し、「code:A」のレコードを取得したいとします。<br><br>code:Aがpart1にしか存在しないとかだと簡単なのですが、<br>上記のようにcode:Aがどのpartに出てくるかわからない場合、<br>MongoDB標準のクエリではできないみたいです。（もしあったら教えてください）<br><br><br>で、これを実現するために書いたクエリが↓<br><pre class="program"><br>&gt; db.Hoge.find().forEach(function(rec){for(field in rec) {var data = rec[field];if(data&amp;&amp;data.code){if(data.code=="A"){print("_id:" + rec._id + " -&gt; " + field + ".code." + data.code)}}}});<br>_id:1 -&gt; part1.code.A<br>_id:1 -&gt; part3.code.A<br>_id:3 -&gt; part2.code.A<br></pre><br>という感じです。<br>forEachでカーソル1件ずつ処理できるので、<br>JavaScriptでfunction書いて全partに対してcodeのチェックをしています。<br>（上ではpart以外のfieldもチェックしてますがｗ）<br><br><br>JavaScriptをストアドみたいに使えるのでけっこうなんでもできるんじゃないかと思います。<br><br><br><a href="http://click.affiliate.ameba.jp/affiliate.do?affiliateId=17729074" alt0="BlogAffiliate" target="_blank" rel="nofollow">実践JS サーバサイド JavaScript 入門/井上 誠一郎<br><img src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fecx.images-amazon.com%2Fimages%2FI%2F51y%252BXCxFwZL._SL160_.jpg" border="0"></a><br>￥3,570<br>Amazon.co.jp<br><br><a href="http://click.affiliate.ameba.jp/affiliate.do?affiliateId=17729073" alt0="BlogAffiliate" target="_blank" rel="nofollow">Document Design for Mongodb/著者不明<br><img src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fecx.images-amazon.com%2Fimages%2FI%2F51K0tJ3Gy0L._SL160_.jpg" border="0"></a><br>￥3,570<br>Amazon.co.jp<br><br>
]]>
</description>
<link>https://ameblo.jp/noritaka-okada/entry-11078167137.html</link>
<pubDate>Mon, 14 Nov 2011 11:55:52 +0900</pubDate>
</item>
<item>
<title>スナップショットなう</title>
<description>
<![CDATA[ <div style="WIDTH: 325px"><a href="http://stat.ameba.jp/user_images/20111004/05/noritaka-okada/3d/a7/p/o0320024011524971949.png"><img alt="ピグライフ スナップショット" src="https://stat.ameba.jp/user_images/20111004/05/noritaka-okada/3d/a7/p/o0320024011524971949.png" border="0"></a><div style="TEXT-ALIGN: right"><a href="http://pigg-life.ameba.jp/user/noritaka-okada/" target="_blank">→ピグライフのお庭へ</a></div></div><br><div>本文はここから</div>
]]>
</description>
<link>https://ameblo.jp/noritaka-okada/entry-11037575176.html</link>
<pubDate>Tue, 04 Oct 2011 05:22:52 +0900</pubDate>
</item>
<item>
<title>[MongoDB]実行計画 $explain</title>
<description>
<![CDATA[ MongoDBもSQLと同じようにオプティマイザが実行計画を作っていて、<br>その実行計画を元にクエリを実行しています。<br><br>実行計画を確認するには、<br><pre class="program"><br>&gt;db.hoge.find().explain();<br>{<br>"cursor" : "BasicCursor",<br>"nscanned" : 4,<br>"nscannedObjects" : 4,<br>"n" : 4,<br>"millis" : 0,<br>"nYields" : 0,<br>"nChunkSkips" : 0,<br>"isMultiKey" : false,<br>"indexOnly" : false,<br>"indexBounds" : {<br><br>}<br>}<br></pre><br>みたいな。<br><br>上記だと全件取得なのでindexが使われておらず、<br>"cursor" : "BasicCursor" になっています。<br>とはいえ4件しかないからめちゃくちゃ速い("millis" : 0)ですが。<br><br><pre class="program"><br>&gt;db.hoge.find({"_id":"madoka"}).explain();<br>{<br>"cursor" : "BtreeCursor _id_",<br>"nscanned" : 1,<br>"nscannedObjects" : 1,<br>"n" : 1,<br>"millis" : 56,<br>"nYields" : 0,<br>"nChunkSkips" : 0,<br>"isMultiKey" : false,<br>"indexOnly" : false,<br>"indexBounds" : {<br>"_id" : [<br>[<br>"e39d9bfe5c521e2e",<br>"e39d9bfe5c521e2e"<br>]<br>]<br>}<br>}<br></pre><br>"cursor" : "BtreeCursor _id_" になりました。<br>これは _id_ というindexを使ってるという意味です。<br>MongoDBのindexはB-Treeで構築されていることもわかります。<br><br>ちなみに _id_ はcollectionが作られた際に _id に対して自動的に貼られるindexです。<br>RDBで言うところのprimary keyに貼られるunique indexみたいなもんです。<br><br>・どれだけ時間かかってるのか (millis)<br>・indexが使われているのか (cursor)<br>・そのindexは効果的なのか (nscanned : スキャン対象のオブジェクト数。多いとindexの効果が薄い)<br>といったことがわかります。<br><br><br>今担当してるPJでは _id_ 以外のindexは貼らない方針なのであまり使わないですが、<br>どうしても _id 以外で検索かける必要が出てきたら要注意だな～と。<br><br><br>MongoDBのチューニングについて詳しいスライドがあったので載せておこう。<br><div style="width:425px" id="__ss_7960592"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/matsuou1/20110514-mongo-db" title="20110514 mongo dbチューニング" target="_blank">20110514 mongo dbチューニング</a></strong> <iframe src="https://www.slideshare.net/slideshow/embed_code/7960592" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/matsuou1" target="_blank">Yuichi Matsuo</a> </div> </div><br><br><a href="http://click.affiliate.ameba.jp/affiliate.do?affiliateId=16859748" alt0="BlogAffiliate" target="_blank" rel="nofollow">NoSQLデータベースファーストガイド/佐々木 達也<br><img src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fecx.images-amazon.com%2Fimages%2FI%2F41eQ1UKh7JL._SL160_.jpg" border="0"></a><br>￥2,310<br>Amazon.co.jp<br><br>
]]>
</description>
<link>https://ameblo.jp/noritaka-okada/entry-11014763206.html</link>
<pubDate>Sun, 11 Sep 2011 17:28:02 +0900</pubDate>
</item>
<item>
<title>[MongoDB]$unset, $rename</title>
<description>
<![CDATA[ 最近仕事で使ったコマンドの使い方を整理しとく。<br><br>【$unset】<br>フィールドを削除する。<br><br>基本的な使い方は、<br>db.hoge.update({}, { $unset : { fieldname : 1 } });<br><br>SQLで書くと<br>ALTER TABLE hoge DROP COLUMN filedname;<br><br>になります。<br>ただ、JSONでデータを持ってるMongoDBではデータを<br>{ _id : code, name : madoka, score : { math : 50, english : 24, science : 61 }}<br>のように階層構造的に持つことができるため$unsetの使い方も注意が必要。<br><br>上の例で欠点になってる英語のデータを消したいってときは<br>db.hoge.update({ _id : code }, { $unset : { score.english : 1 } });<br>になります。<br><br>db.hoge.update({ _id : code }, { $unset : { score : 1 } });<br>だとscore自体が消えてしまうので"."で繋いでフィールドを指定します。<br><br>ちなみにupdateの第１引数({ _id : code })はセレクタ（SQLでいうところのWHERE句）です。<br>指定しない({})と、まどか以外のデータも消えてしまいます。円環の理に導かれて。<br><br><strong><font color="#FF0000">※2012/01/18 修正</font><br>第一引数を{}にしても1件しか変更されませんでした。<br>複数行まとめて更新する場合は第四引数(multi)をtrueにする必要があります。<br></strong><br><br><br>【$rename】<br>フィールド名を変更する。<br><br>基本的な使い方は、<br>db.hoge.update({}, { $rename : { oldname : newname } });<br><br>SQLでは<br>ALTER TABLE hoge RENAME COLUMN oldname TO newname;<br>ですね。使ったことないけど。<br><br>$renameで便利だなぁと感じたのは、単に名前を変更するだけじゃなく<br>階層自体を変更できること。<br>例えば、上でも例にあげた<br>{ _id : code, name : madoka, score : { math : 50, english : 24, science : 61 }}<br>が、１学期のテストのスコアだとすると、２学期のスコアどうやって入れんの？ってことになる。<br>scoreをscore_firstみたいにrenameして、score_secondをupdateで入れてもいいけど、<br>score_*****って記述が複数になるのでなんかダサイ。<br><br>よし、じゃあscoreの下にもう１つレイヤー作ろう！<br>db.hoge.update({}, { $rename : { score : score.first } });<br><br>⇒{ _id : code, name : madoka, score : { first : { math : 50, english : 24, science : 61 }}}<br><br>これで２学期のデータはscore.secondでupdateすればOKですね。<br><br><br>今日は台風来てるのでこのへんで。<br>↓アフィリエイト貼ってみた。<br><br><a href="http://click.affiliate.ameba.jp/affiliate.do?affiliateId=16742757" alt0="BlogAffiliate" target="_blank" rel="nofollow">MongoDB: The Definitive Guide/Kristina Chodorow<br><img src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fecx.images-amazon.com%2Fimages%2FI%2F519FeX1yFUL._SL160_.jpg" border="0"></a><br>￥3,261<br>Amazon.co.jp<br><br><a href="http://click.affiliate.ameba.jp/affiliate.do?affiliateId=16742756" alt0="BlogAffiliate" target="_blank" rel="nofollow">魔法少女まどか☆マギカ ねんどろいど 鹿目まどか (ノンスケール ABS&amp;PVC塗装済み可動フ.../グッドスマイルカンパニー<br><img src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fecx.images-amazon.com%2Fimages%2FI%2F41SE7FJZFOL._SL160_.jpg" border="0"></a><br>￥3,500<br>Amazon.co.jp<br><br>
]]>
</description>
<link>https://ameblo.jp/noritaka-okada/entry-11006479505.html</link>
<pubDate>Sat, 03 Sep 2011 15:25:52 +0900</pubDate>
</item>
<item>
<title>2011/08/18</title>
<description>
<![CDATA[ <div style="text-align: center;"><a href="http://stat.ameba.jp/user_images/20110818/18/noritaka-okada/b4/63/g/o0180021011425870507.gif"><img border="0" alt="ﾋﾟｸﾞ" src="https://stat.ameba.jp/user_images/20110818/18/noritaka-okada/b4/63/g/o0180021011425870507.gif"></a><br><a href="http://m.pigg.ameba.jp/coordinate/publicDetail?amebaId=noritaka-okada&amp;from=blog&amp;guid=ON">のりさんのﾋﾟｸﾞを見る</a></div><br><br>てすと
]]>
</description>
<link>https://ameblo.jp/noritaka-okada/entry-10990110554.html</link>
<pubDate>Thu, 18 Aug 2011 18:48:45 +0900</pubDate>
</item>
<item>
<title>[java]SuperCSVでParseDateするときに空データがやっかいな件</title>
<description>
<![CDATA[ 久々に更新。<br>ちょっと離れてる間にチーム異動して、今JavaやってないんですがJavaネタで書きます。<br><br>CSV扱う用のライブラリはいくつもあるんだけど、<br>今回は<a href="http://honeplus.blog50.fc2.com/blog-entry-69.html" target="_blank">この辺</a>を参考にSuperCSVを選択してみた。<br><br>使い方はこんな感じ。<br><br>mainクラス<br><pre class="program"><br>public static void main(String args[]) {<br>try {<br>ICsvBeanReader file = new CsvBeanReader(new FileReader(args[0]),<br>CsvPreference.EXCEL_PREFERENCE);<br>final String[] header = file.getCSVHeader(true);<br>SampleBean sample = null;<br>while ((sample = file.read(SampleBean.class, header,<br>SampleBean.processors)) != null) {<br>System.out.println(sample.getId());<br>System.out.println(sample.getName());<br>System.out.println(sample.getDate());<br>}<br>} catch (Exception e) {<br>System.out.println(e);<br>}<br>}<br></pre><br>Beanクラス<br><pre class="program"><br>public class SampleBean {<br><br>private String id;<br>private String name;<br>aprivate Date date;<br><br>public static final CellProcessor[] processors = new CellProcessor[] {<br>new Unique(new StrMinMax(1,10)),<br>new StrMinMax(1,30)),<br>new ParseDateEx("yyyy/MM/dd")<br>};<br><br>public String getId() {<br>return Id;<br>}<br>public void setId(String id) {<br>this.id = id;<br>}<br>public String getName() {<br>return name;<br>}<br>public void setName(String name) {<br>this.name = name;<br>}<br>public Date getDate() {<br>return date;<br>}<br>public void setDate(Date date) {<br>this.date = date;<br>}<br>}<br></pre><br>基本的にはこれだけで動きます。<br>で、やってみたのですが、、、Dateが空のデータがあると落ちます(;ﾟДﾟ)<br><br>ParseDateのソース読むと、value == nullでNullInputExceptionをスローするらしい。<br>今回はDateが空のときにnullをセットしてほしいのでこれではムリ。<br><br>もしかしたらちゃんとしたやり方があるのかもしれないけど、<br>今回はParseDateを使わずにParseDateを継承したParseDateExを作って逃げる。<br><br>execute()の<br><pre class="program"><br>final Date result = formatter.parse((String) value);<br>return next.execute(result, context);<br></pre>を<br><pre class="program"><br>Date result = null;<br>if (value != null &amp;&amp; !"".equals((String)value)) {<br>result = formatter.parse((String) value);<br>}<br>return next.execute(result, context);<br></pre><br>こうするだけです。<br>next.executeはresultを返却してくるだけなので問題ない。<br><br>と思ったら今度はCsvBeanReader#fillObjectでぬるぽ発生。<br>setterメソッド名を取得するところで、Processorで定義したフォーマットにparseした結果を使っているので<br>parseした結果がnullだとダメみたい。<br>でもMethodCache#getSetMethodはvariableTypeがnullでもある程度信頼できるメソッド名が取得できそうなので<br>CsvBeanReaderの実装がイマイチだなぁと思いつつ、仕方ないのでMyCsvBeanReaderを作って<br><br>fillObject()の<br><pre class="program"><br>cache.getSetMethod(resultBean, nameMapping[i], lineResult.get(i).getClass()).invoke(resultBean, lineResult.get(i));<br></pre>を、<br><pre class="program"><br>Class<!--? extends Object--> resultClass = null;<br>Object resultObj = lineResult.get(i);<br>if (resultObj != null) {<br>resultClass = resultObj.getClass();<br>}<br>cache.getSetMethod(resultBean, nameMapping[i], resultClass).invoke(resultBean, resultObj);<br></pre><br>で動きました。<br><br>でも空文字の対処方法はちゃんと用意されてると思うだけどなー。<br>英語のドキュメント読むのが面倒だったせいでこんなことになりました。<br><br>いじょ。<br><br>次回はそろそろnode.jsネタを書きたい！
]]>
</description>
<link>https://ameblo.jp/noritaka-okada/entry-10978597961.html</link>
<pubDate>Sun, 07 Aug 2011 18:10:44 +0900</pubDate>
</item>
</channel>
</rss>
