OSXで PCM再生(問題発生…)

 CoreAudioとか覚えるの大変そう…という理由で、OpenALを弄り始めてみたり。
 …しかし、それすら調べるのも面倒に感じてしまい、kindle本「チュートリアル形式ではじめるOpenAL」を見ながら、動かしてみることに。(なんという、ぐーたら)

 ちなみに、以下はまだ基本の出力デバイスとコンテキストを用意しただけで、音を出す処理は入ってない。

しかし、早速WARNINGと共にこんな出力が…

 ArturiaVみたいなソフトシンセをインストールしてると、OpenALって上手く動作しない可能性あるんだろうか…

 上記WARNINGは、単に不要な出力だけで済んでいるけど、正直消したい。が、これを消すのを調べるのは、結局1からOpenAL学ばないと無理。。

 なんかいきなり面倒くさいパターン遭遇で、出鼻挫かれたナリ。(=_=;

その後…

 一旦そのままチュートリアルを進め、サイン波の生成及び再生の確認は出来たので、PCM再生をしたい人は上記のkindle本とか読んでみるのもいいかもしれない。
 チュートリアル形式なので、その通りに手順を進めることが出来れば、サイン波を鳴らすことが出来ますw

 とりあえず、自分は「サウンドプログラミング入門 -音声合成の基本とC言語による実装-」とかを読みながら、PCM再生実装の基本的なことを試してみる予定。

 理論から攻めてみようと本を物色していたけど、結局学校の勉強みたいな方法で攻めるのは苦手なので、実践から攻めることにしました。

ダブルバッファでストリーミング再生する方法は、この回答みたいな話でいけるのかしら?
http://stackoverflow.com/questions/13907289/circular-buffers-in-openal
ストリーミング再生で調べたら、まんまの記事があった。
https://www21.atwiki.jp/opengl/sp/pages/174.html

[OS X] 他のオブジェクトから情報を得るには

めも。

デリゲーションによってオブジェクト間の情報伝達ができるよ。という話題。
Protocols part 2 : Delegation

前にサンプルコードをいろいろ載せてるページを見つけてたけど、そこにもサンプルがあった。
概念じゃなく具体的に実装で説明してるから、こっちの方が分かりやすいかな。

情報が古いせいか、これはちょっと違うっぽい…

きんくまさんのページに、プロトコルのことが書かれていた。
どこかでも見たけど、Protocol-Delegationパターンというらしい。
オブジェクトから直接インターフェースを生やす手もあるけど、プロトコルに仲介させることで疎結合にできるのが良いんだ。と書かれている。

疎結合というのは、コンポーネント同士があんまり相手を選ばないし、居るか居ないかも気にしないで動く。ゆるく協調しあうような状態のこと。

…あんまり相手を選ばない、というのも語弊があるか。。わりと汎用的なインターフェースを用意することで、新しく別のコンポーネントと結合しようとした場合でも、無理のない結合を可能にできる。というくらいの意味。
選ばない。というか、誰でも利用していいよ。ウェルカムだよ。みたいな感じ。逆に「選ぶ」ものは、閉鎖的というかガチガチに固まったインターフェース。非常に手続き的。

疎結合は、あまり手続きが必要ない。シンプルなやりとりが基本。って感じかな。

デリゲート難しいなー。こんなページも見つけた。
[iOS] iOSのDelegateをしっかりと理解する
なんか、しっかり理解してないと正直関連が全然見えなくて、全く実装できる気がしない…

“[iOS] iOSのDelegateをしっかりと理解する” のページを見ながら整理してみた。

定義が煩雑なので、とにかくやっていることを整理してみた。

  • View
    • protocol公開
    • delegate公開
    • 設定済みdelegateの利用
  • Controller
    • protocol実装
    • delegate設定

整理してみると、意外なほどにシンプルになった…
定義や動作について、順を追ってみるとこんな感じ。

・Viewにて、外部クラスに使って欲しいProtocolを定義&公開。
 ※公開したProtocolは定義だけで、このクラスに実装はない。
・また、Protocolを使ってくれるクラスのインスタンスを収めるdelegateも定義&公開。
・Controllerにて、Viewが公開しているProtocolの実装をし、公開。
・また、Protocolを公開しているクラス側のインスタンス(のdelegate)に、自分のインスタンスを設定。
・Viewにて、自分のメンバ(delegate)に設定されたインスタンスを用いて、その設定されたインスタンスのクラスが公開しているProtocol実装を呼び出す。
 ※この最後のProtocol実装の呼び出しにより、ControllerからViewに値が受け渡される。

[OS X] 作図ツール

めも。

プログラムを書くのに作図ツールが欲しくなって調べたら、こんなのが出てきた。ソースも公開されている。(まぁ、これは線グラフを書くのが目的だけども…)

お絵描きツールを書こうと思ってたけど、ある程度似たようなプログラムのコードを得てしまった感じ…

[OS X] iOSじゃないアプリを作ろうとしたら躓いた

XCodeでツールのインターフェースは共通だし、基本のクラス名も同じっぽいのでサクッと作れたりするのかしら…と思ってOSXのアプリのプロジェクトを作ってみたけど、なんか全然思うように書けない。。

そもそもiOSの実装も基礎ができてないということかもしれないが、ちょっとCocoaを調べることにした。

そもそもCocoaって何?

OSXのUI層部分のアプリケーション構築用のフレームワーク(というか、API群)。
AppKitとも呼ばれる。125のクラスとプロトコルから構成されていて、すべてのクラスはNSObjectから派生する。

OSXで動くアプリケーションの素になるフレームワーク。という理解でよさそう。

ちなみに、旧OSであるMacOSはCarbonって名称のAPIがあった。

iOSもCocoa-touchってフレームワークを使うので、基本部分は共通のはず。
ただベースになっているOSが同じわけではないし、共通する部分がある。という感じなんだろう。

Cocoaでウィンドウアプリ作るにはどうすれば?

こういう時は、素直に開発会社のチュートリアルに従うまでです。

ここがデベロッパ向けの情報サイト:Mac Developer Library

Start Developing Mac Apps Today というページがあったので、まずはここからみてみよう。

はじめての Mac アプリ(Your First Mac App)

Jump Right Inのページの最後にあるリンクを辿ると説明されている。
この “はじめてのアプリ” は、ウィンドウに3つのコントロール(Text-field, Slider, Button)を置いたアプリ。

…なんだけど、どっちかというとその説明に結構詳しいXCodeの基本説明が書いてある。
ただその説明は基本折り畳まれているので、ふんふんこんなもんなのね…みたいな感じで飛ばし読みすると、あとで訳がわからなくなるかもしれないので、ちゃんと中を確かめながら読み進めたほうがいいかもしれない。

というか、知ってる人はこんなの読まないし、これを読んでる人はちゃんと目を通そう。

たとえば Getting Startedのページでは、こんな事が書かれてますね。

  • プロジェクトの作り方
  • テスト実行の方法
  • main.mファイルの説明
  • .xibファイルの説明(プロジェクト作成時にStoryboard使うにチェックを入れると、このファイルはないので注意)

はじめてのアプリですが、以外と難しい話がガンガン飛び出すので結構覚悟して読まないとあっという間に挫折しそうです。
わからないことは何度でも読んで動かして、ゆっくり理解する必要があると思いました。

これができたら、次に読むのは Mac App Programming Guide かな。

Cocoa Drawing Guide という描画周りのガイドも見つけたけど、なんだか基本の作りを覚えるのが大変なので、本来やりたい部分まで到達するのに時間が掛かりそう。

自分が最初に作ってみようと思ったのは “おえかきアプリ” だったのだけども、これは意外に基本原理からすると面倒な感じかもしれない。。
サンプルを見つけたので貼っておく。AppleのチュートリアルのようなAction,Outlet,Delegateによる作りではないけども、イベントハンドラがコントローラだと考えればMVCモデルと言えなくもない。Windows系でよく見掛ける作りなので、個人的には理解しやすいけども。)

