モイ株式会社(ツイキャス)を退職しました
3年ちょい在籍したモイ社を退職しました。社員一桁の時に入社して、社員としては最年少だったのが、気付くと結構な古株になっていました。ユーザー数も400万から1800万になりました。
[退職]
言えそうな形に丸めてざっくりモイでやってきたことをまとめると、
- 一年目:
- 新モバイルWebの開発(主にフロントエンド)
- PR・採用・新機能マネージ
- 二年目:
- US・BRマネージ
- 三年目:
- アジア立ち上げ
- 韓国グロース
な感じでした。
次の取り組みとして、経営陣にこちらからかなり突飛な提案をさせてもらった返答に、新規事業の立ち上げPM(開発以外全部!!)を提案してもらって、かなり面白そうだったんですが、ちょうど開発に気持ちが向いていたタイミングでもあったので、諸々考えた上で退職を決めました。
特にぼくに経験があったわけでもない大きな仕事をまるっと任せる度量・文化?が経営陣にあって、これはぼくだけでなくて、エンジニアに関しても、一機能の開発をまるっと任せたり、ということが普通にありました。
実際このやり方で進めていくのはそれをマネジメントする側としてはとても難しいやり方で、どううまく回していくか、その人の力をいかに最大限に引き出すか、何よりその人にとって楽しく働いてもらうか、ということを考えて、時にはそのマネジメントスタイルがゆえの悩みがあったように思えます。が、従業員側としては、やる気ある分だけ、出来る限り意向に沿う仕事をまるっと任せてくれるので、非常に良い職場環境だと思います。
正直まだまだ課題山積、やること山積、可能性山積で、今期の計画もかなり面白いところが多いので、今からでも入社するのはありだと思います。
ぼくが退職するのは、今の自分の志向と会社の志向の現タイミングでのミスマッチなので、興味ある人は面接(実質、面談みたいな感じ)にチャレンジしてみると良いと思います。
[今後]
で、今後ですが、ダブルワークにトライします。
メルカリ ソウゾウ社
縁あって、メルカリ ソウゾウ社でお世話になることにしました。
大きい勝負を仕掛けて確度高く勝っていく、というのに携われればと思い決めました。個人開発会社
今面白い技術領域が多くて、作りたいものがたくさんあるので、小さな開発会社「Rapid Creation合同会社」を作ります。
こちらでは、エッジの効いたサービスをとにかく素早くローンチします。
:pray:
この3年ちょっとは本当に猛烈にやってきた分思い入れがあって、「感謝の気持ち」に思わずファウンダー3人のTシャツを作ってしまいました。
(集合写真良い感じだったけど、削除要請が確実に来る気がするので割愛w)
本当に色々任せてもらい、大変なこともありましたが、めちゃくちゃ濃い時間を過ごさせてもらいました。モイには感謝してます。お世話になりました、ありがとうございました!!!!!!!!!
[PR]
ということで、最後にできることとしての採用PRです。
- モイ社サイト採用ページ
- 少し情報が古くなってきてますがw、ぼくはこのページを見て、プロダクト愛を持って開発・運用してる様子を感じ取って申し込みしました。
- Wantedlyでの募集
- 同時1万配信!ツイキャスを支えるエンジニア Wanted!
- リモートで大規模サービスの開発に携わりたいエンジニア募集中
- ライブ配信領域では世界トップクラスの技術ノウハウがあって、本番投入でさらに磨いてるので、かなり面白いと思います。アプリケーション側はできることがまだまだあり過ぎるので、少しでも興味持ったら、とりあえず話聞いてみるのおすすめします。
- ライブ配信サイト・ツイキャスのコミュニティを支えるユーザーサポート募集
- CSも募集してます。実はCS神みたいな人が複数人いて、モイで経験積めばどこでも重宝されるようになると思います。あとはやる気次第で、企画や新機能運用などにも携わることができます。
- ツイキャスサマーインターン(2017)
- 初の試みで、学生立場からすると完全にお得&穴場案件なので、学生なら即申込みおすすめ。
メルカリ・ソウゾウ、Rapid Creationの方に興味がある方もお気軽にお声がけください。
例のリンク
https://www.amazon.co.jp/gp/registry/wishlist/HULMTPB0N5BC/ref=cm_wl_list_o_2?www.amazon.co.jp
ツイキャス主専用マッチングiOSアプリ「キャスコン」をつくってリリースしてみた
今年1月くらいにツイキャス新APIが公開され、それに伴って先日開かれたツイキャスハッカソンを遠くから見ていて感化されてしまい、ついかっとなって作って、リリースしました。 ツイキャスAPIを使ったものだったらネタは何でも良かったんですが、ツイキャス主が配信をしていない配信外の時間に新しいキャス主を見つけて仲良くなってもらえるといいかなと思って、マッチングアプリにしてみました。
キャスコン
構成
- Swift3
- Firebase
- Node.js
開発中のトピック
ツイキャスAPI
ツイキャスアカウントでログインして、ユーザーのプロフィールや過去の配信画像を取得するのに利用しました。APIv2はまだベータ版で、これからも更新ありそうな気がするけど、ツイキャス配信用のURL(RTMP)を取得できたり、新着のライブをリアルタイムに WebSocket 経由で取得もできたりと、実はできること結構あって作れるモノの幅は広いと思うのでオススメです。[PR]
Firebase Authentication
Firebase認証では、
に対応していて、今回はツイキャスでログインを実装するために、カスタム認証を利用しました。ツイキャスのアクセストークンの検証と、ユーザーに対応するFirebaseカスタム認証トークンを生成するために別途サーバーが必要になるので、nodeでサーバーを立てて対応しました。(カスタム認証でない場合は必要ありません)
Firebase AuthでLINEログインを実装した記事があったので、そちらを参考にさせてもらいました。 Authenticate your Firebase users with LINE Login
ちなみに、今回やりたいことをやるためには、サーバー側に管理者権限のあるFirebase admin
SDKを入れる必要があり、サービスSDKの方を入れてて少しハマりました…
サーバーに Firebase Admin SDK を追加する
Firebase Realtime Database
アプリのチャットやマッチ機能を実装するのに利用しました。Firebase Realtime DatabaseはNoSQLデータベースで、あまりしっかり使ったことがなかったので、先にwebアプリとして実装してから、それをベースにアプリに適応しました。 非同期でデータを取るのに適していて、チャットなどはかなり楽に実装できました。
// messageをリッスンして取得する let handleRef = messageRef.observe(.childAdded, with: { (snapshot) in let messageDict = snapshot.value as? [String: Any]
不安があるとすれば、Firebase Status Dashboardを見ると、ちょいちょい気軽に落ちたりしてることですかね…
Firebase Cloud Messaging
通知機能もFirebaseにあるということで使ってみました。別途サーバーを立てる必要があるのですが、使い勝手は良かったかなと思います。
(細かいですが、通知を送る際に、priorityをhighにしておかないとバックグラウンドへ行った時に通知が届かない
というのは少しわかりにくかったです。)
あと、Firebaseのコンソールから端末やグループに通知を送れる機能も使えます。
サービスとしては良かったんですが、APNs 証明書をFirebaseにアップロードできない
というバグがあって、サポートに連絡して対応してもらったのですが、解決に3週間くらいかかってて、そこはつらみありました。
OneSignal
結局Firebaseサポートの解決を待てなかったので、評判の良さそうなOneSignalを使いました。 完全無料で、APNs証明書周りの取得・アップロードも自動化を試みていたりと、良い感じです。コンソールから通知送れる機能や、通知のA/Bテスト機能もあります。アプリを入れてる端末名称・国・アプリバージョンなども取れるので、それを元にセグメント化して通知の使い分けもできます。
Firebase Analytics
イベント取得やコホート、セッション、エンゲージメントと一通りデータを取れます。BigQueryとつなげることで、より使い勝手がよくなる模様ですが、これからいじってみようと思います。
その他
ここ1,2年、仕事ではビジネス側のマネジャー業務をやっており、swiftは初学者でしたが、早く出すぞの精神でアプリ開発自体は3週間くらいでできたのですが、アプリ初心者にとっての難関はアップルの審査でした。(早く出すぞの精神が裏目に出て、抜け漏れがありました…)リジェクトされること複数回、約6週間後にやっと審査が通りました。代表的なリジェクト理由を挙げますと、
1. アプリタイトルに価格に言及したものを含めてはいけない
例によって、アプリタイトルに「無料」とか入れてたんですが、審査でダメになったみたいですね。Twitterでも報告してる方がちらほらいました。
アプリ名称に「無料」が含まれるという事でリジェクトされた件、Appleの審査部門に電話しました。先方の説明としては下記4点の趣旨でした。
— 櫻田晋一 アプリ開発会社9期目TL35黄 (@sakuradasb) March 15, 2017
1)直近、審査基準にアップデートがあり、無料等の価格を含められなくなった。
2. IPv6対応できてないぞ
ログイン認証や通知でAPI叩いてるところのサーバー側で、IPv6対応できてませんでした。自サーバーの方は大人しくすぐ対応したのですが、利用しているツイキャスAPI側はIPv6対応されていないけど、IPv6環境でアプリを試してみるとたしかに正しく動作したり、とちょっとよくわかっていません。
3. User-Generated Contentの対応をしなければならない
規約だとこちらですね。 1.2 ユーザー生成コンテンツ ユーザーがコンテンツを投稿できるアプリの場合はこの基準を満たしていないといけないということですね。
- 利用規約を用意
- 通報・ブロック機能を実装
- 通報・ブロックを即時キャッチできる管理画面を作成
で、対応しました。
まとめ
色々初めてのものを実装してみて楽しかったです。 需要があれば、改善もしようと思うので、良かったらアプリ試してみて下さい。 キャスコン
【Xcode8】ビルドが成功しているのにiOSシュミレータが起動しないときの対処法
原因
- Runの設定「Executable」が「None」になっている
対応
- 左上の△のRunボタンをoption押しながら、クリック。
- 設定画面出て来るので、Run->InfoのExecutableがNoneになってるところを、プロジェクト名に変更する。
Done
参考
IPv6に対応する(さくらVPS-CentOS6, お名前.com)
環境
対応
事前チェック
自分のサイトがIPv6に対応してるかチェックできるサイト。
Is your site IPv6 ready?
- DNS (IPv6 AAAA Record)
- IPv6 Connectivity
でFAILしてるのを確認。
最近立ち上げたさくらのVPSだとすでにIPv6のある程度の対応されているみたい。
$ ifconfig -a # で、eth0のところのinet6 addrがScope:LinkとGlobalもあれば一応対応されている
$ ping6 2001:XX:XX:XX:XX:XX:XX:XX # 対応されてる場合はこれで返ってくる
対応されている場合でも、
wget -6 hogehoge.com # -6はipv6での接続 (-6, --inet6-only connect only to IPv6 addresses.)
たぶんこれでconnection refuseされる。
IPv6 AAAA レコード対応
お名前.comでログイン後、「ドメイン設定」→「ネームサーバーの設定」→「DNS関連機能の設定」→対象ドメインを選択して「次へ進む」→「DNSレコード設定を利用する」
ここでAAAA Typeの、ValueにはIPv6のアドレスを入れて追加して保存する。
(サイトわかりにく(ry…)
で、対応されたら、上のサイト(ready.chair6.net)でチェックする。PASSと出るはず。
IPv6 Connectivity対応
実は上記の対応だけでこれもチェックPASSする場合もある気がする。
わたしはここに習って設定反映したら、逆に通らなくなったがw (二重設定してる部分が原因だったorz)
IPv6アドレスの設定方法 – さくらのサポート情報
結局書いたのは、
$ vim /etc/sysconfig/network NETWORKING_IPV6="yes" IPV6_AUTOCONF=no を追加
と
$ vim /etc/sysconfig/network-scripts/ifcfg-eth0 元々以下が書かれていたので一点だけちょっと修正したのみ。 DEVICE="eth0" BOOTPROTO="static" DNS1="XXX.XXX.XXX.XX" DNS2="XXX.XXX.XXX.XX" DNS3="2001.XXX.XXX.XX" GATEWAY="XXX.XX.XX.X" HWADDR="XXX.XXX.XXX.XX" IPADDR="XXX.XXX.XXX.XX" IPV6ADDR="XXX.XXX.XXX.XX/64" # ここに/64を追加 IPV6INIT="yes" IPV6_AUTOCONF="no" IPV6_DEFAULTGW="fe80::1%eth0" MTU="OOO" NETMASK="XXX.XXX.XXX.XX" NM_CONTROLLED="yes" ONBOOT="yes" TYPE="Ethernet" UUID="OOOOOOOOOO"
上記対応したら、
$ service network restart
で確認
$ ifconfig -a # inet6 addrがScope:Globalも出てること確認 $ netstat -rnA inet6 # ::/0で、fe80::1になってること確認 $ ping6 2001:XX:XX:XX:XX:XX:XX:XX(ipv6のアドレス) # 返ってくること確認
あとは、サイトで両方PASSしてることを確認。 あと、
$ wget -6 hogehoge.com # これで結果返ってくることを確認
開通はこれでOK。
ip6tablesの設定
iptablesはipv4の方なので、別途ip6tablesを対応しないといけない。
$ chkconfig ip6tables --list # 3:onになってたら自動起動設定されてる $ vim /etc/sysconfig/ip6tables # httpとhttpsだけあけとく *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited COMMIT $ /etc/init.d/ip6tables restart
OK
参考:
- https://serversmanvps.xn–ockc3f5a.com/2016/01/04/%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AEipv6%E5%8C%96%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F
(↑リンク飛ばねぇ…URLコピペしたら見れる…)
- 俺の知っているコマンドがIPv6で使えないわけがない|サイバーエージェント 公式エンジニアブログ
- 4ステップでWebサーバをIPv6に対応させる方法(2/3) − @IT
- CentOS に ip6tables の設定を行う(IPv6) | Webセキュリティの小部屋
Apache動いてるCentosにnode入れてnodeも動かす
環境
node入れる
nodeのサイトを見ると6.xバージョンが現在安定版ぽいので、そちらを入れる。
$ sudo su $ curl --silent --location https://rpm.nodesource.com/setup_6.x | bash - $ yum -y install nodejs $ yum install gcc-c++ make $ node -v // 確認 $ npm -v // 確認
参考: パッケージマネージャを利用した Node.js のインストール | Node.js
node動かしてみる
$ mkdir nodeApp $ cd nodeApp $ npm init $ npm install express --save // express入れて動かす $ vim app.js // expressのhello worldのコード書いとく $ ln -s ~/nodeApp /var/www/node // /var/www側にリンク貼る $ node /var/www/node/app.js // 動かす
apacheからnodeへproxyする
/etc/httpd/conf.d/node.conf
に書くのもあるっぽいけど、今回は
/etc/httpd/conf/httpd.conf
に
<IfModule mod_proxy.c> ProxyPass /nodeApp http://127.0.0.1:3000 ProxyPassReverse /nodeApp http://127.0.0.1:3000 </IfModule>
書いとく。この中にdeny, allow制限してもいいけど、今回はそのまま。
*注:上の設定のポート3000の後ろに/
を付けてると、ルートはうまく表示されるけど、ルート以下の他のパスがうまく表示されなくなるので注意。
設定を反映、
$ service httpd restart
で、アクセスで確認!が、503エラー、、、、error_logには
[Mon Jan 23 17:43:43 2017] [error] (13)Permission denied: proxy: HTTP: attempt to connect to 127.0.0.1:3000 (localhost) failed [Mon Jan 23 17:43:43 2017] [error] ap_proxy_connect_backend disabling worker for (localhost)
で、selinuxあたりで限定されてるらしい。
参考:
・Linux:CentOS6でmod_proxyが動かない - HiiHahWIKI - making some notes for... -
・Apache Mod_proxy '[Error] (13)Permission Denied' Error on RHEL - SysAdmin's Journey
$ sestatus -b | grep httpd // 設定を確認
たしかにhttpd_can_network_connect
がoff
になっている。これをon
にする。
$ /usr/sbin/setsebool -P httpd_can_network_connect 1 $ service httpd restart $ sestatus -b | grep httpd // onになってるの確認
これでアクセスすると、ちゃんとアクセスできた。OK
おまけ
node動かすのに、forever使って常駐させる。
www.npmjs.com
$ npm install forever -g $ forever start app.js