OmniAICreator/Qiita-1.07M huggingface dataset:
【Windows】スリープモードの一時停止【小技】

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/ece939b7-42d1-1fd1-cc0a-a9181d8b0cb9.jpeg" width=50%>

## 【序文】
今日日、職場の PC はセキュリティ等の理由からスリープモードが設定されている場合が多い。
これが地味に煩わしい。
バッチやスクリプト処理等、ちょっと時間が掛かる作業を行っていると、スリープがかかってしまい、慌ててマウスを動かしたりとか。「あるある」ネタじゃないけど。

スリープモードの設定をその都度変更するのも面倒。そもそも勝手に変えて良いのか、設定を元の状態に戻すのを忘れたらどうする、とかのツッコみも出てくるし、益々煩わしい。

ネットを検索すると、スリープモードの ON/OFF を制御するアプリやら、強制的にキー入力を発生させてスリープを回避するマクロやら、色々と対策は出てくるけど・・・。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/ece939b7-42d1-1fd1-cc0a-a9181d8b0cb9.jpeg" width=20%>な感じ。
自分なりに色々と試し、これが一番簡単で手っ取り早い、という結論があるので情報共有として残す。（大した話でもないけど）

## 【結論】
Windows Media Player（以下 WMP） をループ再生する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/3723a355-0a19-cef2-4628-aff03f68c584.png" width=20%>

## 【手順】
1. Windowsフォルダ内の「media」フォルダをエクスプローラで開く
    通常は以下のパス。

    	C:\Windows\media

2. 任意の MIDIファイルをダブルクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/e9346cf8-3d10-a43f-4644-0e1e4cbeca3a.png" width=50%>
3. 関連付けがデフォルトのままなら WMP が開く
4. WMP でマウス右クリック、プルダウンメニューの「連続再生」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/ee78d1b4-cf12-d70f-6958-7a7e1a579c0c.png" width=40%>

WMP が再生している間はスリープモードに入らない。

## 【補足】
- デスクトップに再生ファイルのショートカットを用意すれば、ダブルクリック一発  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/81fcbcc7-8ec3-d8f8-874a-6befb2546876.png" width=20%>
- 職場の PC で音楽再生はいかがなものか、の場合はスピーカーをミュート
- 手順で示した MIDIファイルは、単にデフォルトで入っている＆軽いから。マルチメディア系のファイルなら何でも良い
- WMP も、単にデフォルトで入っているから。他の動画再生アプリでも同様の効果があるので何でも良い
- 任意のパスをエクスプローラで開きたい場合、パスをなぞって以下実行

	| 手順 | キー入力          | 意味                |
| --- | ------------------ | ------------------- |
| 1   | Ctrlキー + c       | コピー |
| 2   | Windowsキー + R    | 「ファイル名を指定して実行」ダイアログを開く           |
| 3   | Ctrlキー + v       | ペースト           |
| 4   | Enter              | 「Ok」ボタン実行           |
【RaspberryPi】隠しファイル/ディレクトリを表示【kodi】

## 【設定箇所】
歯車アイコン -> 設定 -> メディア -> 一般 -> 詳細設定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/537ae771-9595-1b4a-e240-ed627c9c513b.png" width=50%>

## 【余談】
kodi 再生用ファイルを格納しているディレクトリ構成で、先頭に表示したいディレクトリがあり、「.」（ドット）始まりのディレクトリ名にしたら、隠しディレクトリ扱いになってしまい、kodi上でも表示されない。（Linuxあるある）
どこで表示設定するんだ？　とぐーぐる先生に聞くも、そんなことは kodi使いには常識なのか、探し方が悪いのか、日本語圏では情報が見つからなかったので情報共有として残す。
C#からJScriptのevalを呼び出す


evalつかって 1+2*3+4 みたいな式をユーザーが指定して、計算できるようにする。

「source」の中をいじれば他のこともできそう。(コンパイルエラーの例外処理追加要りそう)


# サンプルコード

```csharp:EvalTest.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
using System.Reflection;
using System.CodeDom.Compiler;


public class ExprTest
{
    static SimpleParser sp = new SimpleParser();

    public class SimpleParser
    {
        dynamic m_evaluator = null;
        
        public SimpleParser()
        {
            string source = @"package Evaluator{class Evaluator{public function MyEval(expr:String){return eval(expr);}}}";
            CodeDomProvider prov = new Microsoft.JScript.JScriptCodeProvider();
            CompilerParameters cparam = new CompilerParameters();
            cparam.GenerateInMemory = true;
            CompilerResults result = prov.CompileAssemblyFromSource(cparam, source);
            Assembly asm = result.CompiledAssembly;
            m_evaluator = Activator.CreateInstance(asm.GetType("Evaluator.Evaluator"));
        }
        
        public object eval(string exp)
        {
            try {
                return m_evaluator.MyEval(exp); // CompileAssemblyFromSource に渡した source の中の function の名前(MyEval)をメソッド名として指定
            }
            catch ( Microsoft.JScript.JScriptException e ) { // コンパイルにするには Microsoft.Vsa.dll を参照に追加する必要がある
                Console.WriteLine(e);
            }
            return null;
        }
    }
    
    [STAThread]
    public static void Main(string[] args)
    {
        object a = sp.eval("1+2*3+4");
        
        if ( a != null ) {
            Console.Write("ValueType: ");
            Console.WriteLine(a.GetType());
            Console.Write("Value: ");
            Console.WriteLine(a);
        }
    }
}

```

# コンパイル方法

```
csc.exe ^
  /r:C:\Windows\assembly\GAC_MSIL\Microsoft.JScript\8.0.0.0__b03f5f7f11d50a3a\Microsoft.JScript.dll ^
  /r:C:\Windows\assembly\GAC_MSIL\Microsoft.Vsa\8.0.0.0__b03f5f7f11d50a3a\Microsoft.Vsa.dll ^
  EvalTest.cs
```

# 参考サイト
http://espresso3389.hatenablog.com/entry/20080713/1215920756
http://gushwell.ldblog.jp/archives/52012439.html


# 補足

参考サイトの内容で事足りている気がしますが、
dynamic型を使って書き直したのと、それに伴ってexceptionの型を変更しています。

あと、下記のようにstaticでnewすることで、ExprTestクラスの実体を複数作ったとしても
evalの実体を1個で済ませることができているはず。

```csharp
static SimpleParser sp = new SimpleParser();
```
Cubbyとは

Cubby(カビー)はJava/Servlet/JSPをベースにした、Webアプリケーションのためのシンプルなフレームワークです。

- シンプルで小さい(薄い)フレームワークです。
- 設定ファイルはほとんど使用しません
- RESTっぽいURIをサポートします。
    - (/username/todo/1001、拡張子がつかないURIなど)
- 直感的な名前のカスタムタグライブラリです。
MySQLでのバルクアップデートの性能比較

バルクインサートと比較すると要件が複雑なため、バルクアップデートの実現方法はいくつかあります。
この記事では3つの方法に対して実行速度の違いを比較します。

1. UPDATE ~ ELT + FIELD
1. UPDATE ~ CASE
1. INSERT ~ ON DUPLICATE KEY UPDATE

要件によっては上記以外の方法でも十分なケースもあるため、以下の条件を設定しています。

1. レコード毎に違う内容で更新
1. 更新前の値を使用
1. 特定のカラムのみを更新し、他のカラムは変更しない

実際にありそうなケースとしては、ユーザごとにポイントを保持するテーブルがあり定期的に集計処理を走らせてその内容に応じてポイントを加算するようなのを想定してます。

## 使用するテーブル

```
CREATE TABLE `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `field1` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `field2` int(11) NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1;
```

## UPDATE ~ ELT + FIELD
```
UPDATE
    `users`
SET 
    field2 = field2 + ELT(FIELD(user_id,1,2,3),1,2,3) 
WHERE user_id IN (1,2,3)
```

## UPDATE ~ CASE
```
UPDATE 
    `users`
SET field2 = field2 +
CASE user_id
    WHEN 1 THEN 1
    WHEN 2 THEN 2
    WHEN 3 THEN 3
WHERE user_id IN (1,2,3)
```

## INSERT ~ ON DUPLICATE KEY UPDATE
```
INSERT INTO
    users (user_id, field1, field2)
VALUES
    (1, "dummy", 1),
    (2, "dummy", 2),
    (3, "dummy", 3)
ON DUPLICATE KEY UPDATE
    field2 = field2 + VALUES(field2);
