<?xml version="1.0" encoding="utf-8" ?>


<?xml-stylesheet href="http://d.hatena.ne.jp/krustf/rssxsl" type="text/xsl" media="screen"?>


<rdf:RDF
xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xml:lang="ja">
<channel rdf:about="http://d.hatena.ne.jp/krustf/rss">
<title>krustf の雑記</title>
<link>http://d.hatena.ne.jp/krustf/</link>
<description>krustf の雑記</description>

<dc:creator>krustf</dc:creator>
<dc:date>2013-06-08T18:35:58+09:00</dc:date>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://d.hatena.ne.jp/krustf/20130608/1370683951"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/krustf/20130517/1368786133"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/krustf/20130420/1366387160"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/krustf/20130310/1362920130"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/krustf/20130309/1362799878"/>
</rdf:Seq>
</items>
</channel>



<item rdf:about="http://d.hatena.ne.jp/krustf/20130608/1370683951">
<title>[boost][C++] Boost.勉強会 #11 で発表してきた</title>
<link>http://d.hatena.ne.jp/krustf/20130608/1370683951</link>
<description> Boost.勉強会 #11 東京 - boostjp 茨城の山奥に行ったりとか，書類書いてたりとかして1週間も経ってしまいましたが書きます． ”CilkPlus, TBB, OpenMP 〜 並列プログラミングを支える技術” という大層なタイトルで発表してましたが，つまるところこの辺のライブラリとかコン</description>

<content:encoded><![CDATA[
<div class="section">
<p><a href="https://sites.google.com/site/boostjp/study_meeting/study11" target="_blank">Boost.勉強会 #11 東京 - boostjp</a></p>
<p>茨城の山奥に行ったりとか，書類書いてたりとかして1週間も経ってしまいましたが書きます．</p>
<p>"CilkPlus, TBB, OpenMP 〜 並列プログラミングを支える技術" という大層なタイトルで発表してましたが，つまるところこの辺のライブラリとかコンパイラ拡張の紹介です．</p>
<p>発表スライド: <a href="http://www.slideshare.net/krustf/boost-studytokyo11" target="_blank">Boost study.tokyo11</a></p>
<p>CilkPlus, TBB については以下のようなページがありますので，こちらを見ると良いと思います．</p>

<ul>
<li><a href="http://cilkplus.org/" target="_blank">Cilk Home Page | CilkPlus</a></li>
<li><a href="http://threadingbuildingblocks.org/" target="_blank">Home | Threading Building Blocks</a></li>
</ul>
<p>後は CG 法自体についての説明ですが... まあ興味ある方は調べてみてください．簡単に言うと線形代数で連立1次方程式を解くための解法です．</p>
<p>このスライドでは，ベクトル演算中心で並列化が容易だったので，それぞれのライブラリやコンパイラ拡張だけで差が出たら良いなあと思っていただけですので．</p>
<p>今回解いた問題で用いたのは Givens 行列という行列なんだそうです．</p>
<p>未知ベクトルを全て 1 として既知ベクトルを求めた後，未知ベクトルを全て 1 以外で初期化し，CG 法で解けば，未知ベクトルは 1 に近似された値が入る，となります．</p>
<p>ああ，後，行列ベクトル積のそれぞれのサンプルコードを載せて「簡単に書けますね」しか言わなかったのですが，もちろんご指摘がありましたように「簡単に書ける = パフォーマンスが良い」という風にはもちろん思ってないです．</p>
<p>実際にはパフォーマンスを調べてみないといけない訳ですが，一般的なアプリケーションにおいては簡単に書けて，かつスケーリングに強いというの方が良いと思っています．(もちろん，パフォーマンスが逐次計算時よりも良くなっているのが前提)</p>
<h4> 勉強会の感想とか</h4>
<p>コンテナのパフォーマンスに関する発表では，会場に居ない人の代わりというわけでもなく色々指摘しましたけど，ちゃんと思ったことは言った方が良いですよ．</p>
<p>勉強会で発表してる人って，「僕何か間違ってないかな...」とか思いながら発表してる部分もきっとあると思います．(間違いに気づいてない人もいますけど) そういうのは直接言ってあげないと気がつかないと思います．僕もそんな感じなので．</p>
<p>懇親会も楽しかったです．ラズベリーパイとバイクと某氏の妹の話しか覚えてないですが．</p>
<p>#12 大阪は行きたいのですが，まあ色々予定が辛いので難しいですね...</p>
<h4> 追伸</h4>
<p>闇鍋は夏が終わるまで無理です．暑いし．</p>
</div>
]]></content:encoded>
<dc:creator>krustf</dc:creator>
<dc:date>2013-06-08T18:32:31+09:00</dc:date>
<dc:subject>boost</dc:subject>
<dc:subject>C++</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/krustf/20130517/1368786133">
<title>[C++] CilkPlus について</title>
<link>http://d.hatena.ne.jp/krustf/20130517/1368786133</link>
<description> コード書くの疲れたので休憩も兼ねて書きます． 知っている人も多いと思いますが，CilkPlus は並列処理を容易にするため，Intel が自社のコンパイラに用意している C/C++ 用の言語拡張です． 元々は MIT で作られていた C 言語用の拡張だったとかなんだとか． まあそれはと</description>

