MySQLとHaskellで絵文字のやり取りをする
MySQL
側はテーブルのcharset
をutf8mb4
などにする。(utf8
ではない)
haskell
側はString
で扱いputStrLn
などを使う。(print
はコードポイント(?)で表示されてしまう)
HaskellでMySQLの地理情報を扱いたい(3)
GeoJSONでのやり取りもなんか出来てるっぽい。(未コミット)
MySQL <--> GeoJSON <--> Haskell (Client driver + geojson library)
‘Distribution.Package’ does not export
geojson
パッケージをビルドした時に
‘Distribution.Package’ does not export ‘PackageName(PackageName)’
というエラーでビルドに失敗しました。
エラーになっているファイルはSetup.hs
ファイルです。
module Main (main) where import Distribution.Simple main :: IO () main = defaultMain
依存関係の整合性がなくなったためと思われます。
2016年ごろからあるようですが、まだクローズされていないようです。
geojsonパッケージのインストール
aeson
パッケージの上のレイヤでGeoJSONを扱うためのパッケージです。
geojson: A thin GeoJSON Layer above the aeson library
hackage
では2018/02時点で、1.3.1
ですが、hackage
にアップロードされているモジュールと、github
にあるモジュールに差異があるようです。
hackage
ではDependencies aeson (>=0.8 && <1.0)
となっていますが、github
上ではaeson >= 0.8
となっています。aeson
自体も1.2.4
ですので、github
から取得したほうが良いでしょう。
また、geojson
自体の依存関係も最新に追いついていないようです。
validation
パッケージに依存していますが、最新の0.6
では、Validation
がエクスポートされていないということで、geojson
のビルドに失敗します。
とりあえずは、cabal
ファイルを下記のように書き換えてビルドはできるようになりました。validation
のパッケージを固定して、ワーニングは許容するようにしました。
(本来はgeojson
のほうを直すべきでしょうがわかりませんでした。)
$ git diff diff --git a/geojson.cabal b/geojson.cabal index 0c772e7..ec0d23e 100644 --- a/geojson.cabal +++ b/geojson.cabal @@ -41,7 +41,7 @@ library , text >= 1.2 , scientific >= 0.2.0 , transformers >= 0.3 - , validation >= 0.5 + , validation >= 0.5 && <0.6 , vector >= 0.10 exposed-modules: Data.Geospatial , Data.LinearRing @@ -61,7 +61,7 @@ library , Data.Geospatial.Internal.GeoPosition default-language: Haskell2010 ghc-options: -Wall - -Werror +-- -Werror test-suite geojson-test hs-source-dirs: test @@ -86,7 +86,7 @@ test-suite geojson-test , Data.Geospatial.Internal.GeometryTests default-language: Haskell2010 ghc-options: -Wall - -Werror +-- -Werror -threaded -O2 @@ -98,6 +98,6 @@ test-suite geojson-hlint , hlint default-language: Haskell2010 ghc-options: -Wall - -Werror +-- -Werror -threaded -O2
MySQLでのGeometry型のselect
テキストで取得
mysql-sql> select st_astext(geo) from geo_tbl; +--------------------------------------------------------------------+ | st_astext(geo) | +--------------------------------------------------------------------+ | POINT(30 10) | | LINESTRING(30 10,10 30,40 40) | | POLYGON((30 10,40 40,20 40,10 20,30 10)) | | POLYGON((35 10,45 45,15 40,10 20,35 10),(20 30,35 35,30 20,20 30)) | | POINT(1.5 2.5) | | POINT(1.5 2.5) | | POINT(1.5 2.5) | | POINT(1.5 2.5) | | POINT(1.5 2.5) | +--------------------------------------------------------------------+ 9 rows in set (0.01 sec) mysql-sql>
GeoJSON
で取得
mysql-sql> select st_asGeojson(geo) from geo_tbl; +------------------------------------------------------------------------------------------------------------------------------------+ | st_asGeojson(geo) | +------------------------------------------------------------------------------------------------------------------------------------+ | {"type": "Point", "coordinates": [30, 10]} | | {"type": "LineString", "coordinates": [[30, 10], [10, 30], [40, 40]]} | | {"type": "Polygon", "coordinates": [[[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]]]} | | {"type": "Polygon", "coordinates": [[[35, 10], [45, 45], [15, 40], [10, 20], [35, 10]], [[20, 30], [35, 35], [30, 20], [20, 30]]]} | | {"type": "Point", "coordinates": [1.5, 2.5]} | | {"type": "Point", "coordinates": [1.5, 2.5]} | | {"type": "Point", "coordinates": [1.5, 2.5]} | | {"type": "Point", "coordinates": [1.5, 2.5]} | | {"type": "Point", "coordinates": [1.5, 2.5]} | +------------------------------------------------------------------------------------------------------------------------------------+ 9 rows in set (0.02 sec)
Gistのprivateとpublicの変換
private
なGist
を作っていたとする。
Edit
を押す。
Make Public
を押すと、private
からpublic
に変わる。
HaskellでMySQLの地理情報を扱いたい(2)
いろいろなGeometry
のselect
と、insert
のサンプル