laravel と Railsの比較-2 忘備録
モデルの作り方
laravel
1-マイグレーションファイル作成
$ php artisan make:migration create_listings_table --create=listings //== make:migration のあとがマイグレーションファイル名 --create= 以下がテーブル名 複数形 --create 以下は省略可能
2-必要に応じてマイグレーションファイルを変更
public function up() { Schema::create('listings', function (Blueprint $table) { $table->increments('id'); $table->string('titile'); $table->string('user_id'); $table->timestamps(); }); }
Schema クラスの createメソッドを利用している 第一引数にテーブル名 第二引数にテーブルを作成するための処理がクロージャーで記載される。
3-マイグレーションファイルの実行
$ php artisan migrate
4-モデルの作成 先程オプションでtableを作ったので、ここではモデルのみ
$ php artisan make:model Listing
フレームワークの例にもれず、モデルは単数形、大文字始まり
laravel と Railsの比較-1 忘備録
どちらもMVCで構成される
routing
laravelは、routeフォルダがある。
基本web.phpでroutingをしていると考えて良い
確認コマンドは、
php artisan route:list
書き方の基本
Route::get(アドレス, 関数);
第一引数にアドレス、第二引数には関数
Route::get('/home', 'HomeController@index')->name('home');
これだと、ルート直下のhomeディレクトリと、HomeControllerのindex アクションが呼ばれている indexアクションは以下
public function index() { return view('home'); }
ここでviewの homeを返却している
ここで resources>view>home.blade.phpが呼ばれる。
このbladeというのは、テンプレートエンジン。 部分テンプレートを出力してくれる。
@extends('layouts.app') @section('content') <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <div class="panel panel-default"> <div class="panel-heading">Dashboard</div> <div class="panel-body"> @if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div> @endif You are logged in! </div> </div> </div> </div> </div> @endsection
@section
@section()~ @endsection は継承することができる。部分テンプレートのイメージ。
@if(条件)は、コントローラーから渡した変数が利用できる
PHPのように<?php と書かなくても@ だけ書けば良い。
{{ session('status') }}
はecho session('status') と同じ意味
@extendsは継承元を記載する。また書きます。
railsのrouting
railsは config>routes にある。
コマンドはurlより
ホームのurl/rails/info/routes
で確認するほうがわかりやすい。
Controller
laravelはapp>Http>Controller
にある。
railsはapp>controller
コンストラクタの書き方
phpは
__construct()と記載する
アンダーバー2つ コンストラクタはnewするだけで自動的に実行される。
rubyは
initialize()
SASSの設定
アプリケーション直下の composer.js に記載する
"require-dev": { "filp/whoops": "~2.0", "symfony/thanks": "^1.0", "panique/laravel-sass": "dev-master" },
public>index.php に以下を記載
SassCompiler::run("scss/", "css/");
public>scss フォルダを作成
composer update を実行
ruby クラス モジュールの違い 忘備録
クラス はオブジェクトになれる
つまりインスタンス化能力を持ち、インスタンスメソッドやクラスメソッドを格納できる。
モジュール はインスタンス化能力は持たないがメソッドを格納できる。
クラスメソッド定義
class hoge def self.hoge #クラスメソッドの実装 end end #こうもかける class hoge class << self #クラスメソッドの実装 end end
そもそも
Rubyは単一継承 1つのクラスしか継承できない。 では複数のクラスのメソッドを利用したいときはどうするのか? そのときにモジュールを利用する
大規模開発に使うことが多い。
文字分解 unicode 忘備録
特殊文字を分解することになったので,unicodeの調査
コンピュータは直接テキストを扱うことができません。彼らは数しか扱えない。コンピュータ内でテキスト(文字列)を(文字列)数として表現するには、文字から数へのマッピングを指定します。これはエンコーディングと呼ばれます。
エンコードのことですね。
最もよく知られている文字エンコーディングはASCIIです。ASCIIは、英語のアルファベット、0〜9の数字、句読点および制御文字を0〜127の整数にマップする7ビットコードです。その後、さまざまな8ビットエンコーディングが作成され、コンピュータが他の言語でも動作するようになりました。英語。それらは主にASCIIに基づいており、追加の文字、記号、またはアルファベット全体(キリル文字やギリシャ文字など)をエンコードするために未使用の8ビット目を利用していました。
初期は8ビットで足りたということだね
unicodeはこちらで調べられるらしい
正規化フォーム
我々は、文字列の等価性がUnicodeの単純な概念ではないことを見ました。コードポイントとコードポイントの2つの文字列を比較する以外に、正規の等価性または互換性の等価性をテストする方法も必要です。ユニコードはこれのためにいくつかの正規化アルゴリズムを定義します。文字列を正規化することは、それを等価な文字シーケンスの一意の表現を保証する形式に変換することを意味します。その結果、文字列を別の正規化文字列とバイナリ比較することができます。
Unicode標準には、C、D、KD、およびKCというラベルの付いた4つの正規化形式があります。これらは、2行2列の行列に配置できます(NSString正規化を実行するメソッドもリストしました)。
UTF-16と代理ペアの概念
UTF-16はもっと一般的であり、これから見るように、NSStringのUnicode実装の議論に非常に関連があります。これは、16ビットの固定幅を持つ、いわゆるコード単位で定義されています。UTF-16自体は可変幅エンコーディングです。BMPの各コードポイントは、1つのコード単位に直接マッピングされています。BMPはほとんどすべての共通文字を網羅しているので、UTF-16は通常UTF-32の半分のメモリしか必要としません。他のプレーンではめったに使用されないコードポイントは、2つの16ビットコードユニットでエンコードされます。一緒に1つのコードポイントを表す2つのコード単位は、サロゲートペアと呼ばれます。
UTF-16でエンコードされた文字列のあいまいなバイトシーケンスを回避し、サロゲートペアを簡単に検出できるようにするため、Unicode規格ではUTF-16の使用のためにU + D800からU + DFFFまでの範囲を予約しています。この範囲のコードポイント値には文字が割り当てられません。プログラムがUTF-16文字列でこの範囲に入るビットシーケンスを検出すると、サロゲートペアの一部に遭遇したことがすぐにわかります。実際のエンコーディングアルゴリズムは単純です、そしてあなたはUTF-16のためのウィキペディアの記事でそれについてもっと読むことができます。UTF-16の設計も、コードポイントの21ビット範囲が奇妙に見える理由です。U + 10FFFFは、この方式でエンコードできる最大値です。
最初の2バイトを調べれば、バイトオーダーを識別できる
すべてのマルチバイトエンコーディングスキームと同様に、UTF-16(およびUTF-32)もバイト順に注意する必要があります。メモリ内の文字列の場合、ほとんどの実装は当然それらが実行されるCPUのエンディアンを採用します。ディスクへの保存やネットワーク上での転送のために、UTF-16は実装が文字列の先頭にByte Order Mark(BOM)を挿入することを可能にします。BOMは値U + FEFFを持つコード単位であり、ファイルの最初の2バイトを調べることによって、デコードマシンはそのバイトオーダーを認識できます。BOMはオプションであり、標準ではデフォルトとしてビッグエンディアンのバイトオーダーを規定しています。バイトオーダーを指定する必要性によってもたらされる複雑さは、OS XとWindowsの両方が内部的にそれを使用するけれども、UTF-16がファイルフォーマットまたはネットワーク上の伝送のための一般的なエンコーディングではない理由の1つです。
文字列をまずlengthで求める
文字列オブジェクトはそれ自身をUnicode文字の配列として表します…。lengthメソッドを使用して文字列オブジェクトに含まれる文字数を決定し、メソッドを使用して特定の文字を取得できますcharacterAtIndex:。これら2つの「プリミティブ」メソッドは、文字列オブジェクトへの基本的なアクセスを提供します。
ただその場合は é は2文字としてカウントされてしまう。
NSString *s = @"e\u0301"; // e + ´ NSLog(@"The length of %@ is %lu", s, [s length]); // => The length of é is 2
文字シーケンスの結合:éがその分解形式(e + ´)でエンコードされている場合、2つのコード単位としてカウントされます。
precomposedStringWithCanonicalMappingを使用すると実際の文字数を把握できる。
NSString *n = [s precomposedStringWithCanonicalMapping]; NSLog(@"The length of %@ is %lu", n, [n length]); // => The length of é is 1
参考サイト
https://www.objc.io/issues/9-strings/unicode/
Ruby で文字列の Unicode コードポイント
参考サイト これでめどが付きました。
Ruby で文字列の Unicode コードポイントと \uXXXX 表記用の 16 進数を得る - @kyanny's blog
めでたし、めでたし
Elastic Beans Rails Deploy 忘備録
ここを参考にRailsに挑戦 AWS Elastic Beanstalk と Python3+Django そしてデプロイ - Qiita
そもそもRubyのバージョンが2.6になっているのが問題。バージョンが違うのだ
仮想環境を設定する。
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create-deploy-python-django.html
Railsの仮想環境はvagrant が良いので、インストールからする。
まずVirtualBox をインストール
最近のMACだと カーネルと呼ばれるOSの中核的機能を拡張するようなアプリケーションのインストールの際、手動での追加認証が必要になりました。普通にすると、インストールできない。 システム環境設定>セキュリティとプライバシーを変更する。
vagrantもインストールされていた
$ vagrant -v Vagrant 2.1.5
作業環境は~/vagrant/centos7 とした。
RDSの問題
mbstringに対応していない。 そのため結論から言うとmysql5.7以上を利用すること パラメーターグループを作成 その後設定
このページが一番良い
追加で下記のパラメータも1にしておく
skip-character-set-client-handshake
リブート完了を待って再びshow variables like 'char%';
rails db:seedをする前なら動く
mysql> select * from users; Empty set (0.00 sec)
AWSRails apach + passenger 環境 忘備録
passengerのモジュールをインストール
496 sudo yum install lobcurl-devel 497 sudo yum install httpd-devel 498 sudo yum install apr-devel 499 sudo yum install apr-util-devel
rbenvだと rehash しないとgemが反映されない 大切
これらすべての問題は,railsのbundlerにgemを追加したことが原因と推定 理由 グローバルにpassenger の gemが入っていないため、/home以下フォルダにて でアパッチのビルドができない。
sudo passenger-install-apache2-module
これはrubyのgemがapachを動かすmodule
ここが非常に参考になる
Apache上でRuby on Railsアプリケーションを動かす/Passenger(mod_rails for Apache)の利用 — Redmine.JP
再度ログインするとyumをupdateしろと
以下のパッケージが新たにインストールされた。
Installing: kernel x86_64 4.14.97-74.72.amzn1 amzn-updates 21 M kernel-devel x86_64 4.14.97-74.72.amzn1 amzn-updates 14 M Updating: curl x86_64 7.61.1-7.91.amzn1 amzn-updates 362 k kernel-headers x86_64 4.14.97-74.72.amzn1 amzn-updates 1.2 M kernel-tools x86_64 4.14.97-74.72.amzn1 amzn-updates 127 k libcurl x86_64 7.61.1-7.91.amzn1
bundle install $ rbenv rehash
/home/hogehoge-user
$ gem install passenger Building native extensions. This could take a while... Successfully installed passenger-6.0.1 Parsing documentation for passenger-6.0.1 Installing ri documentation for passenger-6.0.1 Done installing documentation for passenger after 51 seconds 1 gem installed
再度試みる
$ cd /home/ec2-user/ $ passenger-install-apache2-module
するとメモリが足りないという
Your system does not have a lot of virtual memory Compiling Phusion Passenger works best when you have at least 1024 MB of virtual memory. However your system only has 985 MB of total virtual memory (985 MB RAM, 0 MB swap). It is recommended that you temporarily add more swap space before proceeding. You can do it as follows: sudo dd if=/dev/zero of=/swap bs=1M count=1024 sudo mkswap /swap sudo swapon /swap See also https://wiki.archlinux.org/index.php/Swap for more information about the swap file on Linux. If you cannot activate a swap file (e.g. because you're on OpenVZ, or if you don't have root privileges) then you should install Phusion Passenger through DEB/RPM packages. For more information, please refer to our installation documentation: ttps://www.phusionpassenger.com/library/install/apache/ Press Ctrl-C to abort this installer (recommended).
スワップメモリ領域を変更する。
sudo dd if=/dev/zero of=/swap bs=1M count=2048 //512の単位、ここは思い切って2048にした。 sudo mkswap /swap sudo swapon /swap
今度はうまく行った。
これをapachに設定してくださいと
LoadModule passenger_module /home/ec2-user/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-6.0.1/buildout/apache2/mod_passenger.so <IfModule mod_passenger.c> PassengerRoot /home/ec2-user/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-6.0.1 PassengerDefaultRuby /home/ec2-user/.rbenv/versions/2.4.1/bin/ruby </IfModule>
詳細はこのサイトをみてねと言われる。
Deploying an application - Apache - Passenger Library
以下を実行
これはpassengerが使うrubyとrailsが使うrubyが同じかどうかチェックするコマンド
passenger-config about ruby-command
rubyが使うのもapachが使うのも同じ 問題ない
$ passenger-config about ruby-command passenger-config was invoked through the following Ruby interpreter: Command: /home/ec2-user/.rbenv/versions/2.4.1/bin/ruby Version: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux] To use in Apache: PassengerRuby /home/ec2-user/.rbenv/versions/2.4.1/bin/ruby To use in Nginx : passenger_ruby /home/ec2-user/.rbenv/versions/2.4.1/bin/ruby To use with Standalone: /home/ec2-user/.rbenv/versions/2.4.1/bin/ruby /home/ec2-user/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-6.0.1/bin/passenger start
アパッチ設定ファイル
$ sudo vi /etc/httpd/conf/httpd.conf
設定内容
<VirtualHost *:80> ServerAdmin localhost DocumentRoot /var/www/html/hogehoge PassengerRuby /home/ec2-user/.rbenv/versions/2.4.1/bin/ruby <Directory /var/www/html/hogehoge/public> Allow from all Options -MultiViews </Directroy> </VirtualHost>
アパッチの再起動
$ sudo service httpd restart
Rails seedファイル書き方 忘備録
seed file
Client.create([ {name: :yokohama,address: "東京都新宿区"}, {name: :tarou ,address: "新潟県"} ])