SI業界で脱トノサマSE

上流SI企業のSEがトノサマ商売を脱却するために技術を学ぶためのブログ

CSVファイルをマージするバッチファイル(Windows)

こんにちは。脱トノ(@DatsuTONOSAMA)です。
今日はちょっと短いですが、Windowsバッチについて。

業務でPGを書いているとよくあるのがCSVファイルの取り込み。
特にマスタ登録する際にはよく使われると思います。
また、そのマスタがユーザに設定してもらうものだったり、開発者がそれぞれで設定するものだったりすると、そのCSVファイルたちを一つにまとめたくなる時があります。
そんなときにこのバッチファイルを使うと便利ですね。

バッチの概要

まずはバッチファイルの中身です。

@echo off

chcp 65001

for /f %%a in ('dir /s /b /a-d *.csv')do (
for /f "tokens=* skip=1" %%b in (%%a) do (
echo %%b>>merge.csv
))

非常に単純で、バッチファイルが存在しているフォルダ配下にある.csvファイルを、1行目を無視してmerge.csvファイルにマージするものです。個別に処理の内容を見てみます。

1ブロック目:おまじない

@echo off

chcp等のコマンドがプロンプト上に出てこないようにしてます。

2ブロック目:文字コード変換

chcp 65001

今回のバッチファイルでは、取り込み対象のCSVファイルの文字コードUTF-8であることを想定しています。
Windowsコマンドプロンプトはデフォルトで文字コードSJISであるため、chcp 65001文字コードを設定し直しています。
ここで設定している65001はコードページ番号と呼ばれるもので、Microsoftの公式ページに他の文字コードに対応する番号も記載されています。
ちなみにデフォルトのSJIS932です。
Code Page Identifiers (Windows)

3ブロック目:メイン処理

for /f %%a in ('dir /s /b /a-d *.csv')do (
for /f "tokens=* skip=1" %%b in (%%a) do (
echo %%b>>merge.csv
))

for文がネストしています。それぞれのfor文では以下の処理を実施しています。

