いさぽん.COM「つくる」に挑戦中

ゲーム系プログラマによる特に方針のないブログ。技術系とカレー、ラーメンネタ多めだったはずが、最近はダイエットネタ多め。

Poderosa で ssh 経由ではなく直接 WSL(windows subsystem for linux ) に入る

Windows Subsystem for Linux はめっちゃ便利なのですが、1点だけ気に食わない点が。


標準のターミナルウィンドウが使いにくい!


ターミナルのバッファはクリアできないし、フォントも自由が少ないし。


というわけで、Poderosaから使ってみたい!となるのですが、ubuntu内でsshを起動し、localhost へログインするというちょっともったいない感じ満載の方法しか見当たりませんでした。


が、WSLに入るためだけにsshdを起動するのもやっぱり気持ち悪いです。システムに無駄に穴をあけてしまうわけですから。


そこで、いろいろ試した結果、sshdに頼らない方法があったので紹介。というか自分メモ。


winpty をインストール

github.com

winpty-x.y.z-cygwin-x.y.z をダウンロードして適当に展開しておきます。


とりあえず c:\winpty\winpty.exe という感じに展開したとします。


poderosa からつなげる

「Cygwinへの接続」を開きます。あとは、「高度な設定」にチェックを入れてシェルに

/cygdrive/c/winpty/winpty.exe /cygdrive/c/windows/System32/bash.exe

と入力してOKを押せば無事ログインできます。

f:id:no-operand:20170722145228p:plain

C++ 同じ名前で別の構造体は宣言するべからず

実験をしていたらおかしなことになった

テンプレートの勉強というかあれこれ実験をしていたのだけど、突然意図しない動作をしだしたので原因と解決方法をメモ。 いや、気が付かないよ。こんなん。

症状

なぜかデストラクタが呼ばれない(デストラクタ以外も意図しない挙動をする)。

次のような簡単なプログラムを作ってみます。foo(new test()); とか書くとデストラクタを呼ぶだけの簡単なもの。 std::allocator::destroy() みたいなもんです。あくまでも実験なのでこのプログラムに対して意味はありません。

`` struct test { ~test() { std::cout << “~test()” << std::endl; } };

template struct foo { void destroy(T* p) { p->~T(); operator delete(_p); } };

// main() から呼ばれる実験プログラムを実行する関数 void experimental_2() { foo(new test()); }

main関数から experimental_2() を呼び出すので、コンソールに ~test() という文字が出るはずだが、なぜか出ない。clang++だと意図通りに ~test() という文字列が出る。

## 原因

リンクしている別のコードに test というクラスがあった。例えば以下のコード。空っぽの test という構造体です。

``
struct test
{
};

// main() から呼ばれる実験プログラムを実行する関数
void experimental_1()
{
}

msvcはリンク時に static や namespace {} (無名の名前空間) ではない構造体や関数で同一のものがあれば「中身は同じもののはずである」としてリンク時に関数を結合したりしてくれます。

そのおかげで、先の experimental_2() で最終的に呼び出されている test::~test() は exprtimental_1() の書かれているソースファイルに存在する省略された test::~test() が呼ばれているわけです。

解決方法

同じ名前の構造体やらクラスを作らない。いや、本来当たり前のことなんだけど。 もし特定のソースファイル内のローカルなものにするならしっかり無名の名前空間に閉じ込めるなりしましょう。

Android 開発で細々変更があったので自分用まとめ

文章をあれこれ書くより見たほうが早いので要点だけ。

app_dummy() が deperecated

android_main() から app_dummy() を呼び出していると

Calls to app_dummy are no longer necessary. See
https://github.com/android-ndk/ndk/issues/381.

と警告が出ます。

解決方法

Android.mk を使っているなら

LOCAL_EXPORT_LDFLAGS := -u ANativeActivity_onCreate

CMakeLists.txt を使っているなら

set(CMAKE_SHARED_LINKER_FLAGS
 "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")

もしくは

set_property(TARGET 共有ライブラリ名
APPEND_STRING PROPERTY LINK_FLAGS " -u ANativeActivity_onCreate")

を追加。前者のほうがプロジェクトごとに設定を変える必要がないので楽。

