Spica*

プログラミングの話。

mecabをnodeで使う (Mac OS X)

# MeCabインストール
$ brew search mecab
homebrew/php/php53-mecab      homebrew/php/php56-mecab      mecab-jumandic                mecab-unidic
homebrew/php/php54-mecab      mecab                         mecab-ko
homebrew/php/php55-mecab      mecab-ipadic                  mecab-ko-dic

$ brew install mecab mecab-ipadic

# モジュール作って、インストール
$ mkdir my-mecab-test
$ cd my-mecab-test
$ npm init
$ npm install mecab-async --save

# テストファイル作る
$ vim test.js

今回使用したモジュールは、 node-mecab-async です。このドキュメントに沿って、下記のように "test.js" を記述しました。

var MeCab = new require('mecab-async')
  , mecab = new MeCab();

mecab.parse('すもももももももものうち', function(err, result) {
  if (err) throw err;
  console.log(result);
});

そして実行。

$ node test.js
[ [ 'すもも', '名詞', '一般', '*', '*', '*', '*', 'すもも', 'スモモ', 'スモモ' ],
  [ 'も', '助詞', '係助詞', '*', '*', '*', '*', 'も', 'モ', 'モ' ],
  [ 'もも', '名詞', '一般', '*', '*', '*', '*', 'もも', 'モモ', 'モモ' ],
  [ 'も', '助詞', '係助詞', '*', '*', '*', '*', 'も', 'モ', 'モ' ],
  [ 'もも', '名詞', '一般', '*', '*', '*', '*', 'もも', 'モモ', 'モモ' ],
  [ 'の', '助詞', '連体化', '*', '*', '*', '*', 'の', 'ノ', 'ノ' ],
  [ 'うち', '名詞', '非自立', '副詞可能', '*', '*', '*', 'うち', 'ウチ', 'ウチ' ] ]

mecabほんとすごい…

phpMyAdminを最速で動かす(PHP5.4以降限定)

# ダウンロード(お好きなバージョン)
curl -O -L https://files.phpmyadmin.net/phpMyAdmin/4.4.14.1/phpMyAdmin-4.4.14.1-all-languages.zip

# 解凍
unzip phpMyAdmin-4.4.14.1-all-languages.zip
cd phpMyAdmin-4.4.14.1-all-languages

# phpMyAdmin起動
php -S localhost:8888

# http://localhost:8888/ にアクセス

いちいちApacheの設定するのとか権限周りめんどいなぁとか思ってたけどPHP: ビルトインウェブサーバー - Manual忘れてたわ…音速で起動した。

27歳になりました

ついに、なんとなーく27歳になってしまいました。 思うところいろいろあるのでつらつらーっと書こうかなと思います。。

スキルのこと

会社ではいろんなことを経験させてもらいまして、おかげさまで現時点でJavaScript/Java/Objective-C/PHP/ShellScriptがそれなりに扱えるようになりました。JavaScript/ShellScriptは独学だけど、会社の時間もちょいちょい使わせてもらってます。(勝手に)

最近はすごいWeb周りの技術が進んで、知らない間に選択肢も増え、フロントエンジニアとしてはまだまだ勉強しないといけないことが多いなあと感じています。例えば、Electronを使えば既知のWebの技術でWindows/Linux/Macアプリも作れることでしょう。

しかし、他の面もかなり発達していて、Raspberry Piなどの功績によりIoTの敷居が下がったり、JVM言語の発達(Java8の登場やScalaの普及、さらにはKotlinのじわじわと広がってる感など)を見ていると、バックエンドもどんどん変わり続けている印象を受けます。 同じように、組み込みなど、もっと下層の技術・環境も発達していることでしょう。。

僕はまだ漠然としか見れていないですが、それらをそれぞれ繋げば、もっと楽しいことが待っているんじゃないかと思っています。浅く広く、ただ最低限「僕の書いたコードは将来誰かが見るコード」という意識を持って勉強出来たらなぁと思ってます。

クリエイティブなこと

今までにも思っていたんだけれど、多分僕は絵や作曲、演奏などの「クリエイティブ」な部分は向いてないように感じてますw

これは実際にある程度やってから感じてます。多分今までのように、やれば上達するとは思うのだけれど、思い通りにならない部分を恥ずかしさと感じているのが大きいです。ある意味今まで上達したのはそういうのの上塗りをしていたのかなと感じることもあったり。やっぱりそっちよりもプログラミングのように、あるべき形まで「設計」をする方が、肌に合ってるのかなと感じてます。

ただ、もちろん何でもそうだと思うんですけど、傾向としてプログラミングは設計なのであるだけで、重なるところもあって、例えば、プロダクトデザインやWebデザインなんかは「設計」と「クリエイティブ」の中間になるのかなと感じてます。こないだ話題になった、五輪デザインの話なんか、すごい設計寄りの解説でしたねー。

なので、外堀を埋める形で、これからもクリエイティブなことは挑戦できたらなぁと思ってます。

結婚

結婚してもう早二年が経とうとしてます。いろいろありましたが、今は落ち着いていて、ゆったりとした生活を送っています。(忙しくなるので今日までだけど…)