1つ目のfor文:for /f %%a in ('dir /s /b /a-d *.csv')do (

カレントパスより下に存在する.csvファイルごとに処理を実施しています。dir /s /b /a-d *.csvの処理結果を%%aで受取り、for文を回しています。
dirコマンドのオプションについては下記を参照するのがわかりやすいと思います。ここでは以下のオプションを指定しています。

www.k-tanaka.net

2つ目のfor文: for /f "tokens=* skip=1" %%b in (%%a) do (

ここがまさにCSVファイルを取り込んでいるところです。
上の階層から渡ってきたファイル名(%%a)の中身に対し、1行目をスキップして処理を実施しています。
なぜ1行目をスキップしたかというとヘッダ行が含まれていたから。不要な場合は"tokens=* skip=1"の記述を消してしまって問題ありません。

吐き出し処理

最後のecho %%b>>merge.csvがまさにファイルを吐き出しているところです。
該当したすべてのCSVファイルについて、1つのmerge.csvにまとめています。

なお、こちらをうまく書き換えてあげれば同じ名前ごとにマージ後のファイルを作成することもできます。
※今手元にWindowsの環境がないので、イメージで書きます。

echo %%b>>%%a_merged.csv






Excelテキストエディタを使ってももちろん良いのですが、繰り返し実行したりする可能性がある場合は手軽に実行できるようにしたいですね。世の中にはバッチ芸人なる職人技を持った人もいるみたいです(類義語:シェル職人)。
今まで私の周りにはあまりバッチファイルを作ろうとする人がいませんでしたが、単純な処理であればササッと作れてしまうので、広めていきたいです。

アイドルに裏切られたとか言ってるけどお前らそれAV女優が結婚しても同じこと言えんの?

こんにちは。脱トノ(@DatsuTONOSAMA)です。
今日は雑記です。

一昨日のAKB総選挙見ました?私は見てない(気付いてすらいなかった)ですが、何やら盛り上がってます。

www.huffingtonpost.jp

年に一度のアイドルグループ内で一番人気の(金を集められる)メンバーが誰かを競う大会の結果発表において、20位にランクインした方がその場で結婚宣言をするという事件が起こりました。
私自身は特に興味のないアイドルグループなのでへーそうなんだくらいで静観しておりましたが、Twitterなどでファンたちが怒り狂っているのを見かけました。
これについて思うところが少しあるので思いつくままに書きます。

誰が何を裏切ったのか

アイドルだって一人の女性であり、結婚という幸せを求めることは間違いじゃないと思います。 裏切りという言葉はgoo辞書によれば

味方を捨てて敵方についたり、約束・信義・期待に背いたりすること。

です。「約束」「信義」「期待」に背いてるんです。彼女は何に対して裏切ってしまったのか。思うに、

  • 恋愛禁止条例
  • 処女性
  • 今後の活躍

が破られた・失われたことが裏切りなのだろうと思います。
これについて、まあ「今後の活躍」が見られない、というのはわかる。私も特定のアイドルグループのファンなので彼女らの誰かが突然結婚すると言い出したら衝撃を受けます。「脱退・解散とかしちゃったらやだなぁ」という気持ちになります。

一方で、残りの2つは非常に独善的というか、ファン側の一方的な思いなんですよね。
アイドルの語源は「偶像」であり、結局のところ信仰の対象だったわけです。信仰対象が思っていた姿と違えば、信者からは失望され、場合によっては暴動が起きる。

我々が応援している彼女は処女である。処女であるべきである。だから結婚なんて許せない。裏切りである。

無茶苦茶言ってるようにも聞こえます。

お前らそれAV女優が結婚しても同じこと言えんの?

煽るつもりはなくなんとなくキャッチーなので。

今回の騒動は「アイドル」が結婚報告したから騒ぎになってるんですよね。
これがAV女優だったらもう少しお祝いムードが強いと思うんです。
AV女優は決して社会的イメージが良い職業ではないので、結婚という人並みの幸せをつかむことができたならファンの人たちは「おめでとう」になる。
一方で今回みたいな「アイドル」だと、「ふざけんな」「金返せ」「裏切りだ」といった罵詈雑言が聞こえてきます。
結局のところ、どのようなイメージで売っているかがポイントなのだと思います。

AV女優は決して清純派ではないし、やることはやっているので、結婚報告をされたら驚くし寂しさは感じるけれど祝福できる。
一方でアイドルは「私SEXなんて知りません☆(ゝω・)vキャピ」みたいな顔して売っているわけなので、そうじゃないことが露見した時点で「裏切り」「失望」になるわけです。

ただ上述の通り、私が応援しているアイドルグループの誰かが結婚したとしても裏切られたという感覚にはならないでしょう。むしろ幸せになって欲しいと願える。それは彼女らの「娘感」が強いから。
AKBグループの方々はどちらかというと「恋人感」が強いので、ファンの方々も怒り狂っているのでしょう。確かに「会いにいけるアイドル」だし、水着グラビアもよく出しているので、性的な目で見られやすい。
だからこそ裏切られた感覚なのかなと思います。

問題は報告した場所

個人的に今回問題だったのはTPOですね。結婚報告する場所ではなかった。
数ヶ月?かけて、ファンの人達が大金をかけて応援してきた中、その最後の結果発表のときに「 私、SEXしてまーす課金ゴチでーす」と言われたら祝福ムードにはならないですよね。
かつて紅白歌合戦で卒業宣言をした人もいましたね。あれもTPOがあってない。そういう人がAKBにはたくさんいるんですかね。

結論

処女厨は損

SVNしか知らなかった人が調べたGitの特徴

こんにちは。脱トノ(@DatsuTONOSAMA)です。
今日はバージョン管理ツールについてです。
私は今までバージョン管理ツールとして利用したことがあったのは

の2種類でした。特にSVNについては入社後初めて配属されたPJから直前のPJにおいてまで、ずっと利用してきました。
しかし、現在のPJではGitを利用しています。Gitと言うものを知ってから何度か使い方等について調べては見たのですが、いまいち頭に入ってこず、また仕事で使うこともなかったので敬遠していたのですが、いよいよ使い方を学ぶ必要が出てきたので、この場を借りて自分の理解とメモを残していこうと思います。

Gitについて

Gitの成り立ち

Wikipediaより引用

Git(ギット[2][3][4])は、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。Linuxカーネルソースコード管理に用いるためにリーナス・トーバルズによって開発され、それ以降ほかの多くのプロジェクトで採用されている。Linuxカーネルのような巨大プロジェクトにも対応できるように、動作速度に重点が置かれている。

動作速度に重点が置かれているというのが特徴のようですね。

リーナスは以下のような原則に基づいて設計を行っている。
CVSを「悪い見本」とする。設計上のことで確信が持てない場合は、CVSと逆の決断をする。リーナスは冗談めかして以下のように語っている。 “カーネルメンテナンスの最初の10年間、僕らは文字通りtarボールとパッチを使っていた。CVSよりもずっと優れたソース管理システムさ。僕は営利企業 (トランスメタ[32]) でCVSを7年間使わされたことで、CVSを強烈に憎むようになった。CVSを強烈に憎んでいると言う時には、このことも言っておかなくちゃいけないね。観衆の中にSVNSubversion)のユーザがいるなら、この場から去ったほうがいいかもしれない。僕がCVSを強烈に嫌悪しているということは、僕がSubversionが史上最大の無意味なプロジェクトであると思っていることも意味しているんだ。Subversionのしばらくのスローガンは‘ちゃんとCVSをやる’とかそんなものだったよね。そんなスローガンから始めたら、どこにも辿りつけないよ。CVSをちゃんとやるなんて不可能なのさ。”[

CVSSVN)が憎まれているというのが個人的にはツボでした。

Gitの特徴

GitはSVNと同じくバージョン管理ツールです。大きな違いは分散型リポジトリであるということ。SVN集中型リポジトリです。
私がGitについてよくわからないと思ったのがこの分散型リポジトリという言葉です。改めてこの言葉について調べてみました。

集中型リポジトリ

  • 一つのリポジトリに対して開発者がそれぞれアクセスし、チェックアウトやコミットをしていく。
  • コミットしたものはリポジトリに即反映される。

f:id:chika0321:20170618230403p:plain

分散型リポジトリ

f:id:chika0321:20170618230414p:plain

これだけではいまいちよくわからないですが、分散型リポジトリのメリットは以下であると私は理解しています。

  • リポジトリがローカルとリモートと2つあるので、開発者はローカルで好きに開発が可能(履歴管理が可能)で、必要なものだけをリモートリポジトリ(他の人と共有しているリポジトリ)にアップロードすることができる

SVNでもやろうと思えばできる気がしますが、SVNにおいてリポジトリが別になるとmergeとかのコマンドって使えないんですよね。
Gitの場合は一つのカタマリ(プロジェクト?)の中で複数のリポジトリが持てるので、「開発者がそれぞれ個人のリポジトリを持って、更にそれを集めてくるリポジトリがある」というのがポイントだと理解してます。

また、SVNと大きく異なるのはステージの概念だと個人的に思っています。
SVNを利用する際には、

  1. ファイルを作成
  2. ファイル管理に対象とする(addする)
  3. リポジトリにコミットする

の流れかと思いますが、Gitの場合、

  1. ファイルを作成
  2. ステージに追加(addする)
  3. ローカルリポジトリにコミットする
  4. リモートリポジトリにpushする

となります。ここで注目してほしいのが2.のところ。
SVNの場合はファイル管理に入れるかどうか(履歴はまだ見えない)だけですが、Gitの場合にはステージに追加した時点である種のファイル管理が始まっています。ステージに追加した時点で、リポジトリに追加したファイルの圧縮ファイルがリポジトリに追加されているためです。
ローカルにリポジトリを保持しているからこそですね。

GitHub

Gitについて調べていると必ず出てくるのがGitHubです。知っている人にとっては常識かもしれないですが、ド素人なりの理解を書いておきます。

wikipediaより引用

GitHub(ギットハブ)はソフトウェア開発プロジェクトのための共有ウェブサービスであり、Gitバージョン管理システムを使用する。 Ruby on RailsおよびErlangで記述されており、GitHub社によって保守されている。 主な開発者はChris Wanstrath、PJ Hyett、Tom Preston-Wernerである。 GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供している。

Gitで登場するリモートリポジトリのホスティングサービスであるという理解です。
様々なOSSの開発がGitHub上で行われており、新参でもかんたんにOSS開発に参加できる、ということを実現しているのがGitHub

基本は無料で利用できますが、その場合はリポジトリがPublicになります。企業などで導入する場合、有料アカウントを作成して、Privateにすることも可能です。

Gitの基本コマンド

まだあまり使用したことがないですが、基本的なコマンドを書いておきます。

ファイルの取得

  • clone
  • リモートにあるリポジトリをローカルに複製する。svn checkoutと同じイメージ。
  • pull
  • リモートリポジトリから更新分のソースコードを取得する。svn updateに相当する。
  • fetch
  • pullに似ているが、リポジトリから取得したソースコードを、ローカルのソースにマージしない。差分を逐一確認してからマージしたい場合などに利用する。

ファイルのアップロード

  • add
  • ステージに追加=インデックスに登録。svn addに相当する。コミットのたびに必要。
  • commit
  • コミットする。svn commit とほぼ同じ。
  • push
  • リモートリポジトリへローカルのソースコードを反映させる。subversionにはないコマンド。リモートリポジトリへのcommitのイメージ。

その他

  • git reset HEAD^
  • 直前のコミットをなかったことにし(履歴も取り消す) 直前のコミットでコミットされたファイルは、ファイル内容はそのままで作業ディレクトリに移動する

わかりにくかったところ

作業リポジトリの概念

SVNしか知らなかった私にとってはリポジトリが2つあるということが非常に分かりづらかったです。
またそれに付随して、自分が作業しているリポジトリがどこかということを意識しながら作業するということも若干の違和感でした。

コマンドラインでgitを操作する場合、以下のような作業イメージになります。

# originブランチをmasterブランチ(ローカル)に持ってくる
git checkout origin master
# hoge.javaをコミット
git add hoge.java
git commit hoge.java
# バグフィックス用のブランチを作成
git branch bugfix
# 作業用ブランチをbugfixに切り替える ・・・ ★1
git checkout bugfix
# hoge.javaを修正してコミット
git add hoge.java
git commit hoge.java
#メインブランチに切り替え ・・・ ★2
git checkout master

★1を実行すると、作業用のディレクトリの中身がbugfixディレクトリ用に切り替わります。このときにはディレクトリパスは変わらず、中身のファイルだけが変わります。
そして★2を実行すると、bugfixブランチで修正したhoge.javaの中身が戻り、masterブランチのものに戻ります。
つまり、作業ディレクトリが1つの状態で、ローカルリポジトリ内の複数のブランチを切り替えながら作業することとなります。

SVNの場合には作業ディレクトリをそれぞれチェックアウトして作業します。eclipseを使う際にもworkspaceをそれぞれ作成して作業します。これを一つのディレクトリで実施するイメージですね。
これのメリットは作業時にいちいちディレクトリ移動せずにすむということでしょうか。まだあまりメリットは理解できていないです。。
一方でデメリットとしてはどこで作業しているかを常に意識していないと作業ミスが発生しやすいということでしょうか。
SVNにはswitchコマンドがあり、上記のような作業もやることは可能ですが、SVNの場合にはネットワーク越しのチェックアウトとなるため時間がかかります。Gitの場合は上記コマンドはすべてローカルでの実行となるため、素早く作業ができるというのがポイントだと思います。




Gitは現在の開発現場では常識となっていると思います。ただ、私が今まで参画してきたようなウォーターホールですすめる基幹システム開発の現場などでは、SVNが現役で利用されています。
今後のことを考えると、やはりGitに慣れておくことがエンジニアとして生きていくためには必要不可欠だろうと感じています。

バッチファイルでクライアントPCのネットワーク設定を切り替える(Windows)

こんにちは。脱トノ(@DatsuTONOSAMA)です。
エンジニアらしくコードについて書きます。

導入

システムエンジニアではよくある話だと思うのですが、職場のPCで業務を行っている際、

  • インターネット環境
  • 開発環境

のネットワークが物理的に断絶していることがあります。
普段はインターネット環境でメールを書いたりGoogleで調べ物をしたりして、実際にコーディングしたりテストを実施したりする際にはLANケーブルを差し替えてプライベートなネットワークに切り替える必要があります。
セキュアな環境を保つ必要があるため必要なことだということはわかりますが、やはりセキュアさと利便性はトレードオフの関係にありますね。
※在るべき論で言えば、PC自体インターネット用と開発用とで分けろという話もありますが・・・

ということで作成したのが以下のバッチファイル。

@echo off

set IFNAME="開発環境"  
set IPADDR=aaa.aaa.aaa.aaa
set MASK=bbb.bbb.bbb.bbb  
set GW=ccc.ccc.ccc.ccc  
set DNS1=ddd.ddd.ddd.ddd
set DNS2=eee.eee.eee.eee  

netsh interface ipv4 set address name=%IFNAME% static %IPADDR% %MASK% %GW% 1  
netsh interface ipv4 set dnsservers name=%IFNAME% static %DNS1% primary validate=no  
netsh interface ipv4 set dnsservers name=%IFNAME% static %DNS2% index=2 validate=no  

ipconfig /all

pause

それぞれ解説してみます。

1ブロック目:おまじない

@echo off

set等のコマンドがプロンプト上に出てこないようにしてます。

2ブロック目:環境変数設定

set IFNAME="開発環境"  
set IPADDR=aaa.aaa.aaa.aaa  
set MASK=bbb.bbb.bbb.bbb  
set GW=ccc.ccc.ccc.ccc  
set DNS1=ddd.ddd.ddd.ddd
set DNS2=eee.eee.eee.eee  

ここは変数定義です。上から

です。
f:id:chika0321:20170617111220p:plainf:id:chika0321:20170617111225j:plain ここの値を変えれば他の人に配布したり別のプロジェクトで使いまわしたりも可能。

3ブロック目:切り替えコマンド(メイン処理)

次に

netsh interface ipv4 set address name=%IFNAME% static %IPADDR% %MASK% %GW% 1  
netsh interface ipv4 set dnsservers name=%IFNAME% static %DNS1% primary validate=no  
netsh interface ipv4 set dnsservers name=%IFNAME% static %DNS2% index=2 validate=no  

ですが、上から

となっています。コマンドの詳細については以下のサイトが詳しいです。 www.atmarkit.co.jp

netshコマンドは、Windows XPWindows Server 2003以降のOSで利用できるネットワーク制御用のコマンドである。多くのサブコマンドがあるが、TCP/IP関連のパラメータは、interfaceコンテキストの中にある、ip(もしくはipv4)サブコンテキストで設定する。Windows Vista以降のOSではipコンテキストはipv4コンテキストと同じである。

netshというアプリケーションがあるみたいですね。その中のinterface ipv4コンテキストの中でIPアドレスやら何やらを設定する、というコマンドになっています。

ちなみに、現在の設定値を確認するなら

netsh interface ip show config

コマンドプロンプト上で入力します。

4ブロック目:確認

最後。

ipconfig /all

pause

設定した内容の確認です。ipconfig /allでネットワーク設定を表示してます。pauseは、バッチ実行した際に処理終了と同時にコマンドプロンプトのウィンドウが閉じてしまうことを防いでいます。

おまけ:DHCPを利用するなら

上記は固定IPへの変更でしたが、DHCP設定に戻すことももちろん可能です。その時は以下のようなバッチファイルを利用しています。

@echo off

set IFNAME="インターネット環境"  

netsh interface ipv4 set address name=%IFNAME% source=dhcp  
netsh interface ipv4 set dnsservers name=%IFNAME%  source=dhcp

ipconfig /all

pause

ブログ執筆2日目の執筆環境(Mac)

こんにちは。脱トノ(@DatsuTONOSAMA)です。
そんなわけで第二回目の記事。
ブログ執筆環境について書いてみようと思います。

端末

まずはメインとなるPC。というかまだここからしか書いたことがないですが。

MacBook Air (13-inch, Early 2014)

社会人2年目に購入したもの。
当時はiMacがメイン機でしたが、流石にそんなにパワーもいらない&ノート便利ってことで衝動買しました。確かカスタマイズもしてたはず。

  • メモリ8GB
  • 500GB SSD

500GBではちょっと心もとなかったので下記のSDカードを購入して挿しっぱなしにしてます。ついでにDropboxのホームもここにしてる。

nasimeyablog.com

Dropboxの設定は(たしか)こちらを参考にしました。
daily-mind.com

アプリケーション

諸先輩方のブログやTwitterを拝見するといろんなアプリがあるみたいですね。
私は形から入りたいタイプなのでついつい散財してしまいそうですが(笑)
とりあえずはエディタだけこだわってみました。

MacDown

AppStoreにはないので開発元から直接仕入れました。
Markdown記法でブログを書く際にはかなり便利とのことで導入。 yuu.1000quu.com

開発元はこち
macdown.uranusjr.com

実際に使ってみての感想。

  1. 書いたものがリアルタイムにプレビューされるのでとてもわかりやすい

    f:id:chika0321:20170617021845p:plain

    こんな感じで左に書いたものが右でブラウザで見ているようにプレビューされる。
    はてなブログの標準エディタだといちいちプレビューボタンを押さなくちゃいけなかったからそれと比べるとかなり便利

  2. Markdown記法のショートカットが充実してるので便利

    f:id:chika0321:20170617021840p:plain

    よくあるボールド体のショートカット(⌘B)のみならず、プログラムコードを書く際のショートカットキーまで用意されている。とっても便利。

まだ2つ目の記事ですがこのエディタには長くお世話になる気がします。

Slack

ブログを始めることを決心してから、書きたいネタを個人用Slackの中に書き溜めています。
Slackとはエンジニア向けのチャットツールのようなもので、基本無料。拡張機能を使いたい場合は課金が必要です。

slack.com

最近流行りのエンジニアツールですが、私のいる会社ではこういうツールって流行りづらいんですよね。
なので最近まで殆ど使ったことがなかったのですが、今の部署に異動してきてから、どうもここはうちの会社らしからぬイマドキのツールをガンガン導入している部署のようで、Slackも当然のように利用されていました。
そんなわけで早速プライベートにも導入してみたという感じです。

Slackについては書きたいこと色々あるのでここではこれくらいにして、また別の機会に書きたいと思います。



ブログ執筆2日目から執筆環境について書いてみました。 このブログが三日坊主で終わらなければ、1ヶ月、半年、1年くらいでまた環境が変わっていることでしょう。

はじめに

はじめまして。脱トノです。ブログを始めてみました。
このブログの目的はブログタイトルの通りで

  • トノサマSEを脱却したい
    • 大手SIerのSEって技術力ない人多いよね
    • そのくせ偉そうだよね
    • 技術力的な意味で尊敬できない先輩とか上司って多いよね
    • おなじになりたくない
    • 実際にするかどうかは置いておいて、いつでも転職できるようにしておきたい

です。とにかく技術力を高める&勉強のモチベーションを保つという意味でこのブログを開設してみました。
影響を受けたのはこの辺のブログ
最短でエンジニアになれる最強ツール「技術ブログ」とは? | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

あとは、そもそも私はアウトプットすることが非常に苦手なので、その練習も兼ねています。

とは言え現状、それほど技術力が高いわけでもない私。かんたんに経歴を。

  • 大学/大学院
    • 自然科学系の学科/研究室卒
    • プログラミングは講義でCをちょっと、あとは研究でfortranJavaperlをちょろっと触った程度
  • 社会人
    • 大手SIerに新卒入社
    • 2017年4月で5年目突入
    • 新人研修でJavaをちょろっと
    • 配属後はJavabashをちょろっと
      • Excelはマクロより関数でゴリゴリ派
    • 4年間いわゆる基幹システムの要件定義〜運用を経験
    • 現在はうちの会社ではちょっと異例な部署でデータ分析基盤の維持とか
  • その他

個人を特定できない程度に(笑)、書き出してみました。
他にあればおいおい記載していきます。

直近、UdemyでGitの勉強中なのでそのあたりの記事からかければいいかなと思います。