簡単な解説

リンク時に、呼び出されていない関数を削除する(strip機能)があるのだけど、それをごまかすために空の関数 app_dummy() というのを呼んでいました。 が、コンパイラ(というかリンカ)が頭がよくなって、誤魔化しがきかなくなったので、ANativeActivity_onCreate() という関数は消さないようにという指示をリンカに与えるようにしましょう。

という話。

${ANDROID_SDK}/android create project が無い

Android SDK の android create project が無くなった。IDEでプロジェクトを作成しろということらしい。 なんという改悪!自動化できないではないか!

というわけで自分でプロジェクトを生成する。

解決方法

gradle は Android Studio に入っているのでそれを使うか、Gradle 本家から持ってくる。 何か事故った時にAndroid Studioは入れておいたほうが良いかと思う⇒Android Studioはインストールしてある。という前提でAndroid Studio のものを使ってみます。

gradle を持ってくる

${ANDROID_STUDIO_HOME}\plugins\android\lib\templates\gradle\wrapper

gradle のバージョンを変更する

にgradle一式があるのでこれを自分のプロジェクトディレクトリにコピーします。 gradle/wrapper/gradle-wrapper.properties をテキストエディタで開きdistributionUrlの行のバージョン部分を変更します。 最新版を gradle の公式ページで確認しても良いのですが、ビルドすると「x.y以上にしてくれ」と言われるので、指示に合わせます。

distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

build.gradle を作る

あとは ${ANDROID_STUDIO_HOME}\plugins\android\lib\templates\gradle-project のテンプレートを適当にコピー……といきたいのですが、これだと面倒なのでテンプレートを用意しました。

https://www.axfc.net/u/3821523.zip

key=create

水槽ろ過装置とミョウガが育ちすぎる問題

すっかり更新を忘れていました。久々の更新。


もともとワサビを育ててみようと始めたうちのアクアリウム。


いや、その発想がいろいろおかしいのは気にしない方向でお願いしたいのですけどね(ちなみに、わさびは水温気温の問題で断念)。


とにかく、いろいろあってたどり着いた現在の成果を報告。誰かの参考になればと。


あれこれ書くより写真を見たほうが早いので現状をば。


f:id:no-operand:20170312091705j:plain

と間違えた、これは随分前に豆苗を植えた(というかろ過装置に載せておいた)時の写真でした。


いや~これ、美味しかった。採れたては味が濃ゆい!


豆苗ではうまくいったし!ということで、改めて現状。


f:id:no-operand:20170621065554j:plain

60cm水槽の上にオーバーフロースリム水槽(参考までにページ下のほうにAmazonのリンクを貼っておきます)を載せてます。


そのオーバーフロー水槽に適当に砂やら砂利が敷き詰まっており、ミョウガとシソの葉が育ち始めています。


ミョウガの葉が茂りすぎて、シソの葉に光が当たりにくいので定期的にミョウガの葉を伐採しています。


というか、もう少し前はもっとハーブが沢山多い茂っていたのですが、ミョウガの成長により光が当たらなくなり、枯れていきました……。


そんなわけで葉の伐採を始めたのですが、かろうじて持ちこたえたのはシソの葉(他何か忘れたけどいくつか)くらいです。


シソの葉もよく見ると写真中央左側と右側に二房ほど生えていますが、まだ光が当たりやすい右のほうが育ちが良いのがわかります。左は少し元気がない感じですね。


改めて光の大切さを実感。


あと、写真左下に積まれている……というか、水槽に投げ込まれた葉が伐採されたものです。ちなみにこれらの葉は魚の隠れ家になったり、エビの餌になったりします。


なんというか、魚やエビの糞が栄養となって植物が育ち、植物の葉でまた魚やエビが育ちと、すんごいエコロジー。多少はエサをあげてますけど。


育て方、植え方

ミョウガは苗を砂利の上に乗せただけ。植えてはいないです。ぽんと乗せただけです。


シソも100円均一で買ってきて、料理にゴマでも振りかけるかの如く、砂の上にパラパラとこぼしただけです。


すごーく雑な撒き方ですがニョキニョキ生えました(そしてミョウガに隠れて枯れました)。


