[번역] Docker 컨테이너를 Windows Bash에서 구동하기

Linux를 위한 Windows Subsystem(WSL)1이 Microsoft의 Build 컨퍼런스 2016에서 발표되었을 때, Windows 개발자들에게 새로운 도구의 세계가 열렸습니다. 개인적으로, PowerShell, Bash와 예전의 낡은 cmd까지, 스크립트를 할 때 자유롭게 고를 수 있다는 점을 참 좋아합니다. 그리고 Windows Bash에서 Docker 를 구동하지 못하고 있다는 점은 저를 지금까지도 괴롭게 합니다.

이 글의 원본 제목은 “Windows Bash에서 Docker를 구동하기”였습니다만, 이는 다소 과장되어 있습니다. Docker 는 Windows에서 완전히 완성되지 않은 수많은 시스템 호출에 대한 접근을 필요로 하며, 이로 인해 WSL에서 엔진을 구동하는 것은 아마도 쉽지 않을 것입니다. 대신, 우리는 Docker Engine을 Windows에서 구동하고 이를 Bash에서 연결할 것입니다. 이 또한 PowerShell에서 컨테이너를 시작하고 Bash로 상호작용하거나, 다른 방식을 제공한다는 장점을 갖고 있습니다. 다시 말해서, 당신의 컴퓨터가 단일 머신처럼 느껴질 것입니다.

그 방법을 알아봅시다.

1. Docker를 Windows에서 설치하기

Docker 엔진을 Windows에서 설치하려면, docker.com에 가서 적절한 배포판을 다운로드합니다. 물론, 하드웨어 가상화가 활성화돼있고, Hyper-V가 설치되어 있어야 하며, 그렇지 않으면 엔진이 시작되지 않습니다.

가장 빠른 방법: Windows 10 크리에티터 업데이트 설치

Windows 실행 파일을 Bash에서 실행할 수 있게 되었기 때문에, Windows 10 크리에이터 업데이트에서는 이 과정이 더욱 단순해졌습니다. 그저 아래 두 줄을 .bashsrc에 추가하고 (환경을 다시 로드하면) 끝납니다!

export PATH="$HOME/bin:$HOME/.local/bin:$PATH"
export PATH="$PATH:/mnt/c/Program\ Files/Docker/Docker/resources/bin"
alias docker=docker.exe
alias docker-compose=docker-compose.exe

docker –version을 Bash에서 실행하면, 나머지 글을 읽을 필요도 없습니다. :)

*) Windows 10 크리에이터 업데이트는 2017년 4월 11일에 인사이더에 공개되었으며 현재 유효합니다.

Windows 10 애니버서리 에디션에서 작동하는 법

Docker를 WSL에 설치하기 위해서, 몇 가지 더 많은 단계가 필요합니다. 일부 선택적 단계를 제외하고는 WSL에서도 잘 작동하는, 일반적인 Ubuntu 설치 방법은 여기 적혀 있습니다.

제가 한 방식은 이것입니다:

# Install packages to allow apt to use a repository over HTTPS
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# Add Docker's official GPG key
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Set up the repository
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# Update source lists
sudo apt-get update
# Install Docker
sudo apt-get install docker-ce

물론 필요한 바이너리를 다운받고 압축을 푸는 작업, 그리고 그것을 PATH에 넣는 방식의 선택지도 있습니다. 가장 최신 버전에 맞는 방법은 여기 적혀 있습니다.

그 결과는?

Docker 엔진을 Windows와 WSL 양쪽에 설치했지만, 둘 다 구동하진 않았습니다. Windows 인스톨러는 고맙게도 Docker 엔진을 시작할 때 쓰는 Docker 바로 가기를 바탕 화면에 만들어놨습니다. 그리고 docker images를 PowerShell이나 Bash에서 호출할 수 있습니다.

PowerShell:

PS C:\> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

아직까지 이미지를 아무 것도 만들지 않았지만, 괜찮습니다.

Bash:

