技術関連の覚書

案件でやったり自宅で試したことの覚書

Elasticsearch5.0

今更発掘した、 www.meetup.com

この時のメモ

Elastic Cloudは有償

バージョンの組み合わせが分かりにくいので、全部5.0に統一

kibana4.4の後なので次から5.0から

現状α版

ingest beats→でパースしてelastic →elasticsearchとbeatsだけでできるようになる

script groovyからpainless scripting

kuromoji N-best cost/example 漢数字からアラビア数字に変換

プラグインコマンド変更 /bin/elasticsearch-plugin テキストフィールド アナライズする場合はtext、しない場合はkeyword

Netty3からNetty4

analyze API

es hadoop spark2.0に対応

kibana

5になるとカラフルになる 使い勝手は変わらない

マウスオーバーで

senseがデフォルトで搭載 Consoleと言う名前になる

csvでデータインポートできる

モニタリング機能 with X-Pack

地図 認証がかかって見えなくなってたのを改修

logstash

モニタリングAPIを付けた

IPV6対応

GEO IP2対応

モニタリングAPI Moar Metrics Moar Visibility

Beats

JSONがパースできるようになった フィルタリングできるようになった

Kafka

TopbeatからMetricbeatに名前が変わった

x-pack

個別にインストールしていたものを1つにした

Kibanaの画面をPDFに

cloud

AWS Elastic Cloud Elasic Cloud Enterprise

elastic{on} TOUR 東京2016 12/15

Use Cause of Elasticsearch AND Considerations in Multi-tenancy

プロダクト紹介 RDBとの連携

セルフ管理とAWS

PyData.Tokyo

再インデクシングの高速化

ちゃんと整理しないと

ELKとdocker-compose

久しぶりにdocker-composeでELK(Elasticsearch,Logstash,Kibana)を動かしてみようと思った。

(後付け)最初につまづいた時点で、これ残しておくと解決に導く手順も残せそうと思い残してみることにした。

DBのアクセスパスチェックに使えたりしないかとふと思ったが、ELKをちゃんと使ったことがなかったので、まず使ってみよう。

どこかからdocker-compose.ymlを拾ってきて実行

github.com

ちょうど良さそうなので使ってみる。

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ git clone https://github.com/deviantony/docker-elk.git
Cloning into 'docker-elk'...
remote: Counting objects: 581, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 581 (delta 0), reused 0 (delta 0), pack-reused 570
Receiving objects: 100% (581/581), 110.68 KiB | 26.00 KiB/s, done.
Resolving deltas: 100% (202/202), done.
Checking connectivity... done.
isoroku@akagi:git clone https://github.com/deviantony/docker-elk.git
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose up -d
Unsupported config option for services service: 'elasticsearch'
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ 

docker-composeのオプションを確認するとserviceと言うオプションは確かに無い

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose 
Define and run multi-container applications with Docker.

Usage:
  docker-compose [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE           Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME   Specify an alternate project name (default: directory name)
  --verbose                 Show more output
  -v, --version             Print version and exit

Commands:
  build              Build or rebuild services
  help               Get help on a command
  kill               Kill containers
  logs               View output from containers
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pulls service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  up                 Create and start containers
  migrate-to-labels  Recreate containers to add labels

githubのページに行くと確かにこう書いてある Install Docker-compose version >= 1.6.

今入ってるバージョンは

@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose -v
docker-compose version: 1.3.3
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013

しばらく放置してたなあ…(ー▽ー;)

と言うわけで、docker-composeのアップデート

https://github.com/docker/compose/blob/master/CHANGELOG.md へ行って最新版の確認

今日現在 1.12.0 (2017-04-04)

Releases · docker/compose · GitHub へ行ってみると

curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

でインストールできると書いてある

一応、現在のdocker-composeのありかを確認

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ which docker-compose
/usr/local/bin/docker-compose

配置場所は問題なさそうなのでそのまま実行する。 その前に、パーミッション確認

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ ls -l /usr/local/bin/
合計 8096
-rwxr-xr-x 1 root root 8182592  6月 26  2016 docker-compose

sudo で実行だけど面倒なので sudo su -してrootになってしまう。

後は上のコマンドを実行してしばらく待つ

root@akagi:~# curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   600    0   600    0     0    775      0 --:--:-- --:--:-- --:--:--   774
 82 8076k   82 6646k    0     0   9529      0  0:14:27  0:11:54  0:02:33     0
curl: (56) GnuTLS recv error (-54): Error in the pull function.

orz….

今はこっちかな…..○| ̄|_

とりあえずやり直し

2回め失敗

(4/15追記)

docker-compose は

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose -v
docker-compose version 1.12.0, build b31ff33

バージョンは上がってるっぽいし、動くっぽい… この際だからこの状態で動くか見てみる。

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose 
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name (default: directory name)
  --verbose                   Show more output
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the name specified
                              in the client certificate (for example if your docker host
                              is an IP address)
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the compose file)

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

