Slackのemojiを一括でダウンロードする

Slack のemoji(絵文字) を 別のワークスペースに移行するため、一括でダウンロードするスクリプトを書きました。

ぐぐるAPI トークン使ったやり方が出てきますが、自分は ブラウザ+コマンドラインでやりました。

一括でダウンロードする手順

https://(workspace).slack.com/customize/emoji を開き、ブラウザのDevtoolを開きNetworkのXHRから api/emoji.adminList のレスポンスをコピーしてファイルに保存します。この例だと emojis.json という名前にしました。

f:id:hush_in:20190324112739p:plain

下記のコマンドを実行するとDLできます。

jq -r '.emoji[] | "curl \(.url) -o \(.name)"' emojis.json | perl -pe 's/(\.([^\/]*?) -o .*)$/$1.$2/' | bash

解説

取ってきたJSONはこのような形になっているので、 jq コマンドで name と url を抜き出します

{
  "ok": true,
  "emoji": [
    {
      "name": "hoge",
      "url": "https://emoji.slack-edge.com/(team_id)/hoge/(hash).(拡張子)",
      "created": 1519043230
    },
    ...
  ]
}

stedolan.github.io

jq -r '.emoji[] | "curl \(.url) -o \(.name)"' emojis.json の結果は

curl https://emoji.slack-edge.com/(team_id)/hoge/(hash).(拡張子) -o hoge のようになります。

あとは 拡張子をつけるように置換すると

curl https://emoji.slack-edge.com/(team_id)/hoge/(hash).(拡張子) -o hoge.(拡張子) になって、

bash に渡して実行すれば画像を一括でダウンロードできます。

(シェル芸あまり得意ではないので、もっといいやり方があるかも…)

一括インポート

ちなみに emoji の一括インポートはこちらの拡張を使うとできます。 chrome.google.com

これで無事emojiの移行ができました。

Twitterの tweetとfavを消した

2008/08 から Twitterやっています。 8万tweetほどしていて、黒歴史がいろいろ残っていたので消しました。

伸びたツイートがいくつかあって勿体無いかなと思いつつ、ちゃんとしたアウトプットはブログなど別の場所で行っているのでtweetを全部消しました。

なんとなく身軽になった気がします。

https://twitter.com/hush_in

やったこと

バックアップ

fav のtweet内容をプログラムで取ってCSVにする

t の セットアップ

gem install t twurl
twurl authorize --consumer-key {CONSUMER KEY} --consumer-secret {CONSUMER SECRET}
cp ~/.twurlrc ~/.trc

ref. https://github.com/sferik/twitter/issues/878#issuecomment-401299182

バックアップ実行(CSV 形式にまとめる)

echo "ID,Posted at,Screen name,Text,Retweets,Favorites,Source,Location" > favs.csv

cat like.txt | xargs -I % sh -c '{ echo %; t status % --csv | sed -e "1d" >> favs.csv; sleep 1; }'

削除

  • twilog解除
  • 黒歴史クリーナーtweet削除
    • 綺麗さっぱり消えました。
  • 「いいね」を一括削除! を試す
    • いいね2万件くらいあったので全部消えなかった。
  • 下記のスクリプトでいいねを消してみる
    • いいねは消えてるけどいいね数はあまり減っていなかった。よくわからない状態に。。
    • いいねを掘り下げて見られることも無いだろうし諦め。
cat like.txt | xargs -I % sh -c '{ echo %; yes | t delete favorite % 1>/dev/null; sleep 3; }'

他の設定

IFTTT で 今後の Tweet, fav バックアップを自動的にEvernoteに送るようにしました。これで今後は気軽にTweet消せるようになりました。

2019年 今年の目標

2019年ももうすぐ1ヶ月経とうとしていますが今年の目標を掲げておきます。

健康第一

去年は年始から体調が悪く、長期間に渡りめまい・立ちくらみが続いていたり、強い倦怠感が続いていたりしました。
なので今年は健康第一で過ごしたいです。(もう風邪を引いてしまいましたが…)

知り合いが『最高の体調』という健康本をオススメしていたので読んで実施しようと思います。

最高の体調 ACTIVE HEALTH

最高の体調 ACTIVE HEALTH

習慣づけたいこと

毎日

  • 英語の勉強
    • 毎年 1ヶ月くらいしか続かなくて身についていない
    • 今年こそは… という気持ち

毎週

去年は技術的に面白いことに取り組んでいたものの、個人や身内で消化して終わった。 今年は外に見える活動を増やしていきたい。

  • 1冊本を読む or 1つ映画を見る
    • 積読本を消化していきたい
  • ブログ or Qiita に1つ記事投稿
    • 文章を書いていく練習として
  • Webアプリなど、なにか動くものを作る
    • 気になる技術があったらとりあえず動くものを作って試す
    • 小さいものでもいいので作って公開するというリズムを作る
  • 会社でも普段の業務とは別にアウトプット活動する

