OmniAICreator/Qiita-1.07M huggingface dataset:
25行で分かれgo言語における変数のスコープとシャドウイング

```go
package main

import (
	"fmt"
)

var i = 0

func main() {
	fmt.Println(i) // 0
	i := 1
	fmt.Println(i) // 1
	{
		fmt.Println(i) // 1
		i := 2
		fmt.Println(i) // 2
		for i := 3; i < 4; i++ {
			fmt.Println(i) // 3
			i := 4
			fmt.Println(i) // 4
			if i := i + 1; i == 5 {
				fmt.Println(i) // 5
				i := 6
				fmt.Println(i) // 6
			}
			fmt.Println(i) // 4
		}
		fmt.Println(i) // 2
	}
	fmt.Println(i) // 1
}
```

のっけからコードをベタ張りするスタイル。グローバル変数の定義からメイン関数の終わりまででぴったり25行です。

0. グローバル
1. メイン関数
2. ブロック
3. for文
4. for文の1ループ
5. if文
6. if文の一つの場合

これでわかるつもりで書いていますがわからない場合はコメントください。
Vagrant＆UbuntuでNode.jsを使ってみる - 1- 環境構築

#はじめに
自分はもう大分古い世代の開発者で、主に扱っていた分野はWindows&Visual Studioであり、日々の進歩が目まぐるしいWeb系の技術のうとさについて、とてつもない恥かしさを感じている日々です。
そこで、とりあえず `Node.js` について触れてみたいと思いました。
この記事は `Node.js` の導入と動作確認をした所までです。

