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を使うとあっという間だった。
<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でデータベースに格納する必要がある。 そして、渡したデータをjsonでjqueryに返す必要がありそう。
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
が作成された