windowsのkaoriya版gvimでvimtutorを開く話

2016/12/14追記
kaoriya版gvimでvimtutorを開くには
:Tutorialコマンドでokらしいですorz
crazymasterさん指摘ありがとうございますm(_ _)m
github.com



( ´_ゝ`)ノシ
yoshitiaです。
他人にはVim歴の方が長いのにEmacs使いと認識されてたり、
やたらExcelVBAに詳しそうと認識されてるようです。
(当人はえっそうなん?状態)

BASIC派生言語が習得しやすい言語で、
Excelが基本機能+VBA+ユーザーフォームをフルに使えば、
下手な業務システムを絶滅させられる、
そのくらいのポテンシャルを持ってるのは理解しています。

が、「VBA専門の人」と認識されると
ツール制限のキツイ環境で
VimEmacsも使えない確率が高い現場になるので
すっごく避けたいです。

・・・本題。

windowsのkaoriya版gvimでvimtutorを開く

1. <Esc>:e $VIMRUNTIME\tutor\vimtutor.ja.utf-8と入力してEnter。
上手く表示されない場合は
<Esc>:e $VIMRUNTIME\tutor\vimtutor.ja.sjisを試す。
2. <Esc>:w! TUTOCOPY
3. 一旦gvim閉じた後再開する場合は<Esc>:vi TUTOCOPY

先日yokohama.vim #8 に参加したVim初心者の方に教えておけば良かったな。

上記手順が良くわからない人向け

下記ページを保存してvimtutor.batファイルをデスクトップに作ってクリックする。

https://raw.githubusercontent.com/airblade/vim/master/vimtutor.bat

おまけ: windowsのkaoriya版Vim8の標準パッケージマネージャを利用したプラグインインストール

1. vimrcにset packpath=~/.vimと書く
2. ~.vimフォルダにpackフォルダ作ってその中にstartフォルダを作る
3. startフォルダの中にプラグインをフォルダごと置く

これで動く。便利になったなぁ。
頻繁にプラグインをインストール・アンインストールするなら
neobundleかdein.vimが楽です。

カービングとモデリングとプログラミング

( ´_ゝ`)ノシ
yoshitiaです。

特に何という事はなく気になった単語をメモる。

コンピュータ・ソフトウェア関連は建築や芸術分野から
用語が輸入されたりするらしい。

こういうのは語源から調べるとイメージの助けになる。

モデリング、の単語が気になって調べていたら
彫刻の分野では、作品を制作する技法に
カービング と モデリング というものがあると。

カービング(Carving)
木や石、金属等の硬い素材を削りだすことで
彫刻を作成する技法
モデリング(Modeling)
粘土等の軟らかい素材を盛ったり削ったり整えたりして
彫刻を作成する技法

モデリングは聞いた事あるけど
カービングは知らなかった。

カービングはイメージ通り、削り出しの一発勝負で
やり直しが難しいみたい。

仏師さんだと「完成像をはっきりさせたら、それを素材から取り出す」
と表現するみたい。

プロジェクトで言ったら、
過去に実績のあるシステムで
要件定義が過不足なく揃ってて
各工程の資料も揃ってる、
みたいなものだろうなぁ。

モデリングは、素材が柔らかい分後から変更が効きやすい。
変更が効きやすすぎて当初の完成像から外れてしまう危険性もあるという。

プロジェクトで言ったら、
過去の実績があまりなくて
要件定義も出揃って無く、
ビジネスの要求によっては
大きい変更の可能性があって
工数の見通しも中々立たない、
みたいなものだろうなぁ。

まとめ

とりあえず、カービングって単語をあまり聞かない理由は判った気がした。

VBA で small is beautiful. する話【修正版】

※前の記事はコードの色表示が上手くいかなかったので削除しました。

