読者です 読者をやめる 読者になる 読者になる

What we talk about when we talk about Technology

技術について語ります。

2段階認証後にcommand lineでgitコマンドを使う時に認証失敗したときのメモ

2段階認証設定後にCommand Lineでgit cloneしようとしたら、ログインを求められ、正しい名前とパスワードを入れてもAuthエラーになるのでなんでだろうと思って調べたところ、

githubで2段階認証を設定したらpushできなくなった - Qiita

[Git][GitHub]GitHubにPushする際に認証失敗する | DevAchieve

にある通り、ブラウザでgithubでpersonal access tokenを作成したのち、~/.netrc に以下を追記。

machine github.com
    login username
    password personal_access_token

でうまくいく。

VB Code

整数列を圧縮する方法にVB Codeというアルゴリズムがあります。
整数の型がUInt32であった場合、整数列の長さは32 * 配列のサイズとなります。
このとき、この32桁(232)に対し小さな値、例えば6は00000000 00000000 00000000 00000110という32桁の数字になり、ぱっと見で感じるように先頭の0が冗長となります。
この冗長な0を省略することで圧縮するアルゴリズムVB Codeです。

具体的には、VB Codeではそれぞれのバイトの先頭の1ビットを、終端かどうかを表すフラグとして使います。 (フラグが立っていれば終端)
そうすることで0だけで表されていたバイトを省略することができます。
例えば先程の6の場合、00000000 00000000 00000000 00000110と表されていましたが、最後の1バイ00000110の先頭のビットを1に変換し、その前についていた00000000 00000000 00000000を省略するため、VB Codeで表すと1000 0110と表されるのでサイズは8/32 = 1/4となります。

先頭の1ビットを終端をあらわすフラグとして用いるため、1バイトで表せる値は127(11111111)までです。
128よりも大きな値のときは、そのまま2バイト目の一番下の桁が128(28)を表すことになります。

00000001   10000000 = 128
       ↑   ↑
     2^8   フラグ

よって例えば150(28 + 24 + 22 + 2)はVB Codeでは00000001 10010110と表せます。

このVB CodeをSwiftで実装したものが以下です。
次は実際にファイル読み込んでどのくらい圧縮されるのか確かめてみたいと思います。

参考

[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ)

【2016】読書リスト

年の瀬を感じる今日この頃。
備忘録を兼ねて、2016年に読んだ技術書・参考書を一覧にまとめました。

参考にしたサイト

読む本は主に以下の二つのQiitaエントリーを参考にしています。

qiita.com

qiita.com

エントリの筆者の二人に感謝申し上げます🙇

2016読書リスト(計:45冊)

※読んだ順序はこの通りではありません。

  1. リーダブルコード

  2. インフラエンジニアの教科書

  3. UI Graphics - 世界の成功事例から学ぶ、スマホ以降のインターフェイスデザイン

  4. ハッカーと画家

  5. TEAM GEEK

  6. アジャイルサムライ

  7. 伽藍とバザール

  8. マスタリングTCP/IP 入門編

  9. ネットワークエンジニアの教科書

  10. Unixという考え方

  11. Unix考古学

  12. プログラミングHaskell

  13. Core Image for Swift

  14. エリックエヴァンスのドメイン駆動開発

  15. 人月の神話

  16. ソフトスキルズ

  17. アルゴリズムの基本

  18. 暗号技術入門 秘密の国のアリス

  19. デザインのルール、レイアウトのセオリー。

  20. タイポグラフィーの基本ルール

  21. iPhone Core Audioプログラミング

  22. プロトタイピング実践ガイド

  23. はじめて学ぶUML

  24. 独習UML

  25. Arduinoをはじめよう

  26. プログラミングの基礎

  27. functional swift

  28. すごいHaskellたのしく学ぼう

  29. Kotlinスタートブック -新しいAndroidプログラミング

  30. プログラミングErlang

  31. いまから始めるWebフロントエンド開発

  32. 詳細!PHP7+MySQL入門ノート

  33. いちばんやさしいWordPressの教本

  34. プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

  35. サイトの拡張性を飛躍的に高めるWordPressプラグイン開発のバイブル

  36. みんなのPython 第3版

  37. 一歩先にいく WordPressのカスタマイズがわかる本

  38. Flask Web Development

  39. MySQL徹底入門

  40. よくわかるHTML5+CSS3の教科書

  41. よくわかるJavaScriptの教科書

  42. Learning JavaScript

  43. パーフェクトPHP

  44. シングルページWebアプリケーション

  45. nginx 実践入門

  46. Swift Internal Introduces

  47. SWIFT ALGORITHMS & DATA STRUCTURES

  48. Web API: The Good Parts

  49. コンピュータの構成と設計 第5版 上

