2017年12月10日日曜日

三島haskell無名関数の会@REPUBREW

三島haskell無名関数の会を開きました


とりあえず、復活させたはいいけど、@fmkz___ と2人、まぁ予想通りということで、REPUBREWで飲みながらに変更。


お互いコンピュータ使ってますが、畑が違うと謎なところが多すぎて、アホな質問したり、


Ramチョップうまかった、


静岡言語戦争の歴史についてぶり返したり、PHP、Perl愛についてはなしたり、おもしろかった。


awabiやsazaeを頻繁に食す文化のため、こういったムール貝は新鮮に感じて、非常においしかった、またビールにあう。


酔いが回って、大脳皮質をやられてきたところで、「圏論の歩き方」で洗脳され、尿酸値MAX...


さらにアルコールを注入、きずいたら、アマゾンでポチッテいました、あさってグライに届くようです。


最後に、総仕上げでグラスワイン、5時間グライ飲み続けて完全体になりました。


その後、コンビニで命の水を追加し、夜景をみながら、おうちに帰りました。

いったとこ


REPUBREW

今後も月一回ペースでやりたいと、思っています、急に、飲み会に変更する恐れもありますのでご注意ください。


2017年11月26日日曜日

ファイルの種別判定にはlibmagic使おう

ファイルの種類を判定する


ファイルの種類を判定するのに拡張子から判定するやり方だと、ちょっと乱暴な感じがしたので調べてみた。
思い浮かぶのがmagicぐらいしかないので、素直にやってみた。

fileコマンドが使っているライブラリ


多分fileコマンドのパッケージと一緒に入るライブラリにlibmagicっていうのがあって、これがmagicデータベースからファイル種別を判定してくれる。

gentooだとここにあるよ
cuomo@ugui7 ~ $ file /usr/share/misc/magic.mgc
/usr/share/misc/magic.mgc: magic binary file for file(1) cmd (version 14) (little endian)

haskellで書いてみた


haskell-magicをいれる

ugui7 ~ # emerge dev-haskell/magic

コードから使ってみる
import Magic
import Control.Monad (forM_)

main :: IO ()
main = do
  magic <- magicOpen []
  magicLoadDefault magic
  forM_ fileList $ \path -> do
    magicFile magic path >>= putStrLn

fileList :: [String]
fileList = [
      "mishimahs2_original.jpg"
    , "ero_dehanai.wmv"
    , "jp106.map.gz" ]

cuomo@ugui7 ~/Code/haskell/magic $ runhaskell FileMagic.hs
JPEG image data, JFIF standard 1.01, resolution (DPI), density 100x100, segment length 16, baseline, precision 8, 624x468, frames 3
Microsoft ASF
gzip compressed data, max compression, from Unix
cuomo@ugui7 ~/Code/haskell/magic $

fileコマンドと同じ出力をとれる
ちなみに、magicOpen関数の引数にMagicMimeTypeを設定すると

image/jpeg
video/x-ms-asf
application/x-gzip

ちゃんとmimeがとれる、その他指定できるフラグは
data MagicFlag
  = MagicNone
  | MagicDebug
  | MagicSymlink
  | MagicCompress
  | MagicDevices
  | MagicMimeType
  | MagicMimeEncoding
  | MagicMime
  | MagicContinue
  | MagicCheck
  | MagicPreserveAtime
  | MagicRaw
  | MagicError
  | UnknownMagicFlag Int

があるます、おおむねfileコマンドのオプションに指定可能なものがフラグになっているぽい

ファイル種別でした...


2017年11月18日土曜日

Yesodでファイルアップロードサイズを調整する方法

Content Lengthで調整


Yesodで、デカいファイルをアップロードすると、エラーが発生する

POST /list/0
  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  Status: 413 Too Large 0.000029971s


ファイルのアップロードサイズというか、ContentLengthの調整で対応


設定ファイルからサイズを取れるようにする


* config/settings.ymlに追加

# Content Length Max MB
max-byte: 50

* src/Settings.hs
data AppSettings = AppSettings
...
    , appMaxByte                :: Word64
    -- ^ Content Length Max MB
...

FromJSONのインスタンス設定も修正
instance FromJSON AppSettings where
    parseJSON = withObject "AppSettings" $ \o -> do
        let defaultDev =
...
...
  appMaxByte <- o .:  "max-byte"
..

maximumContentLength関数を実装する


設定を取得してその値を元に、ContentLengthの上限を設定する
instance Yesod App where
...
...
    -- Content Length Max
    maximumContentLength app _ = do
        let size = appMaxByte $ appSettings app
        return $ size * 1024 * 1024 -- MB
...

これでデカいのがあがるようになる