```

## 性能比較

100万レコードの内10万レコードを更新するようにそれぞれの方法ごとに3回ずつ処理時間を計測しました。
上に記述されている例は3レコードを更新する内容になっていますが、実際には10万レコード用に拡張して実行しています。

||平均|1回目|2回目|3回目|
|---|---|---|---|---|
|UPDATE ~ ELT + FIELD|77.6s|77s|77s|79s|
|UPDATE ~ CASE + THEN|215.3s|215s|215s|216s|
|INSERT ~ ON DUPLICATE KEY UPDATE|0.9s|1s|0.9s|0.9s|

マシンのスペックは以下になります。
OS: macOS Mojave
プロセッサ: 2.4 GHz Intel Core i5
メモリ: 16 GB 2133 MHz LPDDR3

## まとめ

実行時間に関してはINSERT ~ ON DUPLICATE KEY UPDATEが最速で、次にUPDATE ~ ELT + FIELD、最後がUPDATE ~ CASEという結果でした。
単なるUPDATE ~ WHERE INの実行時間は1sもかからないので、FIELDやCASEの箇所が大きく影響していそうです。FIELDとCASEでここまで差が出る理由は今度調査してみたいと思います。
Reduxのコアコンセプトについて説明してみる



Reactとセットで使われることの多いReduxについてちゃんと把握したかったので、公式ページに書かれている内容をもとに自分なりに説明してみる。
（サンプルコードは公式ページからコピーさせていただきました）


#コアコンセプト
アプリケーションのステータスがオブジェクト形式で表現された場合をイメージしてみましょう。
例えば、TODOアプリケーションのステータスを表現する場合は以下の通りになります。

```jsonnet
{
  todos: [{
    text: 'なにか食べる',
    completed: true
  }, {
    text: 'エクササイズをする',
    completed: false
  }],
  visibilityFilter: 'SHOW_COMPLETED'
}
```
このオブジェクトは、Setterがないことを除けば、"モデル"のように見えます。
この形式だと、コードの様々な部分の変更が難しくなり、バグの再現が難しくなります※

状態に変更を加えるためにアクションを別管理する必要があります。
アクションは何が起こったかを説明するためのプレーンなJavaScriptオブジェクトです。
以下のコードがアクションのサンプルです。

```jsonnet
{ type: 'ADD_TODO', text: 'プールに行く' }
{ type: 'TOGGLE_TODO', index: 1 }
{ type: 'SET_VISIBILITY_FILTER', filter: 'SHOW_ALL' }
```

すべてのアクションがアクションとして表現されているかを確認するために、アプリケーションの内部で何が起こっているかを明確にします。
もし、何かに変化があれば、なぜ変更があったかがわかります。
アクションは何が起こったかのパンくずリストのようなものです。
最終的に、状態とアクションを一緒にするために、reducerと呼ばれる関数を作成します。

何も不思議なことはなく、これは状態とアクションを引数として受け取り、戻り値に次の状態を返すただの関数です。

大きなアプリケーションでこのような関数を記述するのはちょっと大変です。そのため、パーツの状態を管理するための小さな関数を作りました。

```javascript

function visibilityFilter(state = 'SHOW_ALL', action) {
  if (action.type === 'SET_VISIBILITY_FILTER') {
    return action.filter
  } else {
    return state
  }
}

function todos(state = [], action) {
  switch (action.type) {
    case 'ADD_TODO':
      return state.concat([{ text: action.text, completed: false }])
    case 'TOGGLE_TODO':
      return state.map((todo, index) =>
        action.index === index
          ? { text: todo.text, completed: !todo.completed }
          : todo
      )
    default:
      return state
  }
}
```


対応する状態キーにより２つのreducerを呼び出し、
アプリケーションの状態を全体的に管理するための別のreducerを作りました。


```javascript

function todoApp(state = {}, action) {
  return {
    todos: todos(state.todos, action),
    visibilityFilter: visibilityFilter(state.visibilityFilter, action)
  }
}
```

これが基本的にReduxの考え方のすべてです。

現時点では、ReduxのAPIを全く使っていないことに着目してください。

このパターンを使う場合、いくつかのユーティリティが付属していますが、
主となるアイデアとしては、どのように状態(state)が更新されたかをアクションオブジェクトに応じて説明することです。
また９０％のあなたが記述するコードがプレーンなJavascriptで、ReduxやそのAPIを利用することはありません。




#参考ページ
###Reduxコアコンセプト
https://redux.js.org/introduction/core-concepts
JavaScript | Setオブジェクト

## Setとは
> Set オブジェクトは値のコレクションです。挿入順に要素を反復することができます。Set に重複する値は格納出来ません。Set 内の値はコレクション内で一意となります。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set

単純にユニークリストって覚えておけば、おk

## Setのつくりかた

```js
let yoSet = new Set();
```

## 空のSetの中身を見てみゆ(検証ツール-Console)
```js
console.log(yoSet);
```
![スクリーンショット 2019-08-25 21.23.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351688/23a7bfcd-4fa3-7ac9-5f46-0d90c636a7af.png)

sizeプロパティは0で、prototypeの中をのぞいてみると配列とは全然違うメソッドが使えることがわかる（addとかdeleteとか)

ちなみにわかりやすいので、ここを使います
[JS Bin](https://jsbin.com/)

## 要素をSetに追加
```js
yoSet.add(1);
yoSet.add(2);

// 実行してconsoleを確認してみれば、 size(2) {1, 2} ってなってるはず
```

* メソッドチェーンもできる

```js

yoSet.add(1).add(2)
```

* Setは重複を許さないことを確認してみる

```js
yoSet.add(1).add(2).add(1).add(1).add(1).add(1)

// size(2) {1, 2} のままのはず
```

## その他メソッドを色々試す
### has(value)
rubyでいうところのinclude?的な

```js
console.log(yoSet.has(1)); //true
console.log(yoSet.has(5)); //false
```

### delete(value)
valueに指定された要素を消します

```js
console.log(yoSet.delete(1));

// size(1) {2} になっていることを確認
```

### clear()
要素を全て消す ※メソッドチェーンできない

```js
yoSet.clear()

// size(0) {} になっていることを確認
```

## Set作成時に初期値を渡す
```js

const arr = [1, 2, 3];

let yoSet = new Set(arr);

// size(3) {1, 2, 3} となっていることを確認
```

#### Setが重複した値を許可しないという特性を活かしてみる  
例えば、たくさんダブった要素が入っている配列があるとして、その配列から重複した値だけを取り除きたいとき  
単純にforループとかで探せるけども、setを使えばこんなんに簡単に書ける...！

```js
const arr = [1, 2, 3, 3, 3, 3, 2, 2, 2, 1, 1];

let yoSet = new Set(arr);

console.log([...yoSet]);

// 期待する出力結果
// [1, 2, 3]
```
＊ [...yoSet] => スクエアブラケットで囲って、Setの前にdotを三つ置いてあげると配列として返してくれる


#### 重複を取り除いてくれる例
```js
let set1 = new Set(["yo","yo","yo","hey","hey", "hey"]); 
// ["yo","hey"] 

let set2 = new Set("yoooooooo!!wasuuuuuuuup!!"); 
// ["y", "o", "!", "w", "a", "s", "u", "p"]
```

## 一緒に参考にしたい記事
[JavaScript Setオブジェクト](https://qiita.com/chihiro/items/0e610a31b589e3cc435f)
シェルスクリプトで色付き文字の出力

こんにちは。
シェルスクリプトで色付き文字の出力を試してみました。POSIX echo では、カラー化のためのエスケープ ```\``` を直接書き込んだ文字列をエスケープとして解釈してくれないので、一旦、別の変数に代入してから使っています。「[シェルスクリプトのechoで”問題なく”色をつける](https://qiita.com/ko1nksm/items/095bdb8f0eca6d327233)」を参考にしました。

```color.sh
#!/bin/sh

esc=$(printf '\033')
green="${esc}[32m"
normal="${esc}[0m"
# green=$(tput setaf 2)
# normal=$(tput sgr0)
# green=$'\e[32m'  # Bash
# normal=$'\e[0m'  # Bash

abc="abc"
echo "$green$abc$normal"
echo "${esc}[32m$abc${esc}[0m"
printf "\033[32m%s\033[0m\n" "$abc"
# gecho -e "\e[32m$abc\e[0m"  # GNU echo
# echo "\033[32m$abc\033[0m"  # echo in a shell script of MacOSX

