久しぶりにAirMacExpressを使おうと電源を入れた。
再起動できないのでフリーズしたときどうするかなぁって考えてた。Apple製品は内部的に同じOSXを使ってるだろうしSSH経由でログインして・・・って調べるのがあまりに面倒だ
airmac(airport)の再起動は専用アプリからできる。
いちいち電源抜きに行くの面倒だったんだよねぇ。
右クリックしてみたり、あれこれ試してたけど、メニューバーにあったんだ。メニューバー非表示にしてたからハマったわ
画像処理をしようと思い立った、類似画像検索というか、画像の差分をみて特定のシーンを探すようなものを試みたい。
brew install opencv3
ただし、gcc までインストールされちゃっていつ終わることやら。。。
brew install opencv3 --without-numpy
numpy なかったら大変だろうけど、そのうち入れるとして、パパッと入れるならこっちのほうが早そう
brew link opencv3 --force
opencv3 はkeg only だったのでリンクする
takuya@~$ python Python 2.7.11 (default, Dec 25 2015, 03:11:22) [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 c>>> cv2.__version__ '3.1.0' >>>
できた。
python3 で使うときは brew install 時に with-python3 も付ける
numpy は brew で入れてた
import cv2 src_img = cv2.imread('/Users/takuya/Desktop/IMG_0061.jpg',0) canny_edges = cv2.Canny(src_img,100,200) cv2.imwrite("out.jpg", canny_edges)
インストールオプションにpyhton3 を付記すると、python3 ようにモジュールが作られてリンクされる。
brew install opencv3 --without-numpy --with-python3 brew link opencv3 --force
Mac OS X で OpenCV 3 + Python 2/3 の開発環境を整備する方法 - 意識低い開発者のBlog
brew deps --tree opencv3 homebrew/science/opencv3 (required dependencies) └── :python3 ├── cmake │ └── sphinx-doc ├── pkg-config ├── jpeg ├── libpng │ └── xz ├── libtiff │ └── jpeg ├── eigen │ └── cmake │ └── sphinx-doc ├── openexr │ ├── pkg-config │ └── ilmbase └── homebrew/python/numpy ├── :python3 └── :gcc
なるほど、ツリー形式でみると分かりやすい
bundler で出来ることを最初に知ることが必要
bunder はプロジェクトで使ってるgem を一覧するためのもの。
bundler は 必要なgem をインストールしてくれる
bundler は、自作ライブラリのgem化が出来る
bundler は、プロジェクトに必要なGemを「プロジェクト毎」にインストール出来る
bundler は、共有gem とプロジェクトで足りないものをインストール出来る。
つまり、bundler を使うことで、「必要なGem」の一覧を管理することが出来る。
このことにより、デプロイ先に開発元と同じgem環境を再現することができる
ディレクトリにGemFileを作成する。
もしくは、コマンドラインで bundle init とする
sudo apt install ruby-bundler
mkdir プロジェクト cd プロジェクト bundle init bundle config set --local path 'vendor/bundle' echo gem "nokogiri" >> GemFile bundle install
なにか追加したいときは、マニュアルで編集するか
vim GemFile bundle install
または、bundle add する
bundle add sqlite3
bundle コマンド導入後なら、次をコピペすれば、プロジェクトごとに分離したbundler 環境を作れる。
mkdir my-project cd my-project bundle init bundle config set --local path 'vendor/bundle' bundle config set --local disable_shared_gems true bundle add sqlite3
プロジェクト内部でruby を実行するとき
bundle 経由で実行する
bundle exec ruby sample.rb
sample.rb ではrequire するだけでいい。
# in sample.rb require 'sqlite3'
はじめに、source を書く。
source "https://rubygems.org"
これにより、gemをどこから探すか指定することが出来る。
自作レポジトリも指定できる。
source "https://rubygems.org" source "https://takuya.example.org"
作成方法はgem generate_indexなどでググれば出てくる。
GemFileには、必要なGemを書いていく。
gem "nokogiri" gem "pry" gem "sequel"
必要なgem ファイルは、グループ分けすることが出来る
gem "nokogiri" group :development do gem "pry" group :test do gem "shoulda" end
グループ分けしておくと、便利なことがある。
バージョンを指定することが出来る
gem "nokogiri", ">= 1.4.2"
バージョン指定の方法は ruby require や gem install で用いられるものと同じだと思えばイイ。
おもに GemFile が使われる。
GemFile.lockがBundlerで実際にインストールされたバージョンの一覧。
lock ファイルの記述を優先してインストールすることになる
gem file lock 記述を優先してインストールを再現される。が、、困った現象が起きた経験がある。
Bundlerが windows バイナリをOSXに入れようとしてて驚愕。OSXにCygwinのバイナリ入れたら動かんだろう?でもインストールしてた。それがlockファイル。
Windowsバイナリでトラブルったのでgemfile.lock は細かく管理したい時に用途を限ることにした。バージョンやバイナリを詳細設定するときに限る。
Windows(開発)→Linux(デプロイ)のときは、全く役に立たないし、lockは消して構わない。gemfile.lock があるせいで、lockファイルはゴミ
bundle install のやり方が分かったら、次に bundler を使ったrequire を覚えておく
require 'bundler' Bundler.setup require 'nokogiri'
はい、これでOK
bundler が良く分からない理由はコレだと思う。
この2パターンがあってですね。システム環境やユーザー環境のGEM_HOMEかプロジェクト環境を選ぶことが出来るわけ。
個人で使う分には、プロジェクト環境よりシステム環境やユーザー環境利用が幾分に楽。
共有のgem をdisabledにして、プロジェクト内にgem 環境をゼロから作る。
bundle install vendor/bundle --disable-shared-gems
この場合、システム環境のgemは全て無視される
または、.bundle/config にかく
echo BUNDLE_DISABLE_SHARED_GEMS: '1' >> .bundle/config
これで、bundleはプロジェクト環境に全てのgemをインストールする。
bundle が良く分からない現代魔法になってるのは、shared_gems にあるとおもう。
BUNDLE_DISABLE_SHARED_GEMS: '1'
システム環境のgemを使いたい時は、 BUNDLE_DISABLE_SHARED_GEMS: '1'を消す
一年くらい使っててbundle でプロジェクト毎にパッケージをインストールするのは無駄と思うようになった。
pry とか mysql2 とかいくつもインストールしてんだわ。
システムの libxml 環境変わったのに古いbundleがlib指してて反って面倒だったり。システム全体のgem 使って欲しい場面のほうが多かった。 とくに開発環境だと時間の無駄が多いので必要ない気がする。
デプロイ先なら BUNDLE_DISABLE_SHARED_GEMS: '1' をした方がいいかも。
つまり、BUNDLE_DISABLE_SHARED_GEMSがあると同じgemをいくつもインストールするので、ちょっとイラッとする。
bundleの手軽さが死ぬきがする。bundleのよさは git clone ; bundle install ; ですぐ使えることだと思うんだ。
bundle/config の上書き関係
たとえば、BUNDLE_DISABLE_SHARED_GEMSの設定は次の箇所で指定される。
~/.bundle/config PROJECT/.bundle/config bundle install --disable-shared-gems
の順番で、ユーザ → プロジェクト → コマンド実行時になる。
ただし、BUNDLE_PATHが環境変数にあったり、disable-shared-gemsが指定されていればこの限りではない。
なので、油断してるとシステム環境にインストールされちゃったり、プロジェクト環境にインストールされちゃうので注意が必要
私の場合、rbenv 環境にgem がインストールされないと思って悩んでいたら
ユーザー環境にデフォルト設定が会った。 ~/.bundle/config に disable-shared-gems
が設定されていた。はぁ。。。
rbenv やrubygems が管理してるgemに任せるのが楽だった。
takuya@~$ bundle config Settings are listed in order of priority. The top value will be used. bundle install
個人環境なら vendor/bundle 使うとかえって面倒かもね。 使わなくなったら
gem uninstall hogehoge gem cleanup
で消しちゃってもいいしrbenv環境ごとポイッ
個人のrbenv環境で使うなら、何も設定せずにbundle install 叩いてたほうが圧倒的に楽だと思った
同じファイルをいくつもシステムに持つのダルいしコンパイルオプション考えるの面倒だしさ 自分のプロジェクトってだいたい同じようなgem使ってるじゃん?大きく違うバージョンや環境でもない限り vendor 使う必要ないと思った。
gem のソースを追いかけるために、locate や mdfind して同じファイルが大量に来るのも気持ち悪い・・・
bundle install --system
ただ、既存のlock やconfigがあるとうまく動かない
bundle install vendor/bundle --disable-shared-gems
これは、shared-gem(さっき言及した、システム全体gem)を拒否して、vendor/bundle にゼロからgem 空間を構築する 必要なgems の全てがvendor/bundleに入ります。
path / disable-shared-gems はワンセットになってるので消しちゃうとちょっと面倒なことに
手元の環境で、vendor/bundle 使うと、ここが不便でいや何だけど。
現在のbundler の設定は bundle config で確認できる
$ bundle config Settings are listed in order of priority. The top value will be used.
bundle の設定は、プロジェクトとHOME_PATHの2つをマージして使う
~/.bundle/config PROJECT_HOME/.bundle/config
の2つのymlをマージすることになる。
たとえば、bundle install nokogiriにビルドオプションを与えたい時
bundle config --global build.nokogiri -- \ --with-xml2-dir=`brew --prefix libxml2`\ --with-xslt-dir=`brew --prefix libxslt`
とする。
全てのbundle install nokogiri に設定したいときは ~/.bundle/config に書く。
> cat ~/.bundle/config --- BUNDLE_BUILD__NOKOGIRI: "--with-xml2-dir=/usr/local/opt/libxml2 --with-xslt-dir=/usr/local/opt/libxslt"
設定項目には次のようなものがある。
設定は、同名の環境変数でも上書き
される。 環境変数のほうが楽かも?
環境変数を使う場合
BUNDLE_BIN="vendor/bundle/bin" bundle install
また、config を指定する時だけ、次のような読み替えが許されるっぽい
BUNDLE_PATH => path BUNDLE_BIN => bin
設定ファイルとコマンドオプションは同じ設定項目を意味する。
BUNDLE_BIN: "./bin" bundle config --global bin "./bin"
bundle が真価を発揮するのはここ。
bundle install --deployment
このコマンドで、GemFile.lock で指定されている必要なパッケージを取ってくる GemFile はユーザー指定 Gemfile.lock は bundle が調べて必要だと判別した全て。
ちなみに、そういうのはネットから取ってこれない場合のために
gem package
すると vendor/cache に貯めておいてくれるので git vendor/cache でもしとけばいいけど、、OS超えてまでまず動かないと思うしやらないと思う。
bundle install --deployment --path=vendor/bundle
で環境の再現ということで。
bundle exec nokogiri bundle exec
手元の環境で、vendor/bundle 使うと、ここが不便でいや何だけど。
bundle コマンドを補完したい
brew install ruby-completion brew install bundler-completion
などと、補完もいっぱいある
更新。
http://bundler.io/v0.9/bundle_install.html
https://gist.github.com/kozy4324/5719555
http://stackoverflow.com/questions/8104370/what-does-it-mean-bundle-disable-shared-gems-1
http://xxxcaqui.hatenablog.com/entry/2013/02/11/013421
http://ruby.studio-kingdom.com/bundler/gemfile
*1:HOME_PATH を --global というのはセンスが無いと思った --user にして欲しい --global は etcを期待してしまうハマった
ファイル名に [] ブラケットが混ざるととても扱いが面倒くさい。
以下の様なファイル構造があるとする。
takuya@~/Desktop$ tree '[資料]授業資料' [資料]授業資料 └── a └── b
>> Dir.glob '[資料]授業資料/*' => []
glob の マッチの文法に、[set]
が含まれるので、どうしようもない。
takuya@~/Desktop$ irb >> >> cmd = "ls '[資料]授業資料' '[資料]授業資料-01' " ls: cannot access '[資料]授業資料-01': No such file or directory>> cmd => "'mv [資料]授業資料' '[資料]授業資料-01' " >> exec cmd sh: [資料]授業資料: command not found
mv だけダメなんですよ。
ls なら出来る。
>> cmd = "ls -l '[資料]授業資料' " => "ls -l '[資料]授業資料' " >> exec cmd total 0 drwxr-xr-x 3 takuya staff 102 8 9 00:15 a
utf-8 の日本語全てがエスケープされちゃいましたよ。もうどうしろというのか
>> cmd = 'mv ' + Shellwords.escape('[資料]授業資料') + ' ' + Shellwords.escape('[資料]授業資料-01') => "mv \\[\\資\\料\\]\\授\\業\\資\\料 \\[\\資\\料\\]\\授\\業\\資\\料-01" >> print cmd mv \[\資\料\]\授\業\資\料 \[\資\料\]\授\業\資\料-01=> nil
Stackoverflowとかも一応見てみたけれど、逐次置換するしか無いっぽいぞ。
Rubyのこのあたりの文字コードと、文字列の扱いは本当にひどいと思う。
このように、ファイルに含まれるglob文字列を展開する必要がありそうだ
file_name.gsub( %r'[\{\}\[\]\*\?\\]' ) {|c| '\\'+c }
あーめんどくさい
なぜか、私だって知りたい。私のicloud アカウントが毎朝ロックされています。
もう、面倒なので、メインのメールアドレスを変更してアカウントをしばらくちょっと違う状態にした。
しかし、メールアドレス変更後のOSXは iCloud ログインで詰まる。メッチャ詰まる。
システム環境設定でicloud 設定をしても詰まる。メールアドレス変更後の iCloud アカウント設定オカシイ。
ずっとフリーズして、システム環境設定が応答なしになる。参った。
icloud 関係の設定で関係がありそうな、ファイルを消して、エラーにしてしまえば、初期設定されるだろう。と予測。
それで、~/Library/ を探してたら mobileme 関連の plist があってソコにAppleIDが書いてあった。
~/Library/Preferences/MobileMeAccounts.plist
とりあえず、消せば、何かしらエラー初期化されるだろうと思って消したらビンゴ。
ちょっと適当な解決策だけど、目的を達成するには十分だった。
iCloud アカウント設定は、iPhone(Mac)を探すや、Keychainsが絡むので、アカウント変更は、思いつきでやっっちゃうと痛い目を見ることを学んだ。
sw_vers
takuya@~/Desktop$ sw_vers ProductName: Mac OS X ProductVersion: 10.11.2 BuildVersion: 15C50
便利そう。
slideshare がlinkedin になってから色々と厳しかったり、PDFをちょとお電波の届かないところで参照資料に出そうと思っても、不便すぎる
世の中100%オンラインと限らないんで。。。
自作のブラウザで、JPG画像をキャッシュしてPDFに焼き直す
#!/usr/bin/env ruby # require 'prawn' require 'mechanize' require 'open-uri' m = Mechanize.new m.get ARGV.shift list = m.page.search('//img[@class="slide_image"]/@data-full').map{|e| e.text() } Prawn::Document.generate(( m.page.title.to_s+ ".pdf") ,:page_layout => :landscape, :page_size=>"A4") do list.each{|image_url| image( open(image_url), :fit=>[800, 450] ) #フィットサイズはあとで考えたほうが。。。。 } end
prawn つかうと多少画像サイズが合わないので、サイズの微調整が面倒ですね。16:9スライドや4:3スライドを判別しないといけない。
面倒なときは、まるっとキャッシュしして、convert コマンドやpdftkにかけちゃったほうがいいかもね。
http://takuya-1st.hatenablog.jp/entry/2015/01/18/223308
http://mechanize.rubyforge.org/Mechanize/Download.html
http://prawnpdf.org/docs/0.11.1/Prawn/Images.html
https://github.com/chou3ib1/slideshare-download-disabled-pdf
自作ブラウザとかキャッシュとか、そういう曖昧な表記は、規約云々が面倒だから、mechanize はブラウザ です!
めんどうだし、遅いんですよ。SQLわかってれば、ActiveRecordってメッド生やすの面倒だし、オブジェクト作ったり手続きが面倒だったんで。
BestGem でダウンロード数を比較したらhttp://bestgems.org/search?q=mysql mysql2 がトリプルスコアで圧倒的だったので。これを使うことにした。
gem install mysql2
使い方は、大変シンプル
という王道の三本セット
require 'mysql2' client = Mysql2::Client.new(host:"192.168.2.5", username:"takuya", password: "*********", database:"my_Db") ret = client.query("select * from sample order by id desc limit 10 "); ret.each{|row | p row }
mysql2公式に載ってた。
statement = @client.prepare("SELECT * FROM users WHERE login_count = ?") result1 = statement.execute(1) result2 = statement.execute(2)
名前付きbindをするのは、無理そう
自分で管理。
client.query("begin"); client.query("select * from sample order by id desc limit 10 "); client.query("commit");
潔くていいし、低レベルレイヤなのでわかりやすいっすね。
ruby のDBアクセスで、もう一つの定番はSequel
sequel はバックエンドにMysql2
を使える。いいね。
sequel 使うなら、ActiveRecord使えばいんだろうけどさ、rails 関連ってググラビリティの性能が悪いので、あまり好きじゃない。php 波にカオス。
gem install sequel
require 'sequel' require 'logger' db = Sequel.connect('mysql2://takuya:**pass**@192.168.100.1/takuya_db',:loggers => [Logger.new($stdout)]) res = db[:tablename] res.each{|e| p e }
ポイントは、 eachで回すまでクエリを発行しないところ。
トランザクションは、ブロックを渡す。これRubyっぽい。気に入った
db = Sequel.connect('mysql2://takuya:**pass**@192.168.100.1/takuya_db',:loggers => [Logger.new($stdout)]) db.transaction do table = db[:address] names.each{|e| table.insert(e) } end
insert ・ update はハッシュ値で指定できて便利
データを突っ込むときは、ハッシュ値ベースで放り込めるので、オブジェクトあれば便利なんだろうけど、とりあえずファイルの値をつっこみたいとか、手作業でぱぱっと入れたいとかそういう時にすごく重宝するわこれ。
そのうち調べる。
ちょっと面倒なんだけどね。ハッシュのキーとバリューがあればできる。
便利だよね?絶対便利!
とくにWifiの構成とか考えて頻繁にオンオフ繰り返しているとすごく手間。
networksetup -setairportpower en0 off
networksetup -setairportpower en0 on
airport -s
airport コマンドは 結構深い場所にあるので、使いやすい位置に持ってきておく。
alias airport=/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport
ちなみに airport コマンドで wifi ssid から切断することもできる
sudo airport -z # 切断
airport 使った切断は、sudo いるし再接続が面倒なのでnetworksetup
使ったほうがいいと思った
11n 11ac など同一SSIDで複数チャンネル、複数周波数で展開されてる場合、また基地局が近くで同一SSIDで両方が拾える時、指定したチャンネル側につなぐ。
airport -c 11
airport -s SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group) xxxxxxxxxxxxxx 00:12:00:fb:00:b3 -82 40 N -- WPA2(PSK/AES/AES) xxxxxxxxxxxxxx 00:12:00:fb:00:b2 -54 6 N -- WPA2(PSK/AES/AES) xxxxxxxxxxxxxx 00:6f:00:88:00:34 -87 1 Y JP WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP) Buffalo-G-5E5F 00:e1:00:6b:00:60 -84 1 Y JP WPA(PSK/TKIP,AES/TKIP) WPA2(PSK/TKIP,AES/TKIP) xxxxxxxxxxxx 00:1d:00:b4:00:81 -54 11 Y -- WPA2(PSK/AES/AES)
RSSI<90 のときは確実につながると思う。CHANNEL>100のときは5GHz だったかな。
airport -I | /usr/bin/grep -ie '^\s*ssid' | cut -d ":" -f 2
networksetup -setairportnetwork en0 0001softbank
networksetup -setairportnetwork en0 graphic password(pre-sharekey )
などととすることで、結構簡単にSSIDを扱える。
blog.mattcrampton.comxc d• Managing WIFI connections using the Mac OSX...
pdfを扱うのに欠かせないpdftk が動かない 10.11 からの問題らしい
バイナリを取得して/opt/に入れてたのが動かなかった。なので brew から tap した
brew から tap はgcc/gcj とか一杯インストールしてしまうので、頭の良い解決方法でなさそう。 なによりコンパイルエラーで地獄見る
ここに詳しく出ていた
http://stackoverflow.com/questions/32505951/pdftk-server-on-os-x-10-11
OSX 10.11 用にパッケージをリビルドされて提供してくれてる。
バイナリの取得先も書いてあったし、継続して情報を追いかけてくれてて感謝。
El Capitan でインストールすると、セキュリティエラーだった。。。
https://www.pdflabs.com/tools/pdftk-server/
ビルド地獄になってとってもお勧めできなかった。
gccから作るんだもん・・・コンパイル済みパッケージがcask/brewで提供されるのはまだ先なんだろうな。
takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ pdftk 1.pdf 2.pdf cat output out.pdf ^C takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ which pdftk /usr/local/bin/pdftk takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ brew info pdftk Error: No available formula with the name "pdftk" takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ brew search pdftk No formula found for "pdftk". ==> Searching pull requests... Closed pull requests: pdftk: 2.02 - a Handy Tool for Manipulating PDF Documents (https://github.com/Homebrew/homebrew/pull/25953) takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ ls -l $(which pdftk > ) lrwxr-xr-x 1 takuya admin 28 10 16 2013 /usr/local/bin/pdftk -> /opt/pdflabs/pdftk/bin/pdftk takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ open /opt/pdflabs/pdftk takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ brew unlink pdftk Error: No such keg: /usr/local/Cellar/pdftk takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ cask search pdftk No Cask found for "pdftk". takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ rm /usr/local/bin/pdftk takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ which pdftk takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ brew search pdftk No formula found for "pdftk". ==> Searching pull requests... Closed pull requests: pdftk: 2.02 - a Handy Tool for Manipulating PDF Documents (https://github.com/Homebrew/homebrew/pull/25953) takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ brew tap https://github.com/Homebrew/homebrew/pull/25953 Error: Invalid tap name takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ brew tap docmunch/pdftk ==> Tapping docmunch/pdftk Cloning into '/usr/local/Library/Taps/docmunch/homebrew-pdftk'... remote: Counting objects: 5, done. remote: Compressing objects: 100% (5/5), done. remote: Total 5 (delta 0), reused 3 (delta 0), pack-reused 0 Unpacking objects: 100% (5/5), done. Checking connectivity... done. Tapped 1 formula (29 files, 120K) takuya@/private/tmp/docomo2015-12-0120151201-56837-stvrb1$ brew install pdftk ==> Installing pdftk from docmunch/homebrew-pdftk ==> Installing dependencies for docmunch/pdftk/pdftk: ecj, gcc ==> Installing docmunch/pdftk/pdftk dependency: ecj ==> Downloading ftp://sourceware.org/pub/java/ecj-4.9.jar ######################################################################## 100.0% 🍺 /usr/local/Cellar/ecj/4.9: 2 files, 1.6M, built in 6 seconds ==> Installing docmunch/pdftk/pdftk dependency: gcc ==> Downloading http://ftpmirror.gnu.org/gcc/gcc-5.2.0/gcc-5.2.0.tar.bz2 Already downloaded: /Library/Caches/Homebrew/gcc-5.2.0.tar.bz2
あまりに便利だけど、人に言葉で説明するのが面倒なので、メモを残しておきます。
Evernote Clipper には、「簡易版の記事」があります。これがクッソ便利。
日経何某だとかのサイトでは、ページが無駄に分かれていて、この記事あとで参照しようとクリッピングしてもページ単位に分かれて不便なんですね。
Evernoteクリッパーは「2ページ目」「3ページ目」を取得できます。
複数のページに分割されたWEBページを「簡易版の記事」で表示して、スクロール&スクロール。
すると、残りのページが自動的に読み込まれて読みやすく「1枚のノート」にまとまってくれる。
保存する前にスペース連打してページダウンをする。
最終ページに到達するまでスペースキー連打しておけばよろしい。
ちょっと困るのは、自動で次ページロードをしないところ。
時々、忘れるので困ります・・
勤務中に気になった記事を読んでると作業時間がなくなるんので助かります。
まぁもとはClearlyだろうし、当たり前と言えば当たり前ですけど。
はてなブックマークがこの機能提供すると最強だったよねぇ。(遠い目
my_shell_script -a /usr/bin
bash では getopts を使えば、引数の処理を簡単に行うことができて便利。ruby などでは optparseに相当するやつです。
全ての初めに。
getoptsについて読む前に知っておかなくちゃいけないことがある。
getopts コマンドとシェルのビルトインの二種類がある。
名前 | 種類 |
---|---|
getopts | シェル組み込み |
getopt | コマンド・ファイル |
Google検索はgetopt/getopts を区別しないで結果を出すので注意が必要でした。
今回、調べたのは getopts です。
getopt は/usr/bin にあるコマンドです。
/usr/bin/getopt は、BSD(OSX)とGNU(linux )で挙動が異なるため、OSXとLinuxでどちらでも使えるようにするため、gnu bash の組み込み関数を使うことにしました。
今回扱うのは、getoptsシェル組み込み関数です。
getopts の基本的な使い方 は次の通りです。
getopts "引数名" 変数名
使い方は簡単です。
getopts "a" opts
引数に -a を指定したら opts 変数に中身(a)が入る
複数書きたいときは、連続してアルファベットを続ける
getopts "abc" opts
オプションで使いたいアルファベットを複数続けて書くだけ。楽チン。
適当に関数を作ってgetopts を使ってみます。
function my_func(){ echo 引数=$1 getopts "adh" opts echo getopts結果=$opts } my_func -a
引数=-a getopts結果=a
my_func -b
引数=-a /Users/takuya/Desktop/test.sh: illegal option -- b getopts結果=?
何も書かなくても未指定の引数にはエラーを出してくれる。便利!
シェルの言語がja_JPであれば
takuya@~$ my_func -x -bash: 不正なオプションです -- x
エラーメッセージをローカライズして表示してくれる。いいね
組み込みのエラー処理はいらないと思う場合、
illegal option –を無視するには
getopts ":adh" opts
こうすると、エラーを自分でハンドリングできる。
先ほどの関数に複数オプションをつけてみると。。。
my_func -a -d 引数=-a -d getopts結果=a
複数オプションは考慮されない。 (後述するが、複数回getoptsを呼び出すことで処理できる。)
getopts を設定した関数へ、なにもオプションを指定せずに起動すると・・・
my_func 引数= getopts結果=?
結果は ? になる。
そのため、"?“ を判定してヘルプを表示するようスクリプトを記述する。
”?”(未知=ヘルプ)などと覚えておけばいいでしょう。
ハイフン付きのオプションでななく、よくある引数を入れてみるとどうなるか。
my_func aaaaaaaaa 引数=aaaaaaaaa getopts結果=?
引数がない時と同じになる。
オプション付き引数を入れる。つまり、オプションで引数を入れてみる。
my_func -a my_value
このように、設定値付きのオプションを使う、オプション引数を使う。
オプションに引数をつけるには、getopts で「:」を追加する
getopts "a:" OPT
getopts "a:b:c:" OPT
getopts "a:b:c:" OPT
オプション付き引数を処理しない場合は連続して文字を続けるだけ
getopts "abcdefg" OPT
シェルスクリプトは次のように記述した $OPTARG にオプション引数が入る点が違う。
function my_func(){ echo 引数=$@ getopts ":a:" opts echo getopts結果=$opts echo $OPTARG } my_func -a aaaaaaaaa
実行結果は次の通り
引数=-a aaaaaaaaa getopts結果=a aaaaaaaaa
ポイントは、$OPTARG にオプションの引数が入る
ここまでで、基本的な使い方がわかったので、実際にありそうなオプションを取り扱ってみたいと思う。
そのままでは複数オプションを扱えないので、複数回 getopts を使う。
先ほど、複数個のオプションを処理できないと書きましたが、getoptsを複数回呼び出せば、複数個のオプションを処理できます。
function my_func(){ echo args=$@ getopts ":a:b:" OPT echo $OPT echo $OPTARG getopts ":a:b:" OPT echo $OPT echo $OPTARG } my_func -a aaaaaaaaa -b bbbbbbbbbbbbb
このようにgetoptsを何回も処理したら
実行結果が次のようになる。
args=-a aaaaaaaaa -b bbbbbbbbbbbbb a aaaaaaaaa b bbbbbbbbbbbbb
ここでのポイントは。複数回getoptsを適用すれば、複数個のオプションに対応できる。という点
ここまできて、漸くネットで見かけるサンプルに近くなる。
function my_func(){ echo args=$@ while getopts ":a:b:" OPT ; do echo $OPT echo $OPTARG done } my_func -a aaaaaaaaa -b bbbbbbbbbbbbb
複数オプションを取得するには、なくなるまでwhileループを回すのが基本
args=-a aaaaaaaaa -b bbbbbbbbbbbbb a aaaaaaaaa b bbbbbbbbbbbbb
function my_func(){ echo args=$@ while getopts ":a:b:" OPT ; do case $OPT a) echo $OPT echo $OPTARG ;; b) echo $OPT echo $OPTARG ;; esac done } my_func -a aaaaaaaaa -b bbbbbbbbbbbbb
getopts と while + case を組み合わせて戦うことで、シェルスクリプトでもオプションと引数つきオプションを扱えることがわかった。
while ループを記述したコマンドを オプションなしで起動すると・・・
my_func aaa args=aaa (getopts のwhile ループでは処理されない
引数が指定されてない時に注意が必要
ナニも引数が指定されない場合は、getoptsはシゴトをするが、exit(1) するのでwhile と相性が悪い
while に入れた時には、結果は空っぽになる。
ただし、"?“ はきちんと処理されている。 while が処理終了になるので、while 中の case に処理がこないだけ。
function my_func(){ echo args=$@ getopts ":a:b:" OPT echo $? echo opt=$OPT } my_func -a hoge my_func
args=-a hoge 0 opt=a args= 1 opt=?
OPTには ? が入るが、コマンドの実行結果ステータスが 1 になるので whileから抜けてしまう。
なので、while getopt でオプションが全く指定されない場合の ?をwhile中で検出することが出来ない。
ここまでの実験でわかったことをまとめた。
function my_func(){ echo args=$@ while getopts ":a:b:" OPT ; do case $OPT in a) echo -a の引数 $OPTARG ;; b) echo -b の引数 $OPTARG ;; : ) echo "ここ" ;; \? ) echo nothing matched ;; esac done } my_func -a aaa my_func my_func -c ccc
while とともに使った場合
検出ができるのは、「不正なオプション」を渡した時に限られる、「オプションが全く未指定」は検出ができない。別途考えないとダメなようだ
getopts 複数回よびだせる、そのときにどこまで処理したかを保存する。
どこまで処理したかは、変数 $OPTIND(オプションインデックス)に保存する。
そのため、getopts は OPTINDを使うので、function で使うときは、OPTIND をグローバル汚染させない注意が必要
function path() { local OPTIND OPTARG OPT ## ここ重要 while getopts 'ha:d:' OPT ; do case $OPT in d) echo "-D entered" ;; a) echo "-A entered" ;; \?) ;; esac done }
local OPTIND を書かないと、グローバル変数に値が入っちゃうので、getopts が含まれる関数を何度も呼び出せない。
function 内に local 宣言をちゃんと書いた場合・・・
function path() { local OPTIND OPTARG OPT while getopts 'ha:d:' OPT ; do case $OPT in a) echo "-A entered" ;; esac done echo end } ### ここで関数の実行 path -a aaa path -a aaa path -a aaa
-A entered end -A entered end -A entered end
function path() { # local 宣言をコメントアウト #local OPTIND OPTARG OPT while getopts 'ha:d:' OPT ; do case $OPT in a) echo "-A entered" ;; esac done echo end } path -a aaa path -a aaa path -a aaa
実行結果
-A entered end end end
このようにlocal宣言がないと変数$OPTIND が作用して、オプションを取れなくなる。
1つのファイルでシェルスクリプトを記述するのなら問題ないのだけれど、関数を作って連続して使うなら変数を共有しない工夫が必要
getoptsをファイルで使う場合は、環境変数をexport しない限りファイル内部で完結するので、管理は難しくない。
#!/usr/bin/env bash while getopts 'ha:d:' OPT ; do case $OPT in a) echo "-A entered" ;; esac done echo end
ファイルに記述した場合
my_script.sh -a aaaa my_script.sh -a aaaa my_script.sh -a aaaa
としてもOPTINDはファイルごとに確保されるため全然影響がなく、問題ない。
http://stackoverflow.com/questions/16654607/using-getopts-inside-a-bash-function
ご利用方法と対象機種の変更に伴い、これまで提供してきた専用アプリ(au Wi-Fi接続ツール)では2016年2月1日よりマルチデバイスサービスをご利用いただけなくなります。
え、ちょっとまてよ。いまで、PCから無料で使えたのが使えなくなるってことですかね。
いままでは無料でWiFi接続ツールで使えるようにしたけど、これからはWi2を使ってくれヨロシクってことですね。
これらのプランでは、引き続き無料(ただし新規加入・変更は出来ない) - LTEフラット - LTEフラット(V)
通常はこれからは月額300円のプランが標準になる。
ということです。
これからのプランでは次のSSIDが有料になる。
今まで使えたSSID
「au_Wi-Fi」(WPA2)、「au_Wi-Fi2」(WPA2エンタープライズ)、「Wi2premium_club」(WPA2)、「Wi2_club」(WPA2)、「UQ_Wi-Fi」(WEP)、「Wi2premium」(暗号化なし)、「Wi2」(暗号化なし)、「wifi_square」(暗号化なし)
つまり、iOS/Android以外をau-WiFiから追い出すってことですね。
au_Wif2 がEAP-SIMだから、au-Wifiは消えていくんでしょうか。
いままでPC向けもau-wifi で提供したけど、スマホ以外は、wi2に丸投げするからよろしく。ってことですね。
これからはPCなどでWifi使いたきゃ300円(税抜)払え、Wi2よりは50円ほど安いぞってことですね。
猶予期間を1年位あけてるのと、残存旧プランへの救済措置を作ってるのは、やっぱりau は良心的なキャリアだなぁと思うわけです。
こうやって徐々に値上げされていくんですね。
WiMAX1まきとりで、使えないau_WiFiを巻き取りつつ、インフラ更新をwi2に丸投げして、自社はau_WiFi2でSIM認証でガードかけていくのかな
5G見据えたらwifiはイラないってことなんでしょうねぇ。