Arrays.asList と List#removeIf の組み合わせ

Java 8 で Arrays.asList と List#removeIf で少しハマったのでメモを残しておきます。

現象

  • Java8 で以下のようなコードを書くと java.lang.UnsupportedOperationException が投げられます。
  String[] languages = {"Java", "Ruby", "JavaScript", "Haskell", "Perl", "C", "C++", "Perl", "Go"};
  List<String> list = Arrays.asList(languages);
  list.removeIf(lang -> lang.length() <= 5);

調査

結果

  • ということで以下のように書くことにしました
  String[] languages = {"Java", "Ruby", "JavaScript", "Haskell", "Perl", "C", "C++", "Perl", "Go"};
  List<String> list = new ArrayList<>( Arrays.asList(languages) );
  list.removeIf(lang -> lang.length() <= 5);

*1:正確には抽象クラス AbstractList を実装したもので、これの remove が UnsupportedOperationException を投げています

CentOS7 での LANG の設定

背景

CentOS7 をインストールして色々と弄っていると言語が日本語になっていることに気が付き、LANG を en_US.UTF-8に修正したく思いました。しかし、CentOS6 にはあった /etc/sysconfig/i18n のファイルが無く戸惑いました。

方法

CentOS7のlocaleの設定を忘れないようにメモしておきます

  • 設定
 $ localectl set-locale LANG=en_US.utf8
  • 確認
  $ localectl status
  System Locale: LANG=en_US.utf8
      VC Keymap: jp106
     X11 Layout: jp
  • 設定ファイルは /etc/locale.conf で上記の設定コマンドを実行するとこのファイルの中身が書き換わるようです

VirtualBox 上の仮想マシンに CentOS 7 をインストール

CentOS 7 が出て半年近くたち「いつまでも 6 系を使っていたらまずい」と思い、家のPCにインストールした際の過程を記しておきます。

今回は初めての 7 インストール作業ということで、あえて Vagrant などのツールは使わずに素のイメージから VirtualBox 上に仮想マシンを手動でインストールしてみたいと思います。

環境

インストール作業

  1. ISO ファイルのダウンロード
  2. 仮想マシンの作成
    • VirtualBox 上で仮想マシンを作成します。「新規」をクリックし、名前をCentOS7、タイプをLinux、バージョンを Ret Hat として続けるを押します。

      f:id:tatsuyafw:20150119234018p:plain

    • メモリーサイズはひとまず 1024MB とします。

      f:id:tatsuyafw:20150119234337p:plain

    • ハードドライブはデフォルトのまま 仮想ハードドライブを作成する にします

      f:id:tatsuyafw:20150119234446p:plain

    • ファイルタイプもデフォルトのまま VDI (VirtualBox Disk Image) としておきます

      f:id:tatsuyafw:20150119234525p:plain

    • ストレージもデフォルトの可変サイズを選択

      f:id:tatsuyafw:20150119234728p:plain

    • ファイルサイズは少し大きくして 30GB としました 。

      f:id:tatsuyafw:20150119234813p:plain

    • こうすると以下のように仮想マシン一覧のところに作成した CentOS7 が追加されます。

      f:id:tatsuyafw:20150119235012p:plain

  3. 仮想マシンの起動
    • 先ほどダウンロードしたISOファイルをドライブにセットして、仮想マシンを起動します
    • 作成した仮想マシン CentOS7 を右クリックして 設定 を選択します

      f:id:tatsuyafw:20150119235214p:plain

    • ストレージのタブに移動し、コントローラ: IDE の下の をクリックすると以下のような画面になります。そして、右側のメニューの CD アイコンをクリックします

      f:id:tatsuyafw:20150119235637p:plain

    • 「仮想CD/DVDディスクファイルの選択」をクリックして先ほどダウンロードした ISO ファイルを指定して、OKを押します。
    • 最後に仮想マシン一覧から仮想マシンを選択して、 起動を押します

      f:id:tatsuyafw:20150119235952p:plain

CentOSのインストール

  • ここからは CentOS 上でインストール作業を進めます。最初に出てくる画面で Install CentOS 7 を選択した状態で Enter キーを押して先に進みます。
  • あとは、画面の説明にそってインストールを進めると完了します。

ネットワークの設定

