callmekohei's blog

callmekoheiのひとりごと

Build F# code with dotnet and msbuild

This article is F# Advent Calendar2017 8th day ( see : F# Advent Calendar 2017 - Qiita )


f:id:callmekohei00:20171209065402p:plain


Summary

I just try to build F# code with dotnet and msbuild.

Thanks

@yukitos

What is Build?

Build is compile and link.

3 ways of build

I understand a little bit of it. (^_^::

command TargetFramework reference
dotnet netstandard
dotnet msbuild net -p:FrameworkPathOverride
msbuild net Microsoft.FSharp.Targets

Environment

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.13.1
BuildVersion:   17B1003

$ uname -a
Darwin callmekoheis-MacBook-Air.local
17.2.0 Darwin Kernel
Version 17.2.0:
Fri Sep 29 18:27:05 PDT 2017;
root:xnu-4570.20.62~3/RELEASE_X86_64 x86_64

$ mono --version
Mono JIT compiler version 5.0.1.1 (2017-02/5077205 Sun Sep 17 18:29:46 BST 2017)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           normal
    SIGSEGV:       altstack
    Notification:  kqueue
    Architecture:  amd64
    Disabled:      none
    Misc:          softdebug 
    LLVM:          supported, not enabled.
    GC:            sgen (concurrent by default)

Prepare

install msbuild

// download source
$ git clone https://github.com/Microsoft/msbuild.git 

// build ( ignore errors )
$./cibuild.sh --target Mono

// create msbuild command
$ vim msbuild

$HOME/msbuild/packages/msbuild/MSBuild.exe $@

$ chmod 777 msbuild
$ mv msbuild /usr/local/bin/

// check
$ msbuild /version
Microsoft (R) Build Engine version 14.1.0.0
Copyright (C) Microsoft Corporation. All rights reserved.

14.1.0.0

install dotnet

// download binary
https://github.com/dotnet/core/blob/master/release-notes/download-archives/2.0.3.md

// install from a binary archive
$ mkdir dotnet
$ tar zxf ~/Downloads/dotnet-sdk-2.0.3-osx-x64.tar.gz -C $HOME/dotnet

// add PATH
$ vim .bash_profile

export PATH=$PATH:$HOME/dotnet

// check
$ dotnet --version
2.0.3

$ dotnet msbuild /version
Microsoft (R) Build Engine version 15.4.8.50001 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

15.4.8.50001

dotenet

use dotnet core library

// write F# code
$ vim sample.fsx

printfn "hello"

// write build script
$ vim sample.fsproj

<Project Sdk="Microsoft.NET.Sdk" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netstandard1.6</TargetFramework>
        <DebugType>full</DebugType>
    </PropertyGroup>

    <PropertyGroup Condition="$(OS)=='Unix'">
        <FscToolPath>/usr/local/bin/</FscToolPath>
        <FscToolExe>fsharpc</FscToolExe>
    </PropertyGroup>

    <Target Name="Copy MDBs" AfterTargets="Build">
        <Copy SourceFiles="$(IntermediateOutputPath)/$(AssemblyName).dll.mdb" DestinationFolder="$(OutputPath)" ContinueOnError="true" />
    </Target>

    <ItemGroup>
        <Compile Include="./sample.fsx" />
    </ItemGroup>

</Project>

// create  dependencies specified in the .NET project
$ dotnet restore sample.fsproj

$ tree
.
├── obj
│   ├── project.assets.json
│   ├── sample.fsproj.nuget.cache
│   ├── sample.fsproj.nuget.g.props
│   └── sample.fsproj.nuget.g.targets
├── sample.fsproj
└── sample.fsx

1 directory, 6 files

// build
$ dotnet build sample.fsproj

$ tree
.
├── bin
│   └── Debug
│       └── netstandard1.6
│           ├── sample.deps.json
│           ├── sample.dll
│           └── sample.dll.mdb
├── obj
│   ├── Debug
│   │   └── netstandard1.6
│   │       ├── sample.dll
│   │       ├── sample.dll.mdb
│   │       ├── sample.fsproj.CoreCompileInputs.cache
│   │       └── sample.fsproj.FileListAbsolute.txt
│   ├── project.assets.json
│   ├── sample.fsproj.nuget.cache
│   ├── sample.fsproj.nuget.g.props
│   └── sample.fsproj.nuget.g.targets
├── sample.fsproj
└── sample.fsx

6 directories, 13 files

// run
$ mono ./bin/Debug/netstandard1.6/sample.dll
hello

dotenet msbuild

use dotnet library

// write F# code
$ vim sample.fsx

printfn "hello"

// write build script
$ vim sample.fsproj

<Project Sdk="Microsoft.NET.Sdk" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net45</TargetFramework>
        <DebugType>full</DebugType>
    </PropertyGroup>

    <PropertyGroup Condition="$(OS)=='Unix'">
        <FscToolPath>/usr/local/bin/</FscToolPath>
        <FscToolExe>fsharpc</FscToolExe>
    </PropertyGroup>

    <Target Name="Copy MDBs" AfterTargets="Build">
        <Copy SourceFiles="$(IntermediateOutputPath)/$(AssemblyName).exe.mdb" DestinationFolder="$(OutputPath)" ContinueOnError="true" />
    </Target>

    <ItemGroup>
        <Compile Include="./sample.fsx" />
    </ItemGroup>

</Project>

// download .NET library
$ svn export https://github.com/mono/reference-assemblies/trunk/v4.5

// create  dependencies specified in the .NET project
$ dotnet restore sample.fsproj

$ tree
.
├── obj
│   ├── project.assets.json
│   ├── sample.fsproj.nuget.cache
│   ├── sample.fsproj.nuget.g.props
│   └── sample.fsproj.nuget.g.targets
├── sample.fsproj
├── sample.fsx
└── v4.5
    ├── Accessibility.dll
    ├── CustomMarshalers.dll
    ├── Facades
    │   ├── System.Collections.Concurrent.dll
    ...

// build
$ dotnet msbuild -p:FrameworkPathOverride=./v4.5 sample.fsproj 

$ tree
.
├── bin
│   └── Debug
│       └── net45
│           ├── FSharp.Core.dll
│           ├── System.Core.dll
│           ├── System.Data.dll
│           ├── System.Drawing.dll
│           ├── System.EnterpriseServices.dll
│           ├── System.IO.Compression.FileSystem.dll
│           ├── System.IO.Compression.dll
│           ├── System.Numerics.dll
│           ├── System.Runtime.Serialization.dll
│           ├── System.Transactions.dll
│           ├── System.ValueTuple.dll
│           ├── System.Xml.Linq.dll
│           ├── System.Xml.dll
│           ├── System.dll
│           ├── mscorlib.dll
│           ├── sample.exe
│           └── sample.exe.mdb
├── obj
│   ├── Debug
│   │   └── net45
│   │       ├── sample.exe
│   │       ├── sample.exe.mdb
│   │       ├── sample.fsproj.CopyComplete
│   │       ├── sample.fsproj.CoreCompileInputs.cache
│   │       └── sample.fsproj.FileListAbsolute.txt
│   ├── project.assets.json
│   ├── sample.fsproj.nuget.cache
│   ├── sample.fsproj.nuget.g.props
│   └── sample.fsproj.nuget.g.targets
├── sample.fsproj
├── sample.fsx
└── v4.5
    ├── Accessibility.dll
    ├── CustomMarshalers.dll
    ├── Facades
    ....

// run
$ mono ./bin/Debug/net45/sample.exe
hello

msbuild

use dotnet library

// write F# code
$ vim sample.fsx

printfn "hello"

// write build script
$ vim sample.fsproj

<Project Sdk="Microsoft.NET.Sdk" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net45</TargetFramework>
        <DebugType>full</DebugType>
    </PropertyGroup>

    <PropertyGroup Condition="$(OS)=='Unix'">
        <FscToolPath>/usr/local/bin/</FscToolPath>
        <FscToolExe>fsharpc</FscToolExe>
    </PropertyGroup>

    <Target Name="Copy MDBs" AfterTargets="Build">
        <Copy SourceFiles="$(IntermediateOutputPath)/$(AssemblyName).exe.mdb" DestinationFolder="$(OutputPath)" ContinueOnError="true" />
    </Target>

    <ItemGroup>
        <Compile Include="./sample.fsx" />
    </ItemGroup>

    <Import Project="/usr/local/Cellar/mono/5.0.1.1/lib/mono/fsharp/Microsoft.FSharp.Targets" />

</Project>

// build
$ msbuild sample.fsproj 

$ tree
.
├── bin
│   └── Debug
│       ├── sample.exe
│       └── sample.exe.mdb
├── obj
│   └── Debug
│       ├── sample.exe
│       ├── sample.exe.mdb
│       ├── sample.fsproj.FileListAbsolute.txt
│       └── sample.fsprojResolveAssemblyReference.cache
├── sample.fsproj
└── sample.fsx

4 directories, 8 files

// run
$ mono ./bin/Debug/sample.exe
hello
Remove all ads

Debug F# with sdb!

This article is F# Advent Calendar2017 7th day ( see : F# Advent Calendar 2017 - Qiita )

Summary

I just try to debug F# code with sdb!

Like this

f:id:callmekohei00:20171207200313p:plain

What is mono/sdb?

A command line client for the Mono soft debugger.

github.com

Environment

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.13.1
BuildVersion:   17B1003

$ uname -a
Darwin callmekoheis-MacBook-Air.local
17.2.0 Darwin Kernel
Version 17.2.0:
Fri Sep 29 18:27:05 PDT 2017;
root:xnu-4570.20.62~3/RELEASE_X86_64 x86_64

$ mono --version
Mono JIT compiler version 5.0.1.1 (2017-02/5077205 Sun Sep 17 18:29:46 BST 2017)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           normal
    SIGSEGV:       altstack
    Notification:  kqueue
    Architecture:  amd64
    Disabled:      none
    Misc:          softdebug 
    LLVM:          supported, not enabled.
    GC:            sgen (concurrent by default)

Prepare

install mono/sdb

$ git clone https://github.com/mono/sdb

$ cd sdb

$ git submodule update --init --recursive

$ make

check

$ sdb --version
Mono soft debugger (sdb) 1.5.6503.20649

$ which sdb
/usr/local/bin/sdb

setting

$ which mono
/usr/local/bin/mono

// set location of mono
$ sdb
(sdb) cfg s RuntimePrefix /usr/local/ ( was /usr )

Debug

// write code
$ vim sample.fsx 

namespace ABC

module DEF =
    let bar() =
        stdout.WriteLine("abc")

    let foo (str:string) =
        stdout.WriteLine(str)
        bar()

    [<EntryPointAttribute>]
    let main _ =
        let s = "Foo!"
        foo s
        stdout.WriteLine("callmekohei")
        0

// compile
$ fsharpc -g --optimize- sample.fsx 

// launch sdb
$ sdb
Welcome to the Mono soft debugger (sdb 1.5.6548.37600)
Type 'help' for a list of commands or 'quit' to exit

// set break point
(sdb) bp add func ABC.DEF.foo
Breakpoint '0' added for method 'ABC.DEF.foo'

// run 
(sdb) r sample.exe
Inferior process '8743' ('sample.exe') started
Hit method breakpoint on 'ABC.DEF.foo'
#0 [0x00000000] ABC.DEF.foo at /Users/callmekohei/tmp/xxx/sample.fsx:8
        stdout.WriteLine(str)

// look source code
(sdb) src
       1:    namespace ABC
       2:    
       3:    module DEF =
       4:        let bar() =
       5:            stdout.WriteLine("abc")
       6:    
       7:        let foo (str:string) =
       8:            stdout.WriteLine(str)  // <--- color green!
       9:            bar()
      10:    
      11:        [<EntryPointAttribute>]
      12:        let main _ =
      13:            let s = "Foo!"
      14:            foo s
      15:            stdout.WriteLine("callmekohei")
      16:            0

// continue
(sdb) c
Inferior process '8743' ('sample.exe') resumed
Foo!
abc
callmekohei
Inferior process '8743' ('sample.exe') exited with code '0'

// quiet
(sdb) q
Bye

Point

compile option --optimize-

$ fsharpc -g --optimize- sample.fsx 

WIP

I want to debug in Vim/Neovim with sdb.




Remove all ads

VimでFSharpを実行(Run)・テスト(Test)・デバッグ(Debug)する

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

この記事はVim2 Advent Calendar2017 2日目の記事です ( see : Vim2 Advent Calendar 2017 - Qiita )



f:id:callmekohei00:20171130201645g:plain





IDEを使わなければ、コンピュータが自動でやってくれることなどほとんどなく、あとは自分の手でやるしかないのです。プログラミングとは元々そういうものだったはずです

Hello, Worldから始めよう | プログラマが知るべき97のこと



Greeting

こんにちは!最近ポンド円でほぼ死にかけのcallmekoheiです!

みなさまいかがお過ごしでしょうか?

今回はFSharpVimAdvent Calenderに同時にポストします!

思えばなんで僕、VimFSharpのコード書いてるんでしょうね?

VSとかVSCとか他にも書きやすい環境があるのに。。。

なんというかですね、なんというかですね、VimFSharp

ウイスキー生ハムぐらい合うんですよ。

も、もちろん個人の意見ですがwww

まぁ、あれですよ。僕が複雑なこと理解できないやつなんで

シンプルな環境の方が好きなんですよね。

というわけで、VimFSharp のコード書くときの

ちょっとした環境構築について書いてみます。

というか僕自身が趣味でコード書いてるので

お仕事とかで使うには辛いかもですが

まぁすごくシンプルな環境なんでお勉強とか

ちょっとしたテストとかにはいいと思ふのですよ。

それと環境構築はOSXで書いてますが

WinでもLinuxでもおんなじ感じですっ

Environment

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G1036

Prepare

00: brewコマンドのインストール

下記のホームページからコマンドをterminalで実行しませう

brew.sh


01: Monoのインストール

brewコマンドで一発です〜

$ brew install mono


02: paketコマンドの作成

F#のライブラリをナゲットするためのコマンドを作りませう

see also : OSXでのF#(FSharp)環境整備 · GitHub

// nuget.exeのダウンロード
$ wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
$ sudo mv nuget.exe /usr/local/bin

// nuget スクリプト作成
$ touch nuget
$ vim nuget
#!/bin/sh
script_dir="$(cd "$(dirname "${BASH_SOURCE:-${(%):-%N}}")"; pwd)"
mono --runtime=v4.0 ${script_dir}/nuget.exe $*

$ chmod 777 nuget
$ sudo mv nuget /usr/local/bin

// nugetinstall スクリプト作成
$ touch nugetinstall
$ vim nugetinstall
#!/bin/sh
nuget install $* -OutputDirectory packages -ExcludeVersion

$ chmod 777 nugetinstall
$ sudo mv nugetinstall /usr/local/bin

// packetスクリプトの作成
$ touch paket
$ vin paket
#!/bin/sh
paket_path=./packages/Paket/tools/paket.exe
if [ ! -e $paket_path ]; then
  echo "Paket installing..."
  nugetinstall Paket
fi
mono $paket_path $*

$ chmod 777 paket
$ sudo mv paket /usr/local/bin


03: Vimプラグインのインストール

VimPython3enableにしたvimをインストール

$ brew install vim --with-python3

vimプラグインは下記をインストール(すきなプラグイン管理ソフトでどうぞ)

// NeovimのプラグインをVim8で使うのに必要
roxma/nvim-yarp
roxma/vim-hug-neovim-rpc

// FSharpの補完に必要
Shougo/deoplete.nvim
callmekohei/deoplete-fsharp

// 実行するときに必要
thinca/vim-quickrun
Shougo/vimproc.vim

ちなみにthinca/vim-quickrunの設定はちょっとコツがあるので下記を丸写ししてください。

set splitright
let g:quickrun_config = {
\
\     '_' : {
\           'runner'                          : 'vimproc'
\         , 'runner/vimproc/updatetime'       : 60
\         , 'hook/time/enable'                : 1
\         , 'hook/time/format'                : "\n*** time : %g s ***"
\         , 'hook/time/dest'                  : ''
\         , "outputter/buffer/split"          : 'vertical'
\         , 'outputter/buffer/close_on_empty' : 1
\     }
\
\     , 'fsharp' : {
\           'command'                         : 'fsharpi --readline-'
\         , 'tempfile'                        : '%{tempname()}.fsx'
\         , 'runner'                          : 'concurrent_process'
\         , 'runner/concurrent_process/load'  : '#load "%S:gs?\\?/?";;'
\         , 'runner/concurrent_process/prompt': '> '
\     }
\ }

Windowsのかたは、上記commandのところを下記に変えてください

fsi.exeのパスはよしなに・・・

'command': 'mono "C:\Program Files\Mono\lib\mono\fsharp\fsi.exe" --readline-'






実行 Run してみよう!

$ vim abc.fsx

code

stdout.WriteLine("hello")

vim command

: QuickRun

result

[Loading /Users/callmekohei/tmp/abc.fsx]
hello
namespace FSI_0003


*** time : 0.118874 s ***

テスト Test してみよう!

// create foo folder ( プロジェクトフォルダ foo を作成 )
$ mkdir foo

// move foo folder ( プロジェクトフォルダ foo に移動 )
$ cd  foo

// init paket ( paket を初期化 )
$ paket init

// nuget test package - persimmon.script ( perssimon.script を nuget )
$ vim paket.dependencies 

write paket.dependencies ( paket.dependencies を記入 )

source https://www.nuget.org/api/v2
nuget persimmon.script

download library ( ライブラリをダウンロード )

$ paket install

wirte code ( コードをかく )

$ vim abc.fsx

code

#r "./packages/Persimmon/lib/net45/Persimmon.dll"
#r "./packages/Persimmon.Runner/lib/net40/Persimmon.Runner.dll"
#r "./packages/Persimmon.Script/lib/net45/Persimmon.Script.dll"

open System.Reflection
open Persimmon
open UseTestNameByReflection


/// write your test code here.
let ``a unit test`` = test {
  do! assertEquals 1 2
}

/// print out test report.
new Persimmon.ScriptContext()
|> FSI.collectAndRun( fun _ -> Assembly.GetExecutingAssembly() )

result

[Loading /Users/callmekohei/tmp/foo/abc.fsx]
x
begin FSI_0003.Abc
 Assertion Violated: a unit test
 1. Expect: 1
    Actual: 2
end FSI_0003.Abc
============================== summary ===============================
run: 1, error: 0, violated: 1, skipped: 0, duration: 00:00:00.0005501
namespace FSI_0003
  val ( a unit test ) : Persimmon.TestCase<unit>


*** time : 0.128949 s ***

デバッグ Debug してみよう!

わかりません・・・(^_^;;

ここ見てずっこけた方、すみません。。。

どうなんでしょ?

VimDebug それもFSharp

2つ課題があるのですよ。

まずFSharpそのもののデバッグ

mono/sdb というのがあるのですが

いまのところうまく動かないです・・・。

これはIssueだしてるので改善に期待してます!

2点目はVim8デバッグ環境。。。

mono/sdbを動かすのがないのですよね〜(僕が知らないだけだと思う・・)

で、まず最近の:TermDebugという機能になんとかmono/sdbを動作させるか

もしくはまた別の形で動かすか・・・。

ちなみにこんな活動もあるみたいなのですが動いてないみたいです・・・。

github.com

ぜひぜひVimに詳しい方はmono/sdbがうごくdebuggerをお願いします!

ぼ、僕も頑張りますっ (^_^;;

感想

いかがでしたでしょうか?

VimFSharp書くの本当に楽ですよ!

ぜひ試してみてください!

Remove all ads

callmekohei のこれは飲んどけ🥃

Summary

callmekoheiが最近飲んでるお酒のまとめ



f:id:callmekohei00:20171130234148p:plain

No.0001
ドロナック

おすすめ(5段階)
5

特徴
辛さの中に甘みがある


f:id:callmekohei00:20171202164501j:plain

No.0002
シングルトン

おすすめ(5段階)
5

特徴
辛さの中に甘みがあるがややライト


f:id:callmekohei00:20171202164553j:plain

No.0003
フィディック

おすすめ(5段階)
4

特徴
世界で一番飲まれてる
飲みやすい


f:id:callmekohei00:20171202164646j:plain

No.0004
マッカラン ダブルカスク

おすすめ(5段階)
5

特徴
少し辛いが甘い
最初に飲むべきものの一つ


f:id:callmekohei00:20171202164757j:plain

No.0005
リベット

おすすめ(5段階)
5

特徴
程よい辛味
最初に飲むべきものの一つ



最近よくいくお店

ja.foursquare.com

bar-navi.suntory.co.jp






Remove all ads

単語補完をやってみた!

この記事はF# Advent Calendar2017 1日目の記事です ( see : F# Advent Calendar 2017 - Qiita )



f:id:callmekohei00:20171130201341g:plain

Summary

こんにちは!ポンド円で負けまくって死にそうなcallmekoheiです!

ここ一年ほどF#の単語補完できたらいいな〜とすこしコード書いてました。

そのことを書いてみたいと思いマフ (^_^)/

単語補完とは?

F#のコードを書くじゃないですか?

で、そのとき例えばList.と書いて候補が出ると嬉しいですよね?

その候補を文脈から引き出します。

上記の映像が単語補完のサンプルです。

単語補完をやっている様子がつかめると思います。

どうやってるか?

今回やった環境はVimです。

Vimというのはメモ帳の機能をアップさせたようなものです。

で、このVimで単語補完するときの仕組みをdeopleteが提供してくれます。

で、実際に文脈から単語候補を提供してくれるのは

FSharp.Compiler.Serviceというライブラリ群です。

実際にやってみよう!

実際やってみるのはとても簡単です。

まずFSharp.Compiler.Servieライブラリをナゲットします。

で、次のようなコードを書きます。

// sample code from : https://github.com/fsharp/FSharp.Compiler.Service/blob/master/fcs/samples/EditorService/Program.fs

// Open the namespace with InteractiveChecker type
#r "./packages/FSharp.Compiler.Service/lib/net45/FSharp.Compiler.Service.dll"
open System
open Microsoft.FSharp.Compiler
open Microsoft.FSharp.Compiler.SourceCodeServices
open Microsoft.FSharp.Compiler.QuickParse

// Create an interactive checker instance (ignore notifications)
let checker = FSharpChecker.Create()

let parseWithTypeInfo (file, input) = 
    let checkOptions, _errors = checker.GetProjectOptionsFromScript(file, input) |> Async.RunSynchronously
    let parsingOptions, _errors = checker.GetParsingOptionsFromProjectOptions(checkOptions)
    let untypedRes = checker.ParseFile(file, input, parsingOptions) |> Async.RunSynchronously
    
    match checker.CheckFileInProject(untypedRes, file, 0, input, checkOptions) |> Async.RunSynchronously with 
    | FSharpCheckFileAnswer.Succeeded(res) -> untypedRes, res
    | res -> failwithf "Parsing did not finish... (%A)" res

はい。なんとなくよくわからないですけど、気にしない気にしない。

で次のコードを書きます。

// sample code from : https://github.com/fsharp/FSharp.Compiler.Service/blob/master/fcs/samples/EditorService/Program.fs

let input = 
  """
  let foo() = 
    let msg = "Hello world"
    if true then 
      printfn "%s" msg.
  """
let inputLines = input.Split('\n')
let file = "./Test.fsx" // <--- このファイルは実際にあるかどうかは問題ない

let untyped, parsed = parseWithTypeInfo (file, input)

let partialName = GetPartialLongNameEx(inputLines.[4], 22)

// Get declarations (autocomplete) for a location
let decls = 
    parsed.GetDeclarationListInfo(Some untyped, 5, inputLines.[4], partialName, (fun () -> [])) 
    |> Async.RunSynchronously

for item in decls.Items do
    printfn " - %s" item.Name

結果

 - Length
 - Chars
 - Clone
 - CompareTo
 - Contains
 - CopyTo
 - EndsWith
 - Equals
 - GetEnumerator
 - GetHashCode
...

このコードで重要な関数はGetDeclarationListInfo です。これが単語候補を引き出します。





longname, partial nameで考える

まずpartial nameとはみたいな。。下記を見たらわかるはず・・。

QuickParse.GetPartialLongNameEx("System.Test.",11)
|> printfn "%A"
(*
    {QualifyingIdents = ["System"; "Test"];
     PartialIdent = "";
     EndColumn = 11;
     LastDotPos = Some 11;}
*)


QuickParse.GetPartialLongNameEx("System.Test",10)
|> printfn "%A"

(*
    {QualifyingIdents = ["System"];
     PartialIdent = "Test";
     EndColumn = 10;
     LastDotPos = Some 6;}
*)



ではでは、このGetDeclarationListInfoがかえす4つのケースを考えてみます。

CASE1

よみこんでる namespace すべてをかえす

row = 0, col = 0でやってます。

昔はbase1だったんでrow=0にするとエラーがでてたけど最近変わった????

let file = "./Test.fsx" // <--- このファイルは実際にあるかどうかは問題ない

let input = ""
let row = 0
let partialName = QuickParse.GetPartialLongNameEx(input,0)
let untyped, parsed = parseWithTypeInfo (file, input)

// Get declarations (autocomplete) for a location
let decls = 
    parsed.GetDeclarationListInfo(Some untyped, row, input, partialName,  (fun () -> []))
    |> Async.RunSynchronously

for item in decls.Items do
    printfn " - %s" item.Name

結果

 - Choice1Of2
 - Choice1Of3
 - Choice1Of4
 - Choice1Of5
 - Choice1Of6
 - Choice1Of7
...

CASE2

namespace を指定している場合、その補完リストをかえす

let file = "./Test.fsx" // <--- このファイルは実際にあるかどうかは問題ない

let input = "Microsoft.FSharp."
let row = 1
let partialName = QuickParse.GetPartialLongNameEx(input,16)
let untyped, parsed = parseWithTypeInfo (file, input)

// Get declarations (autocomplete) for a location
let decls = 
    parsed.GetDeclarationListInfo(Some untyped, row, input, partialName,  (fun () -> []))
    |> Async.RunSynchronously

for item in decls.Items do
    printfn " - %s" item.Name

結果

 - Compiler
 - Reflection
 - Quotations
 - NativeInterop
 - Linq
 - Data
 - Core
 - Control
 - Collections

CASE3

dotを入力したとき推論できる場合は、その分の補完リストをかえす

let file = "./Test.fsx" // <--- このファイルは実際にあるかどうかは問題ない

let input =
    """
    let x = "abc"
    x.
    """
let inputLines = input.Split('\n')
let row = 3
let partialName = QuickParse.GetPartialLongNameEx(inputLines.[2],5)
let untyped, parsed = parseWithTypeInfo (file, input)

// Get declarations (autocomplete) for a location
let decls = 
    parsed.GetDeclarationListInfo(Some untyped, row, inputLines.[2], partialName,  (fun () -> []))
    |> Async.RunSynchronously

for item in decls.Items do
    printfn " - %s" item.Name

結果

 - Length
 - Chars
 - Clone
 - CompareTo
 - Contains
 - CopyTo
 - EndsWith
...

CASE4

dotを入力したとき推論できない場合は、なにもかえさない

let file = "./Test.fsx" // <--- このファイルは実際にあるかどうかは問題ない

let input = "a."
let row = 1
let partialName = QuickParse.GetPartialLongNameEx(input,1)
let untyped, parsed = parseWithTypeInfo (file, input)

// Get declarations (autocomplete) for a location
let decls = 
    parsed.GetDeclarationListInfo(Some untyped, row, input, partialName,  (fun () -> []))
    |> Async.RunSynchronously

for item in decls.Items do
    printfn " - %s" item.Name

結果

nothing

こんな感じです!

参考

github.com

fsharp.github.io

Remove all ads

OSX High Sierra で gdb を動かしてみた!

f:id:callmekohei00:20171124122811p:plain

Summary

OSX Hihg Sierragdbをうごかす

上記画像のようなエラー回避の方法

下準備

// xcodeが入ってるか確認
tmp$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates

// gdbが入ってるか確認
$ gdb --version
GNU gdb (GDB) 8.0.1
Copyright (C) 2017 Free Software Foundation, Inc.

// gdbがなければインストール
$ brew install gdb

// .gdbinitに下記を記入
echo "set startup-with-shell off" >> ~/.gdbinit

gdbを動かす(スーパーユーザーとして)

スーパーユーザーとして動かす

$ sudo gdb ./a.out

この場合設定は不要

gdbを動かす(ユーザーとして)

Certificateを作成する

1. Open Keychain Access
2. In the menu, open **Keychain Access > Certificate Assistant > Create a certificate**
3. Give it a name (e.g. `gdb-cert`)
    + Identity type: Self Signed Root
    + Certificate type: Code Signing
    + Check: let me override defaults
4. Continue until it prompts you for: "specify a location for..."
5. Set Keychain location to Login  <---- ここ重要!

Keychainの左カラムのloginに今作ったgdb-certがあるのでSystemにドラックアンドドロップする!

ここでいろいろあるけどtrustみたいな感じでボタンを押す

Systemカラムの中に移動したgdb-certを右クリック > get info > trust で Always Trustにする


gdbcodesign

$ sudo codesign -s gdb-cert /usr/local/bin/gdb 

で、再起動

動かしてみる

f:id:callmekohei00:20171124124320p:plain

うごいた!

参考

qiita.com

Remove all ads

Windows10でVim8でF#のコードをかいてみる

f:id:callmekohei00:20171112150054p:plain

Summary

visual studio code だと楽はらくなのですが

もっとシンプルな vim8 で fsharp のコードを書く!

それもwindowsで!

環境

Microsoft Windows [Version 10.0.16299.19]

windowsvim

windowsvimを扱うのは意外と大変でした!

必要なもの

vim(64bit, kaoriya version)

mono

Python 3.5.4 - 2017-08-08: Windows x86-64 executable installer

Git

必要なこと

パスを通す

control panel > system properties > advance > environment variablesPATHに書き込みます

つまりこういうことです

コマンドプロンプトmonoと入力しても認識されませんが、パスを通すことでコマンドが通るようになります。

下記ができたらオーケー

C:\Users\callmekohei>mono --version
Mono JIT compiler version 5.4.1 (Visual Studio built mono)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
        TLS:           normal
        SIGSEGV:       normal
        Notification:  Thread + polling
        Architecture:  amd64
        Disabled:      none
        Misc:          softdebug
        LLVM:          supported, not enabled.
        GC:            sgen

C:\Users\callmekohei>vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled May  2 2017 12:56:07)
MS-Windows 64-bit console version
Included patches: 1-596
Modified by koron.kaoriya@gmail.com
Compiled by koron.kaoriya@gmail.com

C:\Users\callmekohei>python
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()

C:\Users\callmekohei>git --version
git version 2.15.0.windows.1

.vimrcをかく

$HOME.vimrcを書く

$HOMEの場所はコマンドプロンプトでチェック

C:\Users\callmekohei>echo %HOMEPATH%
\Users\callmekohei

こんな感じ

"----------------------------------------------------------
" Plugin manager ( Shougo/dein.vim )
"----------------------------------------------------------

let s:dein_dir = $HOME . '/.config/nvim/dein'
let s:toml     = $HOME . '/.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


set guifont=Mig_2M:h12

set shellpipe=\|\ tee


"----------------------------------------------------------
" General
"----------------------------------------------------------
" Tab
set shiftwidth=4
set tabstop=4
set softtabstop=4
set expandtab

" Clipbord ( see : help clipboard )
set clipboard+=unnamed

" Mouse ( see :help mouse-using )
set mouse=nvic

set nowrap
set number
set noswapfile
set cmdheight=2

"----------------------------------------------------------
" Seek
"----------------------------------------------------------
set wrapscan
set ignorecase
set smartcase
nnoremap <silent> <C-l> :nohlsearch<CR>

"----------------------------------------------------------
" Appearance
"----------------------------------------------------------
"colorscheme Apprentice
colorscheme Wombat


" English menu display
source $VIMRUNTIME/delmenu.vim
set    langmenu=none
source $VIMRUNTIME/menu.vim

"if has("multi_lang")
"    language en_gb
"endif

"----------------------------------------------------------
" Char code
"----------------------------------------------------------
set encoding=utf-8
set fileencodings=utf-8,iso-2022-jp,euc-jp,sjis

"----------------------------------------------------------
" Vim8 
"----------------------------------------------------------
set backspace=indent,eol,start
set hlsearch

set laststatus=2
set wildmenu
set statusline=%f
set statusline+=%m
set statusline+=%r
set statusline+=%h
set statusline+=%w
set statusline+=%=
set statusline+=%l,%c\ \ \ \ \ \ \ \ \ \ \ \ %P

"---------------------------------------------------------
" Python config
" --------------------------------------------------------
"
let g:python_host_prog='C:\Users\callmekohei\AppData\Local\Programs\Python\Python27\python.exe'
let g:python3_host_prog='C:\Users\callmekohei\AppData\Local\Programs\Python\Python35-32\python.exe'

dein.tomlをかく

dein.tomlとはプラグイン管理用の文書

場所はC:\Users\callmekohei\.config\nvimに書いておく

こんな感じ

#----------------------------------------------------------
# Shougo ware
#----------------------------------------------------------

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

[[plugins]]
repo = 'Shougo/denite.nvim'

[[plugins]]
repo = 'Shougo/deoplete.nvim'
hook_add = '''
    let g:deoplete#enable_at_startup = 1
'''

[[plugins]]
repo = 'callmekohei/deoplete-fsharp'
hook_post_update = '''
  if dein#util#_is_windows()
    let cmd = 'install.cmd'
  else
    let cmd = 'bash install.bash'
  endif
  let g:dein#plugin.build = cmd
'''


[[plugins]]
repo = 'roxma/nvim-yarp'

[[plugins]]
repo = 'roxma/vim-hug-neovim-rpc'


#----------------------------------------------------------
# Color scheme
#----------------------------------------------------------

[[plugins]]
repo = 'romainl/Apprentice'

[[plugins]]
repo = 'vim-scripts/Wombat'

#----------------------------------------------------------
# QuickRun
#----------------------------------------------------------

[[plugins]]
repo = 'thinca/vim-quickrun'
hook_add = '''
    set splitright
    let g:quickrun_config = {
    \
    \     '_' : {
    \           'runner'                          : 'vimproc'
    \         , 'runner/vimproc/updatetime'       : 60
    \         , 'hook/time/enable'                : 1
    \         , 'hook/time/format'                : "\n*** time : %g s ***"
    \         , 'hook/time/dest'                  : ''
    \         , "outputter/buffer/split"          : 'vertical'
    \         , 'outputter/buffer/close_on_empty' : 1
    \     }
    \
    \     , 'fsharp' : {
    \           'command'                         : 'fsharpi --readline-'
    \         , 'tempfile'                        : '%{tempname()}.fsx'
    \         , 'runner'                          : 'concurrent_process'
    \         , 'runner/concurrent_process/load'  : '#load "%S:gs?\\?/?";;'
    \         , 'runner/concurrent_process/prompt': '> '
    \     },
    \
    \}
'''

感想

マックと違って環境構築がすごく大変 (^_^;;

あとwindows's vimdeoplete2017/11/12現在は発展途中な感じです。今からに期待!ちなみにwindows's neovimだと完璧に動作します。

こんな感じ

Editor Windows Mac
neovim
vim8
Remove all ads

vimconf2017に行ってみたった

summary

東京で開催されたvimというテキストエディタのお祭りに行って来ました!

vimconf2017とは?

vimのお祭りです!

vimに関するいろいろな話を聞けました!

内容とか・・・

いろいろと興味深い話がありました!

例えばgoという言語のプラグインの話とか

シンタックスハイライトの話とか・・・

その他色々聞けました!

感想

すごく楽しかったです!

すごく気分転換になります!(本当に)

会場もすごく綺麗だしみんなマナーいいしで。

来年ももしあればまた行きたいです!

その他

会場の様子

f:id:callmekohei00:20171104170857p:plain

f:id:callmekohei00:20171104170921p:plain

f:id:callmekohei00:20171104170949p:plain

お昼ご飯のお弁当(ものすごく美味しかった!)

f:id:callmekohei00:20171104171136p:plain

コーヒースリーブに落書き〜

f:id:callmekohei00:20171104171021p:plain

公演中の落書き〜

f:id:callmekohei00:20171104171047p:plain

話題の暗黒さんの歌(歌はなかったですwww)

f:id:callmekohei00:20171104171109p:plain



さらに追加

さらに飲んだよ〜

暗黒さんの似顔絵

ぶっちゃげ暗黒さんは意外とイケメンでした!

f:id:callmekohei00:20171104231104p:plain

Remove all ads

VSCodeでFSharpのデバッグやってみたった

f:id:callmekohei00:20171030103729p:plain

けっこうはまったのでメモ

Summary

VSCodeでFSharpのデバッグやってみたった

環境

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G29

$ dotnet --version
2.0.0

$ mono --version
Mono JIT compiler version 5.0.1.1 (2017-02/5077205 Wed May 31 14:47:04 BST 2017)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           normal
    SIGSEGV:       altstack
    Notification:  kqueue
    Architecture:  amd64
    Disabled:      none
    Misc:          softdebug 
    LLVM:          supported, not enabled.
    GC:            sgen (concurrent by default)

準備

0. vscodeをインストール( ext install C# )
1. dotnetをインストール
2. monoをインストール

こんな感じ

// デスクトップに移動
$ cd ~/Desktop/

// フォルダを作る
Desktop$ mkdir MyAppFs

// フォルダに移動
Desktop$ cd MyAppFs/

// テンプレート一式を作る
MyAppFs$ dotnet new console -lang F#

// ビルドする
MyAppFs$ dotnet build

// 実行
MyAppFs$ dotnet run

// 実行結果
Hello World from F#!

Program.fsを書き換える

let bar() = 
    stdout.WriteLine("abc")

let foo (str:string) =
    stdout.WriteLine(str)
    bar()

[<EntryPointAttribute>]
let main _ =
    let s = "Foo!"
    foo s
    stdout.WriteLine("callmekohei")
    0

ここでvscodeを立ち上げてこのフォルダをひらく

で、デバッグボタンの右のところを押して下記を書く

(launch.json)

programのところだけパスを書き直す

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": ".NET Core Launch (console)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            "program": "${workspaceRoot}/bin/Debug/netcoreapp2.0/MyAppFs.dll",
            "args": [],
            "cwd": "${workspaceRoot}",
            "stopAtEntry": false,
            "console": "internalConsole"
        }
    ]
}

(tasks.json)

テンプレートのまんまでオーケー

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "taskName": "build",
            "command": "dotnet build",
            "type": "shell",
            "group": "build",
            "presentation": {
                "reveal": "silent"
            },
            "problemMatcher": "$msCompile"
        }
    ]
}

