RSS2.0

Scala IDE で遊んでみる

前回はコマンドラインで scala に軽く触ってみたところですが、今回は IDE で Scala を使ってみようと思います。
Scala 用の IDE としては、おなじみ IntelliJ IDEA と Scala IDE があるようです。Scala IDE は Eclipse ベースの Scala 開発用ワークセットで、今回は Scala IDE のほうを使ってみます。
scalaIDE01.png
開発環境は例によって Linux (Fedora release 26) です。

Scala IDE のインストール

公式サイトから Scala IDE をダウンロードします。
現時点での最新バージョンは 4.7.0 Release でした。

ダウンロードしたら展開して、でてきた eclipse ディレクトリを適当な場所に置いておきましょう。
$ tar xvfz scala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz

展開してできた eclipse ディレクトリ内の実行バイナリ eclipse を実行すると Scala IDE が起動します。
Eclipse をベースにしているだけあって、基本的な使い方は Eclipse と同じですね。
同じ環境で Java を Eclipse で開発している場合には、実行バイナリの eclipse 自体を別名にリネームしたり、メニューに登録する際に Scala IDE というような名前をつけておいたり、ワークスペースを Java 用 eclipse のワークスペースとは別の場所にしておいたりするとうまく住み分けができると思います。
続きを読む Scala  コメント (0)  2018/02/08 20:19:52

Scala で遊んでみる

最近私のまわりでも Scala について耳にすることが増えてきましたが、私自身はこれまであまり触ったことがなかったので、少し試してみることにしました。
Scala については、関数型であることや並列処理に特化していることによく触れられています。JVM 上で動作することもあって Java の影響を強く受けていて、型安全性やオブジェクト指向言語であること、Java との親和性なども特徴としています。

最初の 1 歩ということで、Scala 言語そのものについて調べてみるというよりは、実際に動かすところまでを目標に置いてみました。

Scala を実行する

まずは言語標準の scala コマンドから Scala コードを動かしてみます。手順は以下の通りです。

Scala のインストール

前提として Java 8 以上が必要になるので、別途インストールしておきます。
その後は yum コマンドから Scala をインストールしましょう。
# yum install scala

インストール後に scala コマンドが実行できれば OK です。
$ scala -version
Scala code runner version 2.10.6 -- Copyright 2002-2013, LAMP/EPFL

scala コマンドで実行する

以下の内容のソースコード factrization.scala を作成します。
import scala.collection.mutable.ArrayBuffer

object Factorization {

  def main(args: Array[String]): Unit = {
    val random = scala.util.Random
    val numbers =
      if (args.isEmpty) {
        // 引数で素因数分解する数値が指定されていなければ、10 個の乱数を生成する
        (1 to 10).map(i => random.nextInt(Int.MaxValue))
      } else {
        // 引数の数値を素因数分解する
        // Array 型を Vector 型に変換する
        args.map(i => i.toInt).to[collection.immutable.Seq]
      }

    println("numbers: " + numbers.mkString(", "))
    // 並列化せずに素因数分解し、その処理時間を計測する
    logProcessingTime("Serial  ", numbers.map(i => factorize(i)))
    // 並列化して素因数分解し、その処理時間を計測する
    logProcessingTime("Parallel", numbers.par.map(i => factorize(i)))
  }

  // 引数の数値を素因数分解し、素数のリストを返す
  private def factorize(number : Int) : List[Int] = {
    val list = new ArrayBuffer[Int]
    var n = number
    var f = 2

    while (n != 1) {
      if (n % f == 0) {
        list += f
        n /= f
      } else {
        f += 1
      }
    }

    println("Thread:%3d factorize %10d to %s".format(Thread.currentThread.getId, number, list.mkString(", ")))
    list.toList
  }

  // 第二引数の式を処理し、その処理時間を出力する
  private def logProcessingTime(label: String, process: => Unit) = {
     val start = System.currentTimeMillis

     process
     println(label + ": " + (System.currentTimeMillis - start) + "ms")
  }

}

続きを読む Scala  コメント (0)  2018/01/23 20:15:05

Linux 版 Sublime Text 3 で日本語入力変換キーを変更する

Linux (Fedora 26) で Sublime Text 3 を使っていてると、日本語入力の切り替えキーがきになります。
日本語入力への切り替えキーは、デフォルトでは Ctrl + \ というなんとも珍しいキーバインドにマッピングされています。
右の Ctrl キーを使えば片手でも打てないことはないんですが、BackSpace が近いのと、完全にホームポジションから手が離れるのが気になります。
他にいいキーバインドはないものかといろいろ試してみたのですが、結局 Ctrl + Space に落ち着いたので、その設定方法を書いておこうと思います。
Ctrl + Space というと Fedora Core 時代のようで少し懐かしいですね。

Sublime Text 3 のキーマップを変更する

メニューバーの Preferences > Key Bindings を選択します。

