iTerm2でvimを使うとマウスでコピペできなくなった

記憶は定かではないがある時を境にでビジュアルモードで選択されるようになった。 最初に何か設定したかもしれないけど思い出せないのでぐぐったら解決した。

d.hatena.ne.jp

ここに書いてあるとおりですが、設定項目は微妙に変わっていて、

  • iTerm2 > Preferences > Profiles > Terminal > Terminal Emulation
    • Enable mouse reporting のチェックを外す

でした。

ubuntuでntpdateを使って時刻合わせをする

会社では、例によってProxyがあるので社内のNTPサーバに同期させる。

/etc/default/ntpdateというファイルがあったので、NTPSERVERSに社内のサーバを記述してntpdateコマンドを叩いてみる

# ntpdate
 4 Jan 11:40:08 ntpdate[23795]: no servers can be used, exiting

うまくいかない・・・

調べたらどうやら/usr/sbin/ntpdate-debianというラッパーコマンドがあるらしい。
ただしこれを使うときは、NTPDATE_USE_NTP_CONF=noにしないと設定したサーバリストが使われない。

# The settings in this file are used by the program ntpdate-debian, but not
# by the upstream program ntpdate.

# Set to "yes" to take the server list from /etc/ntp.conf, from package ntp,
# so you only have to keep it in one place.
#NTPDATE_USE_NTP_CONF=yes
NTPDATE_USE_NTP_CONF=no

# List of NTP servers to use  (Separate multiple servers with spaces.)
# Not used if NTPDATE_USE_NTP_CONF is yes.
#NTPSERVERS="ntp.ubuntu.com"
NTPSERVERS="10.x.x.x"

# Additional options to pass to ntpdate
NTPOPTIONS=""

これで上手くいきました。

# ntpdate-debian
 4 Jan 11:44:30 ntpdate[23814]: step time server 10.x.x.x offset 253.208283 sec

このntpdate-debianは起動時に実行されるらしいので気になる場合はcronで定期実行させてもいいかも。

JIRAの担当者で出て来る一覧をフィルタする

JIRAでLDAP連携をしていると担当者選択でLDAPの全ユーザが出てきてとってもうざい。 ぐぐったらフィルタを掛けることが出来たのでメモしておく。

www.ricksoft.jp

設定

  1. JIRA管理 > 課題 > パーミッションスキーム
  2. 変更したいパーミッションの「権限」を押す
  3. 割当可能なユーザを編集
    • アプリケーションロール(ログイン済みのユーザ全員)が設定されていれば削除する
    • 例えばjira-software-usersだけにするのであれば、グループ(jira-software-users)を選択して許可

これでおっけー。

ちなみにカスタムフィールドの場合はユーザピッカーのカスタムフィールドを作った後で構成から入るとフィルタを設定できました。

パフォーマンス カウンターのDisk Reads/sec, Disk Writes/secの単位ってなんだ?

Windowsのパフォーマンスカウンターをよく使うのですが、説明をしようと思うと意外と曖昧に理解していたり調べてもすぐ忘れてしまうのでメモしておく。

パフォーマンスカウンターを仕掛けるときに定番のものがいくつかあるのですが、ディスクについては\PhysicalDisk(*)\Disk Reads/sec\PhysicalDisk(*)\Disk Writes/secを取って説明資料を作ることがあります。
このカウンターの説明にはそれぞれ、

ディスク上の読み取り操作の速度です。
ディスク上の書き込操作の速度です。

と書いてあるのですが、説明が少なすぎてなんのことだかよく分かりません。
速度の単位は何?と思ってググってもよく分からないです。
Disk Read Bytes/secなら

読み取り操作中にディスクからバイトが転送される速度です。

とあって、まあ分からないでもないです。(若干日本語に違和感を感じますが・・・)

で、結局何なんだというとIOPS(IO Per Second)だということで自分の中で納得しました。
Disk Reads/secなら病患のI/O処理回数ってことになり、数値が高いほど性能が高い(頑張っていっぱい読んでる)ということになりますね。

Spark Frameworkでstop()を呼ぶとInterruptedExceptionが発生して固まる

状況

