【Rails】Association 1:nのモデル

rails g model project name:string
rails g model group name:string

rails g migration AddProjectIdToGroup project_id:integer

【model】に追記

class Group < ActiveRecord::Base
    belongs_to :project
end

 

rake db:migrate

 

【使い方】

p=Project.create(name: “PRJ”)
g=Group.create(name:”GRP1″)
g.project=p

 

Projectからgroupを参照するときは、下記を追加

 

class Project < ActiveRecord::Base

    has_many :groups
end

 

g = Group.find(1)

p = Project.find(1)

p.groups << g

 

ただし、

group.project = p

しただけでは、

p.groupsに反映されないので注意

 

 

【Rails】アクセストークンをHttp Headerに含める

  • 準備

rails g model User auth_token

rails g controller Episodes

 

  • model

class User < ActiveRecord::Base
before_create :set_auth_token

private
def set_auth_token
return if auth_token.present?

begin
self.auth_token = SecureRandom.hex
end while self.class.exists?(auth_token: self.auth_token)
end
end

 

  • テストデータ作成

rails c

User.create

 

  • コントローラー

class EpisodesController < ApplicationController

before_action :authenticate

def show
render text:”============show”
end

protected
def authenticate
authenticate_or_request_with_http_token do |token, options|
User.find_by(auth_token: token)
end
end
end

 

  • routes

get ‘show’ => ‘episodes#show’

 

・curlでアクセス

curl http://localhost:3000/show -H ‘Authorization:Token token=”05c97536d24572ec38c1cd377652c901″‘

【Rails】n : mのmodel

n:mのmodel定義

has_many    through:を使う

  • モデル定義

rails g model User name:string

rails g model Project name:string

rails g model UserProjectGroup user_id:integer project_id:integer

rake db:migrate

modelに追記

class User < ActiveRecord::Base
has_many :user_project_groups
has_many :projects, through: :user_project_groups
end

class Project < ActiveRecord::Base
has_many :user_project_groups
has_many :users, through: :user_project_groups
end

class UserProjectGroup < ActiveRecord::Base
belongs_to :user
belongs_to :project
end

・コントローラ

rails g controller user_project

class UserProjectController < ApplicationController

def relate

user1 = User.create(name: “ichiro”)
user2 = User.create(name: “jiro”)

px = Project.create(name: “X”)
pa = Project.create(name: “A”)

user1.projects << pa   #関連づけ
user2.projects << pa

user1.projects << px
user2.projects << px

render json: UserProjectGroup.all
end

def ichiro
user1 = User.find_by_name(“ichiro”)
render json: user1.projects
end

def jiro
user2 = User.find_by_name(“jiro”)
render json: user2.projects
end

end

  • ルーティング

get ‘relate’ => ‘user_project#relate’

get ‘ichiro’ => ‘user_project#ichiro’
get ‘jiro’ => ‘user_project#jiro’

【Rails】JSON出力

JSON出力について。

jbuilderを使う。

 

  • ルーティング(config/routes.rb)

get ‘show’ => ‘sessions#show’

 

  • コントローラー(app/controllers/sessions_controller.rb)

class SessionsController < ApplicationController
protect_from_forgery with: :null_session

def show
@status =’ok’
@users = User.all
render “show”, :formats => [:json], :handlers => [:jbuilder]
end

※ @変数はtemplateに引き継がれる。

 

  • viewテンプレート(views/sessions/show.json.jbuilder)

json.status @status

json.users do
json.array!(@users) do |u|
json.name u.name
end
end

 

  • 結果
{"status":"ok","users":[{"username":"admin"},{"username":"mknod"}]}

 

【Rails】Session

ユーザーログインサンプル

rails new xxxx

GemFileでbcrypt有効にし、bundle install

 

  • モデル作成

rails g model user name:string password_digest:string

rake db:migrate

app/models/user.rbにhas_secure_password追記

 

  • コントローラー作成

rails g controller sessions

app/controllers/sessions_controller.rb

 

class SessionsController < ApplicationController
protect_from_forgery with: :null_session

def add_user
user = User.new
user.name = params[:name]
user.password = params[:pass]
user.password_confirmation = params[:pass]
user.save

