OmniAICreator/Qiita-1.07M huggingface dataset:
lsのオプション

今まで何となく使っていた`ls`コマンドのオプションについて、よく使うものを纏めて見ました。

# コマンド
## ls
現在のディレクトリ配下のファイルとディレクトリをアルファベット順に表示する。
ただしドット(.)で始まるものについては表示しない。

```
[centos@ip-10-0-1-10 ~]$ ls
test  testdir  testtest
```

## ls -a
ドット(.)で始まるものも表示する。

```
[centos@ip-10-0-1-10 ~]$ ls -a
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .lesshst  .ssh  test  testdir  testtest
```

## ls -A
ドット(.)とダブルドット(..)は表示しない。

```
[centos@ip-10-0-1-10 ~]$ ls -A
.bash_history  .bash_logout  .bash_profile  .bashrc  .lesshst  .ssh  test  testdir  testtest
```

## ls -l
詳細な情報を表示する。

```
[centos@ip-10-0-1-10 ~]$ ls -l
total 4
-rw-rw-r--. 1 centos centos   0 Aug 30 15:49 test
drwxrwxr-x. 2 centos centos   6 Aug 30 15:31 testdir
-rw-rw-r--. 1 centos centos 270 Aug 30 15:44 testtest
```

## ls -S
ファイルサイズの大きい順に表示する。

```
[centos@ip-10-0-1-10 ~]$ ls -lS
total 4
-rw-rw-r--. 1 centos centos 270 Aug 30 15:44 testtest
drwxrwxr-x. 2 centos centos   6 Aug 30 15:31 testdir
-rw-rw-r--. 1 centos centos   0 Aug 30 15:49 test
```

## ls -t
更新日付の新しいものから順に表示する。

```
[centos@ip-10-0-1-10 ~]$ ls -lt
total 4
-rw-rw-r--. 1 centos centos   0 Aug 30 15:49 test
-rw-rw-r--. 1 centos centos 270 Aug 30 15:44 testtest
drwxrwxr-x. 2 centos centos   6 Aug 30 15:31 testdir
```

# 利用シーン別
## 特定のファイルが存在することを確認したい
ls [filename]

## とりあえずこのディレクトリの中身を全て見たい
ls -A

## 容量の大きいファイルを探したい
ls -lhS
※hはhuman readable、容量にKやMの単位を付けて表示する

## 古いファイルを探したい
ls -lrt
※rはreverse、結果を逆順に表示する

# ひとこと
今までは何も考えず`ls -la`と使っていましたが、`-a`オプションを使う機会はそんなに無いのかも。Shiftキーを押す手間を厭わないなら`-A`で良いケースが多そうですね。
同じく打鍵が増えるけれど、`-p`オプションでディレクトリが見やすくなるのも結構いいなと思いました。
Reveal.jsのプレゼンにシェルを埋め込むよ

# やりたいこと
プレゼン画面内でシェルを操作し、プレゼン内のデモに反映さたらカッコいいと思うんだ。うん。たとえプレゼンの内容が薄くても、勉強会とかでちょっと興味を持ってもらえるかも？
<img src="https://qiita-image-store.s3.amazonaws.com/0/160451/120e6f0a-bdee-c5ca-83b3-b1749393c5bc.gif" width=70%>

# 仕組み
JavaScriptでスライドが作れる[Reveal.js](https://github.com/hakimel/reveal.js/)と、ローカルのシェルをブラウザから利用できるようになる[tty.js](https://github.com/chjj/tty.js/)とを使い、プレゼン内に`<iframe>`で`tty.js`の画面を埋め込むんだ。デモ画面も`<iframe>`を利用してプレゼン内に埋め込み、`webpack-dev-server`なんかのオートリロード機能を利用して変更を反映するよ。
仕組みは簡単だね。でも、`tty.js`の利用にはちょっとした小技がいるよ。

 * tty.js
 * webpack-dev-server
 * Reveal.js (上２つをiframeで埋め込む)


## tty.js
### インストール
npmで簡単です。パッケージマネージャ万歳！

```bash
$ npm install tty.js
```

### セッション自動オープン＆最大化

そのままだと、「ログイン→セッションを開く→画面最大化」の手順が必要になり、プレゼン中にもたつくことになるので、アクセスしたらセッションを開いて画面を最大化するようにするよ。
こちらの[Gistの投稿](https://gist.github.com/Thatkookooguy/a08f447bf491e091e5e4)の真似して`./node_modules/tty.js/statics/users.js`に処理を追加だ。
`users.js`ははじめは存在していないので自分で作成するよ。

```bash
$ touch ./node_modules/tty.js/statics/users.js
$ vi ./node_modules/tty.js/statics/users.js
```

```js
if (window.tty) {
  tty.on('open', function () {
    window.tty.socket.on('connect', function() {
      var w = new window.tty.Window();
      setTimeout(function () {
        w.maximize();
      }, 100);
    });
  });
}
```

### カレントディレクトリ移動

そのままだとカレントディレクトリはホームディレクトリのままだ。プレゼン中の余計な手間を省くために、目的のディレクトリに移動していてほしいよね。
ただ、tty.jsはセッションにコマンドを送りこむ方法がなさそうなんだ。その代わりログインシェルを指定できるので、ログインシェルを使って目的のディレクトリに移動するよ。

ログインシェルの指定はコンフィグファイルから可能だ。シェルの場所はどこでもいいよ。ここではホームディレクトリ以下に`.ttyshell`としてつくってみた。

```bash
vi ~/.tty.js/config.json
```

```json
{
      "shell": "/Users/admin/.ttyshell"
}
```
`config.json`のshellのパス指定では~（チルダ)は使えなかったから要注意だ。
あとは指定したログインシェル(`/Users/admin/.ttyshell`)でディレクトリを変更する処理（今回は`/tmp/sample`に移動)を書けばOK。

```bash
vi /Users/admin/.ttyshell
```

```bash
#!/bin/bash
cd /tmp/sample
/bin/bash
```

### tty.js 起動
npmでインストールしたnode_modules/.bin/tty.jsを実行するよ。

```bash
node ./node_modules/.bin/tty.js
```
デフォルトポートは`8080`なので衝突しないようにしておこう。