変わったことはいろいろあるんですが…逆に言うと特別これってことが無い…。色んな所に出かけて、色んなことをしました。その場で楽しむことに集中しすぎて、SNSに投稿するのちょっとめんどくさいみたいになるので、あまり写真とかも無いw

Twitterでは氏にまくってますがエンジョイしてるだけだからね!!勘違いしないでよね!!!!

さて、ご飯食べてきます。

libGDXで3Dのモデル表示してみた

f:id:esperia:20150906175305p:plain

MagicaVoxelについての記事 を見てちょっと楽しそうだったので同じ所までやってみました。 libGDXプロジェクトを作成し、MagicaVoxel の標準で用意されているモデルをを、画面上に表示するところまでしてみました。環境はMac

プロジェクト作成

下記設定で作りました。普通ですね。

f:id:esperia:20150906175630p:plain

チュートリアルに沿ってコードを記述

Loading models using libGDX | blog.xoppa.comの通りにコードを書きます。

このドキュメント自体は、libgdx Wiki -> 3D Graphics -> Quick Start -> Basic 3D using libGDX | blog.xoppa.com -> Next: から飛べます。公式…というより公認?のページみたいです。

書くときは、importするクラスには注意して下さい。別パッケージに同じクラス名があるので、間違えるとビルドできません。

package com.esperia09.samples.libgdx.magicavoxel;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.g3d.Environment;
import com.badlogic.gdx.graphics.g3d.Model;
import com.badlogic.gdx.graphics.g3d.ModelBatch;
import com.badlogic.gdx.graphics.g3d.ModelInstance;
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
import com.badlogic.gdx.utils.Array;

public class MyGdxGame extends ApplicationAdapter {
    private static final String PATH_MODEL = "chr_knight.g3db";
    public PerspectiveCamera cam;
    public CameraInputController camController;
    public ModelBatch modelBatch;
    public AssetManager assets;
    public Array<ModelInstance> instances = new Array<ModelInstance>();
    public Environment environment;
    public boolean loading;

    @Override
    public void create() {
        modelBatch = new ModelBatch();
        environment = new Environment();
        environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
        environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));

        cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        cam.position.set(7f, 7f, 7f);
        cam.lookAt(0, 0, 0);
        cam.near = 1f;
        cam.far = 300f;
        cam.update();

        camController = new CameraInputController(cam);
        Gdx.input.setInputProcessor(camController);

        assets = new AssetManager();
        assets.load(PATH_MODEL, Model.class);

        loading = true;
    }

    private void doneLoading() {
        Gdx.app.log(getClass().getSimpleName(), "doneLoading");
        Model ship = assets.get(PATH_MODEL, Model.class);
        ModelInstance shipInstance = new ModelInstance(ship);
        shipInstance.transform.setToScaling(0.5f, 0.5f, 0.5f);
        instances.add(shipInstance);
        loading = false;
    }

    @Override
    public void render() {
        if (loading && assets.update()) {
            doneLoading();
        }
        camController.update();

        Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

        modelBatch.begin(cam);
        modelBatch.render(instances, environment);
        modelBatch.end();
    }

    @Override
    public void dispose() {
        modelBatch.dispose();
        instances.clear();
        assets.dispose();
    }
}

これだけで表示完了…かつ、

  • ドラッグで移動
  • ホイールで拡大率変更

できます。すごい…

Androidの場合は、二本指での拡大と、スワイプでの回転ができました。

f:id:esperia:20150907201031p:plain

chr_knight.g3dbファイルは、MagicaVoxelについての記事で説明されているように、MagicaVoxelからexportし、libgdx/fbx-convを使って*.obj -> *.g3dbへ変換するとOKです。ちょっとつまずいたこともありましたが、その内容に関しては先程の記事にコメントつけました。

感想

数字全然僕ダメで、行列すら習ってない系だったのでかなり躊躇してたんですが、 最初の敷居すごい低かったのが嬉しかったです。 いや、これで何か考えてるわけではないんですが…何かするきっかけはできたかなという感じです。

express-generatorをforkして、ECT使えるようにした

ECTっていうのは、テンプレートエンジンの一つです。

ECT - Fastest JavaScript template engine with CoffeeScript syntax

このECT、テンプレートの継承が便利で、かつjadeのような特殊文法さが少ないので学習コストが低いのが特徴です。文法はejsに似てますが、若干違います。 実行速度も速いらしく、しばらくexpressと連携して使ってみたいなと思いまして、簡単に使えるようにしてみました。

インストール

npm uninstall -g express-generator
npm install -g esperia/generator

後者のコマンドを入力すると、僕がforkしたリポジトリ(esperia/generator)の方からダウンロード・インストールを行なってくれるようになってます。 一応ejsの方を参考にテストを書きまして、passしました。

使い方

express --ectで、現在のカレントディレクトリにプロジェクトを作製できます。

