ほんじゃらねっと

ダイエット中プログラマのブログ

node.jsでリモートのLinux環境やデータベースの操作を自動化する

ぼくが仕事でLinuxサーバ環境に接続して行う操作というのはだいたい決まっていて、

  • コマンドでサーバの状態を確認
  • ログをファイル出力してダウンロード
  • サービスの設定変更と再起動
  • SSHトンネル経由でDBアクセス

のうちどれかを行うことが多い。

基本は手作業だったり、シェルスクリプトを作って

実行したりする形で対応できるものなのだけど、

結構めんどくさいので、

今回はnode.jsでどこまで自動化できるかを試してみたい。

続きを読む

エディタ浮気性の自分のための、Vimから他のエディタに乗り換えたくなった時にチェックするポイント

f:id:piro_suke:20160825232500j:plain

ライトな言語で開発する時とか、文章を書く時は

テキストエディタとしてVim(KaoriYaさんのWindows版Vim)を長く使用している。

www.kaoriya.net

根が浮気症なので

Spacemacs+EmacsとかSublimeTextとかAtomとかLightTableとか

話題になったエディタには

「これこそ俺が求めていたもの!」

と手を出して使ってみるのだけど、半年後には

「やっぱりVimだな」

ということでVimに戻ってしまう。

そんな感じで新しいエディタを使うのは楽しいのだけど、

使い方を学ぶのに結構時間を使うので、

時間を無駄にしないように、

この条件を満たさないエディタには手を出さない!(どうせVimに戻ってくるから!)

というルールを決めてみる。

続きを読む

Node.jsとGruntでフォルダ監視ツールを作る

f:id:piro_suke:20160414001322j:plain

コミュニケーションというのはなかなか難しいもので、

「急いで確認したいから資料ができたら共有フォルダに入れて、すぐ連絡してよ」

と強めに伝えても、

資料はとっくにできてるのに

やれ後で連絡するつもりだっただの、

もうちょっと確認してから連絡するつもりだっただの、

今メール書いてただので、

一本内線をくれるだけで良いのになかなか連絡がもらえないことがある。

そんなストレスフルな行き違いは

「このやろう!」と毎回怒りを爆発させるよりも

ツールを使って解決の仕組みを用意してしまうに限る。

ということで今回は指定したフォルダを監視して、

ファイルが追加されたり更新されたりしたら

自動で通知してくれるスクリプトをつくってみたい。

続きを読む

新人にはまずプログラムを「読む」スキルを身につけていただきたい

f:id:piro_suke:20160411005004j:plain

会社の新入社員研修の事を考えていてふと思いついた。

社内で何がしかの開発を行っている場合、

全員がプログラマになるわけではない場合でも

一通りプログラムの基礎を身につけておこう、と新人研修に

プログラミング研修が含まれていることがある。

そこでは「プログラムを"書く"スキルを身につける」ことを前提として

研修を行っているわけだが、

ここで視点を変えて

「プログラムを"読解する"スキルを身に着けて活用する」

という目的で研修内容を考えてみるのはどうか。

続きを読む

【Windows】フォルダ内のファイル名一覧を簡単に作成する方法

後輩に教えてあげたら喜ばれたので、

1つの作業効率化方法として書いておく。

資料を作成する際、特定のフォルダに入っているファイルの一覧を

Excelに貼り付けたりしたい場合がある。

しかし、エクスプローラではファイル一覧を見ることはできるが、

それをそのままコピーしてExcelやメモ帳に貼り付けることができない。

そんな時はWindowsに付属しているコマンドを使えば

簡単にファイル名一覧を作成することができる。

「dir」コマンドと「tree」コマンドを使ったファイル名一覧の

出力方法を紹介する。

続きを読む

正規表現を使ったエレガントな置換処理を学びつつ簡易なファイル名一括変換ツールを作る

文字列を検索したりマッチしたものを置換したり、という作業は

技術者が制作・開発する時だけでなく、例えばExcelやWordで文書を編集する際や

Webページ内で目的の文章を探したりする場合にも行うもので、

「作業の効率化」という点では欠かせないものだ。

今回扱う「正規表現」を使った検索・置換については、

標準の機能として備えているツールやテキストエディタも多いが、

プログラマ以外には馴染みの薄いものかもしれない。

(少なくとも私に面倒な変換作業を依頼してくる人たちは間違いなく知らないと思う)

