ラベル アプリ の投稿を表示しています。 すべての投稿を表示
ラベル アプリ の投稿を表示しています。 すべての投稿を表示

2016年10月16日日曜日

ファイル同期サービス・ツールまとめ



複数の端末でファイルを同期できるサービスやツールをまとめてみました。
自身の研究生活で利用してきた経験からの所感もあります。
これから使ってみたい人や、現状のサービスに満足していない人の参考になれば幸いです。

完全に個人の見解ですし、筆者は専門家でもないので、違ってたら教えてください。
あと、全部無料版で利用可能な範囲内で言及してます。



2016年4月19日火曜日

iTerm小技

 

タブ、ウィンドウの操作

  • 「⌘+T」で新規タブ
  • 「⌘+{」「⌘+}」でタブ間の移動 
  • 「⌘+数字」で数字のタブに直接移動
  • 「⌘+N」で新規ウィンドウ
  • 「⌘+Option+数字」でウィンドウ移動

ペーンの分割

  • 「⌘+D」で左右に分割
  • 「⌘+Shift+D」で上下に分割
  • 「⌘+[」「⌘+]」でペーン間の移動
  • 「⌘+Shift+Enter」で選択中のペーンを最大化、もう一度押すと元に戻る

貼り付けの履歴

  • 「⌘+Shift+H」

オートコンプリート

  • 「⌘+;」で補完候補が出る
  • 「Enter」で選択、「Tab」展開
  • 「Esc」で中止

 



2016年4月18日月曜日

BetterTouchToolの個人的に便利な使い方


最近有料化された『BetterTouchTool』 a.k.a. 『BTT』の個人的に気に入ってるキーボードショートカットの設定を紹介します。
 余談ですが、筆者はウィンドウのリサイジングや配置関係のショートカットはほとんど『Slate』でまかなっているので、ここで紹介するのはウィンドウ管理以外のBTTの使い方です。



2015年10月16日金曜日

【無料】Audacityでメディアデータをグリッチさせる


オーディオファイルの編集ソフトとして有名なフリーソフト、Audacityですがデータベンディングソフトとしても使えます。
Audacity: Free Audio Editor and Recorder
Audacity - 窓の杜ライブラリ

MP4ビデオとかJPEG画像とか割りとどんなファイル形式でもグリッチさせられます。
やり方は以下。



2015年4月2日木曜日

EmacsとSkimの連携 Part.2

まえがき

以前こういった記事がありました。
Ochiailab Tips: Emacs と Skim の連携
Skim という PDF ビューアは使ったことなかったのと、導入コストに比べて作業効率の向上は微々たるものなんじゃないかと思ってずっとやっていなかったのですが、先日該当記事を書いてくれた著者のデモを見て、「これこそ風だ」と思ったので導入を決意しました。
ただ、該当記事に Xtexshop というのが出てくるのですが、僕の Mac にはそんなもの入っておらず何それという感じなので少しだけ違う方法を取ることにしました。
latexmk というコマンドを使います。



2015年4月1日水曜日

カスタマイズ可能なデスクトップウィジェットアプリ「Übersicht」


アプリの紹介です。
Übersichtというアプリを使うと、Macのデスクトップに色々なものを表示できます。
Übersicht

トップ画像では時計と天気、CPUとメモリの使用状況、Tumblrの画像を表示させています。

ウィジェットのカスタマイズはCoffeeScriptかJavaScriptでできますが、既に色々なウィジェットが開発されているので導入は簡単です。
Übersicht Widgets

Tumblrの画像表示が一番便利だと思いました。

2015年3月25日水曜日

Homebrew で Mac の環境を移行したり同期する


新しい Mac にアプリやライブラリ等を Homebrew によって自動で移行させて、かつ双方 の Mac で環境を同期させるやり方の覚え書き。


2015年2月22日日曜日

【Mac】キーボードのチャタリングはソフトウェアで直せる【Karabiner】

筆者にはお気に入りのキーボードがあります。
これです。

