deviseでのUser登録画面を他のテンプレートで使いたい時

$ rake routes

user_registration POST              /                                            devise/registrations#create #ここがuser登録のパス
new_user_registration GET        /sign_up(.:format)               devise/registrations#new
edit_user_registration GET        /profile(.:format)                 devise/registrations#edit
<%= form_for(:user, :url => registration_path(:user)) do |f| %>
  #省略

<% end %>

わざわざコントローラーでインスタンスを作ってとかしなくていいから楽ですね

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)

mysqlにアクセスできないエラーが出てハマったのでメモ

$ rails db
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
$ sudo mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/[自分のマシン名].local.pid).


$ ls -la /usr/local/var/mysql
total 221288
drwxr-xr-x   19 username  admin       646 12 15 18:31 .
drwxrwxr-x    6 username  admin       204 11 14 15:43 ..
-rw-r-----    1 _mysql           admin      9822 12 15 18:31 [自分のマシン名].local.err        # 所有権が1_mysqlとなっているのでここを自分にする必要がある

$ sudo chown username /usr/local/var/mysql/[自分のマシン名].local.err # 権限変更コマンド

$ mysql.server start
Starting MySQL
. SUCCESS!

そのあと $ rake db:create で治りましたー

カラムをinteger型に変えたところPG::DatatypeMismatch: ERRORが出た

$ rake db:migrateしたら以下のエラーが出ました

PG::DatatypeMismatch: ERROR:  column "hoge" cannot be cast automatically to type integer
HINT:  You might need to specify "USING hoge::integer".
class ChangeTagInTask < ActiveRecord::Migration
  def change
    # change_column :tasks, :hoge, :integer となっていたところを以下のように修正
    change_column :tasks, :hoge, 'integer USING CAST(hoge AS integer)' # 修正箇所
  end