振り返り

振り返ってみると前半の方は「え、これ読んだの今年!?」っていうくらい昔のことに感じます。

中にはあまり面白くなかったもの、ちゃんと理解できなかったものもありますが、
数多くの好奇心刺激する本に出会えて楽しかったです。
幅広い知識に触れることができた一方、どれも実用レベルでないのは残念なところです。
結局手を動かさないと使える知識にならないんだなと実感しました。

来年は

本を選ぶ上で特に戦略は持っておらず、興味の向くままに選んでいます。
戦略があった方がいい気もするし、このスタンスに特に自信があるわけではありませんが、
来年もこのスタイルで読む本を選んでいきたいと思います。
みなさんどのように本を選んでいるのでしょうか。

来年は実務で使う技術に加え、

などに挑戦したいなーと思います。
オススメの書籍、書籍を紹介しているサイト等あれば是非是非教えてください🙇

FrenchKit

Conference

先週末9/23,24にフランスのパリで行われたFrenchKitに参加して来ました。

f:id:KK462:20161002174855j:plain

2日間のうち1日目の23日はトークのみ、2日目24日はライブコーディング及びクラスルーム、クロージングというコンテンツでした。

コンテンツ

f:id:KK462:20161002175055j:plain

全てを見つけることはできませんでした。。(Realmで公開されるのかな?)

【LT】Human Engineering

スピーカー:Jeremie Giraultさん(@kamidude)
github.com

Designing Pro Apps

スピーカー:Piet Brauerさん(@pietbrauer)
speakerdeck.com
github.com

【LT】Building your UI Developer's Toolbox with Playground

スピーカー:Hugues Bernet-Rollandeさん(@rompelstilchen)
speakerdeck.com
github.com

Reactive Programming with RxSwift

スピーカー:Florent Piletさん(@fpillet)

www.slideshare.net

Mixins vs Inheritance

スピーカー:Olivier Haligonさん(@aligatr)
speakerdeck.com

【LT】Swift script all the things!

スピーカー:Roy Marmelsteinさん(@marmelroy)
github.com (未更新ですが、後々更新されることと思います。)

Swift Evolution - 140 proposals in 30 minutes

スピーカー:Jesse Squiresさん(@jesse_squires)
speakerdeck.com
github.com

Optimizing Your App's Performance - How to Do It Right

スピーカー:Bruno Virletさん(@bvirlet)

【LT】Swift Package Manager

スピーカー:JC Pastantさん

Core Data - it's not dead yet

スピーカー:Abizer Nasirさん(@abizern)
speakerdeck.com

End-To-End Application Development with Swift

スピーカー:Chris Baileyさん(@Chris__Bailey)

An Overview of Verification Techniques Today

スピーカー:Fabrice Kordonさん(@fabricekordon)

Extending Xcode

スピーカー:Boris Buglingさん(@neonacho)

Launch Arguments: the Mysteries

スピーカー:Marin Usaljさん(@_supermarin)

Live Streaming Swift Talk

