OmniAICreator/Qiita-1.07M huggingface dataset:
Office365のSharePoint(SharePointOnline)でファイルのバージョン管理

# １．SharePointを開く

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/b9eab924-4a6c-651c-f1de-d74dfe682919.png)

# ２．新規にファイルをアップロード

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/a7a0b822-a7a6-e939-9cd9-c2fc85948a21.png)

# ３．更新する前に「チェックアウト」（ロック）をする。

- ファイル名の横の「...」を押して、メニューを表示し、「チェックアウト」を選択。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/1da04bfd-5795-d056-cc22-4bdc64c205f6.png)

# ４．ファイルを更新（アップロード）

- 置き換えるを押す。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/14312413-a4ee-c23a-4765-7478c84e8c7b.png)

# ５．更新後、「チェックイン」（コミット）する。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/874def7a-0689-96ef-d030-7ba744786b98.png)

# ６．コメントを入力してバージョンの内容を記録

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/34cd5385-c74e-06f7-dfd1-1120597185f3.png)

# ７．バージョン履歴を表示

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/c1983cb2-2fd7-b885-25d0-1deb15e61811.png)

# ８．バージョンのコメントを確認

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/7d3afb85-1416-a630-c963-bb04502de3b6.png)

# 備考
- OneDriveではバージョン履歴は記録できるが、コメントを記録できない。
- OneDriveとの同期をしてローカルにファイルを保存した場合、ローカルでのファイルにはもちろんコメントはつけられない。
Markdown エディタとしても有能な Gitpod

## Gitpod を使っマークダウンのメモを Github 上で管理すると便利
最近2万円の Chromebook を購入しましたが、わかっていたとおり Windows や Mac のPCと比べるとローカルでできることは限られています。
またベータ機能として CromeOS と同時に Linux(debian) を動かすことができるので Linux 対応のアプリ（例えば VScode ）を使ったりもできますが、
基本的にスペック抑えめの Chromebook なのであまりごちゃごちさせるともっさりしてきます。

そこでほとんどのタスクをブラウザ上で完結させるために最近 Gitpod を使い始めました。