これでデバッグができる!

Remove all ads

( Debug with FSharp ) FSharpでデバッグしてみた!

f:id:callmekohei00:20171021122049p:plain

Summary

FSharpでコマンドラインデバッグしてみた

require

sdb

How to do

(install)

$ git clone https://github.com/mono/sdb
$ cd sdb
$ git submodule update --init --recursive
$ make

(check)

$ sdb --version
Mono soft debugger (sdb) 1.5.6503.20649

$ which sdb
/usr/local/bin/sdb

$ sdb
(sdb)
(sdb) cfg list
'AllowMethodEvaluation' = 'True'
'AllowTargetInvoke' = 'True'
'AllowToStringCalls' = 'True'
'ChunkRawStrings' = 'False'
'ConnectionAttemptInterval' = '500'
'DefaultDatabaseFile' = ''
'DebugLogging' = 'True'
'DisableColors' = 'False'
'EllipsizeStrings' = 'True'
'EllipsizeThreshold' = '100'
'EnableControlC' = 'True'
'EvaluationTimeout' = '1000'
'ExceptionIdentifier' = '$exception'
'FlattenHierarchy' = 'True'
'HexadecimalIntegers' = 'False'
'InputPrompt' = '(sdb)'
'LoadDatabaseAutomatically' = 'False'
'LogInternalErrors' = 'True'
'LogRuntimeSpew' = 'True'
'MaxConnectionAttempts' = '1'
'MemberEvaluationTimeout' = '5000'
'PreferDisassembly' = 'False'
'RuntimeExecutable' = ''
'RuntimePrefix' = '/usr/local/'
'SaveDatabaseAutomatically' = 'False'
'StepOverPropertiesAndOperators' = 'True'

