OmniAICreator/Qiita-1.07M huggingface dataset:
Ansibleでcronを設定する

# Ansibleでcronを設定する
Ansibleで、Amazon S3にディレクトリのバックアップを午前3時に実行するcronを設定する。
`cron-s3.sh`には、AWS CLIでS3とsyncするコマンドが記述されている。

```yml:main.yml
- name: S3バックアップのシェルを配置
  become: True
  template:
    src: templates/cron-s3.sh.j2
    dest: /root/cron-s3.sh

- name: cron設定
  become: True
  cron:
    name: S3バックアップ
    minute: 0
    hour: 3
    job: "sh /root/cron-s3.sh 1>> /var/log/nas-log/exec.log 2>> /var/log/nas-log/error.log"
    state: present
```
cronモジュールを使って、crontabの設定を編集する。
minute・hour・day・month・weekdayは、指定がなければデフォルトで`*`になる。

# 結果を確認
```:結果
$ sudo crontab -l
#Ansible: S3バックアップ
0 3 * * * sh /root/cron-s3.sh 1>> /var/log/nas-log/exec.log 2>> /var/log/nas-log/error.log
```
`name`で書いたものが、`#Ansible:<name>`で設定される。

[cron - Manage cron.d and crontab entries — Ansible Documentation](https://docs.ansible.com/ansible/2.5/modules/cron_module.html)
効率的な開発手法の提案

# はじめに
プログラム開発は個人の技量により開発時間が大きく左右します。
昨今の働き方改革などて効率的な働き方が求められているというのもあり、効率的なプログラム開発の手法(コーディング手法)について提案してみます。

目的は、**複雑なものをシンプルにして**プログラム開発の効率化を図る事です。

実践編はこちら。
「[効率的な開発手法の実践](https://qiita.com/nakka_/items/a695bd3151133c090d5c)」

# 非効率な要因
プログラム開発において非効率となる要因として以下があります。

- 手戻り
- デバッグ

複数人である程度の規模を開発する場合は、結合時に認識齟齬があったりすると大きな手戻りになります。（そもそもI/F仕様を明確にしておくことで防げますが）
デバッグでは複雑なバグがあると原因を調査するのに時間がかかります。
これらによって見積もり時間より大幅に遅れてしまうことがプログラム開発では多々あります。

# 効率的な開発手法
そこでより効率的に開発が可能となる開発手法を提案します。
本開発手法では、**「プログラムを1行書く度に動かす」** というのを繰り返します。

例えば10行以上プログラムを一気に書くと、動かない時には複合的なバグが潜んでいる可能性が高くなります。
そうすると一つを修正しても正しく動かなくて修正が正しかったのかさえわからなくなってしまい調査に時間がかかります。
プログラムを1行書いて動かすと複雑なバグが潜み難くなり、より**シンプルな問題解決**ができます。

特に以下のような状況で有効と考えています。

- 単納期
- 初めて触る言語やフレームワーク

いわゆる「急がば回れ」です。
単納期だからと一気にプログラムを書くと複雑なバグによって大きな遅延になってしまいます。

とはいっても1行単位というのは極端で、**実際には2〜3行程度書いて動かす**事が多いです。
例えば書いた1行を確認するデバッグ処理を追加するなどです。

# 最低限のワンパスを通す
本開発手法で一番最初にやることは**動くようにする事**です。
最低限の機能をざっくり作ってワンパスを通します。

例えばWebシステムであればリクエストを受けて適当な文字を返すだけで最低限のワンパスとなります。
最低限のワンパスを確認することで、動かない時に環境起因の問題か、作ったプログラムのバグかの切り分けがやりやすくなります。
あとは最低限のワンパスに肉付けをするのですが、その時に常に動かす事を心がけます。

ワンパスにより全体的な流れができると、認識齟齬による手戻りが減ります。

しかし、CやJavaではビルドに時間がかかるため、動かしながらが逆に非効率になってしまう危険があります。
ビルドやデプロイなどに工夫の余地が無い場合は次項で紹介するUnitテストの有効活用などが考えられます。

# Unitテストで動かす
システムに組み込んで動かしながら開発するのが非効率な場合はUnitテストのツールを有効活用します。
(JavaならJUnit、Pythonならunittestなど)

新しくクラスを作る場合はまずクラスの枠だけ作り空のメソッドを書きます。
次に、そのメソッドを呼ぶだけのテストケースを書きます。(ここまでで最低限のワンパス)
あとはプログラムを1行書く度にテストケースも追加して常に正しく動いているのを確認します。

# まとめ
本開発手法では以下の2要素が重要となります。

1. 最低限のワンパスを通す
2. プログラムを1行書く度に動かす

チーム開発においては技術的なキーマンがまずは最低限のワンパスを通して、後は全員で1行書く度にシステムが正しく動く事を確認しながら作ります。
キーマン以外は勉強しながら開発しても既に動くものがあるため、ある程度の生産性が見込めます。

個人開発においても最初にワンパスを通す事でゴールが明確になり、1行書く度に動かす事でデバッグの手間が減るため計画的にプログラム開発ができます。

# リンク

- [効率的な開発手法の実践](https://qiita.com/nakka_/items/a695bd3151133c090d5c)
base16を入れて最高にカッコいいターミナル環境を作る

# base16って最高
base16を知っていますか？
これを入れると、誰でも簡単にターミナルとvimの配色を
***コマンド一つで手軽に変更して利用できます。***今までのターミナルの設定から変更したり、
.vimrcにcolorschemeを書いていた煩わしい作業とこれでおさらば出来ます！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/253308/abf5dc55-d6f1-b99c-ed15-2168f13b1042.png)
***solarized-dark***
青い感じが結構クール。vimで人気な配色です。目に優しそう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/253308/2361a113-c7e2-0cb2-ee0e-a6fb568f7b54.png)
***monokai***
molokaiの系譜である黒ベースの配色。僕はこいつが一番お薦めです。


## インストール

### shell

```shell
git clone https://github.com/chriskempson/base16-shell.git ~/.config/base16-shell
```
gitからcloneして.configの下に展開する。

```shell
# Base16 Shell
BASE16_SHELL="$HOME/.config/base16-shell/"
[ -n "$PS1" ] && \
[ -s "$BASE16_SHELL/profile_helper.sh" ] && \
eval "$("$BASE16_SHELL/profile_helper.sh")"
```
bashとzshのどちらかを利用しているなら、.bashrcまたは.zshrcに入力。


```shell
# Base16 Shell
if status --is-interactive
    set BASE16_SHELL "$HOME/.config/base16-shell/"
    source "$BASE16_SHELL/profile_helper.fish"
end
```
fishを使っているなら.config/fish/config.fishに入力。

### vim 

```
Plug 'chriskempson/base16-vim'
```
vim plugを利用しているなら、これを入力して:PlugInstall
そうじゃない人は[ここ](https://github.com/chriskempson/base16-vim)から探してください

```vim
if filereadable(expand("~/.vimrc_background"))
  let base16colorspace=256
  source ~/.vimrc_background
endif
```
あとはこいつを.vimrcに書き込むとシェルの変更と同期してくれます。

## 使い方

```shell
base16-solarized-dark #solarizedのクールな色味に!
base16-monokai #monokaiのリッチな色味に！
```

shellでbase16-solarized-darkやbase16-monokaiと入力するだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/253308/07013fb9-51e5-86e1-6d8b-ddf5ae9c7f47.png)
base16 まで入力してtabを押すと色々候補が出て幸せになれます。
色々使ってみて、ぜひクールなターミナルライフを送ってください！
自分用メモ

Ricty in iterm2: https://qiita.com/iwaseasahi/items/c755ba1c26f94d2536f6

```
[ -z "$PS1" ] && return
which zsh > /dev/null 2>&1 && exec zsh
```

```shell-session
export LANG=ja_JP.UTF-8

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt hist_ignore_dups
setopt hist_ignore_all_dups
setopt share_history

autoload -Uz compinit
compinit -u
if [ -e /usr/local/share/zsh-completions ]; then
  fpath=(/usr/local/share/zsh-completions $fpath)
fi
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
setopt list_packed
zstyle ':completion:*' list-colors ''

setopt correct
setopt no_beep

autoload -Uz vcs_info
setopt prompt_subst
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{magenta}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{yellow}+"
zstyle ':vcs_info:*' formats "%F{cyan}%c%u[%b]%f"
zstyle ':vcs_info:*' actionformats '[%b|%a]'
precmd() { vcs_info }
PROMPT=$'\n%{%B%}%F{red}[%n@%m: %~]\n$%f %{%b%}'
RPROMPT='%D, %* ${vcs_info_msg_0_}'

# alias
export CLICOLOR=1
export LSCOLORS=gxfxcxdxbxegedabagacad
alias ls='ls -G'
alias watch='watch -n 0.2'
```
Vue+ProtocolBuffers+TypeScriptでサーバー側APIとの連携がやりやすくなった。

# 概要

Vueで開発中のアプリにTypeScriptを導入し、サーバー側とのやり取りをJSONではなく、Protocol Buffersにしたところ、
サーバー側APIのインタフェース変更に強くなり、開発が柔軟になった。

# 登場人物の紹介

## Vue

https://jp.vuejs.org/index.html

モダンなJavaScriptフレームワーク。もともとAngular4とかは触ったことが合ったが、それに比べて規約がゆるく柔軟に書きやすい感じはあった。
ただAngularのTypeScriptで書く感じに慣れていると、型がないことによる実行時のエラーが何かモヤっとする。

## TypeScript

AltJS。JavaScriptに型がつけられる、しょうもないミスを減らせて嬉しい。油断するとすぐanyにしてしまう。

## Protocol Buffers

https://developers.google.com/protocol-buffers/

.protoというファイルでインタフェースを定義し、言語に合わせてトランスパイルすることで、
フロントエンド/バックエンドのインタフェースを一つのファイルで定義することができる。



定義内容

```
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
}
```

フロント<->サーバーのデータやり取りで一番多いフォーマットはJSONだと思ってますが、
JSONの難点として、サーバー側のインタフェースの変更があったときに気づきにくいというのがあります。
解決手段として、SwaggerによってAPIを定義していくというのもありますが、アプリ開発時にProtocol Buffersを利用したところ非常に便利だったので、
Webでもやりたいなーということで探したところ、protobuf.jsというのが存在したので利用してみることに。

https://github.com/dcodeIO/ProtoBuf.js/

# Protocol Buffersの組み込み方

* サーバー<->アプリのAPIのインタフェースとして.protoファイルを定義する

```
message User {
  int32 id = 1;
  string name = 2;
}
```

* サーバー用(今回はPHPでした)とフロント用のインタフェースを生成

```
pbjs -t static-module -w commonjs -o compiled.js user.proto
```

* TypeScriptから型定義を扱えるようにするため、.d.tsファイルを生成

```
pbts -o compiled.d.ts compiled.js
```

あとは生成されたjsと.d.tsを組み込むだけ。

# axiosを利用した利用方法

VueのHttpClientと言えばaxiosという感じなのでAxiosからの利用方法。
Protocol Buffersは通信自体はバイナリで行われるので、axiosでResponseを受け取ったあとにdecodeしてやる必要があります。

```ts
axios.get('/user',{
  transformResponse:[function(data: any){
    return User.decode(data) // バイナリであるdataをUser型にdecodeしている
  }]
}).then(user =>{
  console.log(user.name)
})
```

これでUserデータが型のついた状態で扱えるようになります。
サーバー側も同様のprotoファイルから生成された型を通信で利用している限り、繋いだときのインタフェースのミスは起きにくくなります。
protoファイル上でプロパティ名が変更になった際も、.protoファイルを再度transpileすることで、
プロパティが変わった場所はコンパイルエラーになるため、実行時エラーも未然に防ぐことができます。

# Vueで更に便利に利用するためには

VueとTypeScriptは実はあまり相性が良くありません。
というのも、コンパイルエラーはVueのtemplateの中まで見てくれないため、protoで生成された型を直接template内部で利用していた場合は、その部分が実行時まで分からなくなってしまうんですね。

```vue
<template>
<div>
{{user.id}} // ここでプロパティ名を間違えていてもTypeScriptのコンパイラが検知してくれない
</div>
</template>
```

解決策として、Vue側でテンプレートを利用せず、描画関数を利用したtsx記法で書くことができます。
tsxは基本TypeScriptの糖衣構文なので、コンパイルエラーで検知することができます。

```tsx
@Component
export default class UserComponent extends Vue  {
  render() {
    return(<div>{user.id}</div>) // TypeScriptの世界なのでコンパイルが検知する
  }
}
```

# まとめ

* TypeScript + ProtocolBuffersを導入することで、サーバー側のAPI変更の取り込みが容易になる。
* Vue + TypeScriptの場合はTSX記法を利用することで、より型の特性を強力に支えて便利

そんな感じです。
TeraTerm で tmux を使うときのメモ

tmux を使い始めて、チートシートなど便利かなと思ったことのまとめです。

## 試した環境

* CentOS 7.5
* tmux 1.8
* Windows 7
* TeraTerm 4.100

## チートシート

https://linuxacademy.com/blog/linux/tmux-cheat-sheet/
画像は[こちら](https://2rwky424s9rd179jmbzqsca1-wpengine.netdna-ssl.com/wp-content/uploads/2016/08/tmux-3-1.png)

## コマンド履歴を取得するための細工

[tmuxとかの仮想端末で複数の画面間でBashのコマンド履歴を共有すると同じ履歴が何度も記録されてしまう問題を解決する](https://piro.sakura.ne.jp/latest/blosxom/webtech/2018-03-04_history-nodup-with-tmux.htm)

## 分割したウィンドウのひとつを新しいウィンドウで開く

`[Ctrl]-[B]` の後に `!` を入力すると、新しいウィンドウに移動してくれます。

残念ながら、再度同じ分割ウィンドウに戻すコマンドは無いようです。元の状態に戻すように、再分割等をしないといけません ^^;
＃それなら最初から TeraTerm (tmux) 複数起動しておけという気も・・・

## .tmux.conf をいじる

vi 派＆CentOS パッケージから導入のわたしには、下記の情報が参考になりました。

[tmuxが快適、かつ .tmux.conf の設定](https://qiita.com/murachi1208/items/36d7676558d5535b44db)

マウス関連のオプションを入れると確かに便利になるんですが、OS とのクリップボード共有が上手く動きませんね・・・

## クリップボードを OS と共有

と思ったら、TeraTerm 側で追加設定が必要なようです。

[tmuxでコピーした内容をローカルOSのクリップボードに反映（iTerm2 + Teraterm）](http://engineerspirit.com/2017/01/30/post-736/)

[設定] - [その他の設定] - [制御シーケンスタブの選択] - [リモートからのクリップボードアクセス] を `読込/書込` に変更すればよい、と。

ただ、リモートから書き換えられるということは、セキュリティを考慮する必要があるということですね。

TeraTerm 4.100 では [リモートからのクリップボードアクセスを通知する] という設定もありました。クリップボードに書き込みが行われたタイミングで通知がでてきます。これで一応気づける・・・のかな？

マウスで範囲指定してコピペする方法は、なかなか悩ましいですね。

## 参考書籍

* Software Design 2018 10月号
PHP_CodeSnifferで"Tag cannot be grouped with parameter tags in a doc comment"に遭遇した際の対処法

# 概要
php_codesnifferでのエラー情報は妙に検索に出づらい。
まあ自動整形できるからそりゃ無視していい気がするけども、phpcbfで引っかからなかった上に微妙に対処方法がわかりづらいエラーメッセージなので対処方法を検索するも日本語の情報がなかったため備忘としてここに記載する。

# 問題のコード
以下のように関数の説明文をなんとなくで書いてるとタイトルのエラー、"Tag cannot be grouped with parameter tags in a doc comment"に遭遇する。

```php:ng.php
<?php
/**
 * ファイルの説明文。エラーが出ない最小構成ってだけなので無視してOK。
 *
 * PHP Version N
 *
 * @category Example
 * @package  Qiita
 * @author   Hayakuchi0 <Hayakuchi0@example.com>
 * @license  MIT Lisence
 * @link     https://qiita.com/Hayakuchi0
 */
/**
 * 関数の説明文。ここが問題。
 *
 * 関数つくったよ
 * 複数行の説明文をかいてるよ
 *
 * @param  string $fuga 引数の説明
 * @param  string $piyo 特に意味のある引数ではない
 * @return int 問題のエラーメッセージが出る行
 */
function hoge($fuga, $piyo)
{
    return 1;
}
?>

```

# 原因と対処法
@paramタグを書いたら、ちゃんと下に一行あけないと怒られるので、ちゃんとあけましょう。


```php:ok.php
<?php
/**
 * ファイルの説明文。エラーが出ない最小構成ってだけなので無視してOK。
 *
 * PHP Version N
 *
 * @category Example
 * @package  Qiita
 * @author   Hayakuchi0 <Hayakuchi0@example.com>
 * @license  MIT Lisence
 * @link     https://qiita.com/Hayakuchi0
 */
/**
 * 関数の説明文。ここが問題。
 *
 * 関数つくったよ
 * 複数行の説明文をかいてるよ
 *
 * @param string $fuga 引数の説明
 * @param string $piyo 特に意味のある引数ではない
 * 
 * @return int 問題のエラーメッセージがなくなる
 */
function hoge($fuga, $piyo)
{
    return 1;
}
?>

```

# 参考資料
https://stackoverflow.com/questions/32348487/what-is-the-error-generated-by-phpcodesniffer-tag-cannot-be-grouped-with-parame
Chocolateyを使ったVisual Studio Codeのインストール

# 概要
windowsでパッケージ管理ツールを探していたところchocolateyの評判が良さそうだったので試しに使ってみたいと思い、Visual Studio Codeをインストールしてみました。Visual Studio Codeをインストールした理由はjavascriptに興味を持ったためです。
あくまで備忘録的に書こうと思うのであしからず。

参考にしたページ
https://qiita.com/rkunihiro/items/4eab4d3e90697f064809
https://cartman0.hatenablog.com/entry/2015/10/09/211022#Chocolatey

# インストール
早速インストールしてみる。

- パッケージの検索

```
choco list visualstudiocode
```
- パッケージのインストール

```
choco install VisualStudioCode -y
```

# 感想
無事インストール完了。ただ、遊び感覚なのですぐに飽きちゃうかも。。。


# 補足(chocolateyのインストール)
公式サイトにコマンドが書いているためそれをコピペすればchocolateyのインストール自体は完了。今回はPowerShellでインストールを行ったが、コマンドプロンプトでインストールする場合は下のコマンドでできるらしい。

chocolateyの公式サイト
https://chocolatey.org/install


```
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```
以下がコマンドプロンプト用のコマンド

```
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```

どんなパッケージがchocolateyでインストールできるかはここを参照
https://chocolatey.org/packages
Active Recordのhas_and_belongs_to_manyとhas_many :throughについてもくもく考える会その１

### はじめに
こんばんは。
金曜日の夜ですね。明日が休みだと思うと朝起きなくていいからでしょうか。心なしか色々捗る気がします。
でもそろそろ眠たいので1日いちQiitaを残して夢の国に旅立とうと思います。

### この記事で書くこと
Active Recordの[アソシエーション(公式railsguidesへのリンクを貼っておきます)](https://railsguides.jp/association_basics.html)の
`has_and_belongs_to_many` の実装コードを読んでみて気づいたことをつらつらと書く。

### 背景
多対多の関連付けを表現するとき `has_and_belongs_to_many` か `has_many :through` どちらを選択しますかという問いに対し自分は1年前Railsを習い始めた頃チームの人に教わりながら `has_and_belongs_to_many` を選択し実装しました。
ですから、実体の仲介テーブルを持ち、そこに2つの多対多の関係をもつモデルのidをセットで保存して関連を表現していたんですね。
でも、今直近で多対多の関連をもつことになりそうなモデルがあり、 `has_and_belongs_to_many` 使ってるのなぜなの？ `has_many :through` を使わない理由があるってこと？とPRで質問された時に自分は明確に理由を応えることができず、それがきっかけで、この２つの方法についてしっかり考えようと思いました。
※世の中(google先生の用意してる世界)で `has_and_belongs_many` やめよう！　という意見が多いのも目にしました。
が、ここでは特に世の皆さんがおっしゃってるような内容をそう思うということを書くのではなく、あくまでコードをよんで自分が理解できたこと、できないこと、その上での２つの違いについてまとめていけたらいいなと思っています。

### :eyes: よし、よむ。
https://github.com/rails/rails/blob/0af3dd4438047d8c5783dff1cfcf9c696b44bdff/activerecord/lib/active_record/associations.rb#L1679

### :eyes: このメソッドに関して読んだ結果という感想
- モデル名いつもどっちが複数だったっけとmigrateするとき思ってたいたけれどここをよんで理解。
https://github.com/rails/rails/blob/b13a5cb83ea00d6a3d71320fd276ca21049c2544/activerecord/lib/active_record/associations/builder/has_and_belongs_to_many.rb#L65
- 中間テーブル名についても同じく。
https://github.com/rails/rails/blob/b13a5cb83ea00d6a3d71320fd276ca21049c2544/activerecord/lib/active_record/associations/builder/has_and_belongs_to_many.rb#L95
- 内部的には `has_many` を使用している。
https://github.com/rails/rails/blob/0af3dd4438047d8c5783dff1cfcf9c696b44bdff/activerecord/lib/active_record/associations.rb#L1720
- leftとrightそれぞれで 他方へ `belongs_to`している
https://github.com/rails/rails/blob/b13a5cb83ea00d6a3d71320fd276ca21049c2544/activerecord/lib/active_record/associations/builder/has_and_belongs_to_many.rb#L59

- 内部的にClassをnewしている。そのnewされるクラスが関連を表現する中間モデル。
https://github.com/rails/rails/blob/b13a5cb83ea00d6a3d71320fd276ca21049c2544/activerecord/lib/active_record/associations/builder/has_and_belongs_to_many.rb#L14
- macroがどこで定義されてるのか一瞬わからなかった。でも インスタンスメソッドですぐraiseしていたので、継承してる先で定義してるんだなと思ってもどったら `HasMany` にて発見できてよかった。
https://github.com/rails/rails/blob/b2eb1d1c55a59fee1e6c4cba7030d8ceb524267c/activerecord/lib/active_record/associations/builder/has_many.rb#L5
- この一行は何だか凄くすっきりしていていいなぁと思った。自分もここ使ってみたらいいかもとおもえた時に使っていきたい。
https://github.com/rails/rails/blob/b13a5cb83ea00d6a3d71320fd276ca21049c2544/activerecord/lib/active_record/reflection.rb#L18 

- この一行何をやってるの？ HasManyの関連をするためにreflectionをcreateするためにここでやる必要があるの？わからない。:thinking: :sweat_drops: 
https://github.com/rails/rails/blob/b13a5cb83ea00d6a3d71320fd276ca21049c2544/activerecord/lib/active_record/associations/builder/has_and_belongs_to_many.rb#L69

### 謎が残った。
今日は `has_and_belongs_to_many` について駆け足でしかできませんでした。
「その１」とタイトルをつけた以上、 `has_many :through` についてのコードも明日読みたいと思います。図とかかいて整理しようかな。。
では今週も平日お疲れ様でした。
おやすみなさい。良い夜を。
Happy coding! :sleeping: :waxing_gibbous_moon:
「プログラミング言語」って何？

# 1.コンピュータに指示する言葉
コンピュータに動作を指示するにはどう動いてほしいかを順に命令する必要があります。その**命令を出すのに使われるのが「プログラミング言語」**であり、**プログラミング言語で示された命令の列を「プログラム」**といいます。
例：Ruby、PHP、C言語、Swift、C++、C#、Java、JavaScript、SQL等

#2.コンピュータは数値しか理解していない！？
上記で示したプログラミング言語は英単語等を使いプログラムを書きます。
しかし**コンピュータは本来「数値」しか理解できません。（より正確にはメモリに流れる電圧のあるなしを数値の０と１で表現している。）**その数値の並びで表現されたプログラミング言語のことを**「機械語」**といいます。
人がコンピュータに何かさせるには機械語で語りかける必要がありました。ですが人が機械語を理解するのはとても手間がかかり、コンピュータに数値をプログラムしていくのにも途方もない時間が必要でした。そのためより簡単にかつ効率的にプログラムを書く必要性がありました。

#3.高水準言語の登場
機械語に代わりより効率的にプログラムを書くために登場したのが高水準言語です。（1の例を参照）
これらの言語はそれぞれの文法にのっとり書かれたプログラムを翻訳プログラムにかけ、機械語に翻訳しなおすことでコンピュータを動かしています。
この人間よりのプログラミン言語を高水準言語といい、コンピュータに近い言語を低水準言語といいます。
質問する技術


## 問題解決をするのがエンジニア
エンジニアの仕事の中で質問をする機会は多いです。
- ビジネスサイドとの問題のすり合わせ
- ヒアリング
- 技術でつまづいた時
- 将来やキャリアパス

質問すること、そして問題を解決するのがエンジニアの仕事です。
新卒のころからこの質問ということにとても悩まされたので、この機会に質問の精度をあげる
tipsをご紹介できればと思います。

## 質問するときに気をつけたいアンチパターン
やってしまいがちなアンチパターンから良い質問とは何かを定義します。

### アンチパターンから学ぶ良い質問
『なんかおもったようにいかないんですが、どうしたらいいですか？』
ぼくは一番初めにこんな質問をしていました。
はっきりって考えてないの丸見え、答えをほしがるだけの最低な質問です。

ではこの質問に赤をいれながら何がいけないのかをみていきます。
#### 『なんかおもったようにいかない』
まずはこれです。
どういう挙動が実現されば問題が解消された状態なのかわかりません。
これでは質問を受けた側はいろいろ背景や何を目的にしているかを逆に質問したり、
考えながら質問に答えないといけないのでとても時間がかかってしまいます。

#### 『どうしたらいいですか？』
どうしたらいいですか？というのは悪くはないんですが、質問に答える側は
答えをおしえるのか、それとも答えにたどり着く方法をおしえればいいのかかんがえないといけません。
単に答えをおしえてもいいんですが、それをしていてはいつまでたっても質問者の質問レベルや問題解決レベルは向上しません。

こういう時は何をききたいのかをはっきりさせないといけないです。
具体的な解決策なのか。
検索方法なのか。
おなじ局面なら先輩はどう考えて動くのか。
など何を聞きたいかをはっきりさせることは重要です。

#### 断片的な情報しか伝わらない
上記の質問の仕方では断片的な情報しか伝わりません。
なんか今んとこうまくいってないということしかわからないです。
これが『〇〇と検索したのですが、解決に繋がる結果が見つかりません。どんなワードで検索したらいいですか？』
だとすれば検索段階でうまく言っていないこと、実際に検索する段階にはいることがわかります。

このように背景と過程を言語化しない質問は混乱と無駄な時間をうむ原因です。

### 良い質問とは何か
簡単にアンチパターンを見ながらよくないポイントをあげてきました。
簡単ですが、いい質問を構成する要素をまとめます。

#### ゴール
何を目的として実装やテストをしているのか、具体的に端的にまとめましょう。
ここがぶれていると問題は問題ではなくなることがあります。

#### 現状
いま起きている現象について端的にまとめましょう。
エラーメッセージが出ている。いとした出力がないなどです。

#### 実際に起きている不都合なこと
現状の何が不都合なのか説明できるようにしましょう。
ゴールとのギャップを正確に伝えられることは良い質問の第一歩です。

#### 何をためしたか
実際になにか解決の手段を投じているならそれを伝えましょう。
もしかしたら解決策の方向性がまちがっているかもしれません。

検索段階でわからないなら実際に検索した言葉を伝えてみましょう。

#### 質問にどう答えてほしいのか
何を答えとして望んでいるかを伝えましょう。
解決策を一緒に考えて欲しいのか、それとも方向性が間違っていないかみてほしいのか
答えをください。というのは最終手段ですが、どうしても解決できない時はそれも手段の一つです。

## まとめ
ここまでつらつらと書いてきたことをまとめます。
よい質問のための5つのポイント
- 成し遂げたいことの把握
- 問題の言語化
- 原因の分析
- 解決手法の実践と結果
- どう質問に答えて欲しいのか

この5つを心がけることで質問の力がとてもあがるでしょう。
先輩エンジニアの時間を奪わず、ビジネスサイドとのヒアリングもうまくいく。
息を吸うようにこの5つを実践して問題解決をしていきましょう！

## おまけ
### 一人でできる質問力のあげ方
ラバーダッキングという物知っているでしょうか？
これはゴム製のアヒルに独り言をいうだけです。心の中呟くだけでもいい。
（アヒルに難しい顔で向かい合う変な人だと思われても責任はとれません。）

何かに向かって話しかけることで、今抱える自分の問題を整理し客観的な視点から
問題の全体像を把握し解決まで自分で持っていきやすくするという手法です。

これは一人でできるのでとてもおすすめです。
ちなみにぼくの机にはネズミのぬいぐるみがいてラバーダッキングのお手伝いをしてくれます。
それでは質問力をあげてよりよい開発ライフを。
CircleCIについて知らなかったことまとめ

# 並列実行
- パラレルジョブ  
  jobに対して`parallelism`を設定することで**ジョブの中**の処理を複数のコンテナに分散して並列実行できる。例えば、テストファイルが複数ある場合に分割して並列実行できる。
- 複数ジョブの並列実行  
  独立したジョブは複数のコンテナで並列実行できる。例えば、lintとtestとか。

# 便利そうなキー
- commands  
  job間で共有できる関数のようなもの。引数とそれに基づいて実際に実行されるステップを書く。
- executors  
  - job間で共有できる実行環境を指定できる。使用するdocker imageやワーキングディレクトリなどの設定に対して名前をつけることで、jobでその名前を参照し実行環境を指定することができる。
  
# Jobの実行環境
  実行環境には複数のイメージを使用できる。その場合は一個目のイメージでstepsが実行される。
  使い方の例として、アプリ実行用のイメージを１つ目に、接続先DBのイメージを2つ目にしてDB込みのテストができるようになる。
[5.6/5.7] Eloquent リレーションのまとめ

[Laravelのディレクトリ構造について学ぶ](https://qiita.com/shosho/items/93cbff79376c41c3a30b) に引き続いて、ドキュメント読んでみたシリーズ。

今回はEloquentのリレーション。
いっぺんに読むのも書くのもしんどいので、章ごとに分けてちびちび更新していきます。

### 注意
- 記事はタイトル含め全て完全和訳ではなく、自分なりに解釈してまとめた内容です。
- 書いた時期によって5.6だったり5.7だったりします。（ちょっとずつ5.7に更新していく予定）

## 公式ドキュメント
`Eloquent: Relationships`
https://laravel.com/docs/5.6/eloquent-relationships
https://laravel.com/docs/5.7/eloquent-relationships

## まとめ記事

### Eloquentリレーションの定義
作成中

### Eloquent リレーションのクエリまとめ
[[Laravel 5.7] Eloquent リレーションのクエリまとめ](https://qiita.com/shosho/items/fe88b79c243f4a832f04)

### ELoquent リレーションの Eager Loading について
[[Laravel] Eloquent リレーションと Eager Loading](https://qiita.com/shosho/items/abf6423283f761703d01)

### Eloquent リレーションモデルの Insert と Update

- [[Laravel5.7] Eloquent リレーションで新たに追加された push メソド](https://qiita.com/shosho/items/18e78985a702573e6444)
- [[Laravel5.7] Eloquent リレーションにおける saveメソド と createメソド の特徴](https://qiita.com/shosho/items/837cc93ba1518043e185)
- [Eloquent と MassAssignment]（作成中）

### Touching Parent Timestamps についてのまとめ
[[Laravel 5.7] Eloquent リレーションテーブル間で timestamps を連携する方法] (https://qiita.com/shosho/items/9f4c3385b155ff3c2f60)
python3でMeCabがインストールできない。エラーegg_info

#概要
開発中のエロサイト[えろろぼ](http://eroiro.me/)を言語処理させたい思いつく。(手前味噌ながら裏側で色々走っている)
Pythonに形態素解析器のMeCabと自然言語処理のライブラリのgensimの利用を試みる

#作業
環境はUbuntu,Debian系。CentOSとかでもapt-getをyumに変えるだけでいけるはず。

MeCabとMecabのライブラリ、基本辞書のツールをセットアップ

```
apt-get install mecab libmecab-dev mecab-ipadic-utf8
apt-get install git make curl xz-utils file sudo
```
mecab-ipadic-NEologdeをインストール

```
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n -p /var/lib/mecab/dic/mecab-ipadic-neologd
```
インストールして良いか尋ねられるので「yes」とうつとインストールが完了

Pythonで使えるように。

```
pip3 install gensim
```

mecab-python3のインストール

```
pip3 install mecab-python3
```
ここでエラーが発生

```
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/db/zj9vr1xx11vdn8yzb3bvp6xw0000gn/T/pip-install-31zuvfh1/mecab-python3/
```

Setup.pyを書き換えたり、pipをアップデートしたりしたが効果なし。
英語でも色々格闘したけど効果なし。

mecab-pythonのパッケージを直接インストールしてみた。
ソースをダウンロード→解答→インストール
※人によったらpython3のコマンドの場合も。バージョンを確認してみて下さい。

```
wget https://files.pythonhosted.org/packages/1e/50/86ac8277b89c256509c934656be69ff7aef0ce795cac185b0222f44b8196/mecab-python3-0.8.2.tar.gz
tar zxfv mecab-python3-0.8.2.tar.gz
cd mecab-python3-0.8.2
python setup.py build
sudo python setup.py install
```

これ無事PythonでMecabが使えるようになりましたよっと。
CD 取り込み手順 (身内向け)

1. [パソコン用ドライブソフトウエア/ファームウェアダウンロード](https://pioneer.jp/device/list_wr_dr.html) の **BDR-XD07全機種** より, ドライブユーティリティをダウンロード, インストールする。
1. [Music Center for PC](https://musiccenter.sony.net/ja/) より, Music Center for PC をダウンロード, インストールする。
1. [音楽CDから曲を取り込む](https://musiccenter.sony.net/ja/instruction/inst001.php) の **CDから取り込むときのファイル形式を指定するには** を参照し, フォーマットを FLAC に変更する。
1. (おまけ) [Mp3tag](https://www.mp3tag.de/) で, 取り込んだ曲にジャケットを付与しても OK.
1. (おまけのおまけ) Music Player Daemon に取り込む際は, 文字化けを防ぐため NTFS フォーマットした USB メモリーを利用すること。

どっとはらい。
matplotlibの表示順に関する設定

#grid
gridが最前面にきて、plotに覆いかぶさることがたまにあります。
![grid1.png](https://qiita-image-store.s3.amazonaws.com/0/305461/9081b218-cb75-82e6-1ebf-53f1271f91a7.png)

この場合、axisbelow(True)でgridが最背面に移動します。

```python

##axの場合
ax.set_axisbelow(True)

##rcParamsの場合
plt.rcParams['axes.axisbelow'] = True
```

![grid2.png](https://qiita-image-store.s3.amazonaws.com/0/305461/3eb67d40-e094-c307-cf92-7b4eb4dcad0d.png)

#plotの表示順
plotの表示順はzorderで設定できます。
zorderとは平面上のxy軸に対して、奥行きのz軸に関する設定です。
値を大きくすることでプロットを手前にもってくることができます。

##線のzorderが1, 丸のzorderが2
```python
plt.plot(x, y, 'r', zorder=1, lw=3)
plt.scatter(x, y, s=120, zorder=2)
```
![zorder1.png](https://qiita-image-store.s3.amazonaws.com/0/305461/80ca521e-1e19-82ed-399e-ce5a32d38050.png)

##線のzorderが2, 丸のzorderが1
```python
plt.plot(x, y, 'r', zorder=2, lw=3)
plt.scatter(x, y, s=120, zorder=1)
```
![zorder2.png](https://qiita-image-store.s3.amazonaws.com/0/305461/3890dea6-71e3-8587-accc-7ba7e90cf810.png)

#参考
- [ [grid] Matplotlib：グリッド線を他のグラフ要素の後ろに描画する](https://code-examples.net/ja/q/1a57b7)
- [Zorder Demo](https://matplotlib.org/gallery/misc/zorder_demo.html)
ngrokを使ってローカルで実行されているAzure Functionsに外部（インターネット側）からアクセスする

#はじめに

これはC#の話と思わせつつ、実はAlexaスキルをC#で実装して、TelloをAlexa経由で操作するという目標を達成するための道中なので、これはAlexaスキルの話なのです。

これまでに、以下のことをやってきました。

- Alexaスキルを素直にNode.jsを使ってAWS Lambdaにデプロイする
- AlexaスキルをC#で実装してAWS Lambdaにデプロイする
- AlexaスキルをNode.jsを使ってTelloを操作する

そうなれば次は当然これです。

- AlexaスキルをC#で実装してTelloを操作する

Node.jsを使う場合はPC上でスキルの処理部分を動かし、ngrokでインターネット側からアクセスできるようにし、Alexaからのリクエストを受け取って、レスポンスを返すという流れでした。
こんな感じで。

```
> node index.js
>
> ngrok http 3000
```


これでPC上で動作するプログラムをスキルのエンドポイントにできました。

ではC#で同じことをやるにはどうしたらよいでしょうか。

C#でサーバーレスな仕組みといえば`Azure Functions`です。

Azure Functionsのプロジェクトでスキルのエンドポイントを作成し、それをngrokで外部とつなげる、という流れです。



今回はまずはAzure Functionsをngrokを使ってインターネット側からアクセスできるようにします。



#Azure Functionsプロジェクトの作成

ファイル→新規作成→プロジェクト

と選択してAzureFunctionsを選択します。
![clipboard_20181102195136.png](https://qiita-image-store.s3.amazonaws.com/0/245438/80661fe5-df18-fd5e-9e8c-d43f4dda983b.png)

プロジェクト名は`TelloControlCSharpSkill`とでもしておきましょう。ゆくゆくはTelloを操作することになるので。


OKボタンを押したら作成完了です。

実行ボタンを押して実行します。

![clipboard_20181102195735.png](https://qiita-image-store.s3.amazonaws.com/0/245438/182d85d9-d466-6892-b936-471c26b173dc.png)


すると以下のようなコンソールが立ち上がり、Azure FunctionsがPC上で動作を開始します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/6b5eb7b0-1023-65e1-39e5-41e45cfa691c.png)

コンソールに表示された情報の中に、このFunctionにアクセスするためのURLがあります。
このURLをブラウザのアドレス欄に入力してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/04ca4674-a116-6895-64d3-01a89d705940.png)

以下のように表示されたら動作しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/8361c4bf-0987-b733-7a2c-28fb4101aa54.png)

しかし、これはローカルアドレスなので、インターネット経由でこのFunctionにはアクセスできません。

そこでngrokの出番です。
このAzure Functionsは動かしっぱなしにしておきます。

#ngrokの実行

ngrokを実行するためには以下の準備をしなければいけません。


- Node.jsのインストール（[こちら](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)）
- ngrokのインストール（[こちら](https://qiita.com/FJHoshi/items/9a379a987ea96eefa5da)）



Node.jsをインストールし、ngrokをインストールしたら、ngrokを使ってインターネット側から動かしっぱなしになっているFunctionにアクセスできるようにします。

```
> ngrok http 7071 -host-header="localhost:7071"
```

とすると、グローバルなURLとローカルアドレス（ポート番号7071）が結び付けられ、インターネット側からアクセスできるようになります。
このURLはngrokを起動するたびにランダムな文字列が割り当てられます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/d17c3222-19f9-03d3-5d9d-38ba45def0f8.png)

ではURL`https://4743e56d.ngrok.io/api/Function1`をブラウザのアドレス欄に入力してみましょう。

やはり先程と同じページが表示されれば正しく動作していることになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/5d564ac7-89d9-1325-df83-78c24303ebb9.png)


これでインターネット側からこのFunctionにアクセスできるようになりました。

ということはPC上でAlexaスキルのエンドポイントを動作させて、Alexaからのリクエストを受け取ってスキルの処理を行うことができるようになったということです。

次はこのFunctionでAlexaからのリクエストを受け取ってレスポンスを返す方法について説明します。
Windows10でsshする

# Windows10でsshする 

- Windows10でsshするのちょっと難しすぎない？
- 備忘録として手順を書いておく
- コマンドはPowershellコマンド

## サーバとクライアントの構成

- サーバOS
  - Windows10 Home
- クライアントOS
  - Windows10 Home

## 1. sshを入れる

- sshがデフォルトで入っている場合
  - 何もしなくてよいがsshサーバ機能はデフォルトでは有効になっていないはず
  - Windowsでoptionで検索
      - オプション機能を追加する
      - 機能の追加
      - OpenSSHサーバを追加

- sshがデフォルトで入っていない場合
  - こっちはあんまり今回想定してないよ
  - 以下のURLからダウンロードするらしいことは書いておく
  - `https://github.com/PowerShell/Win32-OpenSSH/releases`

- サーバとクライアント両方にいれる

## 2. ポート開放

- 管理者権限でPowerShell起動
    - これ実行
      - `netsh advfirewall firewall add rule name="sshd" dir=in action=allow protocol=TCP localport=22`
- サーバ~~とクライアント両方~~でやる
  - クライアントで開放する必要はありませんでした。ebal5さんありがとうございます。

## 3. sshdを起動

- サーバ側設定
  - サービスに登録
      - `sshd install`
  - サービス起動
      - `Start-Service sshd`
  - 自動起動設定
      - `Set-Service sshd -StartupType Automatic`  
- この辺で一回再起動した方が良いかも

## 4. 接続

- ssh ユーザ名@サーバIPもしくはホスト名
  - ホスト名はhostsファイルを編集してくれ
      - `C:\Windows\System32\drivers\etc\hosts`
  - パスワード設定してないのにパスワード聞かれて詰む場合
      - パスワード設定しておけ
  - ユーザ名がわからないんだけど
      - サーバで`whoami`コマンド実行
          - ~~\の前がユーザ名だから~~
          - →\の後がユーザ名でした。ozraruさんご指摘ありがとうございます。
- 接続がタイムアウトする場合
  - ファイアウォールが原因か、サーバ側でポート開放できてない
  - ウィルスセキュリティソフトが原因かも
  - それ以外ならお手上げ
- 接続できることを確認

## 5. 鍵認証方式

- いちいちパスワード入力してたらめんどくさい
- スクリプトで自動的にログインして何かしたいときに困る
- なのでサーバでパスワード聞くのやめる
  - `C:\Windows\System32\OpenSSH`の中に`sshd_config`を作る
  - `sshd_config_default`をコピーしてつくる
  - `PubkeyAuthentication yes`のコメントを外せ
  - sshdを再起動
      - `Restart-Service sshd`
- クライアントでキーを作る
  - 鍵の名前はmykeyという名前にしようか
  - `ssh-keygen -t rsa -f mykey`
- クライアントのキーはどこでもいいけど.ssh/においておこう
  - `mv mykey ~/.ssh/mykey`
- 公開鍵をサーバに配置
  - `scp mykey.pub ユーザ名@ホスト名もしくはip:`
  - これでサーバの~にmykey.pubが置かれているはず
- サーバの公開鍵の名前を変更
  - すでに`~/.ssh/authorized_keys`がある場合
      - `cat mykey.pub >> ~/.ssh/authorized_keys`
  - ない場合
      - `mv mykey.pub ~/.ssh/authorized_keys`
- ログインしよう
  - `ssh -i 秘密鍵のパス  ユーザ名@ホスト名もしくはip`
  - パスワード聞かれなければOK

## 感想

一番時間がかかったのは`sshd_config`の置き場所。
ここに置くってどこに書いてあるんだろ。
Joomla!でデータベース関連のエラーが出ちゃう件について

Joomlaをアップデートしたら、データベースでエラーが。

```
500 Unknown column 'a.note' in 'field list'
```
いかんせん。

#解決策
ログイン後、エクステンション→管理->データベース
エラーがあるときは、画面右の方に赤いブロックでなんか書いてあります。
何かあったら、「修正」。
勝手にカラムを追加してくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/33f99635-bf04-4c7d-5f5f-c0e6b741e4d0.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/0975d2fb-b2b1-c689-6da0-d157286cc851.png)

#レファレンス
https://forum.joomla.fr/forum/joomla-3-x/administration/gestion-des-articles-ad/1990353-erreur-500-unknown-column-a-note-in-field-list-en-listant-contenu-articles
pythonプログラム実行後にEC2インスタンスを停止するためのAPI

#背景
GPUのあるEC2上でdeep-learningしたい、、、
でもGPUのインスタンスは高い、、、
学習完了後すぐにインスタンスを"停止"しないと無駄に課金されて高額請求がきそう、、、
でも学習スタートしたら、終わるまで放っておきたい、、、

AWS-CLIというのでEC2を起動させたり、停止したり、実行状態を監視したりできるらしい。

#手順
1.AWS-CLIをインストール・AWSアカウント情報を紐づけ・セットアップ
  以下の記事を参考にしました。
　参考記事：AWS CLIのインストールから初期設定のメモ"(https://qiita.com/n0bisuke/items/1ea245318283fa118f4a)

2.あとは↓のコードを実行するだけ。

```python:stop_ec2.py
import subprocess

cmd_stop = ['aws', 'ec2', 'stop-instances', '--instance-ids', '<instance_id>'] 
try:
  res = subprocess.call(cmd_stop)
except:
  print("Error.")
```

参考記事：
・python上でunixコマンドを実行する(https://qiita.com/tdrk/items/9b23ad6a58ac4032bb3b)
・AWS CLIを使ってAmazon EC2を起動・停止するワンライナーまとめ(https://dev.classmethod.jp/cloud/aws/awscli-tips-ec2-start-stop/)
AWSサポートに手紙を書いている途中でコンソールのセッションが切れた！

## うおおおおおおおおおおいい

結構な長文を書いたんですけど！？

![aaaaaaaaa.png](https://qiita-image-store.s3.amazonaws.com/0/122084/480e3c75-c418-5de0-b254-b366065be32f.png)

## 慌てるな諦めるな

おもむろにDevToolを開きます。
consoleに `document.querySelector('textarea').value` と入力します。

![スクリーンショット 2018-11-02 23.25.00.png](https://qiita-image-store.s3.amazonaws.com/0/122084/2841af81-04b9-e750-fb87-a3845d7d267f.png)

コピーしてからログインし直しましょう。
合成数列の和 (Crystal)


|合成数列の和|https://qiita.com/advent-calendar/2018/composite-number|
|:--|:--|
|Python(/Ruby)|https://qiita.com/cielavenir/items/dcbd839b0c66af1bc971|
|Crystal|https://qiita.com/cielavenir/items/1a0dd1a94aca9935f5aa|
|Kuin|https://qiita.com/cielavenir/items/47fd18fc68055d990599|
|Swift|https://qiita.com/cielavenir/items/6cde3b20866c842dc9e2|
|Kotlin|https://qiita.com/cielavenir/items/f58eaa30f90781229a6d|
|Pascal|https://qiita.com/cielavenir/items/35c2fc54ca16b620c9c7|

Ruby版の移植ですね

```crystal:composite.cr
def isqrt(n)
	return 0 if n<=0
	return 1 if n<4 # 1
	x,y=0,n
	while x!=y&&x+1!=y
		x,y=y,(n/y+y)/2
	end
	x
end
p (4..1/0.0).each.select{|i|(2..isqrt(i)).any?{|j|i%j<1}}.first(gets.not_nil!.to_i).sum
```
「値あり」バリデーションの微妙な違い

アプリケーションには色々なレベルでバリデーションをかけることができますが、うっかりしていると微妙な差異で引っかかることがあります。

## 「値がある」という制約

「値がある」ことをRails環境で宣言するバリデーションとして、主なものが3つ考えられます。

* データベースで`NOT NULL`制約を入れる
* Railsのモデルで`validates :column, presence: true`を宣言する
* フォームを`<input required>`にする

ただ、これらはすべて意味合いだけでなく、**何で制約されるか**も違ってきます。

### DBでの`NOT NULL`制約

データベースに`NULL`値を入れられないようにする、という制約です。

* メリット…データベースにかけてしまえば、（この制約自体をいじるような）よほど特殊な操作をしない限り、`NULL`値が入る心配はない
* 注意点…`NULL`以外の空文字列[^1]や、スペースだけの文字列は投入可能です。



### Railsでの`presence`制約

Railsレベルで`presence: true`を使うと、`present?`な値（数値は何でもtrue、文字列は空白文字以外が1文字でもあればtrue）しか通さなくなります。

* メリット…フォーム生成のときに読み取って`required`を入れてくれる（こともある）
* 注意点…直接DBに投げるような場合は無力

### フォームへの`required`

フォームの`<input>`などに`required`属性をつけると、空文字列のままではフォームが送信できなくなります。

* メリット…送信前に指摘できる（状況に合わせてCSSを変更することもできる）ので、ユーザビリティは高い
* 注意点…空白文字だけの文字列は通る、ブラウザ内で実行するものなのでセキュリティ的にはほぼ無力

## 値ごとの挙動の違い

ということで、値ごとにそれぞれのレベルでどうなるか、という形でまとめ直します。

* `NULL`…`required`では拒否（数値系の場合）あるいは**入力不能**（文字列の場合）[^2]、`presence`や`NOT NULL`でも拒否
* 空文字列…`required`や`presence`では拒否、`NOT NULL`は通る
* 空白文字だけの文字列…`required`では通る、`presence`では拒否、`NOT NULL`は通る

ということで、以下のようなことが考えられます。

* DBの`NOT NULL`だけで運用していた場合、空文字列がDBに登録される[^3]
* `required`と`presence`を組み合わせた場合、空白だけの文字列がRailsレベルのバリデーションに当たるので、そういうのが入力されたときのユーザー体験を損ねる[^4]

こういう「微妙な値域の違い」は、いろんな場面で出うるものなので、要注意かもしれません。


[^1]: Oracle Databaseは空文字列を`NULL`と同じ扱いをするため、事情が違ってきます。
[^2]: 文字列の列で`NULL`を活用したい場合、Railsレベルのライフサイクルコールバックで変換を入れるなど特殊な手段が必要となります。
[^3]: DBレベルのバリデーションだけだと、引っかかった場合にデータベースエラーとなってハンドリングが難しいので、あまり実用的ではないです。
[^4]: もっとも、「空白だけの文字列」が正当な入力となりうる場面も、そう多くない気はします。
Freescale関連置き場

##Freescale(NXP)のARM(QorIQ)でU-Boot起動したい
FreescaleだったのがNXPに変わりいろいろ検索できなくなって面倒のため、知識とリンク集として残す。
linux SDKもマニュアルも何か微妙に古いので混乱しやすい。

###SDK
配布されているのはYoctoを使っているので非常に遅い。VirtualBoxでは24時間かかることを覚悟すべきである。
とてもじゃないが使えないし、linuxを使わないなら要らない。
U-Bootを単体でダウンロードして、U-Bootから好きなOSのカーネルを直接起動しよう。

[Linux SDK for QorIQ](https://www.nxp.com/jp/products/processors-and-microcontrollers/power-architecture-processors/qoriq-platforms/qonverge-platform/linux-sdk-for-qoriq-processors:SDKLINUX)　無駄にでかくて、どれをダウンロードすればいいか分かりにくい。マニュアルだけ参考用に。
[Das U-Boot](https://www.denx.de/wiki/U-Boot/SourceCode)　これが重要

##U-Boot
SDKのマニュアルのメモリマップにいろいろ書かれているが、最新だと一致していない。
U-Bootは進化している。

###SPL(Second Program Loader)
メモリマップにRCW+PBIが先頭にあって、別の領域にU-Boot本体があるように書いてあるが、実際は、u-boot-spl-pbl.binだけで起動できる。
PBLがRCWを読んだ後、PBIでSPLをSRAMにロードし、そちらに実行を移す。
SPLがU-bootを起動する。
これ1個書き込むだけで、RCWもPBIもU-bootも書き込み完了である。
真面目にメモリマップを見て、分離したファイルでやる意味はない。
ただし、SPLに対応していない場合は、makeしてもこのファイルは作成されない。
同じチップでも、起動する媒体(SDカード、MMC、FLASH)によってSPLが無いものがある。

| 順番 |       名称| 説明|
|:-----------------:|:------------------:|:---:|
|１|RCW|512ビットのコンフィグ|
|２|PBI|SPLをSRAMに書くPBI|
|３|U-Boot|U-Boot本体|

###RCW(Reset Configuration Word)を得るために
U-Bootで作って、spl-pblが付かないファイルしか出来ない場合、RCWのバイナリが必要である。(.pblがあれば、それはおそらくRCW+PBIのバイナリなので使用できる)
例によって、SDKのマニュアルには、Yoctoを使った全体buildしか書かれていない。
U-Bootのマニュアルも不十分であり、mkimageコマンドのhelpもずっと更新されていないので、正しい作成方法が分からない。

数百バイトのファイルのビルドに何時間も待てるわけもない。
有料の開発環境もない人間にはRCWを作ることはできないのか？

そんなことはない。SDKのRCWのソースだけを入手すればよい。
しかし、どこにもリンクが載ってない。3GBのでかいだけのisoイメージなんかゴミ箱に捨て以下からcloneか圧縮ファイルをDLしよう。
[sdk/rcw.git](http://git.freescale.com/git/cgit.cgi/ppc/sdk/rcw.git)
fsl-sdk-v2.0-1701.zip、fsl-sdk-v2.0-1701.tar.gz、fsl-sdk-v2.0-1701.tar.bz2あたりを持ってきて、解凍して、欲しいボードのフォルダでmakeすればよい。
RCWやPBIを変更も容易である。
何時間も掛かるYoctoなんて要らない。
コンパイル済みカーネルをどこかから持ってきた方が早い。

あとはRCWを各媒体で指定された領域に書き、PBIで指定したジャンプ先アドレスにu-bootイメージを書けばいい。今ならu-boot-dtb.bin(ファイル名はU-Bootバージョンによる)だろう。どのファイルが必要か各メーカーごとのREADMEに詳しく書いてあるだろう。
シェルのif文で標準入力を条件式の値として使う

シェルでif文は`if [ 条件式 ]; then ...`のような感じで書くことが多いですが、`[`は実は`test`コマンドへのエイリアスでしかなく、`"${var}" = 'hoge'`のような比較を行っているのは、実は`test`コマンドです。
`if`は`test`コマンドの終了ステータスが0かそれ以外かしか見ていません。
そのため、`if`のあとに置くコマンドは、`test`以外のなんでもokです。

ためしに、`grep`を`test`コマンドのかわりに使って、標準入力に渡された文章が質問かそうでないかを判断するスクリプトを書いてみます。

```sh:ezoe.sh
#!/bin/sh
# ^ 行頭
# ..* 任意の1文字以上
# [？?]* 全角のはてなと半角のはてな0個以上
# $ 行末
if grep '^..*ですか[？?]*$' > /dev/null; then
  echo "質問である"
else
  echo "質問ではない"
fi
```

```shell-session:実行結果（入力文が質問の場合）
$ echo 'ご注文はうさぎですか？' | ./ezoe.sh
質問である
$ echo 'ご注文はうさぎですか?' | ./ezoe.sh 
質問である
$ echo 'ご注文はうさぎですか' | ./ezoe.sh
質問である
```

```shell-session:実行結果（入力文が質問でない場合）
$ echo 'ご注文はうさぎです' | ./ezoe.sh
質問ではない
```

bashのPOSIX互換モードとdashで試しました。
PageSpeed Insightsから「最適化の提案」をPHPでCSV出力

Googleが提供するWebパフォーマンス計測ツールとしてわりとポピュラーな「[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/)」。
ブラウザ版ではURLを打ち込むだけでそのページが最適化されているか、最適化されていなければどうすればいいかを提案してくれるので非常にありがたい。

## 問題点
もちろんブラウザ版でも十分使いやすいとは思うのだが、個人的には以下の２点が物足りないかなと感じている。

- 複数URLを解析したい場合、何回もURLを打ち込まなければいけない
- 以下のように、最適化についての提案をいくつかしてくれるもののどれが優先度の高い提案なのかがわからない

![PageSpeed_Insights.png](https://qiita-image-store.s3.amazonaws.com/0/307106/cc1d6005-864e-8a07-7491-cea970fb8915.png)

そこで今回は、PHPとPageSpeed InsightsのAPIを組み合わせることでこれらを解消していきたいと思う。

## 事前準備

[Google Cloud Platform](https://console.cloud.google.com/)から今回の実装で使用するためのAPIキーを取得しておくこと。詳しくは[こちら](https://developers.google.com/speed/docs/insights/v4/getting-started)を参照。

## 実装方法

以下のURLにGETパラメータを付けてアクセスすれば、JSON形式で結果が出力される。

```
https://www.googleapis.com/pagespeedonline/v1/runPagespeed
```

使用する主なパラメータは以下の通り。

|パラメータ|必須|説明|
|----|----|----|
|key|◯|GCPから取得したAPIキー|
|strategy|◯|desktop（PC）またはmobile（SP）|
|url|◯|計測対象URL|
|locale||言語（今回はja_JPを使用）|

### 実装例
```php
<?php
$psi  = 'https://www.googleapis.com/pagespeedonline/v1/runPagespeed';
// 対象URLリスト
$urls = array(
	array(
		'url'      => 'https://sample.com', // 対象URL
		'strategy' => 'mobile'              // mobile or desktop
	),
	array(
		'url'      => 'https://sample.com',
		'strategy' => 'desktop'
	)
);
$params = array(
	'key'    => 'APIキー',
	'locale' => 'ja_JP'
);

$columns   = array();
// 1行目
$columns[] = array('URL', 'デバイス', '得点', '問題点');
foreach ($urls as $url) {
	$query   = array_merge($params, $url);
	// GETパラメータ付URL
	$api_url = $psi . '?' . http_build_query($query);
	// 結果取得
	$result = array($url['url'], $url['strategy']);
	$json   = @file_get_contents($api_url);
	if($json){
		$data = json_decode($json);
		if($data && $data->responseCode == 200){
			// 得点
			$result[] = $data->score;
			// 内訳
			$problem = '';
			$detail  = $data->formattedResults;
			if ($detail && $detail->ruleResults) {
				foreach ($detail->ruleResults as $topic => $desc) {
					// 最適化しなければいけない場合のみ
					if ($desc->ruleImpact > 0){
						$problem .= "・{$topic}（{$desc->localizedRuleName}）：{$desc->ruleImpact}\n";
					}
				}
			}
			$result[] = $problem;
		}
	}
	// 計測エラー
	if(count($result) < 3) $result = array_merge($result, array(0, '計測エラー'));
	// 行追加
	$columns[] = $result;
}
// CSV出力
$file = fopen('psi_results.csv', 'w');
// excelでの文字化け防止
stream_filter_prepend($file, 'convert.iconv.utf-8/cp932');
if ($file) {
	foreach ($columns as $column) {
		fputcsv($file, $column);
	}
}
fclose($file);
?>
```

## 出力内容
上記を実行すると1行ごとに以下の内容がCSV形式で出力される。

|項目|説明|
|----|----|
|URL|対象URL|
|デバイス|デバイス種別（desktopまたはmobile）|
|得点|最適化の得点|
|問題点|最適化の提案とそのインパクト|

具体的に問題点については以下のような形で出力される。
項目ごとに右に記載されている点数が大きいほどインパクトの大きい施策になっている。

```
・LeverageBrowserCaching（ブラウザのキャッシュを活用する）：2.09375
・MainResourceServerResponseTime（サーバーの応答時間を短縮する）：1.62
・OptimizeImages（画像を最適化する）：4.6913
・SizeTapTargetsAppropriately（タップ ターゲットのサイズを適切に調整する）：0.17570803831737
```

他にもAPIからは詳細な内容（圧縮されていない画像のリストなど）が取得できたりもするので、ぜひとも活用していきたい。
【UiPath】ロボットとの共存① - 広告を非表示にしてくれるロボット

　RPAというと一般的にはロボットが人間の定型作業を"代行"してくれるもの、なのでロボットのPCは人間の使うPCとは別に用意されていて、非定型な作業を行う人間と定型作業を行うロボットが分業体制にあるのが普通だと思います。

　ただそればかりじゃ面白くない。分業じゃなく、一緒に作業したりロボットに支援してもらうような"共存"の形がとれたら面白いと思うのです。共存ロボシリーズ１回目のお題は・・・

# 今回のお題：ロボットに広告を消させる
こういう広告見たことありません？企業／個人の問わずブログ広告で目にします。
![AdExplain2.png](https://qiita-image-store.s3.amazonaws.com/0/255097/923d5ca0-b594-1546-29f6-a677c3d146bb.png)
　一生懸命調べ事をしている最中にこんな広告が頻繁に出てくると集中できないし、特に右側のなんて会社で出てきたら気まずいでしょ。というか既になった。

　今回は、人間がそんな思いをせず快適に調べ事ができるよう、常にブラウザのページを監視して広告を自動で消してくれるロボットをUiPathで作ってみようと思います。
（AdBlockのアドオン入れればいいじゃん、とは言わないで）

# Set Web Attributeで広告の幅と高さを0に
　広告を消す事自体は難しくありません。Set Web Attributeアクティビティで、その広告オブジェクトの幅と高さを0にしてやれば非表示になります。問題は、ページ内に複数存在する広告オブジェクトをどのように拾い集めてくるかです。

とりあえずUiExplorerでいくつか広告オブジェクトのSelectorを覗いてみる。
![uiexplorer.png](https://qiita-image-store.s3.amazonaws.com/0/255097/408adeeb-2791-346d-4955-590acd31e28c.png)
[id=google_ads_iframe]がキーワードになりそうです。

続いてChromeならF12または右クリック→検証でHTMLソースを確認。
![kensyo.png](https://qiita-image-store.s3.amazonaws.com/0/255097/93bfaf9f-338d-fa92-2fe6-23b8236150ef.png)
width、height、styleあたりのAttributeをいじくれば消せそうです。

というわけで方針決定。
[id=google_ads_iframe]のSelectorにひっかかったオブジェクト１つ１つについて、Set Web Attributeでwidth、height、styleを変更します。

# Selectorでまとめて取ってくるならFind Children
　指定した条件にひっかかるオブジェクトをまとめて取得したい場合、画像認識ならFind image matches、SelectorならFind Childrenを使います。今回はSelectorなので後者。
　ちなみにFind Elementは単一のオブジェクトしか取れません。そしてなぜかFind Element"**s**" は無いのでFind Childrenを使うしか無いのですが、このアクティビティはちょっと変わってます。

　Find ChildrenはSelectorとFilterの２つで対象を掴みます。まずSelectorで大枠、例えばページ全体とかテーブル全体を掴んで、その中でFilter条件に合うUiElementを配列にして返します。だからFind Children。
![findchildren.png](https://qiita-image-store.s3.amazonaws.com/0/255097/6422750a-fdf4-0b69-bc0b-def70b432c1f.png)

　今回の例だとこうなります。Chromeで開いているページ全体をSelectorで、さらにその中にある広告オブジェクト(id=google_ads_iframe)をFilterで抽出して取り出します。
![target.png](https://qiita-image-store.s3.amazonaws.com/0/255097/dffd0d80-aa82-7ca6-3538-639a3cefa66a.png)

　Find Childrenで取り出したUiElement（広告オブジェクト）に対し、１件ずつSet Attributeでwidth, height, styleといった項目を操作して非表示にします。
　![setattr.png](https://qiita-image-store.s3.amazonaws.com/0/255097/b8805acd-ca3a-93eb-cb4b-2f30102cb850.png)

　ポイントとして、該当する広告オブジェクトが無いページだとFind Elementが対象を見つけられずエラーになるので、Try-Catchで包んでエラーを握りつぶします。これでオートメーションが止まらずに済みます。
　![trycatch.png](https://qiita-image-store.s3.amazonaws.com/0/255097/74d1e311-8906-7e9c-2c2d-5c4ba1ed3338.png)

　あとは開いているページのURLが変わってないか定期的に調べて、変わっていたら即座に広告を消しに行く、というのをループさせれば完成です。
![flowchart.png](https://qiita-image-store.s3.amazonaws.com/0/255097/d49cb52a-843d-f56c-b291-2dfe9cfd8a9d.png)

# できた
　オートメーションをスタートさせると、こんな感じでページ内の広告を検出して消しにいってくれます。（今回はわかりやすく見せるため、あえてハイライトのつくデバッグモードで実行してます）
![bokashi1.gif](https://qiita-image-store.s3.amazonaws.com/0/255097/c8be9d0d-ce54-4450-f8a6-6ab3a7ca8109.gif)

---
今回はここまで。
UiPathの普及とともに色んな方が情報を公開してくれるようになったので、それと被らないネタを・・・と考えているうちに投稿が滞ってしまいました。
今後も少しずつですが投稿続けていきたいと思ってます。
Vue.jsでは_（アンダースコア）から始まるプロパティの使い方には気をつけましょう

# 結論

> Vue の内部的なプロパティや API メソッドと衝突する可能性があるため、_ または \$ から始まるプロパティは Vue インスタンスにプロキシされないことに注意してください。それらは vm.$data._property としてアクセスできます。

[Vue.jsの公式サイト](https://jp.vuejs.org/v2/api/#data)より（2018/11/2時点）


# 現象
動作検証のため、以下の様なコードを作成。
内容としては、「ボタンを押してから5秒間は、ボタンを押せない様にする」というものです。

```vuejs
<template>
	<div>
		<button @click="handleClick()" :disabled="isDisabled">クリック</button>
	</div>
</template>

<script lang="ts">
	import { Component, Vue } from "vue-property-decorator";

	@Component
	export default class Connpass extends Vue {
		private _running: boolean = false;

		get isDisabled(): boolean {
			return this._running;
		}

		sleep( msec: number ): Promise<any> {
			return new Promise(
				resolve => setTimeout( resolve, msec )
			);
		}

		async handleClick(): Promise<any> {
			if ( this._running === true ) {
				console.log( "すでに待機中ですよ？" );
				return;
			}
			this._running = true;

			console.log( "...待機中" );
			await this.sleep( 5000 );

			this._running = false;
		}
	}
</script>
```

これを実行したところ、無効にならない。
試しに`console.log(this._running);`を実行すると、出力は`undefined`になる。

調べたところ、表題の記述に行き着いたわけです。

ちなみに、参照した記述にもある様に、`this._running`を`this.$data._running`とするといけます。
ただ、そうするくらいなら大人しく_（アンダースコア）は消そうと思いました。


# 接頭辞に_（アンダースコア）問題

Q. そもそも、なぜ先頭にアンダースコアを入れる様になったの？
A. （たぶん）当時のチームのコード規約で決めたから。

その後も使い続けているのは、なんとなくでしたが、改めて考えてみると**プライベートメンバ変数だとパッと見でわかりやすくなる**からかな、と。

ただ、今回の件を良い機会として、
**そもそも先頭にアンダースコアをつけるのは一般的なのか**
ということをGoogle先生に訊ねてみましたが（20分くらい）、似た様な理由でついているケースが多いでしょうか。
あとは使っている言語と好みの問題かなという印象です。

もちろん言語それぞれに事情はあると思うので、単純に
「今後のプログラミングでは先頭アンダースコアは使わないぞ★」
なんてことは言いません。

ですが、ひとまずVue.jsを使うときは意識して抜いていこうと思います。
親要素と子要素それぞれにfloatをかけてみた

#目的
親要素、子要素へのfloatのかかり方を**身体**で覚える

##使ったファイル
- sample.html
- sample.css

```sample.html
<html>
  <head>
    <meta charset="utf-8">
    <title>test</title>
    <link rel="stylesheet" href="sample.css">
  </head>
  <body>
  <div class="red">親
    <div class="green">子</div>
  </div>
    <div class="blue">他人</div>
  </body>
</html>
```
```sample.css
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}

.red {
  background-color: red;
  height: 200px;
  width: 200px;
}

.green {
  background-color: green;
  height: 100px;
  width: 100px;
}

.blue {
  background-color: blue;
  height: 150px;
  width: 150px;
}
```
#####sample.htmlをブラウザで表示すると、こんな感じ
<img width="600" alt="初期状態.png" src="https://qiita-image-store.s3.amazonaws.com/0/171851/2d84753b-cc8c-e8cd-be7c-a515570d0173.png">

#####子(green)にfloatをかけてみる
```sample.css
.green {
  background-color: green;
  height: 100px;
  width: 100px;
  float: right;
}
```
#####すると、
<img width="600" alt="子にfloat.png" src="https://qiita-image-store.s3.amazonaws.com/0/171851/6a65d1d7-026e-954f-4acb-8fb5cf65fcbb.png">
#####親の範囲内でfloatした

######次に子(green)のfloatを削除して、親(red)にfloatかけてみた
```sample.css
.red {
  background-color: red;
  height: 200px;
  width: 200px;
  float: right;
}
```
#####すると、
<img width="524" alt="親にfloat.png" src="https://qiita-image-store.s3.amazonaws.com/0/171851/5d4d7b73-36ba-3f6e-b1c8-c10613a7ffb2.png">
######親要素のみにfloatをかけたら、子要素も連れてfloatした
#結論
**親要素にfloatすれば子要素も一緒にfloatする
子要素にfloatすれば親要素の範囲内でfloatする**
HTMLのimportでのリソースパスの指定の仕方

` <c:import>  ` を使うことで、url 属性に指定したファイルの内容をその位置で読み込むことができます。
その上で、外側に枠を作り、中に別のページを表示させたい場合app.jsp（外側のjsp）を作り、
 ` ${param.content} ` とコード内に書き込む（画像の黄色い枠）。
![イラスト.png](https://qiita-image-store.s3.amazonaws.com/0/309499/55ceb8ea-7f0c-04b3-58d5-7b98941d73c5.png)
 ` ${param.content} ` と書いたところに、中に表示させたいページが入ることになる。
中に入れる方のページ（jsp）には
![イラスト2.png](https://qiita-image-store.s3.amazonaws.com/0/309499/c28e5eaf-e686-b0f4-3ece-b773fd647700.png)
上の画像の黄色い枠で囲ってあるように ` <c:param name="content"> ` と記述する事で、黄色く囲ってある部分が中に入れたい部分に指定される。
今回は上の画像で ` ${param.content} ` と、下の画像で ` <c:param name="content"> ` というようにcontentで統一してページを指定している。
# Qiita-vimを試す

[この記事](https://qiita.com/Cj-bc/items/74c1f80745a7e2a5bd69)を読んで、Qiitaにvimから投稿出来る事を知ったので、試してみた。

* Windows 10 Home ver.1809
* Neovim 0.3.2-498
* Vim 8.1.451

## Neovim

最近はNeovimを使っているので、まずはこちらで試した。
が、次のエラーで何も出来なかった。

	list_user_items: Vim(let):E474: Attempt to decode a blank string

## Vim8

問題なく投稿できた。今もvim8で書いてる。  
`:Qiita -l`で記事を開いてから編集、その後`:w`したらQiita側の記事も更新されるの便利すぎひん？

## その他

* 下書きで投稿したいと思いhelpを読んだら、`let g:qiita_vim_private = v:true`で出来た。
ただ、その状態で公開記事を更新しようとすると、エラーになった。
    1. `let g:qiita_vim_private = v:false`でこの記事を書いて、投稿。
    1. `let g:qiita_vim_private = v:true`に変更して、非公開記事を投稿。
    1. `:Qiita -l`からこの記事を開き、更新して`:w`すると、`write_item: updating item: forbidden`になる。

既に「公開」状態で投稿した記事を、「非公開」で更新はできない、って事なのかな。

* 非公開で投稿した記事は、`:Qiita -l`で取得できない。ちょっと残念。

* Qiitaに初めて記事書いたけど、  
いつもの癖で末尾にスペースを2つ入れると、  
無駄に改行されて辛い。

## 感想

便利。
はてなにも欲しい。
Node.js でダブルクォートやシングルクォートを使わずに文字列を標準出力に表示する方法を考えてみたけど、いい方法がない件

## 追記

最初に要件をなんとなく書いたけれど、ちゃんと考えてみれば、「記号を使わない（大文字小文字数字 しか使えない）」という過激な要件になるんじゃないかなーって思いました。

最初に考えてた要件に漏れがあったわけなので、再考したいです。（要件が厳しすぎて、できる気がしないけど。）

## 発端

package.json の `scripts` フィールドに、「とりあえずなんか表示するだけの物を書きたい」ってことがあると思います。
しかし、JavaScript を使っているのだからクロスプラットフォーム対応するのは当然なので、以下のような要件があります。

- シェルコマンドっぽいものである `echo` を使わない
- [シェルによって `'` や ``` ` ``` の挙動が違う](https://nodejs.org/api/cli.html#cli_e_eval_script)ため、使えない
-  `"` はエスケープすれば使えるけれど、可読性が下がるので NG

なので、**package.json に以下のように書くことはできません**

```json

  "scripts": {
    "test": "echo nothing"
    "start": "node -e \"console.log('not implemented')\""
  },
```

## 考えたやり方
### [RegExp の `toString()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/toString) を使う（ダメ）

```json
  "scripts": {
    "test": "node -e console.log(/Hello/.toString())"
  }
```

```shell
$npm t

> test@0.0.0 start /test
> node -e console.log(/Hello/.toString())

/Hello/
```

ダメな点

- `/` を使っている
  - ほんとに大丈夫か？って感じある。（たぶんダメ）
- 表示したい文字列に使える文字が、大小文字数字 のみ。
  - 半角スペースが使えない
  - `,` や `.` も使えない（危なそうなので使いたくない）
  - 記号も使えない（危なそうなので使いたくない）
- 文字列の最初と最後に `/` が入る

### [`echo-cli`](https://www.npmjs.com/package/echo-cli)を使う（たぶんダメ）

[Windows 対応してない](https://github.com/iamakulov/echo-cli/issues/1)（テストしてないだけに見えますけどね。）


## まとめ

良さげな方法がない。

結局、`npm init` して作られる、 `"test": "echo \"Error: no test specified\" && exit 1"` が最適解なのかなって思いました。（~~でもこれ、 `&&` 使ってるから PowerShell だと動かないのでは…？~~）

PowerShell でも動きました。（けど、やっぱり `&&` とか `\"` は使いたくないなーって思いますね）

```PowerShell
PS C:\tmp> npm t

> tmp@1.0.0 test C:\tmp
> echo "Error: no test specified" && exit 1

"Error: no test specified"
npm ERR! Test failed.  See above for more details.

PS C:\tmp> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.14409.1012
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.14409.1012
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```
Bootstrap4 メニュー作成関数

メモ用

あれ？うまく動かないや？
なぜだ…、ま、いっか。

```index.html
<script>
    ceate_menu("#get_dept_id", dept_id, 10, {arrKySrt:dept_srt});   
</script>

<div class="btn-group">
    <button class="btn dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        お菓子メーカ一覧
    </button>
    <div id="sel_dept" class="dropdown-menu"></div>
</div>
```


```javascript:javascript.js
/*
Bootstrap4 メニュー作成関数
tarSel: Bt4 対象のメニューのセレクタ
arrKyVal: {key:val,key:val,} 
actId: アクティブなID
obj:{
	arrKySrt: {1:KeyX,2:KeyY,} keyがソート順 ValがarrKyValのKeyにあたる（dept_id）
}
*/
function ceate_menu(tarSel,arrKyVal,actId,obj){
	let snippet = "";
	//console.log([tarSel,arrKyVal,actId,obj]);
	for(var i in obj.arrKySrt){

		if(arrKyVal[obj.arrKySrt[i] ]===undefined){
			snippet +=	'<div class="dropdown-divider"></div>\n';
		}else{
			snippet += 	'<button type="button" class="dropdown-item '+ (actId==obj.arrKySrt[i]?"active":"") +'" type="button" value="'
				+ 	obj.arrKySrt[i]+'">'+arrKyVal[obj.arrKySrt[i] ]+'</button>\n';
		}
	}
	$(tarSel+" .dropdown-menu").append(snippet);
}


const dept_id={
	8  :"グリコ",
	7  :"ブルボン",
	9  :"ロッテ",
	11 :"カルビ"
}
const dept_srt={
	1: 11, 
	2: 8, 
	3: 7, 
	4: 0, 
	5: 9
}
```
Qiitaを始める前に。私の失敗記事です。コメントの部分を読んでくださいね。

#環境構築で悩んでいた

内科のクリニックを経営していて。

PCは電子カルテと情報発信のためのものとしか使ってなかった。

たまたま見たTwitter。

２ちゃんねるのひろゆき氏が「グーグルの機械学習の課題を終了」という投稿を目にする。

無料でやったとのこと。

え？？プログラムって無料で学べるの？

調べてみた。

##プログラムって無料でできるの？

Paizaラーニングというサービスを発見。

おぉぉぉ。

ネットさえつながればどこでも学習ができるな～～～。

移動が多い自分としては本での学習は難しかったので助かった。

機械学習はpythonと書いてあるのでそれを学び始める。

課題も難しく。

う～～ん、わからん。

ネットで調べるとQiitaに出会う。

これが運命を変えた気がする。

詳しく読まずにブログのようなものかな～～って程度で記事をあげると。

[manzyunさん](https://qiita.com/manzyun)からコメントが。

これ知っといた方がいいよ～って。

こんなフランクに教えてくれるの？

###教えてもらえるなら

環境構築ができませんと言った瞬間。

[shiracamus](https://qiita.com/shiracamus)さんから

[Google Colaboratory](https://qiita.com/kouki_outstand/items/cd24dccbaa92274be39e)でやってみたら？とアドバイスをもらう。


できた。

アップロードやダウンロードはよくわからないですが。

直接打ち込んでも動きました。

といっても

print("テスト")だけしかやってませんが。

これなら、環境構築とかしなくてもどこでもプログラムができそうです。

Qiitaの書き方もまだ理解できてないです。

ここにコードを書いたりもできるそうですがよくわからないのでこれから勉強します。

でも、このみなさんからのコメントで大きな一歩を進めました。

40歳ができるのかな～で始めたプログラミング。

こんな世界があるのかって知ることができたので。

やってよかった続けようって思えます。

ありがとうございます。