Spark FrameworkというSinatraっぽい軽量サーバを使ってGroovyでWebAPIのサーバを書いてます。

sparkjava.com

サーバを停止する処理を呼ぶと停止処理中に固まってしまうという現象が起きてました。

実装

サーバを停止する方法は公式ドキュメントにある通り簡単なものです。

Stopping the Server

By calling the stop() method the server is stopped and all routes are cleared.

stop();

以下のようにAPIとして呼べるようにしてあります。

get "/stop", { req, res -> stop() }

が、以下のようなエラーが出てしまいます。

[Thread-1] INFO org.eclipse.jetty.util.log - Logging initialized @975ms
[Thread-1] INFO spark.webserver.JettySparkServer - == Spark has ignited ...
[Thread-1] INFO spark.webserver.JettySparkServer - >> Listening on 0.0.0.0:8010
[Thread-1] INFO org.eclipse.jetty.server.Server - jetty-9.3.2.v20150730
[Thread-1] INFO org.eclipse.jetty.server.ServerConnector - Started ServerConnector@3ab422de{HTTP/1.1,[http/1.1]}{0.0.0.0:8010}
[Thread-1] INFO org.eclipse.jetty.server.Server - Started @1089ms
[qtp1972788076-17] INFO spark.webserver.MatcherFilter - The requested route [/] has not been mapped in Spark
[qtp1972788076-20] INFO spark.webserver.JettySparkServer - >>> Spark shutting down ...
[qtp1972788076-20] INFO org.eclipse.jetty.server.ServerConnector - Stopped ServerConnector@3ab422de{HTTP/1.1,[http/1.1]}{0.0.0.0:8010}
[qtp1972788076-20] ERROR spark.webserver.JettySparkServer - stop failed
java.lang.InterruptedException
        at java.lang.Object.wait(Native Method)
        at java.lang.Thread.join(Thread.java:1253)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.doStop(QueuedThreadPool.java:161)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:89)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.stop(ContainerLifeCycle.java:143)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStop(ContainerLifeCycle.java:161)
        at org.eclipse.jetty.server.handler.AbstractHandler.doStop(AbstractHandler.java:73)
        at org.eclipse.jetty.server.Server.doStop(Server.java:476)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:89)
        at spark.webserver.JettySparkServer.stop(JettySparkServer.java:148)
        at spark.SparkInstance.stop(SparkInstance.java:317)
        at spark.Spark.stop(Spark.java:987)
        at spark.Spark$stop$0.callStatic(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:56)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:194)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:198)
        at FooWebapiService$_main_closure5.doCall(fooWebapi.groovy:47)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
        at groovy.lang.Closure.call(Closure.java:426)
        at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:53)
        at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:105)
        at com.sun.proxy.$Proxy5.handle(Unknown Source)
        at spark.RouteImpl$1.handle(RouteImpl.java:58)
        at spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:162)
        at spark.webserver.JettyHandler.doHandle(JettyHandler.java:61)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
        at org.eclipse.jetty.server.Server.handle(Server.java:517)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:302)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:245)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
        at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
        at java.lang.Thread.run(Thread.java:745)

修正

調べるとGitHubにIssueがありました

github.com

どうやら停止するときは別スレッドにしておくと良いらしい。なるほどー。
さっそく修正してみる。

// 別ThreadにしないとInterruptedExceptionが発生してしまう
get "/stop", { req, res -> Thread.start {stop()} }

直ったー。(^_^)v

[Thread-1] INFO org.eclipse.jetty.util.log - Logging initialized @899ms
[Thread-1] INFO spark.webserver.JettySparkServer - == Spark has ignited ...
[Thread-1] INFO spark.webserver.JettySparkServer - >> Listening on 0.0.0.0:8010
[Thread-1] INFO org.eclipse.jetty.server.Server - jetty-9.3.2.v20150730
[Thread-1] INFO org.eclipse.jetty.server.ServerConnector - Started ServerConnector@6591cb3b{HTTP/1.1,[http/1.1]}{0.0.0.0:8010}
[Thread-1] INFO org.eclipse.jetty.server.Server - Started @1015ms
[Thread-11] INFO spark.webserver.JettySparkServer - >>> Spark shutting down ...
[Thread-11] INFO org.eclipse.jetty.server.ServerConnector - Stopped ServerConnector@6591cb3b{HTTP/1.1,[http/1.1]}{0.0.0.0:8010}
[Thread-11] INFO spark.webserver.JettySparkServer - done

