2013年2月24日日曜日

さくらVPS契約後ログイン環境を整えるまで

作業はmacのターミナルで行なってます。

サーバーにアクセスする

契約後届くメールに書いてあるIPアドレスとパスワードを使用してrootとしてログインする。
       
ssh root@xxx.xxx.xxx.xxx
#パスワードを聞かれるのでメールで送られてきたrootのパスワードを入力
#ログイン後ソフトウェアのアップデートを確認
yum update
ログインできたら言語設定を日本後に変更
「/etc/sysconfig/i18」を編集して以下のようにすることで言語設定を日本語に
       
LANG="ja_JP.UTF-8"
SYSFONT="latarcyrheb-sun16"

サーバーで使用するアカウントを作成する

rootでログインを禁止するために普段使うアカウントを作成します。
rootでのログインを禁止したい理由はおそらく以下のようなことだと思います。

  • ユーザの権限を管理したい
  • アカウント名がrootということがわかっているので総当たり攻撃でログインしやすい
  • 間違って設定ファイルを編集しない
※個人の解釈です

ユーザの追加方法

       
  useradd user_name
  passwd user_name

先ほど作成したアカウントでsudoコマンドを使用可能にする

       
  usermod -G wheel user_name
  visudo 
  #開いたファイルで次の行を有効化(105行目付近)
  %wheel  ALL=(ALL)       ALL

今作成したアカウントでのログインを試す。
rootでのログインを無効にしたあとにログインができないと困るので必ず試してください。

#ローカルで
ssh user_name@@xxx.xxx.xxx.xxx
#パスワードを求められるでの先ほど設定したパスワードを入力
#以下サーバー側
#root 権限で編集を行う
sudo -s
#設定ファイルを変更する前にはバックアップをとる
cp /etc/ssh/sshd_config  /etc/ssh/sshd_config.bak
vim /etc/ssh/sshd_config
#root でのログインを禁止
PermitRootLogin no #コメントアウトされてるのでyesをnoに変更後有効化
#編集が終わったら反映させる
service sshd restart

これでsshでrootでのログインができなくなったはずです。

sshでパスワードでのログインではなく、公開鍵認証を利用してログインする

パスワードでのログインよりも、公開鍵認証でのログインのほうが安全性が高いためこっちを利用します。

#鍵の保存場所を作成
mkdir ~/.ssh
cd ~/.ssh
#鍵の作成、今回はRSA暗号方式を利用
ssh-keygen -t rsa 
#パスフレーズを聞かれます
#パスフレーズは設定しないことも可能ですが、その分だけセキュリティが低下します
#~/.ssh/ の中にid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が作成されていれば成功
chmod 600 id_rsa.pub #公開鍵の権限を変更
#公開鍵を転送サーバー側に転送
scp ~/.ssh/id_rsa.pub  user_name@xxx.xxx.xxx.xxx:~/.ssh/authorized_keys
# :以下は転送先を指定します公開鍵の名前は「authorized_keys」が一般的らしい
#転送に失敗した場合はサーバーで先に.sshフォルダを作成してみてください
#ファイル転送はsftpでも問題はないです

#公開鍵でログインできるか確認
ssh -i user_name@xxx.xxx.xxx.xxx

公開鍵でログインができたら今度はパスワードでのログインを禁止します

#サーバー側
sudo -s
#設定ファイルを変更する前にはバックアップをとる
cp /etc/ssh/sshd_config  /etc/ssh/sshd_config.bak
vim /etc/ssh/sshd_config
#yesをnoに変更
PasswordAuthentication no
#編集が終わったら反映させる
service sshd restart

これでパスワードでのログインを禁止して公開鍵認証でログインするようになりました。

2013年2月4日月曜日

MacVimにZenCodingプラグインを導入する手順

MacVimでZenCodingをするためのプラグインをいれたのでメモ。

ZenCodingとはHTML,CSSのコーディングを楽にするツールです。

