月: 2019年11月

  • laravelのmigration(migrate)を使いcreate table

    laravelのmigration(migrate)を使いcreate table

    はじめに

    laravelのmigration機能を使ってcreate tableを行う。

     デフォルトの設定

    laravelのmigrationファイルは以下の通り

    “` database/migrations “` 配下にファイルが存在している。

    database/migrations/
    合計 12
    -rw-rw-r--. 1 coco nginx 746 11月 26 04:18 2014_10_12_000000_create_users_table.php
    -rw-rw-r--. 1 coco nginx 683 11月 26 04:18 2014_10_12_100000_create_password_resets_table.php

    テーブルを追加する

    migrationファイルの追加

    php artisan make:migration create_hogehoge_table --create="hoge"

    hogehogeというファイル名のintegration fileが作成され、hogeテーブル作成のphpファイルが作成される。

    カラムを追加する

    viで追加したいカラムを追加する

    laravelで使うことができるメソッドは以下の公式ドキュメントに書いてある

    https://laravel.com/docs/5.8/migrations

    例えば、stringであればvarcharに置き換えられる

    動作確認

    migrate前にテーブルを確認する

    mysql> show tables;
    +-------------------+
    | Tables_in_laravel |
    +-------------------+
    | migrations        |
    | password_resets   |
    | users             |
    +-------------------+
    3 rows in set (0.00 sec)

    デフォルトのusersテーブルと、残り2つはmigrationを実施する際に作成されるテーブル

    migrateを実施する

    php artisan migrate

    問題なければ以下のようにテーブルが新規でhogeテーブルが作成される

    mysql> show tables;
    +-------------------+
    | Tables_in_laravel |
    +-------------------+
    | hoge              |
    | migrations        |
    | password_resets   |
    | users             |
    +-------------------+
    4 rows in set (0.00 sec)
    
    mysql> 
    

     状況確認

    migrationの状況を確認するには “` migrate:status “` を実行する。

    [coco@instance-2 cms]$ php artisan migrate:status 
    +------+------------------------------------------------+
    | Ran? | Migration                                      |
    +------+------------------------------------------------+
    | Y    | 2014_10_12_000000_create_users_table           |
    | Y    | 2014_10_12_100000_create_password_resets_table |
    | Y    | 2019_11_28_161446_create_hogehoge_table        |
    +------+------------------------------------------------+
    [coco@instance-2 cms]$ 

    RunがYの場合は、migrationが完了しているものになる。

  • ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

    ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

    はじめに

    パスワードを更新を促されるメッセージ。パスワードポリシーに則った形で変更するパスワードを必要がある。

    パスワード変更方法

    set password for root@localhost=password('hogeHoge@Hog123');

    結果以下の通りなれば成功

    mysql> set password for root@localhost=password('hogeHoge@Hog123');
    Query OK, 0 rows affected, 1 warning (0.05 sec)
    

    参考情報

    https://qiita.com/RyochanUedasan/items/9a49309019475536d22a

     

  • laravelでControllerを自動作成する

    laravelでControllerを自動作成する

    はじめに

     laravelでは“`php artisan“` コマンドを使って、Controllerを自動生成することができる

    通常の生成

    php artisan make:controller PostsController

    Controller created successfully.

    と表示されれば、app/Http/Controllers ディレクトリに作られる。

    上記コマンドの場合は以下のファイルになる。

    app/Http/Controllers/PostsController.php

    中身はこのような感じ。

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    
    class PostsController extends Controller
    {
        //
    }
    

    プレーンで何もない。

    resourceオプションを付けた生成

    php artisan make:controller --resource PostsController2

    必要なfunctionも含めて作られる。

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    
    class PostsController2 extends Controller
    {
        /**
         * Display a listing of the resource.
         *
         * @return \Illuminate\Http\Response
         */
        public function index()
        {
            //
        }
    
        /**
         * Show the form for creating a new resource.
         *
         * @return \Illuminate\Http\Response
         */
        public function create()
        {
            //
        }
    
        /**
         * Store a newly created resource in storage.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return \Illuminate\Http\Response
         */
        public function store(Request $request)
        {
            //
        }
    
        /**
         * Display the specified resource.
         *
         * @param  int  $id
         * @return \Illuminate\Http\Response
         */
        public function show($id)
        {
            //
        }
    
        /**
         * Show the form for editing the specified resource.
         *
         * @param  int  $id
         * @return \Illuminate\Http\Response
         */
        public function edit($id)
        {
            //
        }
    
        /**
         * Update the specified resource in storage.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  int  $id
         * @return \Illuminate\Http\Response
         */
        public function update(Request $request, $id)
        {
            //
        }
    
        /**
         * Remove the specified resource from storage.
         *
         * @param  int  $id
         * @return \Illuminate\Http\Response
         */
        public function destroy($id)
        {
            //
        }
    }
    

    resourceオプションを付け、不要なものは削除していくという使い方でも良いかも。

  • laravelでrouteの一覧を表示する

    laravelでrouteの一覧を表示する

    はじめに

    Laravelでルーティングを全て表示する方法を紹介します。

    ルーティング設定の方法

    Laravelでは、有効なメソッドとURLを表示するために、以下のphp artisan route:listコマンドを利用します。

    php artisan route:list
    このコマンドを実行すると、以下のようなルーティング一覧が表示されます。
    +--------+----------+--------------+------+--------------------------------------------+--------------+
    | Domain | Method   | URI          | Name | Action                                     | Middleware   |
    +--------+----------+--------------+------+--------------------------------------------+--------------+
    |        | GET|HEAD | /            |      | App\Http\Controllers\PostsController@index | web          |
    |        | GET|HEAD | api/user     |      | Closure                                    | api,auth:api |
    |        | GET|HEAD | posts/back   |      | App\Http\Controllers\PostsController@back  | web          |
    |        | GET|HEAD | posts/{post} |      | App\Http\Controllers\PostsController@show  | web          |
    +--------+----------+--------------+------+--------------------------------------------+--------------+

    ルーティング設定の方法

    <?php
    Route::get('/', 'PostsController@index');
    // 数字のみを受け付けるルート設定
    Route::get('/posts/{post}', 'PostsController@show')->where('post','[0-9]+');
    // 記事のタイトルを受け付けるルート設定
    Route::get('/posts/{slug}', 'Posts

    laravel の実践向け書籍

  • mmap() failed: [12] Cannot allocate memory

    mmap() failed: [12] Cannot allocate memory

    はじめに

    laravelをinstall時、memoryが不十分だとinstallでエラーになる。

    twitterで投稿したところ、アドバイスもらった。確かにswapの設定してなかった。。

    クラウドであれば一時的にインスタンスタイプを変更することでインストールできるが、今回はインスタンスタイプを変更せず対応する。

    swapを設定する

    実は、GCPやAWSの場合、デフォルトでswapの設定がされていない。

    # free
                  total        used        free      shared  buff/cache   available
    Mem:         601172      383328       48068       14160      169776      107824

    手動でswapを設定する

    cat /proc/swaps
    dd if=/dev/zero of=/swapfile bs=1M count=2048
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    free -m

    再起動しても設定されるよう、fstabに設定を追加する

    /swapfile   swap        swap    defaults        0   0

    作業後

    無事swapが追加された

    free -m
                  total        used        free      shared  buff/cache   available
    Mem:            587         375          43          13         167         103
    Swap:          2047           0        2047

    @kondonator さん、ありがとうございます🙏

     

  • CentOS7にlaravel install(nginx,php-fpm)

    CentOS7にlaravel install(nginx,php-fpm)

    はじめに

    PHP でcomposerをinstallしようとした際に使った手順まとめ

    オフィシャルサイトに書いてあったコマンドをそのまんまコピペでinstallすることができる。

    https://getcomposer.org/download/

    今回はnginx, php-fpmで動作する環境を作る。

    nginx install

    yum install nginx -y
    

    設定ファイル修正

    cd /etc/nginx/conf.d
    cp -p default.conf default.conf.org
    vi default.conf
    server {
      listen 80;
      server_name localhost;
      root /usr/share/nginx/html/;
      index index.php index.html index.htm;
    
      location / {
        try_files $uri $uri/ /index.php?$query_string;
      }
    
      location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
      }
    }

    /etc/nginx/nginx.conf に/etc/nginx/conf.d/default.conf をincludeする設定をするのを忘れずに。

    自分はすっかり忘れて無駄な時間を費やしました。

    上記設定が終わったら再起動する

    systemctl restart nginx

    php-fpmなどをinstall

    yum -y --enablerepo=remi-php72,epel install php-fpm php-gd php-gmp php-mbstring php-mcrypt php-opcache php-pdo php-pear-MDB2-Driver-mysqli php-pecl-memcached php-pecl-msgpack php-xml php-devel php-gd

    php-fpmの設定ファイルを修正

    cd /etc/php-fpm.d/
    cp -p www.conf www.conf.org
    vi www.conf
    [www]
    listen.allowed_clients = 127.0.0.1
    user = nginx
    group = nginx
    listen = /var/run/php-fpm.sock
    listen.owner = nginx
    listen.group = nginx
    pm = dynamic
    pm.max_children = 50
    pm.start_servers = 5
    pm.min_spare_servers = 5
    pm.max_spare_servers = 35
    slowlog = /var/log/php-fpm/www-slow.log
    php_admin_value[error_log] = /var/log/php-fpm/www-error.log
    php_admin_flag[log_errors] = on
    php_value[session.save_handler] = files
    php_value[session.save_path] = /var/lib/php/session
    [www]
    listen.allowed_clients = 127.0.0.1
    user = nginx
    group = nginx
    listen = /var/run/php-fpm.sock
    listen.owner = nginx
    listen.group = nginx
    pm = dynamic
    pm.max_children = 50
    pm.start_servers = 5
    pm.min_spare_servers = 5
    pm.max_spare_servers = 35
    slowlog = /var/log/php-fpm/www-slow.log
    php_admin_value[error_log] = /var/log/php-fpm/www-error.log
    php_admin_flag[log_errors] = on
    php_value[session.save_handler] = files
    php_value[session.save_path] = /var/lib/php/session
    systemctl restart php-fpm

    Composerのinstallコマンド

    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
    php composer-setup.php
    sudo mv composer.phar /usr/local/bin/composer
    php -r "unlink('composer-setup.php');"

    環境変数追加

    公式ドキュメントにあるように

    https://laravel.com/docs/6.x

    環境変数のPATHにcomposerのbinを追加する必要がある。

    export PATH="~/.composer/vender/bin:$PATH";

    最新版のinstall

    composer create-project --prefer-dist laravel/laravel cms

    version指定したinstall。現在、

    v5.5.28がinstall される。

    composer create-project --prefer-dist laravel/laravel cms "5.5.*"

     

    権限変更

    sudo chown -R nginx:nginx cms/storage
    sudo chmod -R 775 cms/storage
    sudo chown `whoami` /usr/share/nginx/html/cms/storage/logs

    selinuxを無効化

    sudo setenforce 0

     

    確認

    installに成功すると、以下のような画面が表示する

    http://{GLOBAL IP}/cms/public/index.php

     

     

     

     

     

     

  • Amazon Transcribe が日本語に対応したので早速試した

    Amazon Transcribe が日本語に対応したので早速試した

    はじめに

    11/22 Amazon Transcribe が日本語に対応したという記事がリリースされました。

    https://aws.amazon.com/jp/about-aws/whats-new/2019/11/amazon-transcribe-now-supports-speech-to-text-in-7-additional-languages/

    議事録とったりVoice memo作ったり何かと活用の場所がある機能。早速試してみました。

    音声ファイルの準備

    今回はiPhoneのボイスメモを利用することにします。アプリを消してしまった人もいると思うので念の為リンクを貼ります。

    https://itunes.apple.com/jp/app/%E3%83%9C%E3%82%A4%E3%82%B9%E3%83%A1%E3%83%A2/id1069512134?mt=8

    このアプリで録音した音声ファイルはm4aフォーマットになっているので、wavフォーマットに変換します。

    macでは標準で付属しているafconvertというソフトを使う事で手軽に変換できます。

    afconvert -f WAVE -d LEI16 sample.m4a sample.wav

    音声ファイルのアップロード

    解析対象の音源をs3に置く必要があり、作業用にバケットを作ります。

    名前は今回以下のバケット名にしました。

    今回は全部デフォルトでポチポチと進ませバケットを作成しました。

    作成されたバケットに変換後の音源をupload。

    ここまでで準備は完了です。
    Amazon Transcribeを開き、Create jobを押し、文字起こしのジョブを登録します。

    今回は以下の通り設定することにします。
    Languageを今回追加されたJapaneseを指定することを忘れないでください。

    inport dataは、S3に置いた音源のパスを。
    Formatは変換後のフォーマットであるwavとしました。

    Output dataでいくつか指定できますが、特に役立ちそうな機能はAlternative resultsです。
    今回はこれを有効にして進めることにします。

    createを押します。

    無事登録されたようです。

    詳細情報を確認すると、StatusはIn progressになりました。暫くすると処理が始まりました。

    Transcriotion previewに、ちゃんと文字として表示されました。漢数字なのがちょっと読みづらいですね。

    結果

    jsonファイルで出力されます。
    start_time, end_timeが表示され、実際どの部分が文字起こしされたのか非常にわかりやすいと感じました。

    単語ごとにconfidenceが表示され、どれだけ的確かの指標にすることができるようです。

      "results": {
        "transcripts": [
          {
            "transcript": "今日 は 二 千 十 九 年 六月 十 一 日 です"
          }
        ],
        "items": [
          {
            "start_time": "0.84",
            "end_time": "1.27",
            "alternatives": [
              {
                "confidence": "0.9588",
                "content": "今日"
              }
            ],
            "type": "pronunciation"
          },
          {
            "start_time": "1.27",
            "end_time": "1.4",
            "alternatives": [
              {
                "confidence": "1.0",
                "content": "は"
              }
            ],
            "type": "pronunciation"
          },

    まとめ

    GoogleにもGoogle Speech APIという似たような機能があるがそちらは、今回のAWSはほとんどブラウザのみで完結できるので非エンジニアでも比較的簡単に利用することができそうです。

    今回文字起こししたのはシンプルな言葉だったけど、長文を文字起こしした際、どれだけ読みやすいかなどは注視したいと思います。

    参考情報

    GCPで似たような機能があり、それは以前実施した。

    https://tsukada.sumito.jp/2019/06/11/google-speech-api-japanese/

     

     

     

     

     

  • Unable to obtain Outpost ARN from EC2 Metadata: EC2MetadataError: failed to make EC2Metadata request

    Unable to obtain Outpost ARN from EC2 Metadata: EC2MetadataError: failed to make EC2Metadata request

    はじめに

    ECSで割り当てたEC2が、クラスタに参加できない場合の対処。

    What to do when EC2 assigned by ECS cannot join the cluster.

    tail -f  /var/log/ecs/ecs-agent.log.2019-11-12-04 
    
    2019-11-12T04:20:19Z [INFO] Restored from checkpoint file. I am running as 'arn:aws:ecs:ap-northeast-1:xxx:container-instance/xxx:container-4f04-xxx:container-9da7-xxx:container' in cluster 'account-web-ec2'
    2019-11-12T04:20:19Z [INFO] Remaining mem: 3885
    2019-11-12T04:20:19Z [ERROR] Unable to register as a container instance with ECS: ClientException: Referenced container instance xxx:container-4f04-xxx:container-9da7-xxx:container not registered.
    	status code: 400, request id: xxx:container-xxx:container-47a3-90a6-xxx:container
    2019-11-12T04:20:19Z [ERROR] Error re-registering: ClientException: Referenced container instance xxx:container-4f04-xxx:container-9da7-xxx:container not registered.
    	status code: 400, request id: ea19fb3f-06e3-47a3-90a6-xxx:container
    
    
    2019-11-12T04:20:35Z [INFO] Loading configuration
    2019-11-12T04:20:35Z [INFO] Image excluded from cleanup: amazon/amazon-ecs-agent:latest
    2019-11-12T04:20:35Z [INFO] Image excluded from cleanup: amazon/amazon-ecs-pause:0.1.0
    2019-11-12T04:20:35Z [INFO] Amazon ECS agent Version: 1.32.1, Commit: 4285f58f
    2019-11-12T04:20:35Z [INFO] Creating root ecs cgroup: /ecs
    2019-11-12T04:20:35Z [INFO] Creating cgroup /ecs
    2019-11-12T04:20:35Z [INFO] Loading state! module="statemanager"
    2019-11-12T04:20:35Z [INFO] Event stream ContainerChange start listening...
    2019-11-12T04:20:35Z [INFO] Restored cluster 'account-web-ec2'
    2019-11-12T04:20:35Z [WARN] Unable to obtain Outpost ARN from EC2 Metadata: EC2MetadataError: failed to make EC2Metadata request

    対処

    待てども待てどもクラスタに参加できない場合は、

    If you can’t join the cluster,

    “` /var/lib/ecs/data/ecs_agent_data.json “`

    を削除(もしくは退避)させることで、クラスタに参加できるようになる。
    成功すると以下の通りになる。

    By deleting (or evacuating), you can join the cluster.
    If successful output is below

     tail -f  /var/log/ecs/ecs-agent.log.2019-11-12-04 
    2019-11-12T04:25:31Z [INFO] Registration completed successfully. I am running as 'arn:aws:ecs:ap-northeast-1:xxxx:container-instance/xxxx-xxxx-xxxx-xxxx-xxxx' in cluster 'account-web-ec2'
    2019-11-12T04:25:31Z [INFO] Saving state! module="statemanager"
    2019-11-12T04:25:31Z [INFO] Beginning Polling for updates
    2019-11-12T04:25:31Z [INFO] Event stream DeregisterContainerInstance start listening...
    2019-11-12T04:25:31Z [INFO] Initializing stats engine

    参考情報

    https://dev.classmethod.jp/etc/ecsec2_cluster_failed/