RSS2.0

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

Essential Ph-1 を 買ってみた

後に Google に買収されることになる Android 社を設立し、Android の父とも呼ばれる Andy Rubin 氏が、2015 年 11 月に設立したのが Essential Products 社です。この Essential 社より発売されたのが Essential Phone (Ph-1) です。

Essential Ph-1 はチタンボディにゴリラガラスの重量感ある仕上がりになっています。カチっとしたフォルムが好きなので、Essential Ph-1 のシルエットはかなりお気に入りです。スペック表によると、ディスプレイは解像度: 2560 x 1312 ピクセルの 5.71 インチディスプレイ、CPU は 2.45GHz Quad + 1.9GHz Quad (64 bit)、メモリ 4GB とのこと。

Google の Nexus シリーズが終了し、日本向けには Pixel 2 が発売されそうもない現状では、使い込めるスマートフォンとしてかなり期待できます。なにせ機種変更したいスマートフォンが見つからずに Xperia Z (SO-02E)をずっと使い続けてましたからね。5, 6 年ぶりの新スマートフォンです。

Amazon 先生が送ってくれました

こちらが到着したパッケージ。もちろん SIM フリー版です。
ph1_01.jpg
実は Essential Ph-1 はまだ日本向けには正式に販売されていないのですが、Amazon.com で買うと普通に日本にも発送してくれます。海外通販なのできちんと到着するかが若干不安ではありましたが、そこはさすが Amazon 先生、無事に受け取ることができました。

私が買った時は、価格は送料込みでだいたい 550 ドルくらいでした。価格上昇が続いて久しい Android にしては、スペックのわりにかなり安く感じられます。少し前に 100 ドルくらい値下げがあったみたいですね。

続きを読む お買い物  コメント (0) 2018/01/20 16:24:00

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

Maven Resources Plugin の Filtering 機能を使ってみる

Maven Resources Plugin は必要なタイミングで、リソースファイルを特定のディレクトリにコピーする機能です。
Maven プロジェクトではコンパイルされたクラスは target/classes に配置され、実行時には target/classes に classpath を通せばよいように設計されています。(jar や war にパッケージされるのも targaet/classes 配下のファイルになります。)つまりコンパイルが走るタイミングで src/main/resources ディレクトリ下のリソースも classpath の通る target/classes に配置してやる必要があり、その役割を担うのが Maven Resources Plugin なのです。

Maven Resources Plugin には Filtering と呼ばれる機能があります。これにより、リソースファイルをコピーする際に、リソースファイル内の文字列を動的に書き換えた上でコピーすることができます。
続きを読む Maven  コメント (0) 2014/12/31 11:37:58
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2024, 12>>
1234567
891011121314
15161718192021
22232425262728
2930311234