( ´_ゝ`)ノシ
yoshitiaです。
前の現場ではbashSQLでしたが、
新しい現場では VBAVBscriptコマンドプロンプトとMSづくしです。

そんな現場ですが Unix哲学が役にたたないわけではないです。
今回の記事では Unix哲学の1番目に出てくる
small is beautiful. (小さいことはいいことだ)
コードの単位を細かく細かくすることで
扱いやすいプログラムにする考え方です。
これをVBAで実践する例を書いていこうと思います。

https://www.amazon.co.jp/dp/4274064069/ref=cm_sw_r_tw_dp_x_M983xbVA8A8SXwww.amazon.co.jp


環境
Excel2007以降のxlsmファイルに標準モジュール作成
標準モジュール上でコードを書く。

small is beautiful. 実践前のコード

Option Explicit  
Sub ワークシートチェック()
    Dim ワークシート As Worksheet
    Dim セルからの取得値 As String

    Set ワークシート = ThisWorkbook.Worksheets("sheet1")
    
    セルからの取得値 = ワークシート.Range("A1").Value
    If セルからの取得値 = "" Then
        MsgBox "A1セルが空です"
    Else
        MsgBox "A1セル空欄チェックOK"
    End If
    
End Sub

sheet1 の A1セルの値が空かどうかチェックする簡単なコードです。
例としてはまだ処理が少ないので読めますが
後から読む人にとっては何の処理をしているか
すぐにはつかみにくいです。
これを書き換えてみます。

small is beautiful. 実践後のコード

Option Explicit
Sub ワークシートチェック()
    Dim ワークシート As Worksheet
    Dim セルからの取得値1 As String
    
    Set ワークシート = ThisWorkbook.Worksheets("sheet1")
    
    セルからの取得値1 = ワークシート.Range("A1").Value
    MsgBox セルチェック1("A1", セルからの取得値1)
    
End Sub

Function セルチェック1(セルの場所 As String, セルからの取得値 As String) As String
    
    セルチェック = 空欄チェック(セルの場所, セルからの取得値)
End Function

Function 空欄チェック(セルの場所 As String, セルからの取得値 As String) As String

    If セルからの取得値 = "" Then
        空欄チェック = セルの場所 & " が空です"
        Exit Function
    End If
    
    空欄チェック = セルの場所 & " 空欄チェックOK"
End Function

実践後のコードです。
人によっては「余計に複雑になった」と思う人もいるかもしれません。
ここで、メインの ワークシートチェック() だけを見てみます。

Option Explicit
Sub ワークシートチェック()
    Dim ワークシート As Worksheet
    Dim セルからの取得値1 As String
    
    Set ワークシート = ThisWorkbook.Worksheets("sheet1")

    セルからの取得値1 = ワークシート.Range("A1").Value
    MsgBox セルチェック1("A1", セルからの取得値1)
    
End Sub

ここからさらに見る範囲を絞ります。

Set ワークシート = ThisWorkbook.Worksheets("sheet1")

セルからの取得値1 = ワークシート.Range("A1").Value
MsgBox セルチェック1("A1", セルからの取得値1)

Excelを扱ったことのある人なら
「sheet1 の A1セルに入力されている値をチェックしている」
となんとなくは読み取れると思います。

では、最初のコードではどうでしょう。

Option Explicit
Sub ワークシートチェック()
    Dim ワークシート As Worksheet
    Dim セルからの取得値 As String
    
    Set ワークシート = ThisWorkbook.Worksheets("sheet1")
    
    セルからの取得値 = ワークシート.Range("A1").Value
    If セルからの取得値 = "" Then
        MsgBox "A1セルが空です"
    Else
        MsgBox "A1セル空欄チェックOK"
    End If
    
End Sub

このコードだと If文以降を全部読んで確認しないと
A1セルをチェックしている処理だと把握できません。

コードを小さくする時の考え方

コードの何を小さくしているかの話です。

具体的には処理の内容を分割しています。

コード全体の処理内容は
「sheet1 の A1セルの値が空かどうかチェックする」です。

これを次のような単位に分けます。

  • 「セルの値をチェック」
    • 「セルが空かどうかチェック」

「セルが空かどうかチェック」の部分は
「セルの値をチェック」の中に入っています。

利用する人は、「セルの値をチェック」に
対象のセルの値をセットするだけで使えます。

利点その1. 再利用しやすい

コピペで使いやすいです。
例えば、追加で「A2セルもA1セルと同じチェックをしたい」場合、
変数宣言に```Dim セルからの取得値2 As String```を追加
値取得に```セルからの取得値2 = ワークシート.Range("A2").Value```を追加
ここまでは実践前・実践後両方同じですが
処理を追加する場合、
small is beautiful. 実践前

If セルからの取得値2 = "" Then
    MsgBox "A2セルが空です"
Else
    MsgBox "A2セル空欄チェックOK"
End If

small is beautiful. 実践後

MsgBox セルチェック1("A2", セルからの取得値2)

追加する量が変わってきます。
チェックするセルの数が増えるほど差が出ます。

利点その2. 機能追加しやすい

ただ、これだけでは
Function セルチェック1 と Function 空欄チェック
この2つに分けた利点が分かりにくいと思います。

私も今までの説明だけなら
Function セルチェック1 に Function 空欄チェック のコードも
まとめればいいと思います。
しかし、このように分けているのも理由があります。

例えば、「A1セルの値が"1"かどうかのチェックも追加したい」
となった場合、Function セルチェック1にまとめてしまっていると
融通が効きません。
Function セルチェック1 と Function 空欄チェック のように分けていると

A1セルの処理

  • 「セルの値をチェック」
    • 「セルが空かどうかチェック」
    • 「セルの値が1かどうかチェック」

A2セルの処理

  • 「セルの値をチェック」
    • 「セルが空かどうかチェック」

のように対象のセルごとにチェックの種類を
楽々追加/削除ができるようになります。
実際のコードは以下のとおりになります。

Option Explicit
Sub ワークシートチェック()
    Dim ワークシート As Worksheet
    Dim セルからの取得値1 As String
    Dim セルからの取得値2 As String
    
    Set ワークシート = ThisWorkbook.Worksheets("sheet1")
    
    セルからの取得値1 = ワークシート.Range("A1").Value
    MsgBox セルチェック1("A1", セルからの取得値1)
    
    セルからの取得値2 = ワークシート.Range("A2").Value
    MsgBox セルチェック2("A2", セルからの取得値1)
    
End Sub

Function セルチェック1(セルの場所 As String, セルからの取得値 As String) As String
    Dim チェックする値 As String
    
    チェックする値 = "1"
    
    セルチェック = 空欄チェック(セルの場所, セルからの取得値)
    セルチェック = セルチェック & vbCrLf & 値チェック(セルの場所, セルからの取得値, チェックする値)
End Function

Function セルチェック2(セルの場所 As String, セルからの取得値 As String) As String
    
    セルチェック = 空欄チェック(セルの場所, セルからの取得値)
End Function

Function 空欄チェック(セルの場所 As String, セルからの取得値 As String) As String

    If セルからの取得値 = "" Then
        空欄チェック = セルの場所 & " が空です。"
        Exit Function
    End If
    
    空欄チェック = セルの場所 & " 空欄チェックOK。"
End Function

Function 値チェック(セルの場所 As String, セルからの取得値 As String, チェックする値 As String) As String

    If セルからの取得値 <> "1" Then
        空欄チェック = セルの場所 & "の値が " & チェックする値 " ではありません。"
        Exit Function
    End If
    
    値チェック = "チェックOK。 " & セルの場所 & " の値は " & セルからの取得値 & " です。"
End Function

コードの量は増えましたが
ワークシートチェック()の部分だけを見てみると

Option Explicit
Sub ワークシートチェック()
    Dim ワークシート As Worksheet
    Dim セルからの取得値1 As String
    Dim セルからの取得値2 As String
    
    Set ワークシート = ThisWorkbook.Worksheets("sheet1")
    
    セルからの取得値1 = ワークシート.Range("A1").Value
    MsgBox セルチェック1("A1", セルからの取得値1)
    
    セルからの取得値2 = ワークシート.Range("A2").Value
    MsgBox セルチェック2("A2", セルからの取得値1)
    
End Sub

追加前と比較して

Dim セルからの取得値2 As String

セルからの取得値2 = ワークシート.Range("A2").Value

MsgBox セルチェック2("A2", セルからの取得値1)

の追加だけで済んでいます。
初めてこのコードを見る人でも
「sheet1 の A1セル と A2セル のチェック処理」
と概要を把握しやすいです。

まとめ

最後に、Unix哲学を元にコードを書いている時の私のイメージは
ゲームで1000回攻撃しないと倒せない相手を、
必殺技などを使わずに
愚直に連続攻撃を、隙間なく、1000回叩きこんで倒すイメージです。
(実際のゲームでは1000回は不要でしょうが)

https://www.amazon.co.jp/dp/4274064069/ref=cm_sw_r_tw_dp_x_M983xbVA8A8SXwww.amazon.co.jp


UNIXという考え方』でもゴジラを題材に
Unix哲学を元に難問に立ち向かう開発者のイメージが語られています。

例として示したコードはまだまだ使い勝手が良くないです。
もっと良いコードの書き方はあるはずです。探しましょう。
Unix哲学についてはsmall is beautiful. 以外にもありますので
webの記事や書籍『UNIXという考え方』で見ると良いと思います。

今回はVim関係ないですが
Happy Vim Life!

vim-jp や emacs-jp にログインしてみる話

( ´_ゝ`)ノシ
yoshitia です。
asciidoctor 試してみたくてこの記事書いています。
markdownでもはてな記法でも多少手直ししてからでないと
駄目っぽいな・・・。