(point!) RuntimePrefixが違う場合があるのでその場合は変更する

(sdb) cfg s RuntimePrefix /usr/local/ ( was /usr )

(debugging) コードを書く

$ vim test.fs
let bar() = 
    stdout.WriteLine("abc")

let foo (str:string) =
    stdout.WriteLine(str)
    bar()

[<EntryPointAttribute>]
let main _ =
    let s = "Foo!"
    foo s
    stdout.WriteLine("callmekohei")
    0

デバッグ用にコンパイル

$ fsharpc -g test.fs

デバッグしてみる

デバッガを立ち上げる

$ sdb
Welcome to the Mono soft debugger (sdb 1.5.6503.20649)
Type 'help' for a list of commands or 'quit' to exit

ブレイクポイントの設定と一覧表示

(sdb) bp add at test.fs 11
Breakpoint '0' added at '/Users/callmekohei/tmp/test.fs:11'
(sdb) bp add at test.fs 12
Breakpoint '1' added at '/Users/callmekohei/tmp/test.fs:12'
(sdb) bp
#0 '/Users/callmekohei/tmp/test.fs:11'
#1 '/Users/callmekohei/tmp/test.fs:12'

コードを実行

(sdb) r test.exe
Inferior process '1766' ('test.exe') started
Event: 'TargetReady'
[Mono] Loaded assembly: /Users/callmekohei/tmp/test.exe
[Mono] Loaded assembly: /usr/local/Cellar/mono/5.0.1.1/lib/mono/gac/FSharp.Core/4.4.1.0__b03f5f7f11d50a3a/FSharp.Core.dll
[Mono] Resolved pending breakpoint at 'test.fs:11,1' to int Test.main (string[] _arg1) [0x00000].
[Mono] Resolved pending breakpoint at 'test.fs:12,1' to int Test.main (string[] _arg1) [0x0001f].
Hit breakpoint at '/Users/callmekohei/tmp/test.fs:11'
#0 [0x00000000] Test.main at /Users/callmekohei/tmp/test.fs:11
    foo s
