milk_spoonのブログ

さじの情報科学的活動、考えたこと、その他を雑記するためのブログです。

作業メモ:msys2インストール、エクスプローラーから起動

動機:git (for Windows)を使うときに、cmdからはいいかげん操作し辛いと感じた。Git bash でOK、と気づいたときにはすでにmsys2を入れていたので、将来的に色々使うことを考えて自然に使えるようになるまでセットアップ。

基本は以下を参考に、64bit版をインストール、起動、パッケージシステムpacmanのupdateなどを行った。

MSYS2で快適なターミナル生活 - Qiita

ただし2017年3月現在上記の記述と変わっているところも少しある

mingw64_shell.bat, mingw32_shell.batは廃止

minGWへのPATHが通った状態でmsys2を起動する用の個別のバッチファイル廃止、代わりにmsys2_shell.cmdにオプション-mingw32または-mingw64を使うことになった。
これらのbat, cmdの起動ファイルはパッケージfilesystemで提供されている(いた)。

> msys2_shell.cmd -mingw32
> msys2_shell.cmd -mingw64
pacmanの更新はupdate-core不要

MSYS2における正しいパッケージの更新方法 - Qiita
更新がなくなるまで以下のコマンドでupdate

$ pacman -Syuu

エクスプローラーのアドレスバーからmsys2を起動

普段はエクスプローラーでファイルを見ながら必要なときにアドレスバーからcmdを起動して使う。cdが面倒くさいのかもしれない…
そんなノリでmsys2を素早く起動したい。
要件を以下の3つとして、実現する方法を見つけた。

やり方

1. msys2のインストールフォルダにPATHを通す
2.インストールフォルダのmsys2.iniを開くと以下のようになっているので

#MSYS=winsymlinks:nativestrict
#MSYS=error_start:mingw64/bin/qtcreator.exe|-debug|<process-id>
#CHERE_INVOKING=1
#MSYS2_PATH_TYPE=inherit
MSYSTEM=MSYS

CHERE_INVOKING=1, MSYS2_PATH_TYPE=inheritの行のコメントアウトを外す

#MSYS=winsymlinks:nativestrict
#MSYS=error_start:mingw64/bin/qtcreator.exe|-debug|<process-id>
CHERE_INVOKING=1
MSYS2_PATH_TYPE=inherit
MSYSTEM=MSYS

3.エクスプローラーでアドレスバーに"msys2"と入力すると、要件通りの動作でmsys2が起動する

説明

msys2のランチャーはmsys2_shell.cmd以外にも複数の形式で提供されている。
Launchers · msys2/msys2 Wiki · GitHub
右クリックから開くためのレジストリ設定等もある。
この中で、msys2-launcherパッケージで提供されているexe形式を使用する。
ちなみに特にpacmanで改めてインストールしなくてもmsys2インストール完了時点で既に入っていた。

このmsys2-launcherパッケージのランチャーexeは起動するときに設定として.iniファイルを読み込む。
msys2.exeが読み込むmsys2.ini内のオプションの中で、カレントディレクトリを引き継ぐCHERE_INVOKING=1、PATHを引き継ぐMSYS2_PATH_TYPE=inheritを有効にすると、msys2が要件を満たすように起動する。
エクスプローラーのアドレスバーへの入力については、正確な仕様は知らないが概ねcmd上でのコマンド実行と同様なので、msys2.exe(インストールディレクトリ)へのPATHを通せばmsys2(.exe)の入力だけで起動できる。
今回はデフォルトのmsys2.exeを使用したが、minGWへのPATHを通すランチャーのmingw32.exe, mingw64.exeも同様。
iniファイルもそれぞれ分かれていてmingw32.ini, mingw64.iniとなっているので注意。

その他

最終的には簡単なことだったけど、msys2_shell.cmdだけしかランチャーを知らない時はショートカットを作ってPATH通して起動しようとしてたり(なんでそんな遠回りをしたのか…)
でもmsys2_shell.cmdをrenameするのはパッケージのupdateとかで整合性がとれなくなるのイヤなのでこれが一番簡単かも…?

追記(2017/08/20更新)

結局msys2からWindows版Gitを触った時にコミットメッセージを入力時にWindowsgvimがうまく起動しないとか、細かいところで整合性がとれなさそうなのでMSYS2_PATH_TYPE=inheritはやめてしまった。
それ以外は概ね快適。