$ docker images
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

전혀 만족스럽지 못하군요. 하지만 한 두 가지 과정을 더 거치면, 모두 잘 작동할 것입니다.

2. Windows Docker로 WSL의 Docker 연결하기

docker를 다른 장치의 엔진을 대상으로 구동하는 것은 꽤 쉬운데, Docker가 CLI가 연결될 수 있는 TCP 엔드포인트를 노출할 수 있기 때문입니다.

참고: 글을 처음 공개한지 얼마 되지 않아서 Docker 업데이트를 통해 이 TCP 엔드포인트는 기본적으로 꺼져 있습니다. (Mark님 알려주셔서 감사해요!) 활성화하려면, 작업표시줄에 있는 Docker 아이콘을 우클릭하여, 메뉴에서 설정을 들어갑니다. 그리고 “Expose daemon on tcp://localhost:2375 without TLS” 옵션을 켭니다 (보안 위험성에 유의합니다).

export PATH="$HOME/bin:$HOME/.local/bin:$PATH"
export PATH="$PATH:/mnt/c/Program\ Files/Docker/Docker/resources/bin"
alias docker=docker.exe
alias docker-compose=docker-compose.exe

이렇게 하면, 다음처럼 할 일은 Bash 상의 CLI가 Bash 상에는 없는 엔진 대신에 Windows에서 엔진을 실행하게 됩니다.

$ docker -H tcp://0.0.0.0:2375 images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

훨씬 낫군요!

이 상태를 지속하게 만드는 두 가지 방법이 있습니다. 위 명령을 별명으로 추가하거나, 아니면 더 나은 방법으로(Dave님의 추천), Docker가 호스트 엔진을 찾도록 환경 변수를 만들면 됩니다.

$ echo "export DOCKER_HOST='tcp://0.0.0.0:2375'" >> ~/.bashrc
$ source ~/.bashrc

이제, 도커 명령을 Bash에서 실행하면, 우리가 바라던 대로 작동하게 됩니다.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

미션 성공!


이 글에서 사용한 버전

물론, 이 방법이 사용하는 버전에 따라 되지 않을 수 있습니다. 이 블로그 포스트에서는 다음과 같은 버전을 사용하였습니다.

Windows

Windows 10 Pro Anniversary Edition (Version 1607, OS Build 14393.1066)
Windows 10 Pro Creators Update (Version 1703, OS Build 15063.138)

WSL Ubuntu

14.04.5 LTS

Docker on Windows

17.03.1-ce, build c6d412e

Docker on Ubuntu

17.03.1-ce, build c6d412e

출처: https://blog.jayway.com/2017/04/19/running-docker-on-bash-on-windows/

ゼロから始めるGit(分散型バージョン管理)ライフ 1

Gitを使うべし!

形象バージョン管理アプリの中で、一番優秀だと思われるのは断然Gitと言える。Gitは次のような特徴が長所と思われている。

  1. ファイルごとに変更内容を追跡し、ステージ後、コミット、プッシュ過程を通してアップロードができる。
  2. 中央サーバー中心ではない。分散セーブをする。
    • Gitは確かリモートサーバーという概念を持ってるが、サーバーにつながらなくてもローカルコミットまではできる。SVNはリモートサーバーと繋がらなければ、一切のコミットができない。
    • ローカルに貯めていたコミットを一気にプッシュすることでサーバーと無事に同期化もできる。
  3. ほとんどの場合、コンフリクトの解消は簡単にできる。
  4. ソース保管と複製に利用できる。
    • Githubはgitを活用した代表的な公開サービスであって、ここにPublicとしてアップすることで、誰でもクローンができる。
    • GitをCloneすれば、レポジトリーの歴史と内容のすべてがコピーされて、サーバーの有無と関係なく、再アップロードして歴史を続けられる。
  5. コミットの容量が小さいし、いつでもアンドゥしたり、他のコミットをチェックアウトできる。
    • Branchを分岐して、人あるいは機能ごとに分けることができる。完成されていない作業中の機能も柔軟にセーブできる。
    • 新しい機能が問題の原因となった場合、過去のコミットに戻ることも、他のブランチに変えることもできる。
    • Checkoutをすると、ローカルのファイルはすべて変わってしまうが、たとしてコミットした既存のファイルがどこか消えるのではない。プロジェクトフォルダの内容をまるでテンポラリーファイルのように変えられる。

