これからPythonの学習を始める上で
はじめに
データ分析に興味があってPythonを始めるきっかけになりました。
どんなモジュールが存在するのか、用途とドキュメントの場所を簡単にまとめました。
モジュールの種類
Beautiful Soup
用途:スクレイピング
Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation
Scrapy
用途:クローリング
Scrapy | A Fast and Powerful Scraping and Web Crawling Framework
pandas
用途:データ解析ツール
Python Data Analysis Library — pandas: Python Data Analysis Library
NumPy
用途:科学計算をする基本パッケージ
Matplotlib
用途:NumPyを使用してグラフを描画(ライブラリ)
Matplotlib: Python plotting — Matplotlib 2.0.2 documentation
所感
正直、"Beautiful Soup"しか使用した事がありません。
使いやすかった事は覚えているのですが、習得コストが掛かるモジュールだった印象です。
これらを復習の後に試していきたいと思います。
以上、最後までお読みいただきありがとうございます。
Pythonの復習
はじめに
直近でPython3をやっていたのですが、年齢の影響か記憶が抜け落ちている箇所があるので復習します。
今回は基本中の基本である"変数"です。
とりあえず、何はともあれGitHubにサンプルプログラムをアップしたので、興味あるかたはご参照ください。(超入門です。)
変数について
今回は数値型(整数、浮動小数点、複素数)、文字列型、リスト型を試しています。
※その他にタプルとか辞書型とかありますが、切りが無いのでリクエストがあったら取り上げます。
ドキュメントはこちらになります。
4. 組み込み型 — Python 3.6.1 ドキュメント
本当はもっとやるはずだったのですが、GitHubの使用方法に躓いて出来ませんでした。(トホホ)
下記の順序で復習したいと思いますが、もしかしたら脱線するかも知れません。
- 制御演算子(if文、for文)
- 自作関数
- クラス
- 例外処理
- from、import
- ドキュメント(.__doc__)の書き方
今回のサンプルプログラムはドキュメント通りなので 、どちらかと言うとprint以降のformat関数を使用しない記述の仕方の方が参考になるかも知れません。
以上、お読みいただきありがとうございます。
python始めました
はじめに
『おい、Ruby on Railsはどうした?』と言う声が聞こえてきそうですが、Pythonを始めるという節操が無い事をお許しください。
...Pythonのお仕事ほしいのです。
Railsは世の中の流れに遅れないようにお勉強しているのです。
以前、Pythonの環境構築を記事にした内容に沿って今回も作ってみたいと思います。
構成
マシンとか
CentOS7 / Python3.6.1
※pyenv、pyenv-virtualenvをインストールが使える環境
リポジトリ
今回の学習用に作成したリポジトリです。
こちらに試しに組んでみたプログラムをドンドン溜めて行きたいと思います。
作業環境作成
リポジトリを~/works/pyhowto以下へ取得する。
>git cl git@github.com:gh-e-river/pyhowto.git ~/works/pyhowto
OR
>git cl https://github.com/gh-e-river/pyhowto.git ~/works/pyhowto
学習用の仮想環境を作成する。
>pyenv virtualenv 3.6.1 pyhowto361
※"Requirement already satisfied"と出るけど無視します。
作業ディレクトリへ移動して仮想環境を有効&確認します。
>cd ~/works/pyhowto
>pyenv activate pyhowto361
>pyenv versions
↓終了したいとき
>pyenv deactivate
ここまでの作業で学習用の環境が作成できます。
手始めにCSVファイルを読み込むような簡単なプログラムを試して見ようかと思います。
気が向いたらその辺もブログにアップしていきたいと思います。
以上、最後までお読みいただきありがとうございます。
Railsのマイグレーションファイルに外部キー制約はどう書くの?
はじめに
タイトル通り、Railsでモデルを作成する時にマイグレーションファイルが作成されますが、その時に外部キー制約を指定したい場合はどうするのか疑問に思ったので試してみました。
環境については後に記述するので一致しない方は別途ご自身で調べてみてください。
ある程度、開発に携わっている方なら、外部キー制約(FOREIGN KEY)をご存知かと思いますが、もし知らない方は下記を読んで外部キー制約の仕様について確認してみてください。(なぜ必要なのかも調べておくといいかも知れません。)
外部キー制約について
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.17.2 外部キー制約の使用
また、この辺の扱い方を詳しく書いているRailsのドキュメントが見当たらず(たぶん調べ方が悪いのだと思います...)、下記の記事が大変参考になりました。ありがとうございます。
参考にさせていただいた記事
環境
Ruby on Rails4
MySQL5.7
手順
始める前に
あるプロジェクト管理テーブル(親テーブル)に紐付くタスクテーブル(子テーブル)という想定です。
親:projects
子:tasks
※外部キー制約の確認が目的なのでカラムを指定しません。
モデル作成
>bundler exec rails g model project
>bundler exec rails g model task
マイグレーションファイル編集
作成されたtasksのマイグレーションファイルを編集します。
>vi db/migrate/yyyymmddxxxxx_create_tasks.rb
class CreateTasks < ActiveRecord::Migration
def change
create_table :tasks do |t|
t.references :project, foreign_key: true
t.timestamps null: false
end
end
end
マイグレーション実行
>bundler exec rake db:migrate RAILS_ENV=development_root
作成されたテーブルの確認
mysqlクライアントでDBに接続してテーブル作成確認コマンドで確認してみましょう。
>mysql -uユーザー -p
>show create table table_name
希望通りにprojectsテーブルのidとtasksテーブルのproject_idが外部キー制約(FOREIGN KEY)になっております。
CREATE TABLE `projects` ( `id` int(11) NOT NULL AUTO_INCREMENT, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CREATE TABLE `tasks` ( `id` int(11) NOT NULL AUTO_INCREMENT, `project_id` int(11) DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), KEY `fk_rails_02e851e3b7` (`project_id`), CONSTRAINT `fk_rails_02e851e3b7` FOREIGN KEY (`project_id`) REFERENCES `projects` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
所感
いつものようにRailsのお作法に則って記述すれば全く難しい事はありません。
しかし、全てのシステムがこのようになっているとは限りません...
例えば
- idカラムが存在しないテーブルと外部キー制約をする場合はどうかいたらいいのか
- 外部キーの名前を指定できないのか
この辺はもう少し掘り下げて調べてみる必要があるかも知れません。
もしかしたら、モデルだけ作成してマイグレーションファイルは作成しないとか...
以上、最後まで読んでいただきありがとうございます。
Railsのモデル作成時にカラム指定をしてみた!
はじめに
お問い合わせフォームの時には特に考えてやっていなかったのですが、テーブル構築時に普通ならnot nullやデフォルト値の設定などすると思います。
今回はそんな設定をしてテーブル作成をしてみました。
手順
以前にもやったと思いますが、今後は"scaffold"を使用して一通り作成します。
scaffoldとmodelの違いがイマイチ分かりません...
>bundler exec rails g scaffold mogu code:string name:string zip:integer address:string telephone:integer
作成されたマイグレーションファイルを編集
お馴染みのマイグレーションファイルが生成されると思います。
先ほどのコマンドで"db/migrate/yyyymmddxxxxxx_create_mogus.rb"というファイルができます。
今回は下記の仕様でテーブルを作成したいと思います。
- idカラムは使わない
- idの代わりにcodeカラムをプライマリキー指定
- codeの文字列は32文字がMax
- zipカラムは20文字まで
- addressカラムはデフォルト"Tokyo"
- code, name, addressはnull不可
書き出すとこんな感じです。
class CreateMogus < ActiveRecord::Migration
def change
create_table(:mogus, :id=>false, :primary_key=>"code") do |t|
t.string :code, null: false, limit:32
t.string :name, null: false
t.integer :zip, limit: 7
t.string :address, null: false, default: 'Tokyo'
t.integer :telephone
t.timestamps null: false
end
end
end
テーブル作成
>bundler exec rake db:migrate RAILS_ENV=development_root
※RAILS_ENV=development_rootは個人的に設定している値です。
確認
+------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+-------+ | code | varchar(32) | NO | | NULL | | | name | varchar(255) | NO | | NULL | | | zip | bigint(20) | YES | | NULL | | | address | varchar(255) | NO | | Tokyo | | | telephone | int(11) | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +------------+--------------+------+-----+---------+-------+
個人的感想ですが、毎回テーブル作成する度にidカラムがデフォルトで用意されるのは気持ち悪いです。(古い人の考えだからかも知れませんが...)
この辺って文化的にどうなんでしょうか。
もし、優しくてRails=自分だという方は是非教えてください。
以上、最後まで読んでいただきありがとうございます。
【便利】いいツールありました。(anyenv)
Reactの記事を読んでいたらNode.jsのインストールの話になり、『ndenvとはあるのかな?』と検索していたら、もっと便利な『anyenv』を見つけました。
『*env』と付くものをインストールしようとすると大抵これで済みそうです。
便利です。ありがたいですね。
感想
最近、開発周りの環境が充実していて独自の機能実装をしない限りバックエンドだけに限って言えばコーディングする量が十数年前に比べて、だいぶ減っているかと思います。
寧ろフロントエンド、ミドルウェアエンジニア、DBエンジニアの方が大変かと思います。
もちろん、バックエンドエンジニアも暇と言う訳では無いです!色んな所に駆り出される人が多いでしょうから...
Ruby on Railsのお勉強 〜お問い合わせフォーム編(save) その7〜
はじめに
前回の作業でバリデーション(検証)が完了したので最後のデータ登録を試して見たいと思います。
↓バリデーションはこちら を参照ください。
やる事
...特に無し?
今回はただ単純に登録するだけなので特に難しい事はありません。
手順
thanksページまで遷移した前提で話を進めます。
因みにthanksページはこのように記述します。
class InquiryController < ApplicationController
... 中略 ...
def thanks
@inquiry = Inquiry.new(post_params)
if @inquiry.save == false
render template: 'inquiry/index'
end
end
... 中略 ...
end
たったこれだけでした。
save実行時にバリデーションが実行されるので、わざわざやる必要が無いそうです。
因みに、モデルに値を渡して初期化されるか確認するには、railsのコンソールで下記のようにコマンドできます。
>bundler exec rails console --sandbox
>inquiry = Inquiry.new(name: 'hoge_name', mail: 'hoge_mail@gmail.com', telephone: '12345')
=> #<Inquiry id: nil, name: "hoge_name", mail: "hoge_mail@gmail.com", telephone: "12345", created_at: nil, updated_at: nil>
だいぶ呆気ないのですが簡単なお問い合わせフォームで感覚を掴んでみる程度だと、こんなもんで登録できてしまいます。
課題
モデル
- 書き方(ビジネスロジックとの住み分け)
- 初期化(attr_accessorが不要な理由)
- 親子関係のテーブルの扱いかた
バリデーション
- 自作
- 組み合わせ
- テーブルの親子関係
その他
- 例外処理
- ロールバックの動き
- テーブル構築時の指定(not nullなど)
- データの流し込み作業
ざっと考えただけでもこれくらいある。
とりあえず、1つずつ吸収していくしかないですね。
お問い合わせフォームに関してはこれで完結とさせていただきます。
今後は疑問に思った事を中心に作業してみたいと思います。
以上、最後まで読んでいただきありがとうございます。