Desk.comのケースを自動で閉じるChrome拡張ができました

Releases · laiso/desk-neglector-chrome

desk-neglector-*.crx をダウンロードして、Window -> Extension のタブに放り込みます。

仕様

/agent ページを訪れた時に10秒ごとにケースを開いているかチェックして、開いていたら60秒後に閉じます。

'use strict';

var hasOpenCases = false;
window.setInterval(function () {
    if ($('.tab_closer').length > 0 && !hasOpenCases){
        hasOpenCases = true;
        window.setTimeout(function(){
            hasOpenCases = false;
            $('.tab_closer').each(function(){ $(this).click() });
        }, 60*1000);
    }
}, 10*1000);

GitHubでWatchしてるリポジトリの通知をマージされたプルリクエストだけに絞る

f:id:laiso:20150117103931p:plain

GitHubで試しにWatch増やしていってみたら全部追えなくなって自然とマージされたやつだけ目grepするようになっていたのでbookmarkletにした。

$("li.list-group-item")
  .filter(function(){ return this.getElementsByClassName("type-icon-state-merged").length === 0 })
  .map(function(){ this.style.display = "none" });

おまけ: プルリクエストだけにする

$("li.list-group-item")
  .filter(function(){ return $(this).find('span.type-icon').attr('aria-label') !== 'pull request' })
  .map(function(){ this.style.display = "none" });

AWS Lambda でS3 にファイルをアップロードしたらSlackチャットに通知するやつ

f:id:laiso:20150116150750p:plain

AWS Lambda をさわってみたら楽しげだったので作ってみた。

ソース: aws-lambda-samples/s3slack at master · laiso/aws-lambda-samples

zip圧縮してブラウザからアップロードできます(ルートをフォルダで包まないこと)。 やっていることは以下。

const SLACK_TOKEN = "xxx...xxx";

var req = require('request');

exports.handler = function(event, context) {
    var filename = event.Records[0].s3.object.key;
    req.post('https://slack.com/api/chat.postMessage')
        .form({
            token: SLACK_TOKEN,
            channel: "#s3",
            text: "Put: "+filename
        })
        .on('response', function (response) {
          response.on('data', function(data) {
            context.done(null, data);
          });
        })
        .on('error', function (err) {
            cotext.done(err, 'Failed post the chat');
        });
};

SLACK_TOKEN: Slack Web API | Slack このへんで取れます

S3: Amazon Web Services ブログ: 【AWS発表】S3の新しいイベント通知機能 このへんと

AWS Lambda: 初めてのJavaScript、初めてのAWS Lambda | Developers.IO このへんを参考にセットアップしてください

知見

  • RebelMail/node-lambda · GitHub を使うと。Eventオブジェクトのfixtureつけてrunしてくれたりするのでローカルでテストできる
  • npmの外部モジュール使いたい時はzipファイルにしてディレクトリ直下に全部必要なファイルバンドルする
  • npm installしたnode_modules以下はシンボリックリンクなのでそのままだとzipファイルには入らない
  • node-lambda でデプロイまでできるみたいだからこのへん気にしなくてもよくなるかもしれない
  • cotext.done 呼ばないと未完了扱いになって自動で3回リトライされる

他の活用事例

AWS Lambda Advent Calendar 2014 - Qiita

AWS Lambda Shell Hack

なんか楽しそうなやつ

factory_girl みたいなやつ in #iOSDev

のどちらか。

FactoryGentleman はSoundCloud社で作ってるので普通に考えたらCMFactoryより寿命が長い(CedarとKiwiの事例があるけど……)。
オブジェクト生成は NSInvocation を使ってある程度ダイナミクに実現しているようだ。

CMFactoryはJSONやplistのfixturesを用意しておいてそれを読み込むためのユーテリティという感じ。あとMantleサポートがある。

Safariのリーディングリストに登録したURLをPocketに送るためのツールを作った

laiso/rl2pocket · GitHub

これ。

iPhoneMacで適当にリーディングリストを使う。