一方、形象管理を経験していない人なら、「グーグルドライブやラインで送ればいいじゃん」と思うかもしれない。これは次のような理由で避けた方が進められる。

  1. 同じか似ているファイルが複数存在するようになる。
    (マスター.zip, マスター.zip (1), マスター-最終.zipが積み重なるような…)
  2. プロジェクトファイル全体を圧縮して、コピー(アップロード/ダウンロード), 解凍する過程で時間の無駄遣いと手間がかかる。
  3. 常に何を変更したか分からない。
  4. 前はできた機能が壊れた場合、その原因を探るのはとても難しい。
  5. 誰かが動かないと言っても、その人のファイルが最新かどうかわからない。

Gitを使うためのそろいもの

Windows環境でGitを使うには予め大きく二つの気にすることがある。

  • クライアント側
    • Gitをコマンドで使うか?
      • Gitバイナリーは確かコマンドプロンプトやbashなどで使われるCLIアプリであり、使いにくいが、GUIにない機能を使うためには必須である。
      • 一部のGUI Gitは別途のバイナリーが要るが、大体にGUIのみ使っている場合ならそのアプリの以外にGitをまたインストールする必要はない。しかし、上記の理由でコマンドの必要性はあるので、両方あって損することもない。
    • Gitを便利に使えるGUIを選ぼう。
      • SourceTreeは地域化が進められていて、日本語バージョンもある。しかし、機能では惜しいところもある。
      • GitKrakenはこのシリーズで紹介するアプリであり、豊富な機能と優れている視覚化が特徴だ。しかし、英語のみサポートされている。
      • TortoiseGitはエクスプローラーのメニューの中にあり、連携に優れているが、機能と直感性は劣っている。
      • eclipseのeGit, Visual Studioのgitなど、IDEに含まれているプラグインも活用できる。しかし、本の最小の機能しかないので、gitに対する誤解を招くこともあり、コンフリクトなどの問題解決が非常に難しいか、不可能な場合もある。
  • サーバー側
    • 誰でもgitバイナリーを使い、git serverの設定ができる。
    • githubとbitbucketのようなウェブgitが使える。
      • github: Publicの場合無料。Privateは一人に7ドルの費用。
      • bitbucket: Public無料。Privateも5人内なら無料。
    • Synology NASにgitを設定して、SSHプロトコルで使用できる。

Git for Windows ダウンロード

Linuxの環境では、基本的な構成されることが多いし、(Ubuntu等)、必要なら単純な命令でインストールできる。

Linux Git ダウングレード

Gitをパソコンで設定

GUIのみの方には必要ないかもしれないが、gitコマンドを使うには事前設定が必要だ。

まず、上記のリンクからファイルのダウンロードを行い、インストールを済ませる。PATH設定が適用されるには、現在のコマンドプロンプトをすべて終了し、必要な時はシステム再起動もする。

次のようなメッセージが表示されたら、PATHが間違っていることである。

> git
'git' is not recognized as an internal or external command,
operable program or batch file.

下の結果が成功である。

> git
usage: git [--version] [--help] [-C ] [-c name=value]
           [--exec-path[=]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=] [--work-tree=] [--namespace=]
            []

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status

grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Reapply commits on top of another base tip
   tag        Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help ' or 'git help '
to read about a specific subcommand or concept.

これから、基本ユーザー設定をしてみよう。次のコマンドがあれば、git commitのたびに、ユーザー設定が自動でできる。

> git config --global user.name "My Name"
> git config --global user.email [email protected]

一度使ってみたらはまるGitKraken

