masatoの日記

やっていきます

毎日飲んでるコーヒーを止めたらどうなるか、コーヒー断ちをやってみた。

いつからだったかはっきり思い出せないが、毎日3,4杯のコーヒーを飲んでいる。ml換算にすれば、1000mlは行かなくても500mlはいっていただろう。 最近発表された研究結果によると、コーヒーは健康に様々な好影響をおよぼすとのことであった。コーヒー本もたくさん出版されていた。私の場合は、「シリコンバレー式 自分を変える最強の食事」でプレミアムコーヒーが絶賛されていたので、なるべく質の良さそうなコーヒーを探し求めて飲むようになった(それなりに高い)。コーヒーはがんがん飲むべきものだと認識し、毎日欠かさずに飲んでいた。おとつい、ストックのコーヒー豆が切れた(豆を買って挽いて淹れている)。そのとき、買いに行くのがめんどうだったので、ふと「今日はコーヒーをなしにしてみよう」と思い立ち、自宅でも会社でもコーヒーは一切摂らないようにしてみた。といっても、1日のみだけど。。
その時の感覚を書いておきたい。

ちょっとした禁断症状

おそらく1年以上はほぼ毎日コーヒーを飲む生活だったので、突然なくなると落ち着かない。あるべきものが、ない、というようなかんじでほんのり不安。ということで、コーヒー飲みたい欲求を抑える努力がすこし必要だった。

リラックス度が高まった

コーヒーをのまないと、心拍数とか呼吸数とかがゆっくりに感じた。 コーヒーにはカフェインが含まれており、興奮作用がある。この作用を期待して、眠いときに目覚ましとしてコーヒーを飲むことはよく知られている。このように場合によっては緩んだ神経を適度に緊張させることが効能として役に立つということはある。だが、緊張しているときに飲んだら、その緊張をさらに張り詰めさせることにもなりかねないのではないか。私はけっこう緊張するタイプで、平均緊張レベルが高い気がする。こういう人間は節度を持ってカフェインを利用することが必要だとおもわれる。あと、カフェインの感受性も関係するはずだ。カフェインを摂取するとどういう風になるか他人にほとんど聞いたことがない。どうなんだろう。

ねむくなる

昼食後、めっちゃ眠い。大きな声では言えないが、机にすわって20分くらい半分寝ていた。それだけ寝るとすっきりして起き上がれた。試しに同じくカフェインを含む緑茶をちょっとだけ飲んでみたら眠気が飛んだので、やっぱりカフェインは眠気に効く!という感じ。たまたまそういうことになっただけかもしれないが。プレシボ効果とかで。

以上が1日のコーヒー断ちをして得た気づきだった。いいこともあったわけだが、コーヒーはおいしいし、たまに飲みたくなるので、これからは節度をもって飲んでいきたいと思う。

WEBアプリにはデータベースが必要だ。MySQLに入門する。

データベース使えるとできることの幅が広がりますよね、っていうか使えないと致命的ですよね。 ということで、MySQLを手を動かして覚えていきたいです!

テーブルをつくる

早速、テーブルをつくってみよう!
ということで「はじめてのSQL」にあるスキーマを打ち込みます。

CREATE TABLE person (person_id SMALLINT UNSIGNED,
fname VARCHAR(20),
lname VARCHAR(20),
gender ENUM ('M', 'F'),
birth_date DATE,
address VARCHAR(20),
city VARCHAR(20),
state VARCHAR(20),
coutry VARCHAR(20),
postal_code VARCHAR(20),
CONSTRAINT pk_person PRIMARY KEY (person_id)
);

ターンッ(Enterキー)

ERROR 1046 (3D000): No database selected

データベースをまず選択しないといけないんですね・・・はじめてのSQLには書いてませんでした。 さっそく、「MySQL データベース 選択」でググります。

MySQL公式サイトの解説にヒット!

MySQL :: MySQL 5.6 リファレンスマニュアル :: 3.3.1 データベースの作成と選択

データベースを作成するには、次のコマンドを使います。

CREATE DATABASE <データベース名>;

データベース名では大文字小文字が区別されるそうなので、すべて小文字でつくってみます。

mysql> CREATE DATABASE learning_mysql;
Query OK, 1 row affected (0.01 sec)

OKです!

次にデータベースを選択します。作っただけでは選択されないとありました。明示的に選択してやる必要があります。

mysql> USE learning_mysql;
Database changed

選択できました!

ではいよいよ、さきほどのスキーマにしたがってテーブルを作ってみます。
personテーブルです。

(ところで、別の本でテーブル名には名詞の複数形を使う、とよみました。この本に出てくるテーブルには単数形が使われてます。そういうケースもあるのだろうか。)