キーバインドを設定するための Default (Linux).sublime-keymap - Default と Default (Linux).sublime-keymap - User というタブが開くので、ユーザーの設定を書く Default (Linux).sublime-keymap - User の方に以下の内容を記載し、保存します。
[
  { "keys": ["ctrl+space"], "command": "toggle_mozc" }
]
これで OK です。
続きを読む Linux  コメント (0)  2018/01/21 12:00:03

chocolablog を ver 0.9 にアップデートしました

と言いつつ、今回のバージョンアップはリリース後にごたごたがあり、正確には hotfix 適応済みの ver 0.9.1 になります。そんな細かいことはいいですよね。

もうそんなに機能拡張するようなネタもなく、安定運用フェーズに突入している chocolablog ですが、今回は SSL 対応という WEB でも比較的ホットな話題についてリリースすることにしました。ブログ記事を読んでくださるユーザーさんのみならず、ブログ記事を書くシステム管理画面まわりでは個人的にも必要だと思っていた機能です。

この開発の背景には、さくらインターネットがすばらしいサービスを開始してくださったことがあります。ありがとうございます。マジ感謝です。

ssl.png

続きを読む chocolablog 開発  コメント (0)  2017/11/27 19:51:00

Hive を構築して Hadoop とつなげてみた

引き続き Hadoop でいろいろ試してみるシリーズです。
前回は Hadoop 本体を構築し、HDFS に配置したファイルを使って簡単なデータ分析をしてみました。取り扱ったデータが小さい上に、実際には単体構成な Pseudo-Distributed Mode だったのでアレですが、Hadoop の概要のようなものが少しずつ見えてきました。

Hadoop ではやはり HDFS という独自のファイルシステムを扱うことが特徴的で、実際に HDFS 上にファイルを配置し、処理を行うというのは、自動化を考えるとなかなか大変そうでした。この HDFS を使ったデータ処理をより手軽に行うための周辺技術として、古くから Hive というコンポーネントが使われてきました。Hive を利用することで、HDFS へのファイル配置や参照・集計といった処理を、HiveQL という SQL ライクなクエリ言語として実行することができます。

今回は Hive の環境構築を行い、前回 HDFS に対して直接行ったデータ集計と同じことを、Hive を通して試してみようと思います。

なお、Hive はソフトウェア要件として Java7 以上、Hadoop 2.x を必要としています。
ここでは、前回構築した Hadoop 環境に追加していく形で構築していきます。
続きを読む Hadoop  コメント (0)  2017/04/05 12:19:00

Hadoop を Pseudo-Distributed Mode で試してみた

大量データの分析で威力を発揮するものの、癖が強すぎて適応分野の選定が難しいと一部で話題になっているらしい Hadoop ですが、これまでなかなか触る機会がなかったため、少し触ってみることにしました。実際にうまく使いこなせている人達は企業でさえも 10 〜 20 社あるかないかとか言われてるらしいですが、個人的に何も知見がないため、何を言われていても「へ〜そうなんだ〜」と返すしかありません。エンジニアとしてそんな状況もどうなんだと思ったので、ちょっと遊んでみることにしました。

ちなみに、Hadoop には大きく分けて Standalone Mode、Pseudo-Distributed Mode、Fully-Distributed Mode の 3 つの構築方法があるそうで、公式ドキュメントちょっと遊んでみるなら単一ノード構成がいいよと書かれていたので Pseudo-Distributed Mode で遊んでみることにしました。ざっとドキュメントを読んだ感じ、Standalone Mode は分析用のロジックを動かしてみるだけで、Hadoop の特徴らしい HDFS なんかにまったく触らず終わりそうだったので、やめておきます。分析ロジックが jar なので、自分で書いた jar を試しに動かしてみるには Standalone Mode が良さそうです。

なお、今回はらしいらしいという記述が多くなっていますが、分散処理は奥が深そうで、現時点では断言できることが少ないためです。ブログにはなるべくしっかりとした情報を書きたいのですが、これに関しては仕方ないかなと思います。ご了承ください。
続きを読む WEB 技術Hadoop  コメント (0)  2017/03/29 18:42:18

chocolablog ver 0.8 にアップデートしました

Python 製自作ブログの chocolablog を ver 0.8 にアップデートしました。

前回のバージョンアップは 2014 年 11 月 3 日でした。2 年と 3 ヶ月ぶりくらいですね。
その間特にリリースを迫られるような理由もなかったのですが、最近になって大きめの追加機能を実装することになりました。

……こうやって趣味で書いてるコードを日の当たる場所に出すというのも随分ひさしぶりな感じがしますね。
以前よりも家でコードを書くことが減っているのこともありますが、まああまり後先考えずに書きたいコードを書いていこうかなと思っています。
chocoblog08.png

そして恒例の謎スクショ。
この手の記事は毎回何の画像を貼ろうかすごく悩みます。

続きを読む chocolablog 開発  コメント (0)  2017/02/13 19:59:53