end```


これで治ります。

Postgres 勉強メモ

  • 構造1-ファイル群-
<PGDATA>
-PG_VERSION …PostgreSQLのバージョンを示したファイル
-base …各データベースのデータ本体用のディレクトリ
-global …データベースクラスタ共通用のディレクトリ
-pg_clog …コミットログ格納用のディレクトリ
-pg_hba.conf …HostBase認証用の設定ファイル
-pg_ident.conf …ident認証用の設定ファイル
-pg_log …サーバログファイル格納用ディレクトリ
-pg_multixact …マルチトランザクション管理用ディレクトリ
-pg_notify …Listen/Notifyコマンド用ディレクトリ
-pg_serial …シリアル型の管理用ディレクトリ
-pg_stat_tmp …統計情報の一時ファイル用ディレクトリ
-pg_subtrans …サブトランザクション用ディレクトリ
-pg_tblspc …テーブルスペースに関するデータ
-pg_twophase …2相コミット利用時のデータ
-pg_xlog …トランザクションログ
-postgresql.conf …PostgreSQLの設定ファイル
-postmaster.pid …現在のpostmasterのプロセスID等を記述したファイル
-postmaster.opts …PostgreSQLの起動オプションを示したファイル

構造2 -メモリ群 -

- shared_buffers(共有メモリ)
   -> データの読込み、書込みに使用されるメモリ領域。
- wal_buffers(WALバッファ)
   -> WALログの書込みに使用されるメモリ領域。
- work_memory(作業領域)
   -> ソート処理、ハッシュ作成処理、結合に使われるメモリ領域
で、実行プロセス毎に確保される。
- maintenance_work_memory(メンテナンス領域)
   -> VACUUMやインデックス作成に使われるメモリ領域で、実
行プロセス毎に確保される。

構造3 -プロセス-

- postmaster(リスナプロセス)
    クライアントからの接続を受付け、認証処理を行う。
    起動時にサーバプロセス以外の各プロセスを生成する(fork)。
    認証されたクライアントに対して、postgresプロセスを生成し(fork)、
処理を引き渡す。
- postgres(サーバプロセス)
    個々のクライアントの要求を処理するプロセス。
- writer(バックグラウンドライタ)
    共有バッファのデータをテーブルファイル、インデックスファイルに書
込む。
- wal_writer(WALライタ)
     WALバッファのデータをトランザクションログファイルに書込む。
- archiver(WALアーカイバ)
     WALログファイルをPITRのためにアーカイバに移動する。
- checkpointer(チェックポインタ)
     全てのダーティページをデータファイルに書出す。

各種設定方法

  • postgresql.conf -> Postgresqlのパラメータ設定
  • pg_hba.conf -> クライアント認証関連の設定

接続と認証

  • listen_address -> クライアントからの接続を監視するIPアドレスを指定
  • port -> サーバーが監視するTCPポート

クライアント接続デフォルト

パフォーマンスチューニング関連の設定

  • shared_buffers -> 共有メモリの使用するメモリ量
  • work_mem -> 内部そーと、ハッシュテーブル操作で使用するメモリ量 *maintenance_work_mem -> VACUUM等の保守操作で使用するメモリ量
  • bgwriter_delay -> バックグラウンドライタの動作周期

運用管理

運用管理にはデータベースの追加・削除・変更、 データベースの各種情報取得、テーブル単位の権 限の付与・取消など色々あるが、PostgreSQL独特であるVACUUM(+ANALYZE)について注視する。 ####なぜvacuumが必要か?   -> PostgreSQLのデータ管理が追記型だか ら、不要領域を回収する必要があるため。

f:id:snsn19910803:20161125151817p:plain

f:id:snsn19910803:20161125151823p:plain

ファイル追記型にはメリットもあるが、何もしな いとファイルサイズが肥大化し続けてしまうため、 不要領域のメンテナンスが必要 ⇒運用管理としてVACUUMが必要

f:id:snsn19910803:20161125151924p:plain

f:id:snsn19910803:20161125151955p:plain

pg_dumpによるバックアップ

###バックアップコマンド
 *pg_dumpコマンド
      - データベースを指定してバックアップする。
 *pg_dumpall
      -  全てのデータベース、データベースクラスタ全体をバック
アップする。

###リストアコマンド
*テキスト形式の場合
      - psqlコマンド
*バイナリ形式の場合
      - pg_restoreコマンド

他にも osコマンドとPITRによるバックアップが可能なので今度勉強する

実行計画の取得

* SQL文を実際に実行せずに、推測で取得する方法
     - SQL文の前に、「EXPLAIN」を付与

* SQL文を実際に実行して、実行結果の情報も併せて取得する方法
    - SQL文の前に、「EXPLAIN ANALYSE」を付与
    - INSERT、UPDATE、DELETE等を実行すると実データに影響を与えるため注意

f:id:snsn19910803:20161125152623p:plainf:id:snsn19910803:20161125152627p:plain

便利なunixコマンドまとめ

オライリーの入門unix を読んでみて、便利と思ったコマンドのメモ。

$ ls -a   ファイルの一覧( aオプションで隠しフォルダも表示)

.DS_Store               .ssh
.Trash                  .subversion
.atom                   Applications
.bash_history               Desktop
.bash_profile
$ ls -al ( lオプションを追加することで、詳細情報も表示可能)

total 96
drwxr-xr-x+ 32 user  staff   1088 11 21 17:10 .
drwxr-xr-x   5 root             admin    170 11 20 12:51 ..
-r--------   1 user  staff      7 11 14 14:43 .CFUserTextEncoding
-rw-r--r--@  1 user staff  14340 11 22 16:15 .DS_Store
drwx------   2 user  staff     68 11 20 20:56 .Trash
drwxr-xr-x  15 user  staff    510 11 19 10:13 .atom
・・・

ワイルドカード

「?」は任意の1文字に一致する. 例えば 「h?p」ならhop, hip, hap等で一致する。しかし、hpやhelpには一致しない。

$ ls file?.rb

file1.rb file1.rb file3.rb file4.rb file5.rb file6.rb と返してくれる
 

「*(アスタリスク記号)」はどんな文字の並びにも一致する

$ ls file[4-6]*

この場合 . 以降が*で表されるため file4.rb file5.rb file6.rbと帰ってくる

ファイル内容の閲覧

ターミナルでファイルの中身を確認したいときはcatを使っていたが、分量が長いファイルを参照したいときにはlessを使うとスクロールができるため便利。

ファイル内の文字を置き換えるtrコマンド

$ cat todo.txt

1. Wake up
2. eat food
3. read newspaper

$ tr '[aiueo]' '[xxxxx]' < todo.txt

1. Wxkx xp
2. xxt fxxd
3. rxxd nxwspxpxr

[aiueo] の部分を[xxxxx]として置き換えている!


小文字を大文字に変えることも可能!

$ tr  "[:lower:]" "[:upper:]" < todo.txt

1. WXKT XP
2. XXT FXXD
3. RXXD NXWSPXPXPXR

grep

ファイルや標準入力から正規表現でマッチする行を探し出すコマンド。

$ ls

.                   .python_history
..                  .rbenv
.CFUserTextEncoding         .ssh
.DS_Store               .subversion
.Trash                  .viminfo
.atom                   Applications
.bash_history               Desktop
.bash_profile               Documents
.bash_profile.pysave    Downloads
.bundle                 Library
.cache                  Movies
.codeintel              Music
.config                 Pictures
.gem                    Public
.gitconfig              
.local                  iCloud Drive(アーカイブ)
.netrc


grepで"D"にマッチするものでフィルタリング
$ ls -a | grep "D"
.DS_Store
Desktop
Documents
Downloads
iCloud Drive(アーカイブ)

grepうまく使いこなしたいです....

コマンド使いこなして生産性あげていきたいです.... 2017年の目標はvimを使いこなせるようになる!

javascriptの第一歩

今までrailsで写経したjsは使ったことあるのですが、昨日初めて自分で0からjs書いたので備忘録。

今回はviewに直書きしました イメージはフォームに西暦を入れて異なるフォームに移った時に現在の西暦からフォームに書いた西暦の引き算イベントが発生するものです。 例えば、text_fieldに2011と入力してフォームから離れると2016 - 2011が実行され5がviewに表示されるというものです。

hoge.html.slim

= form_for @company_setting, :url => { action: :update }, :method => :put do |f|
  h3.title.is-bold = t('.financial_period')


  br
    = f.text_field :closing_first_year, id: 'first_year'   #ここがイベント着火元

    span#calclation # このidに結果が表示される

javascript:
  // 決算1期目の年を入力して 他のフォームに移動すると今期が何期目なのか自動計算される
  $('#first_year').change(function() {
    var now        = new Date();
    var year       = now.getFullYear();
    var first_year = $('#first_year').val();

    if ($.isNumeric($('#first_year').val())) {
      $('#calclation').text(year - first_year);
    } else {
      $('#calclation').text('取得できません');  #半角数字以外の値を受け取った場合はelseを実行
    }
  });
  • 未入力状態 f:id:snsn19910803:20160916153729p:plain

  • 半角の数字を入力した時 f:id:snsn19910803:20160916153744p:plain

  • 半角数字以外 f:id:snsn19910803:20160916153752p:plain

ちなみに

var first_year = document.getElementById('first_year').value;

var first_year = $('#first_year').val();

は同じ意味とのこと!後者の方が簡潔に書けるので良い!

これだけ!!

なお今回はviewファイルで直にjsを書いたが、 例えばapp/assets/javascripts/hoge.jsを作ってそこに書いていくと viewに

= javascript_include_tag "hoge"

って書けばhoge.jsが使われるので、汎用的なものは個別にjsファイルとして作って書いていった方がいいとのこと。

クローラー memo

ウェブサービスを作るにあたり、どっかからデータを引っ張ってきてそれを反映させたいときにはクローリングを作ることで開発が劇的に効率化する。ただし、むやみにデータを引っ張ってくるのはアウトなので、デリケートに使わなければいけない。

参考書は Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例 Amazon CAPTCHA

取り上げられることが多いですがやはりめっちゃ楽しかったですこれは rubyの文法を一通り理解した人にとっては、クローラーだけではなくRuby文法の理解も一層深まりますのでオススメです。

クローラーの大まかな流れは

  1. 対象ページをダウンロード

  2. そのページを読み込んで解析(-> ソースコードの癖を見抜くなど....)

  3. 必要なデータ部分を文字列処理等で抜き出す

  4. データを加工する

  5. 出力する

以外とシンプル! しかし、3.4がなかなか初心者にとっては難しい所で、正規表現等はを上手く扱える必要があります。

奇跡的な競馬サービス作りたいので出馬表とか、過去のレース成績とかのデーター収集のために勉強していきますー。