以前にWindows7マシンにVagrantを導入する所までは実施しました。
[Windows7にVagrantを導入 - 失敗した事 - Qiita](https://qiita.com/rrryutaro/items/260f0f4bd0b1e550b6da)

#VagrantにUbuntuのboxを追加する
以前は `centos6-7` のboxを入れましたが、Ubuntuを使用することにしたので、 `ubuntu/trusty64` のboxを追加します。

```
vagrant box add ubuntu/trusty64
```

直接だとやはり結構時間がかかりますね・・・
とりあえず、この状態のboxをファイルにしておきます。

```
vagrant package
```

後々必要になるようなので、`Vagrantfile` に次の内容を追加しておきます。

```
  config.vm.network "forwarded_port", guest: 1337, host: 1337, id:"http"
```

仮想マシンの起動

```
vagrant up
```

Tera Termで接続して、とりあえずOSのバージョンなどを確認してみる。

```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.5 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.5 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
```

この環境に何が入っているのかがよくわかわないため、確認。

```
$ dpkg -l
```

アップデートしておく。

```
$ sudo apt-get update
```

#Node.jsのインストール
いくつかの情報を参考にして、`n` というのを利用する方法がやりやすかったです。
以下、参考にした記事のほぼ転載ですが・・・

(1) apt-getでNode.jsとnpmをインストール

```
sudo apt-get install -y nodejs npm
```

(2) npmでnをインストール
念のためnpmのキャッシュを削除してからnをインストールします。

```
sudo npm cache clean
sudo npm install -g n
```

(3) で安定版のNode.jsをインストール

```
sudo n stable
```

(4) 確認

```
node -v
v9.4.0
```

(5) apt-getでインストールしたNode.jsとnpmをアンインストール

```
sudo apt-get purge -y nodejs npm
```

参考にした記事で苦言を呈されている、まさに手抜き記事となっていますが・・・
これで、動く状態にはなったかと思います。

# Hello Worldの表示

```js:test.js
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337);
console.log('Server running at http://localhost:1337/');
```

```
$ node test.js
Server running at http://localhost:1337/
```

ブラウザで `http://localhost:1337/` を確認してみると、`Hello World`が表示されました。


といったところで、今回はとりあえずここまでとして、
今後もう少し理解を深めたら、整理した内容を記事にしたいと思います。

以上


#参考にしたもの
- [UbuntuにNode.jsをインストールするベストプラクティス - かまって☆しんどろ～む](http://kamatte.me/2017/08/17/ubuntu%E3%81%ABnode-js%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/)
- [Vagrant + Node.js + CentOS7 環境構築 - Qiita](https://qiita.com/yama-take/items/b1f89235d7987c0ec926)
- [2017年はNode.jsの達人になる！いま知っておきたいベストプラクティス10 - WPJ](https://www.webprofessional.jp/node-js-best-practices-from-the-node-gurus/)
- [インストール済みパッケージの確認コマンド（Ubuntu 11.10） | monopocket blog](http://monopocket.jp/blog/linux/925/)
Webpackがゴミである理由

昨日、産まれて初めてwebpackを触って一目でゴミだと確信した。
趣味で使うにはいいけど寿命の永い業務システムではダメ絶対。
理由としてはまず、
##### プロジェクトのためにテンプレートとして用意されるビルド用javascriptファイルが難解。
なぜこんな複雑なjavascriptを成果物に含めないといけないのか。
Vueとwebpackがこの先生きのこって、大いに発展を遂げた場合、自動生成プロセスが洗練され、やがてjavascriptファイルすら必要なくなる可能性もあるが、そうでないとき、周辺環境の変化に合わせたjavascriptファイルのメンテナンスが必要になる。
ミドルウェアのバージョンアップに合わせて毎回テンプレートプロジェクトを作成し、javascriptをコピーするのだろうか。
##### 標準的な操作にスクリプトが介在するのが不安
経験上、プロダクトの標準的な操作にスクリプト機能が含まれるのは、作成者側の逃げである。
開発するためのリソースが足りないか、規約や業界の歴史ゆえに自分たちのコントロールできない不具合があり、逃げ道としてスクリプト機能を設け、「例」として提供したい機能のスクリプトを公開する。
さらに、
##### 自分が書いたわけでもないファイルをgitに含めてjsの比率が上がるのが苦痛
フロントの開発でコンパイラ(笑)を使うのは時期尚早かと。
There was an error while trying to load the gem 'uglifier'. rails でこんなこと言われたら

```
Bundler::GemRequireError: There was an error while trying to load the gem 'uglifier'.
Gem Load Error is: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.
Backtrace for gem load error is:
/home/usr/vendor/bundle/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/runtimes.rb:58:in `autodetect'
```
単純にGemfileの↓のコメントアウトを消して`bundle install`すると治ります

```
#gem 'therubyracer', platforms: :ruby
```

どうやらJavaScript のライブラリを、Rubyで使えるようにしたGemっぽいです。
https://github.com/lautis/uglifier/

nodejsをインストールすることで、Gemをinstallしなくても使えるみたいです
MMSE-STSA法の音声強調・ノイズ除去をJSにポーティングしたがあと一歩うまく動かない話

現在、音声強調・ノイズ除去のプログラムに凝っていて、shunsukeaihara氏のpysspという音声強調・ノイズ除去のpythonライブラリを見つけたので、

https://github.com/shunsukeaihara/pyssp

それを利用したMSSE-STSA法の音声処理プログラムを書いて、諸事情でJS(node.js)にポーティングしてみました。

pysspではnumpyやscipyが多用されていますが、JSにもnumjsというnumpyもどきがあって、それを使って比較的、綺麗に書き換えられました。

で、pythonの実装がコレ
https://github.com/ryogrid/pyssp_mod/blob/c228347fb2d5d6e2c5fdf2135757d3273fb9f651/mmse_stsa_js.py
で、JSの実装がコレ
https://github.com/ryogrid/pyssp_mod/blob/d6f48b14de924a105fd29444a03218e0a7bd0874/mmse_stsa.js
なのですが、残念ながら、JS版は処理した音声が歪んでしまって、バグがあるか、Python版との差異があるかと思われますが、ずっとレビューしていますが、解決できていません。

どこか気付くところがあればご教授いただければ幸いです。

利用している数学関数がpythonで利用しているものと同じ値を返すことは確認しています。
ただ、fftとifftの関数が返す複素数の配列で、第2要素以降で実部と虚部が逆になっていることは確認していて、python版に合わせるために入れ替えたりはしてみたのですが、問題は解決しませんでした。また、入力についても入れ替えたりはしてみました。ここらへんが、どうも怪しいなあと思っていますが、打つ手なしの状態です。

あと、JS版は音声データの読み込みと書き出しをテキストで行っていますが、これは、JSでWaveファイルの読み書きがうまくできなかったためです。これが問題の原因でないことは確認しています。

以上です。
OpenCV（pkg-config込み）のインストール手順【Mac】

# 1. Homebrew を使う場合

Homebrewが使える場合は使ったほうがインストールが簡単です．以下の手順はYosemiteでの実行例です．Yosemite以外の方は2.のソースからインストールする方法でインストールした方が良いかもしれません．

1. 以下を実行
 
    `brew tap homebrew/science`
    `brew update`
    `brew install opencv3 --with-contrib --with-ffmpeg --with-opengl --with-python3`

    オプションに関しては https://www.learnopencv.com/install-opencv-3-on-yosemite-osx-10-10-x/ を参照

2. このままでは，pkg-configを使えないことから，下記の様にpkg-config用の設定ファイルをコピーする．
	
    `cd /usr/local/Cellar/opencv3/3.1.0_4/lib/pkgconfig`
    `sudo cp opencv.pc /usr/local/lib/pkgconfig/opencv.pc`

3. そして，このままではlibippicv.aにパスが通っていないことから，下記を実行しシンボリックリンクを貼る．
	
    `cd /usr/local/Cellar/opencv3/3.1.0_4/lib`
    `ln -s /usr/local/Cellar/opencv3/3.1.0_4/share/OpenCV/3rdparty/lib/libippicv.a` libippicv.a

4. また，下記のエラーが出る場合は，webpをインストール


        dyld: Library not loaded: /usr/local/opt/webp/lib/libwebp.6.dylib
        Referenced from: /usr/local/opt/opencv3/lib/libopencv_imgcodecs.3.1.dylib
        Reason: image not found


   `brew install webp`

# 2. Homebrew でインストールできない場合

Homebrewが使えない,またはインストールは完了したのにうまく動かない場合は,少々手間がかかりますが，ソースからインストールします．

## 作業用ディレクトリの作成とソースコードの入手


      $ mkdir workspace
      $ cd workspace
      $ git clone https://github.com/opencv/opencv.git
      $ git clone https://github.com/opencv/opencv_contrib.git
      # checkout オプションでブランチを変更するとOpenCVのバージョンを変更できる
      $ mkdir build


# lsを実行して以下のような感じになればOK
      

      $ ls
      build    opencv    opencv_contrib

##OpenCV3.0のインストール

[注意]ディレクトリ名に日本語が含まれるとエラーが発生する恐れあり

GUI版cmakeを起動


      $ cd build
      $ cmake-gui


Cmakeのオプション
Where is the source code: "opencv"までの絶対パスを記述
Where to build binaries : "build"までの絶対パスを記述
Configureをクリック
BUILD_EXAMPLES, WITH_TBB, WITH_OPENGL, WITH_QT(任意),の欄にチェックを入れる
OPENCV_EXTRA_MODULE_PATH に opencv_contrib/modules までのパスを記述
再度 Configureをクリック
Generateをクリック
端末に戻って


      $ make -j$(nproc)
      $ sudo make install
      $ sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf '
      $ sudo ldconfig


後は適当にコンパイルしてサンプルプログラムが動くか確かめる
VBAでExcelに数式（TeXみたいなやつのほう）を挿入

Officeの数式をVBAで書くにはどうすればいいかというメモ。

検索すると、Excelのセルで計算するほうの数式が引っかかってしまい、欲しい答えになかなかたどり着かなかった。

## 参考

* VBAで数式を書く方法
	* [Powerpoint 2013 vba create Equation / Mathzone - Stack Overflow](https://stackoverflow.com/questions/33347008/)
	* [Powerpoint VBA 数式を書く - Powerpoint VBAを使おう!](http://chemiphys.hateblo.jp/entry/2017/02/18/023855)
* 数式を文字列で表現する方法
	* [Word の行形式の数式と数式オートコレクト - Office サポート](https://support.office.com/ja-jp/article/word-の行形式の数式と数式オートコレクト-2e00618d-b1fd-49d8-8cb4-8d17f25754f8)
	* [UnicodeMath, A Nearly Plain-Text Encoding of Mathematics - Unicode Technical Notes](http://www.unicode.org/notes/tn28/)

## コード
<!--
[`CommandBars.ExecuteMso`](https://msdn.microsoft.com/ja-jp/VBA/Office-Shared-VBA/articles/commandbars-executemso-method-office) を使えば、リボンのボタンを押したのと同じ効果が得られる、ということらしい。
-->

```vb
Sub InsertEquation(left, top, str)
	ActiveSheet.Shapes.AddLabel(msoTextOrientationHorizontal, left, top, 0, 0).Select
	Application.CommandBars.ExecuteMso "InsertBuildingBlocksEquationsGallery"
	Selection.Text = str
	Selection.Font.Size = 24
	Selection.ShapeRange.TextFrame2.WordWrap = msoFalse
	Application.CommandBars.ExecuteMso "EquationProfessional"
End Sub

Sub Sample()
	InsertEquation 30, 40, "F(t)=\sum_(x=0)^(n-1) \of \begin f(x) e^(-\ii  2\pi tx/N) \end"
End Sub
```

![vba_insert_equation.png](https://qiita-image-store.s3.amazonaws.com/0/127130/1124289d-1891-57d1-6eee-6af7ad576b92.png)
sudoしたあともfunctionを引き継がせる

どうも。かちおです。
自分は、よくfanctionを使って「`vi(){vim $@}`」みたいなことをしています。
> ちなみに、aliasを使わないのは、aliasだと保管の際に不具合が起きるからです。

そして、aliasの場合は`sudo`でも引き継がれますが、functionの場合は引き継がれません。
つまり、`alias vi='vim '`をすると、`sudo vi hoge`をした際には、`sudo vim hoge`になりますが、`vi(){vim $@}`した場合には、`sudo vi hoge`は`sudo vi hoge`として実行されてしまいます。
これではsudoしたときに関数が引き継げません。

ということで以下のfunctionとaliasを.bashrcなどに追加します。

```bash
sdo() sudo zsh -c "$functions[$1]" "$@"
alias sudo="sdo"
```

まず、sudoのかわりにsdoというfunction（コマンド）を作成し、$functionという、シェルに登録された関数がすべて保管されている便利な変数を実行します。そして本来のコマンドを実行します。
次に、aliasでsudoを売ったときにsdoが実行されるようにします。

本体は、sudoというfunctionを作成したかったのですが、そうやらそれは怒られてしまうようなので、このような形になりました。


参考: https://unix.stackexchange.com/questions/317687/command-not-found-when-sudoing-function-from-zshrc
Accessのクロス集計で列を固定する

# はじめに
Accessでクロス集計をするとき、列の順番が指定できなかったり、集計結果によって列が出なかったりします。
そんなときに、列を固定する方法です。

![0001.JPG](https://qiita-image-store.s3.amazonaws.com/0/230850/8659c4c8-9314-2d2c-ee6e-cb562172a8de.jpeg)
集計結果にない列は表示されない

# 列を固定する方法
クエリのプロパティシートのクエリ列見出しに、表示させたい列名を「,」で区切って入力します。
そうすれば、指定した順番で指定した列のみが表示されます。

# 手順
詳しく手順を説明します。（Access2016での手順です。）

クエリをデザインビューで開きます。
![0002.JPG](https://qiita-image-store.s3.amazonaws.com/0/230850/61e94348-c5f1-cde7-6bbe-a6408e2dddb7.jpeg)

デザイングリッドの列見出しのフィールドをクリックします。
![0003.JPG](https://qiita-image-store.s3.amazonaws.com/0/230850/7bee3003-8cb1-4997-ba93-e50a2038eeab.jpeg)

プロパティシートのクエリ列見出しに表示させたい列名を「,」で区切って入力します。
例："04月","05月","06月","07月","08月","09月","10月","11月","12月","01月","02月","03月"
![0004.JPG](https://qiita-image-store.s3.amazonaws.com/0/230850/b7e01847-5fb7-1554-411a-0081f874792c.jpeg)

実行すると、クエリ列見出しに指定した順番で列が表示されます。
![0005.JPG](https://qiita-image-store.s3.amazonaws.com/0/230850/e4611cd8-0d40-7a60-3a18-366c764adb6d.jpeg)

# SQL文の書き方
ちなみに、デザインビューではなくSQL文で書く場合はこんな感じです。

```SQL
--列を固定しない場合
TRANSFORM Sum(売上.売上金額) AS 売上金額の合計
SELECT 売上.商品コード, 売上.商品名
FROM 売上
GROUP BY 売上.商品コード, 売上.商品名
ORDER BY 売上.商品コード, 売上.売上月
PIVOT 売上.売上月;
```
```SQL
--列を固定する場合
TRANSFORM Sum(売上.売上金額) AS 売上金額の合計
SELECT 売上.商品コード, 売上.商品名
FROM 売上
GROUP BY 売上.商品コード, 売上.商品名
ORDER BY 売上.商品コード, 売上.売上月
PIVOT 売上.売上月 In ("04月","05月","06月","07月","08月","09月","10月","11月","12月","01月","02月","03月");
```

PIVOT句の後に「In ()」で指定すれば、列を固定することが出来ます。

# おわりに
クエリ列見出しで指定した列以外は表示されないので注意が必要ですが、列を固定するか、集計結果によって列を動的に変化させるか、場合によって使い分けると便利かもしれません。
Accessのクエリがエラーで開けなくなったら

# はじめに
以前にAccessを使って作業していたときに、クエリを開こうとしてもエラーが出てしまい開けなくなることがありました。
実行もできなければ、エラーが出て編集することも出来ない。
クエリを作り直すにも、中身のSQL文を見ることができないので困りました。

![0001.JPG](https://qiita-image-store.s3.amazonaws.com/0/230850/47ae3d08-719d-4ad0-e959-1b58bda92a64.jpeg)
このようなエラーが出てクエリを開くことが出来ない

滅多に起きなさそうな現象なので、同じように困った事のある人がいるのか分かりませんが、クエリが開けなくなってしまったときに中身のSQL文を見る方法を紹介したいと思います。

# クエリの内容を見る方法
VBEのイミディエイトウィンドウに
**? CurrentDb.QueryDefs("クエリ名").SQL**
と入力してEnterを押すだけです。

# 手順
詳しく手順を説明します。（Access2016での手順になります。）
**Alt + F11** を押し、Visual Basic Editorを開きます。
![0002.JPG](https://qiita-image-store.s3.amazonaws.com/0/230850/29e5d807-61f1-388d-f87d-8e1b4ecde365.jpeg)

メニューの **表示→イミディエイトウィンドウ** を選択し、イミディエイトウィンドウを表示します。
![0003.JPG](https://qiita-image-store.s3.amazonaws.com/0/230850/d8835493-a69c-a158-ac17-85d7aed5230b.jpeg)
![0004.JPG](https://qiita-image-store.s3.amazonaws.com/0/230850/5661c6bc-6231-6371-2664-9545d9ff43c7.jpeg)

イミディエイトウィンドウに
**? CurrentDb.QueryDefs("クエリ名").SQL**
と入力し、Enterを押します。
（"クエリ名"の部分は、SQL文を表示したいクエリの名前を入れてください。）
![0005.JPG](https://qiita-image-store.s3.amazonaws.com/0/230850/1421464e-796d-3d4d-6ef6-ad410342da04.jpeg)

SQL文が表示されます。
![0006.JPG](https://qiita-image-store.s3.amazonaws.com/0/230850/f7f49115-3bab-5575-88f2-2181de057409.jpeg)

# エラーの原因
ちなみに私が経験したエラーは、フィールド名の先頭に全角のアラビア数字があるのが原因でした。
エラーを回避する為には全角のアラビア数字から始まるフィールド名を使わないか、フィールド名を[]で囲むとよいようです。

通常であれば全角のアラビア数字から始まるフィールド名を使用したクエリは、フィールド名を[]で囲まないと構文エラーによりそもそも保存が出来ないのですが、なんらかの理由で構文エラーがあるまま保存されてしまい、クエリを実行できず編集することも出来なくなったのです。

この記事を書くためにエラーを再現しようとしたのですが、Access2016では再現できなかったので改善されているのかもしれません。
以前にエラーが出たAccessのバージョンは2007でした。

もし、同じようにクエリが開けず困った人の参考になれば幸いです。
ServiceNowでログイン直後に特定のURLにRedirectする

Version: Istanbul

# 作るもの

ServiceNowでログイン直後に特定のURLにRedirectさせます

ここに書いてる内容をそのまま試しただけですが成功したので記事にして置きます

https://docs.servicenow.com/bundle/istanbul-servicenow-platform/page/build/service-portal/concept/c_SPSSOLoginAndRedirects.html

**※リダイレクトの設定を入れた後に全セッションでログアウトしてから再ログインすると常にリダイレクトされて何も操作出来ないインスタンスになってしまう可能性がありますadmin権限でログイン済みのセッションを別ブラウザなどで保持しながら作業することをオススメします**

# System Porpertiesに値を追加

Filter Navigatorにsys_properties.listと入力しSystem Propertiesの一覧を表示して[New]ボタンを押下し、以下の値を追加します。

|Suffix|Name|Type|Value|Description|
|-----------------|------------------|------------------|------------------|------------------|
|glide.entry.first.page.script|glide.entry.first.page.script|string|new SPEntryPage().getFirstPageURL()|First page after authentication|

# Script Includeを編集

Filter NavigatorにScript Includeと入力し、System Definition > Script Includesの一覧を表示します。一覧のNameにSPEntryと入力し、SPEntryPageを表示後、(i)アイコンかNameをクリックして編集画面に遷移します。

こうなっている箇所を

```
	initialize: function() {
		gs.addErrorMessage(user);
		this.logVariables = false;  // for debugging 
		this.portal = "/sp/";      // The URL suffix specified in the sp_portal record
	},
```

こうします。


```
	initialize: function() {
		gs.addErrorMessage(user);
		this.logVariables = false;  // for debugging 
		//this.portal = "/sp/";      // The URL suffix specified in the sp_portal record
		this.portal = "http://www.example.com";
	},
```

これでRedirectの設定が出来ました。

# ユーザ名を判定してRedirect先を変更する

やり方は色々あると思いますが、SPEntryPageの以下のfunction辺りで

```
	getFirstPageURL: function() {
```

最後の方でこうなっている箇所とかを

```
		this.logProperties('after', session);
		if (!this.logVariables) {
			gs.log('redirectURL: ' + redirectURL);
			gs.log('User: ' + user.getName());
			gs.log('is internal: ' + (!user.hasRoles()));
			gs.log('returnUrl: ' + returnUrl);
		}

		return returnUrl;
```

こうとかします。

```
		this.logProperties('after', session);
		if (!this.logVariables) {
			gs.log('redirectURL: ' + redirectURL);
			gs.log('User: ' + user.getName());
			gs.log('is internal: ' + (!user.hasRoles()));
			gs.log('returnUrl: ' + returnUrl);
		}
		if (user.getName() == "usu")
			return "https://ja.wikipedia.org/wiki/%E8%87%BC";
		if (user.getName() == "kine")
			return "https://ja.wikipedia.org/wiki/%E6%9D%B5";
		return returnUrl;
```
【備忘録】AWS ECRにdocker pushした際にno basic auth credentialsとなった場合の解決方法

# 問題点

ECRにコンテナイメージを`docker push`した際に`no basic auth credentials`となってしまい、pushが出来なかった。

```shell-session
$ aws ecr get-login --no-include-email --region ap-northeast-1
docker login -u AWS -p xxxxx== https://xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com

$ docker login -u AWS -p xxxxx== https://xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded

$ docker push xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxx:latest
The push refers to repository [xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxx]
dbee35a328d0: Preparing
77bf014019f2: Preparing
82cdb9879505: Preparing
...

no basic auth credentials
```

# 参考

[Amazon ECR 使用時の Docker コマンドのエラーのトラブルシューティング \- Amazon ECR](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/common-errors-docker.html#error-403)

公式サイトのトラブルシューティングでは`no basic auth credentials`の原因がいくつか取り上げられていたが、自分の環境では該当しそうなものがなかった。

- 別のリージョンに対して認証されている
- トークンの有効期限が切れた。
- wincred 認証情報マネージャーのバグ

# 原因

`docker push`を実行してる環境のアクセスキーが別アカウントのものになっていた。

## `docker push`を実行してる環境のアクセスキー情報

```shell-session
$ aws configure
AWS Access Key ID [****************IUJD]:
AWS Secret Access Key [****************EuiN]:
Default region name [ap-northeast-1]:
Default output format [json]:
```

## ECRを利用しているAWSコンソールのアクセスキー情報

![ecr.png](https://qiita-image-store.s3.amazonaws.com/0/141934/42c676e3-7523-3d45-b1d7-3492ff317dc7.png)

# 解決方法

AWS CLIにECRを利用しているAWSアカウントのアクセスキーを設定して、 Dockerクライアントの認証とプッシュコマンドを再度実行したら`docker push`が成功した。

```shell-session
$ aws configure
AWS Access Key ID [****************IUJD]: ****************IXYQ
AWS Secret Access Key [****************EuiN]: ********************
Default region name [ap-northeast-1]:
Default output format [json]:
```

```shell-session
$ aws ecr get-login --no-include-email --region ap-northeast-1
docker login -u AWS -p xxxxx== https://xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com

$ docker login -u AWS -p xxxxx== https://xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded

$ docker push xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxx:latest
The push refers to repository [xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxx]
dbee35a328d0: Pushed
77bf014019f2: Pushed
82cdb9879505: Pushed
...

latest: digest: sha256:d4c79d7f9b26762a139b150fdf65fa55c47d1673f4cc55659ed9969ddf03db8b size: 5947
```
JetBrainメールアドレス変更

下のリンクから変更が出来ます。
<https://account.jetbrains.com/profile-details>

下のサイトでは変更できないようです。（gmailのアカウントへの変更が出来なかったり、verifyメールで認証したのに変更が反映されなかったり）
<https://sales.jetbrains.com/hc/en-gb>

↑サポートにメールして教えてもらったQ&Aサイト。
Numpy > array > 1列目の値がXXXまでの行数を数える > transpose + count_nonzero()

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

### 処理概要

```py
ys = [
	[0.0, 3, 1, 4],
	[0.5, 1, 5, 9],
	[1.0, 2, 6, 5],
	[1.5, 3, 5, 8],
	[2.0, 9, 7, 9],
	]
```

- 1列目の値は昇順
- 1列目の値が閾値以下の行数を数える
    - 例: 閾値1.0の場合、3を返す

### Link

https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.sort.html

count_nonzero()は使ったことがないので使ってみる。

### code

```test_find_lastrow_180120.py
import numpy as np

# on Python 3.5.2

ys = [
	[0.0, 3, 1, 4],
	[0.5, 1, 5, 9],
	[1.0, 2, 6, 5],
	[1.5, 3, 5, 8],
	[2.0, 9, 7, 9],
	]
yns = np.array(ys)

#
THRESHOLD = 1.0
firstColTr = (yns.transpose() <= THRESHOLD)[0]
cnt = np.count_nonzero(firstColTr)

print(firstColTr)
print(cnt)

```

```txt:run
$ python3 test_find_lastrow_180120.py 
[ True  True  True False False]
3
```

### 備考

axis=1と何かの関数を組み合わせるともっと簡単かもしれない。
Pythonで簡単にC++で作成したDLLをテストしてみる

# やりたかったこと
Unity C#でDLLを使用したかったが動作しなかったので、Pythonを使ってDLLに問題がないか簡単にテストしてみる

# 前提
実行するPythonスクリプトファイルはDLLと同じディレクトリにある必要がある。
今回のDLLのファイル名は「DLLForDebug.dll」、DLLには二つのint型の変数を足して返す関数「add」が存在する。

# コード
```Python
from ctypes import *

# DLLの読み込み
dll = cdll.LoadLibrary("./DllForDebug.dll")

# DLL内の関数を呼び出して出力する
print(dll.add(1, 2))
```

# 結果
```

3
```
【ネタ】console.log()の前にびっくりすると真になる話

#どういう事？

こういう事

```js:repl
> !console.log('aaaaa');
'aaaaa'
true
```

#どうしてこうなるのか？

JavaScriptでは```function```の戻り値の定義がない（```return```文で値を返さない）場合、実行時に```undefined```が返される。
そして実行環境が提供する```console.log()```などの機能には戻り値の定義がない。

undefinedは真偽値の求められる文脈では```false```の様に*偽*として扱える仕様になっているため、論理否定演算子であるエクスクラメーションマーク(```!```)の直後に出現すると真偽値として扱われ、結果的に式の評価が*真*になる。

#使いどころは？

こういう風に中間操作で副作用させるくらいしかない

```js:repl
> [1, 2, 3, 4].filter(e => !console.log(e));
1
2
3
4
[1,2,3,4]
```

トリッキー過ぎなので製品コードに組み込むのはNG。
functionがundefinedを返してくれる事に依存するので、何か具体的な値が返るように仕様が変わると破綻する。
こんな書き方のコードが正式版に入ってたら見た人はびっくりするだろう。
いわゆる「くれ悪[^1]」である。

[^1]: 「くれぐれも悪用はせんようにな」の略
Serverless FrameworkでLambda@Edgeにデプロイする時のserverless.ymlのrole

## やりたいこと

- 既存のDistributionのbehaviorに対してLambda@EdgeをServerless Frameworkでデプロイしたい


## 背景

- 記事執筆時点ではServerless本体ではまだLambda@Edgeがサポートされていない
    - https://github.com/serverless/serverless/issues/3944
    - https://twitter.com/horike37/status/954972750078083072
        - `Lambda@EdgeがAWSの仕様上削除できない = serverless removeがコケるのでコアに取り込めないのです。` なるほど...
- pluginはあるが、既存のDistributionのbehaviorに対してのデプロイはサポートされていないっぽい？
    - https://github.com/silvermine/serverless-plugin-cloudfront-lambda-edge


## 実現方法

- 現状Serverlessで完結は無理そうだったので、LambdaのデプロイだけServerlessでやる
- CloudFront behaviorとの紐付けは管理画面でぽちぽちやる

## Lambda@Edge用のrole設定

普通にServerlessでデプロイした時のデフォルトのroleだと、Lambda@Edgeに紐付けしようとしたらエラーが出た。
Lambda@Edge用のrole設定が必要で、下記のようなserverless.ymlのrole設定でデプロイしたらOKだった。

```serverless.yml
service: serverless-lambdaedge

provider:
  name: aws
  runtime: nodejs6.10
  region: us-east-1 # このregionじゃないとエラー
  memorySize: 128
  timeout: 5
  role: LambdaEdgeRole

functions:
  hoge:
    handler: functions/hoge.handler

resources:
  Resources:
    LambdaEdgeRole:
      Type: AWS::IAM::Role
      Properties:
        AssumeRolePolicyDocument:
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - lambda.amazonaws.com
                  - edgelambda.amazonaws.com
              Action:
                - sts:AssumeRole
        Policies:
          - PolicyName: ${opt:stage}-serverless-lambdaedge
            PolicyDocument:
              Version: '2012-10-17'
              Statement:
                - Effect: Allow
                  Action:
                    - logs:CreateLogGroup
                    - logs:CreateLogStream
                    - logs:PutLogEvents
                    - logs:DescribeLogStreams # これは無くてもOKかも？
                  Resource: 'arn:aws:logs:*:*:*'
                - Effect: "Allow"
                  Action:
                    - "s3:PutObject"
                  Resource:
                    Fn::Join:
                      - ""
                      - - "arn:aws:s3:::"
                        - "Ref" : "ServerlessDeploymentBucket"
```
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十六章 大規模な構造3 責務のレイヤ

# これまでの１６章
[進化する秩序](https://qiita.com/YasuhiroKimesawa/items/b6c42408b7912fd691b5)
[システムのメタファ](https://qiita.com/YasuhiroKimesawa/items/692d173aa24921f8fea1)

# 責務のレイヤ

大きく増えた、コンテキスト群を整理するために、**責務のレイヤ**を利用します。

レイヤアーキテクチャと同じように、上のレイヤは下のレイヤを参照できるが、下のレイヤは上のレイヤを参照はできない。

確かに、レイヤ化すると整理がしやすく、見通しが良くなるかもしれない。
問題はどうレイヤを発見するか？

まずは、モデルの依存関係を調べる。
それによって、自然なレイヤが出来ているのが発見できるかもしれない。

ただ、それぞれのレイヤに意味が見いだせなければ、整理はできるが、それ以上のモデルに対する洞察やモデルに関する意思決定はできない。

なので、ただの依存関係ではなく、**概念上の依存関係**を調べるのが大事。

そして、レイヤが何を意味しているのかを知ること。**その責務はシステムの目的と設計を語るもの**であること。各オブジェクト、集約、モジュールがレイヤの責務の範囲に収めること。

**ドメインが頻繁に変更されたりする箇所や、その原因**がそのレイヤの責務を表している可能性もあるので注視しておくと良いかもしれません。

また、レイヤ自身も切り替え、マージ、分離などで再定義されるものです。

## 自分のドメインでは？

大規模な構造の各パターン今まで採用したことがないのですが、
このパターンを読んで、自分の今のドメインであるECサイトでもいけるかもと思いました。

たとえば、実際の売買（金流・物流)を責務とする層と顧客対応や経理等の業務を責務とする層とか。
業務を責務とする層は売買を責務とする層を利用するが、逆はないのでレイヤ化できそうです。

今回はなかなか、うまくすれば使えそうなパターンですね。
DataStoreのEntityの存在チェック

# Entityの存在チェック方法

# クエリで確認

```go

func isExistsUser(g *goon.Goon, identifier string) (bool, error) {
	key := g.Key(&User{Identifier: identifier})
	var users []User
	q := datastore.NewQuery("User").Filter("__key__ =", key).Limit(1).KeysOnly()
	if _, err := g.GetAll(q, &users); err != nil {
		return false, err
	}
	if len(users) == 0 {
		return false, nil
	}
	return true, nil
}
```

クエリを組み立てて探す

# Getで探す

↑のクエリでの検索は、トランザクション内の場合に「Only ancestor queries are allowed inside transactions」と言われて実行出来ない。
その場合はGetで探す

```go
user := &User{Identifier: identifier}
err := g.Get(user)
if err != nil {
  if err != datastore.ErrNoSuchEntity {
    return nil, err
  } else {
    if _, err := g.Put(wallet); err != nil {
      return nil, err
  }
}
return wallet, nil
```

エラーチェックだけではなく、エラーが`ErrNoSuchEntity`であることを確認すること。しないと他の要因でエラーが出た時に危ない。
EmacsはEditorそしてFinder => つまり環境なんだよ

僕がEmacs使い始めて検索機能を使ったときはこれをずっと使い続けるのは無理だと思った。
`C-s`で検索機能を起動できるけどカーソルがあるところから下に向けて検索するだけ。
上に向けて検索するときは`C-r`になる。
これを使うのは辛かった...
しかしEmacsには強力無比な拡張機能が、そうパッケージの数は可能性そのものなんだよ

## Anzu
[anzu/github.com](https://github.com/syohex/emacs-anzu/tree/e6c56ca8b23ac433f7be58b6f3f50801dd4164e4)
検索したところがハイライトされてすぐに分かる！
これでひとまずGoogleChromeで検索したみたいな感じになる
今までは検索はしてもどこの部分を探してたのかわからんかったからこれはこれで便利！って気持ちだった
<img width="381" alt="スクリーンショット 2018-01-20 2.35.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/189219/7652a78b-865d-81d4-9509-9453172415df.png">

## Migemo
普通に検索するのもありだけどこいつがすごいのはローマ字で `ohayo`と検索するとおはようと書いてあるところを探せてしまうところ！
最初に設定したりとかMigemo用のライブラリ突っ込んだりしないといけないんだけど次に書くHelmと合わせて使うとすごい


## Helm登場
Helmを導入してからファイルの検索するのは最高だった。
絞り込み検索が便利すぎでなんでも探せる万能感はまさに神のごとし...
検索機能を起動してほしいデータを入力するとどんどん絞り込んでくれる↓
<img width="938" alt="スクリーンショット 2018-01-20 2.30.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/189219/02903601-e367-6514-bcd7-14703e38f013.png">
Helmの素敵なところはファイルだろうがディレクトリだろうがEmacsのコマンドだろうがその他もろもろすべて統一のインターフェースで検索してくれるところ
そもそも直感的に使えるものをさらによく使えるようにしてくれてるのでほんとに良い
そしてHelmはGithubにもあるように拡張機能をユーザーが追加できるようになっているところ。
これによって更にEmacsの幅を広げることに貢献している。

例えば
### Helm-ag
`ag`はgrepみたいなもの！
Helmがagを取り込むことによって複数のファイルの中身を検索しその結果を絞りこめるようにしてくれてる
<img width="776" alt="スクリーンショット 2018-01-20 2.42.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/189219/4f5cf86a-1feb-d58f-ac0f-a592e516407e.png">
↑これがが...
↓こうなる！
<img width="569" alt="スクリーンショット 2018-01-20 2.42.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/189219/a42ac8e9-806c-a335-20bb-459845777b43.png">
もちろんさらにキーを入力することで絞り込んでくれるしエンターキーを押せばそのファイルのその行にジャンプしてくれる！神機能！

### helm-ls-git-ls
自分が何か新しいコードを書く時はほぼGit支配下に置いている。
で、helm-ls-git-lsはそんなリポジトリのファイルを絞込検索することができる！
開発の規模が大きくなっていくつものディレクトリを遡ったりしないと行けない！そんな時でもこのコマンドなら必要なファイル名を打っていけば自然と絞り込まれるのですぐに探せる！

### helm-swoop
Emacsは複数のファイルを同時に開いて編集することができるという極めてスタンダードなエディタです。
で、このhelm-swoopはそんな開いているファイルの中身をごっそり検索することができる機能なんです！
しかも検索結果はhelmのインターフェースに則って表示されるのでどんどん絞り込んでいけるしエンターキーでそのファイルのその行にピンポイントに移動することができる！


## つまりは
Emacsは一度慣れてしまえば検索だろうが編集だろうがなんでもできる
環境なんです。
古今東西ファイルを編集することに特化したエディタは数あれど本当にエディタの領分なのか？ってことをここまでしっかり詰めてくれるのはEmacsだけですよ！
だからEmacsはやめられないんですねぇ...
.apk をダブルクリックしてインストール＆実行

Windows環境用にバッチファイル(CMD.EXE)の機能だけで実現しました。

Android端末を開発者モードに設定する等の準備はもちろん必要です。

拡張子 .apk のファイルに関連づけて使って下さい。
バッチファイルなのでコマンドプロンプトが開きます。
あまりオシャレではないですがそこはガマン。

adbコマンドにパスが通っている事を前提としています。
不都合な場合は適当に改造して下さい。

```batch:apk_launch.bat
@echo off
setlocal enableextensions
rem adbコマンドにパスが通っているものとする。
rem set ASDK=%ANDROID_HOME%
for /f "delims=" %%i in ('where adb') do set ASDK="%%~dpi.."
for /f "delims=" %%i in ('dir /b %ASDK%\build-tools') do set AVER=%%i
set PCKG=
for /f "tokens=1,2,3 delims== " %%i in ('"%ASDK%\build-tools\%AVER%\aapt.exe" dump xmltree %1 AndroidManifest.xml') do if not defined PCKG if %%i%%j==A:package set PCKG=%%k
echo Package = %PCKG%
echo on
adb shell am force-stop %PCKG%
adb install -r %1
@if ERRORLEVEL 1 goto :ERR
adb shell monkey -p %PCKG% -c android.intent.category.LAUNCHER 1
@timeout /t 5
@exit /b

:ERR
@pause
@exit /b 1
```

```registry:apk_launch.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.apk\shell\Open\command]
@="C:\\Programs\\bin\\apk_launch.bat \"%1\""

```
※パスは適宜修正して下さい

### 他の記事
[PCからダブルクリック一発でapkインストール(Windows)](https:/u_one/items/d7c752aaf501133ffa02)
[apkをダブルクリックでAndroid実機へ転送＆実行](https:/kobake@github/items/f064a80e9b7e42175a30)
CPUの挙動について

# CPUの命令実行

投機実行と分岐予測について書いた記事にいくつかコメントが付いたので補足します。

コンパイラが生成した機械語の命令をCPUが逐次実行しますが、機械語の命令に依存性がない場合、例えば次のような三行の命令列の場合、一行目の結果を待つことなく二行目を実行できます。三行目は一行目と二行目の結果を使いますので、三行目の実行はこれらの結果が終わるのを待ちます。

ADD AX, 1 // AXに1を加算
ADD BX, 1 // BXに1を加算
ADD AX, BX // AXにBXを加算

このような場合、モダンなCPUでは一行目と二行目を同時に実行するよう、マイクロコードを合成します。このような処理をOut of order実行と呼びますが、この処理を行うために各レジスタの依存関係を解析しています。現在のコンパイラではさらにこのように依存性のない命令の組み合わせになるよう機械語を生成し、Out of order実行の比率を可能な限り上げるような最適化も行われているのです。
GoでSpotify APIを使うょ🍼

# GoでSpotify API、叩きたいですよね

## OAuthが面倒

SpotifyはWeb APIを提供していますが、実際に使うにはOAuthの認証フローを踏まなければいけず、面倒臭いです。 [Spotify Web API](https://developer.spotify.com/web-api/)
また、Goの場合レスポンスのJSONに合わせて構造体を定義しなければならず、これもまた面倒です。

## ライブラリ作りました

Spotify APIを使う上での面倒な部分をラップしたライブラリを作りました。

gotify: [https://github.com/gericass/gotify](https://github.com/gericass/gotify)

### 仕様

- gotifyでは3種類あるSpotify APIの認証フローの内、[Authorization Code Flow](https://developer.spotify.com/web-api/authorization-guide/#authorization_code_flow)をサポートしています。（全てのエンドポイントが使えるので）
- 各エンドポイント毎に関数と構造体を定義しています。

## 導入

- `go get github.com/gericass/gotify`
- サーバーからSpotify APIを叩くにはHTTPS化しなきゃいけないっぽいので証明書を発行

## 使い方

[echo framework](https://github.com/labstack/echo)を使った例

```main.go
package main

import (
	"github.com/gericass/gotify"
	"github.com/labstack/echo"
	"github.com/labstack/echo/middleware"
)

const clientID = ""
const clientSecret = ""
const callbackURI = "https://localhost:3000/callback/"

func main() {
	e := echo.New()
	e.Pre(middleware.HTTPSRedirect())
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())

	Auth = gotify.Set(clientID, clientSecret, callbackURI)

	e.GET("/", Handler)
	e.GET("/callback/", CallbackHandler)
	e.GET("/refresh/", RefreshHandler)

	// Require HTTPS
	e.Logger.Fatal(e.StartTLS(":3000", "cert.pem", "key.pem"))
}
```

```handler.go
package main

import (
	"net/http"

	"github.com/labstack/echo"

	"github.com/gericass/gotify"
)

var Auth gotify.OAuth
var Token gotify.Gotify


func Handler(c echo.Context) error {
	url := Auth.AuthURL() // Get the Redirect URL for authenticate
	return c.Redirect(301, url)
}

// CallbackHandler : Controller for https://localhost:3000/callback/
func CallbackHandler(c echo.Context) error {

	t, err := Auth.GetToken(c.Request()) // Get the token for using Spotify API
	if err != nil {
		return err
	}
	Token = t

	return c.String(http.StatusOK, "Authentication success")
}

// RefreshHandler : Controller for https://localhost:3000/refresh/
func RefreshHandler(c echo.Context) error {

	err := Token.Refresh() // Refreshing token for using Spotify API
	if err != nil {
		return err
	}

	return c.String(http.StatusOK, "AccessToken Refreshed")
}
```

1. `go run $GOROOT/src/crypto/tls/generate_cert.go --host localhost`でオレオレ証明書を発行します
2. Spotify APIのClient ID, Client Secret, Callback URIをセットします
3. `go run main.go`を実行します
4. `https://localhost:3000/`にアクセスするとログインページにリダイレクトされます
5. ログインページでログインすると`/callback/`にリダイレクトされ、APIコール用のトークンが取得できます
6. トークンを使って各エンドポイントにアクセスできます

## サンプル

サンプルアプリケーションを用意しました。⇨ [gotifySample](https://github.com/gericass/gotifySample)

## 参考

- [Spotify WEB API User Guide](https://developer.spotify.com/web-api/user-guide/)
- [echo HTTP/2 Recipe](https://echo.labstack.com/cookbook/http2)
Google Apps Script(GAS) でファイルにログ出力できるライブラリを作りました

Google Apps Script(GAS)。サーバいらずで、色々なプログラムが書けるので、結構利用する機会があると思う。
インターン生にサーバを提供せずにSlackのbotを作ってもらうときなどに非常に楽。

しかし、ログをファイルに出力するという普通のサーバプログラムでは当たり前のようなことも、結構面倒だった。
探しても簡単に実現できそうなライブラリがなさそうなので、自分で作ってみた。

## Google Apps Script(GAS) 用ファイルへのログ出力ライブラリ FileLogger
下記 Github で公開しました。
https://github.com/seteen/google-apps-script-file-logger

## 何ができる？
ログ用のファイルを自動で、スクリプトと同階層のフォルダに作成し、そこに対してログ出力が追記されるようになる。
自動でログがファイルに出力されるので、例えば何かしらのエラーが発生したときなどにログが参照できるようになります（通常のサーバプログラムでは当たり前に存在する機構）。

## インストール
Google Apps Script の画面で、
メニューの
リソース -> ライブラリ
と選択。
ライブラリを追加、の入力に下記を入力して追加ボタンを押す。
```
1bWIXL3PmJQdgAjvUxY_qxStfTIdIMe7qwIqHq78XXzL3zyyVuhVvhI1S
```
バージョンは最新に指定。

## 仕様
`FileLogger` は、関数をひとつだけ持つというシンプルなものにした。

### FileLogger.logging(callback)
`FileLogger.logging` は パラメータとして `callback` を持つ。
この `callback` が終わった時に、それまでに `Logger` (Google Apps Script標準のロガー) で出力されたログを全てファイルに吐き出す。
出力されるファイルは、実行スクリプトがあるフォルダーに `script.log` という Google Document で作成される。
もしすでに `script.log` が存在する場合は、ログが追記され、存在しない場合は作成されてログが書き込まれる。

## 使い方
使い方はこんな感じ。例えば、 `myFunction` というのが実行したい関数だとすると、下記のような書き方をする。

```
function myFunction() {
  FileLogger.logging(function(){
    // your code here.
    Logger.log('test log');
  });
}
```

こうすることで、 `test log` というログが `script.log` に書き込まれる。

もっと工夫したらもっと便利なものができるのかもしれないが、こういう機能が欲しい、という人はGithubにIssueを作るかPRを出してくれるとはかどります。
Railsのテスト環境でcookieを使う時の工夫

Railsのテスト環境において暗号化cookieを使うとちょっとしたエラーが出る。

```text:こんなの
NoMethodError: undefined method `signed' for #<Rack::Test::CookieJar:0x0000000XXXXXXXX>
```

これは、テスト環境においてRailsが使用しているライブラリが本番環境（および開発環境）のそれと違うために起きる問題...らしい

[Railsチュートリアル内の「テスト内ではcookiesメソッドにシンボルを使用できない」という問題](https://qiita.com/Anorlondo448/items/93d1520be8723287aec6)
↑参考にさせていただきました記事

暗号化（signed）と同様に、永続化（permanent）cookieも使えない。
このままではテストができないため、なんとかする。

---
まずは、cookieを一元的に管理する関数をApplicationHelperで定義する。

```ruby:app/helpers/application_helper.rb
module ApplicationHelper

  ...

  #cookie取得
  def getcookie(tag)
    cookies.signed[tag]
  end
  #cookie保存
  def setcookie(tag, value)
    cookies.permanent.signed[tag] = value
  end
  #cookie削除
  def deletecookie(tag)
    cookies.delete(tag)
  end
end
```
そして、ソースコードからcookieを呼び出す時は、**必ずこの関数を使って**呼び出すようにする。

続いて、テスト環境でのみ、この関数をpermanentやsignedを使わないものに書き換える。

test_helper.rbというファイルにおいて、テスト環境でのみ使用する関数を定義することが出来る。ここで前述のApplicationHelperモジュールを上書きする。

```ruby:test/test_helper.rb
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'

class ActiveSupport::TestCase
  fixtures :all

  ...

  module ApplicationHelperFixes
    #テスト用に再定義を行う

    #cookie取得
    def getcookie(tag)
      cookies[tag.to_s]  #signed使わない
    end
    #cookie保存
    def setcookie(tag, value)
      cookies[tag.to_s] = value  #signed,permanent使わない
    end
    #cookie削除
    def deletecookie(tag)
      cookies.delete(tag.to_s)  #これはとくに変わりなし
    end
  end
  #変更を適用する
  ApplicationHelper.send :prepend, ApplicationHelperFixes
end
```

これでテストを実行すると、こちらの関数が適用されるために前述のエラーは出なくなった。
Rubyのオープンクラスの凄さを思い知った。

---
これが正しいテストヘルパーの使い方なのかとか、他の解決方法とか、弊害とかまったくわからないけど、とりあえず解決したので投稿させていただきました。
何か間違いがあれば暖かく教えていただけると幸いです。

---
追記:2018/1/20 一部test_helperのコードに誤りがあったため修正しました。
【フロントエンドTips】スマホ用にリダイレクト処理を実装してPCブラウザ上で動作確認するまでの手順

「アクセスした一個のURLでスマホとPCはリダイレクト処理で別のもの表示させたい！」と言われることがあると思います。
そういうときどう実装すればいいか…だけを探すのなら一発で出てくると思います。
でもこのページを見ているあなたがやりたいのはそれだけじゃないですよね。
「**リダイレクト処理を実装してかつPCブラウザ上でちゃんと実装できたかを確認したい**」ということをやりたいんですよね。わかりますその気持ち。この記事はそんな迷えるあなたのための記事です。

#実装してみる
##どうやって実装する？
実装方法は何パターンかありますが、今回は単純なペラいちLP的な場面で使われることを想定してjavasctipで実装する方法をご紹介します。

```javascript:redirect.js
var redirectUrl = "リダイレクト先URL"
var ua = navigator.userAgent;
if(ua.search(/iPhone/) != -1 || ua.search(/iPad/) != -1 || ua.search(/iPod/) != -1 || ua.search(/Android/) != -1){
    location.href = redirectUrl;
}
```

そのほかの詳しい実装方法などについての参考はここら辺とか
http://unitopi.com/web-redirect/

##ユーザーエージェントって何
サイトにアクセスしてきたユーザーの端末用方とか諸々な情報が見れるところです。
こいつに含まれている端末情報を読み取ってスマホかPCを判別するようにします。

ユーザエージェントについての詳しいことについてはこちらの記事が参考になります。
https://qiita.com/nightyknite/items/b2590a69f2e0135756dc

##どこに読み込まれるべきか？
スクリプトが書ける位置は大きく分けて３箇所書ける場所があると思います。

- head部に記述する
ユーザ側でページを読むこむ際に一番最初に読まれるところです。
ページ全体を描画する前に入れ込めるので、描画前に動いて欲しい動きがあればここに書きます。

- bodyの頭で記述する
描画に入るタイミングで読み込まれるところです。
描画に入って全体を表示する前に何かして欲しい処理、または先に読み込んで置いて欲しいがあればここに書きます。

- bodyの末尾で記述する
ほぼ全体が描画しきったタイミングで読み込まれるところです。
描画に関わらない部分の処理などに関してはここに書きます。

今回のケースだと「ページが描画される前にリダイレクト」を実施したいわけですから、headのところに書き込みます。

#確認
## chromeで確認
chromeでスマホのユーザーエージェントで確かめたい場合はデベロッパーツールを駆使します。

1.chromeのでヴェロッパーツールを開きます。一番簡単な方法はページ上で右クリック→表示されたメニューから「検証」を選択


2.デベロッパーツールの右上の方にある縦三点リーダをクリックし、「More Setting > Network Condition」を選択
<img width="422" alt="スクリーンショット 2018-01-19 23.54.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/69330/03c93969-70a9-da51-fb06-3069d516415e.png">


3.「Network Conditions」タブのUser agentから動かしたいユーザーエージェントを選択して再読み込み！
（デフォルトはSelect automaticallyにチェックが入ってると思うのでチェックを外して動かす）
<img width="489" alt="スクリーンショット 2018-01-19 23.55.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/69330/03a34d7a-f3e1-f4fc-7925-1ae701a7a68b.png">


## Safariで確認
Safariで確かめたい場合は開発ツールを使います。

1. Safariのメニューのうち「開発」タブを使います。デフォルトで表示されていない場合はSafariの「環境設定」を開き、「詳細」タブから「メニューバーに”開発”メニュー表示」にチェックを入れます
<img width="819" alt="スクリーンショット 2018-01-19 23.58.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/69330/75f9dcc0-c492-a62e-00aa-ba0550d06ef7.png">


２. 開発タブから「ユーザーエージェント」を選択、動かしたいユーザーエージェントを選択して確認！
<img width="593" alt="スクリーンショット 2018-01-19 23.58.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/69330/e1e25d46-6225-7645-7cdb-1bfbd4ef0184.png">


# まとめ
簡単ですがリダイレクト処理の実装と確認方法をまとめました。
リダイレクトの実装の仕方とか良し悪しとかは一旦この記事では解説しませんでした。
とりあえず手っ取り早く実現する方法として備忘録的に残しておきます。
【Photoshop】ExtendScript Toolkit を使いたくないけど使わざるを得ない時にやった事

Photoshop 内包の script言語は `jsx` という、ちょっと古い(Ecma3) javascript なのですが、その開発には Adobe から提供されている `Extendscript Toolkit CC` というものを使います。

参考 Adobe Bridge CC自動化作戦 ExtendScript Toolkit CCについて
http://www.openspc2.org/book/BridgeCC/intro/010/index.html

正確に言うと 使わなくてもいいのですが、jsx から `$.writeln` で出力する ログは Toolkit上のみで確認できるようなのと、DOMのブラウザーやデバッグ環境が用意されているので、使った方が開発がやりやすい事もあります。事もあるというのは、jsエディタとしてはあまりいけておらず、更新もされておらず、かつ、なんか重い感じで、要するに使いづらいのです。

と言う事で自分は IntelliJ IDEAで typescriptから jsx 書き出す開発をしてて、わざわざ CEP パネルを作って、そちらの chrome jsデバッガーにログを表示させていたりしたのですが、

参考 CEPスーパー メガ ガイド： HTML5＋Node.jsでAdobeのツールを拡張する
http://aphall.com/2014/08/cep-mega-guide/

よく考えると同時におなじjsxソースを両エディタで開いていても問題なく、両者とも更新があると自動でソースを開き直してくれるので、コードはIDEA上で書いてデバッグ実行はExtendscriptでやればいいだけなのでした。 １年以上気づかなかった。。

本題は、以上です！

##おまけ

Extendscript Toolkit CC は他のAdobeアプリケーションのスクリプトを書く時にも使えます。
Flash（＝Animate)は jsx でなく、jsfl というまた別の js系 script なので、Extendscript Toolkit CC は使用しません。
（XDとかには script言語積まれないんだろうか。)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8302/b8db2eb3-be9a-0682-672b-599c55058501.png)
_対応してそうなソフト_
Android Studio 3にしたらJavaアプリケーションの依存関係が解決できなくなったのでその対処方法 その2

# 概要

以前こんな記事を書いた。
[Android Studio 3にしたらJavaアプリケーションの依存関係が解決できなくなったのでその対処方法](https://qiita.com/KoheiKanagu/items/0836d11c608d9394a36e)

この記事の方法はスマートではなかったため、再チャレンジしたら良い方法を発見できた。

# 構成

- MyApplicationという名前のプロジェクトがある。
- MyApplicationにはappというモジュール(Androidアプリ)がある。
- MyApplicationにはpurejavaというモジュール(Javaアプリ)がある。（このモジュールを単体で実行すると依存関係が解決できない）

それぞれの`build.gradle`はこんな感じ
`./MyApplication/purejava/build.gradle`
`./MyApplication/app/build.gradle`
`./MyApplication/build.gradle`


# 方法
まず、適用したいモジュールのbuild.gradleに`apply plugin: 'idea'`を追加する。
今回は例としてGsonを追加している。それ以外はデフォルトで自動生成されたやつ。

```groovy:./MyApplication/purejava/build.gradle
apply plugin: 'java-library'
apply plugin: 'idea' //これ

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.google.code.gson:gson:2.8.2'
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"
```

もしくは、ルートのbuild.gradleに追記することで全モジュールに一度に適用することもできる。

```groovy:./MyApplication/build.gradle
allprojects {
    apply plugin: 'idea'
}
```


次にApplicationのConfigurationをデフォルトで作り、**Before launch**に**Run Gradle task**から**idea**というtaskを追加する。
<img width="1000" alt="スクリーンショット_2018-01-20_0_19_57.png" src="https://qiita-image-store.s3.amazonaws.com/0/46022/a67b6102-dcbc-d5b1-4746-d827361c9bd4.png">

これでここから依存関係を解決した状態で実行できる。
Debugで実行すればもちろんブレークポイントで止まることも可能。
<img width="251" alt="スクリーンショット 2018-01-20 0.30.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/46022/34c98992-2070-1eab-4857-5b11eebc79d4.png">


## 結果
purejavaモジュールの適当なクラスでGsonを使うと、

```java:./MyApplication/purejava/src/main/com/example/MyClass.java
public class MyClass {
    public MyClass() {
        String jsonString = "{\"a\": 12345, \"b\": 67890}";

        JsonObject jsonObject = new JsonParser().parse(jsonString).getAsJsonObject();

        System.out.println("aは " + jsonObject.get("a"));
        System.out.println("bは " + jsonObject.get("b"));
    }

    public static void main(String[] args) throws Exception {
        new MyClass();
    }
}
```

ちゃんと使えててハッピー

```
aは 12345
bは 67890
```

# なぜか

Sync Project with Gradle Filesすると**.iml**が更新される。

.imlを見ると、例えばGsonがdependenciesにあれば、こういうorderEntryが生成されている。

```xml:.iml
<orderEntry type="library" exported="" scope="PROVIDED" name="gson-2.8.2" level="project" />
```

ここで悪さをしているのは`scope="PROVIDED"`である。
なぜなら手動で`scope=""`に修正すると、上記のideaタスクを実行する必要なく、依存関係が解決できるためである。

そこで、`./gradlew idea`を実行する。
その後、.imlを見てみると、Gsonのjarをフルパスで指定してくれおり、依存関係は解決される。

# 結論

.gradleにscopeを""に修正するようなタスクを実装する方法もあるように思うが、よく分からなかったので諦めた。

とりあえず、Android Studio 2.x時代の時と同じように、簡単にブレークポイントで止まれるような実行ができるのでとても良い。

## 余談

毎回ideaタスクを実行するので、実行がワンテンポ遅くなってしまう。
結局、.imlはSync Project with Gradle Filesしなければ更新されないようなので、Run Gradle taskにideaタスク無しバージョンのRun Configurationも作っておいて、普段はこっちを使って、Syncした後に手動で`./gradlew idea`を実行して.imlを更新してもいいかもしれない。
もしかしてSync Project with Gradle Filesの時に追加task実行できたりする？
買い替えたmac（High Sierra）でcapybara-webkitのインストールで躓いたときに行ったこと

capybara-webkitがGemfileに含まれるプロジェクトで`bundle install`したら以下のエラー。

```
Command 'qmake ' not available
```

「あ、まだqt入れてなかった」と気付き、capybara-webkitのwiki「Installing Qt and compiling capybara webkit」を見ながらインストール

https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit#macos-sierra-1012-el-capitan-1011-and-yosemite-1010

この状態でもう一度`bundle install`を行うも再度同じエラー。

さらにググってみると同じエラーっぽい方のissueが。

https://github.com/thoughtbot/capybara-webkit/issues/1052

これに従いxcodeのインストール後

```
$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
``` 

を実行

その後`bundle install`して無事インストール完了。
「ゼロから作るDeep Learning」を読んでみた！

遅ればせながら「ゼロから作るDeep Learning」を読んでみた。
以下、私的メモも兼ねて、読後感想を書いてみる。
（もし、記載に間違いがあれば、アドバイスを頂ければ、大変、嬉しい。）

１．総評
一言で言えば、かゆいところに手が届く本。他の本を読んでも、分らなかったことが、この本を読んで良く分った。買って読んで、金銭面でも時間面でも、無駄にはならない、と言える。ハッキリ言って、おすすめ。

２．以下、個人的メモとして、特に勉強になった点を記載する。

２－１．Python入門
ブロードキャスト
⇒NumPyではスカラ値が行列として扱われる。

２－２．パーセプトロン
XORゲート＝排他的論理和（入力２つの内、どちらか一方だけが１なら、出力は１になる）
⇒パーセプトロンを２層にすれば実現できる。

２－３．ニューラルネットワーク
活性化関数
⇒ステップ関数（x≦0なら出力が0だが、x＞0なら出力は1）
シグモイド関数（ステップ関数に似ているが、滑らかに変化するS字型の関数）
ReLU関数（x≦0なら出力が0だが、x＞0なら出力はx、ヒンジ型）

非線形関数
⇒線形関数であれば、多層にする利点が生かせない。
例：y=cxを３層にした場合、y=ax（ただし、$a=c^3$）の１層と同じ。

行列の内積
⇒行列の行と列の隣り合う次元数が等しいことが必要。
A　　 　B　　＝　C
3x2  　　2x4     　　　3x4
上の例だと、Aの列とBの行の次元数が共に2なので、内積が計算できる。
計算結果は、Aの行とBの列の次元数になる。

ソフトマックス関数の実装上の注意
⇒指数計算でオーバーフローが発生する。
ソフトマックスの分母分子で指数計算するので、定数を引いたり足したりしても結果は変わらない。
そこで、入力の最大値を引くことで、正しく計算することが出来る。

２－４．ニューラルネットワークの学習
なぜ損失関数を設定するのか
⇒認識精度はパラメータの微小な変化に反応しないから。

例えば、100枚中、32枚が正解の時、認識精度は32%。
パラメータを調整した結果、正解が33枚、または34枚になった時、認識精度は33%、または34%になるわけで、連続的には変化しない。
ところが、２乗和誤差、または交差エントロピー誤差を損失関数として設定すれば、パラメータの微小な変化に反応する。

数値微分
⇒誤差が含まれる。
誤差を減らすため、中心差分、つまり(x+h)と(x-h)での関数fの差分、を計算する。
通常の微分は、(x+h)とxの差分（前方差分）を取って計算している。

２－５．誤差逆伝播法
連鎖律
⇒複雑な計算も、掛けたり、足したり、二乗したり、自然対数計算したり、の合成になっている。その計算の一つ一つを微分すれば、複雑な計算全体の微分になる。

例えば、加算ノード（z=x+y）の逆伝播は以下の通り。
$\frac{\partial z}{\partial x}=1$
$\frac{\partial z}{\partial y}=1$
計算グラフを使いながら、数式を分解してみると良く分る。

Affineレイヤ（全結合層）
⇒入力に重みを掛けて、バイアスを加える。
Softmaxレイヤ
⇒入力された値を正規化（和が1になるように変形）する。
手書き数字の認識なら、入力は10個ある。

２－６．学習に関するテクニック
パラメータの更新手法

SGD(Stochastic Gradient Descent、確率的勾配降下法)の欠点
⇒勾配がy軸方向は大きく、x軸方向は小さいと（つまり、関数の形状が等方的でないと）非効率な経路で探索することになる。
関数の例：
$$f(x,y)=1/20 x^2+y^2$$

Momentum（モーメンタム、運動量）
⇒速度に似た概念を導入することで、物体が勾配方向に力を受け、その力で物体の速度が加算されたり、逆に、摩擦や空気抵抗に似た概念を導入することで、正と負の方向の力を交互に受ける。
結果的に、y軸方向の速度は安定せず、SGDに比べて、x軸方向へ早く近づき、ジグザグの動きを軽減する。

AdaGrad
⇒学習係数は最初、大きく、次第に、小さくする（減衰）。特に、よく動いたパラメータの学習係数を小さくする。

Adam
⇒MomentumとAdaGradを融合したもの。

重みの初期値
⇒活性化関数がReLUなら、Heの初期値
sigmoidやtanhなどのS字カーブなら、Xavierの初期値

過学習対策
⇒Weight decay（荷重減衰）
重みパラメータが大きな値になったらペナルティを課す。
L2ノルム、L1ノルム、L∞ノルム

Dropout
ニューロンをランダムに消去しながら学習する。

２－７．畳み込みニューラルネットワーク
畳み込み層
⇒画像は３次元（タテ・ヨコ・チャンネル）の形状であり、空間的情報を含む。その形状を維持しつつ、次の層にデータを出力する。

プーリング層
⇒タテ・ヨコ方向を小さくする。
学習するパラメータは無い。
チャンネル数は変化しない。
微小な位置変化に対してロバスト（頑健）。

１層目の重みの可視化
⇒エッジ（タテ・ヨコ・斜めなど）に反応する。

LeNet
⇒活性化関数に、ReLUではなく、シグモイド関数を使用。
サイズ縮小に、Maxプーリングではなく、サブサンプリングを使用。

AlexNet
⇒活性化関数はReLU。
局所的正規化を行う層（LRN、Local Response Normalization）がある。
Dropoutを使用。

２－８．ディープラーニング
層を深くする意義
⇒パラメータ数を少なくできる。
例えば、5ｘ5の入力データを1ｘ1の出力データに畳み込む場合、１層ならパラメータ数は25（5ｘ5ｘ1）になる。一方、中間に3ｘ3の層を入れて畳み込めば、パラメータ数は18（3ｘ3ｘ2）で済む。

また、層を深くすることで、前の層では、エッジなどの単純な形状にニューロンが反応し、層が深くなるにつれて、模様や物体の部分などの複雑な形状にニューロンが反応するようになる。

３．最後に
本当に、良書だと思う。
【PowerShell】ADグループメンバーの属性値を確認する方法

##今夜の一言
Qiitaのページがリニューアルされている！！
何か全体的に明るい感じになった？
そして、記事が書きやすくなってやす！あざす！
いやぁ、ここ最近忙しくてプライベートの人間関係も崩壊しそうですよ。。
どうすれば良いのか、仕事をしながらLineを返すってなかなか器用なことをできない人間。
とてもITの仕事をしているたぁ思えない旧時代人間ってやつです。
はぁ～ITが楽しくなる世の中って訪れますか？いや、使っている人は楽しいのかもしれない。
作り手にも楽しい世の中が訪れてほしい。

##というわけでPowerShellです！
2分位で読み終える記事です。
本当はね、ShibbolethっていうやつとDjangoの記事を書きたかったけど、リハビリだ。

仕事でADグループメンバーの属性を確認しなければならない場面に遭遇しました。
ところがですね。ADのユーザーとコンピュータってツールの画面構成だと
メンバーの属性を直接見れないってんで、PowerShellさんに登場してもらいました。

困ったときのお助けマン！下手なプログラムよりこのコマンドをパイプでつなげてくだけで
結構なことができるんじゃないか…

##試行錯誤から学ぶこと～その１～
実はですね。Get-ADUserってコマンドがあるんですが、全然よくわかってないんですね。
いつもこのコマンドを使うときに同じようなミスをやらかすのです。

```:Get-ADUser失敗例1
Get-ADUser -Identity ~ -Filter ~
```
MicroSoftのページにも書いてあるけど、IdentityとFilterは併用できないっす。
どちらか片一方を指定して、条件を指定する形みたいなんですね。
ただ、上記のようにコマンドを実行したときのエラーメッセージが意味不明なんで、
いつも「？？？」ってなるんですよ。

```:表示されるエラー内容
Get-ADUser : 指定された名前のパラメーターを使用してパラメーター セットを解決できません
```

熟練のWindows技術者はどうやって上記のオプションを使いわけているのか気になるところです。
ちなみにどちらのオプションを指定しても以下のようなコマンド結果が返ってきますよ～
(下記の例はユーザーを指定してコマンドを実行した場合の結果です)

```:コマンド実行結果例
DistinguishedName : CN=netadmin1,OU=xxx,DC=xxx,DC=xxx
Enabled           : True
GivenName         : 
Name              : netadmin1
ObjectClass       : user
ObjectGUID        : xxx-xxx-xxx-xxx-xxx
SamAccountName    : netadmin1
SID               : S-x-x-x-xxx-xxx-xxx-xxx
Surname           : netadmin1
UserPrincipalName : netadmin1@xxx.xxx
```

##試行錯誤から学ぶこと～その2～
この話の2つ目の教訓なんですけどね。
当然、仕事で使うコマンドなんで対象ユーザー数が3000名位いたわけなんですよ。
1個1個SamAccountNameを指定してコマンド打ってたら、
また、プライベートが崩壊してしまうんでそんなわけにはいかないわけです。

だからね、下に書いてることみたいなことをしたんです。

```:Get-ADUser失敗例2
$MemberName = Get-ADGroupMember -Identity ~ | fl Name
$MemberName | ForEach {
Get-ADUser -Identity $MemberName | fl department,displayname,SamAccountName,UserPrincipalName,extensionAttribute1
| Out-File -FilePath 【ファイル出力先】}
```
まぁ、かわいいもんじゃないですか。
いつものようにForEachでグルグル回せばいいんじゃないか？
そんな風に考えたわけなんですけどね。
結果がやっぱり「？？？」ってなんですね。
※Windowsのエラーメッセージって分かりにくくないですか…

```:エラー内容
Get-ADUser : パラメーター 'Identity' で必要とされる型 'Microsoft.ActiveDirectory.Management.A
DUser' に 'System.Object[]' を変換できません。指定されたメソッドはサポートされていません。
発生場所 C:\Users\xxxx\Desktop\xxx.ps1:x 文字:xx
+  Get-ADUser -Identity $MemberName | fl department,displayname,SamAccountNa
me, ...
+                       ~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser]、ParameterBindi 
   ngException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.ActiveDirectory. 
   Management.Commands.GetADUser
```
ISEっていうツールを使って変数の中身をみてみるとこんな感じなんですね。

```:変数の中身
name : XXXX

name : YYYY
```
ふ～ん、なんとなくダメそうだね汗

##結論
答えはいつもシンプル！
シンプルじゃなきゃ、自分が理解してない証拠！
コマンドの結果をパイプで渡してやることで解決します！

```:修正後のコマンド
Get-ADGroupMember -Identity "xxx" | Get-ADUser | fl department,displayname,SamAccountName,UserPrincipalName,extensionAttribute1 | Out-File -FilePath 【ファイル出力先】
```

最後の部分、リダイレクトで出力しても問題ないと思います。
要はですね、パイプ使ってGet-ADUserに渡してやるとGet-ADUserで参照できる属性値を選択できるようになるってことなんです。
恐らくこの仕様は他のPowerShellコマンドでも流用できることで、パイプで渡す前に実行したコマンドの属性値と渡した後に実行するコマンドの属性値を連結するイメージなんですね。

発見だったので記事を書きました。
あ～あ、やっぱりこんな時間だよ。俺、結婚できるのかなぁ。。
Rmarkdown: for文でtab & DT::datatableを生成する

最近Rmarkdownでsummary結果をたくさん出力する機会があったので、
for文でタブと中身 (DT::datatable)をセットで自動生成できるよう、
勉強、もといググった。

成果をメモっておく (何番煎じだろう？)。

(追記：発展版を作成 ([Rmarkdown: list in tbl_df からタブセット&タブを自動生成する](https://qiita.com/s_tashiro/items/3d1f380b168a40c36c3e)))

~~丸パク~~ 参考にさせて頂いたGitのページ
[ReportMort/DT-issues-67-datatables-generated-in-a-loop-in-rmd-file](https://gist.github.com/ReportMort/9ccb544a337fd1778179)

以下、.Rmdファイルの記述例 (`summary(df)`の出力は`table`なので、`xtable`経由で`DT`に渡す)

    ---
    title: "test"
    author: "hoge"
    date: "`r Sys.Date()`"
    output: 
      html_document:
        md_extensions: -ascii_identifiers
        toc: true
        toc_float: true  
        toc_depth: 3
    ---
    
    ```{r setup, include=FALSE, echo=FALSE}
    
    library(tidyverse); library(xtable); library(DT); library(knitr)
    
    ```
    
    ```{r create-datasets, echo=FALSE}
    
    ## DT::datatablesのリストを作成。リスト名はタブ名として後で使うことにする。
    
    datasets <- list(cars = cars, iris = iris, ToothGrowth = ToothGrowth) %>% 
      map(~ summary(.) %>% 
            xtable() %>% 
            datatable())
    
    ```
    
    ```{r create-markdown-chunks-dynamically, include=FALSE}
    
    out = NULL
    for (i in 1:length(datasets)) {
      knit_expanded <- paste0("###", 
                              names(datasets)[i],  
                              "\n```{r results='asis', echo=FALSE} \n\n datasets[[", i, "]] \n\n``` \n")
      out = c(out, knit_expanded)
    }
    
    ```
    
    ## dynamically make tabs and datatables {.tabset}
    
    <!--- knit those table chunk statements --> 
    `r paste(knit(text = out), collapse = '\n')`
    
    
    ## Let's Enjoy !!
     
<br>


同じ要領でggplot2などもいける (変更箇所のみメモ)。

```
datasets <- list(cars = cars, iris = iris, ToothGrowth = ToothGrowth) %>%
  map(~ ggplot(., aes_string(names(.)[1], names(.)[2])) + geom_point())
```
プログラム関係ないねコレ

嫌な事を速攻で忘れる能力を持った私

現場で嫌なことがあっても決して引きずらない

コツは何？と聞かれて改めて論理的に考える時間があり、結論が出たのでなんとなく投稿。

考えてみれば私たちがいつもやっていることで、【定着を図るにはアウトプットが大事】

いつもこう言ってますよね。

コツは【アウトプットしないこと】だったんですね。

要するに【愚痴らない】

コレにつきます

嫌なことは吐き出した方が整理がつくよ

なら分かりますが、別に整理したいわけでもなくただ単純にムカついた事を人に分かりやすく理論立てて話したらそんなの忘れられない記憶になって当然だろうと。

どっちが悪いのか相手にジャッジメントして欲しいわけでもないなら黙って飯食って風呂はいって寝る。

コレにつきますよね。

逆にアウトプットする事の凄さが身にしみて分かりましたとさ。

そんな下らない話でした。