build CFDG with macOS
macOSでcfdgをbuildする
cfdg
の command line 版が欲しかったのだけどmacOS版は公式 release package に含まれてないのでどうやら自分で build するしかない。
ググっても全然出てこないのでたぶん必要な人は少なさそうだけど、自分でbuildした顛末を記す。
source は GitHub から取ってくる。
git clone https://github.com/MtnViewJohn/context-free.git
追加で必要なものをhomebrewで入れておく
brew install bison flex libagg libpng
command line 版をbuildするには、
Xcodeで context-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
Peter DeJong Attractor
2D strange attractor の一種 Peter DeJong attractorをp5.jsで書いた。
続きを読むてがきシェルピンスキーのギャスケット
handwritten Sierpinski gasket
既存の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で実現させてみるということをやっている。
アニメーション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] }