よくいる文系プログラマの戯言

プライベートでの開発を適当に書き留めます

UbuntuのVPSを立てたので初期設定してみた

VPSを借りたので、最低限のセキュリティー確保などの初期設定。 CentOSだと情報豊富なのだけども、Ubuntuはあまりなかったので、書いてみました。 Ubuntu使いにこういうのが必要な初心者がそもそも少ない気がするけども。

CentOSだと、VPS 借りたら、せめてこれくらいはやっとけというセキュリティ設定 という記事がコンパクトでよかったので、これに沿って設定してみます。

①作業用ユーザーの作成

adduser {ユーザー名}

adduserのところをRedHat系のようにuseraddとすると、ホームディレクトリが作られません。adduserとすると、名前や部屋番号などを聞いてきますが、そこは適当に。 加えて、コマンドラインLoginName@Hostname:CurrentDirectory$の表示すらないよく分からんモードになってしまうので注意です。

②作業用ユーザーにroot権限を付与(rootユーザーで行ってください)

sudo gpasswd -a {ユーザー名} sudo

sshでのrootログイン禁止

rootでのSSHログインを禁止 - SSHサーバーの設定 が参考になります。 他のサイトだと、ssh_configを設定しろと書いていたりするケースが多かったので、このサイトでsshd_configを変えるとうまくいくと分かりました。

ただ、途中のsshの再起動のところは、このサイトのやり方だとうまくいかず、sudo service ssh restartだとうまくいきました。

④パスワード認証を禁止し、公開鍵認証を設定

鍵の生成うんぬんのところは、SSH鍵認証 ssh-keygenコマンドで認証用の鍵を作成するが分かりやすいです。 念のため、ローカルに鍵を両方コピーしておくと良いかもしれません。

鍵をつくるときにパスを設定していると、Saving password to keychain failedという表示が出る可能性があり、そのときに公開鍵が必要になるので。 →参考:Mavericksでssh接続すると”Saving password to keychain failed”が表示される

⑤logwatchをインストールしてログを収集

これはVPS 借りたら、せめてこれくらいはやっとけというセキュリティ設定に従って設定すれば問題ないと思います。 ただ、パッケージを一旦全部アップデートしてからじゃないと、依存関係からlogwatchがインストールできないかもしれません。

大体こんな感じでしょうか。

Gulpでgulp-sassを使うときの注意点

近頃はGruntよりGulpが良いというのを多方面できくので、サイト制作用の雛形をGulpを使って組み直してみました。

HTML-baker (Githubで公開したよ!)

gulpfile.jsは以下の通り。 最低限必要かなと思われた機能のみ盛り込みました。やや粗めです。

そこで一番ハマったのは、sassのコンパイル周りですね。

gulp-sassの挙動のクセ

sassのコンパイル用のプラグインとしてgulp-ruby-sassというのもあるんですが、なんとなくgulp-sassを選択。 あとから調べてみると、gulp-ruby-sassのほうが動きが遅いみたいです。

しかし、gulp-sassを使ってみると、一向にコンパイルできない。 どういうことかと調べてみたら、デフォルトでscss記法をコンパイルするようになっている模様。

参考:gulp-sassで.sassファイルを使うときの注意点

中括弧とかを書くのが嫌いな僕はSASS記法を使っているので、ここでハマってしまいました。 sassをpipeするところのオプションで、sourceComments: 'normal'を加えてやれば解決です。

Android開発メモ①

Android初心者なので、デベロッパーサイトを参考にしながら開発進めます。

誰のためでもなく自分のためのメモということで、あしからず。

Intent

  • 新しいActivityを起動させるときに使用。(explicit intent)
  • extrasと呼ばれるkey-value値でパラメーターを持つことができる。keyは定数としてクラス内で定義する。

疑問点

  • findViewById()の扱い
  • savedInstancceStateってなんぞ。セッション管理かなんかっぽいけども。
if (savedInstanceState == null) {
  getSupportFragmentManager().beginTransaction()
    .add(R.id.container, new PlaceholderFragment()).commit();
}

今日のところはこんなもので。

流行りのGoを触ってみる②

Goを触ってみて2日目。

変数宣言はいい感じにまとまる

package main

import(
  "fmt"
  "math/cmplx"
)

var (
  ToBe bool = false
  MaxInt uint64 = a<<64 - 1
  z complex128 = cmplx.Sqrt(-5 + 12i)
)

ループまわり

while文が存在しない!