減らしていきたいこと

  • 飲み過ぎ・同じメンバーでの飲み会
  • 惰性でやっているゲーム
  • YouTubeをダラダラ見る
  • エントリー・フィード消化

できたかどうか1年後振り返ります。

高専カンファレンス新春 in 大阪に参加しました #kosenconf #kosenconf_123shinshun

高専カンファレンス新春 in 大阪 に参加しました。

会場に行ったらほぼ知らない人ばかりだったので自己紹介しておきます。

過去の高専カンファレンス参加履歴

昔は参加やスタッフしていました。最近はあまり足を運ばなくなりました。

  • 2009
    • 009tokyo LT発表
    • 011nagano 主催
  • 2010
    • 013salesio
    • 015nara
    • 017ishikawa
    • 014tokyo
    • 019kyoto 運営スタッフ
    • 021numazu
  • 2011
    • 022kobe
    • 028mie
    • 034nagano
    • 026osaka
  • 2012
    • 038tokyo
    • 054nara
  • 2013
    • 071kc5party 動画作った
  • 2018
    • 113everyone

当日

京都から新快速で大阪に向かったつもりが逆方向に乗ってしまい、気づいたら滋賀にいました。

f:id:hush_in:20190114230739p:plain
!?

1時間ほど遅刻して会場入りしました。 (最初のほうの発表聞けてないのであとでアーカイブや記事を見ます… すみません。dotfilesなど当日お話したかった。)

現役生が楽しそうに発表していて刺激を受けました。楽しかったです。

若いのにいろいろ知っていてすごいと感心するのが半分、 (特に技術的なところで)情報が調べやすい時代になって羨ましいと思ったのが半分です。

現役生は 入学年度の slack があって交流しているようで時代を感じました。(ここ5年位の流れ?)

懇親会は知り合いがいないので目が合った人に声をかけていました。 仙台や群馬から1人できている人がいて印象的でした。若さ&行動力すごい。

二次会は同じ会社の後輩がいたので捕まえ、その同級生と三人で飲んで解散しました。

10年前はOB,OGの方が多くて現役生はほぼいなかったのですが、今は現役生の方がが多くて若いパワーを感じました。 (アラサーがほぼいなくて寂しいのでまた帰ってきてほしい。)

Twitter リストの簡単な作り方について

ここからは時間があったら飛び込みLTに参加しようと思っていたネタを書いておきます。 (実際は時間がいっぱいだったので見送りました)

https://twitter.com/hush_in/lists/kosenconf-123shinshun 参加者Twitterリストの作り方について。

API を叩く

手作業でリストに追加していくのは面倒なのでAPIを叩きます。

APIを叩くスクリプトを書いてもいいのですが、 t という CLI が便利そうだったのでこれを使って叩きます。

https://github.com/sferik/t

setup

API Keyを https://developer.twitter.com/en/apps から取得します。

(昔はappを簡単に登録できたけど今は理由を英語で書く必要があって大変ですね…)

gem install t twurl
twurl authorize --consumer-key {CONSUMER KEY} --consumer-secret {CONSUMER SECRET}
cp ~/.twurlrc ~/.trc

ref. https://github.com/sferik/twitter/issues/878#issuecomment-401299182

リスト作成

t list create kosenconf-123shinshun
# NOTE _ は twitter側で - に変換されるので注意

リストに追加

t list add LIST USER [USER...]     # Add members to a list.

ユーザーを指定するだけです。

connpass から Twitter id を抜き出します。

ここも手作業でとるのはだるいのでスクリプトで取りましょう。

https://connpass.com/event/106117/participation/ を開きます。

Chrome の Console で下記コードを実行します。

{
  const list = $('.concerned_area, .participation_table_area')
  .find('a[href^="https://twitter"]').map((i, elm) => {
    const $elm = $(elm)
    return elm.search.replace('?screen_name=', '')
  }).get().join(' ')
  console.log(list)
  copy(list)
}

f:id:hush_in:20190114231511p:plain
chrome
クリップボードTwitter のIDがコピーされます。

t list add kosenconf-123shinshun (コピーしたIDをペースト)

f:id:hush_in:20190114231634p:plain

終わりです。お疲れ様でした。

本の自炊手順メモ

自分用に本の自炊手順をメモしておきます。 今まで200冊ほど自炊しましたが間が空くと忘れていくのでそろそろやり方を確立させたい。

環境・設備

f:id:hush_in:20190108103004p:plain

ScanSnap の設定

