Yabu.log

ITなどの雑記

重複行を数えるシンプルなツール

仕事中に必要になって探したけどなかったので作った。多分10分くらいでできたと思う

https://yuyabu.github.io/duplicate-rows-counter/

cat
cat
cat
dog
cat
mouse
dog

これがこうなる

cat  4
dog 2
mouse   1

github.com

今まではSQLでやってた(絶対おかしい) sakura editorで

select '<計測対象の行>' from dual union all
select '<計測対象の行>' from dual union all
select '<計測対象の行>' from dual union all

みたいに置換してそれをgroup by & count。 SQLの使い方がおかしい。

エクセルで気軽にできると思ったけどめんどくさかった。 本当なら、ちょっとしたtextUtil系はエディタの拡張で作りたい

買いてて思ったけどこれjavascriptだからsakuraのマクロにできるなこれ。 月曜試してみよ。

サクラエディタのMarkdownハイライトが微妙。っていうかない。

Qiitaに以下のような文章を投稿したので

qiita.com

テキストのハイライトも欲しい(加筆予定)

sakura editorのmarkdownシンタックスハイライトについて調べてみました。

どうやら公式のものがなく、有志様が作ったものを使いまわしている様子。

有志様が作った色見本をatomと限りなく一致させたい

http://sakura.qp.land.to/?Customize%2F%C5%EA%B9%C6%2F77

RxKey[000]=RK1,/^#{1}\s*([^#]*)\s.*/k
# サンプル1

RxKey[001]=RK2,/^#{2}\s*([^#]*)\s.*/k
## サンプル2

RxKey[002]=RK3,/^#{3,6}?\s*([^#]*)\s.*/k
### サンプル3

RxKey[003]=RK3,/^[-=]{3,}/k

--- サンプル4
=== サンプル4

RxKey[004]=RK6,/\*{3}[^*]+?\*{3}|\_{3}[^_]+?\_{3}/k

 *** サンプル 5 ***
 ___ サンプル 5 ___


RxKey[005]=RK5,/\*{2}[^*]+?\*{2}|\_{2}[^_]+?\_{2}/k

 **サンプル6**
 __サンプル6__

RxKey[006]=RK4,/\*{1}[^*]+?\*{1}|\_{1}[^_]+?\_{1}/k
 
 *サンプル7
 _サンプル7_

RxKey[007]=RK7,/(?<=^\t|^ {4}).*/k //タブ文字か4文字の空白で始まる行

サンプル8
    サンプル8


RxKey[008]=RK7,/`.+?`/k
`サンプル9`


RxKey[009]=RK8,/^\s*> .*/k  //引用符の後のスペースはいらないような・・・

> サンプル10

RxKey[010]=RK9,/^\s*(\d+\. |- |\+ )/k

1. サンプル11
 - サンプル11
 + サンプル11

RxKey[011]=RK9,/^\s*\* (?!.+?\*{1})/k //これはサンプル11にまぜてもいいのでは?

 * サンプル12 

ちなみにatomで試してみたところこんな感じでした

f:id:yuyubu:20171222002152p:plain

  • 所感
    • atomだと複数行にまたがるコード範囲も正しくハイライトされる。
      • 正規表現が行をまたがって指定できないsakuraだと無理
    • アスタリスク囲は1個のものと3個のもので同じ色だがいいのか?
      • 個人的には1個=色A、2個=色B、3個=色B+太字 がいいと思う。
    • atomだと===と先頭にタブがくるやつはハイライトされないようです
    • アンダースコア(_)に挟まれた範囲がハイライトされるのが邪魔。
      • テーブル名とかアンダースコア使いまくってるからめんどくさい。
    • オリジナルのハイライトの正規表現とカラーチャートを作ろうと思う。
    • キータのMarkdownみたいに```のコード範囲に言語の拡張子を書くと、コード範囲の中がその言語のシンタックスハイライトがされると素敵。
      • そんなパッケージ誰か作ってくれないかしら。

(12月24日)追記

   - そんなパッケージ誰か作ってくれないかしら。

デフォルトで対応してしてました

f:id:yuyubu:20171224020058p:plain

Qiitaみたいな感じで

```js

コードブロックの指定にPG名を書けばいいようです

「改訂新版JavaScript本格入門」を読んだ

JavaScriptパターンを読み始める前に読了していましたが、このタイミングで感想を投稿。

技術的な感想はこちらに書きました