> [Gitpod についてはこちらで基本的な記事を書かせていただきました！](https://qiita.com/upaldus/items/4b1abd86a74d188007e6)

プログラミングの学習など、すべてブラウザ上で完結するのでマシンスペックが乏しくてもやりたいことはほとんどできている状態です。
あわせてVScode自体が有能なマークダウンエディタでもあるので、セミナーなどのメモも最近は Gitpod のサービスを使っています。

## Gitpod使うと何がいいのか
- 基本無料で使える（ public レポジトリのみ。 private で使いたい場合でも月額9$でOK）
- ファイルのバージョニングや差分管理ができる
- ブラウザ上で動くので端末を選ばない（スマホとかでもOK）
- コードのメモをとりやすい
- 共有しやすい

こんな感じで Github のメリットも享受できます。

また、Markdown の拡張機能も初期設定されているのでプレビュー含めすぐに使えます。

![拡張.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332187/a13f10b7-6215-4bb6-5798-a5be1ef93d6b.png)
カルネージハートとは関係ないJavaScriptでReferrerを書き換える正しい方法

カルネージハート Advent Calendar 2019 9日目の記事です。

今回はカルネージハートとは全く関係ないJavaScriptでReferrerを書き換える正しい方法の話です。

# はじめに

Referrerを書き換える必要なほとんどないと思いますが、サイト内でのリダイレクトのURLによって通知を切り替えるロジックが必要になったので、Referrerを書き換える必要が出てきました。

`/login`から`/home`
`/register`から`/home`
など

## 結論

[Object.defineProperty()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)を使って書き換える

```js
      Object.defineProperty(document, "referrer", {
        value: location.href
      });
```

こんな感じで書き換える。

具体的な使用例

```js
    const referrer = document.referrer;
    if (referrer.indexOf("/login") !== -1) {
      console.log("ログインしました");
    } else if (referrer.indexOf("/register") !== -1) {
      console.log("会員登録しました");
    }
    Object.defineProperty(document, "referrer", {
      value: location.href
    });
```

## 最後に

事実上の最新作EXAが2010年に発売以降続編の情報が皆無ですが、一部の熱狂的ファンは大会を開催してゲームを続けています。ゲームを盛り上げることで続編も出るかもしれません。カルネジスト、ネジらーの皆様のご協力をお願いします！

カルネージハートファンのプログラミング知識を共有しましょう！
windowsPowerShellによるGPOのbackup,export

#WindowsサーバーのGPOのBackup,exportについて#

今回大量のGPOの削除を行うことがありました。
その際、GUI上で一つ一つBackup,exportを行う手順書だったため、とても大変な思いをしました。
そこでPowerShellを用いてこの作業ができるのではと思い、調べた内容をまとめてみます。

**PowerShellとは？**
マイクロソフトが開発した拡張可能なコマンドラインインターフェイス シェルおよびスクリプト言語である。
簡潔に言うと、【Microsoft が提供する、Windowsシステム管理用の「コマンドシェル」であり「スクリプト言語】のことである。
つまりは、Windows 管理用の CLI ツールなんですね。

◆PowerShellの詳しい内容については、下記記事で学びました。
【https://cheshire-wara.com/powershell/ps-textbooks/basic-knowledge/powershell-started1/】

**GPOのBackup,exportについて**
色々調べた結果、PowerShellを使ってもBackup,exportはできるようです。

GUIでの操作については、下記記事に詳しく記載されています。
【https://blogs.manageengine.jp/backup_gpo】

全てバックアップするには、
``` Backup-GPO -All -Path C:¥Temp
```
個別バックアップ
```Backup-GPO -Name GPO名 -Path C:¥Temp
```
でできるようである。
まだ、テストを行っていないため、実際にできたら再度編集して投稿する予定です。
ダブルクォートを含むコマンドをそのままaliasにすると失敗しがち

## 困りごと

gitのオレオレ便利コマンドをgit aliasに設定したら以下のエラーで動かなぁい！

### 原因と解決法

aliasにダブルクォート使っていたため。シングルクォート(`'`)にするかエスケープ(`\"`)する。
変数展開のタイミングの問題。簡単な詳細(←？)は[「シェルのエイリアスで環境変数を使うときはクォーテーションに気をつけよう」という記事](https://qiita.com/ryosukes/items/2f3c16bb5bcafb6494e5)を参照

### 困るまでの具体的な流れ

「git logでいい感じにtreeみたいな。あ、[この「git logのオプションと綺麗にツリー表示するためのエイリアス」という記事](https://qiita.com/hirotsugu_kawa/items/41afaafe477b877b5b73)パクろ。」↓

```shell
$ git log --graph --pretty=format:"%C(auto) %h %ad %d %s" --date=format:"%y/%m/%d-%H:%M:%S"
*  XXXXXXX 19/10/30-18:20:09  fix
*    XXXXXXX 19/10/30-11:47:17  Merge pull request #191
|\
| *    XXXXXXX 19/10/30-11:46:52  (origin/mybranch, mybranch) Merge branch 'master' into mybranch
| |\
| |/
|/|
* |  XXXXXXX 19/08/06-10:18:52  update
* |  XXXXXXX 19/06/27-16:05:08  #188
* |  XXXXXXX 19/06/27-16:04:31  #188
```

「天才きたな。aliasに登録したろ。」↓

```shell:~/.gitconfig
[alias]
        tree = log --graph --pretty=format:"%C(auto) %h %ad %d %s" --date=format:"%y/%m/%d-%H:%M:%S"
```

「やったぜ。打ったろ。」↓

```shell
$ git tree
fatal: ambiguous argument '%h': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
```

「は？すまんもう会社辞めるわ。」
「と思ったけどやっぱ続けるわ。とりあえず(いろいろあってから)シングルクォートにしてみよ」↓

```shell:~/.gitconfig
[alias]
        tree = log --graph --pretty=format:'%C(auto) %h %ad %d %s' --date=format:'%y/%m/%d-%H:%M:%S'
```
```shell
$ git tree
*  XXXXXXX 19/10/30-18:20:09  fix
*    XXXXXXX 19/10/30-11:47:17  Merge pull request #191
|\
| *    XXXXXXX 19/10/30-11:46:52  (origin/mybranch, mybranch) Merge branch 'master' into mybranch
| |\
| |/
|/|
* |  XXXXXXX 19/08/06-10:18:52  update
* |  XXXXXXX 19/06/27-16:05:08  #188
* |  XXXXXXX 19/06/27-16:04:31  #188
```

「いけたわ。変数展開のタイミングに違いありと教えてくれた[前述の記事](https://qiita.com/ryosukes/items/2f3c16bb5bcafb6494e5)と神と会社に感謝。」

### 追伸

シングルクォートとダブルクォート併用するときは、ダブルクォートの前に`\`でエスケープしよう。
またしょっぱい記事を書いてしまった。
PHP - 配列のキーの変数名に配列の値を入れる

メモ

配列のキーの変数名に配列の値を入れる

```ruby:test.php
<?php

$arr = [
    'id' => 1,
    'name' => 'ほげほげ',
    'age' => 25,
];

foreach ($arr as $key => $val) {
    $$key = $val;
}

var_dump($id); // int(1)
var_dump($name); // string(12) "ほげほげ"
var_dump($age); // int(25)
```

* `isset`等で値が入ってるか調べること


可変変数 - Manual - PHP
https://www.php.net/manual/ja/language.variables.variable.php
[macOS Big Sur] dein.vim + syntastic + flake8 で vim上でpythonの文法チェックする


#flake8
https://pypi.org/project/flake8/
Pythonの文法チェックツール。
以下の3つのライブラリのラッパーとなる

- PyFlakes
- pycodestyle
- Ned Batchelder’s McCabe script

## dein.vim
https://github.com/Shougo/dein.vim
dein.vim は vimプラグインマネージャー

## syntastic
https://github.com/vim-syntastic/syntastic
vim における汎用シンタックスチェッカー

#flake8のインストール

```
% brew install flake8
% flake8 --version
3.9.2 (mccabe: 0.6.1, pycodestyle: 2.7.0, pyflakes: 2.3.1) CPython 3.9.6 on Darwin
```

#dein.vimとsyntasticのインストール

```

% cd /tmp
% curl https://raw.githubusercontent.com/Shougo/dein-installer.vim/master/installer.sh  > installer.sh
% sh ./installer.sh
```


既存の~/.vimrc 下記を追記

```~/.vimrc
"----------------------------------------------------------
" Vim/Neovim plugin manager
" https://github.com/Shougo/dein.vim
"----------------------------------------------------------
"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=~/.cache/dein/repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('~/.cache/dein')
  call dein#begin('~/.cache/dein')

  " Let dein manage dein
  " Required:
  call dein#add('~/.cache/dein/repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here like this:
  "call dein#add('Shougo/neosnippet.vim')
  "call dein#add('Shougo/neosnippet-snippets')

  " syntax checking plugin
  " https://github.com/vim-syntastic/syntastic
  call dein#add('scrooloose/syntastic')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

"End dein Scripts-------------------------

"----------------------------------------------------------
" syntastic
"----------------------------------------------------------
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0

"----------------------------------------------------------
" flake8
"----------------------------------------------------------
let g:syntastic_python_checkers = ["flake8"]
```

実際に使用してlintしてくれるか確認する。

```
vim /tmp/test.py
```
新着記事一覧の中に特定の固定ページを差し込む【WordPress】

```
<?php 

// 条件
$args = Array(
        'post_type' => 'post',
        'posts_per_page' => '20', // 投稿数
        'category' => '2,3,4,10', // カテゴリを絞る場合
);
$the_query = get_posts( $args );

echo '<dl>'."\n";

// ループ開始
if ($the_query) {

    global $post;
    foreach ($the_query as $post) {

        setup_postdata($post);

        $loop++;

        // 上から2番目までNEWマークを付ける
        $new_class = '';
        if ($loop < 2) {
            $new_class = ' class="new_topics"';
        }

        // 挿入する固定ページ（1）
        if (!$loop_flag1) {
            if(strtotime(get_the_date('Y-m-d')) < strtotime('2019-10-25')) {
                // 一度しか表示させないためのフラグ
                $loop_flag1 = 1;
                echo '<dt>2019/10/25</dt><dd '.$new_class.'><a href="http://www.xxxx.com/page1">固定ページのタイトル</a></dd>'."\n";
            }
        }

        // 挿入する固定ページ（2）
        if (!$loop_flag2) {
            if(strtotime(get_the_date('Y-m-d')) < strtotime('2018-09-06')) {
                // 一度しか表示させないためのフラグ
                $loop_flag2 = 1;
                echo '<dt>2018/9/6</dt><dd><a href="http://www.xxxx.com/page2">固定ページのタイトル</a></dd>'."\n";
            }
        }

        // 投稿の更新情報
        echo '<dt>'.get_the_time('Y/m/j').'</dt><dd '.$new_class.'><a href="'.get_the_permalink().'">'.get_the_title().'</a></dd>'."\n";
    }
}

echo '</dl>'."\n";

wp_reset_postdata();

?>
```
[WSL] Windows支配下に公開鍵, 秘密鍵を作ってしまうとpermissionを変更できない！

# 背景
僕たち初心者はファイルがエクスプローラーで見えないと不安になります. だからWSLを入れたときにホームディレクトリをエクスプローラーで見える場所に変更した人は多いはずです.  

WSLのホームディレクトリの変更手順は https://qiita.com/funafuna/items/c3bb78a546cf2605205d にわかりやすく解説されています.  

ところがWindows支配下のファイルはすべてのユーザにrwxが許可された状態になっており, chmodで変更することができません. （Windowsから見えるということはそういうことだからでしょうか...？）  

僕はこれを知らずにホームディレクトリに`$ ssh key-gen -t rsa`で鍵を作成してしまいました. するとなんということでしょう～外部サーバーに接続する際

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for 'XXX/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "XXX/.ssh/id_rsa": bad permissions
```
などとおどろおどろしいエラーが出てしまったではありませんか！  

どうやら鍵のpermissionがあかんとのことなので.sshの中に入って`ls -l`すると

```
drwxrwxrwx 1 ユーザー名 ユーザー名 XXXX Month  Date Time id_rsa
drwxrwxrwx 1 ユーザー名 ユーザー名 XXXX Month  Date Time id_rsa.pub
drwxrwxrwx 1 ユーザー名 ユーザー名 XXXX Month  Date Time known_hosts
```  

う～ん, そらあかんわなと. ところが先述のとおりchmodできないのでどうしたものかと...  

その解決方法を僕の先生が教えてくださったので共有します！

# シンボリックリンクを貼って解決する

Linuxの支配下に.sshを移動してchmodし, ホームディレクトリには.sshへのシンボリックリンクを残しておきます. シンボリックリンクとはショートカットのようなもので, こうすればサーバー接続時, ホームディレクトリの.sshが参照されると自動的にLinuxの支配下の.sshに飛ばされてpermissionが制限された鍵が参照されることになります.  

僕はWSLをインストールしたときの初期のホームディレクトリの`home`というディレクトリ下のユーザー名と同じ名前のディレクトリに.sshを移しました.  

```
$ mkdir /home/ユーザー名/.ssh

$ cd #ホームディレクトリに移る

$ cd .ssh

$ mv * /home/ユーザー名/.ssh/

$ cd  /home/ユーザー名/.ssh/

$ chmod -x *

$ chmod 644 id_rsa.pub

$ chmod 644 known_hosts

$ chmod 600 id_rsa

$ ls -la
-rw------- 1 ユーザー名 ユーザー名 XXXX Month  Date Time id_rsa
-rw-r--r-- 1 ユーザー名 ユーザー名 XXXX Month  Date Time id_rsa.pub
-rw-r--r-- 1 ユーザー名 ユーザー名 XXXX Month  Date Time known_hosts
#permission変更がうまく行っているか確認

$ cd ..

$ chmod 700 .ssh/

$ ls -la
drwx------ 1 ユーザー名 ユーザー名 XXXX Month  Date Time .ssh
#permission変更がうまく行っているか確認

$ cd #ホームディレクトリに移る

$ rmdir .ssh/ #ホームディレクトリの.sshを削除

$ ln -s /home/ユーザー名/.ssh . #カレントディレクトリ（ホームディレクトリ）に/home/ユーザー名/.sshへのシンボリックリンクを貼る

$ ls -la
lrwxrwxrwx 1 ユーザー名 ユーザー名 XXXX Month  Date Time .ssh -> /home/ユーザー名/.ssh
#これがあればOK!
```

以上でサーバーに接続できるようになったはずです.  

シンボリックリンクを作成するコマンド`ln -s リンク先 リンクを置く場所` では指定をしない限りリンク先のディレクトリと同じ名前のシンボリックリンクが作成されます. たとえばめちゃくちゃ離れた場所にアクセスしたいディレクトリがあって毎回パスを指定するのが面倒なときは

```
ln -s めちゃくちゃ離れた場所/example リンクを置く場所
```

などとしておけば次からはリンクを置く場所で`example`と指定すれば`めちゃくちゃ離れた場所/example`にアクセスできます. 便利ですね！
暇つぶしにITILの勉強をするのでまとめてく１

###今回予告
概要を書いていく。

###ITILとは
https://shikaku-itil.jimdo.com/itil%E3%81%A8%E3%81%AF/
https://itstrategy.jp/itil/itil4/
最新は４みたいです。
試験料が３万以上するので高いです。

ファンデーションとかインターメディエイトとかプラクティショナーとか書いてますが、
ITILはファンデーション⇒インターミディエイト⇒ITILエキスパート⇒ITILマスターの順番で難易度が上がってくそうです。
下位の資格を取ってないと上位資格を取れないみたいなので、始めるならファンデーションからになるそうです。
ファンデーションって聞くとなんか化粧品みたいですね。

###難易度
ファンデーションの難易度はどうやらITパスポートレベルだそうです。
上位資格はファンデーションすら取ってないので調べてないです。
勉強期間の目安は１ヶ月程度になりそうです。

###就活や転職においてどの程度役立つか
資格取る理由って「会社命令」か「暇つぶし」か「転職・就職のため」かの３つになると思いました。
会社命令や暇つぶしなら特に動機付けは不要でしょう。
転職活動のためなら動機として役に立つかは知りたいでしょう。

ぶっちゃけ資格よりも実務経験のほうが見られるので豆知識程度にしかならないですけど、
https://r-notebook.jp/it-qualification2017/
上記サイトによると７位だそうです。
民間資格としては一番高いみたいです。
（でもネットワークエンジニアになりたいならCCNAのほうが良いと思いますし、
目指してる所に役に立つかが重要なので、馬鹿に見られたくない限りは鵜呑みにしないほうが良いです。）

###今回のまとめ
次回からは勉強した内容について書きます。
VSCode メモ

VSCodeを初めて使ってみたので、いくつかメモ。
また新しいことを知ったら追記していきます。

## 前提
- Mac使用

## ファイル内の文字列検索
左側の虫眼鏡↓をクリックすると
![Screen Shot 2019-12-09 at 11.44.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/fbe9b8fd-6b72-6636-8a6f-76449fd33bde.png)

検索タブに切り替わる。replaceもできる。
![Screen Shot 2019-12-09 at 11.44.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/1b37fb91-6af9-ca74-2398-8a4de45f125e.png)

### ショートカットの場合
`command` + `shift` + `f`

## ファイルの検索
`command` + `p` で検索ボックスがエディタ上部に開く
![Screen Shot 2019-12-09 at 11.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/4d764074-c3ad-2474-7114-186aac23737e.png)

## ファイルを別タブで開きたい時
例えば `.gitignore` を開いたあとに
![Screen Shot 2019-12-09 at 11.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/cdbd430e-c90a-89cb-17d1-0c6593141b93.png)

↓の `.node-version` を開くと
![Screen Shot 2019-12-09 at 11.50.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/6a0a564e-d24b-2ae4-7473-4de931b5752a.png)

さっきの `.gitignore` が開いていたタブが上書きされてしまうのをやめたい...というとき。
![Screen Shot 2019-12-09 at 11.50.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/f7c15671-b3cf-6e97-2f75-c9d19ec2dddf.png)

### 方法
開いたままにしておきたいタブをダブルクリックして、斜体→ノーマルに直す
![Screen Shot 2019-12-09 at 11.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/cdbd430e-c90a-89cb-17d1-0c6593141b93.png)
↓
![Screen Shot 2019-12-09 at 11.53.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/cd8742fa-1b09-d1d8-68fe-7420826ead00.png)

これで `.node-version` を開いても、 `.gitignore` も保持されたままにできる。
![Screen Shot 2019-12-09 at 11.53.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/e46f9deb-3741-fce1-0d28-4ea47c85c66b.png)

## ターミナルを使いたい
![Screen Shot 2019-12-11 at 11.01.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/74e7d625-8b3e-c4b9-860c-ec8e7d9ee3c5.png)

Terminal > New Terminal をクリック。

### 複数のターミナルを使いたい
ターミナル右上の `+` をクリック。
![Screen Shot 2019-12-11 at 11.03.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/3e3ece8c-bc55-3820-2ab8-1eb3bf61ba4f.png)

クリックして、VSCode上部にこんなフォームが開いたらターミナルを開きたいディレクトリを選ぶと
![Screen Shot 2019-12-11 at 11.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/dfb87ecd-75a8-0369-0c24-15e02255e9cd.png)

![Screen Shot 2019-12-11 at 11.05.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/0489dc86-618f-6025-131e-006044dd3271.png)
↓
![Screen Shot 2019-12-11 at 11.06.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/e66dbdfb-3f23-1f4b-577c-9e8c40731e98.png)

こんな感じで増える。

### ターミナルを削除したい
![Screen Shot 2019-12-11 at 11.07.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109241/0fe33dab-756d-b85c-aa24-56e6419415a2.png)

## PhpStorm との違い
- 重くない
- 自動保存しないといけない
uWSGIのチューニングで調べたこと

## 事象

- メモリ使用率が90後半に張り付いたまま、コンテナごとホストに落とされる
- リクエスト数増大につれ、メモリリークっぽい動きをしている
- Worker再起動すれば、メモリ使用率が下がる

## 調査
- `max_requests` ってオプション使えばリクエスト数ベースでWorkerをリロードしてくれるっぽい
- ただし、すべてのプロセスが同時にリロードした場合、リクエストを受け付けられないので、同時に落ちないようにしなきゃならない
- `max_requests_delta` ってオプションでずらせるようにマニュアルに書いてある
- なお、`max_requests_delta` はpipからインストールした場合使えない模様
- 利用する場合は、ソースからビルドしなきゃならない

## 対応

`--idle`と`--cheap`で一定時間リクエスト来なかったらworkerを停止するようにした
[参考](https://u7fa9.org/memo/HEAD/archives/2016-04/2016-04-20.rst)

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177957/88af1634-11e8-5f14-9d90-f2275a2b30ee.png)

- 一定負荷をかけた後、放置するとメモリ使用率は初期起動時と同程度まで下がった。
- 停止した後のリクエストは起動時間分処理が遅くなる、が許容できる範囲だった。
- 起動時にスパイクがかかった場合のOK/NGはまだ計測していない(これから計測する予定)

## まとめ
- 今回やった方法は比較的短い間隔で定期的にリクエストが来るようなアプリケーションでは使えない
- 日中にピークが来て深夜はほぼないみたいなアプリは`idle`を調整して利用時間外に停止するようにするといいかも
pipenv で BigQuery をいじるpythonスクリプトを動かす環境をサクッと作る

[Pipenvことはじめ](https://qiita.com/shinshin86/items/e11c1124e3e2e74556b8)の記事を参考に作った時のメモ。

#pipenvの環境作る

### pipenvインストール

```shell

pip3 install pipenv
```

### pipenvの環境の準備

```shell

cd path/to/project/
pipenv --python 3.7.2 # pipenv経由でpythonバージョンを指定して用意
pipenv shell # pipenvを有効にする
pipenv install google-cloud-bigquery # bigquery用のライブラリをインストール 
```


# スクリプトを用意

例としてBigQueryのquery結果を出力するだけのスクリプト

```py:script.py
from google.cloud import bigquery
client = bigquery.Client(project="project_name")
query = ("SELECT column1, column2 FROM `project.dataset.table`")
query_job = client.query(query, location="US")
for row in query_job:
    print(row)
```

# 実行
```
python script.py
```

※ gcpの認証はgcloud SDK経由で通しておきましょう

以上。pipenv便利。
[cronでpipenv環境上ジョブを実行する](https://qiita.com/munaita_/items/4cf39d154239e02f4c9b)と合わせてどうぞ。
Notification Channelの内容の更新でちょっとハマった話

Notification Channelでアプリの前バージョンでsetSoundしていて、
それをしないように更新しても、音が鳴り続けてしまうので、なんでやって調べたところ、
どうやらNotificaion Channelで一度設定した項目はプログラムからは変更できないらしい。

理由は以下、
>After you create a notification channel, you cannot change the notification channel's visual and auditory behaviors programmatically—only the user can change the channel behaviors from the system settings. 

>引用:[Create and Manage Notification Channels](https://developer.android.com/training/notify-user/channels#UpdateChannel)

要は、ユーザからもチャンネルの設定の変更ができるため、一度作成したチャンネルの動作はプログラムからは変更できないということ。
まあ確かに言う通りで、ユーザの好きな設定にしているのにアプリのアップデートで勝手に変わってはたまったもんじゃない。

それでもどうしても変えたい場合は、一回古いチャンネルを削除して、新しくチャンネルを作り直す必要がある。

```Notification.kt
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.deleteNotificationChannel("古いnotificationのchannelId")
```
注意するのは、deleteするのは**古いnotificationのchannelId**だということ。
そして新しく作るNotification Channelは**deleteするのとは違うchannelId**に設定すること。

もちろん実行すると、今までユーザが設定していたチャンネルごと削除されてしまうので、
ユーザが設定していた項目はなかったことになる。
よってオススメはしません。

Notification Channelの設定はよく考えて設定しましょう(戒め)
JavaScript、許されざる呪文

# 初めに
ノリと勢いでこの記事を書いているので、突っ込みどころも多いかと思いますが温かい目で読んでください。
[闇の魔術に対する防衛術 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/yaminomajutu) | 12日目の記事です。

# 許されざる呪文

取り敢えず、許されざる呪文を唱えてみる。

```javascript:crucio.js
document.write = "Crucio";
console.log(document.write); //Crucio
```
ただ、コンソールにCrucioを出力しているだけの単純なコードである。
だが、Crucioを代入している変数名に大きな問題がある。
そもそも、document.writeはjavaScriptで標準的に備わっている関数である。
# 変数を代入した後に関数を使用してみたい！
```javascript:crucio.js
document.write = "Crucio";
console.log(document.write); //Crucio
document.write("Crucio"); //Uncaught TypeError: document.write is not a function
```

当然のエラーメッセージ

# 関数にユーザー定義関数を代入してみる
```javascript:crucio.js
function hoge(text) {
    console.log(text);
}
document.write = hoge;
document.write("Crucio"); //Crucio
```

はい。上手くいきました。

# console.logをdocument.writeで書きたい！
```javascript:crucio.js
document.write = console.log;
document.write("Crucio"); //Crucio
```
まぁ、通っちゃいますよね^^;

#関数の中身を出力したい！
```javascript:crucio.js
function hoge(text) {
    console.log(text);
}
console.log(hoge);
/* f hoge(text){
 *    console.log(text);
 * }
 * /
```
別の闇の魔術ですがjavaScriptではこの様にユーザー定義関数であれば関数内のコードを出力することが出来ます。

```javascript:crucio.js
console.log(console.log);
/* ƒ log() { [native code] } */
```
但し、デフォルトの関数は無理。
※本来どちらも出来ないようにしておくべきだとは思います...。

# じゃあ、これなら？
```javascript:crucio.js
function hoge(text) {
    console.log(text);
}
document.write = hoge;
console.log(document.write);
/* f hoge(text){
 *    console.log(text);
 * }
 * /
```

あ、出るじゃん。ちゃっかり上書きされてる。

# 最後に
この仕様を活用することが出来る闇の魔法使いは駆逐されてしかるべきだろう。

何故この様な挙動が起きてしまっているかはjSの独特な型に由来するものなので興味が出たり額の傷が疼いた方は是非、調べてみるといい勉強になると思う。

~~決して書くのが面倒だったとかそういう事を言ってはならない~~
JSFiddleでサクッと開発 ❏Vue.js❏

#JSFiddleとは
Web上でコードの結果をサクッと確認できるスグレモノです。
しかも無料！

Vue.js初心者の僕は、まずJSFiddleを使って学習していきます。

<br>
公式サイト
>https://jsfiddle.net/

<br>
見た目
![ダウンロード (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/06ba86cb-d52a-c0ab-b50b-0b81bc927713.png)


`HTML` `CSS` `JavaScript`
それぞれにコードを書き、左上の▷Runをクリックすると

`Result`に結果が反映されます。

<br>
例
![ダウンロード (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/2376b1c7-0f25-58a1-6b19-884807af82d6.png)

<br>
簡単で便利ですなぁ。

<br>
ではまた！
リーダブルコード 鍵となる考え方

リーダブルコードを読んで、自分にとって必要な箇所（全部ですが）のメモ。
書籍の中でも**鍵となる考え方**として書かれています。


## 読みやすさの基本定理

- コードは理解しやすくなければならない
- コードは他人が最短時間で理解できるように書かなければいけない

## 表面上の改善

- 変数、関数名に情報を詰め込む
    - 明確な単語を選ぶ
        - 気取った言い回しよりも明確で正確なほうがいい
    - 汎用的な名前を避ける（あるいは、使う状況を選ぶ）
        - *tmp*,*it*,*retval* のような汎用的な名前を使うときはそれ相応の理由を！
    - 抽象的な名前よりも具体的な名前を使う
        - 例) *× ServerCanStart()* → *○ CanListenOnPort()*
    - 接尾辞や接頭辞を使って情報を追加する
        - 例) ミリ秒を表す変数名 *〇〇_ms*<br>これからエスケープが必要な変数名 *raw_〇〇*
    - 名前の長さを決める
        - スコープの大きな変数には長い名前をつける<br>短い名前はスコープが数行の変数に
    - 名前のフォーマットで情報を伝える
        - 大文字やアンダースコアなどに意味をもたせる
            - 例) クラスのメンバ変数にアンダースコアをつけてローカル変数と区別する


## 誤解されない名前


- 名前が「他の意味と間違えられることはないだろうか？」と何度も自問自答する
    - 限界値を含める時は *max_〇〇* や *min_〇〇* とする
    - 範囲を指定する時は *first* と *last* を使う
    - ブール値の変数名には *is*, *has*, *can*, *should* などの単語を使う
    - *disable_ssl* のような否定形は避ける
    - 単語に対するユーザーの期待にも注意する

## 美しさと設計

- 一貫性のあるスタイルは**正しい**スタイルよりも大切
    - 複数のコードブロックで同じようなことをしていたら、シルエットも同じようなものにする
    - コードの列を整列すれば、概要が把握しやすくなる
    - 意味のある順番を選んで、常にその順番を守る
    - 空行を使って大きなブロックを論理的な「段落」に分ける


## コメントすべきことを知る

- コメントの目的は書き手の意図を読み手に知らせることである
    - コメントをするべきでは**ない**こと
        - コードからすぐにわかることを書かない
        - ひどいコードを補う**補助的なコメント**<br>コメントを書くのではなくコードを修正する
    - コードを書いているときの自分の考えを記録する
        - なぜコードがこうなっているのか
        - コードの欠陥を示す
        - 定数の値にまつわる**背景**
    - 読み手の立場になって何が必要になるかを考える
        - 読み手の解読が難しそうなコード、動作を予想してコメントをつける
        - ファイルやクラスには全体像のコメントを書く
        - 読み手が細部に捕われないように、コードブロックにコメントをつけて概要をまとめる


## コメントは正確で簡潔に

- 複数のものを指す可能性がある「それ」「これ」等の代名詞を避ける
- 関数の動作はできるだけ正確に説明する
- コメントに含める入出力の実例を慎重に選ぶ
- コードの意図は詳細レベルではなく、高レベルで記述する
- よくわからない引数にはインラインコメントを
- 多くの意味が詰め込まれた言葉や表現を使ってコメントを簡潔に保つ

---

## 変数と読みやすさ

- 変数のスコープをできるだけ小さくする
- 一度だけ書き込む変数（*const*, *final*など）を使う

## コードの再構成

- プログラムの主目的と関係のない**無関係の下位問題**を抽出する
- コードを再構成して、一度に1つのことをやるようにする
- 最初にコードを言葉で説明する。その説明を元にキレイな解決策を作る

## 読みやすいコードを書くために

1. 本書で学んだことを実践する
2. 習慣化する
3. コードで伝える


---

Qiita の中にもリーダブルコードに関する記事がたくさんあったので、参考にしていきたい。

- [リーダブルコード要約とリーダブルコード要約の活用方法](https://qiita.com/AKB428/items/20e81ccc8d9998b5535d#javascript%E3%81%A7%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E5%A4%89%E6%95%B0%E3%82%92%E4%BD%9C%E3%82%8B)
Vivado HLS fifoインターフェース使用時の注意

#環境
* ボード
    * Arty Z7(zynq評価ボード)
* ツール
    * Vivado2018.3(Windows10)
    * petalinux2018.3(Ubuntu 16.04)

#やりたかったこと
FIFOに貯めたデータをDDR3に転送したく、Vivado HLSにて高位合成を行いました。詳細は、様々な方が既に実践されておられるのでそちらを参照してください。

転送したいデータは、FIFO Generatorで作成したFIFOにあります。HLSで作成したIPにて、FIFOをリードしてAXIに流しています。
ただ、そこでFIFOのリードが始まらず困ることがあったので注意喚起として残しておきます。

#FIFO GeneratorとHLSのFIFOインターフェース
FIFO Generatorが持つリードインターフェースは、dout, rd_en, emptyの３つです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354707/bc39d4da-f1ad-b657-903f-fb0805ca9958.png" width=50%>


HLSで下記のようにFIFOインターフェースを指定すると、Generatorと同じようにdout, read, empty_nの３つが生成されます。
\#pragma HLS INTERFACE ap_fifo port=in
![fifohls.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354707/17c67410-1ba4-78cc-13b0-f3d3f65efdae.png)


一見同じインターフェースなのですが、**emptyのアクティブが違います**・・・
GeneratorはアクティブH、HLSはアクティブLです。
これでかなりはまりました。
(そりゃぁ、信号名にネガティブのnが入ってるので気づかない自分もあれなんですが、
他社IP同士ならまだしも、同じXilinxならインターフェースは統一してほしいですね)

#追記
関連記事がありましたのでリンクしておきます。
https://forums.xilinx.com/t5/High-Level-Synthesis-HLS/HLS-Integrator-fifo-interface/td-p/847004
Provider Networkってなんぞ？

# Provider Network? External Network?

OpenStackのNeutronではProvider Network/External Network/Tenant Networkというネットワーク概念が登場する。

Tenant Networkはなんとなくわかるが、Provider Network/External Networkについてはよくわからない、違いもわからない。色々調べたが日本語だといい感じの情報がない。

英語で調べると、いい感じの情報があった。ので、調査結果をまとめる。

# 参考
- https://superuser.openstack.org/articles/spot-the-difference-tenant-provider-and-external-neutron-networks/
- https://superuser.openstack.org/articles/tenant-networks-vs-provider-networks-in-the-private-cloud-context/

# 本題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/04924e47-376d-c77e-0ac1-4886b39192b2.png)



## Tenant Network
 - 1つのテナント内でのみ使用するネットワーク
 - そのテナントの管理者が作成する
 - Overlay NW(上)に作成されるため、物理的にどのように接続されているか意識する必要がない


## Provider Network
 - 複数のテナントで共有するネットワーク
 - OpenStack管理者が作成する
 - テナントを作成する前に、作成しておく必要がある
 - Underlay NW(物理NWにマッピングされる)

## External Network
 - Provider Networkとの違いは外部NWと接続するか/しないかという点
 - 基本的にNetwork Nodeに作成される
githugで腕試し！

## githugとは

↓リポジトリはこちらです。
https://github.com/Gazler/githug

gitの使用方法をクイズ形式で題してくれるruby製のOSSです。

gitのコマンドで解答するようになっており、クイズに答えていくだけで、あなたもgitマスター！


## というわけでEC2にインストール

ゲームが終わったら削除するので、最小限のコマンドでサクッとインストールします。

まあ、これは条件反射でやっちゃいますよね！

```
sudo yum update
```

gitのゲームなのでもちろんgitは必要

```
sudo yum install git -y
```

RubyのインストールはAmazon linux2なら簡単にできます
リストに出てきたバージョンを指定してください。記事を書いている時点でruby2.6があったので今回はこちらを指定

```
amazon-linux-extras list

sudo amazon-linux-extras install ruby2.6
```

githugをインストールして終わりです。

```
gem install githug
```


多分、ホームディレクトリにいるかと思うのでgithugコマンドを実行！

```
githug
```

すると以下のようにゲームが始まります。

```
[ec2-user@ip-xx-xx-xx-xx ~]$ githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
No githug directory found, do you wish to create one? [yn]  y
Welcome to Githug!

Name: init
Level: 1
Difficulty: *

A new directory, `git_hug`, has been created; initialize an empty repository in it.

```

## githugの回答方法

指示通りにしたら、以下のコマンドで回答します。


```
githug
```

## githugの4つのコマンド

コマンドは、4つしかないです。

* play - 答え合わせをするときに使います。デフォルトコマンドなので省略可！つまりgithugだけでＯＫ
* hint - 答えがわからない場合にgithug hintでヒントを教えてくれます。とりあえずググる前に見ておくといいかも
* reset - わけがわからなくなった場合にgithug resetで問題の初期化をしてくれます。
* levels - 全ての問題の一覧を表示してくれます。



## 〆

↓リポジトリはこちらです。
https://github.com/Gazler/githug

さあ、楽しいgit gameの始まりです。
.bash_profileと.bashrcでいつもやってるやつ

# .bash_profile

```
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```

# .bashrc

ファイル無ければ作る

```
# git
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true

# これ見た目かわいいのでおすすめでちゅ
export PS1='╭─○ \[\033[1;36m\]\w \[\033[m\]$(__git_ps1 "(%s)")\n\[\033[m\]╰─○ '

# alias
alias ll='ls -al'

# history
export HISTTIMEFORMAT='%F %T '
export HISTSIZE=2000
export HISTFILESIZE=20000
export HISTIGNORE='history:pwd:ls:ls *:ll:w:top:df *'
export HISTCONTROL=ignoreboth
export PROMPT_COMMAND='history -a; history -c; history -r'
```

# 反映
```
source ~/.bashrc
source ~/.bash_profile
```
Windows10にLAMP環境を構築してみた

#windows10環境にLAMP環境を構築しました。

**目的**
研修時にLAMP環境を構築していこう触っていなかったため、
再度思い出すために構築を行いました。
また、個人PCに開発環境を作成したかったこともあります。

こちらの記事を参考に構築を行いました。
とても分かりやすかったです。
https://qiita.com/takepong/items/1b39a8096ac3db8012da

本記事は上記参考記事の手順の中で少し手間取った点のメモとします。

**①**sudoを頭につけないと各確認操作が正常に生じされないこと。
**②**MYSQLインストール後、以下のコマンド入力時のPWがUbuntuの設定の際に決めたPWだったこと。
```mysql -u root -p```
**③**おまけ：phpmyadminのインストールの初回ログインPWが不明だったこと。
MYSQLの初回PWは設定をしていない場合は、空白という認識でしたので、ID:root　PW:空白でログインを試みましたが、ログインができませんでした。
また、MYSQLのPW変更を行い、ログインを試みましたが、ログインができなかった。
色々試しましたが、あくまで**おまけ**の内容でしたので、課題として不明のまま終わりました。

とにかくMYSQLは勉強不足なこともあるが、色々めんどくさいなと思いました。

今後はPHPで色々遊んでいこうと思います。
Jenkinsメモ

備忘録です。

# ホームフォルダ
Jenkinsのインストールフォルダはホームフォルダになります。
ジョブをビルドしてから、workspaceというフォルダが作成されます。
成果物はjobsというフォルダに保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/841830da-ba11-f030-bf65-03e1b68732f1.png)

# ジョブ
job名＝workspace名＝成果物名
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/15363668-b214-9e54-3bda-70c1df48df22.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/9d464582-557c-30f0-8ad2-13c6606cb27c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/78deda53-ae2e-4154-77fa-9a1eec20efb8.png)

# MSBuildの設定
Global Tool Configurationで設定します。（**MSBuildのプラグインは必要**）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/94f74706-f6d9-6d30-c369-7d1766532da5.png)
***※MSBuildの設定が間違っている場合、「'msbuild.exe'は、内部コマンドまたは外部コマンド・・・」というエラーが発生する可能性はあります。***
MSBuild.exeのパスを環境変数PATHに追加しても問題ないと思います。

# ジョブの設定
## local module directory
デフォルトは「.」で、workspaceにある各ジョブのフォルダを指します。
デフォルトのままでも問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/92ba759d-8a3b-a5d0-8718-edfb4dd96691.png)

## build設定の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/5af23423-b0fd-923f-8bc2-489214275af9.png)

## build後の処理の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/af8914df-b9d3-036d-4ae1-7af132ff5a25.png)
「,」で複数のパターンを指定することは可能です。
ectoのクエリで変数名に入ったフィールド名を使う方法


# 環境
elixir: 1.9.0
ecto: 3.1.7

# 定義
以下のようなスキーマがあったとして

```elixir
defmodule User do
  use Ecto.Schema

  schema "users" do
    field :name, :string
    field :age, :integer
  end
end
```

# where句
タプルのリストを渡す事で実現可能です。

```elixir
iex(1) import Ecto.Query
iex(2) field_name = :name
iex(3) User |> where(^[{field_name, "john"}]) |> UserRepo.all()
%User{
  __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
  age: 15,
  id: 1,
  name: "john"
}
```

# select句
[Ecto.Query.API](https://hexdocs.pm/ecto/Ecto.Query.API.html)の **field/2** マクロを使う事で実現可能です。

```elixir
iex(1) import Ecto.Query
iex(2) field_name = :age
iex(3) User |> select([u], field(u, ^field_name)) |> UserRepo.all()
[15]
```
【Tips】PC高速化⚔作業効率化

Speeding up the PC and improving work efficiency

#Google
- 1ページあたりの検索結果を増やす 20~30程度（Default:10件）
 - -> 情報収集量が増える. 

|<img width="374" alt="スクリーンショット 2019-11-25 20.20.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/e167b3ca-271b-d0e6-2de9-c8f762f1e0e0.png">|<img width="824" alt="スクリーンショット 2019-11-25 20.19.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/685feab7-a79c-d0dd-5f0e-bab8124e9184.png">|
|---|---|

##Google Photo
- 全ての写真や動画をPOOL（プール）する。
 - HDDに残さなくても良いもの。
 - 整理や思い出はWebで完結しよう。（現代移行）

##Google Drive
- クラウドストレージ 15GB
 - USBやDropboxの代わり。
 - 複数アカウント作成と起動
 - 画像→Google Document OCR

##Gmail
- 検索フィルタ
 - size: 1m サイズ1mbを超えるメール

##Google Keep
- 無制限容量のメモ。どんどんアイディアを書き込む。

##Google Slide
- スライド埋め込み,自動保存, ファイル（データ）をローカルで所有することが不要

##Chromeウェブストア
###拡張機能
- uBlock Origin 広告コンテンツフィルタリング
- SearchPreview サムネイルを表示する
 - ![スクリーンショット 2019-12-19 08.11.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/2e196de9-90c2-9000-eefe-6f708cc338ac.png)

- (Full Page Screen Capture ブラウザ１ページスクリーンショットする。場合に応じてON/OFF)
- (Perapera Chinese Popup Dictionary 中国語ピンイン表示。)

###テーマ
- 単色のテーマ　黒。たまに切り替えることで気持ちをリセット。

###YouTube
- ピクチャ・・イン・ピクチャ
 - 最前面。YouTubeの講座系の動画。疲れたらながら作業をすることもある。
 - <img width="348" alt="スクリーンショット 2019-12-11 10.24.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/c66f160e-b5fb-1c25-3e45-80a52e4e3f06.png">


###検索設定
ページあたりの表示件数 20~30(任意)

###ブックマークバー
- ブックマークバー非表示（人による）
- 一つのフォルダにストックする（mixされる）
- 全履歴削除
 - URL検索候補の削減 

###上級者
Chrome高速化 chrome://flags [1]

---
#Desktop
- 壁紙自動収集と切り替え(FreshBackMac or Dynamic Theme)飽き性の方向け
- 何も置かない
- タスクマネージャー or ターミナルでKill
- キャッシュクリーナーを不定期で実施(CCleaner等)
- ファイル全検索ソフトを使用する（Everything(Windows), Easyfind(Mac)）
- セキュリティソフトは不要
- Dropbox（もしくはGoogleDrive等）はスタートアップ時に起動
 - ファイルの安全保証。後々停止しても良い。

---
#Windows10な私
- 初期不要アプリアンインストール
- 常駐プロセスの停止
 - Cortana(コルタナ）停止
- あまり使わないアプリケーションの削除

---
#Macな私
- ダークモード (Mojave~)
- メモの同期がスムーズ（iPhoneとMac）
- Dock、メニュバーを隠す（表示領域の拡大）
- ズーム機能
- Night Shift（ブルーライトカット）
- 通知センターOFF
<img width="325" alt="スクリーンショット 2019-11-25 20.39.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/7d9bf04a-cae6-23ee-274f-0ee0110867ae.png">
- PCが遅いと感じたらセーフモード実行 （Shift + 起動） 
- Finderの表示結果が反映されなかったら 
 - cmd ```killall Finder```
- あまり使わないアプリケーション（app）の削除
- Chromeの立ち上げが遅いとき、起動が早いSafariを開く。

---
#インターネット
- WIFI　DNS 8.8.8.8
- 有線接続（通信距離に応じて）

---
#アウトプット
####日頃からSNS、ブログ、メモ(Webサービス)、動画等で必要な情報を公開する。
- 日々の物事が定着する
- アクセス解析やマーケティングを学ぶ(時代)
- 自分を残す。

---
#上級
- 深層ウェブ・ダークウェブで更なる情報収集 
 - ハッカー、真相、例のアレなどの裏情報（No good）。[2]
- VPN・IP、アドレス偽造
 - 位置情報の匿名化
 - アクセス制限の回避

---
#最後に
他にも最適な方法があったらコメント下さい。出来るだけ不要なソフトは入れずに。

---
#【参考】
[1] [手軽なのに効果絶大『Chrome』を高速化する14の設定(flags)](https://yaruzou.net/chrome-acceleration-flags)
[2] [【深層web】深層ウェブの歩き方、教えてやるよ【第一回](https://www.nicovideo.jp/watch/sm34250485)
Qiitaの人気タグをBar Chart Raceで可視化するまでの話

# この記事は？
前回の記事[^1]でQiitaの人気タグを月ごとにBar Chart Raceで可視化したので、その手順を載せる

# 1. Qiita Apiを使って情報取得
前回の記事でも述べたとおり、基本的に先人の知恵[^2]を借りている。


この方法ではある半月内に書かれた記事を取得し、期間をずらすことですべての期間を集計しようとしている。
しかし、

```python
query = "&query=created:>" + start_date  + "+created:<" + end_date
```
としており
start_date = ["2018-01-15","2018-01-31",...]
end_date = ["2018-01-31","2018-02-15",...]

となっているため、境界が含まれていない。
そのため以下のようにした。

```python
query = "&query=created:>" + start_date  + "+created:<=" + end_date
```

#2. pandas使って処理
以下の通り。
詳細はコメントを参照。

```python
import datetime
from dateutil.relativedelta import relativedelta
import copy

# 1.で作った全結果ファイルをロード
df_all = pd.read_csv("results/summary.csv")

# 開始日時
ref_date = datetime.date(2011,9,1)

# created_atでソート
df_all = df_all.sort_values("created_at")

# tag情報とdate情報だけ抜き出し 
tags_list = list(df_all["tags_str"])
date_list = list(df_all["created_at"])
# relativedelta等が使える型に変換
date_list = [pd.to_datetime(one) for one in date_list]

# key:タグ名, value:回数
tags_dict =dict()
# 先頭の年（2011）、集計対象の年が変わるたびに更新
y = date_list[0].year
# 先頭の月(9)、集計対象の月が変わるたびに更新
m = date_list[0].month
#  結果格納用
ref_date = datetime.date(y,m,1)

# 各月での途中結果（累和）格納用リスト
monthly_result = []
# 各月格納用リスト
month = []

for i,(one_tags, one_date) in tqdm(enumerate(zip(tags_list,date_list))):
    try:
        # カンマ区切りテキストをリストに
        tags = one_tags.split(",")
    except AttributeError:
        # たまにNaNが入っているのでその時はcontinue（タグ未設定時？）
        continue
    # tags_dictを見てすでにそのタグが入っていれば+1、そうでなければdictに登録して1を格納する
    for one_tag in tags:
        try:
            tags_dict[one_tag] += 1
        except KeyError:
            tags_dict[one_tag] = 1
    
    # 月が変わったときの処理
    if one_date.year == y and one_date.month == m:
        continue
    else:
        # month, monthly_resultにその時の日付、そこまでのdictを格納
        month.append(ref_date)
        monthly_result.append(copy.deepcopy(tags_dict))
        ref_date += relativedelta(months=1)
        y = ref_date.year
        m = ref_date.month
    
# 終了時に最後の状態を格納
month.append(ref_date)
monthly_result.append(copy.deepcopy(tags_dict))

# 各月のdictについて、その月までに投稿されていないタグをdictに登録、0を格納
for one in monthly_result:
    ref_keys = one.keys()
    for one_tag in tags_dict:
        if not one_tag in ref_keys:
            one[one_tag] = 0
    
# 成形
monthly_result_num = []
for one_dict in monthly_result:
    # ソートするためにdictからlistへ
    tmp_list = [one for one in one_dict.items()]
    # 名前でソート
    tmp_list = sorted(tmp_list, key=lambda x:x[0])
    # 回数だけ格納
    monthly_result_num.append([one[1] for one in tmp_list ])
    
# タグ名を一時的にDataFrameの値に格納
df_align = pd.DataFrame({"tags":sorted(ref_keys)})
# 各月までのタグ登録回数の累和値をDataFrameに格納
for one_date,one_nums in zip(month,monthly_result_num):
    df_align[one_date.strftime("%Y-%m")] = one_nums
# タグ名をindexにしてcsvに書き出し
df_align.set_index('tags').to_csv("all_result.csv")
```
# 3. flourishのbar chart raceを使って可視化
https://app.flourish.studio/
のbar chart raceにはき出したcsvをアップロード。
これで可視化出来る！！


[^1]: https://qiita.com/okd46/items/016e84611c89dbcf457a
[^2]: https://qiita.com/arai-qiita/items/94902fc0e686e59cb8c5
Flutter環境構築手順

#　環境構築メモ
https://flutter.dev/docs/get-started/install

1.SDKのダウンロード
Webサイトから自分の環境にあった最新のものをダウンロードする
2.ダウンロードしたファイルを解凍する
パスはどこでもいいのですが、公式に合わせる

```zsh
mkdir development
cd development
unzip ~/Download/ダウンロードしたファイル名
```

3.Flutterのディレクトリをパスに追加する

```zsh
vi ~/.zshrc

export PATH="$PATH:[あなたのFlutterを解凍したディレクトリ]/flutter/bin
```
あとは[esc] :wq で保存してください。

```zsh
source ~/.zshrc
```

4.FlutterDoctorを実行する

```zsh
flutter doctor
```

AndroidStudioとかXcodeがインストールされてないなど、Flutterに必要なツール類のチェックをして解決方法を教えてくれるすごいやつです。
Blenderでテンキーが必須といわれていた所以のビューショートカットについてまとめてみた

Blenderにはテンキーが必須と言われていました（自分の中では過去形）。
なぜなら、それがなければ快適なビューカメラ操作が難しかったからです。
現在は3Dビュー上のギズモや設定のテンキーを模倣（入力ー＞キーボード）等の代替手段ができたため、テンキーがなくとも耐えられるようになりました。カレンダー7日目の記事が参考になります（https://qiita.com/kiro/items/266f4ac191aaaa033a30）
しかしあえて、3Dビューのテンキー操作をまとめます。（だいたい2D（UVや画像エディタ、ノードエディタ）にも同じ操作が出来ます。）
なぜでしょうか？カレンダー10日目が空いていたからです。

空欄はビュー操作に関して割当なしということです
テンプレ

|テ|ン|キー|
|---|---|---|
|7:|8:|9:|
|4:|5:|6:|
|1:|2:|3:|
|0:|.:|Enter|

##修飾キー（ctrl,alt,shift）なし
|テ|ン|キー||
|---|---|---|---|
|7:上から見る|8:上側に回り込む|9:逆側に回り込む|-:引き|
|4:左に回り込む|5:パース切り替え|6:右側に回り込む|+:拡大|
|1:正面から見る|2:下側に回り込む|3:右から見る|
|0:シーンのカメラにあわせる|.:選択物にあわせる|Enter|

##with ctrl: 基本的に軸方向の反転と、回り込みが軸方向移動に変化します。（ctrlが付くものの多くは操作の反転です。(e.g:法線の再計算)）

|テ|ン|キー|
|---|---|---|
|7:下から見る|8:ビュー上側に移動|9|
|4:ビュー左側に移動|5：|6:ビュー右側に移動|
|1:背後から見る|2:ビュー下側に移動|3:左から見る|
|0:押すとダメな奴|.:0選択物にあわせる|Enter|

##with shift: アクティブなものの軸を基準にビューを動かします。
単一面を選択してshift+NUM_7を使ってみるのが一番分かりやすく、有用でしょう。

|テ|ン|キー|
|---|---|---|
|7:（アクティブなものの軸の）上から見る|8:|9:|
|4:|5：|6:|
|1:（アクティブなものの軸の）前から見る|2:|3:（アクティブなものの軸の）右から見る|
|0:|.:|Enter|

##with shift ctrl: アクティブなものの軸を基準にビューを動かします。

|テ|ン|キー|
|---|---|---|
|7:（アクティブなものの軸の）下から見る|8:|9:|
|4:|5：|6:|
|1:（アクティブなものの軸の）後ろから見る|2:|3:（アクティブなものの軸の）左から見る|
|0:|.:|Enter|

##with alt: 割当てはありません、大きく空いているショートカット空間とも言えます。


#以上です。
ありがとうございました。
TouchDesignerでWifi経由スマホセンサー値の取得できるZIG

IPアドレスをWifi内でTouchDesignerを利用するPC画面に設定のみで利用できました
Wifi環境があればワイヤレスセンサーとしてすぐに使えて便利

## スマホにZIGをインストール

https://zig-project.com/

動作画面


![Screenshot_2019-12-11-09-48-22_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/423e53a8-6d3a-1577-dd89-7352029ee59b.png)


## TouchDesignerでOSCのinを設定

設定した値は取得できている感じで便利

![NoName_2019-12-11_9-47-25_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/25fd04cc-0046-3285-be1d-87f5d865489f.png)


## 参考サイト

ZIG-Project
https://zig-project.com/
FreeBSDでロードバランサ（DSR）を構築

Linux(LVS+Keepalived)で構築できる下記のようなロードバランサ(DSR)をFreeBSDで構築してみます。
http://klock-3rd.hatenablog.com/entry/2016/01/24/165848
ネタ元は下記のURLです。
http://www.undeadly.org/cgi?action=article&sid=20080617010016

下記の環境で構築します。OSは全部FreeBSD12.1です。

| サーバ | IPアドレス |
|---|---|---|
| 仮想IPアドレス        | 192.168.201.131 |
| Web用サーバ1         | 192.168.201.132 |
| Web用サーバ2         | 192.168.201.133 |
| ロードバランサ用サーバ | 192.168.201.134 |

ロードバランサ用サーバでは relayd + pf を、Webサーバでは何でもいいんですが nginx を使います。
仮想IPアドレスはロードバランサ用サーバのIPアドレスとは別に用意します。




# Web用サーバの構築
nginxをインストール＆起動して、ヘルスチェック用のHTMLを置きます。

```
# pkg install -y nginx
# /usr/local/etc/rc.d/nginx onestart
# echo `hostname` > /usr/local/www/nginx/hc.html
```

ループバックインターフェースの設定

```
# ifconfig lo0 alias 192.168.201.131/32

# 恒久的に設定する場合は下記のコマンドを実行
# sysrc ifconfig_lo0_alias0="inet 192.168.201.131/32"
```



# ロードバランサー用サーバの構築
仮想IPアドレスの設定

```
# ifconfig em0 alias 192.168.201.131/32
```

pfの設定を行います。/etc/pf.confを下記の内容で作成します

```
rdr-anchor "relayd/*"
anchor "relayd/*"
```

pfの設定と起動を行います

```
# sysrc pf_rules="/etc/pf.conf"
# sysrc pf_enable="YES"
# /etc/rc.d/pf start
```


relaydのインストールをします

```
# pkg install -y relayd
```

/usr/local/etc/relayd.confを下記の内容で作成します

```
# 仮想IPアドレス
vipaddress="192.168.201.131"
# Web用サーバのIPアドレス
webhost1="192.168.201.132"
webhost2="192.168.201.133"
# 3秒に一度ヘルスチェックを行う
interval 3
table <webhosts> { $webhost1 $webhost2 }
redirect "nginx" {
        listen on $vipaddress port 80 interface em0
        route to <webhosts> port 80 check http "/hc.html" code 200 interface em0
}
```

relaydを起動

```
# /usr/local/etc/rc.d/relayd onestart
```

relayctlコマンドでWeb用サーバの状態を確認

```
# relayctl show summary
Id  	Type    	Name                    	Avlblty	Status
1   	redirect	nginx                   	       	active
1   	table   	webhosts:80             	       	active (2 hosts)
1   	host    	192.168.201.132         	100.00%	up
2   	host    	192.168.201.133         	100.00%	up

# relayctl show hosts
Id  	Type    	Name                    	Avlblty	Status
1   	table   	webhosts:80             	       	active (2 hosts)
1   	host    	192.168.201.132         	100.00%	up
	        	total: 1195/1195 checks
2   	host    	192.168.201.133         	100.00%	up
	        	total: 1195/1195 checks
```

Web用サーバの /var/log/nginx/access.log を見てみると、
relaydが3秒に1回アクセスしていることが確認できます

```
192.168.201.134 - - [03/Dec/2019:14:45:56 +0900] "HEAD /hc.html HTTP/1.0" 200 0 "-" "-"
192.168.201.134 - - [03/Dec/2019:14:45:59 +0900] "HEAD /hc.html HTTP/1.0" 200 0 "-" "-"
192.168.201.134 - - [03/Dec/2019:14:46:02 +0900] "HEAD /hc.html HTTP/1.0" 200 0 "-" "-"
192.168.201.134 - - [03/Dec/2019:14:46:05 +0900] "HEAD /hc.html HTTP/1.0" 200 0 "-" "-"
192.168.201.134 - - [03/Dec/2019:14:46:08 +0900] "HEAD /hc.html HTTP/1.0" 200 0 "-" "-"
```

# 動作確認

適当なホストから

```
$ curl 'http://192.168.201.131/hc.html'
web1
$ curl 'http://192.168.201.131/hc.html'
web2
```

ロードバランスはされてるっぽい
eksctl を使用して Fargate for EKS を試してみた。

## 前提条件

eksctl のバージョンは次のとおりです。

```sh
% eksctl version
[ℹ]  version.Info{BuiltAt:"", GitCommit:"", GitTag:"0.11.0"}
```

## eksctl の認証

`--profile` オプションを使用して ~/.aws/config のプロファイルを選択できます。

```sh
% eksctl get clusters --profile dummy
No clusters found
```

## EKS クラスタの構築

[公式サイト](https://eksctl.io/usage/fargate/)の案内の通り、`--fargate` オプションを `eksctl create cluster` へ付加するだけです。

```sh
% eksctl create cluster --fargate --profile dummy
[ℹ]  eksctl version 0.11.0
[ℹ]  using region ap-northeast-1

...長いので省略
```

しばらく待つと EKS クラスタが構築されます。

```sh
[✔]  EKS cluster "ferocious-painting-xxxxxxxxxx" in "ap-northeast-1" region is ready
```

kubectl コマンドからノードを確認します。

```sh
% kubectl get node
NAME                                                         STATUS   ROLES    AGE     VERSION
fargate-ip-192-168-130-xxx.ap-northeast-1.compute.internal   Ready    <none>   2m54s   v1.14.8-eks
fargate-ip-192-168-143-xxx.ap-northeast-1.compute.internal    Ready    <none>   3m3s    v1.14.8-eks
```

Kubernetes のノードが Fargate で構成されていることがわかります。

## Pod のデプロイ

nginx の Pod をデプロイします。

```sh
% kubectl apply -f https://k8s.io/examples/application/deployment.yaml
deployment.apps/nginx-deployment created
```

当然ですが、問題なくデプロイできました。

```sh
% kubectl describe deployment nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Thu, 05 Dec 2019 22:26:45 +0900
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
                        kubectl.kubernetes.io/last-applied-configuration:
                          {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},"spec":{"replica
...
Selector:               app=nginx
Replicas:               2 desired | 2 updated | 2 total | 0 available | 2 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.7.9
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      False   MinimumReplicasUnavailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deployment-6dd86d77d (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  7s    deployment-controller  Scaled up replica set nginx-deployment-6dd86d77d to 2
```

## 後始末

次のコマンドから今回作成した EKS クラスタを削除できます。

```sh
eksctl delete cluster type_your_cluster_name --profile dummy
```

今回は試していませんが、`--wait` フラグをコマンドへ付加すると CloudFormation の stack が完全に削除されるまで待機してくれるようです。詳しくは次のページに記載されています。
<https://eksctl.io/usage/creating-and-managing-clusters/>
AWS 認定セキュリティ – 専門知識 受験対策

先日合格したAWS認定スペシャリティ-セキュリティ試験について、自分が行った対策を紹介します。


## 試験範囲
試験ガイドに記載の通りです。
「インシデント対応」「ログと監視」「インフラストラクチャのセキュリティ」「ID及びアクセス管理」「データ保護」の5分野について
他のプロフェッショナル試験や専門知識同様、170分の試験になります。（受験料：30,000円）



## 受験対策
受験にあたり自分が行った対策は以下になります。

### AWSのセキュリティ関係のサービスのBlackbeltを読む
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/
「AWS クラウドサービス活用資料集」の「Security, Identity & Compliance」に分類されているサービスのBlackbeltに全て目を通しました。
IAMやKMSについてはYouTube動画もあり、理解しやすいです。

Security, Identity & Complianceに分類されていたのは以下の通りです。
・AWS Identity and Access Management (IAM)	
・Amazon Cognito 
・Amazon GuardDuty
・Amazon Inspector
・Amazon Macie
・AWS Certificate Manager
・AWS CloudHSM
・AWS Directory Service
・AWS Key Management Service
・AWS Organizations
・AWS Shield
・AWS WAF


### ベストプラクティスを読む
日本語のベストプラクティスは少々古いですが、基本的な考え方等の確認に使いました。
https://d1.awsstatic.com/International/ja_JP/Whitepapers/AWS_Security_Best_Practices.pdf

### サンプル問題を解く
公式にサンプル問題が10問掲載されています。サンプル問題も更新されているようで複数パターンありました。

#### 旧バージョン？(10問)
https://d1.awsstatic.com/training-and-certification/docs-security-spec/AWS_Certified_SC-S_Sample%20Questions_v1.0_FINAL.pdf
#### 公式ページからのリンクされているバージョン（10問）
https://d1.awsstatic.com/training-and-certification/docs-security-spec/AWS%20Certified%20Security%20-%20Specialty_Sample%20Questions.pdf


## その他の認定資格状況
・SAA,SAP,DOPを旧試験で取得しています。

個人の印象ではありますが、他のプロフェッショナル試験よりは簡単に感じました。
SAAの取得後、ステップアップとしてセキュリティ試験も受験してみてはどうかと思います。
Twitterつぶやきbotを日本で一番わかりやすく教えるぜ

# 筆者について
- 東洋大学　情報連携学部　の学生
- [INIAD](https://www.iniad.org/)

# 準備
- pythonを実行できる環境
- herokuアカウント持っていてほしい
- Twitter APIも使えるようになっていてほしい

# Let's start!
ここに [ソースコード](https://github.com/Retsuki/tweet)
**ソースコードに「requirements.txt」があります。**
**これは、herokuでinstallされるモジュールどもです。**

```ruby:tweet.py

import urllib
from requests_oauthlib import OAuth1Session
import requests
import sys
import os
import datetime

# キー等は環境変数に入れます
CK = os.environ.get("CK")
CS = os.environ["CS"]
AT = os.environ["AT"]
ATS = os.environ["ATS"]

# 署名URLの作成みたいな感じかな
twitter = OAuth1Session(CK, CS, AT, ATS)

# statues/update使います。（短期間での同じツイート内容はブロックされる）
url = "https://api.twitter.com/1.1/statuses/update.json"

# ex. おはよんよん！！2019年12月11日 08:51:56
dtNow = datetime.datetime.now() + datetime.timedelta(hours=9)
tweet = "おはよんよん！！" + dtNow.strftime('%Y年%m月%d日 %H:%M:%S')

params = {
    "status": tweet
}

res = twitter.post(url, params=params)

if res.status_code == 200:
    print("SUCCESS")
else:
    print(res)


```

# 注意
statues/updateは**短期間で同じツイートをした場合はブロックされます。**（403が帰ってくる）
なので、datetimeを使って毎回異なる時間帯を文字列に付け加えました。

# heroku cliの設定
ご自身のターミナルで以下を実行。
なお、初期設定はしてあるとみなす。

```ruby:terminal
$ heroku login

$ heroku create [app name]

$ git init

$ git remote add heroku https://git.heroku.com/[your app name].git

$ git add .
$ git commit -m "First commit to heroku"
$ git push heroku master

```

# herokuの環境変数にTwitterのAPIキーを設定

```ruby:terminal
$ heroku config:set CK=APIkey CS=APIsecretkey AT=Accesskey token ATS=Accesstokensecret
```

# 実際にherokuで実行されるか確認

```ruby:terminal
$ heroku run python tweet.py
```

SUCCESSが返ればOK！！！！


# herokuでcron(scheduler)の設定
なお、クレジットカードの登録はしてあるとする

```ruby:terminal
$ heroku addons:add scheduler:standard
```

# herokuに行く
- 作成したappがあるので、その中でschedulerをクリック
- create addがあると思うので、クリックする。
- 
<img width="392" alt="スクリーンショット 2019-12-11 9.30.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201115/d8aac3d2-89f2-7909-a67a-674c17c4e5f2.png">

上記のように設定すれば完了です！！
１０分後に確認してみましょう！！

お疲れ様です！