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 |
自分が普段よく使うrubyやjavascriptも記述してみました
条件が足らない部分もあるかもしれませんが最低限このくらい覚えたいです
単純にわかりやすい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をクローンし、.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/
感想
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のインストール
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検索処理は汚いし問題ありですがとりあえず動きます
Capybara+SeleniumでHeadless Chromeを動かす
なんとか続いてるローテーションブログ、火曜担当のなんです 今回はchrome59から導入されたヘッドレスモードをCapybara+Seleniumで動かしてみました。言語にはRubyを使用します
やりたいこと
- 指定URLのスクリーンショットを撮る
今回は試しに使ってみるだけなので、スクショを撮るところまで行います。次あたりで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晒しておくのでお気軽に
かなり手軽に遊べるので、次は実際にどこかのサイトをスクレイピングしてみようと思います