旧バージョンではオプションだったversionサブコマンド

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose version
docker-compose version 1.12.0, build b31ff33
docker-py version: 2.2.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

ちゃんとバージョンが表示できた。

では、この状態で

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose up -d
Creating network "dockerelk_elk" with driver "bridge"
Building elasticsearch
Step 1/1 : FROM docker.elastic.co/elasticsearch/elasticsearch:5.3.0
 ---> ccec59a7dd84
Successfully built ccec59a7dd84
WARNING: Image for service elasticsearch was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Building logstash
Step 1/1 : FROM docker.elastic.co/logstash/logstash:5.3.0
 ---> b583a99a08a0
Successfully built b583a99a08a0
WARNING: Image for service logstash was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Building kibana
Step 1/1 : FROM docker.elastic.co/kibana/kibana:5.3.0
 ---> a21e19753b0c
Successfully built a21e19753b0c
WARNING: Image for service kibana was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating dockerelk_elasticsearch_1
Creating dockerelk_kibana_1
Creating dockerelk_logstash_1
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose ps
      Name             Command             State              Ports       
-------------------------------------------------------------------------
dockerelk_elasti   /bin/bash bin      Exit 78                             
csearch_1          /es-docker                                             
dockerelk_kibana   /bin/sh -c         Up                 0.0.0.0:5601->56 
_1                 /usr/local/bin/                       01/tcp           
                   ...                                                    
dockerelk_logsta   /usr/local/bin     Up                 0.0.0.0:5000->50 
sh_1               /docker-entr ...                      00/tcp           

elasticsarchが立ち上がってない

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose start elasticsearch
Starting elasticsearch ... done
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose ps
      Name             Command             State              Ports       
-------------------------------------------------------------------------
dockerelk_elasti   /bin/bash bin      Exit 78                             
csearch_1          /es-docker                                             
dockerelk_kibana   /bin/sh -c         Up                 0.0.0.0:5601->56 
_1                 /usr/local/bin/                       01/tcp           
                   ...                                                    
dockerelk_logsta   /usr/local/bin     Up                 0.0.0.0:5000->50 
sh_1               /docker-entr ...                      00/tcp           

では、docker-compose upしたときの内容を見てみるけどWARNINGは出てるけど、特に問題なさそう。 あ、もしかしてパーミッションが… 確認すると、別ユーザで作成したディレクトリだったのでパーミッションがなかった。 なので、所有者を共通のグループに、パーミッションを775に設定してやりなおし。

