Quantcast
Channel: それマグで!
Viewing all 1867 articles
Browse latest View live

Evernote で選択中ノートを全て指定したノートに移動する

$
0
0

Evernoteのノートをまとめて移動したい

Evernoteのノートが増えてくると、検索結果をまとめて別のノートに移動したいとか。そういう事が増えてくる

それも「キーボードショートカット」で!

キーボードショートカットを作るには?

Macでキーボードショートカットを作る方法を知って無くてはならない。

Macでは⌘キーは、メニューの各項目(コマンド)を実行する、と考える。つまり、キーボードショートカットを「作る」には「メニュー項目を追加する」という作業になる。メニュー項目は「サービス」として追加できる。アプリ(:またはファイル)ごとに好きな「サービス」を追加することが出来る。

サービスの追加場所

サービスの追加場所はここになる。ここに好きなサービスを作って放り込む

~/Library/Services/

サービスの作成方法

サービスの作成方法はAutomator.appを使うのが楽でいいっすね。

Evernoteにサービスメニューを追加する。

  1. AutomatorでWorkflowを新規作成し
  2. 対象アプリをEvernoteにする。
  3. そしてやりたいことを記述。
  4. 最後に~/Library/Servicesに保存する。

キーボードショートカットを追加

キーボードショートカットをPreferenceで追加する。

Evernoteで選択したノートを移動させるスクリプト

Automatorで、AppleScript(language:JS)を実行すると、選択したノートを指定した場所に移動することができる。

わたしは、利便性を考慮、つまりテストのしやすさと扱いやすさを考えて、すべてのサービスをシェルコマンドで作成し、Automatorではシェルコマンドを実行するようにしている。

#!/usr/bin/osascript -l JavaScript -i
ObjC.import('stdlib')  
//コマンドライン引数を取る
function run( argv ){
  if( argv.length < 1 ){
    console.log("引数が必要")
    $.exit(1)
    } 
    move_selected_note_to(argv[0])
  $.exit(0)
}

//Evernote で選択中ノートを全て指定したノートに移動する
function move_selected_note_to( notebook_name ) {

  var app = Application("Evernote");
  var notebook = app.notebooks[notebook_name];
  var selected = app.selection();

  selected.forEach( function(e){
    e.move({to:notebook});
  } )

}


selenium で parital text/ link_text を指定すれば楽ができる!!!!

$
0
0

seleniumでリンクの指定が楽になった。

ドキュメントを読んでたら、良いものを見つけた 今までのやり方。

driver.find_element(:xpath, "//a[contains(./text(), 'ログイン')]")
driver.find_element(:xpath, "//a[./text()='ログイン']")

今回知ったやり方:1

partial_link_textを指定すれば、文字列 を含むリンクを取れる

driver.find_element(:partial_link_text, "ログイン").click

今回知ったやり方:2

link_textを使えば、文字列に一致するリンクを取れる。

driver.find_elements(:link_text => "戻る").click

参考資料

selenium documentation

selenium で Google Chromeの開発者ツールにアクセスする

$
0
0

Seleniumから 開発者ツールにアクセスしたい。

DevtoolsがChromeで閉じられちゃうので、なんとかならないのかなと思って調べてた。

パフォーマンスタブにアクセスできる

 driver.execute_script("return window.performance.getEntries();")

これでなんとかなるかもしれない。

ちなみに、Chrome+WebDriverで開発者ツールが閉じられちゃうのは理由がある。

Chromeの制限で、デバッグにアクセスできるのは常に1つだけ。がある。

そのため、webdriverでアクセスすると、いったん開発者ツールを閉じてWebdriverが実行される。排他処理が実行されてる

Selenium でモバイルエミュレーション

$
0
0

seleniumでモバイルエミュレーションを使いたい