あとで気づいたのだが…

Start Developing Mac Apps Today をさらに読み進むと、Basic Tasks のページでようやく NSObjectなどの説明を行う Acquire Foundational Programming Skills という話題になった。
さらに次のページが Frameworks, Design Patterns, Human Interface Design, App Designと続く。

そもそもこんなに GettingStart が長いと思ってなかったけど、URLを見ると referencelibrary/GettingStarted/RoadMapOSX の文字が…そりゃ長くても当然かもしれんね。。

[XCode] バックスラッシュの入力

めも。

XCodeでコードを書いていて、ふと円記号とバックスラッシュが異なることに気がついた。
バックスラッシュを明示的に書けるのか…と。

バックスラッシュ(\)を素早く入力

XCodeというか、これはOSXが2つ共扱えるって話か。
Windowsだとどっちかだけだよな、なんで違うんだろう?

[Xcode] 画面が狭い!と思いながら線を引かなくていい

 StoryBoardでセグエの設定をしたりする場合に、トリガーになる部品から関連付けの線を引く操作がありますが、基本等倍サイズで行う作業なので、ノートPCだと狭くて大変..と思っていました。

 数日使ってようやく発見。

 ナビゲーションエリア側からも線を引っ張れるので、まず線を引く元の部品をアクティブにしたら画面をスクロールして、線を引く対象を表示した状態に。

 その後、ナビゲーションエリア側でアクティブになっている部品名称から線を引っ張ればOKでした。
