ゆるふわエンジニアのブログ

行ったこと、調べたこと等をつらつらと書いていくかもしれません。

GitLabのアップデート方法(CentOS)

GitLabのアップデート方法について紹介していきます。
今回紹介する内容は、GitLab公式HPに記載されているものとなっています。
(英語がさっぱり、日本語での情報が欲しい、「公式HPから探すのめんどうくさい」といった方に需要があると信じて...)

環境は、CentOS6.7 64bit(仮想環境)です。
以降紹介する方法はすべて、git_testユーザでログインした後に
スーパユーザモードへ切り替えて操作していますので、ご了承ください。

GitLabのアップデートは、下記コマンドを実行するだけで行えます。
事前作業としてサービスを停止させる必要はありません。

[root@localhost git_test]# yum -y update gitlab-ce

正常にアップデートされているかどうかは、ヘルプページで確認することができます。
ヘルプページは
http://GitLabページのURL/help/
へアクセスすると表示されます。
(下記画像の赤枠参照。)
f:id:j_levia:20161105211022j:plain

7つの習慣ボードゲーム on Center CLRに参加してきました

7つの習慣ボードゲームで体験できるイベント、
体験!7つの習慣ボードゲーム on Center CLRに参加してきたので、
実際に体験してみての感想等をつらつらと書いていきます。
centerclr.doorkeeper.jp


そのまえに、「7つの習慣とはなんぞや?」となる方が多いと思うので、
ザックリと説明しますと、"人生を成功へ導くための習慣"です。
具体的には下記の7つがあります。

  • 第1の習慣:主体性を発揮する
  • 第2の習慣:目的を持って始める
  • 第3の習慣:需要事項を優先する
  • 第4の習慣:Win-Winを考える
  • 第5の習慣:理解してから理解される
  • 第6の習慣:相乗効果を発揮する
  • 第7の習慣:刃を研ぐ

第1から第3までの習慣は「私的成功」を実現するための習慣、
第4から第6までの習慣は「公的成功」を実現するための習慣、
第7の習慣は「私的成功」と「公的成功」の質を高める習慣となっています。
ここで説明すると長くなるのでボードゲームで体験するか、
下記の様な本を読んでザックリと内容を掴んでみると良いと思います。

[超図解 7つの習慣 基本と活用法が1時間でわかる本]
超図解 7つの習慣 基本と活用法が1時間でわかる本 | 中野 明, フランクリンコビージャパン | 本 | Amazon.co.jp
[まんがでわかる 7つの習慣]
Amazon CAPTCHA


さて、ここから感想となります。
それぞれの習慣と紐づけて書くと、下記の様な感じですね。

・第1の習慣:主体性を発揮する
・第2の習慣:目的を持って始める
・第3の習慣:需要事項を優先する
この3つの習慣については、仕事柄、常々考えて実践している部分になるので
実践できていたのではないかなぁ、と、思っています。

・第4の習慣:Win-Winを考える
最初の方は、プロジェクトの交渉時に
「自分が譲らなければ、時間切れで互いに何も得られなくなる、それは避けないと」
という想いが働き、Lose-Winの関係ばかりになっていたと思います。
ですが、後半戦では全体的にWin-Winの関係になるように動けていたと思います。

・第5の習慣:理解してから理解される
これが一番難しかったです。
まず、"相手を理解する"という部分について。
質問を投げ、話を聞いてみても目の前にある課題(問題)しか出てこず、
その先で本当に必要な事について上手く引き出せない。
こちらもザックリとした質問を投げるのではなく、本当に聞きたい事柄への答えを
引き出すためにレールを敷いた上で、相手をうまく乗せた方が良いと思いました。
(当たり前と言えば当たり前の話。)
次に、"理解される"という部分について。
これは、相手の想いを聞いて理解した上で自分の想いを話せば、
割とすんなりいくんじゃないかなぁという感触でした。
(但し、ミッションが特殊なものは除く。)

・第6の習慣:相乗効果を発揮する
これは第4の習慣と同じで、最初の方は実践できていなかったかもしれませんが、
後半戦では実践できていたように思います。

・第7の習慣:刃を研ぐ
これについては、第1~第6の習慣を続けて実践していくことになるので、
なんとも言えない。


と、ダラダラ書きましたが、全体を通して思ったのは
「自分の事ばかり考えていても上手くいかない、他者と一緒にやる以上、
相手(全体)の事を考えて立ち回らないと、どこかで歪が生じて破綻しそう」
ということですね。


最後に、ボードゲーム一式を準備していただいた関 満徳さん、
Center CLRオーガナイザーのkekyoさん、
グループでご一緒になった皆さま、
本当にありがとうございました!

SQL文を駆使し、縦持ちのデータを横持ちにする+α(Oracle)