<content:encoded><![CDATA[
<div class="section">
<p>コード書くの疲れたので休憩も兼ねて書きます．</p>
<p>知っている人も多いと思いますが，CilkPlus は並列処理を容易にするため，Intel が自社のコンパイラに用意している C/C++ 用の言語拡張です．</p>
<p>元々は MIT で作られていた C 言語用の拡張だったとかなんだとか．</p>
<p>まあそれはともかく，CilkPlus はキーワードが3つしかないとてもシンプルな設計です．</p>

<ul>
<li> cilk_for</li>
<li> cilk_spawn</li>
<li> cilk_sync</li>
</ul>
<p>の3つだけです．</p>
<p>後は reducer などが用意されています．</p>
<p>他には，ベクトル演算を簡略化する Array Notation，関数をベクタライズする Elemental Functions，ループのベクタライズを明示的に許可する #pragma simd などがあります．(これらも CilkPlus の一部だったのか...)</p><p>これらの定義は，全て &#60;cilk/cilk.h&#62; にあります <span class="footnote"><a href="/krustf/#f1" name="fn1" title="cilk_for, cilk_spawn, cilk_sync は実際にはマクロで，実際のキーワードは _Cilk_for, _Cilk_spawn, _Cilk_sync なのですが，cilk_for, cilk_spawn, cilk_sync を使うのが推奨されています">*1</a></span>．</p>
<p>CilkPlus のことについては以下のサイトが良いと思います．</p>
<p><a href="http://cilkplus.org/" target="_blank">Cilk Home Page | CilkPlus</a></p>
<h4> 利用できる環境</h4>
<p>現在のところ，Intel コンパイラなら使用可能ですが，それ以外のコンパイラでは GCC は 4.8 で CilkPlus が使えるブランチがあり，4.9 では development branch があります．また LLVM/Clang でも実装されており，github に置かれています．詳しい話は以下．</p>
<p><a href="http://cilkplus.org/which-license" target="_blank">Which License | CilkPlus</a></p>
<h4> cilk_for</h4>
<p>cilk_for は並列 for 文です．OpenMP だと pragma omp parallel for に該当します．</p>
<pre class="syntax-highlight">
<span class="synPreProc">#include </span><span class="synConstant">&#60;cilk/cilk.h&#62;</span>

<span class="synType">template</span>&#60;<span class="synType">class</span> T&#62;
<span class="synType">void</span> add(std::vector&#60;T&#62; &#38; out, std::vector&#60;T&#62; <span class="synType">const</span>&#38; x, std::vector&#60;T&#62; <span class="synType">const</span>&#38; y) {
  <span class="synType">const</span> std::<span class="synType">size_t</span> n = x.size();
  cilk_for(std::<span class="synType">size_t</span> i = <span class="synConstant">0</span> ; i &#60; n ; ++i) {
    out[i] = x[i] + y[i];
  }
}
</pre>

<h4> cilk_spawn, cilk_sync</h4>
<p>cilk_spawn は関数を非同期実行させる命令で，cilk_sync は cilk_spawn で実行した全ての処理が完了するのを待機します．</p>
<pre class="syntax-highlight">
<span class="synPreProc">#include </span><span class="synConstant">&#60;cilk/cilk.h&#62;</span>

<span class="synType">int</span> fib(<span class="synType">int</span> n)
{
    <span class="synStatement">if</span> (n &#60; <span class="synConstant">2</span>) {
        <span class="synStatement">return</span> n;
    }
    <span class="synType">int</span> x = cilk_spawn fib(n-<span class="synConstant">1</span>);
    <span class="synType">int</span> y = fib(n-<span class="synConstant">2</span>);
    cilk_sync;
    <span class="synStatement">return</span> x + y;
}
</pre>

<h4> reducer</h4>
<p>reducer は並行プログラミングでは非常に困る，複数のスレッド間で同期しなければならない計算を助けるための機能です．</p>
<p>例えば総和計算の関数は，全スレッドが参照する総和結果を返す変数をロックしなければいけませんが，reducer はそのようなロックをうまく隠してくれます．</p>
<pre class="syntax-highlight">
<span class="synPreProc">#include </span><span class="synConstant">&#60;cilk/cilk.h&#62;</span>

<span class="synType">template</span>&#60;<span class="synType">class</span> T&#62;
T sum(std::vector&#60;T&#62; <span class="synType">const</span>&#38; x) {
  cilk::reducer_opadd&#60;T&#62; result; <span class="synComment">// 自動でゼロ初期化されているらしい．</span>
  cilk_for(std::<span class="synType">size_t</span> i = <span class="synConstant">0</span> ; i &#60; x.size() ; ++i) {
    result += x[i];
  }
  <span class="synStatement">return</span> result.get_value();
}
</pre>

<h4> 終わり</h4>
<p>OpenMP と比べると，#ifdef とかない分書きやすいと思います．</p>
<p>CilkPlus はオプションの指定が必要ないため，使える環境ならどこでも使えます．</p>
<p>後，OpenMP ではリダクションの指定が色々制限が強いのですが，CilkPlus なら reducer を自前で実装することで，ユーザ定義型でも使用できるようです. </p>
<p><a href="http://cilkplus.org/tutorial-cilk-plus-reducers" target="_blank">Tutorial Cilk Plus Reducers | CilkPlus</a></p>
<p>そういえば OpenMP と CilkPlus の比較記事をあまり見たことがない．</p>
<p>どこかでやっているような気はするんですが...</p>
</div>
<div class="footnote">
<p class="footnote"><a href="/krustf/#fn1" name="f1">*1</a>：cilk_for, cilk_spawn, cilk_sync は実際にはマクロで，実際のキーワードは _Cilk_for, _Cilk_spawn, _Cilk_sync なのですが，cilk_for, cilk_spawn, cilk_sync を使うのが推奨されています</p>
</div>
]]></content:encoded>
<dc:creator>krustf</dc:creator>
<dc:date>2013-05-17T19:22:13+09:00</dc:date>
<dc:subject>C++</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/krustf/20130420/1366387160">
<title>[その他] メールの文体を守らない学生に対応する方法</title>
<link>http://d.hatena.ne.jp/krustf/20130420/1366387160</link>
<description> 無視する． タイトルが学籍番号と名前で，目的は何で，何があったのか不明，「出席管理サーバに登録してください．」だけで「よろしくお願いいたします」と言ったしめもなし．*1 おまけにメールフッターはついてない． 友達気分でメールし過ぎじゃないかと思いましたね． 僕</description>