つづく…

アルゴリズム探求-隣接している元素の位置を求めよう

問題

U < V < WまたはU > V > Wの時、整数VとUはWの間にある。

開いていない配列Aは与えられたN個の整数で構成されていて、数字のインデックス(P,Q)のペアは0 ≤ P < Q < Nの隣接する数がA[P]とA[Q]の間にないことと、A[P]≠A[Q]であることを表す。

例えば、配列Aでは:

A[0] = 0
A[1] = 3
A[2] = 3
A[3] = 7
A[4] = 5
A[5] = 3
A[6] = 11
A[7] = 1

次のインデックスのペアは隣接した値を持っている。

(0,7), (1,4), (1,7), (2,4), (2,7), (3,4), (3,6), (4,5), (5,7)

例えば、インデックス4と5は隣接した数字を持っている。なぜなら、A[4] = 5とA[5] = 3は異なっていて、配列Aにはその間に挟まる数字はない。つまり、数字4のみが間にあるが、配列には存在しない。

与えられた二つのインデックスPとQの距離はX ≥ 0ではabs(X) = X、X < 0ではabs(X) = -Xの時、abs(P-Q)として定義される。例えば、インデックス4と5の中の距離は1であり、その理由はabs(4-5) = (5-4) = 1だからである。

関数を作成せよ:

class Solution { public int solution{int[] A); }

与えられた、空いていない配列AはN個の整数で構成されていて、隣接した値を持っている配列の一番遠い距離をリターンする。この関数は隣接したインデックスがない場合、-1をリターンしなければならない。

例えば、与えられた配列Aは次のようになる。

A[0] = 1
A[1] = 4
A[2] = 7
A[3] = 3
A[4] = 3
A[5] = 5

この関数は次の理由で4をリターンしなければならない:

  • インデックス0と4は隣接している。その理由はA[0] ≠ A[4]で、配列にはA[0] = 1とA[4] = 3の間の数字を持っていないからだ。
  • これらのインデックスの距離はabs(0-4) = 4である。
  • より遠い距離の隣接したインデックスのペアはない。

次のように仮定する:

  • Nは[1..40,000]の範囲内である。
  • 配列Aの項目は整数であり、範囲[-2,147,483,648..2,147,483,647]の内である。

複雑さ:

  • 期待される最悪の場合、時間計算量はO(N*log(N))である。
  • 期待される最悪の場合、空間計算量はO(N)で、入力空間以降を言う。(インプット記号に必要な空間を除く)

発送

  • 左から探してその次の隣接した数を探すのは?
    • N個の項目に対し、N-1個のリピートをしなければならない。
    • よりいい方法があるはずだ。
  • ソートを先にした後に、低い順で登りながら当ててみるか?
    • ソートアルゴリズムは検証済みであり、内部のライブラリの方が速いし、信用できる。
    • 同じ数を除くとループはさらに速くなる。
    • でも、ソート後インデックスがなくなるのでは?
      • 元の位置は左から探すなど原始的な方法でいい。
      • 見つかったとたん、脱出するとループは短くなる。

解き方

import java.util.ArrayList;
import java.util.Arrays;

public class Question {

    /*プロゴラムのエントリ。*/
   public static void main(String[] args) {
      // TODO Auto-generated method stub
      //int[] A = new int[] {0,3,3,7,5,3,11,1};
      //int[] A = new int[] {1,4,7,3,3,5};
      //int[] A = new int[] {1,1,1,1,1,1,1,1};
      
      //ランダムの40000個の整数を入れる
      int[] A = new int[40000];
      for(int i = 0; i < A.length; i++) {
         A[i]=(int)Math.round(Math.random()*2147483647*2-2147483647);
      }
      
      //時間の計算
      long startTime = System.nanoTime();
      System.out.println("Result: "+solution(A));
      System.out.println("Elapsed Time: "+(System.nanoTime()-startTime)/1000000.0+"ms");
   }
   /* */

