AppleScriptでPerlのcommandを実行する

この記事はWanoグループ Advent Calendar 2016の6日目の記事です

AppleScriptとは?

AppleScript は、OS X に組み込まれている、多目的なスクリプト言語です。AppleScript を使ってショートカットを作成したり、繰り返しのタスクを自動化したりできます。さらに、そのアイコン上にファイルまたはフォルダをドラッグ&ドロップしたときに実行出来ます。今回紹介する例は、デスクトップからドラッグ操作でファイルを移動して、AppleScriptでPerlのcommandを実行するものです。

まず、スクリプトエディタを選択して起動します。

scripteditor

スクリプトエディタ

 

ドラッグ操作なので、そのスクリプトの実行を開始するには、「on open」ハンドラを必要とします。「on open」ハンドラには、ドロップレットにドラッグしたファイルのオブジェクトのリストが入ります、以下の例を示します。

on open (theItemsDropped)
  (first command)
  (second command)
   …
end open

 

実際のコード:


on open these
  # 複数ファイル対応
  repeat with this in these
    set filename to POSIX path of this
    # tellコマンドを使ってFinderにiTermを開くように命令します
    tell <i>application</i> "iTerm"
      # activateは指定されたウインドウを開き、手前に移動します
      activate
      #iterm中でdefault profileの設定をして、新しいiTermのwindowを開きます
      set new_term to (create window with default profile)
      tell new_term
        tell the current session
        #FileToAction.plにiTermでファイル実行する
        write text "perl /Users/johnny/src/test/FileToAction.pl" & filename
        end tell
      end tell
    end tell
  end repeat
end open

ファイルを扱うには、スクリプトのままではなく、.appファイルで保存します。

そうすると、エンジニア以外の人でも、簡単にファイルをドラッグして、Perlのcommandを実行する操作できます。

Read More

Sublime text布教

この記事は1日目から頓挫しかけて慌てて書いたWanoグループ Advent Calendar 2016の1日目です。

Wanoは少々珍しく、デザイナー兼コーダーの皆さんはWindowsが多いです。
エディタは各々好みのものを利用していますが、参考までに私の使っているエディタを紹介していこうと思います。

エディタ

Sublime text 3

使用パッケージ

  • IMESupport…日本語をインラインで入力できるように
  • Japanize…メニューの日本語化
  • SimpleClone…タブの複製
  • SublimeServer…ローカルサーバー
  • SFTP
  • COMPASS…SASSのコンパイル
  • SCSS…scssファイルを扱えるように

と、最小限の構成です。COMPASSを使うにはRubyが必要等もうひと手間かかります。
特に便利だと思っているものは太字にしてあるので、今後詳しく紹介します。

Sublime textのいい所は拡張性が高い等が言われていますが、何よりも環境の引っ越しが楽というのが使っている理由です。
C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\
内のファイルと
Preferences.sublime-settings
の内容を丸ごとコピペするという2ステップで環境の引っ越しが完了します

次回からは各パッケージのインストール方法や、細かい設定、ショートカット等を紹介できればと思います。
エディタで迷っている方がいれば参考になれば幸いです。

Read More

AWS Lambdaで Slackのslashコマンドを作る(1)

伏見です。
表題の通りやっていきたいと思います。

(1)セットアップ

まずはおもむろにサーバーレスフレームワークのセットアップをします。
2016年9月現在、Serverless Frameworkは1.0@Beta3くらいまで出てますが、
サクッとAWSのlambdaとAPI Gatewayを使う限り、regeonやprofileなどを対話形式で選んでくれるバージョン0.5.6の方が
今の所使いやすいのでこっちを使います。
0.5系のdocumentはこちら 

入れます。

npm install -g serverless

プロジェクト立てます。

serverless project create

対話形式でいろいろ聞いてくるので、聞かれるままに言語やAWSのプロファイルの設定をします。
あ、aws-cliは入っているものとします。

次に、lambdaのファンクションやAPI gatewayのエンドポイントをサクッと立てます。
ここでは、command01と云う名前にしてみます。

serverless function create functions/command01

また対話形式で、言語や作るものを聞かれます。
ここではnodejs4.3を選んでおきます。

Serverless: Please, select a runtime for this new Function
  > nodejs4.3
    python2.7
    nodejs (v0.10, soon to be deprecated)

