callmekohei's blog

callmekoheiのひとりごと

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

トレードに役に立つかもしれないチャートを作成してみたった

Summary

ポンドの実効為替レートと対円相場のチャートを

Monthly, Dailyで作成した

こんな感じ

Monthly

f:id:callmekohei00:20170820174630p:plain

Daily

f:id:callmekohei00:20170820174647p:plain

JPY plus

f:id:callmekohei00:20170820225824p:plain

上昇・下降の値動き

f:id:callmekohei00:20170820225922p:plain

作成方法

必要なもの

  • 実効為替レート

Bank of England Statistical Interactive Database | Interest & Exchange Rates

Effective exchange rates > Daily もしくは Effective exchange rates > End month を選んで Show dataGo to output inHTMLを選ぶとデーターが出力される

  • 過去のプライス

OANDA APIで取得する

code

#r "./packages/FSharp.Data/lib/net40/FSharp.Data.dll"
open FSharp.Data

#load "../OANDAfs/oandafs.fsx"
open callmekohei
open callmekohei.Oandafs
let env   = Environment.Live
let id    = "xxxx"
let token = "xxxx"
let info  = API().Init( env, id, token )

let currency = "GBP_JPY"

let response = Oandafs.Rates(info).Get_History [("instrument",currency)
                                       ;("count","5000")
                                       ;("candleFormat","midpoint")
                                       ; granularity.D
                                       ; dailyAlignment.H9
                                       ; alignmentTimezone.Japan
                                       ]

let jsonValue = FSharp.Data.JsonValue.Parse response
let candles = jsonValue.GetProperty "candles"
let closePrice = candles.AsArray() |> Array.map ( fun jv -> jv.GetProperty("closeMid").AsFloat())  |> Array.toList
let time = candles.AsArray() |> Array.map ( fun jv -> jv.GetProperty("time").AsString() ) |> Array.toList

(time,closePrice)
||> List.map2( fun a b -> (System.DateTime.Parse(a).ToUniversalTime(),b))
|> List.iter ( fun (a,b) -> printfn "%s %A" (a.ToString("dd-MMM-yy")) b )

// (time,closePrice)
// |> List.iter stdout.WriteLine

ひっかかりポイント

DailyのデーターがBOEOANDAで日付が一致しない箇所がある

(対策) エクセルのvlookup関数で一致させる

このチャートでわかること

現在2つのレートに乖離はみられない

callmekoheiの勝手な妄想

f:id:callmekohei00:20170820183152p:plain

index75 を割り込むとさらに下落する可能性があるが反発するポイントでもある

つまり

125円程度まで下落してそこから反発してあげる?
Remove all ads

OANDA API を使ってトレード回数表を作ってみたった

f:id:callmekohei00:20170813140152p:plain

Summary

月度毎のトレード回数表を作成する

作成方法その1

ログイン > 口座管理 > 各種帳票ダウンロード > 取引履歴

で一ヶ月毎の帳票を出力して作成する

(よろしくないところ)
すごく手間がかかる

作成方法その2

REST APIを使用する

必要なもの

wget

jq

OANDAfs

wget, jqbrew install wget, brew install jqでもってこれます。

OANDAfsこちらから

トランザクションのデーターをもってくる

こんな感じ

#load "./oandafs.fsx"
open callmekohei
open callmekohei.Oandafs
let env   = Environment.Live
let id    = "xxxxx"
let token = "xxxxx"
let info  = API().Init( env, id, token )

Transaction(info).Get_all_transactions()
|> printfn "%A"

結果

Server: openresty/1.9.15.1
Date: Sun, 13 Aug 2017 05:06:54 GMT
Content-Type: application/json
Content-Length: 0
Connection: keep-alive
Location: https://fxtrade.oanda.com/transactionhistory/xxxxx.json.zip
Access-Control-Allow-Origin: *

ここでLocationに示されたアドレスからzipフィアルをげっつ

$ wget https://fxtrade.oanda.com/transactionhistory/xxxxx.json.zip

$ unzip xxxxx.json.zip
月度のトランザクションの総数を求める

こんなかんじ

$ cat abc.json \
> | jq 'map(select(.["time"] >= "2017-06-01T00:00:00Z")) | map(select(.["time"] <="2017-06-31T00:00:00Z"))' \
> | jq '.[] | .accountId' \
> | wc -w
     198