SQL文を駆使し、縦持ちのデータを横持ちにする方法について書いていきます。

お仕事で、
「この縦持ちデータを横持ちにして見やすくしたいね~」
といったことを言われることがあります。

下記のデータを元に、どうSQLを書けばいいのか見ていきましょう。

KENNIN_IRAI_NO KENNIN_JUN KENNINSHA_MEI KENNIN_SUMI_KUBUN
20160821 1 TANAKA 1
20160821 2 SUZUKI 0
20160821 3 NAKAMURA 0
20160822 1 KONDO 1
20160822 2 TANAKA 1
20160822 3 NAKAMURA 1
20160822 4 HAYASHI 0
20160823 1 SHIMA 1
20160823 2 TANAKA 1

上記データは、左から
検認依頼番号、検認を行う順番、検認者名、
検認済かどうかを表す区分(0なら未検認、1なら検認済)を表しています。

検認検認番号毎に、検認を行う順番で左から検認者名を表示してみましょう。
そういったことを行うには、下記の様なSQL文を使用すると実現できます。

SELECT
   A.KENNIN_IRAI_NO
  ,MAX(CASE
         WHEN A.KENNIN_JUN = 1 THEN A.KENNINSHA_MEI
          ELSE NULL
       END) AS KENNINSHA_MEI1
  ,MAX(CASE
         WHEN A.KENNIN_JUN = 2 THEN A.KENNINSHA_MEI
         ELSE NULL
       END) AS KENNINSHA_MEI2
  ,MAX(CASE
         WHEN A.KENNIN_JUN = 3 THEN A.KENNINSHA_MEI
         ELSE NULL
       END) AS KENNINSHA_MEI3
  ,MAX(CASE
         WHEN A.KENNIN_JUN = 4 THEN A.KENNINSHA_MEI
         ELSE NULL
       END) AS KENNINSHA_MEI4
FROM
  KENNIN_IRAI_TBL A
GROUP BY
  A.KENNIN_IRAI_NO
ORDER BY
  A.KENNIN_IRAI_NO ASC

どの項目毎に横持ちでデータを表示させたいかをGROUP BYで指定し、
後はSELECTで集計関数を使用し各検認順毎にデータが存在していれば表示、
していなければ非表示、ということをしています。

結構応用が効くので、覚えておいて損は無いと思います。


