interprism's blog

インタープリズム株式会社の開発者ブログです。

GitLab 9.5.4 のバックアップとリストアの作業ログ

弊社ではソースコード管理に Gitlab CE を使っています。 今回、GitLabを別のサーバーに移し替えたのですが、GitLabのデータを一旦バックアップしてその後新サーバーでレストアするという手順を踏みました。それなりにハマりポイントがあったので作業ログとして残します。

なお、原則としてここの手順を元に作業しました。

docs.gitlab.com

続きを読む

アセンブリで簡単なプログラムを作る編

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の13日目 の記事です。

アセンブリで簡単なプログラムを作る

こんにちは、yumeです。最近アセンブリについて学習したので、簡単に何か、0から入力した正整数までの和を返すものを作ってみます。

はじめに

  • アセンブリとは、機械語(0と1)をもう少し人間にとって分かりやすい形にした言語です。
  • NASMというアセンブラを使っています。
  • 環境構築の部分は省略します。
  • 「詳しいことは(ひとまず)置いておいて、とにかく実装を見たい!」という人を意識して書こうと思ってます。

まずは10までの足し合わせ

section .text
global _start

_start:
mov     eax, 0      ;レジスタの初期化。eaxに0を入れる
mov     ecx, 10     ;ecxレジスタはカウンタとして使用される。今回は10までなので、ecxに10を入れる

_loop:
add     eax, ecx    ;eaxにecxを足す
loop    _loop       ;ecxがデクリメントされて_loopラベルへ

call    print       ;下で定義したprintサブルーチンを呼び出す

mov     eax, 0x0a   ;改行を出力
call    print

mov     eax, 1      ;
mov     ebx, 0      ;
int     0x80        ;システムコール。この一連で動作が終了する。慣れないうちは何がなんだか

print:
push    eax         ;eaxの中身をスタックへ逃す
mov     eax, 4      ;標準出力の準備
mov     ebx, 1      ;
mov     ecx, esp    ;出力するのはesp、つまりスタックの先頭
mov     edx, 1      ;1byte分の出力
int     0x80        ;システムコール
pop     eax         ;スタックから戻す
ret                 ;サブルーチンの呼び出し元へ

これを実行すると、

7

と出ます。「何事だ?」と驚かず、冷静にASCII文字コード表を見ると、文字'7'は10進数で55。一応、計算は出来ていそうです。

が、このままだとなんだか気持ち悪いので、10進数で返って来るようにします。

section .text
global _start

_start:
mov     eax, 0      ;レジスタの初期化。eaxに0を入れる
mov     ecx, 10     ;ecxレジスタはカウンタとして使用される。今回は10までなので、ecxに10を入れる

_loop:
add     eax, ecx    ;eaxにecxを足す
loop    _loop       ;ecxがデクリメントされて_loopラベルへ

mov     edx, 0      ;この後のdiv演算でedxには剰余が入るので、初期化
mov     ebx, 10     ;この後のdiv演算での引数になるレジスタ
div     ebx         ;これを書くだけで、eaxをebxで割り、結果はeaxに、余りはedxに格納される。面白いけど分かりにくい
add     eax, '0'    ;ASCII文字に変換するために'0'を足す
add     edx, '0'    ;

push    edx         ;一の位をスタックに避難
call    print       ;ここで出力されるのは十の位
pop     edx         ;

mov     eax, edx    ;
call    print       ;printサブルーチンを呼び出す

mov     eax, 0x0a   ;改行を出力
call    print

mov     eax, 1      ;
mov     ebx, 0      ;
int     0x80        ;システムコール。この一連で動作が終了する。慣れないうちは何がなんだか

print:
push    eax         ;eaxの中身をスタックへ逃す
mov     eax, 4      ;標準出力の準備
mov     ebx, 1      ;
mov     ecx, esp    ;出力するのはesp、つまりスタックの先頭
mov     edx, 1      ;1byte分の出力
int     0x80        ;システムコール
pop     eax         ;スタックから戻す
ret                 ;サブルーチンの呼び出し元へ

これで実行すると、

55

となります。

続きを読む

Windows10でエクスプローラの右クリックメニューからPowerShellあるいはコマンドプロンプトを管理者権限で開けるようにする

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の12日目 の記事です。

Windows10にアップグレードしたのですが・・・

こんにちはito.yです。

最近、使用している環境をWindows7からWindows10へとアップグレードしたのですが、 エクスプローラ上で「Shift+右クリック」を押すことで表示されていた「コマンドウィンドウをここで開く」が「PowerShellウィンドウをここに開く」に変更されました。

f:id:interprism:20180104010309p:plainf:id:interprism:20180104005951p:plain
左:Windows7 右:Windows10
個人的にはPowerShellも使用頻度が高いため変更される分には問題ありませんが、1つ許容できない部分がありました。
それは、 管理者権限で実行できないこと です。
Windows7の時は下図のユーザーアカウント制御画面で設定を通知しないに変更しておけば、UACが無効化されて自動的に管理者実行となっていたのに対し、 Windows8から変更された管理者権限の仕様のせいか、設定を変更しても管理者権限で実行することができなくなっています。
f:id:interprism:20180110231731p:plain:w300
UAC設定用のスライダーを下げても効果なし。。