Truly-Ergonomic - Truly Ergonomic Mechanical Keyboard
です。
TECK 209というモデルです。
メカニカルキーボードは一般的にチャタリングを起こしやすいという性質があり、特にこのキーボードは酷いという評判があって筆者もそれに悩まされていました。
購入してから3ヶ月経たないくらいでキーを一回押しただけでいくつも同じキーがリピートして押されるという現象が発生しました。
保証期間内だったので無料で修理してもらいましたが、それから約1年後にもう一度同じ現象に見舞われました。
保証期間も終わっていたし、今後1年おきに同じ現象が発生するのかと思うと修理をするのをためらってしまいます。

実はこのTECKのモデルのファームウェアにはバグあるらしく、チャタリング抑制機能が働かないようになっているらしいのです。
以下のサイトにバグを直した版のファームウェアがあります。
yurivkhan/teck
しかし筆者の場合、これを入れるとキーボードが一切反応しなくなるという余計質の悪い現象に見舞われたので、元のファームウェアに戻しました。

チャタリングのストレスを感じつつ、サブキーボードとして使用していましたが、Mac用のキーリマップソフトウェア、Karabinerが割りと最近のアップデートでチャタリング抑制機能を追加したのを知りました。
Karabiner - OS X用のソフトウェア
それで試しに使ってみたら、なんとみごとに直りました。
設定方法は、
  • [Change Key] -> ["Ignore bouncing (chattering) events"をオン]
  • [Key Repeat] -> ["Ignore bouncing/chattering events"の閾値を変更]
だけです。
デフォルトの閾値でも改善されますが、筆者はタイピングに支障が出ないくらいのもう少し大きい値に設定してます。

Karabinerの作者様に幸あれ。

関連記事です。
Ochiailab Tips: アルファベット全部コントロールキーにする

2013年11月22日金曜日

Slateを使うとマウスが必要無くなるから窓から放り投げよう


やあ、みなさん。

SlateというMac専用のオープンソースのウィンドウマネージャを使うと、キーボード生活が楽になります。
jigish/slate - GitHub

Macにおけるウィンドウマネージャ的な役割を担うソフトウェアで有名なものには『BetterTouchTool』や『Spectacle』なんかがあるかと思いますが、それらよりかはかなり細かく設定できると思われて便利です。

設定方法

ホームフォルダに".slate.js"というJavaScriptファイルを置いとくと、それを設定ファイルとして読み込んでくれます。
専用の表記方法を利用した".slate"というファイルも置いておけるらしくて、これらはショートカットキーが被ってなければ共存できるらしいです。

何ができるの?

この記事の最後に僕が使っている".slate.js"のソースを載せますが、それを使うと以下のようなことができます。

alt-shift-tab 複数ウィンドウあるアプリを画面にタイル状に並べる
alt-cmd-t iTermにフォーカスor起動
alt-cmd-e Emacs〃
alt-cmd-b Firefox〃
alt-cmd-f Finder〃
alt-cmd-d Dictionary〃
alt-cmd-i iTunes〃
alt-cmd-space Found〃
alt-cmd-p Preview〃
alt-cmd-m Mjograph〃
alt-h, j, k or l Vimライクにウィンドウのフォーカスを移動
alt-i 下に隠れているウィンドウをフォーカス
alt-p スクリーン間でフォーカスを移動
alt-shift-p 次のスクリーンへ飛ばす
alt-shift-o 四隅に飛ばす
alt-shift-u 左右に飛ばす
alt-shift-i 上下に飛ばす
alt-shift-h ウィンドウが左にあるなら縮小, 右にあるなら拡大
alt-shift-l ウィンドウが右にあるなら縮小, 左にあるなら拡大
alt-shift-k ウィンドウが上にあるなら縮小, 下にあるなら拡大
alt-shift-j ウィンドウが下にあるなら縮小, 上にあるなら拡大
alt-shift-m ウィンドウを最大化
alt-n 同じアプリケーションで別のウィンドウにフォーカスする

alt-cmd系はアプリを起動するものに割り当てて、alt-shift系はウィンドウのリサイズ関係、alt系はウィンドウのフォーカス関係になってます。
alt-ctrlは僕のキーボード配列じゃ打ちづらいんで入れてませんが、入れてもいいと思います。

設定

