mazeltov7のweb断片

備忘録的なテキトーなことを書きます。(技術記事はQiitaに移行しました http://qiita.com/mazeltov7 )

モイ株式会社(ツイキャス)を退職しました

3年ちょい在籍したモイ社を退職しました。社員一桁の時に入社して、社員としては最年少だったのが、気付くと結構な古株になっていました。ユーザー数も400万から1800万になりました。

[退職]

言えそうな形に丸めてざっくりモイでやってきたことをまとめると、

  • 一年目:
    • 新モバイルWebの開発(主にフロントエンド)
    • PR・採用・新機能マネージ
  • 二年目:
    • US・BRマネージ
  • 三年目:
    • アジア立ち上げ
    • 韓国グロース

な感じでした。

次の取り組みとして、経営陣にこちらからかなり突飛な提案をさせてもらった返答に、新規事業の立ち上げPM(開発以外全部!!)を提案してもらって、かなり面白そうだったんですが、ちょうど開発に気持ちが向いていたタイミングでもあったので、諸々考えた上で退職を決めました。

特にぼくに経験があったわけでもない大きな仕事をまるっと任せる度量・文化?が経営陣にあって、これはぼくだけでなくて、エンジニアに関しても、一機能の開発をまるっと任せたり、ということが普通にありました。
実際このやり方で進めていくのはそれをマネジメントする側としてはとても難しいやり方で、どううまく回していくか、その人の力をいかに最大限に引き出すか、何よりその人にとって楽しく働いてもらうか、ということを考えて、時にはそのマネジメントスタイルがゆえの悩みがあったように思えます。が、従業員側としては、やる気ある分だけ、出来る限り意向に沿う仕事をまるっと任せてくれるので、非常に良い職場環境だと思います。

正直まだまだ課題山積、やること山積、可能性山積で、今期の計画もかなり面白いところが多いので、今からでも入社するのはありだと思います。
ぼくが退職するのは、今の自分の志向と会社の志向の現タイミングでのミスマッチなので、興味ある人は面接(実質、面談みたいな感じ)にチャレンジしてみると良いと思います。

[今後]

で、今後ですが、ダブルワークにトライします。

  1. メルカリ ソウゾウ社
    縁あって、メルカリ ソウゾウ社でお世話になることにしました。
    大きい勝負を仕掛けて確度高く勝っていく、というのに携われればと思い決めました。

  2. 個人開発会社
    今面白い技術領域が多くて、作りたいものがたくさんあるので、小さな開発会社「Rapid Creation合同会社」を作りました。
    こちらでは、エッジの効いたサービスをとにかく素早くローンチします。

:pray:

この3年ちょっとは本当に猛烈にやってきた分思い入れがあって、「感謝の気持ち」に思わずファウンダー3人のTシャツを作ってしまいました。

(集合写真良い感じだったけど、削除要請が確実に来る気がするので割愛w)

本当に色々任せてもらい、大変なこともありましたが、めちゃくちゃ濃い時間を過ごさせてもらいました。モイには感謝してます。お世話になりました、ありがとうございました!!!!!!!!!

[PR]

ということで、最後にできることとしての採用PRです。

メルカリ・ソウゾウ、Rapid Creationの方に興味がある方もお気軽にお声がけください。

例のリンク

www.amazon.co.jp

ツイキャス主専用マッチングiOSアプリ「キャスコン」をつくってリリースしてみた

今年1月くらいにツイキャス新APIが公開され、それに伴って先日開かれたツイキャスハッカソンを遠くから見ていて感化されてしまい、ついかっとなって作って、リリースしましたツイキャスAPIを使ったものだったらネタは何でも良かったんですが、ツイキャス主が配信をしていない配信外の時間に新しいキャス主を見つけて仲良くなってもらえるといいかなと思って、マッチングアプリにしてみました。

キャスコン

f:id:mazeltov7:20170323122414p:plain

ダウンロードはこちら

構成

  • 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でも報告してる方がちらほらいました。

2. IPv6対応できてないぞ

ログイン認証や通知でAPI叩いてるところのサーバー側で、IPv6対応できてませんでした。自サーバーの方は大人しくすぐ対応したのですが、利用しているツイキャスAPI側はIPv6対応されていないけど、IPv6環境でアプリを試してみるとたしかに正しく動作したり、とちょっとよくわかっていません。

3. User-Generated Contentの対応をしなければならない

規約だとこちらですね。 1.2 ユーザー生成コンテンツ ユーザーがコンテンツを投稿できるアプリの場合はこの基準を満たしていないといけないということですね。

  • 利用規約を用意
  • 通報・ブロック機能を実装
  • 通報・ブロックを即時キャッチできる管理画面を作成

で、対応しました。

まとめ

色々初めてのものを実装してみて楽しかったです。 需要があれば、改善もしようと思うので、良かったらアプリ試してみて下さい。 キャスコン

【Xcode8】ビルドが成功しているのにiOSシュミレータが起動しないときの対処法

原因

  • Runの設定「Executable」が「None」になっている

対応

  1. 左上の△のRunボタンをoption押しながら、クリック。
  2. 設定画面出て来るので、Run->InfoのExecutableがNoneになってるところを、プロジェクト名に変更する。

Done

参考

IPv6に対応する(さくらVPS-CentOS6, お名前.com)

環境

  • OS:CentOS6.8(さくらVPS
  • ドメイン:お名前.com すでにIPv4で動いてるのを対応させる。

対応

事前チェック

自分のサイトがIPv6に対応してるかチェックできるサイト。
Is your site IPv6 ready?
- DNS (IPv6 AAAA Record)
- IPv6 Connectivity
でFAILしてるのを確認。

最近立ち上げたさくらのVPSだとすでにIPv6のある程度の対応されているみたい。

$ ifconfig -a
# で、eth0のところのinet6 addrがScope:LinkとGlobalもあれば一応対応されている

IPv6のアドレスを一応pingで確認

$ 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の設定

iptablesipv4の方なので、別途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セキュリティの小部屋

iosストア審査申請のメモ

毎度面倒なのでメモしておく。

以上

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_connectoffになっている。これを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

xcode8のデバッグエリアのノイズを消してすっきりさせる

xcode8でAPI叩くとか通信系の対応してるとデバッグエリアになんか色々ノイズが入ってくる。
f:id:mazeltov7:20170118192346p:plain

特に重要そうでもない?ので、できれば消したい。

解決

Xcodeで、Product>Scheme>Edit Schemeを選択、RUNEnvironment VariablesOS_ACTIVITY_MODE: disableに設定する。
で、再度確認すると綺麗に消えてる!