ChromeのWebDriverでモバイル・エミュレーションを使えれば便利なのに。回線速度とか、画面の回転とか、画面のサイズとか、逐次セットするのは面倒なので、セットになってるモバイル・エミュレーション機能を使えば楽なのに。

出来る

caps = Selenium::WebDriver::Remote::Capabilities.chrome(
   "chromeOptions" => { "mobileEmulation" => { "deviceName" => "Google Nexus 5" } })

Capabilitiesのオプションに渡せば出来る。これはRubyなので 設定にアクセスに階層にハッシュをつかうけど、JavaPythonならキーでアクセスですね。mobileEmulation.deviceNameがキーですね。

chrome(webdriver)を headless はリサイズできないので、初期値で決めて解決させる

$
0
0

headless で動かしてる chromeでエラーが出る。

最初、なんのエラーかわからず悶絶してた。理由がわかったので書いておきます。

リサイズすると次のようなエラーに

driver.manage.window.resize_to(1200,1200)

エラー

Selenium::WebDriver::Error::UnknownError: unknown error: cannot get automation extension
from unknown error: page could not be found: chrome-extension://aapnijgdinlhnhlmodcfapnahmbfebeb/_generated_background_page.html
  (Session info: headless chrome=61.0.3114.0)
  (Driver info: chromedriver=2.29.461585 (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b),platform=Mac OS X 10.11.6 x86_64)
from /Users/takuya/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok'

なぜリサイズが必要だったのか?

とあるサイトが、レスポンシブ・デザイン(笑)になっていて、Widthにより、コンテンツの表示内容が変化する。そのためボタンがクリックできずに、 stale エラーやnot clickable で落ちてた。

headless chromeのデフォルトウインドウサイズ 800x600

Chromeのheadless は 次のようになっている。

>> driver.execute_script('return window.innerHeight;')
=> 600
>> driver.execute_script('return window.innerWidth;')
=> 800
>>

これでは、モバイルサイトや、タブレット配置にされちゃいますよね。スマホサイトは無駄にクリックと遷移がおおく、スクレイピングに向かないので不便。

初期値を投入してリサイズの代用にする。