editLineFromNavigation

[iOS] カスタムクラスの作成方法

 カスタムクラスとは…
  SDKで提供されているクラスを継承し、新たなクラス実装を定義したもの。

 別の言い方だと、作成するアプリケーション専用にカスタマイズした機能を持つクラスを作ることです。
 ベースになる機能は継承元のものを引き継ぎつつ、部分的に異なる振る舞いをしたり、追加の機能を提供したり。しかし、どれだけ面倒なことか…ということもなく。
 本来SDKで提供されるクラス(部品)は汎用的に振る舞えるように作られたもので、アプリが必要とする特定の振る舞いは空の状態のものです。

 この空の部分に、アプリ専用の実装を組み込んだ新しいクラス作るのも、カスタムクラス作成の基本的な利用方法のひとつです。


■クラスファイルを作る
 Xcodeでクラスファイルを作るには、File > New > File.. を選択。
 iOS開発の場合は、iOS(Source) > Cocoa Touch Class から、クラスファイルを作成します。
templateForNewFIle

 次いで、新しいクラス名称(=ファイル名)や継承元のクラス(ベースクラス)の指定を行います。
newFilenameForNewClass

 最後にファイルの保存先を指定すれば、クラス作成は完了。
 基本的には、自分のアプリケーションフォルダの下です。
 ※画像だと「myTestApp」。作ったクラスは「ViewControllerPage3」。
fileLocation


■クラスファイルを、実際のViewControllerと関連付ける
 クラスファイルを作っても、それだけではどの部品と関連付くのかを指定しなくては、実際に作ったアプリから呼び出されることはないので、関連付けを行います。

 StoryBoardを開きナビゲーションエリアの部品リストを見ると、ViewControllerが3つあり、内ひとつに「View Controller Page3」と名称を振っています。
navigationAreaViewCtrPage3

 ユーティリティエリアの方を見ると、CustomClass項目のClass名に「ViewControllerPage3」と記入されているのが分かります。(「View Controller Page3」を選択状態の場合のものです)
utilityCustomClass

 このように、部品の CustomClass > Class 項目に対応するクラス名を記入することで、部品と作成したクラスファイルの関連付けを行えます。

 関連付けを行った後は、クラスファイルに対応する部品の振る舞いを実装することで、アプリ開発を進めることができます。

 →カスタムContent View Controllerの作成 @iOS View Controller
プログラミングガイド.pdf

[Xcode] 最初やり方が判らなくて困ったこと

 セグエでの画面遷移とか基本コーディングレスでも済むのですが、遷移時になにかしら同時に処理をしたいとか、ボタンを押すと画面を戻すという場合には、コードを書く必要があります。

 記述内容が判っていれば、Xcodeの自動コード生成に頼らなくてもできるので、別に知らなくても困らないと言えば困らないのですが…判らないのもちょっと恥ずかしいっぽいかなーと思ったので、調べたんです。。

 判らなかったのは、こんな感じにボタンのイベントハンドラを生成したいって、この操作。

xcode_autocoding

 最初は幾らやっても、insert〜 みたいな下線が出なくて悩んだんですよ。。
 で、やり方ですが、

 まず、エディタのモード(画面の右上のボタンのうち、Editorの項目)を、真ん中に合わせる。
 そうすると、StoryBoard作業画面の右側にコード表示される領域が現れます。
xcode_editor_mode

 ここまでは判るんですが、次からがよくわかってなかった..orz

  • まず、ボタンをちゃんと選択しておく。
  • そうしたらcontrolキーを押す。
  • そのままボタンをドラッグ操作で右脇のコード表示画面に線を引っ張る。
  • 線をコードのクラス名のところにポイント。
  • そのままドロップする。

 て、感じで出来たんですが、なんかたまにこういうのが判らないんですよね…

