Archive for the ‘プログラミング’ Category

Update iPhone App ‘Live Music Coder M^2’

土曜日, 1月 9th, 2016

あけましておめでとうございます!

このたび6年くらいぶりに、このアプリをアップデートしました。

https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=371256064&mt=8

lmc00
iOS9で原因不明のクラッシュがあったので、ビルドしなおしました。かなり前のアプリなので、今の環境で動かすのにいろいろと時間がかかりました。C言語のプログラムを習い始めたころ、「intは使うな」という教えがありましたが、今回はそれを痛感しました。当時16bitと32bitのはざまでいろんな問題がおきましたが、今は32bitと64bit間です。やはり教訓は守らないといけませんね。
これ以外の過去のアプリもできるだけアップデートしていきたいと思っています。

あとこれに先駆けて新しいアプリもリリースしました。
“C Tones Learning”
https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=1063098601&mt=8
(あまり一般的ではない特定用途向けのアプリですが・・)

今年は、新規のアプリもリリースしていく予定です。
http://iphone.iiv.jp/

教育用途向けのアプリとか作ってみたいです。
http://decode.red/ed/

本年もよろしくお願いいたします!

Swift : Functional ?

日曜日, 5月 3rd, 2015

Swiftの関数型言語の特徴についてのメモです。私の好みの部分だけビックアップしています。
環境 : Xcode 6.3 / Mac OSX 10.10.3

f1
f2

ソースはGithub Gistにあります。
https://gist.github.com/systemsblue/526eb360ec2ffc57a8a9

・Generator
無限の数列を生成するクラスです。引数により有限も可能です。

・Curry
関数のカリー化です。Swift自身対応しているのですが(f2)、f1の方がいろいろと応用がききそうです。コメントのf1は、簡略化した表記です。Haskellみたいです。

・Pipe
F#のパイプ演算子のように記述できます。(便利なのでいろいろと使えます。一番上に定義) 

g(f(x)) -> x |> f |> g

カリー化の部分適合の考え方を参考にすると、引数を与えられます。

参考:
http://undefinedvalue.com/2014/07/13/fs-pipe-forward-operator-swift

Swift : without C ? (2)

金曜日, 4月 24th, 2015

前回、Swift, Objective-Cの相互呼び出しのテストをしましたが、CからSwiftの呼び出しについては、Objective-C経由で十分と考えていました。CとSwiftの「近さ」を実感するために、ここをもう少し踏み込んでテストしてみたいと思います。

環境 : Swift 1.2, Xcode 6.3 / Mac OSX 10.10.3

- (void) callSwift2 {
    MySwiftClass *my = [[MySwiftClass alloc] init];
    SEL method = @selector(disp:);
    [my performSelector: method withObject:@"NS String 2 / Objc"];
}
- (void) callSwift3 {
    MySwiftClass *my = [[MySwiftClass alloc] init];
    SEL method = @selector(disp:);
    IMP func = [my methodForSelector: method];
    
    // C Function
    ((void(*)(id, SEL, NSString*))func)(my, method, @"NS String 3 / Objc");
}

主に上記二つのメソッド追加しました。
前回からSwiftもバージョンアップしたので、OSもXcodeもアップグレードして、再びビルドしました。
また、プログでは初めて、コードをgithubにアップしました。関連プログでもこれから活用していくつもりです。

https://github.com/systemsblue/CBridge

callSwift3で、Cの関数のようにSwiftのメソッドを呼び出しているところがポイントです。
さらに、Pythonのctypesを使って、Swiftのメソッドをダイナミックライブラリにして無理やり呼び出してみました。

add.swift

public func add(a:Int, b:Int) -> Int {
	return a + b
}

コマンド

xcrun swiftc -emit-library -emit-object add.swift -o add.o
xcrun libtool -dynamic -lswiftCore -lsystem -o add.dylib add.o -L/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx
nm add.dylib

symbol table表示結果

