備忘録(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の設定はこちら。
手順
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を設定し、それ以外はそのまま
- 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の設定をしておく。
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をクリック。
ダイアログが表示されるので入力。
- Connection name:適当に(gitのリポジトリ名とかでいい)
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" }