スピーカー:Chris Eidofさん(@chriseidhof)&Florian Kuglerさん
SortDescriptorの話。(関連:http://chris.eidhof.nl/post/sort-descriptors-in-swift/)

MVC Supercharged

スピーカー:Grégoire Lhotellierさん(@greg3z)&Jéremie Giraultさん(@kamidude)
github.com

Classroom

各ブースに分かれてのハンズオンでした。 ソースコードこちら

  • RxSwift Hands-on(Florent Pilletさん@fpillet)
  • Core Data Hands-on(Abizer Nasirさん@abizern)
  • Introduction to Bluetooth LE and IoT(Hugues Bernet-Rollandeさん@rompelstilchen)
  • DTrace: Beyond Instruments(Frank Lefebvreさん)
  • Accessibility for iOS Applications: the Main APIs, the Best Practices and Beyond the Technique(Amadou Amath Ndiayeさん)
  • Reactive Programming with Realm(Marius Rackwitzさん)
  • Server-Side Swift Hands-on(Chris Baileyさん@Chris__Bailey)

How to Become an iOS Full-stack Developer in Just 60 Minutes

ゲーム大会with🍷&🧀

食事

初日朝 f:id:KK462:20161002175230j:plain

初日昼 f:id:KK462:20161002175255j:plain

初日夜 f:id:KK462:20161002175312j:plain f:id:KK462:20161002175334j:plain

2日目🍷&🧀 f:id:KK462:20161002175412j:plain f:id:KK462:20161002175427j:plain

おすすめトーク

Designing Pro Apps
git2goを作ったpietさんによるiPad Proを開発機として使うお話。
Playgroundも使えるようになったし、休日に作業したい時とかアリかも。
そのほかいいiPad Proアプリの作り方など。

Swift Evolution - 140 proposals in 30 minutes
try!swiftでもお話しされたJesseさんによるSwiftEvolutionのプロポーザルを解析されたお話。
Q&Aの「Erica Sadunさんは実在するんですか?」がウケてた。

[Optimizing Your App's Performance - How to Do It Right]
画像のフィルタリングを最適化する話。
標準のAPIからCを経てアセンブリ言語まで。結果は、アセンブリまで最適化する必要はないそう。
最近命令セットなどを学んだのでタイムリーで面白かった。

[End-To-End Application Development with Swift]
IBMのChrisさんによるSwiftをサーバーとモバイル両方で使うメリットについてのお話。
前日にKitura1.0がリリースされており、"Server side Swift is getting real"だそうです。

感想

  • トーク後の司会役含めた3人でのセッションが面白かった。(Q&A含む)
  • 会話の多くはフランス語で行われており、現地の方が多かった様子。
  • 男女比は9:1くらいで、パリでもそうなんだなあと。

カンファレンスを口実に海外に行くのは充実した旅行ができるのでオススメです😄。

ブログ等

www.jessesquires.com

音にまつわる英単語

English

1.bang
(v) hit violently and noisily
(n)

Did you hear that bang? It sounded like a gun.

2.buzz
(v) 1.make the noise that bees make 2.call someone with an electrical signalling apparatus
(n) 1.noise of buzzing 2.telephone call 3.pleasant feeling as if from drug

I lay there hearing the buzz of a mosquito but I couldn't see it anywhere.

3.click
(n) slight short sound, as of a camera
(v) make a click

To download the new software just click on the 'download' icon.

4.crash
(v) make a sudden loud noise
(n) sudden loud noise
5.screech
(v) make an unpleasant high sharp sound
(n) very high unpleasant noise

I heard the screech of brakes as the driver tried to stop and a loud crash.

6.creak
(v) make the sound of a badly oiled door
(n)

I heard of a floorboard creak and I knew somebody had come into the room.

7.crunch
(v) make a crushing noise
(n) crushing sound

I heard the crunch of their feet walking through the crisp snow.

8.drip
(v) overflow with or as if with liquid
(n) sound of liquid falling in drops

Please turn the tap off properly otherwise it'll drip.

9.hiss
(v) make a sound like 's'
(n)

The snake reared its head and gave an angry hiss.

10.hoot
(n) sound made by an owl or a car's horn
(v) make a hoot

I hate people who hoot at me when I slow down at an amber light.

11.hum
(v) 1.buzz 2.sing with closed lips

I don't remember the words of the song, but I can hum the tune.

12.rattle
(v) make a continuous quick hard noise
(n) rattling noise

Every time a bus or lorry goes past, the windows rattle.

13.roar
(n) deep loud continuing sound
(v) give a roar

We could hear the roar of the crown in the football stadium from our hotel.

14.slam
(v) shut loudly and forcefully
(n) noise of a door being slammed

Please don't slam the door. Close it gently.

15.slurp
(v) drink noisily
(n)

Don't slurp your soup! Eat it quietly.

16.sniff
(v) breathe in loudly
(n) act or sound of sniffing

Don't sniff! Get a handkerchief and blow your nose.

17.snore
(v) breathe noisily while asleep
(n) act or sound of snoring

I can't share a room with you if you snore - I won't be able to sleep.

18.splash
(v) fall or move about in drops or waves, especially wildly or noisily
(n) sound or mark made by splashing

There was a splash as he jumped into the swimming pool.

19.tap
(n) a light short blow
(v)

When I'm nervous I often tap my fingers on the table.

20.tick
(n) short repeated sound of a watch or clock
(v) make a tick

This clock has a very loud tick.

21.whistle
(n) high sound made by air blowing through a narrow opening
(v) make a whistle

Some of the players carried on playing because they hadn't heard the whistle.

一般的な再帰に対するデザインレシピ

Design Recipe

前回の再帰に対するデザインレシピはさらっとした書き方であった。
データの構造自体が再帰を含む場合(リスト等)であれば、
その書き方で十分対応できることが多いが、
一般的なデータ構造の場合はもう少し掘り下げたガイドラインがないと、
再帰を含む関数定義が困難を伴うものになる。

以下、一般的な再帰の場合考慮すべき点を述べたデザインレシピである。

テンプレート
自明に答えが出るケースとそれ以外のケースに場合分けする。

if (* 自明に答えが出るケースの条件 *)
then (* 自明に答えが出るケース *)
else (* それ以外のケース *)

本体

  • 自明に答えがでるケースの条件
  • 自明な答え
  • 部分問題の作り方
  • 部分問題から全体問題を解く方法

の4点を考慮する。
部分問題は1つとは限らない。

最後に停止性の議論をする。停止性は以下の2点を確認。
(停止性は決定不能問題なので、ガイドラインにすぎない。)

  • 部分問題がもとの問題より簡単になっていること
  • 繰り返しにより、有限回で自明なケースに帰着すること

デザインレシピ実例

Design Recipe

整数のリストから要素の合計値を求める関数を例に、
デザインレシピの実例を示す。

1.データ定義

(* int list は
       - []                空リスト、あるいは
       - first :: rest 最初の要素が first で残りのリストが rest
                            (rest が自己参照のケース)
     という形 *)

2.目的

(* 目的:受け取ったリスト lst の各要素の和を求める *)
(* sum : int list -> int *)
let sum let = 0

3.例

(* テスト *)
let test1 = sum [] = 0
let test2 = sum [2] = 2
let test3 = sum [1; 3] = 4
let test4 = sum [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] = 55

4.テンプレート

(* 目的:受け取ったリスト lst の各要素の和を求める *)
(* sum : int list -> int *)
let sum lst = match lst with
     [] -> 0
  | first :: rest -> 0 (* sum rest *)

ここで一度テストプログラムを実行し、プログラムが実行可能であることを確認する。

5.本体(1)
今回は条件文を含まないため不要。

6.本体(2)

(* 目的:受け取ったリスト lst の各要素の和を求める *)
(* sum : int list -> int *)
let rec sum lst = match lst with
     [] -> 0
  | first :: rest -> first + sum rest

recをつけるのを忘れないよう注意。

7.テスト
テストプログラムを実行し、成功することを確認する。

プログラム全体

(* int list は
       - []                空リスト、あるいは
       - first :: rest 最初の要素が first で残りのリストが rest
                            (rest が自己参照のケース)
     という形 *)

(* 目的:受け取ったリスト lst の各要素の和を求める *)
(* sum : int list -> int *)
let rec sum lst = match lst with
     [] -> 0
  | first :: rest -> first + sum rest


(* テスト *)
let test1 = sum [] = 0
let test2 = sum [2] = 2
let test3 = sum [1; 3] = 4
let test4 = sum [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] = 55