0000000000000f70 T __TF4addf3addFTSiSi_Si
0000000000000f64 t __dyld_func_lookup
U dyld_stub_binder
0000000000000f50 t dyld_stub_binding_helper

メソッド_TF4addf3addFTSiSi_Siをpython(REPL)から呼び出す。

Python 2.7.6 (default, Sep  9 2014, 15:04:36) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> cdll.LoadLibrary('/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftCore.dylib')
<CDLL '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftCore.dylib', handle 7f83b9e010f0 at 10b5874d0>
>>> my = cdll.LoadLibrary('./add.dylib')
>>> my._TF4addf3addFTSiSi_Si(1,2)
3
>>> 

やはりCなのですね。
Pythonのctypesは、Cの構造体にもアクセスでき、dylib(Mac), dll(Window), so(Linux)にアクセスするときによく使われます。(前回やったようにSwiftも構造体にアクセス可という点で似ています)
オブジェクト指向を取り入れたのが、Objective-Cなら、関数型言語の特徴を取り入れたSwiftは、Functional-Cと呼んでもいいくらい、Cに「近い」と感じました。(見た目はかなり違いますが)

Swift : without C ?

土曜日, 4月 4th, 2015

しばらくご無沙汰していましたiOS開発を再び始めることになりました。
新しい言語のSwiftを使っていろいろと作っていますが、C言語との「距離」が意外と近い、という印象を強くうけます。
「わさび抜きわさビーフ」ではないですが、C抜きの(Cにみえない)C言語みたいな感じでしょうか。
関数型言語のアイディアをふんだんに取り入れた、高機能な言語に仕上がっているのは、もちろんですが、Objective-C, C との相互やりとりは簡単にできるようになっています。
そこで、相互呼び出しのテストをしてみました。

環境 : Xcode 6.2 / Mac OSX 10.9.5

main.swift

import Foundation

class MySwiftClass : NSObject{
    func disp(str:NSString){
        println("Swift : \(str)")
    }
}

var my = MyObjcClass()

var str:NSString = "NS String / Swift";
my.disp(str)
my.callSwift()

var i:CInt = 0
var cstr = UnsafeMutablePointer<CChar>.alloc(10)

getStr(cstr)
println(String.fromCString(cstr)!)

getInt(&i)
println("number : \(i)")

var ii:CInt = 0
var cstr2 = [CChar](count:20, repeatedValue:0)

var cst1 = cStruct(name:&cstr2, number:ii)
getStruct1(&cst1)
println("\(String.fromCString(cst1.name)!) : \(cst1.number)")

var cst2:cStruct = getStruct2()
println("\(String.fromCString(cst2.name)!) : \(cst2.number)")

var cst3:UnsafeMutablePointer<cStruct> = getStruct3()
println("\(String.fromCString(cst3.memory.name)!) : \(cst3.memory.number)")

sub01.h

#import <Foundation/Foundation.h>

@interface MyObjcClass : NSObject
- (void) disp:(NSString*)str;
- (void) callSwift;
@end

sub01.m

#import "CBridge-Swift.h"
#import "sub01.h"

@implementation MyObjcClass
- (void) disp:(NSString*) str {
    NSLog(@"Objc : %@", str);
}
- (void) callSwift {
    MySwiftClass *my = [[MySwiftClass alloc] init];
    [my disp:@"NS String / Objc"];
}
@end

CBridge-Bridging-Header.h

#import "sub01.h"
#import "sub02.h"

sub02.h

#include <stdio.h>
#include <string.h>

void getInt(int *i);
void getStr(char *str);

typedef struct{
    char *name;
    int number;
} cStruct;

void getStruct1(cStruct *st);
cStruct getStruct2();
cStruct* getStruct3();

sub02.c

#include "sub02.h"
#include <stdlib.h>
#include <string.h>

