文系大学生がエンジニアを目指すブログ

Qiitaに書くまでもないメモ的な存在

スクロールしたときに要素が画面上部からどの位置にいるか取得する

coffeescript

$ ->
  $(window).scroll ->
    console.log $('.target-element').offset().top - $(window).scrollTop();

スクロールするたびにコンソールに画面上部からの位置が表示される

f:id:fujitora:20180905154144p:plain

bitnamiをssl化する

csrの作成

秘密鍵を作成

$ sudo openssl genrsa -out /opt/bitnami/apache2/conf/server.key 2048

秘密鍵からCSRを作成

$ sudo openssl req -new -key /opt/bitnami/apache2/conf/server.key -out /opt/bitnami/apache2/conf/cert.csr

作成のための質問項目に回答する

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Minato-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:hogehoge, inc.
Organizational Unit Name (eg, section) []:development
Common Name (e.g. server FQDN or YOUR name) []:hogehoge.com
Email Address []:info@hogehoge.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
$ mv cert.csr server.csr

ファイル認証

$ sudo vi /opt/bitnami/apache2/conf/bitnami/bitnami.conf
<VirtualHost _default_:80>
  DocumentRoot "/opt/bitnami/apache2/htdocs"
  RewriteEngine on←追加
  RewriteCond %{REQUEST_URI} !=/.well-known/pki-validation/fileauth.txt←追加

/home/bitnami/apps/wordpress/htdocs/.well-known/pki-validation にfileauth.txtを作成

各種ファイル作成

crtとcaを作成する。

$ sudo vi /opt/bitnami/apache2/conf/server.crt
$ sudo vi /opt/bitnami/apache2/conf/server-ca.crt

権限変更

$ sudo chown root:root /opt/bitnami/apache2/conf/server*
$ sudo chmod 600 /opt/bitnami/apache2/conf/server*

conf file編集

$ sudo vi /opt/bitnami/apache2/conf/bitnami/bitnami.conf
<VirtualHost _default_:80>
  DocumentRoot "/opt/bitnami/apache2/htdocs"
  RewriteEngine On←追加
  RewriteCond %{HTTPS} !=on←追加
  RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L]←追加
<VirtualHost _default_:443>
  DocumentRoot "/opt/bitnami/apache2/htdocs"
  SSLEngine on
  SSLCertificateFile "/opt/bitnami/apache2/conf/server.crt"
  SSLCertificateKeyFile "/opt/bitnami/apache2/conf/server.key"
  SSLCertificateChainFile "/opt/bitnami/apache2/conf/server-ca.crt" ←追加
$ sudo /opt/bitnami/ctlscript.sh restart apache

(注)

SSLCertificateChainFile "/opt/bitnami/apache2/conf/server-ca.crt"

ApacheバージョンでSSLCACertificateFileかSSLCertificateChainFile変わる

Doc

Bitnami documentation for Apache

Bitnami documentation for Apache

AWS EC2のbitnamiにbasic認証をかける

環境

実装

公式DocのAPPNAMEをwordpressに置き換える

$ cd /opt/bitnami
$ sudo apache2/bin/htpasswd -cb apache2/wordpress_users USERNAME PASSWORD
$ sudo vi /opt/bitnami/apps/wordpress/conf/httpd-app.conf

以下に書き換える。

4行追加 & Require all grantedコメントアウト

<Directory "/opt/bitnami/apps/APPNAME/htdocs">
    ...
      AuthType Basic
      AuthName MyAuthName
      AuthUserFile "/opt/bitnami/apache2/APPNAME_users"
      Require valid-user
    ...  

    <IfVersion >= 2.3>
    # Require all granted
    </IfVersion>
    ...
  </Directory>
$ sudo /opt/bitnami/ctlscript.sh restart apache

ドキュメント

Bitnami Apache for AWS Cloud

EC2とRailsとnginxのサイトをLet’s EncryptでSSL化

httpで動いてるとこからhttpsに変更する手順

準備

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd ./letsencrypt
$ ./letsencrypt-auto --help --debug

最後に以下のようにでればOK

