OmniAICreator/Qiita-1.07M huggingface dataset:
PropertyExpression が見当たらない

# 結論
System.Linq.Expressions.MemberExpression を代わりに使え

# 事案
Html.DisplayNameFor()的なものを自作しようとしたけど、キャストしようにも `System.Linq.Expressions.PropertyExpression` がいなかった

# 調査
https://social.msdn.microsoft.com/Forums/en-US/ab528f6a-a60e-4af6-bf31-d58e3f373356/resolving-propertyexpressions-and-fieldexpressions-in-a-custom-linq-provider?forum=linqprojectgeneral

internalクラスらしい

# やってみた

```C#
        public string Hoge<T>(Expression<Func<Fuga,T>> expression)
        {
            var member = (expression.Body as MemberExpression).Member;
            return null;
        }
```
これでexpressionにpropertyアクセスを渡せばいろいろいじれるお
深層学習（前編 2）：「Section2 : 学習率最適化手法」

勾配降下法で使用する学習率において、値が大きい場合、最適値にたどり着かず（最適値の勾配を飛び越えてしまう）発散してしまう、逆に小さすぎる場合は、発散することはないが、収束までに時間がかかり、また大域局所最適値に収束しづらくなる。学習率を最適化するために学習率最適化手法を利用する。学習率最適化手法にはモメンタム、AdaGrad、RMSProp、Adamという手法がある。
composer.lockとcomposer.jsonの違い。composer installとcomposer updateの使い方

## composerとは
必要なライブラリを管理できるパッケージ管理システムのこと

## composer.jsonとは
依存するライブラリの定義を記述するファイル

- ```composer install```を実行する際にはこのjsonファイルの定義を元にパッケージのダウンロードを行う
- パッケージのダウンロードの際にcomposer.lockファイルが存在しない場合はダウンロードしたバージョン情報をlockファイルに書き出される

## composer.lockとは
- ```composer install```を実行した際にこのlockファイルに書き出されているVersionのパッケージをダウンロードする
- lockファイルにはバージョン情報のハッシュ値が書き出されている
- これによりlockファイルを基準にすることでチーム開発において全員が同じバージョンのライブラリを使用できる

## まとめ
要約すると
### composer.lockは
```composer install```でlockに書き出されて各バージョンのライブラリをダウンロードする
### composer.jsonは
```composer update```でjsonの定義を元に各バージョンのライブラリををアップデートする
updateの際はcomposer.lockファイルのハッシュ値も更新される
[JS]クリックしたらメソッドが発火するだけのサンプル