chromeの起動オプションに「ウインドウサイズの指定」があるのでコレを活用することで問題はほとんど解決しますね。

  caps = Selenium::WebDriver::Remote::Capabilities.chrome(
    "chromeOptions" => {
      "args" => [
        "--headless", #headlessにすると動かない・・・"--window-size=1280,800", # width 入れると解決する。

起動オプション設定後のウインドウの高さと幅

縦横のサイズは次のようになったので、無事解決しました。

>> driver.execute_script('return window.innerHeight;')
=> 1200
>> driver.execute_script('return window.innerWidth;')
=> 800
>>

Chromeの headlessで落ちてた原因は殆どが、モバイルサイト落ち

PCサイトでデザインした、ClickやSubmitが動かない原因の大半が、モバイルサイト落ちになって発生していた。

ボタンが見つからない、Staleされる、not clickable などになる。頭のなかで、PCサイトを想定していると迷う。デバッガでみるとちゃんと要素はあるのに、クリックが出来ない。

クリック出来ない理由がわからず、悶絶して苦悩することになった。

レスポンシブデザインは気づかずに導入されてるので注意が必要だった。

どうでもいいけど。

レスポンシブデザインって、モバイル・PCでガッツリとデザインを変えるんじゃなくて、もともと目指してたのは要素を横長から縦長に再配置して、同じように見せてアクセシビリティを確保するんじゃなかったのか。

いつの間にか、ガッツリデザインをかえてメニュー項目を展開メニューに折りたたんだりしてるんだよね。そもそも使いにくいのでやめてほしい。そこまでやるなら、もう別サイト・別HTMLでデザインした方がいいよね。。。。

chromeの起動オプションでページをHTML→PDFで保存する。

$
0
0

chromeだけを使って、HTMLをPDFに変換します。

chromeで pdf にサイトを保存することが可能です。Seleniumのscreenshot を作らなくても、単一なページであれば、PDFにすることが可能です

--print-to-pdfオプション

$ alias chrome='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'$chrome--headless--print-to-pdf='/Users/takuya/Desktop/a.pdf' https://www.yahoo.co.jp

--headlessオプションと併せて設定するととても便利です。

コマンド引数

コマンドは次のようにするだけです。

chrome  --headless --print-to-pdf='path.to.file'  URL

とても簡単で、Chromeさえアレばどこでも使えるので、たとえばMarkdownー>HTMLー>PDFにするときなどに活躍しそうですね。

コマンドから指定のSSIDに無線LANをつなぐ

$
0
0

コマンドから無線LANを接続するときにSSID指定

SSIDを指定して接続を切り替えたい

指定のSSIDに接続したい

networksetup -setairportnetwork en0 0001docomo
networksetup -setairportnetwork en0 mobilepoint password(pre-sharekey )

macのコマンドからWiFiを切り替えられると便利。

マクドナルドきたら、マクドWiFiにつなぎたいとか、0001docomoが電波悪いなーとか、

ぱぱっと飛んでる公衆WiFiに片っ端から試すコマンドも作れたり。重宝しますね。

昔やったのにすっかり忘れて再検索してたわ

メモって大事ですね。

関連資料

mac osx で無線LANをオンオフと指定SSIDに接続するコマンド - それマグで!

ツイートを常にSafariで開く(Twitterアプリに移動してしまう)またはその逆

$
0
0

ツイートリンクをクリックすると→ツイッターアプリが起動してしまう

この現象は、よく質問を受けます。(とくにiOS初心者の方々に)

Safariでクリックしたら Facebookアプリが開く?

常にFacebookアプリが開くのを当たり前と思ってる方々が、Safariで開いちゃうんだけど・・・という逆の質問もよく受けます。

変更方法→長押しメニューを出す。

リンクを長押しすると、メニューが出てきます。

このデフォルト動作を変更するには、長押しで開くメニューにすべての選択肢が出てきます。

この選択肢の意味は次のとおりです。

https://twitter.con」を開く方法はどれが好き?

「どれが好きか」「選んでね」の質問と思いましょう。次回からの twitter.com のタッチ動作は「以前の選択」と同じ行動をiPhoneは繰り返します。

f:id:takuya_1st:20170605173706p:plain

ポイント:iOSがリンク選択を記憶しています。

リンクを「Safariで開いたか・Twitter.appで開いたか」このどちらの選択をしたのか。iPhoneはこれを記憶しています。

そのため、ツイッタのアプリ選択したら、そこから先はずっとアプリで開くようになります。

逆に、Safariの「新規タブで開く」なら、そこから先はずっと、サファリで開くようになります。

フェイスブックやインスタなど、 ツイッタ以外でも同じです。

InstagramFacebook、 Pinterst 、Tumblrなどその他のサイトでも同じです。常にSafariで開くようにすることもできれば、常にアプリで開くようにする事も出来ます。

たとえば、アプリで開くと無駄な通信を行ったり、通知されちゃったり、起動するたびに更新されて最後見てた箇所が喪失しちゃうなど不便があるので個人的にはSafariで閲覧する方法をおすすめします。パケット節約にも有利です。

最後に選択した項目が重要

この「開く・Open」の項目で選択した動作が重要です。本当に重要です。

デフォルトの動作を決定しておけば、アプリに転送されることも減少します(ゼロになるわけではない)

Instagramを開けたときに、アドレスバーの上部からレコメンドされて、AppStoreに転送されることも減少します。

サファリでSNSを開く薦め

このテクを活用して、

わたしは、SNSSafariで開くことを「強くおすすめします」

通知が減少してイライラも減ります。

通知が圧倒的に少なくなります。通知の現象はイライラとストレスを減らしてくれます。

とくにTwitterでRT爆発を食らったときは重宝します。Facebookのどうでもいい通知を一掃できるのもメリットです。

通信量節約(パケット節約)と本体容量の節約と、バッテリ節約

本体容量の節約にもSafariで開く

TwitterFacebookTumblrInstagramはアプリごとに内蔵ブラウザをもっていて、その中に画像や動画を溜め込みます。

これらのアプリが溜め込んでいるキャッシュ量は油断してると数GB近くに達します。しかしキャッシュの削除はアプリをアンインストールしない限り出来ません。

その点、Safariで開くようにしておけば、キャッシュは出来る限り再利用されますし、キャッシュが爆発することもありません。またキャッシュだけを削除する手段も用意されています。またキャッシュはSafariが本体容量と合わせて上手に管理してくれます。

バッテリの節約

アプリは起動後10分ほど、ずっとバックグラウンドで起動しています。個人情報を収集したがるFacebookなどSNSは、はガンガンGPSやアレコレ通信をしてバッテリを摩耗させます。ハッキリ言って辛いです。

パケット節約

アプリを入れていると、バックグラウンドや起動時の通信でパケットを浪費してしまいます。起動時に何度も同じデータを取得したり、必要ないのにホーム画面を表示したり友達のログイン状況を通知してくれたりします。要らないですよね。数分でタイムラインの自動更新も行われたります。無駄です。

またアプリ・アップデートでパケットを浪費されたりします。

Safariで開くと、タイムラインを自動的に読み込みは動きますが、なんどもなんどもホームに飛ばされて再読込が実行されることがが減りました。


ruby で先月の月末を求める

$
0
0

先月の月末を求めるには

まず、月初の01日を作ります。

Date.parse(Date.today.strftime('%Y-%m-01')).to_s

今月の1日を作る方法を知ってると後はなんでも応用が効くよね。

次に−1日する

(Date.parse(Date.today.strftime('%Y-%m-01'))-1).to_s

簡単でしょ?

strftime と parseが賢いので頼れば良いんだと思います。

QRコードアプリはLINEのQRリーダーが一番手軽。

$
0
0

LINEのQRコードリーダが一番手軽って話。

QRコードのためだけに専用アプリを入れるのもめんどくさい。どれを選んだら良いか考えるのもめんどくさくないですか?

LINEについてるQRリーダで十分

QRリーダは、別にLINEだけの規格ではないので、一般的なサイトを開くQRコードであれば大抵は読めます

http://https://もならほとんどが大丈夫です。

起動も簡単

起動もとても簡単です 3DタッチでPeekメニューを出せばいいので、LINEアイコンを押し込むだけです。ね?簡単でしょ?

f:id:takuya_1st:20170605174026p:plain

rubyのLoggerでログを出力する方法

$
0
0

rubyのロガーについて調べておきました

rubyではログを出すときに Logger が便利です。

require'logger'

logger = Logger.new(STDOUT)

標準出力に出す場合は STDOUT($stdout) 、標準エラー出力に出す場合は STDERR($strerr) を指定する。

ログを出す

logger をインスタンス化したら、ログを書き出す。

logger.info('Hello Log')
# => I, [2017-06-07T13:53:15.178750 #20342]  INFO -- : Hello Log

ログの出し方:ログレベルに応じたログを書く

log()のような関数はなく、ログレベルに応じたメソッドを使う。

ログレベルは、 debug, info, warn, error, fatal, unknown があり、それぞれが、メソッド名になっている。

logger.debug('メッセージ')
logger.info('メッセージ')
logger.warn('メッセージ')
logger.fatal('メッセージ')
logger.unknown('メッセージ')

まとめて実行してみる。 Object.send(:method_name, args )インスタンスメソッドを呼び出せるのでそれを利用する。

[:debug,:info,:warn,:error,:fatal,:unknown].each{|e| logger.send(e,"message at level #{e}") }

実行結果

>> [:debug,:info,:warn,:error,:fatal,:unknown].each{|e| logger.send(e,"message at level #{e}") }
D, [2017-06-07T13:55:36.802479 #20342] DEBUG -- : message at level debug
I, [2017-06-07T13:55:36.802532 #20342]  INFO -- : message at level info
W, [2017-06-07T13:55:36.802549 #20342]  WARN -- : message at level warn
E, [2017-06-07T13:55:36.802562 #20342] ERROR -- : message at level error
F, [2017-06-07T13:55:36.802574 #20342] FATAL -- : message at level fatal
A, [2017-06-07T13:55:36.802585 #20342]   ANY -- : message at level unknown

ログのレベル

ログのレベルは次のようになっていて、debug が一番弱い。

  1. debug
  2. info
  3. warn
  4. error
  5. fatal
  6. unknown

一番弱いのはdebug。 弱いとは、設定でログ書き出しを無視することが出来る。

LOG_LEVELが info なら debug は書き出されない。

ログレベルに応じてフィルタをする。

ログにはレベルがあって debug, info, warn, error, fatal, unknownの順になっている。

すべてのログを出力する(デフォルト)

デフォルトではすべてのログを出力する Logger::DEBUG(=0) になっていて、ログを出すとすべてが書かれる

require'logger'
logger = Logger.new(STDOUT)
logger.level == Logger::DEBUG#=> true

レベルを INFO にする

INFOにすると、DEBUGのメッセージが無視される。

logger.level = Logger::INFO
[:debug,:info,:warn,:error,:fatal,:unknown].each{|e| logger.send(e,"message at level #{e}") }

実行結果( debug のメッセージは捨てられる)

I, [2017-06-07T14:01:51.257465 #20342]  INFO -- : message at level info 
W, [2017-06-07T14:01:51.257579 #20342]  WARN -- : message at level warn
E, [2017-06-07T14:01:51.257608 #20342] ERROR -- : message at level error
F, [2017-06-07T14:01:51.257712 #20342] FATAL -- : message at level fatal
A, [2017-06-07T14:01:51.257743 #20342]   ANY -- : message at level unknown

長めのメッセージを出力する

ブロックで渡せる

logger.info {  "現在のログレベルは " + logger.level.to_s + "です" }
#=> I, [2017-06-07T14:05:42.599811 #20342]  INFO -- : 現在のログレベルは 1です

時刻は別にいらないんだけど、短く出来る?

できる。

開発中とか時刻は別にいらないんだけどってとき

logger.datetime_format = '%Y-%m-%d %H:%M:%S'
logger.datetime_format = ''
logger.info("サンプル")
#=>I, [#20342]  INFO -- : サンプル

番号とか記号も決めたい

proc を渡せばO.K.

logger.formatter = procdo |severity, datetime, progname, msg|
   ">>>>>> #{msg}\n"end
logger.info("サンプル")
# =>  >>>>>> サンプル

書式に意味有るの?

ある。ログ書式を元に、複数のサーバーからエラーログを集めたり、ログに基づいた通知をしたりする。

参考資料

https://docs.ruby-lang.org/en/2.0.0/Logger.html#class-Logger-label-How+to+close+a+logger

Seleniumで印刷(print preview)を経てPDFを保存する方法

$
0
0

Selenium + chromedriverで 印刷プレビューにアクセスするのが面倒くさい

Chromeを webdriverでアクセスすると iframe で作られた、印刷プレビューにアクセスするのがとてもめんどくさい。(セキュリティ関連のアレコレの制限をdisableオプションで取っ払えば出来るんだろうけど)

HTMLを印刷したい。

たとえば、某銀行の印刷プレビューページなどをそのまま取りたいとか。印刷用のCSSが正しく動くかどうかとか、テストしたい箇所も山ほどある。

キオスクオプションが最強

1週間ほど毎日のように、あれこれ調べまくった結果、Chromeの起動オプションに –print-to-pdf がありました。しかしコレでは、「いま表示しているページ」を印刷するのが不便です。

Cookieを引き継ぐためにProfileを設定してChromeの再起動が必要です。

さらに探していたら、 --kiosk-printingとう「最高」なオプションを見つけたので歓喜しました。

--kiosk-printingとは?

印刷ダイアログが開くと、印刷ボタンを無条件に押してくれます。これはキオスクモードで、ユーザーにプリンタの選択をさせない為に作られているようです。

この印刷ボタンを無条件に押してくれるオプションを使うとHTMLをPDFで保存してくれます。

seleniumで使うとき

Capabilitiesを活用します、そして該当ページへ移動したら、window.print()を実行します。

caps = Selenium::WebDriver::Remote::Capabilities.chrome(
      "chromeOptions" => {
          "args" => [
              '--kiosk-printing',
          ],
          "prefs" => {
              download: {
                  default_directory: '/path/to/download'directory_upgrade: true,
                  prompt_for_download: false,
              }
          }
      })
driver = Selenium::WebDriver.for :chrome , :desired_capabilities => caps

driver.get 'chrome://version'
driver.execute_script(' return window.print();')

window.print で表示された、印刷ダイアログで、ボタンを押すことは kioskオプションがやってるくれるのでSelenium側では処理をする必要がありません。

保存先のディレクト

基本的には、保存先のディレクトリで指定したフォルダになりますが、設定が曖昧だと ~/Downloadsに保存されます。

もし、設定がうまくいかないときは 、Seleniumで次のページへアクセスして、設定を変更したら間違いなくうまくいく。

driver.get 'chrome://settings'

参考資料

http://peter.sh/experiments/chromium-command-line-switches/

chrome でHTML をPDFに変換する

$
0
0

HTMLをPDFに変換する --print-pdfオプション

HTMLをPDFに変換するコマンドは、いくつか有るけれど、 chromeのオプションだけで実現できる。

しかも chrome59 から headlessオプションがあって更に便利になった。

コマンドの使い方

chrome-bin --headless --print-pdf=path/to/output.pdf  input_url

input_url のところには、ブラウザで開けるものなら、大抵のものが入る。

ローカルファイルなども印刷するできる。

chrome-bin --headless --print-pdf=path/to/output.pdf  /path/to/index.html

mac osの場合、直接バイナリを指定する

macOS Xの場合は .app の中身をたどって指定する必要がある。

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
 --headless\
 --print-to-pdf='/Users/takuya/Desktop/a.pdf' \
file:/Users/takuya/Desktop/sample.html

開けないURLはどうするのか

ログインが必要なURLなどはどうするのか。

Cookieを拾ってくるしか無い。Cookieはプロファイルに入ってるのでプロファイルから拾うしかない。

--user-data-dir=/Users/takuya/Library/ApplicationSupport/Google/Chrome/Default/"

プロファイルを指定することでCookieを拾えるのでそこから何とかする。ただし、プロファイルは起動時にロックが掛かるので、同時に複数のインスタンスで使用できない。その為に、セッションのCookieは扱うのがとても面倒なので、Chromeをいったん終了したら消えてしまうセッションCookieを扱うには、Chromeを強制終了したりSelenium側でAddCookieするとか面倒くさい処理がひつようになる。

参考資料

List of Chromium Command Line Switches « Peter Beverloo

pry のEchoをオフにする

$
0
0

コピペなどでエコーが邪魔なとき

_pry_.config.print = proc {}

irbの場合は

conf.echo = false

こうすれば、長いStringのスクロールで死ななくて済む

一時的にオフにして、元に戻すなら

_pry_.config._print = _pry_.config.print
_pry_.config.print = proc{}

元に戻す

_pry_.config.print = _pry_.config._print

これをトグルできる関数にしてくれると便利なんだけどな。

参考資料

https://github.com/pry/pry/wiki/Customization-and-configuration#Config_print

Macのopen(開く・保存)のダイアログで、不可視ドットファイル(フォルダ)を選択するーフルパスで開くモード

$
0
0

Macの保存ダイアログで不可視フォルダを選びたい

開くダイアログのフォルダ選択のときに、隠しファイルやフォルダを開きたいときがよくある。

ドットファイルやドットのフォルダ( .rbenv / . pyenv など)を開きたい。

たとえば、atom/visual studio code/intelli J のIDEドットファイルを見たいときが結構ある。

私の場合 RubyMineやPycharm で rubygemspythonのpip ファイルを見たいときが頻発した。毎回コマンドで指定するのも面倒くさいので、なんか方法がないか調べたらあった。

⌘⇧G / Shift+Cmd+G でフルパス入力

保存・開くダイアログで上記のショートカットを入力すると、ダイアログが開いて、フルパスで指定できるようになる。

f:id:takuya_1st:20170612012219p:plain

残念ながら、補完は効かないようで・・・

フルパスを取得するには、いったんターミナルなどでフルパスを作ってクリップボードに入れておく必要がありますね。

Windows(田)のNTFSみたいに、フォルダ・ファイルごとに可視・不可視を切り替えらればいいのにね。APFSで導入されないかなー

参考資料

http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-use-move-to-folder-command-in-a-open-or-save-dialog-in-macos.html

Windowsはフォルダ毎に不可視を設定できる。

Windowsのホームディレクトリに出てくる、dotfiles を非表示にする。 - それマグで!


nkfでURLエンコードされた文字を扱える(エンコード・デコード・文字コード)

$
0
0

nkfだけで、URIエンコードされた文字を扱える

とある文字列を処理していて、CP932(Shift_JIS ) がそのまま、URLエンコードされた文字に出会って、ちょっと面倒な自体になった 。 node の decodeURI/decodeURIComponent だとUTF-8を期待されて動かない。ruby/pythonだと内部文字コード*1から変換が面倒くさい。nkf文字コードを変換を調べてたら、 nkfだけで行けることがわかった。

NKFで URL をデコードする

$ echo %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%EF%BC%81 | nkf --url-input
こんにちは!

--url-inputオプションを使えば、デコード出来る

デコード結果をさらに utf8にするには -Wオプションをつけておけばいい。nkf --url-input -W

NKFでURLをエンコードする。

takuya@:~$ echo こんにちは! | nkf -MQ | sed s/=/%/g
%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%EF%BC%81

-MQオプションはQuoted stream に変換するので、 =を使ってる。それを%に変換すればいい

nkf便利。

NKFは枯れた技術だし安心して使えるわ。Windows文字コードがutf8にならねーかなぁ

関連資料

文字コード変換コマンドの nkfの使い方と実例をまとめました。 - それマグで!

参考資料

*1:rubyの場合内部文字コードはないんだけど、utf-8がデフォルト仕様なので、やっぱり面倒くさい

nkfの使い方:base64のエンコードとデコード(ただし文字列だけ

$
0
0

nkfだけで base64エンコードとデコードが出来る

nkfには -mB-MBのペアがあるのでBase64エンコードとデコードが出来る。

nkfbase64エンコード

echo  -n こんにちは | nkf -MB

nkfbase64デコード

echo 44GT44KT44Gr44Gh44Gv| nkf -mBW
こんにちは

入力の文字コードを -W : utf8 で指定してる。

主に文字列

文字列だとうまくいく。nkfは「文字コード」を変えるコマンドなので、バイナリも文字として扱ってしまうのでデータは壊れる。アレコレすればいいだろうけど、そこまでやる必要は特になくbase64コマンドを使ったほうが良いので。

関連記事

作成済みのm5sumとぱぱっと比較する方法(改竄検出の楽な方法

$
0
0

md5sum の -c オプション

-c 生成済みの md5sum の一覧とファイルを比較して改ざんを検出する。

事前にファイルのmd5sum の値の一覧を作成しておき、いまのファイルがそのファイルのハッシュ値と一致するかを調べておく。すると簡単に改竄検出や不正検出を見つけることが出来る。

使い方

最初に、md5sum の一覧を計算してファイルに書き出しておきます。

md5sum sample.txt > out.md5

次に、この出力結果を使ってファイルが一致するかチェックします

md5sum -c out.md5

out.md5の中身は次のようになっています。 md5値 ファイルPATHが列挙されています。

c3cec535915d86f2ce51c668f6919696  sample.ext

チェック-cの場合は、右側のファイルパスのファイルを探して、md5値を導出し事前に計算していた左側に一致するかを調べてくれます。

指定したフォルダの中をマトメてチェック

1ファイルだと何の役に立つかわかりにくいのですが、フォルダの中のまとめてチェックすると強いです。

find コマンドや xargs と組合せる。 フォルダのすべてのファイルについて、md5を計算する

sudo find /etc/  -mindepth 1 -type f   -exec md5sum {} \; > etc.md5

結果を使って、フォルダの中のすべてのファイルについて、ファイルの改竄検出を行う。

sudo md5sum -c etc.md5

if 文で使う

bashの if 文でつかときは --statusオプションが便利です。

このオプションを付けると、表示をしない代わりに、チェック結果をコマンドの実行結果で返してくれます。

if ( md5sum -c --status etc.md5 ) ; do 
  echo "改竄チェックOK"
else
  echo "改竄チェックNG"
fi 

これで有るフォルダの中が書き換わってないかを手軽に調べることが出来ます。

もしチェックに失敗したファイルを見つけたいときは

sudo md5sum -c   out.md5 | grep -i failed

のようにしたら見つけることが出来ました。

ハッシュ値をまとめて保存とは

もし、ハッシュ値保存したファイルを改ざんされると怖いので、ハッシュ値を保存したファイルのハッシュ値を取ってそれをブロックごととに保存していくといいです。このブロックが・・・

ブロックチェーン技術などで盛んにファイルの記録をハッシュ値で云々と叫ばれてます。 基本的にはハッシュ値を計算してファイルに保存してそのファイルのハッシュ値を計算してーってことです。似たようなものです。

フォルダの中のファイルつまり、あるエントリの内部のハッシュ値をすべて見るには、md5sum である程度十分です。便利だし。

衝突の可能性も有るでしょうがローカルファイルで衝突は可能性が低いしね。

参考資料

How to verify your files in Linux with MD5 | TechRadar

みんな大好き! man

自動的にmysql のバックアップを取ってくれる automysqlbackup

$
0
0

ぼーっとしててやらかした。

履歴から入力してて、イライラしてるときに、truncate コマンドを本番環境に実行してしまった。もう詰んだ。死にたい。

二度とこんなことがないように

automysqlbackup

というパッケージを導入することにしました、

apt で

apt install automysqlbackup

mysqlと一緒に入れておきましょう。

以前入れていたと思ったら、入って無くて本当に詰んだ。

クラスの特異メソッドにモジュールのメソッドを取り込む

$
0
0

モジュールのメソッドを、クラスの特異メソッドに取り込む

module で定義した、メソッドやローカル変数を、クラスの特異メソッドに取り込む

次のようにすると実現できる。

moduleS1defsample
    puts :sampleendendclassAclass<< selfincludeS1endend

共通処理をクラスに書いてしまうとクラスのStaticな部分とインスタンスな部分がごちゃ混ぜになってしまうので、分けて書けるのはMix-inが強いなと思いました まる。

ただ、include や モジュールでほしいのは関数定義 def だけだったりするので、名前空間が独特でruby分かりづらいよねともおもったり。クラスの継承をしなくて良いのは楽よね。

Viewing all 1867 articles
Browse latest View live
<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>