2020年4月11日土曜日

phpbrewでのPHP環境セットアップ on Mac

概要


タイトル通り。PHP環境セットアップは初めてで少し手間取った。


手順


多言語でも使うことが多いライブラリ等をインストール。


% brew install bzip2 zlib libzip curl libxml2 

phpbrew自体のインストールはphpbrew READMEの通り。

その後、fpmやpgsqlなどのvariantsを指定して7.3.16をインストール。

# 個別のbrew prefix指定でなく事前指定も可能 (=> phpbrew README)
# pgsqlの指定例: +pgsql=/Applications/Postgres.app/Contents/Versions/latest

% phpbrew install --stdout 7.3.16 +default +fpm +curl=$(brew --prefix curl) +openssl=$(brew --prefix openssl) +pdo +bz2=$(brew --prefix bzip2) +zlib=$(brew --prefix zlib) +xml=$(brew --prefix libxml2) +pgsql=<PostgreSQL root directory>

インストールされたことを確認。

% phpbrew switch php-7.3.16
% phpbrew list
* php-7.3.16
% php -m | grep -E '(pgsql|xml|bz|zlib|curl|ssl)'
bz2
curl
libxml
openssl
pdo_pgsql
pgsql
xml
xmlreader
xmlwriter

zlib

php-fpmを起動・停止。


% phpbrew fpm start
Starting php-fpm...
[10-Apr-2020 20:40:06] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
[10-Apr-2020 20:40:06] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root

% phpbrew fpm stop
Stopping php-fpm... 

所感

当初、variantsではなくインストール後にpgsql拡張のインストールができるのかと試したができなかった。PHPそのもののビルド時に必要なのだろうか。PHP全然分からないが、必要なものはインストールできている筈。

2019年5月2日木曜日

DockerコンテナからMacへアクセス