<content:encoded><![CDATA[
<div class="section">
<p><span style="font-size:xx-large;color:#FF0000;" class="deco">無視する．</span></p><p>タイトルが学籍番号と名前で，目的は何で，何があったのか不明，「出席管理サーバに登録してください．」だけで「よろしくお願いいたします」と言ったしめもなし．<span class="footnote"><a href="/krustf/#f1" name="fn1" title="本当は学生が自分で登録する">*1</a></span></p>
<p>おまけにメールフッターはついてない．</p>
<p>友達気分でメールし過ぎじゃないかと思いましたね．</p>
<p>僕はお前の友達でもなんでも無いんだが．</p>
<p>目上の人間にメール送るって意識が足りなさすぎですね．</p>
<p>というか失礼過ぎ．</p>
<p>今回はそもそも問い合わせ先が変わってるのでそっちに送ってねで対応しましたが，そうじゃなかったら完全に無視してましたね．</p>
</div>
<div class="footnote">
<p class="footnote"><a href="/krustf/#fn1" name="f1">*1</a>：本当は学生が自分で登録する</p>
</div>
]]></content:encoded>
<dc:creator>krustf</dc:creator>
<dc:date>2013-04-20T00:59:20+09:00</dc:date>
<dc:subject>その他</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/krustf/20130310/1362920130">
<title>[PLplot][C++] PLplot でコマンドライン引数にデータファイルを指定する方法</title>
<link>http://d.hatena.ne.jp/krustf/20130310/1362920130</link>
<description> 最近 TeX に載せるグラフを書くために Numbers とか使って EPS に変換したりとかしてたのですが, よくある2段組み用に使うと汚くてかなり見づらい. 今日とうとう諦めて PLplot を使って描画プログラムを書くことにしました. PLplot Home Page - Main PLplot は pgplot みた</description>