設定を終えると、functions/command01以下にlambdaファンクションの本体となる handler.jsや、API gateway、lambdaの設定を司るs-function.jsonなどができています。
ファンクションを作ったディレクトリに移動して、npmの設定を行います。
これは、lambdaにdeployする時に、node_modulesが独立しているためです。

cd functions/command01
npm init

ちなみにwebpackを使う方はファンクションごとのこの設定、いりません。babelやtypescriptを使ったり、jsonやimageをバンドルして扱いやすくしたい…あるいは複数のfunctionごとにコードを共有したい…という方もこっちですね。
0.5系向けならwebpack plugin  がとにかく簡単でオススメです。
サクッとやるだけならいらないです。

(2)まずは繋いでみる

とりあえずデプロイします。

lambda。

serverless function deploy

api-gateway。

serverless endpoint deploy

endpoint deploy後に表示されたURLにブラウザで確認します。

ほげ

表示されました。
これでとりあえずのひな形ができました。

実際の機能作成は次の記事で。

Read More

(Android & Java) Lombokでざっくりシャローコピー

伏見です。

Lombokとは、JavaでGetter,Setter,コンストラクタなどを自動生成していい感じに隠蔽してくれるツールです。
様々なアノテーションを使って表現します。
Lombok 使い方メモ

現在所属しているチームではモバイルアプリ開発を行っています。
Swift,Web,AndroidのAPIのIOやビジネスロジックの共通の大元をまずTypeScriptで書いており、そこからSwiftやJavaのデータ定義用コードを自動生成して各自で使っています。

Typescriptでデータ用モデルを定義するとき、ゲッターセッターだのまず書いていません。
Androidでの開発においても、最近はREST APIから渡ってくる情報や、アプリケーションのビジネスロジックを表現するようなシンプルなデータ用クラスを、js側で扱うpureなJSONとなるべく見た目的に等価にしておきたい気分でいます。

で、ゲッターセッター、コンストラクタの定義にLombokを使っているわけです。

で、本題ですが、このLombok、オブジェクトの浅いコピーにも使えます。
データ用クラスがCloneableを継承すれば当然Lombokなしでもシャローコピー(?)は実装できますが、前述の理由で余計なinterfaceやメソッドを定義してクラス内を汚したくないです。

(参考にしたリンク)

定義側


@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true) //<-これ
public class PlayerStore {

    public int nowPlayOrder = 0;

}

使用側


            PlayerStore oldPlayerStore = allStore.playerStore;
            PlayerStore oldPlayerStore2 = allStore.playerStore;

            oldPlayerStore.nowPlayOrder = 20;
    
            Log.d("" , oldPlayerStore2.nowPlayOrder+""); //20
            Log.d("" , allStore.playerStore.nowPlayOrder + ""); //20

            allStore.playerStore = oldPlayerStore.toBuilder().build();
            oldPlayerStore.nowPlayOrder = 120;
   
            Log.d("" , oldPlayerStore2.nowPlayOrder+""); //120
            Log.d("" , allStore.playerStore.nowPlayOrder + ""); //20



結果は以上のような感じになります。

便利。
Android用オレオレRedux実装のReducerにあたる部分で使う予定ですが、他に使う場面あるかな…。

Read More

Hadoop 2.4をインストールしてみました

Hadoop 2.3より、大幅ブラッシュアップしてました。色々変わりましたので、最新のV2.4をインストールしてみました。

まずはdocs

http://hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hadoop-common/ClusterSetup.html

簡単な2台構成で行きましょう。

  1. hostname: hadoop01( master + slave )
  2. hostname: hadoop02( slave )

masterとslaveが同じ設定ファイルを使えますので、まずhadoop01でインストールし、その後scpすればよいはず。

事前準備

  1. 公式サイトからDLできるのは32bit版しかないので、32bitのjavaを使いましょう。
  2. Networkに関して、2台サーバーがお互いにssh接続できるようにする必要があります。

