Subscribed unsubscribe Subscribe Subscribe

F# Monkey

about

もつ串 おいしい

Food

串にもつが

ビールと一緒に食べるとうまい〜

福岡に来た時はトライする価値あり〜

Like this

f:id:callmekohei00:20161227110612p:plain

Location

福岡の地下鉄・天神駅という駅の近く

駿台予備校の裏

お店の名前は此乃美

Tabelog

konomi






Remove all ads

F# and Neovim

F# Vim

Summary

How to use vim-fsharp on Neovim

Like this

f:id:callmekohei00:20161225143010p:plain

Environment

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.2
BuildVersion:   16C67

$ uname -v
Darwin Kernel Version 16.3.0:
Thu Nov 17 20:23:58 PST 2016;
root:xnu-3789.31.2~1/RELEASE_X86_64

Reinstall CommandLineTools

$ sudo rm -rf /Library/Developer/CommandLineTools
$ xcode-select --install

Reinstall home brew

$ sudo rm -rf /usr/local/Cellar /usr/local/.git && brew cleanup
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install )"
$ brew update
$ brew doctor // Follow directions ( e.g brew prue )

Reinstall local python

// check site location
$ python -m site

// delete packages
$ sudo rm -rf /usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages
$ sudo rm -rf /usr/local/lib/python2.7/site-packages
$ sudo rm -rf /Users/kohei/Library/Python/2.7/lib/python/site-packages

// delete include file
$ sudo rm -rf /usr/local/include/python*

// reinstall python
$ brew uninstall -f python
$ brew install   python
$ pip  install   --upgrade pip setuptools

// reinstall package ( -I is very important )
$ sudo -H pip2 install --upgrade -I neovim

Install mono

$ brew install mono

Install Neovim

$ brew install neovim

Setting Noevim

// create nvim folder and init.vim file
$ mkdir .config/nvim
$ vim   .config/nvim/init.vim

// create dein folder and dein.toml file
$ mkdir .config/nvim/dein
$ vim   .config/nvim/dein.toml

Contents of init.vim

"----------------------------------------------------------
" For Shougo/dein.vim
"----------------------------------------------------------

" Set your path
let s:dein_dir = '/Users/kohei/.config/nvim/dein'
let s:toml     = '/Users/kohei/.config/nvim/dein.toml'


let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'

if !isdirectory(s:dein_repo_dir)
  execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
endif

execute 'set runtimepath^=' . s:dein_repo_dir

if dein#load_state(s:dein_dir)
    call dein#begin(s:dein_dir)
    call dein#load_toml(s:toml, {'lazy': 0})
    call dein#end()
    call dein#save_state()
endif

if dein#check_install()
    call dein#install()
endif

filetype plugin indent on
syntax   enable

"----------------------------------------------------------
" For Neovim's Python2 provider
"----------------------------------------------------------

let g:python_host_prog = '/usr/local/bin/python'

Contents of dein.toml

[[plugins]]
repo        = 'Shougo/dein.vim'

[[plugins]]
repo        = 'ervandew/supertab'

[[plugins]]
description = 'F# support for Vim'
repo        = 'fsharp/vim-fsharp'
lazy        = 1
on_ft       = 'fsharp'
build       = 'make fsautocomplete'






Remove all ads

Fsi on Suave

F# Vim

Summary

  1. Fsi works on Suave server
  2. The result of F# code execution is Showed by Quikrun ( Quickrun is Vim's plug-in )

Like this

launch Suave server
f:id:callmekohei00:20161218100126p:plain

QuickRun
f:id:callmekohei00:20161218223916p:plain

Errors appear properly
f:id:callmekohei00:20161218224035p:plain

Hello World on Suave

Code example

// file name is abc.fsx

#r @"./packages/Suave/lib/net40/Suave.dll"

open Suave

startWebServer defaultConfig (Successful.OK "Hello World!")

Compile and run command