私はJavaScriptについて誰かに教わったり、研修を受けたことはありませんので、この本で初めてJavaScriptを知ることになりました。*1

やさしくはないですが、とにかく網羅的だったので 抜け落ちていた知識が本書でしっかり補完されたと思います。

JS界隈は進化というか変化というか、移り変わりが激しいと思いますが、そのぶんモダンなパラダイムとか開発手法をどんどん手に入れてる姿がとても羨ましいです。

私のようなググった生半可な知識+他の言語のシンタックスで適当にJavaScriptを組んでいた不届者にとっては間違いなく良書だと思います

同じ著者のtypeScriptの参考書なんかも出ているので、 読んでみようと思います。*2

速習TypeScript: altJSのデファクトスタンダートを素早く学ぶ! 速習シリーズ

速習TypeScript: altJSのデファクトスタンダートを素早く学ぶ! 速習シリーズ

  • 良かったところ
    • 網羅性か高いので自己流でやってきた人は見落としがたくさん見つかる
    • ES6をキャッチアップしている
      • JSのノウハウのアイデンティティの多くはスコープがないこと、変数が上書きできることなどのES6での解決済みの要素に対策するものが多いと思うので、その辺りを補足すべくES6時代の入門書にリライトされている点は素晴らしいと思います。
        • JavaScriptパターンも書き直されるべきだと思う。
          • 日本にこの声はあまりないが、Amazon.comのレビューには「時代遅れ」などの評も多い。
  • 微妙なところ
    • あまりカジュアルな読み物ではないため、完璧な初心者には難しいと思う。
      • プログラミング初めてみよう、的な人の1冊目にはお勧めできません。。。

*1:それまで知っていたのはJavaScriptではなくて、Javaっぽく書いてもいい感じに動いてくれる何か、です・・・

*2:Kindle Unlimited対象!!!タダで読める!!!

JavaScriptパターン第5章ノート

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

5賞ではオブジェクトの生成がテーマです。

3章でオブジェクトリテラルの使用を推奨しましたが、 そこから発展的な内容になります。

ここからは、とりあえず動くものを作る、というステージから 複数のライブラリを混ぜた時に問題なく動く、くらいのレベルアップのために必要なテクニックが紹介されているように思いました。JavaScriptでしっかり設計できる人はここに書かれていることくらいは抑えているんでしょうか。

名前空間パターン

グローバルオブジェクトを極力減らす工夫です。JavaScriptには名前空間に関する構文は提供されていませんが、 ライブラリやアプリケーションごとに、一つのグローバルオブジェクトを作成し、それのメンバとして 変数や関数を定義することでグローバル空間の汚染を防ぐことができます

例えばJQueryなんかもJQueryと$しかグローバル空間を汚染していませんね。

var test = "TEST";//NG

var testObj = {};
testObj.test = "TEST" //better

jQueryの良いところは,名前空間を汚染しないところです。すべての機能をロードした状態で,jQueryと$の2つのオブジェクトしか存在しません。

http://gihyo.jp/dev/feature/01/jquery/0001

汎用の名前空間関数

var MYAPP =
{
  message:"働きたくない"
}
var MYAPP = MYAPP || {};
MYAPP.namespace = function (ns_string) {
  var parts = ns_string.split('.'),
  parent = MYAPP, i;
  // 先頭の冗長なグローバルを取り除く
  if (parts[0] === "MYAPP") {
    parts = parts.slice(1);
  }
  for (i = 0; i < parts.length; i += 1) {
    // プロパティが存在しなければ作成する
    if (typeof parent[parts[i]] === "undefined") {
      parent[parts[i]] = {};
    }
    parent = parent[parts[i]];
  }
  return parent;
};

// 戻り値をローカル変数に代入する
var module2 = MYAPP.namespace('MYAPP.modules.module2');
module2 === MYAPP.modules.module2; // true

var message = MYAPP.namespace('message');
console.log(message);//働きたくない <- 破壊的変更が行われない

複数のライブラリを利用している時に名前の衝突とか起こると大変そう

ちなみに、JQueryの場合は別のライブラリが$という名前を利用していた場合は、上書き時にローカル変数の_$に退避しnoConflictという関数を利用することで、戻すことができるらしい。

依存関係の宣言

var myFunction = function () {
  // 依存するモジュール
  var event = YAHOO.util.Event,
  dom = YAHOO.util.Dom;
  // 残りの関数で
  // eventとdomを使う
};