終わりに

  • 最近は vagrant から新しいインスタンスを立てることが多かったので、久々にイメージからインストールすると色々と面倒に感じました^^;
    • 特にネットワーク周りやユーザの鍵の設定などが、、、
  • CentOS6 から 7 になり色々とコマンドが変わっていとに戸惑いまだまだなれない状態ですが、これからどんどんいじって早く慣れたいと思います
  • 次は MariaDB でも入れて遊んでみたいと思います

参考

vagrant package で "A directory was not specified to package..." となったときの対応

vagrant package を実行した際に以下のようなエラーメッセージが出たときの対応を書いておきます。version は 1.4.2 でした。

$ vagrant package
[default] Clearing any previously set forwarded ports...
A directory was not specified to package. This should never happen
and is a result of an internal inconsistency.
$ vagrant -v
Vagrant 1.4.2

結論から書くと bug(?) だったようで、vagrant 1.4.3 で修正されていました。

vagrant 自体の upgrade はとても簡単で、初期インストール時と同様でパッケージをダウンロードしてインストールするだけでした。

$ vagrant -v
Vagrant 1.4.3

これでvagrant package も成功しました :-)

$ vagrant package
[default] Clearing any previously set forwarded ports...
[default] Exporting VM...
[default] Compressing package to: ...

"インフラエンジニアの教科書"を読んで

"インフラエンジニアの教科書" を読み終えての感想です。

インフラエンジニアの教科書

インフラエンジニアの教科書

一言で言うとインフラエンジニアに求められるスキル全体を俯瞰的に網羅した本で、「インフラエンジニアはこういうものか」と思わせてくれる本でした。

サーバからOS、ネットワーク機器やストレージなどのわりと技術的な話から、ライセンスや機器の購入、データセンターの選定などの業務的(?)な話までひと通り網羅されています。普段私はサーバやOS、ネットワークの設定などのソフトウェアを中心とする業務を行っており、購買などの技術に直接的には関わらない、でもインフラエンジニアとして必要(?)な知識やスキルを持っていないので、そういう話が面白かったです。

最近は chef や docker、vagrant、openstack などのインフラを構築するため技術に自身の関心が集まっていたので、そこから改めて自分の視点を一歩引いてみる良いきっかけになったと思います。

Linux」や「ネットワーク」「ストレージ」などのそれぞれの技術にフォーカスした本はたくさんあると思いますが、それらを"インフラエンジニアの教科書"として俯瞰的に見ていて、かつ余り深くまで技術的な話はしないというところがとても稀有でかつ面白い本でした。内容もとてもわかり易かったので、まさに"インフラエンジニアの教科書"でした。

YAPC::Asia Tokyo 2013 に参加してきました

YAPC::Asia Tokyo 2013 に参加してきたので、気持ちが冷めないうちに感想を書きたいと思います。

Perl

私の Perl 歴は「たまーに Perl で短い便利スクリプトを書く」というレベルでほぼ初心者です。業務はインフラエンジニアでちょいちょい (Perlではなく) Ruby を使ったり、プライベートでもプログラミングをするので プログラミング初心者というわけではないですが、Perl に関しては今までノータッチという状態でした。

参加した感想

Talks では色々なテーマで発表がありましたが、スライドなどは後日、続々と公開されると思いますので内容はそちらに譲るとして、ここでは以下の3つの内容で素直な感想を書きたいと思います。(「気持ち」を書いておくと後で振り返った時に面白いと思いますので。。)

  • 雰囲気
  • 面白かったTalks
  • 参加してよかったと思うこと

雰囲気

会場は慶応大学さんの日吉キャンパスの一部の建物を借りた形で、全体的にそこまで大きくないのかな、という印象でした。 でも、カンファレンスはみなそうだと思いますが、とてもワクワクした雰囲気に会場が包まれていて、参加者の皆さんも同様に楽しんでいるんだな、という感じでした。そんな雰囲気を受けてか、私もとても「次はどんな Talk なんだろう」と、常に高揚感に似た気持ちを持って参加していました。

面白かった Talks

色々な Talk を聞いて、みんな面白かったのですが中でも @yusukebe さんのMojoliciousでつくる!Webアプリ入門と @naoya_ito さんが司会を努められた特別座談会 「Rubyの良いところ語ってください 〜そんなPerlで大丈夫か?〜」 が自分の中では印象的でした。