Cookie Clickerの今を知るためにプレイしてみた&ブックマークレットでGolden Cookie通知

現状報告

f:id:milk_spoon:20151017130858p:plain

この通り。

少し前、すごいブームが巻き起こったブラウザゲー"Cookie Clicker"。
今では「とっくに日本ではブームが終わったことを作者はつゆ知らず、今でも『日本の人喜んでくれるかな~』とアップデートが続けられている…」というウワサがまことしやかに伝えられるのみとなっています。
しかし、何故か最近また再燃してきた人がチラチラいるなーという様子でしたので、そのウワサのアップグレードを体感するためにも再度プレイしてみました。
ちなみに以前のブーム時もプレイしていて、Antimatter Condenser買ったぐらいでなんとなく満足してやめてたような気がします。

で、一通りやって気付いたんですが色々ダンジョンとか追加されてるのってbeta版みたいですね…
ずっと正式版ver.1.0466をやってました!なので以下はその内容となります。
それでもブーム時より季節イベント(通常プレイでも切り替え化)、新施設とかの追加もあるので結構変わってるところがあります!
で、そのあたりを紹介しようかなーと思ったんですが、自分でプレイした時の楽しみにしたい方がいると思うので最後にしておきます。

それより私のような久しぶりプレイヤー向けにちょっと問題が。
Wikiにも掲載されているプレイ補助ブックマークレットであるCookie Monsterですが、現行バージョンでは動かない…みたいです。
Stats内で表示されるLuckyで最大数を獲得するためのクッキー数やHeavenly Chips数といった統計量は見れますが、GUIに干渉するものやGolden Cookieに関係するものは非常に不調です。新バージョンで既存機能のナカミも色々変わったみたいですね。
特にGolden Cookieが出現したら音が鳴る機能を使いたかったのでとても困りました。なので、自分でその機能だけささっとブックマークレットで作ったり、↑のような以前のバージョンのブックマークレットがなんで動かなくなったのか調べてみました。

Game.GoldenCookie.delayはもういない!

Golden Cookie関連のチートを調べるとよく出てくるのがGame.GoldenCookie.spawn()です。
これを呼ぶとすぐさまGolden Cookieが現れます…が、チートをしたことを示す隠し実績がついてしまいます。
次によく見るのがGame.GoldenCookie.delay。これを0にすると、Golden Cookieが出た直後に次のGolden Cookieがすぐさま出現するそう…です。
なんか煮え切らない書き方なのは、実はこの変数もうないみたいだからです。

f:id:milk_spoon:20151017132816p:plain

あら。

多分昔はこのdelayで出現頻度を管理していて、Cookie Monsterでもこれを利用して次のGolden Cookieまでの時間とか出してたんでしょうが、色々変わっちゃったみたいですね。
変わりに色々探してて見つけたのがGame.GoldenCookie.time/minTime/maxTimeです。

f:id:milk_spoon:20151017133321p:plain

観察していたところ、timeは毎フレームごとに増加し、minTime<time<maxTimeの時に確率でGolden Cookieが出現するようになってるみたいです。Golden Cookieが出現するとtimeは0になります。
delayを書き換えられて即時スポーンするチートの対策ですかね…?
ちなみにminTime・maxTimeは固定値で、最初minTime=9000, maxTime=27000です。
Golden Cookieの出現間隔が半分・出現時間が倍になるUpgradeがあるんですが、これを買うと上記の値が両方半分になります。
↑はそれを2回買った状態ですね。

Golden Cookieお知らせブックマークレット GoldenCookieBeacon

このように色々変わっていますが、別に私はチートをしたいわけではなく、ただちょっとGolden Cookie出るのがいつかなーって待ってる時間を進捗に当てたい、そういう考えなわけです。
「Golden Cookieが出たら音で通知」機能が理想なわけですが、当該機能を実装したCookie Monsterが不調…
ということで自分で適当にブックマークレットを書きました。

javascript:(function (){  var soundURI = "音楽ファイルのURL";var audio = new Audio(soundURI); audio.volume = 0.5; console.log("GoldenCookieBeacon was staeted."); teiki = function(){if(Game.goldenCookie.life != 0){audio.play();console.log("Golden Cookie!");}}; setInterval("teiki()",3000);})()

Golden Cookie Beacon