render text: “OK”
end

def create
user = User.find_by_name params[:name]
if user && user.authenticate(params[:pass])
session[:user_id] = user.id
render text: session[:user_id]
else
render “NG”
end
end

def destroy
session[:user_id] = nil
redirect_to root_path
end

end

 

  • ルーティング設定

config/routes.rb

 

・サーバー起動

rails s

【Rails】Userモデル作成

railsでのUserモデル/コントローラーの作成サンプル

 

  • rails new testApp
  • cd testApp
  • Gemfileの編集 gem ‘bcrypt’を有効にする。
  • bundle install
  • config/routes.rbにルーティング追記

match ‘:controller(/:action(/:id))’, via:[:get, :post]

  • rails g model User           モデルは頭文字大文字 & 単数形
  • rails g controller Users   コントローラーは頭文字大文字 & 複数形
  • app/models/user.rbに追記

class User < ActiveRecord::Base
  has_secure_password
end

  • app/controllers/users_controller.rbにアクション追加

class UsersController < ApplicationController

#CSRF Token
protect_from_forgery with: :null_session

def create

user = User.new
user.name = params[:name]
user.password = params[:name]
user.save
render text:’OK’

end

def show
users = User.all

render json: users
end
end

 

  • rails s
  • FirefoxでPOST/GETのテスト

localhost:3000/users/create

name=aaa,password=123

 

localhost:3000/users/show

 

【Rails】Railsアプリケーション作成

railsアプリケーションを作る

rails new testapp

 

railsアプリケーションを起動

rails server

 

モデルを作る (単数系で頭を大文字 e.g. Project )

rails generage model Project title:string

 

データベースに反映

rake db:migrate

 

データベースの確認

rails db
sqlite > .shema

sqlite> select * from projects;

 

rubyコンソール
rails console
>p=new Project(title:”p1″)
>p.save()

>Project.create(title:”p2″)

>Project.all

>exit

 

コントローラーを作る

rails g controller Projects        ※モデルは複数形で指定する事

      create  app/controllers/projects_controller.rb

      create    app/views/projects

 

ルーティング設定をする
config/routes.rbにmodelを追記

Rails.application.routes.draw do

resources :projects

 

ルーティングを反映する
→ new/delete等のURLが作成される。

rake routes

Prefix Verb URI Pattern Controller#Action
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy

 

 

モデルのデータ一覧
インデックスアクションを作る

  • コントローラーに下記の関数を追加

def index
@projects = Project.all
end

  • viewを追加(index.html.erb)

<h3>Projects</h3>
<ul>
<% @projects.each do |prj| %>
<li><%= prj.title %></li>
<% end%>
</ul>

 

 URLルートを設定する

config/routes.rbに追記する。

root ‘projects#index’

 

Viewの共通テンプレート

このファイルを変更する
app/views/layout/application.html.erb

<%= yield %> ユーザーのviewがここに展開される

 

  • イメージタグをつける

assets/image/xxx.png

<%= image_tag “xxx.png” %>

 

  • スタイルシートの共通設定を変更する

assets/stylesheets/application.css

<%= link_to “home”, “/” %>
<%= link_to “home”, projects_path %>
<%= link_to “new”, new_project_path %>

このprojects_pathは、「rake routes」のPrefixのところに「_path」をつけたもの

Prefix Verb URI Pattern Controller#Action
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy

 

詳細表示画面を追加する 

コントローラーにアクションを追加する。

rake routesのときにログからurl取得

 

Prefix Verb URI Pattern Controller#Action
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy

 

class ProjectsController < ApplicationController

def index
@projects = Project.all
end

    def show
        @projects = Project.find(params[:id])
    end
end

 

 対応するViewを作成「show.html.erb」

<h3><%= @project.title %></h3>

 

送信フォームを作る

html

<li><%=link_to “add new”, new_project_path %></li>

controller

def new
@project = Project.new
end

def create
@project = Project.new(project_params)
@project.save

redirect_to projects_path
end

private

def project_params
params[:project].permit(:title)
end

 

view

<%= form_for @project do |f| %>
<p>
<%= f.label :title %>
<%= f.text_field :title %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>

 

 

