Try T.M Engineer Blog

多摩市で生息するエンジニアが「アウトプットする事は大事だ」と思って始めたブログ

NoSQLについて誤解していたことと学びについて

以前から気になっていたNoSQLについて調べてみた。
SQLは良く目にする言語なので、使用経験もあるのだが、NoSQLは使った事もないし、よくわからなかったで調べてみることにした。

ちなみに、NoSQLに対する私の知識は、AmazonDynamo DBやGoogleBigTableなどで使われる最近出てきた言語という事くらいしか知らない。

以降、調べてみた結果。

NoSQL( "Not only SQL" と言われている)

関係データベース管理システム (RDBMS) 以外のデータベース管理システムを指すおおまかな分類語である。 関係データベースを杓子定規に適用してきた長い歴史を打破し、それ以外の構造のデータベースの利用・発展を促進させようとする運動の標語としての意味合いを持つ。

NoSQLという用語は1998年、SQLインタフェースを持たない軽量な関係データベースのオープンソースソフトウェアの名前として最初に用いられた。

(一部抜粋)ウィキペディアより:NoSQL - Wikipedia

まず、これを読んで思ったことは「用語の定義がかなり幅広い」ということ。しかも、1998年から存在していたとは・・・てっきり最近出てきた言語だと思っていた。
また、てっきりSQLのような新しいQuery言語を指すのかなと思いきや、全然違くて「RDBMS以外のデータベース管理システムを指す分類語」らしい。これは大きな勘違いをしていた。

少し自分の過去を振り返る

むかーし、XMLを扱うデータベースを使って仕事をした事があったのだが、もしかしすると、それもNoSQLになるのだろうか・・・・調べてみた。

ドキュメント指向(Document-oriented、Document store) - XMLJSONといった、 スキーマレスでデータ構造が柔軟なもの。MongoDB、Apache CouchDBAmazon DynamoDBなど。XMLデータベースなどのシステムでは、XQueryを利用できるものもある。

(一部抜粋)ウィキペディアより:NoSQL - Wikipedia

なるほど。XMLを扱うデータベースもNoSQLの1つらしい。ということは、私は昔、NoSQLを使って仕事をしていたという事になる。(NoSQLを使ったことがないというのは嘘だという事が発覚した |||orz)

こんな事を言うと偉い人に怒られるかもしれませんが、XMLを扱うデータベースは、XMLタグを含めるすべてのデータをDBに格納するので、データ量が1000件程度でQueryからのレスポンスが非常に遅くなり、大変扱いにくかった思い出があります。(ええっ、炎上案件でしたとも・・・)
また、データもXMLで非常に見辛く、とても辛いオシゴトでした。

気を取り直してNoSQLの話

NoSQLはRDBMS以外のデータベース管理システムを指すという幅広い定義であるため、多くのNoSQLのデータベースが存在する。これをデータモデルとアーキテクチャでデータベースの種類を分けることができる。
以下記事がとても参考になった。

qiita.com

www.atmarkit.co.jp

NoSQLといっても色々な種類のデータベースがあるのがわかる。
NoSQLで有名なのはAWSのDynamoDBやGoogleBigTable、あとはMongoDBだと思うのだが、上記分類分けを見るとまったくの別物であることがわかる。NoSQLのデータベースを選定する時は、よく調べる必要がありそうです。

NoSQLを使ってみよう

私の場合、AWSを仕事で使っているので、DynamoDBについて学ぶのが良さそうです。AWS DynamoDBはAWSとDockerのアカウント、AWS-CLIさえあれば、簡単にローカル環境を構築できるので、ちょっと使ってみる分にはオススメです。

https://hub.docker.com/r/amazon/dynamodb-local

というわけで、さっそく使ってみる。
(事前にAWSとDockerアカウントの登録、AWS-CLIのインストールは必須です)以下コマンドを入力すれば、aws dynamodb-localが起動します。

docker run -d -p 8000:8000 amazon/dynamodb-local

"-d"オプションをつけることで、デーモン化してdaynamoDBが立ち上がるのでオススメです。

