「まんがでわかる自律神経の整え方」を読んだ

最近、自分にとって向いていないことを仕事でやることが多くなりました。
気持ち自体は前向きに頑張って行こうと思っているのですが、
喉のつまりを感じたり心臓がバクバクしたりすることが増えました。
こういった症状を解消したいと思い軽くググったところ 「自律神経の乱れ」が原因だということが分かりました。
ということで基礎知識を得るために「まんがでわかる自律神経の整え方」を読みました。

漫画形式になっているので、必要な基礎知識と普段の生活でどのようなことに気をつければ良いのかが、すぐに分かるようになっていました。
季節の変わり目などにも自律神経の不調が起こるということなので、最近の自分の不調の要因は単にそれだけのような気がしないでもないです。

読書メモ

自律神経について

自律神経とは、神経系自体が制御する神経のこと。血液や呼吸、代謝や体温調整などを24時間休みなくコントロールしている。

自律神経の乱れは以下のような原因がある。

  • 過度なストレス
  • 不規則な生活
  • 食生活の乱れ
  • 運動不足
  • 睡眠不足
  • 喫煙や深酒
  • 季節の変わり目
  • 気圧の変化

自律神経は、「交感神経」と「副交感神経」に分けられる。
交感神経は車でいうところのアクセル、副交感神経はブレーキにあたる。
体内時計に合わせて生活することが、自律神経を整える第一歩。

腸について

腸はとても精神的な影響を受けやすい。プレッシャーを受けるとお腹が痛くなるなど。
腸内環境を整えると自律神経やメンタルも安定する。

日々やると良いこと

  • 緊張や怒りをコントロールしたいときは、手のひらをゆっくりと広げる。日常でもペンをもつ時など親指の力を抜くことを意識する。
  • 水を飲むと胃腸を刺激し、副交感神経の働きを高めて緊張をほぐせる。
  • 1日1〜2リットル飲む。
  • 口角を上げる
  • 背筋を伸ばして、空を仰ぎ見る
  • 1:2の長さで吸って吐く
  • 関係のないものに集中する
    • 時計のデザインをみる
    • 窓の外をみる
  • ゆっくり動く
  • 感謝の念をもつ
  • 待ち合わせ時間の15分前に着くようにする
  • 早寝早起き
  • 3食食べる時間を決める
  • ゆっくり噛んで食べる
  • 寝る前
    • 明日の着ていく服を用意する
    • セルエクササイズをする
  • 時間を決めて部屋の片付け
  • スマホを見ない
  • 湯船に浸かる
    • 最初の5分は肩まで浸かる
    • 10分はみぞおちの半身浴
    • コップ一杯を飲む
    • コップ一杯の水を飲む
    • 寝たままストレッチをする
    • 日光を浴びる
    • 朝ごはんを食べる。ヨーグルト+オリゴ糖がおすすめ
    • 水溶性の食物繊維(納豆、キャベツ、大根、海藻類、熟したフルーツ、かぼちゃ、アボガド)
  • 自律神経は必ず起こるもの。それを整える力があるかどうかが重要
  • 店員さんと無駄な会話をしてみる
  • 「まあいいか」と無責任に考える

Promiseの利点を手っ取り早く説明する

Promiseの細かい説明は以下のドキュメントに譲ります。 azu.github.io

この記事では、Promiseを使うとどのような嬉しいことがあるのかを簡単に説明します。

setTimeoutを使って、1秒ごとに「1」「2」「3」「4」と表示するプログラムを書く場合を考えます。
Promiseを使わずに従来の方法で書いた場合、以下のようにコールバックのネストの形になります。

setTimeout(function() {
    console.log("1.");
    setTimeout(function() {
        console.log("2.");
        setTimeout(function() {
            console.log("3.");
            setTimeout(function() {
                console.log("4.");
            }, 1000);
        }, 1000);
    }, 1000)
}, 1000);

コールバックのネストはとても読みづらいです。

同じ処理をするプログラムをPromiseを使って書くと、以下のようにthenメソッドのメソッドチェーンの形になります。

var promise = new Promise(function(resolver) {
    setTimeout(function() {
        console.log("1.");
        resolver();
    }, 1000);
});
promise
.then(function() {
    return new Promise(function(resolver) {
        setTimeout(function() {
            console.log("2.");
            resolver();
        }, 1000)
    });
})
.then(function() {
    return new Promise(function(resolver) {
        setTimeout(function() {
            console.log("3.");
            resolver();
        }, 1000);
    });
})
.then(function() {
    return new Promise(function(resolver) {
        setTimeout(function() {
            console.log("4.");
            resolver();
        }, 1000);
    });
});

