mozyのかきおき

mozyの読書感想文や思考置き場

GitHub でWIPな意味でのPRが作れるようになったよ

マジで最高です。

詳細はこちら

Introducing draft pull requests - The GitHub Blog

重要な部分を抜き出すと

Draft pull requests cannot be merged, and code owners are not automatically requested to review draft pull requests

要約すると

Draft PRはマージされないし、コードのオーナーに自動でレビューお願いしまっすーって通知も飛ばないよー ってことかな。

数百とか開いているSafariのタブ情報をエクスポートする方法【実際にやってみた】

経緯

つまりはこういうことだ。
開きすぎる癖があって、これをどうにかしてCSVなりに書き出したかった。
あなたもこういう癖あったりしませんか?

f:id:mozy_ok:20190126131319j:plain
つまりはこういうことだ

iPhoneのストレージも逼迫するし。

探していたところ

かみさーまー みたいな記事を発見した。BOOOM!!!

Ok!!! This has been SOLVED. For those who were wondering...

The post request to https://p58-ckdatabase.icloud.com/api/client/record/sync contained gzip-encoded information which made reference to SafariBookmarksSyncAgent.

SafariBookmarksSyncAgent is located at /System/Library/CoreServices/SafariSupport.bundle/Contents/MacOS/SafariBookmarksSyncAgent.

Ran strings on the binary and saw it made reference to: (allow file* (home-literal "/Library/Safari/CloudTabs.db"))

/Library/Safari/CloudTabs.db does not exist, but ~/Library/Safari/CloudTabs.db does!

CloudTabs.db is a SQLite3 database with table cloud_tabs and cloud_tab_devices.

select * from cloud_tab_devices gives the device_uuid in column 1.

select url from cloud_tabs where device_uuid='';

BOOM!

Reddit - mac - iPhone Safari Tabs into Text List via iCloud?

実際にやってみた

  1. まずは、iPhone 設定 > iCloud から Safariの設定をOnにする

  2. ターミナルでSafariのブックマークの同期をするエージェントを動かす。
    /System/Library/CoreServices/SafariSupport.bundle/Contents/MacOS/SafariBookmarksSyncAgent

    f:id:mozy_ok:20190202162136p:plain
    手動で同期する

  3. SQLite なデータベース /Library/Safari/CloudTabs.dbを見つけて開く 

    f:id:mozy_ok:20190202162234p:plain
    このDBの中にタブ情報が入っている

  4. データベースの中身はこんな感じ

    f:id:mozy_ok:20190202162348p:plain
    テーブル構成

    f:id:mozy_ok:20190202162448p:plain
    iPhoneもきちんと認識されているぞ!!

  5. cloud_tabs テーブルの中身に目的のiPhoneで開いている数百のタブのリストがある!

    f:id:mozy_ok:20190202162732p:plain
    きたああああああーーーーー

  6. クエリを叩く select title, url from cloud_tabs

    f:id:mozy_ok:20190202162933p:plain
    実行した結果

  7. CSVに書き出して完了!!

    f:id:mozy_ok:20190202163136p:plain
    CSVが手に入った!

まとめ

意外と簡単にiPhoneで開いている数百のタブの情報がCSVでエクスポートできた!!
これでiPhoneのストレージの容量が減らせるぜ

数百とか開いているSafariのタブ情報をエクスポートする

経緯

つまりはこういうことだ
開きすぎる癖があって、これをどうにかしてCSVなりに書き出したかった

iPhoneのストレージも逼迫するし。

探していたところ

かみさーまー みたいな記事を発見した。BOOOM!!!

Ok!!! This has been SOLVED. For those who were wondering...

The post request to https://p58-ckdatabase.icloud.com/api/client/record/sync contained gzip-encoded information which made reference to SafariBookmarksSyncAgent.

SafariBookmarksSyncAgent is located at /System/Library/CoreServices/SafariSupport.bundle/Contents/MacOS/SafariBookmarksSyncAgent.

Ran strings on the binary and saw it made reference to: (allow file* (home-literal "/Library/Safari/CloudTabs.db"))

/Library/Safari/CloudTabs.db does not exist, but ~/Library/Safari/CloudTabs.db does!

CloudTabs.db is a SQLite3 database with table cloud_tabs and cloud_tab_devices.

select * from cloud_tab_devices gives the device_uuid in column 1.