mysql> CREATE TABLE person (person_id SMALLINT UNSIGNED,
    -> fname VARCHAR(20),
    -> lname VARCHAR(20),
    -> gender ENUM ('M', 'F'),
    -> birth_date DATE,
    -> address VARCHAR(20),
    -> city VARCHAR(20),
    -> state VARCHAR(20),
    -> coutry VARCHAR(20),
    -> postal_code VARCHAR(20),
    -> CONSTRAINT pk_person PRIMARY KEY (person_id)
    -> );
Query OK, 0 rows affected (0.08 sec)

いいですね!

テーブルのスキーマをかくにんしてみる

さきほどめでたくテーブル作成に成功したわけですが、列名、データ型などを確認したいときがあるとおもいます。
そんなときは次のコマンドを打ちましょう。

DESC person;

DESCはDescribeだそうです。Descending(降順)とは関係ありません。

mysql> DESC person;
+-------------+----------------------+------+-----+---------+-------+
| Field       | Type                 | Null | Key | Default | Extra |
+-------------+----------------------+------+-----+---------+-------+
| person_id   | smallint(5) unsigned | NO   | PRI | NULL    |       |
| fname       | varchar(20)          | YES  |     | NULL    |       |
| lname       | varchar(20)          | YES  |     | NULL    |       |
| gender      | enum('M','F')        | YES  |     | NULL    |       |
| birth_date  | date                 | YES  |     | NULL    |       |
| address     | varchar(20)          | YES  |     | NULL    |       |
| city        | varchar(20)          | YES  |     | NULL    |       |
| state       | varchar(20)          | YES  |     | NULL    |       |
| coutry      | varchar(20)          | YES  |     | NULL    |       |
| postal_code | varchar(20)          | YES  |     | NULL    |       |
+-------------+----------------------+------+-----+---------+-------+
10 rows in set (0.04 sec)

10行あると言われてます。つまり、このテーブルは10列あるわけです。 コマンドラインの表って案外見やすいですね。

テーブルのスキーマを変更する

上記のスキーマをみると、person_idの型がsmallint(5) unsignedとなっています。 これだと、データを挿入する度に手動でIDを入力する必要があります。 それはしたくないので、DBで自動で入力してくれるようにしましょう。 MySQLではAUTO_INCREMENTと指定します。person_id列にAUTO_INCREMENTを付けるにはALTER文を使います。

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

要素を分解してみると次のようになっているらしいことがわかります。

  • ALTER TABLE <テーブル名> MODIFY <属性を変更する列名> <変更後の属性>

では、実行してみましょう。

mysql> ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0

成功したもようです。

データを挿入する

さて、これでテーブルが作成できました。列とデータ型がスキーマの通りになっていることも確認できました。
しかし、テーブルはまだからっぽです。 なにか入力してみたい、入力してみよう。

テーブルにデータを挿入するにはINSERT文を使います。
INSERT文には次の3点を含める必要があります。

  • データを挿入するテーブルの名前
  • データを挿入するテーブルの列の名前
  • 列に挿入する値

これに従って作ったpersonテーブルにデータを挿入するコマンドは次のようになります。

INSERT INTO person (person_id, fname, lname, gender, birth_date) VALUES (null, 'Taro', 'Kitamura', 'M', '1985-08-26'); 

Enter。

mysql> INSERT INTO person (person_id, fname, lname, gender, birth_date) VALUES (null, 'Taro', 'Kitamura', 'M', '1985-08-26');
Query OK, 1 row affected (0.02 sec)

成功です! 対話式コマンドラインはレスポンスがサクサク返ってくるところがきもちいいですね。 成功すれば、ですが。

テーブルの中身をかくにんする

これで1レコード入ってるテーブルが作成できました。
ちゃんと登録されているか確認してみよう。

mysql> SELECT * FROM person;
+-----------+-------+----------+--------+------------+---------+------+-------+--------+-------------+
| person_id | fname | lname    | gender | birth_date | address | city | state | coutry | postal_code |
+-----------+-------+----------+--------+------------+---------+------+-------+--------+-------------+
|         1 | Taro  | Kitamura | M      | 1985-08-26 | NULL    | NULL | NULL  | NULL   | NULL        |
+-----------+-------+----------+--------+------------+---------+------+-------+--------+-------------+
1 row in set (0.00 sec)  

めでたくデータが確認できました。

次は、複数のテーブルをJOINさせて見たいとおもいます。

オブジェクトをつくるのはblessだけじゃない。Class::Accessor::Fastをつかってみた

Perlオブジェクト指向プログラミングをするとき、よくblessを使っていました。で、blessを使ってオブジェクトをつくる場合、コンストラクタやアクセサを自分で書かないといけません。そういうもんだと思ってたところ、これらを自動で処理してくれる便利なモジュールが「モダンPerl入門」に紹介されてました。 自分で試してみたことを以下にメモしてみます。

