アルパカ翻訳者の備忘録

フリーランス翻訳者claponが気になったことをまとめます

DMM英会話のレッスン予約確認メールからGoogleカレンダーに自動登録する

DMM英会話始めました! 毎日レッスンできるので楽しいですね。予約も取れますし。しかし唯一不満な点は、予約した内容をカレンダーに入れる機能が提供されていないことです。

そんなわけでこちらのサイトを参考に、簡略化してカスタマイズしました。
blog.shotarok.com

この技が使えるのは次の人です。

仕組み

レッスン予約したときにDMM英会話から届く「レッスン予約」というメールが未読の中にあると、スクリプトが発動して、あらかじめ指定したカレンダーに予定が自動登録されるようにします。

ではさっそく内容を説明しますよ〜!

作り方

Googleドライブで新規スクリプトプロジェクトを作る

ドライブで新規スクリプトの作り方

「新規」→「その他」→「Google Apps Script」を選びます。


Google Apps Script画面が表示されます。
Google Apps Script画面

ここに、次のコードをコピペします。
一部、
GASでDMM英会話の予約メールから自動的にカレンダーに登録 | shotarok's Tech Blog
さんのソースを拝借しました!

/**
 * 検索結果のそれぞれのメールに対して与えられた処理を行う
 *
 * @param {string} criteria 検索条件。Gmailで絞り込むのと同等の文字列
 * @param {function} callback 1メールに対して行う処理。callback関数への引数にはGmailMessageが渡される
 */
function eachMessage(criteria, callback) {
  GmailApp.search(criteria).forEach(function(thread) {
    thread.getMessages().forEach(callback);
  });
}

/**
 * 検索結果の未読メールに対して与えられた処理を行た後、既読にする
 *
 * @param {string} criteria 検索条件。Gmailで絞り込むのと同等の文字列
 * @param {function} callback 1メールに対して行う処理。callback関数への引数にはGmailMessageが渡される
 */
function eachUnreadMessage(criteria, callback) {
  GmailApp.search(criteria).forEach(function(thread) {
    thread.getMessages().forEach(function (message) {
         if (message.isUnread()) {
             callback(message);
             message.markRead();
         }
     });
  });
}

/**
 * デフォルトのカレンダーにイベントを登録する
 *
 * @param {string} title イベントのタイトル
 * @param {Date} startDate イベントが始まる時刻
 * @param {Date} endDate イベントが終わる時刻
 */
function createEvent(title, startDate, endDate, event) {
  if (!(title && startDate && endDate)) {
      return event;
  }  
  // 指定したカレンダーにイベントを登録
  var cal = CalendarApp.getCalendarById('☆自分のカレンダーID☆');
  var event = cal.createEvent(title, startDate, endDate);
  Logger.log('Event ID: ' + event.getTitle() + '[' + startDate + '~' + endDate + '] is created');
  
  return event;
}

function myFunction() {
  // 予約確認メールの送信者とメール件名
  var criteria = "from:noreply@eikaiwa.dmm.com レッスン予約";
  eachUnreadMessage(criteria, function (message) {
    var body = message.getBody();
    //  「2020/06/27 21:00のTonyとのレッスン予約が完了しました」から抜き出します
    var [matched, year, month, day, sh, sm, teacher] = /様、(\d+)\/(\d\d)\/(\d\d) (\d\d):(\d\d)の(\w+)との/.exec(body);
    var sdate = new Date(year, month-1, day, sh, sm);
    var edate = new Date(sdate.getTime() + 30 * 60000);
    var event = createEvent("DMM英会話:" + teacher, sdate, edate, 'https://eikaiwa.dmm.com/');
    // レッスン15分前にポップアップアラートを表示
    event.addPopupReminder(15);
  }
  );
}


DMM英会話でレッスンを予約すると、その直後に「レッスン予約」という件名で「レッスンの予約が完了しました」というメールが届くはずです。
それからカレンダーのイベントを作りますよ。

登録するカレンダーは、特定のカレンダーに決めてください。
私はGoogleカレンダーに「DMM英会話」というカレンダーを作りました。
そのカレンダーを右クリックして「設定と共有」を選択すると、カレンダーの設定画面になるので、
カレンダーの設定画面

下にスクロールして、「カレンダーの統合」の所にある「カレンダーID」をコピペします。
カレンダーの統合

これを、先ほどのコードの中の「'☆自分のカレンダーID☆'」と置き換えてくださいね。

そして、スクリプトを適当な名前で保存します。

承認

すると、権限の承認を求めるメッセージが出ます。
承認画面

