早くなんとかしないと…

社会人としてもシステムエンジニアとしても駄目になってしまう…

『ヘルシープログラマ』感想と自分の健康の振り返り

『ヘルシープログラマ』を読み終えました。

www.oreilly.co.jp


なぜ読んだのか

そもそも、私が「健康を意識しないとまずい」と思ったきっかけは、入社2年目の健康診断の結果でした。
高校生の頃から横ばいだった体重が、働き始めて1年で3.8kg減ったんです。

入社1年目→2年目→3年目
体重:→-3.8kg→-0.5kg
BMI:21.3→19.7→19.5
腹囲:→-1.2cm→-1.8cm

思い返せば、就職してからの1年は帰りが遅くなりがちで、晩御飯を食べない日が多かった。
「仕事にかまけて、健康をおざなりにしたら、いつか絶対ガタがくる」
それから私は、健康に気を遣うようになりました。

その1年後、『ヘルシープログラマ』という単語を知りました。
オープンセミナー2016@広島でのLTでした。
オープンセミナー2016@広島プレゼン資料

さらに1年後、↓の記事を読みました。
体型を支える技術 ──35歳になっても現役で戦い続けるプログラマの体づくり - エンジニアHub|若手Webエンジニアのキャリアを考える!

「最近は体重が増え始めたし、今一度、自分の健康を見直した方がいいかもしれない」

送料無料のための調整も兼ねて、購入することにしました。


感想

大好きなプログラミングをずっと続けたいよね?じゃあこういう生活習慣を身につけよう?プログラミングできる健康状態を末永く維持していこうね!っていうスタンスで書かれていました。
「○週間で○kg痩せる!」みたいな俗っぽい内容はないです。

同じように長く椅子に座っているであろうデスクワーカーでも実践したい内容だと思います。
ただ、プログラマがターゲットなので、アジャイルとかユニットテストとか、そういうプログラマなら知ってる単語で書いている箇所はあります。

短期間で効果のある方法はないんだなあとつくづく思わされたので、生活習慣としてひとつずつ身につけて続けていきたいなあと思いました。

カイゼンしたいと思ったこと

十分な睡眠(9.3章)

放送した内容・リスクチェック結果|睡眠負債が危ない|NHKスペシャル
NHKスペシャルの睡眠負債を見た後、カイゼンしようと7時間睡眠を数週間は続けました。
…が、結局また5時間睡眠に戻ってしまいました。
7時間睡眠の方が日中の眠さもあまりなくて良かったんですけどね。
なんで続かないのかなあ…。

栄養バランス(4.2章)

肉が好き、野菜・魚が嫌いなので、意識しないと偏るんですよね…。

試してみたこと

エクササイズ(6.3章)

表6-1の例で試してみたところ、20分/日くらいでできるかなあという感じでした。
寝る前にやると、翌日背中と足に結構きた…。

椅子の高さの調整(6.4章)

職場と自室の椅子を、お尻と膝が同じ高さになるように調整しました。

すでにやってたこと

健康のためのゲームプレイ(8.4章)

休日は大体ダンエボとかDDRとかやってます。
2年目→3年目で腹囲が減ったのたぶんこの影響だと思う。
# このタイミングでハマって休日プレーヤーと化したので、推測

水分補給(5.3章)

ここまで厳密ではないけど、意識はしてる。
水分補給が、大学生の頃は午後の紅茶茶葉2倍、就職直後は無糖ブラックコーヒー、ここ最近はただの水になったから、カイゼンしてると思いたい。


本には書かれていなかったけど

カイゼンしたいこと

腸内環境のカイゼン

食物繊維が足りてないんですかね…。

猫背のカイゼン

小学生の頃から言われ続けている筋金入りの猫背です。
直した方がいいんだろうと思いつつ、何したらいいやらって感じです…。

やっていること

目薬

ドライアイ対策。
ロート Cキューブ® m | ロート製薬: 商品情報サイト
↑この目薬を愛用してます。

ブルーライトカット眼鏡

就職してからブルーライトカット眼鏡を購入して、使っています。
あまり効果の実感はないけど…。

歯科検診

3か月に1回、定期歯科検診を受けています。

歯の話は過去に詳細を書きました↓
dosomething.hatenablog.com