月度のトランザクションのタイプ別個数を求める

こんなかんじ

ここで先程のトランザクションの総数とタイプ別の個数の総数が一致しているか一応確認しておく

$ cat abc.json | jq 'map(select(.["time"] >= "2017-06-01T00:00:00Z")) | map(select(.["time"] <="2017-06-31T00:00:00Z"))' \
> | jq '.[] | .type' | sort | uniq -c | sort -r
 129 "MARKET_ORDER_CREATE"
  22 "MARGIN_CLOSEOUT"
  14 "DAILY_INTEREST"
   9 "ORDER_UPDATE"
   7 "TRANSFER_FUNDS"
   6 "ORDER_CANCEL"
   5 "BuyLimit"
   2 "ChangeOrder"
   1 "SellLimit"
   1 "ORDER_FILLED"
   1 "CloseOrder"
   1 "BuyStop"
月度の新規注文数を求める

こんなかんじ

$ cat abc.json | jq 'map(select(.["time"] >= "2017-06-01T00:00:00Z")) | map(select(.["time"] <="2017-06-31T00:00:00Z"))' \
> | jq '.[] | .tradeOpened.id' | sort | uniq | wc -w | awk '{print $1}'
73
月度の決済数を求める

こんなかんじ

CloseTradeB
MARGIN_CLOSEOUT
MARKET_ORDER_CREATE
ORDER_FILLED

上記の合計が総注文数となるので、そこから新規注文数をひけば決済数がでます。

ここでは総注文数が152、新規注文数が73なので決済数は

152 - 73 = 79

 年間のトレード回数表を作成する

こんなかんじ

foo.bash

jsonFile=$1
Year=$2

orderTotal() {
    file=$1; start=$2; end=$3
    cat $file \
    | jq 'map(select(.["time"] >= "'$start'")) | map(select(.["time"] <= "'$end'"))' \
    | jq '.[] | .type' | sort | grep -E "CloseTradeB|MARGIN_CLOSEOUT|MARKET_ORDER_CREATE|ORDER_FILLED" \
    | wc -w | awk '{print $1}'
}

openTotal() {
    file=$1; start=$2; end=$3
    cat $file \
    | jq 'map(select(.["time"] >= "'$start'")) | map(select(.["time"] <= "'$end'"))' \
    | jq '.[] | .tradeOpened.id' | sort | uniq | wc -w | awk '{print $1}'
}

echo 'M,Total,Open,Close'

for i in $(seq -w 1 12) ; do
    fst=$Year'-'$i'-01T00:00:00Z'
    lst=$Year'-'$i'-31T00:00:00Z'

    OrderTotal=`orderTotal $jsonFile $fst $lst`
    OpenTotal=`openTotal  $jsonFile $fst $lst`

    echo $i,$OrderTotal,$OpenTotal,$(( $OrderTotal - $OpenTotal ))
done

こんな感じで使う

csvlookはsudo pip3 install csvkitでゲッツ

$ echo ./abc.json 2017 | xargs bash foo.bash | csvlook
|  M | Total | Open | Close |
| -- | ----- | ---- | ----- |
|  1 |   142 |   68 |    74 |
|  2 |    77 |   39 |    38 |
|  3 |   105 |   51 |    54 |
|  4 |   116 |   52 |    64 |
|  5 |   150 |   68 |    82 |
|  6 |   152 |   73 |    79 |
|  7 |     0 |    0 |     0 |
|  8 |     2 |    3 |    -1 |
|  9 |     0 |    0 |     0 |
| 10 |     0 |    0 |     0 |
| 11 |     0 |    0 |     0 |
| 12 |     0 |    0 |     0 |
Remove all ads

Mac OSX で MT4 (MetaTrader4) をつかってみたった

f:id:callmekohei00:20170808211305p:plain

Summary

Mac OSXMetaTrader4を使う方法

準備

必要なもの

  1. PlayOnMac
  2. MetaTrader4

PlayOnMacをインストール

ここを参考にインストール

www.metatrader4.com

MacでMT4を使ってみよう | 株式会社クロスブリッジ XBRIDGE

re-dockの仕方

ウインドウとウインドウの間にフローティングしたウインドウをもってきて右側をダブルクリック

f:id:callmekohei00:20170810162525g:plain

custom indicators のインストール

f:id:callmekohei00:20170808204831p:plain

Step1

Data Folderをひらく