「正規表現」を全く知らない人は、

このつまらなそうな言葉を見ただけでスルーしてしまいそうだが、

使いこなせば大変強力なものであり

プログラマ以外の

パソコンを使用して何かしらの仕事をしている人にとっても

作業効率が劇的に上がること間違いなしの技術なので、

ここで紹介しておきたい。

続きを読む

【Java】シンプルなデータベースマイグレーションツール「flyway」を導入する

f:id:piro_suke:20160307015935j:plain

新しいチームでデータベースマイグレーションの仕組みが決まっていなかったので、flywayを導入してみた。

結論としては手軽で十分使えそう。

データベースマイグレーションとは

本来のマイグレーションの意味とは異なるかもしれないが、

データベースマイグレーションが実際に意味するのは、

「プログラムのバージョンとデータベース構成のバージョンを合わせること」

だと捉えている。

例えば、

あるプロジェクトで仕様変更が発生して「商品マスタに分類6カラムを追加する」ということが必要な場合、 プログラム側が対応済みでもDBの商品マスタに分類6カラムが追加されていなければプログラムは動かない。 プログラムの変更と同時にデータベース構成が変更されるようにすることではじめて動作するようになる。

自分一人で開発している場合はローカルのデータベース構成を変更して、 初期設定用SQLにカラムを追加しておくだけで良いかもしれないが、 複数人で1つのシステムを開発していると他の誰かが知らないうちにカラムを追加して その情報を共有せずにその追加カラムを使用するプログラムだけをリポジトリに コミットしたりしていると、他のメンバーの環境では実行時にエラーが発生するようになり、 原因調査で時間を取られることになる。

こういったデータベース構成のバージョンが変わったことを共有する方法としては メールで送るとか資料で共有するとか色々あるが、 各開発者が意識しなくてもリポジトリの更新取得時やビルド時に自動で反映されるのが一番効率が良い。

そういった仕組みを実現するためのツールとして「データベースマイグレーションツール」があり、「Flyway」もその一種。

続きを読む

PythonでExcelの表からINSERT用SQLを生成して初期データ作成を楽にする

職場はメイン言語がJavaなので、プロジェクトでPythonを使う機会は ないのですが、キャプチャを撮ったりExcelを操作したりする作業を 「こっそり自動化」するスクリプトPythonで書いたりしています。

最近はSE作業で何かとExcelを使うことが多いので、 Excel作業の自動化をいろいろと模索しています。

PythonExcel操作できるライブラリはいくつかあって、 xlwingsExcelPythonなんかが話題になっていたので 調べてみたのですが、後々他のメンバーに作成した ファイルを共有したりすることを考えると、 Excelと切り離して処理が書ける方が良さそうです。 (xlwingsはVBAPythonを呼び出す必要があり、ExcelPythonはアドオンを入れる必要がある)

結局、オーソドックスなxlrdxlwtを使っています。

今日は以前から面倒だと思っていた、 初期データ作成用INSERT文を作成するスクリプト、 というか関数を作りました。 Windows環境で使うことを想定しています。

下記のような、1行目がテーブルのカラム名で、 2行目以降がデータになっているシートを読み込んで、 行ごとにINSERT文を作成して別ファイルに出力します。

ID NAME ADDRESS
1 山田 大阪府
2 岡田 東京都

出力先ファイルやテーブル名は引数で指定します。 複数のシートを一括処理可能です。

使用例:

output_insert_sqls('テストデータ.xlsx', 'C:/Users/test/Desktop/insert_data.sql', 
    [   
        '会員一覧' 
        ,'商品一覧' 
    ],  
    [   
        'users'
        ,'products'
    ]   
)

他にも、CREATE TABLE文やDELETE文を生成する関数を追加すれば、 色々と作業を楽にしていけそうです。

セルを処理している部分は文字列とfloatしか考慮しておらず、 荒めのコードになっているので、またブラッシュアップしていきます。

unicode_literalsは今回初めて使い、どういう原理か 全く分かっていませんが、とりあえずこれをインポートすることで Windowsのパスが正しく認識できるようになりました。

迷惑をかけないExcel

迷惑をかけないExcel

時間管理ができていないと感じたら、まず時間の使い方を正確に把握しよう

時間というのは大変価値の高いもので、誰であれ1日24時間と決まっており、 放っておいても失われていくものである。