商品番号、品名、価格からなる行から商品番号を取り出すという単機能モジュールを例にしてやってみました。

blessの場合

パッケージはこんなふう。
まずコンストラクタ。

package Extractor;

sub new {
    my $class = shift;
    my $src = shift;
    my self = bless {
        src => $src,
    }, $class;
    return $self;
}

アクセサは、オブジェクトがもってるプロパティへのインターフェイス
プロパティは、読み書きの両方ができるようにしたいです。 なので、引数の有無によって返り値が変わるようにしてます。 この分岐処理は、上記書籍からコピペさせてもらってます。

sub src {
    my $self = shift;
    my $src = shift;
    my $ret = $self->{$src}; # 引数がなければインスタンス生成のときに入れた値を返す
    if (@_) {
        self->{$src} = @_;
    }
    return $ret;
}

商品番号を返すメソッド。

sub id {
    my $self = shift;
    $self->{src} =~ /^\d+/;
    my $id = $&;
    return $id;
}

実行スクリプト

上記のモジュールを実行してみます。
アイスクリームの商品番号123、カレーライスの商品番号234がそれぞれ取り出せます。

use Extractor;

my $src = '123 ice cream 100 yen';

my $extractor = Extractor->new({ src => $src});
my $product_number = $extractor->id(); 
print $product_number,"\n"; # 123

# srcプロパティを上書きして、商品番号を取り出す
$extractor->{src} = '234 curry rice 800 yen';
$product_number = $extractor->id();
print $product_number,"\n"; # 234

blessのまとめ

コンストラクタ、アクセサを自分で書かないといけない。 プロパティがふえたら、その分アクセサを書く。数が多いと大変。

Class::Accessor::Fastの場合

こちらが本題です。 どうなふうに簡単になるのか。 とても短くなったので、先に上記パッケージ相当のコードをぜんぶ載せます。

package Extractor;
use base qw(Class::Accessor::Fast);

__PACKAGE__->mk_accessors( qw/src/ );

sub id {
    my $self = shift;
    $self->{src} =~ /^\d+/; # 123 ice cream 100 yen -> 123
    my $id = $&;
    return $id;
}

1;

こんだけ。

コンストラクタはモジュールが勝手につくってくれるので、書きません。 アクセサはmk_accessorsというものにプロパティ名を入れるだけです。

__PACKAGE__->mk_accessors( qw/src/ );

これでsrcプロパティの読み書きをやってくれます。 よって、自分で書く必要なし。

実行スクリプトはさっきと同じで同様の値が返ってきます。

まとめ

Class::Accessor::Fastを使うと、オブジェクトを作るときにコンストラクタやアクセサを自分で実装しなくてよいので、機能の実装に集中できそう。
使い方もむずかしくないので、手軽に利用できる。 また、このモジュールは動作が軽いらしいというのもいいと思いました。

モダンPerl入門

ローソンでヤッホーブルーイングのビールが買える

ここ最近、国産のクラフトビールが近所のスーパーでも買えるようになってきています。私は、長野県軽井沢のヤッホーブルーイングがだしているビールが好きでよく飲みます。 あるとき、東京のコンビニでいろんなヤッホーブルーイングが売っているのを見て、東京うらやま~、と思ってたところ、名古屋でもローソンで買えるようです。

やった!
f:id:masatoz:20170716233826j:image

全部ほしい。わたしは知らずに貪欲になっていたようだ。

ここ最近、隔月くらいの間隔でこの先3年間の自分の職業人生について考える、ということをやっております。きょうは、現状把握ということで、いまの自分をできるだけ客観的に振り返ってみる、ということに取り組みました。

職業人生は、あるいはキャリアプランともいいます。現在働いてまして、3年後となると、現職をつづけるとか、あるいは転職するとかいう可能性があります。私は、転職したいなあとずっと思っておりまして、それはどうしてかというと、ひと言でいって、会社が求めていることと自分がしたいこと、またはこう自分は貢献していきたいんだよなあと思っていることとが決定的にズレているということですね。そのことを最近はっきりと自覚するようになりました。これは私が一方的にそう思っているだけで、会社がこれと違うことを期待するというのはごくありふれた状況なのかもしれません。とはいえ、不本意なことをこの先ずっとやっていくのは、とっても不健康だとも思うのです。それがこの先の3年間だけであったとしても。

じゃあ、転職したら何が待ってるのか。隣の芝生はいつも青いわけです。 だから、自分が何を期待しているのか、そして実際に何が期待できそうなのか、ということを考えました。結果、私はあれもこれも欲していたようです。

こんなことを書きました。

1.楽しみながらはたらきたい
2.仕事から学びを得たい
3.おもしろい人からよい刺激をもらいたい
4.いいお給料を稼ぎたい