# いきなり結論サンプル
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="riotam4" data-slug-hash="EBEpZz" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="生JSでクリックイベント">
  <span>See the Pen <a href="https://codepen.io/riotam4/pen/EBEpZz/">
  生JSでクリックイベント</a> by riotam (<a href="https://codepen.io/riotam4">@riotam4</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 解説
ボタンタグに`id='onClick'`を仕込み、`let clickEve = document.getElementById('onClick');`ここで、clickEve変数に読み込ませる。
さらに、

```javascript
clickEve.onclick = function(){
  alert('ほげ');
};
```
ここで、`onclick`メソッドに、処理させたいものを仕込みます。ここではalertしているだけですが…


簡単ですが、サンプルの共有ということで、今日は以上です。
最後までありがとうございました。
【不確かな比】を目的変数に取る線形回帰

業務でやりたいなーと思ったことをできる方法が見つけられなかったので自分で考えました。
そんなに珍しい対象でも、方法論として最新でもなんでもないので、「それこんな名前が付いてるよ」とか「こんな解き方がメジャーだよ」いった情報があれば教えて頂けると助かります。

# 問題設定
簡単に言うと、目的変数は、〇〇ratio系です。

説明変数xから目的変数yを求めるような問題を回帰というわけですが、今回は目的変数が、「$N$回コインを投げた際、$k$回表が出た」といった結果が渡されます。
コインは複数種類あり、どのコインを渡されたかは、説明変数$x$に依存して決まることがわかっています。
また、各コインを投げる回数は$x$に依存しないものとします。
試行回数が多いコインは信頼できるけど、試行回数が少ないコインは信頼できません。

さて、いずれのコインも無限回振れば、真の確率pは得られるわけですが、今回のケースではそうはいきません。
対処法の一つは、十分大きい回数のサンプルだけを残して回帰することです。

では、十分大きい回数のサンプルが少ないといった状況で、サンプルをできるだけ無駄にしないで、良い（と思える）回帰ができるでしょうか。
今回は、一番簡単なケースで、真の確率pが説明変数xに比例する（$p = wx$,  $x>0$）ケースを考えてみます。
面倒なので、値域の話は考えないことにしましょう。（アルゴリズムでフォローします。）

# 定式化
## 定義
観測データは、

```math
(X,Y)=(x_n,y_n)_{n=1}^{N}\\
x_n \in R^+\\
y_n = (y_{n+}, y_{n-})\\
y_{n+}, y_{n-} \in Z\\
N_n = y_{n+}+y_{n-}
```

## 確率モデル
表の確率$p_n=wx_n$でのコインを$N_n$回試行して$y_{n+}$回表が出たサンプルの生成確率（尤度）は二項分布で表すことができ、

```math
p(y|w;x)\equiv Binom(y_+;N, wx)\\
=\left(\begin{matrix}N\\y_+\end{matrix}\right)(wx)^{y_+}(1-wx)^{y_-}\\
p(Y|w;X)=\prod_n p(y_n|w,x_n)
```
となります。最尤推定の場合、上記をwについて最大化すれば良いですね。


## 最尤推定

```math
\ln p(Y|w,X) = \sum_n y_{n+}\ln w+y_{n-}\ln(1-wx)+const.\\
\frac{\partial}{\partial w}\ln p(Y|w,X)
= \sum_n \frac{y_{n+}}{w}-\frac{y_{n-}x_n}{1-wx_n}\\
\frac{\partial^2}{\partial w\partial w}\ln p(Y|w,X)
= \sum_n -\frac{y_{n+}}{w^2}-\frac{y_{n-}x_n^2}{(1-wx_n)^2}< 0
```
二次の勾配が負なので、凸最適化になることが証明できました。
パラメータ一つなので、二分法でも使いましょう。

ここで、一つ注意したいのが、wの取り得る範囲です。
定義から、$1 - wx_n$は全ての$n$について正でなくてはいけないので、$w<1/x_n$となるように最大値を決めます。（0になると発散してしまうので注意が必要です。）

## 実装

```py

def binom_regression(yp, yn, x):
  if yp.sum() + yn.sum() == 0:
    return 0, 0 * x
  def binom_grad(w):
    return sum(yp) / w - (yn * x / (1 - w * x)).sum()
  
  min_w = 1e-5
  min_grad = binom_grad(min_w)
  if min_grad <= 0:
    return 0, 0 * x
  max_w = (1 - 1e-5) / x.max()
  max_grad = binom_grad(max_w)
  if max_grad >= 0:
    return max_w, max_w * x
    
  c = 0
  while (max_w - min_w > 1e-5) & (c < 100):
    mid_w = (max_w + min_w) / 2
    mid_grad = binom_grad(mid_w)
    if mid_grad > 0:
      min_w, min_grad = mid_w, mid_grad
    else:
      max_w, max_grad = mid_w, mid_grad
    c += 1
  
  return mid_w, mid_w * x
```

## 数値実験（をやりたい）

いつかやります

# 解釈

今回定義した確率モデルで意図したかったことは、信頼度が高い（$N$が大きい）サンプルはなるべく正確に、信頼度が低い（$N$が小さい）サンプルはざっくりと再現するような挙動です。
$N$が大きいサンプルでは、最頻値$pN$に大きな確率を割り振るため、$k=pN$となるような$p=wx$を取りやすくなります。$N$が小さいサンプルでは、比較的なだらかな分布になるため、多少外しても構わないような形になります。

イメージとしては、各サンプルが持つ分布の分散に反比例する重みを付与したガウス回帰のような挙動になること思います。ただし、上振れと下振れに対する感度が変わり得るといったところでしょうか。

# まとめ

各サンプルが二項変数の場合の確率モデルとその最尤推定法を定義しました。

今回は一番シンプルな形で定義しましたが、例えば$p=wx$の部分をシグモイド関数にすると、もう少し自由度の高いモデルになると思います。（単調増加関数なので、凸性も失われません。）
また、$x$側にも同様に二項変数を使ったモデルもできそうな気がします。$x$が確率変数になって未知パラメータ数がサンプル数を上回るので、追加の仮定や正則化の導入が必須になりそうです。

同じようなモデルやライブラリが見つからなかったので自分で作りましたが、どこかにあるんじゃないかと思っています。
深層学習（前編 2）：「Section1 : 勾配消失問題」

通常、勾配降下法よるパラメータ更新に伴い、誤差が減少して収束していくことが求められるが、勾配降下法による更新では下位層のパラメータ更新はほとんど行われず最適値に収束しなくなる問題を勾配消失問題と呼ぶ。
これを回避する方法として、①活性化関数、②初期値設定、③パッチ正規化がある。
①活性化関数：Relu関数を使用する。
②初期値設定：Xavier/Heを使用した初期値設定
③バッチ正規化：ミニバッチ単位で入力値のデータの偏りを抑制する
個人開発で役立ったフロント開発のTips

個人開発として、友人と[Owntime](https://owntime.io/about)というサービスを開発しています。

友人も僕も仕事では、バックエンドを触ることが多くて、フロント側を実装するのに苦労していました。

そこで、普段バックエンド側をメインで開発しているエンジニアの方々が、個人開発でフロント側も触ることになった際に役立つだろうTipsを紹介します。

## 対象
- 普段フロント側を触る機会が少なくて、興味がある方
- エンジニアになりたてで、広く知識を増やしたい方
- 個人開発でとりあえずフロント側だけでも綺麗に作りたい方

## html要素の配置
htmlの要素の配置を一から考えて、それ通りに実装するのは、かなり負担が大きいです。
なので、かなり有名なフレームワークである[bootstrap4](https://getbootstrap.com/)を使わない理由はありません！

bootstrapに定義されている機能の中で、今回は厳選して2つ紹介します。

### グリッド

>強力なモバイル・ファーストのFlexboxグリッドを使用して、12の列システム、5つのデフォルトレスポンス層、Sass変数とmixin、および数十の定義済みクラスのおかげで、すべての図形とサイズのレイアウトを作成可能。

[公式ページ](https://cccabinet.jpn.org/bootstrap4/layout/grid)に使い方の解説が詳しく書いてあるので、実装する際は、そちらをみてください！

ざっくり説明すると、デバイスの画面の大きさごとに、html要素の横幅を決めることができるので、レスポンシブなデザインにすることができます。

[![Image from Gyazo](https://i.gyazo.com/7328dba5285ef2086588c697dcf4d420.gif)](https://gyazo.com/7328dba5285ef2086588c697dcf4d420)

### ナビゲーションバー
どのサービスにも使いたい要素の一つであるナビゲーションバーも、もちろんbootstrapにあります！

> Bootstrapの強力でレスポンシブなナビゲーションヘッダ、navbarのドキュメントと例。折り畳みプラグインのサポートを含む、ブランド、ナビゲーションなどのサポートも含む

こちらも実際に実装する際は、[公式ページ](https://cccabinet.jpn.org/bootstrap4/components/navbar)を見てください。

topggleの機能もあり、画面の小さいスマホでも、見やすいナビゲーションバーを作ることができます。

[![Image from Gyazo](https://i.gyazo.com/6de009bebf618bae2b9c5ea2db0b6ab2.gif)](https://gyazo.com/6de009bebf618bae2b9c5ea2db0b6ab2)

## アイコン画像
アイコン画像は、サービスを作ると必要になるものの一つです。
[Owntime](https://owntime.io/about)内で使っているアイコンは、[ICOOON MONO](http://icooon-mono.com/about-icoon-mono/)からいただいている画像が多いです。

ICOOON MONOの良い点は、
- 商用利用可能
- 全ての画像が無料
- 画像の色が変更可能

特に気に入っている理由が、3つ目にあげた「画像の色が変更可能」です。
RGBのコードを入力して、色を変更することができます。
なので、アプリで使っている色と相性の良い色で画像をダウンロードできて、CSSで色の指定をする必要がありません。

[![Image from Gyazo](https://i.gyazo.com/3c701620e5f65d6674469056f93c8ddc.gif)](https://gyazo.com/3c701620e5f65d6674469056f93c8ddc)

## 色
普段、バックエンドを触っているエンジニアにとって、サービス内の色選びは、あまり馴染みがないかもしれません。
けれども、色の組み合わせで、サービスの印象は、大きく異なるので、人を引き付けるような色使いをしたいですよね。

ただ、デザイナーではない人は、 **「色の組み合わせはセンス」** と思っている方も多いと思いあます。
しかし、色選びも知識をつければ、ある程度まとまりのある組み合わせを見つけることができます。

ということで、Owntimeで色を使うときに参考にしている資料を3つ紹介します。

- [esaのデザインの話 - 自分たちのWebサービスを作るデザイナーとしてやっていること / ](https://speakerdeck.com/ken_c_lo/design-talk-of-esa)
    - esaというユーザーフレンドリーな色使いをしているサービスのデザイナーさんが色選びについて、まとめているスライドです🐣
- [認知パターンから考えるesaらしさのデザイン / Thinking esa-like design](https://speakerdeck.com/ken_c_lo/thinking-esa-like-design)
    - 同じくesaのデザイナーさんのスライドで、「見た目」でサービスらしさを出すことをまとめているスライドです🐣
- [配色アイデア手帖 めくって見つける新しいデザインの本](https://www.amazon.co.jp/dp/4797393246/ref=cm_sw_r_tw_dp_U_x_jzAgDb5HNMF3P )
    - テーマごとに10色ずつ組み合わせが掲載されているので、いくつかの色を使う際は、とても便利です📙

[Owntime](https://owntime.io/about)の色使いもまだまだ発展途中なので、ご意見あれば、コメント欄にお願いします！

## まとめ
今回、紹介したTipsの中には、Javascriptに関することは、書きませんでした。後日、別の記事で、まとめたいと思います。

みなさんもフロントエンド側の役立つ知見を持っていると思います。ぜひ、コメント欄などで教えていただけると嬉しいです。

## おまけ
今回紹介したTipsを使って、友人と[Owntime](https://owntime.io/about)を開発しています。
毎日の時間の使い方を記録して、分析して、理想な時間の使い方に近づけるサポートをするサービスです。

ぜひ、一度使ってみてください！
Windowsユーザーでもsafariのデバッグがしたい、iPadで。

# 軽めのテストならplaywrightもおすすめ
https://zenn.dev/kagaya_22/articles/8e4569618f8e0b
このような感じでwindowwsでもsafariテストができる。
Nodeはポータブルにも構築できるので、バッチファイルを一度作ってしまえば比較的簡単に使いまわせるぞ。
どうしても実機でないと再現しない場合は以下記事内容を参照しよう。

#iPhoneやiPad、macのsafariで崩れるから直してほしいと言われます
おそらくsafari側の問題なんだと思います。でもこっちにはWindows機しかないです。
手元にかろうじてあるのは古いiPad。
iPadでお手軽にデバッグできないものかと試行錯誤して、やっとデバッグの道のりが見えたのでメモ。

# 用意するもの
- iPad (proなどでかい、早いほうがいい、iPhoneでも可)

どうしてもappleのデバイスは必要です。
Mac本体を買うよりは、イオシスとか中古屋で安いiPad買ったほうが早いです。
後述のアプリをインストールするだけで使えるので。
iPad Air以降じゃないと速度的に辛いと思います。

## iOS単体でのデバッグを可能としてくれるアプリ
Inspect Browser
https://apps.apple.com/app/apple-store/id1203594958

- メリット
   - basic認証かかってるサイトもOK
   - 更新も最近まで動いてる(2019/6確認)
   - iPhoneシミュ可
- デメリット
   - 有料アプリ
   - 実機インスペクターのみ、リモートデバッグはできない？


## iOS単体じゃないけどリモートデバッグを可能としてくれるアプリ
MIHTool Basic - Web Debugger 
https://apps.apple.com/us/app/mihtool/id584739126?ls=1

- メリット
   - chromeでのリモートデバッグ可能
   - 無料アプリ（広告なし、Pro版は寄付目的のみ？）
   - iPhoneシミュ可
- デメリット
   - basic認証かかってるサイトはNG、無反応になる
   - 更新が2018年で止まってる
   - 実機インスペクターが死んでる模様、リモートデバッグのみ？ httpsサイトがダメなのかもしれない

# 使い方
詳しく書いても導入動画にはかなわないので、ざっくりと。

## Inspect Browserの流れ
1. アプリでテスト対象サイトのURLを打ち込む
2. テストしたいデバイスを選んで画面サイズを変更する
3. 「タップして要素選択」的なボタンを押したあとサイトの要素をタップしてcssなどのデバッグをする。

## MIHTool Basicの流れ
1. アプリでテスト対象サイトのURLを打ち込む
2. iPhone表示をテストしたければ「emulate iPhone」的なボタンで画面サイズを変更する。
3. メニューの上の方にある、「サーバーを立てる」的なところに表示されているURLをWindowsのChromeで開く
4. ChromeとMIHtoolの両方を一応リロードして、Chrome側の画面の「Targets」に表示される文字列をクリックして緑色？に光らせる
5. 実機MIHtoolの表示を見ながら、Chromneの「elements」タブの要素をマウスオーバーしていくと、MIHTool側の表示が現在Chromeで選択している要素を光らせて教えてくれる
6. 要領を掴んだら、Chrome側の開発者ツールでインスペクトしてCSSを修正する

# 更新予定
いま時間ないのであとでSSとか付けるかも
[Vue]1つのv-onディレクティブに、複数のメソッドを仕込める件

# はじめに
今回、１つのv-onディレクティブで、2つ以上のメソッド発火をしたいと考え、公式で方法を探したのですが、うまく見つけられなかったので、共有しておきます。
# いきなり結論サンプル
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="riotam4" data-slug-hash="mZxjWO" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="ディレクティブで複数のメソッドをあてる">
  <span>See the Pen <a href="https://codepen.io/riotam4/pen/mZxjWO/">
  ディレクティブで複数のメソッドをあてる</a> by riotam (<a href="https://codepen.io/riotam4">@riotam4</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
# 解説
短いコードなので、全文を転記してます。

```vuejs:HTML側
<div id="app">
  <button @click='onClick1(); onClick2()'>クリックしてね</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
```

```javascript:JS側
  new Vue({
    el: "#app",
    methods: {
      onClick1() {
        alert('onClick1 を検知');
      },
      onClick2() {
        alert('onClick2 を検知');
      }
    }
  })
```
簡単なコードなので、詳細の解説は割愛しますが、ポイントだけ次で共有します。
## ポイント
ズバリ、HTML側の2行目にある、`@click='onClick1(); onClick2()'`です。
v-onディレクティブの後ろの`''`(または`""`)の中に、メソッド名を`;`で区切ると、両方のメソッドを呼び出せます。
# ちなみに
`;`ではなく`,`**でも同じ挙動を得られることがあります。**
しかし、コードによっては、なぜかうまく挙動してくれないことがあり、挙動してくれない条件がよくわからないので、使う際は十分にご注意ください。
（というか、`;`こっちを使っておく方が無難かと思います。）
# 注意点まとめ
 - 通常v-onでメソッドを指定する場合と違い、`()`が必要
 - `;`ではなく`,`でも同じ挙動を得られることがあるが、コードによっては、なぜかうまく挙動してくれないことがあった
 - `;`ではなくて、` (空文字)`を入れると、画面の描画自体がされなくなり、エラー等も確認できない状態になる
 - 
# さいごに
今日は短めですが、この辺で。
最後までありがとうございました。

# 追記
この記事のコメント欄で、@yd_nikuさんが非常にわかりやすく、完結に解説して下さっています。
ぜひそちらも参考にして頂けると、良いかと思います！
@yd_nikuさんありがとうございます！
phpの予習・復習

次の会社ではphpなのでまとめます。

#エディタ(windows)
vscodeでよさそう。プラグイン？とかはいろいろ入れるの大変そうだけど。

netbeansはApacheになってからいまいちな気がする。
　https://netbeans.apache.org/kb/docs/php/quickstart.html#_running_your_first_php_project
Version 5って何？php7は？eclipseはどうなんだろ？というかphp書くだけでJavaインストールしないといけないのはいまいち。
.net frameworkとか、VCのランタイムは入ってなくてもどうせ何かで必要になるし。

#php
ローカル環境はntsでいいはず

#バージョン切り替え
scoop？docker？VirtualBox？
それとも、win10のubuntuでうまいことできるのか？

# webサーバは？
開発はphpの組込みサーバがあったと思うので、それを使っておく
本番はnginxかapacheかはまだわかんないけど、自分が構築する必要はなさそうなので、考えないでおく

# DBは？
mysqlらしいですが、ローカル環境はもっと軽量なものがいいな。。。

#Composer
必要

# phpunitとか静的解析とかxdebugとか
入れなきゃ
kelpnetの作法 その5

# 概要

kelpnetの作法を調べてみた。
ライントレースやってみる。
構想編

# 構想

作るプログラムは、3つ。

- 教師データを作る。
- 学習する。
- 運転する。

# 教師データを作る。

この図の、線の上をwasdで歩いて、5つのセンサーの入力と1つの出力をCSVに落とす。
もちろん、教師は、俺。
![linetracer-course-300x300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/59cd407b-925d-162b-350a-a11ecf34de81.png)

uniyでつくる。kelpnetは、使わない。

# 学習する。

kelpnet使って、5入力、1出力、3分類のモデルをつくる。
csvを読み込んで、学習して、セーブする。
unityは、使わない。

# 運転する。

kelpnet使って、unity使って、モデルをロードして、あの図の線上を歩く。


以上。
PHP5.3 で、Datetime型のPass by value ができない

題名通りです。早速コードと出力結果を載せます。

```
	private function pass_date_by_val($date){
	    $date->modify('-3 month');
	}
	
	private function pass_str_by_val($str){
	    $str = "Yahoo";
	}

	$new_date = new \DateTime();
	echo $new_date->format('Y-m-d H:i:s')."\n";
	$this->pass_date_by_val($new_date);
	echo $new_date->format('Y-m-d H:i:s')."\n";
	    
	$new_str = "Google";
	echo $new_str."\n";
	$this->pass_str_by_val($new_str);
	echo $new_str."\n";

```

出力：

```
2019-07-02 10:35:08
2019-04-02 10:35:08
Google
Google
```

↑の通り、文字列は値で渡しているのに対し、Datetimeは**参照**で渡された！


同じ悩みを抱え方も[いる](https://stackoverflow.com/questions/29597875/php-how-do-i-pass-date-objects-by-value)。ボブジェクトは基本Javaみたいに参照で渡している？

#回避策
そこにハマってしょうがないので、[clone](https://www.php.net/manual/ja/language.oop5.cloning.php) で乗り越えよう！
alpine linuxのlocaltime設定

[Simh/i1401 on docker](https://qiita.com/suzanHud/items/85522c7a0af03d7671ad)で、
[Simh](http://simh.trailing-edge.com/)のIBM1401シミュレータについて書きました。

そのとき、素のalpineを使いました。
動かしてlsしたとき、localtimeは「UTC」となります。

localtimeをJSTにするものを使った方が良いかな。

```docker:Dockerfile
FROM alpine:3.12.3
RUN apk update \
    && apk --no-cache --virtual .build-deps add tzdata \
    && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    && echo "Asia/Tokyo" >  /etc/timezone \
    && apk del --purge .build-deps
```
これでSimhの実行環境を作る際、以下のようにできます。

```docker:Dockerfile_simh
FROM kazu_gcc:10.2.0 as builder

RUN git clone https://github.com/simh/simh.git
RUN cd simh ; make i1401
RUN cd /src ; wget http://blog.livedoor.jp/suzanhud/IBM1401/FORTRAN/FortranIV.zip
RUN mkdir FortranIV ; cd FortranIV ; unzip ../FortranIV.zip

FROM kazu_alpine_jp:3.12.3
COPY --from=builder /src/simh/BIN/i1401 /usr/local/bin/
RUN mkdir /simh
COPY --from=builder /src/FortranIV /simh
```
##変更履歴
(2019/08/27)各ソフトをバージョンアップ
(2021/01/03)各ソフトをバージョンアップ
A-Star 32U4 Micro Arduinoのセットアップ

arduino互換
https://www.switch-science.com/catalog/1748/
https://www.pololu.com/product/3101

設定いつも忘れるのでメモ

#環境
macOS

#ボードの追加方法

**File/Preferences**の**Additional Boards Manager URLs**に以下追加
`https://files.pololu.com/arduino/package_pololu_index.json`

追加したら、ボードマネージャーでA-Starのボードを追加
**Tools/Board/Boards Manager…**で"Pololu A-Star"とかで検索すると出てくるのでインストール

完了
<img width="331" alt="スクリーンショット 2019-07-02 10.31.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45798/c7684945-ad34-218c-9f62-c73067c18fa2.png">


#参考
https://www.pololu.com/docs/0J61/6.2
docker-composeでenv_fileとenvironmentを同時に設定する際の注意点

# はじめに
docker-compose立ち上げたコンテナに、カスタムの環境変数ファイル(例： `.my.env` )を使って環境変数を渡す時にハマったのでメモです。

# やりたいこと
環境変数ファイル `.my.env` の環境変数を `docker-compose` で起動するコンテナに渡したい。

## カスタム環境変数ファイル .my.env
例えば、カスタム環境変数ファイルとは次のようなものです。

```:.my.env
ENV=develop
FOO=foo
```

# 成功例
先に「**こうすればうまくいく**」という例を示します。
`env_file` と `environment` を同時に指定したい場合は以下のようにやるとうまくいきます。

```yaml:docker-compose.yml
version: "3"

services:
  my-service:
    image: busybox
    env_file:
      - ./.my.env
    environment:
      - HOGE=hoge
    command:
      - 'env'
```

## 実行例（成功）
```
docker-compose up

...（略)
my-service_1  | ENV=develop
my-service_1  | FOO=foo
my-service_1  | HOGE=hoge
```


# 失敗例

`enviroment` に、 `.my.env` で定義した環境変数のキーだけ渡すと失敗します。

```yaml:docker-compose.ymlの抜粋
    environment:
      - HOGE=hoge
      - FOO
```

## 実行例（失敗）
`environment` で指定した `FOO` が環境変数として読み込まれなくなっています。

```
docker-compose up

...（略)
my-service_1  | ENV=develop
my-service_1  | HOGE=hoge
```

# 原因
`env_file` をしてもしなくても、 `environment` にキーだけを書いた場合は、マシンの環境変数もしくは `.env` ファイルの環境変数が呼ばれるようになります。
`environment` に環境変数キーだけを設定した時にそれらがない場合は、未定義になってしまうようです。

## ややこしい点
`.env` ファイルを読み込む場合は、カスタムの環境変数と違ってキーだけの指定をすると `.env` から読み取ってくれます。

# 結論
`env_file` でカスタム環境変数を読み込むときは、 `environment` のなかでキーだけの指定をしないようにしましょう。
Ruby でクラスメソッドを一気に定義する ( class << self )

ほんと毎回忘れてググってるやつ

```rb
class Foo
  class << self
    def hello
      puts 'hello'
    end
  end
end
```

よく理解するにはメタプログラミングRubyを読みましょう

# 左向きの矢印2個(シフト)って何よ？

シングルトン・メソッドの定義らしいです。

>Singleton class definition

[arrays - What does << mean in Ruby? - Stack Overflow](https://stackoverflow.com/questions/6852072/what-does-mean-in-ruby/6852104)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2232








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Oracle: V$SESSION とか V$PROCESS とかでプロセスを調べる

## 箇条書き

### V$SESSION と V$PROCESS の ER 的な関係

https://www.shift-the-oracle.com/view/dynamic-performance-view/session-process.html


DBへの同時接続数が増えるとORA-00020,ORA-12516,ORA-12519,ORA-12520といったエラーが発生してDBに接続できなくなります。


### アラートログより

アラートログからDB停止時のログを探す。
LICENSE_HIGH_WATER_MARKの値を確認。


### V$RESOURCE_LIMITで現状を確認

起動中のDBの最大接続数を確認。

```sql
SELECT * FROM v$resource_limit
where upper(resource_name)='PROCESSES'
/
```

RESOURCE_NAME リソース名(上記ではprocessesのレコードのみ表示)

- CURRENT_UTILIZATION 現在の値
- MAX_UTILIZATION 起動後の最大値
- INITIAL_ALLOCATION 初期割当
- LIMIT_VALUE 制限値


単純にPROCESSESが小さい場合(ORA-00020)は、

- processesを大きくする
- アプリケーションのコネクション開放漏れを調査する

という流れ。




### 実行中のSQLを調べるSQL



```sql
SELECT a.sid SID, a.serial# SERIAL, 
a.terminal TERMINAL, 
floor(a.last_call_et/3600)||':'|| 
floor(mod (a.last_call_et,3600)/60)||':'|| mod(mod(a.last_call_et,3600),60) "TIME", 
SUBSTRB(a.program,1,10) PROGRAM, b.sql_text SQLTEXT 
FROM v$session a, v$sqltext b
WHERE a.sql_address = b.address AND a.status='ACTIVE' AND a.sql_hash_value = b.hash_value AND 
a.username is not null ORDER BY a.sid,b.piece 
```

### SID, serial# を調べるSQL


```sql
SELECT 
to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') NOWTIME,
decode(l.lmode,6,'ロックセッション','待機セッション') kind,
s.sid,s.serial#,s.machine,s.program,s.username,s.status,
to_char((sysdate-last_call_et/86400),'YY/MM/DD HH24:MI:SS') start_time,
floor(s.last_call_et/3600)||'時間'||
floor(mod(s.last_call_et,3600)/60)||'分'||
mod(mod(s.last_call_et,3600),60)||'秒' "TTIME",
last_call_et ,
w.event,
o.object_name,
q.piece,
q.sql_text,
l.type,l.lmode,l.request
FROM v$session_wait w,v$session s,v$sqltext q,v$lock l,v$locked_object lo,dba_objects o
where w.sid=s.sid
and q.hash_value=s.sql_hash_value
and l.sid=s.sid
and lo.session_id=s.sid
and o.object_id=lo.object_id
and o.owner<>'SYS'
and last_call_et > 30
and (l.lmode=6 or l.request=6)
order by lo.object_id,l.lmode,start_time ,sid,lmode,piece
```


### 切断方法

```sql
alter system kill session '<sidの値>,<serial#の値>';
```
  

以上、追記していきます。
参考になればさいわいです。
axios.getをproxy経由で行う

Proxy環境下でFirebaseからaxios経由でデータ取得時にハマったのでメモ
色々試しましたが、これが効いてるようです。

###環境
・Ubuntu 16.04
・Nuxt.js v2.8.1
・axios

###実装
```
const url = "xxxxxxxxx"
const config = { proxy: { host: proxy.ip, port: proxy.port } }

axios.get(url, config)
.then(result => {})
.catch(error => {console.log(error)})
```

https://github.com/axios/axios#request-config の下のほうに書いてある。
【UiPath】メール送信先をExcelで外部ファイル化する

# はじめに
UiPathでメール送信を行う場合、`Outlookメールメッセージを送信`アクティビティを使用したりするが、宛先メールアドレスは、String型の変数で指定する。
そのため、宛先が複数ある場合は、普段Outlook等を使うときと同じように、宛先を`;`(セミコロン)などで区切る必要がある。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/bdfe0c32-2e63-eca7-0be2-e2974d607579.png)
ただメールの宛先はメンテナンスが必要になる可能性が高いため、外部ファイルに書いておきたいのが通常だと思う。
UiPathはExcelとの親和性が高いので、その外部ファイルもExcelにしたい。

# 宛先設定ファイル
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/424c12a9-37b0-e411-fa0a-47ad076e0588.png)

宛先を管理するためのExcelファイル。
宛先区分に応じてメールアドレスを振り分け、To/Cc/Bccの使い分けをできるようにしている。

## 名前列
「名前」列は、メールアドレスに表示名を指定したい場合に記入する。一般的な記法だと思われるが、`名前<メールアドレス>`と指定すると良い。ただ通常のメーラーと同じように、この表示名は受信者にも見える物である点に注意する。

```:サンプル
aaa@example.com; 山田　太郎<bbb@excample.com>
```

# 作ったライブラリ
GitHubにソースを上げてあります。
[vicugna-pacos/uipath-read-mailaddress](https://github.com/vicugna-pacos/uipath-read-mailaddress)
【初心者向け】Azureでサーバーレスな簡易Webアプリケーションを作るハンズオン

Microsoft Azureで簡単なサーバーレスWebアプリケーションを作るハンズオンを作りました。

## このハンズオンで学べること

初心者向けです。
このハンズオンでは、Azure Functionsで簡易REST APIを作り（プロキシ機能を利用）、Vue.jsベースで簡単に作ったページをBlob Storageの静的Webサイトホスティング機能で公開しAPIとつなぐことで手軽にWebアプリができることを体験できます。

## Azure FunctionsとCosmos DBの連携（入出力バインド）
データストアはCosmos DBを使っており、Functionsとの連携の手軽さも体験できます。

Azure FunctionsはAzureにおけるFaaS（Function as a Service）ですが、Azureポータル上で手軽にコーディングできたり、豊富なトリガーと入出力バインドの機能でAzure内外の他サービスとの連携が簡単にできます。
このハンズオンではCosmos DBへのCRUDを、入出力バインドの機能を用いることで、面倒な設定や複雑なコーディングなしに直観的に簡単に行えることを体験します。

参考：[Azure Functions 2.x の Azure Cosmos DB バインド](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-cosmosdb-v2)

## Blob Storageによる静的Webサイトの公開
Azure Blob Storageを使うと、驚くほど簡単に静的なWebサイトを公開することができます。
このハンズオンではHTMLとJavaScriptのファイルをストレージに配置し、Functionsで作ったREST APIにアクセスすることでサーバーレスなWebアプリケーションを作ることができます。

参考：[Azure Storage での静的 Web サイト ホスティング](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-static-website)

## 所要時間
だいたい1時間くらいでできるかと思います。

## ハンズオンのありか
手順と使用するコードはGitHubに公開しています。

<a href="https://github.com/himanago/azure-serverless-webapp-hands-on"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/himanago/azure-serverless-webapp-hands-on.png" width="460px"></a>

※↑の画像は https://ghlinkcard.com/ で作成しました


## ハンズオンの内容
本ハンズオンは、次のステップで実施します。

- [STEP1 Azure Cosmos DBアカウント・コンテナー作成](https://github.com/himanago/azure-serverless-webapp-hands-on/blob/master/hands-on/step1-cosmosdb/README.md)
- [STEP2 Azure FunctionsでのAPI作成](https://github.com/himanago/azure-serverless-webapp-hands-on/blob/master/hands-on/step2-functionapp/README.md)
- [STEP3 Azure Blob Storageでの静的Webサイトホスティング](https://github.com/himanago/azure-serverless-webapp-hands-on/blob/master/hands-on/step3-blobstorage/README.md)

## 事前に準備が必要なもの

- ChromeやFirefox、Edgeなどのメジャーなモダンブラウザが動作するPCまたはMac
- 有効なAzureアカウントおよびサブスクリプション

## 注意点

- 作成するアプリは認証などを特に行わないため、あくまでも学習用教材として使用してください。
- Function App、Web画面用のソースコードは（ほぼ）完成済みのものを使用します。
- ハンズオンがすべて終わったらリソースを削除しましょう。特にCosmos DBは放っておくと多くの課金が発生してしまいます。

----

なにかおかしなところやわかりにくい部分があれば、コメントやプルリクいただければ対応しますのでお知らせください。
毎朝15分の勉強会で若手の行動が驚くほど改善した話

# 1. はじめに
本稿は、私のプロジェクト(ベテラン1人、開発経験が半年未満の若手2名)で4ヶ月前から実施している「アウトプット勉強会」の実施方法を紹介します(投稿日は2019/7/2です)。
私は過去に新人8人くらいの育成に携わりましたが、この勉強会を実施してから、若手が驚くほど成長しました。なぜ今までこれをやらなかったのかと後悔しています。
この「アウトプット勉強会」の形式は、「書籍編」と「設計・実装編」の2種類があります。本稿では「書籍編」の方法を説明します。「設計・実装編」については、以下の記事を参照ください。
[毎朝15分の勉強会で若手の設計力がメキメキアップした話](https://qiita.com/kojimadev/items/99d2aa1c9bc67a835480)

#  2. 前提 
一般的に、書籍は一人で黙読するよりも、何かしらのアウトプットを伴った方が学習の質・効率が高いと言われています。例えば、書籍でインプットした情報を、自分の言葉に変換して人に説明した方が、一人で黙読するよりも学習の質・効率は上がります。
以下、参考サイトです。
[仕事ができる人がやっている「圧倒的に結果が出るアウトプット術」](https://sanctuarybooks.jp/webmag/20180803-2073.html)
[インプットとアウトプットの本当の意味｜飛躍的に創造性を高める方法](https://nakaeshogo.com/input-putput/)
[勉強の質・効率を上げる！成果を出すためのインプットとアウトプット法](http://xn--4gr220a2sk.jp/112)

# 3. 勉強会の実施方法
## 3.1 概要
上記の特性を用いて、「読んだ書籍の重要ポイントを自分の言葉で人に説明する」というアウトプットを実施します。なお、「書籍の内容をまとめた資料を作成する」などは、資料作りに時間がかかり、「毎日無理なく継続する」には不向きと判断したため、お手軽なアウトプット方法としています。

## 3.2 事前準備
参加メンバーは、事前に書籍の決められた範囲(30ページ程度)を事前に読んでおきます。毎日無理なく継続できる量として、30ページ前後としています。
また、翌日のアウトプット担当者を事前に決めておきます。

## 3.3 時間
毎朝15分間で実施します。私のプロジェクトは、朝会15分の直後にアウトプット勉強会15分を実施しています。

## 3.4 実施内容詳細  
その日のアウトプット担当者が、書籍の対象範囲について、自分が重要だと思った点を自分の言葉で説明します。他メンバーも自分が重要だと思った点を都度、コメントします。
この「自分の考えをアウトプットする」ということが重要です。例えば「報・連・相」の書籍で、「悪い報告ほど早くする」ことの重要性をコメントしたメンバーは、明らかにその点に対する意識が変わりました。

## 3.5 勉強会で利用した書籍
以下の3冊を実施しました。3冊でかかった期間は1ヶ月半程度です。上2つは、どのプロジェクトでも役立つ内容だと思います。
- [報・連・相の技術がみるみる上達する!](https://www.amazon.co.jp/dp/4534037023)
- [リーダブルコード](https://www.amazon.co.jp/dp/4873115655)
- [SCRUM BOOT CAMP](https://www.amazon.co.jp/dp/4798129712)

# 4. 効果
若手2名(開発経験は半年未満)のプロジェクトメンバーとベテラン1名(私)で実施しました。その効果の一例を以下に挙げます。

- 過去の新人にも同じ書籍を読んでもらったことがありましたが、それと比べて、書籍の内容がしっかり身に付き、行動も変わりました。
- 「報・連・相」の書籍を読んで、報告・相談される相手の立場を考えて、必要なタイミングおよび詳細度で報告・相談をしようとする姿勢がとても強くなりました。
- 「リーダブルコード」の書籍を読んで、他人が読んで分かりやすいコードを自分が考える最善を尽くして書く姿勢がとても強くなりました。
- 入社1年目のメンバーは「得た知識を他人に説明することで、その知識がより定着することも身をもって体験できた」と言っていました。

# 5. まとめ
書籍の理解を促進するための勉強方法として、毎朝15分で書籍の内容を自分の言葉で説明する勉強会は、お手軽で効果がある方法だと思います。

また、「アウトプット勉強会」の形式は2種類あり、もう1つの「設計・実装編」の形式の方がより大きな効果がありました。そちらについては以下の記事を参照ください。
[毎朝15分の勉強会で若手の設計力がメキメキアップした話](https://qiita.com/kojimadev/items/99d2aa1c9bc67a835480)

<b>2020/8/26 追記</b>
上記の他、1年以上かけて様々な成長するための施策を実施しています。以下の記事にまとめていますので、ぜひ参照ください。
[1年以上かけて生産性倍増＋成長し続けるチームになった施策を全部公開](https://qiita.com/kojimadev/items/4b28f801863cf4e8f0da)

上記手法を活用して [Lightning Review というレビュー支援ツール](https://www.lightning-review.com/) を作ったりしています。
Twitterでも情報発信しています → [@kojimadev](https://twitter.com/kojimadev)
新人時代に読めば良かったと後悔するほど感謝した技術書4冊

# はじめに
この記事は、[成り上がりたくて必死に読んだ感謝の技術書6冊](https://qiita.com/kurkuru/items/97a90e3c267bd127af9b)を真似した記事です。
本稿では、開発経験10年以上の私が、新人の頃に読めば良かったと後悔するほど感謝した技術書を紹介します。
私がこれらの本を読んだのは、入社して数年経ってからですが、もっと早く読んでおけば、もっとうまく仕事ができたのにと思いました。以下に、各書籍の概要と、後悔するほど感謝した理由を記します。

# 感謝の技術書① 『報・連・相の技術がみるみる上達する!』
恥ずかしながら私はこの本を読むまでは、報告・相談される相手がどういうタイミングでどういう詳細度で報告・相談して欲しいかということを考えたことがありませんでした。
上司に「報・連・相をしっかりやりなさい」と言われても、その「しっかりやる方法」というのが、それまではよく分かっていませんでした。それが、この本を読んで、自分がどれだけ「自分本位の考え方」でコミュニケーションをしていたのかを思い知らされ、それまでの自分の行動がとても恥ずかしくなりました。
報・連・相には、様々なテクニックがありますが、一番大切なのは「__相手が意思決定できるように、適切なタイミングで適切な詳細度の情報を伝えること__」だと思いました。この書籍は、その考え方を多くの具体例と共に丁寧に教えてくれるため、心に響くのだと思います。
https://www.amazon.co.jp/dp/4534037023

# 感謝の技術書② 『リーダブルコード』
私は、この本を読むまで、コメントの書き方すら分かっていませんでした。そして、今まで自分が書いてきたコードがとても分かりにくいコードだと思い知らされ、とても恥ずかしくなりました。
分かりやすいソースコードを書くためには、様々なテクニックを知っておくことも重要ですが、一番大切なのは「__他の人が読んで分かりやすいように、自分が考えうる最善を尽くすこと__」だと思いました。その想いを常に持ち続けてコードを読んだり書いたりすることで、色々な人の書いたコードから色々なテクニックを吸収し、より分かりやすいコードがかけるように上達していくと思います。
https://www.amazon.co.jp/dp/4873115655

# 感謝の技術書③ 『ロジカル・シンキング』
私はこの本を読むまで、漏れなくダブりなく論理を構築するということを知りませんでした。例えば、上司への報告時は、次のような感じでした。
私「手戻りの原因を分析しました。その原因はこの4つです。」
上司「その4つは MECE(ミッシー)なの？」
私「？？？」
また、So What?/Why So? の概念も知らなかったため、報告時に論理の飛躍が大量にありました。この本を読んだ後に、自分の過去の発表資料を読み返すととても恥ずかしくなりました。
この本はベストセラーですが、2001年出版なので、現在までに論理的思考の書籍は他にも多く出版されており、少し古い印象を受けるかもしれません。ただ、「__漏れなくダブりなく分類して、論理の飛躍がないように伝える__」というロジカルシンキングの基本を分かりやすく学ぶという点では、とても良い本だと思います。
https://www.amazon.co.jp/dp/4492531122

# 感謝の技術書④ 『Java言語で学ぶデザインパターン入門』
私のプロジェクトはC#で主に開発します。この本は、タイトルに「Java」と書いてありますが、Javaを知らなくても問題ありません。実際、この書籍を読んだ後輩を私は10人ほど知っていますが、全員Javaを知らなくても問題ありませんでした。
デザインパターンの別の書籍で「オブジェクト指向における再利用のためのデザインパターン」を読んだこともありますが、当時の私には内容が難しすぎて理解できませんでした(著者の方、ごめんなさい)。それに比べて、この本はとても読みやすく、各パターンのメリットや用途が具体的に書いてありました。当時オブジェクト指向の初心者だった私にとって、入門書として最適でした。これを読んでやっとオブジェクト指向の良さが分かってきたと思います。
デザインパターンは一度読んだだけでは忘れてしまうので、何度も復習が必要だと思います。ただ、この本はわかりやすいため、一度読んだだけでも「__カプセル化で情報隠蔽したり、ポリモーフィズムで条件判定文を無くしたりする具体例を多く知ることで、オブジェクト指向の良さを理解する__」ことはできると思います。
https://www.amazon.co.jp/dp/4797327030

# まとめ
どの書籍も、もっと早くに読んでいれば良かったと後悔するほど感謝している素晴らしい書籍です。

私のチームは皆で本稿の書籍を読んだ上で [Lightning Review というレビュー支援ツール](https://www.lightning-review.com/) を作ったりしています。

<b>2020/8/26 追記</b>
本稿の書籍を利用した「毎朝15分のアウトプット勉強会」を実施したところ、とても効果がありました。詳細は以下の記事を参照ください。
[1年以上かけて生産性倍増＋成長し続けるチームになった施策を全部公開](https://qiita.com/kojimadev/items/4b28f801863cf4e8f0da)

Twitterでも情報発信しています → [@kojimadev](https://twitter.com/kojimadev)
Tips: Windowsを使いやすくするために まずすべき個人環境設定

##概要
さて、新しいPCを与えられました。あなたはまず何をしますか。

共用ユーザーではなく個人IDでログインしているPCならば、
環境設定はあなた好みにカスタマイズしてから使うべきです。

※但し、共用PCを使わざるを得ないこともありますから、
初期設定での操作に慣れる事も大切ではありますがね。

本投稿では、Windowsを使いやすくするために、
筆者がオススメする設定を紹介します。

##設定項目
* タスクバー
* 文字入力
* フォルダオプション
* ユーザーフォルダ
* クイック起動バー
* 送るメニュー

##設定方法
###タスクバー
デスクトップ下側のタスクバー上で右クリックし、「タスクバーの設定」を選択します。

* 小さいボタンを使う
* タスクバーに入りきらない場合、タスクバーボタンを結合する

* タスクバーの通知領域に表示するアイコンを選びます。
※「ネットワーク」と「スピーカー」はよく使うと思います。

###文字入力
言語バーのアイコンを右クリックし、設定画面を開きます。

####全般タブ > 入力設定
* スペースの入力 … 常に半角
* テンキーからの入力 … 常に半角

####全般タブ > キー設定
|キー|場面|機能|
|:--|:--|:--|
|変換|入力/変換|IME-オン|
|無変換|入力/変換|IME-オフ|
|Shift+変換|入力/変換|再変換|
|Shift+SPACE|入力/変換|別幅空白|

※押しにくい位置にある[半角/全角]キーを押さなくても、[変換]キーで確実に日本語入力、[無変換]キーで確実に英字入力になります。

####全般タブ > 色設定
|変更箇所|文字色|背景色|
|:--|:-:|:-:|
|入力文字|黒|水色|
|注目文節内文字|黒|黄色|
|変換済み文節内文字|白|緑|
|文節長変更中文字|選択項目の文字|選択項目|

※入力中の文字が色付きで判別しやすくなります。一部のアプリケーションにおいては無効な場合があります。

####変換タブ > 変換
* 候補一覧に表示する文字種 … かな, 全角カナ, ローマ字

####辞書/学習タブ > システム辞書
* 郵便番号辞書
* 単漢字辞書

####単語の登録
文字入力の手間を減らすため、定型文を登録しましょう。
[**こちらの記事**](https://qiita.com/X-IA/items/0e8577f7f9b588d522ad)をご覧ください。

###フォルダオプション
エクスプローラのメニューから「オプション」を選択します。

* ステータスバーを表示
* ドライブ文字を表示
* 隠しファイル、隠しフォルダを表示
* 項目の説明をポップアップで表示
* ヒントにファイル情報を表示
* ログオン時に前回のフォルダを表示
* 暗号化や圧縮ファイルをカラーで表示
* 常にメニューを表示
* 登録されている拡張子は表示

###ユーザーフォルダ
デスクトップ画面上に案件ごとのフォルダを幾つも作って作業している方も多いかもしれません。しかし、乱雑にファイルが並んでいると、探すのが大変なことは容易に想像がつくと思います。

ローカルに各種ドキュメントなどファイルを保管する際は、
一ヶ所からデフォルダ分けで分類することをオススメします。
自分なりの分類のルールを作っておき、そのルールに従って保存することを習慣化しましょう。

これには次のような利点があります。

|特徴|利点|
|:--|:--|
|フォルダで分類|目当てのファイルを探し易い|
|一ヶ所に集約|バックアップし易い|
|ルール遵守を習慣化|何回も開くことにより身体が慣れる|

筆者の分類方法の一例を示します。

|フォルダ名|用途|
|:--|:--|
|1_doc|プロジェクト内で作成するドキュメント類など編集していくもの|
|3_lib|製品マニュアルなど外部から取得し、これ以上変更しないもの|
|5_pgm|インストーラの無いアプリケーションなど|
|6_lnk|ショートカットファイル等|
|8_tmp|DLしたファイルや解凍したファイルなどの一時保存|
|9_old|不要になったファイル|

※フォルダ名の頭に数字を付けることで、各フォルダの表示順序を判り易くできます。

※ローカルドライブ以外では、ファイルを削除時に「ごみ箱」にキープされず、後で復元することが不可能になります。「ごみ箱」または右クリックメニューの「削除」は使用せず、oldフォルダに分類しておくことをオススメします。

###クイック起動バー
英語では "Quick Lanuch" と呼ばれる、タスクバー上のアプリケーションランチャーです。
クイック起動バーにより、デスクトップ画面上で他のアプリケーションのウィンドウを開いている時でも、すぐによく使用するアプリケーション等を起動することができます。

しかし、Windows 2000やXPではデスクトップ画面に最初からありましたが、Windows Vista, 7からは廃止されています。
そのため、クイック起動バーを使用したい場合は、タスクバーに自分でツールバーを追加する必要があります。

1. 任意のアプリケーション等のショートカットファイルを配置したフォルダを用意します。
2. タスクバー上で右クリックします。
3. タスクバーのメニューにて、「タスクバーを固定する」をオフにします。
4. タスクバーのメニューから、「ツールバー」「新規ツールバー」を選択します。
5. 手順1. のフォルダを選択します。
6. タスクバーのメニューにて、「タイトルの表示」をオフにします。
7. タスクバーのメニューにて、「ボタン名の表示」をオフにします。
8. ツールバーの境界をドラッグして、タスクバー上の任意の位置に表示させます。
3. タスクバーのメニューにて、「タスクバーを固定する」をオンにします。

###送るメニュー
ファイルを右クリックすると現れる、「送る」メニュー。
「送る」メニューからテキストエディタなどアプリケーションを選択すれば、選択ファイルがそのアプリケーションで開かれますし、ドライブやフォルダを選択すれば、その場所へファイルがコピーされます。

「送る」の各項目の実体は、SendToフォルダに置かれたショートカットファイルです。自分でショートカットを配置することで、任意のアプリケーション等を登録して増やしていくことができます。
SendToフォルダの場所はデフォルトでは下記フォルダパスに割り当てられていますが、「アドレスバー」または「ファイル名を指定して実行」に ```shell:sendto``` を入力してもジャンプすることができます。

```
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\SendTo
```

※レジストリエディタからパスを変更することもできますが、想定通りにならない可能性があり、上級者以外にはオススメしません。

エクスプローラ上のファイルに対して、特定の操作を頻繁に実行したい場合は、「送る」メニューの活用がオススメです。
SQL Server の大雑把な値認識

## はじめに

SQL Server は、「照合順序」の設定で変えられますが、デフォルト設定での値認識がかなり大雑把です。
便利ではあるのですが、キー値の処理など厳密に値を管理する必要がある場合は注意が必要です。

## 値を同一とみなすパターン

以下、それぞれで、同じレコードが検索されます。
値を同一とみなすということは、主キー値の場合は、両方INSERTしようとすると一意制約違反になります。

### 大文字小文字を同一とみなす

```sql:
select * from T1 where T1.ID = 'A123';
select * from T1 where T1.ID = 'a123';
```

### 全角半角を同一とみなす

```sql:
select * from T1 where T1.ID = 'A123';
select * from T1 where T1.ID = 'Ａ１２３';
```

### 平仮名と片仮名を同一とみなす

```sql:
select * from T1 where T1.NAME = 'あいうえお';
select * from T1 where T1.NAME = 'アイウエオ';
select * from T1 where T1.NAME = 'ｱｲｳｴｵ';
```
## 参考サイト

- 『照合順序 – 文字の比較と並び順 (その 1)』<br/>
 https://blogs.msdn.microsoft.com/jpsql/2016/07/26/1-3/

## おわりに

DBによって値の扱いが異なるので、思い込みで実装するのは危険ですね。
NoMethodErrorの解決方法(備忘録)

##NoMethodErrorが発生した時の解決方法
以下の画像は、NoMethodErrorが発生した時のエラー画面である。
https://gyazo.com/c8a64d9bca710f8fdd842fac2fccaefa

##NoMethodErrorとは？

直訳すると、**「メソッドがない」**という意味を表すエラーである。

##NoMethodErrorの原因

「メソッドがない」つまり、メソッドを定義していないことで生じるエラーである。

##NoMethodErrorの解決方法と手順

メソッドを定義すれば、エラーは解決できる。

では、どこにメソッドを定義すればよいか？

メソッドを定義している場所は、コントローラである。そのため、まず、コントローラアクションのコードをみて、メソッドを定義しているかを確認する。

もしも、コントローラにメソッドが定義されていた場合は、コントローラアクションに関連したDB上のテーブルカラムを確認する。カラムがなければ、カラムを追加する。


カラムの追加と削除について
https://qiita.com/azusanakano/items/a2847e4e582b9a627e3a
MacにMySQL5.7をインストールして作業用Userと作業用DBを構築

macにはhomebrewが入ってる前提で進めます。


## MySQL5.7のインストール
` $ brew update `

` $ brew install mysql@5.7 `
 
インストール完了

## 初期設定
 pathを通す

` $ brew info mysql@5.7 `

こちらの内容を参考にpathを通す

` $ vi ~/.bash_profile `

最後に追加

```
export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"
export PKG_CONFIG_PATH="/usr/local/opt/mysql@5.7/lib/pkgconfig"
```

.bash_profileを変更したので反映

` $ source .bash_profile `



設定ファイルの場所確認

` $ mysql --help | grep my.cnf `

```
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 
```

my.cnfを編集

` $ vi /usr/local/etc/my.cnf `

```
# Default Homebrew MySQL server config
[mysqld]

Only allow connections from localhost
bind-address = 127.0.0.1

# utf-8
character-set-server = utf8
# password setting
default_password_lifetime = 0
```



` $ mysql.server start `

```
Starting MySQL
. SUCCESS! 
```

## 作業用DB作成

mysqlにrootでログイン

` $ mysql -u root -p ` 

現状のDBを確認

` mysql> show databases; `

```
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
```

これらはsystemが利用しているDBなので消したらダメ。

作業用DBを作成

` mysql> create database testdb; `


testdbが作成できた

```
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| testdb             |
| sys                |
+--------------------+
```


作ったDBを削除

` mysql> drop database testdb; `


```
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
```


systemが利用しているDBは普通に消せてしまうが、上記でも書いたように消してはダメ。
もし、消しちゃったら ` brew reinstall mysql@5.7 ` した方が早い。
ちなみにuser作成してログインしようとしても
` mysql.user ` がいない的なエラーが出るようになる

` ERROR 1146 (42S02): Table 'mysql.user' doesn't exist `



## 作業用User作成

今回はbind-address = 127.0.0.1でlocalhostからしかアクセスしないようにしてある。
この設定がない場合はuserに@localhostをつけて設定していく。

最初のuser作成はrootで行う必要があるので、
mysqlにrootでログイン

` mysql> create user dbuser01 identified by 'password'; `


` mysql> create user dbuser01@loalhost identified by 'password'; `

作業対象のDBに権限を与える

` mysql> grant all on testdb.* to dbuser01; `


参考) ユーザーを削除

`  mysql> drop user dbuser01; `

`  mysql> drop user dbuser01@loalhost; `

ユーザーを切り替えるためにroot状態からログアウト

` mysql> quit `

さっき作ったDB Userでログイン

` $ mysql -u dbuser01 -p testdb; `


現在選択しているUserを確認

` mysql> select user(); `

```
+------------------+
| user()           |
+------------------+
| dbuser01         |
+------------------+
```



接続できるDBを確認

` show databases; `


```
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testdb             |
+--------------------+
```



参考

https://qiita.com/Knoth/items/241bd94af722593e685e

https://qiita.com/nishina555/items/2676d20e32500f4c5aca

https://stackoverflow.com/questions/17780630/table-mysql-user-doesnt-existerror/51214393
Gitのリモートリポジトリをレンタルサーバーでプライベートリポジトリにする

### 対象者
Gitホスティングサービス（リモートリポジトリ）にお金を掛けたく無い人
Gitホスティングサービス選びとかめんどくさい人
正式なサービスじゃ無いからdeploy先で良いや。な人

### 環境
MacOSX Mojave
ターミナル
https://www.xserver.ne.jp/
レンタルサーバ（XSERVER契約済み）
（参考：https://zudoh.com/misc/create-git-private-repository-on-rental-server ）
上記でうまくいかなかったので、調べました。

### XSERVER準備
まずはXSERVERに公開鍵を登録。
事前に生成してある秘密鍵にはパスワードを設定してあります。
（参考：https://www.xserver.ne.jp/manual/man_server_ssh.php ）

以下の方法でsshコマンドでXSEVERに接続できるか確認します。

    $ ssh -i ~/.ssh/id_rsa サーバーID@サーバーID.xsrv.jp -p 10022
    $ Enter passphrase for key '/Users/user/.ssh/id_rsa':
    $ 秘密鍵パスワードを入力
    $ [サーバーID@svxxxx ~]$ #ログインできたのを確認

### Server側でgitホスティングの準備

    [サーバーID@xxxxxx ~]$ mkdir ./tmp/git-remote
    [サーバーID@xxxxxx ~]$ cd ./tmp/git-remote
    [サーバーID@xxxxxx git-remote]$ git init --bare
    [サーバーID@xxxxxx git-remote]$ pwd
    /home/サーバーID/tmp/git-remote

Server側の設定はここまで。

### ローカル側の設定
対象のディレクトリで

    $ git init
    $ git add -A
    $ git commit -m "first commit"

これでローカルに`master`ブランチが作成されました。
確認方法は`$ git branch`で`master`と出ます。

ではServerとローカルのmasterブランチを紐付ける準備をします。

    $ vi ~/.ssh/config

上記で`id_rsa`の配置箇所などを定義して以下のように保存します。

```~/.ssh/config
Host xserver
  HostName  サーバーID.xsrv.jp
  Port      10022
  User      サーバーID
  IdentityFile  ~/.ssh/id_rsa
```

次にgitのremoteを指定してあげます。
`home/サーバーID/tmp/git-remote`の部分はServer側の絶対パスです。

    $ git remote add origin ssh://xserver/home/サーバーID/tmp/git-remote

準備が完了したので、以下のコマンドで`remote`に`master`を`push`します。

    $ git push origin master
    Enter passphrase for key '/Users/user/.ssh/id_rsa': #秘密鍵のパスワード聞かれます

うまくいくと、

    Enumerating objects: 7, done.
    Counting objects: 100% (7/7), done.
    Delta compression using up to 8 threads
    Compressing objects: 100% (5/5), done.
    Writing objects: 100% (7/7), 1.55 KiB | 1.55 MiB/s, done.
    Total 7 (delta 0), reused 0 (delta 0)
    To ssh://xserver/home/サーバーID/tmp/git-remote
     * [new branch]      master -> master

作業完了。

###試しにgit pullしてみる

    $ git pull origin master
    Enter passphrase for key '/Users/user/.ssh/id_rsa': 
    From ssh://xserver/サーバーID/tmp/git-remote
     * branch            master     -> FETCH_HEAD
    Already up to date.
成功すると上記の様な感じ。(リモートリポジトリ作成までを目標としてるので、コマンドの省略やパスワードの省略手順については省略mm)

### 微妙にハマったところ
設定が間違えていたりすると、以下のエラーが出ることがある場合があります。
（参考：https://qiita.com/KTakata/items/3e5073072e037c289a3a ）

    fatal: No such remote 'origin'  
    fatal: remote origin already exists.

そんな時は以下のコマンドでremoteのブランチを`remove`できます。

    $ git remote rm origin

`remove`してから、

    $ git remote add origin ssh://xserver/home/サーバーID/tmp/git-remote

にて再設定できます。

今回とは関係ないですが、リモートホスト情報を変更することも可能です。

    $ git remote -v #remote urlの情報を確認できる
    $ git remote set-url origin {new url}  #remote urlを変更できる

以上です。
tar.gz を捨てて zip を使おう

よく使われるこれらのアーカイブ形式ですが、主な違いとして、`tar.gz`ではファイルを`tar`でアーカイブした後`gzip`で圧縮するのに対し、`zip`では圧縮した個々のファイルをアーカイブするという点あります。これにより、`zip`では特定のファイルを指定して解凍することが迅速に可能です。

||tar.gz|zip|
|----|----|----|
|圧縮方式|Deflate|Deflate|
|アーカイブと圧縮|アーカイブが先|圧縮が先|
|ランダムアクセス(解凍)|できない|**できる**|
|ランダムアクセス(追加・削除)|できない|**できる**[^1]|
|Linuxファイル属性[^3]の保存|される|される[^2]|
|プレインストール|Linux, MacOS|Linux, MacOS, **Windows**|

圧縮方式はどちらも同じなのでファイルサイズや圧縮時間には大差ありません（ただし圧縮される個々のファイルがとても小さく互いに似ている場合、ファイルをまたいで共通の符号を使える分`tar.gz`の方が小さくなりうる）。ソフトウェアパッケージの配布ではランダムアクセスが必要になることがあまり無いので`tar.gz`でも良いですが、データのアーカイブなどでは明らかに`zip`の方が便利です。ということで皆さん積極的に`zip`を使っていきましょう。

## 参考
* https://unix.stackexchange.com/a/272896
* https://unix.stackexchange.com/a/313685

[^1]: ただし、配列内部への挿入・削除と同じく後続のファイルを動かす必要があるので O(n) になる。それでも圧縮自体をやり直す必要はないのでアーカイブを作り直すよりは速い。また、`-ur`オプションでは変更のあったファイルのみ検出して圧縮できる。
[^2]: Info-zip実装。
[^3]: `mdate`や`mode`のこと。
vue.jsの開発環境を構築する 〜やった手順をつらつら〜


#### 1. 必要なソフトをダウンロード 
Visual Studio Codeをダウンロード:raised_hands_tone1:
https://code.visualstudio.com/download

Node.jsをダウンロード:point_up_tone1:
https://nodejs.org/en/download/

```sql
This package has installed:

Node.js v10.15.1 to /usr/local/bin/node
npm v6.4.1 to /usr/local/bin/npm
Make sure that /usr/local/bin is in your $PATH.
```

> Vueコマンドが使えない時の対処法
> $ sudo npm i -g vue-cli

→このコマンドを実行でvueコマンドが使えるようになる！:relaxed::v_tone2:



#### 2. vueコマンドでプロジェクトを作成
```sql
vue create task-app
```
↓

```sql
  vue create is a Vue CLI 3 only command and you are using Vue CLI 2.9.6.
  You may want to run the following to upgrade to Vue CLI 3:

  npm uninstall -g vue-cli
  npm install -g @vue/cli
```
↓
バージョンが違うとのことで怒られた！:frowning2:

```sql
sudo npm uninstall -g vue-cli
npm install -g @vue/cli
```
を実行！
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365371/a3813ea7-f037-11a2-0179-0b79139f354b.png)

成功！再度プロジェクトを作成コマンドを実行:stuck_out_tongue_winking_eye:

```sql
vue create task-app
```
↓

```sql

📄  Generating README.md...

🎉  Successfully created project task-app.
👉  Get started with the following commands:

```

以下のコマンドでコンパイルをしましょう。

```sql
$ cd tesk-app
$ npm run serve 
```

```sql
 INFO  Starting development server...
 98% after emitting CopyPlugin                                                   

 DONE  Compiled successfully in 2614ms                                                                         00:56:18

 
  App running at:
  - Local:   http://localhost:8080/ 
  - Network: http://192.168.3.15:8080/

  Note that the development build is not optimized.
  To create a production build, run npm run build.

```
↓コンパイルに成功したみたいですね。:star:


ブラウザで開いてみましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365371/dc303976-1b53-8b6a-de8c-0054d0128866.png)

vue.jsのプロジェクト雛形が出来ました！:sunny:



環境構築ってオモロイですよね〜
direnvを用いてterraformで複数のAWSアカウントを使い分ける方法

先日、terraformのインストール方法という記事を書きました。
https://qiita.com/sasshi_i/items/b5117d51fed800fa6b09

こちらの記事で`~/.aws/credentials`に下記を追記しました。

```~/.aws/credentials
[default]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key
```

現場を複数掛けもっており、複数のAWSアカウントを使い分けたい場合はこちらの設定だと毎回[default]の値が参照されてしまうため、具合が悪いです。

今回はAWSアカウントの切り替え方について説明します。

# AWSアカウントの切り替え方法
使用するAWSアカウントを切り替えるためには`AWS_PROFILE`という環境変数に値を格納することで切り替えることができます。

例えば、下記の場合`AWS_PROFILE`に`hogehoge`が格納されていれば、`hogehoge`の認証情報が使用され、何も指定されていなければ`default`が使用されます。

```~/.aws/credentials
[default]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key

[hogehoge]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key

[hogehoge_2]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key

```

A社の開発で[hogehoge]の認証情報を使いたければ、A社のコードを修正している時に`AWS_PROFILE`に`hogehoge`を格納し、B社の開発で別の認証情報が使いたければ`AWS_PROFILE`に別の値を格納することでAWSアカウントを切り替えることができます。

毎回macの`~/.bashrc`を修正して環境変数を修正するのは面倒なので、`direnv`というツールを使います。

# direnvとは？

カレントになっているディレクトリごとに環境変数を定義してくれるツールです。
指定しているディレクトリがカレントの時に環境変数を定義してくれたり、ディレクトリから抜けると環境変数を無効にしてくれます。

direnv
https://github.com/direnv/direnv

# direnvのインストール方法
macの場合はHomebrewで簡単にインストールできます。

```
$ brew install direnv
```

`~/.bashrc`に下記を追記

```~/.bashrc
eval "$(direnv hook bash)"
```

bashrc再読み込み

```
$ source ~/.bashrc
```

下記コマンドでバージョンが表示されればインストール完了です。

```
$ direnv --version
2.20.1
```

# direnvの使い方
環境変数を使用したいディレクトリ配下に`.envrc`というファイルを作成し、そちらに環境変数を記載します。

例えば下記のように`/terraform`ディレクトリ配下に`.envrc`を作成した場合は`/terraform`配下で設定した環境変数が適用されます。

```
cd /terraform
touch .envrc
vi .envrc
```

`/terraform`配下で`~/.aws/credentials`の[hogehoge]の認証情報を適用するために、`.envrc`に下記を記載します。

```/terraform/.envrc
export AWS_PROFILE=hogehoge
export AWS_REGION=ap-northeast-1
```
下記コマンドで環境変数を作成します。

```
direnv allow
```

これで設定は完了で、指定のディレクトリにcdすると環境変数が作成されます。

```
$ cd /terraform
direnv: loading .envrc
direnv: export +AWS_PROFILE +AWS_REGION
```

ディレクトリから抜けると環境変数が削除されます。

```
cd ..
direnv: unloading
```

これでディレクトリ毎で`.envrc`に定義した環境変数が適用されるため、AWSの認証情報をディレクトリ毎で使い分けることができます。
Built-inなtryはpackageであればいいんじゃないか

# はじめに
物議を醸している`try`ですが、`xerros`のようにサードパティなpackageとして需要が高まってきたら本体に組み込んでいくということもできるんじゃないかなという思いの元作りました。

https://go.googlesource.com/proposal/+/master/design/32437-try-builtin.md

# リポジトリ
https://github.com/junpayment/go-try

# 使い方
```go
package main

import (
	"log"

	"github.com/junpayment/gotry"
)

func main() {
	f := func() (v, x int, e error) {
		return 1, 2, nil
	}

	defer func() {
		err := recover()
		if err == nil {
			return
		}
	}()
	res := gotry.Try(f())
	log.Println(res)
}
```

以上
ansible

[☆](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#id15)

# managing static inventory
``` :example
├── site.yml # master 
├── webservers.yml
├── dbservers.yml
├── inventories
│   ├── production
│   │   ├── hosts
│   │   ├── group_vars
│   │   │   └── group1.yml
│   │   └── host_vars
│   │       └── hostname1.yml
│   └── staging
│       ├── hosts
│       ├── group_vars
│       │   └── group1.yml
│       └── host_vars
│           └── hostname1.yml
├── library # カスタムモジュール(optional)
├── module_utils # モジュールをサポートするための任意のカスタム(optional)
├── filter_plugins # カスタムプラグイン
└── roles
    ├── common
    │   ├── tsks     # 主なリスト
    │   │   ├── main.yml
    │   ├── handler  #　内部、もしくは外部で利用可能のハンドラを
    │   ├── files    # デプロイ可能時に利用できるファイルを
    │   ├── defaults # デフォルト変数
    │   ├── vars     # その他変数
    │   ├── templates
    │   └── meta
    ├── fooapp
    ├── monitoring
    └── webtier
```

- inventories/*/hosts
  - サーバー定義
- site.yml 
  - メインとなるプレイブック
  - 定義プレイブックをimpoertのみが良い感じ
  - ansible-playbookコマンド指定可能。--limitぱらむ指定。
- webservers.yml
  - site.ymlから呼び出され実行する
  - 動かしたい、hosts,rolesを必要に応じて記述
  - ansible-playbookコマンド指定可能
- roles
  - モジュール群
  - [manual](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html)
- roles/common/tsks/main.yml
  - 実働コマンド記述
 
# ☆
1. 適用したい環境を適当に
  - hosts
- ansible-playbookで指定するファイル
  - site.yml
- rolesから呼び出したいファイルを指定
  - webservers.yml
- 実行コマンド記述
  - roles/common/tsks/main.yml

# example
全サーバー適用

```
ansible-playbook -i i[hosts] site.yml
```
特定のサーバー

```
ansible-playbook -i [hosts] webservers.yml
```
hosts設定内の特定のサーバー適用

```
ansible-playbook -i [hosts] --limit [サーバー]
```

tag利用

```
ansible-playbook -i [hosts] --tags 
```
tasks込出力

```
ansible-playbook -i [hosts] webservers.yml --tags ntp --list-tasks
```

hosts出力

```
ansible-playbook -i [hosts] webservers.yml --tags ntp --list-hosts
```

# memo
- site.yml
  - このようなファイルが持つ役割を利用、応用
- inventories
  - 環境毎に用意する事で柔軟に
- 動的
  - os毎に処理を変えたり
- プレイブックにバンドル
  - ./libraryを利用して、ansibleモジュールを追加。
- サーバーグループ化
  -  webservers.yml,dbservers.ymlのようにグループで分ける事で最適化[☆](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html)
- group_byモジュール
  - os間で異なるパラメータを扱う時に
- バージョン管理
  - git使おう
環境構築難しすぎる…。コマンドとPATHのお話をちょっと勉強した備忘録

# はじめに
今日、新しい言語を始めようと思ってターミナルをたくさんいじったんですよ。当然コマンドとかよく分からないので色々調べて、調べた通りにやったんですけど、*”PATHを通す”*という作業がどうも理解できず…。

*「PATHってなんぞや？ファイターパスか？」*

みたいな感じでしたので、いろんな人に教えてもらったものとか調べたものから、**理解できた範囲内で**まとめてみようと思います！

### 環境
- MacOS Mojave


## PATHとはなんぞや①
まずは愚直にGoogle先生に聞きました。

**PATH とは　[検索]**
そしたらこんな感じの記事がたくさん出てきました！

- [PATHを通すために環境変数の設定を理解する (Mac OS X)](https://qiita.com/soarflat/items/d5015bec37f8a8254380)
- [読めばわかるMACでのPATH設定を完全理解](https://reffect.co.jp/windows/full_understanding_mac)

色々なサイトでお勉強してみたのですが、つまりPATHというのは、
**コマンドを実行するプログラムが保存されているディレクトリの場所を設定する環境変数**
だ、そうです。
うーんよく分からない…。

## ところで、そういえばコマンドってなんですか？
と、思った。
色々調べていくと、
**コマンドは実行ファイルのこと**だとわかりました。
コマンドには、全てそれぞれに対応する実行ファイルが存在するのです。
実際に`which`コマンドを使って、コマンドのありかを調べてみると…。

```bash
$ which pwd
/bin/pwd
```

ありましたー！どうやら/binというディレクトリに入ってるっぽいので早速`ls`で見てみましょう！

```bash
$ ls /bin
[		echo	   ls	    sleep
bash	ed		   mkdir    stty
cat		expr	   mv		sync
chmod	hostname   pax		tcsh
cp		kill	   ps		test
csh		ksh		   pwd		unlink
date	launchctl  rm		wait4path
dd		link	   rmdir	zsh
df		ln		   sh
```

おお〜。よくお世話になるコマンドがたくさん…！
これらすべてが実行ファイルでありコマンドであるということですね。

## PATHとはなんぞや②
コマンドの正体を暴いたところで、もう一度PATHについて考えてみます。

ターミナルではいっつもコマンド名(実行ファイル名)のみを打ち込むだけで実行してくれますよね。
でも本来は、ファイル名だけではなくフルパスを入力する必要があるらしいのです。フルパスというのは、ドライブ名から始めてすべてのディレクトリ名を指定して入力することです。
つまり、

```bash
$ pwd
```
としたい場合は、

```bash
$ /usr/local/bin/pwd
```
と書く必要があるということです。

「ええーめんどくさい。」

分かります。ということでそれを楽にしてくれてるのが環境変数PATHなんです。
さっき、PATHというのは、
>コマンドを実行するプログラムが保存されているディレクトリの場所を設定する環境変数

と書きました。コマンドの正体を知っているのでさっきよりは理解できるのではないでしょうか…！
長ったらしくフルパスを書かなくて済むように、**どこかにコマンドの居場所を書いておいている**のです。
そして、**そのどこかというのが環境変数PATH**ということです。



さっきから出てきている環境変数というのは、**コンピューターちゃんの覚え書き🌟**みたいなもんです。
ここの情報はすべてのアプリケーションから参照できるようになってます。
環境変数は、ターミナルで`printenv`と話しかけるとコンピューターちゃんが見せてくれます。
実際見て守ると分かりますが、ユーザー名とかホームディレクトリとかが書いてあります。もちろんその中にPATHもあります。
つまり、
**コンピューターちゃん「よく使う情報を環境変数としてまとめて書いておけばいつでもどこでも誰でも必要な情報をとってこれるようにしておいたよ🌟」**
ってことですね。~~四次元ポケットみたい。~~(??)

## 力尽きたのでここでおしまいです

PATH、なんとなく理解できてよかったです。
事の発端はJuliaをインストールしてパスを通したつもりが、何回やり直してもどうやっても`command not found`から抜け出せず……という事件でした。
「生半可な理解ではダメだ…」と思い勉強するに至ったのです。

そして、たった今さっき、やっとPATHが通ったんです！！よかった…
なぜダメだったのか、使いうちに研究してまとめて置こうと思います。

最後まで読んでくださりありがとうございました(＞＜)
簡易シャットダウンタイマー(バッチファイル)

# 機能

1. シャットダウンまでの時間を分単位で入力し、指定時間後、<br>シャットダウンする。

2. 「a」が入力された時は、シャットダウンタイマーを停止する。

---

```shell:shutdown.bat
@echo off

rem 文字入力
set /p input="shutdown(Minute or a) -> "
set temp=%input%

rem aが来たら、シャットダウンタイマー停止
if %input%==a (
    shutdown -a
    echo シャットダウンを中止
    pause
    exit
)

rem 数値列以外を弾く
echo %input%|findstr /r "^[0-9]*$" > nul
if errorlevel 1 (
    echo 無効な文字列が入力されました。
    pause
    exit
)

set min=60
rem 60をかけて、分単位に変更
set /a input=input*min
set command=shutdown.exe -s -t %input%
echo %temp%分後、シャットダウンされます。
%command%
pause
exit
```