MT4 > File > Open Data Folder

Step2

indicators Folder をひらく

mql4 > indicators

Step3

もう一度 Data Folder をひらく

ファイルを保存した場所に行って Copy

Step4

Data Folder で Paste

日本語表示

f:id:callmekohei00:20170905105035p:plain

(その1)

.bash_profileに下記を追記

export LANG="ja_JP.UTF-8"
export LC_ALL=$LANG
export LC_ALLLANG=$LANG
export LC_CTYPE=$LANG
export POL_LANG="en"

(その2) フォントをインストール

IPAフォントをダウンロード IPAフォントのダウンロード

下記に入れる(フォルダはなかったらつくる)

/Users/callmekohei/Library/PlayOnMac/fonts

/Users/callmekohei/Library/PlayOnMac/wine/darwin-x86/2.14/share/wine/fonts

/Users/callmekohei/Library/PlayOnMac/wineprefix/default/drive_c/windows/Fonts
Remove all ads

マックの環境復旧の個人的メモ

Summary

クリーンインストールしたmacを元の環境に戻すメモ

事のなり行き

先日、ターミナルでrm -rf /etcとかやったら

マックが立ち上がらなくなりました。

f:id:callmekohei00:20170802152638j:plain

先程アップルストア福岡に行ったら

可愛らしい若いエンジニアさんが

直してくれました!

f:id:callmekohei00:20170802152739j:plain

ので環境復旧します、します

Global setting

change keyboard layout

caps lockcontrolの位置をかえます

f:id:callmekohei00:20170802152029p:plain

f:id:callmekohei00:20170802152038p:plain

spotlight shortcut

command + r で検索窓を表示させます

f:id:callmekohei00:20170802151629p:plain

Japanese input method

日本語を入力できるようにします

入力ソースはHiraganaのみ

f:id:callmekohei00:20170802152304p:plain

ちなみに日本語と英語の切り替えはctrl + space

f:id:callmekohei00:20170805184720p:plain

install font

migmix-2mというfontを使えるようにします

まずmigmix-2mをダウンロードします

MigMixフォント : M+とIPAの合成フォント

つぎにfont Bookmigmix-2mを追加

spotlightを立ち上げて font Book と入力・リターン

ダウンロードした migmix-2m をdrag and drop

f:id:callmekohei00:20170802153738p:plain

other setting

その他こまごまと

siriをunableにする

バッテリー残を表示する

Dockをカーソルが来た時だけ表示する

キーボードのバックライトを消す

文字入力Live Conversionoffにする

Firefoxをインストールする

filename extensionsを表示させる

Excelをインストールする

Terminal setting

ターミナルの設定をやっていきます

terminalそのものの設定

preferenceから設定する

テーマを変える

github.com

フォントをmigmix-2m 14ptに変更

shellタブのwhen the shell exits:のところをClose the windowにする

bashの設定

.inputrcをつくる(bashの操作をvi風にする)

set editing-mode vi
set show-all-if-ambiguous on
set completion-ignore-case on

set keymap vi-command
    "\C-p": history-search-backward
    "\C-n": history-search-forward

set keymap vi-insert
    "\C-p": history-search-backward
    "\C-n": history-search-forward
    "\C-h": backward-char
    "\C-l": forward-char

.bash_profileをつくる

$ vim .bash_profile

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

export LANG=ja_JP.UTF-8
export LESSCHARSET=utf-8

# PATH( left first )
p=""
p=$p'/usr/local/bin'
p=$p':/usr/local/sbin'
p=$p':/usr/sbin'
p=$p':/usr/bin'
p=$p':/bin'
p=$p':/sbin'

export PATH=$p

# NeoVim
export XDG_CONFIG_HOME=$HOME/.config
alias vim='nvim'

.bashrcをつくる

$ vim .bashrc

#!/bin/bash

# http://qiita.com/caad1229/items/6d71d84933c8a87af0c4
function parse_git_branch {
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ [\1]/'
}

function promps {
    local BLUE='\[\033[01;34m\]'
    local RED='\[\033[01;31m\]'
    local GREEN='\[\033[01;32m\]'
    local WHITE='\[\033[0;00m\]'
    local GRAY='\[\033[01;37m\]'
    PS1="${BLUE}\W${GREEN}\$(parse_git_branch)${BLUE}\$${WHITE} "
}

