Debuginfo

思考とアウトプット

AWS cloudwatchで監視

前職ではmonitoringって言ってたけど、日本語では監視なんだと最近気づきました。

  1. CPU Utilization - EC2デフォルトでAlarmを作る
  2. Memory Usage - Custom metricsを作る
  3. Load Avarage - Custom metricsを作る
  4. サービスの監視 - LBでalarmを作る
  5. RDS FreeableMemory - RDSデフォルトで作る
  6. cloudwatch logs - エージェントいれる

1,2,3はここを参考にしました。 違う点はインタンスを動的に取得してるところと、サービス監視はLBのUnavailableを見てるのでコメントアウト

#!/bin/bash

export JAVA_HOME=/usr/lib/jvm/jre
export AWS_CLOUDWATCH_HOME=/opt/aws/apitools/mon
export EC2_REGION=ap-northeast-1
export AWS_CREDENTIAL_FILE=/home/ec2-user/cloudwatch/credential
instanceid=`/opt/aws/bin/ec2-metadata -i | awk '{print $2 }'`

# http status check
#status=`/home/ec2-user/cloudwatch/http_status_check.sh http://www.global-step.jp` # 監視したいurlを記述
#if [ $status -eq 200 ]; then
#Fail=0
#else
#Fail=1
#fi
#/opt/aws/bin/mon-put-data --metric-name "Http Status fail" --namespace "Custom Metrix" --dimensions "InstanceId=$instanceid" --value "$Fail" --unit "Count"

# memory check
memtotal=`free -m | grep 'Mem' | tr -s ' ' | cut -d ' ' -f 2`
memfree=`free -m | grep 'buffers/cache' | tr -s ' ' | cut -d ' ' -f 4`
let "memused=100-memfree*100/memtotal"
/opt/aws/bin/mon-put-data --metric-name "FreeMemoryMBytes" --namespace "Custom Metrix" --dimensions "InstanceId=$instanceid" --value "$memfree" --unit "Megabytes"
/opt/aws/bin/mon-put-data --metric-name "UsedMemoryPercent" --namespace "Custom Metrix" --dimensions "InstanceId=$instanceid" --value "$memused" --unit "Percent"

# loadaverage check
loadave1=`uptime | tr -s ' ' | cut -d ' ' -f 11 | cut -d ',' -f 1`
/opt/aws/bin/mon-put-data --metric-name "LoadAverage" --namespace "Custom Metrix" --dimensions "InstanceId=$instanceid" --value "$loadave1" --unit "Count"

Cloudwatch Logs

特に詰まることなくドキュメント通り。

https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/QuickStartEC2Instance.html