[iOS] スワイプやフリックで画面遷移

 画面遷移の為にボタンがあるのも前時代的だしジェスチャーで遷移するとか誰か考えてないかと思ったら案の定…というわけで、めも。


 「ジェスチャー」というのは、画面上でどのように指を動かすのかという入力方法のことであり、またどう動かしたかを検知するしくみの事でもある。

 →今さら聞けないiOSシミュレータの使い方&機能まとめ

■タッチアンドホールド
 長押し。

 ■フリック
  長押しの派生で、長押し状態から更に指を一定方向に滑らせるようにして放す動作。(はじく、と説明があるので、それなりに素早く動かす必要がある。)

■ピンチ
 2本の指を少し離して画面に置く。(親指と人差し指)
 指を画面上で滑らせて、つまむように各々の指を近づける。

■ローテーション
 2本の指を画面に置く。
 どちらかの指を支点にもう片方の指を、画面上に円を描くように動かす。
 ※両方の指を動かす場合は、2本の指が同一方向に平行移動せず、各々逆方向に動かす。

■スワイプ
 指を画面に置く。
 左右いずれかに指を滑らす。
 ※指の本数は実装による。

■タップ
 1本指で画面を軽く叩くようにする。指はすぐに浮かせる。
 ※マウスで言うところのクリック。プロレスのタップと同じ意味。

■スクロール(ドラッグ)
 1本以上の指を画面に置き、指を滑らせる。
 アプリケーション的には、何かアイテム上で操作した場合はドラッグ。単に画面を表示している場合はスクロール動作を提供する。

 動作の切り分けは、アプリの設計や実装に依存している。


 [XCODE]スワイプしたら、前画面に戻るiPhoneアプリの実装方法

 ジェスチャー機能のベースクラスは UIGestureRecognizer
 継承クラスは、以下の通り。
 ※フリックは、名前が違うけど UILongPressGestureRecognizerで実現できる。

[iOS] ViewController

めも。

 上が切れているけど、StoryBoardの作業領域に配置されたViewController。
 等倍表示の際は、下の名称部分がアイコン表示になる。

story_board

 アイコンは3つ。左から、下記の通り。

  • ViewController
  • First Responder
  • Exit

story_board2

■ViewController
 ViewController 自体を選択し、Xcode作業領域右端にあるユーティリティ・エリアに情報を反映させる際に使うアイコン。
 ViewController以外の部品だと、部品に対応するクラス名称が表示されます。

■FirstResponder
 XcodeのInterfaceBuilder周りのことを少し知っておいた方が判り易いですが、ビューが最初に応答するオブジェクトのことを FirstResponder と呼びます。
 →ファースト・レスポンダの詳細については、こことかこことか。

 この場合はViewController本体のイベント・ハンドラのことを指します。(※ファースト・レスポンダの場合、「タッチ以外の通知」が届くらしい。「タッチの通知」は、レスポンダ・チェーンの優先度順。またファースト・レスポンダは各ウィンドウに1つだけ。)
 ・イベント… キーが押された・クリックされた、というようなViewControllerに対しての通知のこと。
 ・ハンドラ… 取り回しを実際に執り行う処理のこと。

■Exit
 そのものをズバリ詳説している方がいたので、リンクを張っておきます。
  →StoryboardのUnwind Segueの使い方

 要点は2つ。

  • セグエのUnwindをコーディングで実現するのに用意されたしくみ
  • Unwindする際のデータ受け渡しをするしくみ

 Youtubeで説明している方を見つけたので、これも張っておく。

[iOS] 複数のStoryBoardファイルを使って画面遷移

 ちょっと複雑な画面構成になると大変そうな気がしたので調べた際の、めも。
 調べてみるうちに、StoryBoardを複数人で編集する際のコンフリクト問題を避ける意味合いで使っている人たちがいる事も判ってきた。。

 [iOS] 複数のStoryboardを使って画面遷移を作成する

 複数のStoryboardファイルを使ってViewの遷移を行う方法

 複数のstoryboardを使って、コードで画面遷移を実装する(要:Xcode6 & Swift)

A Short Practical Guide to Blocks