$ fsharpc -r:./packages/Suave/lib/net40/Suave.dll abc.fsx

$ mono bin/abc.exe 
[I] 2016-12-13T05:24:05.7818190Z: listener started in 114.057 ms with binding 127.0.0.1:8083 [Suave.Tcp.tcpIpServer]

Access to port 8083

~$ curl -w '\n' 'localhost:8083'
Hello World!

Hello World on Fsi

Example code

// file name is abc.fsx

open System
open System.IO
open System.Text

#r @"./packages/FSharp.Compiler.Service/lib/net45/FSharp.Compiler.Service.dll"
open Microsoft.FSharp.Compiler.SourceCodeServices
open Microsoft.FSharp.Compiler.Interactive.Shell

// Intialize output and input streams
let sbOut      = new StringBuilder()
let sbErr      = new StringBuilder()
let inStream   = new StringReader("")
let outStream  = new StringWriter(sbOut)
let errStream  = new StringWriter(sbErr)

// Build command line arguments & start FSI session
let argv       = [| "/usr/local/Cellar/mono/4.6.2.7/lib/mono/fsharp/fsi.exe" |]
let allArgs    = Array.append argv [|"--noninteractive"|]
let fsiConfig  = FsiEvaluationSession.GetDefaultConfiguration()
let fsiSession = FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, outStream, errStream)

fsiSession.EvalInteraction "printfn \"Hello, World!\""
|> stdout.WriteLine

run command

$ fsharpi abc.fsx 
Hello, World!

Actual code

To quickrun on vim needs 3 scripts

fsiOnSuave.fsx    fsi on suava
fio.bash          send file path to suave
setting file      setting file of quickrun


fsiOnSuave.fsx

open System
open System.IO
open System.Text

#r @"./packages/FSharp.Compiler.Service/lib/net45/FSharp.Compiler.Service.dll"
open Microsoft.FSharp.Compiler.SourceCodeServices
open Microsoft.FSharp.Compiler.Interactive.Shell

#r @"./packages/Suave/lib/net40/Suave.dll"
open Suave
open Suave.Operators
open Suave.Successful
open Suave.Filters
open Suave.RequestErrors

module Util =

    // Wrap text at arbitrary place
    let orikaeshi (str:string) (returnPoint:int) =

        let sb = new System.Text.StringBuilder("")
        let mutable len = 0

        str
        |> Seq.iter( fun c ->
            len <- len + 1
            if len >= returnPoint
            then
                if   c = ' '
                then len <- 0
                     sb.AppendLine(string c) |> ignore
                else sb.Append(string c)     |> ignore
            else     sb.Append(string c)     |> ignore )

        sb.ToString()


module FsharpInteractive =
    open Util

    type Fsi (fsiPath:string) =

        // Intialize output and input streams
        let sbOut      = new StringBuilder()
        let sbErr      = new StringBuilder()
        let inStream   = new StringReader("")
        let outStream  = new StringWriter(sbOut)
        let errStream  = new StringWriter(sbErr)

        // Build command line arguments & start FSI session
        let argv       = [| fsiPath |]
        let allArgs    = Array.append argv [|"--noninteractive"|]
        let fsiConfig  = FsiEvaluationSession.GetDefaultConfiguration()
        let fsiSession = FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, outStream, errStream)


        member this.EvalScript (fp:string) =

            let fp = System.Web.HttpUtility.UrlDecode(fp)
            let result, warnings = fsiSession.EvalScriptNonThrowing fp

            sbOut.Clear() |> ignore
            sbErr.Clear() |> ignore

            match result with
            | Choice1Of2 ()  -> ()
            | Choice2Of2 exn ->

                exn.Message + "\n" |> stdout.WriteLine

                warnings
                |> Array.map ( fun w ->

                    let sb = new System.Text.StringBuilder()

                    let severity = match w.Severity with
                                   | Microsoft.FSharp.Compiler.FSharpErrorSeverity.Error   -> "error"
                                   | Microsoft.FSharp.Compiler.FSharpErrorSeverity.Warning -> "warning"

                    sb.Append(
                           "("  +  string w.StartLineAlternate + "-" + string w.StartColumn + ")"
                        +  " "  +  w.Subcategory
                        +  " "  +  severity
                        +  " "  +  "error:" + System.String.Format( "FS{0:0000}" , w.ErrorNumber )
                        +  "\n" +  (orikaeshi w.Message 65)
                        +  "\n"
                    ) |> ignore

                    sb.ToString() )

                |> Array.sort
                |> Array.distinct
                |> Array.iter ( fun s -> stdout.WriteLine(s) )