記事の内容自体は vim-jp や emacs-jp に参加する時の話です。


目次

1. 従来のログイン先

どちらも facebook の登録が必要になります。

1.ex facebook を登録したくない人向け

google で ``vim-jp lingr facebook`` の検索結果を探したら見つかります。
(直接方法を書かないのは spam対策のためです。)

技術系の webサービスfacebooktwittergithub のどれかを利用していることを
前提としていることが多いです。
個人的には登録しておくことをおすすめします。

2. 最近?できたログイン先

2.0.1 lingr登録に facebookアカウントが必要な件

実際、新規参加を希望する方の中で2~3人に1人は相談される鉄板の話題です。

2.0.2 vim-jp ・ emacs-jpの取り組み

lingr 以外に利用できるチャットサービスを模索中の様です。

2.1 vim-jp

2016年8月現在、 vim-jp は vimrc読書会(毎週土曜日、23時開催)を
gitterの vim読書会部屋 で行っています。
ここは、 twiter か githubアカウントでログイン可能です。

2.2 emacs-jp

emacs-jpは emacs-jp slack の利用を始めているようです。
こちらはリンク先から登録するメールアドレスを入力、
送られてきたメールから登録を行います。

Vimとサクラエディタでcsvに立ち向かう正規表現

( ´_ゝ`)ノシ

yoshitiaです。

夏になったのでトップの画像変えなきゃと思いつつ秋を迎えそうです。

 

タイトルの話ですが、DBとかでテスト用データ作る時、

csvを軽く編集したい、そういうことありますよね。

 

で、大量データは自動生成するとして

作った後に微妙に修正したい箇所が出来た時、

直接編集したい、そういうのありますよね?

 

でも投入するデータのcsvが1行数百カラムだったり、

複数の項目に入る文字数が均一でなくてレコードごとに

目的のカラムの位置が異なる。

 

(ノ`Д´)ノ彡┻━┻ としたくなりますが