今回はMacVimでZenCodingを行うためのプラグインである「ZenCoding.vim」を導入します。

1.プラグインをダウンロード

 ZenCoding.vimの「公式サイト」の下の方にあるプラグインをダウンロード。



2. プラグインの導入 

ダウンロードしたzencoding-vim.zipを解答すると、「autoload」「doc」「plugin」フォルダがあるが、「autoload」「plugin」フォルダをホームディレクトリ直下にある「.vim」フォルダ内にコピーします。
 これで導入が完了。
※ネットで検索するとautoloadフォルダの中はzencoding.vimだけコピーすればいいと書いてありましたが、これだけだと補完がうまくいかなかった。更新された時に依存するファイルが変わったのかもしれません。


3.動作確認


vimを起動して挿入モードで「html:5_」と入力して挿入モードのまま「CTRL+ y + , 」を入力すると

<!DOCTYPE html> 
<html lang="en">
<head>   
     <meta charset="UTF-8">
     <title></title>
</head>
<body>

</body>
</html> 

が展開されます。

Zencodingのチートシート
「http://zen-coding.googlecode.com/files/ZenCodingCheatSheet.pdf」


2013年2月3日日曜日

2012年12月6日木曜日

一人Advent Calendar 5日目

5日目といいつつ6日の朝です。

4日目の記事も完成してないんですけどとりあえず5日目書きます。

1,2,3日とひたすらYAMLファイルを解析していたのですが実際はどうやって解析するかというのをJYamlのソースを少し見てみます。

Yamlの解析はデータの種類を把握しないといけないので流れしては

1 データ読み込み
↓
2 データ構造理解
↓
3 データを理解した構造に合わせて変換

でいいと思います

今回は
 
 Yaml.load(new File("test.yml"));
を呼び出したとして処理を追ってみます。

まずはYamlクラスのloadメソッドです
 
public static YamlConfig config = YamlConfig.getDefaultConfig();

public static Object load(File file) throws FileNotFoundException{
   return config.load(file);
}
loadメソッドは様々な引数に対応してましたが、今回はFileを引数に取るのだけを追っていきます。
YamlConfigのloadメソッドに処理を委譲しているようなのでそちらへ。

YamlConfig
 
public Object load(File file) throws FileNotFoundException{
  return load(new YamlDecoder(new FileInputStream(file), this));
}

public Object load(YamlDecoder dec){
  dec.setConfig(this);
  Object ret = null;
  try {
    ret = dec.readObject();
  } catch (EOFException e) {}
  return ret;
}

どうやらloadメソッドにYamlDecoder以外の引数を渡すとYamlConfigクラスの中でYamlDecoderに変換してYamlDecoderを使ってloadを行っているみたいです。
どうやら複数データをシリアライズしている時と1つのデータをシリアライズしている時で呼ぶ方は違っても結局内部では同じメソッド使ってるみたいです。
(落ち着いて考えたら当たり前だった・・・)

次はYamlDecoderクラスのreadObjectメソッドですね。(setConfigメソッドはYamlConfigを渡してYamlDecoderクラスから参照できるようにしているだけだったので省略)

YamlDecoderクラス
 
public Object readObject() throws EOFException{
  try {
    JYamlParserEvent event = new JYamlParserEvent(createLogger(), this);
    if (parser == null){
      parser = new YamlParser(in,event);
      firstDocument(parser, event);
    }else{
      parser.setEvent(event);
      if (!nextDocument(parser, event))
        throw new EOFException();
    }
    
    Object ret = event.getBean();
    
    if (ret == null)
      throw new YamlException("Document is empty.");
    return ret;
  
  } catch (EOFException e) {
    throw e;
  } catch (YamlException e){
    e.setLineNumber(parser.getLineNumber());
    hrow e;
  }
}
最初に呼ばれた時、YamkParserを初期化してfirstDocumentメソッドをそれ以外はnextDocumentメソッドを呼ぶ出しているみたいです。
解析としてはやっていることは同じはずなのでfirstDocument側だけ追います
 
