カテゴリー : 2015年 12月

[ssh] Warning: the RSA host key for ‘server_name’ differs from the key for the IP address ‘xxx’ の解決方法

EC2 instance を新しくした後 /etc/hosts を編集して、hostname はそのままで ip address だけ変更して ssh したら毎回下記のような警告メッセージが表示されるようになってしまいました。

[ec2-user@hoge ~]$ ssh server_name
Warning: the RSA host key for 'server_name' differs from the key for the IP address '10.123.123.123'
Offending key for IP in /home/ec2-user/.ssh/known_hosts:232
Matching host key in /home/ec2-user/.ssh/known_hosts:46
Are you sure you want to continue connecting (yes/no)?

known_hosts に host name と ip address の古い組合せの接続情報が残っているのが原因なので Matching host key in /home/ec2-user/.ssh/known_hosts:46 のメッセージに書かれているように known_hosts の 46 行目を削除しましょう。

[ec2-user@hoge ~]$ vim .ssh/known_hosts
# 46 行目を削除する

known_hosts を編集後、再び ssh します。

[ec2-user@hoge ~]$ ssh server_name
The authenticity of host 'server_name (10.123.123.123)' can't be established.
ECDSA key fingerprint is 6b:d3:33:ab:75:ee:50:dc:f0:0a:ca:7c:7e:bd:14:8e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server_name' (ECDSA) to the list of known hosts.

その後、切断してもう1度 ssh すると Warning メッセージが表示されなりました。

[ec2-user@hoge ~]$ ssh server_name
Last login: Thu Dec 31 00:48:26 2015 from forward_proxy1
 
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

以上です。

Google Drive のファイルが完全削除されてしまったとき Google に復元してもらえるかもしれない?

「よく分からないけど、Google Drive のファイルが完全削除されているので、どうしたらいい?」という相談をされたので、調べてみたところ Google に問い合わせると一定期間であれば復元してもらえるようでした。

原因として有り得そうなのは、自分の PC と Google Drive を同期しているとうっかりローカル環境のファイルを削除したのではないかと思いますが、事実は不明です。

気づいたタイミングですぐに Google Apps for Work ヘルプフォーラム から問い合わせるとよさそうです。

[jQuery] カルーセルライブラリ slick.js の lazyLoad オプションを理解する

jQuery のカルーセルライブラリ slick.js をそのまま使うと slick.js file の読み込みと .slick() method の実行が完了するまで、カルーセルのレイアウトにならず ul/li タグで囲んでいる画像が全て表示されてしまうという問題に直面しました。

これを解決するには 1 枚目の画像だけ src で画像 URL を指定します。

<img src="http://example.com/image1.png">

2 枚目以降は data-lazy attribute に image url を指定します。

<img data-lazy="http://example.com/image2.png">

そして .slick() method に lazyLoad オプションを設定してあげれば OK です。

$('#js-banner-area').slick({
  lazyLoad: 'progressive'
});

Lazy Loading のサンプルは slick – the last carousel you'll ever need に載っています。

ちなみに lazyLoad オプションは ondemand と progressive の 2 つの設定があります。挙動の違いは Stack Overflow に詳しく説明されている投稿があったので引用しておきます。

ondemand: Loads the visible image as soon as the page is displayed and the other ones only when they’re displayed. (“[…] loads slides on demand. When a slide becomes visible (or on the before slide callback) the load is fired.”) Should be used if the other images of the carousel are displayed very rarely.

progressive: Loads the visible image as soon as the page is displayed and the other ones after everything else is loaded in the background (“loads the visible slides on init, and then progressively loads the rest of the slides on window.load().”). Should be used if the other images will be used most (or all) of the times the page is displayed.

デフォルトは画像が表示されるタイミングで load 処理が動く ondemand ですが、個人的には background で画像を load しておいてくれる progressive オプションを使うのが好みです。

lazyLoad オプションに設定値はカルーセルで 2 枚目以降の画像が表示される頻度で ondemand を使うか progressive を使うかを決めるとよさそうですね。

参考情報

[Linux] 多段 ssh/scp の設定

複数のサーバを経由して ssh や scp コマンドを叩きまくるのが面倒くさいので直接 ssh/scp できる設定を .ssh/config ファイルに追加しました。

多段 ssh/scp の設定方法

設定前はローカル環境で ssh server1 した後に server1 にて ssh server2 という手順で2回 ssh していました。

# .ssh/config file
Host server2.example.com
  ProxyCommand ssh server1.example.com nc %h %p
  IdentityFile    ~/.ssh/server1_example_com.pem
  User            ec2-user

設定後は server1 を介さずに直接 ssh server2 できるようになります。

scp コマンドでのファイル転送も下記のように直接できるようになるので超便利です!

scp ~/Downloads/spam.csv server2:

複数サーバを経由して ssh や scp をする機会がある方はぜひ設定してみてください。


参考情報

Mongoose documents を JSON に変換して response を返す

Express.js + Mongoose で documents を JSON に変換して response を返すには、

UserModel.find().lean().exec(function (err, users) {
  return res.json(users)
});

というような感じで lean() オプションを付けて plain javascript object を取得した値を res.json で返せばよいです。


参考情報

ロードアベレージを理解する

load average についてちゃんと理解できてなかったので、参考になった記事をメモっておく。

naoya さんの記事にあるように 4 core の OS でのロードアベレージの見方が分かっていなかったので、こういう記事は本当にありがたい。

[Node.js] CSVTOJSON を使って CSV から JSON ファイルに変換する

CSVTOJSON という npm モジュールを利用して、CSV を JSON ファイルに変換するスニペットをご紹介します。

csvtojson をインストールする

npm install -g csvtojson

csvtojson を使って CSV から JSON ファイルへ変換する

var Converter=require("csvtojson").Converter;
var csvConverter = new Converter({
  constructResult: false,
  toArrayString: true
});
 
var pathName = "/Users/bakorer/Downloads/";
var readStream = require("fs").createReadStream(pathName + "sample.csv");
var writeStream = require("fs").createWriteStream(pathName + "sample.json");
 
readStream.pipe(csvConverter).pipe(writeStream);

以上です。

[Twitter] ツイートボタンの独自イベントを取得してクリックしたときに何か処理させる

Twitter のツイートボタンの独自イベントを取得して、ツイートボタンをクリックしたときに何か処理をさせたいときに役立つスニペットをご紹介します。

// https://dev.twitter.com/web/javascript/loading より
window.twttr = (function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0],
    t = window.twttr || {};
  if (d.getElementById(id)) return t;
  js = d.createElement(s);
  js.id = id;
  js.src = "https://platform.twitter.com/widgets.js";
  fjs.parentNode.insertBefore(js, fjs);
 
  t._e = [];
  t.ready = function(f) {
    t._e.push(f);
  };
 
  return t;
}(document, "script", "twitter-wjs"));
 
twttr.ready(function (twttr) {
  twttr.events.bind("tweet", function (event) {
    console.log('Tweet ボタンをクリックしたタイミングで呼び出したい処理');
  });
});

使い方の事例は、例えば Google Analytics のイベントトラッキング機能でツイートボタンのクリック数を計測したいとかでしょうか。


参考情報