sql 1日前のデータを取得する date

現在の日時から1日前であるcreated_atデータを取得したい。

結論 下記で絞り込みができる。

where DATE(created_at) = DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)

例えば,本日8/21日だとしたら、8/20 00:00~23:59までのデータが欲しい 例↓

select id, name from users where DATE(created_at) = DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY);

docker-compose fuelphp mysql EC2で起動 本番環境

⑴ EC2インスタンス作成→githubからcloneする。

EC2インスタンスを作成し、sshでサーバの中に入る。
ssh -i [キーペア].pem ec2-user@ipアドレス
gitを使えるようにする
dockerをインストール
docker-composeを使えるようにする

githubからcloneする

⑵ 諸々設定→表示

・EC2上でversion'3'が使えなかったため、docker-compose.yml書き換え、'2'を使用
・立ち上げdocker-compose up -d
・しかし403hiddenエラーがでる
・ログも出力されていない
・調べたがわからなかったため、apacheのwelcomeページをまずは表示することから始めた
・表示できた。
・ではなぜ、403が出たのか、
apacheの設定ファイル ServerNameをインスタンスIPアドレスに設定
・ルートパスの表示できた。
・しかし、ルート以下の/searchが404エラー
・ローカルの時にも起こった、index.phpが入ってくる問題
https://runble1.com/fuelphp-mod-rewrite-not-found/
で404エラー解決。
mysqlのデータをdockerにコピー
mysql初期のままだと文字化けするので、
https://cpoint-lab.co.jp/article/201804/2683/
見ながらutf8になるように設定
・データベース作成、データ挿入
・config/development/db.php
にdocker psで出したmysqlコンテナのIDに書き換え。

できた

これからしたいこと。

・ElasticIPを使用したい。
インスタンス停止してまた開始すると、IPアドレスが変わるため、apacheの設定ファイルをインスタンス起動の度にIPアドレスに書き換えないといけなくなるため、固定する。

JavaScript 配列 削除、変更を for文でsplice()使うときに気をつけること

例 配列から奇数を削除する
[1,2,3,4,5]
[10,25,37,42,54]
[3,5,7]

for(var i=0; i<array.length; i++)
上のような+1ずつ増やすfor文を使って配列をspliceで削除していくと、参照値より前のindex番号が変わるため、 +1ずつ増やすfor文ではなく、配列を後ろのindex番号から参照していく-1ずつ減らしていくfor文のやり方だと、参照の前のindex番号は変わらないので、配列からfor文とspliceを使って奇数を削除することができます。
成功例

for(var i=array.length-1; i>=0; i--){
  if(array[i] % 2 != 0){
    array.splice(i,1); 
  }
}

+1ずつするやり方 参照値の前のindex番号が変わってしまう     失敗例

for(var i=0; i<array.length; i++){
  if(array[i] % 2 != 0){
    array.splice(i,1); 
  }
}

javascriptのthisに苦しんだ。closestの使い方も間違っていた。ajax jquery

実現したいこと

口コミに対するコメント機能を非同期処理する
例えでいうと、返信機能つき掲示板にあたります。

私の以前のソースコードでは、1つの口コミにコメントをしているのに、複数の口コミにそのコメントが 反映されていました。(更新するとDBデータが表示されるため正常表示にはなる。) この問題を解決したく、テラテイルで質問したところ回答いただけました。

はじめに、以下が修正し直した成功時の例です。(まだバグは少しある。)

  
$(document).on('click','.koment',function(){
    //function()のthisとdoneで使うthisは違うため変数に代入しておく
    var $_t = $( this );
    $.ajax({
        url:'/comment/comment',
        type:'POST',
        data:{
            name: $(this).closest('#kom').find('#komname').val(),
            comment: $(this).closest('#kom').find('#komtext').val(),
            review_shop_id: $(this).closest('#kom').find('#review_shop_id').val(),
            review_id: $(this).closest('#kom').find('#review_id').val(),
            created_at: new Date()
        },
        dataType: 'json'
    })
    // Ajax通信が成功したら発動
    .done(function(data, dataType){
        $_t.closest('li').find('.komlist').prepend(
            '<li class="r-list">'+
                '<div class="r-detail">'+
                    '<p class="r-name">'+ data['name'] +'</p>'+
                    '<p class="r-date">'+ data['created_at'] +'</p>'+
                    '<div class="r-body">'+ data['comment']+ '</div>'+
                '</div>'+
            '</li>'
        )
    })
});