フォームの入力制限を行う。

model

class Project < ActiveRecord::Base

validates :title, presence: true
end

 

フォームの入力制限を行う。エラーメッセージ付き

validates :title, 

presence: { message: “入力してください” },
length: {minimum: 3, message: “短いです” }

 

presence: trueは、必須項目にするの意

def create
@project = Project.new(project_params)
if @project.save
redirect_to projects_path   ←セーブ成功
else

render ‘new’        ←セーブ失敗
end

 

view 

<%= form_for @project do |f| %>
<p>
<%= f.label :title %>
<%= f.text_field :title %>
<% if @project.errors.any? %>
#<%= @project.errors.inspect %>     エラー表示
<% end %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>

 

フォームの共通化(パーシャル)

new.html.erb / edit.html.erb 

<%= render ‘form’ %>

 

view

_form.html .erbを作成し、共通フォームを作成

先頭に_をつけるルール

 

actionが呼ばれた時のコールバック設定

actionが呼ばれたときにset_projectメソッドを呼び出す例。show,edit,update,destroyに適用。

before_action :set_project, only: [:show, :edit,:update,:destroy]

 

モデルを作る

rails g model Task title:string done:boolean project:references

 rake db:migrate

 rails g controller Tasks

モデルを1:nにする

class Project < ActiveRecord::Base
has_many :tasks 

 

ルーティングの作成(routes.rb)
resources :projects do

resources :tasks, only:[:create, :destroy]
end
ルーティングの確認
rake routes

Prefix Verb URI Pattern Controller#Action
project_tasks POST /projects/:project_id/tasks(.:format) tasks#create
project_task DELETE /projects/:project_id/tasks/:id(.:format) tasks#destroy
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy
root GET / projects#index
コントローラーの実装
task.rb

 

チェックボックスを作る

html

<%= check_box_tag ”,”, t.done,{‘data-id’ => t.id, ‘data-project_id’ => t.project_id } %>

下記のコードになる。

<input data-id=”16″ data-project_id=”4″ id=”” name=”” type=”checkbox” value=”” />

 

jQueryでPOST

<script>
$(function(){
$(“input[type=checkbox]”).click(function(){
$.post(‘/projects/’+$(this).data(‘project_id’)+’/tasks/’+$(this).data(‘id’)+’/toggle’)
});
});
</script>
routeの設定(jQueryのPOSTされたURLをtasksのtoggleにルーティング)
post ‘/projects/:project_id/tasks/:id/toggle’ => ‘tasks#toggle’

 

controller

def toggle
 render nothing: true    #テンプレートを返さない
@task = Task.find(params[:id])
@task.done = !@task.done
@task.save
end

 

【Ruby】Ruby文法

エンコーディング表示

__ENCODING__

print(“endoding = “, __ENCODING__)

 

数値リテラル

123

-123

123456789    123_456_789   これもOK

 

n進数表記

2進 0b10101

8進 052

16進 0xa5

実数

小数点の表記 1.2

指数表記   12e-1

指数表記   0.12e+1

 

有理数(分数) !!!これははじめてみたな、、

1/3r      3分の1

 

複素数

42i     虚部が42

5+42i     実部が5 で虚部が42

 

文字数リテラル

シングルとダブルがあるが

ダブルクォーテーションだと、式展開と\tとか\nが使える。

 

式展開 #{xxxx}

中括弧の中身がrubyのコードとして実行される。

name=”ABC”

“My name is #{name}”

 

シンボル

:をつけた変数?

後ほど調べる。

 

ビット/シフト演算

Cと同じ

 

代入

a=1

a,b=1,2

 

多重代入

a,b,c=1,2

a -> 1

b -> 2

c -> nil

 

a,b = [1,2]    配列も可能

 

【注意】++、–はないので x+=1でやる。

 

条件文(if – elsif – else – end)

a = 2;

if a==1

        puts(“IF”)

elsif a==2

        puts(“ELSIF”)

else

        puts(“ELSE”)

end

swithcもどき

a = ARGV[0].to_i

case a

when 0

puts “0”

when 1

puts “1”

when 2, 3