Windowsでsedを使って環境変数を利用した置換をする

nginxの設定ファイルを起動時に環境変数の値を使って書き換えたい

nginxのerror_logとaccess_logを1箇所で管理しているログディレクトリのパスで書き換えたいけど手動ではやりたくないです。
nginxの引数で-g "error_log xxx;"とかできるけどaccess_logは出来ないのでテンプレートの設定ファイルを用意してsedで書き換えることにしました。

sed for Windows

gnuwin32.sourceforge.net

書き換え

  • ファイルパスの置換 nginxのerror_log等はパスの区切りをバックスラッシュではなくスラッシュ(/)で記述しますが、環境変数はバックスラッシュ(\)なので置換します。
    ※この時、\/に置換しておかないと後処理のsed/がエスケープされなくてエラーになってしまう!

sed的には以下のように書けばよいのですが、

> echo %LOG_HOME%
C:\logs
> echo %LOG_HOME% | sed "s/\\/\\\//g"
C:/logs

バッチファイルの中で使うには変数に代入とか簡単にできないので以下のようにします。

> FOR /F "usebackq" %x IN (`echo %LOG_HOME% ^| sed -e "s/\\/\\\//g"`) DO SET LOG_HOME_NGINX=%x
> echo %LOG_HOME_NGINX
C:/logs

最終的にバッチファイルに記述するときは%x%%xに書き換えてください。

sedの中でパイプを使いたい時にハット(^|)が付いていますがこれがないと以下のようなエラーになります。

| の使い方が誤っています。

わからんて・・・。
ちなみにsedへのパスが通ってない時にも同じエラーになりました。(ますますわからん・・・

  • sedの中で環境変数を展開する sedで、テンプレートに書いてある環境変数のようなキーワードを環境変数で置換するには以下のようにします。
    テンプレートには、error_log %LOG_HOME%/nginx/error.logと定義してあります。
> sed "s/\%%LOG_HOME\%%/%LOG_HOME_NGINX%/" conf\nginx.conf

置換するキーワードはエスケープして、実際の環境変数はエスケープしません。
Windowsならではですが、%を使うために\%%としている所に注意。sed的には\でエスケープだがWindows的には%%と市内と行けないのでダブルで指定している。

  • テンプレートをコピーしてsedで書き換える一連の流れは以下のようになります。
set APP_HOME=%~dp0
copy /Y %APP_HOME%conf\nginx.template %APP_HOME%conf\nginx.conf
FOR /F "usebackq" %%x IN (`echo %LOG_HOME% ^| sed "s/\\/\//"`) DO SET LOG_HOME_NGINX=%%x
sed -i -e "s/\%LOG_HOME\%/%LOG_HOME_NGINX%/" %APP_HOME%conf\nginx.conf
%APP_HOME%nginx.exe -p %APP_HOME% -c %APP_HOME%conf\nginx.conf

Linuxbash使ってとかだと簡単なことが結構つまづいたので記録に残しておきます。

AsciiDocで文字色を変えたがasciidoctor-pdfで作成したPDFに反映しない

AsciiDocで文字色を変える

HTMLへ変換する場合、文字に色つけるときは[red]#あああ#みたいにすると出来ます。 ところが、asciidoctor-pdfでPDFを作ると期待通り色がつきません。

原因

asciidoctor-pdf でspanが来た時に色を付ける処理が[red]#text#が生成するspanと一致していないのが原因っぽいです。

この辺のソースでspanのstyleを読んでいるのでそういうことなんでしょう。

github.com

対応

現状のasciidoctor-pdfが期待する通りのspanを作ってやれば取り敢えず色変わりました。

pass:[<span style="color:#ff0000">あああ</span>]

まー、修正してプルリクだす元気もないので取り敢えず今回はこれで回避。