void getInt(int *i){
    *i = 1234;
}
void getStr(char *str){
    strcpy(str, "C String / Clang");
}
void getStruct1(cStruct *st){
    st->name = "name of cStruct1";
    st->number = 1111;
}
cStruct getStruct2(){
    cStruct *st = malloc(sizeof(cStruct));
    st->name = "name of cStruct2";
    st->number = 2222;
    return *st;
}
cStruct* getStruct3(){
    cStruct *st = malloc(sizeof(cStruct));
    st->name = "name of cStruct3";
    st->number = 3333;
    return st;
}

SwiftからCの呼び出しは、UnsafeMutablePointerを使うところとC構造体がそのままSwift側で使えてしまうところが、ポイントです。
構造体は3とおりの呼び出しを試しました。
SwiftとObjective-Cとの相互呼び出しは、簡単にできてしまいます。
CBridge-Bridgeing-Header.hは、コードを追加するときに作成するか聞いてきます。ここにはC,Objective-Cのヘッダを読み込みます。
CBridge-Swift.hは、見えないのですが、暗黙のルールとして記述するようです。
以下、結果です。
CBridge

実は、このCとの相互呼び出しは、Swiftに少し慣れてからテストしました。Optional型、関数型の特徴に興味があり、そちらを先に学習したので、(モダンなのに)Cとここまで近いとは気づいていませんでした。Swiftが最初に発表されたき、Objective-CでCのオープンソースをよくリンクして使っていたので、これがやりづらくなるのでは、という心配もありましたが、ダイレクトに呼び出せる(Objective-Cを経由せずの意味)のことでその懸念はなくなりました。
この言語、かなりパワフルです。

GNUstep

土曜日, 3月 14th, 2015

Objective-Cといえば、Apple製品の開発言語ですが、Xcode上でiPhoneの開発をするときしか使ったことがありませんでした。LinuxでObjective-Cによる開発をする環境のGNUstepというものがあると知って、試してみました。
もともとは、NeXTstepというOS、このOSのアプリケーションの記述言語だったものを、Linux上に移したのがGNUstepということになります。

参考 :
http://www.gnustep.it/nicola/Tutorials/WritingMakefiles/node6.html

環境 : Ubuntu 14.04

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>

int main()
{
  NSAutoreleasePool *pool = [NSAutoreleasePool new];

  [NSApplication sharedApplication];

  NSRunAlertPanel (@"PanelTest", @"Hello from the GNUstep AppKit", nil, nil, nil);

  [pool drain];

  return 0;
}

GNUmakefile

include $(GNUSTEP_MAKEFILES)/common.make
APP_NAME = PanelTest
PanelTest_OBJC_FILES = Source.m
include $(GNUSTEP_MAKEFILES)/application.make

コマンド

apt-get install gnustep
apt-get install gnustep-devel
export GNUSTEP_MAKEFILES=/usr/share/GNUstep/Makefiles
make
openapp ./PanelTest.app

gnustep01

最近は、Swiftという言語が新しくあらわれ、以前から難解と言われているObjective-Cに変わろうとしていますが、個人的には、この言語とても好きです。
C言語に追加される形でモダンの機能が使えるようになっているからです。コードを混在させるという面でもC++より柔軟です。
混在をきらう人もいますが、文法の差異が大きいので、混在しても識別は容易です。
Cベースのキャリアの人は、好きになりやすいと思うのですが、とっつきにくさと使う機会の少なさから正しく評価させていないような気がします。
という私も使う機会がiPhone以外ないので、このGNUstepによって広がれば面白いかもしれません。

Co-Routine / Scheme

火曜日, 11月 25th, 2014

以前コルーチンの記事Co-Routine / Pythonを書きましたが、Scheme(Lisp)でやってみました。最近、データ処理には「やはりLispが向いているかも」という気まぐれから、Schemeに再びはまっています。Schemeといえば、call/ccによる「継続」が有名ですが、ならばコルーチンでしょう、ということになりました。しくみがわかりやすいようにシンプルなものにしました。