   /* 補助関数: 配列から項目の位置を探す */
   private static int indexOfArray(int[] A, int val, boolean reverse) {
      if(reverse) {
         //後ろから
         for(int i = A.length-1; i >= 0; i--) {
            if(A[i]==val) {
               return i;
            }
         }
      } else {
         //前から
         for(int i = 0; i < A.length; i++) {
            if(A[i]==val) {
               return i;
            }
         }
      }
      return -1;
   }
   
   /* minと maxを配列でindexOfArrayを使い、それぞれ求めてその最大値を求める */
   private static int findPairDistance(int[] A, int min, int max) {
      //左、右からmin, max検索
      int aleft = indexOfArray(A,min,false);
      int aright = indexOfArray(A,min,true);
      int bleft = indexOfArray(A,max,false);
      int bright = indexOfArray(A,max,true);
      return Math.max(Math.abs(aleft-bright),Math.abs(aright-bleft));
   }
   
   /* ソリューションのメイン */
   public static int solution(int[] A) {
      //ソート後重複を除く
      int[] sorted = A.clone();
      Arrays.sort(sorted);
      /*for(int i = 0; i < sorted.length; i++) {
         System.out.print(sorted[i]+",");
      }*/
      //ArrayList alSel = new ArrayList<>();
      int max = -1;
      for(int i = 1;i < sorted.length; i++) {
         //前項と現在項の違い
         int cha = sorted[i]-sorted[i-1];
         if(cha >= 1) { //違いが1以上の場合整数は変化したとする
            //alSel.add(sorted[i-1]);
            //findPairDistance(A,A[i-1],A[i]);
            max = Math.max(max, findPairDistance(A,sorted[i-1],sorted[i]));
            //二つの左右検索最大距離を求めた後、maxより大きい時に記録
            //System.out.println(String.format("Value: (%d,%d), Distance: %d",sorted[i-1],sorted[i],findPairDistance(A,sorted[i-1],sorted[i])));
         }
      }
      
      
      return max;
   }

}

 

SQL ビュー(View) 紹介

ビューとは、CREATE TABLE で定義された実テーブルから作成される仮想的なテーブルのことです。ビューはあくまでも仮想テーブルなので、その中にデータは存在しません。ビューは実テーブルをどのように見るのかを定義したものと言えます。

もうすでに使っていますが、CREATE TABLE で定義された、データの入ったテーブルのことを実テーブル、この実テーブルから作られる仮想的なテーブルをビューと呼ぶことにします。

ビューのメリット

ビューの実体は SELECT 文によるクエリを定義したものです。ビューにアクセスすると、定義されたクエリが実行され、実テーブルから必要なデータが抽出されます。また、ビューからビューを定義することも可能です。ですから、あらかじめ毎回入力するのが面倒な複雑なクエリを一度ビューとして定義しておけば、ユーザやプログラムは単純なクエリを実行するだけですみます。

このような開発労力の軽減という観点以外に、セキュリティについてもメリットもあります。たとえば、実テーブルのデータの中に一般ユーザには見せたくないものがある場合、実テーブルへのアクセス権限を一般ユーザには与えることはできません。しかし、見せたくないデータを除いたビューを定義することにより、一般ユーザでも実テーブルのデータを利用できるようになります。

ビューの作成

ビューを作成するには CREATE VIEW 文を用います。基本構文は次のとおりです。

CREATE VIEW ビュー名 [(列名, 列名, .....)] AS
SELECT文
[WITH CHECK OPTION];

ビュー名の後には、抽出するデータの列名を記述します。列名を省略した場合、SELECT 文で指定した列の名前がそのまま使用されます。SELECT 文で演算子を使用した場合や、改めて列名を指定したい場合に明示的に記述するものです。

ビュー名と列名の後には、AS に続けて SELECT 文によるクエリを記述します。このクエリの結果がこのビューのデータということになります。[WITH CHECK OPTION] はビューの更新に関連するオプションです。ビューの更新については後の節で説明します。