exit 0
```
[GCP] GCPサービスを勝手にまとめてみた(メディアとゲーム編)

# GCPって
https://qiita.com/risa0320/items/5f34bc9102e575705274

# サービスの分類
おおまかにはこんな感じ。（一部省略してます）
※2019年8月末時点のもの。
※α版、β版を含む。
https://cloud.google.com/products/?hl=ja よりいろいろ引用してます。

| 分類       |  サービス例    |
|:-----------------|:------------------|
| AIと機械学習   | AutoML,Vision AI,Cloud TPU... |
| API管理 | Apigee Sense,Cloud Healthcare API... |
| コンピューティング | Compute Engine,App Engine,Cloud Functions... |
| データ分析 | BigQuery,Cloud Composer,Cloud Dataflow... |
| データベース | Cloud SQL,Cloud Bigtable,Cloud Spanner... |
| デベロッパーツール | Container Registry,Cloud Build... |
| ハイブリットとマルチクラウド | Anthos,GKE On-Prem... |
| IoT | Cloud IoT Core,Edge TPU |
| 管理ツール | Stackdriver,Monitoring,Private Catalog... |
| メデイアとゲーム | Zync Render,Anvato... |
| 移行 | Cloud Data Transfer,Transfer Application... |
| ネットワーキング | Virtual Private Cloud,Cloud DNS,Cloud NAT... |
| セキュリティ | Cloud Security Scanner,Cloud IAM,Cloud HSM... |
| ストレージ | Cloud Storage,Cloud Firestore... |

# サービスをもう少し深く見てみる
## メディアとゲーム
### Google Cloud Game Servers(α版)
Google Cloud Game Servers
> Google Cloud Game Servers は、Kubernetes 上で動作するオープンソース プロジェクト Agones のフルマネージド サービスです。Google Cloud Game Servers を使用すると、ゲームサーバーのインフラ管理の煩わしさから解放され、優れたゲームを迅速に作成することに集中できます。インフラをより複雑にしてしまったり、パフォーマンスを犠牲にしたりすることもありません。

<特徴>

* 管理の簡略化
* 柔軟性が高く選択肢が豊富
* プレーヤーのより近くに

ゲームのためのServerって、可用性とかリアルタイム性を担保するのが大変そうなので、フルマネージドって魅力的なのでは。

### Zync Render
3D モデリング ツールから直接、迅速かつ経済的にレンダリングします。

これ何か楽しそうな感じ！

### Anvato
ライブ動画やオンデマンド動画をあらゆるデバイスにストリーミングします。
Ansibleでのエラーハンドリングなど

Ansibleで、通常実行でもCheck modeでもきちんとエラーを吐かずに動くようにするためには、エラーハンドリングが必須になる。

#ignore_errors
ignore_errosをyesにすると、そのタスクでエラーが発生しても無視して次のタスクに進むことができる。
コマンドの実行結果を確認したい時などに使える。

```yaml:test.yml
    - name: 必ず失敗するタスク
      command: /bin/false
      ignore_errors: yes

    - debug:
        msg: '手前のタスクが失敗しても、無視して次に進む'
```

RECAPではignoredにカウントされ、okにはならない。

```
PLAY RECAP *************************************************************************************************************
192.168.1.2  : ok=1   changed=0    unreachable=0    failed=0    skipped=0   rescued=0    ignored=1
```


#changed_when
これを使うと、モジュール本来のchangedステータスを上書きすることができる。

```yaml:test.yml
    - name: 必ず失敗するタスク
      command: /bin/false
      changed_when: no
```

これの実行結果は常に`ok`だ。

#failed_when
これもchanged_whenに似ていて、モジュール本来のfailedステータスを上書きすることができる。

```yaml:test.yml
    - name: 必ず失敗するタスク
      command: /bin/false
      failed_when: no
```

上のコードはignore_errorsと似ているように思えるが、ignore_errorsがRECAPでignoredにカウントされるのに対し、上記の場合はokとカウントされる。

```
PLAY RECAP *************************************************************************************************************
192.168.1.2  : ok=1   changed=0    unreachable=0    failed=0    skipped=0   rescued=0    ignored=0
```


#check_mode

バージョン2.2からdeprecatedになった`always_run`に代わって推奨されているオプション。

これは少しややこしいが、以下のような動作になる。
`check_mode: yes`の場合、--checkオプションがつけられて**いない**場合でも常にdry runになる。
`check_mode: no`の場合、--checkオプションがつけらて**いる**場合でも常に通常実行になる。

noにする時は、事故が起きないように気を付けよう。

#block～rescue
これはプログラミング言語でいうtry～catchに近い。
エラーが発生しても全体を強制終了させることなく継続させることができる。

```yaml:test.yml
tasks:
- name: Handle the error
  block:
    - debug:
        msg: 'ここは実行されます'
    - name: 必ず失敗するタスク
      command: /bin/false
    - debug:
        msg: '手前のタスクがfailになるので、このタスクまでは到達しません'
  rescue:
    - debug:
        msg: 'タスクが失敗した場合、ここが実行されます'
```

#check modeにおけるshell/commandの挙動について

check modeで実行した場合、commandモジュールやshellモジュールは無条件でskippedのステータスになる仕様のようだ。
これはchanged_whenなどで上書きすることはできない。

このことはAnsibleの公式ドキュメントにも以下のように書かれている。
冪等性を担保したい時はCreate/Removeオプションを使えとのこと。

*Check mode is supported when passing creates or removes. If running in check mode and either of these are specified, the module will check for the existence of the file and report the correct changed status. If these are not supplied, the task will be skipped.*


例で示すと、以下のようなPlaybookをcheck modeで実行した時、2番目のタスクはwhenの内容に関わらず常にskippedになってしまう。
これだと、2番目のタスクが実際に実行されるかを事前に確認することができない。(Playbookを目で追えば分かるが)

```yaml:test.yml
tasks:
  - name: 何かコマンドを実行
    shell: /bin/some/command/a
    register: result
    check_mode: no

  - name: 前のコマンドが失敗した時だけ実行するコマンド
    shell: /bin/some/command/b
    when: not result.rc == 0