水はあくまでも水槽のろ過装置なので特に自分で何かするわけではなく、常に循環しています。ただし、土台に空気を通すためにタイマーで定期的に水中ポンプをON/OFFしてろ過装置の水を切っています。


あとは水が減ってきたらカルキ抜きをした水を水槽に補充するだけです。水替え的なものは特にしていません


かなりお手軽手間いらずですが、こんなにもミョウガはご立派になりました(他の植物の成長を遮るほどに)。


もともと人類誕生以前は勝手に生えて育ってたわけなので、まぁそんなもんかもしれません。


装置説明

60cm水槽の上にこいつを載せてます。

ただし、そのまま使うと排水口が上のほうになってしまい、水が溜まってしまいます。かといって排水口にあるカバーを外すと砂が落ちるし……ということで使うのがこれ。

これを適当にハサミでカットして排水口にはめ込みます(大きさがぴったり!)

あとはテキトーに砂を敷き詰めて完成です。

京都&伊勢神宮旅行・1日目(前編)

明日で花のニート生活終了で、いよいよ月曜から新しい職場での仕事です。


個人事業主として、いわゆるフリーランスのプログラマーをやっているとこうしてプロジェクト単位で職場を変えることができるのは楽しいです。


もちろん不安もありますが。


さて、そんなわけでこの1か月はほんとダラダラしていたのですが、せっかくなので京都旅行&伊勢神宮参拝へ出かけてきました。


青春18きっぷで!


新幹線を使えば早いのですけどね、まぁ安い&青春18きっぷを使ったことが無かったのでいい機会かなと。


始発でGO

旅行当日は始発電車…のつもりが寝坊して7時の電車で出発しました。


ちなみにおひとり様旅行でござ~やす。


平日だということもあり、意外と人が居るな~という感じです。


上野から青春18きっぷでJR構内に入ります。使ったことは無かったので、本当にこれで入れるのかと心配でしたがいらぬ心配でした。


無駄にグリーン券を購入し、まずは東海道線、熱海行きに乗り込みます。


今回は京都で過去にご一緒に仕事をした任天堂さんの方と会う(仕事ではなくプライベートです)事の縁もあってなのか、偶然にも購入できたNintendoSwitchとゼルダの伝説で暇つぶし。


熱海で朝食!

と、そんなこんなしているうちに熱海に到着、朝ごはんを食べるべく途中下車。


こうして途中下車が出来るのは青春18きっぷの良いところですね。


f:id:no-operand:20170321092048j:plain

ひゃっほい!さぁ飯食うぜ!


と、意気込むが……お土産屋しか開いてないYO!!


どうやら食事処は早くても11:30くらいからしか空かないようで……


というわけで、お土産屋で売っていたシラス弁当を購入。だいぶ割高だけどしゃーないか……。まぁ電車の中で食べるのもいいかもね!


が、ここから興津 までボックス席がなく電車の中で食べる機会がありませんでした……グリーン車もないんだもん……


興津で浜松行きに乗り換えるのですが、この時待ち時間が14分ほどあったので、ここでそそくさと弁当を食べました。


美味しいけど、なんだか味わって食べることができず不完全燃焼気味です。


しらす好きなんだけどな~勿体ない。


そんなこんなで浜松に到着です。


浜松でお昼ご飯

丁度お昼頃に到着したので再び途中下車。


今度はしっかり昼飯を食うぞ!魚を食うぞ!


浜松といえば餃子もありなのですが、前回仕事で浜松に来た時に餃子を食べたので今回は魚なのです。


というわけで、寿司。


乗り換えの時間の都合もあるので、駅ビル内にあるお寿司屋さんでございます。


f:id:no-operand:20170321123647j:plain

んまいんまい。江戸前寿司と違ってネタが大きい(東京の寿司はネタが小さめで一口サイズのものを2つ出すのが一般的)。


やっぱ市場が近いので新鮮です。


さて、再び東海道線に乗り込みます。お次は豊橋駅で乗り換えです。


豊橋で途中下車

お~し味噌カツじゃ!!と行きたいところですが、乗り換えのタイミングと、まだ腹が減っていないので、駅から降りて外の空気を吸うだけです。