少々冗長になってしまいましたが、コールバックのネストよりは分かりやすいですね。
非同期処理の流れが逐次実行処理のプログラムのように、上から流れるように処理を追うことができるようになっています。

さらにPromiseでは、各処理で値を引き回したり、catchメソッドで例外をキャッチできたりします。
それについては冒頭のページを参照してもらうとどのようになっているか分かります。

まとめ

Promiseを使うと、非同期処理の一連の流れをメソッドチェーンの形で書けるようになります。
そうすると、逐次処理のプログラムと同じように上から下に処理を追うことができるようになります。
これは、ネストされたコールバックのプログラムより読みやすい形になります。

Node.jsのツール周りのメモ

概要

Node.js + Gulp + Typescript + Babel で、プログラミング環境構築した時のメモです。

Node.js

Node.js

ウェブブラウザChromeのV8 JavaScriptエンジンで動作するJavascript環境です。
MacでのインストールはHomebrewを使います。

$ brew install node

npm

Node.jsのパッケージ管理ツールです。

$ npm init                                            # package.jsonを生成
$ npm install hogehoge --save         # 依存モジュールをインストール。
$ npm install hogehoge --save-dev # 開発時の依存モジュールをインストール。

gulp

gulp.js

スクランナーツールです。
scssやaltJSの変換処理などを処理します。

$ npm install gulp-cli -g
$ npm install gulp --save-dev
$ npm install gulp-babel --save-dev
$ npm install gulp-typescript --save-dev
$ npm install gulp-uglify --save-dev

変換処理を記述するファイルgulpfile.jsを作成します。

var gulp = require("gulp");
var uglify = require("gulp-uglify");
var babel = require("gulp-babel");
var ts = require("gulp-typescript");

var tsProject = ts.createProject("tsconfig.json", function() {
    typescript: require("typescript")
});

gulp.task("ts", function() {
    tsProject.src("src/*.ts")
        .pipe(ts(tsProject))
        .pipe(babel())
        .pipe(uglify({output: {comments: 'some'}}))
        .pipe(gulp.dest("dist"));
});

gulp.task("watch", function() {
    gulp.watch('src/*.ts', ['ts'])
});

gulp.task('default', ['ts', 'watch']);

Typescript

TypeScript - JavaScript that scales.

Microsoft製のaltJsです。
Javascriptに型をつけることができます。
ES5やES6に変換できます。

$ npm install typescript --save-dev

tsconfig.jsonコンパイルオプションを設定します。

{
    "include": [
        "src/**/*"
    ],
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6",
        "baseUrl": ".",
        "paths": {
            "*": [
                "node_modules/*",
                "src/tyeps/*"
            ]
        },
        "sourceMap": true
    },
    "exclude": [
        "node_modules",
        "**/*.spce.ts"
    ]
}

babel

Babel · The compiler for writing next generation JavaScript

ES6からES5に変換するツールです。

npm install --save-dev babel babel-core babel-preset-es2015

.babelrcコンパイルオプションを設定します。

{
    "presets": [
        "es2015"
    ]
}

ScalaからRedmineを操作する

概要

Redmine API
http://www.redmine.org/projects/redmine/wiki/Rest_api

ScalaからRedmineAPIを使って、チケットを取得したり操作したりするための設定を行います。

RedmineAPIキーを取得

以下のページを参考に、RedmineAPIキーを取得します。
http://redmine.jp/glossary/r/rest-api/

Java向けのSDKを導入

APIを使うためのSDKが用意されているので、それを使用します。
http://www.redmine.org/projects/redmine/wiki/Rest_api#API-Usage-in-various-languagestools

以下のリンクで、最新のバージョンを調べてsbtファイルに追記します。
http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.taskadapter%22%20AND%20a%3A%22redmine-java-api%22

libraryDependencies += "com.taskadapter" % "redmine-java-api" % "3.0.1"

サンプルコード

あとはSDKを使用してプログラムを書くのみです 。
以下は、対象のプロジェクトのチケット一覧を取得するサンプルコードになっています。

import com.taskadapter.redmineapi.RedmineManagerFactory

import collection.JavaConversions._