以下が僕の".slate.js"ファイルです。
JavaScript分かんないんで、ほとんどコピペです。
// http://yohasebe.com/wp/archives/3513
// for tiling windows of focused app onto desktop
// (2 x 2, clockwise)
 
var topLeft = slate.operation("corner", {
  "direction" : "top-left",
  "width"  : "screenSizeX/2",
  "height" : "screenSizeY/2"
});
 
var topRight = slate.operation("corner", {
  "direction" : "top-right",
  "width"  : "screenSizeX/2",
  "height" : "screenSizeY/2"
});
 
var bottomRight = slate.operation("corner", {
  "direction" : "bottom-right",
  "width"  : "screenSizeX/2",
  "height" : "screenSizeY/2"
});
 
var bottomLeft = slate.operation("corner", {
  "direction" : "bottom-left",
  "width"  : "screenSizeX/2",
  "height" : "screenSizeY/2"
});

// [tab]+alt+shiftでアプリのウィンドウをタイル状に並べる
var tileKey = "tab:alt;shift";
 
slate.bind(tileKey, function(win){
  var appName = win.app().name();    
  var tiled = {};
  tiled[appName] = {
    "operations" : [topLeft, topRight, bottomRight, bottomLeft],
    "main-first" : true,
    "repeat"     : true
  };      
  var tiledLayout = slate.layout("tiledLayout", tiled);
  slate.operation("layout", {"name" : tiledLayout }).run();
  slate.operation("show", {"app" : appName}).run();
});

// http://d.hatena.ne.jp/sugyan/20130301/1362129310
// アプリ立ち上げる関数
var launch_and_focus = function (target) {
    return function (win) {
        var apps = [];
        S.eachApp(function (app) { apps.push(app.name()); });
        if (! _.find(apps, function (name) { return name === target; })) {
            win.doOperation(
                S.operation('shell', {
                    command: "/usr/bin/open -a " + target,
                    waithFoeExit: true
                })
            );
        }
        win.doOperation(S.operation('focus', { app: target }));
    };
};
S.bind('t:alt,cmd', launch_and_focus('iTerm'));
S.bind('e:alt,cmd', launch_and_focus('Emacs'));
S.bind('b:alt,cmd', launch_and_focus('Firefox'));
S.bind('f:alt,cmd', launch_and_focus('Finder'));
S.bind('d:alt,cmd', launch_and_focus('Dictionary'));
S.bind('i:alt,cmd', launch_and_focus('iTunes'));
S.bind('space:alt,cmd', launch_and_focus('Found'));
S.bind('p:alt,cmd', launch_and_focus('Preview'));
S.bind('m:alt,cmd', launch_and_focus('Mjograph'));

// http://www.infiniteloop.co.jp/blog/2013/08/osx_slate/
var util = {
  // alt + ..
  key: function(k, mod) {
    return k + ':alt' + (mod ? ',' + mod : '');
  },
  focusWindow: function(f) {
    var hit = false;
    slate.eachApp(function(app) {
      if (hit) return;
      app.eachWindow(function(win) {
        if (hit) return;
        if (f(win)) {
          win.focus();
          hit = true;
        }
      });
    });
  },
  nextScreen: function(screen) {
    return slate.screenForRef(String( (screen.id()+1)%slate.screenCount() ));
  }
};
 
// ----------- 以下 alt+

// hjkl       .. その方向へフォーカス移動
slate.bind(util.key('h'), slate.operation('focus', { direction: 'left' }));
slate.bind(util.key('j'), slate.operation('focus', { direction: 'down' }));
slate.bind(util.key('k'), slate.operation('focus', { direction: 'up' }));
slate.bind(util.key('l'), slate.operation('focus', { direction: 'right' }));
 
// i          .. 下に隠れているウィンドウをフォーカス
slate.bind(util.key('i'), slate.operation('focus', { direction: 'behind' }));

 
// p          .. スクリーン間でフォーカスを移動
slate.bind(util.key('p'), function(win) {
  var next = util.nextScreen(slate.screen());
 
  util.focusWindow(function(win) {
    return win.screen().id() == next.id();
  });
});

