読者です 読者をやめる 読者になる 読者になる

gitlab と backlog の git リポジトリミラーリング (gitlab → backlog)

gitlab と backlog の git リポジトリミラーリング

社内のネットワークやいろいろなアレがあって
社内の gitlab から直接 CI サーバーへ接続できないけど、
gitlab も CI も backlog へはアクセスできる時などに……。

  • GitLab Community Edition 8.12.7

github へのミラーリング方法を記載されておられる下記ページを参考にしています。

backlog 側での準備

管理画面から git リポジトリを作成しておく。
git の URL を控えておく。

gitlab 側での準備

ssh 鍵作成

backlog 側 git リポジトリへは鍵認証で接続するので、
gitlab サーバーの git ユーザーで
鍵を作成しておく。

ssh-keygen -t rsa -b 4096

→ 公開鍵の内容は backlog で登録しておくこと

git インストール

gitlab サーバーで git ユーザが
git push するので git のインストールをおこなっておく。

su - git
sudo yum install git

git remote に backlog を追加する

最近の gitlab はリポジトリの置き場所が
/mnt/data/git-data/repositories/所有者名/リポジトリ名.git へ変わっているので
下記場所で作業します。

cd /mnt/data/git-data/repositories/所有者名/リポジトリ名.git

backlog の git リポジトリを remote add しておきます。

git remote add backlog 名前@名前.git.backlog.jp:/所有者名/リポジトリ名.git

現状の gitlab リポジトリの内容を backlog 側へ同期しておく

`–all` をつけて全ブランチを push

cd /mnt/data/git-data/repositories/所有者名/リポジトリ名.git
git push backlog --all

カスタムフックの準備

git 標準の hooks は gitlab が使っているので
gitlab で hook したい場合は custom_hooks ディレクトリを用意しろとのこと。

cd /mnt/data/git-data/repositories/所有者名/リポジトリ名.git
mkdir custom_hooks

カスタムフックスクリプト作成

ここはそのまま参考にさせてもらっています。

vim post-receive

ファイルの内容は

GIT_REMOTE="backlog"

while read OLDREV NEWREV REFNAME
do
BRANCH=`git rev-parse --symbolic --abbrev-ref "${REFNAME}"`

echo "Push '${BRANCH}' branch to remote '${GIT_REMOTE}'"
git push --tag ${GIT_REMOTE} ${BRANCH}
done

カスタムフックスクリプトに実行権限をつけておく

chmod +x post-receive

msys2 で emacs 25 をビルドして runemacs から起動しようとするけど起動しないのは dll 不足 (環境のせい)

msys2 をインストールした状態でmingw64 のバッチで起動、
手順にしたがって emacs-25 ブランチを git で取得してきてビルド完了。

runemacs.exe を Windows 側 (エクスプローラ) から起動すると起動成功するけれど、
msys2 の zsh から ./runemacs.exe とかすると
ウィンドウも開かずそっと落ちているみたい。
再起動するまでは起動してたのになぜだろう?

確認のために直接 emacs.exe を起動しようとすると
libwinpthread-1.dll が足りないとのこと。

NTEmacs64 に同梱されていた libwinpthread-1.dll を持ってきて
さきほどビルドした emacs の bin にコピーしてやると無事起動するように。

そういえば再起動前までは NTEmacs64 の bin 以下に PATH を通していたのでそのせいだった……。
いつかまたやりそうなので戒めとして記録📝

elscreen のタブを一定時間だけ表示

縦に画面分割して ediff とかすると
elscreen の タブの高さだけ
diff で違いのあった行の高さがずれます。

↓ 1 行分ズレている例
f:id:nishikawasasaki:20160131190550p:plain

diff 側や elscreen 側にも
ズレをなおす設定があるのかもしれないけれど、
タブバーが常に表示されている必要もないなということで
タブ切り替え直後だけ表示してその後消えるようにしてみた。