けど、やっぱ味噌カツ食べたい。


と欲望が勝り、コンビニで味噌かつ串を購入。


f:id:no-operand:20170321152338j:plain

乗り換えに間に合わないので速攻、もぐもぐタイム。


んむ!うまい!


さて、ここからは途中下車せずに京都まで行くぞ~


というわけで、だらだらと東海道線に揺られて行くのでした。


後編に続く。


劇場版SAOの感想~ナーブギアって作れるんじゃね?~

f:id:no-operand:20170219100030p:plain

※こちらは FOVE 0 というVRヘッドマウントディスプレイで会うことのできるアスナさん。決して、劇中で見せた横乳を思い出しながら見つめてはならない。

先月で仕事も終わり、絶賛NEETを満喫中です。が、ワーカーホリックなのですでに飽き始めてきました……。たぶんこのワーカーホリックが抜けて休暇を楽しめるころになったら仕事が入りそうな感じです。仕事が決まったら「働きたくないでござる」とでも言おうかと思います。


さて、今日は渋谷で「劇場版ソードアートオンライン」を観てきました(最近見ている映画が「君の名は」だったり「この世界の片隅に」だったりとアニメーションに偏り気味ですが、まぁたまにはアリでしょう)。


まずはネタバレしない程度の感想

ネタバレをする気はないのでご安心を。ツッコミどころについても結構たくさんありますが、そこについても触れないでおきます。でも一個だけあえてツッコませてください……いや、やめておこう……


感想1)テーマはAR(拡張現実)

再三書きますが、ネタバレしない程度に内容の方を紹介です。今回はAR(拡張現実)がテーマで、作中のARはヘッドセット(現実の視界に映像が現れるというやつで、ちょっと前だと Google Grass 最近だと Microsoft HoloLens Microsoft HoloLens | オフィシャル サイト あたりが近い)のゲームが流行しているというところから物語が始まります。
ちなみに、作品の中は2026年らしいくだいぶ小型化されています。また相当流行っているというか、もはや生活必需品に近いらしく今の時代でいうスマホポジションになりつつあるような印象です(主人公のキリト君は馴染めないらしくスマホを使っていましたが)。


周りにいた中高生は「アスナかわいい!」とか「キリト君かっこいい!」とか言うておりましたが(それは分かるけど)、作者は「ARって危険だよ」ということを伝えたかったのではないかと思います。実際、そのあたりを考えながら見ると結構ゾッとする内容でした。でもきっと、見た人の中にはしっかりとARの怖さが刻まれたのではないかと思います。そういう意味では個人的には良い作品だと思います。


感想2)VRとARについて作中での気になったひとこと

劇中ARの危険性についての会話あるのですが「VRは仮想世界を現実化するもの、ARは現実世界を仮想化するもの」というセリフがあります。もともとそういうモノなのですが、改めてこういうセリフを挟んでおくあたりはシッカリしているな~と思います。観るのは中高生くらいがメインの作品だと思うので、こういうフォローは大切だと、エンタメ業界人として再認識です。


余談ですが、ちなみにARを使うと交通事故などの危険性もあるわけですが、その辺りは作中ではすでにそうとう議論されつくしているらしくそこについては詳しく触れません(そこに上映時間を割いてもしゃーないでしょうし)。また、かなり冒頭にチラっとそんなシーンが出てきます。


ちなみにですが、ARを最初にまじめに研究しだしたのはGoogleだと思います。ですが、このGoogle Glass、アメリカで試験的に販売しましたが、いろいろな理由があって販売を停止しました。停止したひとつの理由として強い依存性による生活の危険性があるとも言われています。


www.theguardian.com

まぁ、この辺りはガジェットの依存性の恐怖というのがSAOシリーズの基本テーマだと思うので、今更ブログでアレコレ言うのもなんかなと思いますが。


感想3)アスナは絶対にサバを読んでいる

なんというか、アスナさん2児の母くらいの母性を出しています。20代中盤~後半じゃないのか?という安心感。絶対年齢詐称しているよね。


すみません、どうでもいい話を挟んで流れを変えたかっただけです……ほんますんません。別にキリト君カッコイイ!とか、クラインさん、出会いを求めるフレンドなんだね。でもなんとでもよかったんです。