select url from cloud_tabs where device_uuid='';

BOOM!

Reddit - mac - iPhone Safari Tabs into Text List via iCloud?

やってみた

今出先でPCがないため、家に戻ったら速攻やるぞ。

js.erb とは何者か

経緯

RailsAjaxなどを使ってよしなに動作を作りたいときに js.erbファイルを使って$('#id-hogera').append("<%= j(render 'form', ....) %>"); みたいなことをしたりするけど、この文法って結局なんやねんって思ったのでメモ

つまりは

.js.erbファイルは、コントローラのアクションで、アクションが完了したときにJavaScriptを実行したいときなどにつかう。
たとえば、ajaxでフォームを送信して、全部完了したときにアラート出したい時とかに使える。
んで、そのブラウザに返されるJavaScriptは、erbによってレンダリングされ流ので、いわゆる普通のerbの場合と同じように、カスタム文字列/変数などを入れることができる。

参考

超詳しく書いている。ナイス stackoverflow.com

GitHub にバグを見つけて報告したら速攻で修正してくれた話

f:id:mozy_ok:20190114125918p:plain

経緯

普段通りGitHubを使って業務をしていたところ、ちょっとした表示のバグを見つけて、それを報告したら、速攻で直してくれたという貴重な体験をしたので日記として書いておく。
誰かのバグ報告のメールを書くときの参考になれば幸いです。

動作

こんな感じにちょっとした表示の不具合を見つけた。


github bug

送ったメール

こんな感じに動画を添付して、サポート(support あっと github.com)に連絡をしてみた。
再現手順を書くのがコツかもしれない。

Hi, GitHub Dev team