A Short Practical Guide to Blocks

  • BlocksはCocoa開発における強力な機能
  • それらはクロージャやラムダに似ている(※ということは、本来は結構理解は難しい系統。でも使いどころを絞ってみれば、便利な機能がいろいろあるはず。こことか参照してみるのもアリか..)
  • より詳細な理解が必要ならば、Blocks Programming Topics(日本語版はこちら)を参照すること
  • なぜ Blocksを使うのか
    • 作業単位のカプセル化と実行が容易になる
      (※マクロ的に処理を固めて、処理ごと別関数に渡すような機能を実現できる)
  • システムフレームワークAPI内のBlocks
    • Blocksを使う動機のひとつ:パラメータににBlocksを利用することで機能増加を図る
    • 概要の説明:フレームワークを理解する助けとして
    • Completion and Error Handlers:非同期処理のハンドリング
    • Notification handlers:通知のハンドリング
    • Error handlers:エラーのハンドリング
    • Enumeration:静的配列(※たぶん…)
    • View animation and transitions:ビューのアニメーション及びトラジション
    • Sorting:ソート方法
  • Blocks と 平行性(並列処理的な特性)

ラムダ式について、wikipediaにそれなりに判り易い説明があった。
ラムダ計算#非形式的な概説

基本的には、計算式(=操作)を(変数に置き換える..という意味において)数値のように扱う為の考え方なんですね..

例えば、数式「1+2」は抽象化されていないとても具体的な操作ですが、「x+y」と書くとそれは抽象的な加算操作だけを表します。(幾つと幾つを足し合わせるかは実際に値を貰った際に決まることとして、”足し合わせる”操作が定義されている。)

でもって、wikipediaの説明を引用すると..

f(x) = x + 2
から

λx. x + 2
と定義できる。

λx    .  x + 2
入力 . 出力
という 表現になる。

この関数に 3 を適用した場合(これは、以下のように考える)

f(3) = (λx. x + 2) 3
と書ける。
以上のことから

f x y = (f x) y
という抽象化された操作が定義される。

f(x) = x + 2 である時に、
式に3を引数として与えた f(3)
※上記 f(x) を内包する新たなラムダ式らしい..
これをラムダ式で書くと

λf. f 3
※「λf.f(3)」 じゃなく 「λf. f 3」 と書くらしい..
※f は関数。このあと f(x) = x + 2 が納まる。

これに式「x + 2」を適用すると
※ f(x) = x + 2 は、
※ λx. x + 2 と書くので

(λf. f 3) (λx. x + 2)
と書けるそうな。

ここまでの定義によって、
以下の3つの式は、全て同じ意味を成すようになる。

(λf. f 3) (λx. x + 2)

↓上記式の左辺を展開した形
(λx. x + 2) 3

↓上記式の左辺を展開した形
3 + 2

プログラム的にみると、「(λf. f 3) (λx. x + 2)」は、(λf. f 3)が関数で (λx. x + 2)は引数の扱いなんですよね..

このことからも見えてくる通り「ラムダ式表現ができる」ということは、
通常のプログラムに見られる「数値を引数に取る」動きではなく、「”操作”を引数に取る」動きが実現されるわけです。

ラムダ式を勉強すると、カリー化という概念も登場しますが、Pythonには関数と引数をひと括りにまとめるカリー化機能がありますね。
..概念的には同じなのかな?


クロージャの説明を見つけたので貼っておく。
Python Tips:Pythonでクロージャを使いたい

もっと優しめの
[JavaScript] 猿でもわかるクロージャ超入門 1 問題

上のを詳細に考察している感じのもの(2例)
クロージャと高階関数
なぜクロージャ(Closure)と言うのか?


カリー化
カリー化

正直処理的・実装的にどういうものかピンときてない。

f(x,y) = c

上記式が成り立つ場合に、
以下の形でも成り立つ式・実装をカリー化と呼んでいる。

f(x)(y) = c

ラムダ式の処理を、引数を1つずつ順に取る処理にできる。
というメリットがあるわけだけども、どうやって成り立たせるのかとか、不明な点だらけ。

上記の「f(x)(y) = c」は処理的には、以下の2ステップになる。

f(x) = g
g(y) = c
※ g というのは仮の変数名。
※関数オブジェクトが返されて yを引数に取る。

iOS developer libraly

 iOS開発情報サイトはここ。ということで、めも。

iOS developer libraly

日本語翻訳版
※往々にして翻訳版は、情報が遅い・古い・更新がなくなる…と言ったことが起きるので、必ず英語版も確認した方がいいと思います。。

 まずは、iOSアプリケーション プログラミングガイドを読むところから…かな。ただプログラミング・ガイドといっても「iアプリ作成手順」的な話は一切なくて、アプリケーション構成的な話です。