tag:crieit.net,2005:https://crieit.net/users/TakeyukiUeda/feed Dr. Takeyuki Uedaの投稿 - Crieit CrieitでユーザーDr. Takeyuki Uedaによる最近の投稿 2019-07-02T18:46:39+09:00 https://crieit.net/users/TakeyukiUeda/feed tag:crieit.net,2005:PublicArticle/15070 2019-06-06T22:51:00+09:00 2019-07-02T18:46:39+09:00 https://crieit.net/posts/SPA-VuePress 既存の Vue アプリケーションに VuePress でユーザーズ・マニュアルを後付する <p>こちらの皆様の雰囲気と合っていないようなので <a target="_blank" rel="nofollow noopener" href="http://www.uedasoft.com/2019/06/30/既存の-vue-アプリケーションに-vuepress-でユーザーズ・マ/">こちら</a>に移動致しました</p> Dr. Takeyuki Ueda tag:crieit.net,2005:PublicArticle/15024 2019-05-25T13:19:11+09:00 2019-06-06T08:03:20+09:00 https://crieit.net/posts/POCO-static-link POCO を static に link する <h1 id="結論"><a href="#%E7%B5%90%E8%AB%96">結論</a></h1> <pre><code class="bash:">-Wl,--start-group -Wl,-Bstatic -lPocoFoundation -lPocoUtil -lPocoXML -lPocoJSON -lPocoNet -Wl,--end-group -Wl,-Bdynamic -lpthread </code></pre> <p>今世のリンカオプションには <code>--start-group, --end-group</code> なんて便利なものがあるんですね</p> <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p><a href="https://crieit.net/posts/C-Cerflet">Cerflet</a> ベースの WebApplication を deploy しようとして、POCO に依存してしまうのもアレだなと思い、だったら static に link してしまおうと思ったのが事の発端です</p> <h2 id="POCO の static library を make"><a href="#POCO+%E3%81%AE+static+library+%E3%82%92+make">POCO の static library を make</a></h2> <p>POCO の configure の <a target="_blank" rel="nofollow noopener" href="https://github.com/pocoproject/poco/blob/develop/configure#L117">--static</a> オプションを使って make します</p> <pre><code class="bash:">./configure --static make </code></pre> <p>はじめは shared library 作る時と同じで <code>make -j4</code> ってやってたんですけどリンクエラーがでるので、多分、static に link してるから順番とかが影響してるんだろうなと深く考えずに <code>make</code> にしたらでなくなりました<br /> こんな些細なところからすでにlink する時の嫌な事が始まってます ^^;;;</p> <h2 id="しっかりハマる"><a href="#%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E3%83%8F%E3%83%9E%E3%82%8B">しっかりハマる</a></h2> <p>マジメな C++ プログラマだった頃の辛い思い出が蘇ってきます...</p> <h3 id="pthread がない"><a href="#pthread+%E3%81%8C%E3%81%AA%E3%81%84">pthread がない</a></h3> <p>dynamic に link した時と同じ感覚で素朴に lPocoFoundation をリンクしようとしたのですが</p> <pre><code class="bash:">g++ -o hellocerflet_s HelloCerflet.cpp ../lib/httpcerflet.cpp -I../lib/ -L/usr/local/lib -lPocoFoundation -static Thread.cpp:(.text+0x1ec): undefined reference to `pthread_setspecific' Thread.cpp:(.text+0x228): undefined reference to `pthread_sigmask' Thread.cpp:(.text+0x30c): undefined reference to `pthread_mutex_lock' Thread.cpp:(.text+0x328): undefined reference to `pthread_cond_broadcast' Thread.cpp:(.text+0x338): undefined reference to `pthread_mutex_unlock' ... </code></pre> <p>-lpthread つけてやらないといけないんですね</p> <h3 id="Poco 自身の依存関係"><a href="#Poco+%E8%87%AA%E8%BA%AB%E3%81%AE%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82">Poco 自身の依存関係</a></h3> <p>で、-lpthread つけてあげたんですが</p> <pre><code class="bash:">g++ -o hellocerflet_s HelloCerflet.cpp ../lib/httpcerflet.cpp -I../lib/ -L/usr/local/lib -lPocoFoundation -static -lpthread httpcerflet.cpp:(.text+0x54): undefined reference to `Poco::Util::Application::loadConfiguration(int)' httpcerflet.cpp:(.text+0x64): undefined reference to `Poco::Util::Application::initialize(Poco::Util::Application&)' /tmp/ccZExLN3.o: In function `HttpCerflet::uninitialize()': httpcerflet.cpp:(.text+0x8c): undefined reference to `Poco::Util::Application::uninitialize()' ... </code></pre> <p>あ、static link だから lPocoFoundation が依存する Poco のライブラリも先にリンクしておいてあげないと...</p> <h3 id="link の順番"><a href="#link+%E3%81%AE%E9%A0%86%E7%95%AA">link の順番</a></h3> <p>で、undefined だって言われる Poco のライブラリをどんどん前に追加しているのに、まだ undefined が...</p> <pre><code class="bash:">g++ -o hellocerflet_s HelloCerflet.cpp ../lib/httpcerflet.cpp -I../lib/ -L/usr/local/lib -lPocoXML -lPocoJSON -lPocoUtil -lPocoNet -lPocoFoundation -static -lpthread ... JSONConfiguration.cpp:(.text+0x6a0): undefined reference to `Poco::JSON::Query::~Query()' ... XMLConfiguration.cpp:(.text+0x1cc): undefined reference to `Poco::XML::Document::documentElement() const' </code></pre> <p>ちゃんと -lPocoXML も -lPocoJSON も link してるのになんで undefined なんて言われるんだろ?<br /> このあたりでもう考えるのが嫌になって POCO static link とかでググるとそのものズバリなのが<br /> <a target="_blank" rel="nofollow noopener" href="https://kotaeta.com/55682155">定義されていないシンボルへのPoco C++ 静的リンクの問題</a></p> <p>そうだ、<strong>リンクの順番!使われる前にリンクしておかないといけない</strong>んでした</p> <h3 id="glibc の静的リンク"><a href="#glibc+%E3%81%AE%E9%9D%99%E7%9A%84%E3%83%AA%E3%83%B3%E3%82%AF">glibc の静的リンク</a></h3> <p>POCO内部の依存関係に合わせて正しい順番でリンクすると</p> <pre><code>g++ -o hellocerflet_s HelloCerflet.cpp ../lib/httpcerflet.cpp -I../lib/ -L/usr/local/lib -lPocoUtil -lPocoXML -lPocoJSON -lPocoNet -lPocoFoundation -static -lpthread /usr/local/lib/libPocoFoundation.a(Path.o): In function `Poco::PathImpl::homeImpl[abi:cxx11]()': Path.cpp:(.text+0x220): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking </code></pre> <p>glibc まで static にリンクしようとしてました ^^;;;</p> <h3 id="第一次正解"><a href="#%E7%AC%AC%E4%B8%80%E6%AC%A1%E6%AD%A3%E8%A7%A3">第一次正解</a></h3> <p>なので、pthread だけは dynamic に link するようにして</p> <pre><code class="bash">g++ -o hellocerflet_s HelloCerflet.cpp ../lib/httpcerflet.cpp -I../lib/ -L/usr/local/lib -Wl,-Bstatic -lPocoUtil -Wl,-Bstatic -lPocoXML -Wl,-Bstatic -lPocoJSON -Wl,-Bstatic -lPocoNet -Wl,-Bstatic -lPocoFoundation -Wl,-Bdynamic -lpthread </code></pre> <p>やっとできました</p> <h1 id="ちょっと考察"><a href="#%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E8%80%83%E5%AF%9F">ちょっと考察</a></h1> <p>しかし今どきリンクの順番みたいな機械的に解決できることに人間が頭を使わないといけないのってちょっと残念ですよね、人って機械的な作業が苦手なクリエイティブなクリーチャーなのに</p> <p>でも、さすがになにか進歩してるんじゃないかとおもって static link order とかでググりまくってると <a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc">Why does the order in which libraries are linked sometimes cause errors in GCC?</a><br /> やっぱり人類は賢かった!<strong>--start-group, --end-group</strong> なんてリンカのオプションをつくってくれた人がいて、この中だと順番気にしなくてもリンカがよしなにやってくれるんですね!</p> <p>で、本稿の結論にいたります</p> <h2 id="再度、結論"><a href="#%E5%86%8D%E5%BA%A6%E3%80%81%E7%B5%90%E8%AB%96">再度、結論</a></h2> <pre><code class="bash:">-Wl,--start-group -Wl,-Bstatic -lPocoFoundation -lPocoUtil -lPocoXML -lPocoJSON -lPocoNet -Wl,--end-group -Wl,-Bdynamic -lpthread </code></pre> <h1 id="感想"><a href="#%E6%84%9F%E6%83%B3">感想</a></h1> <p>まるで紅茶に浸した一匙のマドレーヌを口に含んだ時みたいに鮮明に記憶が戻ってきました<br /> 私は gcc のこういう所があんまり好きじゃなかったんでした</p> Dr. Takeyuki Ueda tag:crieit.net,2005:PublicArticle/15016 2019-05-23T19:07:05+09:00 2019-05-24T11:36:04+09:00 https://crieit.net/posts/vuepress-Navbar VuePress で Navbar のリンクが別タブで開かれないようにするためにデフォルト・テーマをちょっといじる <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>ウェブアプリのドキュメントを、これまで GitBook でつくっていたのですが VuePress に乗り換えようとしています<br /> <a target="_blank" rel="nofollow noopener" href="https://v1.vuepress.vuejs.org/guide/">Guide</a> にあるみたいに既存のアプリケーションに docs フォルダをつくってそこで作業をするようにするとアプリケーションのコードとドキュメントが一体で管理できて嬉しいです</p> <p>アプリケーションとドキュメントのナビゲーションに相互に行き来できるようリンクを用意します</p> <p>あれ?ドキュメントからアプリに<strong>素直に戻ってくれない</strong>で、わざわざ<strong>別タブでアプリを開き直してくれてる</strong>、これはちょっと...</p> <h1 id="試してみてダメだったこと"><a href="#%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%A6%E3%83%80%E3%83%A1%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">試してみてダメだったこと</a></h1> <p>Config Reference 見てたら <a target="_blank" rel="nofollow noopener" href="https://v1.vuepress.vuejs.org/config/#markdown-externallinks">markdown.externalLinks</a> って section があって、デフォルトは <strong>{ target: '_blank', rel: 'noopener noreferrer' }</strong> なんだそうです<br /> これが原因だなとおもって config.js で</p> <pre><code class="js:">markdown: { externalLinks: { } } </code></pre> <p>ってかんじに <strong>target: '_blank'</strong> その他諸々をまるまる消してみたのですがダメでした<br /> 名前の通り、これは markdown に対する設定みたい</p> <h1 id="default theme に手を入れる"><a href="#default+theme+%E3%81%AB%E6%89%8B%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B">default theme に手を入れる</a></h1> <p>Nav の link に対する設定はないかな?と思って Config Reference を穴が開くほど見るのですがめぼしいものがみつかりません<br /> ないのならテーマに手を入れて nav の link に target='_blank' つけるのを止めるしかなさそうです</p> <p><strong>昨日今日 vuepress を触りはじめたばかりのニワカ者</strong> にそんな事がかんたんに出来るものなのかという妥当な不安を感じますが、実はその心配は杞憂だったということをこの後の作業を通じて大観します</p> <h2 id="theme の eject"><a href="#theme+%E3%81%AE+eject">theme の eject</a></h2> <p>手を入れるために、まず以下のコマンドで default theme の定義ファイルを docs/theme の下に吐き出させます</p> <pre><code class="bash:">vuepress eject docs </code></pre> <p>なお、ゴチャゴチャやってるうちに <strong>vuepress なんてコマンドありません</strong> とか言われてしまうようなややこしい環境になってしまってたら、package.json に vuepress の build コマンドを追加したのと同じ要領で eject コマンドを追加しておいて</p> <pre><code> "scripts": { "docs:dev": "vuepress dev docs", "docs:build": "vuepress build docs", "docs:eject": "vuepress eject docs" }, </code></pre> <p><code>npm run docs:eject</code> で実行するのもいいかもしれません、環境をさっさと修復すべきなのかもしれませんが</p> <h2 id="NavLink.vue の変更"><a href="#NavLink.vue+%E3%81%AE%E5%A4%89%E6%9B%B4">NavLink.vue の変更</a></h2> <p>theme の下にできたファイルを見ていると <strong>NavLink.vue</strong> なんていうそれっぽい名前のファイルがあったので見てみると</p> <pre><code>template> class="nav-link" :to="link" v-if="!isExternal(link)" :exact="exact" ><span>{</span><span>{</span> item.text <span>}</span><span>}</span> v-else :href="link" class="nav-link external" :target="isMailto(link) || isTel(link)? null : '_blank'" :rel="isMailto(link) || isTel(link) ? null : 'noopener noreferrer'" > </code></pre> <p>みるからにコレですね ^^;</p> <p>手の入れ方は以下の3通りが考えられます</p> <ul> <li>:target を無条件に null にする</li> <li>:target を null にする条件に <strong>isExternal(link)</strong> を追加する</li> <li>:target を null にする条件に <strong>isAppTop(link)</strong> というのを新たにつくって追加し、アプリケーションに戻るパスだけ null にする</li> </ul> <p>このどれでもうまくいく(実際にうまくいきました、戻るリンクに target='_blank' はつかなくなりました)のですが、最初のはちょっと気がさしますよね<br /> 2番めのはまだマシかと思いきや、実は <strong>isExternal</strong> の定義って util/index.js にあって</p> <pre><code>export const outboundRE = /^(https?:|mailto:|tel:)/ export function isExternal (path) { return outboundRE.test(path) } </code></pre> <p>なので、2番めのロジックって実は最初のと全く同じになってしまうという ^^;;;</p> <p>3番めのロジックは NavLink.vue の methods に</p> <pre><code> isAppTop: function (path){ return /^https?:\/\/pokectiveness2.netlify.com\//.test(path) } </code></pre> <p>みたいに(直書きでカッコ悪いですが ^^;;;)チェックを追加して、前述の template に追加します</p> <pre><code> :target="isMailto(link) || isTel(link) || isAppTop(link) ? null : '_blank'" </code></pre> <h1 id="感想"><a href="#%E6%84%9F%E6%83%B3">感想</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://v1.vuepress.vuejs.org/guide/#why-not">なぜ GItBook じゃなくて VuePress なのか</a>にも <strong>'and the theming system is, again, not Vue based'</strong> ってありましたけど、最初に読んだときは「だからなんなんだ ^^;;;」って心でツッコミいれながら読んでたんですけども、実際に自分で体験してみると<strong>テーマの定義が Vue で読める</strong>のって<strong>予想以上に嬉しい</strong>ですね、ドキュメントとかなくてもコンポーネント見てると自然にわかってくる感じがとても気持ちいいです</p> <p>それはそうとなんで vuepress は外部へのリンクをタブで開かせたがるんだろ?</p> Dr. Takeyuki Ueda tag:crieit.net,2005:PublicArticle/14991 2019-05-17T15:25:09+09:00 2019-05-17T16:36:07+09:00 https://crieit.net/posts/cockroachdb-laravel-laravel-cockroachdb cockroachdb-laravel を使えば laravel で cockroachdb 使えるみたい <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>先先日、こちらの場をお借りして、稚拙な<strong>できませんでしたレポート</strong>に過ぎない <a href="https://crieit.net/posts/laravel-cockroachdb">laravel で cockroachdb を使おうとして惜しくも断念</a> を書かせていただいたのですが、だら様の日々の SEO の強化の御尽力おかげと思うのですが <strong>laravel</strong> と <strong>cockroachdb</strong> で QWANT で検索したら他の良記事を差し置いて僭越にも2番めにでてきてました、なんかちょっとうれしいです</p> <p><a href="https://crieit.now.sh/upload_images/2f92048d04f916d713e08a3ffb584c705cde5025686a6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2f92048d04f916d713e08a3ffb584c705cde5025686a6.png?mw=700" alt="スクリーンショット 2019-05-17 11.17.45.png" /></a></p> <p>ところで検索筆頭の <strong>cockroachdb-laravel</strong> ってどういうプロジェクトなんでしょう?</p> <h1 id="cockroachdb-laravel"><a href="#cockroachdb-laravel">cockroachdb-laravel</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/nbj/cockroachdb-laravel">cockroachdb-laravel</a> は、laravel で使うために必要な cockroachdb の定義をしてくれているみたいです(laravel の内部をよくしらないので、なんとなくコードを眺めててそんな印象をもった、という程度で、あまり自信ないです)<br /> つかってみると、ちゃんと migrate できて、larabel のユーザ認証がうごきだしました<br /> <a href="https://crieit.now.sh/upload_images/2e55a1a3dfd2162d22cc27d4529ea46b5cde51ed4b0f4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2e55a1a3dfd2162d22cc27d4529ea46b5cde51ed4b0f4.png?mw=700" alt="スクリーンショット 2019-05-17 14.51.50.png" /></a><br /> ちゃんと cockroachdb にユーザができてる!うれしい<br /> <a href="https://crieit.now.sh/upload_images/9db4ff525980acf49fd56dd59dba591b5cde522102695.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9db4ff525980acf49fd56dd59dba591b5cde522102695.png?mw=700" alt="スクリーンショット 2019-05-17 14.54.17.png" /></a></p> <p>うれしいので速攻で星をつけました ^^/</p> <h1 id="ちょっとした問題"><a href="#%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E3%81%97%E3%81%9F%E5%95%8F%E9%A1%8C">ちょっとした問題</a></h1> <p>こちらの <a target="_blank" rel="nofollow noopener" href="https://github.com/nbj/cockroachdb-laravel/issues/19">issue</a> にもあがってますが、migrate する時に "id なんてないよ" って言われて migrate が1回失敗する現象がありますが、シレっと再度 migrate すると普通に db ができます</p> <h1 id="その後"><a href="#%E3%81%9D%E3%81%AE%E5%BE%8C">その後</a></h1> <p>で、ログインしようとすると「そんなクレデンシャルないよ」とログインできない現象が私の所では出ていて、cockroachdb の Metrics みてるとそもそも query も来てないので、そもそも誰が原因なのか(laravel なのか、cockroachdb なのか、はたまた私の環境構築の問題なのか)今の所、ちょっとわからないです</p> Dr. Takeyuki Ueda tag:crieit.net,2005:PublicArticle/14988 2019-05-15T22:09:28+09:00 2019-05-17T09:48:16+09:00 https://crieit.net/posts/laravel-cockroachdb laravel で cockroachdb を使おうとして惜しくも断念 <h1 id="要約"><a href="#%E8%A6%81%E7%B4%84">要約</a></h1> <p>laravel でなにか作った後の DB の面倒を見るのがめんどくさいです。なので<a target="_blank" rel="nofollow noopener" href="https://www.cockroachlabs.com/">cockroachdb</a> みたいに手のかからない DB が使えれば嬉しいです<br /> postgress 互換なので postgress 用の laravel 設定を流用して使えないかなとおもってためしてみたのですが、結論からいうと <a target="_blank" rel="nofollow noopener" href="https://github.com/cockroachdb/cockroach/issues/32098">この issue</a> が解決されないと、laravel で cockroachdb つかうの無理っぽいです</p> <h1 id="cockroachdb を使うための準備"><a href="#cockroachdb+%E3%82%92%E4%BD%BF%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E6%BA%96%E5%82%99">cockroachdb を使うための準備</a></h1> <p>laravel の database.php の pgsql の connections を見るとパスワード認証にしか対応していないので、証明書でログインするように変更します</p> <h2 id="laravel のコードの変更"><a href="#laravel+%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%A4%89%E6%9B%B4">laravel のコードの変更</a></h2> <pre><code class="php:">/* 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'schema' => 'public', 'sslmode' => 'prefer', ], */ // refer https://gist.github.com/tigusigalpa/2d1ec6e258ed96221abf9679622d274a 'pgsql' => [ 'driver' => 'pgsql', # 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '26257'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), # 'password' =&gt; env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'schema' => 'public', 'sslmode' => 'require', 'sslrootcert' => env('DB_SSLROOTCERT', ''), 'sslcert' => env('DB_SSLCERT', ''), 'sslkey' => env('DB_SSLKEY', ''), ], </code></pre> <p>ついでに port も cockroachdb のデフォルトの <strong>26257</strong> に変更しておきます<br /> <strong>sslmode</strong> は <strong>require</strong> に変更して、あと <strong>sslrootcert, sslcert, sslkey</strong> を <strong>.env</strong> から読めるように追加しました</p> <h2 id="cockroachdb 側の対応"><a href="#cockroachdb+%E5%81%B4%E3%81%AE%E5%AF%BE%E5%BF%9C">cockroachdb 側の対応</a></h2> <p>laravel で使うための db をつくって、laravel で使うユーザに全権を Grant しておきます</p> <h2 id="migrate してみる"><a href="#migrate+%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">migrate してみる</a></h2> <p>migrate してみると、cockroach にクエリーがきてます o(´∀`)o</p> <p><a href="https://crieit.now.sh/upload_images/cdac409405dbcc3afe4d21abca16ba085cdc0c351ba08.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cdac409405dbcc3afe4d21abca16ba085cdc0c351ba08.png?mw=700" alt="スクリーンショット 2019-05-15 21.54.17.png" /></a></p> <p>なんだ、簡単だったな、とおもったらぬか喜びでした<br /> created_at, pdated_at あたりがエラーになってます</p> <pre><code class="bash:">php artisan migrate Migrating: 2014_10_12_000000_create_users_table Illuminate\Database\QueryException : SQLSTATE[0A000]: Feature not supported: 7 ERROR: syntax error: unimplemented: unimplemented at or near "zone" DETAIL: source SQL: create table "users" ("id" bigserial primary key not null, "name" varchar(255) not null, "email" varchar(255) not null, "email_verified_at" timestamp(0) without time zone null, "password" varchar(255) not null, "remember_token" varchar(100) null, "created_at" timestamp(0) without time zone null, "updated_at" timestamp(0) without time zone null) ^ HINT: See: https://github.com/cockroachdb/cockroach/issues/32098 (SQL: create table "users" ("id" bigserial primary key not null, "name" varchar(255) not null, "email" varchar(255) not null, "email_verified_at" timestamp(0) without time zone null, "password" varchar(255) not null, "remember_token" varchar(100) null, "created_at" timestamp(0) without time zone null, "updated_at" timestamp(0) without time zone null)) </code></pre> <p>なんか親切な <strong>HINT</strong> がでてるので見てみると、ようは cockroachdb が <strong>timestamp の精度指定</strong> にまだ対応してないのが原因みたいです<br /> この<a target="_blank" rel="nofollow noopener" href="https://github.com/cockroachdb/cockroach/issues/32098">issue</a> はそもそも symfony で使おうとしてあがってきたみたいですけど、symfony でダメなら当然、laravel でもだめですね orz</p> <h1 id="結論"><a href="#%E7%B5%90%E8%AB%96">結論</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/cockroachdb/cockroach/issues/32098">issue</a> が fix されるまでもう少し待とうかなと</p> Dr. Takeyuki Ueda tag:crieit.net,2005:PublicArticle/14980 2019-05-12T15:32:39+09:00 2019-05-12T17:29:25+09:00 https://crieit.net/posts/cockroachdb cockroachdb のクラスタを作ろうとしてジタバタした記録 <h1 id="Insecure な clustering にさえハマる"><a href="#Insecure+%E3%81%AA+clustering+%E3%81%AB%E3%81%95%E3%81%88%E3%83%8F%E3%83%9E%E3%82%8B">Insecure な clustering にさえハマる</a></h1> <p>host1 で cockroach が無事に起動する事を確認して、host2 でも確認、問題なさそう<br /> で、host2 の node2 を host1 の node1 のクラスタに join させようとするのだけど、無視してしれっと別のクラスタをつくって stand alone で起動してくださる</p> <p>全然、理由がわからない、<a target="_blank" rel="nofollow noopener" href="https://www.cockroachlabs.com/docs/stable/troubleshooting-overview.html">Trouble Shooting</a>を漁っても、ググってもわからない、なんで他のみんなはこんな目にあってないんだろ?<br /> 半泣きで <a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/56086595/cant-add-node-to-the-cockroachde-cluster">SO</a>に助けを求めたら、速攻で「<strong>node2のcockroach-data消しとかないとダメだよ</strong>」と教えてもらう、Marc さんありがとう、私は人の世の優しさで生かされている!</p> <h1 id="Secure な clustering には当然ハマりそう"><a href="#Secure+%E3%81%AA+clustering+%E3%81%AB%E3%81%AF%E5%BD%93%E7%84%B6%E3%83%8F%E3%83%9E%E3%82%8A%E3%81%9D%E3%81%86">Secure な clustering には当然ハマりそう</a></h1> <p>Insecure な clustering でさえハマってググりまくるという希有な経験をさせていただいておりました私は、その過程で皆様が Secure な cluster を作ろうとしてハマりまくってるのをすでに知っていたので、ビビリながら try</p> <p><strong>Deploy</strong> の <strong>Manual Deployment</strong> の <a target="_blank" rel="nofollow noopener" href="https://www.cockroachlabs.com/docs/stable/deploy-cockroachdb-on-premises.html"><strong>On-Premises</strong></a>を何度も(普通なら1度で十分なんでしょうけど^^;;;)読んで、だんだんと分かってくる</p> <ol> <li>deploy する対象は <strong>certs</strong> folder であって、my-safe-directory は deploy しないでどこかにかくしておく、ここには ca.key ができる</li> <li>前述の ca.key を使って certs 配下に証明書をいくつかつくるのだけど <ul> <li>クラスタ全体で同じものを使う: ca.crt, client.root.crt</li> <li>node ごとに別のものを使う: node.crt</li> </ul></li> </ol> <p>ということをドキュメントの<strong>行間から読み取る</strong>のが物凄く難しかったですが、これがわかればハマりポイントはなさそう...</p> <h2 id="なのにハマる"><a href="#%E3%81%AA%E3%81%AE%E3%81%AB%E3%83%8F%E3%83%9E%E3%82%8B">なのにハマる</a></h2> <p>node1 は起動するのに node2 が join しないどころかリトライを繰り返して起動さえもしない<br /> log (cockroach-data/logs/cockroach.log) をみると(クラスタ作り直した時に消しちゃったので記憶で書いてますが)host 1 の IP アドレスと host2 のIPアドレスが「対象が違う」というようなエラーメッセージ</p> <p>実は、host1 に node2 用の証明書を間違えておいてたというおマヌなのが原因だったんですが、それにしても node1 はシレっと起動して、node2 の起動がエラーになるあたり、cockroachdb 恐るべし</p> <h1 id="番外編:admin UI にログインできない"><a href="#%E7%95%AA%E5%A4%96%E7%B7%A8%EF%BC%9Aadmin+UI+%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84">番外編:admin UI にログインできない</a></h1> <p>admin UI にログインするためのカウントを作る SQL がドキュメントとか、admin UI のページにでてるんですが、これをコピーして sql client にペーストすると<strong>パスワードの前後のシングルクオートが化けて</strong>アカウントつくってくれるのでログインできません ^^;;;<br /> これも原因に気づくまでずいぶん時間かかったんですけど全く<strong>知育玩具</strong>かと思うぐらい昨日今日で頭がよくなってきた気がする o(´∀`)o</p> <h1 id="感想"><a href="#%E6%84%9F%E6%83%B3">感想</a></h1> <p>名前から<strong>ゴキブリ</strong>なみの<strong>しぶとさ</strong>を期待してたんですけど<strong>絶滅危惧種</strong>育ててるのかと思うほど大変だったですが...</p> <p>てか、立ち上がっちゃえば核戦争後まで生き延びるほどしぶといクラスタだと期待しつつ次号につづく</p> Dr. Takeyuki Ueda tag:crieit.net,2005:PublicArticle/14976 2019-05-10T15:09:22+09:00 2019-05-10T18:12:57+09:00 https://crieit.net/posts/Google-Books-Ngram-Viewer Google Books Ngram Viewer で世界の中の日本を知る <p><a href="https://crieit.now.sh/upload_images/9b03b67efa48dae7a06233d8929245375cd50fc96ccff.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9b03b67efa48dae7a06233d8929245375cd50fc96ccff.png?mw=700" alt="スクリーンショット 2019-05-10 14.41.42.png" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://books.google.com/ngrams">Google Books Ngram Viewer</a> はその時のコーパスのなかにどれぐらいその言葉が含まれているかを時系列にグラフにしてくれるサービスです<br /> 古い言葉が使われなくなっていくのとか、新しい言葉が広まっていくのがグラフでよくみえておもしろいです、悪名高い言葉とかが意外と最近の言葉だったりしてビックリします</p> <p>英語の辞書にも出てるような <strong>busi, shogun, geisha,kamikaze, ninja, sushi</strong> とかでみてみるとこんな感じで、その時代に日本がどういうふうに記載されてたのかが見えて面白いです</p> <ul> <li><strong>bushi</strong> って 1840年ぐらいに孤立した山があるんですけど、ちょうど<strong>外国船打ち払い令</strong> とかやってた頃で<strong>あぶねー奴らがいるぞ</strong>ってニュースにでもなってたんでしょうか</li> <li><strong>shogun</strong> って 1870年ぐらいから、まさに<strong>慶喜が退位した後</strong> になってでてくるんですよね。いなくなってからのほうがコンテンツになるもんなんですね</li> <li>geisha とか bushi とかがでてくるのは明治になってからの 1880年ぐらいからなんだけどなんでだろ?</li> <li><strong>kamikaze</strong> って 1944年に始まったんだとおもってたんですけど言葉としては 1940年からコーパスに出始めてるんですよね、作戦情報が漏れてた?</li> <li><strong>ninja</strong> って60年代半ば過ぎぐらいに急にでてくるんですね、何がきっかけだったんだ?その時代だと少年忍者藤丸とか?</li> <li><strong>sushi</strong> って80年代のバブリーな頃に<strong>ゴンベルツ曲線</strong>的にポピュラーになってるんですね、案外、欧米進出した日本企業の置き土産だったりして</li> </ul> <p>Google Books Ngram Viewer は英語の他にロシア語、フランス語、スペイン語、中国語など多数の言語に対応してるみたいですけど例によって日本語はありません、そもそも日本語の本のコーパスってあるんでしょうか?</p> Dr. Takeyuki Ueda tag:crieit.net,2005:PublicArticle/14937 2019-04-20T12:08:57+09:00 2019-07-02T19:43:14+09:00 https://crieit.net/posts/C-Cerflet C++ ベースのウェブアプリケーションサーバ Cerflet のご紹介 <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/MayaPosch/Cerflet">Cerflet</a> は <a target="_blank" rel="nofollow noopener" href="https://github.com/MayaPosch">Maya Posch</a> さん作の C++ ベースのシンプルな Web Application server です<br /> Raspberry Pi でもサクサクに動いています</p> <p>python の tornado みたいにリクエストハンドラを書くだけで簡単に使える上に、<strong>オール C++</strong> かつ<strong>オンメモリ</strong>なので超高速が期待できます</p> <p>ちなみに Cerf はジビエ好きな方はピンと来るかと存じますが多分、フランス語の <strong>鹿(セール)</strong> なんじゃないかなと想像してます、Maya さんの他のプロダクトも動物の名前のが多いし、彼女の会社の名前からして <a target="_blank" rel="nofollow noopener" href="http://www.nyanko.ws">Nyanko</a> だし</p> <h1 id="実装"><a href="#%E5%AE%9F%E8%A3%85">実装</a></h1> <p>本体の<a target="_blank" rel="nofollow noopener" href="https://github.com/MayaPosch/Cerflet/blob/master/lib/httpcerflet.cpp">実装</a>は物凄くシンプルでコメント込で 80行ぐらいしかないです、すごい<br /> 私だったら C++ の80行ってコマンドライン処理するだけでもゆうに超えちゃったりします</p> <p>サーバの処理も実行時オプションの処理も <a target="_blank" rel="nofollow noopener" href="https://pocoproject.org/">POCO</a> の機能が有効に使われてて、POCO の凄さと、POCOを使えば Web Application でさえこんなにシンプルにつくれるという Maya さんのソフトウェア・アーキテクチャのセンスの良さに敬服いたしますとともに、Poco.Net のプラグマティックなチュートリアルとして大変ありがたく読ませていただきました次第でございます</p> <h1 id="How to try it"><a href="#How+to+try+it">How to try it</a></h1> <ol> <li>POCO を<a target="_blank" rel="nofollow noopener" href="https://pocoproject.org/download.html">インストール</a></li> <li>git clone https://github.com/MayaPosch/Cerflet.git</li> <li>cd Cerflet/sample</li> <li>make</li> <li>./hellocerflet</li> </ol> <p>「libPocoNet.so.60 がないよ」とかエラーになるようでしたら <a href="https://crieit.net/posts/POCO-error-while-loading-shared-libraries-libPocoNet-so-60-cannot-open-shared-object-file-No-such-file-or-directory">ldconfigして</a>みてください</p> <p>で、hellocerflet を起動したサーバの port 8080 番をブラウザで開くと</p> <p><a href="https://crieit.now.sh/upload_images/7cc81f710697ae3e872d25b283d8f9535cba83edb5f74.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7cc81f710697ae3e872d25b283d8f9535cba83edb5f74.png?mw=700" alt="スクリーンショット 2019-04-20 11.27.15.png" /></a></p> <p><strong>ビックリするほど簡単</strong>です</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/MayaPosch/Cerflet/blob/master/sample/HelloCerflet.cpp#L22">こちら</a> の HTTPRequestHandler の中身を変えて、たとえば ContentType を "text/html" じゃなくて <strong>"application/json"</strong> にして、<a target="_blank" rel="nofollow noopener" href="https://github.com/MayaPosch/Cerflet/blob/master/sample/HelloCerflet.cpp#L32">ostr</a> に <strong>json 文字列</strong>を返したら超高速かつコンパクトな API サーバーとしてすぐにでも大活躍しそうです</p> <h1 id="作者の御紹介"><a href="#%E4%BD%9C%E8%80%85%E3%81%AE%E5%BE%A1%E7%B4%B9%E4%BB%8B">作者の御紹介</a></h1> <p>作者の <a target="_blank" rel="nofollow noopener" href="https://github.com/MayaPosch">Maya Posch</a> さんですが、<a target="_blank" rel="nofollow noopener" href="http://www.mayaposch.com/autobiography.php">御本人のブログ</a>によると生まれつきに抱えるいくつかの問題、特に<strong>両性具有</strong>に起因する問題(当時のニュース番組が<a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=M4N-0CgUCX8">これ</a> とか <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=DKW2c0H2iGw">これ</a> とか残ってます)で祖国オランダを離れざるを得ず、安住の地を求めて世界を旅しながら自分の会社 <a target="_blank" rel="nofollow noopener" href="http://www.nyanko.ws/">Nyanko</a> を運営しつつプログラミングと電子工作に関する<a target="_blank" rel="nofollow noopener" href="http://www.mayaposch.com/index.php">数々のプロダクトと著作</a>を世に出していらっしゃいます<br /> まるで物語みたいに数奇な人生を歩みながら outcomes を出されていることに正直圧倒されてしまいました、すごい人がいるもんなんだなぁ<br /> 翻って自分を鑑みるにいったい何をやってるんだと情けなく忸怩たる思いに至る次第です</p> <p>近著 <a target="_blank" rel="nofollow noopener" href="https://learning.oreilly.com/library/view/hands-on-embedded-programming/9781788629300/">Hands-On Embedded Programming with C++17</a> を魅力的なタイトルに惹かれて読んだのが彼女を知るきっかけだったんですが、この本も POCO の紹介をふくめて Raspberry Pi みたいなSBC でプロダクトをつくる上でのオリジナルな話題にあふれていてとても面白い本でした</p> <h1 id="感想"><a href="#%E6%84%9F%E6%83%B3">感想</a></h1> <p>数日前に<a href="https://crieit.net/posts/Nuitka-python-code">某所</a>で「C++でウェブアプリ書く気にはならないし」なんて言っちゃったの、謹んで取り消させてください</p> <p>読書は時として人の世界観をダイナミックに変えてしまうものなのです ^^;;;;;;;</p> Dr. Takeyuki Ueda tag:crieit.net,2005:PublicArticle/14935 2019-04-20T09:56:19+09:00 2019-07-02T19:30:15+09:00 https://crieit.net/posts/POCO-error-while-loading-shared-libraries-libPocoNet-so-60-cannot-open-shared-object-file-No-such-file-or-directory POCO を使おうとして error while loading shared libraries: libPocoNet.so.60: cannot open shared object file: No such file or directory みたいに「ないよ」って言われる時 <p>こちらの皆様の雰囲気と合っていないようなので<a target="_blank" rel="nofollow noopener" href="http://www.uedasoft.com/2019/07/02/poco-を使おうとして-error-while-loading-shared-libraries-libpoconet-so-60-cannot-open-shared-object-file-no-such-file-or-directory-み/">こちら</a>に移動致しました</p> Dr. Takeyuki Ueda tag:crieit.net,2005:PublicArticle/14925 2019-04-15T19:50:32+09:00 2019-04-19T10:09:42+09:00 https://crieit.net/posts/Nuitka-python-code Nuitka はあなたの python code の変数名、関数名、クラス名その他を見えなくしてくれるのか? <h1 id="背景"><a href="#%E8%83%8C%E6%99%AF">背景</a></h1> <p><a target="_blank" rel="nofollow noopener" href="http://bitboost.com/python-obfuscator/articles_and_resources/does_nuitka_remove_names_of_variables_functions_classes_etc/">Does Nuitka Remove Or Obscure Names of Variables, Functions, Classes, Etc. From Your Python Code?</a> という記事を<strong>たまたま</strong>見つけて(というのをブログで見かけるとたいがい「ウソつけ!」ですよね ^^; かくいう私も嘘ついてて、本当は nuitka と decompile で検索してたらトップがこれだった)記事は「全部残ってるよ」という内容だったので、気になったので試してみました</p> <p>Python の obfuscator って free のが見つからなくて(obfuscator-llvm みたいな OSS がある分だけ C++ っていいですね、ってC++ で Web アプリ書く気にはならないのですが ^^;;;)、で、別に obfuscate しなくても binary で strip してあれば実質、ほとんどのマリシャスな人は手ださないんじゃないかなと思い、ところで nuitka でコンパイルした binary ってどれぐらい元コードの情報残ってるもんなんだろ?と思ってググってたら冒頭のショッキングな記事が...</p> <p>よくみるとこの記事、やっぱり高い obfuscator の<a target="_blank" rel="nofollow noopener" href="http://bitboost.com">ベンダーさん</a>が書いてるみたいですね</p> <h1 id="結論"><a href="#%E7%B5%90%E8%AB%96">結論</a></h1> <p>記事に反して全然残ってないみたいに思えるのですが、自信ないのでこちらに晒しておこうと思いました次第です<br /> マサカリ大歓迎です、というかそれが欲しくて晒してます</p> <h1 id="実験"><a href="#%E5%AE%9F%E9%A8%93">実験</a></h1> <h2 id="version of Nuitka"><a href="#version+of+Nuitka">version of Nuitka</a></h2> <pre><code class="python:">pip list Nuitka (0.6.3) </code></pre> <h2 id="素のコード"><a href="#%E7%B4%A0%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89">素のコード</a></h2> <p>たまたま書いてた(嘘、本当は obfuscate したいと思ってる)Tornado のアプリケーションです<br /> <strong>protocol</strong> とか <strong>port</strong> とか文字列たくさん含んでます<br /> <strong>Screen_WebHander</strong> とかクラス名もありますね</p> <pre><code class="python:">#-*- coding:utf-8 -*- # Copy Right Takeyuki UEDA © 2019 - All rights reserved. import tornado.ioloop import tornado.web from tornado.options import define, options import ssl import os import sys import pprint import importlib import screen if __name__ == "__main__": # options define("protocol", default="wss:", help="ws: or wss:(default)") define("port", default=8888, help="listening port", type=int) define("data_dir", default="", help="cert file path for running with ssl") define("cert_file", default="cert.pem", help="cert file name for running with ssl") define("privkey_file", default="privkey.pem", help="privkey file name for running with ssl") define("config_file", default="", help="config file path") define("static_path", default="./", help="[mandatory] handler class name of rhizome") options.parse_command_line() ''' The priority of Option file 1. options.config_file 2. ./config.py ''' if os.path.exists('./config.py'): options.parse_config_file('./config.py', final=False) if options.config_file: options.parse_config_file(options.config_file, final=False) ''' command line is the first priority ''' options.parse_command_line() # app BASE_DIR = os.path.dirname(__file__) app_params = {} app_params["handler"] = [("/", screen.Screen_WebHander), ("/screen_connection/(.*)",screen.Screen_WSHandler), ("/remote_connection/(.*)",screen.Remote_WSHandler), ("/remote/(.*)", screen.Remote_WebHander) ] app_params["static_path"] = os.path.join(BASE_DIR, options.static_path) app = tornado.web.Application( app_params["handler"], template_path = ".", static_path = app_params["static_path"], ) if options.protocol == "ws:": http_server = tornado.httpserver.HTTPServer(app) else: ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) data_dir = options.data_dir ssl_ctx.load_cert_chain(os.path.join(data_dir, options.cert_file), os.path.join(data_dir, options.privkey_file)) http_server = tornado.httpserver.HTTPServer(app, ssl_options=ssl_ctx) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start() </code></pre> <h2 id="コンパイル"><a href="#%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB">コンパイル</a></h2> <p>こんな感じでコンパイルしました</p> <pre><code class="bash:">python -m nuitka --follow-imports ソースファイル名 </code></pre> <p>.bin ファイルができます</p> <h2 id="なかを見る"><a href="#%E3%81%AA%E3%81%8B%E3%82%92%E8%A6%8B%E3%82%8B">なかを見る</a></h2> <p>nm してみると</p> <pre><code class="bash">nm homeserver.bin nm: homeserver.bin: no symbols </code></pre> <p>ちゃんと strip してあるみたいですので、-D をつけてみると</p> <pre><code class="bash:">nm -D homeserver.bin U abort 005b5be0 B __bss_end__ 005b5be0 B _bss_end__ 005a2218 B __bss_start 005a2218 B __bss_start__ U __ctype_b_loc U dirname 005a2218 D _edata 005b5be0 B _end 005b5be0 B __end__ 005369f4 T _fini U getenv w __gmon_start__ 00013b90 T _init w _ITM_deregisterTMCloneTable w _ITM_registerTMCloneTable w _Jv_RegisterClasses U __libc_start_main U mbstowcs U memcpy U memset U printf U _PyArg_NoKeywords U PyArg_ParseTuple U PyArg_ParseTupleAndKeywords U PyArg_UnpackTuple 0054be88 D _Py_ascii_whitespace 005a3690 B PyBaseObject_Type 005a3d98 B PyBaseString_Type ... </code></pre> <p>Python の構文用の文字列は残ってるみたいですけど前述の <strong>protocol</strong> や <strong>port</strong> 、<strong>Screen_WebHander</strong> とかいった文字列はみつかりません</p> <p>他に objdump -xT も試してみるのですがやっぱりみつかりません<br /> 念のために od -A -tx1z でダンプしてみたのですが、やっぱりなにもみつかりません</p> <h1 id="考察"><a href="#%E8%80%83%E5%AF%9F">考察</a></h1> <p>試したかんじだと元記事の内容に反して「残ってなくて削除してくれてる」ようなのですが...<br /> 使ってる nuitka のバージョンが違うのかな?</p> <h1 id="Threats to validity"><a href="#Threats+to+validity">Threats to validity</a></h1> <p>ぜんぜんわかりません ヽ(^o^)丿 ← お手上げ<br /> なんか「そこ、おかしいよ」みたいなご指摘でも「それでいいんだよ」っていうご指摘でもどちらでもかまわないのでご意見いただけたら大歓迎です<br /> つうか、全然 threat to validity になってないな...</p> <h1 id="References"><a href="#References">References</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://bitboost.com/python-obfuscator/articles_and_resources/does_nuitka_remove_names_of_variables_functions_classes_etc/">Does Nuitka Remove Or Obscure Names of Variables, Functions, Classes, Etc. From Your Python Code?</a> 元記事です</li> <li><a target="_blank" rel="nofollow noopener" href="http://nuitka.net">Nuitka</a> Nuitka のサイトです</li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/obfuscator-llvm/obfuscator/wiki">obfuscator-llvm</a>のサイトです</li> <li>obfuscator-llvm の<a target="_blank" rel="nofollow noopener" href="https://crypto.junod.info/spro15.pdf">作りました論文</a> の<a target="_blank" rel="nofollow noopener" href="https://qiita.com/UedaTakeyuki/items/4dd32bee474433af4b6e">解説記事</a>、そもそも obfuscation って何?って人に興味もってもらえるように丁寧に書いたつもりだったんですけど...</li> </ul> Dr. Takeyuki Ueda tag:crieit.net,2005:PublicArticle/14706 2019-01-01T12:19:04+09:00 2019-01-31T19:34:08+09:00 https://crieit.net/posts/bd4a69907b8d816f7194b9d7d85bbf01 今の時代、日本語で書いた記事でも意外に海外から読んでもらえるものなので、ぼくらはもっと自信をもって日本語で書いてもいいのかも <h1 id="ご挨拶"><a href="#%E3%81%94%E6%8C%A8%E6%8B%B6">ご挨拶</a></h1> <p>あけましておめでとうございます、2019年、来年はついに C++20 がやってくるのかと思うとワクワクしてきますね</p> <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>日本語で書いたQiita の記事にコメントで質問を英語で頂くことがこれまでに2回ありまして、質問をいただいているので単なる通りすがりのおちゃらかしではなくて記事に興味を持ってくださって、どうにかして読んでくださって、なおかつ疑問に残ったことを英語で質問してくださったんだろうなと思うとちょっと胸熱でウルウルしてました</p> <p>私のささやかな声でも、世界に届くことがあるんだな<br /> この喜びと勇気を諸兄諸姉にも届けたい、と思ったことが本稿を寄稿いたしましたモチベーションでございます</p> <p>ところで、日本語で書いた記事って実際に <strong><em>どれ位海外で読まれる</em></strong> ものなのでしょうか?<br /> 千人に1人の 0.1% ぐらい、というのは希望的すぎるので万人に1人の 0.01% ぐらいでしょうか?</p> <h1 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h1> <p>Qiita はありがたいことに <strong>アナリティクス</strong>の設置ができますので、それで自分の記事がどれぐらい日本以外で参照してもらえているものなのか調べてみようと思います</p> <p>期間は2018年の 9月3日から 2019年1月1日(今日ですね、あけましておめでとうございます)までの <strong><em>約4ヶ月間</em></strong>、これまで Qiita に上梓させていただきました <strong><em>75本</em></strong> の記事が対称です</p> <h1 id="Resarch Question"><a href="#Resarch+Question">Resarch Question</a></h1> <p><strong><em>RQ1: 日本語の記事がグローバルに参照される比率はどれぐらいなのか</em></strong></p> <h1 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h1> <p>ぱっとみてビックリしました<br /> <a href="https://crieit.now.sh/upload_images/cdbfed285b69bc1435182ae638b285295c2acd4f62c22.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cdbfed285b69bc1435182ae638b285295c2acd4f62c22.png?mw=700" alt="スクリーンショット 2019-01-01 10.15.07.png" /></a></p> <p>コメントの内容から北米とヨーロッパは予想してたのですが、南米、アジア、オセアニア、ロシアと余すところなく、西アフリカと中央アジア意外ほぼ全域でよんでもらえてるなんてもう感動ものです</p> <p>中央アフリカでもタンザニアとケニアといった近年急速に産業が発達してるとちょっとまえに BBCで紹介されてた国で読んでいただけてて、もしも私の記事がそういうことに少しでも貢献できていたとしたらそれにまさる喜びはありません</p> <p>イエメンとか40人も読んでくださった方がいらっしゃいまして、もし私の記事がなにかの役に経つことがあれば僥倖の至りです</p> <p>チュニジア(行こうとしてた年にジャスミン革命がおきてしまって行きそこなった悲しい思い出が)やモロッコみたいないつかは行きたいマグレブ諸国でも読んでくださってる方がいらっしゃるんだとおもうともうなんというか感動です</p> <p>世界の皆様、あんな記事をわざわざ読んでいただきまして本当にありがとうございますだ</p> <p>都市で見てみるとこんなかんじで<br /> <a href="https://crieit.now.sh/upload_images/031d1dc447240626afad380c3671e4635c2ad1f20d405.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/031d1dc447240626afad380c3671e4635c2ad1f20d405.png?mw=700" alt="スクリーンショット 2019-01-01 10.05.11.png" /></a><br /> 私は赤貧生活をしているのが影響してか「100円でつくれる〜」みたいなボンビくさい記事が多いのですがなぜ港区みたいなリッチな所の方々にうけているのかが謎です ^^;;;</p> <p>で、70位になんとパリがはいってるんですよ、gilets jaunes の皆様が頑張っていらっしゃるあのパリで、しかも 57% って凄い低い直帰率<br /> <a href="https://crieit.now.sh/upload_images/656bee7d8b8bbc93976e058969957ca65c2ad91ba9de2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/656bee7d8b8bbc93976e058969957ca65c2ad91ba9de2.png?mw=700" alt="スクリーンショット 2019-01-01 10.07.51 のコピー 2.png" /></a></p> <p>76位のサナアはさきほど少しふれたイエメンの街です。こちらも直帰率たったの 50%、読んでくださってありがたいです</p> <p>そして<br /> <a href="https://crieit.now.sh/upload_images/81f9089dc342acde9bb56f257fd883bf5c2ad37028fdb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/81f9089dc342acde9bb56f257fd883bf5c2ad37028fdb.png?mw=700" alt="スクリーンショット 2019-01-01 10.08.31 のコピー.png" /></a><br /> 87位にオスロが、94位にサン・ペテルブルグが、95位にロンドンが、福島や甲府の方々よりも読んでくださってます</p> <p>さらに大都市だけでなく<br /> <a href="https://crieit.now.sh/upload_images/9526c8d5b2536140e78a2ab7da8602a55c2ad6c10a30d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9526c8d5b2536140e78a2ab7da8602a55c2ad6c10a30d.png?mw=700" alt="スクリーンショット 2019-01-01 10.12.47 のコピー.png" /></a></p> <p>Huddersfield って知らなかったのですがマンチェスターの近くの人口16万人ほどの街で、Randburg はヨハネスブルグ北西部の人口33万人ほどの街なんだそうです</p> <p>世界の街で、こんなに読んでくださっている方がいらっしゃるんですね<br /> <a href="https://crieit.now.sh/upload_images/5602adcf68f6c3aae1960c134b630c155c2ad70af0176.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5602adcf68f6c3aae1960c134b630c155c2ad70af0176.png?mw=700" alt="スクリーンショット 2019-01-01 10.15.25.png" /></a></p> <p>なんて感慨に浸ってないで(感動は研究の最強のモチベーションであるとはおもうのですが)、前述の RQ の検証にもどりますと</p> <p><a href="https://crieit.now.sh/upload_images/ff9dbccb3349c6b3570070cc66784d9a5c2ad773ba784.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ff9dbccb3349c6b3570070cc66784d9a5c2ad773ba784.png?mw=700" alt="スクリーンショット 2019-01-01 10.04.57.png" /></a></p> <p>日本からの参照が 95.46%、なので <strong><em>海外からの参照は 4.54%</em></strong> ですね、<strong><em>桁違いに多い、マジで有意な数の参照が海外から</em></strong> だったんですね</p> <p>ところで日本国内にも日本語話者でない IT エンジニアの方がたくさんいらっしゃいますし、海外で働いている日本語話者の IT エンジニアの方もたくさんいらっしゃいます<br /> 日本語話者ではないと思われる方がどれ位参照してくださっているものなのかというと</p> <p><a href="https://crieit.now.sh/upload_images/6a8b48483644a747f1e25fd632c41a6d5c2ad7924ad6b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6a8b48483644a747f1e25fd632c41a6d5c2ad7924ad6b.png?mw=700" alt="スクリーンショット 2019-01-01 10.03.57.png" /></a></p> <p>ええと、だいたい <strong><em>7.01%</em></strong> ぐらい?<br /> これ、凄くないですか?日本語で書いてるのに</p> <h1 id="考察"><a href="#%E8%80%83%E5%AF%9F">考察</a></h1> <p>機械翻訳が進んだ昨今、何語で書いてあるかは問題じゃなくなってきてるということなのでしょうか?</p> <h1 id="結論"><a href="#%E7%B5%90%E8%AB%96">結論</a></h1> <p>日本語で書いた記事ってみんなが信じてる以上に実際は世界に届いているみたいですよ</p> <p>ご立派な方々から <strong><em>日本語での情報発信はグローバルな価値はゼロだよ</em></strong> なんてよく腐されておりました <strong><em>グローバル言語弱者</em></strong> の私といたしましては、日本語で書いた記事でも実に <strong><em>読者の 4.5% は海外の、7%は日本語ユーザーでない人</em></strong> だったという事実は、 <strong><em>少なくとも「価値はゼロ」なんてことは決してない</em></strong> みたいです</p> <h1 id="related works"><a href="#related+works">related works</a></h1> <p>本稿は某所に上梓させていただきました<a target="_blank" rel="nofollow noopener" href="https://qiita.com/UedaTakeyuki/items/cce2a414eab9487e1249">これ</a>を revise して、新年の希望にみちあふれる内容にしようと思ったんですけどイマイチうまくできませんでした<br /> どうも本当にすみません、希望ってむずかしい</p> Dr. Takeyuki Ueda tag:crieit.net,2005:PublicArticle/14692 2018-12-25T20:37:26+09:00 2019-06-01T10:16:37+09:00 https://crieit.net/posts/Pok-ctiveness 妻のために作ったアプリ「Pokéctiveness」がいかに「技術を使っていないか」を語るですだよ <h1 id="解決しようとした課題"><a href="#%E8%A7%A3%E6%B1%BA%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E8%AA%B2%E9%A1%8C">解決しようとした課題</a></h1> <p>妻がこんな本を買ってきたので大変ビックリしました<br /> <a href="https://crieit.now.sh/upload_images/b75208cf0540a087d37401cb6a4e374d5c1ef6106f39d.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b75208cf0540a087d37401cb6a4e374d5c1ef6106f39d.jpg?mw=700" alt="ポケモンファン.jpg" /></a></p> <p>付録のコレがほしかったのだそうです<br /> <a href="https://crieit.now.sh/upload_images/d1e1ee275415af447a4f4343ada5f02c5c1ef65ca789a.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d1e1ee275415af447a4f4343ada5f02c5c1ef65ca789a.jpg?mw=700" alt="ツール.jpg" /></a></p> <p>バトル相手のタイプを選択すると、有効な技のタイプが赤側の窓に、無効な技のタイプが白側の窓に表示されるます<br /> 某巨大掲示板の鬼女板の P-GO スレで高く評価されていた大変なスグレモノなのだそうです</p> <p>こういうポケモンのタイプに対する技のタイプの相性は、専門家の間では「タイプ相性」と呼ばれていて<br /> <a target="_blank" rel="nofollow noopener" href="https://yakkun.com/data/aisyou.htm">こういうの</a> とか<a target="_blank" rel="nofollow noopener" href="https://www.pokemon.co.jp/ex/sun_moon/fight/161215_01.html">こういうの</a>とかいろいろ公開されているのですが、これからバトルが始まるという緊迫した時間にスマフォの小さな画面で検索するのに適したものとはちょっと言い難いというか、そもそもモバイルファーストでさえないし</p> <p>というわけで前述の、小学生の頃に九九の暗記するのに使ったみたいな素朴なツールが大変実践的に有効との評価を世間で得ているようでございます</p> <p>一緒にバトルにいくと妻は喜んでクルクル回して「そうかー、鋼には火が良かったんだー」とか言ってますが、流石にいい大人がこんなの持ってるのが恥ずかしいのか周りの目を気にしてます<br /> 不憫に思った私は、恥ずかしい物を持ち歩かないですむようなスマフォアプリを速攻で作ってあげようと思ったのでありました</p> <h1 id="つくったもの"><a href="#%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">つくったもの</a></h1> <h2 id="Pokéctiveness のご紹介"><a href="#Pok%C3%A9ctiveness+%E3%81%AE%E3%81%94%E7%B4%B9%E4%BB%8B">Pokéctiveness のご紹介</a></h2> <p>というわけで、こういうアプリをつくりました、アプリ名はオサレに <strong><em>Pokéctiveness</em></strong> にしました<br /> <a href="https://crieit.now.sh/upload_images/8fa9268264a9a92060c03f1e8a077e785c1f118e527d6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8fa9268264a9a92060c03f1e8a077e785c1f118e527d6.png?mw=700" alt="2018-12-12 10.22.10.png" /></a></p> <p>タイプの選択はこんなかんじ<br /> <a href="https://crieit.now.sh/upload_images/b77988da157e19da8e3fce09801ba01a5c1f11e4af465.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b77988da157e19da8e3fce09801ba01a5c1f11e4af465.png?mw=700" alt="2018-12-12 10.21.57.png" /></a></p> <p><strong><em><a target="_blank" rel="nofollow noopener" href="https://pokectiveness.firebaseapp.com/">こちら</a></em></strong> に<strong><em>公開してます</em></strong> のでよかったらおちかくのポケヲタの方にご紹介していただければ至福の至りにございます</p> <p>海外タマゴが欲しかった<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>頃につくりまくった海外の friend にもつかってもらおうと思って i18n もやってますので、海外のポケヲタの friend にもご紹介いただければ大変ありがたいです</p> <p><a href="https://crieit.now.sh/upload_images/16e4ecd7abc34b67bce320fb7d935df85c1f1441a08a4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/16e4ecd7abc34b67bce320fb7d935df85c1f1441a08a4.png?mw=700" alt="2018-12-12 20.05.37.png" /></a><br /> <a href="https://crieit.now.sh/upload_images/2bd2899098ff056fadcf0f79cd3237545c1f144fe4284.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2bd2899098ff056fadcf0f79cd3237545c1f144fe4284.png?mw=700" alt="2018-12-12 20.05.46.png" /></a></p> <h2 id="開発エフォートその他"><a href="#%E9%96%8B%E7%99%BA%E3%82%A8%E3%83%95%E3%82%A9%E3%83%BC%E3%83%88%E3%81%9D%E3%81%AE%E4%BB%96">開発エフォートその他</a></h2> <p>何作る時でも開発記録をつけるようにしてるんですけど</p> <pre><code>2018.12.09 stat development. 2018.12.10 basic feature completed. 2018.12.11 Add color. 2018.12.12 Internationalization. </code></pre> <p>9日の夜からつくりはじめて 11日に妻に公開、当初白黒でつくってたんですけど「色ないと寂しい」というリクエストをもらってその場で対応</p> <p>開発量は <a target="_blank" rel="nofollow noopener" href="https://qiita.com/UedaTakeyuki/items/c025b334fe18a391c421">cloc-git</a> で見るとこんなかんじです、小学生のプログラミング教室なみに小さいですね ^^;;;;</p> <pre><code> 7 text files. 7 unique files. 4 files ignored. [https://github.com/AlDanial/cloc](https://github.com/AlDanial/cloc) v 1.66 T=0.04 s (98.3 files/s, 9388.5 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- JavaScript 1 7 13 207 HTML 2 19 10 116 JSON 1 0 0 10 ------------------------------------------------------------------------------- SUM: 4 26 23 333 ------------------------------------------------------------------------------- </code></pre> <p>333 はゾロ目で縁起がいいですね、来年もよい年でありますように</p> <h1 id="使ったり使わなかったりした技術"><a href="#%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%8A%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%8A%E3%81%97%E3%81%9F%E6%8A%80%E8%A1%93">使ったり使わなかったりした技術</a></h1> <h2 id="Pokéctiveness は Web アプリです"><a href="#Pok%C3%A9ctiveness+%E3%81%AF+Web+%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A7%E3%81%99">Pokéctiveness は Web アプリです</a></h2> <p>技術は課題解決の手段なので、その選択は解決しようとする課題に依存します。オサレないい言い方するとアーキテクチャ・デザインはプロブレム・ドメインに依存するというか</p> <p>で、今回は不憫な妻に<strong><em>さっさと使わせてあげたかった</em></strong>ので、審査に何週間も必要な<strong><em>ネィティブアプリ</em></strong>を選択することはそもそも不適切と判断して <strong><em>Web アプリ</em></strong> としてサクっとつくりました、というかそもそもネイティブアプリはめんどくさいので、可能なかぎり Web アプリを選択する傾向はございます</p> <p>Web アプリなので起動時にリソースの読み込みで 0. 何秒か間があるのですが、そもそも本家の P-GO の起動がものすごく遅いので気にせずつかってもらえているようです</p> <h2 id="Web アプリでもネイティブアプリみたいにホーム画面に登録できます"><a href="#Web+%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A7%E3%82%82%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%81%BF%E3%81%9F%E3%81%84%E3%81%AB%E3%83%9B%E3%83%BC%E3%83%A0%E7%94%BB%E9%9D%A2%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99">Web アプリでもネイティブアプリみたいにホーム画面に登録できます</a></h2> <p>掲題のとおりですので、いちいち Safari を開いてブックマークから選択して、なんて手間はございませんのでご安心ください</p> <p>以外としられていないみたいなのでクリスマスを記念してご紹介しておきますと、Safari で開いて画面下部真ん中の、四角に上矢印がついてるアイコン(意味不明ですよねこんなの)をクリックすると</p> <p><a href="https://crieit.now.sh/upload_images/cec4b8b76dd0b915a691b2f17fd883eb5c203a337fc2a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cec4b8b76dd0b915a691b2f17fd883eb5c203a337fc2a.png?mw=700" alt="2018-12-12 08.44.10.png" /></a></p> <p>こんな感じのモーダルダイアログがでてきて、そこに「ホームに追加」ボタンがあるので押すと</p> <p><a href="https://crieit.now.sh/upload_images/8cfb6302129a1f4b67f89e4d0f1e74bb5c203a488ff7d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8cfb6302129a1f4b67f89e4d0f1e74bb5c203a488ff7d.png?mw=700" alt="2018-12-12 08.44.29.png" /></a></p> <p>こんなふうに「ホームに追加」モーダルダイアログがでてきて<br /> <a href="https://crieit.now.sh/upload_images/611e8b9f6333120141b84c23eb541c5c5c203a544280d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/611e8b9f6333120141b84c23eb541c5c5c203a544280d.png?mw=700" alt="2018-12-12 08.45.33.png" /></a></p> <p>こんなかんじに「ホームに追加」できます<br /> <a href="https://crieit.now.sh/upload_images/34ef4b504525722bd7167ffb66b012f55c203a63b31cf.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/34ef4b504525722bd7167ffb66b012f55c203a63b31cf.png?mw=700" alt="2018-12-12 08.46.10.png" /></a></p> <p>まったく関係ないですが、この壁紙はインスタで拾った仏頭で寝てるトラの写真で、なんかトラが知的でかつなんとなく寂しげで、まるで寒山と拾得の話しの豊干禅師に師事したトラが「最近、来ないな〜」って自分なんかを指導してくれた禅師を懐かしんで寂しがってるみたいな雰囲気が気に入ったので使ってます</p> <p>閑話休題、ホーム画面のアイコンはそのままだとアプリ画面のスナップショットになってしまってちょっとカッコ悪いですので、下記のようにファビコンをつけるのと同じ要領で</p> <pre><code><link rel="icon" href="favicon.ico"/> </code></pre> <p><strong><em>apple-touch=icon</em></strong> という画像を用意しておくと、それをアイコンにしてくれて少しオサレです</p> <pre><code> <link rel="apple-touch-icon" href="favicon.ico"/> </code></pre> <h2 id="フォントをオサレに"><a href="#%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%82%92%E3%82%AA%E3%82%B5%E3%83%AC%E3%81%AB">フォントをオサレに</a></h2> <p>こういう小学生のプログラミング教室どころか、営業職から開発職への強制配置転換社内教育なみにショボいアプリの場合、見た目がカッコわるいすぎると誰からもつかってもらえません<br /> 中身のないソフトは中身のない人間と同じで見た目が命です<br /> 恥しくて人前にだせないような UI だと使ってもらうチャンスは限りなくゼロに近づきます</p> <p>フォントにこだわると比較的、エフォートレスに見た目をオサレにすることができます<br /> 私はおフランスのカフェの黒板のメニューの文字みたいにクルクルしたフレンチ・スクリプトが好きで<br /> google font で <strong><em>Parisienne</em></strong> とか使うとメニューがオサレになります</p> <pre><code><link href="https://fonts.googleapis.com/css?family=Parisienne" rel="stylesheet"> </code></pre> <h1 id="future works"><a href="#future+works">future works</a></h1> <p>相手のポケモンが何タイプなのかよくわからない奴がいるんですよね、ナッシーとかなんなんだろう?それをワンタッチで検索できるようにしてほしいとのことなのですが、どういう UI がいいのか難しいです<br /> 名前を文字列で入力させるのは最低なので、なんかいい方法ないか考え中です</p> <p>アイデアマンの諸兄諸姉の素晴らしい名案がございましたら、コメント欄にでもお知恵をいただければ大変ありがたい次第でございます</p> <h2 id="2019.06.01 追記"><a href="#2019.06.01+%E8%BF%BD%E8%A8%98">2019.06.01 追記</a></h2> <p>銀行の振込先選択みたいに、名前の先頭位置文字を入れる形式にして、ついでに material design light やめて Vuetify にして <a target="_blank" rel="nofollow noopener" href="https://pokectiveness2.netlify.com/">pokectiveness2</a> にメガ進化しました</p> <p><img src="https://pokectiveness2.netlify.com/docs/pics/2019-05-24%2018.29.47.png" alt="" /></p> <p><img src="https://pokectiveness2.netlify.com/docs/pics/2019-05-24%2016.34.10.png" alt="" /></p> <p><img src="https://pokectiveness2.netlify.com/docs/pics/2019-05-24%2016.36.03.png" alt="" /></p> <div class="footnotes" role="doc-endnotes"> <hr /> <ol> <li id="fn:1" role="doc-endnote"> <p>friend と交換したポケモンの距離に応じたメダルが貰えるので海外の friend を twitter で募集するのがちょっと前に流行った <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> </ol> </div> Dr. Takeyuki Ueda