",tipClass:"tooltip"},addEffect:function(t,o,n){e[t]=[o,n]}};var e={toggle:[function(t){var e=this.getConf(),o=this.getTip(),n=e.opacity;n<1&&o.css({opacity:n}),o.show(),t.call()},function(t){this.getTip().hide(),t.call()}],fade:[function(t){var e=this.getConf();this.getTip().fadeTo(e.fadeInSpeed,e.opacity,t)},function(t){var e=this.getConf();this.getTip().fadeOut(e.fadeOutSpeed,t)}]};function o(e,o,n){var i=n.relative?e.position().top:e.offset().top,s=n.relative?e.position().left:e.offset().left,r=n.position[0];i-=o.outerHeight()-n.offset[0],s+=e.outerWidth()+n.offset[1],/iPad/i.test(navigator.userAgent)&&(i-=t(window).scrollTop());var a=o.outerHeight()+e.outerHeight();"center"===r&&(i+=a/2),"bottom"===r&&(i+=a),r=n.position[1];var l=o.outerWidth()+e.outerWidth();return"center"===r&&(s-=l/2),"left"===r&&(s-=l),{top:i,left:s}}function n(n,i){var s,r,a=this,l=n.add(a),c=0,f=0,u=n.attr("title"),d=n.attr("data-tooltip"),h=e[i.effect],p=n.is(":input"),g=p&&n.is(":checkbox, :radio, select, :button, :submit"),v=n.attr("type"),w=i.events[v]||i.events[p?g?"widget":"input":"def"];if(!h)throw'Nonexistent effect "'+i.effect+'"';if(2!=(w=w.split(/,\s*/)).length)throw"Tooltip: bad events configuration for "+v;n.on(w[0],(function(t){clearTimeout(c),i.predelay?f=setTimeout((function(){a.show(t)}),i.predelay):a.show(t)})).on(w[1],(function(t){clearTimeout(f),i.delay?c=setTimeout((function(){a.hide(t)}),i.delay):a.hide(t)})),u&&i.cancelDefault&&(n.removeAttr("title"),n.data("title",u)),t.extend(a,{show:function(e){if(!s&&(d?s=t(d):i.tip?s=t(i.tip).eq(0):u?s=t(i.layout).addClass(i.tipClass).appendTo(document.body).hide().append(u):(s=n.next()).length||(s=n.parent().next()),!s.length))throw"Cannot find tooltip for "+n;if(a.isShown())return a;s.stop(!0,!0);var p=o(n,s,i);if(i.tip&&s.html(n.data("title")),(e=t.Event()).type="onBeforeShow",l.trigger(e,[p]),e.isDefaultPrevented())return a;p=o(n,s,i),s.css({position:"absolute",top:p.top,left:p.left}),r=!0,h[0].call(a,(function(){e.type="onShow",r="full",l.trigger(e)}));var g=i.events.tooltip.split(/,\s*/);return s.data("__set")||(s.off(g[0]).on(g[0],(function(){clearTimeout(c),clearTimeout(f)})),g[1]&&!n.is("input:not(:checkbox, :radio), textarea")&&s.off(g[1]).on(g[1],(function(t){t.relatedTarget!=n[0]&&n.trigger(w[1].split(" ")[0])})),i.tip||s.data("__set",!0)),a},hide:function(o){return s&&a.isShown()?((o=t.Event()).type="onBeforeHide",l.trigger(o),o.isDefaultPrevented()?void 0:(r=!1,e[i.effect][1].call(a,(function(){o.type="onHide",l.trigger(o)})),a)):a},isShown:function(t){return t?"full"===r:r},getConf:function(){return i},getTip:function(){return s},getTrigger:function(){return n}}),t.each("onHide,onBeforeShow,onShow,onBeforeHide".split(","),(function(e,o){"function"==typeof i[o]&&t(a).on(o,i[o]),a[o]=function(e){return e&&t(a).on(o,e),a}}))}t.fn.tooltip=function(e){var o=this.data("tooltip");return o||("string"==typeof(e=t.extend(!0,{},t.tools.tooltip.conf,e)).position&&(e.position=e.position.split(/,?\s/)),this.each((function(){o=new n(t(this),e),t(this).data("tooltip",o)})),e.api?o:this)}}(jQuery),function(t){var e=t.tools.tooltip;e.dynamic={conf:{classNames:"top right bottom left"}},t.fn.dynamic=function(o){"number"==typeof o&&(o={speed:o}),o=t.extend({},e.dynamic.conf,o);var n,i=t.extend(!0,{},o),s=o.classNames.split(/\s/);return this.each((function(){var e=t(this).tooltip().onBeforeShow((function(e,o){var r=this.getTip(),a=this.getConf();n||(n=[a.position[0],a.position[1],a.offset[0],a.offset[1],t.extend({},a)]),t.extend(a,n[4]),a.position=[n[0],n[1]],a.offset=[n[2],n[3]],r.css({visibility:"hidden",position:"absolute",top:o.top,left:o.left}).show();var l=t.extend(!0,{},i),c=function(e){var o=t(window),n=o.width()+o.scrollLeft(),i=o.height()+o.scrollTop();return[e.offset().top<=o.scrollTop(),n<=e.offset().left+e.width(),i<=e.offset().top+e.height(),o.scrollLeft()>=e.offset().left]}(r);(function(t){for(var e=t.length;e--;)if(t[e])return!1;return!0})(c)||(c[2]&&(t.extend(a,l.top),a.position[0]="top",r.addClass(s[0])),c[3]&&(t.extend(a,l.right),a.position[1]="right",r.addClass(s[1])),c[0]&&(t.extend(a,l.bottom),a.position[0]="bottom",r.addClass(s[2])),c[1]&&(t.extend(a,l.left),a.position[1]="left",r.addClass(s[3])),(c[0]||c[2])&&(a.offset[0]*=-1),(c[1]||c[3])&&(a.offset[1]*=-1)),r.css({visibility:"visible"}).hide()}));e.onBeforeShow((function(){var t=this.getConf();this.getTip();setTimeout((function(){t.position=[n[0],n[1]],t.offset=[n[2],n[3]]}),0)})),e.onHide((function(){this.getTip().removeClass(o.classNames)})),ret=e})),o.api?ret:this}}(jQuery),function(t){var e=t.tools.tooltip;t.extend(e.conf,{direction:"up",bounce:!1,slideOffset:10,slideInSpeed:200,slideOutSpeed:200,slideFade:!0});var o={up:["-","top"],down:["+","top"],left:["-","left"],right:["+","left"]};e.addEffect("slide",(function(t){var e=this.getConf(),n=this.getTip(),i=e.slideFade?{opacity:e.opacity}:{},s=o[e.direction]||o.up;i[s[1]]=s[0]+"="+e.slideOffset,e.slideFade&&n.css({opacity:0}),n.show().animate(i,e.slideInSpeed,t)}),(function(e){var n=this.getConf(),i=n.slideOffset,s=n.slideFade?{opacity:0}:{},r=o[n.direction]||o.up,a=""+r[0];n.bounce&&(a="+"===a?"-":"+"),s[r[1]]=a+"="+i,this.getTip().animate(s,n.slideOutSpeed,(function(){t(this).hide(),e.call()}))}))}(jQuery)
Google日本語入力のユーザー辞書を複数のPCで同期する方法
2019.09.082021.04.17
みなさん,こんにちは。
シンノユウキ(shinno1993 )です。
仕事とプライベートで同じPCを利用する 。これは,私がぜひ実現したいライフ・プロジェクトの1つです。しかし,それを実現するのはまだまだ難しそうです。現状,職場専用PCと自宅専用PCを使い分ける必要があります。
仕事利用と自宅利用のPCを同じする利点はたくさんあり,その内の1つが日本語インプットメソッドのユーザー辞書の統一 です。職場でも自宅でも同じユーザー辞書を使えるとスゴく便利です。仕事専用の単語もあるでしょうが,共通する単語も多くあるかと思いますので,分けるよりも統一した方が良いと考えるのは当然です。
今回は,Google日本語入力のユーザー辞書を複数のPCで同期する方法を紹介します。
※私が以前使用していたATOKにはこのような機能があったのですが,Google日本語入力にはそのような機能がありません(ただしデベロッパー版でテストはされている)。
Google日本語入力のユーザー辞書を複数PCで同期するためには,以下で示すように,PCを起動時にクラウドストレージからユーザー辞書をアップデート → シャットダウン時にユーザー辞書をクラウドストレージにバックアップすると良いでしょう:
PC起動時
辞書データをクラウドストレージからアップデート
予めクラウドストレージにバックアップしておいたデータを,使っているPCの辞書データにアップデートします。これは,PCを起動する度に行います。
PCシャットダウン前
辞書データをクラウドストレージにバックアップ
作業を終了し,PCをシャットダウンする前に,辞書データをクラウドストレージにバックアップします。これにより,PCを起動していた間に辞書登録したデータがバックアップされ,次回別のPCで起動する際にアップデートされます。
今回は上記を自動的に行えるようにするスクリプトを紹介し,タスクスケジューラを用いて自動化する方法を紹介します。ではいきましょう!
STEP①クラウドストレージを設定する
まずは,クラウドストレージを設定します。 GoogleドライブやDropBoxなど,ローカルPC上のファイルを自動的に同期してくれるクラウドストレージを選択しましょう。今回は,Googleドライブ(バックアップと同期)を利用していきます。
Googleドライブの場合,以下のリンクからダウンロードできます:
Google ドライブ: セキュアなクラウド ストレージを使ってオンラインでファイルを共有 | Google Workspace
Google ドライブのファイル共有プラットフォームについてご紹介します。個人向けの安全なクラウド ストレージとして利用し、コンテンツを他のユーザーと共有できます。
ダウンロード後,GoogleドライブのファイルをローカルPCに同期するように設定しましょう:
すると,以下のようにGoogleドライブのフォルダがローカルPCに作成されます。このドライブ内にGoogle日本語入力の辞書データをバックアップしていきます。
STEP②ユーザー辞書をバックアップ・アップデートするスクリプト
次に,以下の2つを行うスクリプトを紹介します:
バックアップされたユーザー辞書をローカルPCのGoogle日本語入力のユーザー辞書にアップデートする ローカルPCにあるGoogle日本語入力のユーザー辞書をクラウドストレージにバックアップする
ここでキモになるのが「ユーザー辞書の情報が含まれたファイル」 です。これをバックアップしたりアップデートしたりします。このファイルは,Google日本語入力のプログラム内に含まれます。おそらく,以下の場所にあるかと思います:
ユーザー辞書の情報が含まれたファイルの場所
C:\Users{ユーザー名}\AppData\LocalLow\Google\Google Japanese Input\user_dictionary.db
この「user_dictionary.db」 にユーザー辞書の情報が含まれると考えられます。これを操作していきます。
まずは,このファイルをアップデートします。コードは以下のようになります:
@rem update_dic.bat
set filepathFrom="{Googleドライブのパス}\user_dictionary.db"
set filepathTo="C:\Users\{ユーザー名}\AppData\LocalLow\Google\Google Japanese Input\user_dictionary.db"
copy /Y %filepathFrom%,%filepathTo%
"C:\Program Files (x86)\Google\Google Japanese Input\GoogleIMEJaTool.exe" --mode=dictionary_tool
パス等は適宜変更してください。上記を実行することで,クラウドストレージから最新のユーザー辞書にアップデートできます。最終行のコードはユーザー辞書を開くもので,これにより変更が反映されます:
次に,ローカルPCのGoogle日本語入力のユーザー辞書をクラウドストレージにバックアップするスクリプトを紹介します。先ほどのコードと似ており,コピー元とコピー先が入れ替わり,ユーザー辞書を開く工程を排除,そして最後にPCをシャットダウンする工程 を加えています:
@rem backup_dic.bat
set filepathFrom="C:\Users\{ユーザー名}\AppData\LocalLow\Google\Google Japanese Input\user_dictionary.db"
set filepathTo="{Googleドライブのパス}\user_dictionary.db"
copy /Y %filepathFrom%,%filepathTo%
shutdown.exe /s /t 0
上記のコードを実行することでユーザー辞書の更新を行った場合にその差分をバックアップできます。
これらのスクリプトは,メモ帳等にコピペし拡張子を「.bat」としてわかりやすいファイル名で保存しておいてください。次のステップで,それらのスクリプトを自動で実行できるように設定します。
STEP③タスクスケジューラを設定する
ユーザー辞書をバックアップするスクリプトは,シャットダウンの前に実行します。ただし,Windowsではシャットダウン前にスクリプトを実行するようにスケジュールすることはできません。そのため,上記で紹介したコードのように「バックアップした後にシャットダウンする」ようにしました。
ただし,PC起動時に実行する,ユーザー辞書をアップデートするスクリプトは「タスクスケジューラ」を利用することで自動で実行することが可能です。以下でタスクスケジューラの設定方法を紹介します。
まずは,タスクスケジューラを起動します。Windows + R で「ファイル名を指名して実行」 を開き,「taskschd.msc」 を入力してください:
すると,以下のようなタスクスケジューラが開きます。右側から「タスクの作成」 をクリックしてください。「基本タスクの作成」ではありません。「タスクの作成」です。
まずはタスクの基本的な設定を行います。
名前欄には,タスクを識別しやすいようにわかりやすい名前をつけてください 下部にある「最上位の特権で実行する」にチェックを入れてください。基本的には不要なのですが,念の為のお守りと捉えてください 右下の「OK」をクリックしてください
次にタスクのトリガーを設定します。トリガーというのはタスクが実行される条件のことを指します。辞書のアップデートがPC起動時に実行されるようにトリガーに設定しましょう。
「タスクの開始」を「スタートアップ時」に設定してください 「遅延時間を指定する」にチェックを入れ,遅延時間を「30秒間」に設定してください。ここで,遅延を30秒間に設定したのは,クラウドストレージの同期の時間を考慮したためです。たとえばGoogleドライブの場合,PC起動時にクラウドストレージとローカルとが同期されます。同期前に辞書を更新しても意味がないので,その時間を待っているというわけなのです
次はタスクで実行するプログラムを指定します:
「操作」では「プログラムの開始」を選択してください 「プログラム/スクリプト」には先に紹介した辞書をアップデートするプログラムの含まれたファイルのパスを指定してください 下部の「OK」をクリックしてください
最後にタスクに関する追加設定を行います:
初期設定では「タスクを停止するまでの時間」にチェックが入っていますので,そのチェックを外してください 右下の「OK」をクリックしてください
これで,完了です!
まとめ
今回は,Google日本語入力のユーザー辞書を複数PCで同期するための方法を紹介しました。「user_dictionary.db」にユーザー辞書の情報が含まれていることがわかれば,あとは各々好きなようにすれば良いと思います。まぁ,本音を言えば,1台のPCを職場でも自宅でも使いたいのですが,そのために乗り越えなければならないハードルは,まだまだたくさん存在しているのです…。
"),i=e.children()[0];return x("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),n=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.width
W(C(n),C(o))?s.important="horizontal":s.important="vertical",f.using.call(this,t,s)}),r.offset(x.extend(h,{using:t}))})},x.ui.position={fit:{left:function(t,e){var i=e.within,n=i.isWindow?i.scrollLeft:i.offset.left,o=i.width,s=t.left-e.collisionPosition.marginLeft,r=n-s,l=s+e.collisionWidth-o-n;e.collisionWidth>o?0o?0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=x(e||this.defaultElement||this)[0],this.element=x(e),this.uuid=c++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=x(),this.hoverable=x(),this.focusable=x(),this.classesElementLookup={},e!==this&&(x.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=x(e.style?e.ownerDocument:e.document||e),this.window=x(this.document[0].defaultView||this.document[0].parentWindow)),this.options=x.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:x.noop,_create:x.noop,_init:x.noop,destroy:function(){var i=this;this._destroy(),x.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:x.noop,widget:function(){return this.element},option:function(t,e){var i,n,o,s=t;if(0===arguments.length)return x.widget.extend({},this.options);if("string"==typeof t)if(s={},t=(i=t.split(".")).shift(),i.length){for(n=s[t]=x.widget.extend({},this.options[t]),o=0;o
タイトルとURLをコピーしました