Event: 'TargetHitBreakpoint'

ソースコードを表示する(現在の場所が緑色になっている)

(sdb) src
Source file '/Users/callmekohei/tmp/test.fs' is newer than the debuggee executable
       1:    let bar() = 
       2:        stdout.WriteLine("abc")
       3:    
       4:    let foo (str:string) =
       5:        stdout.WriteLine(str)
       6:        bar()
       7:    
       8:    [<EntryPointAttribute>]
       9:    let main _ =
      10:        let s = "Foo!"
      11:        foo s
      12:        stdout.WriteLine("callmekohei")
      13:        0

ステップ実行(次の行にすすむ)

(sdb) s
Inferior process '1766' ('test.exe') resumed
Foo!
abc
Inferior process '1766' ('test.exe') suspended
#0 [0x0000001F] Test.main at /Users/callmekohei/tmp/test.fs:12
    stdout.WriteLine("callmekohei")
Event: 'TargetStopped'

コンティニュー実行(次のブレイクポイントまで実行)

(sdb) c
Inferior process '1766' ('test.exe') resumed
Hit breakpoint at '/Users/callmekohei/tmp/test.fs:12'
#0 [0x0000001F] Test.main at /Users/callmekohei/tmp/test.fs:12
    stdout.WriteLine("callmekohei")