「許可を確認」をクリックして、自分のアカウントを選びます。
すると、「このアプリは確認されていません」というエラーメッセージが出るんですけど…
このアプリは確認されていません

ここで、左側にある「詳細」というリンクをクリックします。
(右側の青いボタンを押さないように!)
「詳細」をクリックした後の画面

すると、下に「(プロジェクト名)(安全でないページ)に移動」というリンクがあるのでそれをクリックします。
アカウントに権限を許可するか確認されるので、「許可」します。

実行してみる

未読のレッスン予約メールを用意して、試しに動くか確認してみてください。
メニューバー
メニューバーの「再生」みたいな記号をクリックすると実行されます。
(もしくは、メニューから「実行」→「関数を実行」→「myFunction」)


うまく動きましたか?

「DMM英会話: Tony」というようなイベントが、指定したカレンダーに、指定どおりの日時にできていれば成功です。
予約の15分前にポップアップで通知するように設定されています。
(そこは自由にカスタマイズしてください)

自動でトリガーされるようにする

DMM英会話からメールが届いたときに起動されるようにしたいので、このプログラムのトリガーを登録します。
「編集」→ 「現在のプログラムのトリガー」を選択すると、トリガー画面になります。

右下の「トリガーを追加」をクリックすると、トリガー設定画面が表示されるので
トリガー設定画面

実行する関数: myFunction
イベントのソースを選択: 時間主導型
時間ベースのトリガーのタイプを選択: 分ベースのタイマー
時間の間隔を選択: 1分(好きな時間に設定してください)


これで完成です!
予約したらカレンダーに登録されるはずですが、どうでしょうか…?

ちなみに

iPhoneの人は、iOSGoogleカレンダーを連携させると幸せになれます!
support.google.com
ポップアップ通知も来ますよ。

Finderでファイルを選択してMacWinZipperに自動で渡す

書きたいことができたので久しぶりに更新します。
 

もう完全にMacがメインマシンになっています。翻訳関係のツールはWindowsでしか動かないものが多いので、そういうときはMacに入れたWindows仮想マシンを使っています。仮想化ソフトはParallels Desktop for Macがおすすめです!

Macで翻訳環境を作る(ソフトウェア編)を書いてませんが、また気が向いたらいつか書くかも…


取引先とファイルのやり取りをするときは基本的にzipファイルにして送るんですが、取引先の人は基本的にWindowsマシンを使っているので、Mac環境から送るとなると注意しなければなりません。

普通にMacでzipを作って送ると、相手先のWindowsマシンで解凍したときに「.DS_Store」「__MACOSX」というファイルが入ってしまいます。
f:id:clapon:20200530211129p:plain

これを回避するにはいろんな方法があるのですが、私はMacWinZipperという便利なアプリを利用しています。

tida.co.jp
 
日本語ファイルは文字化けするという口コミを見ますが、私は有料版を使っているのでまったく文字化けしませんよ! 

使い方は、ウィンドウにファイルをドラッグ&ドロップするだけです。簡単!
f:id:clapon:20200530211903p:plain
簡単なんですが、いちいちドラッグ&ドロップするのが面倒で、なんとかショートカットキーを一発押すだけでちゃちゃっと圧縮できないかな?と思っていました。

 
そんなわけで、自動化するサービスをAutomatorで作りました。

したいこと

  • Finderでファイルを選択して右クリックすると「圧縮」メニューが出てくるようにする
  • ドラッグ&ドロップせずにMacWinZipperにファイルを自動的に渡す
  • Finderからショートカットキーで呼び出せると楽ちん〜

作り方

「ファイル」→「新規」で 「クイックアクション」を選択します。
細かい作り方はこちらのサイトが詳しいです〜(私は面倒くさいので割愛させていただきます💦)
dev.classmethod.jp
クイックアクションにすると、そのワークフローをコンテキストメニューから呼び出せるようになります。

ワークフロー

あまりしっかり作る余裕がなかったので、必要最小限の機能で…。もっとエレガントな方法があると思うのですが力業です💦

全体はこんな感じ。
f:id:clapon:20200530215858p:plain

具体的な内容

まず、ワークフローが受け取る情報を「ファイルまたはフォルダ」、検索対象を「Finder.app」にします。
f:id:clapon:20200530213328p:plain


その下に、「選択されたFinder項目を取得」のアクションを置きます。


そして、続けて「AppleScriptを実行」アクションを置きます。


f:id:clapon:20200530213542p:plain


コードは力業で。

on run {input, parameters}

	delay 2
	tell application "MacWinZipper"
		open input
		activate
	end tell
	
end run

呼び出してファイルを渡しているだけです💦

完成!

これで完成です〜!