PROMPT_COMMAND='promps'
export CLICOLOR=1
export LSCOLORS=ExFxBxDxCxegedabagacad
export EDITOR=nvim

Vimの設定

VimNeovimに変更する

Home brew をインストール

下記のホームページのスクリプトをターミナルに貼り付けて実行

brew.sh

Neovimのインストール他

// neovim のインストール
$ brew install neovim

// Python3のインストール
$ brew install Python3

// Neovim Python3パッケージのインストール
$ pip3 install neovim

// Python2のインストール
$ brew install Python2

// Neovim Python2パッケージのインストール
$ pip2 install neovim

Neovimの設定

Neovimホームフォルダをつくる

$ mkdir -p ./.config/nvim

.config/nvimに下記を作成

dein.toml

#----------------------------------------------------------
# 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'
build = 'bash install.bash'

[[plugins]]
repo = 'zchee/deoplete-jedi'

[[plugins]]
repo = 'Shougo/vimproc.vim'
build = 'make'


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

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


#----------------------------------------------------------
# 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/fsharpi': {
    \           'exec'   :  [ '%c %s:p:r.fsx' ]
    \         , 'command':  'fsharpi'
    \         , 'args'   :  '%{input("args> ")}'
    \     }
    \
    \     , 'fsharp/fsharpc': {
    \           'exec'   :  [ '%c %s:p:r.fsx', 'mono %s:p:h/bin/%s:p:t:r.exe %a' ]
    \         , 'command':  'koheiEXE'
    \         , 'args'   :  '%{input("args> ")}'
    \     }
    \
    \     , 'fsharp/concurrent_process' : {
    \           'command'                         : 'fsharpi'
    \         , 'tempfile'                        : '%{tempname()}.fsx'
    \         , 'runner'                          : 'concurrent_process'
    \         , 'runner/concurrent_process/load'  : '#load "%S";;'
    \         , 'runner/concurrent_process/prompt': '> '
    \     }
    \
    \     , 'less': {
    \           'exec'   :  [ '%c -clean-css %s:p:r.less' ]
    \         , 'command':  'lessc'
    \     }
    \
    \     , 'python': {
    \           'command': 'python3'
    \     },
    \ }
'''
#----------------------------------------------------------
# Markdown browser
#----------------------------------------------------------

[[plugins]]
repo = 'plasticboy/vim-markdown'

[[plugins]]
repo = 'kannokanno/previm'
hook_add = '''
    let g:previm_open_cmd = 'open -a Firefox'
    let g:previm_disable_default_css = 1
    let g:previm_custom_css_path     = '/Users/kohei/.config/nvim/dein/repos/github.com/kannokanno/previm/preview/css/github.css'

    augroup PrevimSettings
      autocmd!
      autocmd BufNewFile,BufRead *.{md,mdwn,mkd,mkdn,mark*} set filetype=markdown
    augroup END

    let s:githubCss = "/Users/kohei/.config/nvim/dein/repos/github.com/kannokanno/previm/preview/css/github.css"
    let s:address   = "https://gist.githubusercontent.com/andyferra/2554919/raw/10ce87fe71b23216e3075d5648b8b9e56f7758e1/github.css"
    let s:folder    = "/Users/kohei/.config/nvim/dein/repos/github.com/kannokanno/previm/preview/css"

    if isdirectory(s:folder)
        if !filereadable(s:githubCss)
          execute '!wget' s:address '-P' s:folder
        endif
    endif
'''

#----------------------------------------------------------
# Util
#----------------------------------------------------------

[[plugins]]
repo = 'tomtom/tcomment_vim'
hook_add = '''
    if !exists('g:tcomment_types')
        let g:tcomment_types = {}
    endif
    let g:tcomment_types['fsharp'] = '// %s'
'''

[[plugins]]
repo = 'junegunn/vim-easy-align'
hook_add = '''
    xmap ga <Plug>(EasyAlign)
    nmap ga <Plug>(EasyAlign)