ということを分かっていても、なんやかんやと忙しくしたりダラダラしたり しているうちに過ぎていくもので、 「ああ、もっとちゃんと時間を管理して先に進まないと...」 みたいなことを考えているうちに1週間が過ぎ、2週間が過ぎていく。

仕事をしている時間はまだしも、自分が自由に使える仕事以外の時間は 自由であるが故に浪費しやすいので、日曜の夜になってから、 「この週末は何してたんだ...」と後悔する事が私も多かった。

で、最近色々と時間管理の方法を調べたり考えたりしてみて、 重要なのは「無駄をなくして常に忙しく物事を前に進める」ということではなく、 「自分の理想どおりに時間を使う」ということだと気付いた。 他の6日をがんばって週に1日はダラダラ過ごそう、とか、1日1時間は漫画読もう、 とかいう時間の使い方も、それが楽しく過ごすために必要であればそれで良い。

よくないのは、自分が何にどれだけ時間を使っているのか、 自分の理想の時間の使い方がどうなのかを把握せず、 ぼんやりとした不安や罪悪感に苛まれて自由な時間を楽しみきれない、ということ。

なので、まずは自分がどう時間を使っているかを把握するために、 その日に何に時間を使ったかを記録する、ということを始めてみた。 GoogleカレンダーならスマホでもPCでも使えて、仕事用カレンダーと個人用カレンダーを 分けたり一緒に表示したりできるので、予定管理兼時間使用履歴として使っている。

この方法のいいところは、これから何に時間を使うかをあらかじめ予定として 入れておくことで、自由な時間も予定に基づいて行動できるようになること。 予定を入れることでその時間に名前が付き、その時間の目的ができる。

自分の理想の時間の使い方が見えてくる前からいきなり予定を 固めてしまうとしんどくなるので、最初はあくまで 「時間の使い方を記録して把握する」ということを目的としてスタートする。

始めて数ヶ月してからカレンダーを見返すと、自分の時間の使い方が とても明確になり、何を変えればいいかがはっきりしてくる。

エッセンシャル思考 最少の時間で成果を最大にする

エッセンシャル思考 最少の時間で成果を最大にする

Javascript(node.js)でExcelのシート一覧を出力する

node.jsはWindowsでもLinuxでも同じスクリプトが そこそこ安定して動くので嬉しい。

今回は、ExcelJSモジュールを使って、 Excelのシート一覧を出力するスクリプトを書いた。 リダイレクトでファイルに出力できる。 簡単なスクリプトだけど、こういうものを作っておくと必要な時にすぐ使えて便利。

output_excel_sheets.js

var Excel = require('exceljs');

var targetExcelPath = '<Excelファイルのパス>';

var workbook = new Excel.Workbook();
workbook.xlsx.readFile(targetExcelPath).then(function () {
    workbook.eachSheet(function (worksheet, sheetId) {
        console.log(worksheet.name);
    }); 
}); 

treeコマンドで出力したJSONをExcelで階層表示できるように変換する

あるプロジェクトのソース分析を行う必要があったので、

まずはソースファイルの一覧をExcelに出力してみることにした。

treeコマンドがいい感じで階層出力してくれるのだけど、

それをそのままExcelに持っていくと文字化けするので、

treeコマンドから一旦JSON形式で階層情報を出力し、

それをnodejsスクリプトで変換してcsvに出力する方法をとった。

treeコマンドで「-J」オプションを指定するとJSON形式で出力してくれる。

$ cd <プロジェクトディレクトリ>
$ tree -J > file_tree.json

こうやって出力したjsonを下記のスクリプトでCSVにコンバートする。

階層毎に列がインデントされるようにして、

Excel上で拡張子でフィルタリングできるようにファイルの拡張子を出力する。

filetree2csv.js

//treeから出力したJSONをrequireで読み込み
var fileTreeJson = require('./file_tree.json');
var path = require('path');

//カンマの繰り返し出力のためのfunctionをStringに追加
String.prototype.repeat = function (num) {
    for (var str = ''; (this.length * num) > str.length; str += this);
    return str;
};