コンテキストメニューに出てきます。
f:id:clapon:20200530220950p:plain:h360

ファイルを選択して右クリックするとMacWinZipperが自動で立ち上がって、確認画面になります。
暗号化パスワードを入れたり、設定したりして、Enterキーを押せばもう圧縮されます〜。

そしてもう一工夫

これだけでも便利なんですが、やっぱりいちいち右クリックするのが面倒なので、ショートカットキーで呼び出せるようにしたいと思います。
「システム環境設定」→「キーボード」を選びます。
f:id:clapon:20200530221338p:plain

「ショートカット」を選んで、左で「サービス」を選び、「ファイルとフォルダ」が表示されるまでスクロールすると、先ほど登録したサービスが表示されているはずです。
f:id:clapon:20200530221652p:plain
これに適当なショートカットをつけましょう!

そうすると、Finderでファイルを選択してこのショートカットを押すと、自動的にMacWinZipperが起動します。
とっても時短になって便利〜!


この技は他のアプリにも使えると思うので、なにかの参考になれば幸いです。

MacでIT翻訳環境をつくる(ハードウェア編)

メインマシンにWindows 10を入れて使っていたのですが、これがどうにもこうにも重たくて…メモリを32GBも積んでるのに! しょっちゅうフリーズするしイライラ。それでも仕事でWindowsが必要なので我慢して使っていました。

しかし、Windows Updateのタイミングで盛大にフリーズして完全にぶち切れた私は、サブマシンとして持っていたMacbookに本格的に作業環境を移すことにしました。

その結果…自由が訪れた〜ヽ(^0^)ノ

Macbookのメモリは8GBしかないのにSSDが早いからかとっても快適です。

 

そんなわけで、MacでIT翻訳の環境を作る方法をぼちぼちとまとめていこうかと思います。

 

必要なもの

仕事ではどうしてもWindowsが必要なので仕方なく…

 

Macbookでもキーボードとトラックパッドはあったほうがいい

Macbook 1台でもそれなりに仕事ができるのですが、やはり画面が小さい。なので今あるモニタにつないで環境を作りました。そのためには、別にキーボードとトラックパッド(またはマウス)を用意したほうがいいです。作業効率が大きく変わります。

キーボードはテンキー付きのものがおすすめです(CATツールによってはテンキーにショートカットが振られているものがあるので…)。

 

デュアルモニタ以上にする

モニタの台数は多いほど作業効率が上がります! 私はWindowsでもトリプルモニタにしていたので、Macでもトリプルモニタにするべく環境を整えました。

私が持っているMacbook(Mid 2014)にはHDMIポートが1つ、Thunderbolt 2ポートが2つ、USB 3ポートが2つ付いています。Macには2台のモニタを接続できます。そこで、HDMIポートとThunderboltポートにそれぞれモニタをつなぐことにしました。

そのために、

  • HDMIケーブル
  • Thunderbolt - DVI-D 変換アダプタ

を買いました。これで、外付けモニタ2台とMacbook自体のモニタ(小さい…)でトリプルモニタです。

USB−CポートのみのMacの場合は、それぞれ合うUSB-Cアダプタを買ってくださいね。できるだけポート数が多いMacがおすすめです。

 

有線LANアダプタ

無線LANでもつながるのですが、最近は作業ファイルがネット上にある案件も増えてきたので、やっぱり速度は早い方がいい!

そこで、Thunderbolt - ギガビットEthernetアダプタを購入しました。Thunderboltポートに差し込んでLANケーブルをつないで完了。早い!

 

ハードウェア面はこんなところかと思います。仮想マシン編はそのうちあらためて書きます。

決まったフォルダーをPowershellスクリプトで自動作成する

取引先から作業ファイルをもらって自分のローカルPCに保存するとき、フォルダー構成を決まったものにしておくと悩む時間が少なくなり、作業効率がアップします。

私の場合は、こんな感じでdeliveryとprojectという名前のフォルダーを作ることにしています。deliveryは納品ファイルを入れるフォルダー、projectはCATツールのプロジェクトを格納するフォルダーです。

f:id:clapon:20161004205058p:plain

たいした作業でもないので、いままで手作業で作っていましたが、自動化した方が簡単なので、Powershellスクリプトで自動化し、エクスプローラーの右クリックで表示されるコンテキストメニューからこのスクリプトを呼び出させるようにしてみました。

対象OSはWindowsです。私の環境はWindows 10ですが、それ以前のバージョンでもほぼ同様に動作すると思います。

 

作業手順
  1. レジストリエディタを使ってコンテキストメニューに組み込む
  2. Powershellスクリプトを書く

順を追ってわかるように、この順番で作業します。