お仕事だとそうはいかないわけで。

 

そこで検索のシンタックスハイライトを利用して

カラムの位置を特定して作業を楽にします。

 

サクラエディタの場合だと

検索で正規表現を使用するチェックを入れてから

 

^[^,]*,([^,]*,){2}

 

を検索窓に入力して実行します。

書いてる例の正規表現の意味は

^[^,]*,が行頭から一つ目のカンマまでの文字列を検索対象にしていて

([^,]*,){2}は()の中の検索対象の{n}回繰り返しを検索対象にしています。

例の場合はカンマ以外の文字列とその後ろに付くカンマのセットの2回繰り返しが検索対象です。

 

この2つを繋げると、

「行頭からcsvの3カラム目までを検索対象にする」正規表現になります。

{}の数字を増減させると検索対象になるカラム数を調節できます。

 

Vimの場合だと

 

\v^[^,]*,([^,]*,){2}

 

これを/の入力後に入力します。

頭に\vが付く以外はサクラエディタの場合と同じです。

 

Excelcsvは色々とつらいので

csvはなるべくテキストエディタで編集したいですよね。

 

Happy Vim Life!

Netezzaのメモ。

( ´_ゝ`)ノシ

最近記事書くのご無沙汰なyoshitiaです。

Netezzaについてちょっとだけメモを書く。

Oracleのlistagg関数、すごく便利ですね。

TEST table

NO | WORD

--------------

1    | Apple

2    | Ball

1    | Cat

1    | Dog

2    | Egg

 

---------------------------------------

SELECT

    No

  , LISTAGG('WORD',', ')    AS RESULT

FROM

    TEST

GROUP BY

    NO;

---------------------------------------

 

NO | RESULT

-------------------

1    | Apple, Cat, Dog

2    | Ball, Egg

 

---------------------------------------------------

netezzaだとgroup_concatという関数があるみたい。

(デフォルト関数ではない。導入方法は下記リンク) 

Netezza: SQL and Admin: Netezza: create UDX concatenating row values into coma delimited string GROUP_CONCAT

 

ただし、マルチバイト文字非対応らしく、扱う値が日本語だと文字化けする。

コードはC++みたいだけどC++力が無いのでどう修正したらいいのかわからないのがつらい。

新しく使うなら日本語を扱わない様にデータ用意するしかないんだろうなぁ・・・。

 

Ubuntuでのfcitx+vim or emacsの日本語インライン入力の話。

( ´_ゝ`)ノシ
yoshitiaです。
使いたいソフトの関係でLinuxPCのOSを
Arch LinuxからUbuntu Server 14.04に変更しました。
vim: version 7.4.1747
emacs: version 24.5.1

Linuxだと毎回日本語周りで面倒が起きるわけで。
今回も色々あったので対処した記録をここに残します。

インライン入力って何よ?

PCで日本語入力を行う時、
EnterやC-mで確定させる前に
下線と一緒に入力した文字が表示されているアレです。

Linuxでは上手く設定されていないと
Enterで確定させるか変換の為にスペース押したりしないと
「何を入力しているのか見えない」
つらい。
この記事はそれについての話。

fcitx+vim or emacs(端末)での日本語インライン入力

システム>fictx設定>アドオンタブ>詳細チェックボックスをチェック。
PC再起動。

fcitx+gvimでの日本語インライン入力

このあたりが原因らしい。
github.com
Ubuntuだと /usr/share/applecations あたりにGVim(gvim.desktop)があるので
プロパティから

gvim -f %F

vim -gf %F

に修正するとインライン入力が表示される。

fcitx+emacs(gui)での日本語インライン入力

この記事のやり方でいけそう。
mochalog.hatenablog.com

最後に

流石に何回もやってると対処法探すまでの時間が短くなってて草。
何故fcitxだけか?親指シフト使いたいからですハイ。