module Suave =
    open FsharpInteractive

    let evalScript (fsi:Fsi) =

        GET >=> pathScan "/evalScript/%s" ( fun fp ->

            // switch stdout to memory stream
            use ms = new MemoryStream()
            use sw = new StreamWriter(ms)
            use tw = TextWriter.Synchronized(sw)

            sw.AutoFlush <- true
            Console.SetOut(tw)

            fsi.EvalScript(fp) |> ignore

            use sr = new System.IO.StreamReader(ms)
            ms.Position <- int64 0
            ()

            ; OK (sr.ReadToEnd()) )

    let app (fsiPath:string) =

        let fsi = Fsi(fsiPath)

        choose [ evalScript fsi
                 NOT_FOUND "Resource not found." ]

    [<EntryPoint>]
    let main argv =
        let fsiPath = "/usr/local/Cellar/mono/4.6.2.7/lib/mono/fsharp/fsi.exe"
        startWebServer defaultConfig (app fsiPath)
        0

fio.bash

urlencoded_str=$(curl -s -w '%{url_effective}\n' --data-urlencode $1 -G '')
urlencoded_str=${urlencoded_str:2}
curl -s 'localhost:8083/evalScript/'${urlencoded_str}

setting file of quickrun

\     , 'fsharp': {
\           'exec'   :  [ '%c %s:p:r.fsx']
\         , 'command':  'fio'
\     }

How to create fio command

$ cp fio.bash fio

$ chmod 777 fio

$ sudo mv fio /usr/local/bin

Thanks

Japanese FSharpers! gitter.im








Remove all ads

R言語を使ってロト6を当ててみる!

R

この記事はR Advent Calendar2016 9日目の記事です ( see : R Advent Calendar 2016 - Qiita )

Summary

とつぜんですが、ロト6をあててお金もちになりたいです!

callmekoheiは!

で、R言語を使ってロト6の予測をしてみたいと思います!

Way

ロト6をあてるために

当たりやすい数字を組み合わせたいと思います

で、過去の実績から当たりやすい数字を調べてみます

Past data

みずほ銀行のホームページから過去の出目が公開されているのでこれをゲット!

www.mizuhobank.co.jp

こんな感じのcsvデーターにします。

1,2000/10/05,02,08,10,13,27,30
2,2000/10/12,01,09,16,20,21,43
3,2000/10/19,01,05,15,31,36,38
...
...

1128,2016/12/01,03,15,21,29,30,35
1129,2016/12/05,06,11,19,28,30,43
1130,2016/12/08,01,11,37,38,39,42

Vivid numbers

よく出る数字があるかどうか調べてみます

// 各数字ごとの当選回数をしらべる
~$ cat loto6.csv | csvcut -c 3,4,5,6,7,8 | tr ',' '\n' | sort -n | uniq -c | awk -F ' ' '{print $2 " " $1}' | column -c 50

01 145    09 137    17 152    25 161    33 150    41 143
02 155    10 164    18 156    26 153    34 149    42 157
03 157    11 153    19 159    27 181    35 158    43 160
04 151    12 173    20 160    28 158    36 159
05 154    13 158    21 165    29 145    37 169
06 174    14 157    22 163    30 162    38 175
07 143    15 163    23 167    31 164    39 165
08 159    16 158    24 145    32 156    40 147


