DEODERED BLOG でブロックチェーン関連の話題が多くなってきましたので、専用にBlogを立ち上げました。
Blockchain Blog
By 1月 4th, 2022, underEmbedded
By 12月 18th, 2016, underDECODERED BLOG
By 6月 17th, 2016, underUpdate iPhone App ‘Live Music Coder M^2’
By 1月 9th, 2016, underあけましておめでとうございます!
このたび6年くらいぶりに、このアプリをアップデートしました。
https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=371256064&mt=8
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/
本年もよろしくお願いいたします!
calling Haskell from Swift / Linux
By 12月 26th, 2015, under今月Swiftがオープンソースとして公開されました。何か試したかったのでC言語とのリンクをと思ったのですが、少し踏み込んでHaskellにしてみました。
環境: swift-2.2-SNAPSHOT-2015-12-22-a-ubuntu15.10.tar.gz / Ubuntu 15.10
Swiftインストール:
https://swift.org/download/#latest-development-snapshots
からダウンロードした上記ファイルを解凍して、usr/binにパスを通します。
usr/lib/swift/linuxにある、libswiftCore.soをLinuxの/usr/local/libにコピーします。
とりあえず簡単なテストをするだけなので、これだけにしました。
export PATH:~/swift/usr/bin
sudo cp libswiftCore.so /usr/local/lib
sudo ldconfig
Haskellインストール:
sudo apt-get install ghc
fib.hs
module Fib where import Foreign.C.Types fibonacci :: Int -> Int fibonacci n = fibs !! n where fibs = 0 : 1 : zipWith (+) fibs (tail fibs) fibonacci_hs :: CInt -> CInt fibonacci_hs = fromIntegral . fibonacci . fromIntegral foreign export ccall fibonacci_hs :: CInt -> CInt
参考: https://wiki.haskell.org/Calling_Haskell_from_C
このコードをそのまま使い、Swiftから呼び出してみます。
fibsw.swift
import Foundation hs_start() var a: CInt = 12 let fb = fibonacci_hs(a) print("fibonacci \(a) : \(fb)") hs_end()
なんとダイレクトで呼び出せてしまいます。しかし、初期化処理とか必要になってくるので、Cのグルーコードを用意します。
fibc.h
#include "fib_stub.h" int hs_start(); int hs_end();
fibc.c
#include <stdio.h> #include "fibc.h" int hs_start() { int argc = 2; char *argv[] = {"+RTS", "-A32m", NULL}; char **pargv = argv; hs_init(&argc, &pargv); return 0; } int hs_end() { hs_exit(); return 0; }
fib_stub.hは、Haskellコンパイル時に自動生成されます。
#include "HsFFI.h" #ifdef __cplusplus extern "C" { #endif extern HsInt32 fibonacci_hs(HsInt32 a1); #ifdef __cplusplus } #endif
ビルド:
ghc -c -O fib.hs
cc -c -o fibc.o fibc.c -I/usr/lib/ghc/include
swiftc -c -o fibsw.o fibsw.swift -import-objc-header fibc.h -I/usr/lib/ghc/include
ghc –make -no-hs-main fibsw.o fibc.o fib.o -o fibsw -lswiftCore
実行結果:
SwiftがLinuxで手軽に使えると、サーバ、クライアントともSwiftで開発ができるのでいろいろと便利かもしれません。
Perfect.orgなども要注目ですね。
Update iPhone App ‘PPPPiano’
By 5月 18th, 2015, under5年ぶりにiPhoneアプリをアップデートし、先週承認されました。(12日)
6年前にリリースした’Perfect Pitch Practice Piano’です。
https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=320982874&mt=8
iOS8で使えなくなった等のレビューがありましたので、対応させていただきました。
もっと早く対応したかったのですが、開発していたMacがクラッシュした事故もあり、リリースがかなり遅れました。
ユーザの皆様にはご迷惑をおかけしました。
また、iPhoneOS2の時代のプロジェクトファイルなので、APIやライブラリ、Xcodeのファイルが現在と大きく変わっていて、戸惑いました。画面オリエンテーション(ランドスケープにならない)や起動スクリーン(表示されない)に手間取りました。iOS側の変更でプログラムが動かなくなったとき、当時とXcodeの開発環境もかなり違うため、修正にかなり時間がかかります。長くサポートすることは大変なことですね。しかし動作したということは、よかったと思うべきかもしれません。
プログラム仕様は変更はありません。画面の部品が変わっているので、若干レイアウトをずらしました。
Macが使えなくなったとき、本当に気持ちが萎えました。他にAndroid,Windowストアアプリにも興味があったこともあり、そちらに行ってからはiOSにはほとんどノータッチ状態になってしまいました。復旧したハードディスクから過去のプロジェクトを新しいMacのXcodeで動くように少しずつ手をつけていました。最近仕事で再びiOSにかかわるようになって、モチベーションが少しずつ上がってきたのは、幸いでした。
他のアプリもできる限り対応していきたいと思っています。(互換性があやしいやつもありますが・・)
Swift : Functional ?
By 5月 3rd, 2015, underSwiftの関数型言語の特徴についてのメモです。私の好みの部分だけビックアップしています。
環境 : Xcode 6.3 / Mac OSX 10.10.3
ソースは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)
By 4月 24th, 2015, under前回、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 ?
By 4月 4th, 2015, underしばらくご無沙汰していました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は、見えないのですが、暗黙のルールとして記述するようです。
以下、結果です。
実は、このCとの相互呼び出しは、Swiftに少し慣れてからテストしました。Optional型、関数型の特徴に興味があり、そちらを先に学習したので、(モダンなのに)Cとここまで近いとは気づいていませんでした。Swiftが最初に発表されたき、Objective-CでCのオープンソースをよくリンクして使っていたので、これがやりづらくなるのでは、という心配もありましたが、ダイレクトに呼び出せる(Objective-Cを経由せずの意味)のことでその懸念はなくなりました。
この言語、かなりパワフルです。
GNUstep
By 3月 14th, 2015, underObjective-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
最近は、Swiftという言語が新しくあらわれ、以前から難解と言われているObjective-Cに変わろうとしていますが、個人的には、この言語とても好きです。
C言語に追加される形でモダンの機能が使えるようになっているからです。コードを混在させるという面でもC++より柔軟です。
混在をきらう人もいますが、文法の差異が大きいので、混在しても識別は容易です。
Cベースのキャリアの人は、好きになりやすいと思うのですが、とっつきにくさと使う機会の少なさから正しく評価させていないような気がします。
という私も使う機会がiPhone以外ないので、このGNUstepによって広がれば面白いかもしれません。