puts “2か3”

else

puts “else”

end

 

繰り返し

a = ARGV[0].to_i

case a

    when 0

        puts “0”

    when 1

        puts “1”

    when 2

        puts “2”

    else

        puts “else”

end

i=1

while i<=10

        puts i

        i+=1

end

i=0;

while true

        i+=1;

        puts i

        if i>10

                break;

        end

end

i=0

while i < 10

        i+=1;

        if i % 2 == 0

                puts i;

                next;

        end

end

for obj in [“AAA”,”BBB”,”CCC”]

        puts obj;

end

for i in 0…10

        puts i;

end

[“A”,”B”,”C”].each do |str|

        puts str

end

 

 

 

 

 

 

 

 

【Rails】Railsメモ

DRY don’t repeat yourself

CoC Convention over Configuration (規約)

MVC   

  • model データ
  • view 画面 ERB テンプレート
  • controller プログラム

StrongParameter

コントローラーで、パラメータに制限を付けるセキュリティ強化の為の機能

Turbolinks

CSSや、Javascript等のロードを省き、コンテンツのみの書き換えを行う仕組み

Russian Doll Caching

キャッシュをより簡単に使えるようにする機能
rbenv/RVM

プロジェクト毎にライブラリの管理ツール
【開発環境】
Ruby2.1
Rails4

【Install】
gem install rails
※ gem RubyGems, ruby用のパッケージ管理ツール

 

・アプリケーションを作る。
rails new myapp

 

・railsを起動
rails server

rails s
modelを作成する
scaffold
rails generate scaffold User name:string score:integer

・DBへmigrateとする

rake db:migrate

 

【デバッグツール】
gem install pry

 

【Django】ajax sample

【url】

url(r’^_sample/$’, ‘_sample’),
url(r’^_sample_json/$’, ‘_sample_json’),

 

【html】

<!DOCTYPE html>

{% load bootstrap3 %}
{% bootstrap_css %}
{% bootstrap_javascript %}
{% bootstrap_messages %}
{% load staticfiles %}

<html lang=”en”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
<meta charset=”utf-8″>
<meta http-equiv=”X-UA-Compatible” content=”IE=edge”>
<meta name=”viewport” content=”width=device-width, initial-scale=1″>
<meta name=”description” content=””>
<meta name=”author” content=””>
<link rel=”icon” href=”http://getbootstrap.com/favicon.ico”>

<title>SENSOR NETWORKS</title>

</head>

<body data-spy=”scroll”>

<div class=”container”>
<h3>SAMPLE</h3>
</div>

<!– BUTTON –>
<form role=”form”>
<button id=”bt_json” type=”button” class=”btn btn-default”>modal</button>
<button id=”bt_django” type=”button” class=”btn btn-default”>django</button>
</form>

<!– DIALOGS –>
<div>
<div id=”dialog” class=”modal fade”>
<div class=”modal-dialog”>
<div class=”modal-content”>
<div class=”modal-header”>
<button type=”button” class=”close” data-dismiss=”modal” aria-hidden=”true”>&times;</button>
<h4 class=”modal-title”>User Information</h4>
</div>
<div id=”dymanic_data” class=”modal-body”>

<!– dynamic data –>

</div>
<div class=”modal-footer”>
<button type=”button” class=”btn btn-default” data-dismiss=”modal”>Cancel</button>
<button type=”submit” class=”btn btn-primary”>Update</button>
</div>
</form>
</div>
</div>
</div>

<!– javascript –>
<script src=”{{ STATIC_URL }}/static/js/jquery.min.js”></script>
<script src=”{{ STATIC_URL }}/static/js/bootstrap.min.js”></script>
<script type=”text/javascript”>