var parseFileList = function (level, fileNo, fileList) {
    fileList.forEach(function (file) {
        if (file.type != 'report') {
            var line = ''; 
            var type = ''; 
            if (file.type == 'file') {
                fileNo += 1;
                line += fileNo;
                type = path.extname(file.name);
            } else {
                type = 'dir';
            }   
            line += ',' + type;
            line += ','.repeat(level) + file.name;
            console.log(line);
            if (file.type == 'directory') {
                fileNo = parseFileList(level + 1, fileNo, file.contents);
            }   
        }   
    }); 
    return fileNo;
};

parseFileList(0, 0, fileTreeJson);

これを、下記のコマンドで実行する。

$ node filetree2csv.js > file_tree.csv

出力されたCSVをExcelで開き、タイトル行や罫線を整えたら、

ファイル一覧資料として使える。

たくさんのサブフォルダに分かれて保存されている画像ファイルを1つのフォルダにまとめてコピーするスクリプト

過去にデジカメから取り込んだ写真や他の人から受け取った画像を Flickrなどのサービスにアップロードしたり、 ブログにアップロードしたりする際、 画像ファイルがサブフォルダにわかれたままだとアップロードしにくい場合がある。

そんな時に、画像を1つのフォルダにフラットにあつめてくれるスクリプト。

collect_files.groovy

@Grab(group='commons-io', module='commons-io', version='2.4')

import org.apache.commons.io.FileUtils
import groovy.io.FileType

def srcDirPath = '<元フォルダ>'
def destDirPath = '<コピー先フォルダ>'

def list = []

def dir = new File(srcDirPath)
dir.eachFileRecurse(FileType.FILES) { file ->
    list << file
}

list.each {
    FileUtils.copyFile(it, new File(destDirPath + '/' + it.name))
}

画像以外でもファイルならなんでも集めます。

Programming Groovy 2: Dynamic Productivity for the Java Developer (Pragmatic Programmers)

Programming Groovy 2: Dynamic Productivity for the Java Developer (Pragmatic Programmers)

GMailで特定の条件に合うメールのみ携帯に転送する

GMailのフィルタ機能はメールにラベルをつける以外にもいろいろできる。 条件に合うメールを既読にしたり、アーカイブしたり、 今回のようにメールアドレスを指定して転送したり。

正月休みに入るにあたり、重要なメールのみ携帯に 転送されるように設定したら良い具合だったので、 設定方法を記録しておく。

設定方法

設定画面の「フィルタ設定」を開く。

f:id:piro_suke:20160207221343p:plain

フィルタ設定画面下部の「フィルタを追加」ボタンクリック。

f:id:piro_suke:20160207221450p:plain

フィルタ作成ダイアログで条件を指定する。 送信元メールアドレスや含まれるキーワードで条件指定できる。

f:id:piro_suke:20160207221700p:plain

転送先メールアドレスを指定して転送設定。

f:id:piro_suke:20160207221726p:plain

色々活用できそう。

GMailで日報メール作成を簡略化する

会社でGoogle Appsが導入され、 メールもGMailを標準で使えるようになった。

ちょっと慣れてきたので最近見つけた、毎日の日報作成を楽にする 便利機能をまとめておく。

といっても使うのは 「連絡先グループ機能」と「定型文作成機能」の2つだけなのだけど。

連絡先グループ機能でグループ作成

GMailの連絡先機能には「グループ機能」というものがある。 グループを作成して、そこに対してメールアドレスを追加していくことで、 例えば「日報送信先」のようなグループを作成することができる。

連絡先は下記のようにアプリメニューから開くことができる。

f:id:piro_suke:20160207222226p:plain

左側の「新しいグループ...」をクリックする。

f:id:piro_suke:20160207222245p:plain

グループ名を決めて作成する。 f:id:piro_suke:20160207222258p:plain

最後に作成したグループにメールアドレスを追加していく。

f:id:piro_suke:20160207222314p:plain

これで、メールの送信先にグループ名を入力すると、 そのグループに含まれるアドレスがドバッと送信先として設定される。

返信定型文作成機能でフォーマットを登録しておく

定型文はメール作成画面で保存したり読み込んだりできる。 返信じゃなくても利用可能。

メール作成画面を開いて右下の矢印をクリックし、「返信定型文」メニューを開く。

f:id:piro_suke:20160207222336p:plain

定型文を登録するときは、まずメール作成画面に文面を入力してから 定型文を保存する。

定型文を読み込む時は保存した定型文を「挿入」メニューから選べば メール文面として挿入される。

簡単でした。

メールの超プロが教える Gmail仕事術

メールの超プロが教える Gmail仕事術