OmniAICreator/Qiita-1.07M huggingface dataset:
Application Insightsによるログ解析


## 概要

Log Analyticsなどで使われているクエリ言語（KQL）を使って
ApplicationInsightsで収集している情報を見える化して解析する方法です。
最後のほうにSQLとKQLの対比で例をあげているので参考にしてください

```
requests
| where timestamp > ago(3h)
| summarize count() by client_CountryOrRegion
| render piechart
```

書式として "演算子" を | で区切ります

よく書く流れとしては「テーブル|条件|集計方法|グラフの種類」がわかりやすいと思います

## よく使う演算子

|コード|説明|
|------|----|
|where|条件絞り込み.Alias:filter|
|count|行数|
|limit [num]|[num]行数制限|
|order by [Column] [asc,desc]|並べ替え.Alias:sort|
|render|表示方法。下記にて説明|
|summarize [Aggregation] by [Column]|集計方法。下記にて説明|
|project [Column]|表形式で出すときに列名を指定して表示する。|

※これ以外にもたくさんありますが理解しているものを並べています
## summarize
|コード|説明|
|------|---|
|summarize count() by [Column] |Column別行数|
|summarize count([Column1]) by [Column2] |Column2別Column1行数|
|summarize avg([Column1]) by [Column2] |Column2別Column1平均|

### bin
主にsummarizeの時に使用する。
連続する値の範囲を管理しやすい単位に分割する。
多くのデータをグラフ化する場合には描画が遅くなってしまうので丸めて集計し表示する。

例えば、10分毎の間隔で集計する

```
bin(timestamp, 10m)
```


## render

集計したテーブルをグラフィカルに表示するときに使用する。
作成後はダッシュボードなどに使用すると便利です。

|コード|説明|
|-----|----|
|areachart|面グラフ.kind:stacked,stacked100,unstacked,default|
|barchart|棒グラフ.kind:stacked,stacked100,unstacked,default|
|timechart|折れ線グラフ|
|piechart|円グラフ|
|scatterchart|散布図|

## 例
SQLデータベースの検索方法と比べながら実例を記載します

### 全検索

SQL Query

```SQL
Select * From requests
```

Analytics Query

```
requests
```
### 項目絞り込み

SQL Query

```SQL
Select url,resultCode From requests
```

Analytics Query

```
requests| project url, resultCode
```
### 一意検索

SQL Query

```SQL
Select DISTINCT url From requests
```

Analytics Query

```
requests | summarize by url
```

### 時系列で集計

リザルトコード別に数えてそれを10分毎にまとめる。
それを積み立て棒グラフで表示する

```
requests
| summarize count() by resultCode, bin(timestamp, 10m)
| render barchart kind= stacked
```
HTTP備忘録

#HTTPについて
HTTPとは、「Hyper Text Transfer Protocol」の略で、インターネット上で、サーバーとクライアントがデータの送受信を行う際に用いられているプロトコル（通信規格）だ。

なぜソフトウェアエンジニアにとってこのHTTPが重要かというと、例えばブラウザを通してwebページを表示するような場合、必ず使用されるのがこのHTTPだからだ。

すこしわかりにくいが、このQiitaのページだって、クライアント（ブラウザ）がWEBサーバーに対してgetなどのコマンドを送り表示されている。

###お前らが「このツイートおもしろすぎわろたｗｗｗ」というまでのフロー
クロームブラウザ 「おい！このページのテキストデータよこしてや！」

ウェブサーバー 「オッケー。データはやるから画像データとかHTMLをきれいに成型して表示するのは任せたで」

クロームブラウザ 「お！きたきた！ちゃんとうけとったで！ほれ表示！」

クロームで**鼻くそほじりながらtwitterするお前ら**「このツイートおもしろすぎわろたｗｗｗ」


#最後に
ITパスポート受けるので備忘録として残そうと思って書きました。
一時間で書こうと思ったら時間なさすぎわろたｗｗｗ

＊（空き時間などに更新します。）