Event: 'TargetHitBreakpoint'

コンティニュー実行(次のブレイクポイントまで実行)

(sdb) c
Inferior process '1766' ('test.exe') resumed
callmekohei
Inferior process '1766' ('test.exe') exited with code '0'
Event: 'TargetExited'

デバッガを終了する

(sdb) q
Bye

いまのところよくわからないところ

関数(メソッド)の中身でブレイクポイントを設定できない?

どなたか、わかる方いれば教えていただけるとたすかります!

一応イシューかいてみました。

github.com

Remove all ads

deopleteがVim8に対応したので使ってみた!

f:id:callmekohei00:20171021053638p:plain

Summary

deopleteがvimにも対応した
deoplete-fsharpをvimでも使ってみたい
vimで使ってみた

環境

tmp$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G29

require

vim8( with python3 )
cmake
nvim-yarp
vim-hug-neovim-rpc

vim8 ( with python3 )

// vim8( with python3 )がインストールされているか確認 ( +python3 になってるかどうか )
$ vim --version | grep python

// インストールされてなければインストール
$ brew update
$ brew reinstall vim --with-python3

cmake

// cmakeがインストールされているか確認する
$ cmake --version

// cmakeがなければインストール
$ brew update
$ brew install cmake

プラグイン

dein.tomlだとこんな感じ

