memo.xight.org

日々のメモ

Mechanize でパースできないHTMLを強引に処理する

Summary

Mechanizeは、HTML (Content-Type: text/html) をパースする際にMechanize::Pageを利用する。
しかし、パースするHTMLがwell-formedではない場合、パースに失敗する。

Mechanize::Page で処理

require 'mechanize'

agent = Mechanize.new
agent.pluggable_parser['text/html'] = PlainFile
page = agent.get("http://example.com/")
p page


#<Mechanize::Page
 {url #<URI::HTTP http://ill-formed.com/>}
 {meta_refresh}
 {title "ill-formed.com"}
 {iframes}
 {frames}
 {links}
 {forms}>

Plain Textで処理

require 'mechanize'

class PlainFile < Mechanize::File; end

agent = Mechanize.new
agent.pluggable_parser['text/html'] = PlainFile
page = agent.get("http://example.com/")
p page


#<PlainFile:0x00007fb8d2077910
 @body=
  "<!doctype html>\n" +
  "<html>\n" +
  "<head>\n" +
  "    <title>ill-formed.com</title>\n" +
  "\n" +
  "    <meta charset=\"utf-8\" />\n" +
  "    <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n" +
  "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n" +
  "\t<link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\" />\n" +
  "</head>\n" +
  "\n" +
  "<body>\n" +
  "<div>\n" +
  "    <h1>ill-formed.com</h1>\n" +
  "\t<p>This domain is established to be used for ill-formed HTML test. <!-- </p> -->\n" +
  "<!-- </div> -->\n" +
  "<!-- </body> -->\n" +
  "<!-- </html> -->\n",
 @code="200",
 @filename="index.html",
 @full_path=false,
 @response=
  {"server"=>"GitHub.com",
   "date"=>"Thu, 05 Oct 2017 14:55:52 GMT",
   "content-type"=>"text/html; charset=utf-8",
   "transfer-encoding"=>"chunked",
   "last-modified"=>"Thu, 05 Oct 2017 14:55:35 GMT",
   "access-control-allow-origin"=>"*",
   "expires"=>"Thu, 05 Oct 2017 15:05:52 GMT",
   "cache-control"=>"max-age=600",
   "content-encoding"=>"gzip",
   "x-github-request-id"=>"F5F8:1F5B:54E8B4B:7C0A75B:59D647F8"},
 @uri=#<URI::HTTP http://ill-formed.com/>>

crontab -e で temp file must be edited in place

Summary

crontab を編集する際、エラーが発生して crontab が編集できない。

crontab: no crontab for [USERNAME] - using an empty one
crontab: temp file must be edited in place

原因は, vim が作成する自動バックアップファイル。
/tmp, /private/tmp でバックアップをさせないようにすればよい。

.vimrc

set backupskip=/tmp/*,/private/tmp/*

Reference

yuyarinの日記 - 2010-02-25 - Mac OS X で cron を使う(EDITOR=vim)
http://d.hatena.ne.jp/yuyarin/20100225/1267084794

Docker for Mac を Remote APIから使う

Docker server側 で docker-proxyを起動

$ docker run -p 3375:2375 --name docker-proxy -v /var/run/docker.sock:/var/run/docker.sock -d -e PORT=2375 shipyard/docker-proxy


Docker client側 で 環境変数を設定

環境変数 DOCKER_HOST にdocker serverのIPアドレス:ポート番号を指定

$ export DOCKER_HOST="tcp://192.168.0.254:3375"
$ docker ps
CONTAINER ID        IMAGE                   COMMAND                CREATED             STATUS              PORTS                    NAMES
0123456789ab        shipyard/docker-proxy   "/usr/local/bin/run"   2 minutes ago       Up 2 minutes        0.0.0.0:3375->2375/tcp   docker-proxy


Reference

Docker Community Forums - 2016-06-16 - Remote API with Docker for Mac (BETA)
https://forums.docker.com/t/remote-api-with-docker-for-mac-beta/15639/5

gemの一括uninstall

Summary

gem uninstall -aIx $(gem li --no-versions | grep -v -E "bigdecimal|io-console|json|openssl|psych|rdoc")


fishの場合

gem uninstall -aIx (gem li --no-versions | grep -v -E "bigdecimal|io-console|json|openssl|psych|rdoc")


Reference

Qiita - hachi8833 - インストールされているgemを一括で削除する
http://qiita.com/hachi8833/items/e6b0380c3b6d5e115e36

Google Chrome で ERR_SSL_VERSION_INTERFERENCE が発生した時のワークアラウンド

Summary

Google Chrome を利用して Proxy経由で mail.google.com にアクセスした際、
ERR_SSL_VERSION_INTERFERENCE が発生する。

ERR_SSL_VERSION_INTERFERENCE

利用している Google Chrome のバージョンは 61.0.3135.4 (Official Build) dev (64-bit)

chrome://flags/ から
Maximum TLS version enabled の値を TLS1.2に変更することで、応急処置完了。

Maximum TLS version enabled - TLS1.2
Relaunch now

Reference

superusers.com - This site can’t be reached: “mail.google.com is currently unreachable”
https://superuser.com/questions/1217257/this-site-can-t-be-reached-mail-google-com-is-currently-unreachable

2017年 プロジェクトマネージャ試験の自分なりの解答

Summary

2017年 プロジェクトマネージャ試験を受けてきた。
午後Iは問1,3を選択
午後IIは問1を選択
まだ解答がでていないので、自分の解答を一部訂正して書いておく。

午前II

問1 エ
問2 ア
問3 イ
問4 ウ
問5 ウ
問6 エ
問7 エ
問8 ウ
問9 ア
問10 イ
問11 エ
問12 ウ
問13 ウ
問14 エ
問15 イ
問16 ア
問17 エ
問18 ア
問19 エ
問20 イ
問21 イ
問22 ウ
問23 エ
問24 イ
問25 エ

午後I 問1

設問1 製品の輸出に必要な認定を省き、製品輸出開始期日を厳守するため (30/30字)
設問2 ワークショップの出力となる差異一覧に漏れがあるとスケジュール遅延が発生するから (39/40字)
設問3
(1) K社作業員がワークショップに参加しないことによる要件定義遅滞を防止するため (38/40字)
(2) リソース : ワークショップにK社の人員を割くことが出来ない (23/25字)
(2) スケジュール: MESプロジェクトも増設工事も作業期間の余裕がない (25/25字)
設問4
AI活用の前提となる一定期間の履歴データが揃っていないから (29/35字)
AI活用の前提となる生産計画最適化の基準が明確になっていないから (32/35字)

午後I 問3

設問1 (1) 結合テストケース作成の入力となる内部設計書は、単体テスト完了まで修正される可能性があるから (45/45字)
設問1 (2) 過去に作成したモジュールに起因するバグ (19/20字)
設問2 (1) 修正が後工程になるほど修正コストが高くなるから (23/25字)
設問2 (2) a: ホワイトボックス, b: ブラックボックス
設問2 (3)
  分析対象: 見直し前後の見逃しバグの件数 (14/15字)
  評価結果: 見直し後に見逃しバグの件数が減っている (19/20字)
設問3 (1) 過去に作成したモジュールを活用しているかどうか (23/25字)
設問3 (2) 摘出された未修正バグの件数が多く、修正期間が足りないから (28/35字)
設問4 内部設計書の訂正箇所及び新規作成箇所に漏れがないよう確認 (28/30字)

機械学習アルゴリズム機能比較

Reference

Qiita - 2017-02-20 - 主要クラウドサービス別 機械学習アルゴリズム機能比較
http://qiita.com/iga-tomo/items/c3228700899f86a11508

Microsoft Azure - 2017-03-14 - Machine learning algorithm cheat sheet for Microsoft Azure Machine Learning Studio
https://docs.microsoft.com/en-us/azure/machine-learning/machine-learning-algorithm-cheat-sheet

RubyMine + IdeaVim

Summary

RubyMine を vim のキーバインドで使いたい。

$HOME/.ideavimrc

" clipboard sharing
set clipboard+=unnamed

RubyMine - [Preferences...] - [Keymap]

Plug-ins - IdeaVim - Scroll Half Page Down に Command+D
Plug-ins - IdeaVim - Scroll Half Page Up に Command+U
Plug-ins - IdeaVim - Redo に Ctrl+R

Reference

JetBrains - Plugins - IdeaVim
https://plugins.jetbrains.com/plugin/164-ideavim

Heroku app の作成

作成

$ heroku create
Creating app... done, ⬢ heroku-appname-00000
https://heroku-appname-00000.herokuapp.com/ | https://git.heroku.com/heroku-appname-00000.git


一覧表示

$ heroku list
=== user@example.com Apps
heroku-appname-00000
heroku-appname-11111
heroku-appname-22222


削除

$ heroku apps:destroy --app heroku-appname-00000 --confirm heroku-appname-00000
 ▸    WARNING: This will delete ⬢ heroku-appname-00000 including all add-ons.
 ▸    To proceed, type heroku-appname-00000 or re-run this command with --confirm
 ▸    heroku-appname-00000

> (ここに heroku-appname-00000 を入力)
Destroying ⬢ heroku-appname-00000 (including all add-ons)... done

削除 (確認なし)

$ heroku apps:destroy --app heroku-appname-00000 --confirm heroku-appname-00000
Destroying ⬢ heroku-appname-00000 (including all add-ons)... done

Railsでカラム名の変更

Terminal

rails generate migration fix_typo


db/migrate/XXXXXXXXXXXXXXXX_fix_typo.rb

class ChangeColumnModelName < ActiveRecord::Migration[5.0]
  def change
	rename_column :modelname, :wrong, :correct
  end
end

Terminal

rake db:migrate

RubyMine + bundler + rails

環境整備

-- Terminal
bundle init
bundle install --path vendor/bundle --jobs 4
bundle exec rails new sample_app


RubyMine

RubyMineでアプリケーションのディレクトリ (sample_app) を開く
[Tools] - [Bundler] - [Install] --path vendor/bundle --jobs 4

[Run] - [Edit Configure...]
Rails, Rake, Ruby, RSpec の Bundler タブから
Run the script in context of the bundle (bundle exec) にチェックを入れる。

rails generate で error

gem install spring


[Tools] - [Run Rails Generator...] が表示されない場合

rm .idea


RubyMine を終了、再度起動