まず、一度落としてから今度は、 docker-compose up だけで実行

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose down
Stopping dockerelk_logstash_1 ... done
Stopping dockerelk_kibana_1 ... done
Removing dockerelk_logstash_1 ... done
Removing dockerelk_kibana_1 ... done
Removing dockerelk_elasticsearch_1 ... done
Removing network dockerelk_elk
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose up
Creating network "dockerelk_elk" with driver "bridge"
Creating dockerelk_elasticsearch_1
Creating dockerelk_logstash_1
Creating dockerelk_kibana_1
Attaching to dockerelk_elasticsearch_1, dockerelk_logstash_1, dockerelk_kibana_1
elasticsearch_1  | /bin/bash: bin/es-docker: Permission denied
dockerelk_elasticsearch_1 exited with code 126
kibana_1         | fs.js:640
kibana_1         |   return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
kibana_1         |                  ^
kibana_1         | 
kibana_1         | Error: EACCES: permission denied, open '/usr/share/kibana/optimize/.babelcache.json'
kibana_1         |     at Error (native)
kibana_1         |     at Object.fs.openSync (fs.js:640:18)
kibana_1         |     at Object.fs.writeFileSync (fs.js:1333:33)
kibana_1         |     at save (/usr/share/kibana/node_modules/babel-core/lib/api/register/cache.js:35:19)
kibana_1         |     at _combinedTickCallback (internal/process/next_tick.js:67:7)
kibana_1         |     at process._tickCallback (internal/process/next_tick.js:98:9)
kibana_1         |     at Module.runMain (module.js:606:11)
kibana_1         |     at run (bootstrap_node.js:394:7)
kibana_1         |     at startup (bootstrap_node.js:149:9)
kibana_1         |     at bootstrap_node.js:509:3
dockerelk_kibana_1 exited with code 1
logstash_1       | Sending Logstash's logs to /usr/share/logstash/logs which is now configured via log4j2.properties
logstash_1       | [2017-04-15T15:02:18,387][FATAL][logstash.runner          ] An unexpected error occurred! {:error=>#<ArgumentError: Path "/usr/share/logstash/data" must be a writable directory. It is not writable.>, :backtrace=>["/usr/share/logstash/logstash-core/lib/logstash/settings.rb:420:in `validate'", "/usr/share/logstash/logstash-core/lib/logstash/settings.rb:202:in `validate_value'", "/usr/share/logstash/logstash-core/lib/logstash/settings.rb:118:in `validate_all'", "org/jruby/RubyHash.java:1342:in `each'", "/usr/share/logstash/logstash-core/lib/logstash/settings.rb:117:in `validate_all'", "/usr/share/logstash/logstash-core/lib/logstash/runner.rb:210:in `execute'", "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/clamp-0.6.5/lib/clamp/command.rb:67:in `run'", "/usr/share/logstash/logstash-core/lib/logstash/runner.rb:183:in `run'", "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/clamp-0.6.5/lib/clamp/command.rb:132:in `run'", "/usr/share/logstash/lib/bootstrap/environment.rb:71:in `(root)'"]}
dockerelk_logstash_1 exited with code 1

もう一度docker-elkのgithubへ行ってみて、SELinuxのところを見ると chcon -R system_u:object_r:admin_home_t:s0 docker-elk/ を実行しろと.. ただ、For example on Redhat and CentOS

Ubuntuの場合のchconコマンドは

masataka@akagi:/home/vm/virtualmachine/docker/elasticsearch$ chcon --help
使用法: chcon [OPTION]... CONTEXT FILE...
または:  chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
または:  chcon [OPTION]... --reference=RFILE FILE...
各 FILE の SELinux セキュリティコンテキストを CONTEXT に変更します。
--reference がある場合、各 FILE のセキュリティコンテキストを RFILE のものに
変更します。

Mandatory arguments to long options are mandatory for short options too.
      --dereference      シンボリック自体の代わりに、シンボリックリンクを辿っ
                         た先に適用する (この動作が既定)、
  -h, --no-dereference   参照先のファイルの代わりにシンボリックリンクに適用する
  -u, --user=USER        set user USER in the target security context
  -r, --role=ROLE        set role ROLE in the target security context
  -t, --type=TYPE        set type TYPE in the target security context
  -l, --range=RANGE      set range RANGE in the target security context
      --no-preserve-root  '/' を特別扱いしない (既定)
      --preserve-root     '/' に対する再帰的な操作を失敗させる
      --reference=RFILE  CONTEXT 値を指定するのに代わって RFILE の
                         セキュリティコンテキストを使用する
  -R, --recursive        ファイルとディレクトリを再帰的に操作する
  -v, --verbose          各ファイルを処理した時の診断を出力する

以下のオプションは -R オプションと併せて指定されたときにどのように階層を
横断するかの動作を変更します。2個以上指定されたときは最後のオプションの
み有効になります。

  -H                     コマンドライン引数がディレクトリに対するシンボ
                         リックリンクの場合に、リンクを辿る
  -L                     ディレクトリに対するシンボリックリンクに遭遇し
                         た時には全て辿る
  -P                     シンボリックリンクを辿らない (デフォルト)

      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
chcon の翻訳に関するバグは <http://translationproject.org/team/ja.html> に連絡してください。
Full documentation at: <http://www.gnu.org/software/coreutils/chcon>
or available locally via: info '(coreutils) chcon invocation'

docker-composeとUbuntuSELinux設定をもうちょっと調べてからやり直しだなあ

環境表示

こちらの記事を元に作って見ました。 環境設定がないとやはり再現できない原因がわからないなど困ることがありますね。

dev.classmethod.jp

検証環境

  • CPU Intel® Core™ i5-2500 CPU @ 3.30GHz
  • MEMORY 16318172 kB
  • DISTRIBUTION Ubuntu
  • RELEASE VER 16.04
  • CODE NAME xenial
  • KERNEL GNU/Linux

これだけだとただ書き写しただけなのでちょい足ししました。

  • 関数を使って2通りの出力内容にした

  • 出力オプションで-l:リスト形式、-t:テーブル形式で出力(getoptsを使用)

  • オプション違いはusageを出力

getoptsはbashのビルトインコマンドでコマンドライン引数を指定した変数に順次格納していくコマンドです。 書式は

getopts オプション文字の羅列 格納する変数

今回は-lと-tなのでオプション文字に「lt」と書きました。 値を設定するオプションの場合は:(コロン)を後ろにつけると変数OPTARGに値が保持されるので、値付きの場合はコロンをつけます。 例) -f table などとしたい場合 getopts f: OPT にすると、OPTにfが入った時に、OPTARGにtableが設定されます。