// 各数字ごとの当選回数をグラフにしてみる
~$ cat loto6.csv | csvcut -c 3,4,5,6,7,8 | tr ',' '\n' | sort -n | uniq -c | awk -F ' ' '{print $2 " " $1}'|feedgnuplot --terminal 'dumb 60,25' --points --domain --unset grid --exit

                                                                                                                        
  185 +-+---+----+-----+----+-----+----+-----+----+---+-+   
      +     +    +     +    +     +    +     +    +     +   
  180 +-+                           A                 +-+   
      |                                                 |   
  175 +-+    A                                  A     +-+   
      |            A                                    |   
  170 +-+                                      A      +-+   
      |                         A                       |   
  165 +-+        A           A          A        A    +-+   
      |                A      A        A                |   
  160 +-+      A           AA     A           A       A-+   
      |  A          A A A            A       A       A  |   
  155 +-A   A             A               A           +-+   
      |           A      A         A                    |   
  150 +-+ A                                AA         +-+   
      |                                           A     |   
  145 +A+                        A    A               +-+   
      |       A                                     A   |   
  140 +-+                                             +-+   
      +     +   A+     +    +     +    +     +    +     +   
  135 +-+---+----+-----+----+-----+----+-----+----+---+-+   
      0     5    10    15   20    25   30    35   40    45  

うむむむ。

ざっとみとくになさそう。。。

Chaos

ランダムに出目がでてるか確認してみます

たとえば1から42の数字をテキトウに選ぶときの確率を調べてみます

~$ echo x | rio -e '1 - pchisq(10,42,lower.tail=T)'

0.9999999

実際の出目だとどうなのかテストしてみます

// 各数字ごとの当選回数をソートしたデーターを用意
freq='137,143,143,145,145,145,147,149,150,151,152,153,153,154,155,156,156,157,157,157,158,158,158,158,159,159,159,160,160,161,162,163,163,164,164,165,165,167,169,173,174,175,181'

// テストしてみる
echo x | rio -e 'chisq.test(c('$freq'))'


// 結果
Chi-squared test for given probabilities

data:  c(137, 143, 143, 145, 145, 145, 147, 149, 150, 151, 152, 153,     153, 154, 155, 156, 156, 157, 157, 157, 158, 158, 158, 158,     159, 159, 159, 160, 160, 161, 162, 163, 163, 164, 164, 165,     165, 167, 169, 173, 174, 175, 181)

X-squared = 22.752, df = 42, p-value = 0.9933

ふむふむ。

理論上0.9999999

実際の出目は0.9933

これをどう捉えるかなんですが、、、

Conclusion

たぶんでたらめに数字がでてるので、予想できない(かもしれない)

予想できんじゃん、、、。

はふーん。

Remove all ads

F#をたったの2週間でモノにする10のコツ

F#

この記事はF# Advent Calendar2016 2日目の記事です ( see : F# Advent Calendar 2016 - Qiita )

01: インテリセンスがつかえる環境でコードをかく

メモ帳とかでかくと多分インテリセンスが効かないです。

のでメモ帳とかでは書かない方がいいかもです。

これすごく重要です!

こんな感じでしょうか・・・

OS          IDE             Text Editor
----------------------------------------------------
Windows     Visual Studio   Visual Studio Code, Atom
MacOSX      Xamarin         Visual Studio Code, Atom
Unix        ???             Vim, Emacs

02: 基本的な型はおぼえておく

こんな感じで。まぁ、なんとなくで。

value                type             meaning
-------------------------------------------------------------------------
99                   int              数字
"A"                  string           文字
99 or "A" or 'a'     'a               なんでも
[1;2;3]              int list         中身は数字のリスト
[ [1;2]; [55;99] ]   int list list    中身は数字のリストをつつんでるリスト
( 99, "A" )          int * strig      数字と文字