タイマーの使い方、もっと良い方法ありそう。

  (defun temp-display-tab ()
    ;; 一定時間タブを表示
    (setq elscreen-display-tab t)
    (run-at-time "1.5 sec" nil
                 #'(lambda ()
                     (setq elscreen-display-tab nil)
                     (elscreen-notify-screen-modification 'force))))

  (advice-add 'elscreen-next :after #'temp-display-tab)
  (advice-add 'elscreen-previous :after #'temp-display-tab)

2015 のお酒 (日本酒編)

日本酒

今年もかなり飲んだけど、
年々写真に残さなくなっていってる。
飲んでそのままなのももったいないので
来年は記録をつけたい、といまは思っています。
のんだら忘れそう。

ビール編・その他編も気が向いたら残しておきたい。

1 月

近所の焼鳥屋さんで櫻正宗

2 月

広島帰省中の雨後の月 3 種のみくらべ

これも帰省中

牡蠣と日本酒

またもや帰省中の

広島で買って帰った 1 本

土産の定番・幻

3 月

いろいろとドタバタしていて記録のない月。
飲んでないわけ無いのに……。

4 月

どこだろう……花見?

5 月

繁桝はおいしい

金冠黒松もおいしい

6 月

石川旅行への布石

まんさくの花もおいしい

馬肉と日本酒もおいしい

7 月

滋賀のお酒もおいしい

滋賀の

滋賀の

滋賀の

さっぱりと夏の燗酒も良い

8 月

イワシとお酒もおいしい

タンク違いで飲むのもおいしい

にごりと辛口もおいしい

燻製と日本酒もおいしい

山廃もおいしい

鯉雄町もおいしい

カップ酒もおいしい

9 月

日本酒の写真の無い月。 ビールの写真は多い月。

10 月

おでんとお酒もおいしい

赤いラベルでおいしい

11 月

3日連続灘五郷飲み比べもおいしい

すっきりもおいしい

名前もないようなどぶろくもおいしい

金沢の回転寿司で飲むのもおいしい

金沢おでんとお酒もおいしい

12 月

近所で買えた雁木もおいしい

力があっておいしい

東京で飲むお酒もおいしい

同期と忘年会で飲むお酒もおいしい

忘年会で飲み過ぎてもおいしい

☃もおいしい

まだ年末残りの日で飲みそうだ……

12 月の追加分

蜜のような甘さでおしまい?

また今晩増えそうな気も……

xmonad で狙った位置にフロートウィンドウを表示する

すごく簡単そうなのになかなかやり方が (日本語で) 見つからなかったので
備忘録的にメモ。

使うもの

XMonad.Util.NamedScratchpad
http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Util-NamedScratchpad.html

設定

まずはインポートになければ追加。

import XMonad.StackSet as W
import XMonad.ManageHook
import XMonad.Util.NamedScratchpad

今回は試しに Thunderbird のメッセージ作成ウィンドウを
画面の右端に高さは上下 (ほぼ) 最大、
幅は 70 文字程度を確保する設定です。

customFloating に表示位置や長さを渡してやるので

doXXXFloat = customFloating $ W.RationalRect (表示 X 位置) (表示 Y 位置) (幅) (高さ)

とつくっていくので、

myManageHook = composeAll
    [ className =? "Thunderbird" <&&> resource =? "Msgcompose" --> doRightFloat
    , resource  =? "kdesktop"       --> doIgnore ]
    where
      doRightFloat = customFloating $ W.RationalRect (4.5/6) (0.1/6) (1/4) (4.9/5)  -- 左上から x y 幅 高

のように

  • X
    ほぼ最大にして一番右へ。ウィンドウサイズ分加減。
  • Y
    一番上からでいいのでほぼ 0。 xmobar のサイズ分加減。

  • 70 文字程度がちょうど 1/4。
  • 高さ
    画面上から下まで最大で使いたいのでほぼ 1。xmobar サイズ分加減。

して使いました。

位置やサイズを変えてやれば
画面下に表示したり、中央に表示したりできますね。

clojure から hive へ接続する

jdbc を利用して hiveserver2 へ接続してみたメモ。
hive のバージョンと hive-jdbc のバージョンが問題に。。。

まず

ライブラリ類のバージョンをとりあえず新しい物を探してきて

[org.clojure/java.jdbc "0.4.2"]
[org.apache.hive/hive-jdbc "0.13.0"]
[org.apache.hadoop/hadoop-core "1.0.3"]

と指定して

(def hive-db {:subprotocol "hive2"
              :classname "org.apache.hive.jdbc.HiveDriver"
              :subname "//xxxxxxx:10000/xxx"
              :user "aaa"
              :password "bbb"})

と設定して接続すると、

java.sql.SQLException: Could not establish connection to jdbc:hive2://xxxxxxx:10000/xxx: Required field 'client_protocol' is unset!
Struct:TOpenSessionReq(client_protocol:null)

となって失敗。
hive のバージョンと hive-jdbc のバージョンが違うと起こるらしい。

[HIVE-6050] Newer versions of JDBC driver does not work with older HiveServer2 - ASF JIRA
https://issues.apache.org/jira/browse/HIVE-6050

hiveserver2 のバージョンを調べるため

ps -ef | grep HiveServer2

とプロセスから調べてみると、
使っている hive のバージョンは 0.10 なので
hive-jdbc 0.13.0 では動かず?

hive-jdbc 0.10.0 (失敗)

hive-jdbc のバージョンを hive と揃えてみた。

[org.clojure/java.jdbc "0.4.2"]
[org.apache.hive/hive-jdbc "0.10.0"]
[org.apache.hadoop/hadoop-core "1.0.3"]

これで実行すると今度は

Could not find artifact javax.jdo:jdo2-api:jar:2.3-ec in central (https://repo1.maven.org/maven2/)
Could not find artifact javax.jdo:jdo2-api:jar:2.3-ec in clojars (https://clojars.org/repo/)
Could not find artifact sqlline:sqlline:jar:1_0_2 in central (https://repo1.maven.org/maven2/)
Could not find artifact sqlline:sqlline:jar:1_0_2 in clojars (https://clojars.org/repo/)

と依存性が解決できず。。

解決できなかった jar は spring のリポジトリにあったので
ひとまず

:repositories {"spring" "http://repo.spring.io/libs-milestone/"}

を追加して再実行。

Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:hive2://xxxxxxx:10000/xxx,
compiling:(C:\msys64\tmp\form-init2223412939380166071.clj:1:85)

0.10 には

:subprotocol "hive"
:classname "org.apache.hadoop.hive.jdbc.HiveDriver"

と指定するものらしい。

hive-jdbc 0.11.0

接続を

:subprotocol "hive2"
:classname "org.apache.hive.jdbc.HiveDriver"

に戻して
利用する hive-jdbc を 0.11.0 とするために

[org.apache.hive/hive-jdbc "0.11.0"]

を指定。

すると

(ns testtesttest.main
  (:require [clojure.java.jdbc :as j]))

  (def hive-db {:subprotocol "hive2"
                :classname "org.apache.hive.jdbc.HiveDriver"
                :subname "//xxxxxxx:10000/xxx"
                :user "aaa"
                :password "bbb"})

(defn tables []
  (j/query hive-db
    [(str "show tables")]
   :row-fn println))

   (defn -main [& args]
     (tables))

を実行すると

WARNING!!! version ranges found for:
[org.apache.hive/hive-jdbc "0.11.0"] -> [org.apache.hive/hive-cli "0.11.0"] -> [org.apache.hive/hive-service "0.11.0"] -> [org.apache.hive/hive-exec "0.11.0"] -> [org.apache.hive/hive-metastore "0.11.0"] -> [org.datanucleus/datanucleus-enhancer "2.0.3"] -> [asm "[3.0,4.0)"]
Consider using [org.apache.hive/hive-jdbc "0.11.0" :exclusions [asm]].

依存性の警告が出ますが

{:tab_name zzz}
{:tab_name yyy}
.
.
.

と結果が取得できました。

念のため 0.12.0

0.13.0 同様に
client_protocol が指定されていないエラーで失敗しました。

まとめ

hive 0.10 で hiveserver2 を起動しているときは
hive-jdbc 0.11.0 で接続。

(いろいろ試した結果からの答えなので
セオリーや王道があれば教えていただけると助かります。。)

さて次は取得したデータをエクセルへ出力……

Scala 関西 Summit 2015 で LT をしてきました

「せっかくだから LT に応募してみては」と声をかけていただいて、
08/01 (土) の "Scala関西 Summit 2015" で LT をする機会をもらいました。

Scala関西 Summit 2015 - 関西初のScala大規模イベント8/1(土)開催
http://summit.scala-kansai.org/

社外でお話する機会は (仕事以外で) 久しぶりだったので
緊張するかなーなんて心配でしたが、
会場の大阪市中央公会堂というロケーションが素晴らしく
楽しい気持ちのままあっという間の時間でした。

f:id:nishikawasasaki:20150802231026j:plain
f:id:nishikawasasaki:20150802231139j:plain
f:id:nishikawasasaki:20150802231201j:plain

お話した内容はなにもスライド公開することもないような、
Scala を自分がリードして現場に持ち込むために

  • 日頃の信頼を得るためアピールする
  • 小さな事例から積み重ねる
  • 最終的に自分がなんとかする覚悟
  • レビューや CI といった開発環境の整備
  • 最初から 100% じゃなくても良い、少しずつリファクタリング
  • コーディングが楽しくなればモチベーションもあがる

という内容でした。
LT あとのパネルトークの中でも
だいたい同じようなお話をされていた (と思ってる) ので
大きく間違ってはいないかなと (勝手に) 思っています。

LT しておいてなんですが、
これって Scala に限った話ではないんですよね。
環境をよくして無理に 100% 狙わずに
与えられた時間でできるだけ良いモノを。
追加で、言い出したんなら責任とる覚悟。
プログラミングでも仕事でも似たようなものだと思ってます。

とても良い機会をいただきましたし、すごい盛り上がりで
ものすごく暑い中スタッフの皆様おつかれさまです&ありがとうございました!!