参考にした記事
[【PHP超入門】HTTP（GET・POST）について](https://qiita.com/7968/items/4bf4d6f28284146c288)
ValueError: numpy.ufunc has the wrong size, try recompiling. Expected 192, got 216

# numpy==1.15.4のversionでタイトルエラーが出るときと出ない時があったのでメモ
- 同じnumpy==1.15.4 でもgensim.models.word2vecのところでエラーが出力される環境とされない環境があった
- gensim の version を 上げるとエラーが消えたが、その後versionを戻してもエラーが出力されなかった

```エラー内容
/app/.heroku/python/lib/python3.6/site-packages/gensim/models/word2vec.py in <module>()
    133 
    134 try:
--> 135     from gensim.models.word2vec_inner import train_batch_sg, train_batch_cbow
    136     from gensim.models.word2vec_inner import score_sentence_sg, score_sentence_cbow
    137     from gensim.models.word2vec_inner import FAST_VERSION, MAX_WORDS_IN_BATCH

__init__.pxd in init gensim.models.word2vec_inner (./gensim/models/word2vec_inner.c:10917)()

ValueError: numpy.ufunc has the wrong size, try recompiling. Expected 192, got 216
```
2019-03-26 Windows 10 v1809 > ログイン画面の表示が遅い + Disk 100% Usageが解消しない

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1809 (October 2018 Update)
```

### 症状

- Enterを入力してからログイン画面表示まで30秒程度かかる
- Disk 100% Usageがいつまでも続く

### 原因

A. Windows Search Indexがディスク使用し続ける
B. One Drive for Business setupが終わらない

### 対処

- A. Windows Search Index
    - A-a) Windows Search Indexを無効にする
    - A-b) スタートメニューだけの検索（最小限）にする
- B. One Drive for Business 
    - B-a) One Drive for Businessをアンインストールする
    - B-b) One Drive for Businessをリセットする
        - https://social.technet.microsoft.com/Forums/en-US/3c7ab7af-42a2-40c0-96b3-edc7f7c920fa/onedrive-100-disk-drive-usages?forum=MTCWin8

A-bとB-aの対応で回復した(とあるPC)。
A-aとB-bの対応で回復した(別のPC)。

対応は、各自の用途に合わせて選択すると良い。


### 別の要因

- C. ストアアプリの自動更新が暴走する
    - wsappxがディスク使用し続ける
    - 対処 c-a) ストアアプリの自動更新をオフにする
        - https://pc-karuma.net/windows-10-microsoft-store-app-update/
            - by PC設定のカルマ
            - **情報感謝です**
        - 手動更新が今後必要

### 再発

Windows Updateを一回実施したところ、A-aとB-bの対処をしたPCの症状が再発した。

PCを再起動したら解消した。
と思ったが、再度発生した。

C-aの対処をすることで解消したようだ。
Discord.jsでシャットダウンコマンドを作る

# 概要
Botをシャットダウンするコマンドを作る方法です。
※インストール内容はCentOS7の環境での方法を紹介します。CentOS7以外のインストール方法は調べてインストールしてください。

# 1. Node.jsのインストール方法

下の2つのコマンドを実行するだけです。

```
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum -y install nodejs gcc-c++ make
```

# 2. Discord.jsのインストール方法

下の1つのコマンドを実行するだけです。

```
npm install discord.js
```

# 3. Botアカウントの作成方法とサーバーへの追加方法
## Botアカウント作成方法
[ここ (https://discordapp.com/developers/applications/)](https://discordapp.com/developers/applications/)からDiscordの開発者ページにアクセスして、「New App」をクリックします。
「NAME」にBotの任意の名前を入れて「Create」を押すとアプリができます。
アプリを作成したら、Botを作ります。右にある「Bot」をクリックして、「Add Bot」を押すことでBotを作ることができます。
最後にTokenの下にある「Copy」ボタンを押してメモ帳にペーストしておいてください。後で使います。このTokenは晒すとBotが乗っ取られるので注意です。
## サーバーへの追加方法
右にあるOAuth2をクリックして下にある「Bot」というボタンをクリックします。すると新しい項目がでてくるのでそこで管理者を渡しておくと今後何でもできるので「管理者」をクリックします。チェックが付けばOKです。その後にBotと選択した項目の下にとURLが出てくるので、ブラウザのアドレスバーにコピーして開きます。「Botを追加します。」とでてくるのでサーバを選択して「認証」を押すと完了です。
**Botの招待には招待するサーバーで管理者権限が必要です。**
# 4. コードを書いていく
次に本題のコードを書いていきます。まず、Botを作るフォルダーにApp.jsというファイルを作ってソースコードエディタ(おすすめは[Visual Studio Code](https://code.visualstudio.com/))を使ってApp.jsを開きます。その中に下記のコードを入力します。

```javascript
  
const Discord = require('discord.js');
const client = new Discord.Client();

client.login("<Token>");

client.on('message', message => {
    if (message.content.startsWith('シャットダウンに使うコマンド')) {
        if (!message.author.id == シャットダウンができる人のユーザーID) return;
        process.exit();
    }
});
```
シャットダウンに使うコマンドのところはシャットダウンに使うコマンドを入力してください。下記が例です。

```javascript
if (message.content.startsWith('+shutdown'))
```

シャットダウンができる人のユーザーIDはシャットダウンができる人のユーザーIDを入力してください。下記が例です。

```javascript
if (!message.author.id == 359253660221440013) return;
```

Tokenはさっきメモ帳にコピーしたTokenをここに貼り付ける
これで保存してください。

# 5. 早速Botを起動してみよう！
早速Botを起動してみましょう。起動もコマンド1つでできます。

```
node App.js
```

これで完成です。みなさんもぜひ試してみてください！
なにか間違い等あれば [admin@yopon.cf](mailto:admin@yopon.cf) までお願いいたします。

# Botサンプルを用意しました。ぜひご使用ください。
[https://discordapp.com/api/oauth2/authorize?client_id=560019318297853972&permissions=8&scope=bot](https://discordapp.com/api/oauth2/authorize?client_id=560019318297853972&permissions=8&scope=bot)

コマンドは +shutdown ですが、筆者の僕しかできないので意味ないですね
HTMLとCSSの中級編を終えて

プログラミングにおいて、理解することと実際にコードを書くことには大きなギャップがあると思う。
そのギャップを埋めるためには、自分でコードを書いて、その結果を実際に見て、それを改善することの繰り返しが必要だ。

例えば、marginとpaddingの違いについて、頭で理解するより、どっちも書いてみてどうなるか検証するのが習得には手っ取り早い。
Python loggingで2回同じログが表示される場合


# 環境
* Python 3.6.6
    * logging v0.5.1.2
* Windows 10

# やりたいこと
Pythonのloggingを使って、コンソールとログファイルにログを出力したいです。
以下のファイルを生成しました。

```plain:ディレクトリ構成
$ ls
logger-main.py
fuga.py
logging.yaml
```

```python:logging-main.py
import logging
import logging.config
import yaml
from fuga import Fuga


if __name__ == "__main__":
    logging.config.dictConfig(yaml.load(open("logging.yaml").read()))

    f = Fuga()
```


```python:fuga.py
import logging
import yaml

logger = logging.getLogger(__name__)

class Fuga:
    def __init__(self):
        logger.debug("Fuga Constructor in debug")
        logger.info("Fuga Constructor in info")
```

```yaml:logging.yaml
version: 1
formatters:
  customFormatter:
    format: '%(asctime)s : %(levelname)s : %(module)s : %(message)s'
handlers:
  fileRotatingHandler:
    class: logging.handlers.TimedRotatingFileHandler
    level: DEBUG
    filename: logfile/logger.log
    when: 'D'
    formatter: customFormatter
  consoleHandler:
    class: logging.StreamHandler
    level: DEBUG
    formatter: customFormatter
loggers:
  fuga:
    level: DEBUG
    handlers: [fileRotatingHandler, consoleHandler]
root:
  level: INFO
  handlers: [fileRotatingHandler, consoleHandler]
```

# 問題
`$ python logging-sample.py`を実行すると、以下のように重複したログが、コンソールとログファイルに出力されました。

```
2019-03-16 16:45:02,746 : INFO : fuga : Fuga Constructor in info
2019-03-16 16:45:02,746 : INFO : fuga : Fuga Constructor in info
```

# 原因
`logging.Logger.propagate`には以下のように書いてあります。

>ハンドラを、あるロガー と その祖先のロガーに接続した場合、同一レコードが複数回発行される場合があります。一般的に、ハンドラを複数のロガーに接続する必要はありません。propagate 設定が True のままになっていれば、ロガーの階層において最上位にある適切なロガーにハンドラを接続するだけで、そのハンドラは全ての子孫ロガーが記録する全てのイベントを確認することができます。一般的なシナリオでは、ハンドラをルートロガーに対してのみ接続し、残りは propagate にすべて委ねます。

https://docs.python.org/ja/3/library/logging.html#logging.Logger.propagate

ルートロガーとfugaロガーの両方にハンドラを設定していることが原因でした。
なお、propagateはデフォルトTrueです。


# 解決方法

## 方法1：fugaロガーにハンドラを指定しない

```yaml:logging.yaml
loggers:
  fuga:
    level: DEBUG
```

## 方法2：fugaロガーpropagate値をfalseにする

```yaml:logging.yaml
loggers:
  fuga:
    level: DEBUG
    handlers: [fileRotatingHandler, consoleHandler]
    propagate: false
```
Maya rig のメモ


## rig つきの顔 shape を, body rig に追随したい.

- body rig 側に, 顔の rig の shape(geo) を複製する
- bory rig にコンストレインなどで, 複製した shape と関連し移動など追随できるようにする
- 複製した shape と, 元の shape で BlendShapes を parallel のモードで作成する. これにより, 一方の他の rig, blendshapes 変形結果をもう一方(body 側 shape)に転送してくれる

### TODO

legacy XGen もの設定も対応し, hair が body に追随できるようにする.
関数に同名の引数が二つ使われた場合の挙動

いつも通りのある日の事、ヤバそうなコードに出会いました。

``` yabai.php
function write_test($param = '1', $param = '2')
{
    return $param . PHP_EOL;
}
```

oh...同名の引数が二つ...どういうこと？

IDEの警告とかで怒られないのかなこれ？というかなんでユニットテスト通過してるの？
怖すぎるので、どういう挙動になるのか調べることにしました。

こういう時、まず見るべきは公式ドキュメントだと偉い人がいっていたので確認してみます。
[PHP:関数の引数-Manual](https://www.php.net/manual/ja/functions.arguments.php)

うん、書いてなさそう。

公式ドキュメントは諦めて、個人サイト様やQiitaの記事なんかも軽く探してみます。...オーバーロードがどうとか変数のスコープがどうたらとかいう記事くらいしか引っ掛かりませんでした。

己のググり力の無さに泣きつつ、仕方ないのでどういう挙動になるのか自分で検証しました。尚、PHPのverは5.5です。

# デフォルト値がある場合

まずは今回出くわしたように引数にデフォルト値があるパターン。

## テスト用コード
``` test.php
<?php
echo 'パターン1:' . write_test();
echo 'パターン2:' . write_test('A');
echo 'パターン3:' . write_test('A','B');

function write_test($param = 'a', $param = 'b')
{
    return $param . PHP_EOL;
}

```

## 出力結果
```
パターン1:b
パターン2:b
パターン3:B
```

全てのパターンで後ろの$paramの値が使われていますね。
普通に通っちゃうんですね。怖いですね。

# デフォルト値がない場合

次にデフォルト値を指定していないパターンも確認。

## テスト用コード
``` test.php
<?php
echo 'パターン1:' . write_test();
echo 'パターン2:' . write_test('A');
echo 'パターン3:' . write_test('A','B');

function write_test($param, $param)
{
    return $param . PHP_EOL;
}

```

## 出力結果
```
PHP Warning:  Missing argument 1 for write_test(), called in /mnt/test.php on line 2 and defined in /mnt/test.php on line 6
PHP Warning:  Missing argument 2 for write_test(), called in /mnt/test.php on line 2 and defined in /mnt/test.php on line 6
PHP Notice:  Undefined variable: param in /mnt/test.php on line 8
パターン1:
PHP Warning:  Missing argument 2 for write_test(), called in /mnt/test.php on line 3 and defined in /mnt/test.php on line 6
パターン2:A
パターン3:B
```

一応WarningとNoticeがでてきました。
それはいいんですが、パターン2の挙動が怖すぎます。

思わずPHP君の悪口書きそうになりましたが、そもそもこんな関数作るなよって話ですね。
Gradleでアプリを実行する

[GradleでKotlinプロジェクトを一撃生成する](https://qiita.com/suin/items/96799c9f50a31ae54969)の続き。

Gradleでアプリを実行するコマンド:

```
./gradlew run
```

実行結果。`src/main/kotlin/io/suin/hellogradle/App.kt`がビルドされたのに実行され、Hello worldが出力される:

```
> Task :run
Hello world.

BUILD SUCCESSFUL in 2s
2 actionable tasks: 2 executed
```

`gradle run`だけで、どうして`App.kt`を選択されるかというと、`build.gradle.kts`の`application.mainClassName`で`io.suin.hellogradle.AppKt`を指定しているため。

```kotlin:build.gradle.kts
...
application {
    // Define the main class for the application.
    mainClassName = "io.suin.hellogradle.AppKt"
}
```

## 次のステップ

* [Gradle: 依存ライブラリ入りのjarを作る - Qiita](https://qiita.com/suin/items/641c1c1ec9ab5447221e)
Maya XGen のメモ

## XGen 用語 


XGen paletter : プロジェクトファイル的なもの?
XGen description : シーンファイル, グループのようなもの.
XGen collection : 個々の XGen オブジェクト?
legacy XGen : もともとの XGen. XGen IG の登場によりややこしくなった. アニメーションやバッチレンダーなどする場合はこちらを推奨
IGS(XGen interactive grooming spline) : XGen interactive grooming spline. hair/fur のモデリング(grooming)に特化した感じ. 大量の strands も比較的高速に処理してくれるが, アニメーションやエクスポートさせるとバグが多くクラッシュしたり変なデータがついていたりとする. モデリング(grooming)以外には不向き. 
XPD : キャッシュファイル. バイナリ形式. ローダ/saver https://github.com/syoyo/tinyxpd


## XGen palette ファイル

テキストファイル.


### プロジェクト設定

```
${project}/xgen
${project}/xgenScript
```

`xgen` に XPD ファイルを配置,
`xgenScript` に Xgen palette ファイルを配置します.

XGen palette ファイルを保存しておくことで, width ramp などのパラメータを保持できる.
(プロジェクトのパスを適宜修正)


## bind

xgen バインド(T.B.W.)

バインドしたいジオメトリと driver ジオメトリを選択し, mel スクリプトを実行する

```
doWrapArgList "7" {"1", "0", "1", "1", "1", "1", "1", "1"}
```

パラメータ詳細は T.B.W.

### SubD メッシュで deform させて xgen hair がちらつく場合

https://forums.autodesk.com/t5/maya-forum/xgen-xpd-and-export-patches-workflow-questions/td-p/6785805

xgen を生やすジオメトリ(or scalp geometry)と, visible なメッシュで同じ subdivision level を使う.

offset を与える方法も考えてみる.

## IGS -> legay XGen 変換

一旦 XPD 形式で書き出し, legacy XGen の grooming type で `File from XPD` で読み込む
(ファイルの命名規則やレイアウトに一定のルールがある)

問題点として, XPD 経由では width ramp の設定や per-CV width を扱えない.
width ramp は python script などで出力する必要がある.

カスタムで legacy XGen で importer を開発して対応か.

coordinate が `Local` の XPD を読み込む場合, bound 先の face ids が XPD に存在しないとクラッシュする.

一旦 `Object` で生成した XPD を読み込み, Groom bake XGen deformer で XPD に再度書き出すと `Local` になり, また face ids も bound geometry のもの全てが XPD に含まれる(XPD をダンプすると, primitive が生成されない face は 0 の prim になっている)

## アニメーションについて

batch render する場合は一旦 abc キャッシュに書き出しすのが良い模様. legacy XGen UI で書き出すことができる.

### legacy XGen で bound geometry を移動したときに, xgen primitive が移動されない

XGen では各種データを一旦ファイルに書き出すようなので, まずはシーンをセーブする.
また, keyframe を打つと viewport に反映される模様.

あとは, 目のマークで update を有効にしておく.

一部ではマニュアルでアップデートしないと反映されない模様.


Example code is located at `xgen/devkit/xgenSampleModules`

## Generator

## UI

Write the UI. You can write it in python.

Put plugin(module) to

${HOME}/xgen/plugins

## Xgen search path


Put plugin(module) and python script to plugin directory.

```
# User repo
${HOME}/xgen/plugins/
```
## NOTE: Xgen repo

```
# User
${HOME}/xgen/

# Global
${XGEN_LOCATION)/presets

# Local
${XGEN_DATA_PATH}/
````
Mac的Java版本切换

# 前情概要
跑druid的时候，发现缺少一些package，然后通过`mvn clean install -DskipTests`去装。
结果出现了`Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin`的问题。
按照stack回答的，这里的问题要么是java的版本问题，要么是maven。
考虑到电脑默认用着openjdk，所以锁定问题在java版本上面
具体和这里类似：https://stackoverflow.com/questions/45337558/failed-to-execute-goal-org-apache-maven-pluginsmaven-enforcer-plugin
# 具体解决
参照这里：https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2

- 首先看下当前电脑里java的版本

    ```
    $ /usr/libexec/java_home -V
    Matching Java Virtual Machines (2):
        12, x86_64:	"OpenJDK 12"	/Library/Java/JavaVirtualMachines/openjdk-12.jdk/Contents/Home
        1.8.0_162, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home
    
    /Library/Java/JavaVirtualMachines/openjdk-12.jdk/Contents/Home
    ```
- 嗯，同时装着openjdk12和java1.8.0,而且默认是用openjdk的。那就转换一下

    ```
$ export JAVA_HOME=`/usr/libexec/java_home -v "1.8"`
$ PATH=${JAVA_HOME}/bin:${PATH}
    ```
- 再次执行`mvn clean install -DskipTests`，之前的error消失，问题解决。
# 注意事项
- IDE并不看terminal里面的设置（譬如intellij）
这时候需要在IDE里面设置（例intellij：command+;）
- 我的常用系统的话，可以通过`source javaversion [version]`来方便地切换
macのiTermでカーソルをスムーズに移動したい

terminalでカーソル移動を楽にする

|キー|動き|
|---|---|
|ctrl+A|カーソルを行頭に移動|
|ctrl+E|カーソルを行末に移動|
|alt+←|左方向へ文字毎に移動|
|alt+→|右方向へ文字毎に移動|
|ctrl+U|カーソルより前を消す|
|ctrl+K|カーソルより後ろを消す|
|ctrl+Y|↑で消したものをペースト|

undo、redoのようなものがなさそう
bundle update と bundle install の違いについて

#はじめに
ふと、bundle installをした時に、下記のエラーが出た
`Running bundle update will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
`
調べたら```bundle update``` をしていないことが原因だったのだが、そもそも"install"と"update"の違いがまだきちんと理解できていないことに気づいてこの記事をまとめようと思った。

###bundlerについて
そもそもbundlerについてもう少し詳しく述べておくと、「gemの依存関係のものを一括で扱ってくれる」ものである。つまり一つの機能を用いようとする時に、いくつものgemをインストールしなければならない時があるかもしれないが、bundlerを用いると依存関係を持っている複数のものを一括でインストールしてくれるというものだ。
これは確かに便利なのかもしれない！

###gemfile と gemfile.lock 
gemfileはgemをインストールするための設計図と呼ばれ、gemfile.lockは実際にインストールした結果図と例えても良い。
つまり、gemfileに書かれているgemのみならず一括でインストールしたものを、gemfile.lockにまとめて記述されていることとなる。
これは知らなかった、gemfile.lockにそんな役割があるとは。

#bundle install
これを踏まえて`bundle install`について考えていく。
`bundle install`はgemfile.lockに記載されている内容を踏まえて、gemをインストールしていく。ちなみに、この時にgemfile.lockには記載されていないがgemに記載されているgemなどは、インストールした後にgemfile.lockも更新する

#bundle update
`bundle update`はgemfileを元にgemのインストールを行う。そしてそのあとに、gemfile.lockを更新する。

#まとめ
つまり、`bundle update`はgemのバージョンを更新する時に用いる。`bundle install`はgemfile.lockを更新しないため、gemfileに新しくgemを記述した時に使用する。
また、本番環境で`bundle update`はgemのバージョンのズレが起きやすいため使用せず、`bundle install`は新しい環境などで用いていくのが良い。
macOS の lldb で DYLD_LIBRARY_PATH を指定してプロセスを起動する方法

lldb でプロセスを起動するときに `DYLD_LIBRARY_PATH` を指定したいことがあった。次のように `process launch` コマンドの `--environment` オプションを使うと指定できた。

```
(lldb) process launch --environment DYLD_LIBRARY_PATH=/path/to/libdir -- arg1 arg2 ...
```
プログラミング初心者が Python で Slack bot 作成 [ 準備編 ]

## はじめに

こんにちは！
見習いエンジニアの 古内 です！
今回は Python でYahoo 気象情報 API の情報を通知する bot を作成したので、その解説を初心者なりに細かく解説していきたいと思います。

記事が思っていたより長くなってしまったので分割して投稿させてもらいます。

## やりたいこと

Slack に Yahoo 気象情報 API の降水強度を通知する。

## 必要な技術

- Yahoo API へリクエスト ( GET )
	- 時間で発火
- slack へリクエスト ( POST )

## 開発環境

### 環境
- Python
- Docker
- Make

### ツール

- Atom Editor
- iTerm 2

## 本番環境

- AWS Lambda

## 準備

### 開発環境

では開発環境の準備から始めましょう。  
私は[こちら](https://github.com/furuuchitakahiro/pysandbox)を参考に環境構築をしました。  
簡単に Python 開発環境の構築ができるので、みなさんも活用してみてください！
今回はこちらを使用して説明させてもらいます。

### Yahoo デベロッパーネットワーク

https://developer.yahoo.co.jp/

こちらの気象情報 API を使用します。
Yahoo ID が使えるので登録していない方は、まずは ID の登録からお願いします。

アプリケーションの登録を行います。
メニューの __機能__ -> __アプリケーションの管理__ を選択してください。
__新しいアプリケーションを開発__ から登録を行います。

__Web API を使用する場所__ の __アプリケーションの種類__ は __サーバーサイド__ を選択してください。

<img width="950" alt="スクリーンショット 2019-03-25 16.00.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/371718/fbc642a4-60e8-7842-3959-f0ee0b20b700.png">


__アプリケーションの基本情報__ に適宜情報を入力してください。
今回は __マイ・オークション関連の機能__ は使わないのでチェックは入れないでください。

![スクリーンショット 2019-03-25 16.12.49.jpg](https://qiita-image-store.s3.amazonaws.com/0/371718/8937884c-7980-0b5f-c1bc-598fcd00953c.jpeg)


ガイドラインに同意し、登録します。

[こちら](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/weather.html)を参考にリクエスト URL を作成してください。
ここで取得した Client ID が必要になります。

例 : `https://map.yahooapis.jp/weather/V1/place?coordinates=< 取得したい地域の経度 >,< 取得したい地域の緯度 >&appid=< 取得した Client ID >`

### Slack

https://slack.com

取得した気象情報を知らせるために Slack の Web hook を使用します。
まずは Slackに登録し、[こちら](https://get.slack.help/hc/ja/articles/206845317-Slack-%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)を参考にワークスペースを作成してください。

続いて[こちら](https://get.slack.help/hc/ja/articles/201402297-%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)を参考にチャンネルの作成してください。

次に Web hook の設定をします。
メニューの __App__ の __+__ を選択してください。
「 webhook 」と検索してください。

<img width="636" alt="スクリーンショット 2019-03-25 16.33.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/371718/2a04a701-51f6-f253-e409-44769afd1765.png">

こちらを使用します。
先ほど作成したチャンネルを選択し、__Incoming Webhook インテグレーションの追加__ してください。

ここで取得した __Webhook URL__ を使用します。

またここの画面で bot の名前やアイコンを変更できるので興味のある方は、ぜひやってみてください！

### AWS Lambda

https://aws.amazon.com/jp/lambda/

[こちら](https://aws.amazon.com/jp/register-flow/)を参考に登録してください。
また登録にはクレジットカードと電話番号が必要になるので注意してください。

## 最後に

今回は準備のみなので、ここまでになります。 
次回実際にコードを書いていきますので興味のある方は、ぜひご覧いただけたら幸いです。

__追記__ [実践編](https://qiita.com/fruity/items/48b1e09e51aa01bf199d)の記事を書きました！
scpの仕組みと使い方

# リモートからローカルへ
リモートサーバーから、ローカルへダンプファイルを手に入れようとした時の話

```
$ scp root@**********:/home/********/mobilesns-dev.zip ~/receive
root@***********'s password:
mobilesns-dev.zip
```

なんか、出力結果うまくいったっぽい感じ出てるんですが、送り先のreceiveディレクトリにいってもないんですね。送れてないのです。しかし、これと言ってエラーも無し。

何かコマンドのシンタックスが間違っていると思い小一時間使った

## 戦いの果てに・・・
結論、リモートサーバーでコマンドを叩いていたから。送信する側から叩くもんだと言う思い込みでリモートからずっと叩いていたから、送れなかった。指定したIPへリクエストを飛ばす仕組みなので、そりゃコマンドの引数で指定している場所にsshしてちゃ送れるわけがないんですね。しょーもな。こんなんで四苦八苦してる自分に早いとこさよならを言いたい。

## 使い方

### 送信

```
＄ scp -i 鍵名 送信したいファイル ユーザー名@IP:送信するディレクトリパス
```

### 取ってくる時

```
$ scp -i 鍵名 ユーザー名@IP:取ってきたいファイル　保存するディレクトリパス
$ scp -r -i 鍵名 ユーザー名@IP:取ってきたいディレクトリ　保存するディレクトリパス
```
gradleとgradlewの違い

Gradleで生成したプロジェクトには、Gradle Wapperと呼ばれる`gradlew`と`gradlew.bat`という2つの実行ファイルができる。前者はLinux/macOS用、後者はWindows用だ。

GradleをHomebrewなどでインストールした場合は、`gradle`コマンドと`gradlew`コマンドの2つが手元にある状態になる。この2つの違いは何なのか？

## gradlewはGralde + インストーラー

gradlewはGradleがなければインストールしてくれる。

## gradlewはプロジェクトの一部

gradleはどのプロジェクトとも関連しない実行バイナリであるのに対し、gradlewはプロジェクトの一部になっている。つまり、gitに入れて管理し、プロジェクトチームで共有する。

## gradlewは特定バージョンのGraldeと関連付けられている

gradleはHomebrewでインストールしたときのバージョンになるが、gradlewは特定のバージョンのGradleに固定化される。なので、もしローカルにgradleがあったとしても、バージョンが異なれば、gradleをインストールされる。

## gradlewを使うメリット

* 新規参加の開発者にgradleのインストールを頼まなくてもいい。(勝手にインストールされるから)
* チームでgradleのバージョンが勝手に統一され、再現性の高いビルド環境になる。
* CIなどでgradleを使えば一貫した信頼性のあるビルドになる。

## 次のステップ

* [Gradleでタスクの一覧を表示する - Qiita](https://qiita.com/suin/items/1dc1b76b60246a45fac9)
AWS導入前に知っておきたかった「AWSアカウント設計」

#1.はじめに

みなさんAWSのアカウント設計はどのようにしていますか？

AWSを使ってシステムをセキュアに開発・運用していくためには、
AWSアカウント(*)の設計が重要になりますよね。


AWSアカウント1つのみで運用されてる方は、誤操作や、
誰にどの権限を与えるかのポリシー設計等で困る方もいらっしゃるのではないでしょうか。
(私もその一人です。)


本内容は、『[Amazon Web Services 業務システム設計・移行ガイド](https://www.amazon.co.jp/dp/4797392568)』にも載っているので、
悩んでる場合は、購入をおすすめします！（こちらの書籍と実体験を元に書いてます。）
今回はAWSアカウント設計について、パターン別にメリット・デメリットを書いていこうと思います！

(*)AWSアカウントとは、AWSを使用するためのマスターアカウントのことを指しています。
※IAMユーザーとは別物です！

#2.AWSアカウント設計パターン紹介
本章では、アカウントの設計パターンを3つに分けてメリット・デメリットを書いていきます。
 ①アカウントを分割しないパターン
 ②環境ごとにアカウント分割パターン
 ③システム、環境ごとにアカウント分割パターン

※.ECサイトと分析基盤のシステムがあり、環境は本番/検証/開発環境があるとして書いていきます。

##2-1.アカウントを分割しないパターン
こちらは、以下の図2.1 のように、AWSアカウントを分割せず、
VPCごとに環境を分割するパターンです。

![unnamed-2.png](https://qiita-image-store.s3.amazonaws.com/0/329544/215843f2-85e3-d85f-7f0f-1ee1cb86a033.png)
図2.1 アカウントを分割しないパターン

###◯メリット
・3パターンのうちコストが一番安価
　→NATゲートウェイや Direcr Connect 、AWSサポートを一つにまとめることができる

###△デメリット
・IAMポリシーが複雑になる
　→コードを書くのも、管理するのも手間がかかります。
・3パターンのうち誤操作をする確率が最も高い


##2-2.環境ごとにアカウント分割パターン
こちらは、以下の図3.2 のように、環境ごとでAWSアカウントを分けるパターンです。

![unnamed.png](https://qiita-image-store.s3.amazonaws.com/0/329544/d3271e6a-3c61-675e-9c0b-0368ba3d29d2.png)
図2.2 環境ごとにアカウント分割パターン

###◯メリット
・環境ごとのコスト管理が容易になる
・マネジメントコンソール上に別環境のリソースが表示されなくなる
　→同環境のリソースは表示されますが、別環境に対する誤操作のリスクがなくなります。

###△デメリット
・リソースの数が増え、アカウントを分割しないパターンよりコストが高くなる
　→NATゲートウェイ等のリソースが3環境分必要となり、コストが高くなります。
　　また、ハイブリッド(オンプレ＋クラウド)環境の場合、Direct Connectのコストも3環境分必要となります。
・AWSサポート料金がアカウントを分割しないパターンより高い
　→3環境分契約することになるため、価格は上がる可能性があります。
・アカウントを分割しないパターンより管理に手間がかかる
　→環境ごとにロールの変更が必要となるため、少し手間が増えます。


##2-3.システム、環境ごとにアカウント分割パターン
こちらは、以下の図2.3 のように、システムと環境ごとでAWSアカウントを分けるパターンです。
書籍でもこちらをおすすめしていました！

![pasted image 0.png](https://qiita-image-store.s3.amazonaws.com/0/329544/dea2745e-a44b-58b3-b459-cb38a0ba2316.png)
図2.3 システム、環境ごとにアカウント分割パターン

###◯メリット
・システムごとのコスト管理が容易になる
・マネジメントコンソール上に自分が管理していないリソースが表示されなくなる
　→誤操作の確率がぐ〜んと下がります。これほんとに嬉しいです！
・IAM ポリシーの管理が楽になる
　→複雑なIAMポリシーを作成する必要がなくなる上に管理工数が下がります！

###△デメリット
・リソースの数が増え、コストが高くなる
　→NATゲートウェイ等のリソースが複数必要になることがあります。
　　また、ハイブリッド環境の場合、Direct Connectも複数必要です。
・AWSサポートの料金が環境ごとにアカウント分割パターンよりも高い
　→各AWSアカウントごとの契約となるため、価格が上がリます。
・管理に手間がかかる
　→ユーザーの切り替えや、AWSアカウントごとにIAMユーザーを作成する必要があるなど。
　　（IAMユーザーであれば、CloudFormationで自動化すれば解決できます。）


#3.まとめ
AWSアカウントの分割パターンをメリット・デメリットと共にを3つあげました。
「2-3ではコストが高い」や「2-2よりもう少しセキュアにしたい」等、
場合によって、2-1と2-2の間や、2-2と2-3の間というパターンもあるかもしれません。
コストとリスクを考慮した上で決めていくのが良いと思います！

個人的には、システムを一番セキュアに運用できる
"システム、環境ごとにアカウント分割パターン"がおすすめです。

また、AWSアカウントを増やす場合、AWSアカウント自体を管理するための
「AWS Organizations」というサービスがあります。

こちらの活用もおすすめします。
公式ドキュメントのリンクも貼っておきますので、気になる方はチェックしてください。

◯AWS Organizationsとは
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_introduction.html

今回はこの辺りで！！
お読みくださりありがとうございました！！

# 4/8 追記
アカウントを分割しても「Shared VPC」を使用すれば NAT Gateway は共有できるようです！
同一の Organization にいる必要がある等の条件がありますので、以下URLをご参照ください！
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-sharing.html

また、Direct Connectもアカウント間で共有できるようになるそうです！
条件等は以下をご参照ください！
https://aws.amazon.com/jp/about-aws/whats-new/2019/03/announcing-multi-account-support-for-direct-connect-gateway/
もそ、プログラミングを学ぶ【Ruby & Rails復習編】〜部分テンプレート〜

エラー問題のロープレを始めたものの、何ひとつわからず途方にくれる もそ。
コードの復習をしていると、ノリと勢いでわかったことにしていた箇所がどんどん出てきます...。

今日はそんなノリと勢いでなあなあにしていた**部分テンプレート**について書いていきます。

##部分テンプレートとは？

ビューファイルを記述していくと、同じようなレイアウトの構造がいくつか出てくることがあります。
同じレイアウト、同じ内容のコードを何回も繰り返し記述するのはイヤですよね。
そこで、**共通のHTML構造をテンプレートにしてしまおう！**というのが**部分テンプレート**です。

<img width="375" alt="無題1160 2.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/372174/ba2cfa6b-84dd-135a-d854-fdc0146361a1.jpeg">

##どうやって記述するの？

部分テンプレートを記述するには、**renderメソッド**を使います。
基本的な使い方はこんな感じです。


```rb
<%= render partial: "部分テンプレート名" %>
```
これで部分テンプレートの呼び出しができました！
このままだとindex.html.erbファイル内で部分テンプレートを呼び出しただけで、肝心の部分テンプレートがありません。
そこで、部分テンプレートにしたいHTMLの記述を別のファイルに保存する必要があります。

ファイル名には規則があり、**_(アンダーバー)部分テンプレート名**とします。
なので部分テンプレートの名前を"sample"としたい場合は、ファイル名は**_sample.html.erb**になります。


では先ほど例に出したツイッターのように、同じ部分テンプレートを繰り返し配置するような場合にはどのように記述すればよいでしょうか？



```rb

①   <% @tweets.each do |tweet| %>  
②    <%= render partial: "sample", locals:{moso: tweet} %> 
③   <% end %> 
```

まず、①のコードから解説していきます。
①の@ tweetsはコントローラで定義したインスタンス変数で、|tweet|は配列で格納された一つ一つのレコードを表しています。
つまりtweetsの中から**「tweet」という名前の情報を１つずつ変数を取り出しています**。
each do~endの記述があるので、配列の要素の数だけ情報を取り出す作業を繰り返しているということになります。

②は部分テンプレートの記述です。
render partial: "sample"で、まず"sample"という名前の部分テンプレートファイルを作りますよ、と宣言します。
次にlocals：ですが、これは**部分テンプレートに渡したい値を指定します**。
{moso:tweet}では、さきほど①で記述した|tweet|の情報を「moso」という名前で部分テンプレート内に表示していきます、と宣言しています。


文章だけではわかりづらいので、部分テンプレートのファイルを見ていきましょう。



```rb

<div class="content_post" style="background-image: url(<%= moso.image %>);">
  <div class="more">
    <span><%= image_tag 'arrow_top.png' %></span>
    <ul class="more_list">
      <li>
        <%= link_to "詳細", tweet_path(moso.id), method: :get %>
      </li>
      <% if user_signed_in? && current_user.id == moso.user_id %>
        <li>
          <%= link_to '編集', "/tweets/#{moso.id}/edit", method: :get %>
        </li>
        <li>
          <%= link_to '削除', "/tweets/#{moso.id}", method: :delete %>
        </li>
      <% end %>
    </ul>
  </div>
  <%= simple_format(moso.text) %>
  <span class="name">
    <a href="/users/<%= moso.user_id %>">
      <span>投稿者</span><%= moso.user.nickname %>
    </a>
  </span>
</div>
```
こちらのコードの中で「moso」と書かれた部分は、index.html.erbファイル内で定義した、**tweetカラムから取り出された情報**を表しています。


--
いかがだったでしょうか。
こうやってアウトプットしてみると、いかに自分がフワッフワの理解度で勉強していたかが分かります...
そして絵だけがどんどん上手くなっていってしまっている...もその学習はまだまだ続く。
【BigQuery】COUNT関数で出来る事をまとめてみた。

#概要
集計する際に使う、集約関数の一種であるCOUNT関数を、BigQueryで紹介します。

以下のことをまとめました。

1. テーブルの全行数を出力する　
2. 特定の列の行数を出力する
3. 新しい列にテーブルの行数を表示させる(OVER句)

以下、ドキュメントのCOUNT関数より引用

>
`count(*) `  入力行の数
`count( expression )` expressionが非NULL値を持つ入力行の個数

※expressionとは列名を指します。


#データ紹介

テーブル：table1


|user_id|item|price|null|
|----|----|-----|----|
|A|apple|50|*null*|
|*null*|*null*|*null*|*null*|
|*null*|*null*|0|*null*|
|*null*|*null*|100|*null*|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/352801/63f47ef0-c419-6709-497c-2f5d7d8c4339.png)


## 1：テーブルの全行数を出力する　


BigQueryで、`COUNT(*)`を実行してみます。　※以降、標準SQLを使って実行しています。


```sql:BigQuery　1：テーブルの全行数を出力する　

SELECT
  COUNT(*) AS cnt
FROM
  test1.table1 ;
```

出力は以下です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/352801/fe53586b-668e-37cf-5c6a-4f231a69fdf8.png)


テーブルの全行数が表示されました。


## 2：特定の列の行数を出力する
COUNT関数でitem列を指定して、実行してみます。

```sql:BigQuery　2：特定の列の行数を出力する

SELECT
  COUNT(item) AS cnt
FROM
  test1.table1 ;
```
出力は以下になります。
該当件数は1件でした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/352801/f5780afb-3139-404a-22f3-c231a6b7de13.png)

*null*（欠損した値）はカウントされません。



また、行のすべてが*null*の列(null列)を指定した場合も実行してみます。


```sql:BigQuery　2：すべての行がnullの列を指定した場合

SELECT
  COUNT(null) AS cnt
FROM
  test1.table1 ;
```

実行結果は以下です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/352801/49ce4aaa-e087-6253-f535-06ac6f648b00.png)


すべての行が*null*の場合、0を返します。

##3：新しい列にテーブルの行数を表示させる(OVER句)
COUNT関数にOVER句を使うこともできます。OVER()を使うことで、新しい列にテーブルの行数を表示させることができます。

以下、ドキュメントより引用
>
OVER 句が空（OVER()）の場合、すべての入力行を含む単一のパーティションに対して分析関数が計算されます。つまり、出力行ごとに同じ結果が生成されます。

```sql:BigQuery　3：新しい列にテーブルの行数を表示させる(OVER句)
SELECT
  *,
  COUNT(*) OVER() AS cnt
FROM
  test1.table1 ;
```
結果は以下になります。
赤枠部のカラムが追加されておりました。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3335323830312f35336464663234302d393262302d326430642d356434322d3239666632323239613739342e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/352801/14b18d02-0c57-af52-3ac2-90a219bcf7c8.png)


##おまけ：無料でテーブルの全行数を確認する

BigQueryで、以下の様に`COUNT(*)`の構文を書くと *0 B* の処理と表示されます。
この実行は無料のようです。
参考記事:https://qiita.com/kamujun/items/ab3cd3e6f8934a01cbc8

![image.png](https://qiita-image-store.s3.amazonaws.com/0/352801/ba2b0a31-16ef-a4ea-9428-e8582f56a99c.png)




#まとめ
COUNT関数を使うと、テーブルの行数または、カラム内の非NULL値を持つ入力行の個数を出力します。
欠損値がないか確認するために、非常に大事な関数の為、しっかり覚えておきます。



#参考サイト


https://cloud.google.com/bigquery/docs/reference/standard-sql/aggregate_functions?hl=ja#count
https://www.postgresql.jp/document/10/html/functions-aggregate.html
https://cloud.google.com/bigquery/pricing?hl=ja
https://qiita.com/kamujun/items/ab3cd3e6f8934a01cbc8
Pyxelのインストールからサンプルの実行まで

　[「Python」言語でレトロゲームを開発・実行できるエンジン「Pyxel」を試してみた](https://forest.watch.impress.co.jp/docs/review/1156902.html)
を試してみた。


手順は以下の通り

1. Pythonのインストール 
1. Pyxelのインストール
1. サンプルコードのインストール
1. サンプルの実行




- Pythonのインストール[^1]
 [^1]: 記事内ではPython3.7.1だが、ダウンロード時にはPython3.7.3だった。

- Pyxelのインストール

`pip install pyxel`

- サンプルコードのインストール


ここまでは特に問題なし



- サンプルの実行

`python 01_hello_pyxel`
記事ではこうなっているが 最後に`.py`必要なようだ。

しかし`RuntimeError: Link failure (0):b’’`と出て先に進めず。
今日は終了。




　そもそもこれを残しておく気になったのは、最初のPyxelのインストールがうまくいかなかったためであった。（また、サンプルのインストール時、実行時においてもエラーが出ていた。[^2]）

　原因は過去に2.がインストールしてあったことのようで、違うバージョンが同時にあるといけないらしい。なので2.と3.両方アンインストールしてから、もう一度ダウンロード後3.7.3をインストール。


その後はサンプルのインストールまでは順調。実行時にエラー。



[^2]: それぞれエラーコード[^3]で検索して出てきたものを試してみたが結局解決にはいたらず。また、当初サンプルコードのフォルダ内を見るとファイルの関連付けがうまくいっていなかったようで、やり直した後は関連付けも問題なかった。
[^3]: 一つは`modulenotfounderror sounddevice`というものだったようだ。もう一つは`[Errno 2] No such file or directory pyxel`

ただ、なぜか昨日ダウンロードしたPythonは3.7.2 [^4]だった。
 [^4]: ダウンロードボタンは3.7.3になっていたはずなのに…
Gradleでタスクの一覧を表示する

Gradleで実行できるタスクの一覧は、`gradle tasks`(または`./gradlew tasks`)で表示できる。

```
./gradlew tasks

> Task :tasks

------------------------------------------------------------
Tasks runnable from root project
------------------------------------------------------------

Application tasks
-----------------
run - Runs this project as a JVM application

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Distribution tasks
------------------
assembleDist - Assembles the main distributions
distTar - Bundles the project as a distribution.
distZip - Bundles the project as a distribution.
installDist - Installs the project as a distribution as-is.

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'kotlin-app'.
components - Displays the components produced by root project 'kotlin-app'. [incubating]
dependencies - Displays all dependencies declared in root project 'kotlin-app'.
dependencyInsight - Displays the insight into a specific dependency in root project 'kotlin-app'.
dependentComponents - Displays the dependent components of components in root project 'kotlin-app'. [incubating]
help - Displays a help message.
kotlinDslAccessorsReport - Prints the Kotlin code for accessing the currently available project extensions and conventions.
model - Displays the configuration model of root project 'kotlin-app'. [incubating]
projects - Displays the sub-projects of root project 'kotlin-app'.
properties - Displays the properties of root project 'kotlin-app'.
tasks - Displays the tasks runnable from root project 'kotlin-app'.

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

Rules
-----
Pattern: clean<TaskName>: Cleans the output files of a task.
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.

To see all tasks and more detail, run gradlew tasks --all

To see more detail about a task, run gradlew help --task <task>

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

```

## 次のステップ

* [Gradleでアプリを実行する - Qiita](https://qiita.com/suin/items/58f3f49e67677e62f217)
* [Gradle: 依存ライブラリ入りのjarを作る - Qiita](https://qiita.com/suin/items/641c1c1ec9ab5447221e)
digdag の自前ビルド (docker 編)


# 事前準備

docker をインストールしておくこと

# ビルド

https://github.com/treasure-data/digdag/blob/master/.travis.yml をから現在ビルドに使っている docker イメージを調べる。


例)

```
$ BUILD_IMAGE=digdag/digdag-build:20190226T204642-f12ed87c03e63d1c7204ee0fbda21b9f4f697d91
```

docker pull

```
$ docker pull $BUILD_IMAGE
```

`./gradlew cli` で docker 内でビルド


```
$ docker run -w /digdag -v `pwd`:/digdag -v $HOME/.gradle:/root/.gradle $BUILD_IMAGE ./gradlew cli
```

pkg 下にできあがるのでそれを実行すれば起動する。実行ファイル形式になっているのでそのまま実行できる。

```
$ pkg/digdag-{VERSION}.jar
```

TODO: この jar は shadowJar なる全詰めのいわゆる fat jar。作るのに 10 sec ぐらいかかってつらいのでスキップして実行する手段があったら教えてほしい

# インストール

インストールはこの jar を digdag という名前で PATH が通っている場所におけば良い

```
sudo mv pkg/digdag-{VERSION}-SNAPSHOT.jar /usr/local/bin/digdag
```

# テスト

テスト対象を絞り込んで受け入れテストを流す

```
env CI_ACCEPTANCE_TEST=true \
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-w /digdag \
-v `pwd`/:/digdag \
-v $HOME/.gradle:/root/.gradle \
$BUILD_IMAGE \
./gradlew digdag-tests:test --info --tests acceptance.DockerIT
```

テスト対象を絞り込んで単体テストを流す

```
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-w /digdag \
-v `pwd`/:/digdag \
-v $HOME/.gradle:/root/.gradle \
$BUILD_IMAGE \
./gradlew digdag-core:test --tests io.digdag.core.schedule.ScheduleExecutorTest
```
社内Mac端末をGitサーバーとしてセットアップする

# やりたいこと
社内ローカル環境で、Mac端末にGitサーバーを立て、Windows端末やMac端末上のSourceTreeから利用したい。
# 経緯
いずれはWeb上のホスティングサービスを利用したいと思っていますが、学習も兼ねて、まずは社内で試すことに。
他の方の記事をいくつか参考にしましたが、微妙にうまくいかない点があった為、こちらに残します。
# 環境
・Gitサーバー：Mac mini（MacOSX）
・Gitクライアント：Windows10、MacCSX
# 手順
## 1.MacにGitをインストールする
・会社から端末を手配してもらった時点でxcodeがインストールされていたので、gitも入っていた、はず。
・MacはGitクライアントとしても使うので、SourceTree（3.0.1）をインストール。
## 2.SSH接続の為の鍵を作成する（Mac）
### (1)ターミナルで以下を実行。
　`ssh-keygen -t rsa`
　（"rsa"・・・ファイル名。任意でOKですが、この名前がよく使われている為、倣います。）

⇒実行後、/User/（ユーザー）/.ssh/ 内に、秘密鍵と公開鍵（のファイル）が作成される。
（".ssh"は隠しディレクトリ。Finderでパスを明示して移動すると見る事が出来ます。）
## 3.パーミッションを設定する（Mac）
### (1)ターミナルで以下を実行。
　`cd ~/.ssh/`
　`cat id_rsa.pub >> authorized_keys`
　`chmod 600 authorized_keys`
　`chmod 700 ~/.ssh`
　`rm id_rsa.pub`

（各コマンドの意味）
　・.sshディレクトリに移動（"~/"はユーザーディレクトリ）
　・公開鍵（id_rsa.pub）をauthorized_keysに結合
　・公開鍵（authorized_keys）のパーミッションを600（所有者のみ読み書き可）に設定
　・.sshディレクトリのパーミッションを700（所有者のみ読み書き実行可）に設定
　・id_rsa.pubを削除

## 4.Gitクライアントに秘密鍵を渡す
### (1)Windowsの場合
　Macで作成した秘密鍵（id_rsa）を、USBメモリなどを使って「C:\Users\(username)\.ssh\」配下に置く。
### (2)Macの場合
　今回はGitサーバーとGitクライアントを兼ねている為、ファイルの移動はない。
## 5.Gitクライアントから使えるか確認する
### (1)Macでリポジトリを作成
　ユーザーディレクトリ直下に「repos」ディレクトリを作成し、その配下にリポジトリのディレクトリを作成する場合
　・ターミナルで以下を実行する。
　`cd ~/`
　`mkdir ~/repos/`
　`cd repos`
　`mkdir sample.git`

　・作業ディレクトリなしで、リポジトリを作成する
　`git init --bare`

### (2)Macで他端末からのSSH接続を許可
　・Appleメニュー ＞ システム環境設定 ＞ 「共有」を開く。
　・「リモートログイン」の項目をチェックする。
### (3)WindowsのSourceTreeからCloneする
　・以下のように、リモートリポジトリを指定してClone。
　`(Macのユーザー名)@(MacのIPアドレスまたはホスト名):repos/(リポジトリのディレクトリ名)`
　（例）
　`suzuki@192.168.1.1:repos/sample.git`

　ここまで出来たら、SourceTreeでプッシュ、プルや「リモートのステータスを更新」も出来る。
　今までWindowsローカルでのみ利用していたリポジトリもプッシュ出来た。
## 今後
社内の有志とあれこれ使い、ルールを定めて、社内のSVNをGitに移行したいと思っています。
## 参考
[Windows10パソコン上にGitサーバを立ててみた](http://imamachi-n.hatenablog.com/entry/2018/06/09/170331)
[`ls -l` と `chmod` による謎の数字とアルファベットの意味まとめ](https://qiita.com/uhooi/items/e04dd3c801564b067e92)
GETクエリで初期表示と検索条件が全て空を分岐したい

トリッキーな小技なので、本来は使いたくない。
## やりたかったこと
検索条件が複数あり、GETクエリで初期表示と検索条件が全て空を分岐したい。

- 初期表示の場合、エラーメッセージを表示しない。
- 検索条件が全て空の場合、エラーメッセージを表示したい。

`IClientValidatable`やjavascript側で、検索実行前のValidation処理を実装すれば実現可能だが、簡単な処理に大層な実装をつくりたくない。

> ASP.NET MVC 3 で独自の検証属性を作成して、クライアントサイド検証を行う - しばやん雑記 https://blog.shibayan.jp/entry/20110108/1294423577

検索条件が複数あり、検索条件が全て空かの判定は、`IValidatableObject`の`Validate`メソッドで簡単に実現可能

``` SearchViewModel.cs
public class SearchViewModel
{
    public string KeywordA { get; set; }
    public string KeywordB { get; set; }
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var results = new List<ValidationResult>();
        if (string.IsNullOrWhiteSpace(KeywordA) && string.IsNullOrWhiteSpace(KeywordB))
        {
            return results.Add(new ValidationResult("検索条件を入力してください"));
        }
        return results;
    }
}
```

## 問題

GETクエリの場合、初期表示と検索条件なしはどちらも検索条件をパラメータを指定していない状態のため、`IValidatableObject`の`Validate`メソッドで、検索条件に対し`string.IsNullOrWhiteSpace(prop)`を行うと、どちらも同じ結果が返ってしまい、分岐できない。

## 対応方法
初期表示の場合は、コンストラクタを実行するのみ。
検索条件なしで検索した場合は、ModelBinderを経由するので必ず値はnullになる。

これを利用し、モデルクラス側に空文字""の初期値を設定することで、処理を分岐する。

``` SearchViewModel.cs
public class SearchViewModel
{
    //初期表示の場合は""、検索条件なしで検索した場合はnull
    public string KeywordA { get; set; } = "";
    public string KeywordB { get; set; } = "";
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var results = new List<ValidationResult>();
        if (string.IsNullOrWhiteSpace(KeywordA) && string.IsNullOrWhiteSpace(KeywordB))
        {
            return results.Add(new ValidationResult("検索条件を入力してください"));
        }
        return results;
    }
}
```
``` HomeController.cs
public class HomeController : Controller
    public ActionResult Search(SearchViewModel model)
    {
        //初期表示の場合はエラーメッセージをクリア
        if (model.KeywordA == "" && model.KeywordB == "") 
        {
            ModelState.Clear();
        }
        else if (ModelState.IsValid) 
        {
            model = repo.Search(model.KeywordA, model.KeywordB);
        }
        return View(model);
    }
}
```
CSS Flexbox


# CSS　Flexbox
学んだことを忘れないように備忘録として残しています。

##基本的な書き方
  　Flexコンテイナーと呼ばれる親要素にFlexアイテムと呼ばれる
  　子要素を入れてHTMLは完了。

```HTML
<div class="container">　
  <div class="item1">item1</div>
  <div class="item2">item2</div>
  <div class="item3">item3</div>
  <div class="item4">item4</div>
  <div class="item5">item5</div>
</div>

```
  　Flexboxを使って子要素を横並びにするには、親要素に display: flex;を 指定するだけOK。

```CSS
.container {
  display: flex;
}

.container {　　　
  display: inline-flex;　　/* インライン要素に使う場合*/
}

```

##親要素（Flexコンテイナー)に指定するプロパティ

　　flex-direction....子要素の並ぶ向き

```CSS
.container{
  display:flex;
  flex-direction: row; /* 初期値　左から右に配置*/
  flex-direction: row-reverse;/*右から左に配置*/
  flex-direction: column;/*上から下に配置*/
  flex-direction: column-reverse;/*下からうちに配置*/

}


```

　　flex-wrap....子要素の折返し

```CSS
.container{
  display:flex;
  flex-wrap: nowwrap; /* 初期値　子要素を折り返しせず一行に並べる*/
  flex-wrap: wrap; /* 子要素を折り返し複数行に上から下へ並べる*/
  flex-wrap: wrap-wrap-reverse; /*子要素を折り返し複数行に下から上へ並べる */

  flex-flow: row wrap; /* flex-flow flex-direction flex-wrapをまとめて指定*/

}

```

　　justify-content.....水平平行の揃え

```CSS
.conteiner{
  display:flex;
  justify-content: flex-start;/*行の開始位置から配置。左揃え*/
  justify-content: flex-end; /*行末から配置。右揃え*/
  justify-content: center; /*中央揃え*/
  justify-content: space-between; /*最初と最後は両端に配置、残りの要素は均等に間隔をあけ配置*/
  justify-content: space-around; /*両端の子要素も含め、均等に間隔をあけて配置*/

}


```

　　align-items.....垂直方向の揃え

```CSS
.conteiner{
  display:flex;
  align-items: stretch;;/*初期値　親要素の高さ、またはコンテンツの一番多い子要素の高さに合わせて広げて配置*/
  align-items: flex-start;; /*親要素の開始位置から配置。上揃え。*/
  align-items: flex-end;; /*親要素の終点から配置。下揃え。*/
  align-items: center;; /*中央揃え*/
  align-items: baseline;; /*ベースラインで揃える*/

}

```

　　align-content..... 複数行にしたときの揃え
　　※flex-wrap:nowwrap;が適応されていると子要素が一行になるのでalign-contentは無効になる。

```CSS
.conteiner{
display:flex;
align-content: stretch;　/*親要素の高さに合わせて広げて配置*/
align-content: flex-start;/*親要素の開始位置から配置。上揃え。*/
align-content: flex-end;/*親要素の終点から配置。下揃え*/
align-content: center;/*中央揃え*/
align-content: space-between; /*最初と最後の子要素を上下の端に配置し、残りの要素は均等に間隔をあけて配置*/
align-content: space-around; /*上下端にある子要素も含め、均等に間隔*/

}
golang MySQLからデータを取得読み込む

# Go言語勉強録
Goは書いていたのですが、どれをネタにしようかと迷い迷っていました。
セッションの実装をネタにしようと思っていたのですが、実装と記事をまとめるまでが時間が相当かかりそうだったので、セッションの実装の際、データベースからデータを読み込む時に少しつまづいた部分をネタにしようと思いました。
今回は構造体の配列の要素追加をやっていきます。

## 過去の記事
* [Go言語の環境構築 Hello Worldまで](https://qiita.com/lkeix_/items/161d448bea2547ae2d8b)
* [go言語 静的ページの作成](https://qiita.com/lkeix_/items/a5005efed487bba7c36e)
* [AngularJSのhttp通信からのpostリクエストをgo側で取得](https://qiita.com/lkeix_/items/8f859415cc87a1e9ca07)
* [go言語でhtmlから取得したデータをjson形式で保存する](https://qiita.com/lkeix_/items/e9078f7f49803d77e10f)
* [golang 並列処理でリバースプロキシ](https://qiita.com/lkeix_/items/e0b8c675af6f947d6bde)

## 本題
実際にデータベースのレコードの構造は以下のようになっています。

```
id int
name varchar(8)
address varchar(32)
age int
```

このデータベースの複数レコードを取得します。
まずは下準備の受け取るデータ構造の定義とデータベースに接続する部分を書きます。

```go:connDB.go
type Test struct {
	Id     int
	Name   string
	Adress string
	Age    int
}

func connectionDB() *sql.DB {
	dsn := "username:passwd@tcp(127.0.0.1:3306)/test?parseTime=true"
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		fmt.Println("Err1")
	}
	return db
}
```


次にデータを取得するコードを書きます

```go:connDB.go
func getRows(db *sql.DB) *sql.Rows {
	rows, err := db.Query("SELECT * FROM testlist")
	if err != nil {
		fmt.Println("Err2")
		panic(err.Error())
	}
	return rows
}
```

DBを引数にしてクエリを実行してその行データを返す関数になっています。QueryとExecはおそらくExecを使うべきだとおもうのですが。。今度リファレンスを見ておきます。

最後にメイン関数です。

```go:connDB.go
func main() {
	db := connectionDB()
	defer db.Close()
	rows := getRows(db)
        // 行データ取得
	test := Test{}
	var result []Test
	for rows.Next() {
		error := rows.Scan(&test.Id, &test.Name, &test.Adress, &test.Age)
		if error != nil {
			fmt.Println("scan error")
		} else {
			result = append(result, test)
		}
	}
	fmt.Println(result)
}
```

`var result []Test`を`tests := new([]Test)`でデータ構造を作っていたらappend関数の部分でエラーを吐かれた。new()で変数を作ると`append struct to slice`のエラーを吐かれるのでそもそものメモリの割り当て方が違うのかな。。

## まとめ
データベースにアクセスすることができてアプリケーションで実現できる幅がさらに広がってきました。
new の割り当てと 配列宣言のメモリの割り当ての部分を理解しておくべきだなと思いました。

## 参考
https://qiita.com/hanenao/items/103774f76abdbc853abf
HerokuをLinuxmint19.1に入れてみる。

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<@kento_o>です。

自分の環境であるLinuxmint19.1にHerokuをインストールしてみました。

#まずは
Herokuアカウントの作成を行います。
私がロボットでは無いことを証明します。

#コマンドラインでインストール
今回はLinuxmint19.1にインストールするので、Heroku公式のインストールガイドに従っていきます。
Linuxmint19はubuntu18をベースに作成されているので、以下のコマンドを端末に入力します。

```
curl https://cli-assets.heroku.com/install-ubuntu.sh | sh

```

ところが、「E: ロック /var/cache/apt/archives/lock が取得できませんでした - open (11: リソースが一時的に利用できません)
E: ディレクトリ /var/cache/apt/archives/ をロックできません
」
とエラーを吐かれました。
[この記事](https://qiita.com/koara-local/items/e63b7e4ff3cea803bdea)を参考にlockファイルを思い切って消去したところ、問題なくインストールできました。

#ログイン
アカウントをログインして完了です。

個人的には、ソフトウェアマネージャが不正な状態になってしまっていたエラーを解決したことが学びの一つですね......(^^;)



#最後に
SEKIRO、マジで面白いです。

久々に手応えのある難易度です。

体幹システムの理解が本当に重要で、理解していない内は何やっても勝てません、死にます。

「これはダメか、じゃあこの方法はどうだ」を繰り返す過程の面白さはプログラミングにも通じるものだと思いました。
BigQuery→CloudStorage→CloudSQLへデータ移行


* BigQuery→CloudStorage→CloudSQLでデータの移行を行う
* [以前書いた記事](https://qiita.com/ezaqiita/items/67f029a54eebe7c58703)と同じ環境を使う


# BigQuery

- BigQueryで適当なクエリを実行

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/36888bbb-af88-7de7-5078-881debb6bf30.png)

- 結果を保存するでCSVで保存
- 「クエリ結果」 -> 「名前を付けて保存」 -> 「CSV 形式でダウンロード」をクリック
- ローカルにファイルが保存される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/2efbb1cc-f6ed-b094-ee39-d2a51f455f28.png)

# CloudStorage

- CLoudStorageの画面へ移動
- 「ブラウザ」を選択
- バケット名を入力しバケットを作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/3f066d3b-c90a-5a76-22e8-e33982b645de.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/68bdea76-d90e-0175-0a54-771e444102b5.png)

# CloudSQL

- CloudSQLインスタンスを作成
- インスタンスIDとパスワードを入力
- 「Create」を押してDBインスタンス作成
- 数分待つ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/5b84093e-7bc7-5109-5a5d-c04484013540.png)

- CloudShell経由でDBに接続

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/37bfd263-1852-8b9b-8dfb-25c625411e22.png)

- CloudSQLインスタンスを選択し、画面が遷移したら「インポート」を選択
- CloudStorageからインポートデータ画面に遷移
- 入力画面で「CloudStorage」バケット/ファイルパスを入力
- 「インポートの形式」はCSVを選択
- データベースとテーブルを確認
- インポートを押す

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/342fd11f-3ba4-6862-99d0-2bb7aa2f1666.png)

- データがインポートされている事がわかる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/acd55d19-eaff-d8e3-6603-7a248c9807b4.png)
gradleをHomebrewでインストールする

gradleをbrewで入れる方法

```
brew install gradle
```

他にも、パッケージマネージャで入れる方法としてSDKMAN!を使う方法もある。そのへんの詳細は、[公式ドキュメントのInstalling Gradle](https://docs.gradle.org/current/userguide/installation.html#installing_with_a_package_manager)を参照。

インストールしたバージョンは`gradle -v`で見れる。


```
gradle -v

------------------------------------------------------------
Gradle 5.3
------------------------------------------------------------

Build time:   2019-03-20 11:03:29 UTC
Revision:     f5c64796748a98efdbf6f99f44b6afe08492c2a0

Kotlin:       1.3.21
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          11.0.2 (AdoptOpenJDK 11.0.2+9)
OS:           Mac OS X 10.14.3 x86_64
```
無限にIEnumerable

# 目的

無限IEnumerableについて紹介し、いくつか簡単な例を挙げます。

## 無限IEnumerable

C#(ほか様々な言語)では、無限に列挙し続けるイテレータを書くことが出来ます。

例えば、以下のOnesは無限に続く１を表します。

```csharp
public static IEnumerable<int> Ones() {
    while (true) yield return 1;
}
```

また、以下のNatは０から始まる自然数全体を昇順で列挙します。

```csharp
public static IEnumerable<int> Nat() {
    int value = 0;
    while (true) yield return value++;
}
```

実際に以下のように出力してみると、列挙が止まらないことが確認できます。

```csharp
foreach (var n in Nat()) Console.WriteLine(n);
```

出力結果は 0 1 2 3 4 5 6 7 8 9 10 11 ... となるはずです。

### 無限IEnumerableの使い方

無限に実行が止まらないのではなかなか使いみちがありませんので、通常は[Take](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.take?view=netframework-4.7.2)や[TakeWhile](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.takewhile?view=netframework-4.7.2)などと組み合わせて使うことが多いかと思います。

例えば、先ほどのNatであれば、

```csharp
foreach (var n in Nat().Take(10)) Console.WriteLine(n);
```

などとすると、 0 1 2 3 4 5 6 7 8 9 の10個の自然数を表示することができます。

## 無限IEnumerableの例

- 正整数を列挙

```csharp
public static IEnumerable<int> Pos() => Nat().Skip(1);
```

- ０以上の偶数を列挙

```csharp
public static IEnumerable<int> Evens() => Nat().Where(x => x % 2 == 0);
```

- 0以上のnの倍数を列挙

```csharp
public static IEnumerable<int> Multiples(int n) => Nat().Select(x => x * n);
```

- FizzBuzz

```csharp
public static IEnumerable<string> FizzBuzz() => Pos().Select(
    x =>
        x % 15 == 0 ? "FizzBuzz"
        : x % 3 == 0 ? "Fizz"
        : x % 5 == 0 ? "Buzz"
        : x.ToString());
```

### updateを補助する関数

前の値一つを使って次の値が決定されるような列挙については、以下のような補助関数Iterateを定義すると書きやすくなります。

```csharp
public static IEnumerable<T> Iterate<T>(Func<T, T> updater, T init) {
    while (true) {
        yield return init;
        init = updater(init);
    }
}
```


たとえば、先ほどのNatは以下のように書けます。

```csharp
public static IEnumerable<int> Nat() => Iterate(x => x + 1, 0);
```

最初の定義と比べると見た目がシンプルになりました。
また、1, 10, 100, .... を列挙するOneZerosは以下のように書けます。

```csharp
public static IEnumerable<int> OneZeros() => Iterate(x => x * 10, 1);
```

nから始まる[Collatz列](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E3%81%AE%E5%95%8F%E9%A1%8C)は以下のように書けます。

```csharp
public static IEnumerable<int> Collatz(int n) => Iterate(x => x % 2 == 0 ? x / 2 : x * 3 + 1, n);
```


## 結論

無理に有限に制限するインターフェースにせずとも、無限に列挙するイテレータ＋Takeなどで素朴に書ける場面がたまにあります。
参考になれば幸いです。
System.DirectoryServices.dllを使って、PowershellからActive Directoryへに接続

```powershell
#{host}を接続先のADのIPに書き換え
$domain = "LDAP://{host}:389"

$auth = [System.DirectoryServices.AuthenticationTypes]::FastBind

#{DN}を接続先のにドメインのDNに書き換え　{User}、{Password}を接続用のユーザ情報で書き換え
$root = New-Object System.DirectoryServices.DirectoryEntry($domain,"{DN}\\{User}", "{Password}", $auth)

$query = New-Object System.DirectoryServices.DirectorySearcher($root,"(objectclass=*)")
$entries = $query.FindAll()

#ADで管理しているエントリーが出力される
$entries | %{$_.Properties}
```