- 投稿日:2020-07-24T21:14:23+09:00
PHP7.2 × DockerでgRPCクライアントを使うための環境構築
Goでクライアントを作るときには、
brew
やgo get
でパッケージをいくつか入れるだけで済むのですが、PHPの方ではいくつかハマりどころがあったのでまとめました。前提
- protoコマンドがインストールされている
- 使用するRPC方式はUnaryRPCである
- コード生成はローカル環境で行う
扱うprotoファイル
下記のprotoに少し変更をかけたものを扱います。
https://grpc.io/docs/languages/php/quickstart/hello.protopackage hello; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }コード生成
下記ページを参考にしました。
https://grpc.io/docs/languages/php/quickstart/コード生成用のPHPプラグインを追加
protoファイルからPHP用の各種クラスを生成するために、grpc_php_plugin を入れる必要があります。
$ git clone -b v1.30.0 https://github.com/grpc/grpc $ cd grpc && git submodule update --init && make grpc_php_pluginすると、ソースを展開したディレクトリに
bins/opt/grpc_php_plugin
が生成されます。コード生成実行
下記コマンドを入力します。
$ protoc --proto_path=proto \ --php_out=src/gen \ --grpc_out=src/gen \ --plugin=protoc-gen-grpc=./grpc/bins/opt/grpc_php_plugin \ ./proto/hello.protoこの時のオプションとして、
--proto_path
にはprotoファイルが配置されているディレクトリを指定する--php_out
と--grpc_out
は同じディレクトリを指定する--plugin=protoc-gen-grpc=
に、先ほどプラグインをインストールしたディレクトリのbins/opt/grpc_php_plugin
を指定するを行います。
これでコード生成はOKです。クライアント環境準備
インストールするパッケージは下記ページを参考にしました。
https://cloud.google.com/php/grpc?hl=ja#php-implementationDockerの上で動かしたPHPで、gRPCのリクエストを送るための環境を構築します。
php.ini
grpc.so
拡張パッケージの記述がポイントです。php.ini[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese" extension = grpc.soDockerfile
peclでgrpcパッケージを入れることがポイントです。
FROM php:7.2-stretch RUN apt-get update -y \ && apt-get install -y zip autoconf zlib1g-dev \ && apt-get clean RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer COPY php.ini /usr/local/etc/php/php.ini RUN pecl install grpc WORKDIR /var/local COPY . . RUN composer installcomposer.json
ここでは先ほどのコード生成によってファイルが格納された先を
src/gen
として扱っています。composer.json{ "autoload": { "psr-4": { "Hello\\": "src/gen/Hello", "GPBMetadata\\": "src/gen/GPBMetadata" } }, "require": { "php": ">=7.2", "google/protobuf": ">=3.0", "grpc/grpc": ">=v1.27.0" }, "repositories": [ { "type": "vcs", "url": "https://github.com/stanley-cheung/Protobuf-PHP" } ] }ポイントは、
google/protobuf
パッケージのインストールgrpc/grpc
パッケージのインストール- コード生成されたクラスをautoloadで読み込み指定する
ことです。
docker-compose.yaml
先ほどのphp.iniを、ボリュームマウントでコンテナに配置することがポイントです。
docker-compose.yamlversion: "3" services: php: build: . volumes: - ./php.ini:/usr/local/etc/php/php.ini - .:/var/local/ ports: - 80:80クライアント実装
実装例です。
srcipts/RunHello.php<?php use Hello\GreeterClient; use Hello\HelloRequest; $hostname = 'localhost:8000'; $client = GreeterClient($hostname, [ 'credentials' => \Grpc\ChannelCredentials::createInsecure() ]); $request = new HelloRequest(); $request->setName("DummyName"); list($reply, $status) = $client->SayHello($request)->wait(); $message = $reply->getMessage();この時vendor配下に
\Grpc\ChannelCredentials
クラスが存在せず、エディタでは警告等が出ます。
しかしPHPのgRPC拡張によって、必要なライブラリがDocker側にインストールされているため実行時には正常に通ります。
(個人的にはここがハマりポイントでした)実行
オートローダーを読み込んで、クライアント実装のスクリプトを読み込めば実行されます。
$ docker-compose run --rm php -a php> require_once('vendor/autoload.php'); php> require_once('scripts/RunHello.php');あとはこのクライアントをクラスに閉じ込めたり、composerのパッケージ化などを行えばWebサーバー等にも組み込むことができます。
- 投稿日:2020-07-24T16:46:07+09:00
【お手軽2STEP】Macでgifファイルの作成
Macでブラウザでの操作状況を簡単にgif化することについて、メモしておきます。
使うツール
- ffmpeg
- mac標準搭載の動画キャプチャ
準備
ffmpegのインストール by brew
$ brew install ffmpeg Updating Homebrew... ・・・ (省略) ・・・ $ ffmpeg -version ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers built with Apple clang version 11.0.3 (clang-1103.0.32.62)gifの作成の仕方
1.Command + Shift + 5 で動画キャプチャをとる
Mac で画面を収録する方法 を参考にして、画面の動画キャプチャを録ります。
2.ffmpeg を使ってgifファイルを作成
1で作成したmovファイルを、ffmpegでgif化します。
$ ffmpeg -i hoge.mov -r 24 aaa.gifこれで完了です。
- 投稿日:2020-07-24T12:19:06+09:00
Mac上でnodenvをインストール、任意のバージョンを有効化
nodenvをインストール
参考 : https://github.com/nodenv/nodenv#basic-github-checkout
git clone https://github.com/nodenv/nodenv.git ~/.nodenv cd ~/.nodenv && src/configure && make -C src上記サイトで
2.Add ~/.nodenv/bin to your $PATH for access to the nodenv command-line utility. For bash: $ echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bash_profileと説明されているので、
echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bash_profileとして、
.bash_profile
のファイル上で、PATH
に追記します。
※WSLだと.bashrc
に追記すれば行けるかもしれません。~/.nodenv/bin/nodenv initを実行すると、
# Load nodenv automatically by appending # the following to ~/.bash_profile: eval "$(nodenv init -)"のように表示されるので、
eval "$(nodenv init -)"
を.bash_profile
の末尾(先程のPATHの設定の次)に追記します。
※WSLだと.bashrc
に追記すれば行けるかもしれません。nodeの環境を作成、有効化
nodenv install --listを実行すると、インストール可能なバージョンの一覧が表示されます。
数字から始まるバージョンにだけ絞る場合は、grepを使って以下のように絞ります。nodenv install --list | grep -E "^ *[0-9]+.+$"13.10.0 13.10.1 13.11.0ここでは、最新のバージョンをインストール
※2020.07.24時点では、13.11.0
nodenv install 13.11.0
nodenv versionsを実行し、インストールされたバージョンが表示されることを確認します。
先程インストールしたバージョンを有効にします。
nodenv shell 13.11.0特に何か表示されるわけではないので、
node -v
を実行し、先程有効化したバージョンが正しく表示されることを確認します。
v13.11.0
- 投稿日:2020-07-24T09:31:50+09:00
[macOS] Cocoa Scripting Support
Cocoa Scripting Guide
本文書は、Cocoa Scripting Guide の内容に関するメモです。
関連書籍: AppleScript Overview作業は完了しておりませんが、バックアップを兼ねて投稿します。
Introduction to Cocoa Scripting Guide
- スクリプト制御可能なアプリーケーションの実装をサポートするCocoaアプリケーションフレームワークを、Cocoa Scriptingと呼ぶ。
- スクリプト制御可能なアプリーケーションは、通常AppleScriptにて制御される。
- スクリプトを実行すると、複数のコマンドが、AppleEventの形式で、制御対象アプリケーションに、プロセス間通知を使用して送られる。
- Cocoa Scriptingは、AppleEventの受診, 解析, ユーザ定義のコールバックの呼び出しを行う。
Overview of Cocoa Support for Scriptable Applications
- スクリプト制御可能なアプリーケーションのために用語の辞書を定義する。辞書は、スクリプト作成者が使用可能なクラスやメソッドを定義する。
- Cocoa Scriptingは、AppleScriptをサポートするためのクラス・カテゴリ・スクリプト化するための情報を持つ。
- Cocoa Scriptingでは、 KVO, MVCを利用する。アプリケーションに送られたコマンドは、アプリケーションモデルオブジェクトに直接作用する。KVOを使用する事で、スクリプト制御に必要なコードの追加を少なくする。
AppleScript and Scriptable Applications
- AppleScriptは、スクリプト制御可能なアプリーケーションやmacOSの一部(Finderなど)を制御するための言語。
- AppleScriptは特定のアプリケーションにむけた機能をサポートしない。その変わり、
get
,set
,make
,delete
などの共通コマンドを定義する。- 一方でスクリプト制御可能なアプリーケーションは、その処理の内容に応じた特定の処理を定義する事ができる。
- AppleEventはプロセス間通信にて送られるメッセージで、複雑な処理とデータを持てる。
- AppleEventによって複雑なタスクを1つにまとめ 、異なるプロセスにこれを送り出し、結果をイベントとして受け取る事ができる。
- スクリプト制御可能なアプリーケーションは、AppleEventを、Apple Event Managerに登録
- AppleScriptとAppleEventは、Open Scripting Architecture(OSX)で定義される。
The AppleScript Object Model
- スクリプト制御可能なアプリーケーションは、いずれもAppleScript object model を定義する。
- AppleScript object model には、スクリプトでアクセス可能なオブジェクト, クラスの継承関係やプロパティが定義される。
- 通常、オブジェクトモデルのオブジェクトと、スクリプトサポートを実装するオブジェクトクラスは一致していますが、必ずしもそうする必要はない。
Scriptability Information
- スクリプト制御可能なアプリーケーションは、scriptability informationを提供する必要がある。Scriptability informationは、AppleScript objectとアプリケーションオブジェクトモデルの対応状態を表す。
- Scriptability informationは、次の2種類の定義を含む:
- スクリプト中で、アプリケーションを制御するために可能な用語、その目的と使い方を説明する
- 上記用語とアプリケーションの実装を関連付ける。
- KVOで使用するキーの値を定義します。このキーを通じて、スクリプトからのプロパティの読み書きを行う。
- Scriptability informationの中の用語をユニークにするために、four-character-code(もしくはAppleEventCode)を使用する。コードは4文字の文字列で定義する。詳細は “Code Constants Used in Scriptability Information”
- Scriptability informationでは、関連する機能(たとえば、テキスト、グラフィック、データベースなどの操作)用語も、スイートとしてまとめられる。 定義済みの用語については、"Built-in Support for Standard and Text Suites"を参照。
Scriptability Information Formats
- Scriptability informationを記述するフォーマットは以下の2通り:
sdef
フォーマット: XMLを用いて、用語, コマンド, クラス, 定数を定義する、1つのファイル(scripting definition,.sdef
)に全ての情報が格納される。- 上より古いフォーマット。
- XMLのフォーマットについては、manページ、または“Preparing a Scripting Definition File”を参照。
Viewing Scripting Terminology
Built-in Support for Standard and Text Suites
- ほとんどのアプリーケーションは、標準的なAppleScript制御、すなわちcount, makeコマンドをサポートする。これらは標準スイート(Standard Suite)と呼ばれる。
- 標準コマンドを実装するためのNSCountCommandやNSCreateCommandなどのコマンドクラスが提供されている
- さらに、NSApplicationやNSDocumentなどのクラスは、標準のスクリプトサポートの特定の側面を実装している
set
及びget
コマンドも、 NSGetCommandとNSSetCommandクラスにてサポートされる。これらは標準スイートではないが、アプリケーションオブジェクトのプロパティと要素の値を取得および設定できるようにすることは、スクリプト対応するための重要な部分である。- 標準スイートでは、次のコマンドを定義する: コピー、カウント、作成、削除、存在、および移動。
- リッチテキスト, ワード, パラグラフをサポートする時は、テキストスイートが必要。
- テキストスイートについては、“Use the Document Architecture”, “Access the Text Suite”を参照
- テキストスイートをサポートする方法については、“Turn On Scripting Support in Your Application”を参照
Built-in Support for Basic AppleScript Types
AppleScriptのデータの型について、基本的な型は組み込みで準備されている。
Loading Scriptability Information
- アプリケーションが、最初にScriptability Inforationにアクセスする際に、Cocoa Scriptingは、グローバルインスタンス(
NSScriptSuiteRegistry
)を使用して、sdef
ファイルをロードします。