$ express --ect

   create : .
   create : ./package.json
   create : ./app.js
   create : ./public
   create : ./public/javascripts
   create : ./public/images
   create : ./public/stylesheets
   create : ./public/stylesheets/style.css
   create : ./routes
   create : ./routes/index.js
   create : ./routes/users.js
   create : ./views
   create : ./views/index.ect
   create : ./views/layout.ect
   create : ./views/error.ect
   create : ./bin
   create : ./bin/www

   install dependencies:
     $ cd . && npm install

   run the app:
     $ DEBUG=gen:* npm start

デフォルトに戻す場合

npm uninstall -g express-generator
npm install -g express-generator

参考

上記記事の内容を、コマンドでgenerateできるようにした感じです。(layout.ectとかは参考にしてないので多分記述違うだろうなあ…)

ECT出てからわりと経つのに、express-generatorモジュールに反映されてないの、多分理由があるんだと思ってる…。 PR投げてもいいけど、コミット整理するのめんどい(´・ω・`)

追記

言い忘れてた…。僕が改造したrepoですが、ちょっと気に食わなかったところ改造してます…。

  • publicディレクトリ内のディレクトリ名変更
    • javascripts -> js
    • stylesheets -> css
    • images -> img
  • テンプレート内の、HTMLの属性を囲むシングルクォートを、ダブルクォートに変更

細かいことなんですけどね…。

(2015-08-11追記: 上記独自仕様やめました。compassとかにも影響が出ることがわかったので…)

Zenfone 2 (ZE551ML) フロントパネル交換しようとして失敗した

追記(2015-08-29):直してる人居た!!( ASUS Zenfone2 自分でディスプレイ交換 - かりぶろ )すげー!

チックショーーーーー!!!

電源ボタン長押しするとバイブ一瞬発生する機能付き高級文鎮が完成しました。慣れない修理はするもんやないですね。ほんまに。

何度も何度も開けては端子接続しなおしたりしたんですけどだめだった。一応こうやってブログに書いてますけど、手順とかメモってるわけじゃないです。

元の状態

スマホおとしちゃって、本当にバッキバキだったんですよね。 それでもしばらく使ってたんですが、もう非常に見えにくいので、文鎮になってもいいから修理をしてみようと思ったのです。

f:id:esperia:20150719014354j:plain

購入したもの

www.amazon.co.jp

端末はこっち。

www.expansys.jp

参考にしたもの

Zenfone 2って、ググっても修理した動画やブログ出ないんですよね…。あたらしすぎるのかしら。 なので、 Zenfone 5の修理を参考にやってました。

もちろん基盤の形などは違うものの、基本的な流れは同じで、LCD上部と下部にフラットケーブルが入ってるところも同じ。「こうすればいいのか」的な流れはすぐに見出すことができました。 ただ、どこか扱いが乱暴だったのか、よくわからないんですけど治らなかったです。。

一点気になったのは、修理前のフロントパネルについてたチップの型番。交換前は「ERH484E」だったんですけど、交換後のパネルが「ERH504E」って書いてあった。間違えてZE550ML買ったのかと思ってしまったけど、間違えてたらそもそもディスプレイはまらないよね…。きっと気にしすぎなんだろう…。

まあなんせうまく行かなかったです。総額5万円程度吹っ飛んだ気がしますよよよ。うう…

写真

f:id:esperia:20150717215533j:plain

Ubuntu ServerにMinecraft forge入れた

f:id:esperia:20150704211440p:plain

  • リンクコピーする。

f:id:esperia:20150704212004p:plain

http://files.minecraftforge.net/.../forge-1.8-11.14.3.1450-installer.jar みたいなURLになる。 (forgeの広告表示開かないの、多分Forge提供側に迷惑かかるので直リンクは避けてます。)

サーバにSSHで繋いで、コマンドライン操作でダウンロードとインストール、セットアップする。

# ダウンロード
mkdir server-forge
cd server-forge
curl -O http://files.minecraftforge.net/.../forge-1.8-11.14.3.1450-installer.jar

# インストール
java -jar forge-1.8-11.14.3.1450-installer.jar nogui --installServer

# 一旦起動し、各種設定ファイルを作る
java -Xmx2048M -Xms1024M -jar forge-1.8-11.14.3.1450-universal.jar

# >>> ここで Ctrl + c とかで一旦サーバ止める。
# eula.txtを開き、 eula=false -> eula=true にする
vim ./eula.txt

# もう一回起動
java -Xmx2048M -Xms1024M -jar forge-1.8-11.14.3.1450-universal.jar

# >>> ここで stop と入力し一度サーバ止める
# server.propertiesが書かれているので、設定する
vim ./server.properties

# 最後起動
java -Xmx2048M -Xms1024M -jar forge-1.8-11.14.3.1450-universal.jar
  • server.propertiesの詳細はここあたり見る。
  • MODのjarファイルは、「mods」というディレクトリがあるので、その中に入れる。
    • クライアント側のmodsディレクトリにも、同じファイルを入れなければならないので注意。
    • クライアント側のmodsディレクトリ無いよって方は、forgeをクライアント側にインストールしてないとかじゃないかな

最近Minecraft Server Managerなるものも見つけたので、こっちもできたら確認したいなあ。

クライアント側も書こうと思ったけどブログ書くの面倒臭かったので省く…。