ファイル内容はこうなりました 当方Ubuntuなのでコマンドとかはちょっと変わります。

#!/bin/bash

# 環境取得
DIST_FILE="/etc/lsb-release"
MACHINE=$(uname -m)
CPU=$(grep "model name" /proc/cpuinfo|head -1)
MEM=$(grep "MemTotal" /proc/meminfo)
DISTRIB=$(grep DISTRIB_ID $DIST_FILE)
OS_VER=$(grep DISTRIB_RELEASE $DIST_FILE)
OS_NAME=$(grep DISTRIB_CODENAME $DIST_FILE)
KERNEL_VER=$(uname -o)

# MarkDown 形式で出力
# リスト形式
list() {
echo "- CPU ${CPU##*:}"
echo "- MEMORY ${MEM##*:}"
echo "- DISTRIBUTION ${DISTRIB#*=}"
echo "- RELEASE VER ${OS_VER#*=}"
echo "- CODE NAME ${OS_NAME#*=}"
echo "- KERNEL $KERNEL_VER"
}

# テーブル形式
table() {
echo "|カテゴリ|スペック|"
echo "|:-|:-|"
echo "|DISTRIBUTION|${DISTRIB#*=}|"
echo "|RELEASE VER|${OS_VER#*=}|"
echo "|CODE NAME|${OS_NAME#*=}|"
echo "|KERNEL|$KERNEL_VER|"
}

# usage
usage() {
   echo "usage:"
   echo "$0 [-l|-t]"
   echo "-l:list / -t:table"
}

if [ $# -ne 1 ]; then
   usage
   exit -1
fi

echo "#### 検証環境"
echo ""

while getopts lt OPT
do
    case $OPT in
    "l")
      list;;
    "t")
      table;;
    *)
      usage;;
    esac
done

-tの時の出力

検証環境

カテゴリ スペック
CPU Intel® Core™ i5-2500 CPU @ 3.30GHz
MEMORY 16318172 kB
DISTRIBUTION Ubuntu
RELEASE VER 16.04
CODE NAME xenial
KERNEL GNU/Linux

システム開発のアンチパターン

システム開発をする上でやってはいけないことがいくつかあると思う

開発過程での御法度

  • ファイルの紛失
  • デグレーション(先祖返り)

コーディングでの御法度

  • 同一処理の分散
  • 変更対応範囲の拡大

テストでの御法度

  • 未実施

しかし、これらはどこかしらで今も行われていると言う現実もある

その原因は

開発過程

ファイルの紛失
  • 共有ドライブでの管理での操作ミス

** 間違って消す、上書き、バックアップフォルダの間違い等で行方不明などによって引き起こされる これに関してはバージョン管理ツール(gitなど)でほぼ解決できる内容だが、使わない現場も多い 紛失等による修正コストと運用のための学習コストとの比較をすれば明らかに学習コストの方が低いはずと言うのが説得のポイントになる まずは、ファイルが無くなってもすぐに復旧できると言うところから説得していくしかなさそう

デグレーション(デグレ)

フォルダで管理しているが別々に作業していた人が誤って上書きする、古い物をバックアップから戻すなどで引き起こされる これもバージョン管理ツールで解決可能だが、これについては運用ルールも正しくないと同じ事が起こる 今まで見た中では、

  • 共有フォルダとバージョン管理ツールの平行運用 → 共有フォルダでの管理はどれが最新なのか、正しく日付等が管理されているかという問題で人的ミスが原因で起こる このデメリットをそのまま持ってきてしまってるので意味がない

  • コミットのタイミングがレビュー後でないとできない → 最終成果物しか管理されないため途中経過でのデグレの発生リスクはそのままとなり、デグレが発生しても最悪気づくのはレビュー時になる

  • ブランチの使用禁止(競合が発生するため) 上記コミットのタイミングのためブランチを使わない方針は少なくない

対策としては、競合しても簡単にマージできますアピールかな…

コーディング

コーディングでのアンチパターンは既に設計段階から始まります。

  • 共通化するもの、しないものの振り分け、処理パターンの洗い出しなどが不十分の場合

  • コーディング規約が曖昧な場合

  • そもそもアーキテクチャがおかしい場合

従来から行われている共通化の方法としては、共通関数を作る、それぞれの処理から呼び出すが一般的でした。 オブジェクト指向になって親クラスで共通処理をして、個別のメソッドは抽象クラスにして、それぞれの子で実装するが一般的になるでしょう。 DIを放り込んでおくなど、コーディング量を少なくすることが目的です。