f:id:laiso:20150108191807p:plain

./rl2pocket

というコマンドを実行するとmailto:のリンクを開くのでMail.appやブラウザが起動するのでそのまま送信する

f:id:laiso:20150108191656p:plain

サイトが特殊なタイプのリンクを開くことを許可する(ハンドラ) - Chrome ヘルプ

Setup

https://github.com/laiso/rl2pocket/releases からダウンロードしてTerminalから実行。

  1. OS XiCloud設定でSafariをオンに

f:id:laiso:20150108191254p:plain

  1. Pocketにメールで投稿できるようにしておく

https://getpocket.com/emails

Motivation

  • iPhoneでいろんなアプリからPocketに登録するよりリーディングリストへの追加のが手軽だから使っていた
  • しかしRead it LaterはPocketに集約したい
  • それPla(plagger.orgはそれどころではないよの略)

Improvements

  • 認証機能つけて自働化できるようにする
  • 差分で送信して同期するしくみをつける
  • 黒い画面を見なくてもよくする

Code

Swiftで簡単に書けた

import Foundation
import Cocoa

func putPocket(readingList: [[String: AnyObject]]){
    let urls = readingList.map({ (item) -> String in
        item["URLString"] as String
    })
    
    let body = "\n".join(urls).stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())!
    let url = "mailto:add@getpocket.com?subject=rl2pocket&body=\(body)"
    NSWorkspace.sharedWorkspace().openURL(NSURL(string: url)!)
    
    println("Sending... \(urls.count) urls")
}

if let plist = NSDictionary(contentsOfFile: NSHomeDirectory()+"/Library/Safari/Bookmarks.plist") {
    let bookmarks = plist["Children"] as [AnyObject]
    if let readingList = bookmarks.filter({$0["Title"] as String? == "com.apple.ReadingList"}).first?["Children"] as? [[String: AnyObject]] {
        putPocket(readingList)
    }
    
    println("done")
}

フォローしてないワーさん達のツイートでふりかえる2014年

http://favolog.org/laiso/ このあたりを読んで他人が読んでも汽車を逃さない程度の分量にまとめた。

ツイートIDからplainテキスト生成するだけなのである程度自働化していればTwitterまとめははてなブログが楽だと思う。

最速でLGTMするMacアプリケーションができました

laiso/LLLGTM

これ

もともと LGTM.in/g を使っていたんだけど日本人ユーザーのアニメ画像とか内輪ネタの比率が増え出してから敬遠してしまっていた(私は動物・面白外国人派です)。ところであのサイトはほとんど日本人しか使ってなさそうな気がしている。

LGTMの度に素材を探して自分でコラ画像を作り出していたので、1行のレビューのために15分ぐらいかかっていて、これは著しく業務効率が落ちていたので解決したかった。というのが動機だった。

作ってみてどうやったら簡略化できるかをずっと考えていたんだけど。結局inputがマウスで専用ウィンドウにドラッグして。outputがクリップボードという組合せが一番良かったのでそうした。

最初はブラウザ拡張とかのがいいかなと思っていたけど

  • 画像を探すのがブラウザ(Web)自身であることと
  • 出す時はマウスさわらずにショートカットキーを使いたくなったこと

などの理由あり、OSのネイティブのAPIの助けを借りるしかなく。とりあえず今デスクトップはMacしか使ってないのでMacアプリにした。そういえば重要な欠陥があり、GIF動画が貼れません。

最初の作りたいものの直感と違って、別の方法や技術で作りはじめていたところが結構おもしろかった。

というようなことをプレゼンしたら「画像を作ってLGTMとかいうのをしなければいいのでは?」と言われたので舌打ちした。

Suponsors

Amazon Wishlist です。アップルに年貢を払ってまでストアに出すのは無理ゲーなので貼っておきます。

http://www.amazon.co.jp/registry/wishlist/1V0VYWT8ZW6BN

罪悪感を感じて放置せずに直したり機能つけたりしそうというのを期待している。