ちゃなんログ

書き散らします。マラソンがしたいです。

goenv2系でのGOPATHの取り扱い

最近goを触ってるのですが、環境構築にgoenvを用いました
その際にGOPATHの取り扱いでハマったのでメモがてら

goenvのインストール

$ git clone https://github.com/syndbg/goenv.git ~/.goenv

上記のようにbrewではなくgit cloneを使ってインストールをすると

$ goenv -v
goenv 2.0.0beta9

goenv2系がインストールされます
goenvに対する理解が乏しかったので何の疑いもなく、このままGOPATHの設定を行いました

GOPATHの設定とハマり

export GOPATH=$HOME/Documents/platform
export PATH=$GOPATH/bin:$PATH

上記のようにGOPATHを任意のディレクトリに設定しようとしますが

$ go env
GOPATH="/Users/yuma.minami/go/1.10.3"

GOPATHの変更が反映されず
Home/go/version
が設定されています

goenv2系からはgoenvがGOROOTとGOPATHの管理・変更をするようになったのが原因でした

Changed goenv’s bootstrap (eval $(goenv init -)) now to call goenv-sh-rehash --only-manage-paths. This means that it’ll export and manage GOROOT and GOPATH env vars. It does not attempt to manage when version is system. ; Ref: https://github.com/syndbg/goenv/pull/70

Changed goenv-exec now to set GOPATH and GOROOT environment variables before executing specified cmd and args. Can be disable via GOENV_DISABLE_GOPATH=1 and GOENV_DISABLE_GOROOT=1. GOPATH can be configured with GOENV_GOPATH_PREFIX. E.g GOENV_GOPATH_PREFIX=/tmp/goenv. Default managed GOPATH is $HOME/go. ; Ref:

回避方法

GOENV_DISABLE_GOPATH=1

上記をbashrcなどに設定しておけばgoenvによるGOPATHの管理を無効化できます

まとめ

めっちゃ単純ですがハマってしまいました
goの勉強会に行った際にはgoenvなどのツールを用いて環境構築するのはあまり推奨されていないと言われました
理由としてはやはりツール独自の仕様に依存してしまうことが大きいようです

phpの真偽値判定について

なんです
最近phpを学んでいます。言語を学ぶ上でtrueとfalseの真偽値を理解しておくことは、後々の事故を防ぐために役立ちます。今回はphpの真偽値についてまとめたいと思います。

条件 php ruby javascript
true true true true
false false false false
"true" true true true
"false" true true true
0 false true false
1 true true true
0.0 false true false
0.1 true true true
"0" false true true
"1" true true true
[] false true true
["0"] true true true
null or nil false false false

自分が普段よく使うrubyjavascriptも記述してみました
条件が足らない部分もあるかもしれませんが最低限このくらい覚えたいです

単純にわかりやすいruby

rubyは一番単純です。nilとfalse以外は全てtrueと判定されます
普段、処理を記述していて真偽値で迷うことはまずありません
しかし、boolean型へ変換するメソッドがないのでそこは少し不便かも?

ちょっと戸惑ったphp

個人的にphpは「おぉう」ってなりました。気になったのは"0"と空配列の2つです
どちらもfalseとなるのですが知らないと詰まってしまいそうです。特に"0"は気づかない可能性が高いです。空配列がfalseになるのは使い方次第で便利かな

Laravel環境をLaradockとDockerで構築する

なんです。
前回、php7の環境を構築したのですが予想以上に面倒だったので、今回はDockerを用いてLaravel環境を構築したいと思います。DockerイメージにはLaradockを用いたのですが、かなり手軽に構築することができるし、デフォルトで色々入っているので後々遊ぶのにも困らない気がします。自分はmacユーザなのでDocker for Macを使用します

Laradockとは

Laravel環境をDockerで簡単に構築するためのDockerイメージ
nginxやmysqlなど開発に必要なものを概ね揃えることができます

laradock.io

構築手順は公式も読んだのですが、うまくいかない部分もあったので先駆者の記事を梯子しました

Laradockをクローンし、.envファイルを作成

Laradockはクローンして使用します

GitHub - laradock/laradock: Docker PHP development environment.

git clone https://github.com/laradock/laradock.git

クローンが完了したらディレクトリを移動し、.envファイルを作成します
すでにenv-exampleというファイルが存在するので今回はコピーして使用します

cd laradock
cp env-example .env