// p+shift    .. 次のスクリーンへ飛ばす
slate.bind(util.key('p', 'shift'), function(win) {
  if (!win) return;
  var next = util.nextScreen(win.screen());
 
  win.move(next.visibleRect());
});
 
// o+shift    .. 4隅に飛ばす
var corners = slate.bind(util.key('o', 'shift'), slate.operation('chain', {
  operations: _.map(['top-right', 'bottom-right', 'bottom-left', 'top-left'], function(d) {
    return slate.operation('corner', {
      direction: d,
      width: 'screenSizeX/2',
      height: 'screenSizeY/2'
    });
  })
}));
 
// u+shift    .. 左右に飛ばす
slate.bind(util.key('u', 'shift'), slate.operation('chain', {
  operations: _.map(['left', 'right'], function(d) {
    return slate.operation('push', {
      direction: d,
      style: 'bar-resize:screenSizeX/2'
    });
  })
}));

// i+shift    .. 上下に飛ばす
slate.bind(util.key('i', 'shift'), slate.operation('chain', {
  operations: _.map(['top', 'bottom'], function(d) {
    return slate.operation('push', {
      direction: d,
      style: 'bar-resize:screenSizeY/2'
    });
  })
}));

 
// h+shift   .. ウィンドウが左にあるなら縮小, 右にあるなら拡大
slate.bind(util.key('h', 'shift'), function(win) {
  if (!win) return;
  var rect = win.rect();
  var bounds = win.screen().visibleRect();
  if (bounds.x + bounds.width - 30 < rect.x + rect.width) {
    rect.x -= bounds.width * 0.05;
    rect.width = bounds.x + bounds.width - rect.x;
  } else {
    rect.width -= bounds.width * 0.05;
  }
  win.doOperation('move', rect);
});
 
// l+shift   .. ウィンドウが右にあるなら縮小, 左にあるなら拡大
slate.bind(util.key('l', 'shift'), function(win) {
  if (!win) return;
  var rect = win.rect();
  var bounds = win.screen().visibleRect();
  if (rect.x < bounds.x + 30) {
    rect.x = bounds.x;
    rect.width += bounds.width * 0.05;
  } else {
    rect.x += bounds.width * 0.05;
    rect.width -= bounds.width * 0.05;
  }
  win.doOperation('move', rect);
});

// k+shift   .. ウィンドウが上にあるなら縮小, 下にあるなら拡大
slate.bind(util.key('k', 'shift'), function(win) {
  if (!win) return;
  var rect = win.rect();
  var bounds = win.screen().visibleRect();
  if (bounds.y + bounds.height - 30 < rect.y + rect.height) {
    rect.y -= bounds.height * 0.05;
    rect.height += bounds.height * 0.05;
  } else {
    rect.height -= bounds.height * 0.05;
  }
  win.doOperation('move', rect);
});

// j+shift   .. ウィンドウが下にあるなら縮小, 上にあるなら拡大
slate.bind(util.key('j', 'shift'), function(win) {
  if (!win) return;
  var rect = win.rect();
  var bounds = win.screen().visibleRect();
  if (rect.y < bounds.y + 30) {
    rect.y = bounds.y;
    rect.height += bounds.height * 0.05;
  } else {
    rect.y += bounds.height * 0.05;
    rect.height -= bounds.height * 0.05;
  }
  win.doOperation('move', rect);
});

 
// m          .. 最大化
slate.bind(util.key('m', 'shift'), function(win) {
  if (!win) return;
  var bounds = win.screen().visibleRect();
  win.doOperation('move', bounds);
});


// http://mint.hateblo.jp/category/Slate
// 同じアプリケーションで別のウィンドウにフォーカスする (Chrome対応版)
S.bind('n:alt', function() {
function get_next_win(windows) {
truth_values_of_is_main = _.map(windows, function(w){ return w.isMain(); })
next_idx = _.indexOf(truth_values_of_is_main, 1) + 1;
if (next_idx >= _.size(windows)) { return windows[0]; }
return windows[next_idx];
}
windows = [];
slate.app().eachWindow(function(win){
if (win.title() !== '') { windows.push(win); } // タイトルが無いウィンドウは無視
});
if (_.size(windows) === 1){ return; }
sorted = _.sortBy(windows, function(win){ return win.title(); });
get_next_win(sorted).focus();
});
設定し終わったらマウスを外に投げましょう。

