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);
スペースシップ演算子自体はPerlやRubyなどの他の言語にもあるみたいですね。他の言語もやらないと…
参考
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 $
なんだかんだで実際開発してる時には使わないかも...
参考
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をローカルに落としてくる必要がある
参考
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
$ 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を使ってファイルの先頭行に文字列を追加しようとしたら、LinuxとMacで挙動が違った。
- 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がインストールされているためだった。 BSDとGNUでsedの仕様違うのか…
普段の開発ではローカルのMacで開発後、Linuxで確認していたので、Macでも同じ挙動になって欲しい… どうやらGNU版のsedをMacにインストールできるようなので早速やってみる。
$ 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オプションつけることでMacのsedコマンドに置き換えてくれるのでaliasを使いたくない人はこっちでもよい。
$ brew install - with-default-names gnu-sed
これでMacでも実行することができました!
$ sed -i '1ihoge' test.txt $ cat test.txt hoge
sedはとても便利なのでこれからも積極的に使っていこうと思います!
参考
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
)ファイルにアクセスしている。
ReactNativeのBridgeの仕組みについてのメモ
React NativeはJavaScriptでiOSとAndroidのアプリを作成することができるネイティブアプリケーションを作成するためのフレームワークです。
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コードが実行されます。