KotlinFest2018に参加しました!

先日8月25日に行われたKotlinFest2018に参加したので、感想をまとめたいと思います。 kotlin.connpass.com

オープニングセッション

Kotlinエバンジェリストの長澤太郎さんと、藤原聖さんによるオープニングセッション。
お二人とも非常に愛を感じる内容でした!今回のテーマ「Kotlinを愛でよう」は、Kotlinインアクション第2章のタイトルにもなっている言葉です。原著ではEmbracing Kotlin(Kotlinを抱きしめよう)となっていたものを、苦労して翻訳されたそうで、愛の深さを感じました。 speakerdeck.com

Kotlinもう一歩

森洋之さんによる、Kotlin初心者に向けたセッション。
タイプ、ジェネリクス、変位の話を具体的なコードを交え聞くことができました。
最後、発表時間が余った際の、実はまだ40P程隠しています。には笑いましたw

speakerdeck.com

Kotlinアプリのリファクタリングポイント

中里直人さんによる、Kotlinでアプリを作成していくためのTipsを8つ紹介して頂くセッション。
実際に開発を行っている目線でのお話が聞けて非常に参考になりました。「こういうコードを書いていたので、こういう現象が発生してしまいました。だからこうしたほうがいいと思います。」というのは実際に開発を進めないと語れないよなーという。
自分で開発を進める際に是非見返したい。

www.slideshare.net

start from Convert to Kotlin

望月美帆さんによる、JavaFile To KotlinFileのセッション。
Javaでは長大になっていたコードが、Kotlinの機能を使用してどんどんコンパクトになっていく様は気持ちよかった!JavaからKotlinには簡単にコンバートできそうに見えて実はそうではなく、トラップが多いので言語仕様を理解しておくことが非常に大事だなぁと感じた。

speakerdeck.com

Kotlin コルーチンを理解しよう

八木俊広さんによる、はーなるほどね、コルーチン完全に理解したってなれるセッション。
動画じゃなくても伝わる構成になっているので、コルーチン・・・?ってなってる人は是非見て頂きたい。今すぐコルーチンでコードが書きたくなるから。

speakerdeck.com

LT大会

8人の強者によるLT大会。
A会場への華麗なつなぎ有、コール&レスポンスあり、2万行を1発でJavaToKotlinした強者ありと、どの発表者の内容も面白く、3分の短さを感じた。
少し早めに終わった後、まさかのA会場に接続し、みんなでKontlibute欲を高めるという、運営さんの素晴らしい対応もありました。

発表資料まとめ

聞けていないセッションも公式でまとめられているので非常にありがたい。
youtubeで動画も公開されるはずなので、公開が楽しみです! kotlin.connpass.com

まとめ

ドリンクもあるし、軽食やおやつも出るし、発表も面白いし、企業のノベルティもいろいろ頂けるし、とにかく素晴らしいイベントでした!!
クロージングで語られた次回予定は未定!となっていましたが、是非次回も開催して欲しいです。ビッグゲストにも期待!!絶対に参加します。

最後に
Kotlinかわいい!!

N予備校:プログラミング入門 Webアプリ 13日目

学んだこと

脆弱性

  • 脆弱性とは、悪用できる不具合のこと
脆弱性 影響 内容
OSコマンド・インジェクション 任意のOSコマンドを実行できてしまう
SQLインジェクション 任意のSQLコマンドを実行できてしまう
ディレクトリ・トラバーサル 任意のファイルを閲覧、操作できてしまう
セッションハイジャック 利用者のセッションが乗っ取られてしまう
クロスサイト・スクリプティングXSS スクリプトによりWebサイトの改ざんができてしまう
クロスサイト・リクエストフォージェリ (CSRF) 利用者の意図しない操作がされてしまう
HTTPヘッダインジェクション 偽ページの表示などができてしまう
クリックジャッキング 利用者の意図しないクリックをしてしまう

XSS脆弱性の対策

  • 意図しない HTML、JavaScriptCSSの変更ができる脆弱性
  • pugには、XSSを防ぐためのエスケープ処理が実装されているのでそれを使用することで回避する
  • コードを修正することで、機能が低下することをリグレッションと言う