本記事では対策方法を2パターン紹介します。
PowerShellではなくコマンドプロンプトで開きたい場合もパターン2の方法で対応可能です。

ただし、いずれもレジストリの変更が必要となります。 事前にPCのバックアップをするなどの準備をし、自己責任で実施してください。

  • 検証環境
    • エディション:Windows10 Home
    • バージョン:1709
    • OSビルド:16299.125
続きを読む

アジャイルテスト(後半)

実践アジャイルテスト

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の7日目 の記事です。

背景など

インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の6日目で投稿した interprism.hatenablog.com

の後半になります。

今回はこの本の14章を主にまとめたいと思います。
テストで「何を自動化すべきか」、「何を自動化すべきでないか」について記述します。

続きを読む

お酒は飲んでも飲まれるな

おいしくお酒を飲むために

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の11日目 の記事です。

背景など

社会人になって「自分の会社で飲み会」、「仕事先の人と飲み会」などお酒を飲む機会が多くなりました。
ましてや12月は忘年会などもたくさんあり、お酒を飲む機会が多いですよね
みなさんはお酒は大好きですか?
私は大好きです!!

今まではお酒をひたすら飲んで酔っ払うだけでしたが「このままではダメだ」と思い、カクテルの勉強を始めました。
お酒の名前の由来などを知ってるとお酒の席での小話になったり、今までと違ったお酒の楽しみ方を発見できたりします。

最近ではワインをよく飲んでるのでお家で簡単に作れるワインのカクテルを紹介します。

続きを読む

再帰クエリで木構造のデータを取得する

再帰クエリで木構造のデータを取得する

この投稿は インタープリズムはAdvent Calendarを愛しています。世界中のだれよりも。 Advent Calendar 2017の10日目 の記事です。

yoshiといいます。
今回は再帰クエリを用いて木構造のデータを取得する方法について書いてみました。
使用したデータベースは Microsoft SQL Server 2017 Express です。

木構造のデータ

今回使用するデータは、次のような構造のデータとします。

     Id     |   ParentId
------------+------------
 1          | (NULL)
 2          | 1
 3          | 1
 4          | 2
 5          | 2
 6          | 3
 7          | 3
 8          | 4
 9          | 4
 10         | 5
CREATE TABLE [Node](
    [Id] int NOT NULL,
    [ParentId]  int NULL
)
INSERT INTO [dbo].[Node] VALUES
    (1, null)
    ,(2, 1)
    ,(3, 1)
    ,(4, 2)
    ,(5, 2)
    ,(6, 3)
    ,(7, 3)
    ,(8, 4)
    ,(9, 4)
    ,(10, 5)

JOINを使用して子の一覧を取得する

単純にJOINを使用して取得しようとすると、以下のようなクエリになってしまいます。

SELECT
        n1.Id, n2.Id, n3.Id
    FROM
        [dbo].[Node] AS n1
        LEFT OUTER JOIN [dbo].[Node] AS n2
            ON n1.[Id] = n2.[ParentId]
        LEFT OUTER JOIN [dbo].[Node] AS n3
            ON n2.[Id] = n3.[ParentId]
    WHERE
        n1.Id = 2
/*
     Id     |     Id     |     Id     
------------+------------+-------------
 2          | 4          | 8
 2          | 4          | 9
 2          | 4          | 10
*/

階層の数だけJOINする必要があるので、

  • 取得したい階層の数が変わるごとにSQLを修正する必要がある
  • 「指定したIDの子すべてを取得する」など、取得する階層の数が不明な場合に対応できない

と言った問題があります。

再帰クエリを使用して取得する

しかし、再帰クエリを使用することにより上記の問題を解決することができます。

WITH [temp]([Id], [ParentId], [Depth])
AS
(
    SELECT
            n.[Id]
            ,n.[ParentId]
            ,1 AS [Depth]
        FROM
            [dbo].[Node] AS n
        WHERE
            n.[Id] = 2
    UNION ALL
    SELECT
            n.[Id]
            ,n.[ParentId]
            ,t.[Depth] + 1 AS [Depth]
        FROM
            [dbo].[Node] AS n
            INNER JOIN [temp] AS t
                ON n.[ParentId] = t.[Id]
)

SELECT
        *
    FROM
        [temp]

/*
     Id     |   ParentId|   Depth
------------+-----------+-------------
 2          | 1         | 1
 4          | 2         | 2
 5          | 2         | 2
 8          | 4         | 3
 9          | 4         | 3
 10         | 5         | 3
*/

再帰クエリではUNION ALL 以下のSELECT文の結果が空になるまで繰り返し実行されるため
階層の数を指定する必要がありません。
よって、JOINのような問題が生じることもありません。

注意点

再帰クエリは標準sqlの共通表式の一環として定義されていますが、
MySQLなどサポートしていないDBMSも存在しますので注意が必要です。
(MySQL 8.0 ではサポートされるらしいですが……)

インタープリズムのページ

PAGE TOP