OmniAICreator/Qiita-1.07M huggingface dataset:
Mac 開発効率を上げるための設定・ツール

### 開発環境でやっておくと便利なもの・ツールをまとめてみました。

## ターミナルの設定

### 背景色変更
Terminal →　環境設定から
基本ですがまずはこれでテンションを上げていきましょう！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52335/efe1630e-8ef3-9ae4-bdf9-0dcd20776064.png)

## git周り

gitをまだインストールしていない場合は以下を参考
https://qiita.com/micheleno13/items/133aee005ae37c28960e

#### gitコマンド補完 & ブランチ名をプロンプトに表示させる
これでブランチ名とかいちいちgit branchしてコピペする必要なし！
今いるブランチ実は思ったのと違ったーみたいなことにこれでならない！
参考↓
https://qiita.com/koyopro/items/3fce94537df2be6247a3

## sshの設定(簡単に接続できるようにする)

### 接続先の管理
参考：.ssh/configファイルでSSH接続を管理する
https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1

#### sshホスト名の自動補完
参考：sshのhost名を自動補完させる
https://qiita.com/soramugi/items/846e6eac0ce1d3dc1e42


## DBのGUIツール
ここは色々あると思うので好みですが、
最近の流行りはSequelproよりTeamSQLって感じでしょうか?
JetBrains社のIDEだったらもうDBのGUIツールが同梱されているのでそちらを使うのも手だと思います。

個人的には、Sequelproをずっと使っていたんですが、
複数のクエリを同時に実行することができなくて、、、、
TeamSQLはそれができるのでそこが気に入っていますw

例 以下のようなクエリをTeamSQLなら2つ同時に実行してそれぞれの結果を返してくれる。

```
select * from test where id = 1;
select * from test where email = 'test@mail.com;
```

Sequelpro
https://www.sequelpro.com/

TeamSQL
https://teamsql.io/

## キャプチャ関連

### 画面全体のキャプチャとか撮りたい時
FireShot(Chromeのプラグイン)
https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg

### キャプチャに対して文字とか赤枠とか入れたいとき
Skitch
https://itunes.apple.com/jp/app/skitch-%E6%92%AE%E3%82%8B-%E6%8F%8F%E3%81%8D%E8%BE%BC%E3%82%80-%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B/id425955336?mt=12
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52335/0550e1b9-1101-ce55-7a66-4575d2996fcc.png)


## クリップボード拡張ツール
画面で色々Command+Cでコピペしている時、何個か前にコピーした文字列なんだったけかなーみたいな時に、
直近でコピーした履歴を呼び出せるアプリです。
DBのレコード調査とかでいろんなテーブルのidをコピーしながら複数のテーブルを見ていくときとかに
かなり活躍します。
参考
https://qiita.com/econa77/items/1848bf3fdfb7127ca9b8

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52335/9e9bb34d-fdfd-5b29-4ab1-3ebb9847fe25.png)

以上です。また便利と思うツールとかあったら追加したいと思います。
AWSでt3インスタンスの制限緩和申請

「アジアパシフィック（東京）」で**t3**インスタンスを作成しようとしたところ、インスタンスの制限数に引っかかってしまいました。
汎用インスタンスは**t2**が以前から使われてきましたが、久々にAWSを触ったら新しく**t3**が出ていたので使おうとしたところ、このようになりました。

# 起きたエラー
**t3.medium**のインスタンス作成時にエラーが表示されました。
作成できるインスタンス数の上限が0とのこと。

>You have requested more instances (1) than your current instance limit of 0 allows for the specified instance type. Please visit http://aws.amazon.com/contact-us/ec2-request to request an adjustment to this limit.

EC2ダッシュボードの**制限**から、上限を確認すると、確かに**t3.midium**の上限数は0でした。
他の**t3**インスタンスも1か0でした。
**アジアパシフィック（東京）**が少ないようで、他のリージョンではもう少し多いようです。

<img width="1055" alt="02.EC2 サービスの制限.png" src="https://qiita-image-store.s3.amazonaws.com/0/345798/ed08e9b5-5221-501d-167e-adaec4124a10.png">

# 制限緩和申請
先ほどの画面から、[制限緩和のリクエスト]を押すと、サポートセンターのページに飛ぶので、必要な項目を入力していきます。
上から入力項目を埋めていくと、自動的に次の入力項目が表示されていきます。
一度に複数の申請を行うことも出来ます。私は**t3.medium**以外の制限緩和も併せて申請しました。

<img width="827" alt="03.制限緩和申請.png" src="https://qiita-image-store.s3.amazonaws.com/0/345798/ddc632aa-fe07-f524-c75f-2d3d721f0213.png">

次に、申請理由を記載します。
私は、t3インスタンスを複数台含む構成を組みたいので制限緩和してほしい、と記載しました。

<img width="827" alt="04.制限緩和申請2.png" src="https://qiita-image-store.s3.amazonaws.com/0/345798/64b5b150-38e7-9a10-7a91-89403e6a8bdf.png">

最後に、連絡方法を選びます。
WebとPhoneのいずれかが選択可能ですが、私はWebを選択しました。
[Submit]を押せば終了です。

# その後
翌日にメールで連絡が来ました。

>いつもお世話になっております。
>この度は上限緩和をご申請いただきありがとうございます。
>
>ご依頼いただきましたとおり、下記の上限値への緩和を完了いたしました。
>反映されるまでに数分かかる場合がございますが、予めご了承くださいませ。

早速確認してみると、申請した内容通りインスタンス数の上限が増えていました。

<img width="1051" alt="05.EC2 サービスの制限(制限緩和後).png" src="https://qiita-image-store.s3.amazonaws.com/0/345798/1e40b146-66dc-3262-31c0-b6acfd0b0945.png">

# まとめ
- 作成できるインスタンス数には上限がある
- 上限は「EC2 サービスの制限」から確認できる
- 制限緩和の申請を行うと上限を緩和してもらえる
UE4をCLIからビルドする（Mac向け）

# CLIからビルドしたい  
https://api.unrealengine.com/JPN/Programming/Development/BuildingUnrealEngine/index.html
ドキュメントにはGUIでビルドする方法しか記載されてないが、
カスタムエディタのビルドの自動化とか考えるとCLIからビルドしたかった。

そもそもUE4をxcodeでビルドしている資料自体、あんまりないかも？

# 事前準備  
GitHubからUE4のプロジェクトをcloneしてくるまでは済ませておく

# 手順

1. git cloneしたUE4のプロジェクトまで移動する  
`$ cd ${MyUE4Project}`
2. Setup.commandとGenerateProjectFiles.commandを実行する  
`$ sh Setup.command`  
`$ sh GenerateProjectFiles.command`
3. UE4.xcworkspaceをビルドする  
`$ xcodebuild -workspace UE4.xcworkspace -scheme ShaderCompileWorker -sdk macosx -configuration "Development Editor" build`  
`$ xcodebuild -workspace UE4.xcworkspace -scheme UE4 -sdk macosx -configuration "Development Editor" build`  
4. ビルド後、`Engine/Binaries/Mac/UE4Editor.app`を開いて動作確認ができればOK
  
  
### 余談
configurationの指定が`Development`だと`UE4Game.app`(プロジェクト本体)がビルドされる。
`Development Editor` にすることでエディタのビルドが行われる。
（こんな単純なことに8h以上かけてしまった...）
【JavaScript】 インデックスの配列から、多次元配列の要素を特定して変更する方法

```js

// 元の配列
var sanjigen = [
  [["a", "b"], ["c", "d"], ["e", "f"]],
  [["g", "h"], ["i", "j"], ["k", "l"]],
  [["m", "n"], ["o", "p"], ["q", "r"]]
];

// 変更したい要素位置の配列
const indexes = [2, 2, 1];

// 置き換える値
const replaceElement = "changed";

```

このような状態の時、多次元配列の要素をインデックスをまとめた配列から特定して変更する処理。

```js

var times = 0;

function saiki(element, index) {
  // indexesで指定した要素の時
  if (times === indexes.length - 1 && index === indexes[times]) {
    return replaceElement;
  };

 　if (element instanceof Array && index ===　indexes[times]) {
　　times++;
　　return element.map(saiki);
 　};

   return element;
};


var changedArray = sanjigen.map(saiki)
console.log(changedArray)

```

出力結果

```
[ [ [ 'a', 'b' ], [ 'c', 'd' ], [ 'e', 'f' ] ],
  [ [ 'g', 'h' ], [ 'i', 'j' ], [ 'k', 'l' ] ],
  [ [ 'm', 'n' ], [ 'o', 'p' ], [ 'q', 'changed' ] ] ]
```

やたら苦労してしまった。。。
もっといいやり方あったら教えてください。。

### 1/21 追記
コメントで綺麗なコードいただきました。