$(document).ready( function() {

$(‘#bt_json’).click(function(){

$.getJSON(“../_sample_json”, function(json){

buf = “”
buf += “<ul>”;
for(i = 0 ; i < json.projects.length; i++){
buf += “<li>”
buf += json.projects[i].name
buf += “</li>”
}
buf += “</ul>”;
$(‘#dymanic_data’).html(buf);
})
$(“#dialog”).modal(“show”);
})
$(‘#bt_django’).click(function(){

$(“#dymanic_data”).load(“../_sample”);
$(“#dialog”).modal(“show”);
})

})

</script>
</body>
</html>

 

【view】

def _sample(request):

objs = Project.objects.all().order_by(‘name’);
return render_to_response(‘sn/modal_project.html’, {‘object_list’: objs})
def _sample_json(request):

resp = {}
arr = [];
objs = Project.objects.all().order_by(‘name’);
for o in objs:
p = {}
p[‘name’] = o.name
arr.append(p);
resp[‘projects’] = arr

return HttpResponse(json.dumps(resp), mimetype=”application/json”)

 

【html】dynamic data

{{ object_list|length }}
<ul>
{% for o in object_list %}
<li>{{ o.name }}</li>
{% endfor %}
</ul>

 

【Django】テンプレートタグ

<% if  xxxx %> /<% else %> には:がつかないので注意。pythonと違う。

あと、<%endif %>が必要。

参考

http://docs.djangoproject.jp/en/latest/ref/templates/builtins.html#std:templatetag-if

 

<tbody>

{% for prj in projects_list.projects %}
{% if prj.groups %}
{% for grp in prj.groups %}
<tr>
<td >{{ prj.name }}</td>
<td >{{ grp.name }}</td>
<td >
</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td >{{ prj.name }}</td>
<td >-</td>
<td >
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>

 

 

【iOS】CocoaPodsでiOSライブラリ管理

$ cocoapodsインストール
sudo gem install cocoapods

結構待った、、完了。

$ pod setup
(~/.cocoapodsの中身が更新されるらしい)
プロジェクト作成し、A.xcodeprojファイルがある場所へ移動し、”Podfile”を用意する。
$cd どこか
$vi podfile

platform :ios,”6.0″
pod ‘CocoaHTTPServer’
pod ‘AFNetworking’,’~> 2.0′

それから
$ pod install

podfileを追記/削除したときは
$ pod update

【Django】BootStrapをインストールする

djangoにbootstrapをインストール。

http://django-bootstrap3.readthedocs.org/en/latest/

 

$ pip install django-bootstrap3

Add to INSTALLED_APPS in your settings.py:

'bootstrap3',
templateに下記を追加する。
{# Load the tag library #}
{% load bootstrap3 %}

{# Load CSS and JavaScript #}
{% bootstrap_css %}
{% bootstrap_javascript %}

{# Display django.contrib.messages as Bootstrap alerts #}
{% bootstrap_messages %}

 

 

BootStrap

BootStrap

CSSツール、とても便利。

 

Grunt
install node.js(npm(node package module)を含む)
http://nodejs.org/download/

JavaScriptでは、以下の作業を行う時がある。。
・minify(圧縮)や結合
・単体テストの実行
・JSLint(構文チェック)の実行

さらに、CoffeeScriptやTypeScript等を使用している場合、
一度JavaScriptへ変換する必要もある。

その自動化ツール(タスクランナー)と呼ばれている。
node.jsを使っていてJS変換スクリプトGruntfile.jsをjavascriptで書いて
タスクを定義する。

【OF + addon】衛星の軌道を計算する。ofxOrbitTools

ofxOrbitTools

NORAD(北アメリカ航空宇宙防衛司令部)から取得したTLE(two line element)をもとに、SGP4(Simplified General Perturbations Satellite Orbit Model)アルゴリズムを用いて衛星の軌道を計算する

 

下記はそのライブラリのOrbitToolsサイトです。

http://www.zeptomoby.com/satellites/

openFrameworksのaddonを作成しました。

ofxOrbitToolsです。

今回はpublic edition(free for non-commercial)を使用させていただきました。

 

リポジトリはこちらです。

https://u26@bitbucket.org/u26/ofxorbittools.git

CDN (Contents Delivery Network)

CDN (Contents Delivery Network)
アクセス集中で、反応が遅くなったり応答不能になる(フラッシュクラウド効果)
に対処するため、サーバーを一カ所に置くだけでなく、地理的に、バックボーン的に分散させる。

サーバーのミラーリング
・DNSラウンドロビン
・PSP
・位置情報を加味したアクセス分散等