技術関連の覚書

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

DBのインデックス

以前書いたSQLの最適化について( http://blog.hatena.ne.jp/boctok-ctpoba/boctoc1969.hatenablog.com/edit?entry=10328749687232910758 )ですが、「インデックスで検索速くなるなら全部につけちゃえばいいんじゃない?」と言う人がいたので補足します。

インデックスというのは、データの索引(Aで始まるとか)に分類してそれがどこにあるのかを示したデータです。

だから、これを作るときに負荷がかかります。

つまり、INSERT、UPDATE、DELETEの時はインデックスを作り直すためその分時間がかかります。

やたらとインデックスを貼れない理由はそこです。

それから、インデックスを貼る場合に効果があるかどうか検証した方が良いものもあります。

  • データの内容がほとんど変わらないもの

99%が同じデータで残りの1%に対する検索を殆どしない場合検索範囲は99%なので、あまり効果はありません。

  • データの種類が少ないもの

フラグのように2値だと検索量は良くて半分です。検索範囲が半分になる事で効果がある場合や、偏りがあって小さい側の検索が多い場合は有効かもしれません。

上記のような状態をカーディナリティが低いと言うそうです。

Google翻訳ではこの様に出てきました

cardinality the number of elements in a set or other grouping, as a property of that grouping. Cantor conjectured that there are no infinite cardinalities between the size of the natural numbers and the size of the real numbers (and so there are no sets S as described above).

オンラインでの開発環境

最近クラウドとかオンラインでできることが増えてますがオンラインでできる開発環境の紹介です。

開発環境

Web-based online coding environment | paiza.IO

Githubと同期や共同編集などもできるようです。

CI

Wercker Home

GithubやBitBucketとも連動してます。

バージョン管理

The world's leading software development platform · GitHub

公開リポジトリは無料で使えます。

Bitbucket | The Git solution for professional teams

Githubと同じような感じですが、プライベートリポジトリも無料で使えます。

こういう環境を使って無料で開発もできる時代になったんですね。

Ubuntu17.04新機能

ようやくインストールできたので動かしてみます。

まずは、VMのLiveCDの割り当てを外します。

f:id:boctok-ctpoba:20170423170701p:plain

ログインします。

f:id:boctok-ctpoba:20170423193924p:plain

デフォルトのスクリーンサイズ(800x600)なので狭いです。

f:id:boctok-ctpoba:20170423194043p:plain

設定を変更して広くします。

システム設定を開いて、 f:id:boctok-ctpoba:20170423194343p:plain

ディスプレイの設定で画面解像度を変更します。

f:id:boctok-ctpoba:20170423194830p:plain

今回の変更は、リリースノート ZestyZapus/ReleaseNotes - Ubuntu Wiki によると、

  • 32bitPPCサポートの終了

  • デフォルトDNSの名前解決がsystemd-resolved

  • 新規インストールした場合、従来のSWAPパーティションからSWAPファイルへ変更

  • カーネルバージョンが4.10

  • ドライバレスプリント

  • LibreOffice5.3

など

まず、カーネルバージョンとSWAPファイルの変更を見てみます。

f:id:boctok-ctpoba:20170423201919p:plain

この時点でtopコマンドでメモリの使用状況などを見てみます。

f:id:boctok-ctpoba:20170423202351p:plain

既にSWAPが47MBほど使われています。 確かに、ちょっと重たいかなと言う感じはあります。

LibreOffice Calcを立ち上げてみました。 SWAPが70MBくらいまで増えました。

f:id:boctok-ctpoba:20170423202832p:plain

1GBで使うには THE BEATNIKS/ちょっとツラインダ - YouTube といった感想です。

SSDを使えばもしかしたら気にならないかもしれませんが。

2GBにしてみました。 SWAPは無くなりました。

f:id:boctok-ctpoba:20170423203922p:plain

ネットワークインタフェースの設定を見るためにifconfigをたたいてみます。

f:id:boctok-ctpoba:20170423204506p:plain

net-toolsをインストールしろといってますが、Ubuntu17.04ではnet-toolsが非推奨になっています。 CentOS7を使ってる人は察しがつくと思いますが、ip addrコマンドを使ってみます。

f:id:boctok-ctpoba:20170423204855p:plain

変更されたコマンドについてはこちらを見てください(英語)。 networking:net-tools [Linux Foundation Wiki]

ドライバレスプリントはどうも自宅プリンタは IPP Everywhere Self-Certified Printers - Printer Working Group の対象になってないようで試すことはできませんでした。

最後に

Ubuntuデスクトップはメモリ1GBではちょっと重いけども2GBあれば何とか使えそうです。 自宅ノートは1GBの2coreなので、しばらくXubuntu16.10かな。

ドライバレスプリントはリストを見るとHPのプリンタに対応しているようです。

サーバの方は

となってます。(読んだだけです)

OpenStackは自分が触ってた頃からいくつか増えてるようです。 Aodh and Gnochi Trove Designate Ironic Manila Barbican(昔こんな名前のノンアルビールがあった気がする)

Ubuntu MATE 17.04 | Ubuntu MATE もリリースされているようなので、次はこれですね。

Ubuntu17.04

ダウンロードできたのでまずはVM(VirtualBox)でインストールしてみる

VMの設定は後で変えられるところはデフォルトのままでHDDのサイズは可変サイズにしておくと実際に使った分しか領域を取らないので大きくしておきます(デフォルト値は8GB)。

  • メモリ:1024MB
  • HDD:57GB
  • ビデオメモリ:16MB

f:id:boctok-ctpoba:20170422234941p:plain

f:id:boctok-ctpoba:20170422234952p:plain

f:id:boctok-ctpoba:20170422235003p:plain

f:id:boctok-ctpoba:20170422235026p:plain

f:id:boctok-ctpoba:20170422235013p:plain

f:id:boctok-ctpoba:20170422235037p:plain

設定が終わったらダウンロードしたisoファイルをストレージの光学ディスクに割り当てて起動できるようにします。

f:id:boctok-ctpoba:20170422235045p:plain

f:id:boctok-ctpoba:20170422235056p:plain

光学ディスクを仕込んだら起動

f:id:boctok-ctpoba:20170422235108p:plain

Ubuntu17.04のLiveCDが起動します。

f:id:boctok-ctpoba:20170422235117p:plain

f:id:boctok-ctpoba:20170422235124p:plain

言語を日本語にして「Ubuntuをインストール」を押下してインストール開始。

f:id:boctok-ctpoba:20170422235135p:plain

アップデートのダウンロード何かをしておくと便利だけど今回はお試しで時間短縮のためチェックはしません。

f:id:boctok-ctpoba:20170422235152p:plain

インストール先のパーティションパーティション構成もデフォルトのまま次へ。

f:id:boctok-ctpoba:20170422235224p:plain

f:id:boctok-ctpoba:20170422235238p:plain

インストールが裏で始まってますが、ここで地域の設定(タイムゾーン)を聞かれるので日本の場合はTokyoになります。

f:id:boctok-ctpoba:20170422235244p:plain

キーボードの設定と言語の設定を聞かれるので自分の環境に合わせて設定します。

f:id:boctok-ctpoba:20170422235253p:plain

管理ユーザのアカウントを作ります。 パスワードは文字数で以下のようになります。

長さ メッセージ
1~5 短いパスワード
6~7 弱いパスワード
8~9 まあまあのパスワード
10 良いパスワード
11以上 強いパスワード

ただし、同じ文字の連続の場合、8文字以上で「かんたんなパスワード」になります。

f:id:boctok-ctpoba:20170422235305p:plain

後はインストールが終わるまで待ちます。

f:id:boctok-ctpoba:20170422235312p:plain

後は再起動するとUbuntuが起動します。 実機と違ってDVDが取り出されないので(USBで起動した場合も同様ですが)再起動するときに光学ディスクから割り当てを除去しておきます。

f:id:boctok-ctpoba:20170423000426p:plain

明日は、実際に動かしてみます。

仕事効率化の追記

意外と知りたい人が多かったようなので、追加しておきます。

コマンドラインの再利用

コマンドラインはコマンドを打って実行するのですが、Windowsならbat,cmdファイル、(Powershellはあまり知りません) UNIX系ならばシェルファイルにしておいてこれを実行できる事は知ってる人は多いです。

それを再利用するためにどうしたらいいかを知らない人が意外にいました。

プログラムでもimportしたりすることで別に作ったモジュールの利用ができるようにバッチファイルやシェルファイルでもできます。

バッチファイルならcall バッチ,bash系なら. シェルファイル といった書き方で読み込めます。[c-shellはどうだったかな….]

エディタのマクロなどでも外部ファイルを読み込む仕組みがある物もあるのでそれを使って再利用する工夫をするとプログラミングでも何を共通化することで再利用しやすい作りを考える習慣が身につくと思います。

Excelドキュメント

業務上、なんでもExcel(個人的には嫌いですが)というところが多いです。

仕事なので使わざるを得ないこともありますが、マクロやVBAにするよりもJavaのPOIを使ったり、RubyならRubyXLなど(こちらは使った事ないですが)開発メンバーなら使える言語で作るという方法もあります。

このメリットは、VBAExcelにくっついてしまってるためソースがバイナリになります。 バージョン管理ツールを使ってもTortoiseSVNでセルの差分は見ることができますが、マクロやVBAは見ることができません。

ソース管理の上でもVBAよりメンテナンス性があると思います。(外部ファイルに展開してしまうと整合性の保証の問題が発生します)

また、VBAの場合はそのExcelを開く必要がありますが、Javaならjarを実行すればExcelを開かずに実行できます。 それに、JavaとかRubyはテストフレームワークもあるのでテストもできるし。

案件ごとに使う言語が違うにしてもその言語とVBAを知っている人でなく、その言語がわかれば作れたり直せたりするはずなので、そのVBAを作った人がいなくなって直せなくなったということもないかと思います。 VBAって、複雑になりがちなので。

最後に

業務上、どうしてもこっちのツールを使った方が(backlogとかRedmineでなくExcel管理表みたいに)と思う事や、こう作った方がもっとコーディング量減るのにとかがあってもそれに従わないといけないことも少なくありません。

だから、制限があってもできる範囲で工夫すると終電帰りから終電1時間前くらいまでの短縮にはなることもあります。

手作業よりは、ツールを使うことで早くなるし、ツールがなければあるもので作ると言うのは有効な手段です。 ミスも減りますしね。

作る時間はかかるけれども、使う時間は瞬時で終わるので、使いつづけるものを作ることは最終的には時間の短縮になります。

Ubuntu17.04がまだダウンロードできない

自宅に帰ってから寝るまでの間に少しずつ落としているUbuntu17.04ですが、現在1,125,570,789です。

残りおよそ400MBくらいなんですが、10MBPMくらいのペースです。

今日は日中ダウンロードして夜にはVMで試してみることくらいはしたいです。

作業効率化のためにしてること

普段作業をするときに、手間がかかるものを楽にするための仕組みはPCにはいくつかあります。

職場ではWindowsが多いのでGUIツールを使う手順がかかれていることが多いけども、コマンドプロンプトで処理する方が楽な場合もあります。 よくあるパターンは大量の単純作業

自宅にはWindowsがないので試せないですが…

(自宅PCはUbuntuです)

コマンドプロンプト

大量処理を繰り返して処理するためにはFOR文を使うと便利です。

for %variable in (<pattern>) do <command-line>
for /D %variable in (<pattern>) do <command-line>
for /R [[<drive-letter>:]<path>] %variable in (<pattern>) do <command-line>
for /L %variable in (<start>,<step>,<end>) do <command-line>
for /F ["<options>"] %variable in (<pattern>) do <command-line>

pattern のところにコマンドも使えるのでbashのようにコマンドの実行結果を元にコマンドを実行することもできます。

sqlの拡張子のファイルをpsql(Postgresql)に流して実行したい場合は

for /F %f in (dir /b *.sql) do psql -U postgres < %f

(バッチファイルの場合は%を%%にする)

bashならこんな感じです

for f in `ls -1 *.sql`; do
  psql -U postgres < ${f}
done

CREATE TABLE がテーブルごとにファイルに分かれている場合なんかには有効です。

(今やってるのは検証SQLにパラメータ追加して一気に流してログを取るといった作業です)

他にも、スタートアップにcopyやxcopyコマンドでバックアップをとるようなバッチを入れれば起動時に毎回バックアップがとれます。

よくやるのは、TortoiseSVNコマンドラインツールもインストールしておいて svn up を起動する度に実行して朝イチはソースが最新になるようにしてます。 今はドキュメントがメインですが。

エディタのマクロを使う

無料なのでサクラエディタを使うことが多いですが、秀丸エディタは変数や制御文が使えて便利です。

(現場ではサクラエディタなんですけどね)

ログファイルの余分なヘッダをカットするマクロを作ってたりします。

現物がないのですみません。

サクラエディタの場合は行数指定ができないので、1行選択か2行選択を必要回数記述して削除するように書きます。

サーバ接続にテラタームマクロを使う

サーバが大量にある場合に間違って接続するのを防止するためにもマクロを使ってそれをクリックするだけで接続するようにします。

テラタームマクロはinclude文が使えるので接続マクロに変数で指定するようにして接続情報をそれぞれのマクロに記述してincludeで呼び出すようにしています。

エディタやテラタームのマクロはそれほど複雑ではないので一度作ってみたらこんなに簡単にできると実感できると思います。

自宅では.bash_loginにVMのSNAPSHOTコマンド入れて