パスワードの脆弱性の対策

  • パスワードを平文で保存することは絶対に行ってはいけない
  • 任意の長さのデータを、そのデータを代表する値に変換する関数のことをハッシュ関数といい、ハッシュ関数をかけた結果のことをハッシュ値という
  • メッセージダイジェストとは、ハッシュ関数を使って作られたそのパスワードの変換結果
  • パスワードに使うハッシュ関数アルゴリズムで、有名なものには以下のものがある
    • MD5(現在では衝突困難性の面で危険があり、簡易な用途でしか用いられない)
    • SHA
    • bcrypt
  • 実際のWebサービスではより強固な管理をするために、以下の様な手法がとられている
    • ハッシュ関数を複数回にわたって適用するストレッチという手法
    • パスワードに、個人ごとに異なるソルトというランダムな秘密の文字列を結合してハッシュ関数を適用する手法
  • 簡単なパスワードでは総当たり攻撃でパスワードを盗まれてしまう
  • パスワードの生成にはジェネレーターを利用し、 Webサイトごとに異なるものを利用する
    • 12文字以上が望ましい。

セッション固定化攻撃脆弱性の対策

  • セッションとは、システムにログインまたは接続してから、ログアウトまたは切断するまでの一連の操作や通信のこと
  • セッション固定化攻撃とは、セッションののっとりを行うための攻撃手法の一つ
  • セッションのっとりのことをセッションハイジャックという
  • セッションのIDなどに、生成方法が予測しにくいハッシュ値を加えることでセッションIDの正当性をチェックすることができる

より堅牢なセッション管理

  • Node.jsのcryptoモジュールの randomBytes関数は、推測されづらいランダムなバイト列を生成することができる
  • セッションの識別子を推測されにくいものにする
  • 秘密鍵を結合したハッシュ値を利用して、推測をより困難にすることができる
  • セッション管理の実装は難しいため、可能であればフレームワークを利用する
  • どうしても手を入れなければならない場合は、以下の点が重要
    1. セッションの識別子を推測されにくいものにする
    2. セッションの識別子を URL のパラメーターにいれない
      • ブラウザに、Refererというヘッダの情報に、どのURLからリンクをたどってきたかを通知する機能があり、そこから他人に自分のセッションの識別子が流出することを防ぐために重要
    3. HTTPS 通信で利用する Cookieには secure属性を設定する
      • 通信の経路の盗聴によって、セッションの識別子が盗まれることを防ぐことができる
    4. ログインが成功したら新しいセッションの識別子を発行する

感想

実際に、脆弱性を証明するコードを書きながら進められるので、ただ脆弱性を教えられるよりリアリティがあった。 こういうところはすごく良いな~と感じる。

N予備校:プログラミング入門 Webアプリ 12日目

学んだこと

  • データベースへの保存機能の実装
  • ラッキング Cookie の実装
  • 削除機能の実装
  • 管理者機能の実装
  • デザインの改善

データベースへの保存機能の実装

  • データベースとは、様々なユーザーやソフトウェアから利用できる形式で作成または管理されたデータの集まりのこと
  • 今回はPostgreSQLを使用
  • データベース内に保存した情報を一意にするキーのことを主キーと言う

ラッキング Cookie の実装

  • ユーザーの行動を追跡するCookieのことをトラッキングCookieと言う
  • ラッキングIDがサーバーで生成したものであることを検証できない場合には、これを偽装されるセキュリティ上の問題がある
  • Cookieの値は、ブラウザの操作でユーザーが消すことができる

削除機能の実装

  • データベースは、削除操作をファイルに比べて簡単かつ高速に行うことができる
  • 利用者が機能を利用する権限があるかを資格に応じて許可することを、認可と言う
  • 重要な認可は、クライアントだけではなくサーバーサイドでも行う必要がある

管理者機能の実装

  • Webサービスは犯罪に利用される可能性もあるため、管理する必要がある
  • 管理者機能は、Webサービスを管理、運営するために重要な機能である
  • Webサービスでトラブルに巻き込まれた場合は管理者に問い合わせてみる

デザインの改善

  • Bootstrapは、どのようなデバイスでも適切に表示されるデザインを提供してくれる Webページ作成の部品集
  • 1 つのページで、複数のデバイスに対応するページを実現するデザインをレスポンシブデザインという
  • セキュリティ上の問題がある Webサービスを公開してはいけない

感想

DBの節あたりから、レポジトリをForkする人数、最終的にコードをプルリクエストする人数が減ってきた。 脱落しているのか、まだたどり着いていないのかは判断できないが、最終的な脱落人数は多いかも。
デザインの改善でBootstrapを触れたことはよかった!すごくお手軽にデザインが整っていく感動を味わえた。

N予備校:プログラミング入門 Webアプリ 11日目