I found a minor display bug in the [Your repositories] page.
( ex, https://github.com/MozyOk?tab=repositories )

Steps to reproduce
1. Enter characters on the search form. 
2. Delete all entered characters.
3. Two buttons at the bottom of the page are displayed.

Please check the attached video for more details. 

Thanks.

---
Mozy Okubo.
My GitHub account is https://github.com/MozyOk/.

結果

Hi Mozy,

Sorry you have experienced this problem.

I’ve escalated your report to our engineering team for further investigation.

While we don’t yet have a specific ETA, we’ll be sure to update you as soon as there’s any news to share.

てな感じに、再現したよーって言われて、エンジニアが直すので少し待っててねと言われました。

そして数日後、

Hi Mozy,

I just wanted to let you know that our engineers have recently deployed a fix for this issue, so it should now be resolved.

Thanks for your patience, and for taking the time to report the trouble! Let us know if there's anything else we can do.

という訳で速攻修正されていました!

コツ

外資系の企業にいる方や、国外とのやりとりがある方には当たり前かもしれないですが、時差を考えてメールを飛ばすのが早く連絡が返ってくるコツだったりします。
例えば、
米国西海岸に連絡をする場合は、日本時間でいう8~10時くらいの朝一に連絡をすると、現地が15~17時なので反応が返って来やすいです。
ヨーロッパ側に連絡をするときは、日本時間でいう18~20時くらいの終業時に連絡をすると、現地が10~12時くらいなので反応が返って来やすいです。
基本的には現地に比べて時差がプラスならば夜に、マイナスならば朝に、連絡をするってのがコツかもしれませんね。

まとめ

GitHubのサポート速攻返ってくるし、修正も早いしで素晴らしい!

Rails で foundation を install しようとしたらエラー

経緯

こんな感じに foundation:install をしたらエラーが出た。

$ rails g foundation:install
Traceback (most recent call last):
    41: from bin/rails:4:in `<main>'
    40: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:291:in `require'
    39: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:257:in `load_dependency'
    38: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:291:in `block in require'
    37: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
    36: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:in `require_with_bootsnap_lfi'
    35: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in `register'
    34: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `block in require_with_bootsnap_lfi'
    33: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
    32: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-5.2.2/lib/rails/commands.rb:18:in `<main>'
    31: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-5.2.2/lib/rails/command.rb:46:in `invoke'
    30: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-5.2.2/lib/rails/command/base.rb:65:in `perform'
    29: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/thor-0.20.3/lib/thor.rb:387:in `dispatch'
    28: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/thor-0.20.3/lib/thor/invocation.rb:126:in `invoke_command'
    27: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/thor-0.20.3/lib/thor/command.rb:27:in `run'
    26: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-5.2.2/lib/rails/commands/generate/generate_command.rb:21:in `perform'
    25: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-5.2.2/lib/rails/command/actions.rb:17:in `require_application_and_environment!'
    24: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:291:in `require'
    23: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:257:in `load_dependency'
    22: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:291:in `block in require'
    21: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
    20: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:in `require_with_bootsnap_lfi'
    19: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in `register'
    18: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `block in require_with_bootsnap_lfi'
    17: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
    16: from /Users/mozy/GitHub/rails-react/config/application.rb:7:in `<main>'
    15: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-2.0.1/lib/bundler.rb:114:in `require'
    14: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-2.0.1/lib/bundler/runtime.rb:65:in `require'
    13: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-2.0.1/lib/bundler/runtime.rb:65:in `each'
    12: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-2.0.1/lib/bundler/runtime.rb:76:in `block in require'
    11: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-2.0.1/lib/bundler/runtime.rb:76:in `each'
    10: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bundler-2.0.1/lib/bundler/runtime.rb:81:in `block (2 levels) in require'
     9: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
     8: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:in `require_with_bootsnap_lfi'
     7: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in `register'
     6: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `block in require_with_bootsnap_lfi'
     5: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
     4: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/foundation-rails-6.5.1.0/lib/foundation-rails.rb:2:in `<main>'
     3: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:291:in `require'
     2: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:257:in `load_dependency'
     1: from /Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/dependencies.rb:291:in `block in require'
/Users/mozy/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require': cannot load such file -- sprockets/es6 (LoadError)

試行錯誤

require': cannot load such file -- sprockets/es6 とあったのでとりあえず、
bundle update sprockets-rails したが解決せず

結論

以下のリンクにあったように foundation-rails のバージョンを下げて対応したら動作するようになった。

This appears to be an issue with the newly released 6.4.1 version. Try reverting back to Foundation 6.3.1, if you're not already using it.

gem 'foundation-rails', '~> 6.3.1''

That did the trick for me when I was having the same issue this evening. Didn't have time to look into the asset pipeline to figure out exactly where the problem originated from.

github.com

バージョンを下げた時のGemの変更部分

sass のGemバージョンも下がってるな

Fetching sass 3.4.25 (was 3.7.3)
Installing sass 3.4.25 (was 3.7.3)
Using sprockets 3.7.2
Fetching sprockets-es6 0.9.2
Installing sprockets-es6 0.9.2
Fetching foundation-rails 6.3.1.0 (was 6.5.1.0)
Installing foundation-rails 6.3.1.0 (was 6.5.1.0)

プログラミング学習はスクリーンキャスト教材を選ぶ時代

経緯

いろんな新しい技術を身につけようと思った時に、最近はYoutubeで検索すると大抵の技術は、チュートリアルが見つかったりすることに気がついて、こちらで学ぶようにしている。
最近、こんな感じのを学んだ。


Haskell Tutorial


Ansible - A Beginner's Tutorial, Part 1

関連して

Rails

Railsを学ぶ時には、RailsCast という超有名なサイトがあったのだけれども、最近は更新がされていないので、こちら、GO RAILS が最強。
かなりの量のコンテンツがあって、基本的にRailsでやりたいことはこのサイトの動画にあると思って大丈夫なレベルで便利なサイトです。
僕も事あるごとに見返したりしています。

gorails.com

Laravel

これは、Laravel版のスクリーンキャストサイトで、こちらもかなりの量のコンテンツがあって、参考にできる動画がたくさんあります。

laracasts.com

C#

これはYoutubeにあるし結構わかりやすい

C# Screencasts - YouTube

Go

実はGo言語のGitHub Wikiにスクリーンキャストのリンクがあるの知ってましたか?
これはPacktの書籍などのリンクとなっているので有料だったりするんですが、先日紹介した Safaribooks Onlineなどを契約していると、動画が観れたりします。

Screencasts · golang/go Wiki · GitHub

(Safaribooks Online はこちら)
https://safaribooksonline.com
過去記事はこちら
mozy-ok.hatenablog.com

結論

まずは、公式ドキュメントをみながら、Youtubeやサイトでスクリーンキャストやライブコーディングを眺めると、その技術特有の使い方や癖などの感覚がわかるので、かなりオススメ。
書籍やウェブサイトで学習するのに比べて、いわゆる行間を読む部分が少ないので速攻で最低限の知識を得ることができると感じている。