SourceTreeで「Couldn't agree a key exchange algorithm」エラー

概要

SourceTreeでプッシュしようとしたらブランチが表示されず、ターミナルから「git push」してみると「Couldn't agree a key exchange algorithm」エラーがダイアログ表示された時の対応メモ
※内臓Gitを利用している場合

対応

  • SourceTreeの「ツール」→「オプション」を順に選択する
  • 「オプション」ダイアログが表示されるので「Git」タブを選択し「Gitバージョン」グループの「Update Embedded」をクリックする

CloudFormationにおけるエラー対応メモ

概要

AWSのCloudFormationで出力されるエラーメッセージとその対応についての備忘録
都度追記していく

Update the IAM policy to add permission

エラーメッセージ

Lambda@Edge cannot retrieve the specified Lambda function. Update the IAM policy to add permission: lambda:GetFunction for resource: arn:aws:lambda:us-east-1:xxxx:function:yyyy:1 and try again. (Service: AmazonCloudFront; Status Code: 400; Error Code: InvalidLambdaFunctionAssociation; Request ID: zzzz)

対応

単純にlambdaのGetFunctionの権限が無いというもの。対象のlambdaを参照する側のリソースを特定して権限を与えればOK。
例外的なケースとして、このlambdaのバージョンは別のIAMポリシーで作られており、そのポリシーが設定されていないという場合もあった。
例えばCloudFormationのstack-Aとしてlambdaバージョン1と2を作っていたが、stack-Aは削除しており、stack-Bを新たに作成した際にlambdaバージョン1を参照しているケースである。尚、stack-Aとstack-Bでそれぞれ参照用のポリシーを作成して適用している場合に古いバージョンが参照できなくなる。

puttyのセッションをバッチ実行する際の便利な記述

概要

puttyのセッションが増えてくると実行する際に手間取るのでバッチ実行するやり方

前提

環境変数かSETを使って「PATH_PUTTY」にputty.exeのパスが入っているものとする

やり方

単純な実行方法

下記の文字列をテキストファイルに書き込み、拡張子を .bat にすればOK
ex) mytest.bat

start "" %PATH_PUTTY% -load "セッション名"

ファイル名に連動させる方法

下記の場合はファイル名をセッション名として実行する
例えばファイル名が mytest.bat であればセッション名が mytest のものが実行される
こうしておけば中身の文字列は変更せずにファイル名だけセッション名に合わせてコピーすればすぐ使えるようになる

start "" %PATH_PUTTY% -load "%~n0"

環境変数を使いたくない場合で、フォルダで管理する場合のtips

下記のような構成にしておけばinit.batが親に存在する場合は再帰で呼び出してくれるので、先頭の一か所にパスを書けば良くなる

/top/init.bat

SET PATH_PUTTY="C:\Program Files\putty\puttyjp.exe"

/top/sub/init.bat

IF EXIST %~dp0"..\init.bat" (call %~dp0"..\init.bat")

/top/sub/mytest.bat

IF EXIST %~dp0"init.bat" (call %~dp0"init.bat")
start "" %PATH_PUTTY% -load "%~n0"

新規ページを閲覧する際に10秒程度待たされるようになった

概要

windows10環境において、突然インターネットでページを閲覧する度に10秒程度待たされるようになった
その現象の解決方法について

現象

  • ページ閲覧する度に10秒程度待たされる
  • 一度閲覧すると2回目以降は速い(初回アクセスのページだけ遅い )

原因

早い話がIPv6DNSでIP解決しようとして、失敗している場合にこの現象が発生する
(※IPv6DNSを用意してあり、正しく設定している場合はこのケースでは無い)
10秒程度待てばIPv4DNSでIP解決出来ているようで、時間はかかるがアクセス出来てしまうのが厄介

解決方法

IPv6を使わないのであればネットワークアダプタの設定でIPv6を外してしまうのが手っ取り早い
使うのであればDNS設定を正しくする

トリガー

そもそも突然こうなった訳では無い、理由がある
著者のケースではvirtualboxをインストールした事がきっかけになったと思われる
想像になるが、今まではIPv4側が優先的に使われていたが、virtualboxインストール時にIPv6側が優先されたのではないか

類似問題かどうかの確認方法

chromeの開発者ツールを使ってネットワークタブを表示した状態で現象を発生させると、タイムラインからどこに時間を要したか分かる
これがDNS Lookupであり、10秒に近い場合は類似問題の可能性が高い

参考

gradleのhello worldメモ

memo

gradleのhello world的なサイトを見ながら操作メモです。(centos7)

gradleのインストール

# cd ~
# yum install -y which unzip zip vim
# curl -s http://get.sdkman.io | bash
# source ~/.sdkman/bin/sdkman-init.sh
# sdk install gradle

hello woldのコンパイルと実行

# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
# mkdir myapp && cd myapp
# gradle init --type java-application
# gradle compileJava
# gradle run

jarの作成と実行

# gradle jar
# ls -la build/libs/
# java -cp build/libs/myapp.jar myapp/App

build.gradleに簡単なタスクを追加して実行

# vim build.gradle
※ファイル末尾に下記を追記
task hello {
    doLast {
        println "Hello World!!"
    }
}
# gradle hello
> Task :hello
Hello World!!

カスタムタスクの利用

DefaultTaskから派生したタスクを定義しておき、実行するメソッドにアノテーションを付けておけば、「type:」で型を指定する形でオブジェクトを生成して実行する事ができる。pluginで提供される機能に対し、任意のパラメータを上書きして実行させるなどして利用する。

class AAATask extends DefaultTask {

    String message

    @TaskAction
    def execMyTask() {
        println("message is ${message}")
    }
}

task execMyTask(type: AAATask) {
    message = "Hello World"
}

pageantに秘密鍵を登録するバッチの作成

概要

毎回pageant秘密鍵を入れる操作が面倒なのでバッチにしておく

やり方

pageant.exeがあるディレクトリ内にテキストファイルを拡張子batで用意する
ex) pageant_regist.bat

start pageant
timeout 3
pageant C:\key\any_key1.ppk
pageant C:\key\any_key2.ppk
pageant C:\key\any_key3.ppk
pause

スタートアップに入れておけば起動時に走らせる事もできる

サーバーにsshログインした時にslackに通知する

概要

サーバーにsshログインした時にslackに通知する

slack側での作業

  • 「チャネル設定」→「アプリを追加する」を順にクリックする
  • 「incoming-webhook」をインストールする
  • 「incoming-webhook」の設定にある「Webhook URL」をメモする

サーバー側での作業(CentOS7)

下記の「channel-name」と「http://hooks...」の部分は環境に合わせて要変更

$ sudo vim /etc/ssh/sshrc
#!/bin/bash

CHANNEL="#channel-name"
HOSTNAME=`hostname`
MESSAGE="username:${USER} from:${SSH_CLIENT} server:${HOSTNAME}"
WEBHOOK_URL='https://hooks.slack.com/services/xxxx/xxxx/xxxx'
curl -X POST --data-urlencode 'payload={"channel": "'"${CHANNEL}"'", "username": "login notification", "text": "'"${MESSAGE}"'"}' ${WEBHOOK_URL} 1>/dev/null 2>/dev/null