インストール

  1. DL & 解凍
    DLリンクはこちら:http://www.apache.org/dyn/closer.cgi/hadoop/common/

    tar -zxf hadoop-2.4.0.tar.gz
    cd hadoop-2.4.0
    
  2. 環境変数の設定。設定ファイル:etc/hadoop/hadoop-env.shとetc/hadoop/yarn-env.sh
    export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386/
    export HADOOP_HOME=/home/lulin/hadoop-2.4.0/
    export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true
    
  3. etc/hadoop/core-site.xmlの設定まずはhadoop用tmpフォルダー作成
    mkdir /home/lulin/hadoop.tmp
    

    次はetc/hadoop/core-site.xmlの<configuration>と</configuration>の間下記の設定を追加する

    <property>
    	<name>fs.defaultFS</name>
    	<value>hdfs://hadoop01:9000</value>
    </property>
    <property>
    	<name>hadoop.tmp.dir</name>
    	<value>file:///home/lulin/hadoop.tmp</value>
    	<description>A base for other temporary directories.</description>
    </property>
    
  4. etc/hadoop/hdfs-site.xmlの設定まずはhafs用フォルダー作成
    mkdir -p /home/lulin/hadoop.dfs/name/
    mkdir -p /home/lulin/hadoop.dfs/data/
    

    etc/hadoop/hdfs-site.xmlに下記の設定を追加する。

     <property>
       <name>dfs.namenode.name.dir</name>
       <value>file:///home/lulin/hadoop.dfs/name/</value>
     </property>
     <property>
       <name>dfs.datanode.data.dir</name>
       <value>file:///home/lulin/hadoop.dfs/data/</value>
     </property>
     <property>
       <name>dfs.namenode.http-address</name>
       <value>hadoop01:10700</value>
     </property>
     <property>
       <name>dfs.datanode.address</name>
       <value>0.0.0.0:10010</value>
     </property>
    
     <property>
       <name>dfs.datanode.ipc.address</name>
       <value>0.0.0.0:10020</value>
     </property>
    
     <property>
       <name>dfs.datanode.ipc.address</name>
       <value>0.0.0.0:10030</value>
     </property>
    
     <property>
       <name>dfs.datanode.http.address</name>
       <value>0.0.0.0:10040</value>
     </property>
    
     <property>
       <name>dfs.namenode.secondary.http-address</name>
       <value>0.0.0.0:10050</value>
     </property>
    
  5. etc/hadoop/slavesの設定
    hadoop01
    hadoop02
    
  6. etc/hadoop/yarn-site.xmlの設定
     <property>
       <name>yarn.resourcemanager.address</name>
       <value>hadoop01:10110</value>
     </property>
     <property>
       <name>yarn.resourcemanager.scheduler.address</name>
       <value>hadoop01:10120</value>
     </property>
     <property>
       <name>yarn.resourcemanager.resource-tracker.address</name>
       <value>hadoop01:10130</value>
     </property>
     <property>
       <name>yarn.resourcemanager.admin.address</name>
       <value>hadoop01:10140</value>
     </property>
     <property>
       <name>yarn.resourcemanager.webapp.address</name>
       <value>hadoop01:10150</value>
     </property>
    
     <property>
       <name>yarn.nodemanager.localizer.address</name>
       <value>${yarn.nodemanager.hostname}:10160</value>
     </property>
    
     <property>
       <name>yarn.nodemanager.webapp.address</name>
       <value>${yarn.nodemanager.hostname}:10170</value>
     </property>
    
  7. etc/hadoop/mapred-site.xmlの設定
     <property>
       <name>mapreduce.jobhistory.address</name>
       <value>hadoop01:10210</value>
     </property>
    
     <property>
       <name>mapreduce.jobhistory.admin.address</name>
       <value>hadoop01:10220</value>
     </property>
    
     <property>
       <name>mapreduce.jobhistory.webapp.address</name>
       <value>hadoop01:10230</value>
     </property>
    
  8. hadoop、 tmpフォルダー、dfsフォルダーを全ての
    scp -r hadoop-2.4.0 hadoop.dfs hadoop.tmp hadoop02:~/
    
  9. hdfs作成
    bin/hdfs namenode -format
    
  10. ここまで準備完了です。hadoopスタート!masterであるhadoop01で、下記のコマンドを実行する。
    sbin/start-dfs.sh
    sbin/start-yarn.sh
    sbin/mr-jobhistory-daemon.sh start historyserver
    
  11. WEB UIでシステムステータスを確認できます。
    NameNode: http://hadoop01:10700/
    ResourceManager: http://hadoop01:10150/
    JobHistory: http://hadoop01:10230/
  12. 最後に、シャットダウンコマンドです。
    sbin/stop-dfs.sh
    sbin/stop-yarn.sh
    sbin/mr-jobhistory-daemon.sh stop historyserver
    