この章の SQL のサンプルはこれまでの章でも使用してきた受注表・顧客表・商品表を実テーブルとして使用します。sample.21-1 では v_受注という名前のビューを定義し、最後にビューの内容を確認しています。

/* ビューの作成 */
CREATE VIEW v_受注 AS
SELECT JJ.受注番号, KK.顧客名, SS.商品名,
JJ.受注個数, JJ.納品日
FROM 受注表 JJ, 顧客表 KK, 商品表 SS
WHERE JJ.顧客コード = KK.顧客コード
AND JJ.商品コード = SS.商品コード;
 
/* 確認 */
SELECT JJ.受注番号, KK.顧客名, SS.商品名,
JJ.受注個数, JJ.納品日
FROM 受注表 JJ, 顧客表 KK, 商品表 SS
WHERE JJ.顧客コード = KK.顧客コード
AND JJ.商品コード = SS.商品コード;

定義したビューから特定の行や列を出力することも出来ます。sample.21-2 は定義したv_受注から、受注個数が 100以上である行を選択し、その顧客名、商品名及び受注個数を出力するものです。

実行結果
顧客名 商品名 受注個数
──────────── ────── ───────
KUROKIYA JUICE 300
ONSIDE BEER 200
KUSHINANA BEER 150
ONSIDE WINE 110
KUROKIYA TEA 250
KUSHINANA BEER 135
KUROKIYA BEER 290
KUSHINANA BEER 175

標準規格として

標準SQL規格としては、SQL89から使用可能です。SQL92ではCHECK OPTION、LOCAL、CASCADEの機能拡張が行なわれています。SQL99では更に機能強化が計られ、一定条件下でビューから実表のデータの更新が可能になった。なお、SQL89においては、ビューを作成できるものの、DROPステートメントが無いため削除できません。

ビューの削除

ビュー削除の際に、以下のようにSQL文を記述します。(DROPステートメントの詳細)

DROP VIEW ビュー名;

実習課題

  1. 次のテーブルを以下の条件に合わせて表示するクエリを作ってみましょう。
  • 名前を一つのコラムに入れてfullnameと呼ぶ
  • Birthdateが2001-09-01より前の人だけを表示する
id first_name last_name email birthdate added
1 Bonnie Medhurst [email protected] 1999-07-26 1982-05-01 21:32:19
2 Vincenza Streich [email protected] 2006-01-30 2000-07-15 18:19:18
3 Carter Kilback do’[email protected] 1998-12-07 1998-08-14 06:13:52
4 Mariano Stroman [email protected] 1996-06-18 2008-04-06 14:43:43
5 Deondre Kerluke [email protected] 1994-04-10 2008-06-26 22:02:19
6 Gia Towne [email protected] 1988-07-13 1982-03-22 03:16:39
7 Margarett Beahan [email protected] 2008-01-22 2010-09-12 08:59:33
8 Gilda Brekke [email protected] 1981-09-18 2016-04-14 01:17:38
9 Zackary Cummerata [email protected] 2001-05-27 2003-05-23 21:18:54
10 Kory Wiegand [email protected] 2010-03-16 1992-03-22 04:14:31
11 Vinnie Zboncak [email protected] 2016-06-23 2014-12-29 20:55:25
12 Carmella Bogan [email protected] 1978-06-10 1993-01-17 08:43:08
13 Vance Rice [email protected] 1996-10-09 1999-09-14 15:27:08
14 Coleman Maggio [email protected] 1999-11-22 2001-05-01 05:42:36
15 Patricia Zieme [email protected] 1978-11-18 1987-07-21 18:44:25
16 Jada Beer [email protected] 1991-07-17 1997-10-08 09:41:57
17 Kianna Torphy [email protected] 1994-03-17 2011-11-20 20:15:40
18 Maegan Harvey [email protected] 1979-07-18 2010-10-06 20:52:03
19 Winona Welch [email protected] 1974-10-28 2010-09-02 22:05:57
20 Queen Mosciski [email protected] 1983-05-23 1985-10-09 08:51:49

