20200724のMacに関する記事は4件です。

PHP7.2 × DockerでgRPCクライアントを使うための環境構築

Goでクライアントを作るときには、brewgo getでパッケージをいくつか入れるだけで済むのですが、PHPの方ではいくつかハマりどころがあったのでまとめました。

前提

  • protoコマンドがインストールされている
  • 使用するRPC方式はUnaryRPCである
  • コード生成はローカル環境で行う

扱うprotoファイル

下記のprotoに少し変更をかけたものを扱います。
https://grpc.io/docs/languages/php/quickstart/

hello.proto
package 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-implementation

Dockerの上で動かしたPHPで、gRPCのリクエストを送るための環境を構築します。

php.ini

grpc.so 拡張パッケージの記述がポイントです。

php.ini
[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

extension = grpc.so

Dockerfile

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 install

composer.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.yaml
version: "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サーバー等にも組み込むことができます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【お手軽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

これで完了です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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種類の定義を含む:
    1. スクリプト中で、アプリケーションを制御するために可能な用語、その目的と使い方を説明する
    2. 上記用語とアプリケーションの実装を関連付ける。
    3. 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通り:
    1. sdefフォーマット: XMLを用いて、用語, コマンド, クラス, 定数を定義する、1つのファイル(scripting definition, .sdef)に全ての情報が格納される。
    2. 上より古いフォーマット。
  • 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ファイルをロードします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む