追記

ウィンドウの微妙な位置調整がやりたい場面があって、その関数がまだ無かったので作りました。
Alt + Shift + WASDキーで上下左右の移動ができるようになります。
// d+shift   .. ウィンドウを右に移動
slate.bind(util.key('d', 'shift'), function(win) {
    if (!win) return;
    var rect = win.rect();
    var bounds = win.screen().visibleRect();
    rect.x += bounds.width * 0.05;
    win.doOperation('move', rect);
});

// a+shift   .. ウィンドウを左に移動
slate.bind(util.key('a', 'shift'), function(win) {
    if (!win) return;
    var rect = win.rect();
    var bounds = win.screen().visibleRect();
    rect.x -= bounds.width * 0.05;
    win.doOperation('move', rect);
});

// s+shift   .. ウィンドウを下に移動
slate.bind(util.key('s', 'shift'), function(win) {
    if (!win) return;
    var rect = win.rect();
    var bounds = win.screen().visibleRect();
    rect.y += bounds.height * 0.05;
    win.doOperation('move', rect);
});

// w+shift   .. ウィンドウを上に移動
slate.bind(util.key('w', 'shift'), function(win) {
    if (!win) return;
    var rect = win.rect();
    var bounds = win.screen().visibleRect();
    rect.y -= bounds.height * 0.05;
    win.doOperation('move', rect);
});



参考サイト

Slateを入れてみた - すぎゃーんメモ
Slate - ミントフレーバー緑茶
Slateの設定ファイル(JavaScript版) | yohasebe.com
OS Xで作業効率を5%上げるSlateの紹介 | 株式会社インフィニットループ技術ブログ

2013年6月24日月曜日

ffmpegで色々する


おはようございます。
今回の記事は研究と直接関係無いんですけど、便利なんでみんなに知ってもらおうと思って書きます。
タイトルにある通りffmpegというツールについてのお話です。

ffmpegは情強を自負している人は当然知っているであろうツールで、何ができるかというと動画像、音楽、画像の相互変換やファイル形式の変換が簡単にできるものです。
例えば動画像を連続した静止画やgifアニメーションにしたり、動画像データから音声データを抜き出したり、flvをmp4にしたり、mp3からaacやアップルロスレスへの変換などメディアファイルの変換は大抵なんでもできます。

インストール

ffmpegを使ったGUIソフトはたくさん出まわってますが、そんなものに頼らなくても上述したことはターミナルから出来ます。
インストールはhomebrewやMacPortsを使えば簡単です。
方法は以下などを参考にしてください。
Mac Ports で ffmpegのインストール
Macのhomebrewでffmpegのインストール
インストールしてみると分かりますが、lameなど一緒にたくさんのオープンソースなライブラリがインストールされます。
多分ffmpegは巷で出回っているメディア系のライブラリをオールインワンした感じなんだと思います。

使い方

動画像から音声データの抜き出し

 今mezon.mp4という動画ファイルから最初の3秒目から50秒目までの音声データを抜き出したいとします。
まず、どういう形式のファイルで音声データが格納されているかを知りたいので以下のコマンドを入力します。
ffmpeg -i mezon.mp4
で、これで音声データがmp3で格納されていると分かったとしたら以下のコマンドで抜き出すことができます。
ffmpeg -y -i mezon.mp4 -acodec copy -ss 3 -t 00:00:50 mezon.mp3
-yオプションは出力ファイルが既に存在していたら上書きするということです。
-acodecはここでは元の音声ファイルと同じ形式にしたのでcopyを指定しましたが、libaacなどと指定するとaacで出力できたりします。
-abオプションってのもあって128kとかでビットレートを指定できたりします。

音楽データのファイル形式の変換