テラテイルで学んだことは、 var $_t = $( this );$_t.closest('li').find('.komlist').prepend( の2つです。

1つ目
doneでthisを使うため変数に入れておくための
var $_t = $( this );にします。
なぜかというとfunction()のthisとdone{}で使うthisは違うものだそうです。 試しに$(this).closest('li').find('.komlist').prepend( と書いてみたところやはり動きませんでした。jsのthisに関してはもう少し掘り下げていこうと思いました。

2つ目
closestの選択要素を間違って認識してました。 以前の間違っていたコード
$_t.closest('.replyList').find('.komlist').prepend() closestは開始要素から最も近い親要素を選択するものです。 しかし、私は兄弟要素であるものを選択していて、エラー文も出ないエラーで迷ってました。こちらもテラテイルで知ったことです。

テラテイル感謝です本当に

cookieを使ったいいね機能を初めて実装してみた。jquery.cookie.js

これまで自分が作ってきたいいね機能といえば、データベースにLikeテーブルを作ってどのユーザーがどの投稿にいいねしたかでいいねを実装していた。 課題として与えられたいいね機能はユーザテーブルはなく、のいいね機能だった為、cookieを使ったいいね機能の実装をした。

jquery.cookie.jsを使うとあっという間だった。

まず、CDNjquery.cookie.jsを読み込む

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js"></script>

そして以下がコード

$('.like').on('click',function(){
    //cookieのNameに投稿のID Nameに'liked'を追加 有効期限は365日に設定 365日をすぎると、cookieが消去される 違う画面(URL)でもこの機能を使いたいので、pathを'/'に設定
    $.cookie($(this).attr("id"),"liked",{expires: 365,path:'/'});
 //いいねボタンを押したら、fontを変えるためclassを追加
    $(this).addClass('is-active');
    return false;
});
詰まったとこ

・(this)を使っていなかったため、いいねを押すと、そのページの全投稿にいいねが押される状態になってた。 おそらく、どのボタンをクリックしたのかを判断できていなかったから。

・idに一意な名前をつけてなかった。僕の場合、class名とid名が同じになっていて、しかもidでクリックイベントを発生させていた為、挙動がうまく行かなかった。 なので、idを一意な名前にし、classでイベントを発生させるようにした。これは同期の方から教えてもらいました。

非同期通信が苦手だったが少しできたかもしれない。Ajax(jquery),PHP(fuelphp),MYSQL

非同期通信をするには、

Ajax

jquery使えば良いんだな。でもやりかた全然わかんない。

php

fuelphpでどんなしてやるんだ? ajaxでpostされたデータをcontrollerで受けっとて、modelでデータベースに格納する必要がある。 そして、渡したデータをjsonjqueryに返す必要がありそう。

mysql

modelでどうやってデータを挿入しようか。 formのinputにidをつけて、jqueryでval()で入力された値をとってこよう。

送信ボタンがクリックされたら、jqueryのクリックイベントを発火させて、ajax通信でcontrollerのurlにpostする。

$('要素').on('click',function(){
          $.ajax({
                  //post先のURL
                  url: '/controller/action名',
                  type: 'POST',
                  //何のデータを送るか、僕の場合、ユーザーがformに入力した内容を送る
                  data: {
                      name:  要素.val(),                
                      など..,
                  dataType: 'json'
           });
          .done(function(data, dataType){
            //成功時の処理をここに書く
   // 僕の場合はhtmlに埋め込むコードを書いた.例(要素).prepend(~data['name'] data['comment']~)
           })
          .fail(jqXHR, textStatus, errorThrown) => {
             alert('通信に失敗しました。');
             //失敗時の処理を書く
         });
});

fuelphpのcontroller側

public function action_post()
{
  if (Input::method() == 'POST') {
    $post = Input::post();
    //⬇︎モデルのメソッド、これでDBにinsertする。
    Model_Shop::insert_data($post);
 //渡した値をjsonでjquery側にjsonで返す。
    echo json_encode($post);
  }
}

丸2日くらいかかっちゃった。 だんだんとできないことに焦っていた。 どこでエラーが出てるのか、ajaxができていないのか、コントローラ側のphp側がおかしいのか、 デバッグしながら進めていくことが大切。

ハッカソン インフラチーム やったことメモ

今回で3回目のβ版ハッカソンに参加してる インフラチームとしてやってるので備忘録をとる

使ってる技術
  • Rails6,Ruby2.6.5
  • Heroku
  • Terraform
  • AmazonS3
    ...他にも使ってる技術はあるが自分のチームに関係のある技術に絞ろうと思う

S3をTerraformで作成 RailsのActiveStorageを使ってS3に画像をアップロードする設定にする

S3をTerraformで作成

Railsディレクトリの直下にterraformを作成するためのinfrastructureディレクトリを作成
aws_region.tf

provider "aws" {
    access_key = "<アクセスキー>"
    secret_key = "<シークレットキー>"
    region = "ap-northeast-1"
}

s3.tf

resource "aws_s3_bucket" "bucket1" {
    bucket = "<任意のバケット名>"
    acl = "private"

$ terraform init
ワークスペースを初期化 $ terraform plan
作成される前のプランを確認 $ terraform apply
terraformを実行
これでちゃんとS3にバケットが作成されていた。
$ terraform.tfstate が作成された

RailsのActiveStorageを使ってS3に画像をアップロードする設定にする