公式ではこの.envファイルに

DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd

上記を追記し、mysqlなどの利用設定を行っています。
今回はとりあえずLaravelを起動するだけなので設定は必須ではありません。

必要なコンテナを起動

コンテナを起動していきます
Laravelの動作確認だけなら

docker-compose up -d nginx

これだけで問題ないです
全部起動する場合は

docker-compose up -d nginx mysql redis beanstalkd

これで起動します
初回はめっちゃ時間かかります
docker psで起動を確認すると

NAMES
laradock_mysql_1
laradock_redis_1
laradock_beanstalkd_1
laradock_nginx_1
laradock_php-fpm_1
laradock_workspace_1
laradock_docker-in-docker_1

こんな感じで色々起動しています
workspaceというのがlinuxのコンテナでここで作業を行います

Laravelのテストプロジェクトを作成

workspaceコンテナに入ってLaravelプロジェクトを作成します

docker exec -it laradock_workspace_1 /bin/bash

laradock_workspace_1の部分は適宜変更してください
workspaceにはcomposerなどがすでに用意されているので

composer create-project laravel/laravel checkapp

checkappの部分には自分が作成したいプロジェクト名が入ります

Do not run Composer as root/super user! See https://getcomposer.org/root for details

こんな感じでroot権限でcomposerを動かすなとwarningが出ますが無視します

docker-compose.ymlのボリュームを変更

このままでは作成したLaravelプロジェクトにDockerがマウントされていないので、修正します
そのため、一度Dockerを停止します

docker-compose stop

停止が完了したらdocker-compose.ymlを修正します

volumes:
  - ${APP_CODE_PATH_HOST}/checkapp:${APP_CODE_PATH_CONTAINER}

上記のように${APP_CODE_PATH_HOST}の後に作成したLaravelプロジェクト名を続けます
${APP_CODE_PATH_HOST}は複数箇所に記述されているので全て修正します

修正完了後、再びDockerを起動します

docker-compose up -d nginx

localhostにアクセスし、Laravelのスタートページが表示されれば成功です http://localhost/

感想

かなり手軽に構築することができました
phpバージョンも7系が入っているので色々遊んでみようと思います

Canvasタグを使って動画のキャプチャを作成する

なんです。
以前会社のエンジニアブログに投稿したことがあるのですが、転載が許可されたため、個人ブログにも書いておこうとおもいます。

動画の状態をCanvasタグに描画する処理なのですが、当時はjQueryを使用して作成していたので、なんとなくjavascriptのみで書き直しました。

<html>
  <head>
    <meta charset="utf-8">
    <script src="hoge.js"></script>                                                                                                 </head>
  <body>
    <video id="video" src="test.MOV" width="288" height="512" controls></video>
    <button id="capture" onclick="sample()">キャプチャー</button>
    <canvas id="canvas"></canvas>
  </body>
</html>

htmlはこんな感じです。videoタグを表示するだけのシンプルなものです。

function sample() {
  var video = document.getElementById('video');
  var canvas = document.getElementById('canvas');
  canvas.setAttribute('width', video.width);                                                                                        
  canvas.setAttribute('height', video.height);
  canvas.getContext('2d').drawImage(video, 0, 0, video.width, video.height);
}

実際にCanvasを操作するのがこちらのjsです。

canvas.getContext('2d').drawImage(video, 0, 0, video.width, video.height);

6行目のこの部分がCanvasへの描画を行なっています。drawImageの引数には注意が必要で

drawImage(対象video, canvasの描画スタートx座標, canvasの描画スタートy座標, 描画width, 描画height)

割とごちゃごちゃする部分だと思います。