```js

const
   getElement = (array, indexes) => {
      for (const index of indexes) {
         if (!Array.isArray(array) || !isFinite(index) || index < 0) {
            return undefined;
         }
         array = array[index];
      }
      return array;
   },
   setElement = (array, indexes, value) => {
      array = getElement(array, indexes.slice(0, -1));
      const index = indexes[indexes.length - 1];
      if (!Array.isArray(array) || !isFinite(index) || index < 0) {
         return value;
      }
      return (array[index] = value);
   };
```

参照渡しについてよくわかってなかった、、ありがとうございました！
ControllerのRspecを書いていて地味に嫌だったエラー

# Postというオブジェクト名のせいで地味に嫌なエラーにあたったので書いておく

PostsControllerのrspecを書いていたら、「post」という名前のせいで挙動がおかしくなった。

コントローラのテストで`post`という名前でfactoryからcreateした

```ruby
let!(:post) { create(:post, user: post_user) }
```

で、controllerの以下のようなテストを動かすと

```ruby
it 'コメントが作成されること' do
    expect do
        post :create, params: valid_attributes
    end.to change(Comment, :count).by(1)
end
```

argment error?なんで？

```
wrong number of arguments (given 2, expected 0)
```

`post`という命名が`post`メソッドと被ってたらしくこうしたら直った

```ruby
let!(:commented_post) { create(:post, user: post_user) }
```
デベロッパーツールだけでお手軽Webスクレイピング

## はじめに

一つのWebページからリスト情報を抜き出したい時はありませんか？
私はよくあります。

例えば、コンテンツの一覧ページからタイトル情報だけ抜き出したい時。
「スクレイパーを書くほどでもないけど、一つ一つ手で抽出するのも面倒...」
と誰もが思うことでしょう。

そんな時に使えるデベロッパーツールの小技を紹介します。