しかし、中には昔ながらのコーディングが好きな人もいて、1ファイル1処理主義の方も未だに存在します(そろそろ絶滅したかな?)。 こういう人の説得が一番厄介ですが、根気よく共通化のメリットを説明しましょう。

共通関数呼び出しに行く人はまだ理解してくれることが多く、テンプレートパターンのように理解しやすいところから順序立てて説明していけば納得してくれることが多いようです。

ドキュメントとの整合性

設計書を書いてコードを書いて、誤りがあったらどちらを修正するかというと、どちらかというとコードから直す方が現実には多いです。 そのためドキュメントの修正が後回しになり、時には修正されずコードとの整合性が取られなくなることも多いです。 この際、ドキュメントを作らずRedmineのチケットなどで管理してドキュメント代わりにするところもあるようです。

しかし、まだドキュメントを作成するところの方が多いのは事実なのでこれは、なるべく忘れないうちにすぐに反映するしかないです。 そのためには、ドキュメントは極力簡略化することではないかと思います。 それから、コード一覧とか、画面項目一覧などは、一覧から画面HTMLの生成できるツールにするなど工夫することで作るメリットも生まれます。 ドキュメントを面倒な書き物にせずに便利なツールにすることでみんなが書きたくなる工夫も必要かな。

オンコード主義

接続情報の設定値や使用するSQLをソース上に記述するプロジェクトもありますが、これらはただの値であるためコンパイルは問題なく通ります。 しかし、それを検出するのは最悪テストの段階なのでそこまで検出できないことがよくあります。

設定値の場合は環境によって変わるものもあるのでソースを入れ換えなければならない場面も出てきます。 propertyファイルやxmlなどで管理しておくことで外部ファイルにできるのでそのようにしましょう。 環境で変化するものはgradleにちょっと書くだけで自動切り替えができます。 使ってない場合はそれぞれの環境用にファイルを用意してbuild.xmlMakefileにコピーを配置する記述を追加して切り替える方法もあります。

自動テストを使わない

画面の入力項目が多いものなどは動作確認だけでも入力に時間をとられます。 入力項目入れるべき値が正しいかという観点もあるので正しいテストを行うためにも自動化は必要です。 JUnitTestNGのようなメソッドを直接検査するツールとSeleniumような画面の動作を自動実行するツールがあるので用途に応じて使い分けましょう。 そして、テストは1度では終わらないということを管理者に認識してもらうことが導入許可への第一歩になります。

まとめ

システム開発は一人でするものではないため、設計書の書き方、コードの書き方、テストの方法などのルールを決めて行います。 そのため、規模が大きくなるほど、整合性を取ることが難しくなるためあまり、変わったことをせず従来どおりの方式を取ることが多くなります。 方式の決定は自分ではどうしようもないことも多いので、それに従うしかありませんが、ツールが無くてもバッチなどはテストプログラムを作成することもできます。

工数とのバランスを取りながら工夫していけると制約のある中でも効率をあげる方法はあると思います。

今日はなにを書くか

ネタが出てこなかった

あるにはあるけどなんかつまらんなと言うのと、昔Swing使ってゲーム作った事とかだったっけど今さらSwingというのも

まだ、やろうとしていることは残ってるので

  • [ ] Zabbixのインストールとか
  • [ ] 中途半端に終わってるPostgresqlの続きとか
  • [ ] タスク管理の話とか
  • [] ブログでの数式の書き方とか

SQL最適化(3)

これ書いてなかったなというので追加

SORT CANCEL

例えばORDER BYで項目をソートする場合に、インデックスを使用するとインデックスの検索によってソートがかかるので、ORDER BYでのソートを取りやめて効率化します。

これがどういうときに有効利用できるかというと、LIMIT句で取得件数を制限する場合、ソートがかかっていれば必要な件数取得した時点で検索を終了します(LIMIT SCAN)。

SORT CANCELが働く場合と言うのは * SORT CANCEL BY INDEX 上で書いたとおりです

  • SORT CANCEL BY JOIN ORDER BYで指定している項目が結合条件に使用されている場合にORDER BYのソートをキャンセルします

  • SORT CANCEL BY DISTINCT ORDER BYで指定している項目がDISTINCT処理でソートされる場合にORDER BYのソートをキャンセルします

  • SORT CANCEL BY GROUPING ORDER BYに含まれる列がすべてグループ化処理によってソートされる場合にORDER BYのソート処理をキャンセルします

つまり、何かの処理でGROUP BYでソートしようとしていた項目に対するソートが働けば改めてソートをしないということです