読み取り設定を幾つか作っておきます。

  • 漫画モノクロ
    • 指定したフォルダに保存
    • 画質:スーパーファイン・グレー・両面読み取り・継続読み取りを有効
      • オプション:白紙ページを自動的に削除します のみチェック
    • ファイル形式:PDF
    • 原稿サイズ:サイズ自動検出
    • マルチフィード検出:重なりで検出
    • 圧縮率:2(標準より1弱い)
  • カラー表紙
    • 漫画モノクロの画質をカラーにしたもの

この設定にした背景は以下の通り。あまり自動補正を信用しないようにしています。

  • カラーの自動判別をしない:モノクロのページでも黄ばんでいたりするとカラー判定されてしまうため。週刊誌の赤い紙も同様。
  • 原稿の向きの自動補正をしない:漫画などイラストがあると向きが間違って判定されることがあるため。活字だけならオンにしても良さそう。 向きが同じになるように揃えて入れれば問題なし。

手順

最初はタスクを分割していましたが、裁断した本の作業スペースが取られることに気づき、 今は10冊程度まとまった単位で流すのがいいかなと思っています。

漫画の場合

表紙 + 冒頭にカラー + 残り全てモノクロ の漫画を想定します。

  1. 表紙を外す
  2. 本を裁断、重なりがないかチェック
  3. カラーページと表紙を外しておき、モノクロのページをスキャン。1冊ごとにpdf化する。
    • 向きは始まりのページが下へ、頭から入るように縦向きにセット。
  4. 1.〜3.を10冊くらいまとまった単位で行う
  5. 表紙を裁断
  6. 表紙とカラーページをカラー設定でスキャン
  7. PDFを結合する
  8. ファイルをリネーム、ちゃんとファイルが結合されているかをチェック。結合済みフォルダへ。
  9. 問題なければスキャン後の生のpdfファイルを別フォルダへ。問題なさそうならゴミ箱へ。
  10. (一定期間保持した後)裁断済みの本を縛って古紙回収

文庫本など

ファイルサイズを軽くしたい・ビューアーの負担を軽減したい場合、Adobe Acrobatのテキスト認識→PDFの出力形式:ClearScan でファイルを変換して、別名保存。(原本のファイルは取っておく)

ファイルサイズが1/3〜1/4くらいになる。

PDFの結合

"/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py" --output output.pdf input1.pdf input2.pdf というコマンドでPDFを結合できるらしいです。

参考 http://samurai20000.hatenablog.com/entry/20090815/1250340293

スキャンしたフォルダを lsすると、モノクロのファイル、カラーページのファイルの順で並んでいます。

ls -1
20171114193443.pdf
20171114193907.pdf
20171114194321.pdf
20171114194728.pdf
20171114195128.pdf
20171114195656.pdf
20171114200056.pdf
20171114200528.pdf
20171114201004.pdf
20171114201437.pdf
20171114202048.pdf
20171114202104.pdf
20171114202217.pdf
20171114202242.pdf
20171114202311.pdf
20171114202338.pdf
20171114202357.pdf
20171114202411.pdf
20171114202433.pdf
20171114202447.pdf

sublime textの矩形編集など使ってこれをコマンドが実行できるように整形する。

"/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py" --output formatted/output`date "+%Y%m%d_%H%M%S"`.pdf 20171114202048.pdf 20171114193443.pdf
"/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py" --output formatted/output`date "+%Y%m%d_%H%M%S"`.pdf 20171114202104.pdf 20171114193907.pdf
...

20190114追記 shell関数を定義しておくと便利

# fish での例
function joinpdf
  mkdir -p formatted
  "/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py" --output formatted/output(date "+%Y%m%d_%H%M%S").pdf $argv
end
joinpdf 20171114202048.pdf 20171114193443.pdf
joinpdf 20171114202104.pdf 20171114193907.pdf
...

他の方法でもPDF結合できましたが、やりにくい点があったので今はコマンド実行に落ち着きました。

  • Adobe Acrobat:手作業で結合しなきゃいけないのとUIをぽちぽちやらなきゃいけなくて面倒。
  • Automator:自動化できたが、結合後のファイルサイズが結合前のファイル合計よりかなり大きくなっていてなにかがおかしかった。

Step-by-step-frontend やった

ironhee.github.io

モダンなフロントエンドの書き方などをチュートリアル形式で勉強できた。

Promiseがよくわからなくて調べた。 http://www.html5rocks.com/ja/tutorials/es6/promises/

気になった点

  • src/js/.estlinrc -> src/js/.eslinrc
  • linter-eslint をatomで使ってみたが固まるのでやめた
  • db.json comments を書いておかないと404返された
{
  "comments": []
}