あんパン

こしあん派

git diffで差分のあるファイルを一瞬で開くやつ

編集してまだgit addしてないやつをもう一度開きたいとき,いちいち探るの面倒なので作った.多分この世に既にごまんとあると思う.

gitのサブコマンドとして作るならこんな感じ

FILE_PATH=$(git diff --name-only | peco)
if [ ${#FILE_PATH} -ne 0 ]; then
  $EDITOR $(git rev-parse --show-toplevel)/$FILE_PATH
fi

zshの関数として作るならこんな感じ

function peco-git-editdiff {
  local dir=$(git diff --name-only | peco)
  if [ ${#dir} -ne 0 ]; then
    BUFFER="${EDITOR} ${dir}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-git-editdiff
bindkey '^e' peco-git-editdiff

ISBNから書名と著者名とるやつシュッと作った

調べながら30分くらいでシュッと書いた.あとでもうちょい綺麗にする.

検索には国立国会図書館サーチのAPIを使った.

require 'rexml/document'
require 'csv'
require 'rest-client'

# usage:
# bundle exec ruby search.rb source.csv > result.csv

table = CSV.table ARGV[0]

table.each do |row|
  res = RestClient.get "http://iss.ndl.go.jp/api/sru?operation=searchRetrieve&query=isbn=#{row[:isbn]}"
  xml = REXML::Document.new res.to_str

  record = REXML::XPath.match(xml, '/searchRetrieveResponse/records/record').first
  data = record.elements['recordData']

  row[:title] = data.to_s.match(/<dc:title>(.+?)<\/dc:title>/)[1]
  row[:author] = data.to_s.match(/<dc:creator>(.+?)<\/dc:creator>/)[1]

  sleep 2
end

print table.to_csv

ネームスペースが登録されてなくてdc:titleみたいなタグ抜くの大変だったので雑に正規表現でやった.

↓こんな感じでCSV書いてsoruceとして指定すると良い

isbn,title,author
9784873113074,,
9784873115658,,

こんなのが出力される

isbn,title,author
9784873113074,エンジニアのための時間管理術,"Thomas A.Limoncelli 著,クイープ 訳"
9784873115658,リーダブルコード : より良いコードを書くためのシンプルで実践的なテクニック,"Dustin Boswell, Trevor Foucher 著,角征典 訳"

ワイ

iTunes音楽同期事情を知りたい

いま業務と私物でPCが分かれてる.曲は私物PCに入ってるので,会社に行く時に毎日持ち歩いてる.iPhoneで聴くこともできるけど,選曲の度にiPhoneを開くのが苦痛なので,PCで聴いている.業務PCと私物PCで曲を同期できれば私物PCを持ち歩かなくて済む.

特にこだわりはないのでプレーヤはiTunesを使ってる.iTunesの曲はSDカードスロットに刺さったストレージに蓄えるようにしている.iTunesだったらiCloudミュージックライブラリあるやろという人もいるかもしれないけど,あれはライブラリを激しく壊すので一生使う気がない.あまりに壊れるので一時期大分怒ってた.

とはいえいまのところ妙案が思いつかなくて,rsyncでUSBメモリを経由してうまく同期するようにしてる.法的に問題なくあまりコストのかからない良い案あったら教えてください.


いまこんな感じのシェルスクリプト書いてスクリプト置き場においてある.

backup.sh

#!/bin/bash

# /Volumes/Music/iTunes -> /Volumes/MusicMaster/iTunes.files
# /Users/username/Music/iTunes -> /Volumes/MusicMaster/iTunes.conf

rsync -avh --progress /Volumes/Music/iTunes/* /Volumes/MusicMaster/iTunes.files
rsync -avh --progress $HOME/Music/iTunes/* /Volumes/MusicMaster/iTunes.conf

restore.sh

#!/bin/bash

# /Volumes/MusicMaster/iTunes.files -> /Volumes/Music/iTunes
# /Volumes/MusicMaster/iTunes.conf -> /Users/username/Music/iTunes

rsync -avh --progress /Volumes/MusicMaster/iTunes.files/* /Volumes/Music/iTunes
rsync -avh --progress /Volumes/MusicMaster/iTunes.conf/* $HOME/Music/iTunes

Musicという名前でSDカードを初期化しておいて,USBメモリはMusicMasterという名前で初期化してる.だいぶ素朴.

Googleスプレッドシートで支出管理

社会人になったのでさすがに家計簿みたいなのをつけるかとなった.帳簿につける上での要求は以下の通り.

  • PCでシュッとつけられる
  • 支出管理のみを行う
    • 収入は基本一定なので,一定金額以上使わない目安にしたい
    • 上限を多少厳格に定めて運用する.残りは貯蓄に回したりする
  • 月ごとに支出を記録する
  • カードやSuica,現金などの支払方法ごとに総計が勝手に求まる

プログラムを書くのは筋が悪いと思ったので,Googleスプレッドシートで管理することにした.

f:id:masawada:20160402200115p:plain

こんな感じ.まだ何も入れていないけど,毎月定額で支払う枠も作った.通信料やサーバの維持費用などを書く.

f:id:masawada:20160402200311p:plain

で,これらの支払いタイプごとに総額を求める.

GoogleスプレッドシートにはQUERY関数というのがあって,これを使うことで総計を求めることができる.以下は今回使ったQUERY関数.

=QUERY({OFFSET(F:G,3,0);OFFSET(J:K,3,0)}, "select Col2, sum(Col1) where Col2 != '' group by Col2 label sum(Col1) ''", -1)

第一引数にOFFSET関数で

  • F列(価格)とG列(支払いタイプ)の4行目以降
  • J列(価格)とK列(支払いタイプ)の4行目以降

をデータソースとして指定する.片方だけなら{}で囲う必要はない.複数入れる場合は{}で囲って;で区切る.

第二引数でクエリを指定する.select Col2はまずCol2(G列,K列)を列挙する.カンマで区切って,sum(Col1) where Col2 != '' group by Col2で各支払いタイプごとに値を総計する.自動的にsumというラベルがつくので,label sum(Col1) ''とするとラベルを消すことができる.

第三はデータソースのうち,何行目までをラベルとして扱うのかを指定するやつ(多分).デフォルトは0で,-1を入れると雑に予測して入れてくれる.今回は試しに-1にしてるけど,optionalなので入れなくても良い.

この関数をM4のセルに突っ込んでおくと勝手に以下M4:N7のように展開される.

f:id:masawada:20160402201711p:plain

QUERY関数は便利なので,覚えておくと吉.


現状でも割と便利なのだけど,日付/品目/金額の入力が若干不便なのと,毎月テンプレートと定期支払の部分をコピーしないといけないのは面倒なので,Google Apps Scriptなどを使ってGoogleフォームから入力できるように,月初に開くと勝手にテンプレートからコピーされてるようにしたい.

株式会社はてなに入社しました

株式会社はてなに入社しました

株式会社はてなに入社しました - hitode909の日記

↑毎年恒例のやつです


こんにちは,id:masawadaです.本日付で株式会社はてなに入社しました.職種はWebアプリケーションエンジニアで,東京オフィス勤務です.

自分は2014年のはてなインターン受講生で,2015年の5月末からはアルバイトとしてはてなブログを作っています.入社後もはてなブログチームに在籍して開発を行う予定です.インターンについては以下がくわしい.

hatenacorp.jp

同期を含め優れたエンジニアの多い環境なので,良い刺激を受けつつ自分も多くのバリューを提供できるように頑張っていきたいと思います.

本題はここまでで,以下は駄文なので読む元気のある方だけどうぞ.

これまで

はてなには2016年度新卒(学部卒)としての入社で,これまでは電気通信大学に通っていました.研究室は主にGPUやFPGAを扱うところで,基礎研究というよりかは応用研究寄りだったと思います.といいつつ,自分はGPUやFPGAとはほぼ無関係のことをしていました.HTTPでリクエストなどをやりとりする動画エンコードジョブキューを作ってその仕様をもとに卒論を書いており,半ば卒業制作のような状態でした.(本当にこんなので卒業できるんだ…となるほど素朴なものしか作らなかった;;)

大学では,主に勉学よりかは課外で遊び続けており,学部2回生の時に卒業式/入学式のインターネット配信(クラスメソッド株式会社さまにお願いしてAWSを活用した配信を行った)に関わったり*1,講義の一環でエリアワンセグ配信の地上一般放送局立ち上げにほんの少し関わったり*2,Aizu.LTをパクったDentoo.LTを立ち上げたり*3,auのFx0(Firefox OS端末)発表会に少しだけ出させていただいたりしました*4

なぜはてな

院に進むか就職するかで迷い,これまでの大学に対する思いを考えると自分には研究生活は向かないなと感じ就職することにしました(社会人をしながら修士という選択肢もあるし,いますぐに修士に進むぞというモチベーションが湧かなかった).他の会社も若干は考えましたが,インターンで会社の雰囲気を感じて最高だなと思ったこともあり,はてなにお世話になることにしました.

また,はてなブログを始め,はてなのサービスにはかなりお世話になっていて,もともと親近感のある会社だったということもあります.

これから

冒頭でも述べた通り引き続きはてなブログチームで開発を行います.ブログは特に熱い思い入れがあるので,開発者としても1ユーザとしても盛り上げていきたいと思っています.が,同期を含め周りに比べると技術力はまだまだ未熟という思いが大変強いので,ブログを盛り上げつつ自分自身も業務内外で勢い良くコードの読み書きをして,力をつけていきたいと思っています.

今後ともよろしくお願いします.