rukurxの日記

自分の日々の作業や調べたことのメモ

PHP7で追加されたスペースシップ演算子(<=>)について

PHPのコードレビューをしていたら見慣れない演算子 <=> を発見!

なんやこれと思ったら、PHP7で追加された スペースシップ演算子(spaceship operator) という比較演算子でした。

スペースシップ演算子は左辺と右辺を比較した結果として、-1, 0, 1 のいずれかを返します。

  • 左辺より右辺が大きければ -1 を返す。
  • 左辺の右辺が同じなら 0 を返す。
  • 左辺の方が右辺より 1 を返す。

PHPインタラクティブモードで実際に返却される値を確認する。

$ php -a
Interactive shell

php > // 数値比較
php > echo 0 <=> 1;
-1
php > echo 1 <=> 1;
0
php > echo 1 <=> 0;
1
php > // trueとfalse比較(trueは1, falseは'')
php > echo false <=> true;
-1
php > echo true <=> true;
0
php > echo true <=> false;
1
php > // 文字列比較(アルファベット順)
php > echo 'a' <=> 'b';
-1
php > echo 'a' <=> 'a';
0
php > echo 'b' <=> 'a';
1

どうやらソートする際によく使われる様子。

  • 今までの書き方
<?php

  $numbers = [5, 1, 3, 2, 4];

  usort($numbers, function($a, $b) {
    if ($a < $b) {
      return -1;
    } elseif ($a == $b) {
      return 0;
    } else if ($a > $b) {
      return 1;
    }
  });

  print_r($numbers);
  • スペースシップ演算子を使った場合
<?php

  $numbers = [5, 1, 3, 2, 4];

  usort($numbers, function($a, $b) {
    return $a <=> $b;
  });

  print_r($numbers);

スペースシップ演算子自体はPerlRubyなどの他の言語にもあるみたいですね。他の言語もやらないと…

参考

stackoverflow.com qiita.com www.sitespiral.jp

PHPをコマンドライン上で対話式に実行する

PHPの対話シェル(REPL)を使うには -a オプションを指定する。

$ php -a
Interactive shell

php >

通常のPHPの実行したときと同様に、計算結果の出力やクラスを定義したりできるので、ちょっとした機能の確認に使うと便利そう。

$ php -a
Interactive shell