Complete!
Creating virtual environment...
Installing Python packages...
Installation succeeded.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  letsencrypt-auto [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...

Certbot can obtain and install HTTPS/TLS/SSL certificates.  By default,
it will attempt to use a webserver both for obtaining and installing the
certificate. The most common SUBCOMMANDS and flags are:

obtain, install, and renew certificates:
    (default) run   Obtain & install a certificate in your current webserver
    certonly        Obtain or renew a certificate, but do not install it
    renew           Renew all previously obtained certificates that are near
expiry
    enhance         Add security enhancements to your existing configuration
   -d DOMAINS       Comma-separated list of domains to obtain a certificate for

  --apache          Use the Apache plugin for authentication & installation
  --standalone      Run a standalone webserver for authentication
  --nginx           Use the Nginx plugin for authentication & installation
  --webroot         Place files in a server's webroot folder for authentication
  --manual          Obtain certificates interactively, or using shell script
hooks

   -n               Run non-interactively
  --test-cert       Obtain a test certificate from a staging server
  --dry-run         Test "renew" or "certonly" without saving any certificates
to disk

manage certificates:
    certificates    Display information about certificates you have from Certbot
    revoke          Revoke a certificate (supply --cert-path)
    delete          Delete a certificate

manage your account with Let's Encrypt:
    register        Create a Let's Encrypt ACME account
  --agree-tos       Agree to the ACME server's Subscriber Agreement
   -m EMAIL         Email address for important account notifications

More detailed help:

  -h, --help [TOPIC]    print this message, or detailed help on a topic;
                        the available TOPICS are:

   all, automation, commands, paths, security, testing, or any of the
   subcommands or plugins (certonly, renew, install, register, nginx,
   apache, standalone, webroot, etc.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

nginxのconfigファイルを編集

server {
  listen 80 default;
  (省略)
  location /.well-known/ {
    root /home/user_name/app_name;
  }
}

読み込み&再起動

$ sudo service nginx reload
$ sudo service nginx restart

証明書作成

$ sudo ./letsencrypt-auto certonly --webroot -w ドキュメントルート -d ドメイン
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

でメアド入力

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
$ cd /etc/letsencrypt/

配下にドメインの名前のフォルダで作成される

Nginx

nginxに証明書の場所を設定

server {
  listen 443 ssl;
  server_name hogeohoge.com;

  ssl on;
  ssl_certificate      /etc/letsencrypt/live/hogehoge.com/fullchain.pem;
  ssl_certificate_key  /etc/letsencrypt/live/hogehoge.com/privkey.pem;
  (略)
}

reload & restartして完了

bitnamiでLet's EncryptでSSL化するときに読むメモ

Doc

Generate And Install A Let's Encrypt SSL Certificate For A Bitnami Application

Generate and Install a Let's Encrypt SSL Certificate for a Bitnami Application

How To Force HTTPS Redirection With Apache?

Bitnami Stacks for AWS Cloud

Force HTTPS Redirection With Apache

https://docs.bitnami.com/aws/infrastructure/lamp/administration/force-https-apache/

bitnamiのメモ

httpd.confの場所

/opt/bitnami/apache2/conf/httpd.conf

welcartのSSL設定

www.welcart.com

Railsで多言語対応する

トップページを多言語化するサンプルコードのメモ

Gemfile

gem 'rails-i18n'
gem 'http_accept_language'

config/routes.rb

Rails.application.routes.draw do
  scope '(:locale)', locale: /#{I18n.available_locales.join('|')}/ do
    root 'top#index'
  end
end

config/application.rb

require_relative 'boot'
require 'rails/all'

Bundler.require(*Rails.groups)

module CwSystem
  class Application < Rails::Application
    config.load_defaults 5.1
    config.i18n.available_locales = %i(ja en fr es pt)
    config.i18n.enforce_available_locales = true
    config.i18n.default_locale = :ja
  end
end

app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :set_locale

  def set_locale
    I18n.locale = locale
  end

  def locale
    @locale ||= params[:locale] || I18n.default_locale || http_accept_language.compatible_language_from(I18n.available_locales || I18n.default_locale)
  end

  def default_url_options
    return {} if params[:local].blank?
    {locale: locale}
  end
end

app/helpers/application_helper.rb

module ApplicationHelper
  def i18n_url_for(options)
    if options[:locale] == I18n.default_locale
      options[:locale] = nil
    end
    url_for(options)
  end
end

config/locales/

それぞれの言語のymlを作成

carrierwaveで画像名をユニークにした時にS3とDBでファイル名が異なる

問題

ファイル名をユニークにするために以下の処理をしていた

def filename
  p "#{SecureRandom.uuid}.#{file.extension}" if original_filename.present?
end

がs3にcarrierwaveで画像アップ&DBに保存すると、s3とDBのファイル名が違っていた。

この人たちと同じ現象

stackoverflow.com

teratail.com

原因

filenameメソッドが複数回呼ばれているため save前に2回、saveの後に1回の計3回呼ばれている。

解決方法

github.com

def filename
  "#{secure_token}.png" if original_filename.present?
end

protected
def secure_token
  var = :"@#{mounted_as}_secure_token"
  model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
end

Rspec導入

gem導入

group :development, :test do
  (略)
  gem 'rspec-rails'
end
$ bundle install --path vendor/bundle

configファイル生成

$ rails generate rspec:install
.rspec
spec/spec_helper.rb
spec/rails_helper.rb

が生成される

.rspec編集

--warnings
--color
--format documentation
--require spec_helper

application.rb

config/application.rb

config.generators do |g|
  g.test_framework :rspec,
  view_specs: false,
  helper_specs: false,
  routing_specs: false
end

pine scriptをrubyに書き直したときに見たサイト

公式ドキュメント

Pineスクリプト言語リファレンスマニュアル — TradingView

note

note.mu

note.mu

note.mu

note.mu

↑買ったけど内容薄い

配列で出現回数が多い順にソート&上からX個取得をRubyで

ary.group_by { |e| e }.sort_by { |e, v| -v.size }.map(&:first)

でソート

ary.group_by { |e| e }.sort_by { |e, v| -v.size }.map(&:first)[0..9]

でトップ10

CKEditorのフォームにhtmlタグを貼ると記号がエスケープされる

問題

フォームに

<h3>hogehoge</h3>

と入れて保存して

css

h3 {
  font-size: 24px;
}

みたいにやってもCSSは当たらない。

解決策

エスケープされて

&lt;h3&gt;hogehoge&lt;/h3&gt;

の形で保存される。

app/assets/javascripts/ckeditor/config.js

if (typeof(CKEDITOR) != 'undefined') {
  CKEDITOR.editorConfig = function (config) {
    config.basicEntities = false;
    config.entities = false;
  }
}

とすればOK

ちなみに

if (typeof(CKEDITOR) != 'undefined') {
}

がないと、ckeditorのフォームが無いページで

uncaught ReferenceError: CKEDITOR is not defined

のエラーが出る

仮想通貨bot開発でよく見るやつメモ(随時更新)

全共通

github.com

これの中身みればだいたい分かる

bitflyer

ドキュメント lightning.bitflyer.com

サンプル lightning.bitflyer.com

bitmex

ドキュメント

www.bitmex.com

ruby用ライブラリ github.com

github.com

binance

ドキュメント

github.com

deviseで招待用リンクを生成する(メールを使わずに招待機能を実装)

したいこと

  • 招待用URLを発行できる
  • メールを使わずにユーザーを招待できる

端折ること

  • URLと発行したユーザーのリレーション
  • 招待されたユーザーがどのURLから登録されたか
  • URLの期限
  • クリック数

実装

model

$ rails g model initation

migrationファイルは

class CreateInvitations < ActiveRecord::Migration[5.1]
  def change
    create_table :invitations do |t|
      t.string :token
      t.timestamps
    end
  end
end

端折った機能作りたいならここでclick_countなりlimited_atなりを足す

controller

$ rails g controller users::invitations

routes.rb

namespace :users do
    resource :invitations, only: [:show, :update]
  end

を追加

invitations_controller.rb

class Users::InvitationsController < ApplicationController
  before_action :authenticate_user!

  def show
    if Invitation.count == 0
      Invitation.create!(token: SecureRandom.uuid.gsub!(/-/,''))
      @invitation_token_url =  "http://localhost:3000/users/sign_up?tk=" + Invitation.all.last.token.to_s
    else
      @invitation_token_url =  "http://localhost:3000/users/sign_up?tk=" + Invitation.all.last.token.to_s
    end
  end

  def update
    Invitation.create!(token: SecureRandom.uuid.gsub!(/-/,''))
    @invitation_token_url =  "http://localhost:3000/users/sign_up?tk=" + Invitation.all.last.token.to_s
    redirect_to users_invitations_path, notice: "URLを作成しました"
  end
end

(注意)

  • ここらへんheplerにまとめる。
  • URLはgem 'config'でベタ打ちにしない

views/invitations/show.html.slim

.container-fluid
  .container
    .row
      .col-sm-12
        h4 招待用URL作成
        = text_field_tag '#', @invitation_token_url, class: 'form-control'

        .margin-top-30
          = link_to 'URLを再作成する', users_invitations_path, { method: 'put', class: 'btn btn-primary' }

clipboardjs.com

これとか入れる

registrations_controller.rb

ここで一番はじめのユーザー以外の直リンクと不正なtoken or token無しをはじく

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :check_sign_up_token, only: [:new]

  (略)

  protected

  # 新規登録にtoken無しでアクセスさせない
  def check_sign_up_token
    return redirect_to root_path if params[:tk].nil? || User.count == 0 || !Invitation.exists?(token: params[:tk])
  end
end

アクセスした時にtokenをcookieに保存して、createの時にチェックするようにした方がよい(?)