学んだこと

  • UI、URI、モジュールの設計
  • フォームによる投稿機能の実装
  • 認証された投稿の一覧表示機能

UI、URI、モジュールの設計

  • HTMLのフォームの機能だけでは、GETとPOSTのメソッドしか利用できない
  • リダイレクトとは、サイトにアクセスしたユーザーをアクセスした URIとは別のURIにアクセスさせること
  • HTTP ステータスコードの300番台を利用することで、リダイレクトをさせることができる

フォームによる投稿機能の実装

  • 役割ごとにモジュールを分割することで、どこで何をしているのかがファイル名から読み取りやすくなる
  • HTML の textarea要素は、改行を含む文章を入力することができるフォーム部品
  • 同じパス名の POSTメソッドから GETメソッドに転送する際には303 - See Otherステータスコードを利用する

認証された投稿の一覧表示機能

  • IDとパスワードを暗号化せずに管理することにはセキュリティ上の問題がある
  • ページがみつからない場合には404 - File Not Foundというステータスコードを返す
  • テンプレートエンジン pug は each-in という構文を用いて、繰り返してテンプレート出力することができる

感想

基本コピペと説明を読んでいけば進めることができるけど、少しづつ難易度が上がってきている。

N予備校:プログラミング入門 Webアプリ 10日目

学んだこと

  • HTMLのフォーム
  • テンプレートエンジン
  • HerokuでWebサービスを公開
  • 認証で利用者を制限する
  • Cookieを使用した、秘密の匿名掲示

HTMLのフォーム

  • htmlのformタグを使用すると、inputタグを利用したコントロールにより情報を送信できる。

  • formタグのmethod属性にはHTTPのメソッド、action属性にはURLのパスを設定する

  • formタグで情報を送信する際に利用するのがbuttonタグ
    • type属性にsubmitと指定する必要がある
  • Node.jsでStream形式のデータは、読み込み用のStreamと書き込み用のStreamをつないでそのままデータを受け渡すことができる。
    • そのための関数がpipeという関数
  • formで送られるデータはURLエンコードされている。

テンプレートエンジン

  • 動的にHTMLを表示するために、テンプレートエンジンというものを利用する
    • テンプレートと、文字列と、プログラムを組み合わせることで、静的なUIデータであるHTMLを動的に出力することができるライブラリ
  • 今回はpugを使用
    • 閉じタグが不要になる。
    • 入れ子構造で要素の関係を簡潔に示すことができる
    • 属性値をaction=pathのように指定することで、好きな変数の値を設定できる

HerokuでWebサービスを公開

  • HerokuとはWebサービスを動かすことのできるプラットフォームを提供しているサービス
    • 小規模な利用なら無料
  • アプリケーションをサーバー上に配置し、動くようにすることをデプロイ(deploy)という
  • HerokuへのデプロイはGitを利用する

認証で利用者を制限する

  • 認証とは、コンピューターの利用者の正当性を検証すること
    • 英語では authentication (オーセンティケーション)という
    • ユーザ名とパスワードがよくある認証
    • 最近ではセキュリティを向上させるため、二段階認証も増えてきている
  • Basic認証
    • HTTP のプロトコルで定義されている、ヘッダのAuthorizationというヘッダの値に、 エンコードされたIDとパスワードを含めて通信することで認証する方式
    • 暗号化されていないBase64という方式でエンコードが行われる
      • HTTPSの様に暗号化されていないHTTPで使用すると、盗聴や改ざんのリスクあり
    • 他の認証方法でメジャーな方法としては、 Cookieというヘッダを利用した認証や、 OAuth認証と呼ばれる方式がある
  • http-authというライブラリを使用
  • Basic認証では、ステータスコード401 - Unauthorizedを返すことで、ログアウトできる

Cookieを使用した、秘密の匿名掲示

  • Cookie (クッキー)とは、Webブラウザに情報を記録するための仕組み
    • 有効期限の設定もできる
  • 内部的には HTTPのリクエストヘッダの Cookieという項目と、レスポンスヘッダの Set-Cookieという項目を利用することで実現されている
  • Cookieは、Webサービスにおいてセッションの管理を行ったり、広告を出す目的でユーザーの行動履歴を記録するためによく使われている

感想

久しぶりに学習時間が取れたため、進めることができた。
認証、Cookieについてなど、知識のない部分を学べているのですごく良い!
UIがしょぼめだが、秘密の匿名掲示板が完成するころにはマシになるんだろうか。

N予備校:プログラミング入門 Webアプリ 9日目

