2015年7月10日金曜日

ユーザー認証APIを通した後、同一セッションとしてUIWebViewを表示する

最近「やれSSLだー」「やれHTTP通信だー」と調べまわっていたのはこの辺がやりたかったからでした。
Qiitaにまとめましたのでなにか間違い等ありましたらご指摘ください。

【Swift】ユーザー認証APIを通した後、同一セッションとしてUIWebViewを表示する
http://qiita.com/ktanaka117/items/e4921f061f6522ed5a63

2015年7月4日土曜日

【2015/07/04更新】実績まとめ

受賞歴や仕事、開発したアプリやその他など。

受賞歴


仕事


アプリ


イベント運営


その他

2015年6月18日木曜日

SSL通信について調べてみた

こんにちは、田中です。
セキュアな通信がしたかったのでSSLの仕組みについて調べてみました。
以下参考にしたサイトです。
図解で学ぶネットワークの基礎:SSL編


SSLとは

暗号通信のこと。Secure Sockets Layerの略。
SSLでしたいことは大きく二つ。
1.クライアントとサーバー間でやり取りするデータを暗号化したい
2.やりとりする先のサーバーが偽のサーバーでないかどうか判別したい
実際は1のみで良い気がしますが、通信の途中でデータをどこかで盗み見られたり改ざんされたりするリスクを少しでも減らすために2も行うことでより安全性を確保するようです。

1を行う仕組み

クライアントとサーバー間でのやり取りを暗号化する方法として共通鍵というものを使います。
共通鍵はクライアントとサーバー双方で同じものを持っており、この鍵を使うことによって暗号化されたデータを解読することが可能になります。

2を行う仕組み

やりとりする先のサーバーが偽のサーバーでないかどうかを判別する方法として、秘密鍵、公開鍵、サーバー証明書、ルート証明書というものを使います。
秘密鍵はサーバーが、公開鍵はクライアントが持ちます。この秘密鍵と公開鍵は対になっていて、それぞれが対になる鍵で暗号化されたデータを解読することができるようになっています。
しかし、これらの鍵は通常のSSLでデータをやりとりするための鍵ではなく、通常のデータのやりとりは共通鍵で行います。
じゃあ秘密鍵と公開鍵はどこで使うの?となりますが、これらの鍵はデータをやりとりするための共通鍵を交換するために使います。

共通鍵はサーバーからクライアントにサーバー証明書というものと一緒に送られます。
このサーバー証明書には著名や出どころなどの情報が記載されており、サーバーが信頼のおけるものであることを証明します。
しかしこのサーバー証明書もまだ偽装の余地があるため、サーバー証明書と一緒にルート証明書というものも送られます。
ルート証明書はサーバー管理者が認証局というところに申請して発行してもらった確実に身分を証明できる証明書のことで、サーバー証明書に著名した認証局の根本の証明書となります。
しかしクライアントからすればそのルート証明書も信頼出来るものか怪しいところがあります。
それを確認するために、クライアント側にはすでにあらかじめ信頼出来る認証局の証明書が複数インストールされています。
クライアントは送られてきたルート証明書と自身の持つ信頼のおける証明書を比較して、それらが一致した場合に初めて送られた共通鍵が信頼のおけるものだと判断します。

まとめ

どこかまだ認識が間違っているかもしれませんが、1と2のちょっと複雑な処理を行うことによってデータをセキュアにやりとりしてるんですね。
これは難しいわぁ...。
でもなんとなく流れはわかった気がするので、まとめて勉強する時間を持つのは大切ですね。

2015年6月17日水曜日

HTTP通信、セッションID、Cookieとキャッシュの違いなど調べてみた

こんにちは、田中です。
普段開発をしていてiOS側からだと単純に「GET, POSTなんかの概念があって、それを指定してやってパラメーターとか付け足して送ってやれば良い感じにAPIからデータがとれる」くらいの認識で、自分のネットワーク周りの知識はこのくらいでした。
が、最近知人と話をしていて「HTTPヘッダー部がほげほげで」やら「セッションIDがふがふがで」とか「Cookieにぴよぴよ」という話が出てきて理解の必要性を感じたので調べてみました。


HTTPヘッダーとは


以下のサイトを参考にさせていただきました。
[Web] HTTPリクエストの中身を学んでみた。GETやPOSTの違いなど
http(通信プロトコル)とは?httpの仕組みと、通信内容(リクエストヘッダとレスポンスヘッダ)の確認手順まとめ

こういうのがあるという存在は知っていましたが何者かは知りませんでした。
そもそもHTTPというのはクライアントからWebサーバーへの「リクエスト」と、Webサーバーからクライアントへの「レスポンス」という二つのやりとりで成り立つ通信プロトコルのこと。
HTTPリクエストはHTTPリクエスト行、HTTPヘッダ行、HTTPボディ部の三つで構成されています。
GET通信ではHTTPリクエスト行とHTTPヘッダ行で、POST通信では上記三つでリクエストが行われます。
上記三つがどのような構造で送受信が行われているかについては、参考URLにわかりやすい画像が貼ってあるので、そちらを参照のこと。


セッションIDとは


以下のサイトを参考にさせていただきました。
第8回:Cookieとセッション情報

そもそもセッションとは

Cookieがクライアントベースの仕組みなのに対してサーバーベースの仕組みで、クライアントに情報を保持するCookieに対してセッションはすべての情報をサーバー側で管理して、それらの情報は数分〜数時間程度しか保持されないのでセキュリティ的なメリットが大きい。なので、アプリケーションの挙動を左右する重要な情報を扱う場合はこのセッションを使う。

セッションIDというのはクライアントがサーバーにアクセスする際にサーバーから渡されるユーザを識別するためのキー情報のこと。クライアントがサーバーにアクセスするときはこのセッションIDをHTTPヘッダー部に組み込んで情報を送信するようです。