思いつく限りの仕事から得られそうなメリットをあげた感じで、欲張りですね。 これを人前で発表したところ、ある方から「どれを大切にしているのかがみえてこない」という意見をもらいました。 なるほど、確かに。 それがきっかけで、自分のその部分が客観的にみれて、あれもこれも全部ほしがっていた、ということに気がつけました。たしかに、全部取りしたいことはしたい。ただ、そのうちのどれが自分にとってたいせつなのか。それを見極めることは大切だと思いました。

「仲良し」になる努力はいらない

会社のコミュニケーションは表面的だという見方がある。 自分もそういうものだと長いあいだ思ってきてたのだけど、そうでもない気がしてきた。 仕事をしていると、本音と建て前を分けざるを得ない場合が普段よりも多くあるので、そこは上辺だけの対応になることはある。 だけど、そうだからといって、会社でのひととのやり取りが全体的にうすっぺらくなるというわけではない。

会社でのコミュニケーションの特徴として当然といえば当然なのだが、主な内容が仕事の話ということがある。仕事の内容の多くは、基本的に個人的な関心などから一定の距離がある。だから、そこに個人の私的な内容がはさまれることはない(だいたいそう思う)。そこには「深い」コミュニケーションに特徴的な「心の交流」がうまれるきっかけが欠けている。なぜならそのためには私的な情報のやり取りが欠かせないからだ、という感覚があった。

プライベートな場面では、ビジネスと比べて個人的な事柄を話すことがずっと多くなる。たとえば自分の趣味、生い立ち、家族、友達のことなど。でもしかし、これまでの経験からいえるのは、個人的な話をしたからといって、相手と親密になれるわけではないということだ。それでもなお、人と仲良くなるにはそういうプライベートな情報を交換しなければいけないという感覚は根強くあった。

順番が逆になっている。はじめに、こころを許せるようになってから、距離感の近いはなしができるようになる。よって、自分のことをたくさん話して、自己開示しまくれば人と仲良くなれるわけではない。あたりまえだ。

そうかんがえるようになって、無理に何かはなしをしようとすることが減った。朝、家を出るまえは「今日は何も話さないでいよう」とおもうこともある。しかし実際にそれでほんとうに一日中黙っていることはない。出社して、いつもの同僚と一緒にいると、なにかがこころに浮かぶので、それではなしをする。仕事の話を除けば、してもしなくてもいいようなはなしだ。とくに仲良くしようと頑張らなくてよいので、らくに話ができる。恐れずにいえば、仲良くなろうという努力は無駄だとおもう。だから、めんどうなときは全くだまっている。それで面倒なことになることはない。むしろ、周りの人にとってもそれで好都合だろう。こっちのほうがお互いハッピーだ。結果、無理っぽい人とも以外にうまくやれたりすることがあって、やはりそういった努力は捨ててよいのだという気になる。

話はそれるが、戦略的に自己開示をしてくる人がたまにいて、そのうちのいくらかはきっとプロ(それによって稼いでいるという意味で)なんだろうが、人為的に心理的距離を縮めようとしてくる。これがうまくいくのは、上に書いたような感覚につけこむと、錯覚する人がいるからだろう。 それは、ひとから親密な事柄をたくさん打ち明けられると、自分はその人と仲良しなのだと錯覚してしまう、ということだった。相手はそこを見込んであえてそうする。そんな場合はどことなくウソっぽい感じがするので、自分の感覚に忠実になるのがいいとおもう。かんたんに錯覚してしまう理性より、身体感覚はいつも正確だから。

Excelマクロでかんたんにファイルを操作する(開く、閉じる、保存する)

ファイル一個なら、開くのも閉じるのもすぐできます。
でも、10ファイルとかになると大変になります。

そんなときに、かんたんで便利、サクッとつかえるマクロを紹介します。

開く

開きます。どのファイルを開くのかを決めるために引数を二つ渡してます。

Files:ファイル名(だけ)が入ってる配列
path :ファイルのベースとなるパス(例. C:\document\ など)

Public Function OpenAllBooks(Files, path)

Dim f
For Each f In Files
    Dim FilePath
    FilePath = path & f
    Workbooks.Open (FilePath)
Next f

保存する

Application.DisplayAlerts = Falseにしておかないと、保存時に確認メッセージが出てきてしまいます。 一個ずつ確認していたのでは、だいぶめんどうなので、消しちゃいましょう。

Sub SaveAllBooks()

    Dim wkb As Workbook

    Application.DisplayAlerts = False
    For Each wkb In Workbooks
        wkb.Save
    Next wkb
    Application.DisplayAlerts = True
End Sub

閉じる

変更を棄却するのでない限り、実行する前に上のマクロで保存しておきましょう。

Sub CloseAllBooks()

    Dim wkb As Workbook

    Application.DisplayAlerts = False
    For Each wkb In Workbooks
        wkb.Close
    Next wkb

    Application.DisplayAlerts = True
End Sub