なんじゃくにっき

プログラミングの話題中心。

Paizaでちょくちょく遊んでいた

関数プログラミング 珠玉のアルゴリズムデザイン』 を読み進めようとしたら難しすぎて詰まったので息抜きに簡単なアルゴリズムやろうと思って、 コード転職サービス(?)のPaizaで遊んでいた。

ITプログラマー・エンジニア転職のpaiza

まあ気まぐれでTopCoderとかCodeIQとかでも遊んでいたけど、無駄に色々プラットフォームを試してみたいと思うわけです。

この手のサービスの歴史

・競技プログラミングという話で言うと1970年代からあるみたい。 ・オンラインのものだとTopCoderは2001年から。 ・純粋な競技プログラミングではなく、就職/転職活動サービスと融合したのはアメリカで2011年?

・日本だとCodeIQが2012年(1年でアイデアがアメリカから輸入されている時代・・)

調査適当なんで間違いあったらすんません。

CodeIQとPaizaの違い

先行サービスのCodeIQとの違いを挙げてみよう。

・CodeIQは自分で求人に応募できない(オファーが来るのみ)

・Paizaは問題解いてランク上げるとランクに応じた企業に応募できる(オファーは来ることもある)

・CodeIQは出題者が明確だがPaizaは明記されていない

・CodeIQの出題レベルはピン切り。Paizaはランクによりある程度安定感あり。

Paizaの感想とか

・一度上がったランクは下がらないので、Sランク1つ解くとどこにでも応募できるようになる。 転職目的ならこれだけでOK。あとは面接頑張れ。

Rubyメインで解いた。あとPython

Javaはだるい。

テンプレートがこんなの・・

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        // 自分の得意な言語で
        // Let's チャレンジ!!
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();
        System.out.println("XXXXXX");
    }
}

ScalaとかGoとかHaskellとか新しめな言語はまだベータ(お試し問題で使えるけど本番には使えない。残念。)

・確か1番下のランクでも想定年収が450万くらいだったのに、最高のSランクまで上げてみても650万・・ 下と上で1.5倍くらいしか変わらないという日本の実情をリアルに叩きつけてくれます(笑)

・滅茶苦茶難しいアルゴリズムしらなくてもSランク解けます。 『関数プログラミング 珠玉のアルゴリズムデザイン』わからなくても解けます! (これ言いたかっただけ)

Rubyのしくみ

会社で借りて読んだ。 普段Ruby使ってるから知っておこうと思って。

主にコンパイラとかVMあたりの話。 低レイヤー領域なので、普段のコード書くのにはすぐに役立つことは少なそうだけど、 あまり聞いたことのない話が多くて面白い。

1-3章は字句解析とかそのへんだけど、 ちょっとこの本だけでは分かりにくいかも。 詳しく知りたいならあらかじめ他の本で勉強したほうがいいかも。

O'Reilly Japan - 言語実装パターン とか。

amazonのリンク貼ってるけどクリックして購入しても僕の懐には1円も入りませんよ・・

Rust 変数

letを用いた代入

let x: int = 5;
println!("x: {}", x);  // 5

letで変数に即値を代入してみる。 変数の後ろに型を指定して代入するパターン。

let x = 5i;
println!("x: {}", x); // 5

値を5iみたいにすると変数側は型を省略してもintと解釈される。

let x = 5i;
x = 10i;  // compile error

letで宣言した変数には再代入できない。 letでの宣言した変数はimmutable。

let x = 5i;
println!("x: {}", x);  // 5
let x = 10i;  
println!("x: {}", x);  // 10

でも再度宣言するとコンパイル通ってしまった(これってどうなんだろ)。

let mutを用いた代入

let mut x = 5i;
x = 10i;

let mutで宣言された値はmutable(変更可能)になる。

Rust 構文

Rust 構文

0.12時点のもの

関数

・関数はfnで定義する。 ・関数名の後ろの『{』から『}』までが関数の本体。 ・C言語などと同じく実行時はmain関数から実行される。

fn main() {
  println!("hello?");
}

・関数名の後ろの()はArity(引数の個数)が0でも省略できない。

// これはエラー
fn main {
  println!("hello?");
}

・各行はセミコロン『;』で終わるが関数の最後の行はセミコロンを省略できる。

// 最後のセミコロンは省略できる
fn main() {
  println!("hello?")  
}

コメント

// 単行コメント

/*
 複数行コメント
*/
fn main() {
  println!("hello?") ;
}

文字コード

fn main() {
  println!("☃")
}

UTF-8使える

・単行コメントは//

複数行コメントは 『/』から『/』の間。

Akka meetup

akka meetup - connpass

Akka meetupに行ってきました。 歌舞伎座タワーのドワンゴさんにお邪魔しました。 内容は偉い人が詳しく解説付きで書いてくれそうなのでサボります・・

コミッタのKonrad Malawskiさんのスライドは日英併用で、 ゆっくり喋ってくれたので英語聞き取れたし分かりやすかった。

Rust Samurai 4

