Postgresql JSON

使えそうなJSON処理関数

1つの配列を要素ごとにレコードに分解する

json_array_elements(information)

値の型を判定する(json_array_elements などを使う時にarray型の値に絞る)

where json_typeof(information) = 'array'
where json_typeof(information) = 'object'

オブジェクトがネストされた構造から値を取り出す

json_extract_path_text(element, 'gender')

サンプル

SELECT json_extract_path_text(el, 'gender') AS gender,
       COUNT(1)
  FROM (SELECT json_array_elements(information) AS el, information FROM results WHERE json_typeof(information) = 'array') AS info
-- WHERE json_extract_path_text(el, 'gender')  = 'female'
 WHERE json_extract_path_text(el, 'gender') IS NOT NULL
 GROUP BY gender;
SELECT information::jsonb FROM results

json型とjsonb型

  • 参考記事
  • json 型
    • 実態は JSON テキストをそのまま文字列として保持しただけのもの
    • 参照するたびにテキストのJSONを毎回パースする => 非効率だ
  • jsonb型
    • 入力時にのみjsonのテキストの解析を行い、正規化されたバイナリ形式で格納される
    • json型よりも値評価の効率が上がっている
  • 結局どっちがいいの?
    • jsonbでもカラムの中身は普通に読める
    • アクセス効率もjsonbのほうが優位
    • 特にjsonbができた以降jsonを積極的に使う理由はなくなったみたい

golang

Downloads - The Go Programming Language https://golang.org/dl/

GitHub - wfarr/goenv: You know, rbenv but for go. https://github.com/wfarr/goenv

install の download = の部分を最新のURLに対応させる必要がある

golang dash button

GitHub - mikeflynn/go-dash-button: A server to handle Amazon Dash button actions; Written in golang https://github.com/mikeflynn/go-dash-button

gobot

Getting Started - Gobot - Golang framework for robotics, physical computing, and the Internet of Things (IoT) https://gobot.io/documentation/getting-started/

goenvをセットアップする | cloudpack.mediasharecloudpack.mediacloudpack https://cloudpack.media/11552

lirc

エアコンの信号をそのまま入れる

lirc の使い方 Raspberry Piで学習リモコン - Qiita http://qiita.com/key_gao_/items/e8394656003f349952d6

chip

golang

C.H.I.P. with Gobot https://gobot.io/documentation/platforms/chip/

gpio

Next Thing Co Documentation https://docs.getchip.com/chip.html#gpio

dash button

Amazon Dash ButtonをただのIoTボタンとして使う - Qiita http://qiita.com/jsoizo/items/3b8bba4160f41aef20f4

golang

Go言語の初心者が見ると幸せになれる場所 #golang - Qiita http://qiita.com/tenntenn/items/0e33a4959250d1a55045

usbからの接続

普通に電源としてc.h.i.pを、macにつなぐことでシリアルコンソールとして 操作することができる

$ ls /dev/tty* | grep usbmodem
> /dev/tty.usbmodemNNNN

$ screen /dev/tty.usbmodemNNNN

wifi設定

ネットワークの設定

$ nmtui

文字化けしてるときの解消

ctrl - a :encoding utf8 eucjp

入れたパッケージメモ

  • vim
  • golang
  • build-essentials
  • git
  • lirc

about gpio

gpioについてのメモ

/sys/class への gpio デバイスの作成

<pin_number> = 対応するpinナンバー

$ cat <pin_number> > /sys/class/export
$ ls /sys/class/export/gpio* # gpio<pin_number> was created
$cat out > /sys/class/export/gpio<pin_number>
$ cat 1 > /sys/class/export/gpio<pin_number> 

chip上のgpioのpin ナンバー

NAME          GPIONUM
PWM0            34
AP-EINT3        35
TWI1-SCK        47
TWI1-SDA        48
TWI2-SCK        49
TWI2-SDA        50
LCD-D2          98 (USED BY 1-WIRE BUS)
LCD-D3          99
LCD-D4         100
LCD-D5         101
LCD-D6         102
LCD-D7         103
LCD-D10        106
LCD-D11        107
LCD-D12        108
LCD-D13        109
LCD-D14        110
LCD-D15        111
LCD-D18        114
LCD-D19        115
LCD-D20        116
LCD-D21        117
LCD-D22        118
LCD-D23        119
LCD-CLK        120
LCD-DE         121
LCD-HSYNC      122
LCD-VSYNC      123
CSIPCK         128
CSICK          129
CSIHSYNC       130
CSIVSYNC       131
CSID0          132
CSID1          133
CSID2          134
CSID3          135
CSID4          136
CSID5          137
CSID6          138
CSID7          139
AP-EINT1       193
UART1-TX       195
UART1-RX       196
XIO-P0         408 (4.3) / 1016 (4.4.11) / 1013 (4.4.13-ntc-mlc)
XIO-P1         409 (4.3) / 1017 (4.4.11) / 1014 (4.4.13-ntc-mlc)
XIO-P2         410 (4.3) / 1018 (4.4.11) / 1015 (4.4.13-ntc-mlc)
XIO-P3         411 (4.3) / 1019 (4.4.11) / 1016 (4.4.13-ntc-mlc)
XIO-P4         412 (4.3) / 1020 (4.4.11) / 1017 (4.4.13-ntc-mlc)
XIO-P5         413 (4.3) / 1021 (4.4.11) / 1018 (4.4.13-ntc-mlc)
XIO-P6         414 (4.3) / 1022 (4.4.11) / 1019 (4.4.13-ntc-mlc)
XIO-P7         415 (4.3) / 1023 (4.4.11) / 1020 (4.4.13-ntc-mlc)

lirc

http://alexba.in/blog/2013/01/06/setting-up-lirc-on-the-raspberrypi/