[[plugins]]
repo = 'roxma/nvim-yarp'

[[plugins]]
repo = 'roxma/vim-hug-neovim-rpc'

deoplete branch

branchを切り替える(2017/10/21現在

// deoplete folderに移動
$ cd .config/nvim/dein/repos/github.com/Shougo/deoplete.nvim/

// 最新のdeopleteにする
$ git pull

// branchを確認
$ git branch -a

// branchを切り替える
$ git checkout yarp



余談

vim8neovimみたくしたくて下記の設定を.vimrcに書いたった(まだ途中)

"----------------------------------------------------------
" Vim8 
"----------------------------------------------------------
" backspaceを使えるようにする"
set backspace=indent,eol,start

" 検索結果をハイライトする
set hlsearch

" ステータスラインを常に表示(0:表示しない、1:2つ以上ウィンドウがある時だけ表示)
set laststatus=2
" statuslineにコマンド一覧を表示する
set wildmenu
" ファイル名表示
set statusline=%f
" 変更チェック表示
set statusline+=%m
" 読み込み専用かどうか表示
set statusline+=%r
" ヘルプページなら[HELP]と表示
set statusline+=%h
" プレビューウインドウなら[Prevew]と表示
set statusline+=%w
" これ以降は右寄せ表示
set statusline+=%=
set statusline+=%l,%c\ \ \ \ \ \ \ \ \ \ \ \ %P

余談2

多分ほとんどないと思うけどvimdeoplete立ち上げてエラーになったらおそらくソース側の問題。そのときはソース作者に連絡した方がいいかも〜。

ちなみにdeoplete-fsharpはエラーになったので修正しますた。。

deoplete-fsharpquickrunfsという機能をdeopleteの機能を変則的に使って実現してたのでエラーになったのよ。

Remove all ads

新しい言語を学んでみる!( C言語 )

f:id:callmekohei00:20170926090451p:plain

Summary

callmekohei的に新しい言語を学ぼうかな〜という気持ちになったのでとりあえずC言語というのを学んでみます!

環境と準備

環境

tmp$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G29

tmp$ uname -a
Darwin Mochidas-MacBook-Air.local 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64

tmp$ nvim --version
NVIM v0.2.0
Build type: Release

準備 単語補完のプラグインdeopleteの設定

[[plugins]]
repo = 'zchee/deoplete-clang'
hook_add = '''
let g:deoplete#sources#clang#libclang_path='/Library/Developer/CommandLineTools/usr/lib/libclang.dylib'
let g:deoplete#sources#clang#clang_header='/Library/Developer/CommandLineTools/usr/lib/clang'
'''
on_ft = ['c', 'cpp', 'cmake']
depends = ['deoplete.nvim']

ここからお勉強〜

Hello world!

#include<stdio.h>

int main()
{
    printf("hello C!");
}

結果

hello C!
*** time : 0.151816 s ***

感想

C言語 マスターした!

FizzBuzz

#include<stdio.h>

int main(void) {
    int i;
    for(i=0;i<100;i++){
        if (i % 15 == 0)
            printf("FizzBuzz\n");
        else if
            (i % 5 == 0)
            printf("Buzz\n");
        else if
            (i % 3 == 0)
            printf("Fizz\n");
        else
            printf("%d\n", i);
    }
    return 0;
}

high-order function

#include<stdio.h>

int add10( int x ){
    return x + 10;
}

int add100(int x, int(*func)(int) ){
    return func(x) + 100;
}

int main(void){
    printf("%d", add100(1,add10));
}

結果

111
*** time : 0.181887 s ***

ByVal, ByRef

#include<stdio.h>

// byVal
int Add10ByVal(int x){
    return x + 9;
}

// byRef
void Add10ByRef(int *x){
    *x = *x + 10;
}

int main(){
    printf("ByVal ---> %d\n",Add10ByVal(100));
    
    int tmp = 100;
    Add10ByRef(&tmp);
    printf("ByRef ---> %d",tmp);
}

結果

ByVal ---> 109
ByRef ---> 110
*** time : 0.156918 s ***
Remove all ads

(F#)重い処理を並列で処理する(Actor Model)

Summary

アクターモデルで重い処理を並列でしょりする

こんなかんじ

たとえば5秒かかるしょりがあるとします

// 5秒かかる処理
let take5sec =
    System.Threading.Thread.Sleep 5000

この重い処理を10回おこなうとすると普通は50秒かかるかと思いますが、これを並列で処理すると50秒以下で処理できるようになります。

アクターモデルでの定形コード

// 並列処理する定型コード

// MailboxProcessorは長いのでActorと名前を変更
type Actor<'T> = MailboxProcessor<'T>
// 返信用のチャンネル
type Msg = AsyncReplyChannel<int>

let actorBehavior ( actor:Actor<Msg> ) =
    // アクターを使い回すので再帰にしておく
    let rec messageLoop() = async {
        // メッセージハンドラのトリガー
        let! reply = actor.Receive()
        // 処理内容(重い処理)
        take5sec
        // とりあえずスレッドIDを返してみる
        reply.Reply System.Threading.Thread.CurrentThread.ManagedThreadId
        return! messageLoop()
    }
    messageLoop()

let futures actorAmount runnerAmount behavior =

    // アクターをn個用意する
    let roundRobinRouter actorAmount =
        List.init actorAmount (fun _ -> Actor<Msg>.Start( behavior ) )

    // アクターにラウンドロビンで処理を割り当てる
    Seq.initInfinite( fun n -> n % (actorAmount) )
    |> Seq.take runnerAmount
    |> Seq.map ( fun i -> (roundRobinRouter actorAmount).[i].PostAndAsyncReply(id) )

実行してみる

// アクターを5個用意して10個のランナーを作成する
futures 5 10 actorBehavior
|> Async.Parallel
|> Async.RunSynchronously
|> printfn "%A"

結果

[Loading /Users/callmekohei/tmp/abcabc.fsx]
[|17; 15; 18; 21; 15; 17; 17; 17; 17; 15|]
namespace FSI_0010
  val take5sec : unit
  type Actor<'T> = MailboxProcessor<'T>
  type Msg = AsyncReplyChannel<int>
  val actorBehavior : actor:Actor<Msg> -> Async<'a>
  val futures :
    actorAmount:int ->
      runnerAmount:int ->
        behavior:(MailboxProcessor<Msg> -> Async<unit>) -> seq<Async<int>>


*** time : 5.197822 s ***

50秒かかるところが5秒で実施できた!

参考

blog.amedama.jp

Remove all ads

トレードで朝にチェックする情報をお手軽に!

Summary

先日ゴトビであることを忘れてて

ショートとったら無事死亡(^_^;;

当日朝に一通り情報(経済指標・要人発言他)を

手軽にチェックできるようにした

情報元

www.traders.co.jp

kissfx.com

こんな感じ

f:id:callmekohei00:20170827093421p:plain

f:id:callmekohei00:20170827093428p:plain

コード

コードはここに置いておきます

minna.fsx · GitHub

seep.fsx · GitHub

traderweb.fsx · GitHub

option.fsx · GitHub

あとは

オプションの情報も取得したいな・・

Remove all ads

ポンドのIMMポジションのCSVデーターの作成方法

Summary

ポンドのIMMポジションのデーターを作成する方法

データーの形式

下記のcsvデーターを作成する

日付、ロング枚数、ショート枚数

データーの場所

www.cftc.gov

Futures Only Reports:
The complete Commitments of Traders Futures Only reports file from 1986 is included by year.

前年までの一括データーと最新年度のデーターをダウンロードする。

textをダウンロードする。


f:id:callmekohei00:20170823105811p:plain

CSVデーターの作成方法(前年度までの一括データー)

解凍したデーター(FUT86_16.txt)からcsvデーターを作成する

cat FUT86_16.txt \
| cut -f 1,3,9,10 -d ',' \
| grep -E 'BRITISH POUND STERLING - CHICAGO MERCANTILE EXCHANGE|BRITISH POUND STERLING- NEW - INTERNATIONAL MONETARY MARKET' \
| cut -f 2,3,4 -d ',' \
| tr '-' '/' \
| tr -d ' ' \
| sort -t, -k 1 -r \
> past.csv

CSVデーターの作成方法(今年度のデーター)

解凍したデーター(annual.txt)からcsvデーターを作成する

cat annual.txt \
| cut -f 1,3,9,10 -d ',' \
| grep -E 'BRITISH POUND STERLING - CHICAGO MERCANTILE EXCHANGE|BRITISH POUND STERLING- NEW - INTERNATIONAL MONETARY MARKET' \
| cut -f 2,3,4 -d ',' \
| tr '-' '/' \
| tr -d ' ' \
| sort -t, -k 1 -r \
> annual.csv

上記2つのCSVデーターを一つのCSVデーターにする

cat past.csv annual.csv | sort -t, -k 1 -r > IMM_GBP.csv

活用方法として・・・

MetaTrader4に表示できる

f:id:callmekohei00:20170823110337p:plain

@rondojさんのインジゲーターが必要

fx-dollaryen.seesaa.net

補足

4つの通貨のデーター取得 AUD,EUR,GBP,JPY

(その1)下記のコードをabc.bashとして作成。

# create past csv

cat FUT86_16.txt \
| cut -f 1,3,9,10 -d ',' \
| grep -E 'AUSTRALIAN DOLLARS - INTERNATIONAL MONETARY MARKET
          |AUSTRALIAN DOLLARS - CHICAGO MERCANTILE EXCHANGE
          |AUSTRALIAN DOLLAR - CHICAGO MERCANTILE EXCHANGE' \
| cut -f 2,3,4 -d ',' \
| tr '-' '/' \
| tr -d ' ' \
| sort -t, -k 1 -r \
> past_AUD.csv


cat FUT86_16.txt \
| cut -f 1,3,9,10 -d ',' \
| grep -E 'EURO FX - INTERNATIONAL MONETARY MARKET
          |EURO FX - CHICAGO MERCANTILE EXCHANGE' \
| cut -f 2,3,4 -d ',' \
| tr '-' '/' \
| tr -d ' ' \
| sort -t, -k 1 -r \
> past_EUR.csv


cat FUT86_16.txt \
| cut -f 1,3,9,10 -d ',' \
| grep -E 'BRITISH POUND STERLING - CHICAGO MERCANTILE EXCHANGE
          |BRITISH POUND STERLING- NEW - INTERNATIONAL MONETARY MARKET' \
| cut -f 2,3,4 -d ',' \
| tr '-' '/' \
| tr -d ' ' \
| sort -t, -k 1 -r \
> past_GBP.csv


cat FUT86_16.txt \
| cut -f 1,3,9,10 -d ',' \
| grep -E 'JAPANESE YEN - CHICAGO MERCANTILE EXCHANGE
          |JAPANESE YEN - INTERNATIONAL MONETARY MARKET' \
| cut -f 2,3,4 -d ',' \
| tr '-' '/' \
| tr -d ' ' \
| sort -t, -k 1 -r \
> past_JPY.csv


# create this year csv

cat annual.txt \
| cut -f 1,3,9,10 -d ',' \
| grep -E 'AUSTRALIAN DOLLARS - INTERNATIONAL MONETARY MARKET
          |AUSTRALIAN DOLLARS - CHICAGO MERCANTILE EXCHANGE
          |AUSTRALIAN DOLLAR - CHICAGO MERCANTILE EXCHANGE' \
| cut -f 2,3,4 -d ',' \
| tr '-' '/' \
| tr -d ' ' \
| sort -t, -k 1 -r \
> thisYear_AUD.csv


cat annual.txt \
| cut -f 1,3,9,10 -d ',' \
| grep -E 'EURO FX - INTERNATIONAL MONETARY MARKET
          |EURO FX - CHICAGO MERCANTILE EXCHANGE' \
| cut -f 2,3,4 -d ',' \
| tr '-' '/' \
| tr -d ' ' \
| sort -t, -k 1 -r \
> thisYear_EUR.csv


cat annual.txt \
| cut -f 1,3,9,10 -d ',' \
| grep -E 'BRITISH POUND STERLING - CHICAGO MERCANTILE EXCHANGE
          |BRITISH POUND STERLING- NEW - INTERNATIONAL MONETARY MARKET' \
| cut -f 2,3,4 -d ',' \
| tr '-' '/' \
| tr -d ' ' \
| sort -t, -k 1 -r \
> thisYear_GBP.csv


cat annual.txt \
| cut -f 1,3,9,10 -d ',' \
| grep -E 'JAPANESE YEN - CHICAGO MERCANTILE EXCHANGE
          |JAPANESE YEN - INTERNATIONAL MONETARY MARKET' \
| cut -f 2,3,4 -d ',' \
| tr '-' '/' \
| tr -d ' ' \
| sort -t, -k 1 -r \
> thisYear_JPY.csv

# concatenate files
cat past_AUD.csv thisYear_AUD.csv | sort -t, -k 1 -r > IMM_AUD.csv
cat past_EUR.csv thisYear_EUR.csv | sort -t, -k 1 -r > IMM_EUR.csv
cat past_GBP.csv thisYear_GBP.csv | sort -t, -k 1 -r > IMM_GBP.csv
cat past_JPY.csv thisYear_JPY.csv | sort -t, -k 1 -r > IMM_JPY.csv

# deletet temporary files
rm past_* thisYear_*

(その2)2つのtextデーターをダウンロードして解凍する(FUT86_16.txt, annual.txt)

(その3)csvファイルを作成する

$ bash abc.bash
$ ls *csv
IMM_AUD.csv IMM_EUR.csv IMM_GBP.csv IMM_JPY.csv
Remove all ads