これをブックマークレットの内容として保存すればオッケー…と思ったんですが
なんか音楽ファイルをどうやって用意しようかなあってところが壁になったんですよね…
素材サイトやいろんな借りてるところからの直リンは多分めっちゃ怒られると思うんですが
このためにサーバー用意するの…????ってなったので
音のファイルは各自ご用意ください()
音楽ファイルのURLってとこを置き換えていただければと思います。

ちなみに自分はDropboxのpublicフォルダにアップロードして共有リンクを作成すると直リンクになる、っていうのを使ってます

f:id:milk_spoon:20151017135618p:plain

デフォルトであるPublicってフォルダに音ファイルを投げて…

f:id:milk_spoon:20151216095554p:plain

右クリック→「公開リンクをコピー」で出てくるURLを使います。
公式で提供されてるものだし自分用なら大丈夫だと思う!(

ローカルからファイルを読み込む方法、あるのかもしれないけどわかりません!
誰か教えて…_(:3」∠)_


・使い方
上のブックマークレットを、CookieClickerをプレイしているページで起動すると開発コンソールで"GoldenCookieBeacon was staeted."というメッセージが表示されます。
これが確認できれば正常に起動できています。あとはGolden Cookie出現時に音と"Golden Cookie!"のメッセージでお知らせしてくれます。
音が出てないけどGolden Cookie!のメッセージだけ出ている場合は音楽ファイルを指定していないかもしれません。
まあ使い方を書くほどのものでもないですね…

一応、使い方が全然わからない人向けに記事書こうかなと思います。

Golden Cookieが出ない時

ちょっとだけ↑の内容に関連するんですが
私は久しぶりにプレイして、「待てど暮らせどGolden Cookieが出ない」というヤバめの現象に悩まされました。
端的に言いますと、これの対処は「再読み込みしてください」です。
至って普通なんですが、久しぶりにプレイするということで最初にアクセスしてぶっ続けでやる人もいると思うので、結構引っかかるんじゃないかなあと思います。

これの原因は前述したminTime, maxTimeがゲーム開始時にはともに0に設定されているから、のようです。
以下はテストとして新規に始めたゲームの様子です。

f:id:milk_spoon:20151017141229p:plain

で、これらの値がゲーム進行でちゃんと変わるならいいんですが、どうも再読込するまで変わっている気配がない…
ファームを少し買い始めたあたりで再読み込みするとminTime, maxTimeが初期値になりました。

f:id:milk_spoon:20151017141437p:plain

その後、ちゃんとGolden Cookieも出現しました。

f:id:milk_spoon:20151017141535p:plain

Golden Cookie間隔短縮のUpgradeを購入した時も少しminTime・maxTimeの値を見てみましたが、少なくともコンソールで確認した限りでは再読み込みしないと変わらないみたいでした。
Golden Cookieの登場でおかしいことがあったらMenuからsaveの上で再読み込みが安定と思われます…。

最後に:ブーム時から何が変わったのか

ver.1.0466で何が前から変わっているのか、さっくり紹介します
普通にプレイしてて大きく変わったなーと思ったのは、まず新規Buildingとして"Prism"が追加されたことですね。

f:id:milk_spoon:20151017144435p:plain

光をクッキーに変換するそうです。まあ既プレイ者ならもう何があっても驚きませんよね。時間遡行よりは常識的な気さえします。
ちなみに新施設といえば新おばあちゃん。レインボー。

f:id:milk_spoon:20151017144459p:plain

あと、Grammapocalyps、通称ババアポカリプスはブーム時でも話題になっていたかと思いますが、この時に虫(Wrinkler)が出てくるようになりました。
虫がクッキーに取り付くと数に応じてCpSが下がりますが、実は虫がクッキーを体内に貯めこんでおり、クリック連打で潰した時に貯めこんだ分の1.1倍を還元してくれます!
なので実質CpSは上がっており、さらに虫がクッキーを貯めこむ速度は同時にいる虫の数で増えるみたいです。10匹が最大ですが、10匹いる状態での実質CpSはもとの6倍くらいだというので驚きです…!

f:id:milk_spoon:20151017145402p:plain

クッキーをクリックするでもなく、Golden Cookieを待つだけでなく、虫を飼うというクッキーの新たな増やし方が提供されなかなか楽しいです♪

あとはミルクの色が実績数で変わったり…
そういえば前述したGolden Cookieの出現間隔を短くするUpgradeって、ブーム時にありましたっけ…?
あんまりブーム時に深くやっていたわけではないので覚えていないんですが、なかなかお得感があっていいUpgradeだと思います。
出現条件がGolden Cookieクリック枚数なので、最初は自分で頑張って見つけてクリックする必要がありますが頑張って取得する価値があるとおもいます。

f:id:milk_spoon:20151017145855p:plain

あとは季節イベントがあるんですが…すいませんまだ出せてません;
できるようになったらレポートしたいと思います!
こんな感じで色々変わったCookie Clicker、是非もう一度プレイしてみてはいかがでしょうか…!

cannot import name …

pythonでdpktというパケット解析ライブラリを利用しようとして、pipでinstallもした、とりあえずテスト用ソースをコピペった、さあ動かすぞという段になってこのザマでした。
ちなみにバージョンはpython2.7.6 + dpkt1.8.6.2です。

$ python test.py 
Traceback (most recent call last):
  File "test.py", line 6, in <module>
    import dpkt
  File "/usr/local/lib/python2.7/dist-packages/dpkt/__init__.py", line 12, in <module>
    import aoe
  File "/usr/local/lib/python2.7/dist-packages/dpkt/aoe.py", line 6, in <module>
    from decorators import deprecated
  File "/usr/local/lib/python2.7/dist-packages/dpkt/decorators.py", line 4, in <module>
    from test import pystone
ImportError: cannot import name pystone

うわ。

pythonのバージョンが悪いのか、パッケージが実はうまくインストールできてないのか、とか色々考えましたが、testパッケージおよびpystoneはpython2.7ではインストール時にデフォルトであるという話もあり、しばらく原因が特定できず困っていました。

結論を言うと、以下のようにソース名を"test.py"から変更したところ動作しました。

$ mv test.py ttt.py
$ rm test.pyc 
$ python ttt.py 
(1, u'. time: ', 1303496629.238845, u'Length:', 60)
(2, u'. time: ', 1303496629.609845, u'Length:', 58)
...

一度実行してしまっている場合は.pycファイルも削除しなければいけないようです。

どうしてファイル名なんかで実行の成否が変わったのか…
これはpythonのimportの記法と優先関係にあるみたいです。kannokanno.hatenablog.com
最初のエラーメッセージでは結局何がエラーとなったかというと、

    from test import pystone
ImportError: cannot import name pystone

testパッケージのpystoneモジュールを読み込もうとしたけどそんなものはない!という点ですね。
そしてインポート対象ファイルの優先順位が

  1. 実行中のファイルと同じフォルダ
  2. カレントフォルダ
  3. 環境変数「PYTHONPATH」に列挙したフォルダ
  4. sys.pathに登録してあるフォルダ

…ありますね、カレントフォルダに"test"という名前のソースが…

つまり、本来4番目の「sys.pathに登録してあるフォルダ」の中の"test"(ディレクトリ)を探索してほしいところなのに、優先順位2番目のカレントディレクトリの"test"(.py)に先に引っかかってしまい、当然その"test"(.py)下にpystoneが存在するはずもなくエラーです!、という…

相当時間かかったので、原因がわかった時はかなり脱力しちゃいました。
こんなので動かなくなっちゃうのは正直やめてほしい。と思ったり思わなかったり。
しかも名前の衝突なので、pystoneやtestパッケージなど、限定的なキーワードで原因を調べても同様の事例がなくて焦りました。
こうして書いておくことで未来の自分や後に続く人が同じ轍を踏んで時間を浪費することのないよう祈るばかりです。

Google IMEでWindows 7でもUnicode 6の絵文字を入力する

こんにちは。

ブログを続けて書くのはなかなか難しいですが、考えたこと、発見したことのメモだけにでもなればいいなと思っています。

Windows 7 + Google IMEでも絵文字を使いたい!

Twitterをやっているとたまーにこんな感じのかわいい絵文字が流れてきませんか?

(画像はweb版TweetDeckでの閲覧時)

f:id:milk_spoon:20150904193834p:plain

最近は絵文字を活用したネタツイートも多いですね

(画像はweb公式での閲覧時)

f:id:milk_spoon:20150904193938p:plain

この絵文字の入力、モバイル(Android 4.2 + Google IME)から・Windows 8+Google IMEからだと簡単に行えることを確認しています。

たとえば「あいす」と入力して変換すればアイスの絵文字🍦が表示されるなど。

 

ただし、これはずっと私が困っていたことでもあるのですが、Windows 7+Google IMEでは絵文字の変換がそのままではできないのです。

ちょっとした設定変更でできるようになることを今日知ってとても感動したので、その設定を以下で説明します!

 

まずIMEGoogle IMEにした状態で言語バー内のスパナアイコンをクリックし、表示されたメニューから「プロパティ」をクリックします

f:id:milk_spoon:20150904222437p:plain

設定ウィンドウが開きますので「辞書」タブを選択し、下部のチェックボックスの「Unicode 6 絵文字変換」にチェックを入れてください!

f:id:milk_spoon:20150904222448p:plain

これでWindows 7+Google IMEでも絵文字入力し放題です!

というかWindows 7ではこの機能がGoogle IME導入時にデフォルトでOFFに、Windows 8ではONになっていると考えるべきですね。

どうして使えるの?

 どうしてWindows 7ではデフォルトで入力OFFなのか。そもそもこの絵文字はなんなの?どうしてTwitterで使われるようになってきたの…?ずっと疑問に思っていました。黙って使えるけれど、どうして使えるのかわからない。調べたら意外と大変でした。が、この変化が、どういう流れで起こったのかまとめられているところもない気がしたので、色々不正確な気もしますが以下にまとめました。適宜参考した資料を置いてますので、真偽の程が気になる方は検証いただければと思います。ちなみにもう以下にあらたなお役立ちTipsなどはありません。Twitterで絵文字が使いやすい"理由"まで気になる方は、自分といっしょにいろいろ考えていただく意味で読んでいただければな、と思います。

絵文字が使いづらかった理由と、使いやすくなりそうなこれから

 まず、そもそもどうして絵文字はTwitter上でほとんど使われてこなかったのでしょうか。いやむしろ、今までweb上で絵文字が使われることが少なかったはずです。ある意味絵文字の代替としてAAや顔文字があったはずです。どうして急に使われるようになったのでしょうか。これは以下の記事でなんとなくわかりました。

japan.cnet.com

 非常に長いので簡単に言いますと、今までのいわゆる携帯の絵文字はキャリア間で共通しない文字コードにそっていたので、環境の違いですぐ文字化けして見られなくなるものだったのです。それは同キャリア間のメール程度なら問題なかったでしょうが、様々な環境の人が閲覧するweb上ではほとんど共通して見られるものではなかったのですね。そんな携帯絵文字を、様々な環境で共通して用いる文字コード規格の一つであるUnicodeの中で新たにきっちり定めましょう、という動きがあったということですね。Unicodeはすでに利用されていた文字コード規格ですが、絵文字が追加されたのはそのバージョン6からとのことです。

 ここでUnicodeってなんぞや、文字コードって知らないよって人のために以下。分かってる人はさらに次の段落へ。

 Unicode文字コードの一種です。文字コードというのはバイト列(コンピュータ上での01のデータ)をどのような文字として解釈するかの対応規則です。対応規則なので、たとえばUnicodeで作成されたテキストファイルを、Shift_JISという別の文字コードで解釈して開こうとすると文字の対応が本来意図したものとはちぐはぐになったり、そもそも元の文字コードで使えるバイト列が、後から開くときの文字コードで使えないバイト列であったりします。これが文字化けです。なので文字コードが大切になるのは、文字のデータを2箇所以上でやりとりするときです。まあでもこのインターネット時代、文字をやりとりしない場面のほうが珍しいですね。その上で何が大事か、というと、やりとりする場所すべてでデータを共通した文字コードで解釈すること、さらにいえばそのデータの文字コードに「対応」していることが重要です。Unicodeで送るよーと言っても、Unicodeなにそれおいしいの?という相手がいたらお話しにならないのです。

文字コードに対応しているもの、そうでないもの

 もう1回言うことになりますが、実はさきほど挙げた絵文字はUnicodeのバージョン6以降追加されたものなのです。つまり、ある時からUnicodeという対応表に、バイト列0Aはケーキの絵文字、BCはアイスの絵文字…というような新たな対応が追加されたわけです。しかし、いくら対応表にそう決めても、上記で述べたとおり、実際のプログラムや表示するためのフォントが対応していない場合は意味がないのです。

 Unicodeのバージョン 6は2010年10月に制定された比較的新しい文字コードです。文字コードが新しく、対応している環境とそうでない環境が入り交じっている場合は、簡単に絵文字を入力できても、受け取る側で対応していないため閲覧できないため意味がない、という状況がありえます。だからGoogle IMEで有効/無効のオプションがあったのですね。

 そしてちょこっと調べたところ、どうやらOS標準フォントにおいて、Windows 8の方がWindows 7より、このUnicode 6絵文字への対応度を上げたようなのです(参考:

Windows 8 DP:Unicode 6.0の追加文字を表示させてみた ( その他インターネット ) - 513号室(保管庫) - Yahoo!ブログ )。Google IME入力オプションが、Win7ではデフォルトでOFF, Win8ではデフォルトでON、という状況は上記のOSレベル対応状況に合わせたのかな…と、不確かながらもこの事が分かった今では思います。実際、今でもWin7機では変換するときに変換候補では絵文字が表示されないんですよね。入力先を見れば表示されているんですが…

f:id:milk_spoon:20150904213500p:plain

 

Twitter側の対応

前述しましたが、実際のプログラムや表示するためのフォントが対応していなければ、いくら文字コードに規格化されても、表示できません。そう、Twitterで絵文字がたくさん使われるようになったのは「Twitter側でUnicode 6の絵文字に対応し、OS側などで対応していない環境でも共通して閲覧できるようにした」という実はとっても重要なイベントがあったからなのです!

www.itmedia.co.jp

Unicodeで標準化されたのでガラケー時代のような「違うキャリアの絵文字が表示されない」という事態はなくなったとはいえ、各社の絵文字は当然それ ぞれ著作権があって別物なんです。AppleAppleで、GoogleGoogleで、それぞれ1つずつ自前で作っているわけです。なので「絵文字 表示に対応する」ということは表示する絵文字素材を1つ作らなくてはいけないということ。

対応する絵文字素材を作る、ということはすなわちフォント素材から作るということですが、これは思ったより地道な印象で驚きました!

Twitterで絵文字が使いやすくなるまで

 今まで絵文字は環境の違いですぐ文字化けしてしまうため、様々な環境からアクセスされるweb上では使用を嫌われていたフシがありました。Unicode 6で追加されたことで規格として定められたものの、そのUnicode 6自体に対応していない環境も存在していました。そこでさらに、Twitter側が対応することで、Unicode 6に対応していない環境でもTwitter上ではみんなが共通して絵文字でのコミュニケーションが可能となった…と考えるとなかなか長い道のりですが、その発展によってTwitterに、インターネット上の文字コミュニケーション自体に、新しい形ができたようにも思えますから、すごいことだなーと思います!

 さらに、規格として定められ、それに一つのサービスが対応したのでみんなが見ることができるようになった、という技術的側面は大きいと思いますが、Twitter上では、絵文字は文字化けするから…という心理障壁が取り払われている感覚がするのも、絵文字コミュニケーションの拡大への寄与は大きいと思います。これはどこが発祥かもわかりませんが、Twitter公式も絵文字対応Tweetを絵文字つきでしていますから、そこからネタを愛する(?)ユーザーに取り上げられたのかなあ、と思います。

まとめ

 なんだか自分の知らぬところで結構大きな変化が来てた、という感じです。また、文字コード界隈は闇だなという気持ちがいっそう強くなりました()

 絵文字が使えるようになるまで、各所で行われた努力に感謝しつつ楽しいTwitterライフを送りたいですね!

 

 

【C++】メンバ変数のstd::arrayの宣言時初期化で躓いた

STLちゃんと使ってますかー?
自分は結構std::array使います。
というか基本、C言語の人が生配列使いたいなーって思うところが全部std::arrayに置き換わる感じです。
今日もこんな感じでテーブルをstd::arrayで作って、色々と計算に使ったりしました。
(もちろん、テーブルの大きさは例として小さくしてありますが…)

#include<iostream>
#include<array>

int main()
{
	//配列と同じ形の初期化が使える  //int table[3] = {1, 2, 3};
	const std::array<int, 3> table = { 1, 2, 3 };

	//便利なメンバ関数や、イテレータなどの利用が可能
	for (int i = 0; i < table.size(); ++i)
	{
		std::cout << table[i] << "|";
	}
	std::cout << '\n';

}

コメントにも書いたとおり、生配列の記法+便利(というかCが不自由すぎ)な機能があるのでナイスです。

さて、今日はたくさんテーブルを作って計算してたのですが
その内の一つの処理が少し複雑だったので、std::arrayはクラスに持たせて複雑な処理はそこにまとめ、main内はすっきり書けるようにしたいなあと思いました。
ちゃちゃっとこんな感じで…

#include<iostream>
#include<array>

class Table
{
public:
	Table(){}

	//std::arrayの要素を出力
	void print()
	{
		for (size_t i = 0; i < m_data.size(); ++i)
		{
			std::cout << m_data[i] << "|";
		}
		std::cout << '\n';
	}

private:
	const std::array<int, 3> m_data = { 1, 2, 3 };//コンパイルエラー
};

int main()
{
	Table tbl;

	tbl.print();
}

え?動かない、というかコンパイルが通らないというのが今日の困り事でした。

ちなみにかなりコンパイラとか環境によって違う案件のようなので書いておくと、環境は
Microsoft Visual Studio Express 2013 for Windows Desktop
update 4
って感じです。

色々調べたら思ったよりも沼という感じだったので、結論から言うと下記のコードは動きます。

#include<iostream>
#include<array>

class Table
{
public:
	Table(){}

	void print()
	{
		for (size_t i = 0; i < m_data.size(); ++i)
		{
			std::cout << m_data[i] << "|";
		}
		std::cout << '\n';
	}

private:
    //コンパイルエラー  …(1)
	//const std::array<int, 3> m_data = { 1, 2, 3 };
    //コンパイルエラー  …(2)
	//const std::array<int, 3> m_data = {{ 1, 2, 3 }};
    //コンパイル…は通るが構文エラー表示  …(3)
	//const std::array<int, 3> m_data = std::array < int, 3 > { 1, 2, 3 };
    //OK  …(4)
	const std::array<int, 3> m_data = std::array < int, 3 > {{ 1, 2, 3 }};
};


int main()
{
	Table tbl;

	tbl.print();
}

コメントで色々試してみたりしたものを置いておきました。エラー内容やコンパイルOKかどうかが変わります。

そもそも(1)と(2)のm_data={~}型の初期化は使えません。
(1)か(2)のとき、C2797のコンパイルエラーが出ます。
これについての説明は以下です。
コンパイラ エラー C2797
この書き方が実装されてないみたいです。実装されていないなら仕方がないです。
下の方に記述がありますが、明示的にコンストラクタを呼び出して初期化、という感じで解決するようです。
じゃあ(3)の

const std::array<int, 3> m_data = std::array < int, 3 > { 1, 2, 3 }

で解決、と思いますよね

ところが、さっきの(1)および(3)ではC2797の他にもう一つエラーが出ます。
"IntelliSense: このサブオブジェクト初期化子では中かっこを省略できません"
というものです。
面白いのは(?)このエラーはコンパイルエラーにはならないところです。
(1)はコンパイルエラー、(3)はコンパイルは通り、プログラムが問題なく動くのです。
ということはコンパイルを妨げるのはC2797だけ、ということです。

中括弧が1重だと、中かっこを省略できません~のエラーが出ます。
この中かっこが1重か2重か?ってのが色々面白そうです。
実はC++11の仕様書(参考:N3337)的にはstd::array<N, T>は

std::array<N,T> = {initializer-list};

の形で初期化できるもの、と書いてあるので
(メンバ変数内宣言時の初期化とは言え)1重でエラー出すのはどうなんだ?
と思ったりもしないのですが、集成体(aggregate)の初期化時の中かっこの省略が、メンバ変数の宣言時初期化だとできないようになってるのかな?とか色々思いました。

ってこと考えてると†闇†が深くなってくるので、まあVS2013なら(4)でちゃんと動きます。というのが結論です。
ちなみにg++(GCC) 4.9.2では(2)でちゃんと動きますが、(1)はコンパイルが通りませんでした。
wandbox上でclangも試して見ましたが、(1), (2)のコンパイルは通るものの、-Wallオプション付きだとmain内での中かっこ1重の
初期化、および(1)について、警告が出る状態でした。
三者三様ですね。

コンパイラで色々違いが出たり、初期化子リストやaggregate等、調べたら結構勉強になりました。
詳しい所もまた書きたいと思います。

VirtualBoxに入れたUbuntuが重かったのでxubuntu-desktop入れました

早速1ヶ月空けそうになりました。

 

研究室からVirtualBox上にUbuntu入れてねというお達しがあったので入れました。

VirtualBoxにUbuntu 14.04 LTSをインストールする(準備編) – PC雑記帳

基本はこちら

http://citrras.com/archives/1130

色々設定はこちら(仮想ハードドライブは固定サイズにしたけど!)

Ubuntu VirtualBox その4 - Guest Additionsをインストールする - Ubuntu kledgeb

Guest Additionはこちら、という感じで、

日本語Remix 14.04を入れました。

 

ところがGuest Additionを入れたのにもかかわらず、

Virtualbox上のUbuntu14.04が遅く感じる時: 水より柔弱

こちらも試した・確認したにもかかわらず、重いのでTwitterでつぶやいてみたところ

デスクトップ環境を変えてみてはどうか、と提案をもらいました。

教えてくれた方がXfce4を使っているということ、Xfce4は割と軽いことで有名だそうなので、入れてみることにしました!

 

ところがapt-cache search xfce4とすると、xfce4-なんちゃら、ってパッケージがどんどん出てきちゃうんですね。

f:id:milk_spoon:20150416035237p:plain

 とりあえずxubuntu-desktopというパッケージを入れればXfce4を確実にインストールできるようだ、ということは分かったのでインストールしました!

 

f:id:milk_spoon:20150416040005p:plain

 確かに結構軽いかもしれないです...

ただ、再起動→ログインとかその他もろもろの処理に時間がかかってるのでそもそものスペック不足が感じられて悲しいですが。

 

困ったことが1つ。

もともとのUbuntuのデスクトップ環境の方(ログイン時に切り替え可能)も、なんだかXfce4らいくな見た目になってしまったのです…。

なんと一回直したら状況が再現できないというなかなかファンキーなことになってしまったのでスクリーンショットがないのですが、「左のランチャーはそのままに、背景が青いネズミに、ウィンドウのフレームが白」という状態でした。

 

f:id:milk_spoon:20150416041416p:plain

 (Xubuntu - Wikipedia, the free encyclopedia)

ちょうどこの写真に、ランチャーはUbuntuのデフォルトのような感じでした。

 

Xfce4が軽ければUbuntuデフォルトのは使わないんですが、なんとなく収まりが悪いので直す方法を模索していたところ

f:id:milk_spoon:20150416044018p:plain

デスクトップで右クリ→「背景の変更」

これでテーマをAmbiance, 背景を一番左下にあるものに設定すればOKでした。単純でした…

背景は別のものでいいのですが、ウィンドウの見た目がかなり見辛かったので戻せて良かったです。

 

ちなみに、後から知ったのですが、xubuntu-desktopはXfce4-なんとか(とかその他色々)、を全部色々まとめた感じのパッケージみたいです。

Xfce4-*を調節しつつ入れたほうがカスタマイズできるみたいです、というかそうしていればUbuntuのデザイン変更もなかったのでは…

参考?:http://askubuntu.com/questions/305646/gui-for-ubuntu-server-xfce-or-xubuntu-desktop

情報が古いかなあ…?

まあ万が一自分と同じドツボにはまってる人がいたらお役立てください(?)

3/14「早稲田情報科学ジュニアアカデミー」3/15「☆女子学生がITの未来にふれる一日☆」にTAとして参加しました!

3/14「早稲田情報科学ジュニアアカデミー」無料体験・説明会
3/15「☆女子学生がITの未来にふれる一日☆」
にTAとして参加しました!

f:id:milk_spoon:20150320145126j:plain
3/15 受講者・スタッフ皆でわいわいお昼中

どちらでも、Siv3Dを使ったプログラミングを小〜高校生の方に体験してもらうというカリキュラムがあり、その中で質問を受け付けたり、特定の動作が実現できなくて困っている子のサポートをしたりしました。
短い時間の中でもどんどんSiv3Dでのプログラミングを吸収していく子どもたちを見て、若いっていいなあ…と思ったりもしましたw
難しい部分が書けて喜んでいる子や、ちょっとヒントを出したところからどんどん想像力をふくらませて作品を作っていく子を見ると、プログラミングを教えるのがとっても楽しくなりますね!
私自身も、会場のマイクロソフト品川本社内を見学させていただいたり、他の講演者の方とお話させていただいたり、実り多い時間を過ごすことができたので、とっても嬉しかったですo(^-^)o