sum := 0
for i := 0; i < 10; i++ {
  sum += i
}

// while文的な
sum := 1
for sum < 1000 {
  sum += sum
}

//無限ループ!
for {
}

条件分岐まわり

ifステートメントは、forのように実行のための短いステートメントを条件の前に書ける。 elseブロック内でも使用可能。

if v := math.Pow(x, n); v < lim {
}

JSON的な

type Vertex struct {
  X int
  Y int
}

メモリの確保

こちらはC言語っぽいもの。

var t *T = new(T)

//同じ書き方
t := new(T)

次回はSlice、Map、Functionあたりに触れたいと思います。

Vagrantの基礎的なところをおさらいしてみる

GMOVPSを借りたので、環境構築にChefでシュタッとやってみることにしました。 まずは練習として、Vagrantで立てたローカル開発環境を使って実験。

そこで、そもそもVagrant初めて使ったのが2ヶ月前でそれ以来全く使っていなかったので一旦復習。 毎度おなじみ、ドットインストールのVagrant入門でお世話になりました。

VagrantのTips

セットアップ

  • vagrant box add precise64 http://files.vagrantup.com/precise64.boxみたいな感じでテンプレートを取得
  • vagrant box listで取得したテンプレートを一覧。
  • vagrantコマンド自体は、どこのディレクトリでも使えるっぽい。
  • boxは、~/.vagrant.d/boxesに格納されている。

  • ディレクトリを切って、vagrant init precise64を実行。そのディレクトリにVagrantfileが生成される。

  • vagrant sshでサーバーに接続。HOMEディレクトリは、/home/vagrant
  • 外部から特定のIPでアクセスするには、Vagrantfileの編集が必要。
  • vagrant initしたMac上のディレクトリと、サーバー上の/vagrantは連動している。

基本的なところをさらってみました。 公式ページ見てみたら、そこまで膨大な機能があるわけではなさそうだし、機会があればまとめて呼んでみようかな。

あとDockerでも同じようなことやってみたいです。

流行りのGoを触ってみる①

これまた、気になったことを雑多に書いていきます。

インポートされたパッケージでは、最初の文字は大文字に。

インポートされたパッケージが外部に公開している名前の最初の文字は大文字にするという決まりがあるようです。

初期化子が指定されている場合は型を省略可能

その変数は、初期化子の型になる。

関数内では暗黙の型変換が可能。

package main

import "fmt"

func main() {
  var i, j int = 1, 2
  k := 3
  c, python, java := true, false, "no!"

  fmt.Println(i, j, k, c, python, java)
}

constで定数を宣言するときは使えない。

Mozillaが開発中のシステムプログラミング言語「Rust」に触ってみた①

備忘録がてら、本当に雑多に書いていきます。 基本的にはこいつに沿って進めます。 →The Rust Language Tutorial

コンパイルJavaより遅い

システム寄りの言語だから当たり前?Cを触ったことがないので、比較できません。。

変数宣言がSwiftっぽい

static MONSTER_FACTOR: f64 = 57.8;
let monster_size = MONSTER_FACTOR * 10.0;
let monster_size: int = 50;

ノーマルの変数の場合、型宣言はオプショナルだが、定数の場合は必須な模様。 ちなみに、letで宣言したローカル変数は基本的に中身を変えないのが前提っぽくて、変える場合はlet mutで宣言します。

let hi = "hi";
let mut  count = 0i;

while count < 10 {
  println!("count is {}", count);
  count += 1;
}

まだ書き方に謎が多いですが、構わず進みます。

変数名や関数名はスネークケース

ブロックの考え方 〜変数への代入がスマート〜

let price;
if item == "salad" {
  price = 3.50;
} else if item == "muffin" {
  price = 2.25;
} else {
  price = 2.00;
}

と書くところを、

let price = 
  if item == "salad" {
    3.50
  } else if item == "muffin" {
    2.25
  } else {
    2.00
  };

という表記が可能。 ブロックの中にセミコロンを書かないことで、連続した式になる模様。

In short, everything that's not a declaration (declarations are let for variables; fn for functions; and any top-level named items such as traits, enum types, and static items) is an expression, including function bodies.

これ結構重要です。 つまり、明示的に宣言しなかったものは、すべて式であり、その式は何かしらの値を返すということのようです。

fn is_four(x: int) -> bool {
  // 明示的なreturnは要らない
  x == 4
}

今日はこんなところで。 細々と続けていたらと思います。