OmniAICreator/Qiita-1.07M huggingface dataset:
Azure ADとIntuneでデバイスを管理するための初期設定

## 前提知識
この設定を行うことで、デバイスをAzure ADへ参加させると自動的にIntuneにも情報が登録されるようになります。
同じタイミングでデバイス情報が登録されるため勘違いしやすいですが、Azure ADとIntuneに表示されるデバイス情報は別々に管理されています。（デバイスを削除する場合は、両方から削除してください）

わかりにくいので、デバイスを削除する場合は、Intuneでワイプするのが一番良い方法です。

## 手順

### Azure ADにデバイスが参加できるように設定
この設定により、Azure ADにデバイスを登録することが可能になります。

1. [Azureポータル(https://portal.azure.com)](https://portal.azure.com)を開きます。
1. 《Azure Active Directory》をクリックします。
1. 左側のメニューより《デバイス》→《デバイスの設定》の順にクリックします。
1. 「ユーザーはデバイスをAzure AD に参加させることができます」を「すべて」に設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/456d77ab-01a3-da45-ac8f-2c6287dbaa5b.png)
    1. 「選択済み」の場合はAzure ADに参加させるユーザーを選択してください。

### モバイルデバイス管理機関の設定
MDMにIntuneを利用するための設定です。

1. [Microsoft Endpoint Manager admin center](https://endpoint.microsoft.com/)(https://endpoint.microsoft.com/)を開きます。
1. モバイルデバイス管理機関を設定していない場合は、画面の上部にオレンジのバナーが表示されているのでそれをクリックします。
1. 右側に『MDM期間の選択』画面が表示されるので、《Intune MDM 機関》のオプションボタンを選択し、《選択》をクリックします。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/a9f7f5de-49cf-e54a-339a-b8b7e45a8358.png)

### Intuneの登録制限の設定
この設定により、IntuneにWindowsデバイスを登録することが可能になります。

1. [Microsoft Endpoint Manager admin center(https://endpoint.microsoft.com/)](https://endpoint.microsoft.com/)を開きます。
1. 左側メニューより《デバイス》→《デバイスの登録》→《登録制限》→《すべてのユーザー》の順にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/7cc994ec-fc0d-96f9-3fba-3c504c078cc1.png)
1. 『すべてのユーザー』画面で《プロパティ》をクリックし、「Windows(MDM)」を許可に設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/a3ceb298-881a-d0ef-ecaf-7d3b51efe7b5.png)

### Azure ADに参加とIntuneへの登録を同時に行う設定
この設定により、Azure ADに参加したデバイスを自動的にIntuneに登録して管理可能となります。

1. [Azureポータル(https://portal.azure.com)](https://portal.azure.com)を開きます。
1. 《Azure Active Directory》をクリックします。
1. 左側のメニューより《モビリティ(MDM および MAM)》→《Microsoft Intune》の順にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/0001f6c6-17ee-4337-06bd-6cae92993147.png)
1. 『構成』画面で、MDMユーザースコープを「すべて」または「一部」かつ、MAMユーザースコープを「なし」に設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/3e0bfc89-f28a-1c76-45fe-5231ab0faaf9.png)
    - MDMユーザースコープを「一部」にした場合は、対象とするグループを選択する。
imgにsrcsetでしている場合のonerrorハンドリングが失敗する

HTMLの`img`タグにおける[srcset](https://developer.mozilla.org/ja/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images)といえばデバイス毎にいい感じに指定した画像を取得してくれる仕組みですが、これをonerrorでハンドリングした際のハマリポイントを書き残しておきます。

## onerrorでハンドリング
`img`タグの画像がうまく読み込めなかった場合に別の画像に差し替える手法として`onerror`が利用できます。

```html
<img src="/path/src.jpg" alt="image" onerror="this.src='/path/error-src.jpg'" />
```

`src="/path/src.jpg"`が読み込み失敗した場合に`onerror="this.src='/path/error-src.jpg'"`onerrorが実行され、javascriptにより`this.src`が上書きされます。

## srcset利用時に上記設定で読み込みループになる
上記のパターンに`srcset`を追加してみます。

```html
<img
  src="/path/src.jpg" srcsert="/path/src.jpg 1x, /path/src@2.jpg x2"
  alt="image"
  onerror="this.src='/path/error-src.jpg'"
/>
```
この場合`srcset`に指定している画像が読み込めなかった場合に読み込みループが発生します。（Chromeで事象を確認）
どういうことかというと、

1. `src`に`srcset`によるデバイス別のURLが指定されて読み込みが開始される
2. 1の画像が読み込めなかった場合に`onerror`が呼ばれ、`src`が上書きされる
3. 2で`src`が上書きされたことでブラウザは再度画像を読み込む
4. 1に戻る

といったような挙動が見られました。（実際の処理は違うかもしれません）
ということで改善方法

## 読み込みループを回避

```html
<img
  src="/path/src.jpg" srcsert="/path/src.jpg 1x, /path/src@2.jpg x2"
  alt="image"
  onerror="this.src='/path/error-src.jpg';this.srcset='/path/error-src.jpg'"
/>
```

`onerror`時に`src`だけでなく`srcset`の値も変更します。これで先程の4に当てはまった場合に書き換わった`srcset`が利用されるので無事エラー時の画像に切り替わります。

なんてことないですね
Python の pip で保存してる各パッケージの内容を一行でまとめてみた

# pip でダウンロードするパッケージっていっぱいあるよね
PC水没したので新PCでpython環境構築中
せっかくきれいな環境なのでこの際インスコする各ライブラリを一言でまとめてみた（随時追加）。
初心者につき指摘コメントいただけるとありがたいです。

# 各種 package
## appdirs
アプリごとに使われるuser_info, log, config, cacheなどの保存場所のpathに関連する処理をしてくれる

#### 使用例
```
>>> from appdirs import *
>>> appname = "SuperApp"
>>> appauthor = "Acme"
>>> user_data_dir(appname, appauthor)
'/Users/trentm/Library/Application Support/SuperApp'
```

## certifi
certificate authority(CA)バンドルの場所pathを参照してくれる。Requestsライブラリでも使われてる。
#### 使用例

```
>>> import certifi
>>> certifi.where()
'/usr/local/lib/python3.7/site-packages/certifi/cacert.pem'
``` 

## distutil
third party製のpackage配布を管理してくれるライブラリ。

## filelock
ファイルロック(二人以上が同時に一つのファイルに書き込んでしまったとき一方の書き込みが意味なくなるのを防ぐ)関連。
#### 使用例

```
from filelock import Timeout, FileLock

file_path = "high_ground.txt"
lock_path = "high_ground.txt.lock"

lock = FileLock(lock_path, timeout=1)
with lock:
    open(file_path, "a").write("Hello there!") // 安全な書き込み
``` 

## pip
pythonのパッケージ管理ツール。

## pipenv
プロジェクトごとに仮想環境(ライブラリ、パッケージ、python version等)を作って、開発環境トラブルとかを防ぐ人類に優しいライブラリ。

## setuptools
パッケージ管理ツールの先駆者。pipも中でこれを利用してるらしい。

## six
pythonの2系と3系の互換性を解決するライブラリ。2系でも3系でも動くコードにする。

## virtualenv
仮想環境を作ってくれる。third party製だったけどpython3.3からvenvとして標準モジュールに昇格した。まだ使ってる人も多そう（？）。
https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd
↑
わかりやすいpython仮想環境戦国時代の解説

## virtualenvclone
a package to prevent exploit virtualenv

## wheel
https://qiita.com/kenta1984/items/16a14f3bfaf1f257c585 にわかりやすくまとまっている。
vistaでquartus その37

#概要

cpuを書いてみた。
アセンブラを更新した。
in,outに対応した。

#ソース


```
loop:
  in
  set  i
  get  i
  jz  loop
  get  i
  out
  jmp  loop
i:
  0x0000
```

#アセンブラ結果


```
mem[12'h000] = 16'hd000;//loop:  in
mem[12'h001] = 16'h3007;//       set  i
mem[12'h002] = 16'h2007;//       get  i
mem[12'h003] = 16'h5000;//       jz  loop
mem[12'h004] = 16'h2007;//       get  i
mem[12'h005] = 16'he000;//       out
mem[12'h006] = 16'h4000;//       jmp  loop
mem[12'h007] = 16'h0000;//i:  0x0000  

```

#成果物

https://embed.plnkr.co/plunk/Mu9I2FZZ0QpJ3wUd

以上。
YAML to JSON

## tl; dr
- jsonは読めるけど、yamlはまだあまり読めない人が読めるようになる
- vs codeユーザ向け

## やり方

vscodeに以下をインストールします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87607/a6a544d0-b46d-1898-7444-29e4570dc0c9.png"  width=50% >

では、早速適当なyamlファイルを変換してみましょう
（kubeのdeploymentファイルです）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87607/4a99ec4e-4dc8-8e68-a670-85bd36e8448b.png"  width=50% >

+ 対象のyamlファイルを開いた状態で
+ shift + command + P を押す
+ 「YAML to JSON:Convert selection or document」と入力

すると以下のようにjsonに変換できます。
jsonが読めて、yamlはまだ苦手という方はこちらを活用してみるのもいいかもしれません。

before

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
```

after

```
{
  "apiVersion": "apps/v1",
  "kind": "Deployment",
  "metadata": {
    "name": "nginx-deployment",
    "labels": {
      "app": "nginx"
    }
  },
  "spec": {
    "replicas": 3,
    "selector": {
      "matchLabels": {
        "app": "nginx"
      }
    },
    "template": {
      "metadata": {
        "labels": {
          "app": "nginx"
        }
      },
      "spec": {
        "containers": [
          {
            "name": "nginx",
            "image": "nginx:1.14.2",
            "ports": [
              {
                "containerPort": 80
              }
            ]
          }
        ]
      }
    }
  }
}
```
windowsのmysqlでspringboot実装エラー対策

## 環境
windows7 64bit
mysql 5.6.43
spring-boot 2.3.2

## 参照資料：Spring公式GUIDES
https://spring.io/guides/gs/accessing-data-mysql/#initial


## 1. Accessing data with MySQL用ソースを取得
```
git clone https://github.com/spring-guides/gs-accessing-data-mysql.git
```
## 2. DB初期化
cd into gs-accessing-data-mysql/initial
公式GUIDESはlinux用のため、下記コマンドそのまま使用すると※１エラーが発生
create user 'springuser'@'%' identified by 'ThePassword';

※１java.sql.SQLSyntaxErrorException: Access denied for user 'springuser2'@'localhost' to database 'db_example'

windows場合、下記のように修正必要

```
mysql> create database db_example; -- Creates the new database
mysql> create user 'springuser'@'localhost' identified by 'ThePassword'; -- Creates the user
mysql> grant all on db_example.* to 'springuser'@'localhost'; -- Gives all privileges to the new user on the newly created database
```

## 3. springboot起動


```
mvn spring-boot:run
```

下記※２エラー発生
※２java.sql.SQLException: The server time zone value '???? (?W????)' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.

application.properties下記対策必要

```
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_example?serverTimezone=JST&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=springuser2
spring.datasource.password=ThePassword
```
CakePHP Training（公式） 受講メモ

先日cakephpの公式ウェビナーを受講しました。様子や感想をメモしておきます。

###2ドルでした
https://training.cakephp.org/
現地時間の午後4時なので0時から3時間すね
###cakephpの主要なcommitter
jose gonzalez さん直々に
https://github.com/josegonzalez
初心者向けのチュートリアルを実施
しながら、ずっと説明してくれています
###「cakephpあるある」とか
はさんでくれます
テーブルを変更しても
entityをbakeし直さないと反映されないので
formが動作しないから気をつけてねとか
言ってますね
###細かいところまでご存知なので
知らないければ使わない便利関数
Text::toList()とかdd()とか
知れてよかったです
###一番驚いた機能は
debug barのhistoryで遡って save() の sql log が
見られたことです
###初心者向けウェビナーということで、
ターゲット外のフレームワーク全体の質問
は受け流しているのが面白かったです
「cakephp8へ対応するか？」
と聞かれて
「それはリリース状況見ながらですね」
など
###ライブなので質問によって内容が濃くなっていくのがよかった
途中からentityのプロパティの命名規則の話になると、phpStorm上でコードを書き換えながら検証が始まりました。スネークケースとキャメルケースは自動変換されるのか？複数形は単数形にInflectorで自動変換されるから大丈夫ですねとか実演されました。cakephp内部の動作を把握されているので、コードを深追いすることなく、すぐに答えを聞けるのがいいなと思いました。

そして「僕の周りはフレームワークの開発者ばっかりなので普段からこんな感じで違和感ないけど、みんな重箱の隅をつつくような話に付いてきてますか？」など自虐もあり、親近感を持ちました。
###同時に14人くらい受講者がいて
みんな日本人じゃないみたいで
chatの英文ライティングが
しっかりしていました。
ま、
でも拙い（つたない）英語でも、
慣れてるんでしょうね。
キーワードを拾ってくれました。
恐れることはありません。
###興味のある人は
今年の12月にCakefestにオンラインで
5ドルで参加できるので
参加してみてください。
https://cakefest.org/schedule
###お金払わなくても
Youtubeのcakephpチャンネルで
コロナ対応につき長めの動画が
上がっているので
みて見てください
https://www.youtube.com/c/CakePHP/videos
shell scriptメモ

## 算術

* `$(())` で囲うと算術演算が可能

``` bash
a=10
echo $((a*2)) # 結果: 20
b=$((a*2))
echo $b # 結果: 40
echo $((b+10)) # 結果: 50
```

* 参考：[Bash $((算術式)) のすべて - A 基本編 - Qiita](https://qiita.com/akinomyoga/items/9761031c551d43307374) が詳しい


## ゼロ埋め

* 算術演算をしたら、次はゼロ埋めして表示したくなる。 `printf` が使用可能

``` bash
a=5
printf %03d $a # 結果: 005
```

* `$(printf)` とすれば、結果を変数に格納できる。

``` bash
a=5
b=$(printf %03d $a)
echo $b # 結果: 005
```

## 文字列からの切り出し
* ゼロ埋めは分かったが、今度は文字列から切り出したい。 `${パラメータ:オフセット:長さ}` と切り出せる。

``` bash
value=aiueo
echo ${value:1:3} # 結果: iue

# 変数に格納
v2=${value:2:2}
echo $v2 # 結果: ue
```


* 参考：[bashで変数から部分文字列を取得する - Qiita](https://qiita.com/koara-local/items/04d3efd1031ea62d8db5)
DDDでslickのトランザクションを扱う

# 前置き

ScalaでメジャーなDBアクセスライブラリのslickを使用する環境で、ドメイン層とアプリケーション層でいかにしてトランザクションをあつかうかについてのメモです。

# それぞれのトランザクション

## DDDでのトランザクション

複数の集約にまたがってアトミックな処理が求められる場合にはレポジトリ内でセッションが完結しません。DDDの定石ではアプリケーション層でトランザクションを管理することになります。

このとき広く使われているのは、スレッドローカルなトランザクションやセッションを引数で引き回して実現する方法です。

```scala
// アプリケーション層
DB.transaction { session =>
  domainServiceA.do(a, session)
  domainServiceB.do(b, session)
}
```

## slickのトランザクション

次にslickのトランザクションの解説です。

細かいことは [slick-doc-ja 3.0 — データベースI/Oアクション](http://krrrr38.github.io/slick-doc-ja/v3.0.out/データベースI%2FOアクション.html#Transactions+and+Pinned+Sessions) を見ていただきたいですが、クエリーはその場で実行されるのではなく組み立てられたアクションを返すようになっており、それらを合成した一つのアクションとしてまとめて実行することでトランザクションを利用できます。

```scala
val action = for {
  _ <- domainServiceA.do(a)
  - <- domainServiceB.do(b)
} yield ()
DB.run(action)
```

slickを使ってアプリケーション層でトランザクションをあつかう場合、レポジトリやドメインサービスでslickのアクションを返すようにする必要が出てきます。

# ドメイン層でslickアクションを隠蔽する

インフラ層での実装手段であるslickの型がドメイン層に出てくる、つまりドメイン層がslickに依存するのは好ましくありません。

ドメイン層でslickアクションを隠蔽したいのでそうしましょう。やり方を考えていきます。

## ラッパーを使う

おそらく多くの言語で使える素直な方法です。以下のような形でしょうか。

```scala
// ドメイン層
trait Action[R] {
  ...
}
class DomainServiceA(repository: RepositoryA) {
  def do(a: A): Action[Unit] = ...
}
class DomainServiceB // 省略

// インフラ層
class SlickAction[R](val underlying: DBIOAction[R, NoStream, Effect.All]) extends Action[R] {
  ...
}
class RepositoryAImpl {
  def find(id: Id): Action[A] = {
    SlickAction(Table.A.filter(...).result.headOption.map { ... })
  }
}

// アプリケーション層
val action = for {
  _ <- domainServiceA.do(a)
  - <- domainServiceB.do(b)
} yield ()
DB.run(action.asInstanceOf[SlickAction[Unit]].underlying)
```

げぇ！ `asInstanceOf` !!!

もちろん `match` を使っても良いですし、具体的な型に依存した処理を書く場所もインフラ層にやらせてもいいかもしれません。しかし、望んだ型でなかったときは実行時例外を投げるしかありません。良いやり方とは言えないようです。

## 型引数と型クラスを使う

そもそもやりたいのはドメイン層でアクションの具体的な型に触れたくないだけです。そこでアクションを型引数にしてしまいます。また型引数ならわざわざラッパーを使わずとも型クラスで扱うことができます。だいたい以下のようになります。

```scala
// ドメイン層
trait IO[F[_]] {
  // 型クラス
  // map, flatMap, filter, withFilter やその他必要な操作を抽象メソッドを定義
}
class DomainServiceA[F[_]](repository: RepositoryA[F])(implicit F: IO[F]) {
  def do[R](a: A): F[R] = ...
}
class DomainServiceB // 省略

// インフラ層
package object infra {
  type SlickIOAction[+R] = DBIOAction[R, NoStream, Effect.All]
  implicit object SlickIO extends IO[SlickIOAction] {
    // 型クラスのインスタンス
    // map, flatMap, filter, withFilter などを実装する
  }
}

class RepositoryAImpl extends RepositoryA[SlickIOAction] {
  ...
}

// アプリケーション層
val action = for {
  _ <- domainServiceA.do(a)
  - <- domainServiceB.do(b)
} yield ()
DB.run(action)
```

型引数と型クラスによりドメイン層ではインフラ層での具体的な型に触れずにすみ、具体的な型を知っているアプリケーション層ではキャストなしに触ることができます。

なお、`DBIOAction` は概ね `scala.concurrent.Future` と同じ操作をもっているので `Future` の用の型クラスのインスタンスを用意すれば、ドメイン層のテストでサードパーティライブラリに依存せずにすみます。
AWS MailCatcher用のセキュリティグループを追加する

# 目的

- MailCatcher用のセキュリティグループの作成方法をまとめる

# 前提条件

- AWSのアカウントを所持しログインすることができること。

# 前提情報

- 筆者は下記の内容を実施後に本作業を実施した。
    - [AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042)

# 読後感

- MailCatcher用のセキュリティグループの作成を行うことができる。

# 詳細

1. AWSにログインし下記後、EC2のダッシュボードにアクセスする。
1. サイドバーにある「セキュリティグループ」をクリックする。

    ![ダッシュボード___EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ffb9efe8-88e9-9316-3e35-8364975ae934.png)

1. 「セキュリティグループを作成」をクリックする。

    ![EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1f30e099-9b6c-b71c-f61f-7b2f78cf6e1e.png)

1. 下記の情報を入力する。
    - セキュリティグループ名: mailcatcher
    - 説明: use MailCatcher

    ![EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a36a8efb-fb3c-c4ff-d3d5-79ba075bd9ec.png)

1. 「インバウンドルール」の「ルールを追加」をクリックする。

    ![EC2_Management_Console-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e60f58e0-047b-3e84-677b-8237efc89824.png)

1. 下記の情報を入力する。
    - タイプ: カスタムTCP
    - プロトコル: TCP
    - ポート範囲: 1080
    - リソースタイプ: マイIP
    - マイIPを選択した時にソースの下にIPアドレスが表示されることを確認する。

    ![EC2_Management_Console-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/72a7c2ff-6a8b-6d42-0ec5-160e998971ab.png)

1. その他はとくに入力することなく、内容を確認して「セキュリティグループを作成」をクリックする。

    ![EC2_Management_Console-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f1259fb3-7d82-6899-4c64-e5cfa5558ece.png)

1. セキュリティグループが作成されたことを確認する。

    ![EC2_Management_Console-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a83de3d9-57f8-7361-9af2-429a0e96a3f0.png)

1. サイドバーにある「セキュリティグループ」をクリックする。

    ![ダッシュボード___EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ffb9efe8-88e9-9316-3e35-8364975ae934.png)

1. 今作成したセキュリティグループのName部分にマウスカーソルを当てた時に表示されるボタンをクリックし「mailcatcher」と入力して保存する。

    ![スクリーンショット_2020-08-27_17_32_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f0dab991-4a8f-635b-438c-2858c9f81a9e.png)

1. 一覧に下記にの様に表示されれば作業完了である。

    ![EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b92072ed-f6a4-8fce-2741-b9a0af2a92fd.png)
[Paiza]レベルアップ問題集 文字列処理


少しづつやっていくためのメモ。随時更新します。
C#だと解答例がまだないので、ご自由に参考にしてください。

# 数式の計算
``` C#
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Linq;

public class Hello
{
    public static void Main()
    {
        var line = System.Console.ReadLine();
        var tokens = new List<string>();
        int tokenStart = 0;
        
        for(int i = 0; i < line.Length; i++)
        {
            var c = line[i];
            if(c == '+' || c == '-' || i == line.Length - 1)
            {
                var token = i == line.Length - 1 ? line.Substring(tokenStart) : line.Substring(tokenStart, i - tokenStart);
                tokenStart = i+1;
                tokens.Add(token);
                if(c == '+')
                    tokens.Add("+");
                if(c == '-')
                    tokens.Add("-");
            }
        }
        
        long calcMem = long.Parse(tokens[0]);
        
        for(int i = 1; i < tokens.Count; i++)
        {
            if(tokens[i] == "+")
            {
                calcMem += long.Parse(tokens[i+1]);
                i++;
            }
            if(tokens[i] == "-")
            {
                calcMem -= long.Parse(tokens[i+1]);
                i++;
            }
        }
        Console.WriteLine(calcMem);
    }
}
```

# 巨大な数の足し算(繰り上がりなし) 
``` C#
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Linq;

public class Hello
{
    public static void Main()
    {
        var s = System.Console.ReadLine();
        var t = System.Console.ReadLine();
        var r = new List<char>();
        for(int i = s.Length - 1; i >= 0; i--)
        {
            int cs = (s[i] - '0');
            int ls = (t[i] - '0');
            int k = cs + ls;
            r.Add((char)(k + '0'));
        }
        
        var ary = r.ToArray();
        Array.Reverse(ary);
        Console.WriteLine(new String(ary));
    }
}
```

# 巨大な数の足し算 
``` C#
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Linq;

public class Hello
{
    public static void Main()
    {
        var s = System.Console.ReadLine();
        var t = System.Console.ReadLine();
        var r = new List<char>();
        
        var carry = 0;
        for(int i = s.Length - 1; i >= 0; i--)
        {
            int cs = (s[i] - '0');
            int ls = (t[i] - '0');
            int k = (cs + ls + carry) % 10;
            if(cs + ls + carry > 9) {
                carry = (cs + ls +carry) / 10;
            } else {
                carry = 0;
            }
            r.Add((char)(k + '0'));
        }
        
        while(carry > 0) {
            r.Add((char)((carry % 10) + '0'));
            carry /= 10;
        }
        
        var ary = r.ToArray();
        Array.Reverse(ary);
        Console.WriteLine(new String(ary));
    }
}
```
【Python】動的にimportできるライブラリを自作しました

こんにちは！ぬこすけです！
pythonにはimportlibというモジュールを動的にimportしてくれる組み込みライブラリがあるのですが、それをもっと使いやすくするようなライブラリを自作しました！

* github：https://github.com/hiroki0525/autoload_module

## このライブラリでスバリ何ができる？
パッケージ名を指定することで、**配下のモジュールを動的にimportした上で、モジュールで定義されているクラスオブジェクトを取得することができます！**
具体的には次のようなPythonコードを書くことができます！

* ディレクトリ構成

```
project/
 ├ example.py
 └ validator/
   ├ validator_a.py
   ├ validator_b.py
   └ validator_c.py
```

* validator_a.py

```python
class ValidatorA:
    # bとcも同様
    def valildate(self, input):
        # バリデーション処理
```

* example.py

```python
from autoload.module_loader import ModuleLoader

input = "foo bar baz"
loader = ModuleLoader()

# 自動的にvalidator配下のモジュールを読み込み、ValidatorAなどクラスオブジェクトのリストを返却
validator_classes = loader.load_classes("validator")
try:
    # クラスオブジェクトをインスタンス化してメソッド実行
    [clazz().validate(input) for clazz in validator_classes]
except:
    print("input is invalid!!")

```

## このライブラリ、何がおいしいの？
**「まとめて何か処理をかます」ときに威力を発揮します！**
具体的な利用シーン例としては次を想定しています。

* ある値をまとめてバリデーションかけるとき（先述のコードの例）
* パイプラインを実装するとき

パイプラインを実装するときは下記のような感じでしょうか。
(並列でデータを取得して加工するイメージです)

* ディレクトリ構成

```
project/
 ├ example.py
 └ pipelineA/
   ├ get_data_a.py
   └ processing_data_a.py
 └ pipelineB/
   ├ get_data_b.py
   └ processing_data_b.py
```

* example.py

```python
from autoload.module_loader import ModuleLoader

package_names = ("pipelineA", "pipelineB")
loader = ModuleLoader()

# ここらへんは並列処理で
for package_name in package_names:
    GetData, ProcessingData = loader.load_classes(package_name)
    data = GetData().get()
    processed_data = ProcessingData().process(data)
```

## このライブラリ、どう使うの？
使い方は[このページ](https://github.com/hiroki0525/autoload_module/blob/master/JP_README.md "autoload日本語README.md")をご参考ください！

## なんでこんなライブラリ作ったの？
もともと個人で[本のおすすめ度を点数化して紹介するサイト](https://nuko-programming.com/ "ぬこぷろ")を作っていたのですが、書籍のデータを数パターンのバリデーションをかける必要がありました。

バリデーションパターンごとにモジュール作って良い感じに動的にimportしてバリデーション実行できないかな〜と思って色々ググったのですが、なさそうだったので自作しました！

自作したものの、汎用的に使えそうだなーと思ったのでライブラリとして公開した次第です！

## 最後にひとこと
まだまだ事足りないこともあるのでcontribution歓迎です！

* github：https://github.com/hiroki0525/autoload_module
結局、Pythonで型比較をするには何を使えばよいのか

# `is`と`==`の違い
`==`は、「同じ値かどうか」で判断するのに対し、`is`は「同じオブジェクトかどうか」で判断します。
例えば、以下の例で言うと、

```python
>>> a = "hello"
>>> b = "hello"
```

どちらも同じ値を持つオブジェクトのため、`==`で比較した場合`True`を返します。

```python
>>> a == b
True
```

が、`is`は「同じオブジェクトか」で判断します
Pythonでは、オブジェクトを生成するとそのオブジェクトに一意の番号が振られます。`is`は、その番号で判別します。
番号は`id()`で確認できます。

```python
>>> id(a)
2827074142256
>>> id(b)
2827074145520
>>> a is b
False
```

# `isinstance`でも型を比較できる
`isinstance`はオブジェクトのクラスを比較する関数です。
別のクラスを継承していた場合、親クラスと比較しても`True`を返します

```python
>>> class customint(int):
...     pass
...
>>> c = customint()
>>> type(c) == int
False
>>> type(c) is int
False
>>> isinstance(c, int)
True
```

# 実行時間を計測する
## やること
それぞれの関数を10,000,000回（1千万回）実行し、実行時間を計測します
これを10回繰り返し、平均を算出します
参考として、何もせずに10,000,000回ループする関数も実行します

## ソースコード
```python
#!/usr/bin/env python3
# coding: utf-8

from time import time

intvar = 0
n = 10 ** 7


def gettime(name, num=10):
    """
    10回実行し、実行時間を計測し、平均を出す
    """
    def func(fn):
        def wrapper(*args, **kwargs):
            strat_t = time()
            for a in range(num):
                fn(*args, **kwargs)
            dur = (time() - strat_t) / 10
            print(name, "\t:", dur)
        return wrapper
    return func


@gettime("simple\t")
def simple():
    for x in range(n):
        pass


@gettime("equal\t")
def equal():
    for x in range(n):
        res = type(intvar) == int


if type(intvar) == True:
    pass


@gettime("is\t")
def iscompare():
    for x in range(n):
        res = type(intvar) is int


@gettime("isinstance")
def isinstancecompare():
    for x in range(n):
        res = isinstance(intvar, int)


if __name__ == '__main__':
    simple()
    equal()
    iscompare()
    isinstancecompare()
```

## 結果
（単位：秒）

|実行環境|Windows 10<br>Intel Core i7-8550U @ 1.80GHz<br>RAM:16GB|さくらのVPS(v3) 1G|
|:--:|:--:|:--:|
|空ループ|0.1508335590362549|0.37562224864959715|
|`==`|0.8364578723907471|1.9130330801010131|
|`is`|0.8253042459487915|1.799116063117981|
|`isinstance`|0.5259079456329345|1.3679522275924683|

## 考察
実行時間は、
`==` > `is` >>> `isinstance`
という感じになりました。
なので、

- 継承を考慮して型比較をしたい
- 継承とかよくわかんないけど、とにかく速度を求めたい

場合には`isinstance`を、

- 継承を無視して型比較をしたい

場合には`is`を使いましょう。

## 感想
デコレーター初めて使ったけどめっちゃ便利やん
Pandasでwarningが発生した箇所の見つけ方

## 背景
pandasでwarningが発生したけど、どこで発生したかわからないことがたまにあります。そのようなときはpandasのオプションをセットして、warningではなくerrorをraiseするように設定すれば、warningの発生箇所を素早く特定できます。

```python
pd.options.mode.chained_assignment = 'raise'
```

## 例
```python
import pandas as pd
pd.options.mode.chained_assignment = 'raise'

df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
df2 = df[df['a'] == 2]
df2[df2['b'] == 5] = 1
```

## 出力

```
Traceback (most recent call last):
  File "/Users/hogehoge/python/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-9-37a0949d6b87>", line 10, in <module>
    df2[df2['b'] == 5] = 1
  File "/Users/hogehoge/.pyenv/versions/anaconda3-2019.10/lib/python3.7/site-packages/pandas/core/frame.py", line 2935, in __setitem__
    self._setitem_array(key, value)
  File "/Users/hogehoge/.pyenv/versions/anaconda3-2019.10/lib/python3.7/site-packages/pandas/core/frame.py", line 2956, in _setitem_array
    self._check_setitem_copy()
  File "/Users/hogehoge/.pyenv/versions/anaconda3-2019.10/lib/python3.7/site-packages/pandas/core/generic.py", line 3729, in _check_setitem_copy
    raise com.SettingWithCopyError(t)
pandas.core.common.SettingWithCopyError: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
```
SDNの進化系「インテントベースネットワーキング」概要編

#はじめに
VMwareとネットワークを生業としているIT業界9年目のエンジニアです。
ネットワークの運用自動化としてSDNが上げられますが
近年インテントベースネットワーキングという新たなテクノロジーが出てきました。
新しい技術でパッと調べただけじゃ分かりにくかったため、今回どういうものかまとめてみました。

#インテントベースネットワーキングとは
分かりやすくSDNとインテントベースネットワーキングを比較すると
SDN(Software Defined Networking)がソフトウェア定義型とも呼ばれ、
ネットワークの設定や管理などのネットワーク制御にあたる部分をソフトウェア上で一括集中定義し、ネットワーク機器に反映し、通信を制御します。
インテントベースネットワーキング(Intent-based Networking、以降IBN)は意図主導型ネットワーキングと呼ばれ、意図や目的(インテント)を定義し、ソフトウェアが自動でそれらをネットワーク機器に反映して通信制御・監視、構成最適化・修復を行います。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596030/01f978e1-86dd-e661-b9cd-a1d55995a88e.png)
つまりSDNはIPアドレスやデバイス名、デバイスの種類、VLANなどネットワークの構成要素からプログラムを作りこむ必要がありますが、IBNは定義した意図や目的に沿って、接続先を指示するだけでネットワークを自動化できます。
例えばIBNは、「部署Aからのアクセスは許可するが、部署Bからのアクセスは許可しない」というような抽象化レベルで、企業の意図や目的に合うデバイスとルートを決定し、構成変更を適用することができるのです。

#インテントベースネットワーキング提供ベンダー
提供ベンダーは以下になります。
・シスコシステムズ
・アプストラ（apstra）
・インテンシオネット（Intentionet）
・ファーウェイ（HUAWEI)
・フォワードネットワーク（FORWARD NETWORKS）
・ベリフロー（VERIFLOW）

IT記事で現在展開されているネットワークがインテントベースであると答えたのはわずか4％でしたが、35％は2年以内にIBNを導入する予定だそうです。

#おわりに
インフラエンジニアがプログラムもできる必要がある時代から、さらに進化してネットワークの目的・意図をいかに考え、構成していくかが強まってきたと感じます。
今回は概要になりますが次回は構成や実際にどう動くかなどを紐解いていければと思います。

参照先
・Ciscoインテントベース ネットワーキング
https://www.cisco.com/c/ja_jp/solutions/intent-based-networking.html
・インテントベース ネットワーキングと DNA Center
https://gblogs.cisco.com/jp/2018/07/intent-based-networing-and-dna-center/
・インテントベースネットワーキングの導入--2年以内に予定が35％
https://japan.techrepublic.com/article/35146538.htm
・インテントベースネットワークとは？ 2025年以降も戦える「ITインフラ10のトレンド」
https://www.sbbit.jp/article/cont1/36450
Visual Studioで.vdprojを開く方法

自分が良く忘れるのでメモ。

インストーラープロジェクトはVisual Studio 2017からデフォルトでは含まれないようになりました。
Marketplaceから拡張をインストールして利用してください。

-[Microsoft Visual Studio Installer Projects](https://marketplace.visualstudio.com/items?itemName=VisualStudioClient.MicrosoftVisualStudio2017InstallerProjects)
TTCフォントをTTFに分解する方法。

# はじめに
３Dモデルにロゴマークを刻印したくて、フォントから輪郭だけ取り出す方法を探してたら、とてもいい記事が見つかりました。

- [TTFの全グリフをPNGにしてみる - Qiita](https://qiita.com/scrpgil/items/7c7c0a354b3688ddfc6b)

こちらの記事では、TTFファイルからグリフを読み込んでSVGファイルに書き出す方法、さらにそれをPNGに変換する方法が詳しく紹介されていました。

# TTCはダメなの？
フォントから輪郭が取り出す方法を知った僕は、手当たり次第に試したのですが、ある **TTCファイル** を試したとき次の **エラー** でつまづきました。
`fontTools.ttLib.TTLibError: specify a font number between 0 and 2 (inclusive)`
エラーの意味は分からないのですが、**TTFファイル**からはイケたので、「 **TTCファイル を TTFファイル** に変換できたらいいなぁ」と普通におもいました。


# TTC を TTF に
調べるとすぐに、超参考になる記事が見つかりました。

- [ttc形式のフォントを分解する | 魔ッドアングラー](https://mndangler.net/2017/04/ttc_convert/)

記事によると、TTCは複数のTTFを合体させたもののようでTTCからTTFに **「変換する。」** ではなく **「分解する。」** が正しいのだそうです。
そして、その方法として紹介されていたのが **[UniteTTC](http://yozvox.web.fc2.com/556E697465545443.html)** というツールで、これは **TTC を TTF** にも **TTF を TTC** にもできるそうです。

# UniteTTC
こちらはフリーのフォントを配布なさってる方のページで **Windows** と **Linux** に用意されてる **[UniteTTC](http://yozvox.web.fc2.com/556E697465545443.html)** といツールがダウンロードできます。

**コマンドラインツール** なので適当な場所に解凍し **コマンドプロンプト** から使用します。

今回は **win10 64bit** の環境で **meiryo.ttc** から **TTFファイル** を取り出します。

コマンドプロンプトで次のように入力するだけです。
`C:\Users\maboy\Desktop\unitettc>unitettc64 meiryo.ttc`

:::note 
`maboy`の部分はユーザー名なので、使用状況に合わせて変更します。
:::

```cmd:cmd.exe
C:\Users\maboy\Desktop\unitettc>unitettc64 meiryo.ttc
UniteTTC Copyright (C) Y.Oz 2017

Font #1: meiryo001.ttf
Font #2: meiryo002.ttf
Font #3: meiryo003.ttf
Font #4: meiryo004.ttf
Ok.


C:\Users\maboy\Desktop\unitettc>
```
一瞬で **TTFファイル** を取り出してくれます。

取り出された **TTFファイル** は同一ディレクトリに連番付きで保存されます。
MediaWikiでサイドバーやフッターの表示を編集する方法

非常にニッチな知識ですが情報が少ないので記録しておきます。

# サイドバー編集
* [Manual:インターフェイス/サイドバー - MediaWiki](https://www.mediawiki.org/wiki/Manual:Interface/Sidebar/ja)

## ツールボックスの中身を削除

こちらで紹介されているPHPをLocalSetting.phpに挿入する。

* [User:Seb35/modifyToolbox - MediaWiki](https://www.mediawiki.org/wiki/User:Seb35/modifyToolbox)

# フッターの編集

最終更新日時の表示、プライバシーポリシーなどを消したり、文言を編集するときは下記の記事を参考にするとできる。

* [html - How do I remove the footer in MediaWiki? - Stack Overflow](https://stackoverflow.com/questions/37081536/how-do-i-remove-the-footer-in-mediawiki)



# CSSを編集する
柔軟に表示UIを調整する場合は強制的にCSSを編集するとできる。

```
/index.php/MediaWiki:Common.css
```
↑にアクセスするとMediaWiki上で編集できる。
【SQL】DBのテーブルを復活させる方法

## この記事の経緯
間違えて消したくないテーブルを誤って消してしまい背筋が凍る思いをしました。
ですが、調べたところ今回の方法が浮上したので備忘録として記載します。

## 開発環境
OS:Windows10 Pro 64bit
Soft：A5:SQL Mk2

---

```:SQL
insert into テーブル名 select * from テーブル名 as of timestamp (systimestamp - interval '戻したい時間'単位) ;

(例)
insert into Table1  select * from Table1 as of timestamp (systimestamp - interval '1' hour) ;
```
PostgreSQLに「psql -U <ユーザ名> -h <ホスト名>」で接続しようとすると、「psql: FATAL:  database "<ユーザ名>" does not exist」とエラーが起きる

#はじめに
PostgreSQL接続時に、入力した値は間違っていないのに接続エラーが
発生したので、解決策をメモします。


【DB接続情報】


```

DB_HOST=postgres
DB_USERNAME=default
DB_PASSWORD=secret
```


PostgreSQLに接続するために以下のようにコマンドを打ち、

```
$ psql -U default -h postgres
```
（ユーザ名：default、　ホスト名：postgres）

続いてパスワードを求められるので、

```
Password for user default: 
```
ここに設定しているパスワード「secret」を入力したところ、
エラーが発生。

```
psql: FATAL:  database "default" does not exist
```

ユーザ名として入力した「default」というデータベースが存在しない・・？


#解決策

`-d`オプションで、`-d <データベース名>`をコマンドを追加したところ、
無事に接続することができました。

```
$ psql -U default -h postgres -d postgres
```
（今回接続するDB名は「postgres」）


どうやら、-dオプションでDB名を指定しないと、ユーザ名と同名のDBを参照する
こともあるようです。
今回は、ユーザ名に「default」を指定しましたが、同名のDBは存在していなかったので
エラーが発生したと考えられます。
GoでHello World!表示させてみた

技術文章を書く練習&上長に書きますといった手前引けなくなったので投稿

主にこのドキュメントをもとに調査
https://github.com/astaxie/build-web-application-with-golang/blob/master/en/preface.md

# Goの特徴
- 静的言語
- 並行処理
- 高速なコンパイル
- etc...

このような特徴があるようだ。まずは手を動かすことが大事なので、詳細は次回以降に調べる。
 

# Dockerで手軽にgo環境を用意してみる

```:Dockerfile
#ベースとなるgoのバージョン指定
FROM golang:1.14.3-alpine

#作業用フォルダの作成
RUN mkdir /go/src/practice

#作業用フォルダの設定
WORKDIR /go/src/practice

#カレントディレクトリの全ファイルをコンテナにコピー
COPY . /go/src/practice
```

Goで開発するには`$GOPATH` を最初に指定しなければならない。`$GOPATH`というのは、goの開発のための場所であるworkspaceを指定するパス。dockerのデフォルトでは`/`が`$GOPATH`のようだ。階層は以下のような構成となっている。

```
/go
   -/src //goのソースコードを置く場所
   -/pkg //コンパイルされたファイルが置かれる場所
   -/bin //実行ファイルが置かれる場所
```

goでは`$GOPATH`の下ですべてのgoコードが管理するという方法を取っている。
コンテナ中でgoが入っているか確認

```
/workspaces/practice # go version
go version go1.14.3 linux/amd64
```

まあ入ってるよね

Hello World!を表示するプログラムを作ってみる。

```go:practice/main.go
//パッケージ名を指定、パッケージ名はディレクトリ名と一致させることが推奨されている
package practice

//fmtパッケージをインポート
import "fmt"

func main() {
	//Hello,World!と表示する
	fmt.Println("Hello, World!")
}
```

```
go fmt main.go
```
でコードのフォーマットを行う。

例のごとくHelloWorld!を表示してみる。

```
/workspaces/practice # go run main.go
Hello, World!
```

ええやん

次はgoでwebアプリケーションでも作ってみようか。

# 参考
- https://golang.org/doc/
- https://making.pusher.com/my-5-favourite-features-of-go-and-how-to-use-them/#:~:text=Go%20offers%20some%20great%20concurrency,Go%20is%20a%20go%20routine.
- https://thenewstack.io/understanding-golang-packages/
バリューチェーンによるの分類

応用情報技術者平成30年秋期 午前問68

バリューチェーンによる分類はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/07008129-9358-4c87-37d2-26ca6d888716.png)

１、バリューチェーン(Value Chain)は、
「購買した原材料等に対して、各プロセスにて価値（バリュー）を付加していくことが企業の主活動である。」というコンセプトに基づいて分析を行う手法です。業務を「購買物流」「製造」「出荷物流」「販売・マーケティング」「サービス」という5つの主活動と、「調達」「技術開発」「人事・労務管理」「全般管理」の4つの支援活動に分類し、製品の付加価値がどの部分（機能）で生み出されているかを分析します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/94ab6513-0249-46cd-e965-5419ddf3ae1e.png)

２、ファイブフォース分析の説明 Five Forces
競争要因を，新規参入の脅威，サプライヤの交渉力，買い手の交渉力，代替商品の脅威，競合企業の五つのカテゴリに分類する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/297c4765-ac99-68b6-1b93-5990dc8dbd17.png)



３、アンゾフの成長マトリクスの説明  Ansoff Matrix
事業の成長戦略を，製品(既存・新規)と市場(既存・新規)の2軸を用いて，市場浸透，市場開発，製品開発，多角化の4象限のマトリックスに分類する。

アンゾフマトリックスとは、ロシア生まれの米国人経済学者イゴール・アンゾフ博士が提唱した、企業の成長戦略を決定するための著名なフレームワーク。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/29aa769d-2827-ac58-a4ce-b80dafd606e1.png)


４、プロダクトポートフォリオマネジメントの説明 Product Portfolio Management
製品を，市場の魅力度と自社の強みの2軸を用いて，花形，金のなる木，問題児，負け犬の4象限のマトリックスに分類する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/780fe7c4-2ab2-0156-d780-3f3122245508.png)


参照：
https://www.ap-siken.com/kakomon/26_haru/q68.html
vistaでquartus その35

#概要

cpuを書いてみた。
serialのecho書いてみた。
遂に、送受信を手に入れた。

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c1607283-77ef-3116-0c85-3812718831e9.jpeg)


#アセンブラ


```
loop:
  in
  set  i
  get  i
  jz  loop
  get  i
  out
  jmp  loop
i:
  0x0000


```

#ハンドアセンブル


```
mem[12'h000] = 16'hd000;//loop:  in
mem[12'h001] = 16'h3007;//       set  i
mem[12'h002] = 16'h2007;//       get  i
mem[12'h003] = 16'h5000;//       jz  loop
mem[12'h004] = 16'h2007;//       get  i
mem[12'h005] = 16'he000;//       out
mem[12'h006] = 16'h4000;//       jmp  loop
mem[12'h007] = 16'h0000;//i:     0x0000
```

以上。
ララベルで削除確認機能

###今回は削除するときに確認がはいるようにしたいと思います！
・削除ボタンを押したときに確認動作がはいる
・間違って削除ボタンを押してしまってもキャンセルできるように
・削除すると完全に消えてしまうので念のため確認がはいるように

```app.blade.php
<head>
       <script language="JavaScript" type="text/JavaScript">
             
            function Delete_check(){
                let checked = confirm("delete?");
                if (checked == true) {
                    return true;
            } else {
                    return false;
            }
          }
       </script> 
</head>
```
まずは共通となるapp.blade.phpに記述します！

```posts.blade.php
<div onclick="return Delete_check()">
                    
  @if (Auth::id() == $post->user_id)
                      {{-- 投稿削除ボタンのフォーム --}}
        {!! Form::open(['route' => ['posts.destroy', $post->id], 'method' => 'delete']) !!}
        <button class="btn btn-danger" type="submit">投稿削除</button>
        {!! Form::close() !!}
  @endif
</div>
```
・削除ボタンはposts.blade.phpに書いていますがボタン専用のビューファイルに書いても大丈夫です！
###まとめ
削除ボタンを押したとき確認動作が表示されたでしょうか？
削除は重要な動作となりますのでよければ導入してみてくださいね!
![スクリーンショット 2020-08-28 7.32.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696811/2d10b482-5e78-5339-0476-d2982f3854e9.png)
このボタンを押したときに下の写真のように表示が出ればうまくいっています！
![スクリーンショット 2020-08-28 7.32.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696811/05ee8982-4d28-cd6b-6e5a-5851c4ca9e59.png)
SCM、SFA、ERP、CRM


応用情報技術者平成30年秋期 午前問67

SCMの目的はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/12e08113-0650-c16b-e3a3-994fd3710a08.png)

１、SCM(Supply Chain Management)は、
生産・在庫・購買・販売・物流などのすべての情報をリアルタイムに交換・一元管理することによって生産から販売に至る一連の流れ全体の効率を大幅に向上させることを目指す経営管理手法です。
導入することで納期短縮や在庫削減といった効果が期待できます。

２、CRM(Customer Relationship Management)の説明
顧客情報や購買履歴，クレームなどを一元管理し，きめ細かな顧客対応を行うことによって，良好な顧客関係の構築を目的とする。

３、SFA(Sales Force Automation)の説明
顧客情報や商談スケジュール，進捗状況などの商談状況を一元管理することによって，営業活動の効率向上を目的とする。

４、ERP(Enterprise Resource Planning)の説明
生産や販売，在庫，会計など基幹業務のあらゆる情報を統合管理することによって，経営効率の向上を目的とする。



ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
補足
SFAを説明したものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7b0f7861-9ff9-f671-d05b-72463af3a532.png)

１、SFA(Sales Force Automation)は、
営業活動にモバイル技術やインターネット技術といったITを活用して、営業の質と効率を高め売上や利益の増加につなげようとする仕組み、またはそのシステムのことです。

・営業日報の管理に加えて
・商談管理機能(コンタクト管理、行動管理、評価・実績管理)があり、
・営業マン個人の支援に加えて
・営業グループ内で情報の共有を促進するなど、
・営業活動全体を支援する機能が備わっています。


２、リテールサポートの説明
卸売業・メーカが小売店の経営活動を支援することによって，自社との取引量の拡大につなげる手法・概念である。


３、EC(Electronic Commerce，電子商取引)の説明
消費者向けや企業間の商取引を，インターネットなどの電子的なネットワークを活用して行う手法・概念である。



参照：

https://www.fe-siken.com/kakomon/26_haru/q66.html


https://www.ap-siken.com/kakomon/25_haru/q70.html#:~:text=SFA(Sales%20Force%20Automation)%E3%81%AF,%E3%81%9D%E3%81%AE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82&text=%E3%81%AE%E8%AA%AC%E6%98%8E%E3%81%A7%E3%81%99%E3%80%82-,%E6%B6%88%E8%B2%BB%E8%80%85%E5%90%91%E3%81%91%E3%82%84%E4%BC%81%E6%A5%AD%E9%96%93%E3%81%AE%E5%95%86%E5%8F%96%E5%BC%95%E3%82%92%EF%BC%8C%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88,%E8%A1%8C%E3%81%86%E6%89%8B%E6%B3%95%E3%83%BB%E6%A6%82%E5%BF%B5%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82
言語学習では学ばない知っておいてほしいこと5選

# 前書き
### 対象者

プログラミング言語の基礎文法を学び終えた人、学んでいる人

### 読む前に

この記事では、こんなものがあるよと紹介するに留まります。
紹介したものがどんなものかは自分で調べてみてください。

# 本文

### Git / Github

複数人で開発を行うとき、どのようにコードを共有すれば良いか悩みませんか？
コードを共有する場合のベストプラクティスは間違いなくGitとGithubを使用することです。
GitとGithubを使いこなせるようになると開発の効率がグッと上がります。
また、一人で開発を行うときのコード管理にも役立ちます。
[Git入門](https://qiita.com/ay3/items/8d758ebde41d256a32dc)
[Github](https://github.com/)

### リーダブルコード

自分が書いたコードを見返したときに、コードの意味が分からないときはありませんか？
高い品質のコードを書くときに重要となる項目として可読性という概念があります。
可読性とは、コードの読みやすさです。
可読性が低いコードを書くと、少し先の自分や一緒に開発している仲間が困ってしまいます。
可読性が高いコードを書くための手法がリーダブルコードという本に書かれています。
本を買ってみる、もしくはネットの要約記事を探してみてください。
[リーダブルコード](https://www.oreilly.co.jp/books/9784873115658/)
[リーダブルコード要約](https://qiita.com/AKB428/items/20e81ccc8d9998b5535d)


### クリーンアーキテクチャ

自分が書いているコードが複雑になっていると感じることはありませんか？
複雑になっている原因として、コードが無作為に書かれていることが大きいです。
クリーンアーキテクチャとは、開発を進めていく上で発生する多くの問題を防ぐための手法です。
書籍やQiita記事が出ているので是非購入するか検索してみてください。
もしクリーンアーキテクチャが難しいと感じたら、先にオニオンアーキテクチャを調べてみたい方が良いかもしれません。
[クリーンアーキテクチャ書籍](https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-Robert-C-Martin/dp/4048930656)
[実装クリーンアーキテクチャ](https://qiita.com/nrslib/items/a5f902c4defc83bd46b8)

### アルゴリズム

自分が開発したソフトウェアがモッサリしていたことはありませんか？
コンピュータはあらゆる計算を一瞬で終えることが出来る万能器具ではないので、コードによっては処理を終えるまで時間がかかってしまいます。
軽いコードを書くには、計算量を意識したアルゴリズムを組む力が必要になります。
まずは、全探索から検索してみてください。
また、AtCoderなどの競技プログラミングコンテストに参加してみるとアルゴリズム力がグングン伸びていきます。
[AtCoder](https://atcoder.jp/?lang=ja)
[全探索アルゴリズム入門](https://qiita.com/MasayaMizuhara/items/86099ad721a329e1d6cd)

### セキュリティ

無意識に情報を流出してしまった経験はありませんか？
ソフトウェア開発において、セキュリティは重要視すべき項目です。
セキュリティを知るには、CTFへの参加を推奨します。
CTFとは、実際にハッキングを行い隠された情報（フラグ）を取り合うゲームです。
また、セキュリティの最新技術を調べてみるとより興味が湧いてきます。
ゼロトラストネットワークや仮想通貨あたりがおすすめです。
[CpawCTF](https://ctf.cpaw.site/)

## 終わり

今回は、初心者の私が言語学習では学べない知っておくべき概念をまとめてみました。
深夜に書いたので後から項目を追加するかもしれないです。
もし私の理解が間違っている部分などあれば教えていただけると嬉しいです。
この記事の内容が良いと感じて頂けたらLGTMお願いします。

## 書いた人

情報系高専生3年かつWebフロントエンジニアをやってます
Twitter: [@lockdef](https://twitter.com/lockdef)
Profile: [lockdef's profile](https://lockdef.github.io/)
昔にまとめたSwiftProgramingの資料バックアップとして記事を残す

## Swiftに限らず、ほかの言語でも使われる開発手法MVCモデルを軽くまとめる

##MVC(Model View Controller) 
- GUIをもつアプリケーションのデザインパターン
- アプリケーションの内部データを以下の3つの部分に分割する  

1. model → アプリケーションデータ、ビジネスルール、ロジック、関数
2. view → ダッシュボード、表、図などの情報表現
3. controller → 入力を受け取りmodelとviewへの命令に変換する

##Tuple
``` 
let steve =("Steve Jobs",56)
let (name,age) = steve
print(steve.0)

func test(n:Int, s:String)->(Int, String){
    return(n,s)
}

let (num, str) = test(n: 10, s:"Steve Jobs")

print(num) // 10と出力されます
print(str) // Steve Jobsと出力されます

let (_,n,_,s) = (1,2,3,"Steve Jobs")
print(n) // 2
print(s) // Steve Jobs
```
##Collection types
```
// Array
let fishes = ["Mackerel", "Saury", "Sardine"]
for fish in fishes {
    print(fish)
}
// Set 順序保持されない
let fishes: Set<String>=["Mackerel", "Saury", "Sardine"]

//Dictionary 順序保持されない
let sizeOfFishes = ["Mackerel": 50, "Saury": 35, "Sardine":20, ]
for (fish, size) in sizeOfFishes {
    print("Genarally, \(fish) growth \(size) cm.")
}
``` 
##Initialize
```
class TestB{
    var n = 0, s = "Steve Jobs"
    init(_n: Int){
        n = _n
    }
    init(_s: String){
        s = _s
    }
    func m(){
        print(n) print(s)
    }
}
let testB1 = TestB(_n:10)
testB1.m()  // 10 Steve Jobs
let testB2 = TestB(_s: "Bill Gates")
testB2.m()  // 0 Bill Gates

```

##以上
matlabでBLEを使う⑥micro:bitのAccelerometer

　前回、micro:bitに搭載されている磁気センサのデータをBLE経由でPCから読みました。ここでは、もうひとつの加速度センサのデータを読み込みます。
###micro:bit側の設定
　磁気センサとまったく同じ手順で、「加速度計サービス」を用意し、ダウンロードします。
![スクリーンショット 2020-08-25 17.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/87339afd-8873-40be-1c44-06860396d099.png)

###matlabの設定
　前回とほとんど同じです。加速度センサのサービスとキャラは次のとおりです。

```matlab
Accelerometer_Service_UUID = "E95D0753-251D-470A-A062-FA1922DFA9A8"; % 加速度計サービス
Accelerometer_Characteristic_Data_UUID    = "E95DCA4B-251D-470A-A062-FA1922DFA9A8"; % 加速度データ
Accelerometer_Characteristic_Period_UUID  = "E95DFB24-251D-470A-A062-FA1922DFA9A8"; % 取得間隔
```
　読み取れるのは、x、y、zのデータです。センサは MMA8653のようです。データシートのよれば、単位はgで、10ビットのデータです。三つのレンジがあり、±2g、±4g、±8gのどのレンジでデータが送られてくるのかは不明です。データのフォーマットは、上位8ビット＋下位2ビットの形式ですが、実際BLEで送られてくるのが磁気センサと同じリトル・エンディアンであれば、下位2ビット＋上位8ビットと推測できます。
　下位ビットは8ビットと7ビット目にデータが入り、残りの6ビットは不明です。したがって、10ビットを読んで、右に6シフトすれば、正しい10ビットのデータになります。BLEではそのデータを2バイトに分けて送ってくるとしたら、たんに8ビット＋8ビットのデータを読み取ればよいと思います。

　公式ページ
　　https://lancaster-university.github.io/microbit-docs/ble/accelerometer-service/
では、リトル・エンディアンでデータを読み、1000で割った値をなにもスケーリングしていません。
　同じように処理しました。

```matlab
    x = double(bitor( bitshift(int16(data1(2)), 8) , (data1(1)) )) /1000;
    y = double(bitor( bitshift(int16(data1(4)), 8) , (data1(3)) )) /1000;
    z = double(bitor( bitshift(int16(data1(6)), 8) , (data1(5)) )) /1000;
```

　このあとpitchとroolを計算します。

```matlab
    pitch = atan( 1 * x / sqrt(y.^2 + z.^2));
    roll  = atan(y / z);
```

　rollの計算は、検索していろいろなところに書かれた計算式です。公式ページはそうなっていません。pitchの計算式は、arctanの中の符号が＋ですが、検索した解説ページではーになっています。この符号は、外に出しても同じ結果になります。
　全体のソースです。

```matlab
clear
list = blelist("Timeout",20)
b = ble("BBC micro:bit [gavag]");
Accelerometer_Service_UUID = "E95D0753-251D-470A-A062-FA1922DFA9A8"; % 加速度計サービス
Accelerometer_Characteristic_Data_UUID    = "E95DCA4B-251D-470A-A062-FA1922DFA9A8"; % 加速度データ
Accelerometer_Characteristic_Period_UUID  = "E95DFB24-251D-470A-A062-FA1922DFA9A8"; % 取得間隔

% 加速度データ
k1 = characteristic(b, Accelerometer_Service_UUID, Accelerometer_Characteristic_Data_UUID);
fprintf('start');
subscribe(k1);  % notify enable
count = 20;
X = (count);
Y = (count);
Z = (count);
P = (count);
R = (count);

for i = 1:count
    data1 = read(k1);
    x = double(bitor( bitshift(int16(data1(2)), 8) , (data1(1)) )) /1000;
    y = double(bitor( bitshift(int16(data1(4)), 8) , (data1(3)) )) /1000;
    z = double(bitor( bitshift(int16(data1(6)), 8) , (data1(5)) )) /1000;
    pitch = (180 / pi) * atan( x / sqrt(y.^2 + z.^2));
    roll  = (180 / pi) * atan(y / z);
    fprintf('read x,y,z %.3f %.3f %.3f ||  %.3f %.3f \n', x, y, z, pitch, roll);
    pause(0.5);
    X(i) = x;
    Y(i) = y;
    Z(i) = z;
    P(i) = pitch;
    R(i) = roll;
end
fprintf('done');

figure
feather(P,R)

clear b
```
　グラフはfeatherというのを選びました。このグラフを選んだのは、ピッチとロールの変化がわかりやすいからです。
　ピッチとは、X方向（ICの1ピンがX方向）に対して前後の揺れぐあい、ロールは左右の揺れぐあいを表します。もう一つの回転を表すヨーは加速度センサでは取得できないようです。

　グラフの例です。マイコン・ボードをぐるーとまわしています。

![スクリーンショット 2020-08-27 07.51.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/e76566bb-8d9b-0856-795d-8281774fe55b.png)
初心者おばちゃんの簡単にLaravelをレンタルサーバへアップする方法


#Symbolic linkをつかってレンタルサーバのディレクトリ変更を最小限でおさえてアップロードする。
Nov 6, 2018にアップしたこちらの動画をありがたいことに、いまだに見てくださっておられる方々がいてまして、文面にあげておこうかと思いました。とても勇気がわきます、ありがとうございます。:relaxed:
 [Laravelを簡単にレンタルサーバにアップする方法](https://www.youtube.com/watch?v=U6J6zdqOArY "Laravelを簡単にレンタルサーバにアップする方法")

##Hard link との違い 
Hard link は、Hard link を削除することで参照先ファイル・ディレクトリが削除される。
Symbolic link は、Symbolic link を通じての参照先ファイル・ディレクトリの削除はできない。
######こちら[@att55さま、『貼ろうよ Symbolic link』](https://qiita.com/att55/items/ab7781dae0bcd4d31395)を参照させて頂いております。

とういうことなので、Symbolic Linkを使用しております。

#使用環境
####ハード
GoDaddy(cPanel)
Windows
PuTTy
Dosコマンド
####ソフト
Bush
PSCP

#目的

レンタルサーバとLaravelのバージョンが違っていたり、ローカル側の環境をレンタルサーバ側にスタティックに合わせてからアップしなくてもよいように、最初のコミットだけで次回から一連の決まった方法でレンタルサーバに更新できるようにしたい。

#方法

####何もやっていないレンタルサーバで一からLaravel環境を整備
Laravelの準備

```
ls /***ディレクトリの中身を確認***/
wget https://getcomposer.org/installer /***Composerをダウンロード***/
ls /***「installer」ファイルがあることを確認***/
php installer --check /***Laravelのバージョンチェック←CorrectとでればOK***/
php installer /***composer.phar*と.composer/ができる***/
rm -f installer /***いらなくなったインストーラーを削除***/
```

テスト用にプロジェクトをつくる

```
php composer.phar create-project laravel/laravel laraelTestRun 
```

SymlinkをはってディフォルトのPublicをLaravelに変更
(symlinkをはってLaravelのpublicを、あたかもレンタルサーバディフォルトのpublic_htmlであるかのように見せる。)

```
mv public_html public_htmlBK /***名前変更してWWW直下のパブリックを無効にする。***/
ln -s laravelTestRun/public public_html 
ls /***public_html@という新しいディレクトリができていることを確認***/
```

ブラウザから確認できればOK

####ローカルからLaravelプロジェクトをアップロードする

+ 普通に圧縮したファイルをレンタルサーバのコンソール画面からアップロードします。
+ コンソール画面からZIPファイルを解凍します。（結局この方法が一番早くローカルのLaravelを移せました）
+ 先にテストしたLaravelプロジェクトのSymlinkをunlinkします。

```
unlink public_html
```

もし同じプロジェクトであった場合には、以下のように解凍する前に古い方を再帰的に削除してください。

```
rm -rf laravelTestRun
```

+ もう一度、アップロードしたプロジェクトのために、SymlinkをはってディフォルトのPublicに変更


####アップロード後の作業
######Dosから、PSCPをつかって環境ファイルやイメージファイルをアップロードします。

環境ファイル

```
C:\User\neko>pscp c:\savefiles\.env neko@ssh.laravelTestRun.com:/home/neko/laravelTestRun/
```

イメージファイル（ブログで/storage/app/public/に入るようにしてます）

```
C:\Users\neko>pscp -r c:/storage/app/public/ neko@ssh.laravelTestRun.com:/home/neko/laravelTestRun/storage/app/public/
```

+ プロジェクトの中のstorageを削除してartisanでsymlinkをつくる（アップロードするたびに必要）

```
cd laravelTestRun/public
rm -r storage
cd laravelTestRun
php artisan storage:link
```

*注：/home/neko/laravelTestRun/storage/app/public/の階層にあるstorageのイメージファイルを、artisanでlaravelTestRun/publicの階層へSymlinkをはってやるため、最初からあったlaravelTestRun/public/storageを削除しています。なのでディレクトリに気を付けてください。

以上です。

[動画](https://www.youtube.com/watch?v=U6J6zdqOArY)はこちらです。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96668/c1bd8b79-fb66-4f84-4984-2d32571a5516.png)



ありがとうございました。


[beerneko テック動画集](https://www.youtube.com/channel/UCNVBIvmco2kvCotItXqxWlw?view_as=subscriber)はこちらです。
【Python】youtube-dlでダウンロード場所を指定する方法

youtube-dlでダウンロード場所を指定する方法です。youtube-dlはターミナルからYouTube動画のダウンロードができる最高にモダンなモジュールです。mp3にも対応しているため、音楽のみのダウンロードなんかもできます。

## youtube-dl

youtube-dlとは、YouTubeからYouTube動画をダウンロードする、コマンドラインで動く、ツールです。
[GitHub](https://github.com/ytdl-org/youtube-dl)

参考
https://qiita.com/ssh0/items/ca9adc000eeca8b180f4

## インストール

youtube-dlを、pipでインストールしていきたいと思います。

```tarmnal.
$ pip install youtube-dl
```

brewでインストールする場合

```tarmnal.
$ brew install youtube-dl
```

## YouTube動画をダウンロード

```tarmnal.
$ youtube-dl 'YouTube動画のURL'
```

## ダウンロード場所を指定

```tarmnal.
$ youtube-dl -o '$HOME/Downloads/%(title)s.%(ext)s' 'YouTube動画のURL'
```

参考
https://www.it-swarm.dev/ja/youtube-dl/youtubedl%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%EF%BC%9A%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E7%94%A8%E3%81%AB%E9%96%8B%E3%81%8F%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%EF%BC%9Aerrno-21%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F/961151430/
https://ja.wikipedia.org/wiki/Youtube-dl

https://ja.loveblade.org/716895-how-to-set-up-default-MHSLTG#:~:text=%25APPDATA%25%5Cyoutube%2Ddl%5C,%E3%81%AB%E6%B3%A8%E6%84%8F%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82
AndroidのButtonのTextのスタイルを設定する方法

# 概要

AndroidのButton内のTextのスタイルを設定する方法をまとめる。

# 注意点

AndroidStudioではimport文の追加が自動で行われなかった。
以下のimport文を自分で以下を追記する必要がある。

```
import android.graphics.Typeface;
```

# スタイルの設定方法

```
import android.graphics.Typeface;

Button btn = (Button) findViewById(R.id.button);

// テキストをNormalに変更
btn.setTypeface(null, Typeface.DEFAULT);

// テキストをBoldに変更
btn.setTypeface(null, Typeface.DEFAULT_BOLD);

// テキストをBold + Italicに変更
btn.setTypeface(null, Typeface.DEFAULT_BOLD_ITALIC);

// テキストをItalicに変更
btn.setTypeface(null, Typeface.DEFAULT_ITALIC);
```
swift5でミュート中でも音を出す方法

# 初めに
今回はミュート中でも音を出す方法を展開します。タイトル通りですね。。。
##　実装
今回はViewを立ち上げたら音が鳴り始めることにします。
コメントに詳細書きます。

```swift:TestViewController.swift
import UIKit
import AVFoundation

class TestViewController: UIViewController {
    var audioPlayer: AVAudioPlayer!
    override func viewDidLoad() {
        super.viewDidLoad()

        // mp3音声の再生 testSoundの音声ファイルがあると仮定します。
        playSound(name: "testSound")
    }
}
extension TestViewController: AVAudioPlayerDelegate {
    func playSound(name: String) {
        guard let path = Bundle.main.path(forResource: name, ofType: "mp3") else { return }
        
        do {
            //ここでミュート中でも音が出るようになります。
            try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
            do {
                //オーディオセッションをアクティブにする(ここも必要)
                try AVAudioSession.sharedInstance().setActive(true)
                // AVAudioPlayerのインスタンス化
                audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
                // AVAudioPlayerのデリゲートをセット
                audioPlayer.delegate = self
                // 音声の再生
                audioPlayer.play()
                
            } catch _ as NSError {
            }
        } catch _ as NSError {
        }
    }
}

```

# 終わりに
短文でミュートの設定でも音が出るようになります。
**悪用厳禁です。**