学んだこと

  • HTTPサーバー
  • ログ
  • HTTPのメソッド

HTTPサーバー

  • WEB(World Wide Web
    • 「Webを支える技術 」という本ではWebの主な用途は以下の3通りであると紹介されている。
    • Webサイト
    • ユーザーインターフェースとしてのWeb
      • HTMLで作られた通信をしないヘルプなど
    • プログラム用APIとしてのWeb
      • 扱いやすいデータ・フォーマットで提供されるHTTPのAPIなど
  • Webサービス
    • HTTPなどのインターネット関連技術を利用して通信を行うサービス
    • Webサービスを作るためにはHTTPサービスを提供する必要があり、HTTPサーバーが必要となる
  • HTTPモジュールを使用すると、http.createServerでサーバーを作成できる
  • ユーザーエージェント
    • 利用者がHTTPを使って通信を利用する際のソフトウェアまたはハードウェアのこと

      詰まった

      tmuxでHTTPサーバーを立てる部分があるが、Ctrl-b→dでデタッチしてしまっていたことで、ポート8000が塞がれてしまい、2回目の接続ができなくなった。
      デタッチしていることに気づいていなかったので、強制終了することで解決した。図らずも強制終了コマンドを学ぶことができてよかった。

ログ

  • 起こった出来事についてを時系列で記録したデータ
  • ログレベル
    • ログの意味付け。

    • Node.jsでは標準で3つのログレベルが設定可能

    関数 ログの内容 出力
    info 情報。普段から残しておきたい情報に使う。 標準出力
    warn 警告。問題となる可能性がある情報に使う。 エラー標準出力
    error エラー。直ちに対応が必要な情報に使う。 エラー標準出力

HTTPのメソッド

  • HTTPメソッドとはHTTPのリクエストの種類のこと
  • リクエスト種類は8種類

    メソッド 意味 CRUD
    GET 取得 Read
    POST 追加 Create
    PUT 更新/追加 Update/Create
    DELETE 削除 Delete

    他にもHEAD、OPTIONS、TRACE、CONNECTというメソッドがある

  • 指定なしにブラウザで情報取得する際に使われているのはGETメソッド

  • データの送信にはPOSTメソッドを使用する

感想

サーバーとの通信処理は今まで実装したことがないので、新しい知識が増えて楽しい。
初詰まりを経験したが、なんとか解決できてよかった。

N予備校:プログラミング入門 Webアプリ 8日目

学んだこと

  • ボットインターフェースとの連携
  • 同期I/Oと非同期I/O
  • 例外処理

ボットインターフェースとの連携

  • robot.respond関数を使用することで、ボットの名前がセットで呼び出されたときに反応するようにできる
    • (/todo (.+)/i)という正規表現を引数として渡すと、todoに反応するようにできる
    • (.+)部分は. が改行文字以外のどの1文字にもマッチする文字であり、 + は直前の文字の1回以上の繰り返しにマッチするという意味
    • iは大文字でも小文字でもマッチするというオプション
  • 正規表現を()で囲むとグループ化され、マッチした内容を後でプログラムから取得できる
  • 正規表現をより詳しく知りたい場合は、MDNの説明が参考になる
  • join関数を使用すると、配列の要素を結合した文字列を取得できる

同期I/Oと非同期I/O

  • Node.jsはマルチプロセスや、マルチスレッドではなく、シングルスレッドでブロッキングしない非同期I/Oを利用することで、効率化している
  • Node.jsは、デフォルトでは非同期I/Oの関数が呼ばれる
    • たぶん同期処理はそれ用のメソッドを呼ばないといけないという意味
  • ファイル書き込み処理
    • appendFile:非同期
    • appendFileSync:同期

例外処理

  • try-catch文でエラーが発生した際の例外処理を記述できる
    • finally句もある
  • throw new Error('my error');という記述で故意にエラーを発生させることができる
  • JSON
    • JavaScript Object Notation
    • JavaScriptにおけるオブジェクトと同じ記法で書かれたテキスト情報
  • JSON.stringfy()メソッドでJavaScriptの値を、JSON文字列に変換できる。
  • JSON.parse()メソッドは、文字列によって記述されているJacaScriptの値やオブジェクトを構築できる。

感想

todoボットのデータの永続化まで完了!ローカルで実行していないと動かないので完全ではないが、良さげに動くようになってきた。
コード的には全体的に今までやってきた言語と相違ないので困ることは少ないかなという感じ。
一つ一つのコマがさっくり終わるように作られているので、スイスイ進むぞ〜