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つのクラスしか継承できない。 では複数のクラスのメソッドを利用したいときはどうするのか? そのときにモジュールを利用する

大規模開発に使うことが多い。

参考サイト クラス・モジュールの概念 Ruby - Qiita

文字分解 unicode 忘備録

特殊文字を分解することになったので,unicodeの調査

コンピュータは直接テキストを扱うことができません。彼らは数しか扱えない。コンピュータ内でテキスト(文字列)を(文字列)数として表現するには、文字から数へのマッピングを指定します。これはエンコーディングと呼ばれます。

エンコードのことですね。

最もよく知られている文字エンコーディングはASCIIです。ASCIIは、英語のアルファベット、0〜9の数字、句読点および制御文字を0〜127の整数にマップする7ビットコードです。その後、さまざまな8ビットエンコーディングが作成され、コンピュータが他の言語でも動作するようになりました。英語。それらは主にASCIIに基づいており、追加の文字、記号、またはアルファベット全体(キリル文字やギリシャ文字など)をエンコードするために未使用の8ビット目を利用していました。

初期は8ビットで足りたということだね

unicodeはこちらで調べられるらしい

Code Charts

正規化フォーム

我々は、文字列の等価性が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以上を利用すること パラメーターグループを作成 f:id:happy_teeth_ago:20190217114959p:plain その後設定

このページが一番良い

blog.hello-world.jp.net

追加で下記のパラメータも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