このblog記事は、株式会社アドウェイズの記事(http://blog.engineer.adways.net/entry/2017/02/24/160000)を許可を得て転載したものです。(執筆者は当blog管理人自身です)

php7系をphpenvでmacにインストールする

お久しぶりです。なんです。
スクレイピングの記事を書く予定でしたがちょっと飽きたので今回は違う記事にします。

近々php7を触る予定があり、自宅macに環境を構築した際、軽い気持ちでやってたら痛い目をみたのでそこら辺を自分へのメモも込めて書きたいと思います。

要件

  • phpenv + php-buildを使ってphpをインストール
  • インストールするphpのバージョンは7.2.0

phpenvとphp-buildのインストール

git clone https://github.com/CHH/phpenv.git
cd phpenv/bin
./phpenv-install.sh

phpenv自体はこれでうまく入ってくれます。

export PATH="/Users/uenoryouichi/.phpenv/bin:$PATH"
eval "$(phpenv init -)"

~./bashrcに上記を記述すればとりあえず大丈夫です

git clone https://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build

php-buildは上記だけです。ここまでは余裕でこれます。 rbenvを入れてる場合は競合などあるので注意が必要です。
問題はここから

実際にphpをインストール

phpenv install 7.2.0

そして動かない。
調べてみると依存パッケージが存在するようで...

bison
openssl
libxml2
jpeg
libpng
icu4c
gcc
re2c
libmcrypt
autoconf
automake
libiconv

これだけいるらしいです。
ここまでやってもうdockerでいいやって思いました。
てな訳で会社の先輩に教えてもらいつつdockerで動かします。

Capybara+Selenium+Headless Chromeでスクレイピング

なんです
前回の記事でHeadless Chromeでスクショを撮るところまでを行いましたが、今回は実際に簡単なスクレイピングを行い、DOM要素にアクセスしたいと思います

テストには 阿部 寛の映画出演 こちらのページを使用させていただきます

やること

サンプルコード

前回のスクリーンショットを撮る際に使用したソースに以下を追記します

url = 'http://abehiroshi.la.coocan.jp/movie/eiga.htm'
@movies = session.find_all('table')[1]
          .find_all('tr').each_with_object(Hash.new { |hash, key| hash[key] = [] }) do |title, result|
            result['titles'].push(title.text)
          end

slim :index
doctype html
html
  head
    title Sample
  body
    - @movies['titles'].each do |title|
      p #{title}

slimが好きなのでslimで書いてますがハイライトがなかったです

辛かったこと

  • 対象ページのDOMにはclassがほぼない
    • class指定によるDOM検索ができないのでhtml要素を直接findしなくてはいけなかった
  • 対象ページにtableタグが複数あった
    • これに気づかずfindで検索をしていたがtableが2つあったため、エラーをはかれた

正直、DOM検索処理は汚いし問題ありですがとりあえず動きます

次回は同じ構成でログイン処理を絡めたスクレイピングをしてみようと思います
雑ですがgithub晒しておくのでお気軽に

github.com

Capybara+SeleniumでHeadless Chromeを動かす

なんとか続いてるローテーションブログ、火曜担当のなんです 今回はchrome59から導入されたヘッドレスモードをCapybara+Seleniumで動かしてみました。言語にはRubyを使用します

やりたいこと

今回は試しに使ってみるだけなので、スクショを撮るところまで行います。次あたりでCapybara+Seleniumらしくスクレイピングっぽいことをしようと思います

ちなみに単純にchromeをコマンドからヘッドレスモードで起動することもできます

chrome --headless --disable-gpu --dump-dom http://abehiroshi.la.coocan.jp/

自分の場合は以下のようなエイリアスを作成しているのでchromeの部分は適宜変更してください

alias chrome="/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome"

サンプルコード

Gemfile

以下のgemを使用しました

gem 'sinatra'
gem 'activesupport'
gem 'sinatra-contrib'
gem 'capybara'
gem 'selenium-webdriver'
gem 'chromedriver-helper'
gem 'pry-byebug'
gem 'launchy'

sinatra関連のgemは後々画面にスクレイピング結果を表示する際に使用するので、今回はなくても大丈夫です

スクリーンショット取得処理

require 'sinatra'
require 'sinatra/reloader'
require 'pry'

require 'selenium-webdriver'
require 'capybara'

get '/' do
  Capybara.configure do |capybara_config|
    capybara_config.default_driver = :selenium
    capybara_config.default_max_wait_time = 10
  end

  Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(
      app,
      browser: :chrome,
      desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome(
        chrome_options: {
          args: %w(headless disable-gpu window-size=1680,1050),
        },
      )
    )
  end
  Capybara.javascript_driver = :chrome

  url = 'http://abehiroshi.la.coocan.jp/'
  session = Capybara::Session.new(:selenium)
  session.visit(url)
  session.save_and_open_screenshot('screenshot.jpg')
end

これで指定URLのスクショをscreenshot.jpgというファイル名で作成することができました。雑ですがgithub晒しておくのでお気軽に

github.com

かなり手軽に遊べるので、次は実際にどこかのサイトをスクレイピングしてみようと思います