build CFDG with macOS

macOSでcfdgをbuildする

cfdg の command line 版が欲しかったのだけどmacOS版は公式 release package に含まれてないのでどうやら自分で build するしかない。 ググっても全然出てこないのでたぶん必要な人は少なさそうだけど、自分でbuildした顛末を記す。

  • macOS Monterey version 12.0.1
  • Xcode 13.1
  • Homebrew 3.3.5

source は GitHub から取ってくる。

git clone https://github.com/MtnViewJohn/context-free.git

追加で必要なものをhomebrewで入れておく

brew install bison flex libagg libpng

command line 版をbuildするには、 Xcodecontext-free/Context Free.xcodeproj を開いて、 Product → Scheme から cfdg を選んで ⌘B

たぶんbuild errorになるけど、以下、一々fixのやりかた。

(1) code signing

error: No signing certificate "Mac Development" found:

正しくはApple Developer Programに加入すればいいのだろうけどどうせ自分しか使わないので下記でやり過ごすことにする。

  • Project(Context Free) → TARGETS(cfdg) → Signing & Capabilities → Signing
    • Team: None
    • Signing Certificate: Sign to Run Locally

(2) bison が古い問題

macOS付属のbisonが 2.3で、いま必要なbisonは3以上みたいなので、homebrewで入れたやつに差し替える。 homebrew の flexとbisonはOS付属のやつと競合しないようにするために、PATHの通ったところには入らない様子。

  • Project(Context Free) → TARGETS(cfdg) → Build Rules → Lex source files using Script

    • (前) /usr/local/bin/flex
    • (後) $HOMEBREW_PREFIX/opt/flex/bin/flex
  • Project(Context Free) → TARGETS(cfdg) → Build Rules → Yacc source files using Script

    • (前) /usr/local/bin/bison
    • (後) $HOMEBREW_PREFIX/opt/bison/bin/bison

flexのversionは2.6.4でOS付属のやつと同じだったけど念の為flexもhomebrew版にしておく。

(3) libpngとlibaggを追加

#include "agg2/agg_basics.h"

などで not found になるので、libaggとlibpng の header fileのある場所をheader search pathに追加すればよい。

  • Header Search Pathに追加
    • $HOMEBREW_PREFIX/include
  • Libarry Search Pathに追加
    • $HOMEBREW_PREFIX/lib

困ったことに agg で keyword register が compile error になってしまう。

  • homebrew版 Anti-Grain Geometry (AGG) - Version 2.5
  • context free同梱版 Anti-Grain Geometry - Version 2.4

context free同梱版の src-agg だとcompileは通るので、とりあえずそっちに。

  • Header Search Pathに追加(homebrewのinculdeよりも上に)
    • path to context free/src-agg

headerとlibagg.a がズレるけどそこからは目を逸らして。

(4) unicode/ucnv.h が無い

これはどこから持ってくるのが正解なのかよくわからないのだけど、公式っぽい匂いのする https://opensource.apple.com からmacOS 11.5 をたどって WTF を download した。 tar zxvf して中に含まれている icu を header search path に追加したらcompileできた。

  • Header Search Pathに追加
    • path to WTF-7611.3.10.1.3/icu

その icu/README にこんなこと書いてあるのでたぶんこのやりかたで良いはず。

macOS releases include the ICU binary, but not ICU headers.

(5) flex が吐いた source で error

Out-of-line definition of 'LexerInput' does not match any declaration in 'CfdgFlexLexer'
Out-of-line definition of 'LexerOutput' does not match any declaration in 'CfdgFlexLexer'

どうやら FlexLexer.h とズレているっぽいので、 homebrewのflex/includeを header search path に追加してやればよいらしい。

  • Header Search Pathに追加
    • $HOMEBREW_PREFIX/opt/flex/include

ここまででbuildは成功するはず。

(6) 実行時error

code signing の問題で libpng16.16.dylib に対して not valid 的なerror message が出る。

Disable Library Validation にすることで、ここは乗り切る。

  • Project(Context Free) → TARGETS(cfdg) → Signing & Capabilities → Hardened Runtime
    • [✓] Disable Library Validation

使い方

cfdg -s 500 input/tree.cfdg tree.png

例 フォルダ内にある *.cfdg ファイルを全て png 化する bash スクリプト

for f in *.cfdg ; do cfdg -s 500 $f ${f%.*}.png ; done

2D Strange Attractors

カオスである。Strange Attractor を Scratch で実装する、というのに凝ってしばらくハマっていた。 Strange Attractor とは何かなどについては この辺。 キーワード "strange attractor", "chaos attractor" などで画像を検索すると、いろんな図が見つかって面白い。だいぶ溜まってきたのでリンク集がてらまとめておく。3Dは別エントリ。

2DのStrange Attractorはだいたい次のような漸化式で定義される。

 \begin{cases} x_{n+1} = f_x \left(x_n, y_n \right) \\ y_{n+1} = f_y \left(x_n, y_n \right) \end{cases}

これに適当な  \left(x_0,y_0\right) を与えて得られる各々  (x,y) をプロットしていくと奇妙な図形ができ上がる、というもの。

続きを読む

既存のiOSアプリをUIScene対応するやり方

(0)前提

  • 既存アプリA…iOS12以前で UIApplicationDelegate のライフサイクルで動くやつ
    • UIはStoryboardベース
  • 参考アプリB…iOS13以降で UIWindowSceneDelegate のライフサイクルで動くやつ
    • Xcode11でHello World的なやつを新規作成すればよい
    • 必要なら Supports multiple windows に✓

(1) Aに SceneDelegate.swift を追加する

中身はBからcopy&pasteする。 iOS12以前をサポートするなら class の属性に @available(iOS 13.0, *) をつける。

(2) Aの AppDelegate に UISceneSession Lifecycle の func を追加する

以下の2つ

 func application(_:configurationForConnecting:options:)->UISceneConfiguration
 func application(_:didDiscardSceneSessions:)

コードはBからcopy&pasteする。 iOS12以前をサポートするなら extension または func の属性に @available(iOS 13.0, *) をつける

(3) AのInfo.plist に UIApplicationSceneManifest キーと値を追加する

中身はBからcopy&pasteする。 下記3つのキーの値を実際のコードに一致させる。

  • UISceneConfigurationName
  • UISceneDelegateClassName
  • UISceneStoryboardFile

Scratch で Generative Art (2)

前にお勧めしないとか書いた気がするけど、自分では面白がってやっている。天の邪鬼である。 ペンの軌跡をフェードアウトするやり方に最近気づいたので、 Processingやp5jsのコードをScratchで実現させてみるということをやっている。

スクリーンショット

f:id:hrt1ro:20191127111645p:plain

アニメーションGIFはサイズがでかすぎて上がらなかった。

リンク

https://scratch.mit.edu/projects/343602041

iframeで埋め込み

Perlinノイズに従って点を動かす、その際ペンの軌跡を描く、背景を半透明で塗りつぶす、 の組み合わせでなんとなくアートっぽくなるのが面白い。これが創発というものであろうか。

Context Free Art

10年ぶりくらいにContext Free Artを触ったら言語のバージョンが上がっていた。 ぐぐっても前のバージョンで書かれたものが多いみたいなので、少しでも新しいバージョンを増やしてみよう。

startshape tree

shape tree
rule {
  SQUARE []
  tree [y 0.98 size 0.99 rotate 1]
}
rule 0.02 {
  tree []
  tree [rotate -30 flip 90]
}

f:id:hrt1ro:20191126190819p:plain