```

shellやcommandは通常実行した時は常にchangedになるのだから、check modeにおいても常にchangedになるべきでは?と思うのだが、何か意図があるのだろうか。
同じことを疑問に思っている人は[ここ](https://github.com/ansible/ansible/issues/14950)とか、[ここ](https://serverfault.com/questions/976424/how-do-i-report-an-ansible-command-shell-task-as-changed-in-check-mode)で見つけたが、どちらも結局解決はしていないようだ。

うまいやり方を知っている人は教えてください。

###参考URL
https://docs.ansible.com/ansible/latest/user_guide/playbooks_error_handling.html
https://docs.ansible.com/ansible/latest/user_guide/playbooks_checkmode.html
リーダブルコードを買うべき理由

# いきなりですが結論
リーダブルコードを買おうか迷っているそこのあなた…もしご自身が少しでも駆け出しの自覚をお持ちでしたら、
迷わず買うことをオススメします!!
きっと迷っている理由って、恐らくネットで調べたり周囲の声を聞いたりして、

- 当たり前のことしか載ってないから買うべきかな〜
- 値段の割にボリュームが少ない

というような意見を見たからだと思います。
私もそんな意見を聞いて買うのを渋っていた人間なんですが、
やっぱり気になって勇気を出して買ってみました。
そして読んでみたところ、やっぱり**買ってよかったな〜**と強く思いました。

# そもそもリーダブルコードって？
コーディングを行う際に心がけることをまとめたものです。べき集、べからず集ですね。
商品のリンクを一応下に貼り付けておきます。
[amazon](https://www.amazon.co.jp/リーダブルコード-―より良いコードを書くためのシンプルで実践的なテクニック-Theory-practice-Boswell/dp/4873115655)
[O'Reilly Japan](https://www.oreilly.co.jp/books/9784873115658/)

この記事を書いている時点では、amazonは紙媒体、O'Reilly Japanは紙媒体・電子書籍を扱っていますが、もし買うのであればO'Reilly Japanで電子書籍を購入することをおすすめします。
理由①：安い
理由②：自分を戒めるためのバイブルとして持ち歩くのに電子化しておいた方が便利。

# どうしてそこまで薦めるの？
筆者がこの本を読まなかったために**実務で痛い思い**をしたからです…。
そして思いました。自分のような犠牲者をこれ以上出すわけにはいかないと…。

## どんな痛い目にあった？
**コードレビューで周りの人に迷惑をかけました（泣）**
自分の趣味の範囲でしかコーディングをしていない自分にとって、変数名やクラス分けなんかノリでやっていたんですが、それを実務でやったところ他の人があまりにも読みづらいコードを生み出してしまい、多大なる迷惑をかけてしまいました。（もちろん、そこでかかった時間も会社として見たら損失になるので、この部分でも駄目ですよね…。）

幸い周囲は心優しい方ばかりなのでキツイことは言われませんでしたが、「あ〜…」という困惑したあの感じはもう本当申し訳なかったですね。

あと、やっぱりこういうところで周囲の信頼を落とすの、すごくもったいないと思うんですよね。
こういうところで仕事の丁寧さをアピールできれば、よりよい仕事ができたり参加できたりするので、
基礎固めにケチをするべきではないな〜と思いました。


# 色んなところでまとめられているけど？
この本結構有名なので、色んな記事で要点がまとめれています。
qiitaにおいても色んな人がべき集・べからず集をまとめているのを見ますし、
私自身もこの本を読んでからそういう記事を見て「あーたしかに書いてあったな」ってなっています。

ただ、その要点も結局は具体例などを含めた一連の話があってからのまとめなので、やっぱり買って読んだ方が腹落ちするかな〜と私は思います。（加えて疑り深い性格なので、「本当にこれ書いてあるのかな…？」と調べたくなったというのもあるのですが笑）

# 改めて結論

買いましょう。できれば電子書籍で。
PhpStorm使ってるのにlive template使わないなんてもったいない！

結構よく使う機能なのですが、あまり記事を見かけないので紹介しようかと思いました。
名前知らないけど使ってるよって人も結構いそうな機能です。

## [ライブ・テンプレート](https://pleiades.io/help/phpstorm/using-live-templates.html)とは
変数を持ったコードスニペットというイメージです。よく使用されるコードを1つのテンプレートとして登録しておいて、それを呼び出すことで開発の効率をあげることができると思います。

> ライブテンプレートを使用することで、頻繁に使用される構造をコードに挿入できます: 例：ループ、条件、さまざまな宣言、またはprintステートメント

## どんなことができるか

phpだと`pubf`,`fore` あたりをよく使うのですが、動画のように `pubf`と入力をしてtabを打つと、一気に`public function () {}` と入力をしてくれます。
![live_template.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144753/fb72f8ed-4223-f5fe-e125-d60c912d4cc2.gif)

### 通常のtab補完と何が違うのか
パッと見てただのtab補完な気もするのですが、登録されているテンプレートの中に変数が埋め込まれています。
変数は上から順にtabで移動ができて、デフォルト値などが設定できるようになっています。

これがデフォルトのforeachの設定です。
(`Preferences > Editor > Live Templates`から確認可能)
<img width="994" alt="スクリーンショット 2019-08-25 23.11.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144753/64001e5c-2801-abee-ad74-18b7858972b9.png">

`fore` を入力してtabを打つと、`$ITERABLE$` にカーソルが合い、再度tabを打つと `$VAR_VALUE$` のところにカーソルが合うようになっています。また、`$VAR_VALUE$` のデフォルト値が `$item` と設定されているため、入力する前に`$item`と入力されるようになります。
先ほどの動画で`foreach` を使っているので、一度確認をしてみてください。

この変数の初期値などをプロジェクトに合うように変更しておけば、都度入力する必要もなく効率が上がります。

## vue.jsの補完もおすすめ
dataとかmethodとかコンポーネントごとに書くものをすぐにかけるのでおすすめです。
普段PHPをよく触っていて、vue.jsを触った時に、他のファイルからコピペをしてこようみたいなことが減りました。
![live_template2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144753/3c0f18e0-0913-3350-dc77-065f086bbc51.gif)


## 自分で作成もできる
既存のテンプレートもたくさんありますが、新規で作成もできます。
### 特定のライブラリ用のライブテンプレートを作る
どんな時に作るんだということで、特定のライブラリ用に作ってみました。
[vue-apollo](https://github.com/Akryum/vue-apollo)というライブラリ用に、vapploというテンプレートを作った例です。
特定のプロジェクトでしか使わないので、あまり覚えられず。。。そんな時は一度登録をしてしまえば便利でした。
![live_template3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144753/35dbf5b5-7509-0a73-8522-28cd9f55c44c.gif)

#### 変数名を同じにすると同じ値が入る
複数箇所に同じ値を入れたい場合は変数名を同じにします。
先ほどの動画で確認をして欲しいのですが、`$data$: this.$data$` としているため、`name`と入力をすると、両方の`$data$`に`name`と入力されていますね。これは便利。

```vuejs
this.$apollo.mutate({ 
  mutation: $MUTATION$,
  variables: {
    $data$: this.$data$, 
  },
}).then((data) => {
  
});
```

## おわりに
自分でテンプレートを追加し始めたのが最近なので、良さげなtipsがあれば追加していきたいです。
gccのオプションまとめ(随時更新)

gccのオプションを忘れてしまうのでまとめた(随時更新).

# GCCとは
**GCC**は**GNU Compiler Collection**の略.
GCCのコマンドが `gcc`.
GNUプロジェクトによって開発されており, 様々なプログラミング言語のコンパイラがまとめられている.

# gccのオプション

|オプション|説明|
|:--|:--|
|`-dumpversion`|バージョンを表示する|
|`--version`|バージョンを表示する(詳細に)|
|`-v`|バージョンを表示する(より詳細に)|
|`-o <file_name>`|生成されるプログラムの名前を指定する( `a.out` 以外にできる)|
|`-Wall`|一般的な警告オプションが全てオンになる|
|`-O`, `-O1`|最適化する(数字が大きくなるほど最適化レベルが上がる)|
|`-O2`|最適化する(特に思うところがないならこれを指定する)|
|`-O3`|最適化する|
|`--help`|ヘルプの表示|
HackerRank　Python3　Data Structuresを解く

#はじめに
未来電子テクノロジー（https://www.miraidenshi-tech.jp/intern-content/program/）
でインターンをしているrayaと申します。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#今回の内容
Python初心者が、HackerRankのData Structuresを解きます。

##Arrays - DS
配列の要素を逆順にして返す問題。

```python
def reverseArray(a):
    reverse_arr = reversed(a)
    return reverse_arr
```
正解でした。
・reversed()関数：引数を逆順にする関数
・今更ですが、関数を定義する際は、定義する関数に渡す引数は何でも良いのですね。あらかじめ引数で何らかを文字を渡しとけば、下のif \_\_main\_\_...のところでの変数を勝手に引数に渡してくれます。

##2D Array - DS
6x6の行列の中で、上3つ真ん中1つ下3つの要素で砂時計の形を作り、要素の合計が最大になる砂時計を見つける問題。

```python
def hourglassSum(arr):
    glass=[]
    for x in range(4):
        for y in range(4):
            glass.append(arr[x][y]+arr[x][y+1]+arr[x][y+2]+arr[x+1][y+1]+arr[x+2][y]+arr[x+2][y+1]+arr[x+2][y+2])
    return max(glass)
```
正解でした。法則性を見つけるのと、前回のAlgorithmsであったネストしたfor文で行列に値を入れていきます。
https://qiita.com/breakthrough/items/ffd4b2a05fef820ad485
↑前回の記事

##Left Rotation
配列の要素を指定した回数左に移動させる問題。
[1,2,3,4,5]を左に４回移動させると、[5,1,2,3,4]

```python
for i in range(d):
        a.append(a.pop(0))

    for i in a:
        print(i,end=" ")