@yusukebe さんのお話は Perl の WAF (Web Application Framework) である Mojolicious についてのもので、Perl で Web アプリの作り方を初心者にもとても分かりやすい形で発表して頂きました。私は RubyRailsSinatra などを使って、Web アプリを書いたことがあったので、その分すっと入ってきたというのもありますが、それを差し引いてもとても話の流れがよく、「自分でも動かしてみたい!」と思うような内容でした。 Perl で Web アプリを書いてみたい、という方は後日公開されるであろう(?)スライドを見るといいと思います。

Rubyの良いところ語ってください」の方は、(超)著名な方々がパネラーとなり、RubyPerl の比較という観点からディスカッションを行うとても豪華なものでした。壇上のパネラーの方々皆さんが凄腕ハッカーでしたが、そこまで言語自体の具体的な比較などはなく、言語を取り巻くコミュニティの違いやそれぞれの言語の考え方の違いなどを話されていて、Perl 初心者の私にもわかり易い内容でした。Rubyのことしかよくわからない私でもPerlの文化などをわかった気になれた(?)セッションでした。司会をされていた @naoya_ito さんのファシリテートが素晴らしかったというのもあると思います。

参加してよかったと思うこと

1つ目には Perl の現状、文化、スタイル、ライブラリ、開発スタイルなどなど「本当の今」を知れたことが良かったです。Perl Monger の方々に怒られそうですが Perl と聞くと「なんとなく古い言語」のようなイメージがあり、いまは RubyPython の時代という考えが少なからずありました。私の周りでも 「Perl を使ってるぜ!」という人は他のLLと比べて少ないような状況です。しかしながら YAPC に参加してみると、会場で発表されている方々の話や会場の雰囲気には勢いのようなものがあり、少なくとも廃れていっている言語のようには全く感じませんでした。開発する上で利用するライブラリも CPAN モジュールとして充実しているようでしたので、普通に開発で使える言語という感じを受けました。「xxxのSDKPerlの選択肢がない」という話も少なからず聞くので、多少なりとも冷遇(?)されているのは事実のようですが、まだまだ発展していくのかな、という印象です。

2つ目はたくさんの著名な方の話を生で直接聞けたことがとても刺激的で良かったです。rebuild.fmPerl Hacker として有名な @miyagawa さんのお話を聞いたり、@naoya_ito さんや @dankogai さんなどなど、その他たくさんの有名人の方目の前にいらっしゃって、少し興奮してました(^_^;) これだけでも YAPC に参加する価値はあると思いますw (@miyagawaさんや@naoya_itoさんがrebuild.fmで話されている感じよりも早口で、それも印象的でした。発表時間の制約もあると思いますが、エンジニアの方はやっぱり早口なのかなと思ったり)

最期に

結果として YAPC::Asia Tokyo 2013 に参加してとても良かったと思っています。来年も機会があれば是非参加したいと思います。 また、発表者の方々ならびに運営の方々、そして参加者の皆さん、ありがとうございました。特に運営の方々は裏方として支えて頂いて、裏方なりの苦労もたくさんあったと思いますが、皆様のお陰でとても貴重な体験が出来ました。重ねて御礼申し上げます。

GitHub Octokit を使ってみた

GitHub が公開している Octokit を使ってみたので、その際のメモをまとめたいと思います。

Octokitとは

GitHub API を使用する際の client ライブラリのようです。Introducing Octokitにてイントロダクションが公開されています。5/31 時点では RubyObjective-Cバインディングが公開されています。ここではRubyのものを触ってみたいと思います。

準備

まずは octokit の gem をインストールします。ちなみに、私の環境は以下のようなものです。

$ gem install octkit

なお、実際に動かしてみた際に下記のようなエラーが出たので、Mountain Lion+rubyでopensslエラーを参考に証明書のダウンロードを行いました。ありがとうございます!

Faraday::Error::ConnectionFailed: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

絵文字を取得してみる

試しに GitHub で使用出来る絵文字を 10 個取得してみます

#!/usr/bin/env ruby
# octokit.rb

require 'open-uri'
require 'octokit'

emojis = Octokit.emojis.to_a[0...10]

emojis.each do |name, url|
  fname = File.basename(url).sub(/\?.*$/, '')
  File.open(fname, 'wb') do |file|
    open(url) do |content|
      file.write(content.read)
    end
  end
end

下記を実行するとカレントディレクトリにファイルが 10 個ダウンロードされました

$ ./octokit.rb

まとめ

Octokit を使うと GitHub API を簡単に叩けるようになるので、色々なことが簡単にできそうです。ただ「これがやりたい!」という明確なものがなければ、あまり使い道が無いかもしれません(^_^;)