object Redmine {
  def main(args: Array[String]): Unit = {
    // RedmineのURL
    val uri = "https://xxxxxxxxxxxxxxxxxxxxxxxxxx/"

    // APIキー
    val accessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    // プロジェクト名
    val project = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    val mgr = RedmineManagerFactory.createWithApiKey(uri, accessKey)
    val issues = mgr.getIssueManager().getIssues(project, null)
    for (issue <- issues) {
      println(issue.getSubject)
    }
  }
}

ドキュメント

Redmine API
http://www.redmine.org/projects/redmine/wiki/Rest_api

素数判定

概要

素数判定のプログラムを書くことを考えます。
素朴な実装をするとO(n)の計算量になってしまうので、
高速化することを考える必要があります。

素朴な実装

素朴な実装では、与えられた整数xが2からx-1までの数で割り切れるかどうかを順番に調べます。

int isPrime(int x)
{
  if (x <= 1) return 0;

  if (x == 2) return 1;

  for (int i=2; i<x; i++) {
    if (x % i == 0) return 0;
  }

  return 1;
}

これはO(n)の計算量のアルゴリズムです。

高速化

素数判定では、「合成数  x x \leq sqrt(x) を満たす素因子  p をもつ」という性質を利用します。
合成数とは、素数でない数のことです。

例えば 36 の場合、「合成数  36 p \leq sqrt(36) を満たす素因子 pをもつ」。
つまり、36は6以下の素因子を持つことを意味します(p=2,3,4,6)。
36の素因子は12や18もありますね。
しかし、36が素数かどうか判定する場合は、6以下の整数の中に素因子があるかどうかを調べれば良いことになります。

つまりプログラム上では、 x-1 (素朴な方法)まで調べる必要はなく、  sqrt(x) まで調べれば良いことになります。

int isPrime(int x)
{
  if (x <= 1) return 0;

  if (x == 2) return 1;

  for (int i=2; i<sqrt(x); i++) {
    if (x % i == 0) return 0;
  }

  return 1;
}

このアルゴリズムは、 O(sqrt(n)) の計算量になります。

証明

合成数  x x \leq sqrt(x) を満たす素因子  p をもつ 」
という性質の証明は以下のとおりです。

 n合成数の場合、1でない整数 p,q (p \leq q) が存在して、 n=pq とかける。

ここで、 p \gt sqrt(n) とすると、

(1) 両辺を2乗して、 p2 > n
(2)  p \leq q から、  pq \geq p2

(1)、(2) から、  pq \geq p2 > n
となり矛盾するため、
 p \leq sqrt(n)

 pはそれ自体が素数か、p未満の素因数を持つため、
 sqrt(n) 以下の素因数を持つ。

よって、  n=pq より、  n sqrt(n) 以下の素因数を持つ。

参考

素数判定 | アルゴリズムとデータ構造 | Aizu Online Judge

detail.chiebukuro.yahoo.co.jp

SQL_MakerをComposerでインストールできるようにした

PerlSQL::MakerをPHPに移植して作ったSQL_Makerを、
書き直してPackagistにアップロードしてみました。

https://packagist.org/packages/uchiko/sql-maker

これでComposerからインストールすることができます。

導入手順

以下のコマンドでcomposer.pharをインストール。

$ curl -s http://getcomposer.org/installer | php

以下の内容のcomposer.jsonを作成します。

{
    "require": {
        "uchiko/sql-maker": "dev-master"
    }
}

以下のコマンドで、モジュールをインストールします。

$ php composer.phar install

vendorディレクトリにモジュールがインストールされます。

使用する

以下のように使用できます。

<?php

require_once 'vendor/autoload.php';

$builder = new uchiko\SQL\Maker(array('driver' => 'SQLite'));

$fields = array();

$where = array();
$where['area'] = 'houen';
$where['type'] = array( 'like' => '%electric%' );

$opt = array();
$opt['order_by'] = array('id');

list($sql, $binds) =
    $builder->select($table, $fields, $where, $opt);

var_dump($sql);
var_dump($binds);

/*
 * $sql   => "SELECT id, name
 *            FROM pokedex
 *            WHERE (area = ?) AND (type LIKE ?)
 *            ORDER BY id"
 * $binds => ("houen", "%electric%")
 */


ComposerでBundlerやCartonみたいなことができるのは面白いですね。
名前空間にベンダー名を入れるのは少し気になりますが。