```
これは思いつきませんでした。
・for文を実行回数（移動回数）を示すためだけに使用する。
・pop()メソッド:リストから引数をインデックスとする要素を取得し、その要素を削除する
・print(i,end=" "):iの後ろに空白を付け加える。for文で配列に要素を取り出し、文字列にしたい場合に使えそう。

for文の使い方がポイントでした。
WAVGAT Time of Flight距離センサ

中華製の安価(300円程度)なVL530L0x互換ToFセンサをarduino nanoで試用。
販売元サイトによると、このセンサは最大2mまで1mmの精度で検出可能とのこと（使用環境への依存大）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/40594fd4-3aa3-1dfe-e9ad-9f20e51ab453.png)


裏側左から
1. GND
2. SCL
3. SDA
4. GPIO1
5. TUH2X
6. 5V / 3.3V

Arduino nanoとの接続は下記の通り。

| ToFセンサ | Arduino nano | 
|:---------|------------:|
| GND       | 29ピン GND    | 
| SDA       | 22ピン A4     |
| SCL       | 21ピン A5     |
| 5V/3.3V   | 27ピン +5V    |


Arduino nanoのピン番号は下記ページを参照
https://www.arduino.cc/en/uploads/Main/ArduinoNanoManual23.pdf

VL530L0x ToFセンサのサンプルプログラムは下のものを利用。
https://github.com/pololu/vl53l0x-arduino



- サンプルのContinuous.inoの実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/de9bc943-1f93-58ca-05bd-02c2c8b0320d.png)


室内夜間蛍光灯環境下で大学ノートを立てかけて計測してみたところ、最大で４０ｃｍ程度の距離まで計測できた。
誤差は４０ｃｍでは１ｃｍくらいだったが３０ｃｍで誤差３ｃｍ、１０ｃｍで誤差６ｃｍくらい出ていた。
距離での補正テーブルが必要そう（反射物の材質にも影響するのかも）

どんな環境なら２ｍまで使えるかは不明だが、４０ｃｍ程度の用途なら使えそう

以上
メモ

count
メソッドや関数の名前に使う。数えるという意味なので数える処理が走っている時のこの名前にする。
num
数を表す。可算名詞に使う。
amount
量を表す。不可算名詞に使う。
quantity
可算名詞、不可算名詞どちらにも使える。
(ex
配達システムにおいて届けるものは、
りんご(可算名詞)や、水(不可算名詞）などどちらのパターンもあるのでquantity。)

size
大きさの概念があるもので使う（計算量はo(1)にすべきらしい。）
appleNum=りんごの数, appleSize=りんごの大きさ

capacity
最大容量。
length
長さの概念があるもので使う。

index
添字として使う。
no
配列などの要素で何番目の要素か。つまり添字＋１にする。

Id
識別番号。識別するためにあるので1:1の関係にありそのものを識別する時に使う。
exp
社員ID　同じ社員は２人いないのでID
0 Aさん
１ Bさん

code 一定の体系に基づいて決められているもの。意味は1:1だがそれを複数のものが持てる。
exp
社員コード
0　部長
1　副社長
２　部長
３　課長
部署コード
０　A部
１　B部

Manager 管理をするのはクラスの利用者、もしくはそのクラス自身なのでManagerというクラスを作ること自体が良い設計ではない。
Controller ユーザーインターフェイスとビジネスロジックのつなぎになるクラスにつける。UIが直接モデルを触らないようにする。

job 人間から見た仕事（講座に入金する。エレベータを動かすとか。）
task 機械から見た仕事（ファイルを読み込む。dbを操作するとか。）
command　命令。処理をせずメソッドや関数を呼ぶだけ。

どれも現実世界に合わせるようにする。(ディスクの容量はcapacityではなくvolumeとか)

ユーティリティ
ライブラリ
コンポーネント
モジュール
プラグイン
サードパーティ
超基礎的な部分のはずだが、理解できない！PHPのクラスとインスタンス

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているerika_zです。

プログラミングの学習を始めて約3か月が経ちました。
現在は、PHPを使ったお問い合わせフォームの作成に取り組んでいます。
PHPを利用するためには、PHPの仕組みを理解する必要があります。
しかし、学習する中でクラス・インスタンスについて理解することに手こずりました。

そこで今回は、備忘録としてPHPのクラス・インスタンスとは何かついて書きたいと思います。


#はじめに

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。





##クラス

クラスの中では、主に2つの情報を記述します。
その2つは、プロパティとメゾットです。

プロパティには変数や定数を記入します。
変数は様々な情報を入れられるはこのようなものです。箱に名前を付けることで、どのような値が入るかを示します。箱の中身は、値を代入することでを変更できます。
一方で、定数はその名の通り変化しない値のことを指します。1度値を代入したら、変更することができません。

メゾットには、関数と呼ばれるものを記入します。
変数は値を入れる箱のようなものですが、関数はいくつかの処理をまとめて入れておく箱です。
変数は値だけが入るのに対して、処理方法まで入ります。
関数は「組み込み関数」と呼ばれる事前に準備されているものもありますが、自分で作成もできます。



##インスタンス

クラスは型枠のようなものです。
そのため何かを行うには、クラスを使用して情報を形成します。
この形成されたものを、インスタンスと呼びます。
同じ型からくり抜かれたクッキーは形は同じですが、全く同じものではありません。
同様に、同じクラスから作られたインスタンスも同一ではありません。
コンストラクタというものを定義すすことで、なにを使って形成するかを指定できます。


#まとめ

今回は、クラスとインスタンについて書きました。

この記事を書いている間にも感じましたが、わかっているようで完全に理解はできていないと思います。
インプットだけでは、どうしても理解しきれない部分があるので、アウトプットをして理解を深めたいです。

変数・定数の定義も含めて書いたので、初心者の方が理解するための手助けになれば幸いです。
プログラミング学習（一日目）　ProgateでRuby On Rails レッスン１

本当はプログラミング学習一日目ではないけど、Qiitaに投稿を始めるので今日を一日目としました。

##　今日学んだこと

##### $rails new アプリケーション名
で、同名のフォルダを作成し、アプリを作る準備ができる

##### $rails server
で、サーバー起動。localhost:3000にアクセス可能

Railsでページを表示するにはviewとcontrollerとroutingが必要

#####$rails generate controller home top
で、まずはviews/home/top.html.erb（ビューファイル）が作られ、
app/controllers/home_controller.rb（コントローラ）が作られ、その中にはtopメソッドが作られる（このtopメソッドはアクションという）
そして、アプリケーション名/config/routes.rb（ルーティング）が作られる。

####Railsでページを表示するまでの流れ
まずブラウザにURLを入れられます。仮に「localhost:3000/top」だとする
するとルーティングにてこのURLに対応するコントローラ名とアクション名があるので、そのコントローラのアクションが呼び出される。

```ruby:routes.rb
Rails.application.routes.draw do
  get "top" => "home#top"
end
```
これは"top"というURLが来たらhomeコントローラのtopアクションを実行しろという意味。

そしてhomeコントローラのtopアクションでは、

```ruby:home_controller
class HomeController<ApplicationController
  def top
  end
end
```

と書かれてある。このアクションの役割は、views/の中でコントローラと同じ名前（この場合はhome/）のフォルダから、アクションと同じ名前のHTMLファイル（この場合はtop.html.erb）を探し、ブラウザに返すこと。

これでRailsでページを表示するのはOK

だが、また新たにページを増やすときに
#####$rails generate controller home about
とやっても、既にhomeコントローラはあるのでこのコマンドは実行できない（generateは「生成する」という意味）
これでRailsでページを表示する方法の基礎の基礎はできたはず。

ほかには
#####$rails generate contlloer home ...
時に生成されたapp/assets/stylesheets/home.scssにコードを書けば、すべてのビューにCSSが適用される（ここはあまり理解していない）。

tweet_app/public/に画像を保存すれば、"/画像名"でHTMLやCSSで画像を表示できるなど。

以上が、今日学んだRuby On Rails レッスン１です。

もし心優しい方が居て、アドバイスを頂けると嬉しいな...
Linux mint unable to launch "cinnamon-session-cinnamon" 

Linux mint cinnamon を使い始めた。

unable to launch "cinnamon-session-cinnamon" 
と出てX起動しなくなり、さすがに困った。

発端は、 emacs26 を某手順で入れたら、 mint Update ができなくなったこと。
そこでそれを消して、 mint に從う版を入れるつもりが、何か間違った。
おそらく emacs25 を誤って選択したと思う。

その後、Updateできず、パッケージの　remove　もできず、に陥った。
で再起動したら、ログイン画面は出るが、掲題のエラーになってしまい X が動かない。apt-get で remove などなど試してもエラーになってしまう。

結局、次の方法で壊れ状態のパッケージを強制削除した。
起動しない場合はGrubからレスキューへ進め、という記事もあるが、
今回は Ctrl+Alt+F1 でシェルが使えた。
まず「安全プロトコル解除」と唱えてから

1. sudo dpkg --remove --force-all emacs25
で、該当の壊れパッケージ emacs25 等を強制削除する。危険な操作らしいが、emacs なんぞは大丈夫だろうと。
あとは普通の回復手順で
2. sudo apt-get update
3. sudo apt-get install nemo
4. sudo apt-get install cinnamon

実際は 3 のところは何もしなかったようだ。
再起動して、無事に復活した。

もちろん、Synaptic　や apt-get remove で解決する場合は、それが良く、こういう強制削除は、よろしくないだろう。

https://askubuntu.com/questions/940419/unable-to-force-remove-purge-package-ubuntu-16-04/940438
https://forums.linuxmint.com/viewtopic.php?t=273579
https://askubuntu.com/questions/940419/unable-to-force-remove-purge-package-ubuntu-16-04/940438
Azure VM (CentOS) 上でDockerコンテナ (Splash) を構築する

# 概要
- 検証でSplash (https://splash.readthedocs.io/en/stable/) のDockerコンテナが利用したかったため、Azure上に構築しました。
- Web App for Containerに構築しようとしたところ、Dockerイメージの取得が上手くいかなかったため、VM上に構築を行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353069/21f57fdd-c2da-30ab-9df9-39d7ab3394cc.png)
(※) 別途、調査予定です・・・


# 環境
- Azure Virtual Machines
- CentOS 7.6
- Splash
- Windows10


# 注意点
- あくまで検証用の環境構築手順になります。
- 可用性やセキュリティ等、実用における観点を考慮しておりませんのでご注意ください。


# 構築の流れ
1. Azure Portal で CentOS の Virtual Machines を作成する。
2. CentOS にて Dockerサービスの設定を行う。
3. Dockerイメージの取得、及びコンテナの実行を行う。
4. VM起動時に Dockerコンテナ が自動起動するように設定する。

# 解説
#### 1. Azure Portal で CentOS の Virtual Machines を作成する。
Azure PortalよりVMを作成します。詳細な手順については割愛します。
管理接続用にSSH、Splashへのアクセス用にHTTPをNSGで許可するようにしておきます。

また、アクセス時の利便性を考慮して DNS名 を設定しておくと良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353069/9c5d26b6-cc22-5b7d-57b2-f420464049bc.png)


VMログイン用にSSHキーを設定する場合は、公式ドキュメントにも記載がありますので、参考にしました。
Git for Windowsを利用している方は Git Bash より作成が可能です。 
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/ssh-from-windows

#### 2. CentOS にて Dockerサービスの設定を行う。
下記、記事を参考にさせていただきました。
https://qiita.com/ymasaoka/items/b6c3ffea060bcd237478

```sh
sudo yum update
sudo yum upgrade

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io

