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 -> クライアント認証関連の設定
接続と認証
クライアント接続デフォルト
- search_path -> スキーマ検索パスの設定
- default_transaction_isolation -> トランザクション分離レベルのデフォルトの設定
- client_encoding -> クライアントエンコーディング
パフォーマンスチューニング関連の設定
- shared_buffers -> 共有メモリの使用するメモリ量
- work_mem -> 内部そーと、ハッシュテーブル操作で使用するメモリ量 *maintenance_work_mem -> VACUUM等の保守操作で使用するメモリ量
- bgwriter_delay -> バックグラウンドライタの動作周期
運用管理
運用管理にはデータベースの追加・削除・変更、 データベースの各種情報取得、テーブル単位の権 限の付与・取消など色々あるが、PostgreSQL独特であるVACUUM(+ANALYZE)について注視する。 ####なぜvacuumが必要か? -> PostgreSQLのデータ管理が追記型だか ら、不要領域を回収する必要があるため。
ファイル追記型にはメリットもあるが、何もしな いとファイルサイズが肥大化し続けてしまうため、 不要領域のメンテナンスが必要 ⇒運用管理としてVACUUMが必要
pg_dumpによるバックアップ
###バックアップコマンド *pg_dumpコマンド - データベースを指定してバックアップする。 *pg_dumpall - 全てのデータベース、データベースクラスタ全体をバック アップする。 ###リストアコマンド *テキスト形式の場合 - psqlコマンド *バイナリ形式の場合 - pg_restoreコマンド
他にも osコマンドとPITRによるバックアップが可能なので今度勉強する
実行計画の取得
* SQL文を実際に実行せずに、推測で取得する方法 - SQL文の前に、「EXPLAIN」を付与 * SQL文を実際に実行して、実行結果の情報も併せて取得する方法 - SQL文の前に、「EXPLAIN ANALYSE」を付与 - INSERT、UPDATE、DELETE等を実行すると実データに影響を与えるため注意
便利な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を実行 } });
未入力状態
半角の数字を入力した時
半角数字以外
ちなみに
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文法の理解も一層深まりますのでオススメです。
クローラーの大まかな流れは
対象ページをダウンロード
そのページを読み込んで解析(-> ソースコードの癖を見抜くなど....)
必要なデータ部分を文字列処理等で抜き出す
データを加工する
出力する
以外とシンプル! しかし、3.4がなかなか初心者にとっては難しい所で、正規表現等はを上手く扱える必要があります。
奇跡的な競馬サービス作りたいので出馬表とか、過去のレース成績とかのデーター収集のために勉強していきますー。