退プロしました。
退職しましたエントリがあるのなら、退プロしましたエントリがあってもいいんじゃないか、ということで書いてみる。
プロジェクト在籍期間は1年半でした。
前提
4年間勤めた富山のSIerを2012/3に退職。
SIerでは3次請けやら4次請けやらのプロジェクトに、プログラマとしてアサインされることが多く、
Javaでのコーディングはできるけど、設計ナニソレ状態でした。
ジョブチェンジ&プロジェクトに参画
2012/4 にモンスター・ラボの社員に。
その日からこのプロジェクトに参画しました。
最初の説明としては、「FacebookみたいなSNSで、写真を投稿するサービス」ぐらいの説明で、なんとなく理解できてしまったのが、B2Bとは違うところだなーと感じました。
B2Bの案件で、「N社の債権債務システムみたいな感じで・・・」とか言われても、そのシステム見たこと無いしーってなりますし。
技術的なこと
4年間サーバサイドJavaオンリーで仕事してきたところへ、言語的には
- PHP ( Codeigniter )
- Objective-C ( iOS )
- Java ( Android )
のプロジェクトに入り、「Javaだとこのクラスを使えるけど、PHPのそれに対応したものはどれだー」状態で、
そこへきて、「Redis使って更新通知を作ってみて」・・・って、Redisってなんじゃー状態になりながら、
知らなかったことをたくさん吸収できたかとは思います。(成果も"それなり"には上げたと思ってます)
そして常駐へ
1,2ヶ月たった頃から、お客さんの方で内製化の機運が高まり、7月の中旬に客先常駐となることになりました。
自社からは自分含め3名で。
直後はまだ受託の契約で、口頭で「ここはこんな風にできません?」みたいなのに、どこまで対応してよいのやら、難しかったです。(そもそも時間がないから無理、ってことも多かったですが。。。)
で、8月の後半リリースに向け、十数名の体制になり、楽ができるかと思いきや、質問やら修正依頼やらが自分に集中してしまい、当時は自分でもよくやってたと思います。(被害妄想?+自画自賛。。。
ちなみに、常駐前は週休1日制でしたが、週休2日制にグレードアップしました。
リリース、そして最後の一人
無事リリースを終えたものの、
バグだーと言われれば直し、
機能追加だーと言われれば追加し、
認証基盤様からの要求じゃーと言われればそれを実装し、
キャンペーンを始めるぞーと言われればそのページやら仕組みやらを実装しました。
そうこうしている間に、自社から行っていた人は、退職やら、別プロジェクトへ異動やらで、一人になりました。
それから1年ぐらいは、自社に帰るのは月1回、自社の人たちに会うのもそのタイミングぐらいって日々でした。
自分はどこの社員なんだろう・・・?って思うこともありましたが、前の会社でも似たような事があったので慣れてました。
人の入れ替わり、受託時代の負の遺産
月日が経つと、それぞれの事情によりプロジェクトを異動だったり、契約が終わったりで、人が抜けて行きました。
ただ、会社としても期待されていたプロジェクトらしく、抜けた分ぐらいの人は追加で入ってきました。
その頃ぐらいから言われてたのが、
なんじゃこのコードはーとか
このアーキテクチャはおかしいーとか
でした。
ここらへんに関しては、自分もそのころには感じておりましたが、初期の製造段階での質もあまりよくなく、
その負債を回収する暇もなく進んでいました。
プロジェクトメンバーも悪い人はおらず、直接自分が糾弾されることは無かったのですが、精神的には地味にきつかったですね。
書き直し
そんな経緯もあり、コードを描き直そうという動きがあったのですが、直近のタスクが溜まっていたり、人の入れ替わりによりスキルセットが変わってしまったりもあり、なかなか進みませんでした。
それが、なんやかんやあり、2013/7 ぐらいから、サーバ側はRuby on Railsで書き直すことに決定しました。
で、同時にデザイン・マークアップ・JS・iOSネイティブ・Androidネイティブ の全てを書き直すことにもなりました。
そのため、自分だけが知っていたことなども、他の人に引き継ぎやすく、タイミングとしてはよかったと思います。
メインはRubyでの書き換えをやりながら、ちょっとは運用系のタスクでPHPを修正し、家に帰ったらPythonやらObjective-Cをやる、という混乱は引き起こされましたが。。。
退プロ
途中の予定では、退プロするまでにALL書き直ししたものがリリースされる予定だったのですが、いろいろあって、リリースされる前に抜けてしまうことになりました。
ここに関しては、すこし残念でした。
機会があれば、完成形がどうなったかは知りたいです。
まとめ
- PHPの経験が1年3ヶ月増えた!
- iOSの経験が2ヶ月(ぐらい)増えた!
- Java(Android)の経験が2ヶ月(ぐらい)増えた!
- Ruby on Railsの経験が3ヶ月増えた!
- Redisの経験が増えた!
- MySQLの経験が増えた!
- RabbitMQの経験が増えた!
ただし、本番のインフラはさわれなかったので、その辺のスキルはまだまだだと思います。。。
ということで、外部記憶の意味も込めて、書き殴ってみました。
NDA的にとか、問題ありそうなら即刻消しますので、ご連絡ください。
iOSのPUSH通知実装を行う(iOSネイティブその1)
前回はPush Notificationの有効化と、証明書の作成を行ったので、今回はiOS側のコーディングを行います。
基本的なことは、Appleの公式ドキュメント を見ましょう。
リスト 2-3あたりです。
今回の差分はこのへんです。
手順
まず、どのようなPUSH通知を利用するかを指定し、登録プロセスの開始を依頼します。
コードとしては、AppDelegateの application:didFinishLaunchingWithOptions: にて、 registerForRemoteNotificationTypes: を実行します。
今回は、バッジ(Home画面のアプリアイコンに数字を付ける)・サウンド・アラート(文字列を表示する)の全てを指定しています。
不要なものがあれば、省くべきかと思います。(あとで、やっぱり必要になった。とかが無いのであれば)
// PUSH通知の設定
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge|
UIRemoteNotificationTypeSound|
UIRemoteNotificationTypeAlert)];
次に、デバイストークンを取得するために application:didRegisterForRemoteNotificationsWithDeviceToken: を実装します。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken { NSMutableString *tokenId = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"%@",devToken]]; // TODO 変換が必要? NSLog(@"deviceToken: %@", tokenId); }
引数で与えられた、 devToken がデバイストークンと呼ばれているものです。
ただし、NSData * 型で与えられるので、サーバに送信する際などには文字列とした方が便利だと思います。
今回は一旦、NSMutableString * 型に変換して、ログ出力を行います。
しかし、エラー
application:didRegisterForRemoteNotificationsWithDeviceToken: メソッドが実行されず、
Errorinregistration:Error Domain=NSCocoaErrorDomain Code=3000 "Appの有効な“aps-environment”エンタイトルメント文字列が見つかりません" UserInfo=0x17daec40 {NSLocalizedDescription=Appの有効な“aps-environment”エンタイトルメント文字列が見つかりません}
がログに出力されました。
このサイト が見つかったので、プロビジョニングプロファイルを再生成することにしました。
おそらく、Xcode上で「Fix issue」を押してしまった後に、Identifier?を変更したためだと思われます。
順番が違っていたら、不要な手順かも。
プロビジョニングプロファイルの生成手順
iOS Dev Centerから、「Certificates, Identifiers & Profiles」を選択し、「Provisioning Profiles」を選択しました。
下記の画面で、「+」のアイコンをクリックします。
今回は開発用のプロビジョニングプロファイルを作成するので、「Development」の「iOS App Development」を選択します。 「Continue」をクリックします。
作成対象としたいApp IDを選択し、「Continue」をクリックします。
含めたい証明書を選択し、「Continue」をクリックします。
含めたい端末を選択し、「Continue」をクリックします。
(端末が増えると、ここもやり直しになってしまうのが、めんどいところですね)
このプロファイルの名前を入力します。
今回は、Development用なので、末尾に「Development」を付けました。
「Generate」をクリックします。
プロビジョニングプロファイルが作成されましたので、「Download」をクリックします。 ダウンロードが完了したら、「Done」をクリックします。
「プロファイルの名前.mobileprovision」をダブルクリックすると、Xcodeに設定されます。
あとは、プロジェクトの「Build Settings」の「Code Signing」の「Provisioning Profile」を「プロファイルの名前」に変更します。
この状態で、再度実機で実行すると、アラートが表示され、ログにデバイストークンが表示されました。
ただし、
deviceToken:
という形で表示されるので、"<", ">", " "の文字が余計なような気がします。
他の人のコードを見ていると、省いているようですが、そこら辺はまた今度やろうと思います。
iOSのPUSH通知用証明書を作成する
PUSH通知用の証明書を作成する手順のキャプチャを貼っておきます。
前提
http://noboru.hatenablog.jp/entry/2013/09/20/023645 の手順を行っている状態。
- App IDが作成済み
- 「CertificateSigningRequest.certSigningRequest」が出力済み
手順
iOS Dev Center 右側の「Certificates, Identifiers & Profiles」をクリックします。
「Identifiers」をクリックします。
なぜか、すでにApp IDが発行されていました。
おそらく、以前にXcode上で「Fix issue」を押したタイミングで作成されたのではないかと思われます。
「Push Notifications」が「Disabled」なので、「Edit」をクリックします。
「Push Notifications」の右側のチェックボックスを選択状態にします。
すると、下のボタンが有効になるので、まずは「Development SSL Certificate」の「Create Certificate...」をクリックします。
なんか、以前に見たことがある画面が表示されました。
「Continue」を押します。
前回作成した「CertificateSigningRequest.certSigningRequest」を選択し、「Generate」ボタンをクリックします。
「Download」ボタンをクリックします。
「aps_development.cer」がダウンロードされます。開発環境(Sandbox)用の証明書です。
Typeが「APNs Development iOS」となっている証明書が作成されました。 本番用もとりあえず作成しておきたいので、再度「App IDs」をクリックします。
「Push Notifications」の「Development」側が「Enabled」になりました。
「Distribution」側は、「Configurable」となっているので、再度「Edit」をクリックします。
今度は、「Production SSL Certificate」の「Create Certificate...」をクリックします。
「Continue」をクリックします。
「CertificateSigningRequest.certSigningRequest」を選択し、「Generate」をクリックします。
本番用の証明書が作成されました。
「Download」をクリックすると、「aps_production.cer」がダウンロードされます。
Typeが「APNs Production iOS」となっている証明書が作成されました。
「App IDs」をクリックします。
「Distribution」側も「Enable」になりました。
ダウンロードした「aps_development.cer」・「aps_production.cer」をそれぞれダブルクリック(or Cmd+O)すると、キーチェーンアクセスが起動し、登録されます。
Developmentの証明書を右クリックし、「...を書き出す...」をクリックします。
ファイル名は「aps_development.p12」とでもしておきます。
フォーマットは「p12」とします。
パスワードは空で、そのままOKとします。(ホントは、ちゃんと設定しましょう)
パスワードを聞かれるので、Macのアカウントのパスワードを入力します。
指定したフォルダに「aps_development.p12」が作成されました。
同様の手順で、productionの証明書についても、「aps_production.p12」を作成しておきます。
ターミナルでp12ファイルがあるディレクトリまで移動し、下記を実行する。
openssl pkcs12 -in aps_development.p12 -out aps_development.pem -nodes -clcerts
aps_development.pem が作成されました。
これを使えば、PUSH通知が送れるはず、です。(まだやってない。
感想
思ったよりは簡単に出来た。
参考
今更ながら、「migrate your application to Python 2.7.」って言われてたのに対応してみる
Google App EngineのDashbordを見ると、下記の文言が毎回表示されていた。。。
A version of this application is using the Python 2.5 runtime, which is deprecated! The application should be updated to the Python 2.7 runtime as soon as possible, which offers performance improvements and many new features. Learn how simple it is to migrate your application to Python 2.7.
しかたないので、python 2.7への移行をやってみた。
今回の作業での差分はこちら
基本的には
基本的なことは、
https://developers.google.com/appengine/docs/python/python25/migrate27
に書いてあります。
ただし、英語。。。
というわけで、自分用のメモとして、日本語で。
webapp を webapp2 に変更
importの変更
以前までのwebappを利用しているものは、下記だったはず。
from google.appengine.ext import webapp
それを、
import webapp2
にしました。
WSGIApplication 呼び出し関連の変更
application = webapp.WSGIApplication([('/', IndexPage) ], debug=True) def main(): run_wsgi_app(application) if __name__ == "__main__": main()
とかになっていたところを、
application = webapp2.WSGIApplication([('/', IndexPage) ], debug=True)
にしました。mainなどはバッサリ削除。
各クラスの定義
class IndexPage(webapp.RequestHandler):
から
class IndexPage(webapp2.RequestHandler):
に。
app.yamlの変更
threadsafe: true
を追記(or 更新)します。
そのまま起動しようとすると、
raise yaml_errors.EventError(e, event_object) google.appengine.api.yaml_errors.EventError: threadsafe cannot be enabled with CGI handler: XXXX.py in "XXXXXX/src/app.yaml", line 56, column 18
とかって表示されてしまうので、app.yaml を
handlers: - url: /XXXX/.* script: XXXX.py
から、
handlers: - url: /XXXX/.* script: XXXX.application
に変更します。
application の部分は、webapp2.WSGIApplication を代入した変数名でよいみたいです。
カスタムタグの利用
カスタムタグを利用していたので、
webapp.template.register_template_library('app.templatefilters')
という記述がありました。
- こちらの解決方法がいまいちわからなかった(setting.pyって何者?とか) and ちょっとやってみたけど、うまくいかなかった
参考 http://www.john-smith.me/Tag/webapp2 - そもそも、Djangoが「Web framework」で、webapp2も「lightweight Python web framework」なのに、両方使ってんだ?
- ここでも、templateエンジンとしてJinja2 が使われている
のため、この際、テンプレートエンジンをJinja2に乗り換えることに。
(名前がかっこいいしw なぜJinjaというの?)
Djangoの利用をやめ、webapp2 - Jinja2 にする
Eclipseの設定
PYTHONPATHに、webapp2、jinja2が無いと、
Unresolved import: webapp2
とかっていわれるので、追加する。
すでに、いろいろ追加され、GOOGLE_APP_ENGINE変数も定義されているはずなので、「Add based on variable」を押す。
必要なパスを手入力する。
追加されてれば、「OK」を押す。
app.yaml の編集
libraries: - name: django version: "1.3"
の下2行を削除する。
代わりに、
- name: webapp2 version: latest - name: jinja2 version: latest
を追加。
動かしてみると、
UndefinedError: 'forloop' is undefined
って言われたので、調べたら、これがあったので、
forloop.counter0
が使われていた箇所を
loop.index0
に変更。
カスタムタグを定義していたファイルの変更
app/templatefilters.py に定義し、
register = webapp.template.create_template_register()
register.filter(jst)
としていたのですが、
app/templatefilters.py では、関数の定義のみ行い、
実際のcontrollerの先頭(importの次ぐらい)で、
JINJA_ENVIRONMENT = jinja2.Environment( loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'template')), extensions=['jinja2.ext.autoescape']) from app import templatefilters JINJA_ENVIRONMENT.filters['jst'] = templatefilters.jst
としました。 (ただ、複数のcontrollerで使うfilterはどこで定義したらいいんだろう。。。)
simplejsonの利用をやめる
from django.utils import simplejson
を使って、jsonのparseやdumpを行っていたので、これも置き換える。
import部分は、下記のように変更。
import json
出力するところは
simplejson.dump(responseJson, self.response.out, ensure_ascii=False)
だったところを
self.response.write(json.dumps(responseJson))
に変更。
パースするところは
data = simplejson.loads(self.request.get('data'))
を
data = json.loads(self.request.get('data'))
に変更。
レンダリング部分
templateのレンダリングは
folder = 'template'
path = os.path.join(os.path.dirname(__file__), folder, page)
html = template.render(path, template_values)
handler.response.out.write(html)
と、していたので、
template = JINJA_ENVIRONMENT.get_template(page) handler.response.out.write(template.render(template_values))
としました。
フォルダ名は、JINJA_ENVIRONMENT変数を宣言時に設定してあります。
感想
めんどい(最近、こんなんばっかり)
これで、多少ましになった。
あと、pythonの仕組み?がようやく理解できてきた。
ここから機能を追加していきますー。
あと、いいかげんテストを書かないと。テスト無いとこんな作業は恐怖でしかない。
パララックスをやってみた。
巷で話題(?)のパララックスの原理・仕組みを知りたくて、フルスクラッチで書いてみた。
まぁ、実際には他のサイトのDOMの動きを見ながら、必要そうなところだけ切り出した感じです。
文字について
positionをfixedにしておく。
windowのscrollイベントにて、スクロール量を取得(scrollTop)、
それに係数をかけ、leftに設定する。
画像について
文字のdivとは別に、positionがfixedなdivを用意する。
その中に、画像を複数並べておく。
今回は、下から上がってくるようにしたいので、普通に並べました。
あとは、スクロール位置(dy)によって、div要素のtopを変更する。
animateは連続で呼ぶと、ダメだったはずなので、毎回stopを呼んでます。
あと、上方向にスクロールされることも考え、そのスクロール量でどこにいて欲しいかを再設定しています。(23行目とか)
感想
- 思った以上にめんどい。
- このぐらいの操作で、同じような記述を何回も書くことになっているので、まじめにやるなら、ライブラリを使うor作る必要がありそう。
- それぞれの要素のwidth, height、変更後のtopがてきとーな値を固定しているので、ウィンドウのリサイズなどで変になる可能性あり。そこらへんも、まじめにやるのはめんどくさそう。
- 一般的に大きな画像を何枚も使うことになるので、読み込みが完了するまでは、ロード中画面とかを出しといた方がいいんだろうなー。
- チューニングしないと、動きが気持ち悪い。。。
見つけたライブラリ
jarallax
http://www.jarallax.com/Parallax.js
https://github.com/wagerfield/parallax
iOS端末実機で動作させるために証明書などを準備する
前提
手順
ログイン状態で https://developer.apple.com/account/ios/certificate/certificateList.action にアクセスし、右上の"+"を押す。
今回はテスト用なので、下記のように、Developmentの「iOS App Development」を選択した状態でContinueを押す。
下記の画面が表示される。
手順に従い、「キーチェーンアクセス」を起動し、メニューより「キーチェーンアクセス」->「証明書アシスタント」->「認証局に証明書を要求...」を選択する。
証明書アシスタントが起動されるので、Apple Developer Programに登録したApple IDのメールアドレスと通称(多分、なんでもよい。今回はローマ字で自分の名前を入れた)を入力し、 「ディスクに保存」を選択後、「続ける」を押す。
下記の画面が表示されるので、「完了」を押す。
「キーチェーンアクセス」での操作が終わったので、ブラウザに戻り、「Continue」を押す。
「Choose File...」を押し、先ほど出力した「CertificateSigningRequest.certSigningRequest」を選択する。 そして、「Generate」を押す。
「Download」ボタンを押し、「ios_development.cer」を保存する。 「Done」を押す。
下記のように、表示される。
Finderにて、ダウンロードした「ios_development.cer」をダブルクリックする。 「証明書の追加」が表示されるので、キーチェーンを「ログイン」にし、「追加」を押す。 (注:「システム」とどっちが正しいかわかりませんでしたが、「ログイン」にしている人がネット上にいたので、「ログイン」にしておきました。)
Xcode(バージョンは5.0)を開き、該当のプロジェクトを選択する。 「General」タブの「Term」が「None」になっているはずなので、「Add an Account...」を選択する。
Apple Developer Programの際に作成したApple IDとパスワードを入力し、「Add」を押す。
左側の「Apple IDs」に入力したApple IDが表示されているので、それを選択する。 右下の「iOS」の下に「Agent」と表示される。 (注:1度、間違えて左下の"-"を押して削除し、再度、XCodeから「Add an Account...」を選択しました。1回めで、「Agent」が出ていなかったような気もします。)
Xcodeに戻ると、「Term」の選択肢として、先ほど入力したApple IDが表示されるので、それを選択する。 その後、「Fix issue」を押すと、読み込みが始まるので、数分待つ。
「Fix issue」ボタンと警告文が消えるので、左上のプルダウンから、端末(XXXのiPod touchなど)を選択し、左側の再生ボタンを押す。
端末にインストールされ、アプリが実行出来ました。
感想
- 操作がちょーながい、めんどい
- 実機だからか、iOS7だからか、レイアウトがめちゃくちゃになってるorz
- 画像をたくさん使った記事を書くのはめんどい(求む:楽な方法)
- Markdown記法は楽
- iPod touchを開発用として登録する?デバイス登録?をした覚えがないけど、動いた
- あとは、PUSH通知用の証明書を作ってー、production用の証明書作ってー、そのPUSH通知の証明書つくってー、って感じ?めんどい
- 「Certificates, Identifiers & Profiles」になった?あとの記事があんまり無かった
- Xcode5での記事もあんまり無かった
宣伝
iOS用の詰め共円を作成中です。来月には公開できるかな、と思います。。。
Androidの方はGoogle Playからダウンロードしてください。
PCや、ブラウザでやりたい方は、こちらにて。
プログラミング生放送勉強会第25回@品川に参加しました。
Windows ストア アプリケーションのUIデザイン
- UX
- ユーザビリティテスト
- マニュアルは読まれない前提でUIを作る
Modern Style
- Metroと呼ばれていたもの
- 10フィート離れたところからリモコンで操作出来るように
- 日本の地下鉄は複雑だけど、路線図を見れば、なんとなくわかる→Metro UI
Application Design
- タブレットのデザインは難しい
→広い、統一できない、まとまらない - コンテンツが最優先
そぎ落とす
- Crome(余計な装飾・今使わないメニュー)は要らない
- 左上は一番重要
→コンテンツを置くべき - RSSリーダーに、3つもペインは必要ない。人間は一度にそんなに情報を処理できない。
- 重複なアイコン→共通メニュー(アプリバー)
- ほんとうに、今、これが必要なのかを考えて作る
- デベロッパーはデザイナーの下僕です。
構造とリズム
- タイポグラフィ
- 非デザイナーがなんとなく作って、なんとなくかっこ悪いのはルールがないから
- フォントも4つに絞る(9pt, 11pt, 20pt, 42pt)
- 文字サイズを大きくすると、細いフォントを利用する
- グリッド
- 1unit = 20px x 20px
- 1sub unit = 5px x 5px
軽快に、滑らかに
- ビジュアルなフィードバック
- スプラッシュスクリーンの本当の意味は、起動にかかる時間をごまかすため
- 5mm なら、30回に1回ぐらいタップミスする
- 7mm なら、100回に1回ぐらいタップミスする(だいたい大丈夫)
デザインガイドラインをぜひ見てください(MSDNのUXパターン)
Leap Motion ではじめるNUIプログラミング
NUI概要
- Project Natal(のちのKINECT)
- 3D深度センサー・RGBカメラ・マルチアレイマイク
Leap Motion概要
- 様々な言語で開発可能
- デモアプリがかっこいい
C#によるLeap Motionプログラミング
- センサーの視界領域にある手や指を追跡
- Controller, Listener などのクラスが用意されている
- PUSH形式とPULL形式のデータ取得が可能
- ListenerのOnFrameでFrameを取得して操作する
- Gestureは4種類
- onFrameはすごい勢いで呼び出される(秒間数十?)
- InteractionBoxクラス(箱状の領域を設ける)
ソフトウェアアーキテクチャの求め方
結局何を決めなければいけないのか?
- アーキテクチャという言葉の定義に「万人の合意」は存在しない
- 複雑さへの対処
- 整理・細分化を行う→「関心事の分離」
- 開発や運用が容易な大きさの集合に分解する
- モジュール化・カプセル化
再利用可能は必須ではない
設計パターンを用いた分離
- 設計パターンといわれるものは、本質をつかみづらい
用語の誤認と誤った情報が配信されているため - 関心事を分離する視点そのものが、いわゆる設計パターン
切った結果ではない
→サンプルコードから読み取ることは不可能 - 設計パターン→設計視点
実際の分離で使用する視点の例
- Presentation Domain Separation(PDS)
- 分離したいのは、プレゼンテーション部分は他のコードと別の知識・制約がかかるから
- 次の入力フォーカスをどこに置くべきかは、Domain側に書くべき
- 資料:「GUIアーキテクチャの基礎からMVVMパターンへ」
PDSとは、アプリケーション全体から「PresentationPlatform関連」を分離する「視点」
Domain Logic Pattern
- アプリケーションの状態の持ち方の特性で大きく分かれる
- TransactionScript or Domain Model
- 資料:「Modelの中身 - ドメインロジックパターン」
- TransactionScriptが有用な場面ではDRY原則は原則ではなくなる
DomainModelで継承してると、仕様変更で継承関係が変わってしまうと大変になる
大きな食べ物を順々に切り分けていく間隔
前のステップでの切り方によって、次のステップの切り方は変わってくる
まとめ
- すべては「関心ごとの分離」に通ず
- 「設計パターン」って言葉よくないよ!
- 大体いつも使う知見:PDS(MVC系の裏), Domain Logic Pattern
- なぜそうしたいのか?なぜこれが必要になったのか?から考え直す
- どこにも載ってない情報は自分で考えるしかない
Visual C++ は C++10.8 ←イマココ
delegating constructor
uniformed initialization
- "()"ではなく、"{}"でコンストラクタを呼び出す
cplx c0(); では、関数宣言になってしまう
initializer_list
- initializer_list という型の定義
追加・挿入・変更できないコンテナ
initializer_list<int li { 1, 2, 3 };
explicit conversion operator
- 暗黙の変換を抑止する "explicit"がないと、加算出来たりする
LT
@ZuQ9Nn 自作アプリの宣伝
- 虹人間カメラ - RainbowMainCamera
- あざとい感じのアプリ名
- なんの成果も得られませんでした
- 初日1桁DL
残念な原因 - アプリの説明がわかりにくい - 宣伝を全くしなかった - 露出が少なすぎるために、存在していないのと同じ
- 現在、App Storeのランキングはお金で買える
→個人が趣味で作って上位になるのは大変難しい
@@ww24 FlashAir x Node.js
@_kz6 Javaを勉強してわかったこと
@azyobuzin イカすJava Xtendの話
- Java嫌い
- 一般的な高校生には理解できない
- Java1.5相当に変換される
- Eclipseのプラグイン
- ラムダ式
- 拡張メソッド
- プロパティ
- null 処理
- No Statements
- 型推論
- defで戻り値の型を書かなくて良い
- ドキュメントに書いてあっても出来ないこともある
- それでもJavaよりまし
@mikan_x コミックマーケットでの携帯電話のお話
- いつも電波悪いよね
- C84では改善された
- 以前まではau, docomoが厳しかった
- 201THを使え(衛星電話高い)
- emobileはユーザが少ないから最強
- 電波が無いなら、迷子にならないで
- 将来的にwebカタログが使えるかも
@shinoblogavi お絵かきツールとしての Blend と Power Point
- パスで描く
- 部品管理とグループ化は大事
- 図形の結合
- トリミング・図形貼り付け・半透明化
- パワポまじ凄い
@daruyanagi プロ生ちゃんの声をアプリに組み込もう
- Expressでも使える
感想
- MSはUI/UXに頑張ってる
- Leap Motionすごい。欲しい。
- ソフトウェアアーキテクチャを考えるためには、視点を学ぶ必要がある
- gloops はアーキテクチャをしっかり考えて作ってるっぽい
- C++、言語としては残念
- FlashAirすごい
- PowerPointまじすごい。絵を描ける
- プロ生ちゃんって、結局なんだったのだろう(ぇ
第一回 納涼もんご祭りに参加しました
参加したセッション
話を聞いた・パンフ貰ったブース
- 「さくらのクラウド」デモ
- ソーラーパネル、どこへ置く?
- もんごの薄い本
- CodeIQ
- co-meetingのご紹介
MongoDBについての感想
- アプリケーションを作るのに便利な機能が備わっている
- 特に、地理空間インデックスはハマれば強そう
- レプリケーション・シャーディングが簡単そう
- スキーマレス
- migrationが不要なのはいいけど、管理が難しそう
- SQLライクな動的クエリが便利そう
- ただし、性能はどのぐらい?オンラインの取得に使えるレベル?
- トランザクションが無いので、割り切りが必要
- ミッションクリティカルな分野では使えない
- 書き込み性能より読み込み性能を重視している
- 普通に運用しようと思ったら、3台必要なのかな。。。
- WEBサーバにセカンダリ・プライマリサーバ・hiddenなセカンダリサーバ ってのが事実上の最小構成?
あれ、そういえば、参加受付ってどこにあったの・・・?
ふつうのエンジニアの情報収集法
会社の後輩に、どーやってそういう(エンジニア的な)情報を集めてるのか聞かれたので、
自分の中での整理のためにも書いてみる。
下準備
Twitterで、それ系の発言をしている人をフォローする。
→そこで発言している人たちをフォローしていく
http://tagamidaiki.com/tech-twitter10/ とか出てくるので、気になったらフォロー。
- twitterがおすすめユーザを表示してくれる
https://twitter.com/who_to_follow/suggestions
後述するサービスでリンクを集めてくれるため、URLを含んでつぶやいている人多めの方がよいと思います。
数百人レベルでフォローしちゃえばいいと思います。
ただ、タイムラインは読めたものではなくなる(流速的に)と思います。
はてなブックマーク - マイホットエントリー
http://b.hatena.ne.jp/
http://bookmark.hatenastaff.com/entry/2013/05/08/131308
はてなのIDと、Twitter・Facebookを連携させる。
朝9時(通勤時間前)にメールを送信するようにする。
→電車の中とか、会社着いてから読む
→一通り読んだらメールを削除(未読・既読管理)
→あとで利用できそうな内容だったら、はてブでブックマークしておく(Twitter連携もしておくと、それ系のフォロワーが増えるかも)
物足りなかったら、「テクノロジー」タブを眺める。
Gunosy
http://gunosy.com/
Facebook・Twitter・はてなのアカウントと連携させる。
「日々のまとめメールを配信する」にはチェックを入れておく。
→一通り読んだらメールを削除(未読・既読管理)
リンクを踏んだものを学習してくれるようなので、気になったものだけリンクを踏む。
昼休みに読む。
http://getpocket.com/
はてな・Gunosyで気になったけど、そのとき時間がなくて読めないものを突っ込んでおく。
Read It Now(https://play.google.com/store/apps/details?id=hm.orz.chaos114.android.readitnow&hl=ja)にて、
state = unread
sort = oldest
のウィジェットを作って、読み終わったら delete or archive しておく。
(ウィジェットに表示される数字を0に保つ気概で)
RSS
上記で様々なサイトを見ていく中で、自分の興味ある分野の記事を多数書いている人がいれば、RSSを配信していないか調べる。
配信している場合、RSSリーダーに突っ込み、新着を読む。
自分の場合は、RocketSS(http://rsspocket.appspot.com/ )にRSSのURLを突っ込んで、自動的にPocketに保存されるようにしている。
その他(暇な時)
Qiita
Forkwell
電子書籍
一つの言語・フレームワークなどの一通りの情報を抑えたかったら、本を読むのは手っ取り早いと思う。
電子書籍なら、タブレット(AQUOS PAD)一台で、何冊でも持ち歩けるので便利。
- 達人出版会 http://tatsu-zine.com/
- O'Reilly http://www.oreilly.co.jp/ebook/
- オーム社 http://estore.ohmsha.co.jp/titles
- 技術評論社 https://gihyo.jp/dp
(Advent Calendar以外にめぼしいものは無いかも。。。)
※実話ですが、ステマでもありますw
rbenvをインストール
環境:Mac OS X 10.8.4
rbenvのインストール
基本、下記の通り。
https://github.com/sstephenson/rbenv
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
その後、書いてある通り、ruby-buildを入れる。
https://github.com/sstephenson/ruby-build
ちなみに、入ってないと、rbenv installってやっても
rbenv: no such command `install'
てエラーが出る。
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
これで、下記のコマンドが実行できる
rbenv install -l
2.0.0-p247 ってのがあったので、それをインストールする。
rbenv install 2.0.0-p247 rbenv rehash rbenv global 2.0.0-p247
下記も参考にしました。
http://rochefort.hatenablog.com/entry/20121015/p1
http://qiita.com/sifue/items/b7d252b18ebbae636fa9