sudo systemctl start docker
sudo systemctl enable docker
```

#### 3. Dockerイメージの取得、及びコンテナの実行を行う。
公式の手順を参考に実施します。

```sh
sudo docker pull scrapinghub/splash
sudo docker run -it -p 80:8050 scrapinghub/splash
```

ブラウザにて VM の URL に http でアクセスすると動作が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353069/86a4612a-84fc-e750-b0dc-9f6f35623325.png)

#### 4. VM起動時に Dockerコンテナ が自動起動するように設定する。
このままでも検証は出来ますが、利便性を考慮して追加の設定を行います。
VM起動時に Dockerコンテナ が自動起動するように設定します。
下記、記事を参考にさせていただきました。
https://qiita.com/tukiyo3/items/928d1902db6372e491c2

```sh:/etc/systemd/system/docker1.service
[Unit]
Description=docker1
After=docker.service
Requires=docker.service

[Service]
ExecStart=/usr/bin/docker start xxxxxxxxxxxx
#コンテナIDは予め docker ps で調べておく

[Install]
WantedBy=multi-user.target
```

また、dockerコマンドをsudo不要にしておきます。
下記、記事を参考にさせていただきました。
https://qiita.com/DQNEO/items/da5df074c48b012152ee

```sh
sudo gpasswd -a $USER docker
sudo systemctl restart docker
```
最小全域木

重み付き無向グラフが与えられた時それらの全ての頂点を結ぶような木の最小のコストを求める問題です。
主なアルゴリズムには、プリム法とクラスカル法がありますが、計算量は共にO(ElogV)で等しいです。色々調べたところ、基本はクラスカル法を使うのがよさげです。
#クラスカル法
クラスカル法は以下のように貪欲に最小全域木を求めます。
まだ用いていない最小のコストの辺をそれを付け加えることで、閉路が生じない限り、付け加えていく。
これで正しく最小全域木が求められる証明は蟻本を読みましょう。
閉路が生じる＝その辺で結ばれる二つの頂点がすでに連結であることを確かめるのにUnionFindを用いればO(Elogv)で求めることができます。

```python
V, E = map(int, input().split())
edges = []
for i in range(E):
    s, t, w = map(int, input().split())
    edges.append((w, s-1, t-1))
edges.sort()

def kruskal(n, edges):#edges: wでソート済み
    U = UnionFind(n)
    res = 0
    for e in edges:
        w, s, t = e
        if not U.same(s, t):
            res+=w
            U.unite(s, t)
    return res
print(kruskal(V, edges))

```
[verify用問題](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_2_A&lang=jp)
wagtailでJSをいじるときに注意すべきポイント！

#wagtailでJSをいじるときに詰まったのでメモ
##目次
- wagtailでjs,cssを使う方法
- wagtailでjsを書いたが、うまく実行できない。
- jsやcssは読み込む順番が大事

##wagtailでjs,cssを使う方法
[この動画](https://learnwagtail.com/tutorials/adding-custom-css-and-javascript-to-your-wagtail-admin-area/)でかなりわかりやすく説明されていますがざっくりまとめると

− hooks.pyに

```py
hooks.register("キーワード(注意1)")
def 行いたい処理
```
↓こんな感じ

```py:例
@hooks.register("insert_global_admin_js", order=100)
def global_admin_js():
    return format_html(
        '<script src="{}"></script>',
        static("js/review/custom.js"),
    )
```
というふうに記述する。(公式ドキュメントによると、wagtailはロードのときにすべてのhooksを監視するそうなので、どこのhooks.pyに書いても実行できる。多分)

- 上の行いたい処理のところで、jsのファイルパスを含んだscriptタグをreturnする
- そのjsのファイルにガッツリ処理を書いていく

っていう感じ

##ってやったけど、jsがうまくうごかねぇ！

そうなんですよ。僕の書いた処理は、jsでDOMをいじる感じのだったのですが、なぜかDOMの変更がきかない。。
なんでだよぉってめっちゃなりました。

## jsとCSSは読み込む順番がめっちゃ大事。

当たり前なんですが、こういうフレームワークとか、ブラックボックス化してるところあるとわからなくなるんですよね。

wagtail内では、組み込みのJSとCSSがもとから入っています。

そして今回ボクがやろうとしていたのは、そのデフォルトのJSやCSSが気に入らん部分を直すことなんですね。

でも、読み込む順番がデフォルトのコードの方が後に来ていた場合、たとえ処理を上書きしたと思っていても、うまく行かないんですね(;_;)

なので先程のキーワードの部分には、実は引数として、orderというものがあるのです！
そしてこれを100にしておけば、最後に読み込んでくれるので、思い通りのDOM操作ができるということです！
やった！

###注1
hooks.registerの引数のキーワードは[公式ドキュメント](https://docs.wagtail.io/en/v2.6.1/reference/hooks.html#admin-modules)をご覧ください！色々種類があってできることも違います！
Pipfileに本番環境でのみ使うライブラリを指定する

Pipfileでは**本番環境のみインストールするライブラリ**を指定することができません。（Gemfileでいうところの`group: production`が存在しません。）

```ruby
./Gemfile

#全環境共通
gem 'rails',        '5.1.6'
~
gem 'jbuilder',     '2.7.0'

#開発、テスト環境
group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
end

#開発のみ
group :development do
  gem 'web-console',           '3.5.1'
  ~
end

#本番のみ
group :production do
  gem 'pg', '0.20.0'
end
```

```python
./Pipfile

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[requires]
python_version = "3.7"

#全環境共通
[packages]
psycopg2-binary = "*"
gunicorn = "*"
django-heroku = "*"
django = "*"

#開発のみ
[dev-packages]
~

#本番のみ...はない!!
```

`[dev-package]`があるのだから`[prod-package]`があるものだと思っていたけどそうでもないみたいです。gunicornなどは本番でしか使わないので、開発環境ではインストールしたくないです。

Pipfileではなく、pipとrequirements.txtを用いることで分割することもできます([参考記事](https://qiita.com/key/items/3684ec013c9798c0f02c))。ですがPipenvの他の機能（仮想環境構築など)も捨てがたいので、なんとかしてPipfileの記述だけで本番と開発を分けられないか調べました。

# 方法
`platform_release`を用いて以下の記述を追記することで、そのライブラリを本番でのみインストールするように指定できます。

```python
"本番のみライブラリ" = {version="*", platform_release ="=='本番platformのリリース情報'"}
```

`本番platformのリリース情報`は、本番環境のコンソールで`platform.release()`を叩けば返ります。herokuの場合は、

```shell
$ heroku run python manage.py shell
Running python manage.py shell on ⬢ sheltered-shelf-12071... up, run.2441 (Free)
Python 3.7.3 (default, Apr  3 2019, 21:35:17) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import platform;platform.release()
'4.4.0-xxxx-aws'
```
`'4.4.0-xxxx-aws'`が本番platformのリリース情報です。これを元にPipfileを書き換えます。

```python
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[requires]
python_version = "3.7"

[packages]
psycopg2-binary = {version="*", platform_release ="=='4.4.0-xxxx-aws'"} #本番のみ
gunicorn = {version="*", platform_release ="=='4.4.0-xxxx-aws'"} #本番のみ
django-heroku = "*"
django = "*"