sqlite3 で SELECT 結果の行番号を取得する

SQL を使っていると、SELECT した結果セットの各行について、結果セット中での行番号を知りたい、という場面にたまに遭遇します。こういうやつです。
SELECT * FROM books ORDER BY price;
id          title           price     
----------  --------------  ----------
3           Art with Basis  600    #行番号: 1
4           Book List       990    #行番号: 2
1           Civilizations   1000   #行番号: 3
2           Dream Post      1200   #行番号: 4
5           El sant magina  1500   #行番号: 5
一般的な一覧系の処理では先頭から N 件とりだすことが多いので、OFFSET で取り出した件数を指定すれば行番号を意識せずに続きをとることができます。

ただ、ID からその行の結果セット中での位置を知ろうとすると、やはり行番号が欲しくなってくるのです。結果セットがソートされていたり、ソートされているカラムがユニークでなかったりするとかなり面倒なことになります。特定の ID の行の前後 3 行ずつを取りたい、というような時に困ってしまうわけです。

結果セット中での行番号を取得するために、Oracle では ROWNUM 擬似列や ROW_NUMBER() 関数が用意されているそうです。
また、MySQL ではユーザ定義変数を使うことで、SELECT 時に行番号を計算し、出力することができます。
SET @rownum := 0; SELECT *, (@rownum := @rownum + 1) FROM books;

しかし sqlite3 では ROW_NUMBER() 的な機能もユーザー定義変数的な機能も実装されていないので、これらの方針をとることはできません。ネットを見てみると以下のようなクエリで計算している例がありますが、境界値として WHERE 句で使っているカラム(ここでは id カラム)がユニークでない場合、境界値として機能しないため、厳密な行番号はとれません。
SELECT id, title, price, (SELECT COUNT(*) FROM books b2 WHERE b1.id >= b2.id) AS rownum FROM books b1 ORDER BY rownum;
id          title           price       rownum    
----------  --------------  ----------  ----------
3           Art with Basis  600         1         
4           Book List       990         2         
1           Civilizations   1000        3         
2           Dream Post      1200        4         
5           El sant magina  1500        5         
※ ORDER BY rownum は見やすさ重視のためにつけたもので、必須ではありません。

もう 1 点、この方法では 1 行毎にサブクエリで行番号をカウントするため、参照性能に問題があります。MySQL では悪名高き DEPENDENT SUBQUERY にあたるためです。
続きを読む WEB 技術  コメント (0)  2017/02/01 19:45:13

Ionic 2 を試してみた

あけましておめでとうございます。
年の瀬に Maven Resources Plugin の記事 を書き、お正月だからとだらだらしていたら 3 年経ってしまいました。

それはともかく、少し時間ができたのでスマホアプリの技術でも触ってみようかと思い、Ionic 2で遊んでみました。今回は Ionic 2 のインストールから空のプロジェクトを作ってブラウザから動作確認をし、独自の新ページを追加するところまでです。

スマホアプリというと Android や iPhone の実機をつないで都度ビルドしながらデバッグする、というイメージが強いですが、Ionic 2 などの最近のフレームワークは WEB ベースの技術が組み合わさっているため、実機がなくてもブラウザから動かすことができます。簡単なページは JavaScript や CSS を使って WEB アプリ的に実装し、それで実現できない部分は端末固有の実装として Java や Swift で書いたプラグインに任せよう、という設計思想だそうです。確かに、ゲーム系でないスマホアプリは、突き詰めてしまえばボタンを押しながら画面遷移していくだけの事が多いので、WEB アプリに似せた開発ができるというのは効率的なのだと思います。

Ionic 2 は Cordova というマルチプラットフォーム向けのフレームワークに覆いかぶさる形で作られています。なので Cordova 同様、Ionic 2 で書いたアプリも Android や iOS 用にビルドすることができます。また Ionic 2 の特徴として、AngularJS と切っても切れないほと密接に連携していて、その特徴を色濃く受け継いでいます。データとデータを取り扱うロジック部分をビューから切り離し、そのデータをビューに対して自動的に埋め込ませることができます。このあたりの考え方は、WEB アプリを作ったことのある人には、馴染みの深い MVC モデルの応用のように聞こえますが、MVC モデル自体がデスクトップアプリケーションに端を発しているものなので実際は逆輸入なのかもしれません。

さて、今回の目標としては、似非商品検索アプリを作ってみようと思います。トップ画面から検索画面に遷移し、そこで入力したキーワードから、キーワードを商品名に含む商品の一覧を表示する、という感じの動きです。ただし、今回は実際に DB や WEB サービスから検索するわけではなく、キーワードを商品名っぽく加工して表示するだけとします。
こんな感じの仕上がりを目指していこうと思います。
続きを読む WEB 技術Ionic 2  コメント (0)  2017/01/24 19:19:22
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2018, 7>>
1234567
891011121314
15161718192021
22232425262728
2930311234