依存するモジュールをスコープの先頭に明示しておくことで、わかりやすいだけでなく、プロパティの入れ子の名前解決は1度しか行われないので処理速度が高速化される。(毎度YAHOO.util.Eventで呼ぶとその度に目的のプロパティをたどるコストがかかる)

Privateなプロパティ

JavaScriptはアクセス修飾子を提供していませんが、プライベートなスコープのメンバを返す関数を作成することで、擬似的にJavaのPrivateのような仕組みを導入できます

function Gadget(){
  var name = 'ipod';
  this.getName = function(){
    return name;
  };
}
var gadget = new Gadget();
console.log(gadget.getName());//ipod
console.log(gadget.name)//undefined

このプライベートメンバにアクセスするメソッドは特権メソッドというそうです。 ただし、オブジェクトを特権メソッドで返した場合は、オブジェクトが参照型なため、クライアント側で変更される恐れがあります。

function Gadget(){
  var name = {value:'ipod'}
  this.getName = function(){
    return name;
  };
}
var gadget = new Gadget();
var test = gadget.getName();
console.log(test.value);//ipod
test.value = "iPhone"
console.log(gadget.getName().value);//iPhone

モジュールパターン

コード構成のための構造を提供するらしい。

今までに学んだテクニックを駆使します。

  • 名前空間
  • 即時関数
  • プライベートメンバと特権メンバ
  • 依存関係の宣言

  • 1.即時関数の内部にプライベートメソッド、プライベートプロパティを書きなぐる。

  • 2.即時関数の戻り値のオブジェクトをパブリックAPIとして提供する。
  • 3.即時関数の内部かつreturn文の外を依存関係やプライベートメンバ、初期化処理の記述に利用する。

Javascriptがうまく扱いきれてないアクセス修飾子の仕組みを代替するような工夫 だと思いました。

サンドボックスパターン

モジュールパターンでも解決しきれない名前の衝突を解決します。 具体的には同名のライブラリの複数のバージョンを名前を衝突しないで使うような工夫です。 ちょっと何が書いてあるか、どう動かすか、何がありがたいのかがいまいちピンときませんでした。

静的メンバ

Math.max(3,5)みたいな書き方のこと。インスタンス化せずに使える。Javaでいうクラスメソッド。 プライベートな静的メンバ、パブリックな静的メンバの双方が作れる。ただし、Javascriptはアクセス修飾子はおろか、静的メンバのための特別な構文はない。

そんなJavaScriptだが以下のように工夫して静的メンバを実現している

//関数オブジェクト
var Gadget = function(){};

//関数目オブジェクトのメンバとして定義すると、パブリックなクラスメソッドになる
Gadget.isShiny = function(){
  return "you bet";
};


//プロトタイプにメソッドを追加すると、インスタンスメソッドになる。
Gadget.prototype.setPrice = function(price){
  this.price = price;
};

Gadget.isShiny();

var iphone = new Gadget();
iphone.setPrice(500);

//関数オブジェクトが保持しているメンバはインスタンスからは不可視。
iphone.isShiny();//undefined

//ただしプロトタイプに参照を代入すると、インスタンスからもアクセス可能。
Gadget.prototype.isShiny = Gadget.isShiny;

//ちょっと無理やりすぎないかw
iphone.isShiny();

なぜ関数オブジェクト?オブジェクトリテラルでいいじゃん、と思ったが、オブジェクトリテラルだとコンストラクタとして呼べないため関数オブジェクトである必要がある。

プライベートな静的メンバ

インスタンスメンバはクロージャーで実現可能。 ではプライベートな静的メンバは?

クロージャー的なものをpropatyに定義することで実現できる。

var Gadget = (function(){
  //静的変数/プロパティ
  var counter = 0,NewGadget;
  //新しいコンストラクタ実装
  NewGadget = function(){
    counter +=1;

  };
  //特権メソッド
  NewGadget.prototype.getLastId  = function(){
    return counter;
  };
  //コンストラクタを上書き
  return NewGadget;

}());//即座に実行
var iphone = new Gadget();
iphone.getLastId() //1
var ipad = new Gadget();
ipad.getLastId()//2

連鎖パターン

javaで言う所のメソッドチェーン。

var obj = {
  value:1,
  increment:function(){
    this.value +=1;
    return this;
  },
  add:function(v){
    this.value += v;
    return this;
  },
  shout:function(){
    console.log(this.value);
  }

}

obj.increment().add(3).shout();//5

//メソッドを一つずつ呼び出す
obj.increment();
obj.add(3);
obj.shout();