$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
amazon/dynamodb-local   latest              26ea09a4a680        5 months ago        446MB
$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
7e92210ebb4a        amazon/dynamodb-local   "java -jar DynamoDBL…"   32 seconds ago      Up 30 seconds       0.0.0.0:8000->8000/tcp   tender_newton

テーブルの作り方、データ挿入方法はamazonのマニュアルを参考にしました。

CLI の使用 - Amazon DynamoDB

試しに、上記作り方に記載しているMusicテーブルを作成してみます。 なお、dynamodb-localを操作するには"--endpoint-url http://localhost:8000"オプションが必須です。
このオプションをつけていないと、自分のAWSアカウントのDynamoDBにテーブルを作るので注意が必要です。(ちゃんとAWSの設定をしている場合に限る)

$ aws dynamodb create-table \
>     --endpoint-url http://localhost:8000 \
>     --table-name Music \
>     --attribute-definitions \
>         AttributeName=Artist,AttributeType=S \
>         AttributeName=SongTitle,AttributeType=S \
>     --key-schema \
>         AttributeName=Artist,KeyType=HASH \
>         AttributeName=SongTitle,KeyType=RANGE \
>     --provisioned-throughput \
>         ReadCapacityUnits=1,WriteCapacityUnits=1
{
    "TableDescription": {
        "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/Music",
        "AttributeDefinitions": [
            {
                "AttributeName": "Artist",
                "AttributeType": "S"
            },
            {
                "AttributeName": "SongTitle",
                "AttributeType": "S"
            }
        ],
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "WriteCapacityUnits": 1,
            "LastIncreaseDateTime": 0.0,
            "ReadCapacityUnits": 1,
            "LastDecreaseDateTime": 0.0
        },
        "TableSizeBytes": 0,
        "TableName": "Music",
        "TableStatus": "ACTIVE",
        "KeySchema": [
            {
                "KeyType": "HASH",
                "AttributeName": "Artist"
            },
            {
                "KeyType": "RANGE",
                "AttributeName": "SongTitle"
            }
        ],
        "ItemCount": 0,
        "CreationDateTime": 1548505321.099
    }
}

データを挿入してみます。

$ aws dynamodb put-item \
> --endpoint-url http://localhost:8000 \
> --table-name Music  \
> --item \
>     '{
>         "Artist": {"S": "No One You Know"},
>         "SongTitle": {"S": "Call Me Today"},
>         "AlbumTitle": {"S": "Somewhat Famous"}
>     }' \
> --return-consumed-capacity TOTAL

scanコマンドを使って、挿入したデータの確認。
ちゃんと追加されていますね。