経緯:開発時にDockerコンテナからMac上のDBへ接続させたかった。
結論:host.docker.internalを使う(公式

$ mysql -uroot -h host.docker.internal -p

2016年2月3日水曜日

異なるクラスのスレッド間で同期させる

久しぶりの投稿

当初はあるクラスのスレッド間で1秒ごとにシーケンシャル処理を行いたいというものだった。

# a.rb
class A
  @m = Mutex.new

  def get
    self.class.instance_variable_get(:@m).synchronize do
      sleep 1
      puts "#{Time.now} => #{self.class.name}"
    end
  end

end

# do.rb
require_relative './a'
require_relative './b' # Aとはクラス名のみ異なる。

ps = [A, B]
ts = []

5.times do
  ps.each do |prog|
    t = Thread.new do
      prog.new.get
    end

    ts << t
  end
end

ts.each { |t| t.join }

do.rbの実行結果は次のとおり。

$ ruby do.rb 
2016-02-03 18:10:30 +0900 => A
2016-02-03 18:10:30 +0900 => B
2016-02-03 18:10:31 +0900 => B
2016-02-03 18:10:31 +0900 => A
2016-02-03 18:10:32 +0900 => B
2016-02-03 18:10:32 +0900 => A
2016-02-03 18:10:33 +0900 => A
2016-02-03 18:10:33 +0900 => B
2016-02-03 18:10:34 +0900 => B
2016-02-03 18:10:34 +0900 => A

  • Aのスレッド間では1秒ごとにメソッドが実行されている。
  • Bのスレッド間では1秒ごとにメソッドが実行されている。
ただ、この全部のスレッドで1秒ごとに処理を実行したいという変更が入ったため変更。
今回はモジュール変数で対応した。


# synchronizable.rb
module Synchronizable
  @@m = Mutex.new

  def m
    @@m
  end
end

# a2.rb

require_relative './synchronizable'

class A2
  include Synchronizable

  def get
    m.synchronize do
      sleep 1
      puts "#{Time.now} => #{self.class.name}"
    end
  end
end

# do2.rb
require_relative './a2'
require_relative './b2' # A2とはクラス名のみ異なる

ps = [A2, B2]
ts = []

5.times do
  ps.each do |prog|
    t = Thread.new do
      prog.new.get
    end

    ts << t
  end
end

ts.each { |t| t.join }

do2.rbの実行結果

$ ruby do2.rb 
2016-02-03 18:24:44 +0900 => B2
2016-02-03 18:24:45 +0900 => B2
2016-02-03 18:24:46 +0900 => A2
2016-02-03 18:24:47 +0900 => A2
2016-02-03 18:24:48 +0900 => A2
2016-02-03 18:24:49 +0900 => B2
2016-02-03 18:24:50 +0900 => A2
2016-02-03 18:24:51 +0900 => B2
2016-02-03 18:24:52 +0900 => A2
2016-02-03 18:24:53 +0900 => B2

すべてのスレッドで1秒ごとに処理が実行されている。

2015年3月28日土曜日

VALUE DOMAINとS3を組み合わせて任意のサイトへのリダイレクトを行う設定(簡易版)


VALUE DOMAINのDNS設定、S3を組み合わせてリダイレクトさせる
URL転送用レコードを作成する機能がVALUE DOMAINには元々存在する。
しかし、違う方法でやる必要があったのでメモ。

お題


エンドユーザが www.tachibanakikaku.com にアクセスした時、
foobar.example.com へリダイレクトさせる。

S3バケットの作成・設定



  • バケット: www.tachibanakikaku.com を作成
  • Static Website Hosting で Enable website hosting を選択
  • Index Document には "index.html" を入力
  • Endpointをメモしておく



index.htmlの用意



  • バケット内に次の内容でindex.htmlをアップロードする

<html>
<head>
  <meta http-equiv="refresh" content="0; url=http://foobar.example.com/">
</head>
<body></body>
</html>


  • index.htmlのPermissionsでGrantee: Everyoneを作成し、Open/Downloadを許可


DNSを設定



  • www.tachibanakikaku.com. IN CNAME <メモしておいたEndpoint>



以上

2014年12月8日月曜日

EC2インスタンスのAMIバックアップを取るスクリプト

Rubyで一瞬。

留意事項

  • 認証情報は別途用意する (e.g. ~/.aws/config)。
  • create_imageはAMI作成リクエストを送り直ぐに戻るという想像の下に書いてる。

2014年11月12日水曜日

DPについての講義を受けた記録(前編)

恥ずかしながら未だにDP(動的計画法)に慣れてないのでどうしたものかなと思っていたら「DPなら俺に任せろ。俺はDPの気持ちが分かる」という方が居られたのでそれならと知人と共に簡単な講義をお願いした。「ちょっと張り切って作ってみた」と聞いていたので少しビビりながらも当日に臨んだのでその記録。この内容は入門レベルなので読む必要ない人の方が多いはず。


導入


DPとはなんぞや


Wikipediaには以下の2つの条件を満たすものと書いてある。
  • 分割統治法
  • メモ化
しかし、講義内ではもう少し厳密さを入れたかったのか、ボトムアップに解いていく点も説明に含められていた。まとめると講義では、「部分問題をボトムアップに解いていく」、同じ計算を二度実行しない」の二点が何度も繰り返された。

その後、フィボナッチ数列を例に説明が為された。


フィボナッチをDPで解く例

演習1(ロッド切り出し問題)


ロッド切り出し問題を使った演習。漸化式を見つけると言う分かりきった分かりにくいものだけではなく、部分最適構造性を見つけるということで含まれていたSchemeの例がわかりやすかった。

長さが5の時は、5, (4, 1), (3, 2)の3パターンだが、1から順に入力値までの最適解を求めながらループさせることになる。

コード例

演習2(LCS)


定番のLCSを使った演習。この漸化式見つけられるならそもそも困らないだろと皆がツッコみたいところである。仮定が大事という言葉にうまく丸め込まれた感は否めない。

仮定→漸化式→プログラム、という風に落としこんでいく感じは掴めた(気がする)。

コード例

所感


こういう機会を設けることに意味はあるが、仕事ではあまり使わない現実が悲しい。
久しぶりに書いたけど、Blogger使いづらい。

DP講義(後編)は11/30開催予定

2014年5月15日木曜日

curlを使ってJSONファイルをPOST

偶に必要な時にパッと出てこないので自分用メモ。 

# test.jsonを用意

WikipediaにあるJSONを一部抜き出した次のJSONをサンプルファイルとして使用する。

{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": {
        "state": "NY"
    },
    "phoneNumbers": [
        {
            "type": "home",
            "number": "212 555-1234"
        }
    ]
}

# curlを実行

$ curl -X POST http://localhost:3000 -H 'Content-Type: application/json' -d @test.json

# 受信側がRailsアプリの場合

パラメータとしてJSONは次のように解釈されている。

[1] pry(#<DashboardController>)> params
=> {"firstName"=>"John",
 "lastName"=>"Smith",
 "age"=>25,
 "address"=>{"state"=>"NY"},
 "phoneNumbers"=>[{"type"=>"home", "number"=>"212 555-1234"}],
 "controller"=>"dashboard",
 "action"=>"index",
(余分なものは省略)

コード内では実際に次のようにJSONファイルの中身を取得できる。

[2] pry(#<DashboardController>)> params[:firstName]

=> "John"

これでまた忘れても大丈夫。