03: 型情報を調べるための道具としてFSIをつかう

型が知りたいなーと思ったらFSIで調べてみる!

~$ fsharpi                    // FSIをたちあげる
> let f a b = a + b ;;        // 知りたい式とか値とか入力する

val f : a:int -> b:int -> int // 型が出力される

04: 型アノテーションを極力書くようにする

めんどくさがらずにかくといいかもです。

アノテーションとはたとえばaintですよと肩書きすることです。

// 型アノテーションを省略せずに
let add a b =
    a + b

// こんな感じで型アノテーションをかいておく
let add (a:int) (b:int) : int =
    a + b

05: レコードをつかってコードをスッキリさせる

ひとつのパラメーターで多くの情報を

関数に渡すことができコードがスッキリします!

例えば下記のコードだとcallmekoheiInfoというレコードで

多くの情報をhelloに渡すことができます。

module Util =

    type Info =
        { name  : string
          age   : int    }

    let hello (info: Info) =
        printfn "Hello! My name is %s! Age is %d!" <|| (info.name, info.age)

module Usage =
    open Util

    let callmekoheiInfo: Info =
        { name   = "kohei"
          age    = 20     }

    callmekoheiInfo |> hello
    // Hello! My name is kohei! Age is 20!

06: ライブラリにある機能を知っておく

たとえばリストの要素を3個づつくくりたいとします。

で、そのためのコードを書きます。

あら、List.chunkBySizeというのがあったります。

ということで

ライブラリ

あるかもしれない

その機能

07: 英語の文章をすこしだけ読めるようになる

F#の情報は英語で書かれた情報が多いような気がします。

ので英語が少し読めた方がいいかもです。

08: F#寺子屋にとりあえず疑問なこととか書いてみる

実はF#のチャット(掲示板のようなもの)があったります。

活用できるものは積極的に活用しましょう!

https://gitter.im/fsugjp/public

09: むずかしいことは考えない

とりあえずコード書くのに必要ないかと。。。

クロージャとか
遅延評価とか
関数型言語とか
モナドとか
関数型プログラミングに目覚めたとか

10: 楽しんでコードをかく

結局これかと。






Remove all ads

F# 談話室 2016

F#

f:id:callmekohei00:20160704145233p:plain

Summary

see : https://connpass.com/event/32747/

Dog days

場所は銀座!

F#談話室に参加してみました!

ってかこの日はものすごく天気良くて暑かった〜

I joined F# lounge in Ginza Japan.
It was just dog days!

f:id:callmekohei00:20160704145558p:plain

Comfortable place

エアコン効いてて電源もあってきれいな会場でした〜。

It's very comfortable room.

f:id:callmekohei00:20160704145832p:plain

How about F# lounge?

そうですね。最初はみんなもくもくとパソコン打ってて、
誰かがツイッターとかでF#の疑問点とか呟くと
少しずつ話題が膨らんで最終的にガヤガヤとなるみたいな感じ?

と、今回は発表したい人は発表するような感じになってて、
僕も発表してみました!

こんな感じでLT(Lightning talk)
f:id:callmekohei00:20160704150256p:plain

Issue

<発表>

@u_1rohさんによるCADデーターなどのデーターを
F#でどのように活用してるかの事例発表
  
@pocketberserkerさんによるFSDN(http://fsdn.azurewebsites.net/)の
仕組みの紹介など

@callmekoheiによるF#でスクレイピング

<雑談>

各人、自己紹介など
F#の人が最初に学ぶのにどんな本がいいのか?
type providerのはまりどころ
webshaper, typescript
F#5.0
F#寺子屋( https://gitter.im/fsugjp/public )の存在
などなど

Beer

F#談話室が17時で終わって

飲みに行きたい人を募って懇親会いきました〜

すごく楽しかったですよ〜

I love beer (^_^)/

f:id:callmekohei00:20160704151517p:plain






Remove all ads