<content:encoded><![CDATA[
<div class="section">
<p>最近 TeX に載せるグラフを書くために Numbers とか使って EPS に変換したりとかしてたのですが, よくある2段組み用に使うと汚くてかなり見づらい.</p>
<p>今日とうとう諦めて PLplot を使って描画プログラムを書くことにしました.</p>
<p><a href="http://plplot.sourceforge.net/" target="_blank">PLplot Home Page - Main</a></p>
<p>PLplot は pgplot みたいなグラフ生成用のミドルウェアです.</p>
<p>バインディングは C, C++, Python, Fortran など.</p>
<p>EPS で出力すると結構奇麗な表示になって大変良いと思います.</p><p>ただ C++ の example が大変残念だったり, 凡例表示用関数が引数30超えてるとか<span class="footnote"><a href="/krustf/#f1" name="fn1" title="[http://plplot.sourceforge.net/docbook-manual/plplot-html-5.9.9/pllegend.html:title]">*1</a></span>まあ色々不満はあるのですが, ベタで書くよりは楽だろうと思います.</p>
<p>僕はいちいちデータファイルを変更するためにコンパイルし直したくないのでコマンドライン引数に渡したかったのですが, PLplot にオプション解析を乗っ取られているのでどうすれば良いのかと思ってたのですが, なんとなく調べても出てこなかったので一応メモ.</p>
<p>plparseopts 関数が引数を解析しますが, サンプルだと PL_PARSE_FULL だけが渡されているのが多いと思います.</p>
<p>ここに | で PL_PARSE_SKIP を指定すれば PLplot が解析できない引数をスキップできます. スキップしないとエラー出力で落ちます.</p>
<p>plparseopts 関数を通った後, argc, argv の内容は変更され, PLplot が認識した引数は全て削除されます. なので PLplot のオプションだけを渡せば, argc は 1 になります.</p>
<p>グラフに使用するデータファイルをコマンドライン引数に指定させようとすると, こういう書き方になります.</p>
<pre class="syntax-highlight">
<span class="synType">int</span> main(<span class="synType">int</span> argc, <span class="synType">const</span> <span class="synType">char</span>** argv) {
  plparseopts(&#38;argc, argv, PL_PARSE_FULL | PL_PARSE_SKIP);

  <span class="synStatement">if</span>(argc != <span class="synConstant">2</span>) {
    std::fprintf(<span class="synConstant">stderr</span>, <span class="synConstant">&#34;[Usage] </span><span class="synSpecial">%s</span><span class="synConstant"> &#60;PLplot options...&#62; data-file</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>, argv[<span class="synConstant">0</span>]);
    <span class="synStatement">return</span> -<span class="synConstant">1</span>;
  }

  <span class="synType">const</span> std::string dataFile = argv[<span class="synConstant">1</span>];

  ...
}
</pre>

<p>PLplot はちゃんと設定すれば Numbers で描画したグラフと遜色ないぐらい奇麗なグラフを EPS で出力できるので, TeX 使う人には便利だと思います.</p>
<p>Ruby のバインドがあれば良いなあとは思いました.</p>
</div>
<div class="footnote">
<p class="footnote"><a href="/krustf/#fn1" name="f1">*1</a>：<a href="http://plplot.sourceforge.net/docbook-manual/plplot-html-5.9.9/pllegend.html" target="_blank">&#13;      pllegend: Plot legend using discretely annotated filled boxes, lines, and/or lines of symbols    </a></p>
</div>
]]></content:encoded>
<dc:creator>krustf</dc:creator>
<dc:date>2013-03-10T21:55:30+09:00</dc:date>
<dc:subject>PLplot</dc:subject>
<dc:subject>C++</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/krustf/20130309/1362799878">
<title>[その他] FreeBSD サーバと Moodle による Web 学習環境</title>
<link>http://d.hatena.ne.jp/krustf/20130309/1362799878</link>
<description> これをやるきっかけは, 大学の1年生が主に使っているシステム (がマウントしているファイルサーバだったかな) が今年度でサポート完全停止でいつ壊れても修理できないそうで, 今学内全体で使うためのクラウドシステムの準備中らしく, その期間安全に使えるシステムがないと</description>

<content:encoded><![CDATA[
<div class="section">
<p>これをやるきっかけは, 大学の1年生が主に使っているシステム (がマウントしているファイルサーバだったかな) が今年度でサポート完全停止でいつ壊れても修理できないそうで, 今学内全体で使うためのクラウドシステムの準備中らしく, その期間安全に使えるシステムがないとかなんとかで, 出席管理が欲しいとかそういう理由だったと思います.</p>
<p>FreeBSD は別にいいんですが, Moodle は説明します.</p>
<p><a href="http://docs.moodle.org/2x/ja/Moodle%E3%81%A8%E3%81%AF" target="_blank">Moodleとは - MoodleDocs</a></p>
<pre>
&#34;Moodleはインターネット上で授業用のWebページを作るためのソフトです。
教育学でいう社会的構築主義の考え方に基づいて作られており，日々改良が行われています。&#34;
</pre>

<p>とのことで, 簡単に言うと e ラーニングシステムみたいなものだと思います.</p>
<p>先生にその名前を聞くまで知らなかったのですが, セットアップして使えるようになるまで忘れてました. 僕も微積分の講義で使ってました. というかデザインを見て思い出したので, 「あああれは Moodle だったのか」という感じです.</p>
<p>Moodle の設定は上のページのように日本語で公式のドキュメントもあるので (若干ふるい気がする) そこまで難しくないと思います.</p>
<p>必要なのは SQL サーバの設定と, PHP の設定, Apache の設定なので.</p>
<p>FreeBSD はサーバをたてるかって時に「Ubuntu はサーバとして信用ならない」という先生が居たので FreeBSD にしました. あと Ports に Moodle も入ってたからです.</p>
<p>インストール自体は公式のドキュメント <a href="http://docs.moodle.org/2x/ja/Moodle%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B" target="_blank">Moodleをインストールする - MoodleDocs</a> を見れば大体できます.</p>
<p>問題は, Ports でインストールするとディレクトリが /usr/local/www/moodle, /usr/local/www/moodledata になると思います.</p>
<p>Apache のドキュメントルートは /usr/local/www/apache22/data 辺りになるので, 修正したいのですが, ドキュメントルート自体はそのままで, /moodle とウェブでアクセスするときは /usr/local/www/moodle を使用するようにしたい.</p>
<p>それ自体は簡単で Apache の Alias モジュールを使えば解決.</p>
<p><a href="http://httpd.apache.org/docs/2.2/en/mod/mod_alias.html" target="_blank">mod_alias - Apache HTTP Server</a></p>
<p>なのでかなり簡単です.</p>
<p>問題は, 僕にウェブの知識がほとんどないので詰んでる.</p>
<p>既に設定は全て終わってるので, 後は実際に使う先生方に Moodle の管理者権限を渡せば完了.</p>
</div>
]]></content:encoded>
<dc:creator>krustf</dc:creator>
<dc:date>2013-03-09T12:31:18+09:00</dc:date>
<dc:subject>その他</dc:subject>
</item>
</rdf:RDF>