## スクレイピング対象
今回は例として、[私の作っている聖地巡礼マップ](https://hirosaji.github.io/hobunsha-map/public/)をスクレイピングの対象にします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/162655/27e16363-b218-344b-5476-6e48b2d2bd36.png" width="600px">
デベロッパーツールの`Console`タブを使って、「作品名」だけを抜き出してみましょう。

## スクレイピング手順

まずは、表示しているWebページに CDN で D3.js のライブラリを読み込ませます。

```js:addD3
// set d3.js library
var e = document.createElement('script');
e.src = '//cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js';
document.getElementsByTagName('head')[0].appendChild(e);
```

D3.js のDOM操作で、欲しい属性の値をスクレイピングします。

```js:getTargetAttrValues
var targetAttr = 'data-value';  // Attribute name you want
var targetElementClass = '.slider-slide';  // Class name with attribute name you want
var targetAttrList = [];

// select 'targetElementClass' elements & get 'targetAttr' values
d3.selectAll(targetElementClass)
  .each(function(d) {
      targetAttrList.push(d3.select(this).attr(targetAttr))
  });

console.log(targetAttrList);
```

## 実行結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/162655/06607d5b-567d-ce5e-9912-48eb8a44895c.png" width="600px">
無事に「作品名」を抽出できました！

## おまけのTips
ライブラリの読み込みなど、よく使うスクリプトは`Sources`タブの`Snippets`に登録しておくと便利です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/162655/064e0701-a68b-9f67-9654-3f79551941d4.png" width="600px">
まさかのGASで悩まされたこと

constやletにするとエラーは起きないけど
なぜか配列のデータがindex[0]しか取り出せなかった。

```
  const array = ["a", "b", "c", "d"]
  for (let index = 0; index < array.length; index++) {
    const value = array[index];
    Logger.log(value)
  }
```

####出力結果

```
a
a
a
a

```


全部、varに変更したら問題なく全部取り出せた。

```
  var array = ["a", "b", "c", "d"]
  for (var index = 0; index < array.length; index++) {
    var value = array[index];
    Logger.log(value)
  }
```


####出力結果

```
a
b
c
d

```
d

Pythonのインストール
PythonのWebページから適当なVersionをダウンロード

コマンドプロンプトで

Python --version

で確認

仮想環境を構築
コマンドプロンプトで，

pip install virtualenvwrapper-win

これで，virtualenvとvirtualenvwrapperがインストールされる．

Djangoのインストール
コマンドプロンプトで

pip install Django＝バージョン

でインストールできる．

参考にしたサイト
https://zenmaibane.hatenablog.com/entry/2016/09/25/183220
【メモ】面接時の質問リスト

1. これだけは譲れない「こだわり」を教えてください。
1. 直近1年で読んだ技術本と、非技術本で印象に残った本を1つずつあげてください。

[面接で活かせる！優秀なエンジニアを見極める5つの質問](https://www.procommit.co.jp/recruiter/support/column/5-questions-to-identify-an-excellent-engineer)

1. 簡単な自己紹介(3分 ~ 5分)
1. 今携わっているシステムの構成図
1. 今まで自分が関わってきたシステムのアーキテクチャ
2. エンジニアのしての自分に3つのコピー(キーワード)をつけるなら何？(↓の得意なこと・苦手なことの代わりにこの質問で良いかも)
    * 例えば僕ならAWS, immutable, 関数型
1. 得意なこと・苦手なこと
1. 志望動機
1. 転職理由
1. 好きな言語・好きなライブラリ
1. 就労条件周り
    1. 雇用形態(自明であれば聞く必要なし)
    2. 希望年収
    3. 勤務地・リモート希望かどうか
transform: rotateZ(180deg);で左回転になってしまうところを右回転にしたい

## 概要
以下のコードでなぜか左回り..

```index.html
<dl>
    <dt class="nanntoka_title">東北</dt>
    <dd>ほにゃらら</dd>
</dl>
```
```style.css
.nanntoka_title{
    display: block;
    height: 54px;
    padding: 0 12px;
    line-height: 54px;
    color: #fff;
    background: #527eb4;
    position: relative;
    &:after{
        content: "";
        display: block;
        width: 14px;
        height: 8px;
        background: url($imgurl + "icon.svg") no-repeat center center / contain;
        position: absolute;
        top: 50%;
        right: 12px;
        transform: translateY(-50%);
        transition: 0.5s;

    }
    &:hover:after{
        transform: rotateZ(180deg);
    }
}
```


## 説明
答えは簡単でした。

```style.css
.nanntoka_title{
    display: block;
    height: 54px;
    padding: 0 12px;
    line-height: 54px;
    color: #fff;
    background: #527eb4;
    position: relative;
    &:after{
        content: "";
        display: block;
        width: 14px;
        height: 8px;
        background: url($imgurl + "icon.svg") no-repeat center center / contain;
        position: absolute;
        top: 50%;
        right: 12px;
        transform: translateY(-50%);
        transform: rotateZ(0deg);
        transition: 0.5s;

    }
    &:hover:after{
        transform: rotateZ(180deg);
    }
}
```


`transform: rotateZ(0deg);`を足すだけ。


えっ

起点違かったの..?



### あとがき
とどのつまり、どんなときでもtransitionプロパティで**アニメーションするときは起点を忘れずに書いたほうがよい**ですね。
TweetDeckをもっと見やすく

初投稿なので軽いお話です。

画面の端にChromeでTweetDeckを開いているのですが、アドレスバーやタブバーが不要なので、全画面表示以外の方法で非表示にして見やすくした話です。左が右になりました。

<div align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/232173/9054e7ba-cd87-3528-68f0-fdc3c6f8eceb.png" width="800">
</div>

## 試し方
Chromeの[起動オプション](http://chrome.half-moon.org/43.html)にあるアプリケーションモード(<code>--app=URL</code>)を使用します。

```:Windows10
cd C:\Program Files (x86)\Google\Chrome\Application
chrome.exe --app=https://tweetdeck.twitter.com
```

```:macOS_Mojave
cd /Applications/Google\ Chrome.app/Contents/MacOS
./Google\ Chrome --app=https://tweetdeck.twitter.com
```

お疲れ様でした。完了です。
蛇足ですが、街中のデジタル案内板はデジタルサイネージというみたいで、キオスクモード(<code>--kiosk</code>)を使って簡易的に再現できるみたいですね。作りません。

## ピン留め
windows10でのみ行っています。ご了承ください。
毎回このコマンド打つのも億劫なので、バッチファイルに書き込んでタスクバーにピン留めしました。

①バッチファイルを作ります。 (開いたコマンドプロンプトを消す<code>exit</code>を追加)

```:TweetDeck.bat
cd C:\Program Files (x86)\Google\Chrome\Application
chrome.exe --app=https://tweetdeck.twitter.com/
exit
```

②ショートカットを作ります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/232173/9d94c1b5-94e2-8aef-af6f-4d3befad150a.png" width="300">

③ショートカットのプロパティで、リンク先の先頭に「<code>cmd /c </code>」を追加します。 
　(バッチのショートカットではピン止めできないので、コマンドプロンプト経由に)

④下部の「アイコンを変更」を行います。アイコンの画像は.pngではなく.icoなどの形式が必要です。
　250x250までのサイズであれば、「[半透過マルチアイコンfavicon.icoを作ろう!](https://ao-system.net/alphaicon/) 」がとても分かりやすいです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/232173/dc7f4525-ebaa-9d49-bcf4-2d1af3b100c9.png" width="350">

⑤ピン留めします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/232173/63734c79-6535-256e-de6f-e9b3275c8423.png" width="300">

⑥このようになります。
<img src="https://media.giphy.com/media/8FPnpQQWUokEIDeqZV/giphy.gif" width="500">
ウィンドウの出現場所、大きさ等は前回Chromeを起動した場所等の情報を記憶する<code>C:\Users\ユーザー名\AppData\Local\Google\Chrome\User Data\Default\Preferences</code>の一部と関係があるみたいですが、今回は省きます。

以上となります。

また蛇足ですが、スクロールバーはChrome拡張機能の[Minimal Scrollbar](https://chrome.google.com/webstore/detail/minimal-scrollbar/ekopmclclddpoipchmcbhifohhbmjafd)を使用して小さくしています。

## 注意
※2個以上同時に開くとウィンドウがどこか遠くへ消えて、<code>Preferences</code>を削除するまで戻って来ない挙動を確認しました。その為、とてつもなく注意してください。

また、上記<code>Preferences</code>ファイルは別途保存して、戻ってこない際に置き換えてください。



## まとめ
豊かなTwitterライフを送れそうです。今度こそお疲れ様でした。
初学者向けにクソ捗るUnityの基本操作(Mac)をまとめてみた！

Unityの学習をはじめて１週間、もっと早く知っておけば良かった…と今思うのは、操作方法です！

Unityに慣れるまで、操作に時間がかかって悶々とすることが多かったんですよね…。とはいえ、操作方法は無数にあるし、初学者向けにピックアップしたまとめ記事も少なかったです。

ってことで、私の経験則から、Unityが捗る便利な基本操作の方法をまとめてみました！

※注意
私がMacでしか使用していないので、mac限定になります。windowsの方はすみませんm(_ _)m 操作の雰囲気は伝わるかも…！

またUnityのベテランの方は、間違いや＋αの便利操作などございましたら、コメント頂けると嬉しいです！

##　基本操作
まずは、シーンの視点操作からご紹介！

### 回り込み
Option + トラックパッド1本指でグリグリ
![unity_1.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/713d4c2a-12e3-ad78-d8de-6e986115f7d3.gif)

### ズームイン・ズームアウト
トラックバックで垂直スワイプ　(2 or 3本指)
![unity_2.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/b919e4b0-b787-ebc9-6867-0f2e01862826.gif)

### 視点の平行移動
option + command + トラックパッド1本指でグリグリ
![unity_3.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/c4e9ddcf-a90b-f595-fb55-3693c6561b85.gif)

### 視点にフォーカス
- ヒエラルキー配下のオブジェクトをクリック
- シーンビューで対象オブジェクトを選択→Fボタンを押す
![unity_4.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/6845f4b4-8209-ecce-0b68-012782e1669c.gif)

## ツールバー

### 移動モード(オブジェクトの移動)
ツールバー「＋」→ドラッグ (WキーでもOK!)
![unity_5.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/c893a19e-22aa-142e-5229-fd3dacec5bdf.gif)


中心にある面をクリックして、ドラッグすると自由に平行移動できます！
### 回転モード
ツールバー「サイクル」→ドラッグ (EキーでもOK!)
![unity_6.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/29ce5aa6-a772-12ae-8e6f-99e4e314579b.gif)

## 拡大・縮小モード
ツールバー「拡散アイコン」→ドラッグ (RキーでもOK!)
![unity_7.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/973b69b5-fc2e-44be-06b1-7956343c1c8b.gif)


※オブジェクトの中心をドラッグすると、全体の拡大縮小ができる！

## 便利操作

### オブジェクトのリセット
インスペクター内のトランスフォーム→歯車→リセット
![unity_8.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/b91303e4-bdf3-6f3c-b666-35fece9d3c9f.gif)

### デリート
<kbd>command + バックスペース</kbd>

![unity_9.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/770945c7-e1a2-91d4-90f6-32be02e8746e.gif)

### 操作の取り消し
<kbd>command + z</kbd>
![unity_10.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/68da795c-617a-308b-cb22-32ef5a8ade50.gif)

### 操作のやり直し
<kbd>command + shift + z</kbd>

操作の取り消しの逆です。上の動画の逆バージョンなので、gifは割愛！

### 複製
<kbd>command + D</kbd>
![unity_11.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/ba53e567-778d-991e-31f1-12ec1ee4ca57.gif)

### 　他のオブジェクトに頂点にあわせて動かす
vを押しながら、ギズモ(オブジェクト周りに色が入った線)をドラッグ
![unity_12.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/7d61fff6-2498-ea69-353c-76abfb92d9f7.gif)

### オブジェクトの視線を追跡
<kbd>shift+F</kbd>
![unity_13.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/b5ad7d1e-2428-30b6-8197-6060f6cca8ae.gif)

他のオブジェクトを選ぶと、追跡を解除します！

## 最後に
Unityの操作方法は以上です！実際に自分で色々な操作を試してみると、すぐに慣れますのでご安心ください。

また、unityの勉強をこれから始める方は、Udemyの無料講座(ユニティちゃん)もぜひやってみましょう！基本操作はもちろん、その他の操作も学べるのでオススメです！！！
## 参考URL
- [ユニティちゃんが教える！初心者向けUnity講座](https://www.udemy.com/unity-chan-tutorial-01/)
- [Unity初心者が知っておくと少しだけ幸せになれる、シーンにオブジェクトを配置する時に使える18のTips+10](http://tsubakit1.hateblo.jp/entry/2015/04/21/031048)
CSS animation  で遊び倒す　- heartbeat -  

今回から、デザインの勉強を始めるために、　

CSS　animation を作っていきたいと思います。　
 
<br/>
医療現場の課題を解決するためには、

アートとデザインとITの力が必要です。　
<br/>
<br/>

毎日1作品を目標に、　

CSS animation を発信していきます。　




ではやってきます！　


#1.  heartbeat 

早速ですが、完成版はこちら



![ダウンロード.gif](https://qiita-image-store.s3.amazonaws.com/0/232715/739e3085-7387-edd3-bc3d-5f83134f871d.gif)




## なぜやるか？

弁膜症の治療方法と手術適応をすぐに判断できるReact SPAを開発中ですが、microinteraction を取り入れて、UX を向上したいためです。　

この心拍動をボタンに取り入れて、onClickで設定し、Google Material design のFab ボタンのように右下に置いて、ページ遷移したい時に使えそうです。　


##どうやるか？　

参考にしたのは　
[こちら](http://animista.net/)　です。　 

では、やっていきましょう！　


## 動きを分解する　

・scale が異なるものを3つ作り、それらをアニメーションでつなげれば良さそうです。

・動きの特徴としては、最初と最後をゆっくり余韻をつけ、真ん中は早く素早く大きさを変えれば良さそうです！　
→　ease - in -out ！　
<br/>

尚、イージングとは
・ linear  (一定)
・ ease-in (ゆっくり始まる)
・ ease-out (ゆっくり終わる)
・ ease-in-out (ゆっくり始まって、ゆっくり終わる)
<br/>
に大雑把に分かれます。
cubic-bezier(ベジェ曲線)によって、細かく自分で設定することもできます。 
試してみたい方は、[こちら](https://matthewlein.com/tools/ceaser) を参照ください。


##コード
```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="css/styles.css">

</head>
<body>
    <div class="heartbeat"></div>
</body>
</html>
```

```styles.css

.heartbeat{
    width: 100px;
    height: 100px;
    background: #000;
    margin: 30px auto;
    border-radius: 50%;
    animation: heartbeat 1.5s ease-in-out infinite both;
}

@keyframes heartbeat{
    from{
        transform: scale(1);
        transform-origin: center center;
        animation-timing-function: ease-out;
    }
    10%{
        transform: scale(0.91);
        animation-timing-function: ease-in;
    }
    17%{
        transform: scale(0.98);
        animation-timing-function: ease-out;
    }
    33%{
        transform: scale(0.87);
        animation-timing-function: ease-in;

    }
    45%{
        transform: scale(1);
        animation-timing-function: ease-out;
    }
}

```

 
## 補足説明
・CSS animation の一括指定プロパティ　
前から順に、以下のように設定できます。
<br/>
・animation-name: 指定値
・animation-duration: 指定値
・animation-timing-function: 指定値
・animation-delay: 指定値
・animation-direction: 指定値
・animation-iteration-count: 指定値
・animation-fill-mode: 指定値
・animation-play-state: 指定値
<br/>


参考： [MDN animation](https://developer.mozilla.org/ja/docs/Web/CSS/animation)
<br/>
・transform-origin プロパティは、　変形する時の原点を指定する時に使います。
この場合だと、円の中央から変形したいので、center になり、2つ値を設定することで、１番目: 水平方向、2番目: 垂直方向　と設定できます。　

transform-origin: right bottom　と設定すると、以下のような動画となります。



![ダウンロード (1).gif](https://qiita-image-store.s3.amazonaws.com/0/232715/26fdd466-6b81-9ef2-5078-1bed72fb9d1a.gif)


変形の中心が右下にずれてますね。
　

今回は、以上となります。
keyframe でこのように細かく設定すれば、このような心拍動も簡単に再現できますね。


それでは〜
RaspberryPi入門　~道具の用意から初回起動まで~

こんにちは、rickyです。
今回はラズパイについて書いていきます。
ラズパイについて何も知らない人が初回起動ができるようになるまで説明していきたいと思います。

ラズパイとは？
RaspberryPiの略称のこと。
マイコンの一種であり、他のマイコンに比べスペックが高いので小型のパソコンとしても用いることができる。
マイコンであるため、LEDなどと組み合わせて電子工作をすることも可能である。
技術と道具さえあれば、ちょっとしたIoTなども実現できる。
その際に記述する言語はpythonが用いられる。
2019年1月現在の時点での最新版はRaspberryPi3 model B+である。

今回の目標としてラズパイにRaspbianというOSをいれ、ラズパイでgoogle検索を行う。
必要なもの
・RapberryPi(今回はRaspberryPi3を使用する)
・ディスプレイ(HDMI端子のもの)
・USBキーボード
・USBマウス
・SDカード(8GB以上推奨)
・タイプBの電源コード(ラズパイ本体の電力供給のため)
あとはSDカードにOSを書き込むためにPCをご用意してください。

筆者のPC環境
windows10

1、Raspbianのダウンロード(数時間かかるので注意！)
　googleでRaspbianを検索し、公式サイトにアクセスする。
　デスクトップと推奨ソフトウェアのzipファイルをダウンロードする。
　(ダウンロードされたファイルはNOOBSとうファイル名になっているので注意！)
2、SDカードの用意
　SDカードに適したFormatterをgoogleより検索、インストールする。
　SDカードをPCに接続し、インストールしたFormatterでSDカードをFAT32にフォーマットする。
3、SDカードにOSを書き込む
　ファイルからRaspbianを選択し、SDカードへ展開するため、右クリック→展開を選択する。
　書き込み終了後PCからSDカードを取り出す。
4、ラズパイの初回起動
　SDカードをラズパイに差し込み、ディスプレイ、キーボード、マウス、電源をつないでいく。
　電源がつながった段階で自動的に起動されるので待つ。
　(画面が表示されない場合はSDカードに書き込んだOSのファイルの中身を一つ上の階層においてみてください)
　電源がつながると、インストールするOSのバージョンについて選択する画面が映し出される。
　その画面からwifiの設定を行う。
　wifi設定後インストールするバージョンを選択し、インストールする(今回はfullを選択)
　あとはラズパイ本体がインストールするのを待つ。
　完成
デスクトップ画面は執筆時点(2019年1月)で道路の画面が表示されたら成功です。
あとは左上のマークからインターネットを選択すればラズパイでインターネットができます。

あとがき
今回はラズパイの初回起動までを書いてみました。
最初のころはディスプレイが必要とは知らず、パソコンで表示しようとしたり、フォーマットができていなくてOSの書き込みに失敗したりしていました。
はじめてラズパイを触る方の助けになれば幸いです。

わかりにくい点や間違っている箇所についてはお手数ですがご一報いただけると幸いです。
atcoder ABC116

c問題は簡単であり、D問題はかなり難しく、しっかり考察していかないとできない問題だった。
https://atcoder.jp/contests/abc116
#C問題
#方針
各h<sub>i</sub>を全部0にするための最小回数を求める問題である。水を与える(各h<sub>i</sub>を-1する)範囲は連続していれば自由に決められるので、明らかに一度に多くの範囲を指定した方が良い。またh<sub>i</sub> = 0に関してはこれ以上-1することができないので、左端をlとし右端をrをするとlをはじめに0に設定し、h<sub>i</sub>=0が出たらi-1をrとしていき、その範囲を-1する。次に、lの現在地をまた0から見ていき、h<sub>i</sub>!=0の場所をlとする。lが決まったら、そこから右に見ていき、h<sub>i</sub>=0の場所が見つかったら、i-1をrとし、その範囲を-1にする。以上を繰り返すことで最小の回数で全てを0にできる。問題条件より、明らかに間に合う。


#D問題
まず問題文から、種類ボーナスポイントが鍵になるのはわかるので種類数ごとの最大値を求め、最後に各最大値の中の最大値を求めれば答えが求まる。よって、はじめに各種類数ごとの最大値を求めることを考える。一番少ない種類数で最大値を求めようとすれば、明らかに、美味しさ順に並べ、上からK個とった時が最大値となり、種類数は最小となる。ここから、種類数を1つ増やそうとした場合、次の操作が必要となる。
(1)とった寿司の中から、種類数が変わらないような最小の美味しさを持つ寿司を取り除く
(2)まだとってない種類の寿司から最大の美味しさを持つ寿司を取る

(1)の操作は基本的に、最初の段階で、取り替えてもいい寿司(各種類の寿司で美味しさ最大でない寿司)について、操作をするものである。よって、それらの寿司をpriority queueに入れていくことで、log時間で取り替えてもいい最小の寿司を見つけることができる。

(2)の操作は、問題文の条件より、logで行わなければならないので、ソートした順に上から、(2)の条件に合うものを探すのは間に合わなくなる(なぜならこれはNかかるから)。ここで、あらかじめ、各種寿司についての美味しさ最大値を持つ寿司と、それ以外の寿司で区別できるようにしておく(1,0の値を持つようにする)。そうすることで、1の値を持つ寿司、0の値を持つ寿司をそれぞれlistに入れていき、寿司をとったら、listから決していくことで、定数時間で(2)の操作をすることができる。

これらの操作を行い最大を求め配列などに記録したのち、最後に全ての種類数で最大値を更新していくことで答えが得られる。
アウトラインの番号がなぜか連続しない

#excelで作ったリストをもとに、wordのアウトラインにしたい
試験一覧を作った後、詳細書くのはwordにしたかった

#とにかくparagraphを追加していったがうまくいかない
見出しとか、段落番号付けるところまではうまくいくんだけど
段落の内容を書くと、その次の段落から、段落番号がリセットされる

#結局
追加したい本文を、一旦"見出し 3"にして作って、
全項目を書き込んだ後に
"見出し 3"を"標準"に戻すことで解決(？)した

```vb
wordDoc.Paragraphs.Add
With wordDoc.Paragraphs.Last
    .Range.Text = "   "
    .Style = wdStyleHeading3
    .Range.ListFormat.ListIndent
    .Range.ListFormat.ListIndent
    .Range.ListFormat.ListIndent
　　.Range.ListFormat.ApplyOutlineNumberDefault
End With
```
こんな感じで追加して                

```vb
For pgs = 1 To wordDoc.Paragraphs.Count

    Dim p As Paragraph
    
    Set p = wordDoc.Paragraphs(pgs)

    If p.Style = "見出し 3" Then
        p.Style = wdStyleBodyText
    End If
Next pgs
```
全項目追加して、ファイルを閉じる直前で変更した
【初心者向け】MarkdownをHTML(またはPDF)に変換して他人に共有する方法

#参考URL(元ネタ)
[MarkdownをHTMLにして他人に渡すベストシナリオを求めて](https://qiita.com/yugo-yamamoto/items/f8d882bf44d297a9aa81)

↑大変助かりました。

# やりたいこと
markdownで作ったデータをHTMLまたはPDFに変換して他者に共有

# 必要なもの
* Qiitaのアカウント
* GoogleChrome　
  (※InternetExplorer11だと下記の手順2で「ﾍﾟｰｼﾞが表示できません」と出ました)

# ざっくりした手順
1. Markdownで書いた文章をQiitaでプレビュー表示して、その内容をコピー
2. 新しいタブを開き、ブラウザのアドレスバーに[data:text/html,<html contenteditable>]を入れる（→真っ白な画面が表示）
3. 上記のタブに1でコピーした文章を貼り付ける（→ブラウザにHTML形式で表示される）
4.「Ctrl」+「s」で保存。HTML形式で保存。

# おまけ
## markdown文書をPDFにしたいという人は
上記の手順4を「ctrl」+「p」に変更、データの送信先を「PDFに保存」にして保存すれば、markdownをPDFに変換することが出来ます。
 
# おわり
以上です。ご参考までに。
（僕も勉強になりました）
【初心者向け】LP（ﾗﾝﾃﾞｨﾝｸﾞﾍﾟｰｼﾞ）について1から


# LPって何？
ホームページ運営をしているとよく聞く単語ですが、自分でちゃんと調べたことはありません「LP」のことを1から調べました。

#参考URL
[ランディングページとは | 10分で理解できるLPの基本](https://liskul.com/lp-toha-1530)
[ランディングページ(LP)とは何か？-メリットをわかりやすく解説！](https://ds-b.jp/ds/publics/index/123/)

# LPとは？
***広告を経由して、訪問者が最初にアクセスするページのこと***
>* ランディングページ（Landing Page）とは、検索結果や広告などを経由して訪問者が最初にアクセスするページのことです。訪問者がホームページに着地する（Land）イメージからこの名前がつきました。略してLPとも呼ばれます。

>* ランディングページとは、Webサイトの訪問者が、外部からそのサイトにやってくる際、最初に開くことになるページ。特に、他サイトに広告を出稿する際、リンク先として指定する自サイト内のページのこと

>* 広告や検索によって<span style="color:blue">訪問者</span>がサイトに訪れても、ランディングページの内容が適切でなければそのまま別のサイトに移動してしまう可能性が高い。－－あるいは収益につながる何らかのアクションを起こさせる工夫を行うことをランディングページ最適化という。

[ランディングページ(LP)とはーIT用語辞典](http://e-words.jp/w/%E3%83%A9%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%9A%E3%83%BC%E3%82%B8.html)

# LPの使い方
***広告のリンク先にLPを指定する***
>ランディングページとは、リスティング広告を含む様々な広告やリンクからの飛び先となるページです。自然検索からは公式サイトへ飛ばし、広告先からの飛び先はランディングページとなっている場合が多いです。

# なぜホームページではなくランディングページに誘導するのか？
***特定のユーザーが持つニーズに答える***
>* インターネット上・実店舗を問わず、売上を上げるためには特定のニーズをもつユーザーに最適化した接客を行うことが重要となります。ここで言う「接客」をネット上で補うのがサイトやランディングページです。

>* サイトのページ数を増やすのではなく、ランディングページを作る理由は大別すると3つあり、特定のユーザーに最適化しやすい・ページの繊維の必要がない・費用が安いということです。

## ランディングページを作る理由
## 狭く、深く
>1. 広告の内容などから流入してくるユーザーを制限できるので、それら特定のユーザーに最適化しやすい（サイトへはいろいろなユーザーが流入してきてしまうため、浅く広くの作りになってしまいがちです）
>2.  特定のユーザが求めている情報を1ページに集約でき、リンク先も少ないため、ページ繊維の際の離脱が少ない。
>3. 特定のユーザーに対してサイトを最適化するよりも、ランディングページを製作するほうが安い（参考：サイト改善 10のポイント

## ランディングページは目的によって形が変わる
>特定のユーザが持つニーズに答える（最適化した）ページを作るためには、ランディングページの形を「商品・サービスの特性」や「目的」に応じて変えてあげる必要があります。

|目的|ランディングページの特徴|
|---|---|
|普通の商品を売りたい|楽天LP:長い・手に取れないから写真や・情報多め|
|BtoB商品を売りたい|機能一覧や比較表などが求められる|
|エステや結婚式などのサービスを売りたい|写真のイメージが重要となるので、写真が多い|
|無料会員を増やしたい|無料でアクセスへのハードルが低いので、情報量が少なく短いことが多い|
|有料サービスの会員数を増やしたい|サービスに納得して登録してもらうために、説明が多く長いことが多い|
|資料請求を増やしたい|説明が長くなりすぎるようであれば、簡潔な説明で興味を喚起し。資料請求してもらう|

# ランディングページの費用感
>ランディングページ制作の費用は依頼する制作会社によって10～60万円とピンキリです。この費用感の違いは、分析サービス有無やデザインの品質から生まれます。
※クラウドソーシング案件で5万円程度（2019/01現在）

# ランディングページをかんたんに作れる無料ツール
有名どころ？
[ペライチ](https://peraichi.com/?agcode=LISKUL&uid=-)

# まとめ
>ランディングページとは「リンクや広告の飛び先ページ」で、一般的には広告からのリンク先となる1枚の長いWEBページのことをさす言葉です。
>ランディングページはネット上での売上を向上させるために最も重要な要素であり、サイトを改修するよりも安価に作成することができます。
>商品やサービスの特徴・目的に合わせて作成することで、その効果は飛躍的に向上しますので、ランディングページの作成や改善をご検討の際には、ぜひ本記事のポイントを参考にしてみてください。
【備忘録】.aspxのページにはformタグを一つしか置けないワケ

こんにちはtsuttieです(*'▽')
aspxのページにformタグを一つ以上置けないわけを考えましたので備忘録として残します。

#1. 注意

あくまで「そうじゃないかな・・・」という予想なので、間違えているかもしれません。
もっと多くの理由があるかもしれません。もし、ご指摘がありましたらコメントいただけると幸いです。

#2. 2つ以上のタグを置くと・・・

2つ以上のformタグを設定すると、IDは違っても以下のエラーが出力されます。

```
<head runat="server">
    <title>あああ</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <p><input type="file" name="test" id="test" runat="server" /></p>
            <p><asp:Button ID="Button" runat="server" Text="send" OnClick="Button_Click"/></p>
        </div>
    </form>
    <form id="form2" runat="server">
        <div>
            <p><input type="file" name="test" id="test2" runat="server" /></p>
            <p><asp:Button ID="Button2" runat="server" Text="send" OnClick="Button2_Click"/></p>
        </div>
    </form>
</body>
```

---
**1 つのページには、1 つのサーバー側 Form タグのみを指定できます。**

---

OH…まぁ一応知っていたのですが。。。
何故なのだろう。とここで疑問。
とりあえずformを一つ消してリクエストボディを確認してみました。

#3 リクエストボディの中身

[GBを超えるファイルをアップロード可能にする](http://article.higlabo.com/ja/upload_GB_size_file.html)

上記を参考にリクエストボディを取り出し、中を確認したところ・・・
中身はmultipart/form-dataになっており、

```
-----------------------------7e3373050c34
Content-Disposition: form-data; name="__VIEWSTATE"

hogehoge
-----------------------------7e3373050c34
Content-Disposition: form-data; name="__VIEWSTATEGENERATOR"

fugafuga
-----------------------------7e3373050c34
Content-Disposition: form-data; name="__EVENTVALIDATION"

uhouho
-----------------------------7e3373050c34
Content-Disposition: form-data; name="fileup"; filename="test.txt"
Content-Type: text/plain

あああああああああ
-----------------------------7e3373050c34
Content-Disposition: form-data; name="Button"

send
-----------------------------7e3373050c34--
```

``name="__VIEWSTATEGENERATOR"``とか``name="__EVENTVALIDATION"``
とかが入っていました。(もちろんアップしたファイルデータも)

開発者ツールからDOMを確認すると
``<div class="aspNetHidden"><input name="__VIEWSTATE" id="__VIEWSTATE" type="hidden" value="なかみ"></div>``
見慣れないhiddenフィールドが・・・

あ～。ビューステートですか。

ページの状態保持やらセキュリティ保護のためにページ生成のタイミングでhidden値を作成。
それを使って内容を保持っている感じでしょうか。
そのためformタグを2つ以上使われると
サーバーに送りたい内容が送れなくなる危険性があるから
formタグは1つ縛りなのか・・・

ついでにpostのリクエストボディはmultipart/form-dataっぽい。

#4 まとめ

あっているかはわかりませんが、
色々中身を見るいい機会になりました。

何かご指摘等ありましたら、コメントいただければ幸いです。
よろしくお願いします。('◇')ゞ
MoyaProviderを呼び出す時は一度変数に格納しなければならない

# Moyaとは

Alamofireのラッパーで、swiftでAPI通信を簡単にできるようになるライブラリ

### 参考

- [Swift4 + Moya + RxSwift + Codableで作るAPIクライアント](https://qiita.com/kouheiszk/items/46e9a233d9bb227c3b1d)
- [Moya+RxSwift+CodableでAPI通信](https://qiita.com/negi0205/items/73341f21511affb064ad)

# MoyaのProviderは変数に格納しないとエラーを吐く

以下のようなコードを書くとレスポンスが返ってこない。

```swift
MoyaProvider<SampleEnum>()
    .rx
    .request(.sample)
    .debug()
    .subscribe {
        print($0)
    }
```

コンソール

```console
2019-01-21 18:07:04.880: Sample.swift:99 (spec()) -> subscribed
```

# 解決方法

```swift
let provider = MoyaProvider<SampleEnum>()
provider
    .rx
    .request(.sample)
    .debug()
    .subscribe {
        print($0)
    }
```

## よく見ると公式に書いてある

[Provider.md](https://github.com/Moya/Moya/blob/master/docs/Providers.md)に以下のように書いてある。

> Always remember to retain your providers, as they will get deallocated if you fail to do so. Deallocation will return a -999 "canceled" error on response.

-999が返ってくると書いてあるようだが、rxを挟んだ場合はレスポンスが返ってこなくなってしまうようだ。

# なぜこんなことが起きる？

普段Javaなどを書いていると、この二つの書き方に違いがあるとは思えない。少し調べると、以下の説が(私の中では)有力。

swiftはガベージコレクション(GC)ではなく、ARC(Automatic Reference Counting)という仕組みでメモリを管理しているらしい。
インスタンスを作って、即リクエストを飛ばすとリクエストを飛ばしている間、参照カウンタが0になり(リクエストの返りはcallback or rxなため)破棄される。
プロパティとして持っておけば、classのインスタンスが誰かに参照されている限りProviderは破棄されない。

GC脳でコーディングしていてハマったのでメモ
Vue.jsでSPAをした時にlocalhostからレスポンスがない

# はじめに
Vue.jsでSPA(Single Page Application)を作る際にlocalhostからデータがこないエラーに遭遇しました。

# 開発環境
```
macOS High Sierra v10.13.6
npm v6.5.0
```
## 導入
https://qiita.com/567000/items/d6a7c694a370dc92e774
https://qiita.com/nagimaruxxx/items/8fc59a5ca05bb91bfe1f
ここらへんを参考にしました。
# エラー内容
npm導入完了後に

```
$ npm install -g vue-cli
$ vue init webpack my-project
$ cd my-project
$ npm run dev
```

いざ、localhost!ってことで
http://localhost:8080/
で、繋がりません。
![スクリーンショット 2019-01-21 17.25.40.png](https://qiita-image-store.s3.amazonaws.com/0/233730/066edb3b-a01f-b7f9-f15f-78e64b44773f.png)

# 解決策
`my-project/config/index.js`のポート番号を書き換えて解決しました。
ポート番号の記述は私の環境では**17行目**にありました。
デフォルトで`8080`のところを`8081`に変更しました。
(使ってなければ他の番号でもいいと思います。)

```:my-project/config/index.js
:
 host: 'localhost',
 port: 8081,
:
```


解決策は以下で見つけました。
https://github.com/vuejs/vue-cli/issues/36

# 終わりに
初歩の初歩で詰まっていて泣きそうになっていましたがこの画面をみてホッとしました。
![スクリーンショット 2019-01-21 18.13.55.png](https://qiita-image-store.s3.amazonaws.com/0/233730/f1f6515f-7c86-8774-1ba0-7989b507e701.png)

お役に立てれば幸いです。
【Windows 10 ver.1809】マスターイメージの作成② ～WindowsUpdate編～

# 概要
Windows 10のマスターイメージ作成手順を記載 Part2

主に大学や公共機関系向けの案件に従事している方向け

OSは90日間無料の評価版(Enterpriseを使用)

[ダウンロードURL]
https://www.microsoft.com/ja-jp/evalcenter/evaluate-windows-10-enterprise

以下の手順を実施している想定
[【Windows 10 ver.1809】マスターイメージの作成① ～OSインストール編～](https://qiita.com/tadano-memo/items/1d31786fc6551f7621e0)

# 構成
| 名称             |       OS             |    サービス           | IPアドレス         |
|:-----------------|---------------------:|:-------------------:|:------------------:|
| 認証サーバー      | Windows Server 2019  |  Active Directory    | 192.168.0.10      |
| イメージ管理      | Windows Server 2019  |  Symantec Ghost      | 192.168.0.20      |
| マスターPC        | Windows 10 ver.1809  |  各種アプリケーション  | 192.168.0.50     |
| キッティングPC1   | Windows 10 ver.1809  |  各種アプリケーション  | 192.168.0.101      |
| キッティングPC2   | Windows 10 ver.1809  |  各種アプリケーション  | 192.168.0.102      |

# 一部タスクスケジューラの無効化

Windows10で、希にスタートメニューのストアアプリのタイトルが英語表記になってしまうことがある。
(例) 電卓 → Calculator

それを防ぐ予防として、タスクマネージャーの一部を無効化する。
(OSインストール後、15分以内に無効化することが望ましい)

**1.** スタートメニューを右クリックし、「コンピュータの管理」をクリック
![WS000001.png](https://qiita-image-store.s3.amazonaws.com/0/282571/ff614a00-cb59-c572-f286-592aa206510d.png)
**2.** 左のメニューから[タスクスケジューラ]をクリックし、以下のパスまで展開する
タスクスケジューラライブラリ > Microsoft > Windows > AppxDeploymentClient
![WS000003.png](https://qiita-image-store.s3.amazonaws.com/0/282571/656ca295-0598-1056-ce7f-69b3179b728e.png)
**3.** [Pre-staged app cleanup]を右クリック -> [無効]をクリック
![WS000004.png](https://qiita-image-store.s3.amazonaws.com/0/282571/e2d33a78-54e3-b5a4-eda0-e1b774e6bc25.png)
**4.** 状態が[無効]になっていることを確認
![WS000005.png](https://qiita-image-store.s3.amazonaws.com/0/282571/ede865c9-9d4f-83b6-4a51-10fa252975f7.png)
**5.** コンピューターの管理を閉じる


# Windows Update
**1.** スタートメニューをクリックし、左下の歯車をクリックして「Windowsの設定」画面を開く
![WS000006.png](https://qiita-image-store.s3.amazonaws.com/0/282571/1297fc9d-165b-c7e3-9675-3d5136e796fb.png)
**2.** [更新とセキュリティ]をクリック
![WS000007.png](https://qiita-image-store.s3.amazonaws.com/0/282571/ac084316-ce79-21d8-c30d-7ef43d3931c9.png)
**3.** [詳細オプション]をクリック
![WS000008.png](https://qiita-image-store.s3.amazonaws.com/0/282571/a7089cf1-e8a6-c679-fd57-3126dbed4319.png)
**4.** [Windowsの更新時に他のMicrosoft製品の更新プログラムも入手します]をオンにし、左上の矢印をクリックして、前の画面に戻る
![WS000009.png](https://qiita-image-store.s3.amazonaws.com/0/282571/d73acb8e-0b09-a97d-e354-a7009c556675.png)
**5.** [更新プログラムのチェック]をクリック
![WS000010.png](https://qiita-image-store.s3.amazonaws.com/0/282571/129fcaa9-ffe5-f6ae-9d6e-1d67a247d5ef.png)
**6.** Windows Updateが完了するまでしばらく待つ
![WS000011.png](https://qiita-image-store.s3.amazonaws.com/0/282571/e232c904-b2b6-64ad-8551-497b80637530.png)
**7.** [今すぐ再起動する]をクリックし、OSを再起動する
![WS000012.PNG](https://qiita-image-store.s3.amazonaws.com/0/282571/b68970be-be0d-a7ec-f439-baf3e48c0b41.png)
**8.** 再起動が完了するまでしばらく待つ
![WS000013.PNG](https://qiita-image-store.s3.amazonaws.com/0/282571/565d86f1-4bdd-f5e7-08e3-4b095a113eae.png)
**9.** 完了
![WS000014.PNG](https://qiita-image-store.s3.amazonaws.com/0/282571/9f3a954f-593d-0419-ff4f-31286e175b41.png)
pecoで一覧からdocker exec する

docker execコマンドを覚えられないorz.

.zshrcに追加

```zsh

	# docker exec from docker ps
	function de () {
		local res
		res=$(docker ps --format '{{.Names}}' | peco)
		if [ -n "$res" ]; then
			_cool-peco-insert-command-line "docker exec -it $res /bin/bash"
		fi
	}
```

de で起動中のコンテナ一覧が表示され、選択すると接続してくれる
これでkitematicを開かずに済む
Tips: Elixirは関数の引数にmoduleを渡すことができる

Elixirの関数の引数にはmoduleを渡すことができる。

```exs
defmodule Test do
  def exec(m) do
    m.puts("hello")
  end
end

Test.exec(IO) #=> hello
```

実演
<script id="asciicast-UgI8tjSq5NOEctoSw7SkK7xD9" src="https://asciinema.org/a/UgI8tjSq5NOEctoSw7SkK7xD9.js" async></script>

調べても、関数の引数におけるmoduleの扱いについてはあまり言及されていなかったのでメモ。
CentOS7のFirewall設定でよく使うコマンドのまとめ


## 確認

* 現在設定を確認する

```bash
firewall-cmd --list-all
```

* zoneを確認する

```bash
firewall-cmd --get-active-zones
firewall-cmd --get-default-zone
```

## 操作

* 設定追加

```bash
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-port 8080/tcp
```

* 設定除外

```bash
firewall-cmd --permanent --zone=public --remove-service=http
firewall-cmd --permanent --zone=public --remove-port 8080/tcp
```
ubuntuにmyqlがインストール出来なかった時の解決法　

備忘録
インストールしたい
前のMySQLの残骸を削除して再インストールしたい

```
＄sudo apt-get install mysql-server-5.7
```

エラー　おそらくその前に色々依存関係のあるものをインストールしたのが原因
mariadb関連



```
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libdbd-mysql-perl libdbi-perl libreadline5 mariadb-common
Use 'sudo apt autoremove' to remove them.
Suggested packages:
  mailx tinyca
The following NEW packages will be installed:
  mysql-server-5.7
0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded.
3 not fully installed or removed.
Need to get 2,726 kB of archives.
After this operation, 48.3 MB of additional disk space will be used.
Get:1 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main amd64 mysql-server-5.7 amd64 5.7.24-0ubuntu0.16.04.1 [2,726 kB]
Fetched 2,726 kB in 0s (3,599 kB/s)
Preconfiguring packages ...
(Reading database ... 70381 files and directories currently installed.)
Preparing to unpack .../mysql-server-5.7_5.7.24-0ubuntu0.16.04.1_amd64.deb ...
Aborting downgrade from (at least) 10.0 to 5.7.
If are sure you want to downgrade to 5.7, remove the file
/var/lib/mysql/debian-*.flag and try installing again.
dpkg: error processing archive /var/cache/apt/archives/mysql-server-5.7_5.7.24-0ubuntu0.16.04.1_amd64.deb (--unpack):
 subprocess new pre-installation script returned error exit status 1
Errors were encountered while processing:
 /var/cache/apt/archives/mysql-server-5.7_5.7.24-0ubuntu0.16.04.1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```


綺麗にしていく

```
$sudo apt-get remove --purge mysql-server mysql-client mysql-common && sudo apt-get autoremove && sudo apt-get autoclean && sudo deluser mysql && sudo rm -rf /var/lib/mysql && sudo apt-get purge mysql-server-core-5.7 && sudo apt-get purge mysql-client-core-5.7 && sudo rm -rf /var/log/mysql && sudo rm -rf /etc/mysql
```

ディストリビューションをアップグレード

```
$sudo apt-get dist-upgrade
```

再びインストール

```
＄sudo apt-get install mysql-server-5.7
```

パスワードを設定する画面が現れる　成功！！

参考サイト
https://www.digitalocean.com/community/questions/mysql-installation-error-dpkg-error-processing-package-mysql-server-5-5-configure
Javaでリフレクションによるシステム環境変数の差し替え

jUnitなどでテストコードを記述する際に、
```System.getenv```で取得するシステム環境変数の値を一時的に差し替えたい時があると思います。

ライブラリを使わない実装とPowerMockによる実装の２つを記載します。

# Dependency
Java 8 
*Java 7でも動くと思います。

# ライブラリを使わない実装
システム環境変数の```TMEP```を差し替えています。

```java
import org.junit.Test;

import java.lang.reflect.Modifier;
import java.lang.reflect.Field;
import java.util.Map;

import static org.junit.Assert.assertEquals;

public class EnvironmentTest {
  @Test
  public void replaceEnvironment() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
	//Final Classのメソッドを取得しアクセス可能に
	Class<?> clazz = Class.forName("java.lang.ProcessEnvironment");
    Field theCaseInsensitiveEnvironment = clazz.getDeclaredField("theCaseInsensitiveEnvironment");
	theCaseInsensitiveEnvironment.setAccessible(true);

	//システム環境変数で必要なものだけを差し替える
	Map<String,String> sytemEnviroment = (Map<String, String>) theCaseInsensitiveEnvironment.get(null);
    sytemEnviroment.put("TEMP","/MY_TEMP_DIR");

	assertEquals(System.getenv("TEMP"),"/MY_TEMP_DIR");
  }
}

```


## PowerMock

PowerMockだと比較的容易に実装できます。
ただし、Classにアノテーションが必要になります。

```java
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.assertEquals;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ System.class })
public class EnvironmentWithPowerMockTest {
  @Test
  public void replaceEnvironment(){
	PowerMockito.mockStatic(System.class);
	PowerMockito.when(System.getenv("TEMP")).thenReturn("/MY_TEMP_DIR");

	assertEquals(System.getenv("TEMP"),"/MY_TEMP_DIR");
  }
}
```

## 備考

サンプルのソースコードは下記です。
https://github.com/amanoese/java-reflection-sample

System Rulesのソースコードでも似たような処理だったので基本的にはこれで問題ないかと
https://github.com/stefanbirkner/system-rules/blob/master/src/main/java/org/junit/contrib/java/lang/system/EnvironmentVariables.java#L165-L190

## 参考
https://qiita.com/5at00001040/items/83bd7ea85d0f545ae7c3
https://blogs.yahoo.co.jp/dk521123/37484564.html
https://stackoverflow.com/questions/318239/how-do-i-set-environment-variables-from-java
.ssh/config を分割管理している場合のcool-peco-ssh

.ssh/conf.d/*をincludeする形で管理している
そのため、cool-pecoを入れたがcool-peco-sshが空振りしてしまうorz

構成

```bash
.
└── .ssh
   ├── config
   └── conf.d
      ├── .gitkeep
      ├── myProject.config
      └── sourceTree.conf
```

.ssh/config

```bash
Host *
  UseKeychain yes

Include conf.d/*conf*
```

.zshrcにfunctionを追加する

```bash
	# select ssh hosts from ~/.ssh/conf.d
	function getSshHosts () {
		echo $(cat ~/.ssh/conf.d/*.config | grep "Host " | grep -v '*' | cut -b 6- | peco)
	}

	function pssh () {
		local res

		res=$(getSshHosts)
		if [ -n "$res" ]; then
			_cool-peco-insert-command-line "ssh $res"
		fi
	}
```

key bindに追加

```bash
zle -N pssh
bindkey '^o' pssh
```

cool-peco-sshのデフォルトキーバインドは^sだが、なぜか効かないので^oに変更した
conf.dに .conf と .configの2種類があるのは、ssh接続するものだけを表示するため
dockerが起動しない（OCI runtime create failed: container_linux.go:344）

下記のようなエラーが出た。

```
ERROR: for swagger-api  Cannot start service swagger-api: OCI runtime create failed: container_linux.go:344: starting container process caused "process_linux.go:424: container init caused \"rootfs_linux.go:58: mounting \\\"xxx\\\" to rootfs \\\"/var/lib/docker/overlay2/6ef408c4141797a8f67548dd18c9abf605b44b3caa23b55821543a9b66e96b9c/merged\\\" at \\\"/var/lib/docker/overlay2/6ef408c4141797a8f67548dd18c9abf605b44b3caa23b55821543a9b66e96b9c/merged/xxx\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
ERROR: Encountered errors while bringing up the project.
```

docker for macを再起動しても駄目だった。

```
docker-compose down
docker container prune
```

このコマンドで原因は不明だが治った。
docker-compose downでは謎に止まっていないコンテナがたくさん表示された
mongoDB インストールから基本操作

### 環境
ubuntu16.04

## インストール
```
// パブリックキーの登録
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

// 利用可能なパッケージ一覧にMongoDBを登録
$ echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

// パッケージの更新
$ sudo apt-get update

// インストール
$ sudo apt-get install mongodb-org
```



## MongoDBの開始と停止

### 開始
```
$ sudo service mongod start
```

### 停止
```
$ sudo service mongod stop
```

### 再起動
```
$ sudo service mongod restart
```

## 操作

### アクセス
```
$ mongo
```

### DB一覧
```
$ show dbs
```

### 使用するDBの切り替え
```
$ use [DBの名前]
```

### DBの状況確認
```
$ db.stats()
```

### DBの削除
```
$ db.dropDatabase()
```

### collectionの作成
```
$ db.createCollection("collection名")
```
### collectionの一覧
```
$ show conllections
```

### collectionの名前変更
```
$ db.変更するcollection名.renameCollection("新しいcollection名")
```

### collectionの削除
```
$ db.削除するcollection名.drop()
```

### documentの挿入
```
$ db.collection名.insert({オブジェエクト})

// 例
$ db.collection名.insert({ name: "hoge", score: 1})
```

### documentの数
```
$ db.collection名.count()
```

### documentの全件抽出
```
$ db.collection名.find()
```

### documentの全件削除
```
$ db.collection名.remove({})

// もしくはコレクションごと削除する
$ db.collection名.drop()
```

### documentの条件付き抽出
公式ドキュメントにいろんな演算子が記載されています。
https://docs.mongodb.com/manual/reference/operator/query/
ちなみに、fieldとは、objectで言う所のkey

ぶん投げ感が強いので、いくつか例を示します。
仮にinventoryというcollectionに、以下のようなdocumentがあったとします。

```
{ _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }
{ _id: 2, item: { name: "cd", code: "123" }, qty: 20, tags: [ "B" ] }
{ _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }
{ _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] }
{ _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }
```
ここからfield`qty`を基準に抽出すると..

```
// qtyが20に等しいものの抽出
$ db.inventory.find( { qty: { $eq: 20 } } )

// qtyが20以上のものの抽出 
$ db.inventory.find( { qty: { $gte: 20 } } )
```

正規表現もを使った抽出もできます。
https://docs.mongodb.com/manual/reference/operator/query/regex/#op._S_regex

複数の条件文ももちろん
https://docs.mongodb.com/manual/reference/operator/query/and/#op._S_and
(条件抽出に関しては、内容が多いので次の機会に.)



## 参考
- [公式](https://www.mongodb.com/)
- [Ubuntu MongoDBのインストールする手順](https://www.trifields.jp/how-to-install-mongodb-on-ubuntu-2751)
concrete5 パッケージのアップデート方法


concrete5 のマーケットプレイス等でダウンロードしたアドオンを新しいバージョンにアップデートする方法を紹介します。

最新版はこちら
https://concrete5.co.jp/blog/how-to-update-concrete5-add-on


## マーケットプレイスに接続したサイトでアップデート

本来はこちらの方法でアップデートします。

1. concrete5 にアドオンをインストールできる権限のユーザーでログイン
1. 管理画面 - concrete5を拡張 (/index.php/dashboard/extend/install) ページに訪問
1. ページの上部にでている情報ボックスの「アドオンのアップデート」ボタンをクリック
1. アップデートを行う各アドオンの「ダウンロード・インストール」ボタンをクリック
1. 希望するアドオンのアップデートが終われば完了。

## 手動でアップデート

なんらかの理由で管理画面からのアップデートができない場合、手動でアップデートを行います。

### STEP 1. ファイルを手動でアップロード

1. 予め concrete5 の管理画面に管理者アカウントでログインしておく (*後述)
1. アップデート版のパッケージZIPファイルをマーケットプレイスなどからダウンロードします。
1. ZIP ファイルを解凍し、/packages/`アドオンのハンドル`/ を上書き保存します。

※ この段階でサイトの一部or全部がアクセス不能になる可能性があるので注意。
※ STEP2-2 でアップデートを行う場合は `アドオンのハンドル` を書き留める。



### STEP 2-1. 管理画面からアップデート

管理画面からアドオンのアップデートを置こうなう方法。

1. 管理画面 - concrete5を拡張 (/index.php/dashboard/extend/install) ページに訪問
1. ページの上部にでている情報ボックスの「アドオンのアップデート」ボタンをクリック
1. アップデートを行う各アドオンの「アドンをアップデート」ボタンをクリック
1. 希望するアドオンのアップデートが終われば完了。

### STEP 2-2. コマンドラインツールからアップデート

SSH を通じて、concrete5 のコマンドラインツールを実行しアドオンをアップデートする方法です。

1. STEP 1 で
1. SSH などでサーバーに接続
2. concrete5 が保存してあるディレクトリまで移動 or concrete5 のフルパスを取得。
3. concrete5 が可動しているサーバーと同じユーザーとして下記のコマンドを実行。

```
$ concrete/bin/concrete5 c5:package-update [アドオンのハンドル]
```

コマンドが正しければアップデートされます。
すでに最新版であればアップデートされません。
アップデートを強制実行するのであれば `--force-` オプションを使います。

```
$ concrete/bin/concrete5 c5:package-update [アドオンのハンドル] --force
```

## 豆知識: 

### 管理画面からアップデートしたときの挙動

管理画面で全てのアドオンのアップデート作業をすると下記のような動作になります。

- /application/files/tmp フォルダ内に concrete5.org からダウンロードした ZIP  ファイルが、取得時の UNIXTIME を使って保存されます。
- /application/files/tmp 内に UNIXTIME と同じ名前でフォルダを生成し、ZIP ファイルの中身を展開します。
- /application/files/tmp から /packages/ フォルダにファイルが上書きされます。

続きはこちら
https://concrete5.co.jp/blog/how-to-update-concrete5-add-on 


以上
freenas11.2のsmbについて調べてみた

# はじめに
SMBなんて久しぶりすぎてちょっと不明なところが多かったので調べてみることにした。
ちなみに、FreeNAS11.2でインストールされているsmb4.confをもとに行っていきます。
ほぼ健忘録目的なのでこれから追記していきます。


#ソースのconfig

```config:smb4.conf
[global]
    server min protocol = SMB2_02
    server max protocol = SMB3
    interfaces = 127.0.0.1 1.2.3.4
    bind interfaces only = yes
    encrypt passwords = yes
    dns proxy = no
    strict locking = no
    oplocks = yes
    deadtime = 15
    max log size = 51200
    max open files = 2829962
    logging = file
    load printers = no
    printing = bsd
    printcap name = /dev/null
    disable spoolss = yes
    getwd cache = yes
    guest account = nobody
    map to guest = Bad User
    obey pam restrictions = yes
    ntlm auth = no
    directory name cache size = 0
    kernel change notify = no
    panic action = /usr/local/libexec/samba/samba-backtrace
    nsupdate command = /usr/local/bin/samba-nsupdate -g
    server string = FreeNAS Server
    ea support = yes
    store dos attributes = yes
    lm announce = yes
    hostname lookups = yes
    unix extensions = no
    null passwords = yes
    acl allow execute always = true
    dos filemode = yes
    multicast dns register = yes
    domain logons = no
    local master = yes
    idmap config *: backend = tdb
    idmap config *: range = 90000001-100000000
    server role = standalone
    netbios name = hogehoge
    workgroup = WORKGROUP
    security = user
    create mask = 0777
    directory mask = 0777
    client ntlmv2 auth = yes
    dos charset = CP932
    unix charset = UTF-8
    log level = 1

[AllShare]
    path = "/mnt/Volume01/hogeShare"
    printable = no
    veto files = /.snapshot/.windows/.mac/.zfs/
    writeable = yes
    browseable = yes
    access based share enum = no
    vfs objects = zfs_space zfsacl streams_xattr
    hide dot files = no
    guest ok = yes
    nfs4:mode = special
    nfs4:acedup = merge
    nfs4:chown = true
    zfsacl:acesort = dontcare
```

##config 項目について
### server min/max protocol
ここ結構大事で、smbのプロトコル（サーバとクライアントがお話しする言葉）をどこまで使うかが記載される。
[windowsの記事を見る](https://support.microsoft.com/ja-jp/help/4034314/smbv1-is-not-installed-by-default-in-windows)とsmb1はなんとwindows10のデフォルトで落ちているとのこと。現在対応しているのが、SMBv2の2.02、2.1、3.0、3.02、3.11とのこと。
セキュリティ面からもwindows7とかが居ないなら、正直v2からでよいかと思います。
ここから、[freeBSDのドキュメント](https://www.freebsd.org/cgi/man.cgi?query=smb4.conf)から
`server min protocol = SMB2_02`
`server max protocol = SMB3_11`
と設定してあげるのがよいかと思います。（ただし、当たり前だがGUIの設定画面から設定を更新すると上書きされて消される）
### printable
例えば文書とか、read権限つけてしまうと、読み込みだけなので印刷ができない！なんてことが起きます。
`printable = yes` とすると、印刷が可能になるという優れものです。
これでspoolからの呼びかけに応じて印刷も可能になります。。
### bind interfaces only
SMBがどのIPアドレスで応じるかを設定しているものです。
interfaces で設定します。
SMBのポートは137/138のいずれかになります。
### strict locking
誰かファイルを使ってる時に、ほかの人が使えなくさせるための機能。
noだと明示的にクライアントから聞かれて初めて答える。
yesだと常にサーバ側が監視している状態になります。
autoだとoplock(使ってる時にローカルでキャッシュして使う仕組み)


このあとは随時加えてきます
自プロセスが64bitプロセスか否かを判定する

実行中の自プロセスが32/64bitいずれかで動作中かは、[`android.os.Process#is64Bit`メソッド](https://developer.android.com/reference/android/os/Process#is64Bit())で判定可能。API Level 23(Android 6.0, Marshmallow)以降。

```Java
  @TargetApi(23)
  private static boolean is64BitProcess() {
    return (Build.VERSION.SDK_INT >= 23) && android.os.Process.is64Bit();
  }
```


64bitアーキテクチャはAndroid 5.0/API Level 21以降からサポートとのことだが、2019年にもなればもう無視していいよね...
頑張る場合は `System.getProperty("os.arch")`が `"armv8l"`(32bit)/`"aarch64"`(64bit)を返すことを利用して `System.getProperty("os.arch").contains("64")` 等で判定できる。
馬鹿の一つ覚え: Keras

#### ファイルへの書き出し
``` lang:Python
from keras.models import Sequential
model.compile()
model.fit()
open(sys.argv[1], 'w').write(model.to_json())
model.save_weights(sys.argv[2])
```

#### ファイルからの読み込み
``` lang:Python
from keras.models import model_from_json
model = model_from_json(open(sys.argv[1]).read()) 
model.compile()
model.load_weights(sys.argv[2])
```