Cookieとは

セッションがサーバーベースの仕組みなのに対して、Cookieはクライアントベースの仕組みで、サーバーサイドからクライアントに対して書き込める小さなテキストのこと。クライアントはこのCookieを永続的に保持できて、この保持するデータは書き込み元のサーバーにリクエストする際にHTTPヘッダー部に組み込んで情報を送信するそうです。
このCookieはクライアントサイドで保持するデータなので改ざんされる可能性があります。そのためアプリケーションの挙動を左右する重要な情報を扱う場合はCookieでは扱いません。Cookieで主に扱うのは個人のユーザーIDやパスワードなど。(次回ログイン時のためにデータを保持しておく際など)


Cookieとキャッシュの違いって?


以下のサイトを参考にさせていただきました。
「キャッシュ」と「クッキー」の違い
情報をクライアント側で保持するというのであればキャッシュという仕組みもあるなぁと思ったので、じゃあCookieとの違いはなんなのか?とふと思ったのでこれについても調べてみました。

キャッシュとは

2回目以降にウェブページなどにアクセスする際にロードの時間を早くするために、画像などのデータをクライアント側に保持しておく仕組みのこと。


Cookieとは

2回目以降にログイン処理などを素早く行うためにID/パスワードなどのユーザー情報をクライアント側に保持しておく仕組みのこと。
(「次回からユーザー情報の入力を省略」などチェックボックスがあるようなやつ)


まとめ

HTTPの三つの構成、セッションとCookieの役割と仕組み、キャッシュとCookieの違いについて、ざっくりと認識できました。まだ脳みそへの定着が済んでないのでこの部分の話をするときに噛み砕く処理が必要になるけれど。
若干まだわからないのがセッションが具体的にどういう場合に利用されるのかというところ。ここに関してはまた調べたりしていきます。
あとiOSで扱うときにHTTPヘッダー部を見たり編集するにはどうするか、その中のセッションIDの取得とかをどうやるのかとかも今後使いそうなので調べていこうと思います。
とりあえず今回はここまで。

2015年5月1日金曜日

Swiftで0からスタートするiOS〜UIKitの使い方〜 第1回開催Done

こんにちは、田中です。
昨日4月30日に「仙台Swift勉強会 0からスタートするiOS〜UIKitの使い方〜」と題しましてデータコム株式会社さんの会場をお借りして勉強会を開催してきました。
この日はなんと14人もの方にご参加いただきました、満員御礼で感謝感激ありがとうございます!
嬉しい ✌ ('ω' ✌ )三 ✌ ('ω') ✌ 三( ✌ 'ω') ✌



今回の内容はiOS(Swift)初心者の方向けにSwiftでiOS開発を入門しよう!という内容でした。
今まで仙台Swift勉強会では文法について触れてきたりする回もございました。
しかし、今回はまずはわかりやすくiOSらしいUIKitの部分からみんなで写経しながらやってみようと思い、UILabel, UIImageView, UIButtonについて触れていきました。

勉強会資料はこんな感じです。




  • 各UIパーツの基本的な使い方
  • 実コード上だと規約的な部分でどこに気をつけるべきか
  • 実際にはUIパーツはあまりコードで書かないけど、入門としては手で書いていくことが、そのクラスにどんながプロパティがあるかなどの理解につながりやすいので、コピペは厳禁で写経!
  • Storyboardやxibがあるけど、仕事だとそこはデザイナーさんに作ってもらったりするの?

などなど、触れていきました。

スライドを作りながらコードを書いて事前準備をしていたのですが、普段「こうすればこうなる」という程度での理解だった部分を改めて言語化して人に説明しようとすると、やはり難しい。
「じゃあどうしてこうなるの?」という部分を掘り下げて調べておく必要が出てくるので、アウトプットの利点を再確認出来ました。
頭での理解はあっても、人に説明するレベルで噛み砕くことが出来るかというのも喋りには必要。訓練必須ですね。

今回ご参加下さった皆さまは普段から開発している方が多かったです。
「みなさん普段から開発なさってますよね?」って質問したら
「開発してない(してないとは言っていない)」
って言われましたが。
また、以前C#でアプリを作っていてという方や、新入社員としてObjective-CでiOS開発を始めましたという方もいらっしゃいました。
その他にも普段他の勉強会でお世話になっている方々にもご参加いただいたので気持ち的に余裕が出来たのと、質問など投げていただけたので進行をスムーズに行うことが出来ました、ありがとうございます!
お陰で発表する方もご覧の通り楽しくなってます。



今回入門ということで始めたので今後も何回か間をあけないようにして、UIKitの扱い方について触れていく勉強会を開催したいと思います。
次回は少し捻りを加えて問題形式でやるのも面白いかななんて思ってるので、興味のある方は是非ご参加ください!

P.S.
会津からもお声がけいただいたので、そちらでも勉強会開催するかもです!
お楽しみに!

2015年1月28日水曜日

実績まとめ

受賞歴や仕事の実績をまとめます。

受賞歴


仕事

2015年1月10日土曜日

Appleのファミリー共有を切ったらアプリがダウンロードできなくなった話

以前ファミリー共有が使えるようになってから早速家族で導入してみたのですが、クレジットカードの情報を登録した状態じゃないと使えないということだったので使用をやめて共有を切りました。
すると家族がダウンロードしたアプリが自分のアカウントの方でダウンロードできないという問題が発生しました。
対処法もわからず人柱という意味を噛み締めていたのですが、

設定 > iTunes & App Store > Apple ID > サインアウト

で一度サインアウトしたらダウンロードできるようになりました。

いろいろ調べたのですがパッと解決方法が見つからなかったのでメモしておきます。