2019年8月26日月曜日

joinコマンドでファイルをマージする

ファイルをマージしようと思いjoinコマンドがあることは覚えていたのですが、使い方を完全に忘れていました。
アウトプットすることで記憶の定着を図ろうと思い、メモレベルですが記事にしたいと思います。
以下のような2つのファイルが存在した時、joinコマンドを使用することでマージすることができます。
2つのファイルをマージ
$ cat sample1.csv
1,115583271
2,115583272
3,115583283
4,115583294
5,115583295

$ cat sample2.csv
1,215583271
2,215583282
3,215583283
4,215583294
5,215583305

$ join -t',' sample1.csv sample2.csv > sample1_2.csv

$ cat sample1_2.csv
1,115583271,215583271
2,115583272,215583282
3,115583283,215583283
4,115583294,215583294
5,115583295,215583305
カラム数が違う場合でもマージできます。
以下は、上記でマージして作成したファイルに、さらに別ファイルをマージしている例です。
カラム数が違う場合でもマージ
$ cat sample3.csv
1,315583271
2,315583282
3,315583283
4,315583294
5,315583305

$ join -t',' sample1_2.csv sample3.csv > sample1_2_3.csv
$ cat sample1_2_3.csv
1,115583271,215583271,315583271
2,115583272,215583282,315583282
3,115583283,215583283,315583283
4,115583294,215583294,315583294
5,115583295,215583305,315583305
簡単にマージできました。
3つのファイルを一回でマージできないようなので、コマンドを組み合わせてマージ。
&&:前のコマンドが成功した場合のみ後続のコマンドを実行する。
&&でコマンドをつなげる
join -t',' sample1.csv sample2.csv > tmp.csv && join -t',' sample1_2.csv sample3.csv > sample1_2_3.csv && rm -i tmp.csv


2018年2月2日金曜日

gitのtag一括削除コマンド教えてもらったけど、しっかり理解していなかったからちょっと試してみた

リモートで削除された複数のタグを一括削除するには、以下のコマンドで出来ると教わりました。
$ git fetch origin --prune 'refs/tags/*:refs/tags/*'
'refs/tags/*:refs/tags/*'についてしっかり理解していなかったのでいろいろ試してみました。
あとでやったことを見返すためにログを張っておこうと思います。
※タグと言いつつ、ブランチで試しています。

今の状態

$ git --version
git version 2.14.1

$ git remote
origin

$ git branch -a
  fuga
  hoge
  mas
* master
  pyo
  origin/HEAD -> origin/master
  origin/fuga
  origin/hoge
  origin/mas
  origin/master
  origin/pyo
以下試した内容を列挙していきます。
※URL等は適当に変更しています。

aaaブランチないからプッシュできない

$ git push origin aaa:iii
error: src refspec aaa does not match any.
error: failed to push some refs to 'https://hogehogehoge/tutorial.git'
コロン区切りの指定している箇所をrefspecと呼ぶみたい。
んで手前をsrcと呼ぶようで。
失敗したので作成されていない。
$ git branch -a
  fuga
  hoge
  mas
* master
  pyo
  origin/HEAD -> origin/master
  origin/fuga
  origin/hoge
  origin/mas
  origin/master
  origin/pyo

hogeブランチからリモートに新しいブランチを作る

$ git push origin hoge:test
Password for 'https://hogehogehgoe':
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create pull request for test:
remote:   https://hogehogheogheoghe/tutorial/pull-requests/new?source=test&t=1
remote:
To https://hogheogheohgoe/tutorial.git
 * [new branch]      hoge -> test
リモートに作ったのでローカルには表示されない。
$ git branch -a
  fuga
  hoge
  mas
* master
  pyo
  origin/HEAD -> origin/master
  origin/fuga
  origin/hoge
  origin/mas
  origin/master
  origin/pyo
  origin/test
リモートから持ってくると出てきた。
$ git checkout -b origin/test
Switched to a new branch 'origin/test'
$ git branch -a
  fuga
  hoge
  mas
  master