'''

[[plugins]]
repo = 'cespare/vim-toml'

init.vim

"----------------------------------------------------------
" 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

"----------------------------------------------------------
" Neovim's Python provider
"----------------------------------------------------------
let g:python_host_prog  = '/usr/local/bin/python2.7'
let g:python3_host_prog = '/usr/local/bin/python3.6'

"----------------------------------------------------------
" General
"----------------------------------------------------------
" Tab
set shiftwidth=4            "vimが自動でインデントを行った際、設定する空白数
set tabstop=4               "<TAB>を含むファイルを開いた際、<TAB>を何文字の空白に変換するかを設定
set softtabstop=4           "キーボードで<TAB>を入力した際、<TAB>を何文字の空白に変換するかを設定
set expandtab               "タブ文字を空白に設定する。shofttabstopとセットで使用すると便利

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

" 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 birds-of-paradise
" colorscheme Apprentice


" 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

check

$ vim abc.fsx

"hello world"
|> stdout.Write
hello world

その他のコマンド

wget

hub gibo

Remove all ads

F#でお気楽にテスト!(Persimmon.Script編)

Summary

とにかく手間をかけずにテストしたい人

Persimmon.Scriptで決まり!

Persimmon.Scriptとは?

F#スクリプトお気楽にテストできるライブラリ〜

つまりはメンドくさがりな人向けのライブラリ〜

特徴

  1. とにかく手間がかからない

  2. お手軽なのでテストファースト的に使える
    (テスト書いて実行がサクサクできる)

  3. Travisなどのテストスクリプトも簡単にかける
    exe,dll依存をconfigファイルに書く必要がない)

使い方

まずはPersimmon.Scriptnugetしませう。

nuget persimmon.script

こんな感じのコードを書いてみる

/// Persimmonライブラリ一式をrequire and open
#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 Persimmon
open UseTestNameByReflection

/// テストレポート出力用に必要
open System.Reflection

/// こんな感じでテストをかく
let myTest = test {
    do! assertEquals 1 2
}

/// テスト結果を出力
Script.testReport( fun _ -> Assembly.GetExecutingAssembly() )
|> stdout.WriteLine

結果

begin FSI_0001
 Assertion Violated: myTest
 1. Expect: 1
    Actual: 2
end FSI_0001
============================== summary ===============================
run: 1, error: 0, violated: 1, skipped: 0, duration: 00:00:00.0840830

本当にお手軽ですね!

さらに

従来だとexe, dllの依存関係をPersimmon.Console.exe.configファイルに

書かないといけませんでしたが、

Persimmon.Scriptだとその必要がないです。

よくわからないかもしれませんが

つまりはお手軽〜なのです。

こんな感じ

外部Dll

add10.fsx

namespace callmekohei

module Util =
    let add10 n =
        n + 10

これを $ fsahrpc -a add10.fsxとしてadd10.dllを作る

code
/// 外部dll(依存してるdll)をrequireするだけ!
#r "./add10.dll"
open callmekohei.Util

/// Persimmonライブラリ一式をrequire and open
#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 Persimmon
open UseTestNameByReflection

/// テストレポート出力用に必要
open System.Reflection

/// テストを書く
let myTest = test {
    do! assertEquals 1 ( add10 1 )
}

/// テスト結果を出力
Script.testReport( fun _ -> Assembly.GetExecutingAssembly() )
|> stdout.WriteLine

結果

begin FSI_0005.MyTest_deoplete-fsharp_temporary_file
Assertion Violated: myTest
1. Expect: 1
Actual: 11
end FSI_0005.MyTest_deoplete-fsharp_temporary_file
============================== summary ===============================
run: 1, error: 0, violated: 1, skipped: 0, duration: 00:00:00.0687324

本当にお手軽ですね!

感想

本当に便利なライブラリをありがとうございます!!!

参考

Persimmon.Scriptはここからナゲット!(ダウンロード)

NuGet Gallery | Packages matching persimmon.script

開発に参加したい・要望がある〜という人はこちら

github.com

Remove all ads

F#を気軽にテスト〜・それVimで

Summary

F#のコードをVimで手軽にテストしてみた

こんな感じ

必要なもの

  • Neovim
  • deoplete-fsharp

テストの仕方

  • Persimmonをゲッツ(Nuget, Paketおこのみで)
  • テストコードを書く
  • :Persimmonコマンドを実行

いいところ

気軽にテストできるところ(Persimmonコマンドを入力するだけ)

残念なところ

結果が出るまでに3秒ほどかかること

ちょっとした解説

Persimmonコマンドは以下のように動作します

同じフォルダに`Persimmon.Console.exe`があるか?
↓
同じフォルダに`tools`フォルダがあるか?(あればそのなかに`Persimmon.Console.exe`があるか?)
↓
同じフォルダに`Packages`フォルダがあるか?(あればそのなかに`Persimmon.Console.exe`があるか?)
↓
上記で見つからなければ`deoplete-fsharp`の`Persimmon.Console.exe`を使う






tutorial 01

Persimmon を使った簡単なテスト

paketコマンドはこちらを参照

// 実験フォルダをつくる
$ mkdir jikken

// 実験フォルダに移動
$ cd jikken

// paketを初期化
$ paket init

// ダウンロードするファイルをかく
$ vim paket.dependencies 

***********************
*
*   source https://www.nuget.org/api/v2
*   nuget Persimmon.Console -OutputDirectory tools -ExcludeVersion
*
***********************

// ダウンロード
$ paket install

// テストコードをかく
$ vim test.fsx

code

#r "./packages/Persimmon.Console/tools/Persimmon.dll"
open Persimmon
open UseTestNameByReflection

let add   x y = x + y

let ``first test example`` = test {
    do! assertEquals 6 (add 1 5)
}

Persimmonコマンドを実行

: Persimmon

結果

.
============================== summary ===============================
run: 1, error: 0, violated: 0, skipped: 0, duration: 00:00:00.0934450


*** time : 3.035613 s ***


tutorial 02

tutorial 01 のつづき( jikken フォルダーにいるものとします)

依存のある`dll, exe`をサブフォルダにまとめる方法


dll, exeをまとめるlibフォルダをつくってPersimmonのサブフォルダにする

// libフォルダをつくる
$ mkdir lib

// コードをかく
$ vim ./lib/hello.fsx

code

namespace callmekohei

module Hello =

    let say (word:string) =
        word + " hello!"
// dllファイルを作成
$ fsharpc -a ./lib/hello.fsx

// libフォルダを Persimmon.Console.exe の下におく
$ mv  /lib packages/Persimmon.Console/tools/

ファイルの状況
jikken$ tree packages/
packages/
├── Paket
│   ├── Paket.nupkg
│   └── tools
│       └── paket.exe
└── Persimmon.Console
    ├── Persimmon.Console.2.0.1.nupkg
    ├── Persimmon.Console.nuspec
    ├── [Content_Types].xml
    ├── _rels
    ├── license.html
    ├── package
    │   └── services
    │       └── metadata
    │           └── core-properties
    │               └── coreProp.psmdcp
    └── tools
        ├── FSharp.Core.dll
        ├── Persimmon.Console.exe
        ├── Persimmon.Console.exe.config
        ├── Persimmon.Runner.dll
        ├── Persimmon.Runner.dll.config
        ├── Persimmon.dll
        ├── Persimmon.dll.config
        ├── System.ValueTuple.dll
        └── lib    <-------------------- sub foler!
            ├── hello.dll
            └── hello.fsx

10 directories, 17 files

設定ファイル(Persimmon.Console.exe.config)を書き直す

$ vim packages/Persimmon.Console/tools/Persimmon.Console.exe.config 

下記のようにかく(<probing privatePath="lib"/>を追加するだけ)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      
      <!-- Look for addins in the addins directory for now -->
      <probing privatePath="lib"/> 
      
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.4.1.0" newVersion="4.4.1.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

テストファイルを作成する

// テストファイル test2.fsx を作成する
$ vim test2.fsx

code

#r "./packages/Persimmon.Console/tools/Persimmon.dll"
open Persimmon
open UseTestNameByReflection

#r "./packages/Persimmon.Console/tools/lib/hello.dll"
open callmekohei


let ``first test example`` = test {
    do! assertEquals "abc" ( Hello.say "hello" )
}

test実施(Persimmonコマンド実行)

: Persimmon

結果

x
begin Test2_deoplete-fsharp_temporary_file
Assertion Violated: first test example
1. Expect: "abc"
Actual: "hello hello!"
end Test2_deoplete-fsharp_temporary_file
============================== summary ===============================
run: 1, error: 0, violated: 1, skipped: 0, duration: 00:00:00.1194835


*** time : 2.941333 s ***

おまけ

超気軽なテスト

code

#r "./packages/Persimmon.Console/tools/Persimmon.dll"
open Persimmon

let add   x y = x + y

assertEquals 1 ( add 1 1)
|> printfn "%A"

:QUICKRUNfsを実行

NotPassed (None,Violated "Expect: 1
Actual: 2")


*** time : 0.072349 s ***

これならはやい!

Remove all ads