void firstDocument(YamlParser p, YamlParserEvent event){
  try {
    while (p.comment(-1,false));
            
    if (!p.header())
      p.document_first();
    else
      p.value_na(-1);
    }catch (SyntaxException e){
      event.error(e,e.line);
    }catch (IOException e){
      throw new YamlException(e);
    }
}
ここから先はすべてメソッド追っていくと長くなるのでそれぞれのメソッドでなにをしていたかだけ書いていきます、まずはcommentでコメントかどうか判定します。またコメントの前にもtabが使われていたらエラーがでるようになってました。

headerメソッドは---から始まるかどうかを判定してました。


まだここまでしか見れてないですが、ここから先は実際にデータを読み込んで解析してデータを指定されている構造に直せば解析は終わりだと思います。
とりあえず今日はここまでで。

2012年12月4日火曜日

一人Advent Calendar 4日目(アノテーション)

4日目

三日坊主にはならなかったですね。

今日はJavaでコメントの一種?であるアノテーションの使い方です。

アノテーションはソースコードにプログラム以外で情報を与える時に使用します。
普通のコメントで違い、アノテーションはコンパイラに意味のある情報を与えることが
できるのでしっかりと使えばすごく便利です。

まずはアノテーションの種類ですが、これは3種類あります

マーカーアノテーション : アノテーションがついていることに意味があるもの
例) Deprecated、Override

単一アノテーション : データを1つだけ持っている
例)SuppressWarnings

フルアノテーション : データを複数持つ
例)Test

時間がないので今日は種類の紹介だけです、時間があれば後で追記します。
ごめんなさい

2012年12月3日月曜日

一人Advent Calendar 3日目(JavaでYamlファイル読み込みその3)

毎日ブログ書くのがこんなにも大変だとは思ってなかったです。

今日はホント少ないけど継続は力なりってことで書きます。

前回まででYamlで様々なオブジェクトが扱えるようになったので今日は複数のオブジェクトを扱います。

まずはシリアライズ
シリアライズにはYamlEncodeクラスを使います

 
  List <Integer> list1 = new ArrayList < >();
  list1.add(10);
  list1.add(11);
  list1.add(12);
  
  List <Integer> list2 = new ArrayList < >();
  list2.add(0);
  list2.add(1);
  list2.add(2);
  
  YamlEncoder enc = new YamlEncoder(new FileOutputStream("hoge.yml"));
  enc.writeObject(list1);
  enc.writeObject(list2);
  enc.close();
シリアライズした結果のファイルは以下です。
 
--- 
- 10
- 11
- 12
--- 
- 0
- 1
- 2

次はこのファイルをデシアライズします。
デシリアライズにはYamlDecoderクラスを使います
サンプルには2種類やり方があったので2種類載せときます
まずは1種類目
  YamlDecoder dec = new YamlDecoder(new FileInputStream(new File("hoge.yml")));
  while (true) {
   Object object = dec.readObject();
   System.out.println(object);
  }
こっちが2種類目
  for (Object object : Yaml.loadStream(new FileInputStream(new File("hoge.yml")))) {
    System.out.println(object);
  }

2番目のほうが要素の数がわかってなくてもエラーがでないから良い感じ。
基本的にはこっちを使えばよさげ。

3日間もYamlファイルでお茶を濁した間はありますがこれでYamlはひと通り終わりです。
明日からなに書こうかな・・・

2012年12月2日日曜日

一人Advent Calendar 2日目(JavaでYamlファイル読み込みその2)

1日目はJavaでYamlファイルを扱いましたが、リスト形式のデータを読み込んでいるだけでした。
今日はリスト形式だけじゃなく、Mapや自分で定義したオブジェクトのデータをシリアライズとデシアライズしてみます。

まずはシリアライズ
 
  Yaml.dump(シリアライズしたいオブジェクトや文字列);
