強欲で謙虚なツボツボ

趣味の読書の書の方

備忘録(Python)

islower

全てが小文字で構成された文字列であればTrueを返す

'aiueo'.islower()
=> True
'Aiueo'.islower()
=> False

 

isupper

全てが大文字で構成された文字列であればTrueを返す

'AIUEO'.isupper()
=> True
'aIUEO'.isupper()
=> False

 

join

リストやタプルを連結して文字列を返す

''.join(['hello', 'world']
=> helloworld
' '.join(['hello', 'world']
=> hello world

 

重複削除

set(リスト)とするとリストの重複が削除されたセットを返す
list(set(リスト))とすればリストの重複を削除できる

list = ['hoge', 'geho', 'hoge']
set(list)
=> {'geho', 'hoge'}
list(set(list))
=> ['geho', 'hoge']

 

itertools.combinations

第一引数にリストやセットを第二引数に数値を与えると、全ての組み合わせをタプルで返す

list = [1, 2, 3]
for c in itertools.combinations(list, 2):
    print(c)
=> (1, 2)
   (1, 3)
   (2, 3)

備忘録(AWS CodeBuild + CodePipeline + GitHub)

GitHubで特定のブランチへのpushがあったときに、CodeBuildとCodePipelineで自動的にECSへのデプロイを行うためにCodeBuildとCodePipelineの設定をした。

フロントエンドとバックエンドで2つのGitHubリポジトリとECSサービスがあるので、それぞれフロントエンド用のCodeBuildとCodePipeline・バックエンド用のCodeBuildとCodePipelineの2つを作成する。

ECRとECRの設定はこちら。

taopo.hatenablog.com

 

 

手順

CodeBuild → CodePipeline

一方のCodeBuildとCodePipelineの設定をしたのちに他方を設定する。(自動で作成されるRoleを使い回す)

Create build project

  • Project name:適当に
  • Description:無記入
  • Build badge:未チェック
  • Enable concurrent build limit:未チェック
  • Additional configuration:無記入
  • Source provider:GitHub
  • Repository:Repository in my GitHub account
  • GitHub repository:任意のリポジトリを選択
  • Source version:webhookするブランチ名など
  • Additional configuration:そのまま
  • Webhook:チェック
  • Build type:Single build
  • Event type:PUSH
  • Start a build under these condition:無記入
  • Dont start a build under these condition:無記入
  • Environment image:Managed image
  • Operation system:Amazon Linux 2
  • Runtime(s):Standard
  • Image:aws/codebuild/amazonlinux2-x86_64_standard:3.0(一番下の選択肢)
  • Image version:Always use the latest image for this runtime version
  • Environment type:Linux
  • Privileged:チェック
  • Service role:New service role(2回目以降はExisting service role)
  • Role name:そのまま
  • Allow AWS CodeBuild to modify this service role so it can be used with this build project:チェック
  • Additional configuration:Environment variablesを設定し、それ以外はそのまま

    ここでの環境変数を後でbuildspec.ymlで使用する
    Name | Value | Type

    • AWS_DEFAULT_REGION                 | ap-northeast-1 | Plaintext
    • AWS_ACCOUNT_ID                         | ************       | Plaintext
    • AWS_ECR_REPOSITORY_NAME    | ************       | Plaintext
    • AWS_ECR_IMAGE_TAG                   | ************       | Plaintext
    • AWS_ECS_TASK_CONTAINER_NAME | ************       | Plaintext
  • Build specifications:Use a buildspec file
  • Buildspec name:無記入
  • Define batch configuration:無記入
  • Type:No artifacts
  • Encryption key:無記入
  • Cache type:No cache(キャッシュを設定するとビルド速度が上がるが、キャッシュによるビルド失敗が生じることもある)
  • CloudWatch logs:チェック
  • Group name:無記入
  • Stream name:無記入
  • S3 logs:未チェック

Create build projectで作成完了。

補足

GitHubは表示されるダイアログに従ってパスワードとかを入力すれば接続できる。OAuthでGitHubに接続するとPublic repositoryとRepository in my GitHub accountの選択が表示される。

 

IAM Role

New service roleを選択したので、新しくロールができている。
そのロールにECRへのアクセス権限を追加する。
Resourceを"*"としておけば、他のCodeBuildでも当該Roleを使用できる。

{
    "Effect": "Allow",
    "Resource": "*",
    "Action: [
        "ecr:BatchCheckLayerAvailability",
        "ecr:CompleteLayerUpload",
        "ecr:GetAuthorizationToken",
        "ecr:InitiateLayerUpload",
        "ecr:PutImage",
        "ecr:UploadLayerPart"
    ]
}

 

buildspec.yml

GitHubで管理するプロジェクトのルートにbuildspec.ymlを作成する。

version: 0.2

phases:
  pre_build:
    commands:
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  build:
    commands:
      - docker build -t $AWS_ECR_REPOSITORY_NAME:$AWS_ECR_IMAGE_TAG . # この末尾の「.」を忘れないように
      - docker tag $AWS_ECR_REPOSITORY_NAME:$AWS_ECR_IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$AWS_ECR_REPOSITORY_NAME:$AWS_ECR_IMAGE_TAG
  post_build:
    commands:
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$AWS_ECR_REPOSITORY_NAME:$AWS_ECR_IMAGE_TAG
      - printf '[{"name":"%s","imageUrl":"%s"}]' $AWS_ECS_TASK_CONTAINER_NAME $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$AWS_ECR_REPOSITORY_NAME:$AWS_ECR_IMAGE_TAG > imagedefinitions.json

artifacts:
  files:
    - '**/*'

 

CodePipeline

Step 1 Choose pipeline setting

  • Pipeline name:任意
  • Service role:New service role(2回目以降はExisting service role)
  • Role name:自動で入力される
  • Allow AWS CodePipeline to create a service role so it can be used with this new pipeline:チェック
  • Advanced settings:そのまま

Step 2 Add source stage

Connectionは入力欄押下時に選択したいものがない場合は、Connect to GitHubをクリック。
ダイアログが表示されるので指示に従って接続する。

  • Source provider:GitHub(Version 2)
  • Connection:下記説明
  • Repository name:任意
  • Branch name:任意
  • Start the pipeline on source code change:チェック
  • Output artifact format:CodePipeline default

Step 3 Add build stage

  • Build provider:AWS CodeBuild
  • Region:Asia Pacific(Tokyo)
  • Project name:CodeBuild で作成済みのものを選択
  • Add environment variable:無記入
  • Build type:Single build

Step 4 Add deploy stage

  • Deploy provider:Amazon ECS
  • Region:Asia Pacific(Tokyo)
  • Cluster name:ECSで作成済みのClusterを選択
  • Service name:ECSで作成済みのServiceを選択
  • Image definitions file:無記入
  • Deployment timeout:無記入

Step 5 Review

Step 1~4までの入力を確認して、Create pipelineで作成完了。

 

 

これでgit pushすればwebhookによって自動的にCodeBuildでビルドされたDockerイメージがECRへプッシュされ、ECSのタスク定義がECRにプッシュされたDockerイメージを参照するように更新され、ECSのサービスが更新されたタスクを起動して自動デプロイが完了する。

 

 

備忘録(AWS CodePipeline)

GitHubで特定のブランチへのpushがあったときに、CodeBuildとCodePipelineで自動的にECSへのデプロイを行うためにCodePipelineの設定をした。

CodePipelineの設定の前にCodeBuildの設定をしておく。

taopo.hatenablog.com

 

 

Step 1 Choose pipeline setting

  • Pipeline name:適当に
  • Service role:New service role
  • Role name:自動で入力される
  • Allow AWS CodePipeline to create a service role so it can be used with this new pipeline:チェック

どのサービスでも作成するときはその時にService roleを作って後で好きなように編集する方がいいと思う。

Step 2 Add source stage

  • Source provider:GitHub(Version 2)
  • Connection:下記説明
  • Repository name:好きなのを選ぶ
  • Branch name:好きなのを選ぶ
  • Start the pipeline on source code change:チェック
  • Output artifact format:CodePipeline default

Connection

入力欄押下時に選択したいものがない場合は、Connect to GitHubをクリック。
ダイアログが表示されるので入力。

Connect to GitHubを押すと入力欄が出るから、そこでgitのリポジトリを選択。なければinstall new appでgit リポジトリを選べるようにする。

Step 3 Add build stage

  • Build provider:AWS CodeBuild
  • Region:Asia Pacific(Tokyo)
  • Project name:CodeBuild で作成済みのものを選択
  • Add environment variable:無記入
  • Build type:Single build

Step 4 Add deploy stage

  • Deploy provider:Amazon ECS
  • Region:Asia Pacific(Tokyo)
  • Cluster name:ECSで作成済みのClusterを選択
  • Service name:ECSで作成済みのServiceを選択
  • Image definitions file:無記入
  • Deployment timeout:無記入

Step 5 Review

  • Create

 

これでgit pushすれば自動的にECSへデプロイされる。

 

備忘録(Ruby)

Rspecのfill_in

フォームのテキストフィールドに値を挿入

<label for="name">氏名</label>
<input type="text" />
fill_in 'メールアドレス', with: '山田太郎' (ラベルの指定だと上手くいかないこともそこそこある)
fill_in 'name', with: '山田太郎' //(id指定の方が確実)

 

Rspecのselect

フォームのセレクトボックスで選択

<label for="prefecture">都道府県</label>
<select id="prefecture">
  <option value="1">北海道</option>
  <option value="2">岩手県</option>
  <option value="3">青森県</option>
</select>
select '北海道', from: '都道府県'
select '北海道', from: 'prefecture' #(id指定の方が確実)
find("#prefecture").find("option[value='1']").select_option #(一番確実)

 

Rspecのchoose

ラジオボタンをクリック

<label>
  <input id="gender_male" name="gender" type="radio" value="male">男性
</label>
<label>
  <input id="gender_female" name="gender" type="radio" value="female">女性
</label>
choose '男性'

 

Rspecのcheckとuncheck

チェックボタンをチェック

<label>利用規約</label>
  <input type="checkbox" id="rule" value="1" />
</label>
check '利用規約'
uncheck '利用規約'

 

routeでサブドメイン設定

Rails.application.routes.draw do
  constraints subdomain: 'admin' do
    resources :admin
  end
  constraints subdomain: '' do
    resources :user
  end
end

# admin.example.com/sign_inだと/admin/sign_in
# example.com/sign_inだと/user/sign_in
# みたいな感じ

備忘録(jQuery)

jQuery

not

取得する要素の除外条件

<p>aaa</p>
<p class="not">bbb</p>
<p>ccc</p>

const p = $('p').not('not')
console.log(p)
=> [<p>aaa</p>, <p>ccc</p>]

 

each

取得した要素の繰り返し処理

<p>aaa</p>
<p class="not">bbb</p>
<p>ccc</p>

$('p').not('not').each((index, element) => {
console.log(index, element)
}
=> 0 <p>aaa</p>
1 <p>bbb</p>

 

attr

要素の属性を操作する

<p>aaa</p>
<p class="not">bbb</p>
<p>ccc</p>

$('p').not('not').each((index, element) => {
$(element).attr('class', 'aiueo')
}
console.log($('p'))
=> [<p class="aiueo">aaa</p>, <p class="not">bbb</p>, <p class="aiueo">ccc</p>]

 

removeAttr

要素の属性を削除する

<p class="aiueo">aaa</p>
<p class="not">bbb</p>
<p class="aiueo">ccc</p>

$('.aiueo').each((index, element) => {
$(element).removeAttr('class')
}
console.log($('p'))
=> [<p>aaa</p>, <p class="not">bbb</p>, <p>ccc</p>]

備忘録(Python)

Python

String[i:j]

文字列を切り出す

word = "hello world"
word[2:6]
=> 'llo '
word[:3]
=> 'hel'
word[9:]
=> 'ld'
word[:]
=> 'hello world'
word[-5:-1]
=> 'world'
word[2:2]
=> ''

 

値 in List

Listが値を要素に含むかどうか

l = ['aaa', 'bbb']
'aaa' in l
=> True
'ccc' in l
=> False

 

List.extend(List)

Listを結合

l1 = ['aaa', 'bbb']
l2 = ['ccc', 'ddd']
l1.extend(l2)
print(l1)
=> ['aaa', 'bbb', 'ccc', 'ddd']

 

del List[i:j]

Listのインデックスが[i, j)の要素を削除

l = ['aaa', 'bbb', 'ccc']
del l[1:2]
print(l)
=> ['aaa', 'ccc']

備忘録(Ruby)

Ruby

params.require(:モデル).permit(:カラム)

Rails 4以降のストロングパラメータという新機能
フォームの入力などをPOSTで受け取る時のパラメータを制限するようなもので、予期せぬパラメータを受け取らないようなセキュリティとなる
controllerにて記述

# nameとemailを属性にもつUserモデルが定義済みだとする

# フォームで{ "name": "hoge"," email": "mail@mail.com", "password": "1234qwer" }がPOSTでsubmitされた場合

# その1: nameというパラメータしか受け取らない
def user_params
  params.require(:user).permit(:name)
end
=> {
  name: "hoge"
}

# その2: nameとemailというパラメータしか受け取らない
def user_params
  params.require(:user).permit(:name, :email)
end
=> {
  name: "hoge",
  email: "mail@mail.com"
}