Read More

Ubuntuでのvirt-managerを使った仮想環境の構築

Ubuntuでのvirt-managerを使った仮想環境の構築をした。

参考にしたのは

http://symfoware.blog68.fc2.com/blog-entry-962.html

とか

http://d.hatena.ne.jp/m-kawato/20090426/1240699832

とか。

 

端末からとりあえず

$ sudo apt-get install kvm libvirt-bin
$ sudo apt-get install virt-manager

でKVMとvirt-managerをインストール。

この辺で少し試行錯誤していたので、他にも必要なものをインストールする必要があるかもしれない。

また、場合によってはlibvirtdグループに自分のユーザーIDを登録する必要があるらしいが、自分の場合は自動で追加されていた。

 

virt-managerをインストールし終わったら、

$ virt-manager

で起動。

ここから「新しい仮想マシンを追加」を選択して、仮想マシンをインストール。

この辺は画面の指示に従ってやればいいと思う。

 

インストールが終わったら、一旦ホストマシンの端末を立ち上げて、

$ vim /etc/network/interfaces

とやってホストマシンの仮想ブリッジの設定を書く。

DHCPを使う場合はこんな感じ

auto lo
iface lo inet loopback

auto eth1
iface eth1 inet dhcp

auto br0
iface br0 inet dhcp
bridge_ports eth1

固定IPの場合はこんな感じ

auto lo
iface lo inet loopback

auto eth1
iface eth1 inet dhcp

auto br0
iface br0 inet static
    address 192.168.1.50
    netmask 255.255.255.0
    broadcast 192.168.1.255
    gateway 192.168.1.1
    dns-nameservers 192.168.1.1
    bridge_ports eth1

ここで、自分の場合はeth0ではなくeth1だったことに気づかずに無駄に時間を食った。

 

一通り終わったら、ここでホストマシンをリブート。

リブート後、再度virt-managerを起動して、「仮想マシンの情報を表示」をクリック。

その中の、仮想ネットワークインターフェース -> ソースデバイス より先ほど作った仮想ブリッジ名を選択。

自分の場合は「ホストデバイス eth1(Bridge ‘br0’)」だった。

これを忘れてまたハマる。

 

設定が終わったら仮想マシンを再起動して、仮想マシンにpingが通ったら完璧!

これでようやくテストサーバーが組める。

ふぅ…。

Read More

Array.indexOfをIE8でも使えるように拡張してみる

prototype拡張はなるべく行いたくないので、jQueryが使える環境であれば$.inArray()を使用した方が無駄も少なくて良い。

なぜ”indexOf”じゃなくて”inArray”にしたの?互換性無いし格好わるいよ、ってなツッコミが各所で見られますが、jQueryが内部で行っている処理自体が完全な互換性を保っていないらしく、正式な”indexOf”を命名すのを避けたそうです。

http://api.jquery.com/jQuery.inArray/

//indexOfが実装されていないブラウザのみArrayを拡張する。
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
        'use strict';
        if (this == null) {
            throw new TypeError();
        }
        var n, k, t = Object(this),
            len = t.length >>> 0;

        if (len === 0) {
            return -1;
        }
        n = 0;
        if (arguments.length > 1) {
            n = Number(arguments[1]);
            if (n != n) { // shortcut for verifying if it's NaN
                n = 0;
            } else if (n != 0 && n != Infinity && n != -Infinity) {
                n = (n > 0 || -1) * Math.floor(Math.abs(n));
            }
        }
        if (n >= len) {
            return -1;
        }
        for (k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); k < len; k++) {
            if (k in t && t[k] === searchElement) {
                return k;
            }
        }
        return -1;
    };
}

Read More

Syntax Highlight test 1

For ActionScript:

function shuffleArray(array:Array):Array
{
	var len:int = array.length;

	for (var i:int=0; i<len; i++)
	{
		var j:int = Math.round( Math.random() * (len-1) );

		var value:* = array[i];

		array[i] = array[j];
		array[j] = value;
	}

	return array;
}

For JavaScript:

function shuffleArray(array)
{
	var len = array.length;

	for (var i=0; i<len; i++)
	{
		var j = Math.round( Math.random() * (len-1) );

		var value = array[i];

		array[i] = array[j];
		array[j] = value;
	}

	return array;
}

For PHP:

 

Read More