データベースを先に作成しておく(これは必要ないかも)

createdb データベースネーム;

ダンプファイルからリストア

 pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d <データベースネーム> <dumpファイルネーム>

ときどき、postgresql をバージョンアップするとデータベースのバージョンが異なって動かないということがあってちゃんと移行するのもめんどくさいしたいしたデータも入っていないので新しくデータベース作って解決してる。

データファイルの位置

/usr/local/var

新たにデータベースを作成する

initdb /usr/local/var/postgres9.6 -E utf8

名前を変えてバックアップ

mv /usr/local/var/postgres /usr/local/var/postgres.bkup

デフォルトの位置に対してシンボリックリンクを貼る

ln -s   /usr/local/var/postgres /usr/local/var/postgres9.6

データベースユーザー作成

psql postgres `whoami`

ユーザー作成

create user postgres;
 ALTER USER postgres WITH SUPERUSER;

注意

ローカルのテキトーなデータベースを作成するときの手順なので真似しないほうがいいです。

すぐにどれがどれだったか忘れてしまうのでメモ

説明

  • マクドナルドはキャメルケースと覚える ruby のクラス名
  • 蛇は地をはってるからアンダースコアでスネークケース、rubyの変数名
  • ハイフン使うやつをチェーンケースだということを初めて知った

メモ

  • キャメルケース :
    • ローワーキャメルケース : getSnoopyAge
    • アッパーキャメルケース : GetSnoopyAgeMcDonald
  • スネークケース : get_snoopy_age,mc_donald`
  • チェーンケース : .child-comments

参考記事

ApexでAWS Lambdaファンクションを管理する | Developers.IO

http://dev.classmethod.jp/cloud/aws/how-to-manage-aws-lambda-functions-with-apex/

install

curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh

クレデンシャルの設定はaws cliと同じ

  • ~/.aws/config
  • -/.aws/credentials

次のコマンドとかで実行するとできた

aws configure

バージョンを確認

apex version
>Apex version 0.11.0

実行方法

次の形式でprofileを指定して実行することができる

apex --profile admin --region us-west-2 deploy

プロジェクトを作成

apex init

各種操作

idを指定してrest apiの一覧を取得

 aws apigateway get-resources --rest-api-id bag2eoi90g

functionの一覧を表示

 apex list

functionを実行

 apex invoke hello

全てのfunctionをデプロイする

 apex deploy

ビルドしてzipファイルを作成する

 apex build hello > hello.zip

デプロイしたfunctionを1つ前のバージョンに戻す

 apex rollback hello

functionの実行ログを表示する

 apex logs hello

functionのメトリクスを表示する

 apex metrics hello

dry-run機能

functionをデプロイする --dry-runで削除する予定のfunctionを表示できる

 apex deploy hello --dry-run

functionを削除する --dry-runで削除する予定のfunctionを表示できる

 apex delete hello --dry-run

featurespecの操作をdryにする

メソッド化

気になるgemのメモ 2016

letsencrypt-rails-heroku

let`s encrypt の無料SSL証明書をherokuで自動更新するためのgem https://github.com/pixielabs/letsencrypt-rails-heroku

railsで使用するgemを作る

gem の雛形を作る

$ rails plugin new gem_name
      create
      create  README.md
      create  Rakefile
      create  gem_name.gemspec
      create  MIT-LICENSE
      create  .gitignore
      create  Gemfile
      create  lib/gem_name.rb
      create  lib/tasks/gem_name_tasks.rake
      create  lib/gem_name/version.rb
      create  bin/test
      create  test/test_helper.rb
      create  test/gem_name_test.rb
      append  Rakefile
  vendor_app  test/dummy
         run  bundle install

$ cd gem_name

gem_spec のTODOとなっている部分を正しい情報に書き換える ここで書き換えておかないと、警告文が表示されてrakeを使ってtestを流すことができない

$ vim gem_name.gemspec

----
$:.push File.expand_path("../lib", __FILE__)

# Maintain your gem's version:
require "gem_name/version"

# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
  s.name        = "gem_name"
  s.version     = GemName::VERSION
  s.authors     = ["J.Fukaya"]
  s.email       = ["fukajun.shark@gmail.com"]
  s.homepage    = "http://fukajun.org/"
  s.summary     = "Summary of GemName."
  s.description = "Description of GemName."
  s.license     = "MIT"

  s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.md"]

  s.add_dependency "rails", "~> 5.0.0", ">= 5.0.0.1"

  s.add_development_dependency "sqlite3"
end

この時点でtestを実行できるかどうかを確認する => ダミーのテストがグリーンになるはず

$ bundle exec rake test

gemの処理を実装していく

$ vim lib/gem_name.rb

----
module GemeName
end

class ActiveRecord::Base
  def self.hoge
    'hoge'
  end
end

testを作成する

今回は、ActiveRecord::Baseを拡張する機能を書いているので test/dummy側にActiveRecord::Baseを継承した通常のrails の modelクラスを作成していく

$ cd test/dummy
$ bundle exec rails g model user name

    invoke  active_record
    create    db/migrate/20161107165840_create_users.rb
    create    app/models/user.rb
    invoke    test_unit
    create      test/models/user_test.rb
    create      test/fixtures/users.yml
$ vim db/migrate/20161107165840_create_users.rb

----

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string name
      t.timestamps
    end
  end
end

いよいよテストコードを書いていく

$ cd ../../ # gemのrootへ戻る
$ vim test/gem_name_test.rb

require 'test_helper'

class GemName::Test < ActiveSupport::TestCase
  test "truth" do
    assert_equal 'hoge', User.hoge
  end
end

再度、テストを実行して見る、グリーンになるはず

$ bundle exec rake test
Recent Entries