CREATE VIEW scit_view AS
SELECT (first_name || last_name) AS fullname, email
FROM scit_user
WHERE birthdate < to_date('2001-09-01','YYYY-MM-DD');

SELECT fullname, email FROM scit_view;
  1. WHEREで決められた条件に合うアイテムが元のテーブルで変わると、ビューは変わりますか。
  2. Oracleを含めて、最近のデータベースシステムではビューのINSERTやUPDATE、DELETEなどもできますが、こういったDML操作ができない場合を考えてみましょう。

 

これは、Techscoreからの原文を加工して、発表のためにまとめた資料です。

 

excercise1

簡単に解いてみるJava急テスト

よりにもよって、季節の変わり目で、鼻水で頭はフラフラしている最中ですが、Javaの実力検証のためのテストを受けることになりました。

みんな解けるくらいの簡単なものだと言いましたが、必ずしもみんなそう思うわけにはいかないので、長い時間があっても手間取っていた人もいました。

Java 問題 1. 1桁を一に変えるコードを作成せよ

문제 1

public class Exercise1 {

	public static void main(String[] args) {
		int num = 333;
		int num2 = (int)Math.round((double)(Math.floor((float)num*0.1f)))*10+1;
		System.out.println(num2);
	}

}

実はnum / 10 * 10が簡単で、そう解いた人が圧倒的に多いですが、これにも理由はある…というには長すぎます。解いた後に後悔した件です。

Stringに変えてサブストリングで変えて、 Integer.parseInt()もいいアイデアですね。

続きを読む “簡単に解いてみるJava急テスト”

spring

[번역글] Spring MVC 모델과 세션 애트리뷰트의 이해

자바 웹 애플리케이션 개발자로서, 여러분은 요청 (HttpServletRequest)과 세션 (HttpSession) 범위를 바로 배우셨을 겁니다. 이들 범위와 데이터, 객체 다루기를 이해하는 것은자바에서 웹 애플리케이션을 디자인하고 빌드하는데 중요한 요소입니다. [리퀘스트와 세션의 범위에 대해서는 스택 오버플로우 게시물을 참조하면 빠르게 배울 수 있습니다]

Spring MVC 범위

Spring MVC에서 웹 애플리케이션을 시작했을 때, Spring 모델과 세션 애트리뷰트는 이해하기 어려웠습니다. 특히, HTTP 리퀘스트와 세션 범위, 거기서 애트리뷰트에 관해서 말입니다. Spring 모델 요소는 세션이나 요청에서 똑같이 나타날까요? 그렇다면, 어떻게 제어할까요? 이 글에서, Spring의 MVC 모델과 세션이 동작하는 것을 파헤치도록 하겠습니다.

続きを読む “[번역글] Spring MVC 모델과 세션 애트리뷰트의 이해”

プログラミングとは?

人がプログラミング言語にて、命令し、パソコンを起動させる技術

一つ以上の抽象アルゴリズムを特定のプログラミング言語を使い、詳細なパソコンプログラミングとして、実用化する技術を言う。

ソースコード→コンパイラー→マシン語

JAVAの誕生背景

  • 1991年Sun社でジェームズ・ゴスリン(James Arthur Gosling, 1955-)を中心に、家電に使うための言語の作製
  • 特定のCPU

プログラミングの基礎

プログラムとは

パソコンが汎用的機会になったのは、プログラム(program)のおかげである。プログラムはパソコンのための作業の指示書であり、具体的にはパソコンがある特定の作業をするためのコマンドの集まりだ。コマンドとは、CPUが遂行する基礎的な演算である。

プログラミング言語

  • ソースコード(source code): 希望する作業をテキストで表したもの
  • ソースファィル(source file): ソースコードがファイルに記録されたもの
  • オブジェクトファイル(object file): コンパイラーが機械語に変換して、ファイルにセーブしたもの