## Reveal.js
使い方はいろいろ日本語情報があるので省略するよ。例えば以下とか。

 * [[QIita] Reveal.jsでスライド作り。](http://qiita.com/t-kusakabe/items/725e7438892bba395062)
 * [reveal.jsを使ったプレゼンテーションの作成](http://blog.sojiro.me/blog/2014/08/31/presentation-by-reveal-dot-js/)

### iframe
こんな感じで先ほどのtty.jsを埋め込みむよ。

```html
<section>
    <h4>Shell</h4>
    <iframe width="800px" height="340px" src="http://localhost:8080/">  
    </iframe>
</section>
```

以上！
RSpecを単体で使いたい on Docker

[RailsじゃないRspec3環境を構築する方法](http://qiita.com/yusabana/items/db44b81bdddf6ed0e9f5) を Docker で構築してみました。
作って、試して、すぐ捨てれるところが Docker の良さでもあり、
参考記事のように RSpec 単体を試す（勉強する）にはもってこいだと思います。
なお、ファイルの内容とディレクトリ構成は、ほぼそのまま流用させてもらっています。（感謝）

## __環境__

- MacOSX（10.12.6 Sierra）
- [Docker for Mac](https://www.docker.com/docker-mac) （インストールしておく）

コードは [GitHub](https://github.com/label8/rspec-on-docker) に置いてあります。

## __1. まずはDockerfileの作成__

```
$ vim Dockerfile
```

``` :Dockerfile
FROM ruby:2.4.1
RUN apt-get update -qq && apt-get install -y build-essential libmysqlclient-dev

RUN mkdir /rspec_sample
WORKDIR /rspec_sample

ADD Gemfile /rspec_sample/Gemfile
ADD Gemfile.lock /rspec_sample/Gemfile.lock

RUN bundle install
```

## __2. GemfileとGemfile.lockの作成__

```
$ vim Gemfile
```

``` :Gemfile
source 'https://rubygems.org'
gem 'rspec'
```

```
$ touch Gemfile.lock
```

## __3. docker-compose.ymlの作成__

```
$ vim docker-compose.yml
```

``` :docker-compose.yml
version: '3'
services:
  app:
    build:
      context: .
    command: /bin/bash
    volumes:
      - .:/rspec_sample
    tty: true
```

__補足__

- command:
    - コンテナ起動時にコマンドを irb から /bin/bash に変更
- tty:
    - コンテナを継続起動させる
    - これがないと起動してもすぐに落ちる

## __4. Rspecをインストール__

```
$ docker-compose run --rm app bundle exec rspec --init
```

## __5. コンテナの起動__

```
$ docker-compose up -d
```

```
$ docker ps

       Name            Command    State   Ports
-----------------------------------------------
rspecondocker_app_1   /bin/bash   Up
```

## __6. specの作成__

```
$ vim spec/spec_helper.rb
```

``` ruby:spec_helper.rb
RSpec.configure do |config|
  〜 省略 〜
  Dir[File.join(File.dirname(__FILE__), "../lib/**/*.rb")].each { |f| require f }
end
```

```
$ vim spec/hello_spec.rb
```

``` ruby:hello_spec.rb
require 'spec_helper'

RSpec.describe Hello do
  it "message return hello" do
    expect(Hello.new.message).to eq "hello"
  end
end
```

## __7. Rubyを作成しテスト実行__

```
$ mkdir lib
```

__失敗するケースを作成__

```
$ vim lib/hello.rb
```

``` ruby:hello.rb
class Hello
  def message
    "helloo"
  end
end
```

__失敗することをテスト__

レッドになることを確認

```
$ docker-compose exec app bundle exec rspec
```

```
F

Failures:

  1) Hello message return hello
     Failure/Error: expect(Hello.new.message).to eq "hello"

       expected: "hello"
            got: "helloo"

       (compared using ==)
     # ./spec/hello_spec.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.06863 seconds (files took 0.14193 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/hello_spec.rb:4 # Hello message return hello
```

__成功するように修正__

```
$ vim lib/hello.rb
```

``` ruby:hello.rb
class Hello
  def message
    "hello"
  end
end
```

__成功することをテスト__

グリーンになることを確認

```
$ docker-compose exec app bundle exec rspec
```

```
.

Finished in 0.00722 seconds (files took 0.14668 seconds to load)
1 example, 0 failures
```

## __まとめ__

こんな感じで簡単に RSpec を試せる環境が構築できました。
Docker 様様です！

## __参考サイト__

[RailsじゃないRspec3環境を構築する方法](http://qiita.com/yusabana/items/db44b81bdddf6ed0e9f5)
ActionMailerでISO-2022-JP形式でメールを送信する

## はじめに

メール関連はUTF8マストで良いと思われるが、MUAによっては直してほしいという依頼も来たりするので、その2017年現在の対応法

## 作業

Gem入れる。2017年現在メンテナンスはされている。

```ruby
# https://github.com/kuroda/mail-iso-2022-jp
gem 'mail-iso-2022-jp'
```

ApplicationMailerにデフォルトのCharsetを設定する　(個別も可) 

```ruby
class ApplicationMailer < ActionMailer::Base
  default charset: 'ISO-2022-JP'
end
```

もしDeviseを利用している場合は、parent_mailerのオプションでApplicationMailerを指定

```ruby
# config/initializers/devise.rb 
config.parent_mailer = 'ApplicationMailer'
```

以上でいい感じにメールを変換してくれる。
構造化マークアップ概論

#構造化マークアップはどう実装するの？

ボキャブラリーとシンタックスを使って構造化マークアップします。

#構造化マークアップをするとどうなるの？
検索結果でリッチに表示されるようになります。
例えば、パンくずを構造化マークアップすると検索結果画面でこんな感じの表示になります。

してないやつ | してるやつ
--- | ---
![](https://i.gyazo.com/a6e697ba3743fdcaf9dc31a21cf63c78.png) | ![](https://i.gyazo.com/ebee8da513b974f7749c6b0c884415ce.png)

#検索で上位に表示されたりするの？

googleが公表している情報の通り、検索ランキングには影響しません。
ただgoogle検索結果などの表示が少しリッチになることでユーザーのクリック率が上がるのが期待できます。

#ボキャブラリーってどんなの？

主なのは、data-vocabularyとschema.org。色々あります。
googleが推奨しているのはschema.orgだが、
data-vocabularyでも問題なく機能します。

#シンタックスってどんなの？
シンタックスは主に４つ。microdataとRDFaとRDFa LiteとJSON-LD。
googleが推奨しているのはJSON-LD。
でもそれ以外でも問題なく機能します。

#どう実装するの？

ボキャブラリーとシンタックスで構造化マークアップしましょう。
構造化マークアップの方法は公式の情報があるので参考に。（ https://developers.google.com/search/docs/data-types/breadcrumbs ）
実装したら構造化データテストツールがあるので、確かめながら実装しましょう。（ https://search.google.com/structured-data/testing-tool/u/0/?hl=ja ）

![](https://i.gyazo.com/a00c626758ffbcbefbc248fa77c1bc00.png)

一つのサービスに、
data-vocabularyとmicrodataの組み合わせと、
schema.orgとjson-ldの組み合わせなどが入り乱れていても、
問題なく機能します。
**検索ランキングには影響しないので、
本番反映してみて表示が変わるか確かめながら実装するのがベストだと思います。**
検索結果に影響が出るのは数日かかります。

具体的な実装方法は省略。

#パンくずを実装しようとしているあなたへ

##注意「文字数が長いとURLが表示される」
文字数によっては構造化マークアップできてるけど普通にurlを表示してしまいます。

**【文字数が適切だとこんな感じ】**
![](https://i.gyazo.com/04d733e9f12537a2d95ef22cf1cfcd71.png)
**【長くなると省略されたり】**
![](https://i.gyazo.com/9e5e963504d4b07f80faf9f8b74fa28b.png)
**【もっと長くなるとurlが表示されたりする】**
![](https://i.gyazo.com/e67e35c0a7b040d3b19881179060927f.png)

#豆知識「"ドメイン部分をURLではなくサイト名に"ができるのは米googleのみ。」

検索結果で表示される第一階層のドメイン部分をURLではなくサイト名にしたいときは[WebSite](http://schema.org/WebSite)を使います。ただ、これは米googleのみ対応なので、ジャパニーズには関係ありません。（参考：https://apollo11.co.jp/includeyoursitenameinsearchresults/）

![](https://apollo11.co.jp/wp-content/uploads/2016/05/domain_replacement.jpg)
Angularで余計なタグを出力せずに再起してMarkdownのASTを表示したい

# 余計なタグとは
下記のようなテンプレートがあったとします。

```html
//<my-msg>コンポーネント
<div>{{msg}}</div>
//使う
<my-msg [msg]="'はろー'"></my-msg>
```

reactやvue.jsの場合以下のように出力されます。

```html
<div>はろー</div>
```

しかしAngularの場合は以下のように出力されます。


```html
<my-msg><div>はろー</div></my-msg>
```

つまり余計なタグとは`<my-msg>`など独自コンポーネントのセレクターの事です。

# 一般的な場合の回避方法
selectorを`div[myMsg]`と指定し、テンプレートを以下のようにすることで回避する事が出来ます。

```html
//定義
{{msg}}

//使用
<div myMsg [msg]="'はろー'"></div>
```

しかし、この方法はASTの再起では使えません。
(正確には使えないことはないがNodeの種類^2コピペしないといけないのでしたくない)

# 解決方法
ng-templateとngTemplateOutletを使うことで解決出来ます。

```html
<ng-container *ngTemplateOutlet="tempRef; context: {n:node}"></ng-container>
<ng-template #tempRef let-n="n">
  <ul>
    <li>{{n.msg}}</li>
    <ng-container *ngFor="let c of n.children">
      <ng-container *ngTemplateOutlet="tempRef; context: {n:c}"></ng-container>
    </ng-container>
  </ul>
</ng-template>
```
【3dsMaxScript】アニメーション情報の取得の仕方

3dsMaxScriptでノードのアニメーション情報を取得する方法の覚書。

```C++
n=selection[1] --選択しているノードを取得
transCtr = n.pos.track  --位置コントローラーを取得。
rotCtr = n.rotation.track --回転コントローラーを取得。

--とりあえず、全部のコントローラーのキーフレーム数は同じ前提で
for i=1 to transCtr.x_position.keys.count do(
   	pos = Point3 0.0 0.0 0.0
	pos.x = transCtr.x_position.keys[i].value
	pos.y = transCtr.y_position.keys[i].value 
	pos.z = transCtr.z_position.keys[i].value 
	xRot = rotCtr.x_rotation.keys[i].value
	yRot = rotCtr.y_rotation.keys[i].value
	zRot = rotCtr.z_rotation.keys[i].value
)
```
こんな感じにするらしい。
Spring Boot のコマンドラインツールのインストール (Mac)

HomeBrew で入れられる。

```
$ brew tap pivotal/tap
$ brew install springboot
```

動くことを確かめるため、次のようなファイルを `app.groovy` という名前で用意しよう。

```groovy
@RestController
class WebApp {
    @RequestMapping("/")
    String greetings() {
	"Spring Boot Rocks"
    }
}
```

インストールした `spring` コマンドで、次のように起動できるはずだ: `spring run app.groovy`
Sketchプラグインにするまでもないけど、たまによく使うスクリプトをRun Scriptから呼び出す

タイトルの通りですが、プラグインにするまでもないけど、たまによく使うスクリプトってないでしょうか？

よく使うならプラグインにすればいいじゃない？ という話もあるのですが、牧歌的なプラグイン形式の時代から随分と様相が変わり、フォルダ構成だったり`manifest.json`を準備したりと、ちょっとしたプラグインを作るのも結構面倒だったりします。

そこで、Run Scriptから特定のスクリプトをいつでも実行できるように準備してやりましょう。

まずは、たまによく使うスクリプトをファイルに保存します。拡張子は`.js`でも`.sketchscript`でも大丈夫です。

SketchのPlugins -> Run Script（ショートカット：Ctrl + Shift + K）でスクリプトウィンドウを開き、1行目で先ほど保存したスクリプトを読み込むようにしてやれば準備完了です。

```js
@import '/path/to/script-file.js';
```

## 利用例

### いつもよく使う変数

```js
var doc = context.document;
var sel = context.selection;
var pg = doc.pages();
var cp = doc.currentPage();
```

### 入力すると長いやつ

```js
function showClassMethods(object) {
	log(object.class().mocha().classMethods());
}
function showInstMethods(object) {
	log(object.class().mocha().instanceMethods());
}
function showMethods(object) {
	log('Class Methods:');
	log(showClassMethods(object));
	log('Instance Methods:');
	log(showInstMethods(object));
}
function showProp(object) {
	log(object.class().mocha().properties());
}
function showDict(object) {
	log(object.treeAsDictionary());
}
```

### とりあえずヘルプ的なやつ

定義したメソッドを忘れるので、とりあえず実行さえすれば、「`utHelp()`でヘルプ的なものが表示されますよ」と自分に教えてあげます。

```js
log('Show Help: utHelp()');
function utHelp() {
	var output = "doc\nsel\npg\ncp\n" +
				 "showClassMethods(object)\n" +
				 "showInstMethods(object)\n" +
				 "showMethods(object)\n" +
				 "showProp(object)\n" +
				 "showDict(object)\n" +
				 "getMdImagePath()\n";
	log(output);
}
```

### Markdown形式で画像の読み込み

```js
function getMdImagePath() {
	var imagesPath = '';
	if (0 < sel.count()) {
		for (var i = sel.count() - 1; i >= 0; i--) {
			imagesPath += '![](images/' + sel[i].name() + '.png)' + "\n";
		}
	}
	log(imagesPath);
}
```

いろいろと配慮できてませんが、個人的に使うやつなので、入力チェックとか無視無視。
Curl で Spring Boot アプリの雛形を取得する

こんな感じ。

```
(Maven)
$ diary curl -s https://start.spring.io/starter.zip -o myapp.zip

(Gradle)
$ diary curl -s https://start.spring.io/starter.zip -o myapp.zip -d type=gradle-project

(Gradle かつウェブ - spring-boot-starter-web が build.gradle に含まれる)
$ curl -s https://start.spring.io/starter.zip -o myapp.zip -d type=gradle-project -d dependencies=web
```

使用可能なオプションについてより詳細に情報がほしければ、単に `start.spring.io` を `curl` で叩けばよい。

```
$ curl start.spring.io 
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
:: Spring Initializr ::  https://start.spring.io

This service generates quickstart projects that can be easily customized.
Possible customizations include a project's dependencies, Java version, and
build system or build structure. See below for further details.

The services uses a HAL based hypermedia format to expose a set of resources
to interact with. If you access this root resource requesting application/json
as media type the response will contain the following links:
+-----------------+-----------------------------------------+
| Rel             | Description                             |
+-----------------+-----------------------------------------+
| gradle-build    | Generate a Gradle build file            |
| gradle-project  | Generate a Gradle based project archive |
| maven-build     | Generate a Maven pom.xml                |
| maven-project * | Generate a Maven based project archive  |
+-----------------+-----------------------------------------+
...
```
Seed Fuを使って複数のデータ、中間テーブルのデータを作成する


## Seed Fu
Seed Fuは、シードデータを扱いやすくするGem
[Seed FuのGitHub](https://github.com/mbleigh/seed-fu)

## 使い方
簡単に使い方の説明をしておくと

### 準備
まず、dbディレクトリに`fixtures`ディレクトリを作成し、この下にSeed Fuのファイルを置いていく。
環境ごとに実行するファイルを分けたい場合は、fixtures以下に`development`など環境ごとのディレクトリを作成して、その下にファイルを置く。
`db/fixtures`以下または、`fixtures/環境を示すディレクトリ`以下に`users.rb`などのシードファイルを作成する。
これで準備はOK

### ファイルを作成し、シードの内容を記述する
ユーザーのシードデータを作成する記述は以下の用に書く。

```rb
User.seed do |s|
  s.id    = 1
  s.login = "jon"
  s.email = "jon@example.com"
  s.name  = "Jon"
end
```

### Seed Fuを実行する
シードの準備ができたら、ターミナルからコマンドを実行する。

```bash
rake db:seed_fu
```

特定のファイルだけ実行することもできる。

```bash
rake db:seed_fu FILTER=users # users.rbだけを実行する
```

以上で基本的な使い方は終わり(*´ω｀*)

## 複数のシードを作成する
ここからが本題。
自分の場合は、複数のデータを作りたいことが多いので、このようにしている。
ダミーデータを作成する`Faker`と組み合わせるとよりリアルなデータが作成できる。

```rb
10.times {
  User.seed do |s|
    s.name =　Faker::Name.name
  end
}
```

## 中間テーブルのデータをいれる
`has_and_belongs_to_many`を使ってアソシエーションを組んだテーブルに値をいれる。
ユーザーとグループの関係を考えたときに、ユーザーは複数のグループに所属でき、グループは複数のユーザーを所持するといった関係を例とする。
自分はこのようにして、中間テーブルにも値を入れることができた。
ユーザーのデータを先に10個ほどシードで作成しているとする。

```rb
Group.seed do |s|
  s.name = Faker::Name.name
  s.users = [User.find(1), User.find(2), User.find(3)]
end
```

先程紹介した`times`と組み合わせることで複数作成することが多い。
[Jasmine] async-await メソッドのテストを実行する

await 対象のメソッドに対して、単純にテストケースに async をつけただけだとテストケースが結果に計上されない。
したがって await 対象のメソッドに対してユニットテストを実行する際に少し工夫が必要となる。

## この記事を実施した環境
* Windows10 Home 64bit
* node v8.2.1
* npm v4.0.5
* express v4.15.0
* jasmine-node v1.14.5
* Visual Studio Code v1.15.0

## 前提
jasmine-node でユニットテストを書いていること｡
jasmine-node のインストールについては[こちら](http://qiita.com/ksh-fthr/items/41b57cb8dbeebd7a299f#%E5%89%8D%E6%8F%90)を参照。

## ケース
await 対象のメソッドに対してユニットテストを実行する。

## やりがちなミス
前述のように、テストケースに対して単純に async をつけただけ。

```javascript:これだとexpectの結果が計上されない
it('テスト結果が計上されない', async function() {
  const bar = await hogehoge();
  expect(bar).toEqual('bar');
});
```

## 対応
ヘルパーメソッドを用意してやり、テストケースをラップする。

```javascript:TestHelper.js(ユニットテストのヘルパークラス)
/**
 * ユニットテストのヘルパークラス
 *
 * @constructor
 */
function TestHelper() {}

/**
 * 非同期メソッドのためのヘルパー
 *
 * @param {object} runAsync 補助対象の非同期メソッド
 */
function helperAsync(runAsync) {
  // doneを使って対応する
  return (done) => {
    runAsync().then(done, e => {
      fail(e);
      done();
    })
  };
}

TestHelper.prototype.helperAsync = helperAsync;

module.exports = new TestHelper();
```

``` javascript:ヘルパーでテストケースをラップすることで対応する
const testHelper = require('TestHelper');

it('テスト結果が計上される', testHelper.helperAsync(async function() {
  const bar = await hogehoge();
  expect(bar).toEqual('bar');
}));
```

## 参考
[How to use async/await with Jasmine? #923](https://github.com/jasmine/jasmine/issues/923)
開発者向けWindows10について

##バージョン
###確認方法
「winver」コマンド
###一覧
|リリース日|名称|バージョン|ビルド番号|サポート終了|
|:--:|:--:|:--:|:--:|:--:|
|2015/07/29|Windows10|1507|10240|2017/05/09|
|2015/11/12|Windows10 November Update|1511|10586|2017/10/10|
|2016/08/02|Windows10 Anniversary Update|1607|14393|2018/04/10|
|2017/04/11|Windows10 Creators Update|1703|15063|2018/10/09|
|2017/10/17|Windows10 Fall Creators Update|1709|16299|2019/04/09|
|2018/04/30|Windows10 April 2018 Update|1803|17134|2019/11/12|
|2019/03/28|Windows10 October 2018 Update|1809|17763|2020/05/12→2020/11/10|
|2019/05/21|Windows10 May 2019 Update|1903|18362|2020/12/08|
|2019/11/12|Windows10 November 2019 Update|1909|18363|2021/05/11|
|2020/05/27|Windows10 May 2020 Update|2004|19041|2021/12/14|
|2020/10/20|Windows10 October 2020 Update|20H2|19042|2022/05/10|
今後は3月と9月にアップデートされる

##エディション
###確認方法
スタートメニューで右クリックし、「システム」
###一覧
|名称|ターゲット|主な機能の有無|備考|
|:--:|:--:|:--:|:--:|
|Home|個人向け|ドメイン不可、リモートデスクトップのホスト不可|
|Pro|個人・法人向け|
|Enterprise|法人向け|
|S|教育機関向け||Windowsストアからダウンロードしたアプリしか動かない|

##Linux対応(bash)
「Windowsの機能の有効かまたは無効化」から「Windows Subsystem for Linux(Bata)」を選択する。
[Excel Office365]コピーを保持する新機能が追加されたためにInsertの動きが変わる

対象：Office365 Excel バージョン 1705 (ビルド 8201.xxxx) 以降

2017年5月の更新で「コピーを保持する機能」が追加され、セルをコピーしたあとでセルの選択や編集をしてもコピーした情報を貼り付けられるようになった。
行挿入も同様に、行のコピー後に連続で「コピーしたセルの挿入」ができるようになった。
個人的に大変重宝している。

しかし、この機能によりRange.Insertの動きが変わってしまった。

## 詳細
```:コピーの保持機能がないバージョン
Sub sample()
    Rows("1:1").Copy
    Rows("4:4").Insert Shift:=xlDown '1行目のコピーが行挿入される
    Rows("4:4").Insert Shift:=xlDown '空行が挿入される
End Sub
```

これまでは1度でもInsertすればコピー情報はクリアされていた。

ところが**コピーの保持機能があると2回目以降のInsertでもコピーが行挿入されてしまう。**

```:コピーの保持機能がある場合
Sub sample()
    Rows("1:1").Copy
    Rows("4:4").Insert Shift:=xlDown '1行目のコピーが行挿入される
    Rows("4:4").Insert Shift:=xlDown '1行目のコピーが行挿入される
End Sub
```

コピー状態（セルが緑色の点線で光っている状態）を解除しないと空行のコピーができなくなっている。

同様に、例えば下記コードはコピー元と挿入先の形が違うため、コピー状態を意図的に解除しないと1004エラー「コピー領域と貼り付け領域のサイズが違うため、これをここに貼り付けることができません。」となる。

```:
Sub sample()
    Columns("A:A").Copy
    Columns("B:B").Insert Shift:=xlToRight
    Rows("4:4").Insert Shift:=xlDown
End Sub
```

個人的にこれまであまり意識していないところであったため、Insertしているところは見直していく所存。

### 回避
Insert前にコピー状態を解除すればよい。

```:
    Application.CutCopyMode = False
```


### 参考
- [Office 365 の新機能 - Office サポート](https://support.office.com/ja-jp/article/Office-365-%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD-95c8d81d-08ba-42c1-914f-bca4603e1426)
- [バージョン 1705 以降の Excel 2016 でコピー範囲が保持されるようになった動作のプログラムへの影響](https://blogs.msdn.microsoft.com/office_client_development_support_blog/2017/07/31/excel-ver1705-copykeep/)

### 2018/9/20 追記
この仕様変更が不要だったらしく9/17に機能を一旦取り下げたようだ。
https://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/20324245-may-2017-update-which-keeps-the-copied-item-active
インデックスが i の要素を除いたリストを得るには……？

リスト`items`に*変更を加えず*に`items[i]`を除いたリストを得るのに最も速い書き方あるいは，そこそこ速くてスマートな書き方が気になります（数学でたまに i 番目を除く，みたいなのが欲しくなるので）．

Jupyter の `%timeit` で計測してみました．

## numpyを使わない場合


```python
items = list(range(1000000))
i = 17 #適当
```

### スライスの結合

```python
%timeit items[:i] + items[i+1:]
```

    11.2 ms ± 349 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

### 内包表記（`enumerate`使用）


```python
%timeit [item for k, item in enumerate(items) if k != i]
```

    65.1 ms ± 212 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

### 内包表記

```python
%timeit [items[k] for k in range(len(items)) if k != i]
```

    75.5 ms ± 800 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)


スライスの結合の方が圧倒的に速いようです．ちなみに3番目の例より，2番目の`enumerate`を使った方が速いのはちょっと驚きました．

## numpyを使う場合

@antimon2 さんの[丸パク](http://qiita.com/HigashinoSola/items/47f2355604c2650f44b7#comment-9b53737f0d82bedd15f6)ですが，以下のような方法があります．

```python
import numpy as np
items = np.arange(1000000)
i = 17
```

### np.hstack

```python
%timeit np.hstack([items[:i], items[i+1:]])
```

    584 µs ± 6.32 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

### np.delete

```python
%timeit np.delete(items, i)
```

    585 µs ± 3.73 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

### ブールインデックス

```python
%timeit items[np.arange(items.size) != i]
```

    1.9 ms ± 5.82 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


### 内包表記

```python
%timeit np.array([items[k] for k in range(len(items)) if k != i])
```

    182 ms ± 3.85 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)


こちらもやはりスライスの結合がとても速いです．可読性を考えるとそんなに速さが変わらない `np.delete` がベストでしょうか．

もし，他によいものがあればご教示ください．
windows10 PCでUbuntuをデュアルブート

#winows10側での前準備

今回は、元々win10がインストールされている前提

##1. インストールボリュームの確保
まずはUbuntuをインストールする領域の確保

win10のインストールされているドライブにインストールする際は、いきなりインストール領域を作成してもいいが、ディスクのクリーンアップをしておくとインストール領域がしっかり取れる

やらなくてもいいが、以下、その方法
<details><summary>ディスクのクリーンアップ</summary>
PCからwin10がインストールされているパーティションを選んで、右クリック「プロパティ」「ツール」「最適化」</details>

"windows"+"x"から「ディスクの管理」、win10のパーティションを指定して右クリック「ボリュームの縮小」
<details><summary>縮小可能な領域のサイズが現在の使用量より極端に少ない場合</summary>ディスクのクリーンアップをするか、しても少ない場合は"windows"+"x"から「コンピュータの管理」をしてクリーンアップがうまくいっていないファイルを確認する</details>

##2. win10側の設定

####2.1. 高速スタートアップの無効
UEFIサポートのPCでの話
"windows"+"x"から「システム」、「電源とスリープ」、「関連設定（電源の追加設定）」、「電源ボタンの動作の選択」、「シャットダウン設定」「高速スタートアップを有効にする」のチェックを外す

####2.2 aurorun.infを有効に
Ubuntuのインストールというより、UNetbootinからUSBメモリにインストールする際にあるとインストールが完了しないため
設定方法は、セキュリティソフト依存

##3. Ubuntuの準備
####イメージファイルのダウンロード
**[Ubuntu desktop](https://www.ubuntu.com/download/desktop)**
isoファイルをここからダウンロード（長期保証版のLTSがおススメ）

####3.1. インストールメディアの準備
楽なのは8GB程度のUSBメモリ
Fat32でフォーマットしておく（フォーマットは「PC」からメモリを選択して右クリック「フォーマット」）

####3.2. UNetbootinによるインストールメディアの作成
**[UNetbootin, Universal Netboot Installer 日本語情報](https://ja.osdn.net/projects/sfnet_unetbootin/)**
からunetbootin-windows-655.exe（2017年8月現在）をダウンロード、実行
ダウンロードしたISOファイルを選択して、フォーマットしたUSBにインストール

ここまでで下準備は完了

##4. Ubuntuのインストール

* タッチパッド利用者はドライバが読み込まれない事が多々あるので、簡易なマウスを用意しておくと良い（LiveUSBの利用からインストール時まで）

####4.1. BIOSの設定
OSが立ち上がる前にUSBを読み込ませるため、BIOSの設定で起動ディスクのUSBの順位を上げておく
BIOSの設定画面は通常？電源を入れてF2を押す

####4.2. LiveUSBでの動作確認
もちろん、直接インストールをしてもいいが、動作確認も兼ねて一旦LiveUSBとして動作確認したほうがいい
電源を入れると立ち上げの選択画面が出るので、**「try ubuntu without install」**を選ぶ
ネット接続をここでしておくと、Ubuntu立ち上げ時にアップデートを適用しながらインストールできるため繋げておくとよい

####4.3. インストール
デスクトップのインストール用アイコンからインストールスタート
インストールの種類は、swap領域の設定等もするため**「それ以外」**を選択

#####4.3.1 swap領域の確保
実メモリ以上のデータを使用する際の仮想メモリとしてのswap領域を設定する
領域の大きさだが、議論は多々あるものの**実メモリの1-2倍程度**が妥当
（8GBのマシンなら8GBから16GB程度）

+ 「空き領域」を選択して、「+」ボタンを選択
+ 「サイズ」を選択（容量は上述参照）
+ 「新しいパーティションのタイプ」は「論理パーティション」
+ 「新しいパーティションの場所」は「この領域の終点」
+ 「利用方法」は「スワップ領域」

これでswap領域は完了

#####4.3.2 OS領域の設定
用意した領域からswap領域を抜いた全領域を指定する

+ 「空き領域」を選択して、「+」ボタンを選択
+ 「サイズ」は 空き領域全ての大きさ
+ 「新しいパーティションのタイプ」は「基本パーティション」
+ 「新しいパーティションの場所」は「この領域の始点」
+ 「利用方法」は「ex4ジャーナリングファイルシステム」
+ 「マウントポイント」は「/」

これでOS領域も完了

「ブートローダをインストールするデバイス」で、用意したパーティションのあるSSDもしくはHDD(sda)を選択しインストール開始


次回はUbuntu入れた後やっておくと便利な事を記載予定
[Drupal8]Cloud9にDrupal8をインストールする

# はじめに

下記の記事をもとに作業しました。

Cloud9にDrupal8をインストールする
http://www.tinybeans.net/blog/2017/01/15-160915.html

実際に実施した手順のポイントは以下です。

# 1. Cloud9にWorkspaceを作成する
- Templateは`php, Apache...`を選択

# 2. データベースを作成する

Cloud9のbashで操作

## MySQLの起動・入力画面への切り替え
    
```
$ mysql-ctl cli
```

> Cloud9で mysql を操作するために `mysql-ctl` というコマンドが用意されています。
> mysqlサーバーの起動/停止/状態確認/再起動 そして`cli`（Command Line Interface）というサブコマンドがあります。
> `cli`を使ってDBを作ったり、新しいテーブルを作ったりすることができます。
> http://wpwand.com/cloud-mysql-ctl-command/

## データベース作成

```
mysql> create database drupal_8 character set utf8;
```
- データベース名は任意
- `show databases;`で、データベースができていることを確認する

## MySQLを抜ける
```
mysql> exit
```

# 3. Drupal8をインストールする

## Drupal8をダウンロードして展開

```
$ wget https://ftp.drupal.org/files/projects/drupal-8.2.5.tar.gz
$ tar zxvf drupal-8.2.5.tar.gz
$ mv drupal-8.2.5/ drupal
```
- ディレクトリ名はdrupalにしておく

## ブラウザからインストールウィザードでインストール

1. Cloud9の`Run Project`ボタンをクリック
2. コマンドエリアに表示されたURLをOpen。Drupalディレクトリに移動。
3. インストールを進める
    - インストールプロフィール：標準
    - データベースの設定：先ほど作成したDBの情報を入力。ユーザーは`root`、パスワードは空欄でOK
    - サイトの環境設定：サイトの情報を入力したり、メンテナンス用のアカウントを作成する
4. できたー！

次はコンテンツを作成してみます。
【MySQL5.6.5以前】DATETIME型だと初期値、更新値にDEFAULT  CURRENT_TIMESTAMPを設定できない

#現象
MySqlでDDL発行しようとしたら構文エラーでテーブル生成に失敗した。
`updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`

#原因
MySqlのバージョンが5.6.5以前のため、DATETIME型がCURRENT_TIMESTAMPに対応していなかった。
公式ドキュメントにも記述あり。
https://dev.mysql.com/doc/refman/5.6/ja/timestamp-initialization.html

#対応
##MySqlのバージョンを上げる
業務で使用するシステムの場合、対応は非常に困難。
※古いシステムを改修し続けている場合、良くある。
##TIMESTAMP型に作り変える
`updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`
公式ドキュメントを参照/確認の上、アプリ側の処理に影響がなければ問題なし。
https://dev.mysql.com/doc/refman/5.6/ja/datetime.html
（個人メモ）　UnityのVRゲームのプロジェクトをGitで管理してるときにあまり競合させない様にマージさせる

とあるアダルトVRのプロジェクトのGit管理をしてて
他のメンバーとの理解度が離れてるので僕が中心になり
出来る限り各メンバーの修正を反映させて
競合による実装し直しを少ないようにさせようとした

SourceTreeを使ってます。そろそろ別のに変えようかとも思ってる。


■マージするときは進んでる方のブランチに一部修正した古いのを重ねる
・このほうがコンフリクトが少なく修正箇所の特定もしやすい


■メインブランチへのマージの際は操作系の処理追加のブランチをマージしてから
　描画、グラフィック周りの作業のブランチをマージする
・基本作業が別れてるから大きなコンフリクトは無いが、あったとしても対処しやすい。
・また、比較しやすいので作業担当者ではなくても修正が可能である。


現状これくらい　増えたら追加予定
LIKE検索時にエスケープ処理をする

2017/9/1
@Kilisameさんにご指摘いただき記事を修正しました。ご指摘いただきありがとうございました。

# この記事で知れること
 - エスケープ処理の例
 - Javaのサンプルコード

## 注意

使用するDBによってエスケープしなければいけない記号は変わりますので注意して下さい。
今回はMariaDBを使用する場合のサンプルです。

# 解説

このような「商品リスト」テーブルがあるとします。

| 商品ID | 商品名 |
| --- | --- |
| 1 | コーラ |
| 2 | オレンジ100% |
| 3 | 牛乳 |
| 4 | りんご100% |
| 5 | 牛乳_低脂肪 |
| 6 | オレンジ100個分ジュース |
| 7 | りんご100個分ジュース |

DBにinsertするSQL文はこちらです。
```sql
insert into 商品リスト (商品ID, 商品名) values ('1', 'コーラ'),
('2', 'オレンジ100%'),
('3', '牛乳'),
('4', 'りんご100%'),
('5', '牛乳_低脂肪'),
('6', 'オレンジ100個分ジュース'),
('7','りんご100個分ジュース');
```

この「商品リスト」テーブルに対して、部分一致検索をするSQL文はこちらです。
【1】「牛乳」で部分一致

```sql
select 商品ID, 商品名 from 商品リスト where 商品名 like '%牛乳%';
```

【2】「100%」で部分一致

```sql
select 商品ID, 商品名 from 商品リスト where 商品名 like '%100\%%';
```

結果

| 商品ID | 商品名 |
| --- | --- |
| 2 | オレンジ100% |
| 4 | りんご100% |

【3】「_低脂肪」で部分一致
```sql
select 商品ID, 商品名 from 商品リスト where 商品名 like '%\_低脂肪%';
```

結果

| 商品ID | 商品名 |
| --- | --- |
| 5 | 牛乳_低脂肪 |

「%」「_」記号は、DBにとって特別な意味を持ちますので、【2】【3】のようにエスケープ記号「\」を前につけないと、意図した部分一致検索ができません。
試しに、エスケープ記号を付けずにLIKE検索してみると、

【4】
```sql
select 商品ID, 商品名 from 商品リスト where 商品名 like '%100%%';
```

結果

| 商品ID | 商品名 |
| --- | --- |
| 2 | オレンジ100% |
| 4 | りんご100% |
| 6 | オレンジ100個分ジュース |
| 7 | りんご100個分ジュース |

よって、アプリケーションで検索処理を実装したい場合は、検索対象ワードに対してエスケープ処理を行わなければいけません。

# サンプルコード

```java
public void getName(String word){
    Connection con = null;
    String sql = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try{
        con = this.getConnection();
        sql = "select 商品名 from 商品リスト where 商品名 like ?";
        ps = con.prepareStatement(sql);
        ps.setString(1, "%" +this.escape(word) + "%");
        rs = ps.executeQuery();
        
        rs.close();
        ps.close();
    }finally{
        if(con != null){
            con.close();
        }
    }
}

public String escape(String before){
    StringBuilder after = new StringBuilder();
		String esSymbol = "\";
		char es1 = '_';
		char es2 = '%';

		for (int i = 0; i < before.length(); i++) {
			if (before.charAt(i) == es1 || before.charAt(i) == es2) {
				after.append(esSymbol);
				after.append(String.valueOf(before.charAt(i)));
				continue;
			}
			after.append(String.valueOf(before.charAt(i)));
		}
		return after.toString();
}
```
CentOS7上のRailsでtherubyracerが入らない問題

# 執筆日
2017/08/30

# どんなエラーか
```bash
$ bundle install
```
すると…

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

make: g++: Command not found
make: *** [accessor.o] Error 127
```
g++なんてコマンドがないと怒られている。

# CentOSにgcc-c++をインストールする
```bash
$ sudo yum -y install gcc-c++
```
やったぜ。
R Markdownで任意の文字列に任意のclass/idを付与したspanタグを挿入

タイトルの通りです。jQueryの練習がてらやってみました。


## R Markdownが読み込んでいるもの

R Markdownの基本outputであるhtml_documentには、Bootstrapというデザインワークフレームが組み込まれています。その関係で、jQueryも合わせて読み込まれています。したがって、意図的に除去しない限りはこれら2つは標準で利用可能となっています。

これら2つが使えるということは、Webにおけるいろいろな要素を簡単に組み込むことができます。そこで今回は、[R MarkdownにBootstrapのBadges機能を実装](http://qiita.com/kazutan/items/e2834b18a2ae4a874d27)や[R MarkdownにBootstrapのLabels機能の実装](http://qiita.com/kazutan/items/b79ceda82914e9986e13)を応用して、タイトルの内容をjQueryを利用して実現させてみます。

## 目標

- htmlタグなし
- 楽に設定できる

こんなところですかね。

## 実装

できました。流れは上述したBadge機能やLabel機能と同一で、JavaScriptの部分を以下の内容に差し替えます:

```js
$(function(){
  $("strong").each(function(){
    var txt = $(this).text();
    if((/^sp\[.*\]/).test(txt)){
      var strText = txt.split('\] ')[1];
      var arrSelector = txt.split('\] ')[0].match(/\[(.*)/)[1].split(' ');
      
      var arrClass = arrSelector.filter(function(item, index){
        return (/^\./).test(item);
      });
      var strClass = ""
      if(arrClass.length) {
        strClass = arrClass.join(' ').replace(/\./g, '');
        strClass = "class='" + strClass + "'";
      }
      
      var arrId = arrSelector.filter(function(item, index){
        return (/^#/).test(item);
      });
      var strId = ""
      if(arrId.length) {
        strId = arrId.join(' ').replace(/\#/g, '');
        strId = "id='" + strId + "'";
      }
      
      $(this).replaceWith("<span "+strClass+strId+">"+strText+"</span>");
    }
  });
});
```

jsのコーディング規約とか全く知らないので，汚い書き方になってしまいすみません。内容の解説は省略します。このjsコードを読み込ませておき、Rmd上では以下のようにします:

```md
あああ **sp[.hoge .fuga #piyo] あああ**
```

このように、強調を指定する`**`で対象を挟み込み、先頭に`sp[(文字列)] `があると反応するようにしました。半角スペースも検出に利用してますので、半角スペース必須です。ちなみに、こういう感じになります:

![23232254333.png](https://qiita-image-store.s3.amazonaws.com/0/35118/7d665bd6-c3f5-8165-74da-97b89a6a1833.png)

## 解説

特にないです。考え方などは前の方にリンクした記事を参照してください。

## 雑感

当初は簡単だろうと思ったのですが、想定以上に手こずりました。。。あと、**本家Pandocの最新版では任意の属性(class/id以外も対応)を付与する機能が追加されています**:

http://pandoc.org/MANUAL.html#spans

mdでの表現方法は違いますが、結構近いところを考えていたんだなぁと。なおこのPandocの機能は2017/08/30現在のRStudio安定版(v1.0.x)では組み込みPandocのversionが低いため対応していません。RStudio Preview版なら組み込みPandocが新しくなって対応しています。てことで、このテクニックは古いPandocを使っている方向けの内容となります(あまり意味がなかった)。まあ個人的にはいい勉強になったんでよかったです。

**Enjoy!**
jsoupのselectorにて:nth-child(-n+m)が意図通りに動作しない件について

# 初めに
jsoupの[selector](https://jsoup.org/apidocs/org/jsoup/select/Selector.html)が便利で使っていたのですが、:nth-childの挙動がおかしいので調べた内容（あまり調べてません）とその対策です。
**いろいろ書いてますが「:nth-child(-n+m)」ではなく「:lt(n)」でやりたいことができてしまいました。（最後に記述）**

# 環境について
開発環境　：　Eclipse pleiades 4.6.3
Java　：　Java8
jsoup　：　1.9.2（※1.10.3でも同事象）

# やりたいこと
selectorにて複数の要素を取得したうち、最初の5件のみを取得したい

# 通常のセレクタにて指定する場合（CSSやJavaScript等）
たとえば以下のような要素の中のaタグのみを取得したい場合。

```html
<div class="list">
  <ul>
    <li><a href="aaa">リンク１</a></li>
    <li><a href="aaa">リンク２</a></li>
    <li><a href="aaa">リンク３</a></li>
    <li><a href="aaa">リンク４</a></li>
    <li><a href="aaa">リンク５</a></li>
    <li><a href="aaa">リンク６</a></li>
    <li><a href="aaa">リンク７</a></li>
    <li><a href="aaa">リンク８</a></li>
    <li><a href="aaa">リンク９</a></li>
    <li><a href="aaa">リンク１０</a></li>
  </ul>
</div>
```

指定は以下のようになります

```
div.list> ul > li > a
```

これだと20件すべてが対象となります。
このうち、先頭5件だけを、となると以下のような書き方になります。

```
div.list> ul > li:nth-child(-n+5) > a
```

# jsoupのselectorにて指定する場合
上記の指定をするとなぜか「5個目以降」が対象になってしまいます。
つまり、「リンク５」～「リンク１０」までの6つが対象となります。

ですが、以下の指定を行うことにより、「先頭5件」を対象にできます。


```
div.list> ul > li:not(:nth-child(-n+6)) > a
```

ポイントは

- :nth-childを:notで囲うこと
- -n+5ではなく-n+6とすること

です。

なぜこれで上手く対象となるのかは分かっておりませんが、このような動作をするようです。

# そもそも！
いただきましたコメントより、「:lt()」を使えば簡単でした・・・

```
div.list> ul > li:not(:nth-child(-n+6)) > a
```

ではなく

```
div.list> ul > li:lt(5) > a
```

で要望を満たせます。

お騒がせ致しましたm(_ _)m
AngularJSでコンポーネントを使用する方法を書いてみた（JavaScript版）

###コンポーネントとは
AngularJSを使用する上で重要な概念としてコンポーネントがあります。
ざっくりコンポーネントを利用するとどんな事が実現できるかというと
簡単にhtml内に他のhtmlとjsの処理を利用できます。

コンポーネントのメリットとして以下の点が挙げられます
・コードの再利用性向上
・機能修正が簡単に
・作業効率アップ

デメリットとして以下の点が挙げられます
・書き方が特殊で習得するのに他と比べて時間がかかる

###コンポーネントのキホン
コンポーネントの書く上で大事なファイルはController.htmlとComponent.jsの2ファイルです。
下のコードはbasicController.htmlがbasicComponent.jsを使用するように処理を書いてます。

```basicComponent.js
angular.module('myApp')
  .component('basicComponent', basicComponent);

class basicComponentClass {
  constructor() {}
}

basicComponentClass.$inject = [];

var basicComponent = {
  controller: basicComponentClass,
  templateUrl: 'component/basicComponent.html',
  binding: {
    param: '<'
  }
}
```

```basicController.html
<basic-component param="'hogehoge'"></basic-component> //属性としてコンポーネントを使用
```

上記のようなコードを書き、実行すると<basic-component～の部分でbasicComponent.htmlを表示できるようになります。

### バインディングについて

先程のコードで説明を省きましたが、コンポーネントを使う際に便利なのがバインディングです。
バインディングはcomponentを利用する際にコントローラーからパラメータを渡すことが可能です。
パラメータを使うためにはまず、コンポーネントで受け口を作る必要があります。作り方は以下のコード。（上のコードにも書いてあります）

```basicComponent.js内
binding: {
  param: '<'
}
```

これで受け口を作れたのでコントローラーから使用してみましょう。
使用するのは以下のコードのparam部分で使用したいパラメータの指定と実際の値を渡しています。

```basicController.html
<basic-component param="'hogehoge'"></basic-component> //属性としてコンポーネントを使用
```

###注意
以下のようにキャメルケースでバインディングを設定した場合

```js
binding: {
  hoge: '<',
  fugaFuga: '<'
}
```

使用方法としては以下のように大文字の部分を"-小文字"に変換して書きます。

```html
<basic-component hoge="'1'" fuga-fuga="2"></basic-component>
```
CentOS7上のRailsでMySQLが入らない問題

# 執筆日
2017/08/30

# どんなエラーか
```bash
$ bundle install
```
すると…

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
```
というエラーが。
「CentOS Rails MySQL gem error」とかで検索すると、CentOSにMySQLが入ってないから出るエラーっぽいというのが分かる。

# だがしかし
```bash
$ sudo yum -y remove mariadb*
$ sudo yum -y install mysql-devel
```
デフォルトで入っているMariaDBをアンインストールして、MySQLをインストールするぞい。

```
Installed:
  mariadb-devel.x86_64 1:5.5.52-1.el7
```
は？

そう、yumでMySQLと指定してもMariaDBがずうずうしくインストールされるのである！

# MySQLのリポジトリを追加する
```bash
$ sudo yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
$ sudo yum -y install mysql-devel
```
やったぜ。
まっさらなCentOS7にRailsの開発環境を構築する

# 執筆日
2017/08/30

# はじめに
* Windows 10 Pro v1703 b15063.540
* VirtualBox 5.1.26 r117224 (Qt5.6.2)
 * Extension Pack 5.1.26 r117224
* Vagrant 1.9.6
 * vagrant-share 1.1.9, system
 * vagrant-vbguest 0.14.2

以上の環境に構築。
バージョンの違いにより、動かない場合あり。

# VagrantでCentOS7を用意する
## boxをダウンロードする
1.適当なディレクトリを作成。
2.以下のコマンドを実行。Vagrantfileが作成される。

```dos
vagrant init centos/7
```
3.必要があれば、Vagrantfileを編集。
4.以下のコマンドを実行。初回なのでダウンロードが発生する。

```dos
vagrant up
```
## sshで接続出来る様にする
1.以下のコマンドを実行。

```dos
vagrant ssh-config --host [ホスト名] >> [.sshのパス]/config
```
2.以下のコマンドで接続。

```dos
ssh [ホスト名]
```
# Rubyのセットアップ
## rbenvとruby-buildをインストールする
1.事前準備。

```bash
$ sudo yum -y update kernel
$ sudo yum -y install kernel-devel git openssl-devel readline-devel zlib-devel gcc gcc-c++
```
2.gitからクローンして持ってくる。

```bash
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```
3.以下のコマンドを実行。

```bash
$ cd ~/.rbenv/plugins/ruby-build
$ sudo ./install.sh
```
4.設定を追記。

```bash
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

## rbenvでRubyをインストールする
1.以下のコマンドを実行。なかなか終わらないが根気よく待つ。

```bash
$ rbenv install 2.3.3
```

## Rubyを使える様にする
1.以下のコマンドを実行。

```bash
$ rbenv global 2.3.3
```

# Railsのセットアップ
## gemをインストールする
1.以下のコマンドを実行。

```bash
$ gem install bundler
$ gem install rails
```

以上で、Railsが使える状態になっているはず。

# おわりに
Ansibleとかで自動化したい。
デフォルトでadministrator@localhostでrvcにログインできない

vCenter Server Appliance 6.5 で rvc を使うには administrator@localhost でログインするってさらっと紹介しているサイトが多いんだけど、デフォルト状態でログインできなくて少し困ったのでメモ。

結論としてはWeb Clientの[管理] - [Single Sigh-On] - [設定] の [アイデンティティソース]タブから使用するドメインをデフォルトドメインとして設定する。

<img width="644" alt="デフォルト.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/150727/eed8ff01-1a87-e604-ba49-96de6a744ead.png">

設定後の再起動などは不要。

>Command> rvc administrator@localhost
>Install the "ffi" gem for better tab completion.
>password:
>Welcome to RVC. Try the 'help' command.
>0 /
>1 localhost/

# 参考

Cannot log in to the Ruby vCenter Console using administrator@localhost
https://kb.vmware.com/kb/2088096
トランザクションのセーブポイントについて知る（with Java）

# この記事でわかること
 - トランザクションのセーブポイントという仕組みの存在。
 - Javaで使用する際のサンプルコード

# トランザクションのセーブポイントという仕組みについて
そもそもトランザクションとは、「ある処理を行うための一連の処理の流れ」のことを指します。
一連の処理の中でどれかしらの処理がこけたら、それまでに更新した処理等を巻き戻して処理を行う前の状態に戻すことが多いです。
しかし、状況により、全部は戻したくないがある地点までは戻したいことがあります。
そんな時にSavepointを設定し、その地点まで戻す（ロールバックする）ことが可能です。

# Javaで使用する際のサンプルコード
引数のnameをlistテーブルに登録する処理を想定したサンプルコードを記載します。
### ポイント
 - Savepointは、Connectionを取得～PreparedStatement取得の間で取得しましょう。
 - Savepointに対応していないDBかチェックしてから、Savepointオブジェクトを取得しましょう。
 - Savepointを取得した地点にrollbackする場合、rollback(save)というようにSavepointオブジェクトを渡しましょう。
 - Savepointに対応していないDBの場合、Savepointオブジェクトはnullのままなので、rollbackする際チェックをいれnullなら普通のrollbackをしましょう。

### 補足
 - Savepointクラスは、java.sqlパッケージに含まれています。
 - ひとつのConnectionの中で複数のSavepointを持つことが可能です。その場合、各Savepointに名前を付けることが出来ます。（今回のサンプルコードには実装していません）

```java:Java
public void regist(String name) throws SQLException{
    Connection con = null;
    Savepoint save = null;
    String sql = null;
    PreparedStatement ps = null;
    
    try{
        con = this.getConnection();
        if(con.getMetaData().supportsSavepoints()){
            save = con.setSavepoint();
        }
        sql = "insert into list (name) values (?)";
        ps = con.prepareStatement(sql);
        ps.setString(1, name);
        ps.executeUpdate();
        ps.close()
    }catch(SQLException e){
        if(save != null){
            con.rollback(save);
        }
        else{
            con.rollback();
        }
    }finally{
        if(con!=null){
            try{
                con.close();
            }catch(SQLException e){
            }
        }
    }
}
```
AndroidでgRPCを触ってみて辛かったこと

触ってみたのでまとめてみます。アプリ（Android）から見た内容です。
実装方法についてこちらでは記載していません。他の記事が詳しいのでそちらをご覧ください。

記載時のgRPCのバージョンは 1.4 です。

## なぜgRPCを使おうと思ったのか
- jsonは補足資料を別途作る必要があり手間がかかる。
- 型が使えるのでコーディングしやすそう。
- パフォーマンスが良い（らしいです。）
- 流行りに乗ってみたかった
- [google製](https://grpc.io/)

## 使ってみてどうだったか？

### よかったこと :relaxed:
- 型を持っているのでコーディングしやすい。
- gRPCを経由して最初からデータが入ったクラスを取得できます。jsonをクラスに変換処理が不要。
- データが入ってたらboolean返してくれる便利メソッドとか最初から使えるのでコーディングが楽。
- サーバ側でprotoファイル（通信でやり取りするオブジェクトの定義ファイル）をアプリ側にセットする。サーバとクライアントの間でAPI仕様を合わせることが簡単。
- 速度もjsonと遜色ないです。（ちゃんと調べたら早いのかな？）

### 辛かったこと :cold_sweat:
- 日本語資料が少なく、ネットにも情報が多くなかったので時間がかかる。
- ActivityからFragmentへのデータ引き渡し
- 一定時間経過するとException(End of Stream)が発生。通信ができなくなります。
- デバッグがやりづらい。（エンジニア以外）

## 辛かったことへの対処

### 日本語資料が少なく、ネットにも情報が多くなかったので時間がかかる。
- 色々な会社が採用進めているらしいので徐々に増えてくると思いますが、現状は試行錯誤が必須でしょうか。もう少しトラブル系の情報が増えて欲しい。

##### 参考資料
- [gRPC for Android](https://speakerdeck.com/wasabeef/grpc-for-android)
- [Protocol Buffers](https://developers.google.com/protocol-buffers/)


### ActivityからFragmentへのデータ引き渡し。
- Fragmentに値を渡すときBundle使ってますよね？BundleのputSyrializable（）にセットする値は、toByteArray()とparseFrom()を使いました。byte[]であればFragment再生時もonSaveInstanceState()にそのまま保存できます。

``` Java
    private byte[] byteArray;


    public static SampleFragment newInstance(GrpcResponse grpcResponse){
        SampleFragment f = new SampleFragment();
        Bundle b = new Bundle();
        b.putSerializable(BUNDLE_KEY_HOGE, grpcResponse.toByteArray());
        f.setArguments(b);
    }

    @Override
    public View onViewCreated(View v, Bundle savedInstanceStates){
        if (savedInstanceState == null) {
            byteArray = (byte[]) getArguments().getSerializable(BUNDLE_KEY_HOGE);
        } else {
            byteArray = (byte[]) savedInstanceState.getSerializable(BUNDLE_KEY_HOGE);
        }

        try {
            response = GrpcResponse.parseFrom(byteArray);
        } catch (InvalidProtocolBufferException e) {
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putSerializable(BUNDLE_KEY_HOGE, byteArray);
    }

```
- [参考ページ : Java.io.ByteArrayOutputStream.toByteArray() Method](https://www.tutorialspoint.com/java/io/bytearrayoutputstream_tobytearray.htm)

初めはこのメソッドを知らずにSerializableをimplementsしたラッパークラスを作って使っていたのですが、Activityが再生成されたタイミングで、onSavedInstanceState()で保存したオブジェクトがnullになる事象が発生しました。



### 初回のサーバ接続から一定時間が経過するとException(End of Stream)が発生。通信が失敗する。
- [エラー内容](https://github.com/grpc/grpc-java/issues/2478)
- APIリファレンス見るとアプリとサーバの接続状態を確認するメソッドがあるらしいのですが、まだ未実装のようです。そのため、channelを毎回作成して接続を貼り直して対応してます。Go言語だと問題ないのでしょうか（未確認）。

### デバッグがやりづらい
- gRPC経由のデータはブラウザで確認ができないため、エンジニア経由でデータの中身が確認できなかったです。ただ、未確認ですが、jsonに出力もできるようなので、上手く使えれば解決するかも知れません。

## おわりに
- 色々悩まされましたがメリットも大きいと感じました。Retrofit要らずです。もっと情報増えてくると嬉しいですね。
AWSのマルチAZ環境でWordPress

Webサーバが2台構成（オートスケールではない）の環境でWordPressを使おうとしたら、なかなか厄介だったので作業内容をメモ。
AWSのマルチAZ環境を前提とした調査だが、複数台構成の環境全般に言える。

# 基本方針

WordPressは複数台サーバを前提とした設計になっていない（WordPressがローカルファイルを書き換える）ので、マルチAZ環境には向いていない。
どうしても複数台サーバにしたければ、一案としてrsyncでファイル同期する方法がある。
データベースは通常通り、RDSを使える。

ただし単純に「web1をweb2に同期」としても、WordPressがweb2サーバのファイルを書き換える可能性がある。
（後述するが、「rsyncで双方向同期＋ロードバランサーでスティッキーセッション」で対応できる。）

また、gitでファイルを管理していてもWordPressがファイルを書き換えるため、この対策も必要となる。
（後述するが、「専用のテーマのみgit管理対象」で対応できる。）

# 具体的な構築内容

## サーバ構成

Webサーバはweb1とweb2の二台構成とする。アクセスはELBで割り振るものとする。
データベースにはRDSを使うものとする。（EC2にMySQLをインストールしてデータベースサーバを構築する場合も、作業の流れは同じ。）
以下の手順では、メディア置き場としてS3は使っていない。（メディアはWebサーバに保存し、rsyncで同期する。）

## 公開ディレクトリ

一例として `/var/www/html` とする。（`/var/www/vhosts/wordpress/html` など他の場所の場合も、作業の流れは同じ。）

## 同期設定

rsyncで `/var/www` を双方向同期する。同期ユーザは一例としてrsyncとする。（専用に作成する。）
意図しないファイルの削除＆復元を避けるため、`/etc/lsyncd.conf` のsyncブロックで以下の指定を行う。

```
delete = "running",
init   = false,
```

WordPress設置場所のディレクトリに以下の指定を行い、この中で作成されたファイル＆ディレクトリの所有グループをapacheにする。

```
chown apache. /var/www
chmod 0777 /var/www
chmod g+s /var/www
```

セッション切れを防ぐため、ELBでスティッキーセッションを有効にする。
「Aサーバでメディアをアップロードしたが、直後にBサーバにアクセスしたのでメディアが表示されない（同期が完了していない）。」もこれで防げる。

## 更新方法

ファイルアップロードユーザは一例としてweb-userとする。（専用に作成する。）
アップロードはweb1サーバからweb-userで行う。（web2サーバから行っても問題ないはずだが、統一しておくと無難。）
これでファイル＆ディレクトリの所有者＆所有グループは

- アップロードした    ... web-user / apache
- WordPressが作成した ... apache / apache
- 同期された          ... rsync / apache

となる。すべて同じグループになるので、グループに対して読み書きの権限を与えれば、各ファイルの読み書きができる。

## gitを使う場合

デプロイの仕組みを作る場合、web1サーバからapacheユーザでデプロイする。rsyncで同期されるので、web2サーバでのデプロイは不要。
ただしWordPress自体が自身のプログラムを書き換えるため、最低限のファイルのみgitで管理する。
`.gitignore` で以下の指定を行い、`wordpress` ディレクトリをgit管理対象外にして、専用のテーマのみgit管理対象とする。
（テーマ以外にも管理対象を追加したければ、都度追加する。）

```
/wordpress/*
!/wordpress/wp-content
/wordpress/wp-content/*
!/wordpress/wp-content/themes
/wordpress/wp-content/themes/*
!/wordpress/wp-content/themes/mysite
```

# オートスケールに対応させるなら

双方向同期では対応できないので、素直にAWS公式の解説通りにすると良さそう。（未検証。）

[外部 Amazon RDS データベースを備えた高可用性の WordPress ウェブサイトを Elastic Beanstalk にデプロイする - AWS Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/php-hawordpress-tutorial.html)
GLSLをどこに書こうか

最近Three.jsでWebGLの世界に触れ始めた初心者です。
色々と参考サイトを巡っていると、GLSLの記述場所はHTML内に&lt;script&gt;タグで書いている例が多いようです。

```html:index.html
<script id="vs" type="x-shader/x-vertex">
  void main(void) {
  }
</script>
<script id="fs" type="x-shader/x-fragment">
  void main(void) {
  }
</script>
```

↓

```javascript:script.js
var material = new THREE.ShaderMaterial({
  vertexShader: document.getElementById('vs').textContent,
  fragmentShader: document.getElementById('fs').textContent
});
```

こんな感じ。WebGLさん的には文字列として渡ればどんな実装形式でも構わないみたいですが、JSにはヒアドキュメントが無いため、変数に複数行のテキストを入れるには色々と小細工が必要となり…

```
var vs = 'void main(void) {/*処理も全部一行で*/}';
```

可読性・保守性を諦めて一行にmin化するか

```
var vs = 'void main(void) {'
       + ''
       + '}';
```

```
var vs = (function(){/*
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
```

GLSLのインデントを保ちたい場合、何通りかのやり方がありますが上記のようなぐちゃぐちゃとしたコードを準備しないとならないので、煩わしい事を考えなくてよいHTMLインライン型に落ち着いたのかもしれません。

---

ところでES6ではヒアドキュメントが使えます！自分も最近知りました！
そこで以下のようにJS内でGLSLを書いてみることにしました。

```javascript:script.js
const vertex_shader = `
  void main(void) {
  }
`;
const fragment_shader = `
  void main(void) {
  }
`;

const material = new THREE.ShaderMaterial({
  vertexShader: vertex_shader,
  fragmentShader: fragment_shader
});
```

この手法の場合、DOMアクセスが不要になった分、パフォーマンスの向上が見込めます。また、好みの問題ですがソースがJS内に一元化できるので全体の見通しが良いかも。
dumpデータをコマンドでローカル環境にインポートする

# 背景
Webアプリケーションで本番環境・テスト環境それぞれ複数のサブドメインなどがある場合、
バグ検証等でサーバー上の環境をそっくりそのままローカルで再現してテストしたい！

そんな時はdumpデータをphpMyAdminからエクスポートし、ローカル環境にインポートできれば、
ローカルで再現ができる。（結構すぐできる）

# 準備
- MAMPインストール
- dumpデータ（phpMyAdminからエクスポート）
- iTerm

# 手順
※MAMPたちあげてdumpデータはローカルに保存してある前提です。

①データをインポートする
`/Applications/MAMP/Library/bin/mysql -uroot -proot hogehoge < ~/Downloads/hogehoge.sql`

インポート先 < インポートしたいdumpデータのパス

②実行
`yarn dev`

③ブラウザで確認
`locakhost:8800`

# 上手くいかないとき試して欲しい
①DB空にする
`/Applications/MAMP/Library/bin/mysql -uroot -proot hogehoge -e 'drop database hogehoge;'`

②DB作成する
`/Applications/MAMP/Library/bin/mysql -uroot -proot -e 'create database hogehoge;'`

③インポート再トライ
`/Applications/MAMP/Library/bin/mysql -uroot -proot hogehoge < ~/Downloads/hogehoge.sql`

④実行
`yarn dev`

いけた！（いけるはず！！）
以上です。
Javascript初心者がGASのformatDateの使い方を解説

#GASで自動返信メールを作っていた
はじめまして
プログラミングって敷居高いですよね
私は初心者中の初心者なんですが、とあるプロジェクトで

「Googleフォームで情報を集めて」
「GASでその内容を自動返信する」

ということをする必要がありました。

私自身プログラミングはほとんど経験なく、「分かりません」と言っても良かったのですが、
それはそれでなんとなく悔しいので、ネットにある情報を頼りになんとか

「Googleフォームで情報を集めて」

のところまではクリアしました。


また、

「GASでその内容を自動返信する」

というのも、[m/field様のこちらのサイト](https://www.m-field.biz/archives/2373)を参考にし
~~というか丸パクリし~~
なんとか形になりました。
#しかし、タイムスタンプがぶっきらぼうだった
これはGASというか、Google側の仕様ですし、プログラマからすればこっちのほうが汎用性があり、使いやすいのでしょうが、
>Wed Aug 30 2017 16:30:35 GMT+0900 (JST)

という、一般の人からするとなんとも読みにくいフォーマットでした。
「これはいかん!ユーザーフレンドリーじゃなかばい！」と思い、リサーチをはじめました。
#案外あっさり解決
時間のフォーマットを変更するには**formatDate**というライブラリを使用します。
使い方はかんたん、
```var hogetime = Utilities.formatDate(hogevalue,'JST','yyyy年MM月dd日');```
とすればhogetimeに整形された**2017年08月30日**という文字列が入ります。

私の場合、時分秒もいれたかったので、
```var hogetime = Utilities.formatDate(hogevalue, "JST", "yyyy'年'MM'月'dd'日' HH'時'mm'分'ss'秒'");```
としました。
こっちは**2017年08月30日 16時30分35秒**という表記になります。
(フォーマット指定のやり方が若干違いますが、どっちでもいいみたいです。)

#詳しい解説
```Utilities.formatDate(Dateオブジェクト, "タイムゾーン", "フォーマット")```
このように記述します。
####Dateオブジェクト
これは変換する前の元の日付データです。
例えばスプレッドシートから取得する場合、range.getCellなどで取得すると
Wed Aug 30 2017 16:30:35 GMT+0900 (JST)
と言うかたちで表現されます。
まんまですね。
####タイムゾーン
これには表記の揺れがあるようですが、大概**GMT**や**JST**など、標準時を表す略称を記入すれば大丈夫です。
""(ダブルクォーテーション)で囲むのを忘れずに！
####フォーマット
変換したい日付フォーマットを指定します。
個人的には
```yyyy年MM月dd日(E)HH時mm分ss秒```
から不必要なものを削っていくのがベストかと思いますが。
気になる方は[こちらのサイト](https://sites.google.com/site/gasgaidobukku/utilities/formatdate)が参考になりますのでぜひ。
#まとめ
ということで、今回はformatDateの解説でした。
いやー、解決してよかった。
GASは使えると仕事においてとても重宝すると思うのでみなさんもたくさん使ってください！
それでは！
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第一章 知識をかみ砕く7

# 深いモデル
貨物予約アプリケーションの例より
> 役に立つモデルがすぐに見つかる表層にあることはめったにない。

初期のモデルで構築するモデルは、その時重要と思っていても、プロジェクトがすすむにつれて、違う視点で見られるようになり、最初はわからなかった深いモデルが現れるということですね。

貨物予約アプリケーションの例でも、下請けや地元の輸送会社に委託されていて、当初重要視していた輸送日程の手配のモデルより、船荷証券などの法律書類や支払い免除につながるプロセスの方が重要になってきたと。
それにたどり着いたのが何ヶ月後ということ。

> 知識の噛み砕きは探求だから、最終的にどこへたどり着くかはわからないのだ。

本当にその通りだと思います。
初期のモデルが重要ではないと言っているわけではなく、探求のスタート地点なのだということですね。
今わかっていること、学習したことをモデルに反映するにつれ、重要なことが変化していく。

知識の噛み砕きは探求。