* origin/test
  pyo
  origin/HEAD -> origin/master
  origin/fuga
  origin/hoge
  origin/mas
  origin/master
  origin/pyo
  origin/test

無いをプッシュで消える。

$ git push origin :test
Password for 'https://hogehogheoghoe':
To https://hgoehogheohgegheo/tutorial.git
 - [deleted]         test
$ git branch -a
  fuga
  hoge
  mas
  master
* origin/test
  pyo
  origin/HEAD -> origin/master
  origin/fuga
  origin/hoge
  origin/mas
  origin/master
  origin/pyo

まとめ

無いをpullするとどうなるかもやってみたのですが、
動きがよくわからなかったです。マージっぽい感じもしましたが・・。
とりま、やってみたことは以上です。
gitって奥が深いですね。また暇を見つけていろいろ試してみたいです。

2017年11月19日日曜日

Eclipse・Gradle・SpringBootでHelloWorldチュートリアル

概要

Eclipse・Gradle・SpringBootでHelloWorldをやってみました。
その時の実施手順メモをチュートリアルっぽくしたので公開したいと思います。
順に実施するとSpringBootを使えるようになった気分になれます。(たぶん
目次:
 Ⅰ.Eclipse設定
 Ⅱ.Gradle設定
 Ⅲ.SpringBootでHelloWorld
 Ⅳ.HelloWorldをちょっと元気にしてみる

Ⅰ.Eclipse設定

1.Eclipseダウンロード

・以下のサイトよりEclipseダウンロード。
 http://mergedoc.osdn.jp/
 今回使用するバージョン:Oxygen(Full Edition)
・Cドライブ直下に展開。
 ※注意:好きな場所において問題ないが、階層が深くなると動かない場合がある。
・Eclipseを起動。
 以下のファイルを選択し起動。
 C:/pleiades/eclipse/eclipse.exe

2.プロジェクト作成

・メニューバーからファイル - 新規 - Gradleプロジェクトを選択。
・プロジェクト名に demo を記入。
・完了を左クリック。

Ⅱ.Gradle設定

1.build.gradle書き換え

・demoプロジェクト直下のbuild.gradleファイルを開く。
・build.gradleの内容をすべて削除。
・以下の内容に書き換え保存。
buildscript {
    ext {
        springBootVersion = '1.5.8.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'spring-boot'

jar {
    baseName = 'demo'
    version = '1.0.0'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/snapshot" }
    maven { url "https://repo.spring.io/milestone" }
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web:1.5.8.RELEASE')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

2.Gradle設定の反映

・demoプロジェクトを右クリック - Gradle - Gradleプロジェクトのリフレッシュをクリック。

Ⅲ.SpringBootでHelloWorld

1.HelloWorld用のパッケージ作成

・src/main/javaを右クリック - 新規 - パッケージ をクリック。
・名前に「hello.controller」を記入。
・完了を左クリック。

2.サーバ起動用クラス作成

・hello.controllerパッケージを右クリック - 新規 - クラス をクリック。
・パッケージに「hello」を記入。
・名前に「HelloApplication」を記入。
・完了をクリック。
・以下のように書き換え保存。
package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }
}

3.起動確認:ちょっと試しにサーバ起動

・HelloApplication.javaを右クリック - 実行 - javaアプリケーション をクリック。
 コンソールに起動メッセージが表示される。
・Webブラウザから以下のURLにアクセス。
 http://localhost:8080
 ページを作成していないため、以下のエラーページが表示される。
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sat Nov 04 17:08:37 JST 2017
There was an unexpected error (type=Not Found, status=404).
No message available
・コンソールの■ボタンを押してサーバを停止。

4.Controller作成

・controllerパッケージを右クリック - 新規 - クラス をクリック。
・名前に「HelloController」を記入。
・完了を左クリック。
・HelloController.javaを以下のように書き換え保存。
package hello.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * HelloController
 *
 * @author shiro
 *
 */
@Controller
public class HelloController {

    /**
     * 文字列をそのままリクエスト先に返却する。
     *
     * @return 文字列がそのまま表示される。
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    @ResponseBody
    public String topPage() {
        return "文字列がそのまま表示される。";
    }

    /**
     * HelloWorldページ
     *
     * @return HelloWorldページ
     */
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello() {
        return "hello/hello";
    }
}

5.起動確認

・HelloApplication.javaを右クリック - 実行 - javaアプリケーション をクリック。
 コンソールに起動メッセージが表示される。
・Webブラウザから以下のURLにアクセス。
 http://localhost:8080
 以下がページに表示される。
 この時点ではまだhttp://localhost:8080/hello は表示できません。
文字列がそのまま表示される。
・コンソールの■ボタンを押してサーバを停止。

6.HTML格納用リソースフォルダ作成

・demoプロジェクトを右クリック - 新規 - フォルダー をクリック
・親フォルダーを入力または選択に「demo/src/main/resources/templates」を記入。
・フォルダー名に「hello」を記入。
・完了を左クリック。
・demoプロジェクトを右クリック - Gradle - Gradleプロジェクトのリフレッシュをクリック。
 ※Gradleプロジェクトのリフレッシュは必須ではありません。やるとちょっとしたことが起きます( *´艸`)

7.HTML作成

・helloフォルダーをクリック - 新規 - その他 - Web - HTMLファイル を選択し次へ
・ファイル名に hello.html を記入。
・完了を左クリック。
・以下のように書き換え保存。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Hello</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>

8.起動確認

・HelloApplication.javaを右クリック - 実行 - javaアプリケーション をクリック。
 コンソールに起動メッセージが表示される。
・Webブラウザから以下のURLにアクセス。
 http://localhost:8080/hello
 以下がページに表示される。
Hello World
・コンソールの■ボタンを押してサーバを停止。

Ⅳ.HelloWorldをちょっと元気にしてみる

1.HTMLの修正

・Ⅲ.7.で作成したhello.htmlを開く。
・以下のように書き換え保存。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<title>Hello</title>
</head>
<body>
<span th:each="helloDto : ${helloDtoList}" th:style="|font-size: ${helloDto.getFontSize()}px|" th:text="${helloDto.getWord()}"></span>
</body>
</html>

2.gradle設定変更

・demoプロジェクト直下のbuild.gradleファイルを開く。
・以下のように書き換え保存。
 ※dependenciesに「compile('org.projectlombok:lombok:1.16.18')」を追加
buildscript {
    ext {
        springBootVersion = '1.5.8.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'spring-boot'

jar {
    baseName = 'demo'
    version = '1.0.0'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/snapshot" }
    maven { url "https://repo.spring.io/milestone" }
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web:1.5.8.RELEASE')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.projectlombok:lombok:1.16.18')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

3.Gradle設定の反映

・demoプロジェクトを右クリック - Gradle - Gradleプロジェクトのリフレッシュをクリック。

4.Eclipseにlombokインストール

・プロジェクトと外部の依存関係 - lombok-1.16.18.jarを右クリック - 実行 - Javaアプリケーションをクリック。
 ※Can't find IDEが表示された場合はOKをクリックし閉じる。
・Specify location...を左クリック。
・ファイル名に「C:/pleiades/eclipse/eclipse.exe」を入力しSelectを左クリック。
 ※Ⅰ.1.で起動したeclipse.exeの格納場所です。
・IDEsにファイル名に入力したパスが表示され、選択状態になっていることを確認。
・install/updateを左クリック。
・Install successfulが表示される。
・Quit Installerを左クリックし閉じる。

5.Dto用のパッケージ作成

・src/main/javaを右クリック - 新規 - パッケージ をクリック。
・名前に「hello.dto」を記入。
・完了を左クリック。

6.Dto作成

・dtoパッケージを右クリック - 新規 - クラス をクリック。
・名前に「HelloDto」を記入。
・完了を左クリック。
・HelloDto.javaを以下のように書き換え保存。
package hello.dto;

import lombok.Getter;
import lombok.Setter;

/**
 *
 * Hello Dto
 *
 * @author shiro
 *
 */
@Getter
@Setter
public class HelloDto {

    /** フォントサイズ */
    private int fontSize;

    /** 表示文字 */
    private String word;

}

7.Service用のパッケージ作成

・src/main/javaを右クリック - 新規 - パッケージ をクリック。
・名前に「hello.service」を記入。
・完了を左クリック。

8.Service作成

・serviceパッケージを右クリック - 新規 - クラス をクリック。
・名前に「HelloService」を記入。
・完了を左クリック。
・HelloService.javaを以下のように書き換え保存。
package hello.service;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.springframework.stereotype.Service;

import hello.dto.HelloDto;

/**
 * HelloService
 *
 * @author shiro
 *
 */
@Service
public class HelloService {

    /**
     * 与えられた数値からfizzbuzz結果リストを作成する。
     *
     * @param n 数値
     * @return fizzbuzz結果リスト
     */
    public List<HelloDto> numToFizzbuzzList(int num) {
        List<HelloDto> helloDtoList = new ArrayList<HelloDto>();

        for (int i = 1; i < num; i++) {
            HelloDto helloDto = new HelloDto();
            helloDto.setFontSize(randomFontSize());
            helloDto.setWord(fizzbuzz(i));
            helloDtoList.add(helloDto);
        }
        return helloDtoList;
    }

    /**
     * 与えられた数値のfizzbuzz結果を返却する。
     * Hello!, World!, HelloWorld!! のいずれかを返却する。
     *
     * @param num 数値
     * @return fizzbuzz 結果
     */
    private String fizzbuzz(int num) {
        if (num % 15 == 0) {
            return "HelloWorld!!";
        }else if (num % 3 == 0){
            return "Hello!";
        }else if (num % 5 == 0){
            return "World!";
        }else {
            return num + "!";
        }
    }

    /**
     * 10~100のランダムな数値を返却する
     *
     * @return ランダムな数値
     */
    private int randomFontSize() {
        Random random = new Random();
        return ((random.nextInt(10) * 10) + 10);
    }
}

9.Controller修正

・controllerパッケージの「HelloController.java」を開く。
・以下のように書き換え保存。
package hello.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import hello.dto.HelloDto;
import hello.service.HelloService;

/**
 * HelloController
 *
 * @author shiro
 *
 */
@Controller
public class HelloController {

    @Autowired
    HelloService helloService;

    /**
     * 文字列をそのままリクエスト先に返却する。
     *
     * @return 文字列がそのまま表示される。
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    @ResponseBody
    public String topPage() {
        return "文字列がそのまま表示される。";
    }

    /**
     * HelloWorldページ
     *
     * @param num fizzbuzzする回数
     * @param model fizzbuzz結果リスト
     * @return HelloWorldページ
     */
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello(@RequestParam int num, Model model) {

        List<HelloDto> helloDtoList = helloService.numToFizzbuzzList(num);

        model.addAttribute("helloDtoList", helloDtoList);
        return "hello/hello";
    }
}

10.起動確認

・HelloApplication.javaを右クリック - 実行 - javaアプリケーション をクリック。
 コンソールに起動メッセージが表示される。
・Webブラウザから以下のURLにアクセス。
 http://localhost:8080/hello?num=100
 以下がページに表示される。
1! 2! Hello! 4! World!・・・・(ry
・コンソールの■ボタンを押してサーバを停止。

余談

さくっと簡単に出来ちゃいますね。と言いつつ変なところで詰まったり・・。
単体テストも軽く触ろうかと思いましたが力尽きました。
気が向いたら追記したいと思います。
今回は以上です。

参考

Gradle 日本語ドキュメント http://gradle.monochromeroad.com/docs/
Spring Boot https://projects.spring.io/spring-boot/
Thymeleaf Tutorial: Using Thymeleaf (ja) http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html
Project Lombok https://projectlombok.org/