さて、ここからはおまけ(という名の本編)です。
上記から派生して、
「横持ちで表現できるなら、縦持ちデータを元に進捗バーみたいな表現が出来ればわかりやすいよね(チラッチラッ」
といった要望が出ることも稀によくあります。
そういった場合は、下記の様にMAX関数内で使用しているCASE文に条件を追加してやります。

SELECT
   A.KENNIN_IRAI_NO
  ,MAX(
       CASE
         WHEN A.KENNIN_JUN = 1 AND A.KENNIN_SUMI_KUBUN = '1' THEN '●'
         WHEN A.KENNIN_JUN = 1 AND A.KENNIN_SUMI_KUBUN = '0' THEN '○'
         ELSE NULL
       END
      ) AS KENNIN_STATUS1
  ,MAX(
       CASE
         WHEN A.KENNIN_JUN = 2 AND A.KENNIN_SUMI_KUBUN = '1' THEN '●'
         WHEN A.KENNIN_JUN = 2 AND A.KENNIN_SUMI_KUBUN = '0' THEN '○'
         ELSE NULL
       END
      ) AS KENNIN_STATUS2
  ,MAX(
       CASE
         WHEN A.KENNIN_JUN = 3 AND A.KENNIN_SUMI_KUBUN = '1' THEN '●'
         WHEN A.KENNIN_JUN = 3 AND A.KENNIN_SUMI_KUBUN = '0' THEN '○'
         ELSE NULL
       END
      ) AS KENNIN_STATUS3
  ,MAX(
       CASE
         WHEN A.KENNIN_JUN = 4 AND A.KENNIN_SUMI_KUBUN = '1' THEN '●'
         WHEN A.KENNIN_JUN = 4 AND A.KENNIN_SUMI_KUBUN = '0' THEN '○'
         ELSE NULL
       END
      ) AS KENNIN_STATUS4
FROM
  KENNIN_IRAI_TBL A
GROUP BY
  A.KENNIN_IRAI_NO
ORDER BY
  A.KENNIN_IRAI_NO ASC

検認済なら●を、未検認なら○を、検認者が設定されていなければ
何も表示しないようにしています。

他には、縦持ちデータに別の縦持ちデータを横持ちでくっつけて(数は可変)
2次元表を作り、それをExcel形式で出力したいとかも稀によくありますね。
そういった要望に応えられるよう、覚えておくと良いと思います。

MERGE文を使用して高速一括更新(Oracle)

※注意 速度の話をしていますが、体感速度で話をしており、実速度は計っていません。
Oracle9i以降対応のお話です。


お仕事でSQL(PL/SQL)のチューニングを行った際のお話です。
備忘録的な感じでメモ。

お仕事で、下記の様なSQL文とPL/SQL文で書かれた
速度がすごく遅い処理に出会いました。

SQL

UPDATE TBL1 A
SET A.XXX = (
             SELECT
               subA.ZZZ AS ZZZ
             FROM
               TBL2 subA
             WHERE
               subA.ID = A.ID
            )


PL/SQL

DECLARE
  CURSOR C IS
    SELECT
       B.ID  AS ID
      ,B.ZZZ AS ZZZ
    FROM
      TBL2 B
BEGIN
  FOR R IN C LOOP
    UPDATE TBL1 A
    SET A.XXX = R.ZZZ
    WHERE
      A.ID = R.ID;
  END LOOP;
  COMMIT;
END;

前者は副問合せを使用しているので
「きっとSELECT文の箇所が複数回呼ばれているから遅そうだな」と、
後者は「TBL2のデータ分だけループをグルグル回しているので遅そうだな」
ということが感じとれますね。
「後者はバルク処理を使えば多少マシになるんじゃね?」とかは要らないです。

これらの一括更新処理をはやく行うためには、MERGE文を使うと良いです。
どういう風に書き換えるのかは、下記の通り。

MERGE INTO TBL1 A
USING (
       SELECT
          subA.ID  AS ID
         ,subA.ZZZ AS ZZZ
       FROM
         TBL2 subA
      ) B
  ON (A.ID = B.ID)
WHEN MATCHED THEN
  UPDATE SET
    A.XXX = B.ZZZ

このソースコードを読んで、
「アレ?WHEN NOT MATCHED THENまで書いてないけど大丈夫?」
と思われたかもしれませんが、問題ありません。
ちゃんと動きますので、ご安心を。


最後に。
SELECT INSERTを最初に行うなら、後で一括更新を行わず、
その時に表を結合して一気にINSERTしてしまったほうが良い気がしますね。
(チューニングを行った処理は、SELECT INSERT後一括更新を掛けていた。)

Developers.IO 2016 in Nagoyaに参加してきました。

本日、クラスメソッド株式会社さん主催の
Developers.IO 2016 in Nagoyaに参加してきました。
格好は、縞々模様(横)のカーディガンコスで行きました。
(Twitterアカウント等、話題に挙げなかったので、判別のため)
classmethod.connpass.com

会社でAWS関係やDevOpsについて色々とやっているので、
それらを目当てに行ってきました。

目当てのものについては予想以上に多くのものを得られ、
上記以外でもドキュメントの書き方や、C10K問題に対する対応策、
Scalaはいいぞ!」話等、良い話をお聴きできました。
こういう時、実際に実践された方々からお話を聴けるのは
すごく良いですね。説得力が段違いです。

本日の発表内容は後日、ブログへアップされるそうです。
よろしければ、見てみてはいかがでしょうか。

そして、セッション後のビアバッシュではプレゼントをめぐっての
ジャンケン大会が行われ、そこで勝利したことで
AWSエキスパート養成読本をいただきました。
なんと、共著者の一人である大栗さんのサイン入り!
激レアですね!
他にも、情報守やステッカーもいただきました。
本当にありがとうございます。

最後に、本日いただいた物の写真をアップロードしておきます。
写真が若干ピンボケしているのはご勘弁を...orz
f:id:j_levia:20160423193703j:plain:w300

GitLabのインストール(CentOS)

GitLabのインストール方法について紹介していきます。
今回紹介する内容は、下記URLの内容和訳したものに、
私がハマった部分についてを加えたものとなっています。
about.gitlab.com

内容のお品書きは下記の通りです。

  1. インストール環境(OS)
  2. インストール方法
  3. GitLabのreconfigureに失敗したら

それでは、見ていきましょう。


1. インストール環境(OS)
CentOS6.7 64bit(仮想環境)です。
以降紹介する方法はすべて、git_testユーザでログインした後に
スーパユーザモードへ切り替えて操作していますので、ご了承ください。

2. インストール方法
SSHのクライアント、サーバとメール送信用のpostfix、cronをインストールします。

[root@localhost git_test]# yum -y install curl openssh-server openssh-clients postfix cronie


postfixのサービスを起動させ、その後自動起動するように設定を変更します。

[root@localhost git_test]# service postfix start
[root@localhost git_test]# chkconfig postfix on


iptables(firewall)へルールを追加します。

[root@localhost git_test]# lokkit -s http -s ssh


GitLabのパッケージを取得し、インストールします。

[root@localhost git_test]# curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
[root@localhost git_test]# yum -y install gitlab-ce


設定を適用します。

[root@localhost git_test]# gitlab-ctl reconfigure

これで、インストールについては終了です。
http://ホスト名またはIPアドレス/
または
http://ホスト名またはIPアドレス:ポート番号/
へアクセスできるか確認しましょう。

3. GitLabのreconfigureに失敗したら
gitlab-ctl reconfigureコマンドを実行した時に下記の様なメッセージが出力され、
失敗することがあります。

Running handlers:
[2016-01-24T17:19:24+09:00] ERROR: Running exception handlers
Running handlers complete
[2016-01-24T17:19:24+09:00] ERROR: Exception handlers complete
Chef Client failed. 0 resources updated in 05 seconds
[2016-01-24T17:19:24+09:00] FATAL: Stacktrace dumped to /opt/gitlab/embedded/cookbooks/cache/chef-stacktrace.out
[2016-01-24T17:19:24+09:00] ERROR: user[git] (gitlab::users line 38) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '8'
---- Begin output of ["usermod", "-s", "/bin/sh", "-d", "/var/opt/gitlab", "git"] ----
STDOUT: 
STDERR: usermod: user git is currently used by process 1804
---- End output of ["usermod", "-s", "/bin/sh", "-d", "/var/opt/gitlab", "git"] ----
Ran ["usermod", "-s", "/bin/sh", "-d", "/var/opt/gitlab", "git"] returned 8
[2016-01-24T17:19:25+09:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)


出力されたメッセージを遡ってみて、下記の様なメッセージが出力されていたら
多分、先にgitユーザを作成してしまっている事が原因で失敗しています。
gitユーザを削除した後にgitlab-ctl reconfigureコマンドを実行してください。
(私の環境の場合、gitユーザの削除で上手くいきました。)

Recipe: gitlab::users
  * directory[/var/opt/gitlab] action create (up to date)
  * group[git] action create
    - alter group git
    - replace group members with new list of members
  * user[git] action create
    
    ================================================================================
    Error executing action `create` on resource 'user[git]'
    ================================================================================

Gitのインストール、アップデート方法(CentOS)

Gitのインストール、アップデート方法について紹介していきます。
内容は下記の通りです。

  1. インストール環境(OS)
  2. 事前準備
  3. インストール方法
  4. アップデート方法

それでは、見ていきましょう。


1. インストール環境(OS)
CentOS6.7 64bitを仮想環境で使用しています。
試しにCentOS7でも同じことを行ったところ、上手くいったので7でも大丈夫なのかもしれません。
以降紹介する方法はすべて、git_testユーザでログインした後に
スーパユーザモードへ切り替えて操作していますので、ご了承ください。

2. 事前準備
今回、紹介する方法はyum installでインストールする方法ではなく、
ソースコードのダウンロード、コンパイルを行う方法なので、
wgetコマンドとgccを下記の通りインストールしてください。

[root@localhost git_test]# yum -y install wget gcc

3. インストール方法
まず、Gitの依存ライブラリをインストールします。

[root@localhost git_test]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker

次に、Gitのソースコードをダウンロードします。

[root@localhost git_test]# wget https://www.kernel.org/pub/software/scm/git/git-2.4.0.tar.gz

ダウンロードしたGitのソースコードを解凍します。

[root@localhost git_test]# tar zxvf git-2.4.0.tar.gz

解凍したソースコードのフォルダへ移動し、コンパイルとインストールを行います。

[root@localhost git_test]# cd git-2.4.0
[root@localhost git-2.4.0]# make prefix=/usr/local all
[root@localhost git-2.4.0]# make prefix=/usr/local install

最後に、gitのバージョンを確認します。
インストールを行ったバージョンが表示されたらインストール成功です。

[root@localhost git-2.4.0]# git --version
git version 2.4.0

4. アップデート方法
GitのリポジトリをCloneするフォルダを作成し、移動します。

[root@localhost git_test]# mkdir /usr/local/src/
[root@localhost git_test]# cd /usr/local/src/

GitのリポジトリをCloneします。

[root@localhost src]# git clone git://git.kernel.org/pub/scm/git/git.git

CloneしたGitのフォルダへ移動し、コンパイルとインストールを行います。

[root@localhost src]# cd git
[root@localhost git]# make prefix=/usr/local all
[root@localhost git]# make prefix=/usr/local install

最後に、最新バージョンにアップデートされていることを確認します。
最新バージョンが表示されたら、アップデート成功です。

[root@localhost git]# git --version
git version 2.7.0.25.gfc10eb5

これで今後、git pullで最新ソースコードをpullした後にmake...の手順を踏むことで、アップデートを行えるようになります。


最後に、インストール方法についてですが、
yum installでのインストールも可能らしいです。
ですが、それだと最新バージョンがインストールされない上に
バージョンを選択できないので、今回紹介した方法で行うのが良いと思います。