[dev-packages]
```

この状態で、ローカル(開発環境)で`pipenv install`をすると、`platform_release`に本番プラットフォーム情報を指定したライブラリに関しては無視されます。

```shell

$ pipenv install
Installing dependencies from Pipfile.lock (38deab)
Ignoring gunicorn: markers 'platform_release == "4.4.0-xxxx-aws"' dont match your environment
Looking in indexes: https://pypi.python.org/simple
Ignoring psycopg2-binary: markers 'platform_release == "4.4.0-xxxx-aws"' dont match your environment
Looking in indexes: https://pypi.python.org/simple
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 9/9 — 00:00:01
```

やや強引な感じもしますが、このようにして本番環境でのみ使うライブラリを指定することができました。

他にうまいやり方をご存知の方がいらっしゃいましたらコメントなどで教えていただけると幸いです。

# 参考URL
[Production-only dependencies #335](https://github.com/pypa/pipenv/issues/335)
Nuxt.js で title タグや meta タグを設定する

Nuxt.js で title タグや meta タグを設定するには2つの方法がある。

1. nuxt.config.js の head プロパティ
2. pages 配下のページコンポーネントの head メソッド

## 1. nuxt.config.js の head プロパティ

https://ja.nuxtjs.org/api/configuration-head/

サンプル

```nuxt.config.js
export default {
  head: {
    title: 'title',
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: 'description' }
    ]
  }
}
```

出力結果

```html
<head>
  <title data-n-head="true">title</title>
  <meta data-n-head="true" charset="utf-8"/>
  <meta data-n-head="true" name="viewport" content="width=device-width, initial-scale=1"/>
  <meta data-n-head="true" data-hid="description" name="description" content="description"/>
</head>
```

- charset や viewport など、アプリケーション全体で共通のものを設定するとよい
- title タグや description も念の為設定しておくとよい（ページコンポーネントで設定し忘れた場合、デフォルト値として働くため）

## 2. pages 配下のページコンポーネントの head メソッド

https://ja.nuxtjs.org/api/pages-head/

サンプル

```pages/index.vue
<template>
  <h1>{{ title }}</h1>
</template>

<script>
export default {
  data () {
    return {
      title: 'Hello, World!'
    }
  },
  head () {
    return {
      title: this.title,
      meta: [
        { hid: 'description', name: 'description', content: 'description' }
      ]
    }
  }
}
</script>
```

出力結果

```html
<head>
  <title data-n-head="true">Hello, world!</title>
  <meta data-n-head="true" data-hid="description" name="description" content="description"/>
</head>
...
```

- サンプルのようにコンポーネントのデータを使うことができる
- title や description など、ページ固有のものを設定する（SEO対策）
[備忘録]windowsにgoの開発環境を構築する

## 何の記事か
Goの開発環境を作るのに地味に手間取ったので、自分が使いやすい環境を作る時のメモ。
他のWindows環境でGoの開発環境を作る時の手控えです。

+ 私が使いやすい環境を作成する手順しか書いていませんので、だいぶ偏りがあります。
+ 使いやすいと思う環境が変われば記事も変更します。
+ Go言語については初心者なので間違った内容が含まれている可能性があります。
+ 開発とかビジネスに使うのであれば下記などを参考に依存関係を分離できるように設定したほうがいいと思います。  
https://qiita.com/spiegel-im-spiegel/items/c140fc1fe02aa24be4fd

## 手順

1. Goをインストールする
2. GOPATHを設定しなおす
3. %PATH%にGOPATHを追加する
4. よく使うpackage

### 1.Goをインストールする
Goをインストールしないと始まらない
インストール方法はいろいろあるけど、インストーラ(.msiファイル)を使ってインストールする。
学習用なので、デフォルトの"C:\Go"に入れてしまおうと思う。
ポチポチするだけなので、詳細手順は割愛。

[公式サイト]
https://golang.org/dl/

無事installできたかは、下記コマンドで確認する

```
go version
```

こんな感じで表示されればOK

```
go version go1.12.9 windows/amd64
```

### 2.GOPATHを設定しなおす
作業ディレクトリを環境変数"GOPATH"に設定する。
後で変更するのはめんどくさいので、作業する場所をちゃんと考えて設定すること。  

ちなみに、GOPATHを設定しなおした後はプロンプトを再起動しないと反映されません。
気づかずうっかりgetしたり、作業すると、いつの間にか動かなくなった！前は大丈夫だったのに、突然ビルドエラーが発生した！とか、逆に、なんかわからんけどうまくいった！とかいう事象が起きます。  

GOPATH配下にできるフォルダをざっくり説明。

+ bin  
	installしたパッケージが含まれる  
+ pkg  
	buildしたパッケージオブジェクトができる場所。build時に自動生成される。中間生成物の置き場。getコマンドを使うと自動で生成されたりする。  
+ src   
	ソースの置き場。自分で作るソースをここにおく。getコマンドでとってきたソースもここに置かれる。getコマンドを使うと自動で生成されたりする。

詳しくは下記コマンドを打つと説明が見れる  

```
go help gopath
```

### 3.環境変数PATHに%GOPATH%\binを入れておく
作ったり、installした実行ファイルを叩けるように、%GOPATH%\binをPATHに追加しておく。

### 4.よく使うpackage
個人的によく使うpackageをコピペ用に列記しておく。

```
go get golang.org/x/net/html
go get golang.org/x/net/websocket
go get golang.org/x/text/encoding
go get github.com/urfave/cli
```

## 参考サイト
https://gabekore.org/golang-install
ログ結果出力ページ作成

機能一覧
‐ 共通メニュー作成機能
‐ テーブル作成機能
‐ ログのダウンロード機能
‐ ログの削除機能
‐ ページング機能

# 共通メニュー作成


# テーブル作成
## エックスサーバーのデータベース接続
≪.iniファイルからの情報取得≫
`$ini = parse_ini_file('./db.ini', FALSE);`

≪イニシャルファイルへの記載情報≫
`[dbinfo]
host = サーバー情報
dbname = データベース情報
dbusr = データベースユーザー情報
dbpass = データベースパスワード`

≪DB接続≫
`try { 
$db = new PDO('mysql:host='.$ini['host'].';
dbname='.$ini['dbname'].';
charset=utf8', $ini['dbusr'], $ini['dbpass']);
} 
catch(PDOException $e) {
die('エラーメッセージ：'.$e->getMessage());
}`

≪≫
C#でIEを立ち上げてGoogle検索をさせてみた


注意：将来的にgoogleのhtmlソースが変わったら動かなくなります。

```csharp
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;


class IeSample
{
    const int READYSTATE_COMPLETE = 4;
    
    static void GoogleSearchWithIE(string keyword)
    {
        Type comType = Type.GetTypeFromProgID("InternetExplorer.Application");
        dynamic ie = Activator.CreateInstance(comType);
        
        try {
            ie.Navigate("https://www.google.com/");
            
            while ( ie.Busy || ie.ReadyState < READYSTATE_COMPLETE ) {
                Thread.Sleep(50);
            }

            ie.Visible = true;

            dynamic html = ie.Document;
            
            dynamic t = html.getElementsByTagName("input");
            
            try {
                // Dump(t);
                
                if ( t["q"] == null ) {
                    Console.WriteLine("cannot find target element.");
                }
                else {
                    t["q"].Value = keyword;
                
                    dynamic form = html.forms("tsf");
                    if ( form == null ) {
                        Console.WriteLine("cannot find target form.");
                    }
                    else {
                        try {
                            form.submit();
                        }
                        finally {
                            Marshal.ReleaseComObject(form);
                        }
                    }
                }
            }
            finally {
                Marshal.ReleaseComObject(t);
            }
        }
        finally {
            Marshal.ReleaseComObject(ie);
        }
    }
    
    static void Dump(dynamic t)
    {
        for ( int i=0 ; i<t.Length ; i++ ) {
            Console.WriteLine("----");
            Console.WriteLine(t[i].Name??"");
            Console.WriteLine(t[i].Type??"");
            Console.WriteLine(t[i].Value??"");
        }
    }
    
    [STAThread]
    static void Main()
    {
        GoogleSearchWithIE("qiita");
    }
}

```


# Googleのhtml抜粋
name="q"のinputタグが、検索ワードを入力するボックスで、
id="tsf"のformタグが、検索ボタンをもっています。

```html
<form class="tsf nj" action="/search" style="overflow:visible" id="tsf" method="GET" name="f" onsubmit="return q.value!=''" role="search">...
<input class="gLFyf gsfi" maxlength="2048" name="q" type="text" ...>
```
AlfredのWorkflowsでScrapbox用リンクを簡単につくる

# 前提
Powerpackが必要です。
# やり方
#### 設定
まず、下記のWorkflowsを導入します。
[Copy URL | Packal](http://www.packal.org/workflow/copy-url)

次に、`~/Library/Application Support/Alfred/Workflow Data/com.fallroot.copyurl`の中にある`config.json`を下記のように編集します。


```json
[
  {
    "format": "[${title} ${url}]",
    "title": "Scrapbox"
  }
]
```

※ハマりポイント、`config.json`の場所
`config.json`が複数あったり、ライブラリが隠しフォルダだったりで探すのがめんどくさいです。
Alfredの検索窓に`~/Library/Application Support/Alfred/Workflow Data/com.fallroot.copyurl`をそのままコピペでアクセスできるはずなのでそうしましょう。



#### 使う方法
![](https://media.giphy.com/media/gjUSLKj9525SlTc1ha/giphy.gif)

コピーしたいWebページを開く
Alfredの検索窓に`url`と打ち込む
`Scrapbox`をEnterするとクリップボードにコピーされる
Scrapboxに移動してペーストする

以上!!


# その他
Alfredのclipboard機能を使えば、複数ページのリンクをコピーしておいて、Scrapboxに一気にバシバシとペーストすることもできますね。
[Memo]右クリックメニュー(コンテキストメニュー)に、秀丸エディタ/サクラエディタのgrepを実行するメニューを追加する

ディレクトリーに対してgrepすることが多い場合、右クリックメニュー(コンテキストメニュー)にメニューがあると便利です。
[SendTo(送る)]にショートカットを追加しても同じことができますが、右クリックメニュー(コンテキストメニュー)に追加すると、

- 呼び出しやすい(メニュー階層が深くならない)
- ディレクトリーにだけ表示される

というメリットがあります。

# 追加するための設定(レジストリ)

__インストールパスは、各々の環境に合わせて書き換えてください。__

## サクラエディタの場合
```reg:sakura_grep_menu.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\sakura_grep]
@="サクラエディタでGREP"