今回の記事のメインはメゾンではなくここです。
上述したようにffmpegを使うと音楽ファイルのファイル形式の変換も簡単にできます。
ffmpegではMicrosoftが開発したwma形式にも対応しています。
筆者がまだ学部生だった頃Windowsしか使っておらず、何を思ったか所有している3、400枚ほどのCDを全部wmaで取り込んでしまい、今のメインで使ってるMacではVLCプレーヤーなどを使わないとそれらを再生することができない状況に陥りました。
 iTunesでwmaファイルを読みこんでくれるプラグインがあれば一番良かったのですがそれも見つからず、かといって自分で作るにしてもAPIとか出まわってなさそうなのでそれはあきらめました。
なので持っているwmaファイルを全てiTunesで読み取ってもらえるアップルロスレス形式に変換することを決心しました。

そこでシェルスクリプトの出番です。
ファイル内のサブディレクトリにまで渡って全てのwmaファイルをそれと同じフォルダにアップルロスレスのm4a形式として出力するやり方は以下のようになります。
find . -name "*.wma" | while read FILE
do
    ffmpeg -y -i "$FILE" -acodec alac "${FILE%.wma}.m4a"
done
alacってのがアップルロスレスを指定するオプションです。

が、実はこの方法ではいくつか問題が起きました。
まず、アップルロスレスではファイルサイズがでか過ぎてwmaファイルの20倍くらいになってしまうということです。
全ファイルにやるとwmaだけで40GBくらいあるのにアップルロスレスにすると800GBくらいに膨れ上がるのでウザいです。
なのでmp3の320kbpsでやります。
しかも、ffmpeg一回すると分かるのですが色んな情報が標準出力に出力されて、40GB分とかになると大量のログデータが残ってしまいます。
なのでログとして出力する情報をエラーが起きたときのみに変更します。
さらに、上記の方法では日本語ファイルの変換が何故かうまくいきませんでした。
スペースが存在するのが原因かもしれませんがechoでファイル名表示させるのは上手くいくので、ファイル名が長すぎたりするとダメなのかもしれません。

そこで別の方法を取ります。
xargsというコマンドを使うと、findの引数をいい感じにしてくれるみたいなんでそれを使います。
いい感じというのは、findの結果が大量にあった場合に小出しにして次のコマンドに送ってくれるらしいです。
具体的には以下のコマンドになります。
find . -name "*.wma" -print0 | perl -pe 's/\.wma\0/\0/g' | xargs -0 -I{} ffmpeg -y -i {}.wma -acodec mp3 -ab 320k -loglevel error {}.mp3
perlなんちゃらの部分でファイル名から.wmaを取り除いた文字列を取得してxargsに渡しています。
findの-print0オプションはスペースを含んだファイルも扱えるようにするものでxargsの-0オプションと一緒に使うのが定石っぽいです。
これをさっきのに入れたら良かったのかもしれませんが試してません。
xargsの部分ではwhileループを書く必要がなく、入力文字列を{}に入れてffmpegを実行しています。
ffmpegのオプションは上で説明したものを指定しています。
>> log.txtなどと付け加えるとログをテキストデータで保存できます。

以上長々と便利ツールffmpegの使い方を紹介しましたが、情強の方は多分これくらい余裕なのかもしれませんが自分用の備忘録としても書いておきました。

2013年4月5日金曜日

Dash.appでプログラミング言語のドキュメントを見る



プログラムを書いていて、標準ライブラリや外部ライブラリの関数の使い方を調べたくなるときありませんか?
そこのあなた、fscanfとかfseek関数の使い方分かりますか?
memcpyとかmemcmpの使い方分かりますか?
ググるのもいいですが、Dashというアプリを使えばオフラインでもそれが確認できます。
Dash – Snippet Manager, Documentation Browser




2012年12月19日水曜日

論文管理ソフト | mendely

【追記】
preferences > BibTeX > Enable BibTex syncingにチェック

これで持ってる論文bibファイルが生成されます。



タイトルの通り論文管理ソフトです.
http://www.mendeley.com/

あまり使いこなせていませんが,以下の特徴が挙げられます.

  • 論文の情報を自動で認識 (タイトル,著者…etc)
  • 指定したフォルダ内のファイルを自動で読み込む
  • それぞれの論文にメモを書くことが可能
  • PDF検索
  • 日本語には弱い?
ちなみにiOS,Android版もあります.