でこれがデシアライズ
 
  Yaml.load(デシリアライズしたいファイルや文字列);
まあシリアライズとデシアライズしたいだけならこの二つだけで充分ぽいので早速サンプルです。
昨日に引き続きまずはlistをシリアライズしてデシアライズします
今回読み込みyamlファイル
 
- hoge
- fuga
- mofu
-
  - fufu1
  - fufu2
たいしたことしてないけどサンプル
 
//yamlファイルの読み込み(デシアライズ)
        try {
  List <Object> list1 = (ArrayList<Object>) Yaml.load(new File("list.yml"));
  System.out.println(list1.get(0));
  System.out.println(list1.get(1));
  System.out.println(list1.get(2));
  System.out.println(list1.get(3));
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 }
 System.out.println();
 System.out.println("==============");
 System.out.println();
 
 //リストのシリアライズ化
 List<Integer> list2 = new ArrayList<>();
 list2.add(0);
 list2.add(1);
 list2.add(2);
 System.out.println(Yaml.dump(list2));
続いてMapを扱います
読み込んだyamlファイルこちら
 
Name: Andre Agassi
Birthplace: LasVegas
Height: 5'11'' (180 cm)
Turned Pro: 1986
でサンプル
 
    try {
  Map<Object, Object> map1 = (HashMap<Object, Object>) Yaml.load(new File("map.yml"));
  System.out.println(map1.get("Name"));
  System.out.println(map1.get("Birthplace"));
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 }
  
 Map<String, Object> map2 = new HashMap<>();
 map2.put("name", "hoge");
 map2.put("age", 20);
 map2.put("height", 180);
 map2.put("weight", 70);
 System.out.println(Yaml.dump(map2));
次は自分で作成したクラスを扱います
今回扱いクラスはこれ(すげー適当に作ったのは気にしない方向で)
 
package test;
public class Hoge {
 private int num;
 private String str;
 
 public Hoge(){
  
 }
 public Hoge(int num, String str) {
  this.num = num;
  this.str = str;
 }

 public int getNum() {
  return num;
 }

 public void setNum(int num) {
  this.num = num;
 }

 public String getStr() {
  return str;
 }

 public void setStr(String str) {
  this.str = str;
 }
 
 
}
さっそくシリアライズしてみます
 
  Hoge hoge = new Hoge(10, "test");
  System.out.println(Yaml.dump(hoge));
出力結果
--- !test.Hoge
num: 10
str: test

普通に出力すると!test.Hogeといったふうオブジェクトの情報が入ってしまいます。
これはこれでデシアライズする時にオブジェクトを特定できて便利なんですけど他の言語で扱えなくなってしまいます。
このオブジェクトの情報を表示しなくするためにはYaml.dumpの第2引数にtrueを設定すれば表示されなくなります。
 
  Yaml.dump(シリアライズしたいオブジェクトや文字列, true);
第2引数を設定した出力結果
---
num: 10
str: test

で次はデシアライズです
読み込みファイルは先ほど出力した結果をファイルにしたものです
 
  Hoge hoge1 = (Hoge)Yaml.load("object.yml");
  System.out.println(hoge1.getNum());
  System.out.println(hoge1.getStr());
オブジェクトの指定がある時はこの方法でうまくいくのですが、情報がない時失敗していまします。
オブジェクトの情報が無い時のデシアライズのサンプル
 
  Hoge hoge1 =Yaml.loadType(Yaml.dump("object.yml"),Hoge.class);
  System.out.println(hoge1.getNum());
  System.out.println(hoge1.getStr());
情報がないなら渡してあげればいいってだけですね。

こんな感じでYamlは様々なオブジェクトを扱えるので便利そうです。
今回は日本語は扱ってないですけどどうやら日本語も普通に使えるようです
公式のJavadocはこちらhttp://jyaml.sourceforge.net/javadoc/index.html
明日も引き続きYamlファイルの扱い方に付いてになる予定です