- 投稿日:2019-03-05T23:12:50+09:00
1日目 ruby基礎,rails_scaffold(スキャフォールド)
文字コードの設定
ソースコードの文字コードをUS-ASCIIに設定する時は以下の3つのどの書きかたでも合ってる。
# coding: us-ascii
# encoding: us-ascii
# CODING: US-ASCII
変数と定数
rubyの場合、変数を定義する時は、小文字、定数を定義する時は、最初の文字が、大文字。以下に例を示す。
komozi=1
Oomozi=3.14
例外処理(begin rescue ensure)
beginの処理がエラーだった場合に、rescueの処理が実行される。ensureには、beginの処理がエラーでも、エラーじゃなくても処理される。
三項演算子
以下の2つの実行結果は同じである。
x = 10 y = x < 10 ? "A" : "B" puts yx = 10 y = nil if x < 10 y = "A" else y = "B" end puts y引数(*a)
以下のようにコードを書くと、実行結果が配列として出てくる。
def foo(*a) p a end foo(1,2,3)繰り返し
繰り返しはeach,step,uptoメソットがある。
以下は例文。
・eachmoney = 1000 (1..10).each do (1..10).each do money = money + 1 end end puts money・step
money = 1000 rate = 1.1 (2001..2010).step(2) do |i| money = money * rate end puts money.to_i・upto
money = 1000 rate = 1.1 2001.upto(2004) do money = money * rate end puts money.to_iscaffold(スキャフォールド)
ruby on rails でアプリケションを作る際の便利ツール。本来、railsでは、モデル、コントローラー、ビュー、ルーティングを作る必要があるが、scaffoldを使えば、これらの作業をまとめて行って、簡単にアプリケーションの雛形を作ってくれる。
今日の授業の感想
今日はRubyの基礎を午前に行い、午後はscaffoldを用いて、フォームを作成した。午前は問題に出されたコードが、どのような処理を行うのかを学び、色んな発見があって理解が深まった。しかし、午後の授業に追いついて行けなかった。railsの環境構築も行ったが、〜をして、次に〜をしてくださいと言われても、どこで実行すればいいのかもわからず、(macでとか、mysql、railsとか)、専門用語も多いので、それが何の意味を指していて、なんでそれを実行する意味があるのかもわからず、自分の非力さを感じた。現在何をしているのかが全く分からなかった。事前課題はprogateで指定されたことを一通り行ったが、それだけではついていけなかった。授業の復習を行い、少しずつ理解を深めて行きたい。
- 投稿日:2019-03-05T23:12:50+09:00
2日目 ruby基礎,rails_scaffold(スキャフォールド)
文字コードの設定
ソースコードの文字コードをUS-ASCIIに設定する時は以下の3つのどの書きかたでも合ってる。
# coding: us-ascii
# encoding: us-ascii
# CODING: US-ASCII
変数と定数
rubyの場合、変数を定義する時は、小文字、定数を定義する時は、最初の文字が、大文字。以下に例を示す。
komozi=1
Oomozi=3.14
例外処理(begin rescue ensure)
beginの処理がエラーだった場合に、rescueの処理が実行される。ensureには、beginの処理がエラーでも、エラーじゃなくても処理される。
三項演算子
以下の2つの実行結果は同じである。
x = 10 y = x < 10 ? "A" : "B" puts yx = 10 y = nil if x < 10 y = "A" else y = "B" end puts y引数(*a)
以下のようにコードを書くと、実行結果が配列として出てくる。
def foo(*a) p a end foo(1,2,3)繰り返し
繰り返しはeach,step,uptoメソットがある。
以下は例文。
・eachmoney = 1000 (1..10).each do (1..10).each do money = money + 1 end end puts money・step
money = 1000 rate = 1.1 (2001..2010).step(2) do |i| money = money * rate end puts money.to_i・upto
money = 1000 rate = 1.1 2001.upto(2004) do money = money * rate end puts money.to_iscaffold(スキャフォールド)
ruby on rails でアプリケションを作る際の便利ツール。本来、railsでは、モデル、コントローラー、ビュー、ルーティングを作る必要があるが、scaffoldを使えば、これらの作業をまとめて行って、簡単にアプリケーションの雛形を作ってくれる。
今日の授業の感想
今日はRubyの基礎を午前に行い、午後はscaffoldを用いて、フォームを作成した。午前は問題に出されたコードが、どのような処理を行うのかを学び、色んな発見があって理解が深まった。しかし、午後の授業に追いついて行けなかった。railsの環境構築も行ったが、〜をして、次に〜をしてくださいと言われても、どこで実行すればいいのかもわからず、(macでとか、mysql、railsとか)、専門用語も多いので、それが何の意味を指していて、なんでそれを実行する意味があるのかもわからず、自分の非力さを感じた。現在何をしているのかが全く分からなかった。事前課題はprogateで指定されたことを一通り行ったが、それだけではついていけなかった。授業の復習を行い、少しずつ理解を深めて行きたい。
- 投稿日:2019-03-05T17:33:09+09:00
macOSのコマンドラインでphpからMAMPのMySQLに接続しようとすると[2002] No such file or directory
NetCommos3をcomposerでインストール · NetCommons3/NetCommons3 Wiki を参考にしながら macOS のコマンドライン上でNetCommons3をインストールしてたら、DB作成の時点で
Error: SQLSTATE[HY000] [2002] No such file or directory Error: データベースが作成できませんでした。となってしまいました。
なぜこうなるかというとMAMPを入れてるとはいっても、コマンドラインで動くのは macOSにデフォルトで入ってるPHPだから。
MAMPのMySQLのソケットの場所は
/Application/MAMP/tmp/mysql/mysql.sock
それに対して macOS のPHPが参照する MySQLソケットの位置は
/var/mysql/mysql.sock
それで
/var/mysql/mysql.sock
が見つからないということで "No such file or directory" になってたわけです。というわけで下記を実行してシンボリックリンクをつくることで解決できました。
sudo mkdir /var/mysql sudo ln -s /Application/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock
- 投稿日:2019-03-05T14:16:02+09:00
MySQLのGenerated Columnsまとめ with Rails
Geneterated Columnとは
- 実カラムの値を計算した結果 を格納する専⽤のカラムを作成できる
関数indexをシミュレートできる(生成列にindexを貼れるし、生成列で分割もできる)
- MySQL5.7から使える。
- Oracleの仮想列に近い。
CREATE TABLE
またはALTER TABLE
文の中で使用できる。[GENERATED ALWAYS] as (expression)
の構文で作成する。作成
CREATE TABLE triangle ( sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb)) );データの挿入
INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);確認
mysql> select * from triangle; +-------+-------+--------------------+ | sidea | sideb | sidec | +-------+-------+--------------------+ | 1 | 1 | 1.4142135623730951 | | 3 | 4 | 5 | | 6 | 8 | 10 | +-------+-------+--------------------+ 3 rows in set (0.01 sec)何故 Geneterated Column を使うのか
データの保存用途ではなく、仮想生成した列は、
照会を単純化し統一するための方法
として使用できる。
複雑な条件は、生成された列として定義することで、
確実に同じ条件を使用するようにできる。格納された生成列は、その場で計算するのにコストがかかる
複雑な条件のためのキャッシュとして使用できる。Geneterated Columnは
関数インデックスをシミュレートできる。
Geneterated Columnを使用して関数式を定義し、
それにインデックスを付けることもできる。
- 生成された列に
NOT NULL制約・UNIQUE制約をかけられる。
- 生成された列で
分割(partitioning)ができる。
- 生成された列にインデックスが付けられている場合、クエリがその列を直接名前で参照していなくても、
オプティマイザは列の定義と一致するクエリ式を認識し、
クエリ実行中にその列のインデックスを適切に使用する
https://dev.mysql.com/doc/refman/5.7/en/generated-column-index-optimizations.htmlデータの持ち方
- Geneterated Columnは
VIRTUAL
またはSTORED
を指定することができる。
デフォルトはVIRTUAL
である。テーブル内に VIRTUAL と STORED は混在できる
どちらのタイプもセカンダリーインデックスを作成できる。
セカンダリーインデックスはどちらのタイプでもDiskに固定できる。
STORED
列の値は、行が挿入または更新されたときに評価されて保管される。
- ストレージを必要とする。
- indexを貼れる。
VIRTUAL
SELECT時に都度計算される。
- ストレージを必要としない。
- MySQL 5.7.8から、計算後のデータに対してインデックスが貼れる
注意点
生成された列式は、
以下の規則に従う必要があり、
式に許可されていない構成が含まれていると、エラーが発生する。
- ストアドファンクション・ユーザー定義関数は不許可
- ストアドプロシージャと関数パラメータは不許可
- 変数(システム変数、ユーザー定義変数、およびストアドプログラムローカル変数)は不許可
サブクエリは許可されない
- AUTO_INCREMENT属性は列の定義で使用できない
カラムとしては定義されているので、 SELECT * とかはできるが、
Insert のように直接値を投入することはできない。式が宣言された列型とは異なるデータ型に評価された場合、
宣言された型への暗黙的な強制は通常のMySQLの型変換規則に従って発生する。外部キー制約は仮想生成した列を参照できない。
Railsで実装する場合
テーブル作成時に追加する方法
class CreateTriangle < ActiveRecord::Migration[5.1] def change create_table :triangle do |t| t.integer :sidea t.integer :sideb t.virtual :sidec, type: :float, as: "SQRT(sidea * sidea + sideb * sideb)" t.virtual :sided, type: :float, as: "SQRT(sidea * sidea + sideb * sideb)", stored: true end end endテーブルの確認
mysql> show create table triangle; +----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | triangle | CREATE TABLE `triangle` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `sidea` int(11) DEFAULT NULL, `sideb` int(11) DEFAULT NULL, `sidec` float GENERATED ALWAYS AS (sqrt(((`sidea` * `sidea`) + (`sideb` * `sideb`)))) VIRTUAL, `sided` float GENERATED ALWAYS AS (sqrt(((`sidea` * `sidea`) + (`sideb` * `sideb`)))) STORED, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.01 sec)データの挿入
INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);確認
mysql> select * from triangle; +----+-------+-------+---------+---------+ | id | sidea | sideb | sidec | sided | +----+-------+-------+---------+---------+ | 1 | 1 | 1 | 1.41421 | 1.41421 | | 2 | 3 | 4 | 5 | 5 | | 3 | 6 | 8 | 10 | 10 | +----+-------+-------+---------+---------+ 3 rows in set (0.00 sec)カラムとして追加
class AddColumnToTriangle < ActiveRecord::Migration[5.1] def up execute "ALTER TABLE triangle ADD COLUMN sidee float AS ( CASE WHEN sidea > 2 THEN SQRT(sidea * sidea + sideb * sideb) ELSE NULL END )" add_index :triangle, :sidee, unique: true end def down remove_column :triangle, :sidee end endテーブルの確認
mysql> show create table triangle; +----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | triangle | CREATE TABLE `triangle` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `sidea` int(11) DEFAULT NULL, `sideb` int(11) DEFAULT NULL, `sidec` float GENERATED ALWAYS AS (sqrt(((`sidea` * `sidea`) + (`sideb` * `sideb`)))) VIRTUAL, `sided` float GENERATED ALWAYS AS (sqrt(((`sidea` * `sidea`) + (`sideb` * `sideb`)))) STORED, `sidee` float GENERATED ALWAYS AS ((case when (`sidea` > 2) then sqrt(((`sidea` * `sidea`) + (`sideb` * `sideb`))) else NULL end)) VIRTUAL, PRIMARY KEY (`id`), UNIQUE KEY `index_triangle_on_sidee` (`sidee`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 | +----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)確認
mysql> select * from triangle; +----+-------+-------+---------+---------+-------+ | id | sidea | sideb | sidec | sided | sidee | +----+-------+-------+---------+---------+-------+ | 1 | 1 | 1 | 1.41421 | 1.41421 | NULL | | 2 | 3 | 4 | 5 | 5 | 5 | | 3 | 6 | 8 | 10 | 10 | 10 | +----+-------+-------+---------+---------+-------+ 3 rows in set (0.00 sec)参考
MySQL 5.7にやられないためにおぼえておいてほしいこと
https://www.slideshare.net/yoku0825/mysql-57-5344973413.1.18.8 CREATE TABLE and Generated Columns
https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html
- 投稿日:2019-03-05T11:39:59+09:00
MySQLチートシート
mysqldumpで特定のdbをgzipでバックアップ&リストア
バックアップ
mysqldump -u ${user} -p --single-transaction ${db_name} --ignore-table=mysql.event | gzip > ${db_name}.dmp.gz.`date +%Y%m%d`リストア
zcat ${db_name}.dmp.gz.`date +%Y%m%d` | mysql -u ${user} -p ${db_name}全テーブルの大雑把なレコード数を一覧表示する
各テーブルのレコード数を確認したい時に使用する。例えばレプリケーションやリストアの確認の時など。
ただし、information_schemaはわりと大雑把なので、完全に一致しないこともあるので注意。
その場合はselect count
する。
公式ドキュメントにも以下のように記載がある。For InnoDB tables, the row count is only a rough estimate used in SQL
optimization. (This is also true if the InnoDB table is partitioned.)全DBの全テーブル
mysql> select table_name, table_rows from information_schema.TABLES;特定のDBの全テーブル
mysql> select table_name, table_rows from information_schema.TABLES where table_schema = '${db_name}';
- 投稿日:2019-03-05T06:06:27+09:00
Mysqlで直積を使ったテストデータ生成
考えるな、感じろ。
insert into tweet (user_id ,is_private, text,content, liked,retweeted, timestamp) values (1, 1,'csdgrthw',null, 0,4,CURRENT_TIMESTAMP), (2, 0,'vfdbjkjbsda',null,1,5, CURRENT_TIMESTAMP), (3, 0,'xcasdfeabbag',null,1,3, CURRENT_TIMESTAMP), (4, 0,'opjkhgfdsfsvewhy',null,1,3, CURRENT_TIMESTAMP), (5, 0,'saoikjrepok',null,3, 8,CURRENT_TIMESTAMP); drop table if exists tweet1; create table tweet1( `user_id` bigint not null, `is_private` bool, `text` varchar(255) ); create table tweet2( `content` varchar(255) null, `liked` int default 0, `retweeted` int default 0, `timestamp` timestamp ); insert into tweet1(user_id ,is_private, text) values (1, 1,'csdgrthw'), (2, 0,'vfdbjkjbsda'), (3, 0,'xcasdfeabbag'), (4, 0,'opjkhgfdsfsvewhy'), (5, 0,'saoikjrepok'); insert into tweet2(content,liked,retweeted,timestamp) values (null, 0,4,CURRENT_TIMESTAMP), (null,1,5, CURRENT_TIMESTAMP), (null,1,3, CURRENT_TIMESTAMP), (null,1,3, CURRENT_TIMESTAMP), (null,3, 8,CURRENT_TIMESTAMP); drop table if exists tweet3; create table tweet3( `content` varchar(255) null, `liked` int default 0, `retweeted` int default 0, `timestamp` timestamp ); insert into tweet3(content,liked,retweeted,timestamp) values (null, 0,4,CURRENT_TIMESTAMP), (null,1,5, CURRENT_TIMESTAMP), (null,1,3, CURRENT_TIMESTAMP), (null,1,3, CURRENT_TIMESTAMP), (null,3, 8,CURRENT_TIMESTAMP); insert into tweet(user_id,is_private,text,content,liked,retweeted,timestamp) select A.*, B.* from tweet1 A join tweet2 B;