作中のARヘッドセットのテクノロジーについて

今回出てくるARヘッドセットは眼鏡状ではなく、マイクのついたヘッドフォンのような形をしています。ですが、視界全体にコンピューターグラフィックスが見えるらしく、グラフィックを消すにはいったんデバイスのスイッチをOFFにしないとならないようです。


また、ゲーム内でダメージを受けると体がのけぞったりするあたり、かなり依存度も高いように見えます。まぁ現在のVRですらそうなりがちなところもありますが。


(そういう視点で見ると、おそらく直接脳波かなにかをジャックしているのか、脳へ映像を送り込んでいるのか、とにかく結構危ない代物な気がします。SOA事件の件もあったのに、オマエ達、よくこんな危なっかしいものつける気になったな!……と)


あれは実現できるのか?

脳に直接映像を送っているというのはあくまでも想像なので、実際(というか作中の設定上は)そうでないと思います。


かなり小型ですが、あの中に周囲の情報をスキャンするカメラ、GPU、CPU、ネットワークチップ、バッテリーが入っているとなるとかなりのテクノロジーが詰まっていますね。あと10年は未来の話ですし……そこまで出来るかもしれませんが、いや、無理かな……いやできそうかな?


一番の問題はバッテリーですが、おそらく非接触充電(無線式充電)が普及しているのではないかと推測し、そこはクリアしていると思いたい……


余談ですが、脳に直接映像を送るのは技術的にはバイオニックアイというものがあり、近いうちに臨床試験が開始されるようです。ただ、まだそれほど映像の解像度は高くないし、何より受信装置を脳に埋めこまないとならないようなので……普及は難しそうですね。


とまぁ、ARヘッドセットは結構いける気がしました。ぶっちゃけナーブギアよりも現実味を感じました。


そういう意味ではナーブギアのほうが未知のデバイス感満載でした。


ナーブギアによるダイブ

さて、未知のデバイスナーブギアです。


ナーブギアでダイブ(仮想世界に没入する)と体を動かすこともできず、完全にイメージの世界に入り込むようです。ナーブギアが脳を破壊する機能を持っていることなども考えるとナーブギアの機能としては脳に直接映像を送っているんじゃないかと思います。


実際に作れたとしても、これ、ハッキングされたりバグったゲームとかあったら、即廃人コースな気がして怖いですね……ゲーム開発中だとフリーズやらなんやら普通にあることなのでナーブギア向けのゲーム開発なんかあったら俺はゲームをリリースするまえに精神が崩壊しそうです……


なにより、臨床試験に通らなさそうだな~と。


ナーブギアって催眠(幻覚幻聴)なんじゃないか論

ちょっと前にPSVR用ソフト「サマーレッスン」の開発者がVRについてこんな事を言っておりました。


www.itmedia.co.jp

言っていることはなんとなく分かります。俺も最近FOVE0を買いましたが、視覚が完全に奪われるというのは生物の歴史上経験はなかったわけです。


なので、没入感というよりは「脳が錯覚する」という感じに近いです。どちらかというと、夢を見ているというか催眠にでもかかっているような感じなのではないかと思います。逆に言えば、催眠術の技術と映像を組み合わせると、脳にそうした錯覚を起こさせ、最終的には「映してもいない映像を見たように思わせる」と言うことも可能なんじゃないかと。そもそも夢だって目から何も映像は入っていないのに「まるで見たような気になっている」わけですからね。


つまり「SOAの世界にいるように錯覚させる/夢を見せる/暗示をかける」ということができれば、ナーブギアの完成なのかとも思います。


つまるところ究極のゲーム

もしかしたら究極のゲームは「面白いゲームと錯覚する音と映像」なのかもしれません。いや、もはやゲームでもないけど。


ちょっと真面目に催眠術でも勉強してみると面白いのかもしれないです。


こういうのが万人向けにうまく出来るようになると案外作れるのかも……?


ヒプノマルチレイプ

ヒプノマルチレイプ

  • アーティスト: エロトランス,沢野ぽぷら,夢野みかん,サイミー
  • 出版社/メーカー: エロトランス
  • 発売日: 2017/01/19
  • メディア: CD
  • この商品を含むブログを見る