$ aws dynamodb scan \
> --endpoint-url http://localhost:8000 \
> --table-name Music
{
    "Count": 1,
    "Items": [
        {
            "Artist": {
                "S": "No One You Know"
            },
            "SongTitle": {
                "S": "Call Me Today"
            },
            "AlbumTitle": {
                "S": "Somewhat Famous"
            }
        }
    ],
    "ScannedCount": 1,
    "ConsumedCapacity": null

まとめ

  • NoSQLとは、関係データベース管理システム (RDBMS) 以外のデータベース管理システムを指す。
  • SQLのようなQuery言語を指すわけではなく、データベースの分類用語。
  • NoSQLのデータベースは多くあり、データモデルとアーキテクチャで分類分けできる。また、XMLJSONを扱うもの等、個性もある。
  • AWS使っている人は、まずはDockerのdaynamodb-localがオススメ。

Pythonチュートリアルを読んで学んだ事(例外処理)

はじめに

最近、カックさんのブログで「「Python 3 エンジニア認定基礎試験」に合格した」という記事が話題になっていて、Python 3を仕事で使っている身としては、非常に興味深かった。

kakakakakku.hatenablog.com

そもそもPython 3の認定試験なるものが存在する事をこの記事を読んで、はじめて知りました。Pythonを学ぶにあたっての1つの目標になりそうですね。
さて、そのPython 3の認定試験(Python 3 エンジニア認定基礎試験)ですが、以下オライリー本「Pythonチュートリアル第3版」から出題されるとのこと。

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

しかし、この本、なんとウェブ上で無料公開されているとの事で、大変驚きました。 Pythonについて学習したい方は、一度見てみる事をオススメします。(Pythonのバージョン毎に内容が異なってくるので、注意してください)

docs.python.jp

というわけで、私もさっそく復習を兼ねて読んでみました。

意外と知らないことが多かった例外処理

改めて読んでみると、意外にも知らない(すでに忘れていた)事が多々あり、勉強になった。その中でも例外処理の独自例外について、個人的に興味深かったので纏めておく。

Pythonでは、例外を独自で作る(独自例外という)ことができる。以下の様に事前に例外用のclassを宣言しておけば作成可能だ。

class MyError(Exception):
    pass

try:
    raise MyError
except MyError:
    print("[ERROR] MyError")

>
>[ERROR] MyError

classなので、初期化用の関数(__init__())を宣言することができる。 exceptした後の処理は、初期化用の関数が動いた後に動く。
また、独自例外は引数を使った値の受け渡しも可能だ。

class MyError(Exception):
    def __init__(self, code, message):
        print('初期処理:',code, message)

try:
    raise MyError(400, 'not found')
except MyError:
    print("[ERROR] MyError")

>
>初期処理: 400 not found
>[ERROR] MyError

例外処理は、__str__()関数に定義されている。__str__()関数に処理を書くと、確かに実行された。

class MyError(Exception):
    def __init__(self, code, message):
        print('初期処理:',code, message)
        self.code = code
        self.message = message

    def __str__(self):
        print('[Error] MyError CODE=', self.code)
        print('[Error] MyError MSG=', self.message)

raise MyError(400, 'not found')

>
>初期処理: 400 not found
>Traceback (most recent call last):
  >File "<stdin>", line 1, in <module>
>[Error] MyError CODE= 400
>[Error] MyError MSG= not found
>__main__.MyError: <exception str() failed>

上記では、try: except:しなかった。というのも、どうやら優先順位があるようで、__str__()関数の処理よりもexceptが優先される模様。恐らく、__str__()関数は、例外を発生させる関数という位置付けなので、exceptを使って例外をハンドリングさせている場合は、「動かない」という事だろう。

class MyError(Exception):
    def __init__(self, code, message):
        print('初期処理:',code, message)
        self.code = code
        self.message = message

    def __str__(self):
        print('[Error] MyError CODE=', self.code)
        print('[Error] MyError MSG=', self.message)

try:
    raise MyError(400, 'not found')
except MyError:
    print("[ERROR] MyError")

>
>初期処理: 400 not found
>[ERROR] MyError

まとめ

  • Pythonでは、classを事前に用意することで、独自例外を作ることができる。
  • 独自例外では、初期化用の関数__init__()と、例外を発生させる関数__str__()を宣言できる。
  • __init__()raiseされた瞬間に呼び出される。__str__()exceptされていなければ呼び出される。(逆にexceptされていると呼び出されない)

そうだっ!「ポートフォリオサイト」を作ろう!

はじめに

今年は「ポートフォリオサイト」を作りたいと思います。
前回のブログで、今年は「技術力を磨く」事を重点に活動して行くと決めました。 とはいえ、何から手をつければ良いのか・・・そのあたりはノープランだったので、色々と考えた末、以前から作りたかった「ポートフォリオサイト」を作る事から始める事にしました。

どうやって作るか?

以前から苦手意識のあるJavaScriptを学び直して、Vue.jsを使って作ってみようと思いました。サーバーを用意すると管理・維持コストが掛かるので、SPA、サーバーレスで作りたいなぁというのと、技術的にも興味があったからです。というわけで、今年の始めからJavaScriptとVue.jsを勉強しています。

なぜJavaScriptに苦手意識を感じるのか?

うーん、ここはなかな言語化するのが難しい・・・
確かに今までの経験上、フロント側を触ることは、ほぼ無かったからと言えばそうなのですが・・・

ただ、JavaScriptを勉強していて思ったのは、やたらと無名関数を使うケースがあり、コードが読み辛いなぁと感じる事が多々あるのが苦手意識を感じる理由の1つかもしれません。
たとえば、以下のようなコードです。console.logに出力される数値は「20」ですが、無名関数をつかっているせいか読み辛く感じます。(私だけっ?)

var test = function() {
    var item_a = function() {
            return 2;
    }
    var item_b = function(item_a) {
        var hoge = function() {
            return 5;
        }
        return item_a * hoge();
    }
    return item_a() * item_b(item_a())
}

console.log(test())

あとは、必要なフレームワークやライブラリが多くあり、どれも個性が強そう・・・というのもあります。
とくにNode.jsのnpm(モジュール管理ツール)は、webpack等、サーバーサイド以外のJavaScriptでも使われる事があるので時折「あれ?Nodeが必要なの?」と驚きます。

とはいえ、何かモノを作るときにはフロント側の知識、JavaScriptは必要になってきますし、バックエンドでもフロント側を知る事で得られる情報は多いと思うので、引き続きJavaScriptとVue.jsに取り組んでいきたいと思います。

Vue.jsってどうよ?

良いですね。
とくにコンポーネントシステムの考え方(コンポーネントとして、使い回せるところは使いまわそうーという考え方)はわりと好きです。このあたりは、別途記事に纏めようと思います。

最後に

目標としては、今年の3月までにはVue.jsを使って「ポートフォリオサイト」を作れたらいいなぁとか考えてます。頑張らねばっ・・・!!

2019年の抱負について

今週のお題「2019年の抱負」

明けましておめでとうございます。
今年も頑張ってブログを続けていきたいと思っておりますので、どうか宜しくお願い致します。

あれ?ブログのページ何か変わってない?

今年も少しブログをリニューアルしました。 変更点はざっくり以下の通りです。

  • 記事の白地の幅を拡大、背景色の変更
  • サブタイトル変更、サブタイトルをタイトル下に移動
  • サイドバーにあるQiitaの記事タイトルフォントサイズを縮小
    (タグのフォントサイズも縮小したら背景が潰れたので後日修正予定orz)
  • サイドバーにあるTwiiterを英語版に変更
    (日本語で「ツイート」って書いてあるのが気になっていたので・・・)
  • サイドバーにGitHubのGraph(いわゆる芝生)を追加

「気分を変えよう!」くらいの気持ちでやってる事なので、「見やすくなったねー」くらいに捉えて頂ければ幸いです。

2019年の抱負

ブログ継続


昨年のブログ更新記録を更新すること。可能な限りブログでのアウトプットを継続したいと思います。

勉強会・コミュニティ・カンファレンスへの参加


実は子供が産まれてからは、勉強会(Tama.rb)への参加を止めていました。
理由は、妻が平日に子供の面倒を見ていてくれる分、自分は休日に子供の面倒を見て妻の負担を減らしてあげたいのと、転職後はRubyに触れる機会がなかったからです。
なので、子供の様子を見ながら徐々にRubyとは違う勉強会やコミュニティ、カンファレンスに参加していこうと考えています。(Tama.rbの皆さんには名残惜しい気持ちでいっぱいですが・・・orz)

スキル向上


私が転職を選んだ理由に「技術力を身に着けたい」というのがありました。
転職はできたので、あとは技術力を身に着けていくのみです!!
今のところ、JavaScriptPythonPHPAWSCMSを軸に技術力を学んで行こうと考えています。(残念ですがRubyは除きましたorz)

Gitの可視化


「技術力がついた」「技術力がある」と証明(アピール)するには、何かしら可視化が必要なのでは?と思いました。そこで、GitHubのGraph(いわゆる芝生)をブログに貼る方法があったので、これを使いました。
(ご覧の通り! 今は草が全然生えていません・・・orz)
草が生える=技術がある事にはなりませんが、「あれ?今日コード書いてないぞっ」という気付きにはなると思うので、頑張って草を生やして行きたいと思います。

まとめ

というわけで、今年の抱負は「技術力を磨く」です。
がんばりますっ!!

2018年を振り返る

こんばんは。Kodakです。

あっという間に年末になりましたね。 今年は本当に色々あったなぁ・・・と感じているのですが、今年は何をしたのか私自身の整理も含めて振り返ってみようと思います。

以下、(自身の整理も含めて)月別に纏めました。

2018年01月

2017年の末頃から自分自身がエンジニアとして知識・経験・コードを書く力がない事に気づき始めて、なんとなく転職活動を始めました。

この頃は、JavaRubyを勉強していましたね。 と思ったら、2018年の抱負とか書いてましたね。(うわっ今見返してみると恥ずかしい・・・)

kodak.hatenablog.com

2018年02月

妻が子供を授かった事を知り、本格的に転職活動を開始。最初は、同じ業界(SIer、SES)を目指していました。リーダー業務の経験が多かった事もあって、職務経歴書等での評価は(自分で言うのもなんですが)高いと思われていたのかなぁと思います。
しかし、面接で「コードを書いて、技術を学びたいです」と言った瞬間、面接官の顔色が変わり「そんなモノは求めていない!!」と言われ、断られました。

この頃、こんな記事を書いていたんですね。

kodak.hatenablog.com

前職では、まさに上司がスリーピングマネジメントなるスキルを発揮していて、私自身も転職活動が上手くいっていなかったので、ちょっとイライラしていたかもしれません。(反省)

2018年03月

そもそも同じ業界(SIer、SES)で、34歳のおっさんが「コードを書いて、技術を学びたいです」と言っても、そりゃぁ「そんなモノは求めていない」と言われるのは当たり前ですね。(業界とのミスマッチに気づく)ここから、Web系に行こうと決意しました。
まずは、やる気アピールのためのポートフォリオ作りを始めました。

2018年04月

ポートフォリオが完成。こんなものを作りました。 この頃からだと思いますが、勉強会(Tama.rb)への参加も始めました。

kodak.hatenablog.com

2018年05月

Ruby on Railsの勉強を始めました。 この頃から、勉強した事をブログにアウトプットし始めました。

2018年06月

転職先が決まりました。

2018年07月

転職先が決まった事を前職の上司に報告、ごたごたが始まる。

勉強家会への参加、Ruby on Railsの勉強は継続していましたね。

2018年08月

Web系に転職が決まったのに、HTML5CSSをちゃんと理解していなかった事に気づいて、再勉強しました。

kodak.hatenablog.com

2018年09月

転職先へ入社。

kodak.hatenablog.com

あと、会社で学んだ事をブログにアウトプットしていく事にしました。

kodak.hatenablog.com

2018年10月

子供(娘)が産まれました。泣きました。
子供を授かる事の大きさ、妻への感謝は忘れません!!

kodak.hatenablog.com

2018年11月

AWS Dev Day Tokyo 2018に参加しました。
はじめてのカンファレンスへの参加だったので、内容はもちろん周りの空気や登壇している人の立ち振舞など色々と勉強になりました。

kodak.hatenablog.com

2018年12月

AWS re:Invent 2018 Serverless re:Capに参加しました。
AWS re:Invent 2018 ダイジェスト 〜 AWS の最新動向を学ぶ〜に参加しました。
php con 2018に参加しました。

kodak.hatenablog.com

初のAdventCalendarにも参加しました。

kodak.hatenablog.com

2018年やったことまとめ

振り返ってみると、1年の半分は転職に力を注いでいたことがわかりました。
そして、学んだ事をブログにアウトプットする事で、ブログを書く癖もだんだんついていった様な気がします。 2018年の成果をまとめるとこんな感じです。

  • 勉強会への参加
  • 転職した
  • 子供が産まれた
  • (5月くらいから)ブログを継続できた(今年36本のブログを書いた)
  • カンファレンスへの参加(AWS関連3つ、PHP1つ)
  • AdventCalendarに参加

初めての勉強会への参加、転職、子供、カンファレンスへの参加、AdventCalendarへの参加・・・初めてづくしな1年でした。
来年もがんばるぞーーー!!