MacBook Pro with Touch Barで常にファンクションキーを表示させる方法

Touch Barには、アプリの方で対応していればAppコントロール、対応していない場合はコントロールストリップ(音量や明るさの制御等を行うボタン)が表示されます。
また、Fnキーを押すとファンクションキーが表示されます。

しかし、Touch Bar非対応アプリを使う場合や、ファンクションキーを多用するアプリ等、デフォルトでファンクションキーを表示してて欲しい、という場面は結構あります。

touchbar function key

システム環境設定 > キーボード > ショートカット > ファンクションキー で、Touch BarにAppコントロールではなく、ファンクションキーを表示させるアプリを選択できます。
システム全体としての設定はできず、設定はアプリ単位になります。
なお、この設定を有効にすると、デフォルトではファンクションキーが表示され、Fnキーを押すとコントロールストリップが表示されます。

PHPカンファレンス2016(東京)で「PHPで学ぶソケットプログラミング入門」というトークをしました

http://slides.com/ryoutsunomiya/php-socket-programming

背景

このようなトークをしようと思った背景を説明すると、

(1) 仕事でソケットプログラミングが必要になった
(2) しかし、日本語で、かつPHPで簡単にソケットプログラミングを学べる資料が無かった

ためです。

(1)については、ネットワーク機器からUDPでログを受け取ったり、TCPで命令を送ったり、といった感じです。
(2)については、「PHPでソケットを使ったプログラムを書いてみた」みたいな記事はいくつもありましたが、「ソケットを使うと何が嬉しいのか」「ソケットはどんな技術か」といった基礎的な部分を解説している記事は見かけませんでした。
そこで、(2)を満たすような資料があるといいなということで、今回の資料を作成し、発表を行いました。

なお、今回のトーク会場や、リハーサルをさせていただいたPHP勉強会で挙手によるアンケートをとったところ、
累計約100名のPHP開発者の中で、業務でPHPでソケットを使ったプログラムを書いたことがある方は(私以外では)わずか1名でした。
仕事にすぐに役に立つ技術ではないですが、一度覚えておくと長持ちする技術です。
「そろそろPHPフレームワークを漁るのにも飽きてきたなー」みたいな人は、ソケットを学んでみると新しい発見があると思います。

ReactPHPについて

資料の中でも何度か登場しているライブラリに ReactPHP があります。
ReactPHPのリポジトリの配下には細かいライブラリがいくつかありますが、PHPでソケットプログラミングを行う上で特に参考になるのは以下の2つです。

Working with TCP Sockets 読書メモ 第14章 緊急データ

Working with TCP Sockets 読書メモ 目次

緊急データ

  • TCPではデータの送信は順番に行われる
  • 緊急データ(Out of bandデータ)は順番を無視して最優先で送信できる
  • Socket#sendSocket#writeの特別版
  • Socket#sendの第2引数にフラグを渡すことで挙動を制御できる

緊急データの送信

  • 緊急データの送信には、sendメソッドの呼び出し時にSocket::MSG_OOBを渡す
  • 緊急データの送受信には、クライアントだけでなくサーバの対応も必要

緊急データの受信

  • 緊急データの受信にはSocket#recvSocket::MSG_OOBフラグ付きで使う必要がある
  • 通常のデータが先に送信された場合でも、緊急データを先に受け取ることができる

制限

  • TCPの緊急データは、一度に1バイトしか送れない

緊急データとIO.select

  • IO.selectは、緊急データに対しては正しく動作しないことが多い
  • 上記の制限と難点があるため、緊急データ送信機能はほとんど使われない

SO_OOBINLINEオプション

  • 通常のデータのストリームの中に緊急データを埋め込むこともできる
  • SO_OOBINLINEオプションを使用する
  • このオプションは受信側でのみ使用可能

Working with TCP Sockets 読書メモ 第11章 タイムアウト

Working with TCP Sockets 読書メモ 目次

タイムアウト

使用できない選択肢

  • Ruby組み込みのtimeoutライブラリはソケットと同時に使うのに適していない
  • SNDTIMEO/RCVTIMEOとソケットオプションの組み合わせも理想的ではない

IO.select

  • IO.selectはタイムアウトにも使うことができる

acceptのタイムアウト

connectのタイムアウト

Working with TCP Sockets 読書メモ 目次