Go言語でのInterfaceの可視性について
ちょっとハマったのでメモがてらまとめました。
Interfaceも通常のstruct等と同じく先頭が小文字で始まる場合に別パッケージで参照できないという点についてです。
ディレクトリ構成
example ├── factory1 │ └── factory.go ├── factory2 │ └── factory.go ├── main1.go └── main2.go
外部でinterface実装可能
Factory
インターフェースのCreate()
,Register()
ともに先頭が大文字でパッケージ外から参照可能なので、別のパッケージでインターフェースを実装することが出来ます。
// example/factory1/factory.go package factory1 type Factory interface { Create() Register() }
// example/main1.go package main import "./factory1" type BarFactory struct { } func (h BarFactory) Create() { } func (h BarFactory) Register() { } var _ factory1.Factory = (*BarFactory)(nil) func main() { f1 := BarFactory{} f1.Create() f1.Register() }
外部でinterface実装不可能
Factory
インターフェースと同じパッケージ内で実装したものなら、
外部パッケージから利用可能です。
ポイント
register()
は先頭小文字で不可視になっているため、外部パッケージからはCreate()
しか呼べないregister()
は先頭小文字で不可視になっているため、外部パッケージではインターフェースの実装ができない
//example/factory2/factory.go package factory2 type Factory interface { Create() register() // 別packageから参照不可能 } type FooFactory struct { } func (h FooFactory) Create() { h.register() } func (h FooFactory) register() { } var _ Factory = (*FooFactory)(nil)
// example/main2.go package main import "./factory2" func main() { f2 := factory2.FooFactory{} f2.Create() // ERROR: 不可視なので呼び出せない // f2.register() } type BazFactory struct { } func (b BazFactory) Create() { } func (b BazFactory) register() { } // ERROR: Factory.register()が不可視なのでinterface実装できない //var _ factory2.Factory = (*BazFactory)(nil)
おわり
あまりinterfaceを使う機会がなかったので、よくわかってなくてハマりました。
(単に使い方わかってなくて使い所がわかってなかっただけかもしれませんが・・・)
触りながら自己理解したので、もし認識違い等ありましたら指摘いただけると助かります。
最近買ったもの(2014年下期編)
スワダ 爪切り クラシック L
- 出版社/メーカー: 諏訪田製作所
- メディア: ヘルスケア&ケア用品
- 購入: 2人 クリック: 9回
- この商品を含むブログを見る
確かに切れ味もよくて爪も飛び散らないいい感じ。 うまく切れた指はヤスリ掛け不要だった。
タブレットPC対応フレキシブルマウントアームスタンド
オウルテック 新しいiPad/Nexus7対応タブレットPC対応フレキシブルマウントアームスタンド シルバー OWL-MAFA03
- 出版社/メーカー: オウルテック
- 発売日: 2012/10/17
- メディア: Personal Computers
- 購入: 1人 クリック: 1回
- この商品を含むブログを見る
いい感じ!!! pic.twitter.com/vUgC8wmfdv
— きょこみ (@k_yokomi) 2014, 11月 23
と思っていたが。。。
Nexus9結構持ち歩くので、いちいちセットアップするの面倒いとかで結局ほとんど使ってない。
Qiチー対応ワイヤレス充電器(USB供給)
Qiチー対応ワイヤレス充電器(USB供給)スマホ タブレット 置くだけ充電器
- 出版社/メーカー: Remarks Japan
- メディア: エレクトロニクス
- この商品を含むブログを見る
値段的にもコスパ高くて、買って良かった。
注意点:
- ケーブル指して充電するより充電速度が遅い
- ケーブル指して充電するより端末が熱くなる
サイクロン式 2in1スティッククリーナー
ツカモトエイム ecomo サイクロン式 2in1スティッククリーナー(ショコラブラウン) AIM-SC11-BR
- 出版社/メーカー: Tsukamoto Aim
- 発売日: 2014/04/08
- メディア: ホーム&キッチン
- この商品を含むブログを見る
5年使った3980円の掃除機と別れを告げた。
吸引力が違うので時間かからないのと、コードレスなのでちょっとゴミを見かけたらサッと掃除機掛けれるのが良い。
PlayStation Vita TV (VTE-1000AB01)
PlayStation Vita TV (VTE-1000AB01)
- 出版社/メーカー: ソニー・コンピュータエンタテインメント
- 発売日: 2013/11/14
- メディア: Video Game
- この商品を含むブログ (24件) を見る
PSVitaのゲームたまに家でガッツリやるときがあるので、勢いで買ってみた。
バリューパック買わなかったの失敗した。した。。。した。。。
PS3のコントローラーあるし〜とか思ってたけど、コントローラのケーブルを刺さないと操作できないのでいちいち抜き差しするのが面倒でお蔵入りしそう。
47型テレビで使うと少し画質が悪いのが目立つけど、特別こだわりがなければ問題ない。
セーブデータに関しての注意点:
- PlayStation®Plusを登録してセーブデータを預ける(お金かかる)
- nasneにセーブデータをコピーして上書きする(めんどい)
- 1つのメモリースティックを抜き差しして使う(めっちゃめんどい)
2014年を振り返り
とにかくCocos2d-x漬けな一年だったと思う。。。
Gitub
2014/12/31追記: GitHubの草活載せるの忘れてた。
Private込み
Private抜き
前半の差分は、ローグライクゲームの開発。さすがにリリース前に丸々コピーされてリリースされてもアレなので。 リリース後はソースも公開して面白可笑しく作っていければいいな〜とか思ってた。
後半は、ほとんどGoだと思う。素振りがメインで、なんか思いつきでツール作ったりGo麻雀とか放置ゲーのサーバーサイド(Go)とかとか
Private込みのシムシティ版
jasonlong/isometric-contributions使って、シムシティっぽく見るとよくわかるけど、やっぱ土日のcommitが多い。
これが、来年どうなるか楽しみ。
Cocos2d-x
- C++入門から始めたけど、中々難しかった
- Cocos2d-x使うだけならとりあえず最低限の作法とかで大丈夫という知見を得た
- 3.0alpha版からコツコツ触ってた
- 環境構築と0.1VerUpするだけここまで変わって気が狂ういい経験になった
- 2014年の上期はブログに乱投稿しまくってた
- しょぼいbugfixだけどCocos2d-x本家に数回PullRequest送った (※1, ※2, ※3)
- Cocos2d-x界隈の方々と交流して交友関係が広がった
- 2回くらいオールで飲んだの忘れないと思う
Go
- Goすごい気に入った
- 勉強会とかカンファレンスにいけるだけ行った気がする
- 次はなんかLTとか発表したい(ネタがなかった・・・)
- 半年くらいコツコツGoで素振りしてた
- Go覚えてすぐに勢いで書いた絵文字のライブラリがGithubスター26まで行った
- ISUCON4予選にGoで出た(Go初見なチームメンバ、スマンカッタ。。。)
個人ゲーム開発
- ローグライクゲーム結構ガッツリつくったけどゲームバランス妥協できずエターナった
- データ作成が地獄だ
- そんなにバランス考えなくていいという自分が興味薄い放置ゲーつくりはじめた
- ちょっと飽きてる。コツコツやるとします
- SRPGゲーが作りたい...
仕事
- 本業はCocos2d-xでそこそこ個人活動での成果は出せた気がする
- SlackとQiita:Teamを導入して啓蒙活動した
- 社内AdventCalendarも埋まってよかった(非公開だけど)
- 2年くらい同じ会社にいたけど、ろくに話したことない人々とTLで絡むようになって面白い
その他
- アニメ視聴数は去年より増えてる
- nasne導入と風呂でPSVitaを使って視聴など取り入れて効率良くなった
- ゲーム購入してるけど、あまりやってないきがする
- ネプテューヌRebirth1,2はクリアした。良かった
- PC周辺機器とか椅子とか自宅環境を良くした
- Amazon Kindleを積極的に使うようにして紙の本への依存が無くなってよかった
- 高尾山と三つ峠登った
- 2年ぶりに実家に帰った
まとめ
とりあえず、Goに出会って今後の人生変わったと思う。 来年はCocos2d-xは一旦お休みして、Goメインで色々やっていく。 (でもUnityもちょっと触りたい感じもある)
なんかめっちゃ飲み行った方々、いろいろとお世話になりました。
来年もよろしくお願いします!!!!!!!!!!!
それでは、よいお年を!!!!!!!
ドッキングステーション ピッコロJUD530をしばらく使った感想
J5 create ドッキングステーション piccolo JUD530
- 出版社/メーカー: J5 create
- 発売日: 2014/11/20
- メディア: Personal Computers
- この商品を含むブログを見る
公式URLはこちら
ちなみに自分が使っているMacBookAir13インチの2012年Midモデルです。
USB3.0経由でドッキングステーションとしてHDMIやVGA、サウンド、有線LANなどを提供してくれるすぐれものです。
買った理由
- MacBookAir2012Midは、Thunderboltの口が1つしかない(ディスプレイ or 有線LANだった)
- サブディスプレイが2台あるので2台繋ぎたかった
メモ
- 有線LANは接続した時点でDriverインストール不要で使えた
- HDMIのディスプレイに関してはDriverのインストールが必要(最初に記載した公式URLからダウンロードページへいくとダウンロードできます)
使ってみた感想
有線LANは全然ストレスなく使えてます。 HDMIのディスプレイ接続に関しては、すぐにやめました。 USB3.0経由だとどうしてもカクカクしてしまい。ディスプレイ切り替え関連の動作がすべて重くなってストレスに感じるためです。
しかも、Driverをインストールしているとディスプレイが未接続の状態でもドッキングステーション上にあると認識?しているためか、動作が重いままです。 そのため、有線LANしか使いたくない方は、公式のDriverインストーラーでUninstallすることをお勧めします。
最初なんで、Driverが分かれているんだろう?と思ったのですが、たぶんPCによっては重いので選べるようにということでしょうね。。。。
自分のMacが古くてスペック的に厳しいという可能性も高いので、 買い換えたいなーと思ってはいます・・・
Cocos Studio v2をCocos2d-x3.3rc0で使ってみたメモ
ただのメモです。 あとで追記とかするかもです。
Cocos Studio v2.0.0.0beta0(for Mac)を使ってハマったことや、バグってるぽい箇所、v1.6.0.0で出来たことができないとかのメモ。
.csbと.csdをcocos2d-xで読み込む方法
.csd
: CocosStudio ドキュメント?(XMLっぽいファイル)- CocosStudioでイジるのはこっち
.csb
: CocosStudio バイナリ?(バイナリmsgパック?)- Publishすると吐出されるのがこっち
検証したのは、cocos2d-x3.3rc0
です。
.csd
cocos2d::Node *node = CSLoader::getInstance()->createNodeFromXML("HogeScene.csd"); this->addChild(node);
.csb
cocos2d::Node *node = CSLoader::getInstance()->createNodeFromProtocolBuffers("HogeScene.csb"); this->addChild(node);
良くなった点
- Macで作ったやつがcocos2d-xを改造しなくても読み込める
- 色々バグってたのが直ってる(Labelまわりとか)
色々あるんだけど、ぱっと思いつかない。。。
v1.6.0.0で出来たのに〜
- ListViewが使えない
- ルートノードに
Adaptive Resolution
を指定できない - Sizeに%を指定してもCocosStudio上で指定した画面サイズの%にしかならない
- Cocos2d-xで実際のDesignResolutionSizeを使用してくれない
バグっぽい
- publishしたcsbを読み込むとLabelに設定したOptionsが
ui::Text
反映されない- csdなら反映される
- 2014/11/29追記: Cocos2d-xの問題でした Modify that parsing attribute "fontName" of TextReader · 2ed51e0 · cocos2d/cocos2d-x · GitHub
- まだCocos2d-x3.3rc0に入ってない修正なので手動でパッチ当てが必要
- SceneのサイズがcontentSizeに反映されない(昨日PRして今日マージ済み)
- CocosStudioプロジェクト下にディレクトリを作成して、ディレクトリ内のNodeから別のcsdを参照するとパスがおかしくなる
- Labelの
AutoAdjust
がうまく効いてない時がある(最後の1文字が消える)- とりあえず、
AutoAdjust
やめてSizeを設定すれば大丈夫
- とりあえず、
2014/11/23追記:
- CocosStudio v1.6の時とかは設定できたZOrderがv2では設定不要になっているが、v1.6をimportすると隠しパラメータとして設定されているため、Layerの順番をどうやって変えても重なってしまう問題が起こる
- Vimとかで直接
.csd
を開いてZOrder=1
とかを全部削除すれば解消されます
- Vimとかで直接
注意点
- %でPositonやSizeを指定したNodeやPanelをコピペすると%が解除されてpxになる
- ひどいお。。。
.csd
間でNodeとかPanelをコピペできない(辛い)- Vimとかで直接開いて〜ってやればできそうなので、次バージョンで対応オナシャス!!!
- 2014/12/7追記:
Cut&Pasteを右クリックで行うと擬似コピー可能という裏ワザを発見 - 2015/1/12追記: v2.0.6で擬似コピー裏ワザ使えなくなった。。。バグ扱いで消えたか...
- UIEditorでつくったプロジェクトをv1.6.00のimportできるが、全部Node扱いになる(変更できない)
- 厳密にいうと直接.csdファイルをvimとかで開いてSceneにすればOK
- NodeのままだとAnchor周りの問題がおきる
- new Fileで作ったLayerは途中でサイズ変更できない
- vimとかで直接csdを開いてSizeをいじればなんとかなる
- Mac版だけかもしれないけど、名前入力中に勝手に半角スペースが挿入される時がある
- Google IMEのせい?
メモ
- Scale 9 Gridの設定の仕方が変わってる
- 引き伸ばさない部分のRectをpxで指定する感じになってる(Top, Bottom, Left, Right)
- マウスのスクロールで拡大縮小制御するには、「Preferences」 -> 「Mouse」 ->
Disable mouse wheel zoom
のチェックを外す - AnimationEditorで作ったやつのimportもできる
- SpriteFrameの切り替えが、それぞれSpriteが追加されてvisibleで切り替えたtimelineが作られる
- plistとpngのセットになったSpriteSheetもResourcesにimportできる
その他
publish先変える方法Qiitaに書いたけど、上記のバグ?でTextのOptionが読めてないから使ってない。(2014/12/6追記: Cocos2d-x3.3rc1では直ってます)
書いた / “cocos2d-x - Cocos Studio v2でpublish先のディレクトリを変更する方法 - Qiita” http://t.co/vInvqX1szZ
— きょこみ (@k_yokomi) October 29, 2014
今はプロジェクト直下にpublis.shを作って、CocosStudioで編集したら実行して(2014/12/6追記: Cocos2d-x3.3rc1では直ってるので、普通にpublishしてます).csd
を自分でrsyncしてる。
publish.sh
rsync -a --delete cocosstudio/ Resources/
ちょいちょい追記します。
Cocos2d-xで縦横いい感じのDesignResolutionSizeを指定する
以前の記事「Cocos2d-xでいい感じのDesignResolutionSizeを指定する」が縦画面の時にいい感じにならなかったので、調整しました。
環境
- Cocos2d-x3.3rc0
- CocosStudio 1.6.0.0(windows)
- Xcode6.1
ソースコード
使い方
上記のソースを丸コピーもしくはダウンロードしてプロジェクトに追加し、AppDelegate.cppで呼び出します。
AppDelegate.cpp
#include "AppDelegate.h" #include "GLViewUtil.h" USING_NS_CC; // 〜省略〜 bool AppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance(); auto glview = director->getOpenGLView(); if(!glview) { glview = GLViewImpl::create("My Game"); director->setOpenGLView(glview); } // turn on display FPS director->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this director->setAnimationInterval(1.0 / 60); // ★横640は維持して640x960比率でフィットした画面にする(縦横の黒棒をなくす) auto fitSize = GLViewUtil::calcFitDesignResolutionSize(640, 960, GLViewUtil::FitType::WIDTH); glview->setDesignResolutionSize(fitSize.width, fitSize.height, ResolutionPolicy::SHOW_ALL); // create a scene. it's an autorelease object auto scene = HelloWorld::createScene(); // run director->runWithScene(scene); return true; } // 〜省略〜
CocosStudio側の配置
拡大時もいい感じの位置に配置するためには、以下を行います。
- RootNodeのPanelで
Adaptive Resolution
のチェックボックスをONにする - CocosStudio上で全部%でposition指定する
Adaptive ResolutionをONにする
Adaptive Resolution
のチェックボックスをONにするとWidget作成時にLayoutReader.cpp
の183行目辺りのLayoutReader::setPropsFromJsonDictionary
で、ContentSizeにCCDirector::getInstance()->getWinSize()
を設定してくれます。
CocosStudio上で全部%でposition指定する
結果
横 iPhone6+
縦 iPhone4s
縦 iPhone6
※2014/10/31 追記
上記の式を使うと(例: 640x960)で極稀にiPadAirなどが横幅(640px)を維持すると縦幅(960px)を維持できなくなるケースがあります。
その場合を考慮して、以下を用意しました。
基本はFitType::WIDTH
でwidth640を維持する形でいい感じのSizeに設定し、極稀なケースでheightが維持できなくなったら(960以下になる場合)FitType::HEGIHT
にしてのheight960維持する形に切り替わります。
auto fitSize = GLViewUtil::getFitDesignResolutionSize(640, 960, GLViewUtil::FitType::WIDTH); glview->setDesignResolutionSize(fitSize.width, fitSize.height, ResolutionPolicy::SHOW_ALL);
中でいい感じに計算した結果がもともとのhegith960以下になったらFitTypeをFitType::HEGIHT
に変更して再計算します。
こうするとwidthがおそらく640以上になるので、もともと画面の中央にSceneを配置するような工夫とかが必要です。
(よくある、vislbleSize.width /2 - layout->getContentSize().width /2
的なやつです)
かなり暫定的な処置なので、Androidの一部の端末だとダメなパターンとかあるかも・・・
こんな感じになります。
iPhone6
iPhone5s
iPhone4s
iPad Air
iPad2
nanapi勉強会 vol4に行ってきた感想
nanapi勉強会 vol4 - 【nanapi x はてな】はてなとnanapiの開発フロー
最近、感想ブログばかりになってます(笑
#nanapi_study 130人登録で、100人以上来てたのに、ブログ書いてる人あんまいないので、文化圏の違いもあるのかもしれないけど「blog書いてください」って言うの大事なんだなーとか思ったりしてる。941さんがイベントの度に毎回働きかけてるの大事なんだなーと。
— songmu (@songmu) 2014, 10月 6
確かに・・・このツイートみて書く気持ちが湧いてきたので、「blog書いてください」って言うの大事だなーと思いました。(す、すみません・・・)
内容
内容のまとめはこちらが参考になります。
めも帖 - nanapi 勉強会 vol.4 #nanapi_study に参加してきました
感想
というわけで、感想メインです。 (他の参加者で感想書かない人も自分と同じような感想で書きにくいのかなーとか思ってたり)
正直、この手の話は眩しすぎて 自分の関わってる業務とは別世界のように感じてしまう というのがざっくりした感想です。
もちろん色々導入したいですし、色々提案したりもしてるんですけどね・・・
以降、もうちょっと詳細な感想。
色々話を聴いていて、nanapi
さん、はてな
さんのどちらの方も、
そもそもの前提としてほとんどのメンバーが
新しい技術や取り組みに前向きな人が多いのかな?
と感じました。(違ったらすみません
自分の業務環境だと、こういった取り組みや新しい技術をいれることに 抵抗や拒絶を示すメンバーがほとんどで逆に自分だけで異端児のようになります。(Githubなにそれ?何がいいの?とかとか)
ゴリ押しで導入しても、「じゃあ好きにやってくれ」スタンスのメンバと一緒では、 どうやっても上手くいかないのでその辺の知見って需要ないのかな。。。 (上司の説得だけでも疲れる・・・本来の業務進捗に影響が出る)
自分としてはそういうツールとかを導入してもっと楽したいとか効率よくやりたいって考えが強いので、 その導入でプロジェクトの成功を〜とかその行動自体に意義を持ってる人に比べて、興味を持ってもらうように動いたりするのに労力を割くだけのリターンを得るのが難しい。
その辺、理解ある後輩が1人だけ居るので話してみると、 「実際、興味ないものを無理に勧められる側も辛そう」という結論。
なので、興味を持ってもらうように色々動くのも逆効果になるパターンも多そうでやっぱ難しい。。。
そして、「たぶん、先輩早いうちに辞めたほうがいいですね。。。」というお言葉を頂きました。
ぐぬぬ。。。
とりあえず、何となく理解したつもりだったScrum本をちゃんと読んでおこうと思います。
- 作者: 西村直人,永瀬美穂,吉羽龍太郎
- 出版社/メーカー: 翔泳社
- 発売日: 2013/02/13
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 13回
- この商品を含むブログ (28件) を見る
あと、リモートやる機会があれば、以下も読んでテンションあげたい。
- 作者: ジェイソンフリード,デイヴィッドハイネマイヤーハンソン
- 出版社/メーカー: 早川書房
- 発売日: 2014/04/01
- メディア: Kindle版
- この商品を含むブログを見る