OmniAICreator/Qiita-1.07M huggingface dataset:
Taskwarriorつかってみた

この記事は[AutoScale Advent Calendar 2019](AutoScale Advent Calendar 2019) 3日目の記事です。

CLIのTodo管理ツール「[Taskwarrior](https://taskwarrior.org/)」使ってみた記事です。

1時間触ったぐらいです。

# TL;DR

* CLIで叩けるので手癖で使える
* はやい、きれい、らく
* あとでサーバー立てたい

# Taskwarriorとは

CLIで操作できるタスク管理ツールです。

```bash
task add にゃーんと鳴く project:hoge
task delete にゃーん
task list
```

設定ファイルは `.taskrc` で管理します。

## インストール

[公式ドキュメント](https://taskwarrior.org/download/)に書いてあります。

パッケージ管理ツールで入るのがいい感じですね。

```bash
brew install task # Mac
sudo apt install taskwarrior # Ubuntu
sudo apt install taks/wheezy-backports # Debian
pacman -S task # Arch
yum install task # Fedora
```

## いいところ

* はやい
    * とにかくはやい
    * はやいは正義
    * ブラウザ系のツールとは比べ物にならないはやさ
    * CLIいいね
* CLIツールと組み合わせられる
    * これができるだけでgrepしてファイル出力とか簡単にできるからほんといい
* サーバー立てられる
    * 複数環境でタスク共有できるのがいいです

## わるいところ

* Windows非対応
    * WSLは対応してるのでそこから使いましょう
* 良くも悪くもCLI
    * Webやスマホアプリもほしい
    * ホスティングサービスとかは結構あるので、頑張って自前で立ててみたい or 作ってみたい

みなさんも良いタスク管理ライフを。
ハーイ、バブー、ちゃーん

## まじでこの世の全てのイクラ好きに教えてあげたいんだが

このQiitaの記事には全ての人間を虜にする禁断のイクラのレシピがある。
これが美味しそうでもなく、もはや食べられないのだが、
HTMLとCSSだけでイクラを再現したからぜひ全国のイクラ好き、
イクラを愛する者たち、イクラを憎む者たち、全てのイクラ関係者に伝われ

## イラストチックなイクラを作った
![スクリーンショット 2019-12-03 18.01.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/86020d0c-1a0f-eb5d-49a1-22121c0f2a6f.png)


## イクラのレシピ

### HTMLを用意する
イクラの枠組みを作る

```html

<div class="container">
  <div class="ikura">
    <div class="ikura_inner">
      <div class="ikura_luster">
        <div class="ikura_lusterInner"></div>
      </div>
    </div>
  </div>
</div>
```

### スタイルシートを用意する
イクラに命を捧げましょう
まずは色を適当につけます。

![スクリーンショット 2019-12-03 17.51.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/c0eb1828-8cf7-0e60-26c8-8ac9be9df365.png)

なんだか、心もとないですね。
イクラの色は箇所によって薄いところと、濃い色の箇所があるので、
そこを [linear-gradient](https://developer.mozilla.org/ja/docs/Web/CSS/linear-gradient) で再現しましょう。

```scss
.ikura {
  background: linear-gradient(#D83F28, #FB8B00 95%);
  &_inner {
    background: rgba(246, 74, 7, 0.5);
  }
}
```

![スクリーンショット 2019-12-03 17.52.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/c893a5da-469c-e72e-ba58-8f9d0f252cf2.png)

少しイクラ感出てきました。
ただ、なんかまだイラスト感がありますね。
外側のイクラの色と内側のイクラの色の境目がパキっとなっているので、
[box-shadow](https://developer.mozilla.org/ja/docs/Web/CSS/box-shadow)で境目のパキっと感をぼかしてあげましょう。

```scss
.ikura_inner {
  box-shadow: 5px 5px 10px 0px rgba(246, 74, 7, 0.5);
}
```

![スクリーンショット 2019-12-03 17.54.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/9a2bccbf-4c6f-acdc-da0e-45e362f04169.png)

少し柔らかい印象になりました。

最後に、白い光沢の部分に若干影をつけてあげるとより近づきます。

```scss
.ikura_luster {
  background: #fff;
  box-shadow: -7px 2px 7px 11px #DA8151;
}

```

![スクリーンショット 2019-12-03 17.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146512/7e0d8008-6344-1df0-8cce-0f8a16ec23e0.png)

イクラーーーー！チャーーーーーーン！！！！

最後に全体のscssを置いておきますね。（汚いとかはちょっとすみません）

```scss

.ikura {
  background: $ikura;
  width: 200px;
  height: 200px;
  border-radius: 100%;
  transform-style: preserve-3d;
  perspective-origin: 0% 50%;
  &_inner {
    background: rgba(246, 74, 7, 0.5);
    box-shadow: 5px 5px 10px 0px rgba(246, 74, 7, 0.5);
    width: 180px;
    height: 180px;
    border-radius: 50%;
    transform: translateX(5px) translateY(3px);
  }
  &_luster {
    background: #fff;
    border-radius: 50%;
    width: 40px;
    height: 30px;
    margin: auto;
    transform: translateX(-70%) translateY(90%) rotate(-40deg);
    box-shadow: -7px 2px 7px 11px #DA8151;
    position: relative;
    &:after {
      content: "";
      display: block;
      position: absolute;
      width: 30px;
      height: 40px;
      background: #fff;
      border-radius: 50%;
      transform: rotate(118deg);
      right: -6px;
      top: -4px;
    }
  }
}
```

## おわりに

か、カレーは明日から()
スクラム開発やってたつもりでスタートもしていなかった話

:calendar_spiral: [i-plug Advent Calendar 2019](https://qiita.com/advent-calendar/2019/i-plug) の【4日目】の記事です:santa::tada:

さて、弊社では、今年の４月から、スクラムでプロダクト開発に取り組んでいます。
個人的には、スクラムは２社目です。

スクラム導入辺りの出来事でもまとめようかと思いましたが、そんなものは世間に溢れているので、2社通しての失敗経験でお茶を濁します。
ついでに、今の自分ならこうするよ、っていうのも合わせて載せるので、同じような境遇の方がいれば（いるのか？）、参考にしてもらえれば。

スクラムに関する用語の解説はここではしないので、必要があればGoogle先生に聞いてください。

ちなみに、タイトルは、失敗例をピックアップしたときに「いやいやスクラムやれてないし」と思ったので、付けました。釣りです。
でも、１つ１つは、あるあるだと思うんだよなぁ。

（会話内容などはわかりやすく再構成しています。当時はもうちょいまともな会話をしている、はず）

## 失敗１：「プロジェクト期間＝スプリント」だった

A「今度やるプロジェクトでスクラムやるで！」
B「ほうほう。どうやってやるん？」
A「プロダクトバックログリストっていうのを作って、上から順番に作っていくんや！リストの中はこれとこれとこれな！」
B「よっしゃ！！スプリント期間どうするよ？？」
A「カットオーバーが3ヶ月後だから、3ヶ月な！」
B「・・・」

### 何が問題？

- そもそもスクラムに何を期待している？
- 一発勝負

### どうしたらよかったか？

- チームみんなで、スクラムへの期待と、それぞれの役割をすり合わせよう
  - 必読：[スクラムガイド](https://www.scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf)
- プロジェクト期間内で、小さく期間を区切って、定期的に方向性を確認しよう

## 失敗２：過去はふりかえらない

B「残業だらけでなんとかリリース出来た・・・。どうしてこうなったんや？」
A「うまくいったな！よし、今度はもっと時間のかかる激重プロジェクトや！！今日からプロダクトバックログリスト作っていくで！！！」
B「・・・」

### 何が問題？

- 残業ありきの計画になっていた
- チームをマネジメントをする人（Aさん）が状況を共有できていない
- スプリントの終わりにふりかえりをしない

### どうしたらよかったか？

- スクラムは継続可能なリズムを繰り返すことを推奨しているので、ちゃんとPBIに順位をつけ、無理のない計画としましょう
  - あぶれる分は、早めに早めにステークホルダーと調整して、MVPを見極める！
- Aさんの立場次第
    - ステークホルダーの場合：チームに判断を任せてもらえるような関係を作る。そして無理なものは無理と言う。
    - チームの一員の場合：マネージャーといえど、開発に置いてはフラットという関係を作る。そして無理なものは無理と言う。
- ちゃんとふりかえりを行う時間をとる

## 失敗３：スクラムマスター兼プロダクトオーナーが、devチームにPBIをアサインする

A「今回のスプリントで何やるか決めるで！」
B「スプリントプランニングやね」
A「Bは機能１、Cは機能２、Dは先週のお残しの続きな！仕様は後でそれぞれに伝えるわー」
B「・・・」

### 何が問題？

- スクラムマスター（SM）とプロダクトオーナー（PO）の兼任
- ↑のよくわからない存在が、devチームに指示をしている
- devチームが仕様を知らない

### どうしたらよかったか？

- SMとPOは、違う人が負うようにする
    - プロジェクトマネージャー≠SM、プロジェクトマネージャー≠PO
        - SMは、チームがスクラムを推進することに責任を持つ人
        - POは、チームが生み出すプロダクトに責任を持つ人
- PBIで作るものの仕様や作り方を決めるのはdevチーム自身になるようにする

## 失敗４：自分だけをふりかえる

B「KPTでふりかえり、やるようになったで！」
C「K『ない』、P『体調不良でタスク進まなかった』、T『体調管理』」
D「K『ない』、P『仕様が分からなかった』、T『Aさんに聞く』」
A「K『ない』、P『質問攻めで仕様考える時間がない』、T『集中時間を作る』」
B「・・・」

### 何が問題？

- ふりかえりへの期待値がばらばら
- チームのことをふりかえっていない
- 課題に対するアクションが、不明瞭

### どうしたらよかったか？

- 期待値の擦り合わせ、なんのためにやるのかを明言/言語化
- チームで議論できるようファシる
    - スプリント内の出来事をチームで共有し、何をすると、次のスプリントがよりよいものになるかを考える
- SMARTの原則

## まとめ

ひどいね！

でも、今はもうちょい良く状態に出来ているので、これらは、ただの失敗ではなく成功への軌跡だったのです(ﾄﾞﾔｧ
Joinの結果を条件にテーブルの値を更新する

## あいさつ
むかし業務で必要になったSQLの小技？を紹介しようと思います。（初投稿です）

## 本題
### サンプルケース
* table1

|id  |name  |hoge  |
|---|---|---|---|
|1  |taro  |3  |
|2  |john  |6  |
|3  |kevin |10  |
|4  |saya  |1  |

* table2

|id  |piyo |grade  |
|---|---|---|---|
|1  |5  |2  |
|2  |9  |3  |
|3  |8 |5  |
|4  |7  |2  |

以上のような二つのテーブルがあり、なんらかの事情でgradeが2の人のみ、table1のhogeの値をtable2のpiyoの値と一致するよう更新する必要が出たとしましょう。
この作業を一括で行いたいときどうしたらよいでしょう。

```sql:oracle
update
    (SELECT a.hoge hoge,
         b.piyo piyo,
         b.grade grade
    FROM table1 a
    INNER JOIN table2 b
        ON a.id = b.id) SET hoge = piyo
WHERE grade = 2;
```

上記SQL実行後table1は以下のようになります。

|id  |name  |hoge  |
|---|---|---|---|
|1  |taro  |**5**  |
|2  |john  |6  |
|3  |kevin |10  |
|4  |saya  |**7**  |

結合したときgradeが2だったtaroとsayaの2レコードのhoge値が、table2のpiyo値で更新されます。
ポイントは結合しているサブクエリ内のselect句で各カラムに別名をつけていることです。
なぜならサブクエリの外側で必要になるからです。
ちなみに別名の付け方を見ればお気づきと思いますが、これはoracleでの書き方です。
oracleではupdate句の中でjoinが使えません。(できるバージョンもあるかもしれません、、)


SQL serverの場合は

```sql:SQLserver
UPDATE table1 SET a.hoge = b.piyo
FROM table1 AS a
INNER JOIN table2 AS b
    ON a.id = b.id
WHERE b.grade = 2;
```
こんな感じで割と素直に書けるようです。
postgresだと、また違った書き方だったような気がするのですが、ぱっと出てこないので割愛します。

## 余談＆思い出話
こういった作業が必要になったのが1年以上昔のはなしなので、実際どういう場面だったか正確には覚えていないのですが、軽いネタにはちょうどいいかと初投稿してみました。
当時はVB.NETとoracleを使った市役所向けパッケージをやっていて、レガシーな環境にうんざりしていましたね。
とはいえこのような学びはちょこちょこあったのですが。わたしは最近SQLを直接書く機会があまりないですね。

ちなみにサンプルケースのテーブルがクソってのは置いといてください。
このようなSQLが必要になる場面はテーブル設計がちゃんとしていればあまりなさそうですよね。
SQLを見てしまえば「なんだ単純じゃないか」という話ですが、どうしたらいいかちょっと悩んだ記憶があるので記事にしました。

それでは。
commandでファイル拡張子の一括置換

commandちょっとメモ

ルール
ren 一致させるパターン *変更後の拡張子

###sample_filenameがつく.jpgを .pngへ

```
ren sample_filename*.jpg *.png
```

### .jpg 全部を .pngへ

```
ren *.jpg *.png
```
Python のネストした内包表記

結論: ネストした内包表記のどちらが内側か忘れたら、for ループで書き下した時の順序と同じと思い出す。なんども忘れるのでメモしました。

## 一重の内包表記

まず基本的な例。

```python
>>> [x * 2 for x in [1,2,3,4,5]]
[2, 4, 6, 8, 10]
```

`[変数を使った式 for 変数 in リスト]` のようにすると、リストのそれぞれの要素に式を適用したリストを作る事が出来ます。

```python
>>> {x: x * 2 for x in [1,2,3,4,5]}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10}
```

また `{変数を使った式: 変数を使った式: for 変数 in リスト}` のようにすると、リストではなく辞書を作る事が出来ます。

## 二重の内包表記

この順番をいつも忘れる。。。

```python
>>> [(x, y) for x in [1, 2] for y in ['a', 'b', 'c']]
[(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c')]
```

このように `.. for .. in ..` は二重に重ねる事が出来ます。この場合、後に書いた物が内側のループになります。この場合、後に書いた `y` が内側のループで、これが細かく回っている間外側の `x` がゆっくり回ります。覚え方としては

```python
>>> results = []
>>> for x in [1, 2]:
        for y in ['a', 'b', 'c']:
            results.append((x, y))
>>> results
[(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c')]
```

のように同じ順番で `for` ループを書いたのと同じ動きになります。

## 二重の内包表記を使った二重リストの展開

と、いうことは後ろのループで前の変数を使えるという事です。例えばネストしたリストを展開したい時、

```python
>>> [item for sublist in [[1,2], [3,4], [5,6]] for item in sublist]
[1, 2, 3, 4, 5, 6]
```

のようにします。一見技巧的ですが、以下と同じです。なんとなく前の `for` が内側のような気がしてしまいますが、外側です。

```python
>>> results = []
>>> for sublist in [[1,2], [3,4], [5,6]]:
        for item in sublist:
            results.append(item)
>>> results
[1, 2, 3, 4, 5, 6]
```

## 二重の内包表記を使った二重リストの式の適用

内包表記の `for` の前に内包表記を重ねると、リストの構造を変えないで内側の要素に式を適用する事が出来ます。

```python
>>> [[item * 2 for item in sublist] for sublist in [[1,2], [3,4], [5,6]]]
[[2, 4], [6, 8], [10, 12]]
```

これは単に式が書ける所に内包表記を書くだけなので直感的だと思います。念のため `for` ループで書くとこうなります。

```python
>>> results = []
>>> for sublist in [[1,2], [3,4], [5,6]]:
        subresults = []
        for item in sublist:
            subresults.append(item * 2)
        results.append(subresults)
>>> results
[[2, 4], [6, 8], [10, 12]]
```

## 参考

* https://docs.python.org/ja/3.8/tutorial/datastructures.html#list-comprehensions
iOSでスクショと録画をフックしてみる(過去記事の再投稿)

# どうやらスクショや録画をフックできるらしいのでやってみた


## スクショは取った後しかフックできない
UIApplicationUserDidTakeScreenshotNotification

```

    UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(self.view.frame.size.width/2-100,self.view.frame.size.height/2-100,200,200)];
    
    label.backgroundColor = [UIColor redColor];
    label.text = @"スクショ待ち";
    label.textAlignment = NSTextAlignmentCenter;
    
    [self.view addSubview:label];

    // いろんなイベントをフックできる、今回スクショを登録
    [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationUserDidTakeScreenshotNotification
                                                      object:nil
                                                       queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
                                                           //
                                                           label.text = @"スクショした";
                                                       }];
```

スクショ前
![IMG_5393.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275797/b2b9e723-799a-f4d5-6c3b-7abe9eac4d24.png)

スクショ後
![IMG_5394.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275797/82d1fde1-573f-15ca-6958-f1f12e5e5db2.png)

## 使い所
Twitterや画像、動画をみれるサービスなどでスクショしたことを投稿主に伝えたりスクショした人に警告を出したりできる。

ユーザーに不親切でもいいなら、スクショ後に数秒置いて写真アプリの最後の画像を消せばスクショの画像を消すことができる(オススメしないが)

---
# キャプチャ

録画のイベントをフックできます。
ちなみに、Macを通してのQuickTimeでも反応します。

UIScreenCapturedDidChangeNotification

```
- (void)viewDidLoad {
    [super viewDidLoad];
    // 画像のロード
    UIGraphicsBeginImageContext(self.view.frame.size);
    [[UIImage imageNamed:@"rec.png"] drawInRect:self.view.bounds];
    self.recImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    // 録画イベントの感知
    [[NSNotificationCenter defaultCenter] addObserverForName:UIScreenCapturedDidChangeNotification
                                                      object:nil
                                                       queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
                                                           // 録画イベント変更
                                                           [self captureStatusDidChange];
                                                       }];
}
- (void)captureStatusDidChange
{
    NSLog(@"UIScreenCapturedDidChange");
    //録画中ならRec画像をだす
    if ( [[UIScreen mainScreen] isCaptured] ){
        self.view.backgroundColor = [UIColor colorWithPatternImage:self.recImage];
    }
    // 元に戻す
    else{
        self.view.backgroundColor = [UIColor whiteColor];
    }
}
```

動画
![May-11-2018 11-40-28.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275797/e819ae0c-cc0a-561e-ed7e-985132cf3357.gif)


## 使い所
これを使えば、このゲーム名の名前を下に入れたり、URLを入れたりできる。
後画面を制御できるので全部を真っ黒にして録画禁止にするアプリを作ることができる。
(スクショと違って先に処理を実行できるため)

---
【覚書】Nginxで複数のCORSとpreflightに対応する

Nginxで複数のAccess-Control-Allow-Originとpreflightに対応する方法

## やり方

複数のAccess-Control-Allow-Originヘッダーを出すことはできないので、mapディレクティブで複数のAccess-Control-Allow-Originのドメインを動的に変更する。

CORSとpreflightについての詳しい説明は割愛します。

なお、あくまで**例**です。
詳細な設定はきちんと調べましょう。

## 例


許可するドメインと一致した場合に$cors変数に$http_originをmapします。

``` nginx.conf
map $http_origin $cors{
  "https://external01.example.com" $http_origin;
  "https://external02.example.org" $http_origin;
}

location / {
    root      /var/html;
    try_files $uri /index.html;
    index     index.html;

    # preflight対応
    include conf.d/pf.conf;
}

## SNIP ##

    add_header Access-Control-Allow-Origin $cors always;    
    add_header Access-Control-Allow-Credentials true;
```

preflight対応のincludeファイル

``` pf.conf
# preflight対応
if ($request_method = 'OPTIONS') {
  add_header Access-Control-Allow-Origin $cors;
  add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
  add_header Access-Control-Allow-Headers '*';
  add_header Access-Control-Max-Age 7200;

  add_header Content-Type 'text/plain charset=UTF-8';
  add_header Content-Length 0;

  return 204;
}

```
pandas使うときに便利だったものまとめ

この記事は[古川研究室 Advent_calendar](https://qiita.com/advent-calendar/2019/flab) 3日目の記事です。
本記事は古川研究室の学生が学習の一環として書いたものです。内容が曖昧であったり表現が多少異なったりする場合があります。

# はじめに
本記事では私がデータ整形でpandasを用いた時に便利だったコマンドのまとめをしようと思います。
プログラム初心者がお送りする内容なので暖かい目で見ていただけると助かります^^

# 本文
```python:
import pandas as pd

df=pd.read_csv('ファイルパス')
```
基本的にはこれでcsvを読む
実際にはいくつものファイルを読み込まないといけない状況もあるはずなのでそんな時に使った方法を下に示します。


## 複数のファイルをまとめて読み込んでしまいたいとき
```python:
import glob

# 同じ階層
file_pass = glob.glob('*.csv')

# 階層も指定できる
file_pass = glob.glob('○○/○○/*.csv')
```
これで指定した階層にある.csvファイルのパスをとってこれます。
○○/○○　というディレクトリに
data_1.csv , data_1.txt , data_2.csv , data_2.txt
が存在している場合は

```python:
[○○/○○/data_1.csv,○○/○○/data_2.csv]
```

が返されます。
あとはfor文で

```python:
counter = -1
for i in file_pass
    df = pd.read_csv(i)
    counter = counter + 1
    # なにか操作を加えて
    # 保存しなおし、indexなしで保存する場合はindex=Falseを付ければ良き
    df.to_csv('new_name_{0}.csv'.format(counter))
```

と一気にデータ整形できます(to_csvやらcounterとかはてきとう)

## os
名前つけるときとかに便利なのがこれ

```python:
import os

# ()の中のパスを持ってこれる"../"でこのコード書いてる場所の一個上参照したりとか
path = os.path.abspath(filepath)

# パスのうちファイルネームを持ってこれる
# globと合わせて使うと便利だった
name = os.path.basename(filepath)

# 拡張子もいらないよって時に.でsplitして分割しちゃう
name = name.split(".")
name = name[0]
```

## まとめ
globとosつかうと一気にcsvファイル読み込んで同じ操作加えるのが楽だよって話でした。
自分でやってる際に思ったことなんですが、pandasの操作自体は"pandas ○○"って感じでググればでてくるのですが、pandasの機能なのかpythonのライブラリなのか判断つかなくてうまく検索できないって状況が多かったです。
何ができるのか程度は知っておいて適切にググる力をつけていきたいです╭( ･ㅂ･)و
#Linux の touch でファイル作成をする時にディレクトリが存在しなくてもエラーを起こさない mkdir -p みたいなエイリアスを作る

# settiing

以下をコンソールで直接実行

あるいは

~/.zshrc ~/.bashrc などにエイリアスを登録して関数を作る

```
function touchp() { mkdir -p $(dirname "$1"); touch "$1"; }
```

# execute

```
touchp ~/too/deep/dir/dir/dir/file.txt
```


# Ref

[mkdir + touch を実現するコマンドinstall - Qiita](https://qiita.com/kshiva1126/items/43a4af1fef0f42db2c12)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
How to make file with touch without error on not existence deep directory ( we need like mkdir -p option  )

# settiing

execute on your console bellow command
OR
register to ~/.zshrc ~/.bashrc 

```
function touchp() { mkdir -p $(dirname "$1"); touch "$1"; }
```

# execute

```
touchp ~/too/deep/dir/dir/dir/file.txt
```


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【VSCode】VSCodeでタブが上書きされてしまい一つしか表示されない人のための解決策

# 現象
- 突然VSCodeのタブが切り替わらない現象が起きた [ここ](https://stackoverflow.com/questions/50827846/how-can-multiple-files-be-opened-in-visual-studio-code-vsc)のgifが状況がかなり近い
- とにかくファイルをクリックすれどもすれどもタブが上書きされてしまいイライラが募る
- 以前同じような現象に遭遇した時に `workbench.editor.enablePreview` , `workbench.editor.enablePreviewFromQuickOpen` を `false` にしたら解決したので、今回も設定をfalseにしていたが、タブが上書きされてしまっていた

# 原因
- `workbench.editor.showTabs` が `false` になってしまっていた。
- `workbench.editor.enablePreview` はあくまでpreviewを表示するかの設定なのでタブを表示しない設定にしていたら表示されるわけがなかった

# 解決策
- vscodeの設定画面を開く(`cmd + ,` , メニューから環境設定, `cmd + shift + p` → Preference: Open User Settings)
- 検索欄に `showtab` を入力
- `Workbench > Editor: Show Tabs` を有効にする（previewがうざい人は`workbench.editor.enablePreview` , `workbench.editor.enablePreviewFromQuickOpen` を `false` にする）
- これでタブが元どおり表示されるようになっているはず

# 最後に
こんな簡単な設定だけど、先入観によりその設定を見つけられなかったので、同じような問題に遭遇した人の少しでも助けになればいいと思う

# 参考
- [Open files always in a new tab](https://stackoverflow.com/questions/50827846/how-can-multiple-files-be-opened-in-visual-studio-code-vsc)
- [VSCodeでファイルを開いた時にタブが上書きされる問題を回避する](https://qiita.com/kgoto/items/265e3eb8a82778e33cfe)
ブラウザでbase64エンコードしたPDFファイルを表示する

## 概要

ブラウザでbase64のPDFファイルを表示する。

## 実装

HTML5の標準機能で実装可能。
↓の `!!!!ここにbase64エンコードしたPDFファイルの文字列を入れる!!!` 部分にbase64エンコードしたPDFファイルの文字列を入れる。

```html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8" />
  <title>Document</title>
</head>

<body style="height: 100%; width: 100%; overflow: hidden; margin:0px; background-color: rgb(82, 86, 89);">

  <embed style="position:absolute; left: 0; top: 0;" width="100%" height="100%" type="application/pdf"
    src="data:application/pdf;base64,!!!!ここにbase64エンコードしたPDFファイルの文字列を入れる!!!" />

</body>

</html>
```

## おまけ

base64エンコード用のコマンド。

```bash
base64 -w0 Untitled-1.pdf > tmp.txt
```
git add -pで分割コミットしようとするとlint-stagedでエラーになる

# 症状
git add -pなどして「partially staged」した状態からgit commit経由でlint-stagedをすると、エラーになった。lint-stagedのバージョンは9.2.3で確認

```bash
$ git commit
husky > pre-commit (node v11.13.0)
Stashing changes... [started]
Stashing changes... [completed]
Running tasks... [started]
Running tasks for *.js [started]
eslint --fix [started]
eslint --fix [completed]
git add [started]
git add [completed]
Running tasks for *.js [completed]
Running tasks... [completed]
Updating stash... [started]
Updating stash... [completed]
Restoring local changes... [started]
Restoring local changes... [failed]
→ Command failed with exit code 128 (Unknown system error -128): git checkout-index -a
Command failed with exit code 128 (Unknown system error -128): git checkout-index -af
husky > pre-commit hook failed (add --no-verify to bypass)
```

これが起こると、lintが異常終了していて以下の状態になる。

- add -pして分け分けしたdiffを持つファイルが全部add状態になる
- 一部のファイルがworkdirからなくなる (たまたま作業中のファイルに当たると悲惨?)

# 原因と解決策

別端末で自動ファイル更新検知と再ビルドが走っていると、それと競合することが原因の模様。`npm run serve`経由で開発用httpサーバーを動かしていた。

解決策はシンプルに開発用httpサーバーを都度止めてgit操作をする。ちょっと面倒だがとりあえずデータロストの心配はなくなる。

# 参考 & 解決策ではなかったもの
- そもそもpartially stagedなdiffをlint-stagedが扱えるようになったのは[ver.8以降](https://qiita.com/shohei_ot/items/05a380b7c2d79ab7b692)。[その基本アリゴリズムはこちらの通り](https://medium.com/hackernoon/announcing-lint-staged-with-support-for-partially-staged-files-abc24a40d3ff)。
- partially stagedなdiffとlint-stagedの組み合わせに関するバグが`lint-staged@9.5.0`で[修正されている](https://github.com/okonet/lint-staged/issues/565#issuecomment-548313663)そうなので、それにアップデートしてみたが、本投稿の件は解決しなかった。よく見るとエラーメッセージが違う。ちなみにこのバグは本投稿の事象のエラーメッセージ中の`git checkout-index -af`で検索をかけて発見した。
- エラーメッセージ中には`--no-verify`しろと書いてあるが、それをやると当然lintが通らないので回避は可能だが解決策にはならない。
OpenCV で'美顏'してみた

お久しぶりです．
そろそろ投稿しないとマズイかなと思って，約9ヵ月を投稿した．
今回は，pythonのOpenCVを使って'美顏'のコードを書いて試しました．
ぜひ試して画像'美顏'する前後を比較してください．

# コード
```python
import cv2

image = cv2.imread('photo.jpg')
value = 20
image_dst = cv2.bilateralFilter(image,value,value * 2,value / 2)
cv2.imwrite('new_photo.png',image_dst)
cv2.namedWindow('image')
cv2.imshow('image',image_dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

#コード説明
### OpenCVをインポート
```python
import cv2
```

### 画像を読み込む
```python
image = cv2.imread('photo.jpg')
```

### 画像を美顏 value値が大きいほど美顏効果が強い，小さいほど美顔効果が弱い
```python
value = 20
image_dst = cv2.bilateralFilter(image,value,value * 2,value / 2)
```

### 新規画像をファイルに保存する
```python
cv2.imwrite('new_photo.png',image_dst)
```

### windowを作る
あらかじめウィンドウを作成しておき，後から読み込んだ画像を表示させたい場合
cv2.namedWindow(window_name, flag) を用いる

```python
cv2.namedWindow('image')
```

### windowを開く
```python
cv2.imshow('image',image_dst)
```

### windowを待機
入力待ち時間でミリ秒単位

```python
cv2.waitKey(0)
```

### windowを閉じる
現在までに作られた全てのウィンドウを閉じる関数です．
特定のウィンドウのみを閉じる場合は cv2.destroyWindow() 関数に閉じたいウィンドウ名を指定してください

```python
cv2.destroyAllWindows()
```

以上で，今回の「OpenCV で'美顏'してみた」が終わります．
読んでいただいてありがとうございます．
Azure WebAppsでIP制限をつける

# 概要

Azure WebApps 便利ですね！
でも、作っては捨ててという開発スタイルが全盛の中、できれば停止している間は課金されたくないとなると、毎回WebAppsを作り直しということになります。

さらに、開発途中のものは、特定の箇所からしかアクセスさせたくない、というような要望があるときには、
IP制限をしようと思っても、azコマンドでは現時点（2019年12月3日現在）できない仕様となっています。

https://docs.microsoft.com/ja-jp/azure/app-service/app-service-ip-restrictions#programmatic-manipulation-of-access-restriction-rules

> 現在、新しいアクセス制限機能向けの CLI または PowerShell はありませんが、Resource Manager のアプリ構成で Azure REST API の PUT 操作を使用して値を手動で設定できます。 たとえば、resources.azure.com を使用して ipSecurityRestrictions ブロックを編集して、必要な JSON を追加することができます。

開発環境をつくるのにAzure DevOpsを使っていまして、Azure Pipelineによくお世話になっています。
今回は、Azure PipelineからAzure cliを使ってIPアドレス制限つきのWebAppsを立てる方法をご紹介します。


# 作業内容

## サービスプリンシパルの取得

こちらのような方法に従って、サービスプリンシパルを取得します。

https://qiita.com/TsuyoshiUshio@github/items/76edcc19ee4193a1ce6a#service-principal-%E3%81%AE%E4%BD%9C%E6%88%90

欲しいのは、client_idとclient_secretの２つです。


## PipelineのAzure cliにて

### 認証トークンの取得

```
echo 'Getting a authentication token.'
token=$(curl -X POST https://login.microsoftonline.com/${TENANT_ID}/oauth2/token  \
  -F grant_type=client_credentials \
  -F resource=https://management.core.windows.net/ \
  -F client_id=${CLIENT_ID} \
  -F client_secret=${CLIENT_SECRET} | jq -r .access_token)
```

`${TENANT_ID}`には、AzureのテナントIDを、`${CLIENT_ID}`, `${CLIENT_SECRET}`には先ほどのサービスプリンシパル作成手順で取得した２つの項目を入れます。
後のgrant_typeやresouceについては、固定値です。

このようにすると、認証トークンがtokenに格納されます。

### WebAppsの作成

```
echo 'Create a webapps'
# webappの作成
az webapp create -g **** \
                 -p **** \
                 -n **** \
                 -i **** \
                 --subscription ${SUBSCRIPTION} 
```

WebAppの作成を行います。ここは特に説明は不要かと思うので省略します。

### firewall設定の追加

Azure PipelineのAzure cliではcurlが標準で使えるので、先に取得したOAuthのトークンを使ってREST APIを呼び出します。

```
echo 'Add a firewall settings'
curl -X PUT https://management.azure.com/subscriptions/${SUBSCRIPTION}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Web/sites/${WEBAPP_NAME}/config/web?api-version=2018-02-01 \
        -H 'Content-Type:application/json' \
        -H 'Accept-Encoding:gzip,deflate' \
        -H "Authorization: Bearer ${token}" \
        -d @- << EOF

{
  "properties": {
    "ipSecurityRestrictions": [
      {
        "ipAddress": "xxx.xxx.xxx.xxx/32", "action": "Allow", "tag": "Default", "priority": 100, "name": "HOGE"
      },
      {
        "ipAddress": "yyy.yyy.yyy.yyy/32", "action": "Allow", "tag": "Default", "priority": 300, "name": "BAR"
      }
    ]
  }
}
EOF
```

|項目|値|備考|
|---|----|------|
|${SUBSCRIPTION} | AzureのサブスクリプションID | 契約固有のID |
|${RESOURCE_GROUP} | WebAppsを作成したリソースグループ名 | 先に作成したWebAppsとあわせる |
|${WEBAPP_NAME} | WebAppsの名前 | 先に作成したWebAppsとあわせる |
|${token}| 認証トークン | 「認証トークンの取得」の項目で取得した値 |

この表のようにエンドポイント、ヘッダー情報を埋めましたら、あとはjson本文に指定したいIPアドレス情報を記載します。
このjsonについては、画面で設定できる項目と同じなので、すぐにイメージできるかと思います。


# おわりに

いつか、こんな面倒くさいやり方をせずともazコマンドでできる日がくるかと思います。
いますぐfirewallの設定をAzure Pipelineからやりたい！という稀有な人に役立つと良いかなぁ
【Git】SourceTree嫌いがよく使うgitコマンド

#【Git】SourceTree嫌いがよく使うgitコマンド

この記事は「ちゅらっぷす Advent Calendar 2019」の3日目です。
https://qiita.com/advent-calendar/2019/churapps

##SourceTree嫌い

えー唐突ですが私、**SourceTree**が嫌いでして。
嫌いな理由はいくつかありますが、周りと同調できないダメな人間です。
そもそもGUIに苦手意識があって予告なくUIの変更などがあるともうキレそう。というかキレてます(苦笑)

基本的なコマンドばかりですが、SourceTreeを利用し続けていたら知らなかったかもしれないオプションも紹介しますので是非お付き合いください。

##clone

```bash
## base branchを参照、フォルダ名はリポジトリ名依存
$ git clone リポジトリ名

## ブランチを指定、指定のフォルダ名でcloneする
$ git clone リポジトリ名 -b ブランチ名(省略時はbase_branch) フォルダ名
```

ブランチ、フォルダ名指定オプション付きで`git clone`します。

##diff

```bash
## ファイル差分
$ git diff
```

「どのファイルにどんな変更加えたっけ？」って時に使ってました。
`git add`する直前とかですかね。
現在ではVSCodeのプラグインで差分や履歴が一目瞭然なのであまり使う機会はなくなりました。

##status

```bash
## 変更点の確認
$ git status
```

変更、削除、新規ファイルなのか見る際に利用します。

##remote

```bash
## リポジトリのプッシュ先などを確認
$ git remote -v
```

複数案件を並行で進めてる時が多いので、「これ本当に〇〇案件のリポジトリでPush先もおかしくないよな？」と不安になった際につかいます。

##branch

```bash
## 現在のブランチ
$ git branch

## remote含む全てのブランチ
$ git branch -a
```

checkout後に確認のために利用することが多いですかね

##checkout

```bash
## ブランチの切り替え
$ git checkout ブランチ名

## ブランチを作成しつつ切り替え
$ git checkout -b ブランチ名
```

Checkoutの際に`-b`オプションで、新規でローカルブランチを作成しつつCheckoutできます。

##commit

```bash
## 通常のコミット(add済み)
$ git commit -m "動かないけどマージしたい"

## addも一緒にするcommit
$ git commit -a -m "なぜか動くからリリースしようぜ"
```

`git add`が面倒なので僕はだいたい`-a`オプション付きでCommitします。


## push

```bash
## 通常
$ git push

## 新規ローカルブランチ
$ git push --set-upstream origin ブランチ名
```

新規ローカルブランチで`git push`すると`--set-upstream`オプションつけろなどと怒られますね。
ちなみに後者の方でpushすると、プルリク用のURLが発行されるのでリンクにアクセスするだけでプルリク作成画面へ飛べます。便利。

##GUIを使わない理由

多分ですけど、「コマンドで仕事してる俺カッケェェェ」って思ってるんだと思います笑
でも正直、コマンドベースで動きをある程度覚えてからGUIツールを利用した方が理解度高まるんじゃないかなと思ってます。

上記で紹介したコマンドはどれも基本的なものですが、オプションがややこしいので何か気になる点などございましたらご指摘ください。
プログラム案という名の思いつき

たったいま思い付いたのは、

**自宅に帰ってきたら「お帰りなさい」とポップアップを出すアプリ**

です。「お帰りなさい」のメッセージを変えられるようにしておくことで、

- 「帰って来たらまず手洗いとうがい！」
- 具合が悪くて伏せてるときに「こういう事情なんで静かにお願い」
- 「頼んだアレ、やってくれた？」
- 「冷蔵庫のアレをチンして食べてね」

みたいな伝言を、**帰宅した人に帰宅したときに伝える**ことができないかなと。よく家人が熱を出すもので、帰るなり氷嚢の中身を入れ替えるなんてことを頼まれることが多く…。眠っているところを起こして「氷嚢大丈夫？ 湯たんぽまだ平気？」みたいなことを聞くのもどうかなと思うので、投げられるときにメッセージを投げておけるようにしておけないかなと。

で、これを応用して、家を出た瞬間に**「●●忘れてない？」**みたいなお知らせを自分あてに出すこともできるかもしれないなあと。

これをやろうとすると、どうせ宅内でサーバーを動かす必要がありそうなので、クライアントでポーリングさせといてつながったら帰宅したと見なし、切れたら外出したと見なす、みたいな感じにできないかなんて考えてます。

とはいえ、外出中ずっとポーリングするのも無駄だしなあ。位置情報と組み合わせて、自宅に近付いたらサーバー探し始めるみたいなことをしないとなると、~~ハードルは高そう~~勉強のし甲斐がありそうではある…。
ローカル環境におけるRaspberry piの固定IPアドレスの設定をした(有線LANver)

# 初めに
実験をする際に必要になったのでメモ
何かしら必要になった際に役立てていただけると幸いです(二度とこんなことしたくない...)
今回記事にするのは**有線LANver**です!
## ローカル環境とは?
外部に公開されていないネットワーク環境のこと。(例: 社内ネットワーク)
接続を許可されていない外部からはローカル環境に接続できないようになっている。
## Raspberry piとは?
小型コンピュータである。デスクトップPCやノートPCより一回りも二回りも小さいサイズとなっている。その小ささゆえ、IoTセンサ等によく使用されている。
## IPアドレスとは?
機器における住所。通信においてなくてはならない存在。**これが無いとネットワーク通信ができない!!**
#ローカル環境におけるRaspberry piの固定IPアドレスの設定  
まず下記のコマンドを端末上で打つ
```sudo nano /etc/dhcpcd.conf```
そうするとdhcpcd.confファイルの中身を見ることができる。
そして、そのファイルの終わりぐらいに```#static ip```の記述がされていると思う![スクリーンショット (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543561/a40b2704-d859-28ca-bc31-328c31c86eae.png)この画面になったら, eth0の下に、
```static_ip_address = 192.168. ...
   static_routers = 192.168. ...
   static_domain_name_servers = 192.168. ...
```
と書いて欲しい。```192.168. ...``` はローカル環境のIPアドレスとなっているので、ローカル環境内ではそのように打って欲しい。IPアドレス名の設定は別の人が書いた記事を見て欲しい。
後は```sudo reboot```すれば終わり
#あとがき
「ローカル環境内のRaspberry piでIPアドレスが変化するー(泣)」という人は**ぜひこの方法を初めに試して欲しい。** 
```cd /etc/network/interfaces```の方法を試すのは後でいいと筆者は思う。
また、誰かが無線LANverを書いてくれることを切に願う...
#追記
もし, 「1秒でも早く解決したい!」「そんな面倒な方法はやりたくない!」という人は, 一時的にIPアドレスを変更する方法があるのでそれを使用するのがいいと思う。
コマンドはこう
```sudo ip addr add <ipアドレス名> dev eth0 ```
で使用できるはず...
Android 2.xなどで基本認証が通らないときのTIPS

# 話題：ベーシック認証のトラブル
Android 4.x以降では発生する頻度が下がったが、Android 2.x時代に頻発したトラブル。
> **基本認証で保護したページを、他の端末からは閲覧できるのに、
Android 2.xの端末からだけは閲覧できない**

何回id/pwを入力しても、幾度でも尋ね直してくる無間地獄。

#解決方法
##前提
| URI | ユーザ名 | パスワード |
| :-- | :-- | :-- |
| https://foo.net | user | password |
の場合
##解決方法
```
https://user:password@foo.net
```
これだけ。
もしSSL未対応なら

```
http://user:password@foo.net
```
でも全然OK。

いったんこのURIでアクセスした後は既に認証が通っている状態になるらしく

```
https://foo.net
http://foo.net
```

とアドレス欄の内容を修正してから再アクセスしてもid/pwを尋ね直されることは、もう、ない。

#注意点・リスク

* idとpwの文字列が（リクエストURIとして）インターネット上を流れていく、ということの危険性を理解し、割り切ったうえで使用せねばなりません。
* ひとたび```https://user:password@foo.net```でアクセスすると、サイト内の遷移リンク、たとえば```<a href="directory">link</a>```を押下しても、```https://user:password@foo.net/directory/```という具合にホスト名の前に```user:password```が**ズ～ッ**とついて来続けます（外れません）。
    * つまり、その試験中のスクリーンショットを開発チーム内で共有したりすると、ついでにid/pwを喧伝しているようなことになります。**危険**。

*あとがき

[ベーシック認証をURLに直接書く](https://qiita.com/ngkazu/items/6da021edf177f40e1f26)
を参照にしました。というかこのテクニック自体は他の場面で以前から利用していたけれど、 Android 2.xでのトラブルに効く、と教えてくれたのは仕事場の同僚のおかげです。感謝。
Oracle VM VirutualBoxとCent OS 7で作った環境を別のパソコンに移す

#どんな人向けの記事か
新年に向けてのカウントダウンが迫ってきました。来年から新しい世界に飛び出していくという方もたくさんいらっしゃると思います。
そういった方の中でCent OSで作った仮想環境を作り直すのが面倒くさいと考える方がいらっしゃるでしょう。その際に、別のパソコンに仮想環境を引き継ぐのってどうやるのっていう方にむけて生地を書きました。
#記事を書いた理由
　先日、PythonでCartopyという地図用のモジュールをインストールしようとしたところ、長文のエラーが出てしまい、インストールができないという問題が発生しました。原因はqiitaで質問して教えていただいたのですがhttps://qiita.com/Daisuke__/items/99de0098ec5668070f75 にあるようにcondaとpipという二種類のモジュール導入のコマンドを使うと環境が壊れてしまうことがあるようです。私はモジュールをインストール際にGoogle先生に「～のインストール」のような形で検索し、記事が新しいものを見ながら導入するということを行っていたため、知らないうちにこのタブーに触れていたようです。そこで、これを機に新しい環境を作ろうと思ったのですが、**マウスの統合や画面の自動リサイズがうまくいかないという問題**に直面しました。Linuxを使い始めた初期のころにネット記事を見ながら設定したのですが、どうやってやったのか忘れてしまいました。幸いpipとcondaを混ぜる前の仮想環境クローンが残っていたので、それを使ってモジュールの導入には成功したのですが、気が付いたのが、**あれ？パソコン変わったら詰みじゃね?**ということです。後ほど、Guest Additionsの導入には成功したのですが、パソコンが変わる度に、仮想環境を作り直すのは面倒くさいので作った仮想環境を別のパソコンに移すということができないか試してみました。その際、初学者の私は若干てこずったのでログを兼ねて、記事を書きました。
#環境
元々Cent OSが入っている方のデスクトップが
**Windows10**でVirtualBoxの方がhttps://www.virtualbox.org からダウンロードした**VirtualBox 6.0.14**を使いました。
環境を移す方のノートパソコンも
**Windows10**と**VirtualBox 6.0.14**を使いました。
Windows→MacOSのように異なるOSをまたがっても大丈夫なのかは確かめていないのでやった方がいたら報告してくださるとうれしいです。(個人的にMacに買い替える予定があるため)
CentOS-7x86_64-DVD-1908、LiunxのRedhat64bitです。
#何をやったのか
**元のパソコンでの操作**
まず、現在使っているゲストOSがどこに保存されているのか調べました。

```
C:\Users\Owner\VirtualBox VMs\"名前"\"名前".vdi
```
に保存されているようです。Virtual Boxを開いて設定>ストレージ>コントローラー:SATAをクリックし、情報の中にある場所にファイルパスから確認できます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455763/625da55e-4f78-8e69-e5b3-c96086b7897c.png)

**注意**
16GBぐらいあるのでかなり重いです。SSDやUSBなどを使って私はファイルの移動を行いました。

これを保存し、操作はノートパソコンに移ります。
**移す方のパソコンでの操作**
まず、https://www.virtualbox.org からVirtualboxをダウンロードします。
次にCent OSをダウンロードします。Get CensOS Nowをクリックし、Older Version(下へスクロール)then click hereを押してバーションを７を選びます。最新のCent OSについては試していません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455763/82b917de-e267-1a4a-cbb3-3f793c0316a8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455763/e91a50df-17ca-d61e-875f-2937f66c1a4c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455763/aaf70609-1d47-cf7d-b608-098b97541871.png)
Cent OSはダウンロードしなくても保存したファイルの方に含まれているのかもしれないのでダウンロードの必要はないのかもしれませんが、念のためにダウンロードしておきます。
**仮想マシンの追加**
VisualBoxの「ツール」をクリックし、「追加(A)」を選択し、先ほど
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455763/19cd90f4-d918-261f-7954-9a9ee7ee418c.png)
先ほど保存したクローンを選択し、無事起動させると起動できした。

**追記**
私のノートパソコンの容量が100 GB中90 GB程度使っていたので外部SSDにクローンファイルを保存して起動させてみましたがサクサク起動したしました。パソコンやその他の環境にもよりますが、外部ハードディスクだと読み込みが遅くエラーが発生したのでSSDを使っています。

#終わりに
**マウスの統合とゲストOSの画面を自動リサイズする方法**については記事を投稿したので、そちらを参照してください。
https://qiita.com/8M5MgHqNywfgw7q/items/69235bc2b239573acdbd
疑似テスト（メッセージ関連）- Windows

# イベントログへの疑似メッセージ出力
基本的にはeventcreateで出力させる
## システム
### 重大
```
PS C:\Users\Administrator> New-WinEvent -Id 41 -ProviderName microsoft-windows-kernel-power -Version 1
警告: 指定されたペイロードは、イベント ID 41 で定義されたテンプレートと一致しません。
定義されたテンプレートは次のとおりです:
<template xmlns="http://schemas.microsoft.com/win/2004/08/events">
  <data name="BugcheckCode" inType="win:UInt32" outType="win:HexInt32"/>
  <data name="BugcheckParameter" inType="win:Pointer" outType="win:HexInt64" count="4"/>
</template>
PS C:\Users\Administrator>
```

### エラー

```
C:\>eventcreate /L system /T ERROR /SO test-source /ID 100 /D "テストメッセージ"

成功: 種類が 'ERROR' のイベントが、'system' ログ内に、'test-source' をソースとして作成されました。

C:\>
```

### 警告
```
C:\>eventcreate /L system /T WARNING /SO test-source /ID 100 /D "テストメッセージ"

成功: 種類が 'WARNING' のイベントが、'system' ログ内に、'test-source' をソースとして作成されました。

C:\>
```

### 情報
```
C:\>eventcreate /L system /T INFORMATION /SO test-source /ID 100 /D "テストメッセージ"

成功: 種類が 'INFORMATION' のイベントが、'system' ログ内に、'test-source' をソースとして作成されました。

C:\>
```




## アプリケーション
### 重大
m(__)m


### エラー
```
C:\>eventcreate /L application /T ERROR /SO test-ap /ID 100 /D "テストメッセージ"""""

成功: 種類が 'ERROR' のイベントが、'application' ログ内に、'test-ap' をソースとして作成されました。

C:\>
```

### 警告
```
C:\>eventcreate /L application /T WARNING /SO test-ap /ID 100 /D "テストメッセージ"

成功: 種類が 'WARNING' のイベントが、'application' ログ内に、'test-ap' をソースとして作成されました。

C:\>
```

### 情報
```
C:\>eventcreate /L application /T INFORMATION /SO test-ap /ID 100 /D "テストメッセージ"

成功: 種類が 'INFORMATION' のイベントが、'application' ログ内に、'test-ap' をソースとして作成されました。

C:\>
```


## セキュリティ
### 監査の成功
m(__)m

### 監査の失敗
m(__)m
p5.js - SVG文字列を読み込んで表示する

##動機
p5.jsライブラリを使い、SVG文字列を配置できるようにしたい

##実行環境
- [p5.js Web Editor](https://editor.p5js.org/)

##実行結果
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73194/9c26b70e-f73e-da93-f174-34434f602e68.png)

##サンプルコード
```javascript
let svgString = `<svg> .. 虎のSVG文字列..</svg>`
let img;

function convertBase64EncodedSvg(svgString) {
 return "data:image/svg+xml;base64," + btoa(svgString)
}

function preload() {
  img = loadImage(convertBase64EncodedSvg(svgString))
}

function setup() {
  createCanvas(512, 512)
}

function draw() {
  background(220)
  image(img, 0, 0, 512, 512)
}
```

##コード解説

###1.SVG文字列を用意する
```javascript
let svgString = `<svg> .. 虎のSVG文字列..</svg>`
```
ネット上によくある虎の絵をサンプルとして準備。(参考: [ファイル:Ghostscript Tiger.svg](https://ja.m.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Ghostscript_Tiger.svg))

そのまま使用すると画質が荒くなった。
svgタグにwidth,height属性を追記した結果綺麗になった。
```(<svg .. width="900" height="900"...>)```

###2.SVGのBase64変換処理を定義
```javascript
function convertBase64EncodedSvg(svgString) {
 return "data:image/svg+xml;base64," + btoa(svgString)
}
```
サンプルのため、SVGのみで定義。
PNGやJPGなどの分岐をもたせて汎用性を高くしておくといいと思う。

Base64画像変換も簡略化。
encodeURIComponentなどで各種文字に対応するなどの検討余地はあり。

###3. p5.jsで読み込んで実行
```javascript
let img;
```
画像の変数を定義。

```javascript
function preload() {
  img = loadImage(convertBase64EncodedSvg(svgString))
}
```
事前読み込み処理でBase64変換したSVG文字列をp5.jsのloadImage関数で読み込む。
こうすることでSVG画像をimageとして扱うことが可能になる。

```javascript
function setup() {
  createCanvas(512, 512)
}

function draw() {
  background(220)
  image(img, 0, 0, 512, 512)
}
```
あとはp5.jsのサンプルコードによくある処理。
imageを配置。(便宜的に512pxに設定)

##参考文献
- [Github issue - Support for base64 data #402](https://github.com/processing/p5.js/issues/402)
- [p5.jsリファレンス loadImage](https://p5js.org/reference/#/p5/loadImage)
スプラトゥーン2の戦績データを取得する+おまけ

これは[CAMPHOR- Advent Calendar 2019](https://advent.camph.net/)の7日目の記事です。6日目は@watamboさんの「[中目黒のコミュニティスペースCAMPHOR- BASEにみんなおいでヨ！](https://note.com/viking/n/n8562bca82f95)」でした


こんにちは。[@asamas](https://twitter.com/asamas27)です。あさますと読みます。
みんなが「リングフィットアドベンチャー」や「ポケモンソード」などを楽しんでいる中、僕は相も変わらずスプラトゥーン2をプレイしてます。


今回は、スプラトゥーン戦績管理アプリである「[ikaWidget2](https://play.google.com/store/apps/details?id=com.flapg.ikawidget2&hl=ja)」に記録されているデータを引っこ抜いて、簡単な分析などをしてみようと思います。

# .ikax -> .zip
ikaWidget2にはバックアップ機能があり、そこからファイルを出力すると、`asamas-20191204-1011.ikax`のようなファイルが作成されます。このファイルは拡張子を変えれば、そのままzipファイルとして読み込めます。
解凍すると、下の写真のように、info.jsonとstats.realmが見つかると思います。戦績データは、stats.realmの中に入っています。
<img width="470" alt="コメント 2019-12-06 162516.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251318/050462ca-de51-0a32-2a3b-746da3ad7727.png">

# realmファイルの内容をjsonに書き出す
[realm studio](https://realm.io/products/realm-studio/)をインストールします。stats.realmファイルを開いた後、File > Save Data > Jsonで書き出せます。~~この機能に気づかずに、realm (nodejs) 使おうとしてめちゃくちゃ時間とかしました~~

# 戦績データの解析

このデータを使って、自分の苦手ステージを調べてみました。
まずはjsonファイルを取り込みましょう

```python
# -*- coding: utf-8 -*-
import json

with open("results.json","r",encoding="utf-8") as f:
    result_json=json.load(f)
```

ルールごとの違いを調べます。下の例ではガチエリア(`splat_zonesgachi`)を調べています。ガチホコを調べたいときは`rainmakergachi`、ガチヤグラは`tower_controlgachi`、ガチアサリは`clam_blitzgachi`に変更してください。


```python
area_result={}

for item in result_json["Result"]:
    if item["udemae"]<9 and item["game"]!="splat_zonesgachi": #S以上の戦績に限定&ガチエリア以外のルールを排除
        continue
    for i in result_json["Stage"]:
        if i["ID"]==item["stage"]:
            stage_name=i["name"]
            
    if not stage_name in area_result.keys():
        area_result[stage_name]={"win":0,"lose":0}
    if item["win"]:
        area_result[stage_name]["win"]+=1
    else:
        area_result[stage_name]["lose"]+=1

for key in sorted(area_result.keys(),key = lambda x:area_result[x]["win"]/(area_result[x]["win"] +area_result[x]["lose"]),reverse=True):
    print(key,area_result[key]["win"]/(area_result[key]["win"] +area_result[key]["lose"]))
```

結果はこのようになりました。
ガチエリア
<img width="231" alt="コメント 2019-12-06 171637.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251318/03d69b76-5d70-caf6-fbb6-aa3a6df8841b.png">
ガチヤグラ
<img width="248" alt="コメント 2019-12-06 174034.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251318/fcce486f-02a0-fbcc-69a9-630784ce2081.png">
ガチホコ
<img width="233" alt="コメント 2019-12-06 174206.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251318/3cdef0a3-34b9-3730-eb3f-095c96f8e2c6.png">


モズク農園やニューオートロがどのルールでも上位に来ています。僕の持ちブキのクーゲルシュライバーで、得意とされているルールですね。一方でザトウ・チョウザメ・ムツゴロウなどの勝率は30~40%ぐらいなので、相性が悪いステージだとわかります。

# 今後
今回は時間がなくて中途半端な記事になってしまいましたが、ikaWidget2からデータを引っこ抜く方法はわかりましたので、LightGbmなどを使って、より詳しい分析ができたらと思います
AWS ド基礎なVPCを初心者でも分かるように簡単に説明

# VPCのイメージだけでも掴んでおこう
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/564ce2b3-efae-18e5-939b-73929c063272.png)


どうも．
最近ではオンプレよりも
クラウドが主流化してきましたね．


案件もお●前.comやロ●ポップを使って
構築してくれ！

なんて案件も偶にありますが，，，
大きい企業になるともっぱらGCP,AWSですね．

たまーに，Azureなんてありますが，
Azureは分からないので，AWSに強引に持っていきます．

どのクラウドベンダーでも構わないのですが，
アジャイル開発が主流になってきているので
**AWS認定**なんかあると，
チヤホヤされそうです．

ちなみに僕はAWS普段使ってるし受かるだろ〜
的なノリで受けて模試では半分しか点数取れませんでした．

本格的に勉強しだしたので，今月中にでもSAAをサクッと受かろうと思います．

自分が勉強していてしっくりこなかった分野は，**セキュリティネットワーク**でしたね．
（あまり実践に関わってこない）

それでは，VPC解説していきます．

## VPCとは
*バーチャルプライベートクラウド*
の略です．
一言で言うと，プライベートな仮想ネットワークでしょう．

オンプレ時使っていたルータやファイアウォールは必要なくなりました．

##VPC設定の流れ
![スクリーンショット 2019-12-03 15.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/53285118-71bd-2c36-9b79-402481b23400.png)

*1.VPC作成*
ここで重要なのは1点．
「**リージョンをまたいでVPC作成はできない**」
マネジメントコンソールにリージョン選択する場所がありますが，
そこは選択必須です．という事
![スクリーンショット 2019-12-03 15.51.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/b8930f43-8a88-41c4-5d59-fe1ca21c5d87.png)

*2.サブネットを作ろう*
![スクリーンショット 2019-12-03 16.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/0f6a3295-1480-6c43-aeca-ddc0b83006ee.png)

サブネットはネットワークの分割区分です．
重要なのは，**複数のアベイラビリティゾーンに跨がれない**，
と言う事
![スクリーンショット 2019-12-03 15.56.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/aea44960-9f7e-cb79-082c-7016ea438435.png)
サブネットには，
・プライベート
・パブリック
がありますが，インターネットへのルートありか無しかだけでございます．

CIDRというのはネットワーク状のIPアドレス割り当て数なのですが，
VPCのCIDR範囲>サブネットのCIDR範囲なら平気です．


*3.ルートテーブルを作ろう*
わかりやすく言えば，サブネットの**ルーティングを規定**します．
![スクリーンショット 2019-12-03 16.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/cc85b5f1-a260-c8fe-4492-3877ece1539d.png)

*4.ゲートウェイのアタッチ*
VPCからインターネットにアクセスをさせる作業です．
![スクリーンショット 2019-12-03 16.10.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/05aa18e2-3b33-eb80-af76-d25fc8655100.png)
これによって，サブネットがパブリック，プライベートが決められます．
ちなみに
初期状態（設定しない)はプライベート　．
設定するとパブリックです．

*5.セキュリティ設定*
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/adcc9c0f-d02a-00a9-99f5-7c721e003384.png)
AWSでは，
ファイアウォール　＝ セキュリティグループ + ネットワークACL（アクセスコントロールリスト）
で設定されます．

セキュリティグループとネットワークACLの違いは，
設定単位が違います．

前者は，インスタンス
後者は，サブネット単位で制御します．

また，模試に出たのは，
セキュリティグループ　→　　ステートフル (現状のデータを持ってる)
ネットワークACL  →　　　　ステートレス (持ってない)
つまり，**ネットワークACLには戻りのトラフィック設定が必要**です

個別に設定するならセキュリティグループ
一括ならネットワークACL 
と覚えましょう
ちなみにIAM管理者なら後から変更可能です．


補足
手を動かすと更に分かりますよ．
クライアントにEC2インスタンスにおける
セキュリティをかけるには，
セキュリティグループで通信はSSHだから22で送信先は00.00.00.000!!
(ポート番号
SSH -> 22
https ->443
http -> 80)
のように自由にできるところまで行くと，
SAAのセキュリティは怖く無いです．
ArchLinuxのアップデートでやらかした話

# はじめに
はじめまして。今さっきQiitaのアカウントを作りました。
この記事は、[ITRC Advent Calendar 2019](https://adventar.org/calendars/4759) の3日目の記事になります。
今回は、少し前にArchLinuxでyayを使ってアップデートをした時にやらかした話について書いていきます。

しょうもないオチだったので結論から言いますと、wget壊れてるんだからcurlに戻せばいいじゃんっていう話でした。

今回参考にした記事はこちら
https://wiki.archlinux.jp/index.php/Pacman_%E3%83%92%E3%83%B3%E3%83%88#wget

# 事の始まり
いつも通りアップデートをしたところ、ネットにしっかりつながっていない状態でアップデートをしてしまった。

# 起こったこと
アップデート事態は特に何も起こることなく終了したので再起動をしたところ、エラーがでてログインできなくなった。

```
/usr/lib/Xorg: error while loading shared libraries: libnettle.so.7: cannot open shared objectfile: No such file or directory
```
共有ライブラリが無いって言ってる？

# 原因を考える
ネットに完全に繋がらないうちにアップデートをしたということが大本の原因ではあるけれど、それによって何が起きたかを考えたところ、最初の接続が応答なしで進んでしまったため、部分的にアップデートをしてしまったと考えました。
調べてみても、同じようなことをやってしまった人がいるっぽい。

# 対処法を考える
1. アップデートされなかった部分をアップデートする
2. LD_LIBRARY_PATHに追加か、シンボリックリンクの作成(？)
3. ArchISOでchrootしてpacman -Syuする

この３つを試してみました。

# 実践
- アップデートされなかった部分をアップデートする
  - これに関しては、そもそもyayやpacmanが実行できないため、できなかった
- LD_LIBRARY_PATHに追加か、シンボリックリンクの作成(？)
  - 無理やり作成したけど駄目だった

なので、必然的に3番目の方法でやることに。。。

### ArchISOでchrootしてpacman -Syuする
ArchISOが入ったUSBを使ってBOOTする。

```
# mount /dev/sda3 /mnt
# mount /dev/sda1 /mnt/boot
# cd /mnt
#arch-chroot /mnt bin/bash　←bashシェルを起動
```

まずArchISOが入ったUSBをBOOTして、起動します。
/mntに/をマウント、/mnt/bootに/bootをマウントします。
その後/mntに移動してから、arch-chrootをします。

これを踏まえて`pacman -Syu`を実行してみると

```
/usr/bin/wget: error while loading shared libraries: libnettle.so.7: cannot open shared object file: No such file or directory
``` 
エラーがでて実行できない
wgetに必要なものがないとか言ってる

#### ちなみに
駄目だったのでpacstrapを試してみましたが、上記と同じエラーがでて駄目だった。

##### pactrapとは？
archリポジトリのCoreのbaseグループとbase-develをインストールすることができる。

# ここで。。。
ここまでやったときに、pacman.confのある記事を見つけました。

> wget
pacman に初めから入っている機能よりもパワフルなプロキシ設定が必要な場合、wget はとても使い勝手がよいです etc...

`XferCommand = /usr/bin/wget -c -q --show-progress --passive-ftp -O %o %u`

なので、pacman.confのwgetをコメントして、curlをコメントアウトする

```
pacman.conf

XferCommand = /usr/bin/curl -C - -f %u > %o
# XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
```

すると、無事にアップデートできました!

# 結論
wgetが使えないなら、pacman.confの設定をcurlに変えてからpacman -Syuをすればいいだけだったというオチ...
そもそもデフォルトの設定だとwgetじゃなくてcurl使うようになってるっていうのを知らなかった。

# まとめ
ただでさえ色々トラブルが起こるようなものなんだから、ちゃんを気をつけましょうっていう話でした。
Octaveの基本

### はじめに
 Qiitaで記事を書くのは初めてです。今回はOctaveの勉強をする機会があったので、まとめておこうと思います。主に自分用です。

# Octaveとは
　Octaveとは数値計算に用いられるフリーソフト。以下のような特徴を持つ。

- MATLABとの互換がある。
- ベクトルや行列の計算が得意
- Gnuplotを呼び出し、グラフィック機能を持つ
- double型で定義されており、宣言の必要はない

# 例
- 基本

コロンを使い、コロン前からコロン後まで1ずつ増やす。

```m
% x = 1 2 3 4 5
x = 1:5
```

コロンをもう一つ使い、コロン前からコロン後までコロン間ずつ増やす。

```m
% x = 1 3 5 7 9
x = 1:2:10
```


- ベクトル

　基本的にセミコロンで改行のイメージ。

```m
% 縦ベクトル
A = [1; 2; 3]
% 横ベクトル
B = [1 2 3]
% 正方行列
C = [1 2 3; 4 5 6; 7 8 9]
% 転置行列
D = [1 2 3]'

% 内積
E = B*A
% 要素和
F = C.+C
% 要素差
G = C.-C
% 要素積
H = C.*C

% 要素の指定
I = C(1,1)
```

- 文字

```m
S = 'オクターブ'
```

- 制御文

```m
%for文 1から10までカウントする
for i=1:10
    ...
endfor

%if文 xとyが等しいときに処理を行う
if x==y
    ...
endif    
```

- その他

```m
% 関数は分かるが、使用法が分からない
help 関数名
% 関数名が分からないが、使用したいことがわかるとき
lookfor 関数名
```

###おわりに
　自分の知らない言語だったため、少し手こずったが、慣れれば簡単そうだった。確かに数値計算がしやすいようになっていると感じた。また、グラフの描画等もあるようだったのでそのあたりも試してみたい。
基本情報技術者試験の勉強計画12月

# 基本情報技術者試験の勉強計画　12月
### 目標
・最後までやり遂げる
・暗記するまで解く
・体調管理をきちんとする
### 結果
・暗記するまで解いた
・体調管理をもっと気を付ける
## 振り返り
### keep
・暗記するまで解くこと
・過去問道場を毎日続けること
### problem
・睡眠時間が多いこと
### try
・毎日復習
## 週次計画
### [第7週(12/2週)](https://qiita.com/poohsan/private/13b4c6d9e25af7ce3a92)
### [第8週(12/9週)](https://qiita.com/poohsan/private/1cf8e77f25a06a8b1c20)
### [第９週(12/16週)](https://qiita.com/poohsan/private/9faddaf65f85aa91706e)
### [第10週(12/23週)](https://qiita.com/poohsan/private/0c99eafb00644bbd5a63)
### [第11週(12/30週)](https://qiita.com/poohsan/private/64ff28845e812f4c612e)
BOM付きのCSVインポート


こんにちは、エンジニアのミスダです。今回は、csvインポートでBOM付きのUTF-8の書き込み、読み込みに挑戦したことを記載します！

## 背景
業務系のシステムを開発していると一括で「データを作成したい！」って要望を受けます。。。
そんな時、私は、csvでのインポートを最初に考えます。APIを作成すると相手にも開発コストがかかりますしね。

**ここで結構問題になるのは、csvの編集方法です。**
*Microsoft Excel*を利用してないですか？やはり、編集しやすいですよね！

## 問題
*Microsoft Excel*の利用を考えて際に、Shift-JISでCSVを作成すれば編集できます。もし、DBがUTF-8だと、サーバー側で文字コードのコンバートが必要になります。こうなると、文字コードとの戦いです。正直、勝てる気がしません。

そんな時、BOM（byte order mark）付きのUTF-8であれば、*Microsoft Excel*で文字化けしないで開けるようです！

## BOM付きでUTF-8ファイルの生成
今回は、JAVAでファイルの生成します。UTF-8の場合は、ファイルの先頭が【0xEF 0xBB 0xBF】になります。

```
import java.io.*;
import java.util.Arrays;
import java.util.List;

public class Main {
    
    /**
     * BOM付きのCSVファイルを作成（文字コードはUTF-8）
     *
     * @param 
     * @return 
     */
    public static void main(String[] args) {
        File file = new File("ファイルのパス");
        List header = Arrays.asList("りんご","みかん","バナナ","イチゴ","メロン","ぶどう");
        try(FileOutputStream fos = new FileOutputStream(file);
            OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
            PrintWriter writer = new PrintWriter(osw)){
            //BOM付与
            fos.write(0xef);
            fos.write(0xbb);
            fos.write(0xbf);

            header.forEach(c -> {
                writer.print(c);
                writer.print(",");
            });
        } catch (IOException e) {
            System.out.println("ファイルの生成に失敗。");
        }
    }

}
```

## ファイルのインポート
生成したファイルが確実にBOM付きのUTF-8であればいいですが、そうでない場合もあります。判定を入れて読み込みします。

```
import java.io.*;
import java.nio.charset.StandardCharsets;
import org.apache.commons.codec.binary.Hex;


public class Main {

    /**
     * BOM付きのCSVファイルを読み込み（文字コードはUTF-8）
     *
     * @param
     * @return
     */
    public static void main(String[] args) {
        File file = new File("ファイルのパス");

        try (FileInputStream fs = new FileInputStream(file);
             InputStreamReader isr = new InputStreamReader(fs, StandardCharsets.UTF_8);
             LineNumberReader lnr = new LineNumberReader(isr)) {
            //1行目
            String row = lnr.readLine();
            if (row != null && !row.isEmpty()) {
                //先頭文字を取得
                String bom = row.substring(0, 1);
                //先頭文字をバイトを文字に変換する(Apache Commons CodecのHexクラスを利用)
                String bomByte = new String(Hex.encodeHex(bom.getBytes()));
                if ("efbbbf".equals(bomByte)) {
                    //BOMを排除
                    row = row.substring(1);
                }
                System.out.println(row);
            }
            //2行目から情報を分割する
        } catch (Exception e) {
            System.out.println("ファイルの読み込みに失敗。");
        }
    }
}

```

## まとめ
MacOS、WindowsOS共に、*Microsoft Excel*で開いて文字化けもしてないし、編集もできた！あとは、テキストファイルを利用して編集してくれてる方かなと思います。そこは、サポートしていくしかないかな。
基本情報技術者試験の勉強計画　第7週（12/2週）

## 目標と結果
### 目標
・暗記するまで過去問繰り返し解く
・最後まで気を抜かない
・寝不足にならない
### 結果
・暗記まではいかなかったが繰り返し解けた
・体調管理には気を付けた
## 振り返り
### keep
・毎日繰り返し解くこと
### problem
・昼夜逆転生活
### try
・苦手分野を理解する
・早寝早起き
Linux　コマンドを打った自分のログを取得していく方法

Linuxのログを取得する方法はいくつかあると思いますが自分がいつも実施する方法を記載します。

#１　.bash_profileファイル編集
「.bash_profileにscriptコマンドを実行するよう設定する」ことにより
自動で作業ログを保存することができます。

nano .bash_profile　viかnanoなどで編集してください。
.bash_profileに下記を追加します。

scriptコマンドはデフォルトファイル出力非同期のため
-fオプションをつけリアルタイムで出力しましょう。

```
nano .bash_profile
```

以下が出てきたら最終行に1行打ち込みましょう

```
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH
```

打ち込む内容は以下です。

```
script -q -f -a ../../etc/xxx/yyy.log
```

#２　ディレクトリ作成
一応丁寧に書いてます

まずpwdを

```
pwd
```

続いてホームから２階層上に移動します。

```
cd ../..
```

etcへ移動しましょう。

```
cd etc
```

#３　ディレクトリxxx　と　ファイルyyyを作成

```
mkdir xxx　ディレクトリ名
```
ディレクトリを作成したらファイルも作成しましょう

```
touch yyy.log
```

#４　logファイルの権限変更

以上です。
vimでファイルを開いたら常に新しいタブで開くようにする

いくつか方法はありますが、 以下に落ち着きました。
シンプルに新しいタブを開いてバッファを移動します。

```vimscript
function OpenFilesToTabs()
    if len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) > 1
      execute 'b # | tabnew | blast | bp'
    endif
endfunction
autocmd BufNewFile,BufRead * :call OpenFilesToTabs()
```