#lang racket
(define cont #f)
(call/cc (lambda (return) 
           ((lambda (yield)(yield 1)(yield 2)(yield 4)) 
            (lambda (value)
               (call/cc (lambda (c)
                    (set! cont c)
                      (return value)))))))

scheme01

今回使ったこのDrRacketというツールは、初めて使ったのですが、とても高機能で使いやすいです。再びはまったのも、このツールによるところが大です。

http://blog.livedoor.jp/kosugip/archives/692821.html 参考

calling Clojure from Java

木曜日, 11月 6th, 2014

前回の流れで、今回はClojureを呼び出してみました。

環境: Java 1.8.0_25, Clojure 1.6.0, Leiningen 1.0 / Windows 8.1
JavaMain.java

import clojuresub.core;

public class JavaMain{
	public static void main(String[] args){
		String str = "Java String";
		core.sub(str);
	}
}

lein new clojuresub

を実行の後、以下のようにプログラムコード、プロジェクトファイルを記述します。
core.clj

(ns clojuresub.core
  (:gen-class
   :name clojuresub.core
   :methods [#^{:static true} (sub [String] String)]))

(defn -sub
  [s]
  (println (str "Clojure Message : " s)))

project.clj

(defproject clojuresub "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]]
  :aot :all
  :main clojuresub)

clojuresubディレクトリで、

lein compile
javac -cp .\target\classes JavaMain.java
java -cp .`;target\classes`;clojure-1.6.0.jar JavaMain

を実行します。
clojre-1.6.0.jarは、leiningenインストール時の.m2フォルダリポジトリ内の深いところからカレントにコピーしておきます。

lein uberjar

を実行してjarを作成し、下記のように実行することもできます。

clojure01

参考:
http://stackoverflow.com/questions/2181774/calling-clojure-from-java
http://www.coderanch.com/t/601586/clojure/Calling-Clojure-Java-code

calling Scala from Java

月曜日, 11月 3rd, 2014

JavaからScalaを呼び出すときのメモです。

環境: Java 1.8.0_25, Scala 2.11.4 / Windows 8.1

public class JavaMain {
	public static void main(String args[]){
	
		String str="Java String";
		ScalaSub.sub(str);
	}
}
object ScalaSub{
	def sub(arg:String) = {
		println("Scala Message : " + arg);
	}
}

PowerShellでコンパイル。(セミコロンのエスケープに注意)
scala01

PubSub / Redis Server

日曜日, 8月 10th, 2014

RedisサーバでメッセージのPublish/Subscribeをやってみた。

環境 : redis-server 2.8.4 / Ubuntu 14.04 LTS

まずはRedisサーバのインストールから。

apt-get install redis-server

これだけでサーバも起動します。

WindowsからRedis Desktop Manager (http://redisdesktop.com/)を使いたかったたので、サーバをリモートからアクセスできるようにします。

service redis-server stop
vi /etc/redis/redis.conf

bind にリモートからアクセスするサーバのIPアドレスを設定
requirepass にpasswordを設定

service redis-server start

Subscribe用のクライアントを開きます。

redis-cli -h 192.168.11.11 -a password

テスト用に値もセット。
そしてSubcribe。
redis01

まとめてしまいましたが、subcribeをして下のpublishを待ち、publish実行後subscribeでmessageを受信します。

redis02

設定した値は、次のように確認できます。
redis03

以上、簡単ですがメモでした。

Co-Routine / Python

水曜日, 5月 28th, 2014

超簡単にPythonでコルーチンを表現するのにす、わかりやすいと思われる例をメモしておきます。

def ro1():
	for i in range(1,5):
		print i

def ro2():
	for i in range(101,105):
		print i

ro1()
ro2()

1
2
3
4
101
102
103
104

これを以下のようにすると、

def co1():
	for i in range(1,5):
		yield i

def co2():
	for i in range(101,105):
		yield i

i1 = co1()
i2 = co2()
for i in range(1,5):
	print i1.next()
	print i2.next()

1
101
2
102
3
103
4
104

今度は、コルーチンが得意なLuaでもっといろいろなテストをしてみたいと思います。