tag:blogger.com,1999:blog-19312896266801136982024-03-05T16:52:36.343+09:00みんな忘れてしまうんだ特にテーマはありません。どうせみんな検索から個別ページに飛んでくるんだから。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.comBlogger119125tag:blogger.com,1999:blog-1931289626680113698.post-90802040582254692832022-09-30T06:58:00.002+09:002022-10-01T15:51:07.862+09:00ブレードランナーのエンディングと南極物語のメインテーマがそっくりな件ブレードランナー2049を見よう思って旧ブレードランナーを復習のために見てみた。<br />
<a href="https://www.amazon.co.jp/%E3%83%96%E3%83%AC%E3%83%BC%E3%83%89%E3%83%A9%E3%83%B3%E3%83%8A%E3%83%BC-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%8A%E3%83%AB%EF%BD%A5%E3%82%AB%E3%83%83%E3%83%88-%E5%AD%97%E5%B9%95%E7%89%88-%E3%83%8F%E3%83%AA%E3%82%BD%E3%83%B3%E3%83%BB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%89/dp/B00UMB9H9W/ref=as_li_ss_tl?ie=UTF8&qid=1510053996&sr=8-1&keywords=%E3%83%96%E3%83%AC%E3%83%BC%E3%83%89%E3%83%A9%E3%83%B3%E3%83%8A%E3%83%BC&linkCode=ll1&tag=soseiranzo-22&linkId=f07895e686c1fe6f5a30836d38f6a611" target="_blank">amazonのレンタルストリーミング</a>で見たんですけど、たったの100円でレンタルできて、超お得でした。貸し借りにTSUTAYAに行くより圧倒的に楽ですし。<br />
まあ、それはともかく、 ブレードランナーを見た後、しばらく旧版のEDテーマが頭にこびりついていてたんですけど、頭のなかで再生しているうちにだんだん南極物語のテーマに変化してしまって。<br />
<span style="color: #6aa84f;"><b>{あれ? なんかこの2曲似てないか?}</b></span><br />
と思って、youtubeってみたら、こんな感じ
<div class="videoWrapper">
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/miAawzeIzgE?start=22" width="560"></iframe>
</div>
一方の、南極物語はこんな感じっすね。
<div class="videoWrapper">
<iframe width="560" height="315" src="https://www.youtube.com/embed/l1CN2nQnXeM?start=15" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
やっぱり似てる。<br />
似てる、聞けば聞くほど色んな所が似てる気がしてよく見てみたら、 なんと<br />
<span style="color: #6aa84f;"><b><span style="font-size: large;">同じ人が作ってるじゃねーかよ。これ!</span></b></span><br />
両方共、ギリシャの音楽家<a href="https://ja.wikipedia.org/wiki/%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B2%E3%83%AA%E3%82%B9" target="_blank">ヴァンゲリス</a>の作品。かなり有名で、他にも<a href="https://www.amazon.co.jp/%E7%82%8E%E3%81%AE%E3%83%A9%E3%83%B3%E3%83%8A%E3%83%BC-%E5%AD%97%E5%B9%95%E7%89%88-Ben-Cross/dp/B00FYLXCIW/ref=as_li_ss_tl?ie=UTF8&qid=1510058969&sr=8-2&keywords=%E7%82%8E%E3%81%AE%E3%83%A9%E3%83%B3%E3%83%8A%E3%83%BC&linkCode=ll1&tag=soseiranzo-22&linkId=504ce14bf3ea15d0c27774915f833383" target="_blank">炎のランナー</a>なんかも手がけている人らしい。
<br />
最後に炎のランナーのテーマ曲も置いておきます。
<div class="videoWrapper">
<iframe width="560" height="315" src="https://www.youtube.com/embed/Xkc6TB4EeqI?start=38" frameborder="0" allowfullscreen></iframe>
</div>
waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-91234515382471715792022-09-11T15:53:00.002+09:002022-09-11T23:58:00.004+09:00blogger: カスタムドメインでhttps対応する方法<p><br /></p>bloggerでカスタムドメインを使っていてちょいと手間取ったのでメモをのこしておきます。</p><p id="c30151d0-6993-45da-9faf-25022a56273d" class="">
</p><p id="c0e29ee2-0c41-44b5-8aa1-71adf0999bc7" class="">bloggerの設定に「HTTPS の使用」という項目があったのでONにしたのだけれど、ステータスが「不明」になってしまうので困っている状況でした。</p><p id="2b90059e-7031-4b03-8bb7-5371a8807b93" class="">
</p><h2 id="93e12d1b-8f3b-498f-bf9e-ef36483d827a" class="">手順</h2><ul id="5eb28a02-7f7b-4909-84bc-0bc2ab972ec0" class="bulleted-list"><li style="list-style-type:disc">DNS設定でCAAレコード追加<ul id="840ebfbe-53b2-4125-92a8-5cfd3f4c8a35" class="bulleted-list"><li style="list-style-type:circle">サブドメインなしのドメイン全体</li></ul><ul id="426fd89f-e2a7-4b5f-aa27-95e035304dec" class="bulleted-list"><li style="list-style-type:circle">フラグ: 0</li></ul><ul id="557dc5b2-ecf7-4fcc-9ca7-03987835e335" class="bulleted-list"><li style="list-style-type:circle">tag: issue</li></ul><ul id="2563d779-4ed0-42b8-8183-603c741ff1c4" class="bulleted-list"><li style="list-style-type:circle">value: <a href="http://letsencrypt.org/">letsencrypt.org</a></li></ul></li></ul><ul id="88b09359-2dcf-4e68-9239-278cde25751c" class="bulleted-list"><li style="list-style-type:disc">blogger設定から「HTTPS の使用」をオンにする<ul id="a8d4ed28-46f3-422f-b773-36fd5818adcf" class="bulleted-list"><li style="list-style-type:circle">ステータスが「使用可能」になる</li></ul><ul id="b6de8d1a-63fd-4d11-9d75-343b5720e024" class="bulleted-list"><li style="list-style-type:circle">ならないときはDNSが浸透していないので待つ</li></ul></li></ul><ul id="ef3389a0-2b5d-4613-b7c1-b8a8d9c92580" class="bulleted-list"><li style="list-style-type:disc">Let’s Encryptの設定<ul id="5782d94b-5578-48a0-b891-cf11f77c3ac4" class="bulleted-list"><li style="list-style-type:circle">なし!</li></ul><ul id="ac957725-cdc2-465b-8686-ce0e19e0540e" class="bulleted-list"><li style="list-style-type:circle">ここポイント。過去にLet'sEncrypt利用して自分のサーバーに証明書いれたことがある、かつ、DNSのCAAレコードについて理解していないと、何か設定は?とか証明書ファイルは?とか疑問に思うところだが、何もしなくていい。</li></ul><ul id="b5943738-42c6-4073-a56d-de1dc79d2548" class="bulleted-list"><li style="list-style-type:circle">CAAレコードを適切に設定してあれば、googleとletsencryptの間でよろしくやってくれる。</li></ul></li></ul><ul id="dc33ab65-2594-4d62-a1cc-1ec144811001" class="bulleted-list"><li style="list-style-type:disc">注意点<p id="ebec5c14-aa36-4aa5-828f-137ec7ecef66" class="">上記設定した後でもhttpsでブログに接続しようとすると</p><pre id="b1aff3ba-fe2e-46fe-ad74-75c9817873f9" class="code"><code>chrome: 「切断されました」みたいなエラー
firefox: PR_END_OF_FILE_ERROR エラー</code></pre><p id="29968319-d52b-4cc0-bf0d-13528fe8bfc4" class="">とエラーになるが、しばらく待ったら接続できるようになった。</p><p id="2bb7c0a4-da61-4ca8-84cb-8d379c84d4fb" class="">自分はこの間に、どこか間違ったか?とか、まだやること足りないのか?とかなり慌てたが、待てば解決した。</p><p id="8017b693-adf3-44bd-bd88-f09c1887b690" class="">もしかすると、Let’s Encryptが参照しているDNSまでCAAレコードの追加が浸透していなかっただけかもしれない。</p><p id="da36c662-ebd8-4dfc-90d2-4212f1990ce5" class="">
</p></li></ul><h2 id="a2d57c58-3428-443b-a675-948f5f94a813" class="">参考にしたページ</h2><ul id="0d50b45d-5ef8-4e12-9d4d-079520a1f80e" class="bulleted-list"><li style="list-style-type:disc"><a href="https://support.google.com/blogger/answer/6284029?hl=ja">https://support.google.com/blogger/answer/6284029?hl=ja</a></li></ul><ul id="1e74a60f-40a1-4097-92e8-fa01ac6becdf" class="bulleted-list"><li style="list-style-type:disc"><a href="https://www.cybertrust.co.jp/sureserver/support/caa.html">https://www.cybertrust.co.jp/sureserver/support/caa.html</a></li></ul><ul id="c4c62a89-0db1-4790-a7e2-09b07d1d1ffc" class="bulleted-list"><li style="list-style-type:disc"><a href="https://letsencrypt.org/getting-started/#without-shell-access">https://letsencrypt.org/getting-started/#without-shell-access</a><ul id="83f1eadf-c979-4b23-bc73-b3b4aa180c2a" class="bulleted-list"><li style="list-style-type:circle"><a href="https://community.letsencrypt.org/t/web-hosting-who-support-lets-encrypt/6920#:~:text=Blogger">https://community.letsencrypt.org/t/web-hosting-who-support-lets-encrypt/6920#:~:text=Blogger</a></li></ul></li></ul>waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-77059898057483415972021-12-12T15:25:00.005+09:002021-12-12T15:46:28.052+09:00iPadのBluetoothキーボードでかな入力をつらぬく方法(かなチートシート)私は、バリバリのかな入力派である。<br />
というかローマ字入力がうまくできないのである。<div><br />
先日iPadを入手したので、持っていたBluetoothキーボード(Logicool K480)を接続したのだが、「壊れて出ない文字がある」ならぬ「壊れてなくても出ない文字がある」状態だった。 </div><div>具体的にいうと「ろ」を押しても「ろ」が出力されず無反応だったり、「む」を押しても「へ」が出力される。</div><div><br /></div><div> どういうことかと言うとiPadでは、BluetoothキーボードをUS配列と認識するとのこと。(<a href="https://www.ipodwave.com/ipad/howto/keyboard_bluetooth.html" target="_blank">参考サイト</a>)
<i></i>
</div>
<div><span style="color: #38761d;"><b>「まじか」</b></span></div>
<div><span style="caret-color: rgb(56, 118, 29);">これは、どうにもならんらしく、持っているK480のキートップにも</span></div>
<div>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiYYV82QUYAu5EQvwVz8NMZ5hUbs50nzUZes_vTP3phRsEoC21rBuh-meOUPnzVKanJpaKej2hFI41vhO-uIcs4ySYHIbSDY8M9i6tY4uqYDOBvWvvEpu1eYCXOi5XpH9YIV9MvlTwDLxomVY9HlmGlnTnZybnjkKlmew1V3QMDxEAVwBWnWr22cQre=s2048" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="2048" data-original-width="1661" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEiYYV82QUYAu5EQvwVz8NMZ5hUbs50nzUZes_vTP3phRsEoC21rBuh-meOUPnzVKanJpaKej2hFI41vhO-uIcs4ySYHIbSDY8M9i6tY4uqYDOBvWvvEpu1eYCXOi5XpH9YIV9MvlTwDLxomVY9HlmGlnTnZybnjkKlmew1V3QMDxEAVwBWnWr22cQre=s320" width="260" /></a></div><br /><span style="caret-color: rgb(56, 118, 29);">⇦のように、灰色の丸の中にわざわざiPadに接続した場合は、この文字が入力されますという表示がある。</span></div>
<div><span style="caret-color: rgb(56, 118, 29);">(写真は叩くと拡大します。)</span></div>
<div><span style="caret-color: rgb(56, 118, 29);"><br /></span></div>
<div><span style="caret-color: rgb(56, 118, 29);">しかしだ!</span><span style="caret-color: rgb(56, 118, 29);">!</span></div>
<div><span style="caret-color: rgb(56, 118, 29);">かなについては、どのキーを押すとどの文字が出るという表示はないのだ!</span></div>
<div><span style="caret-color: rgb(56, 118, 29);"><br /></span></div>
<div><span style="caret-color: rgb(56, 118, 29);">かな入力派は少数民族なため、迫害されているのかもしれないが、そこまでキートップに表示するとごちゃごちゃしすぎて、なんのこっちゃわからんようになるのも確かなので仕方ない。</span></div>
<div><span style="caret-color: rgb(56, 118, 29);"><br /></span></div>
<div><span style="caret-color: rgb(56, 118, 29);">そもそも、全かなを入力できるかもわからなかったが、テキトーにポチポチ押していたらどうやら全部入力できたので、ここに対応表を載せておく。</span></div>
<div><span style="caret-color: rgb(56, 118, 29);"><br /></span></div>
<div><span style="caret-color: rgb(56, 118, 29);">自分のキーボードは、Logicool K480だが、もしかすると他のキーボードでもいけるかもしれないので、ダメもとでチャレンジしてみるといいかもしれない。</div>
<table border="1" width="500" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<th bgcolor="#00AA00" width="150"><font color="#FFFFFF">出したい文字</font></th>
<th bgcolor="#00AA00" width="200"><font color="#FFFFFF">押すキー</font></th>
</tr>
<tr>
<td bgcolor="#FFFFFF" valign="top">へ</td>
<td bgcolor="#FFFFFF" valign="top">む</td>
</tr>
<tr>
<td bgcolor="#FFFFFF" valign="top">む</td>
<td bgcolor="#FFFFFF" valign="top">゜(半濁点)</td>
</tr>
<tr>
<td bgcolor="#FFFFFF" valign="top">゜(半濁点)</td>
<td bgcolor="#FFFFFF" valign="top">へ</td>
</tr>
<tr>
<td bgcolor="#FFFFFF" valign="top">ー(伸ばし棒)</td>
<td bgcolor="#FFFFFF" valign="top">Shift+゜(半濁点)</td>
</tr>
<tr>
<td bgcolor="#FFFFFF" valign="top">ろ</td>
<td bgcolor="#FFFFFF" valign="top">Shift+け</td>
</tr>
<tr>
<td bgcolor="#FFFFFF" valign="top">「</td>
<td bgcolor="#FFFFFF" valign="top">Shift+へ</td>
</tr>
<tr>
<td bgcolor="#FFFFFF" valign="top">」</td>
<td bgcolor="#FFFFFF" valign="top">Shift+゛(濁点)</td>
</tr>
</table>
最初はゲンナリしたが、使っていると案外すぐに慣れて問題なくやっている。
<br>
なお、!や?は、発見できなかったので漢字変換ユーザー辞書に追加してしのぐことにした。
例: 読み「め」⇨変換「?」とかwaniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-43879386077279375192018-07-30T00:26:00.000+09:002018-07-30T10:50:26.360+09:00bloggerで特定ラベルの投稿一覧を出す version 2自分の以前のブログ記事「<a href="https://choni-waniwani.blogspot.com/2012/04/blogger.html" target="_blank">bloggerで特定ラベルの投稿一覧を出す</a>」で方法を紹介して、このブログでもそれを使ってました。<br />
それを見て、私のscriptを使ってくださる方もいらっしゃるようで、あるヘビーなブロガーの方に、ひとつのラベルに記事がたくさんあると全部表示されない、と教えていただいた。<br />
調べてみると、150本以上記事のあるラベルを表示させようとすると、それ以上表示できない様子。<br />
たくさん記事をアップしないと発見できない現象で、うちのブログは、記事数が少ないので発見できていなかった。<br />
blogger APIでとれるfeedの最大数が原因だったんですけど、ただ、もともと最大150だったわけではなく、元々500だったのが2015年の末頃に<a href="https://github.com/bebraw/blogger2ghost/issues/19" target="_blank">減らされたらしい</a>とのこと。<br />
<br />
今見たら、私の元記事は、2012年でした。結構前なのね・・・
<br />
というわけで、いい機会なので同一ラベル記事150本超の場合にも対応して、version 2にしたので、記事をアップしました。<br /><br />
使い方は、Blogger の管理画面「ページ」から新しいページを作りhtml編集モードにして<br />
<br />
<div class="waku">
<div id="entry_list_by_label"><script src="https://cdn.rawgit.com/choniwaniwani/wasure/92f7a895/toc/bloggerFeeds.2.js"></script><br />
<script>load_entry_list("ラベル名称");</script></div></div>
を貼り付けて、ラベル名称を書き換えるだけです。<br />
<a href="http://choni-waniwani.blogspot.jp/p/blog-page_18.html">こんな感じ</a>の同一ラベル記事をまとめたページを作成します。<br /><br />
ラベル名称は、そのまんまラベルの名前です。日本語でもOKでした。<br />
で、このタグ貼付部分より前や後に普通に文章入れてもOKです。<br /><br />
タグ内部に入れてもいいので、レイアウトは多少カスタマイズできます。リンクのaタグには'linkHref'という名前の未使用classも入っているので、cssでカスタマイズも可。<br />
<br />
<br />
<b>以下、javascriptのコードに興味ある方向けの内容です。</b><br/><br/>
なお、codeは、<a href="https://github.com/choniwaniwani/wasure/blob/master/toc/bloggerFeeds.2.js" target="_blank">githubにおいてあります</a>ので、javascriptいじれる方は、勝手にコピって改造して使ってもOKです。<br />
コード内で、feedを呼ぶところは、これなんだろうという感じですが、詳しいパラメータの解説は、<a href="https://developers.google.com/blogger/docs/2.0/reference#Parameters" target="_blank">こちら</a>にあります。<br />
ただし、この中には、bloggerでは使えないパラメータもあります。(やってみないとわからない。)
<br /><br />
あと、今回bloggerのhtml編集画面の変な仕様というかバグを見つけたのですが、bloggerは、全角の記号をすべて勝手にescapeしてしまうようです。
それなので、たとえば、javascriptの文字列の中でも・(中黒)があると&#12539;になってしまいます。<br/>
全角なんだからほっといてほしいですほんとに。それで、最初ラベル名に中黒が入っていると動かないという謎の現象が発生していました。
waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com1tag:blogger.com,1999:blog-1931289626680113698.post-46166075152525707962018-02-08T12:48:00.000+09:002018-02-08T12:48:30.285+09:00cygwinのアップデートがやたら遅くて時間がかかる。(解決)タイトルのとおりだが、cygwinのアップデートがやたら遅くて完璧に頭に来てた。<br />
何時間も待っているが、autorebaseとやらがいつになっても終わらない。<br />
インストールウィンドウを見ると、<span class="st">0p_000_autorebase.<wbr></wbr>dash と表示されたまま固まっている。HDDは、ガリガリ止まらない。</span><br />
<br />
ぐぐってみると、この問題で、怒ってるっぽい人は結構いるようだが 、我慢するか<a href="http://www.nekochango.com/entry/top/cygwin/install" target="_blank">なんか難しい対応</a>をしてるひととかいたけど、中に<br />
<blockquote class="tr_bq">
原因はRapportというウィルス対策ソフトについてくるTrusteer
エンドポイント保護というソフトが悪さをしていたようです。Rapportは三菱UFJ銀行のお勧めで無料ウィルス対策ソフトとしてインストールしたのですが、それが災いしていたようです。やはりタダより高いものは無いですね。</blockquote>
(引用元:<a href="http://soukitaisyoku-kigyou.blog.so-net.ne.jp/2016-11-08">http://soukitaisyoku-kigyou.blog.so-net.ne.jp/2016-11-08</a>)<br />
というのがあり、「あっ」と思い、norton360の「設定->ウイルス対策->自動保護」をオフにしたら今までのがウソのようにスイスイ進むようになった。<br />
<br />
タダどころか天下のノートン先生でもこれでした。ちょっと遅くなる程度でなく、何十倍もじかんがかかるとかなんだかなぁ。<br />
<br />
<br />waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-2903885569142955712018-02-08T12:17:00.001+09:002018-02-08T12:17:21.350+09:00Ubuntu16.04のカーネルアップデート(to 4.13)でNVidia driverが認識しなくなった(解決)Ubuntu16.04で、<br />
<blockquote class="tr_bq">
sudo apt dist-upgrade</blockquote>
したら、 NVidia driverを認識しなくなった。<br />
nvidia-smi を実行しても、<br />
<blockquote class="tr_bq">
<pre>NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running. </pre>
</blockquote>
という、連れない返事・・・<br />
<br />
driverは、aptで入れていて、パッケージ名は、「nvidia-387」<br />
どうやら、ソイツが、<a href="https://qiita.com/bohemian916/items/7637b9b0b3494f447c03" target="_blank">kernel4.13に対応していないらしい</a>。<br />
<br />
↑のリンク記事だと、kernel4.10に戻して動かしていたが、<br />
<blockquote class="tr_bq">
sudo apt install nvidia-</blockquote>
まで、打ち込んだところでtabキーを押してみると、候補の中に「nvidia-390」 がいたので、<br />
<blockquote class="tr_bq">
<span class="yj-message-list-item--body-message yj-message" data-qaid="message-text" dir="ltr" id="e55" lang="ja">sudo apt install "nvidia-*390*"</span></blockquote>
で、入れてみた。自動で387もアンインストールされるようだ。かしこいなぁ。<br />
その後、再起動して無事認識しました。<br />
waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-66219399830619692382017-11-15T12:03:00.000+09:002017-11-15T12:03:27.766+09:00Ubuntu16でnouveauドライバをアンインストールする。Ubuntu16のマシンからnouveauドライバをアンインストールしたときの記録です。<br />
Ubuntu16のマシンにNVidiaのグラボを挿してNVidiaのドライバを入れたのですが、少し動作が不安定なので、nouveauドライバを抜いて様子を見ようとしたのが動機です。<br />
<b>なお作業は、sshでコンソールログインして行っいました。</b> <br />
<br />
NVidiaのドライバを入れた後に、lsmodをすると、<br />
<pre style="-webkit-text-stroke-width: 0px; background-color: #fff2f0; border-radius: 4px; border: 1px solid rgb(204, 204, 204); color: black; font-family: monospace; font-size: 12px; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 12px 2em; orphans: 2; overflow: auto; padding: 11px 1em; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px;">mxm_wmi 16384 1 nouveau
video 40960 1 nouveau
i2c_algo_bit 16384 1 nouveau
ttm 98304 1 nouveau
drm_kms_helper 155648 2 nouveau,nvidia_drm</pre>
な感じで、 nouveauドライバが入りまくっている。こいつらを消したい。<br />
cudaは動くので、NVidiaのドライバが入っていることは確実。<br />
<br />
まず、/etc/modprobe.d/blacklist-nouveau.conf を作成し中身を<br />
<pre style="-webkit-text-stroke-width: 0px; background-color: #fff2f0; border-radius: 4px; border: 1px solid rgb(204, 204, 204); color: black; font-family: monospace; font-size: 12px; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 12px 2em; orphans: 2; overflow: auto; padding: 11px 1em; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px;">blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off </pre>
としました。次に、dpkg -l | grep nouveau で見つけたあやしいやつを削除<br />
<pre style="-webkit-text-stroke-width: 0px; background-color: #fff2f0; border-radius: 4px; border: 1px solid rgb(204, 204, 204); color: black; font-family: monospace; font-size: 12px; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 12px 2em; orphans: 2; overflow: auto; padding: 11px 1em; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px;">sudo apt purge xserver-xorg-video-nouveau</pre>
その後、<br />
<pre style="-webkit-text-stroke-width: 0px; background-color: #fff2f0; border-radius: 4px; border: 1px solid rgb(204, 204, 204); color: black; font-family: monospace; font-size: 12px; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 12px 2em; orphans: 2; overflow: auto; padding: 11px 1em; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px;">update-initramfs -u</pre>
これで再起動したら、lsmodしても綺麗サッパリnouveauが見えなくなりました。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-89041346737692207072017-11-10T21:20:00.000+09:002017-11-10T21:20:06.375+09:00ラズパイ3&バスパワースピーカーのノイズ退治(3.5mmジャック使用)Raspberry pi3とバスパワースピーカーと3.5mmオーディオジャックの組み合わせで<span style="color: red;"><b>「強烈な」</b></span>バックグラウンドノイズがのっていたのを解決した一例としてアップしておきます。<br />
<br />
高音質にする、とかいう話ではなく、連続的な耐えられないノイズが発生していたのでそれを取った話です。<br />
<br />
3.5mmオーディオジャック関連のノイズでは、ネットで<br />
<ul>
<li><a href="https://kobedigitallabo.github.io/2017/01/19/RaspberryPi-pixel-usbaudio/" target="_blank">オーディオジャックが4ピンだから</a>とか</li>
<li><a href="https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=136445" target="_blank">ファームのアップデートをしなさい</a>とか</li>
<li>そのジャックは音悪いから<a href="https://www.amazon.co.jp/Tendak-%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E9%9F%B3%E5%A3%B0%E5%87%BA%E5%8A%9B-3-5mm%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E3%82%B8%E3%83%A3%E3%83%83%E3%82%AF-1920x1080-HDMI%E3%83%A1%E3%82%B9%E2%86%92VGA%E3%83%A1%E3%82%B9%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF/dp/B0122NXEEG/ref=as_li_ss_tl?ie=UTF8&qid=1510314849&sr=8-1&keywords=Tendak+HDMI+to+VGA&dpID=41OzYlByTcL&preST=_SY300_QL70_&dpSrc=srch&linkCode=ll1&tag=choniwaniwani-22&linkId=ea5fd5c26da911e3e1e75475db80ac79" target="_blank">HDMIから抜け</a>とか</li>
<li>そのジャックは音悪いから<a href="https://www.amazon.co.jp/Charge-Adapter-Feet3-5mm%E7%94%B7%E6%80%A7AUX%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E3%82%B8%E3%83%A3%E3%83%83%E3%82%AFUSB-2-0%E7%94%B7%E6%80%A7%E7%94%A8%E5%85%85%E9%9B%BB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF3%E3%83%95%E3%82%A3%E3%83%BC%E3%83%88-RitZ-MarT/dp/B074MBQJWZ/ref=as_li_ss_tl?ie=UTF8&qid=1510315017&sr=8-3&keywords=usb+to+audio&dpID=41t34O8q98L&preST=_SX300_QL70_&dpSrc=srch&linkCode=ll1&tag=choniwaniwani-22&linkId=d24b804d9f3b371ea3fddc3d33db597c" target="_blank">USBから抜け</a>とか</li>
</ul>
いろいろあったけど、ググっても見ないパターンでハマりました。<br />
<br />
自分の場合↓の図のように接続していました。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JUqPJxY7UxqR-4GWUfosiIaf1Lc1F0bKOjyx3IrdDDQgCV_USAN0vQ7WxdutD1xmNVr_tTDN2tYvXsBSDDR7gzcWObwH413Nwu9_xcUx_wvclZi06sm3s4JXg3qAktbNQ8jOuOTfuKo/s1600/Circuit1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="320" data-original-width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JUqPJxY7UxqR-4GWUfosiIaf1Lc1F0bKOjyx3IrdDDQgCV_USAN0vQ7WxdutD1xmNVr_tTDN2tYvXsBSDDR7gzcWObwH413Nwu9_xcUx_wvclZi06sm3s4JXg3qAktbNQ8jOuOTfuKo/s1600/Circuit1.png" /></a></div>
これで、<b><i><span style="color: red;">「ズビズビズビ、ピキーピピ、ズズビビ」</span></i></b><span style="color: red;"><span style="color: black;">のような、いかれたノイズが鳴り続けていました。どうやらこれは、電源系のノイズだったらしく次のようにつなぎ替えたらノイズが治まりました。</span></span> <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjEnnBtR54dvjjcNSohmRfJ-ZI8rnjg4RW47K2iWrMMlUgFpCdteTnw2NfSuzxWOribseShn9HYgAkGnjSYR55qVm6iuLTEl8loqQx-HGAS7sdp6_-oynQoaGdWZstrOfuVHmF7wFFydg/s1600/Circuit3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="320" data-original-width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjEnnBtR54dvjjcNSohmRfJ-ZI8rnjg4RW47K2iWrMMlUgFpCdteTnw2NfSuzxWOribseShn9HYgAkGnjSYR55qVm6iuLTEl8loqQx-HGAS7sdp6_-oynQoaGdWZstrOfuVHmF7wFFydg/s1600/Circuit3.png" /></a></div>
<span style="color: red;"><span style="color: black;"> バスパワースピーカーの電源を、別のACアダプタから取るのがポイントで、<i><span style="color: #38761d;">「ラズパイから電源を取らなきゃいんじゃね」</span></i><span style="color: #38761d;"><span style="color: black;">と2個口以上あるUSBポートから、ラズパイとスピーカーの電源をとってしまうとノイズは消えませんでした。</span></span></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk9tZzOHSbZ7FDIIEIP9ILlP6A5nyQaYRdIQt28egonbYoY1F2qPP8OuMF2Jaqr0ZXfuK-vQJ8ZtoOlTkRyri7YzuqArAfMMmEXJJOvTQcT7hZGA1X6pL0LA7BRtrAYqt4lGBXDUhBZYM/s1600/Circuit2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="320" data-original-width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk9tZzOHSbZ7FDIIEIP9ILlP6A5nyQaYRdIQt28egonbYoY1F2qPP8OuMF2Jaqr0ZXfuK-vQJ8ZtoOlTkRyri7YzuqArAfMMmEXJJOvTQcT7hZGA1X6pL0LA7BRtrAYqt4lGBXDUhBZYM/s1600/Circuit2.png" /></a></div>
<span style="color: red;"><span style="color: black;"><span style="color: #38761d;"><span style="color: black;"> 自分の場合は、ACアダプタ2つだとかさばるので、<a href="https://www.amazon.co.jp/%E3%83%A4%E3%82%B6%E3%83%AF-YAZAWA-%E3%83%A4%E3%82%B6%E3%83%AF%E3%82%B3%E3%83%BC%E3%83%9D%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%BF%E3%83%83%E3%83%97%E5%9E%8B%EF%BC%92%EF%BC%A1%EF%BC%A3%EF%BC%8B%EF%BC%91%EF%BC%B5%EF%BC%B3%EF%BC%A2%EF%BC%92%EF%BC%A1-%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88-H3005WHU2A/dp/B00A3K1LXW/ref=as_li_ss_tl?ie=UTF8&linkCode=ll1&tag=choniwaniwani-22&linkId=2784e9a77ab072826e85398f43ec2923" target="_blank">コイツ</a>を使って省スペースにしました。</span></span></span></span><br />
<span style="color: red;"><span style="color: black;"><span style="color: #38761d;"><span style="color: black;">この場合、一つの機器からラズパイとスピーカーの電源をとっていますが、片方がUSBポートで、もう片方が100Vに別のACアダプタをつないだものなのでOKでした。</span></span></span></span><br />
<span style="color: red;"><span style="color: black;"><span style="color: #38761d;"><span style="color: black;">つまり、ラズパイのオーディオジャックととバスパワーのスピーカーを使う場合、両方の機器の電源が一つの5Vの系にあるとノイズが発生するようです。 </span></span></span></span><br />
<br />waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com1tag:blogger.com,1999:blog-1931289626680113698.post-68961855991444337052017-11-09T15:13:00.002+09:002017-11-09T15:26:02.770+09:00javascriptで簡単なカリー化関数を作った(ES6版)最近、scalaからjavascriptに不本意ながら引っ越してきました。初めは嫌々ながらだったんですけど、ES6になってめっちゃ書きやすくなってるんですね。知りませんでした。<br />
そんなわけで今回は、カリー化の仕組みがjavascriptの標準になさそうだったので、簡単にカリー化したいと思って調べてみると。
結構良さそうなのが、ありました。(<a href="https://qiita.com/shuhei/items/e099910c11c4be5cd651" target="_blank">Qiita: JavaScript でカリー化</a>)<br />
そのまま使っても良かったんですけど、僕はjavascriptでは、できるだけthisを使わないようにしているので、リンクの記事のcontextがいらないのと、その場合の空の括弧()がいらないので、上の記事のコードを参考に改造しました。<br />
あと、他の言語から来ると、関数宣言の括弧の中にない引数をargumentsを使って取るのは気持ち悪いので、ES6の可変長引数を使ってこんな風にしてみました。<br />
<pre><code>Function.prototype.curry = function (...args) {
let func = this;
function partial(...args) {
return (args.length >= func.length)
? func.apply(null, args)
: function(...ret_args) {
return partial.apply(null, [...args, ...ret_args]);
}
}
return partial.apply(this, args);
};
</code></pre>
とりあえず、こんな感じにして動作確認<br />
<pre><code>function sum1(a, b, c) {
return a + b + c;
}
let sum2 = ((a, b, c) => a + b + c).curry()
console.log(sum1.curry(4, 5, 6)) // <- 6
console.log(sum1.curry(4)(5)(6)) // <- 15
console.log(sum2(10)(11)(12)) // <- 33
</code></pre>
これでいいんだけど、あまりビルトインのprototypeを勝手に拡張すんな!としつこくMDN(<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain#%E6%82%AA%E3%81%84%E4%BE%8B_%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%81%AE%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97%E3%81%AE%E6%8B%A1%E5%BC%B5" target="_blank">ココ</a>や<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain#%E3%81%BE%E3%81%A8%E3%82%81" target="_blank">ココ</a>)に書いてあるので、僕は潔癖でないのでそういうの嫌なんだけど、まあ後でcurryメソッドとか正式に追加されたらそれはそれで嫌なので、ただの関数版も作ってみた。<br />
scalaのimplicit conversionが懐かしいぜ・・・<br />
<pre><code>function curry(fn) {
return function partial(...args) {
return (args.length >= fn.length)
? fn.apply(null, args)
: function(...ret_args) {
return partial.apply(null, [...args, ...ret_args]);
}
}
};
</code></pre>
こっちの使い方はこんな感じ<br />
<pre><code>let sum3 = curry((a, b, c) => a + b + c)
// sum1は、上のを使いまわし
console.log(curry(sum1)(4, 5)(6)) // <- 15
console.log(curry(sum1)(1)(2)(3)) // <- 6
console.log(sum3(20)(21)(22)) // <- 63
console.log(sum3(2)(4, 6)) // <- 12
</code></pre>
まあ、難しいこと考えなければこれで良いような気がします。<br />
関数版は、憎たらしいthisも使わないですんでるし。<br />
昔、10年くらい前には、<br />
<span style="color: #38761d;"><i><b>{javascriptって何でもfunctionで出来てて意味わかんねー} </b></i></span><br />
とかって思ってたんすけど、その基本設計と最近のES5,ES6と続く言語の拡張により俄然、モダンな書き方ができる言語に変化してきてるんですね。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-28015473402997772722017-02-27T12:48:00.000+09:002017-02-27T15:20:46.818+09:00Ubuntu Classic Server 16.04 on Raspberry Pi3 で固定IPに変更タイトル通りの単純な話のはずだったんだけど、なかなかうまくいかなかったので、エントリアップ。<br />
最初に、ありがちな<code>/etc/network/interfaces</code>の最後に<br />
<pre><code> # eth0設定
auto eth0
iface eth0 inet static
address 172.20.XX.XX
network 172.20.0.0
netmask 255.255.0.0
broadcast 172.20.255.255
gateway 172.20.YY.YY
</code></pre>
な感じで、追加したんだけど、起動してみたら確かに、指定したアドレスのIPを持ってたんだけど、それとは「別に」DHCPでもアドレスを取得していてそっちでもアクセスできちゃう。<br />
<br />
さらに気持ち悪いことに、ifconfigをやってみると、なぜかDHCPで取ってきたアドレスだけ表示されて、↑で指定したアドレスが見えない。<br />
<b><i><span style="color: #38761d;">{なんじゃろなー・・・} </span></i></b><br />
と思い /etc/network/interfaces を見てみると、<br />
<pre><code> source /etc/network/interfaces.d/*.cfg
</code></pre>
てな行があったので、 <br /><b><span style="color: #38761d;"><i>
{こいつか} </i></span></b><br />
と探すと、<code>/etc/network/interfaces.d/50-cloud-init.cfg</code>がいた、<a href="http://qiita.com/ww24/items/43de25219159119d5d59#%E9%9D%99%E7%9A%84-ip-%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9">このページ</a>を見た感じ、これ変えりゃ行けるっぽかったので、このファイルに設定を移して、rebootすると、指定アドレスでなくDHCPになっている。<br />
<br />
<b><i><span style="color: #38761d;">{オレなんかミスったか?} </span></i></b><br />と<code>/etc/network/interfaces.d/50-cloud-init.cfg</code> を見ると編集前の状態に戻っている。 <br /><b><i><span style="color: #38761d;">{はっーー!? なんじゃそりゃ?} </span></i></b><br />もう一回やったが、全く同じ現象・・・ <br />
どうやら、cloud-initさんとやらが起動時に勝手に書き換えちゃってくれているらしい。<br />
<br />
ちょっと調べると、ビンゴなタイトル「<a href="http://askubuntu.com/questions/825485/how-to-set-static-ip-in-ubuntu-16-04-on-raspberry-pi-3-cloud-init">how to set static ip in ubuntu 16.04 on raspberry pi 3 (cloud-init)?</a>」のページがあったんだけど、回答はついてなくて、コメントで <br />
「sudo apt remove cloud-init やったら動いたょ」 <br />
「えーっ。cloud-init使う方法ないの?」 <br />
みたいなやりとりがあって微妙。<br />
<br />
他にもIP変えようとして、苦労して解決したけど<a href="https://gist.github.com/Informatic/0b6b24374b54d09c77b9d25595cdbd47#file-readme-md">cloud-initへの怒り丸出しなページ</a> も発見、しかし、うちのケースには役に立たずがっかり。<br />
<br />
<b><i><span style="color: #38761d;">{うー。ちゃんとしたドキュメント見つからないなーー。}</span></i></b><br />
とさまよっていると、RedHatのユーザー向けページに「<a href="https://access.redhat.com/ja/node/1460743">cloud-init に関する FAQ</a>」 なんてやつを発見。結構丁寧に書いてあるが、↑で最初に書いたような設定を、meta-data ファイルに書けとの司令。<br />
<br />
<b><i><span style="color: #38761d;">{うーむ、meta-data ファイルって何・・? っていうか、どこ・・?} </span></i></b><br />
<a href="http://cloudinit.readthedocs.io/en/latest/index.html">公式</a> 見ても、ググっても何か埒あかないので、頭来て、<br />
<pre><code>sudo find / 2>/dev/null | grep meta-data
</code></pre>
で、ルートから探してやったら、<br />
<pre><code> /var/lib/cloud/seed/nocloud-net/meta-data </code></pre>
<b><i><span style="color: #38761d;">{なんすかそこは? 見つかんないよそれは・・・}</span></i></b><br />
で、その見つけたファイルに<br />
<pre><code>network-interfaces: |
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 172.20.XX.XX
network 172.20.0.0
netmask 255.255.0.0
broadcast 172.20.255.255
gateway 172.20.YY.YY
bootcmd:
- ifdown eth0
- ifup eth0
</code></pre>
って追加したらやっとまともに動きました。 <br />
<br />
動きはしたんですが、 <code>/etc/network/interfaces.d/50-cloud-init.cfg</code> はdhcpのままなんすよね。/etcをgrepしても、↑で指定したアドレスを含むファイルは無いようだし、cloud-init 全然理解してないです。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-43574217194511381012017-01-18T12:45:00.000+09:002017-01-19T10:42:21.027+09:00c++で、scala風ifをやりたいscalaをしばらくやっていると、c++を書いた時にifが値を返さないのでトサカにくることがある。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFnLaaZX3bbAYpheBRyO272S0E7Eb59JZhg-WUxS6qB6-BH2RRqd8XPkg5PEtEKytcBZ7sslo0b34b2SIG0cRQv0MUPXJw9adZSibwa1pjjpoH0N-nUvoffVkQQZ0vYFdf1TNE99vA7Wg/s1600/tosaka.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFnLaaZX3bbAYpheBRyO272S0E7Eb59JZhg-WUxS6qB6-BH2RRqd8XPkg5PEtEKytcBZ7sslo0b34b2SIG0cRQv0MUPXJw9adZSibwa1pjjpoH0N-nUvoffVkQQZ0vYFdf1TNE99vA7Wg/s1600/tosaka.jpg" /></a></div>
<br />
三項演算子とラムダ式を使えばもちろんできるんだけど、超絶汚くなる。けど、マクロにしたら案外すっきりしたので、記事アップ。<br />
<pre class="prettyprint prettyprinted"><code><span class="com">// scala風if</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> IF</span><span class="pun">(</span><span class="pln">COND</span><span class="pun">)</span><span class="pln"> </span><span class="pun">(</span><span class="pln">COND</span><span class="pun">)?[&](){</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> ELSE </span><span class="pun">;}():[&](){</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> ENDIF </span><span class="pun">;}()</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> IFRES </span><span class="kwd">return</span></code></pre>
こんな感じ。c++11以降ね。使うときは、<br />
<pre class="prettyprint prettyprinted"><code><span class="com">// scala風if sample1</span><span class="pln">
</span><span class="kwd"> const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">auto</span><span class="pln"> s </span><span class="pun">=</span><span class="pln"> IF</span><span class="pun">(</span><span class="pln">i </span><span class="pun">==</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
cout </span><span class="pun"><<</span><span class="pln"> </span><span class="str">"case true"</span><span class="pln"> </span><span class="pun"><<</span><span class="pln"> endl</span><span class="pun">;</span><span class="pln">
IFRES </span><span class="str">"if true!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> ELSE </span><span class="pun">{</span><span class="pln">
cout </span><span class="pun"><<</span><span class="pln"> </span><span class="str">"case false"</span><span class="pln"> </span><span class="pun"><<</span><span class="pln"> endl</span><span class="pun">;</span><span class="pln">
IFRES </span><span class="str">"if false!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> ENDIF;
cout </span><span class="pun"><<</span><span class="pln"> s </span><span class="pun"><<</span><span class="pln"> endl</span><span class="pun">;</span></code></pre>
そこそこ見やすい。ENDIFが必要なのは勘弁してね。 <br />
c++は、中括弧の最後の値が中括弧全体の値にならないので、IFの戻り値にしたい値にIFRESを付けてね。 <br />
IFRESは、ただのreturnなんだけど、直にreturnって書くと関数全体のreturnに見えてしまい、わけわからなくなるので、このキーワードを使います。 <br />
逆に言うと、IFやELSEの中から関数の外へ直接return出来ないので、あしからず。returnしたい人は、別にifの戻り値が欲しいわけじゃないので普通のifを使ってください。<br />
<br />
あと、ENDIFマクロの最後にセミコロンをあえて含めずに、使うときにセミコロンをつけるようにしたのは、コンストラクタの初期化子でも使いやすくしたかったから。<br />
<br />
IFとかELSEの後がブロックでなくてもOK。<br />
<pre class="prettyprint prettyprinted"><code><span class="com">// scala風if sample2</span><span class="pln">
</span><span class="kwd"> const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">auto</span><span class="pln"> s </span><span class="pun">=</span><span class="pln"> IF</span><span class="pun">(</span><span class="pln">i </span><span class="pun">==</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln"> IFRES </span><span class="str">"if true!"</span><span class="pln">
ELSE IFRES </span><span class="str">"if false!"</span><span class="pln">
ENDIF;
cout </span><span class="pun"><<</span><span class="pln"> s </span><span class="pun"><<</span><span class="pln"> endl</span><span class="pun">;</span></code></pre>
waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-41507750091638621502016-10-20T12:03:00.001+09:002016-10-20T12:05:17.790+09:00opencv2系をgcc6でコンパイルしたらエラーになったopencv2.4.13をubuntu16.10環境(gcc6)でコンパイルしたらこんなエラーが出て止まった。<br />
<pre><code>In file included from /usr/include/c++/6/bits/stl_algo.h:59:0,
from /usr/include/c++/6/algorithm:62,
from /opencv-3.1.0/modules/core/include/opencv2/core/base.hpp:53,
from /opencv-3.1.0/modules/core/include/opencv2/core.hpp:54,
from /opencv-3.1.0/modules/core/include/opencv2/core/utility.hpp:52,
from /opencv-3.1.0/build/modules/core/precomp.hpp:49:
/usr/include/c++/6/cstdlib:75:25: fatal error: stdlib.h: そのようなファイルやディレクトリはありません
#include_next <stdlib.h>
</code></pre>
<span style="color: #274e13;"><strong><em>{stdlib.hがありませんって、そんなわけねーだろ!}</em></strong> </span><br />
一瞬、あせったけど、cmakeで<br />
<pre><code>-D ENABLE_PRECOMPILED_HEADERS=OFF
</code></pre>
付けとけば、とりあえずOKっぽい。 <br />
opencvの方がおいおいgcc6対応すると思うけど、今のところこれで切り抜けられそうです。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-42766325713544953302016-10-06T17:25:00.001+09:002016-10-07T12:06:43.325+09:00docker buildしたときに、Dockerfileがシンボリックリンクだと失敗する。タイトルのまんまなんだけど、docker buildしたときに、Dockerfileがシンボリックリンクだと失敗する。こんなエラーね。<br />
<pre><code>% docker build -t image-name:tag-name .
unable to prepare context: The Dockerfile () must be within the build context (.)
</code></pre>
そんなときは、リダイレクトでぶち込むととりあえず動きます。<br />
<pre><code>% docker build -t image-name:tag-name - < Dockerfile
</code></pre>
pathのところがハイフンになっている所に注意です。<br />
<br />
<strong><em><span style="color: red; font-size: large;">追記</span></em></strong> <br />
しかし、上の方法だとADDやCOPYでのファイルのコピーができません。 <br /><b><span style="color: #274e13;"><i>
{ムキーッ。動かないし、あわてて上のエントリだしちまって、アホ丸出しだぜ。}</i></span></b> <br />
でこんなふうにやってみた。<br />
<pre><code># -f で相対パス指定 -> ダメ
% docker build -t image-name:tag-name -f ../another-dir/Dockerfile .
unable to prepare context: The Dockerfile ({.の絶対パス/Dockerfile}) must be within the build context (.)
# -f で絶対パス指定 -> ダメ
% docker build -t image-name:tag-name -f /xxx/another-dir/Dockerfile .
unable to prepare context: The Dockerfile ({.の絶対パス/Dockerfile}) must be within the build context (.)
# zsh使ってるのでプロセス置換 -> ダメ
% docker build -t image-name:tag-name -f <(cat Dockerfile) .
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /proc/29179/fd/pipe:[1290842]: no such file or directory
</code></pre>
<b><i><span style="color: #274e13;">{う~む。かなり、頑固だなあ。} </span></i></b><br />
dockerは、どうしてもcontext dirにDockerfileの実体がないと動いてくれないらしい。<br />
しかたないので、簡単な build.shを↓のように書いてみた。<br />
<pre><code>#!/bin/bash
if [ $# -ne 1 ]; then
echo "usage: build.sh tag_name" 1>&2
exit 1
fi
rsync symlinkしてたDir/Dockerfile Dockerfile
docker build -t image-name:$1 .
</code></pre>
動いたよ。<br />
<br />
しかし、ここでもしやと思い、build context dirの外を向いているsymlinkをDockerfileのCOPYで、コピーしようとしてみたら、こんなエラーが<br />
<pre><code>lstat symlinkの名前: no such file or directory
</code></pre>
<b><span style="color: #274e13;"><i>{docker buildは、徹底的にsymlinkが嫌いなようだ。今回は敗北感が大きいな・・・}</i></span></b><br />
とにかく、dockerさんは、dockerfileやCOPYしたいファイルの「実体」があるところでbuildしてくださいといいたいのだろう。<br />
<br />
そして、dockerfileの変更はsymlinkで同期させるのでなく、build可能な、contextディレクトリをgit等で管理するのが作法だぞということなのかもしれない。<br />
<br />
仕方ない、従いますよdockerさん。ここまで、読んでくれた方、もしいらしたらごめんなさい。dockerfileをsymlinkにするのはやめたほうがいいと思います。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-45706168852080140922016-06-10T15:43:00.001+09:002016-06-10T15:43:36.134+09:00Ubuntu14のGUIをリモートコントロールしたいならX2Goだ!自分は、最近Ubuntuを気に入って使ってるんだけど、リモートでGUIを動かす機会が多い。<br />
<br />
いままで、vncserverかNoMachineを使ってたんだけど、最近見つけたX2Goがよくて、激しくおすすめしたいので、記事にしてみた。<br />
<br />
普通、第一選択肢になることが多いのがvncserverを立てての接続なんだけど、これだと結構、日本語入力でハマることが多い。<br />
自分の場合、Ubuntuが何台かあって(違う人がセッティングしてたりする)、自分が作業するときは、いつもこの設定をするんだけど、なぜか毎回違うところでハマる。<br />
<br />
うまくいってるマシンから ~/.vnc/xstartup をコピッて来ても、他のマシンでは動かなかったり(足りないmoduleが無いわけじゃなくても動かん)、fcitxを使ってると日本語入力できないことが多かったり(動くマシンもある)。さっぱりわからん。<br />
<br />
NoMachineの場合、日本語入力の問題は出ないのだけど、無料版だとディスプレイに表示されている画面のコントロールになってしまい、やってることが丸見えなだけでなく、そこに誰かいたら簡単に乗っ取られてしまうので危なっかしい。<br />
<br />
で、今回もvncserverの設定をしてて、うまくいかなかくてキレてたところたまたまみつけたのが、X2Go<br />
親切な解説は<a href="http://gihyo.jp/admin/serial/01/ubuntu-recipe/0330" target="_blank">ココ</a>。とくに設定しなくても、あっさり日本語入力できて感激。<br />
<br />
UbuntuのリモートGUI操作で、日本語入力に困ってる方は一度使ってみるといいと思います。<br />
<br />waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-17852688689766335112016-06-10T15:06:00.000+09:002016-06-10T15:06:19.069+09:00xfce4のターミナルでtabキーでコマンド補完が効かない時の対処xfce4を使ったら、ターミナル内でコマンド補完が効かなくて困った。<br />
shift+tabやctrl+iでは、コマンド補完が効く状態。<br />
<br />
対処方法は、<br />
<a href="https://www.starnet.com/xwin32kb/tab-key-not-working-when-using-xfce-desktop/" target="_blank">https://www.starnet.com/xwin32kb/tab-key-not-working-when-using-xfce-desktop/</a><a href="https://www.blogger.com/"></a><span id="goog_1623085594"></span><span id="goog_1623085595"></span>にあったんだけど、日本語化してる場合の設定箇所をメモ。<br />
<br />
アプリケーションメニュー -> 設定 -> ウィンドウマネージャー -> keyboardタブ -> 同じアプリケーションのウィンドウの切り替え 設定をクリア<br />
で、tab補完復活しました。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-54649301968280097242016-05-19T12:50:00.000+09:002016-05-19T14:48:14.088+09:00Ubuntu14.04で、extra-cmake-modulesを使いたい & apt-getできないパッケージの探し方Ubuntu14.04を使ってて、githubから<a href="https://github.com/fcitx/fcitx-qt5">fcitx-qt5</a>を落として使おうと思ったんだけど、cmakeをかけると、こんなエラーが出た。<br />
<pre class="prettyprint prettyprinted"><code><span class="typ">CMake</span><span class="pln"> </span><span class="typ">Error</span><span class="pln"> at </span><span class="typ">CMakeLists</span><span class="pun">.</span><span class="pln">txt</span><span class="pun">:</span><span class="lit">8</span><span class="pln"> </span><span class="pun">(</span><span class="pln">find_package</span><span class="pun">):</span><span class="pln">
</span><span class="typ">Could</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> find a </span><span class="kwd">package</span><span class="pln"> configuration file provided </span><span class="kwd">by</span><span class="pln"> </span><span class="str">"ECM"</span><span class="pln"> </span><span class="pun">(</span><span class="pln">requested
version </span><span class="lit">1.4</span><span class="pun">.</span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">with</span><span class="pln"> any of the following names</span><span class="pun">:</span><span class="pln">
</span><span class="typ">ECMConfig</span><span class="pun">.</span><span class="pln">cmake
ecm</span><span class="pun">-</span><span class="pln">config</span><span class="pun">.</span><span class="pln">cmake</span></code></pre>
<strong><em>{なんじゃ、このECMってのは? しゃーない入れるか。}</em></strong> <br />
と調べると、 extra-cmake-modules というもののよう。 <br />
これを使うと、どうも CMakeLists.txt が書きやすくなるものらしく、最近cmakeの際に、ECMを必要とするプロジェクトが増えている様子。 例によって、<br />
<pre><code>sudo apt-get install extra-cmake-modules
</code></pre>
してみたが、<br />
<pre><code>E: パッケージ extra-cmake-modules が見つかりません
</code></pre>
と怒られた。<br />
<strong><em>{えーっ。ないのかー。探すか・・・}</em></strong> <br />
Ubuntuだと、このECMっちゅうのは、14.10からの導入らしく14.04の標準リポジトリには、存在しない。 しかも、<strong>Ubuntu14.04 extra-cmake-modules ECM apt-get</strong> とかのキーワードをいろいろ組み合わせてググってもパッとしない。<br />
結局、見つかったんだけど、それが<a href="https://launchpad.net/ubuntu/+source/extra-cmake-modules">ここ</a>。一見、14.04用ないじゃん・・・ ってなるけど、わかりにくく下の方に、<br />
<blockquote>
Other versions of ‘extra-cmake-modules’ in untrusted archives.</blockquote>
てあるので、そこ開いてTrusty(14.04のこと。わかりにくいから数字にしてくれ・・・)を叩くと、非公式リポジトリの説明ページに飛ぶから、そこの情報に従い、<br />
<pre><code>sudo add-apt-repository ppa:ubuntu-sdk-team/staging
</code></pre>
で、リポジトリ追加して後は、お決まりの<br />
<pre><code>sudo apt-get update
sudo apt-get install extra-cmake-modules
</code></pre>
で、無事ECM追加できて、cmakeもあっさり通った。<br />
今回お世話になった、パッケージ情報がたくさんある launchpad.net なんだけど、Ubuntuのパッケージを探すときには、注意点があって、<a href="https://launchpad.net/">トップページ</a>にある検索窓に、パッケージ名(例:extra-cmake-modules)を打ち込んでも、結果のExact matchesには、ソースパッケージの情報しかでてこない。(お目当てのモノは、下のずらーーーっの中に埋没している。) <br />
なので、<a href="https://launchpad.net/ubuntu">Ubuntuパッケージのページ</a>の検索窓を使う。こっちは、Exact matchesにちゃんと実行できるパッケージが出るので、そのから探すと速いです。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-18447660635699616192016-04-26T20:00:00.000+09:002016-04-26T20:00:08.966+09:00Django (1.9) で、PyMySqlのDictCursorを使う方法。<h2 id="対象">
対象</h2>
Djangoから、DBに接続してデータをごにょごにょやりたいんだけど、ORMが嫌いで <br />
<strong><span style="color: red;">「Viva! SQL」</span></strong> な人。<br />
<h2 id="やりたいこと">
やりたいこと</h2>
Djangoのconnectionsを使うと、SELECT文の結果カーソルがtupleになってしまいフィールド順序でのアクセスになってしまうので、こんな風に <br />
<code>{'name': 'Taro Yamada', 'age': 25}</code> <br />
Dictionaryで結果がほしい。<br />
<h2 id="やったこと-簡潔編">
やったこと (簡潔編)</h2>
ORM使わないなら、Djangoのconnectionsいらないから、自分でconnectする。 <br />
参考URL: <a href="http://www.yoheim.net/blog.php?q=20151102" rel="nofollow" target="_blank">YoheiM.NET</a><br />
<h2 id="やったこと-だらだら編">
やったこと (だらだら編)</h2>
Djangoで、settings.pyにDBを以下のusersのように追加して、(<a href="http://docs.djangoproject.jp/en/latest/topics/db/multi-db.html" rel="nofollow" target="_blank">docs.djangoproject.jpより引用</a>)<br />
<pre class="prettyprint prettyprinted"><code class="language-python:settings.py"><span class="pln">DATABASES </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="str">'default'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="str">'NAME'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'app_data'</span><span class="pun">,</span><span class="pln">
</span><span class="str">'ENGINE'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'django.db.backends.postgresql_psycopg2'</span><span class="pun">,</span><span class="pln">
</span><span class="str">'USER'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'postgres_user'</span><span class="pun">,</span><span class="pln">
</span><span class="str">'PASSWORD'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'s3krit'</span><span class="pln">
</span><span class="pun">},</span><span class="pln">
</span><span class="str">'users'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="str">'NAME'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'user_data'</span><span class="pun">,</span><span class="pln">
</span><span class="str">'ENGINE'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'django.db.backends.mysql'</span><span class="pun">,</span><span class="pln">
</span><span class="str">'USER'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'mysql_user'</span><span class="pun">,</span><span class="pln">
</span><span class="str">'PASSWORD'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'priv4te'</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></code></pre>
で、データがほしいところで<br />
<pre class="prettyprint prettyprinted"><code class="language-python"><span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">db </span><span class="kwd">import</span><span class="pln"> connections
conn </span><span class="pun">=</span><span class="pln"> connections</span><span class="pun">[</span><span class="str">"users"</span><span class="pun">]</span><span class="pln">
cur </span><span class="pun">=</span><span class="pln"> conn</span><span class="pun">.</span><span class="pln">cursor</span><span class="pun">()</span><span class="pln">
cur</span><span class="pun">.</span><span class="pln">execute</span><span class="pun">(</span><span class="str">"SELECT * FROM persons WHERE id = %s"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">)</span><span class="pln">
row </span><span class="pun">=</span><span class="pln"> cur</span><span class="pun">.</span><span class="pln">fetchone</span><span class="pun">()</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">row</span><span class="pun">)</span></code></pre>
てな感じで、書くとprintされるのが、以下みたいな感じ <br />
<code>(100, "Taro Yamada", 25, 1, True)</code> <br />
<strong><em>{えーっ。tupleですかー? これじゃ、templateにrowを渡した時に、{{ row.1 }} な感じで読み取らないといけないから、わけわかめじゃんよー・・・。俺は、class Person を作りたくないんだってば }</em></strong> <br />
どうやら調べると、DictCursorなるものを使えば、rowがtupleでなく <br />
<code>{'id': 100, 'name': 'Taro Yamada', 'age': 25, 以下略}</code> <br />
のようにdictionaryで取れるらしい。(参照: <a href="http://stackoverflow.com/a/35074393/1208283" rel="nofollow" target="_blank">stackoverflow</a>) 押忍。じゃあ、そこに <br />
<code>connection.cursor(pymysql.cursors.DictCursor)</code> <br />
なんて記述が、あったからさっきの上のコードをこんなふうに変更してみたところ<br />
<pre class="prettyprint prettyprinted"><code><span class="pun">---</span><span class="pln"> cur </span><span class="pun">=</span><span class="pln"> con</span><span class="pun">.</span><span class="pln">cursor</span><span class="pun">()</span><span class="pln">
</span><span class="pun">+++</span><span class="pln"> cur </span><span class="pun">=</span><span class="pln"> con</span><span class="pun">.</span><span class="pln">cursor</span><span class="pun">(</span><span class="pln">pymysql</span><span class="pun">.</span><span class="pln">cursors</span><span class="pun">.</span><span class="typ">DictCursor</span><span class="pun">)</span></code></pre>
こんなエラーが<br />
<pre class="prettyprint prettyprinted"><code><span class="pln"> cur </span><span class="pun">=</span><span class="pln"> connections</span><span class="pun">[</span><span class="str">'users'</span><span class="pun">].</span><span class="pln">cursor</span><span class="pun">(</span><span class="pln">pymysql</span><span class="pun">.</span><span class="pln">cursors</span><span class="pun">.</span><span class="typ">DictCursor</span><span class="pun">)</span><span class="pln">
</span><span class="typ">TypeError</span><span class="pun">:</span><span class="pln"> cursor</span><span class="pun">()</span><span class="pln"> takes </span><span class="lit">1</span><span class="pln"> positional argument but </span><span class="lit">2</span><span class="pln"> were given</span></code></pre>
<strong><em>{むきーっ!! }</em></strong> <br />
どうやら、connections[‘users’]でとれるconnectionと、上記stackoverflowサンプルのconnectionは、別物らしい。 <br />
そりゃそうじゃよな。 <br />
具体的には、前者が ‘django.db.backends.mysql.base.DatabaseWrapper’ <br />
で、後者が ‘pymysql.connections.Connection’ <br />
さらに調べると、別の<a href="http://stackoverflow.com/a/14294314/1208283" rel="nofollow" target="_blank">stackoverflow</a>で、 <br />
<b><span style="color: red;">
「djangoに、DictCursorなんて、なぁぃですね~↑」</span></b>(No there is no such support for DictCursor in django.) <br />
<strong><em>{なにーっ!! }</em></strong> <br />
さらに、その回答の解決案がびみょ~~な感じ。 <br />
でも、考えてみるとDictCursorを使いたいって時点で、djangoのORM無視してSQL投げたいってことなんだから、自分でconnectすればいいじゃんか。 ← 早く気がつけ。 <br />
幸い、親切な人が素晴らしい解説を書いている(<a href="http://www.yoheim.net/blog.php?q=20151102" rel="nofollow" target="_blank">YoheiM.NET</a>)ように、使い方は簡単。 <br />
ただ、DB接続設定は、settings.pyに残しておきたいのと、データを使う側でのコードを簡潔にしたいので、最終的に以下のようになった。 <br />
まず、settings.py に、connectionまで定義してしまってアプリ全体で使い回す。<br />
<pre class="prettyprint prettyprinted"><code><span class="kwd">import</span><span class="pln"> pymysql</span><span class="pun">.</span><span class="pln">cursors
USERS_DB </span><span class="pun">=</span><span class="pln"> pymysql</span><span class="pun">.</span><span class="pln">connect</span><span class="pun">(</span><span class="pln">
host</span><span class="pun">=</span><span class="str">'localhost'</span><span class="pun">,</span><span class="pln">
user</span><span class="pun">=</span><span class="str">'db_user'</span><span class="pun">,</span><span class="pln">
password</span><span class="pun">=</span><span class="str">'db_pass'</span><span class="pun">,</span><span class="pln">
db</span><span class="pun">=</span><span class="str">'users'</span><span class="pun">,</span><span class="pln">
charset</span><span class="pun">=</span><span class="str">'utf8'</span><span class="pun">,</span><span class="pln">
cursorclass</span><span class="pun">=</span><span class="pln">pymysql</span><span class="pun">.</span><span class="pln">cursors</span><span class="pun">.</span><span class="typ">DictCursor</span><span class="pun">)</span></code></pre>
最後の一行が、ポイント。 settings.pyってpythonファイルだから、こんなものも置けるんだ・・・ <br />
DBにアクセスしたい方では、<br />
<pre class="prettyprint prettyprinted"><code class="language-python"><span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">conf </span><span class="kwd">import</span><span class="pln"> settings
conn </span><span class="pun">=</span><span class="pln"> settings</span><span class="pun">.</span><span class="pln">USERS_DB </span><span class="com"># ←これ便利</span><span class="pln">
cur </span><span class="pun">=</span><span class="pln"> con</span><span class="pun">.</span><span class="pln">cursor</span><span class="pun">()</span><span class="pln">
cur</span><span class="pun">.</span><span class="pln">execute</span><span class="pun">(</span><span class="str">"SELECT * FROM persons WHERE id = %s"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">)</span><span class="pln">
row </span><span class="pun">=</span><span class="pln"> cur</span><span class="pun">.</span><span class="pln">fetchone</span><span class="pun">()</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">row</span><span class="pun">)</span></code></pre>
これで、 <code>{'id': 100, 'name': 'Taro Yamada', 'age': 25, 以下略}</code> が、めでたくprintされる。<br />
ついでに書くと、templateに渡すところでは、↑のrowを利用して、views.py で<br />
<pre class="prettyprint prettyprinted"><code><span class="pln">render</span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> </span><span class="str">'users.html'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="str">'person'</span><span class="pun">:</span><span class="pln"> row</span><span class="pun">})</span></code></pre>
なふうに、簡単に渡して、template側では、<br />
<pre class="prettyprint prettyprinted"><code><span class="pun">{{</span><span class="pln"> person</span><span class="pun">.</span><span class="pln">name </span><span class="pun">}}</span></code></pre>
とか<br />
<pre class="prettyprint prettyprinted"><code><span class="pun">{{</span><span class="pln"> person</span><span class="pun">.</span><span class="pln">age </span><span class="pun">}}</span></code></pre>
みたいに、見てすぐにわかるように呼び出せるようになった。<br />
<br />
でも、django.db.backends.mysql.base.DatabaseWrapperと pymysql.connections.Connectionのようにオブジェクト自体が異なっていても、executeの書き方やfetchoneで呼ぶところなど、共通だからほとんどコード変更の必要が無いのって、pythonからのDBアクセス方法が<a href="https://www.python.org/dev/peps/pep-0249/" rel="nofollow" target="_blank">PEP 249</a>で規定されてるからなんだよね。 <br />
pythonって文法が好きになれないんだけど(俺が好きなのはscala)、取り巻く環境がいろいろと整ってるから結局使っちゃうのよ。<br />
<br />
長いところ、最後までお読みいただきありがとうございました。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-41582444763732995242015-10-08T12:34:00.001+09:002015-10-08T12:38:28.061+09:00gflagsとglog(Google logging)を windows 用にVisualStudio2015でビルドした<p>ググっても出てこなかった(or古い情報で使えなかった)ので、メモ。 <br>
当方の環境はvs2015, windows10</p>
<h2 id="cmake">cmake</h2>
<p>とにかくcmakeが必要。 入っていない場合は、<a href="https://cmake.org/download/">ココ</a>から入れる。</p>
<h2 id="glog">glog</h2>
<p><a href="https://github.com/google/glog">github</a> から落とすと(2015-10-08 時点) 、google-glog.sln がいるがこいつがくせ者。vs2015で開くときにconvertしてもビルド時に失敗する。 <br>
なので、付属のslnは使わずにcmakeで作りましょう。</p>
<h2 id="gflags">gflags</h2>
<p>こいつも同じ。<a href="https://github.com/gflags/gflags">github</a> にあるChangeLog.txt に 「Renamed google-gflags.sln to gflags.sln」なんて記述があったから、一生懸命探してしまったがそんなファイルはない。 <br>
なので、cmakeでslnを作って下さい。</p>waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-61258408401995486332015-03-02T13:49:00.001+09:002015-03-02T14:13:38.151+09:00eclipse使ってて、突然gitのcommitができなくなった<h3 id="状況">状況</h3>
<p>eclipse(Luna)使ってるんだけど、ある日突然、gitのcommitができなくなった。 <br>
commitしようとすると、</p>
<pre><code>'committing changes' has encountered a problem.
An internal error occurred
</code></pre>
<p>なんてエラーがダイアログBoxに出て、commitできない。そのDialog Boxに付いている”Details”ボタンを押しても</p>
<pre><code>An internal error occurred
Exception caught during execution of commit command
</code></pre>
<p>しか書いてなくて、わけわからなかった。</p>
<p>ネットで調べたら、<a href="http://stackoverflow.com/questions/10037305/an-internal-error-occurred-when-trying-to-commit-to-git-from-egit-in-eclipse">ここ</a> に書いてある方法で解決したんだけど、下の方にちょこっと書いてあって見つけにくかったのでメモを残します。</p>
<h3 id="解決法">解決法</h3>
<p><strong><em>.gitの中にある、 index.lock を削除する。</em></strong></p>
<p>自分のケースでは、これだけであっさり解決しました。</p>waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-27973905596758376402014-10-25T09:36:00.002+09:002017-03-14T07:38:17.704+09:00漢字プリント 簡易作成ページ<script charset="utf-8" src="http://m.gmobb.jp/static/grp1/js/jquery-1.5.2.min.js" type="text/javascript"></script>
<script charset="utf-8" src="http://m.gmobb.jp/static/grp1/js/kanji.js" type="text/javascript"></script>
漢字の練習をしたいとき(させたいとき)に一度間違えた漢字だけを集めて練習をしたいようなときがある。<br />
そんなときに、間違えた問題だけを集めたプリントがあると便利なのだが、自分で作るとなると形を整えるのが結構面倒。<br />
<br />
てなわけで、間違えた問題をテキストで取っておいて貼り付けるとそこそこ整形するようなものを作ってみました。<br />
印刷用画面生成ボタンを押して表示された画面をブラウザの印刷機能で印刷してください。A4縦だと収まりがいいです。<br />
動作確認は、chrome,safariで行っています。詳しい使い方は、ボタンの下を見てね。<br />
<textarea cols="60" id="mondai" rows="20">自分の(意見,いけん)を言う。
(*真相,しんそう)を(究明,きゅうめい)する。
(必ず,かならず)行きます。
(全部,ぜんぶ)食べる。
(身長,しんちょう)がのびる。
(旅行,りょこう)に行く。
(農家,のうか)の人たち。
(順番,じゅんばん)に(説明,せつめい)する。
プールに行く(予定,よてい)。
誕生会の(司会,しかい)をする。
(資料,しりょう)を集める。
結果を(報告,ほうこく)する。
雪が(積もる,つもる)(季節,きせつ)。
(業界用語,ぎょうかいようご)を使う。
(鏡,かがみ)にうつる。
(文明開化,ぶんめいかいか)の音がする。
(人工,じんこう)知能
(両親,りょうしん)にあいさつする。
虫を(観察,かんさつ)する。
(特別急行,とくべつきゅうこう)
</textarea><br />
<button id="btnClear">問題文クリア</button> <button id="btnMake">印刷用画面生成</button><br />
<br />
各行に漢字の問題を<br />
漢字の(問題,もんだい)を作る。<br />
のように書きます。実際は、ここで書くのではなく、どこかのテキストファイルにでもまとめておきます。<br />
()の中はカンマ区切りで前半が正解の漢字、後半に読みがなを入れておきます。<br />
送り仮名まで問題にしたいときは、上の例の3行目のように送り仮名まで含めて書いてください。<br />
<br />
また、問題文の難しい文字に読みがなを付けたいときは、上の例の2行目のように<br />
(*真相,しんそう)を(究明,きゅうめい)する。<br />
漢字の前に*を付けてください。このように指定すると問題ではなくただのふりがなとして作成します。<br />
<br />
このページを作成するにあたって、freefielderさんの縦書きhtml作成用javascript(<a href="http://tategaki.info/h2v/">h2v.js</a>)を使用しました。すごく便利なscriptです。ありがとうございました。
<textarea id="htmlHeader" style="visibility: hidden;"><!doctype HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>簡易漢字プリント</title>
<script type="text/javascript" src="http://m.gmobb.jp/static/grp1/js/h2v.js" charset="utf-8"></script>
<link rel="stylesheet" type="text/css" href="http://m.gmobb.jp/static/grp1/js/h2v.css" charset="utf-8" />
</head>
<body>
<div id="mondai">
</textarea>
<textarea id="htmlFooter" style="visibility: hidden;"></div>
<script type="text/javascript">
var params = {
'mondai' : {
'fontsize' : '28px',
'chars' : 15,
'pagewidth':'660px',
'lineInterval': 1.33,
'bar' : false,
'showcredit':false
}
} ;
h2vconvert.init( params );
</script>
</body>
</html>
</textarea>waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-84395606595597741752014-09-15T00:23:00.000+09:002014-09-15T00:23:49.511+09:00ディズニー ツムツムにはまった今日は、本当にどうでもいい話なんだけど(いつもどうでもいいんだけど)、最近ディズニーツムツムにはまっている( orた?)。<br />
自分がツムツムをやるときは、手を使わずに必ず棒を使うようにしている。 <br />
こんなやつ、<br />
<h6 id="ipadiphone用スタイラスペンタッチペン-su-pen-p201s-ascposted-with-amazlet-at-140914metamoji-売り上げランキング-54368amazoncojpで詳細を見る">
<div class="amazlet-box">
<div class="amazlet-image">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00C91UNWS/choniwaniwani-22/ref=nosim/" target="_blank"><img align="left" alt="iPad/iPhone用スタイラスペン(タッチペン) Su-Pen P201S-ASC" src="http://ecx.images-amazon.com/images/I/31pojSU5JtL._SL160_.jpg" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00C91UNWS/choniwaniwani-22/ref=nosim/" target="_blank">iPad/iPhone用スタイラスペン(タッチペン) Su-Pen P201S-ASC</a><br />
<div class="amazlet-powered-date">
posted with <a href="http://www.amazlet.com/" target="_blank" title="amazlet">amazlet</a> at 14.09.14</div>
</div>
<div class="amazlet-detail">
MetaMoJi <br />
売り上げランキング: 54,368</div>
<div class="amazlet-sub-info">
<div class="amazlet-link">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00C91UNWS/choniwaniwani-22/ref=nosim/" target="_blank">Amazon.co.jpで詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer">
</div>
</div>
</h6>
このスタイラスは、su-penのフタがびよ~~~んとのびるバネで出来ている伝説のモデルで、残念ながら現在生産終了。su-penは、保護フィルム越しの反応が、何本か試した中で一番良かったので愛用している。<br />
こういう棒を使うと、棒なだけあってちょっと指を動かしただけで、先端が大きく動くので高速にプレイできてやりやすいので、ゲームでは手放せなくなっていて、うちではこいつは「ツム棒」と呼ばれている。<br />
で、この間、この棒を忘れて外出してしまい、移動時間にツムツムをやろうと思って、<br />
<h4 id="げツム棒忘れたぜ">
{げ、ツム棒忘れたぜ・・・}</h4>
とあせったが、まあしょうがないので指でやってみた。<br />
ほんでもって、いつものペースで指で限界プレイしたら、<strong>指がマジ暑い</strong>。 もちろん摩擦で・・・<br />
<h4 id="なんじゃこりゃこれ炎のコマじゃねえの俺はゲームセンターあらしか">
{なんじゃこりゃ!これ、炎のコマじゃねえの?俺はゲームセンターあらしか・・・}</h4>
ツムツムを指でマジプレイしてる人って指紋なくなるんじゃね↑ と心配になりました。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-60226014850870098942014-07-03T15:01:00.000+09:002014-07-03T15:01:03.942+09:00PlayFramework 2.3.1 with Scala 2.11.1 へプロジェクトをアップグレードした時のメモ最近、ScalaもPlayもいろいろアップデートしていて速くなったとか(<a href="http://www.scala-lang.org/news/2.11.0" target="_blank">Scala</a>)、速くなったとか(<a href="http://www.playframework.com/documentation/2.3.x/Highlights23" target="_blank">Play</a>)言っているから、<br />
<b><span style="color: #38761d;">{まあ、入れてみるか}</span></b><br />
とやってみたら、以前のプロジェクト(Play2.2.x with Scala2.10.x)をアップグレードしようとした時いろいろややこしかったので、別のプロジェクトをやるときに絶対忘れそうなのでメモっておく。<br />
<br />
まず、新しいPlayとScalaを公式ページでdownloadしようとすると、activatorなるものをインストールするように誘導された。<br />
<b><span style="color: #38761d;">{activatorってなんじゃい}</span></b><br />
<div>
完全に浦島太郎状態。どうやら、Scala, Play, Akkaやらサンプルやらwebエディターやらwebデバッガーやらセットになっていて、これ入れれば全部OKみたいなものらしい。</div>
<div>
</div>
<div>
しかもplayコマンドとかsbtコマンドとか、全部 activator コマンドでやれということらしい。</div>
<div>
で、activatorインストール後、今までのPlayのprojectフォルダに行って、</div>
<pre class="console">activator compile</pre>
とかいきなりやったけど、エラーの山。<br />
<b><span style="color: #38761d;">{ま、そりゃそうだよな。しかたないか。}</span></b><br />
なので、projectのファイルを色々変更した。<br />
<br />
まず、project/plugin.sbt のplayのバージョンを以下のように変更<br />
<pre class="console">addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.1")
</pre>
次に、project/build.propertiesのsbtバージョンを以下のように変更<br />
<pre class="console">sbt.version=0.13.5
</pre>
そんで、project/Build.scalaを<a href="https://github.com/scala/scala-module-dependency-sample" target="_blank">このサイト</a>のSbt sampleを参考にこんな感じ変えてみた。<br />
<pre class="console">import sbt._
import Keys._
object ApplicationBuild extends Build {
val appName = "xxxxx"
val appVersion = "1.0-SNAPSHOT"
val main = Project(appName, file(".")).enablePlugins(play.PlayScala).settings(
version := appVersion,
scalaVersion := "2.11.1",
libraryDependencies := {
CrossVersion.partialVersion(scalaVersion.value) match {
// if scala 2.11+ is used, add dependency on scala-xml module
case Some((2, scalaMajor)) if scalaMajor >= 11 =>
libraryDependencies.value ++ Seq(
"org.scala-lang.modules" %% "scala-xml" % "1.0.1",
"org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.1",
"org.scala-lang.modules" %% "scala-swing" % "1.0.1",
"com.github.scala-incubator.io" %% "scala-io-file" % "0.4.3-1")
case _ =>
// or just libraryDependencies.value if you don't depend on scala-swing
libraryDependencies.value :+ "org.scala-lang" % "scala-swing" % scalaVersion.value
}
},
scalacOptions += "-feature"
)
}
</pre>
参考ページのコードに追加したのは、scalaxのscala-io-fileの部分、モジュール名とかバージョンとかわからなかったけど、<a href="http://mvnrepository.com/artifact/com.github.scala-incubator.io" target="_blank">MVNRepositorysというサイト</a>から持ってきた。このサイトは知らなかったけど、こういうときはメチャメチャ便利なところ。<br />
<br />
これでとりあえず動くようになった。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-61996629357112414012014-04-17T12:18:00.000+09:002014-04-17T12:18:02.931+09:00[linux]sshで鍵認証を行う際、commandに任意の引数を与えたい!自分は、以前は<b><span style="color: #38761d;">{Windows命}</span></b>だったのですが、最近linuxを使うようになって、便利なツールやコマンドが大量にあるので、<b><span style="color: #38761d;">{あれ、もしかしてなんか自動でやらせたりする時にはすっごく便利かも}</span></b>と思うようになってきました。<br />
もちろん、コマンドがいっぱいあり過ぎてとても全貌はつかめないのですが、自分が思いつくような処理はだいたいやる方法があります。<br />
今回は、あるマシンから別のマシンのコマンドをある程度セキュリティを保ちながら、ビシバシ自動で実行するというところまで、結構大変だったのでメモをだらだらと残します。<br />
<br />
あるクライアントマシン(以下C)からサーバー(以下S)上のコマンドをC上のプログラムやらcronやらから自動で実行したいとします。<br />
話が長いので先にまとめると、<br />
・ CからSのいろんなコマンドを自動で実行したい。<br />
→ Sにログインするとき、自動でsshのパスワード入力ができなくて困る。<br />
→ パスフレーズ無しの秘密鍵を使用したssh鍵認証を使用する。<br />
→ パスフレーズ無しなので、秘密鍵ファイルさえあればS上でやりたい放題なので困る。<br />
→ Sのauthorized_keysにcommandを書いてそのコマンドしか実行できないようにする。<br />
→ CからSに投げたいコマンドは1つじゃないし、パラメータとかも変えたいので困る。<br />
→ sshの機能を使いCからSに環境変数を渡して解決。<br />
<br />
<b><span style="font-size: large;">1: ssh鍵認証でログインできるようにする。</span></b><br />
まず、C上で、公開鍵と秘密鍵を作成します。(<a href="http://blog.tk84.net/yldM" target="_blank">参考にしたページ</a>)<br />
<pre class="console">client$ ssh-keygen -t rsa
# 途中で秘密鍵のパスフレーズを聞かれるので、ただエンターすればパスフレーズ無しになる。
# ホームの.sshにできた、id_rsa.pubが公開鍵で、id_rsaが秘密鍵。
</pre>今度は、Sに先ほどCで作った公開鍵(id_rsa.pub)をどうにかして持っていって、ログインしたい「Sのユーザー」のホーム下の.ssh/authorized_keys<br />
の一番最後に、id_rsa.pubの内容をコピーします。<br />
.sshディレクトリやauthorized_keysがない時は、<br />
<pre class="console">server$ cd
server$ mkdir .ssh
server$ chmod 700 .ssh
server$ touch .ssh/authorized_keys
server$ chmod 600 .ssh/authorized_keys
# 他のユーザーが中身を見られないようにちゃんとchmodしておく。
</pre>これでクライアント側から<br />
<pre class="console">client$ ssh -i ~/.ssh/id_rsa user@serverAddress
</pre>なんてやるとパスワード入力無しでログインできます。<br />
ただし、秘密鍵がパスフレーズ無しなので、id_rsaを持っているひとはS上でやりたい放題になってしまい危険です。<br />
<br />
<b><span style="font-size: large;">2: 鍵認証でログインしたユーザーが好きなコマンドを打てないようにする。</span></b><br />
これは、Sの~/.ssh/authorized_keys にオプションを書くことにより行います。<br />
authorized_keysというファイルは、かなり<a href="http://takuya-1st.hatenablog.jp/entry/20110813/1313252992">高機能なオプション設定</a>ができまして、このファイルをいじるだけで、「使用される公開鍵ごとに」接続ホストを限定できたり、対話コンソール禁止にしたり、ポートフォワーディングを禁止にしたりいろいろできます。<br />
接続ホストを限定すれば、だいぶ安心なのですが、それだと誰かが勝手にCのマシンを使った時にパスワード無しでSに侵入できるので、今回は、commandオプションを使います。<br />
commandオプションを設定すると、sshで接続してきたら特定のコマンド(サーバー側で設定)だけを実行して接続を切るようになります。sshコマンドで実行コマンドが指定されていても無視します。(<a href="http://www.unixuser.org/~euske/doc/openssh/jman/sshd.html">参照:sshdのman</a>)<br />
オプションを書く場所は、authorized_keysの先ほどの公開鍵をコピーした行の先頭で、例えば<br />
<pre class="console">command="ls -al" ssh-rsa AAABBBCCC...
# ssh-rsa以降が公開鍵部分
</pre>としておくと、クライアント側から<br />
<pre class="console">client$ ssh -i ~/.ssh/id_rsa user@serverAddress
</pre>なんてやると、ログイン先のホームディレクトリの内容がずらずらと出て、すぐにSからログアウトされます。<br />
これで、誰かが秘密鍵を使ってログインしても好きなことが出来なくなります。<br />
しかし、この状態だと自分もcommandで指定したコマンドしか実行できないし、コマンドに可変で引数とか渡せないので不便です。<br />
<br />
<b><span style="font-size: large;">3: sshの機能でサーバーに環境変数を渡す。</span></b><br />
sshの機能でCからSに環境変数を渡すことができます。(<a href="http://wps.watanet.mydns.jp/2009/11/04/ssh%E3%81%A7%E3%80%81%E3%82%B5%E3%83%BC%E3%83%90%E5%81%B4%E3%81%B8%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E5%BC%95%E3%81%8D%E6%B8%A1%E3%81%99%E6%96%B9%E6%B3%95-ssh-acceptenv-permituserenvironm">ここのページ</a>をヒントにしました。)<br />
まず、S側の/etc/ssh/sshd_config を下のようにいじります。<br />
<pre class="console"># 環境変数の変更を許可する設定
PermitUserEnvironment yes
# クライアントから値を受け取る環境変数の指定
# SSH_ARGは自分でテキトーに決めた環境変数名
AcceptEnv SSH_ARG
</pre>PermitUserEnvironmentはyes/noなので、値を上書きします。<br />
AccveptEnvは、上書きでなく追加してください。追加した環境変数がクライアントから変更可能になります。<br />
なお、sshd_configを変更したらsshdの再起動が必要です。<br />
これで今度は、authorized_keysのcommandを、例えば<br />
<pre class="console">command="echo SSH_ARG=$SSH_ARG" ssh-rsa AAABBBCCC...
# ssh-rsa以降が公開鍵部分
</pre>としておくと、クライアント側で<br />
<pre class="console">client$ env SSH_ARG=AHO ssh -i ~/.ssh/id_rsa -oSendEnv="SSH_ARG" \
user@serverAddress // ここまでコマンド
SSH_ARG=AHO // ← これが表示結果
client$
</pre>となり、めでたく環境変数が渡せました。もちろん複数の環境変数も渡せます。<br />
ここで、例のechoの代わりに自分で書いたscript等を使えば、CからSを自由にコントロールでき、また、意図しないコマンドの実行を抑えることが出来ます。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-73479460380621638512014-04-11T11:22:00.000+09:002014-05-01T10:07:25.226+09:00[scala][akka] microkernelを使って独立したプロセスに立てたRemote Actorとの通信サンプル自分は、akkaの「Let it crash」というという発想が大好きなんです。<br />
初めて「<a href="http://doc.akka.io/docs/akka/snapshot/intro/what-is-akka.html" target="_blank">Let it crash</a>」というスローガンを見たとき<br />
<b><span style="color: #38761d;">{だよね。それでいいんだよね。}</span></b><br />
と感激しました。<br />
<br />
ただ、crashさせるためのSupervisor(<a href="http://doc.akka.io/docs/akka/snapshot/general/supervision.html" target="_blank">doc</a>、<a href="http://dev.classmethod.jp/server-side/akka-faulttolerance/" target="_blank">サンプル</a>)の仕組みは、Actorはcrashさせるけど、jvmまでは殺してくれない。自分の場合、ヘビーな計算をscalaからloadLibraryしたc++のモジュールをJNA経由で使ってやっているので、jvmごとcrashさせたいんです。(外部libraryのunloadはできないようなので・・・)<br />
<br />
そこで、登場するのがakkaの<a href="http://doc.akka.io/docs/akka/snapshot/scala/microkernel.html" target="_blank">microkernel</a>で、こいつを使うと簡単に独立したプロセスのjvmでActorを立てることが出来る。<br />
必要に時は、こいつをjvmごとkillして復活させればいい ← もっとスマートな仕組みがきっとある気がする<br />
<br />
で、HelloWorldのサンプルを書いてみた。<br />
listenポートを可変にしたかったので、confファイルを使わない形で作ってみた。<br />
application.confとかに設定が分かれてないほうがサンプルとしてもわかりやすいし。<br />
まず、リモートで接続される側のmicrokernel<br />
パラメータは、<a href="http://choni-waniwani.blogspot.jp/2014/04/sacla-akkamicrokernel.html" target="_blank">起動時に引数として渡せない</a>ので、起動する時は、<br />
<i><span style="color: #0b5394;">env AKKA_PORT=12345 akka hello.world.Sample.HelloLauncher</span></i><br />
て感じで、環境変数経由にする。<br />
あと、実行時にクラスが見つかんないみたいに怒られた時は、とりあえずjarに固めて、akkaのdeployフォルダに置けば見つかるようになります。<br />
<pre class="brush: scala">package hello.world.Sample
import akka.actor.{ Actor, ActorSystem, Props }
import akka.kernel.Bootable
class HelloLauncher extends Bootable {
val port = System.getenv("AKKA_PORT")
val conf = ConfigFactory.parseString(s"""
akka.actor.provider = akka.remote.RemoteActorRefProvider
akka.remote.netty.tcp.hostname = 127.0.0.1
akka.remote.netty.tcp.port = ${port}
""".stripMargin).withFallback(ConfigFactory.load());
val system = ActorSystem("HelloSystem", conf)
def startup = {
system.actorOf(Props[Hello], "hello")
}
def shutdown = {
system.shutdown()
}
}
class Hello extends Actor {
def receive = {
case msg: String =>
println("Hello: msg = " + msg)
}
}
</pre>つぎに、Helloにメッセージを投げる側のサンプル<br />
<i><span style="color: #0b5394;">env AKKA_PORT=12345 akka hello.world.Sample.HelloLauncher</span></i><br />
<i><span style="color: #0b5394;">env AKKA_PORT=23456 akka hello.world.Sample.HelloLauncher</span></i><br />
のように、別コンソールで2つのmicrokernelを起動した前提で動作させる。<br />
<pre class="brush: scala">object HelloCaller {
import akka.actor.{ Actor, ActorSystem, Props }
def main(args: Array[String]) {
System.setProperty("akka.actor.provider", "akka.remote.RemoteActorRefProvider")
// このポートはリモート側でsenderにメッセージを戻す時に使用する
System.setProperty("akka.remote.netty.tcp.port", "10000")
val system = ActorSystem("CallerSystem")
val actor1 = system.actorSelection("akka.tcp://HelloSystem@127.0.0.1:12345/user/hello")
val actor2 = system.actorSelection("akka.tcp://HelloSystem@127.0.0.1:23456/user/hello")
actor1 ! "Hello,"
actor2 ! "Hello,"
Thread.sleep(1000)
actor1 ! "World."
actor2 ! "Another actor."
Thread.sleep(1000)
actor1 ! "Yeaaahhh!!!"
actor2 ! "Hooooooo!!!"
Thread.sleep(1000)
system.shutdown
}
}
</pre>なお、mainから呼ぶ側のlibraryDependenciesには、akka-kernel, akka-actor, akka-remote を追加しています。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0tag:blogger.com,1999:blog-1931289626680113698.post-67120024968597842722014-04-11T09:44:00.000+09:002014-04-11T09:44:59.122+09:00[sacla] akkaのmicrokernelに引数を渡すakkaのmicrokernelは、Actorを別プロセスで簡単にバンバン立てられるので、便利なんですけど、今のバージョン(akka 2.3.2)だと、引数を渡せないので困った。<br />
<br />
自分はlinuxのコマンドに不慣れで、解決法を忘れそうなのでメモ。<br />
<br />
まず、akkaのbinにパスが通っているとして、普通のmicrokernelの起動は<br />
<i><span style="color: #0b5394;">akka com.xxx.packageName.ClassName</span></i><br />
でやるんだけど、引数を渡したい時に、<br />
<i><span style="color: #0b5394;">akka com.xxx.packageName.ClassName arg1 arg2</span></i><br />
とかやっても、Bootableにargsを渡してくれない。(そういうインターフェースになっていない)<br />
なんでかというと、akkaコマンドが、複数のパラメータが<br />
<i><span style="color: #0b5394;">akka Class1 Class2 Class3</span></i><br />
なんてあったときに、3つのBootableを一気に立ち上げるというふうに使っているから(<a href="https://github.com/akka/akka/blob/master/akka-kernel/src/main/scala/akka/kernel/Main.scala" target="_blank">参照</a>)っぽい。<br />
<br />
で、解決としては、linuxのenvコマンド(<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20131226/527382/" target="_blank">環境を変更してプログラムを実行する</a>)を使用してmicrokernelを<br />
<i><span style="color: #0b5394;">env AHO=xxx BAKA=yyy akka com.xxx.packageName.ClassName</span></i><br />
のように起動し、Bootableの中で<br />
<pre class="brush: scala"> val aho = System.getenv("AHO")
val baka = System.getenv("BAKA")
</pre>
とやって引数を取得しました。waniwanihttp://www.blogger.com/profile/05390906685819696102noreply@blogger.com0