レジストリエディタを使ってコンテキストメニューに組み込む

レジストリエディタ(regedit.exe)を立ち上げ、HKEY_CLASSES_ROOT\Folderを検索します。

shellキーの下に、新規キーを作成します。キーの名前は任意です。ここではdelivery&projectとします。

(既定)を選択して、右クリックのコンテキストメニューから「修正」を選択し、文字列を編集します。この内容がコンテキストメニューに表示されます。ここでは「deliveryフォルダとprojectフォルダの作成」とします。好きな名前にしてください。

f:id:clapon:20161004211026p:plain

 

delivery&projectキーの下に、新規キーcommandをさらに作成します。

f:id:clapon:20161004211456p:plain

このキーの(既定)の文字列を、次のように編集します。

powershell.exe  -Command "C:\Users\ユーザー名\Documents\tool\powershell\delivery_and_project.ps1 '%L'"

これは、Powershellスクリプトファイルを呼び出すコマンドです。
呼び出すスクリプトファイルはこのあと作成しますが、そのファイルのフルパスを記入しておいてください。'%L'の部分は、選択したフォルダーをスクリプトの引数として渡すという意味です。

Powershellスクリプトを書く

先ほどレジストリエディタに登録したスクリプトファイルを作成します。

テキストエディタなどを使って、拡張子.ps1スクリプトファイルを先ほど指定したパスに新規作成します。ここでは、「C:\Users\ユーザー名\Documents\tool\powershell\」というフォルダーにdelivery_and_project.ps1というスクリプトファイルを作成することにします。

スクリプトファイルをテキストエディタで開き、次のように記述します。

cd $Args[0]

mkdir delivery
mkdir project

コンテキストメニューから渡されたフォルダーに移動し、そこにdeliveryとprojectというフォルダーを作るスクリプトです。

cdはフォルダーの移動、mkdirはフォルダーを作成するコマンドです。

 

エクスプローラーで作業ファイルのフォルダーを右クリックすると、先ほど登録した項目が表示されています。これをクリックすると、Powershellスクリプトが実行され、自動的にフォルダーが作成されます。

f:id:clapon:20161004212624p:plain

 他にもいろいろ応用できるので、ぜひお試しください~。 

 

ScanSnap Managerのショートカットキーのかぶりを解消する

Trados Studioを使って翻訳をすることが多いのですが、案件によってはNon-breaking Space(改行しないスペース)を入れる必要があり、そんなときはショートカットキー(Ctrl+Shift+Space)で入力しています。

でも、ScanSnap Managerが起動してきて、いつもムキー!
ちょうどキーがかぶってるんですよね。

いつもはScanSnap Managerを終了させておいてから、Tradosで作業していましたが、いちいちScanSnap Managerを起動させたり終了させたりするのも面倒。なんとかならないか…と調べたら、ありました!

 

blog.nakajix.jp

 

cfgファイルにキーを書き込めば回避できるんですね~。力業ですが、解決できたのでよかった!

まとめてくださって感謝~!

Where is the shopping street?

うちから最寄り駅の入り口までは1ブロックしか離れていないのですが、駅に向かっていたところ "Where is the shopping street?" と尋ねられました。

えっ、こんな教科書みたいなシチュエーションが現実に起こるとは…!

 

説明しようと思ったんですが、口から英語が全然出てこない。もともとろくに話せないうえに最近は話す練習をほとんどしていないのでまったくダメでした。こんなことではいかん…。

辞書や文法書を片手にじっくりと考える癖がついているみたいです。瞬発力を上げると生産性も向上しそうなのでやはり本気で取り組まねば。でも翻訳と使う筋肉が違うんですよね~。

私はただでさえ道でよく話しかけられるタイプですし、さらにうちの近所には外国の方が多くいらっしゃるので今後も尋ねられる可能性はゼロではありません。それに話せないなんてやっぱり格好がつかないじゃないですか。先は長い…。

iPhone 5Sでアプリ切り替え時に白いもやが発生

iPhone 5Sでアプリを切り替えたりロック画面から戻るときに、左上に白いもやが出るようになってしまいました。あまりに一瞬のことなのでスクリーンショットを撮れないのですが…。Appleディスカッションサイトで同じように悩んでいる方がいました。

iOS 7 iPhone 5 white blotch on top left...: Apple Support Communities

そうそう、こんな風になるんですよ。

なんと原因は「ホーム画面の2段目の2列目にGoogle Mapがあること」ですって!まさにそこに置いてる-!

f:id:clapon:20140324225240p:plain

というわけで別の場所に移動してみたらあっさりと解決しました。なんとも不可解なバグ(?)です。