デメリット

デバッグが難しくなる。 Claen Codeによると「電車の衝突」(train wreck)パターンとのこと。

所感

javascriptはスコープ*1、アクセス修飾子を搭載していない、という前提から堅牢なコーディングをするにはどうすれば?というナレッジが詰まった章でした。個人的にJavaScriptそのものは堅牢なものを作るには向いておらず、まるで沼地に家を立てるようなそんなテクニックに感じました*2。かなり高度なHackではあると思いますが、個人的にはやってて楽しくなかったし、今後もやりたくないなと思いました(ゆとりプログラマーかな?)

本当に堅牢なものを作りたいならtypeScriptなどのaltjsで作成したものをトランスパイルして使うんだろうなと妄想します。

*1:ES6で追加済み

*2:そして実際に立ててしまうのがすごい!

「ソフトウェアテスト293の鉄則」を読んだ

テスト本2冊目。

ソフトウェアテスト293の鉄則

ソフトウェアテスト293の鉄則

著者はテスト業界の偉い人たちらしい。中には「知識ゼロから学ぶソフトウェアテスト」で見たことのある名前もあった。 本書は鉄則とあるが、テストにおける重要な規則を教科書的に網羅した本ではない。 見出しこそ「〜べし、〜せよ」というものが多いが、どちらかというとテーマごとに複数の著者が持ちあったエッセイ集という性格が強いと思う。

とにかく網羅しているテーマの範囲が広く、自動化やドキュメントはもちろん、キャリアや転職やマネジメント、テスターの評価なども扱っている。 日頃からテストに関して疑問に思っていることや違和感などがあれば本書のどこかでハッとさせられる記述が見つかるかもしれない。

初心者が読む本というより、ある程度経験がありながらもテストという作業にうまく言語化できない違和感を抱えている人が読むのが良いと思う。

新しく知ったこと

  • テストの5大要素

    • テストの実施者
    • 網羅性
    • 発見したい問題
    • 作業内容
    • 結果の判定方法
  • テストの自動化は難しい

    • 戦略・計画がまともでないと失敗する
      • テストの目的を理解、説明できない人に自動化を行わせてはいけない
    • 同じテストケースを実施するなら人間がやる方が価値がある。
      • コンピューターはテストケース以外のことを問題意識を持って観察はしない
        • 異音がする、極端な性能劣化が発生する、画面がちらつくなど

考え直したこと

  • カバレッジ
    • 100%でも足りない
      • 実装されていないことによるバグの発見が漏れる*1
      • テストの漏れは数字からはわからない
    • 昔数万行の仕様が不明のレガシーコードをカバレッジを取りながらテストしたことがある。
      • バグが発生する・しないテストデータ両方でメソッドごとにカバレッジを計測し、差分が出た箇所を精読してバグを見つけた
      • あの時はちょっと感動した
      • バグを探す糸口としてカバレッジはかなり有効だと思う。
  • IEEE 829 (ドキュメント)
    • ドキュメントを管理できるスケジュール、プロセスになっていない場合、採用すべきでない
    • 膨大な資料の作成は考える力を奪い問題意識を持って取り組むことを妨げる

*1:意外とある^^;

オーム社の電子書籍サービスが終わるらしい

estore.ohmsha.co.jp

情報系の学部を出ていたら、この出版社から出た教科書の1、2冊は持っているのではないでしょうか?*1

最近だとt_wadaさんの新訳のテスト駆動開発なんかもここから出ていました。

倒産とかではないですが、電子書籍ファンとしては悲しい一心です。

中身の一部は達人出版会で継続して販売されるそうです。*2

DRMフリーなので、撤退後も普通にコンテンツを読めますが、DRMかかってるサービスで撤退するということになったら色々大変でしょうね。

*1:今見たら情報系に限らず工学系全般を扱っているらしい

*2:移管というより昔から双方で売っていたらしい

macOS SierraにEclipseを入れる

インストーラを起動して見たところ警告が表示された。

Java SE 6 ランタイムをインストールする必要があります。

と出たのでAppleのサイトからJavaをインストール

ダウンロード - Java for OS X 2015-001

レガシー用Javaを入れ、再度インストーラを動かすと

Version:1.8 or greater is required.

と表示された。

いじめか?(笑)

とりあえずOracleのサイトからjava9をダウンロード

Java SE Development Kit 9 - Downloads

$ java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)

インストーラーが動き無事ダウンロードができました(めんどくさ)