php > echo 1+1;
2
php > class Hoge {
php {   public function getClassName() {
php {      return __CLASS__;
php {   }
php { }
php > $hoge = new Hoge();
php > echo $hoge->getClassName();
Hoge
php > exit
$

なんだかんだで実際開発してる時には使わないかも...

参考

PHP: 対話シェル - Manual

MacでのSSH接続を管理する

サーバーにSSH接続するたびに毎回ホスト名や鍵情報を書くのが面倒なので、任意につけたホスト名だけでログインできるようにする。 ついでに踏み台サーバーを経由した多段SSHの設定もする。

通常のSSH

$ ssh root@example.com -i ~/.ssh/example.key -p 22

長い...

Host名を指定したSSH

  • .ssh/configファイルを作成して管理する
# .sshディレクトリがなければ作成して、パーミッションを変更する
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ touch ~/.ssh/config
  • 接続先のホスト情報をconfigファイルに記載する
$ vim ~/.ssh/config
# 接続先サーバー情報
Host example
 HostName example.com
 User root
 IdentityFile ~/.ssh/example.key
 Port 22
 TCPKeepAlive yes
 IdentitiesOnly yes

これでssh接続の際にHostに書いた名前を指定するだけでsshできる。

$ ssh example

踏み台サーバーを使った多段SSH

例としてAWSのEC2に踏み台サーバー(jump)経由でsshする。

$ vim ~/.ssh/config
Host jump
 Hostname 192.168.0.1
 User user_name
 IdentityFile ~/.ssh/id_rsa
Host web01
 Hostname 192.168.1.1
 port 22
 User ec2-user
 IdentityFile ~/.ssh/example.pem
 ProxyCommand ssh -CW %h:%p jump
  • 読み書き権限を付与する
$ chmod 600 .ssh/example.pem

※ 事前にexample.pemをローカルに落としてくる必要がある

参考

qiita.com

qiita.com

Macで秘密鍵と公開鍵を作成する

毎回ググっていたのでメモしておく。

$ ssh-keygen -t rsa -b 4096 -C "account@example.com"

暗号化方式はRSA、 鍵長は 4096 にする。-Cオプションはコメントで、ここではメールアドレスにすることでなんの鍵かわかるようにしている。

※ 暗号化方式はRSA、ECDSA、Ed25519のどれか。鍵長は2048以上にする。

  • 秘密鍵と公開鍵が作成されていることを確認する
$ ls -la .ssh/
id_rsa (秘密鍵)とid_rsa.pub (公開鍵)が表示される。
  • 読み書き権限を付与する
$ chmod 600 .ssh/id_rsa.pub
  • 作成された鍵の強度を確認する。
$ ssh-keygen -l -f ~/.ssh/id_rsa.pub
4096 SHA256:90FRF8tgbGec/iGRTgeg5ijDeeWEDGedRRgGG5VVlQU account@example.com (RSA)

暗号化方式はRSA、 鍵長は 4096 で作られている。コメントに指定したメールアドレスも確認できる。

  • サーバー側に公開鍵を設置する
$ ssh root@192.168.0.1

※ 既に運用されているのであればインフラの方に公開鍵を渡して設置してもらう必要がある。

$ mkdir -p /home/user_name/.ssh
  • 読み書き実行権限を付与する
$ chmod 700 /home/user_name/.ssh
$ chown -R user_name:user_name /home/user_name/.ssh/
  • 公開鍵をローカルのMacからサーバーへ設置する
$ scp ~/.ssh/id_rsa.pub user_name@192.168.0.1:~/.ssh/authorized_keys
  • Macからsshでログインする
$ ssh user_name@192.168.0.1 -i ~/.ssh/id_rsa

参考

http://ponsuke-tarou.hatenablog.com/entry/2017/10/19/002727 https://qiita.com/suthio/items/2760e4cff0e185fe2db9 https://www.task-notes.com/entry/20150208/1423325535 http://www.atmarkit.co.jp/ait/articles/1503/20/news007.html https://qiita.com/reflet/items/0c338df07d9f6c6ef776

Macにgnu-sedをインストールする

sedを使ってファイルの先頭行に文字列を追加しようとしたら、LinuxMacで挙動が違った。

  • Linuxの場合は正常に処理が完了する
$ sed -i '1ihoge' test.txt
$ cat test.txt
hoge
  • Macの場合はエラーになる。
$ sed -i '1ihoge' test.txt
sed: 1: "test.txt": undefined label 'est.txt'

いろいろと調べているとMacではBSD版がインストールされていて、CentOSではGNU版のsedがインストールされているためだった。 BSDGNUsedの仕様違うのか…

普段の開発ではローカルのMacで開発後、Linuxで確認していたので、Macでも同じ挙動になって欲しい… どうやらGNU版のsedMacにインストールできるようなので早速やってみる。

$ brew install gnu-sed

gnu-sedインストール時のメッセージでコマンド名の接頭辞にgがついてるとのことなので、コマンド名は gsed になっている。

The command has been installed with the prefix "g".
If you do not want the prefix, install using the "with-default-names" option.
  • sedコマンドで使えるようにaliasを追加して読み込む
$ vim ~/.zshrc
alias sed='gsed'
$ source ~/.zshrc

また、インストール時のメッセージにあるように、インストール時にwith-default-namesオプションつけることでMacsedコマンドに置き換えてくれるのでaliasを使いたくない人はこっちでもよい。

$ brew install - with-default-names gnu-sed

これでMacでも実行することができました!

$ sed -i '1ihoge' test.txt
$ cat test.txt
hoge

sedはとても便利なのでこれからも積極的に使っていこうと思います!

参考

it-ojisan.tokyo

ReactNativeのビルドプロセスについてメモ

React Nativeのプロジェクトをビルドするため、以下のコマンドを実行する。

$ react-native run-ios

React Nativeはこのコマンドで次の2つのことをします。

  • NodeのWebサーバー(Metroバンドラー)をローカルに起動する。

    Metroバンドラー(旧パッケージャー)がJSファイルをトランスパイルしてバンドルする。

    ペイロードとして、index.platform.bundle ファイルをpublish(公開)する

    ペイロードとはデータ本体のこと

  • PureなNativeアプリケーションプロジェクトをビルドし、モバイル端末(実機 or エミュレータ)にデプロイする。

    このNativeアプリケーションは、JSの実行環境である JavaScript Core を含み、1 のWebサーバーで配信している index.platform.bundle ファイルをダウンロードする。

    iOSは既に内部的に Javascript Core をホストしているため、iOS用のNativeアプリケーションプロジェクトには含まれない。

iOSではJSの実行環境( JavaScript Core )はiOSオペレーティングシステム上にホストされているが、AndroidではReact Nativeと一緒にデプロイされる。また、エミュレータも同様にペイロード( index.platform.bundle )ファイルにアクセスしている。

www.logicroom.co

ReactNativeのBridgeの仕組みについてのメモ

React NativeはJavaScriptiOSAndroidのアプリを作成することができるネイティブアプリケーションを作成するためのフレームワークです。

React Nativeでは Bridge という仕組みを使ってJavaScriptからNativeコードに処理を渡して実行することができます。 JavaScript実行環境である JavaScript Core がOS上で実行されており、 Bridge を通してNativeコードに解釈されます。

従来のWebアプリケーションは、ブラウザがHTML, CSS, JavaScriptをサーバーからダウンロードし、レンダリングします。 React NativeもWebアプリケーションと似ていて、モバイル端末がJavaScriptとReact Nativeのマークアップをロードします。

JavaScriptはそのままではモバイル端末上では実行できないので、Bridgeを使ってモバイル端末のプロセッサとやりとりするする必要がある。 そのためにはJavaScriptを実行するための実行環境である JavaScript Core がモバイル端末には必要になる。 JavaScript Coreオペレーティングシステム上で実行され、JavaScriptを実行するコード郡です。 また、JavaScript Core は、JavaScriptを実行するNativeコードをロードしてから、モバイル端末のビルドプロセスへJavaScriptをロードします。 つまり、JavaScriptの実行環境内でReact NativeのJavaScriptコードが実行されます。

www.logicroom.co