先日Rust始めたばかりですが、 Rustについての勉強会のRust Samurai 4に行ってきました。 (半年に1度くらい開催?)

Rust Samurai 4 : ATND

Mozilla Japanさんにお邪魔するとのことなのでFirefox Tシャツ着て行きました。

セッション

自己紹介

全員が軽く。 C/C++erが多かった。

Road to Rust 1.0を追う

@Dubheadさんのセッション。

http://blog.rust-lang.org/2014/09/15/Rust-1.0.html について。

年内に1.0が出るっていう話。

後方互換性が保たれるようになる ・GCとかのライブラリが標準から外れる

OwnershipとMove semanticsについて(リベンジ)

@saneyuki_sさんのセッション。

メモリと変数は1:1で対応していてメモリの所有者の変数は1人。 他の変数の値を読み書きするにはBorrowしないといけない。 とかそのへんのメモリの安全性の仕組みの話。

クロージャとライフタイムについて

@chikoskiさんのセッション

クロージャー駆使したプログラム書こうとするとライフタイムの仕組みに苦しめられる。 関数合成とかカリー化とか部分適用とかないから関数型言語っていうより C++に関数型のエッセンスがふりかけられた言語(?) 1.0出るまでにクロージャの実装が変わるとのことなのでそれに期待。

Rustを実プロダクトに投入し****話

@rail44さんのセッション。

Fluentdで使うようにMessagePackのシリアライザ実装したとか。 本番環境で動かそうとするとライブラリのバージョンが古くて動かなかった。

じゃんけん大会

なぜかRustの勉強会なのに放出されるgolangグッズ達 !? gopher Tシャツいただきました。 ありがとうございます!

Rustはじめました

Rustと言うプログラミング言語をはじめました。

The Rust Programming Language

Rust (プログラミング言語) - Wikipedia

Mozzilaが開発している言語で、文法はC++ライク、 レイヤーとしてもC++くらいの感じ。

比較的低レイヤーな言語でありながら、 関数型言語からの機能を色々導入していたり、 並列実行に関する機能に関してはErlangを思い起こしたりする、 ってのが勝手な第一印象。

新しい言語で、言語仕様が結構変わったりするので、 実用目的に使うにはまだまだ怖いかな。

特徴

メモリセーフ
関数型言語っぽい機能

・型クラス

・パターンマッチ

・代数的データ構造

型推論

インストール

バージョンとか考えずにインストールするだけなら

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

で一発。 rustc -v

で、この記事書いている時点ではバージョン0.12.0-nightlyがインストールされた。

Ubuntuにemacsインストール

1. インストール

sudo apt-get update
sudo apt-cache search emacs
sudo apt-get install emacs24-lucid

この記事を書いている時点で24.3が入りました。

2.起動

2.1

XならLauncherからemacsと入力して検索。

2.2

CUIなら

emacs -nw

Ubuntuにバックアップ用HDDを増設

Ubuntu 14.04 でデータバックアップ用HDDを増設してバックアップまで行った記録です。

1. HDDドライブを物理的に接続する

当たり前ですね。 これがなければ始まりません。

2. gpartedインストール

パーティション管理ソフトのgpartedをインストールします。

sudo apt-get install gparted

3. gpartedでパーティション設定

メニューの デバイス -> 新規パーティションの作成 を選択。

画面下部のリストの未割り当てを選択して全領域を

・基本パーティション

ファイルシステム: ext4

に。

4. マウント設定

4.1 マウントポイント作成

マウントしたい場所にディレクトリ作成します。

sudo mkdir /mnt/backup
4.2.1 GUIで設定する場合

Launcerの『コンピューターとオンラインリソースを検索』を起動。 Diskと入力すると検索される『ディスク』を起動。 表示されるデバイスから設定したいHDDを選択。 歯車2つのアイコンで設定。

自動マウントオプションはオフにします。 デフォルトではマウントオプションは /mnt/%長ったらしいUUID% になっているので自分で変えます(/mnt/backupみたいに)。 識別名はUUID=... となっているのを選択します。

OKを押すと/etc/fstabに反映されます。

4.2.2 CUIで設定する場合

sudo gedit /etc/fstab で編集。

UUID=xxxxxxxxxxx /mnt/backup auto nosuid,nodev,nofail 0 0 みたいなのを追記して保存。

4.3 マウント
sudo mount -a

でマウントされるのを確認。

rsyncでバックアップ

バックアップの方法は色々ありますが今回はrsyncにしました。

参考: UNIXの部屋 コマンド検索:rsync (*BSD/Linux)

/home以下をrsyncバックアップするなら

sudo rsync -av --delete /home/ /mnt/backup

手動で2回実行して2度目はすぐ終わることを確認します。

定期的に実行するならこのあとcronなどお好みで。

MacにEmacsをインストール

1. SourceFourgeからdmgインストールして入れる

MacEmacs JP プロジェクト日本語トップページ - SourceForge.JP

リンク先から Emacs-24.3-with-inline-patch-R1 MacOSX みたいな名前のを選んでダウンロードしてインストール