あと整体ってどうなんだろうなあ。
良かったって言ってる人もいれば、悪化したって言ってる人もいて、(´ε`;)ウーン…

GIMPのスクリプトをPythonでつくる(Python-Fu)

dosomething.hatenablog.com

・ACゲームにハマった
社会人2年目からとあるACゲームにハマっている。これが身体を動かすゲームで、運動不足解消になっている。身体を動かして汗をかくの楽しい。

※ACゲーム=ダンエボ

公式アプリで投稿せずに、リザルト画像をスクリーンショットで残すと、余計な枠がついてしまうため、いつもGIMPで手作業で切り抜いていました。

この切り抜き作業をPython-Fuでスクリプト化してみた、備忘録です。

ググったところ、GIMPスクリプト作成で利用できるのは、「Script-Fu」と「Python-Fu」の2つ。
私が選んだのは「Python-Fu」。
Python、自動化に興味があって、やってみたかったんです。
これは良い機会だなあと。

Pythonの開発環境構築にあたっては、下記の記事にお世話になりました。
Python を使用して GIMP 用のプラグインを作成する

Python用のEclipseは、下記のサイトからダウンロードしました。
Eclipse 日本語化 | MergeDoc Project
Pythonを選んでダウンロードすれば、PyDevプラグインがデフォルトでインストールされています。
日本語化もされてます。
ダウンロードすれば、すぐにPythonのコードが書けます。便利。

Python-Fuの書き方や罠については、下記の記事が参考になりました。
PythonでGIMPのスクリプトを書く(Python-Fuの書き方) | d.sunnyone.org
imageとlayerの引数を書き忘れていたせいで動かなかったことに気づいたし、雛形が完成されてる。

そういえば、これは罠なのだろうか。
コメントを入れたら、スクリプトGIMPに認識されなかった。
そういう仕様なのだろうか?よく分からない。
# GitHub公開用にコメント入れたら、メニュー項目から消えてしまった

ということで、今回つくったPython-Fuはこちら↓

これを使えば、ワンクリックで切り抜くことができます。

こんな感じの、ラクするためのプログラミングにも、もっと取り組みたい。

JavaでJSON

JavaJSONを扱うことになりそう、とのことで事前学習。


JSONとは?

JSON (JavaScript Object Notation)は、軽量のデータ交換フォーマットです。

JSON http://www.json.org/json-ja.html より
日本語だと、上記URLが一次情報?


JavaJSON

外部ライブラリを使わずに、JavaJSONを扱おうとすると、下記URLの実装になるみたいです。
Java SEの標準APIだけでJSONを扱うサンプル(JDK 1.6以降、1.8も対応) - ぐーたら書房


Javaで利用されているJSONの外部ライブラリ

下記2つが主に利用されていそう。

Jackson

JacksonはJava7以上で利用可能っぽいです。
(Java6だとObjectMapperクラスを呼び出した時点で落ちました。)

一時情報として見るべきWikiは下記URL?
JacksonHome - FasterXML Wiki

Jacksonを利用するに当たって、下記URLを参考にしました。
Jacksonの便利な使い方 [初心者向け] - Qiita
Java Jacksonの基本的な使い方 | 酒と涙とRubyとRailsと

今回動作確認で作成したPOJOは下記Userクラス。

public class User {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

…で動作確認はこんな感じでやりました。

public class JacksonSample {
    private static ObjectMapper om = new ObjectMapper();

    public static void main(String[] args) throws Exception {
        // POJO→JSON
        User user1 = new User();
        user1.setId(1);
        user1.setName("HAL");
        String json1 = om.writeValueAsString(user1);
        System.out.println(json1);

        // JSON→POJO
        String json2 = "{\"id\":\"2\", \"name\":\"PET\"}";
        User user2 = om.readValue(json2, User.class);
        System.out.println("id:" + user2.getId());
        System.out.println("name:" + user2.getName());
    }
}
Jsonic

先にJsonicの動作確認コードをば。

public class JsonicSample {
    public static void main(String[] args) {
        // POJO→JSON
        User user1 = new User();
        user1.setId(1);
        user1.setName("HAL");
        String json1 = JSON.encode(user1);
        System.out.println(json1);

        // JSON→POJO
        String json2 = "{\"id\":\"2\", \"name\":\"PET\"}";
        User user2 = JSON.decode(json2, User.class);
        System.out.println("id:" + user2.getId());
        System.out.println("name:" + user2.getName());
    }
}

JsonicはJava6以上で利用可能です。

Jsonicの一次情報は下記URL。
http://jsonic.osdn.jp/

Jsonic、こんな感じでも使えるよ~ということで、参考になりそうなURLは下記。
Java JSONICでjsonな文字列をオブジェクトに直接デコード - Symfoware
jsonicのlistだけを持つクラスを使いたくない場合 - だましだまし


一次情報をチェックすることを心がけようとしているのですが、やはり英語が多い…。
英語が読めないと厳しいなあと思う、今日この頃…。

あとググる前にダウンロードファイル確認しよう。
Sampleちゃんと入ってたの、あとから気づいた…。



↓↓↓2017/07/30 追記
Javaで利用されているJSONの外部ライブラリとしてもうひとつ、Googleが提供しているGsonを見つけたので、試してみました。

Gsonの一次情報は下記URL。
GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back

動作確認のコードは下記。

public class GsonSample {
    public static void main(String[] args) {
        // POJO→JSON
        User user1 = new User();
        user1.setId(1);
        user1.setName("HAL");
        Gson gson = new Gson();
        String json1 = gson.toJson(user1);
        System.out.println(json1);

        // JSON→POJO
        String json2 = "{\"id\":\"2\", \"name\":\"PET\"}";
        User user2 = gson.fromJson(json2, User.class);
        System.out.println("id:" + user2.getId());
        System.out.println("name:" + user2.getName());
    }
}

上記のコードを書くにあたって、UserGuideのObject Examplesを参考にしました。
gson/UserGuide.md at master · google/gson · GitHub


基本の使い方は、ほぼほぼ同じみたいですね。

はじめてのGitHub

"Write Code Every Day"をやってみたい!
いい機会だから、GitHubも始めてみよう!ってことで、昨夜から作業を始めて、今日のお昼ぐらいに初pushできました。
ここまでの備忘録をまとめておきます。



作業

  • 作業日:2017/07/08-2017/07/09
  • OS:Windows8.1(64bit)

手順

  1. GitHubのアカウントをつくる
  2. Git for Windowsのダウンロードとインストー
  3. Git for Windowsの設定
  4. GitHubリポジトリを作る
  5. ローカル環境にリポジトリを作る
  6. ローカルリポジトリにcommitする
  7. リモートリポジトリにpushする

1.GitHubのアカウントをつくる

github.com

Step1:ユーザー名、メールアドレス、パスワードを入力する。
Step2:プランを選ぶ。私はFreeを選びました。
Step3:飛ばしました。(アンケートだったと思います)

Step1で入力したメールアドレスにメールが届きます。
メール内の"Verify email address"をクリック。
# 私はここでログインを求められました。(ブラウザを跨いで作業していたため)
タイトルが"Welcome to GitHub!"の、メールが届けば登録完了です。


2.Git for Windowsのダウンロードとインストー

3.Git for Windowsの設定

私家版 Git For Windowsのインストール手順 | OPC Diary
上記のURLの手順に倣って作業しました。
以下は補足になります。

Git for Windowsのダウンロードとインストー
  • ダウンロードしたバージョン:2.13.2
  • デフォルト設定のままインストールしました。
グローバルの設定
SSHキーの作成

補足はありません。手順通りに作業しました。

posh-gitのインストー

"Windows PowerShell"を右クリック > 「管理者として実行」をクリック
…で手順通りに作業しました。

しかし、

インストール後の説明通り、プロファイルをリロードします。

これだけがよくわからず、何もしていません。
# インストール後の説明が異なっていました。

エディタの設定

秀丸に設定しました。

git for windowsで秀丸を使ってコミットメッセージを編集したい | GENDOSU@NET
上記のURLを参考に、秀丸に設定しました。

editor = 'C:/Program Files (x86)/Hidemaru/Hidemaru.exe' //fu8

以下、失敗談。
コマンド叩いていけるかなあと思って試したものの、秀丸が起動せず。
試行錯誤中に叩いたコマンドが2つ通ったせいで、2つ設定されてました。

$ git config --global core.editor "C:\Program Files (x86)\Hidemaru\Hidemaru.exe"
$ git config --global core.editor \"'C:/Program Files \(x86\)/Hidemaru/Hidemaru.exe' /fu8\"
$ git config -l
core.editor=C:\Program Files (x86)\Hidemaru\Hidemaru.exe
core.editor="C:/Program Files \(x86\)/Hidemaru/Hidemaru.exe

gitコマンド及びls等UNIXコマンドでの文字化け対策

コマンドプロンプト」を右クリック > 「管理者として実行」をクリック
…で手順通りに作業しました。

「コントロールパネル」 > 「システムの詳細設定」 > 「環境変数
…のユーザー環境変数に追加されてました。
コマンド嫌いなら、ここから設定しても大丈夫だと思います。

# 蛇足。あれこれググってる最中に見つけたんですが、GitHub for Windowsもあるようなので、コマンドが嫌ならこちらの方がいいのかも?

Visual Studio Codeをdiff toolとして設定する
シンボリックリンクのためのWindows側の設定他
Git Credential Manager(GCM)のインストー

作業していません。
# 先にpushまでいきたかった


4.GitHubリポジトリを作る

5.ローカル環境にリポジトリを作る

6.ローカルリポジトリにcommitする

javaで正規表現 その後の話

とあるコードが数字→英数字になる仕様変更に取り組んだ、その後の話。

数字の頃にNGにしていたコードは、従来通りNGにしてくださいという仕様変更が発生。

…でレビューと試験が依頼されたわけだけども、上がってきたコードを見て頭を抱えた。
もとの仕様を満たした場合のif条件の中に、さらにif条件が追加されていた。

…モヤモヤしたので、自分で書いてみた。

public static boolean isTargetCode(String strCode)
{
	if (!strCode.matches("^[0-9a-zA-Z]{3}$"))
	{
		return false;

	}

	int intCode = 0;

	try {
		intCode = Integer.parseInt(strCode);

	} catch (NumberFormatException nfe) {
		// 英字交じりの場合
		return true;

	}

	return intCode > 0 && intCode <= 500;
}

「プログラミング生放送勉強会 第47回@サイボウズ 株式会社 松山オフィス」に参加してきました

2017年6月17日に、「プログラミング生放送勉強会 第47回@サイボウズ株式会社 松山オフィス」に参加してきました。
第34回以来、2回目の参加。


6/17 プログラミング生放送勉強会 第47回@サイボウズ株式会社 松山オフィス 開催! – プログラミング生放送

【自分用まとめ】プログラミング生放送勉強会第47回@サイボウズ株式会社松山オフィス - Togetterまとめ


今回の会場は、4/3に移転したサイボウズ株式会社松山オフィス。
話題のkintoneポスター4枚が、出迎えてくれました。

受付。
サイボウズ飴があったので、頂きました。
サイボウズノートは品切れでした。残念。
# あとで存在を知った

受付を済ませて、中へ。
以前にも増して、おしゃれになってました。
でも、天井はコンクリむき出しで、ラボっぽいなあ、なんて。
いろんなタイプのテーブルとイスがあって、選べていいですね~
座敷エリアには、人をダメにするクッションもありました。


勉強会冒頭、プロ生ちゃんTシャツ希望者プレゼントがあり、Sサイズを頂きました。
あと、今回の名札、勉強会の名札とは思えないほど、ポップでした!
f:id:PET_HAL:20170701213933j:plain
プロ生ちゃんマジ天使!


さて、勉強会のセッションとLTについて。

ASP.NET、Docker、AWS、three.js、Microsoft Flow、GitHub、Kotlin、VizCommand、にゃーん…どれも使ったことのないもので、話についていくのがやっとでした。
自分が、モダンとかけ離れたところに居ることを痛感します。
そのギャップに気づかせてくれる勉強会が、愛媛で毎年開催されていることがありがたい。

あと、プロ生はLT希望者が多くて素晴らしいです。
熱く語っていたり、試行錯誤したんだなと思えることが語られたり、とても良い刺激を受けました。
私も、気になったものをやってみることから始めよう。

数日後、ホッテントリチェックしていたら、今回の勉強会で知った、AWS Lambdaが苦手なことと、モブプログラミングを見かけて、思わず( ^ω^)おっ

はてなブックマーク - なぜAWS LambdaとRDBMSの相性が悪いかを簡単に説明する - Sweet Escape


以上、勉強会参加しました初記事でした。

スタッフの皆様、登壇者の皆様、お疲れ様でした。
この場に参加できたことに、感謝。
ありがとうございました。

はじめてのVBA

ExcelVBAと格闘した時の、備忘録。

ミッションは、CSVが出力できる、Excelを作ること。

・はじめてのVBA
・本開発までの暫定対応

品質
・改修想定なし
・問題なく動く(想定通りに使った場合に限る)

構成
シート1:説明書シート。コピペボタン・CSV出力ボタンをつける
シート2:CSV出力元シート(シート3の入力値をコピペする)。セルの書式を設定する。
シート3:ユーザが入力するシート。プルダウンを作る。



Excel
仕様上、月日は0埋め。

月日が1桁の時も日付の先頭を揃えたい
(ググったワード:"excel 日付 0埋め")

セルを右クリック > 「セルの書式設定」を選択
「表示形式」タブ > 「分類」から「ユーザー定義」を選択

パターン1
「種類」yyyy/mm/dd > 「OK」をクリック
例)セルの入力値→"2017/7/1"
表示 →"2017/07/01"

パターン2
「種類」yyyymmdd > 「OK」をクリック
例)セルの入力値→"2017/7/1"
表示 →"20170701"


複数の候補から選択する項目。
項目によって、数字が全角だったり半角だったり…。
入力よりも、選ばせた方がよさそう。
そうだ、プルダウンを作ろう。

3ステップ!Excelでプルダウンリストを作成する方法|エクセルハック
(ググったワード:"excel プルダウン")

「データ」タブ > 「データの入力規則」をクリック > 「データの入力規則」を選択
「設定」タブ > 「リスト」を選択 > 「ドロップダウン リストから選択する」にチェックを入れる > 「元の値」に候補を","区切りで入力 > 「OK」をクリック



VBA
まずは、メインのCSV出力を作る。

EXCELからCSVファイルの出力方法について - Excel(エクセル) 締切済 | 教えて!goo
(ググったワード:"エクセル csv 出力 ボタン")

回答No.5のコードを参考にさせていただく。
マクロ実行でCSVが出力されることは確認できた。

これをベースにどんどん仕様を盛り込んでいく。


次に、ファイル名に設定する今日の日付の取得。


VBAで今日の日付をyyyymmdd形式で取得する-Date・Format関数:エクセルマクロ・Excel VBAの使い方-VBA関数 http://www.relief.jp/itnote/archives/excel-vba-today-yyyymmdd.php
(ググったワード:"エクセル マクロ 日付取得")


最後に、シートの入力値のコピペ。

エクセルVBA 別シートの複数のセルの値をコピーする方法 - Excel(エクセル) 解決済 | 教えて!goo
(ググったワード:"エクセル マクロ シート コピー 範囲 指定")


入力されたセルだけをコピペ範囲にしたい。

No.8 ワークシートの最終行、最終列を取得する
(ググったワード:"マクロ 最大行")


マクロ実行用のボタンをつける。

Excel マクロ実行ボタンを作ろう~やさしいマクロ講座
(ググったワード:"マクロ ボタン")

操作の説明を書いて、Excel完成。


ところが、処理にやたら時間がかかる。
処理速度の改善へ。

Office TANAKA - Excel VBA高速化テクニック[無駄な表示を止める]
Office TANAKA - Excel VBA高速化テクニック[名前で呼ぶな]
Office TANAKA - Excel VBA高速化テクニック[セルの指定方法]
Office TANAKA - Excel VBA高速化テクニック[セルを配列に入れる]
(ググったワード:"マクロ 処理 高速化")


…で、最終的にできたマクロがこんな感じ、だったような。

Sub copyInputValue()
 Dim sh2 As Worksheet
 Dim sh3 As Worksheet
 Dim tmp As Variant
 Application.ScreenUpdating = False
 Set sh2 = Worksheets(2)
 Set sh3 = Worksheets(3)
 maxRow = sh3.Cells(Rows.Count, 1).End(xlUp).Row
 maxCol = sh3.Cells(1, Columns.Count).End(xlToLeft).Column
 tmp = sh3.Range(sh3.Cells(2, 1), sh3.Cells(maxRow, maxCol))
 sh2.Range(sh2.Cells(2, 1), sh2.Cells(maxRow, maxCol)) = tmp
 Application.ScreenUpdating = True
 End Sub

Sub outputCsv()
 Application.DisplayAlerts = False
 Application.ScreenUpdating = False
 main_f = ActiveWindow.Caption
 out_pass = ActiveWorkbook.Path & "\"
 Sheets(2).Select
 Sheets(2).Copy
 ActiveWorkbook.SaveAs Filename:= _
 out_pass & Format(Date, "yyyymmdd") & ".csv", _
 FileFormat:= xlCSV, CreateBackup:= False
 ActiveWindow.Close
 Application.ScreenUpdating = True
 Application.DisplayAlerts = True
 End Sub

もうひとつマクロ作ってたような気がするけど、忘れた。