ヒプノフィルター

ヒプノフィルター

  • アーティスト: エロトランス,そらまめ。,夢野みかん,サイミー
  • 出版社/メーカー: エロトランス
  • 発売日: 2016/10/14
  • メディア: CD
  • この商品を含むブログを見る

ちなみに、俺は催眠術の系統はかかりにくいタイプだそうなので、そういうコンテンツが出来ても楽しめなさそうです。ひねくれ者なのでしゃーないのですが、ちょっと勿体ない気もしますね。


VR ヘッドセット

俺の持っているFOVE 0 はあくまでも開発者向けのものなので、対応コンテンツはほとんどありません。


VRで遊ぶなら現状では Vive か Oculus になると思います。


c++11 std::move /ポインタのムーズでハマりそうなこと

C++11ネタです。俺の中ではC++といってもC++11以前と以降では別物として考えています。


Before C++11 と After C++11 、略してBC11とAC11。なんだか西暦っぽいです。でもそれくらいC++はC++11で変わりました。


と、そんなC++11ですが、C++11以降で結構肝になるのがムーブセマンティック。細かいことは一旦置いておくと、ムーブコンストラクタの扱いが肝になります。


んで、ムーブコンストラクタ(アサインなんかもあるけどとりあえず本題と関係ないのでそのあたりはおいといて)で疑問に思ったことがあったのでメモ書き。


その1)shared_ptrをムーブしてみよう

C++ではポインタは極力生で扱わないのがコツだと思います。


というわけで、多くの場合 std::shared_ptr を使うわけですが、C++11 のムーブを使うと以下のようになります。


std::shared_ptr<int>    p1  = std::make_shared<int>(1);
std::shared_ptr<int>    p2;

p2  = std::move(p1); // ここがムーブ

std::cout << "p1=" << p1.get() << ", p2=" << p2.get() << std::endl;

何をやっているかというと、p1に入れたポインタをムーブを使ってp2に移動し、p1とp2のポインタの値を表示しているだけです。


結果は

p1=0, p2=0x212e028

となり、p2へ移動したp1は、nullptr になります。想像通りの挙動ですね。


その2)生ポインタならどうだ!?

略して生ポ。なんだか生焼けな感じのする響きです。激しくどうでもよいうえに何も面白みもありません。なまぽ。


生のポインタなんて反復処理以外ではあんま使わないので、あまり気に留めていなかったのですが、テンプレートを駆使していた時にふと「あれ?これどういう仕様だっけ?」と気になったので調べてみました。


int     num = 1;
int*    p1  = てきとーな値
int*    p2;

p2  = std::move(p1);
std::cout << "p1=" << p1 << ", p2=" << p2 << std::endl;

先ほどの std::shared_ptr と基本的には同じです。こうするとどうなるかというと

p1=0x7fffef84b210, p2=0x7fffef84b210

という感じで、移動というよりはコピーになってしまいました。つまり、以下のようなコードを書くとよくない結果になります。


struct int_object
{
    int_object()
    {
        nama_pointer = new int;
    }

    int_object(my_pointer&& _s)
          : nama_pointer(std::move(_s.nama_pointer)) {}

    ~int_object()
    {
        if (nama_pointer) delete nama_pointer;
    }

    int* nama_pointer;
};

これでムーブをすると、一つのポインタに対してdeleteが2回呼ばれてしまうので当然予期せぬ挙動になります。


移動の定義について考える

たぶんどこかに詳しい仕様があるはずなのですが、見つけきれず(見落としたかも)で申し訳ないのですが。


移動はあくまでも「移動先へ値をコピーし、移動元は初期値にする」と覚えるとわかりやすいです。


それを疑似コードにするとこんな感じになります。


move(type& source, type& destinate)
{
    destinate = source;
    new (&source) type();
}

平たく言うと、値をコピーした後にデフォルトコンストラクタで初期化するということですね。


つまり、生のポインタのデフォルトコンストラクタは何もしません。nullptr で初期化もしません。なので、移動元のポインタは残ったままということになります。


そう思うと、簡単ですね。