gikoha’s blog

個人的メモがわり

visual studio code

perlではプロジェクトではないのでどこかに行ってしまう可能性
またエンコードの問題やらスクリプトの遅さやら可読性の悪さやらが問題あり
 
swiftはいちおうコンパイルされるので小さい
しかしxcodeではいままでかなり重かった
 

Visual Studio Code – コード エディター | Microsoft Azure

で書いて、swiftcでコンパイル・リンクまで済ませてしまえば、スクリプトがわりの手軽さで使える
 
1. 1つのプロジェクトに1つのフォルダーを作る

コマンドラインから下記を発行

swift package init --type executable

(executableをつけないと、コマンドラインツールにならない)

2. .vscodeフォルダを作る
3. フォルダのなかにtasks.jsonを入れる
 
{
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "swiftc",
            "args": ["-o","${fileBasenameNoExtension}","${file}"],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
 
4. ターミナル>ビルドタスクの実行を選ぶと、fileをコンパイルしてfileBasenameNoExtensionの実行ファイルを作ってくれる
 
visual studio codeへの Swift LangServerのインストール方法
 
$ cd sourcekit-lsp
$ swift build -c release
 
.cshrcに追加
setenv PATH "$HOME/.nodebrew/current/bin:$PATH"
setenv SOURCEKIT_TOOLCHAIN_PATH /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
 
brew install nodebrew
nodebrew setup_dirs
nodebrew install-binary latest
nodebrew list
nodebrew use latest
 
cd ~/Develop/sourcekit-lsp/Editors/vscode
npm run createDevPackage
npm audit fix
code --install-extension out/sourcekit-lsp-vscode-dev.vsix
 
vscodeの設定画面から
Server Path: /Users/XXXXXXXX/sourcekit-lsp/.build/release/sourcekit-lsp
Toolchain Path: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
 
を設定
 

f:id:gikoha:20191111210736p:plain

おおこれは便利

宛名職人からキタムラへ

宛名書きデータ変換用perl

やっぱりperlは楽

swiftバイナリが32kbなのにkotlin jarが 1.31MBっておかしいだろ.. 

 

#!/usr/bin/perl

# change Atena CSV (sjis) to kitamura
# perl -f jushoChanger.pl <jusho.csv
# atena23からは
# 姓、名、敬称、連名、連名敬称、自宅〒、自宅住所1、自宅住所2、自宅住所3形式で SJIS CSVで書き出す
use utf8;

binmode STDOUT, ":utf8";
binmode STDIN, ":encoding(cp932)";

print "姓1,名1,敬称1,姓2,名2,敬称2,姓3,名3,敬称3,姓4,名4,敬称4,姓5,名5,敬称5,姓6,名6,敬称6,〒番号,住所1,住所2,住所3,会社名,部署,役職,御中
\n";

while(<>) {
	chomp;
    @i = split(/,/, $_);
    @j = split(/\//, $i[3]);		# はげ/ほげ/えげ/ぼけ
    @k = split(/\//, $i[4]);		# 様///
    printf("%s,%s,%s,,%s,%s,,%s,%s,,%s,%s,,%s,%s,,,,%s,%s,%s,%s\n",
    	$i[0],$i[1],$i[2],			# 姓1,名1,敬称1,
	    $j[0],$k[0],				#    ,名2,敬称2,
	    $j[1],$k[1],				#    ,名3,敬称2,
	    $j[2],$k[2],				#    ,名4,敬称2,
	    $j[3],$k[3],				#    ,名5,敬称2,
	    $i[5],$i[6],$i[7],$i[8] 	# 〒番号,住所1,住所2,住所3,
	    );
}
	

swift版

// main.swift
import Cocoa

let args = CommandLine.arguments.dropFirst()

guard let file = args.first, !file.isEmpty else
{
    print("ERROR: please input filename")
    exit(1)
}

let fileName: String = "./" + file
// print("filename: \(fileName)")

print("姓1,名1,敬称1,姓2,名2,敬称2,姓3,名3,敬称3,姓4,名4,敬称4,姓5,名5,敬称5,姓6,名6,敬称6,〒番号,住所1,住所2,住所3,会社名,部署,役職,御中")

// 姓、名、敬称、連名、連名敬称、自宅〒、自宅住所1、自宅住所2、自宅住所3形式で SJIS CSVで書き出されている

if let text = try? String(contentsOfFile: fileName, encoding: String.Encoding.shiftJIS)
{
    text.enumerateLines { (line, stop) in
        let item = line.components(separatedBy: ",")
        var sub = item[3].components(separatedBy: "/")          // 連名
        sub.append("")  // 連名がないときに備えて4個ほど""アイテムを追加
        sub.append("")
        sub.append("")
        sub.append("")
        var subkei = item[4].components(separatedBy: "/")       // 連名敬称
        subkei.append("")   // 連名がないときに備えて4個ほど""アイテムを追加
        subkei.append("")
        subkei.append("")
        subkei.append("")
        print("\(item[0]),\(item[1]),\(item[2]),,\(sub[0]),\(subkei[0]),,\(sub[1]),\(subkei[1]),,\(sub[2]),\(subkei[2]),,\(sub[3]),\(subkei[3]),,,,\(item[5]),\(item[6]),\(item[7]),\(item[8])")
    }
}

exit(0)

kotlin版

// kotlinc -d jushoChanger.jar -include-runtime src/main.kt
//

import java.io.File
import kotlin.system.exitProcess

fun main(args: Array<String>)
{
    if(args.size!=1)
    {
        println("ERROR: please input filename")
        exitProcess(1)
    }
    var fileName = args.first()
    //println(fileName)
    println("姓1,名1,敬称1,姓2,名2,敬称2,姓3,名3,敬称3,姓4,名4,敬称4,姓5,名5,敬称5,姓6,名6,敬称6,〒番号,住所1,住所2,住所3,会社名,部署,役職,御中")
    val textFile = File(fileName).absoluteFile
    val lines = textFile.readLines(charset("windows-31j"))
    lines.forEach {
        val i = it.split(",")
        var j = i[3].split("/").toMutableList()
        j.add("")
        j.add("")
        j.add("")
        j.add("")

        var k = i[4].split("/").toMutableList()
        k.add("")
        k.add("")
        k.add("")
        k.add("")

        val s = "%s,%s,%s,,%s,%s,,%s,%s,,%s,%s,,%s,%s,,,,%s,%s,%s,%s".format(
            i[0],i[1],i[2],
            j[0],k[0],
            j[1],k[1],
            j[2],k[2],
            j[3],k[3],
            i[5],i[6],i[7],i[8]
            )
        println(s)
    }
}

ChartExample

SwiftでChartsを書く練習

 参考:

Creating a Line Chart in Swift and iOS - Osian Smith - Medium

 

まずXcodeを立ち上げる

新規Cocoaプロジェクト>Swiftで ChartExampleプロジェクトを作成

参考ページではcocoapodsが入っていることが前提だったが入っていなかったのでインストール

"sudo gem install cocoapods"

terminalでChartExmapleのdirectoryに移動後、"pod init"

そこにあるPodfileを編集, "pod 'Charts'"という行を付け加える

再度 terminalから、"pod install"でダウンロード&インストール

f:id:gikoha:20190909202755p:plain

そしてChartExample.xcworkspaceファイルを開き直すとChartExampleに加えてPodsというプロジェクトも含まれてくる

f:id:gikoha:20190909202821p:plain

Main.storyboardをWクリックして編集、いくつかのアイテムを追加する グラフのところはCustom Viewを置く

f:id:gikoha:20190909203315p:plain

 Custom Viewのクラス名をBarChartViewに変更

f:id:gikoha:20190909203357p:plain

右上のリンクボタン(下の図の真ん中の2つの輪)をおして

f:id:gikoha:20190909205912p:plain

controlキーを押しながら、Text Fieldの中身をソースコードまでcontrol+ドラッグしてoutletを作る (下の図ではTextFieldCellになっているがそれじゃだめでTextFieldの方をドラッグしてね)

f:id:gikoha:20190909205830g:plain

同じようにAddボタンをcontrol+ドラッグしてactionを作る

f:id:gikoha:20190909210342g:plain

View Controllerにoutletコードを追加

f:id:gikoha:20190909215902p:plain
storyboardのView ControllerからCustom Viewへ同様にリンクを張ってoutletを接続

最後にボタンを押したときのコードを追加して終了

//
//  ViewController.swift
//  ChartExample
//
//  Created by Namikare Gikoha on 2019/09/09.
//  Copyright © 2019 Namikare Gikoha. All rights reserved.
//
import Foundation
import Cocoa
import Charts

class ViewController: NSViewController {
    @IBOutlet weak var value: NSTextField!
    @IBOutlet weak var chart: BarChartView!
    
    var numbers : [Double] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    @IBAction func addAction(_ sender: Any) {
        let hoge = Double(value.stringValue)
        numbers.append(hoge!)
        updateGraph()
    }
    
    func updateGraph()
    {
        var barChartEntry  = [BarChartDataEntry]()
        for i in 0..<numbers.count
        {
            let value = BarChartDataEntry(x: Double(i), y: numbers[i])
            barChartEntry.append(value)
        }
        
        let bar1 = BarChartDataSet(entries: barChartEntry, label: "Data")
        
        let data = BarChartData()
        
        data.addDataSet(bar1)
        
        chart.data = data
        chart.chartDescription?.text = "Test"
    }
}

(上記は"highlight ViewController.swift -O html --font=Menlo --inline-css -f --enclose-pre --style=github | pbcopy")で記事を作成して貼り付けた

こんな感じになりました

f:id:gikoha:20190909221719p:plain

 

DropBoxを諦めた

DropBoxが3コンピュータのみしか同期できなくなった

Dropboxの代わりに最適なのは? 3つの無料オンラインストレージを徹底比較 : SIerブログ

iCloud, OneDriveがあったが、iCloudはちょっとWinと連携が悪いのと別コンピュータで別ID使っていると別のiCloud IDを接続できなかったりやっぱりちょっとよくない

OneDriveはOffice365 for Business使っている都合上1TBも容量があったためそっちメインでいくことにしました

 

DataGraph

グラフを書くときいままで大昔に買ったPrism5を使っていたが、こいつはコンピュータごとのIDに紐ついていて別コンピュータで使えない

最新版にしようとすると12万!とても買えない

しかしエラーバーのいろんな書き方があってRと相性がよかった

(mean-value,sd,N)のペアを書き出すだけで実データを貼り込まずにすんだ

 

最近そんなのがないかなと思ってMacAppStoreをさがすとDataGraphがあった

こいつは実データを入れないと箱ヒゲ図がうまく書けないが、一方でBracketを追加したりするのがわりと簡単で、それをkeynoteに貼り付けたりするのに相性がよい

何より1万で売り切りなのがよいかな

そんでこっちでやってみることにした

こんなかんじ

f:id:gikoha:20190403011627p:plain

DataGraph

Rからの実データの書き出し方法は

con <- pipe("pbcopy", "w"); cat(paste(d$ldlhdlr,d$emergency,sep="\t",file=con), sep="\n"); 
close(con)

を行うとクリップボードにコピーできるのでそれをその都度Dataに貼り付けている

だがあまり褒められた方法じゃないな..

Reformat Yahoo Transit

ReformatYahooTransit.jar

Yahoo路線情報の画面をコピーして evernoteなどにペーストしやすくするJavaプログラム
Yahoo路線情報をsafari/chromeで開き、
ルートXを含めたところにマウスカーソルをおき、到着までの範囲をコピーしてから起動
Convert..ボタンを押すと下に表示
たとえば

ルート1
[早][楽][安]
17:20発→20:01着2時間41分(乗車2時間17分)乗換:1回[priic]IC優先:14,940円(乗車券8,420円 特別料金6,520円)538.1km
[reg]ルート保存
[commuterpass]定期券
[share]ルート共有
[print]印刷する
17:20
[dep] 東京 時刻表出口地図 ホテル
[line]
[train]JR新幹線はやぶさ33号・新函館北斗
22番線発 / 14番線着
4駅
指定席:6,520円
19:33着19:57発 [train] 盛岡 時刻表地図
[line]
[train]JR山田線・宮古
2番線発
現金:8,420円
20:01
[arr] 上盛岡 時刻表地図 」
とコピーされた文字列が、

17:20発→20:01着2時間41分(乗車2時間17分)乗換:1回
17:20発 東京 JR新幹線はやぶさ33号・新函館北斗行 22番線発 / 14番線着 19:33着
19:57発 盛岡 JR山田線・宮古行 2番線発 20:01着 上盛岡

と整形される

Binary download: https://www.axfc.net/u/3967897.jar

github

GitHub - vascarpenter/ReformatYahooTransit

なんでこれを作ったか?そりゃー内科学会総会に行くためさ。