#/etc/awslogs/awslogs.conf
[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages

[/srv/www/gsaweb/shared/log/production.log]
datetime_format = %Y-%m-%d %H:%M:%S
file = /srv/www/gsaweb/shared/log/production.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /srv/www/gsaweb/shared/log/production.log

[/var/log/maillog]
datetime_format = %Y-%m-%d %H:%M:%S
file = /var/log/maillog
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/maillog

AWS Opsworks + CircleCI で自動デプロイ

  1. AWS IAMユーザー(circleci)を作成
  2. 作ったユーザのAWS Access Key ID/Secret Access Keyを取得
  3. CircleCIのSetting->Permissions->AWS Permissionsを追加
  4. awsコマンドを手元で走らせてデプロイできるか確認

注意:regionはus-east-1を使用する

$ aws opsworks --region us-east-1 create-deployment --stack-id $STACK_ID --app-id $APP_ID --command "{\"Name\":\"deploy\"}"
  1. deploy-staging.shに上記を記述し、circle.ymlに追加
machine:
  timezone:
    UTC 
  ruby:
    version: 2.1.3

dependencies:
  pre:
    - sudo pip install awscli

deployment:
  staging:
    branch: master 
    commands:
      - ./script/deploy-staging.sh

deploy-stating.shは下記。

#!/bin/sh

set -ex

REGION='us-east-1'
STACK_ID='yyy'
APP_ID='xxx'

aws opsworks --region $REGION create-deployment --stack-id $STACK_ID --app-id $APP_ID --command "{\"Name\":\"deploy\"}"

ニュースを読まない僕が選挙に行った。

今年は半分意図的に半分は多忙さでニュース等のメディアを自分から読むことをしてきてない。 それでもpassivelyにニュースは耳にしてしまう世の中なので生きる上で問題ない。 そんな自分が選挙に行った。

デフレ脱却は、格差社会を生むと思う。 儲ける人は儲けてGDPを押し上げるかもしれないけど、そうでないところではインフレは苦しい。 ファイナンスに強くない人は、銀行にただ貯金していて、その価値が減ってる。事実上、貯金額が減ってることすら知らない人がいるように思う。国として強くなっても、多くの人を犠牲にしてしまうのは意味がないように思う。

原発問題。原発の原因は地震でなく津波だと思う。そもそも地震で大変なのは、それ自体じゃなくて、その後の火事と津波等の二次災害。今やることは全力で福島を収束させることと安全対策後の原発稼働。石油が安くなってきてるからといって、地球のキャパ的に続かないし、クリーンエネルギーは格差社会の底辺には金銭的にきつい。

コンクリートへの公共事業。早くやめてほしい。借金して作るものじゃない。第2東名を走ってて、親は道がきれいで、渋滞がなくなってうれしそうだが、僕は悲しくなる。数十メートル作るのにいくらかかってて、これは子供の世代が返していくと思うと。正直、道なんがガタガタでいい。

憲法改正とか。戦争は不毛。そっちに流れるのは止めるべきこと。

僕の意見は教育を変革して、right directionにright moneyを。将来は将来の希望に託した方がいい。 自分でものを考え、実現できる人材を。多くの社会人がものを考えてない気がする。どうしてもメディアに流される。

最後に高齢化社会で選挙自体が破綻してない?って思う。 票を持つ高齢者が本当に50年後を考えて投票できてるのか、よくわからない。 地方の一票の格差よりもこの一票の格差の方がきつい。

Swift Fundamentals: The Language of iOS developmentを読んだ

Swift Fundamentals: The Language of iOS Development

Swift Fundamentals: The Language of iOS Development

とりあえず、読み終わりました。Object-Cを触った事ないのでXcodeも初めてでした。 シンタックスの説明がされていて、Xcodeも説明があって初学者には良い本でした。 LLとOOの素養があれば平易な内容です。

Appleの本にはxcodeやPlaygroundの説明もなく、いきなりシンタックスの説明が始まるので、そこが説明されていたので助かりました。

概要は掴めたけど、明らかに足りない。

今知りたいのは、

AngularJS+Slip.jsでタッチデバイスでリストの順番を並べるUIを作成する 

f:id:shoheik:20141017122239p:plain

上記のようにリストを動的にスマホで動かせるようにするためにSlip.jsを使いました。Directiveに定義してng-repeatのDOMに置きます。$last === trueでループが終わったところで発火するようにしています。JQueryのライブラリを使うときは、これ良く使いますね。

<li slip ng-repeat="photo in photos|orderBy:photo.ordering:reverse" >  
...
</li>

temp作成やscopeとserviceに突っ込んでるところは、今回の実装のためなので変更してください。 今回はphoto.orderingに順番が入っていて、これに基づきソートしてます。

(function(){

  'use strict';

  angular
  .module('traberryApp')
  .directive('slip', slip);

slip.$inject = ['$log', '$timeout', 'EditJourney'];

  function slip($log, $timeout, EditJourney){

    return function(scope, element, attrs) {
      if (scope.$last === true){
        $log.info('running slip');
        var list = $(element).parent('ul').get(0);
        new Slip(list);

        // prevent swipe
        list.addEventListener('slip:beforeswipe', function(e) {
          e.preventDefault();
        }, false);

        // instant reorder
        list.addEventListener('slip:beforewait', function(e){
          if (e.target.className.indexOf('instant') > -1) e.preventDefault();
        }, false);

        list.addEventListener('slip:reorder', function(e) {
        
          var spliceIndex = e.detail.spliceIndex;
          var originalIndex = e.detail.originalIndex;
          var temp = [].concat(scope.photos); // depending on what you need to change
          if (spliceIndex > originalIndex){
            temp.splice(spliceIndex+1, 0, scope.photos[originalIndex]);
            temp.splice(originalIndex, 1);
          }else{
            temp.splice(spliceIndex, 0, scope.photos[originalIndex]);
            temp.splice(originalIndex+1, 1);
          }

          for(var i=0; i<temp.length; i++){
            temp[i].ordering = i;
          }
          
          // insert scope as well as service
          scope.photos = temp;
          EditJourney.setPhotos(temp);

          e.target.parentNode.insertBefore(e.target, e.detail.insertBefore);
        });

      }
    };
  }

})();