[HKEY_CLASSES_ROOT\Directory\shell\sakura_grep\command]
@="\"C:\\Program Files (x86)\\sakura\\sakura.exe\" -GREPMODE -GREPDLG -GOPT=LSP -GCODE=99 -GFOLDER=\"%1\""
```

### grepに関するコマンドラインプション

http://sakura-editor.sourceforge.net/htmlhelp/HLP000109.html

| Grepに関するオプション |                                                                     |                                                 |
| ---------------------- | ------------------------------------------------------------------- | ----------------------------------------------- |
| -GREPMODE              | Grep実行モードで起動                                                |
| -GKEY=                 | Grepの検索文字列                                                    | "'で囲む。条件中の'"'は二つの連続した'"'にする  |
| -GFILE=                | Grepの検索対象のファイル                                            | '"'で囲む。条件中の'"'は二つの連続した'"'にする |
| -GFOLDER=              | Grepの検索対象のフォルダ                                            | '"'で囲む。条件中の'"'は二つの連続した'"'にする |
| -GREPDLG               | サクラエディタが起動すると同時にGrepダイアログを表示します。        |                                                 |
| -GCODE=                | Grepでの文字コードを指定します。-CODEと同じように数字で指定します。 | 99=自動判別                                     |
| -GOPT=	Grepの検索条件  | [S][L][R][P][W][1&#108;2][K]                                        |

| -GOPTのオプション |                                                                      |
| ----------------- | -------------------------------------------------------------------- |
| S                 | サブフォルダからも検索                                               |
| L                 | 大文字と小文字を区別                                                 |
| R                 | 正規表現                                                             |
| P                 | 該当行を出力／未指定時は該当部分だけ出力                             |
| W                 | 単語単位で探す                                                       |
| 1 &#108; 2        | 結果出力形式。1か2のどちらかを指定します。(1=ノーマル、2=ファイル毎) |

## 秀丸エディタの場合
```reg:hidemaru_grep_menu.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\hidemaru_grep]
@="秀丸エディタでGREP"

[HKEY_CLASSES_ROOT\Directory\shell\hidemaru_grep\command]
@="\"C:\\Program Files (x86)\\Hidemaru\\Hidemaru.exe\" /d\"%1\"" /gcu
```
### 秀丸エディタ起動時のオプション

https://help.maruo.co.jp/hidemaru/html/230_Option.html

|                            | 有効 | 無効 |
| -------------------------- | ---- | ---- |
| 大文字／小文字の区別       | c    | C    |
| 単語の検索                 | w    | W    |
| 正規表現                   | r    | R    |
| あいまい検索               | z    | Z    |
| サブフォルダも検索         | u    | U    |
| ファイル名一覧だけ作成     | o    | O    |
| ファイル名をフルパスで出力 | f    | F    |
| 最小化状態で実行           | m    | M    |
【RubyonRails入門】Gemfileを用いてBootostrapを導入する方法

RailsにBootostrapを導入方法は、二つあります。

【方法1】HTMLにbootstrapのURLを追加する：__★非推奨__
【方法2】Gemfileに追加する：__★★★推奨__

今回は 『【方法2】Gemfileに追加する方法』 を記載します。

##1. Gemfileに下記のパッケージを追加する

```ruby:Gemfile
gem "sass-rails", "~>5.0"
gem "bootstrap-sass", "~>3.3.6"
gem "jquery-rails"
gem "jquery-ui-rails"
```

##2.bundle updateする
`Gemfile`に追加があった場合に、パッケージたちをアップデートする

```
$ bundle update
Bundle updated!
```

※ 今はパッケージが入っただけなので、「CSSとJavaScriptを使用する」ことを別のファイルに書く必要がある。


##3.ファイルの読み込み
###3-1. `.css`ファイルを、`.scss`に書き換える
`application.css` => `application.scss`に書き換えます。

###3-2. `application.scss`に読み込み

```ruby:assets/stylesheets/application.scss
 @import "bootstrap-sprockets";
 @import "bootstrap";
```


####3-3. `application.js`に読み込み

```js:assets/javascripts/application.js

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
// vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require jquery  <=これを追加
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .
//= require bootstrap-sprockets <=これを追加

```
`//=` => これはいろんなファイルを読み込んでいます。
【Ruby on Rails】ActiveRecordのexists?の逆はempty?を使う

# 概要

ActiveRecordで条件に一致するデータが存在するかどうかを調べたいときは、exists?を使います。

```ruby
User.where(name: "太郎").exists?
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE "users"."name" = ? LIMIT ?  [["name", "太郎"], ["LIMIT", 1]]
=> true
```

その逆で、条件に一致するデータが存在しないことを調べたい際は先頭にnot演算子を付けるケースをよく見かけます。

```ruby
!User.where(name: "太郎").exists?
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE "users"."name" = ? LIMIT ?  [["name", "太郎"], ["LIMIT", 1]]
=> false
```

しかし、わざわざnot演算子を付けるのはなんかカッコ悪い感じがしますよね。

# 解決策

ActiveRecord::Relationには、レコードが0件の際にtrueを返すempty?というメソッドがあります。
実際にempty?を使って先ほどの実装を書き直してみました。

```ruby
User.where(name: "太郎").empty?
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE "users"."name" = ? LIMIT ?  [["name", "太郎"], ["LIMIT", 1]]
=> false
```

これなら`!exists?`のようにnot演算子を書かなくて良いので、スッキリして見えますね！
xamppがうまく動作しなくなったが、試行錯誤の末、単純な理由で解決することができた。

# xamppが起動できなくなった
xamppを単体で入れてApacheとmysqlを使っていたが、再起動をするとその二つが起動できなくなるという状態が続いていた。

## やったこと
他の方が書いたQiitaの記事や、その他たくさんの記事を読み、ポートが衝突しているとかSkypeが原因だとか書いてあることは一通り試したが改善せず。

## 不具合の原因
あることをすることで簡単に改善することができた。
xamppは単体でダウンロードをするほかに、Eclipseをダウンロードする際にくっついてくる。
Eclipseにくっついてくることを知らずに、単体でxamppをインストールしていたことが原因だった。

windowsマークの横の検索からxamppを検索していたのだが、そのパスの先はEclipseのほうに繋がっていた。
それに気づかず常に単体のxamppとEclipseのxamppを起動した状態になっていた。
これが不具合の原因になっている。

## 解決方法
Eclipseのほうのxamppを削除することによって、単体で入れたxamppが無事正常に動作することができた。

## まとめ
xamppのapachaやmysqlが起動しなくなったらPCの中にxamppが複数あるかどうか確認してほしい。
もし、あったならそれが原因でうまく動作しない場合があるため、使っていないxamppは削除したほうが良い