OmniAICreator/Qiita-1.07M huggingface dataset:
FEMで材料モデルを構築する際に利用する式のまとめ

*本記事は未完成です
# 初めに
本記事はFEMで解析を行う際、材料モデルを構築するのに必要な知識とその流れをまとめたものです。
*初学者に優しくない記事となっております。

# 基本理論

応力テンソル$σ$は以下のように表せる

```math
σ=\begin{bmatrix}
σ_{xx} & σ_{xy} & σ_{xz} \\
σ_{yx} & σ_{yy} & σ_{yz} \\
σ_{zx} & σ_{zy} & σ_{zz}  
\end{bmatrix}
```
ひずみテンソル$ε$も同様にして、

```math
ε=\begin{bmatrix}
ε_{xx} & ε_{xy} & ε_{xz} \\
ε_{yx} & ε_{yy} & ε_{yz} \\
ε_{zx} & ε_{zy} & ε_{zz}  
\end{bmatrix}
```
のように表せる。
応力テンソル、ひずみテンソルは対称なので、フォークト記法を用いて以下のように表現することができる。

```math
\tilde{σ} = (σ_{xx},σ_{yy},σ_{zz},σ_{xy},σ_{yz},σ_{xz})^T \\
\tilde{ε} = (ε_{xx},ε_{yy},ε_{zz},ε_{xy},ε_{yz},ε_{xz})^T
```

以下、本記事で応力テンソル、ひずみテンソルを記述する際は上記のフォークト記法を用いることとする。

## フックの法則

三次元における弾性テンソルを$D^e$とすると、これは以下のように表せる。

```math
D^e=\begin{bmatrix}
λ+2G & λ & λ & 0 & 0 & 0 \\
λ & λ+2G & λ & 0 & 0 & 0 \\
λ & λ & λ+2G & 0 & 0 & 0 \\
0 & 0 & 0 & G & 0 & 0 \\
0 & 0 & 0 & 0 & G & 0 \\
0 & 0 & 0 & 0 & 0 & G \\
\end{bmatrix}\\
λ=\frac{Eν}{(1-2ν)(1+ν)}\\
G=\frac{E}{2(1+ν)}
```
ここで、$Eはヤング率、νはポアソン比$を表す。
上記の弾性テンソルを用いると、応力増分と弾性ひずみ増分は以下の関係にあると言える。

```math
dσ = D^e:dε^e
```

## 塑性共役性

```math
dW=\bar{σ}(σ)d\bar{ε}^p=σ:dε^p
```

## 降伏関数

```math
f(σ)-\bar{σ}(\bar{ε}^p)=0
```

## 流れ則

```math
dε^p=dλ\frac{∂g}{∂σ}
```
$g$はポテンシャル関数である。これが降伏関数$f$と等しくなるとき、上記の式は

```math
dε^p=dλ\frac{∂f}{∂σ}
```
となり、これを関連流れ則という。逆に、ポテンシャル関数と降伏関数が等しくない場合、非関連流れ則となる。

## 硬化則

## モデル構築の例

#### YLD2004を降伏関数として用いた場合
学習メモ / アセンブラ言語の基礎

アセンブリ言語の勉強を始めたのでまとめていきます。
まだ勉強不足なので、不足している部分もあります。
もし間違っている部分あればご指摘をお願いします。

次回、[学習メモ/アセンブラ言語　CASLⅡ](https://qiita.com/kota_sho/items/197a5b7d981e4a36fb0d)

参考文献：
[プログラムはなぜ動くのか]
(https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B-%E7%AC%AC%EF%BC%92%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E7%9F%A2%E6%B2%A2%E4%B9%85%E9%9B%84/dp/4822283151/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=Z3GS9T36MX0K&keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B&qid=1570195346&s=books&sprefix=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%9C%2Cstripbooks%2C254&sr=1-1)
その他各種サイト

##アセンブリを勉強する上での全体像を整理する
まず、プログラムを作成し、実行するまでの流れは、

１、高水準言語（C言語など）でプログラムを記述する
　　↓
２、プログラムをコンパイルしてマシン語のEXEファイルに変換する
　　↓
３、プログラムの起動時に、EXEファイルのコピーがメモリー上に作成される
　　↓
４、CPUが、プログラムの内容を解釈、実行する

##CPUとは　〜まずはCPUを理解する〜
CPUの構成：
１、レジスタ
２、制御装置
３、演算装置
４、クロック

####この中でプログラマーが意識すべきは、レジスタだけ
だそうです。（他は全く無視していいということではないと思いますが、とりあえずレジスタを理解することが重要）。

レジスタとは、処理対象となる命令やデータを格納する領域で、一種のメモリーのようなもの。
つまり、プログラムはレジスタを対象として記述される。

[e-Words レジスタとは](http://e-words.jp/w/%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF.html)

####一旦まとめると、
流れとしては、僕らが高水準言語で作成したプログラムが、コンパイルされてマシン語になり、CPUの内部でレジスタを使った処理になるというイメージ。

マシン語が、レジスタにマシン語で命令を出すが、その命令語に英語のような略語（ニーモニック）を割り当てたものがアセンブリ言語であり、つまりマシン語とアセンブリ語は１対１で対応している。

なので、アセンブリ言語を勉強することは、プログラムが動作する仕組みを理解することの一助になる。

###アセンブリ言語とは
上記で少しまとめましたが、
CPUが直接解釈・実行できるのは、ネイティブ・コード（マシン語）のみ。C言語などで書かれたコードはコンパイラでコンパイルすることでマシン語に変換される。ネイティブ・コードは数字の羅列のため理解はできない。そこで個々のネイティブ・コードに機能を表す英語の略語をつけるという手法が考案され、その略語をニーモニックと呼ぶ（例えば、mov)。
そして、そのニーモニックを使う言語をアセンブリ言語という。
アセンブリだとかアセンブラだとかアセンブルだとか聞くけど、ニュアンスとしては
アセンブリ言語を、アセンブラを使って、アセンブルするといったところか。

ニーモニックについての詳しい説明は、
[e-Words ニーモニックとは](http://e-words.jp/w/%E3%83%8B%E3%83%BC%E3%83%A2%E3%83%8B%E3%83%83%E3%82%AF.html)

##アセンブリ言語の構成
アセンブリ言語は、ネイティブコードに変換される命令（オペコード）とアセンブラ自体に対する命令である擬似命令によって構成される。

###オペコードとオペランド
アセンブリ言語の構文はオペコード＋オペランドで構成されます。
オペコード：命令の動作
オペランド：命令の対象となるもの

例えば、
オペコードがLAD
オペランドがA, B
の場合、
「AにBの値を格納する」という意味になる。

```
LAD A, B
//AにBの値を格納する
```

####マシン語命令の主な種類
|  種類　| 機能 　| 
|----|---|
|  データ転送命令 　| レジスタとメモリー、メモリーとメモリー、レジスタと周辺装置の間でデータを読み書きする | 
|   演算命令　| アキュムレータで算術演算、論理演算、比較演算、シフト演算を行う | 
|   ジャンプ命令　|  条件分岐、繰り返し、無条件のジャンプを行う| 
|   コール/リターン命令　|関数を呼び出す/呼び出し元に戻る  |
Julia で多重ディスパッチするためのタイプシグネチャ

# この記事について

引数の型指定について、応用的なことをまとめる。

このあたりのことは、ドキュメントで散発的にしか出てこなかったり、直接的には書かれていなかったりするので、挙動やコードから推測しているところもある。

# 引数の型パラメータを指定する

```julia
Int64 <: Integer                              # true
Vector{Int64} <: Vector{Integer}              # false
Vector{Int64} <: Vector{T} where T<:Integer   # true

Vector{<:Integer} == Vector{T} where T<:Integer

f1(x::Vector{T}) where T<:Integer = x
f2(x::Vector{<:Integer}) = x
f1([1, 2]) # [1, 2]
f2([1, 2]) # [1, 2]
```

https://docs.julialang.org/en/v1/manual/methods/#Parametric-Methods-1
https://docs.julialang.org/en/v1/manual/types/#Parametric-Composite-Types-1

# 複合体の型パラメータのスーパータイプを指定する

関数の引数ではないけれど、私がよく混乱するところなので書き留めておく。

```julia
struct MyType{T<:Number}
    a :: T
end

MyType(3) # MyType{Int64}(3)
```

前節の書き方と混同してこのように間違えがちなのである。

```julia:Bad_example
struct MyType{T} where T<:Number
    a :: T
end
# ERROR: syntax: invalid type signature
```

https://docs.julialang.org/en/v1/manual/types/#Parametric-Composite-Types-1

# 型パラメータを省略する

```julia
# Array{T,N}
Array{Int} == Array{Int,N} where N
Array{Int,2} <: Array{Int} <: Array
```

型を作るときには、ここを考慮した上で型パラメータの順番を決めるとよいだろう。指定したい型パラメータを先に配置し、省略しそうな型パラメータを後にするのが便利である。

https://docs.julialang.org/en/v1/manual/types/#UnionAll-Types-1

# 例外：タプルの型

タプルは関数引数の抽象化なので、ここまでの説明とは挙動が全く異なる。

```julia
# パラメータの包含関係が連鎖する (covariant)
Tuple{Int64} <: Tuple{Integer}     # true

# パラメータは省略できない（２引数と１引数は異なるメソッド）
Tuple{Int,String} <: Tuple{Int}   # false
```

https://docs.julialang.org/en/v1/manual/types/#Tuple-Types-1

# 可変長引数の型を指定する

> Function parameters can also be used to constrain the number of arguments that may be supplied to a "varargs" function.

https://docs.julialang.org/en/v1/manual/functions/#Varargs-Functions-1
https://docs.julialang.org/en/v1/manual/types/#Vararg-Tuple-Types-1
https://docs.julialang.org/en/v1/manual/methods/#Parametrically-constrained-Varargs-methods-1

`AbstractArray` インターフェースで `getindex` を実装するときなど、引数の個数が N 個のとき、 `Vararg{T,N}` で指定できる。
https://docs.julialang.org/en/v1/manual/interfaces/#man-interface-array-1

```julia
# 等価な表現
f1(args::Int...) = args
f2(args::Vararg{Int}) = args

f1(1, 2) # (1, 2)
f2(1, 2) # (1, 2)
```

```julia:配列を複合体でラップする例
struct MyArray{T,N,A<:AbstractArray{T,N}} <: AbstractArray{T,N}
    arr :: A
end

Base.size(A::MyArray) = size(A.arr)
Base.getindex(A::MyArray, I::Vararg{Int}) = A.arr[I...]

MyArray(rand(10, 10))[3, 4]
```

追記： `NTuple{N,T}` と関係がある

```julia
Tuple{Vararg{Int,3}} == NTuple{3,Int}
```

# 型を引数にとる

型 `T` の型は `Type{T}` で指定できる。

```julia
typeof(Int64) # DataType
Int64 isa Type{Int64}

f1(typ::Type{Int64}) = typ
f1(Int64) # Int64

f2(typ::Type{T}) where T<:Integer = typ
f2(Int32) # Int32
```

https://docs.julialang.org/en/latest/manual/types/#man-singleton-types-1

```julia:UnionAllタイプを指定する
isa(AbstractVector, Type{AbstractArray{<:Any,N}} where N)
!isa(AbstractVector, Type{AbstractArray{T,<:Any}} where T)
```

https://twitter.com/LirimyDh/status/1301460282376507392

```julia:Stylishな書き方
Type{>:Missing} == Type{Union{T,Missing}} where T
```

JuliaCon 2019 | What's Bad About Julia | Jeff Bezanson
https://www.youtube.com/watch?v=TPuJsgyu87U
14:00 ぐらい
Xcodeライブラリの追加方法

# はじめに
この記事ではxcodeにpodでライブラリを追加した時の手順を記していきます。
また、ターミナルやvimの操作は前提に進めさせていただきますmm

# 準備
- xcodeを起動する
- プロジェクトを作成する

# Podをインストールする
ターミナルを立ち上げてcocoapodsを設定していく。

```
// cocoapodsをインストールする
sudo gem install cocoapods
cd {プロジェクト}
pod setup

// Podfileを生成する
pod init
```
cocoapodsでライブラリのバージョン管理をしていくので、  
ここまででインストールの準備完了！

# Podfileの編集

```
# エディタでPodfileを開き、下記のように編集する
vim Podfile
```

```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target '{プロジェクト名}' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for {プロジェクト名}
  pod 'RealmSwift' // ←ここに入れたいライブラリを追加する！！

  target '{プロジェクト名}Tests' do
    inherit! :search_paths
    # Pods for testing
  end

  target '{プロジェクト名}UITests' do
    # Pods for testing
  end

end
```

# ライブラリのインストール

```
// 初回はこちらで実行
pod install

// 2回目以降はupdateを使う
pod update
```
これでプロジェクトにPodsというディレクトリができていればOK!

# Xcodeを起動
Xcode初心者の私としては**ここが意外とハマりどころ**だと思う！

```
open -a "/Applications/Xcode.app" {プロジェクト名}.xcworkspace
```

# ライブラリのimport
これでライブラリがimportできるはず！
![スクリーンショット 2020-02-22 17.57.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583780/fd3923a0-1689-7513-988f-941178528a9a.png)
と思いきやRealm(今回インストールしたライブラリ)が表示されない。。

![スクリーンショット 2020-02-22 18.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583780/99287da3-1b91-382b-0de6-1c9163d22504.png)

左のディレクトリから**自分で作成したプロジェクト**を選択
↓
上の方のバーから**Build Phases**を選択
↓
一覧から**Link Binary With Libraries**を選択
↓
**＋ボタンからインストールしたライブラリを追加**
↓
cmd + Rで一旦ビルド


調査したらこれらのxcodeに追加する手順が必要そうでした！

![スクリーンショット 2020-02-22 18.06.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583780/e852279b-06f5-9988-9375-48e2f2504cce.png)
Realm系のライブラリがimportされているのを確認！

# まとめ
ライブラリをimportしようとしたときにcocoapodsの設定までとimport後の記事が多くて手間取ったので、
cocoapodsのインストールからライブラリをimportするところまでまとめてみました！
間違いや編集ミスあればコメントくださいmm
少しでもxcodeで環境構築する時のお役に立てればと思いますー！
丁寧な説明付きな python プログラミング自習用ドキュメント


<img width="1327" alt="スクリーンショット 2020-02-22 18.07.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/4ab348d5-9aa7-54bf-6d68-6223f78c56fc.png">

<a href="https://repository.kulib.kyoto-u.ac.jp/dspace/handle/2433/245698" target="_blank">👉 Kyoto University Research Information Repository: プログラミング演習 Python 2019&nbsp;<img src="http://b.hatena.ne.jp/entry/image/https://repository.kulib.kyoto-u.ac.jp/dspace/handle/2433/245698"></a>

好感が持てる説明が丁寧です。

やってみる。

<iframe width="560" height="315" src="https://www.youtube.com/embed/1YclqyG4w3o" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<a href="https://www.youtube.com/watch?v=1YclqyG4w3o&feature=youtu.be" target="_blank">👉 プログラミング演習 Python 2019 - YouTube&nbsp;<img src="http://b.hatena.ne.jp/entry/image/https://www.youtube.com/watch?v=1YclqyG4w3o&feature=youtu.be"></a>

なんだろうな。何となくプログラミングがつまらなく思えてくる基礎ドキュメントつかリファレンスつか。

あれ、Qiita て、YouTube埋め込みできないの?
【Gradle】JitPackで公開しているライブラリからmavenプラグインを抜いたらダウンロードできなくなった話【JitPack】

# TL;DR
- `JitPack`で`gradle`プロジェクトを公開する場合、`maven`プラグインが必須
- プラグイン無しではダウンロードできなくなる
- ダウンロードできない状態になっても素では表示が行われない

# やらかしたこと
`JitPack`で配信していた自作ライブラリで、勘違いから`maven`プラグインを消した所タイトル通りの状況が発生していました。

# 解決方法
```kotlin:build.gradle.kts
plugins {
    id("maven")

    /* 省略 */
```

## 補足
`maven`プラグインは古く、後継として`maven-publish`プラグインが出ていましたが、`JitPack`はまだ`maven-publish`プラグインには対応していないようです。

# 終わりに
`Kotlin`向け`ModelMapper`的なライブラリを作成しているので、よろしければ使ってみて下さい。

- [Kotlin向けModelMapper的なライブラリ、MapKを作った \- Qiita](https://qiita.com/wrongwrong/items/10048638e9fb4a652b01)
- [k163377 / MapK](https://jitpack.io/#k163377/MapK)
Vim の filetype の判定方法について軽く調べてみた

## はじめに

Vim が各ファイルの形式をどうやって検出しているのか気になったので、マニュアルを読んで調べてみました。

## 疑問

Vim では、`:echo &filetype` で現在開いているファイルの形式を確認できます。

例えば ruby であれば、`test.rb` というファイルを開いたら上記コマンドの結果は `ruby` となりますし、git のコミットメッセージを編集するときのファイルである `COMMIT_EDITMSG` であれば `gitcommit` になります。

しかしこの判別をどのようにやっているかがよくわかっていなかったので、調べてみました。

## filetype について

[Vim のマニュアル](https://vim-jp.org/vimdoc-ja/filetype.html) には以下のように書かれています。自分の疑問だった点を抜粋します。

```
Vimは編集しているファイルの形式を検出することができる。これはファイル名をチェ
ックしたり、場合によってはファイル内に特定のテキストがあるかを調べることで実現
されている。

(中略)

ファイル形式の検出を有効化するには、vimrcファイルでこのコマンドを使用する:
        :filetype on

(中略)

詳細: ":filetype on" コマンドは次のファイルのうち1つをロードする。
                Amiga       $VIMRUNTIME/filetype.vim
                Mac         $VIMRUNTIME:filetype.vim
                MS-Windows  $VIMRUNTIME\filetype.vim
                Unix        $VIMRUNTIME/filetype.vim
                VMS         $VIMRUNTIME/filetype.vim
        このファイルはBufNewFileとBufReadイベントに対する自動実行コマンドを定
        義するVim scriptファイルである。
```

上記より、`$VIMRUNTIME/filetype.vim` に書かれている処理によって、ファイルの種類を判別しているようです。

## ファイルを確認する

 `$VIMRUNTIME/filetype.vim` は、Vim 上で `:echo $VIMRUNTIME` を実行すれば実際のディレクトリパスが確認できるので、そこにある `filetype.vim` を参照すれば実装を確認できます。

リポジトリ上では以下で確認できます。僕は neovim を使っているので、neovim のリポジトリを紹介します。

### ruby

https://github.com/neovim/neovim/blob/045e86474b75992834f54157b04ea2a941ab03a7/runtime/filetype.vim#L1380

抜粋

```vim
au BufNewFile,BufRead *.rb,*.rbw		setf ruby
```

### COMMIT_EDITMSG

https://github.com/neovim/neovim/blob/045e86474b75992834f54157b04ea2a941ab03a7/runtime/filetype.vim#L618

抜粋

```vim
au BufNewFile,BufRead COMMIT_EDITMSG,MERGE_MSG,TAG_EDITMSG 	setf gitcommit
```

## おわりに

ファイル形式の判定は定義ファイルをもとにやっていたことがわかってよかったです。Vim のマニュアルは、仕組みの部分まで言及しているので読んでて面白いですね。


## 参考

* [filetype - Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/filetype.html)
チェックボックスとテキストのズレを直したい素人

## はじめに
　先日、チェックボックスとラベルのテキストのズレを直すのに少し手間取ってしまったので書いておきます。

## 解決方法
　`vertical-align`や`position`での解決方法がネットでは多かったのですが、うまくいかなかったので（ヤバイCSSだったので何らかのプロパティが邪魔していたのだと思う）Flexboxで解決しました。

## 実践
 チェックボックスやテキストを修飾していると両者のズレが目立ってきます。
<img width="451" alt="スクリーンショット 2020-02-22 17.45.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299664/5b09639a-c18f-c18b-98f5-4e6b52bee03b.png">

```html:HTML
<div>
  <label><input class="checkbox">チェックボックス</label>
</div>
```

```css:CSS
.checkbox {
  font-size: 50px;
}
```

　以下のようにして修正することで解決しました。同様の手法はラジオボタン等でも有効でした。

```css:CSS
.checkbox {
  font-size: 50px;
  display: flex;
  align-items: center;
}
```

<img width="456" alt="スクリーンショット 2020-02-22 17.49.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299664/edb4fb93-563c-2295-36da-b87276766964.png">

## おわり
　Flexboxはとても便利なので思考停止で使ってしまいます。その一方で、Flexboxのプロパティ名やそれらの挙動は覚えきれないので下記のデモサイトをよく使っています。便利なので是非使ってみてください。
https://demos.scotch.io/visual-guide-to-css3-flexbox-flexbox-playground/demos/
Service Bus(トピック)への書き込み処理


全然参考となる資料が見つからなくて苦戦。。
結局公式ドキュメントにあったんだけどこれを見つけるのに時間がかかった。

# 解決していない事柄
Functionsから受け取った情報をSerivce Busに書き込むこと
Service Busの接続文字列をキーコンテナから取得すること

# 解決までの流れ
１．Service Busのデプロイ（Service Busの名前空間）
２．Service Busのトピック作成
⇒Service Bus 名前空間の共有アクセスポリシー（RootManageSharedAccessKey）からプライマリ接続文字列は入手可能

３．[チュートリアル](https://docs.microsoft.com/ja-jp/learn/modules/implement-message-workflows-with-service-bus/)のprivatemessagesenderをコピペで関数アプリ（Functions）を作成するも動かず。

４．[Service Bus キューの使用](https://docs.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues)を発見し、Visual Stadio 2019(以降VSと表記)を導入して、無事解決。
（Visual Stadio 2019導入は割愛）

４－１．プロジェクトを作成し、パッケージの追加を実施
> Service Bus NuGet パッケージの追加
新しく作成したプロジェクトを右クリックし、 [NuGet パッケージの管理] を選択します。
[参照] を選択します。 [Microsoft.Azure.ServiceBus] を検索して選択します。
[インストール] を選択し、インストールが完了したら、NuGet パッケージ マネージャーを閉じます。

４－２．サンプルコードをコピペ※以下の箇所だけ作成したServiceBusに合わせて更新

```C#:Program.cs
const string ServiceBusConnectionString = "Endpoint=sb://***********.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=***********";
const string QueueName = "samplequeue";
```
４－３．VS上で実行　⇒　Service Bus キューの概要からアクティブなメッセージ数が増えていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/911b3f20-51a4-e446-fbbc-da05ebfd860d.png)

４－４．プロジェクトを選択し、右クリック＞発行
AppServicePlanなどが自動で作成されるのでしばらく待つ。
再度発行ボタンを押すと、Azure 側へデプロイされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/5644d7bf-d6d0-5095-2388-f2b95dc43b76.png)

４－５．Azureへのデプロイが完了したら、該当リソース（App Service）のWebジョブをクリック
４－６．ジョブを選択して、実行を押下　⇒　Service Bus キューの概要からアクティブなメッセージ数が増えていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/1c737c92-71a3-921f-20b3-57a6f8f474bc.png)

４－７．あれ、、増えてない。。ジョブがアベンドしている？！

４－８．ソースコード見てみると、Enter待ちになってる箇所あり。コメントアウトして、再度デプロイ

```C#:Program.cs
// Console.ReadKey();
```

４－９．Azureへのデプロイが完了したら、該当リソース（App Service）のWebジョブをクリック
４－１０．ジョブを選択して、実行を押下　⇒　Service Bus キューの概要からアクティブなメッセージ数が増えていることを確認

終了！
Elmでユーザ登録フォームを作ってみた

# ユーザー登録するとき、こんなフォームほしいよね？
ほしいと思ったら、[ココ](https://ellie-app.com/86RPvj57v2qa1)をクリック！

# おわりに
作っている最中に、情熱が枯れてしまった。後は野となれ山となれ、ってやつか。
【体験記】MTA98-366ネットワークの基礎を受験した

MTA98-366ネットワークの基礎に合格したので、勉強方法や感想をかんたんにまとめます。

###受験結果
**合格（76/100）**    ※70点以上で合格

###なぜこの試験を受験したか
昨年の4月より社内インフラを担当する部署に配属されました。
業務の中で当然にネットワークに関する知識も必要となり、ネットワークについて勉強をしよう、どうせ勉強するならアウトプットのひとつとして資格を取得しよう・・・ということで、今回この試験を受験しました。
また、今年の秋にIPAのネットワークスペシャリストの受験を予定しており、その準備、基礎固めとして受験しました。

###使用した参考書
①[3分間ネットワーキング](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88-3%E5%88%86%E9%96%93%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%9F%BA%E7%A4%8E%E8%AC%9B%E5%BA%A7-%E7%B6%B2%E9%87%8E-%E8%A1%9B%E4%BA%8C/dp/4774143731/ref=sr_1_1?adgrpid=57093393321&gclid=Cj0KCQiAv8PyBRDMARIsAFo4wK1gAYtASd6NMe1BOjKUXod7KaNfLaNjVvabxfyaMCY6VaH9DSbqO74aAnT9EALw_wcB&hvadid=338581004330&hvdev=c&hvlocphy=1009601&hvnetw=g&hvqmt=b&hvrand=17642902134700094534&hvtargid=aud-759242200006%3Akwd-332741969413&hydadcr=27708_11559603&jp-ad-ap=0&keywords=3%E5%88%86%E9%96%93%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%9F%BA%E7%A4%8E%E8%AC%9B%E5%BA%A7&qid=1582359515&sr=8-1)
②[MTA98-366対応ネットワーク問題集](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-MTA%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%95%8F%E9%A1%8C%E9%9B%86-98-366-IT%E3%83%97%E3%83%AD-IT%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5/dp/4844334441/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=MTA&qid=1582359912&sr=8-1)

###勉強時間
およそ3週間（時間にすると25～30時間くらい）

###勉強方法
ネットワークに関する知識はほぼ無いに等しかったので、基礎の基礎からじっくりと積み上げていくつもりで①の参考書を読みました。
この参考書は
・イラストなども豊富で読みやすく、解説も非常にわかりやすい
・読み進めていくなかで、過去に学んだ内容のふりかえりもしてくれる
などの点で、ネットワークの初学者にはオススメの1冊だと思います。
（実際にAmazonなどでの評価も高いです。）
①の参考書を2周したあとに、②の問題集にとりかかりました。
解説もしっかりと読み、わからないところは①の参考書を読みなおしたり、Googleなどで調べたりしながら3周しました。

###感想
MTA自体が「ITエンジニアとしてのキャリア構築を目指す人や、情報ネットワークやセキュリティ、データベースなどのIT関連事業を行う企業や担当部署で働く方/就業希望者に向けたMicrosoftのエントリーレベルの認定資格です」と定義されているように、初級者向けの試験なのですが、試験問題は難しかったです。
①②の参考書や問題集に記載されていない単語や内容がバンバンでてきました。
たんに合格を目指す＝7割得点するというのであれば、TCP/IPの内容をしっかり押さえておけば十分なのでしょうが、自分の場合は、業務で携わるということもあって、より高得点を目指していたので、76点という結果は正直不本意でした（合格できてうれしい、ホッとしたというのももちろんありますが・・・）。
一方で、今回の受験を通じて、今まで見向きもしていなかったネットワークという分野に興味・関心をもてたという点は、大きな収穫でした。
とはいえ、まだ「はじめの1歩」を踏み出したばかりなので、このまま勉強をすすめ、秋のネットワークスペシャリスト合格を目指します。
【jQuery】要素内の文字列に含まれる数値でリストをソートする【js】

##経緯
やんごとなき理由でhtml側をいじれなかったため、
jsでどうにかこうにか入れ替える必要がありました。
以下奮闘記です。

もっといい書き方があればコメント下さい。泣いて喜びます。

##今回の要件
- お店の開店時間が早い順にソートしたい
- 開店時間が同じ場合でも、閉店時間による並べ替えはしない
- 時間は24時間表記、30分刻みとする
- 営業時間は必ず`HH:mm ~ HH:mm`のフォーマットで表記される
- すべての店の営業時間は10:00 ~ 5:00の範囲内に収まる(5時オープンの店はない)

##デモ
デモはこちら。
開店時間を変更しても、並び替わってくれます。

https://codepen.io/kotottt/pen/rNVWpVa

##HTML
```html:hoge.html
<ul class="shop_lists">
  <li>
    <div class="shop">HOGE食堂</div>
    <div class="time">12:00 ~ 18:00</div>
  </li>
  <li>
    <div class="shop">FUGA KITCHEN</div>
    <div class="time">10:00 ~ 20:00</div>
  </li>
  <li>
    <div class="shop">BAR NULL</div>
    <div class="time">1:00 ~ 4:00</div>
  </li>
</ul>
```

##javascript
```js:hoge.js
$('.shop_lists').html(
	$('.shop_lists > li').sort(function(a,b){
		var str1 = $(a).find('.time').html();
		var str2 = $(b).find('.time').html();
		var num1 = str1.substr( 0, 4 ).split(':');
		var num2 = str2.substr( 0, 4 ).split(':');

			if(num1[0] < 5){
				num1[0] = Number(num1[0]) + 24;
				num1[0] += Number(num1[1]) / 100; 
			}
			if(num2[0] < 5){
				num2[0] = Number(num2[0]) + 24;
				num2[0] += Number(num2[1]) / 100; 
			}

		return num1[0] - num2[0];
}));

```

##生意気にも解説
###リストの入れ替え
```js
$('.shop_lists > li').sort(function(a,b){
```
`sort`メソッドで数値を複数回比較、比較した値を基に、
liタグの並べ替えを行います。
比較方法については次から。

###基準となる数値を含む文字列を抽出
```js
var str1 = $(a).find('.time').html();
var str2 = $(b).find('.time').html();
```
`a`と`ｂ`それぞれに、リストがセットされて行くので、
その中から、`time`クラスを持つブロックを指定し、
htmlメソッドで中身（今回だと`12:00 ~ 18:00`）を抽出します。

ただ、これだと`~`と閉店時間が含まれてしまうため、
次に開店時間のみ抽出していきます。

###数値の抽出と比較の下準備
```js
var num1 = str1.substr( 0, 4 ).split(':');
```

まず、セットされた文字列から先頭の４文字を指定`substr( 0, 4 )`します。
`12:00 ~ 18:00`だと`12:0`になりますね。

※今回は時間が30分刻みで、1分単位での比較はしなくて良いので切り捨てています。

次に、文字列を`：`を基準に、分割し配列化します。
上の例だと、`num1 = ['12', '0']`となります。

では、この配列の値を基準に比較する処理に入ります。

###比較方法
```js
return num1[0] - num2[0];
```
順番が前後しますが、結論から言うと、
配列の最初の値`num[0]`を比較します。

この比較結果を基にリストを並べ替えていくわけですね。（完全に理解）

####問題点
ただこれだけだと、以下の問題が発生してしまいます。

- リスト分単位での比較が出来ない
- 0時以降オープンのお店が、10時オープンのお店より先に表示されてしまう

そのため今回は、

- 分単位部分の`num[1]`を少数点以下の数値に変換し、`num[0]`に加算。
- 0時〜５時の場合は、`num[0]`に24を足す(24時〜28時に変換)

これらの処理を挟むことにしました。

###問題点を解決する処理
```js
if(num1[0] < 6){
		num1[0] = Number(num1[0]) + 24;
		num1[0] += Number(num1[1]) / 100; 
			//結果(1時半オープンの場合)： num1[0] = 25.3
	}
```
この部分ですね。

暗黙の型変換でそのまま24を足したり100で割ることもできるみたいですが、
丁寧に書きましょうということで、Numberオブジェクトで型変換の後に計算。

これで、先程の問題は解決します。

あとは先程の比較式に値が渡るので、比較の後、並べ替え完了です！！！

##思うところ
aとbで同じ処理してるので、うまいことまとめられないかなーというのが正直な所。

ループ回したりしてカッチョイイコードを書きたいものの、
正直わかりやすいし2回くらいならいっか()という惰性です。

あと、時間フォーマットの変更に強くないので、
その場しのぎ感は否めないかと。

自分のコードを呪う未来が見えるような、見えないような....。


間違い等あれば、ご指摘下さい。
VBAでPythonを動かす

# この記事を読んで出来るようになること

1.　**Excel VBA**で**コマンドプロンプト**を起動できるようになる
2.　**Excel VBA**から**Python**を実行できるようになる

# Excel VBAでコマンドプロンプトを起動する
下記のコードでコマンドプロンプトを起動し、
Pythonを実行できます。

```vb
    Dim suji1    As String
    Dim suji2    As String
    
    Dim WSH
    Dim wExec
    Dim cmd_str    As String
    
    suji1 = Range("D4").Value ''セルから数字を取得
    suji2 = Range("D5").Value
    
    Set WSH = CreateObject("WScript.Shell")

    py_file = ThisWorkbook.Path & "\Python.py"
    cmd_str = "python " & py_file & " " & suji1 & " " & suji2
    cmd_str = Replace(cmd_str, "\", "/")
    Set wExec = WSH.Exec("%ComSpec% /c " & cmd_str)
    
    Do While wExec.Status = 0
        DoEvents
    Loop
    
    Range("D6").Value = Val(wExec.StdOut.ReadAll) ''Pythonから結果を受け取る

    Set wExec = Nothing
    Set WSH = Nothing
```

#解説
```vb
    ''オブジェクトの生成
    Set WSH = CreateObject("WScript.Shell")
    ''実行するPythonのファイルパス
    py_file = ThisWorkbook.Path & "\Python.py"
    ''コマンド作成
    cmd_str = "python " & py_file & " " & suji1 & " " & suji2
    cmd_str = Replace(cmd_str, "\", "/")
    ''コマンド実行
    Set wExec = WSH.Exec("%ComSpec% /c " & cmd_str)
    
```
これだけで簡単にコマンドプロンプトを起動し、
Pythonを起動できます。

```vb
    ''コマンド作成
    cmd_str = "python " & py_file & " " & suji1 & " " & suji2
```
suji1とsuji2は引数です。
なのでセルなどから値を取得して渡すことができます。

#実際に動かす
数字1、数字2に任意の値を入れると計算をして、答えに出力します。
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497721/abd0cb8f-79be-a213-2f16-21df824b10a5.png)


ちなみにPythonはこういうコードです。

```py
import sys

def sum(suji1, suji2):
    return suji1 + suji2

if __name__ == "__main__":
    argv = sys.argv
    suji1 = str(argv[1])
    suji2 = str(argv[2])

    total = sum(suji1, suji2)

    print(total)
```

実行するとこんな感じです。
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497721/7537edd7-a5b5-a290-77f4-3f2284561804.png)


#最後に
今回はVBAでPythonを起動しましたが、実際はコマンドプロンプトを使って実行しているので
応用すればもっといろんなことができる気がします。
また、学びがあれば更新していきます。
Sassの使い方

#１. Sassとは
SassとはCSSの機能を拡張した言語です。Sassを利用することで、CSSを効率的に書けるようになります。SassはCSSに非常に似ていますが異なる言語です。CSSを簡潔に書けるだけではなく、CSSの中で変数を使ったり、計算を行うことなどができます。また、SassにはSASS記法とSCSS記法の2種類の書き方があります。
今回は、SCSS記法について書いていきます。※拡張子も.scssになるので気をつけてください。

#２. Sassのメリット
Sassには以下のようなメリットがあります。

- 記述の簡略化ができる
- 同じ値を使い回すことができる
- 引数を使った応用ができる

## 記述の簡略化ができる
親子関係にあるセレクタを入れ子にして書くことができます。
CSSでは、親の要素から対象要素までのセレクタを何度も書く必要がありますが、Sassはネストさせることで、同じ親のセレクタをまとめることができます。
つまり、htmlを書くときのような思考でかけるので、書きやすい。
例えば以下のような感じ。

```html:sample.html
<div class="block">
  <h1 class="title">Hello world</h1>
  <p class="text">Sass is <span>greate!</span>
</div>
```

```scss:sample.scss
.block {
   background-color: #000;
  .title {
    color: #FFF;
    font-size: 70px;
    text-align: center;
  }
  .text {
    font-size: 15px;
    color: #FFF;
    span {
      color: red;
      font-size: 20px;
    }
  }
}
```
## 同じ値を使い回すことができる
###変数
Sassでは、変数を使用することができます。
何度も使用する値を変数を定義することで、変数名で何度も使用することができます。
変数を定義するには、$変数名: 値;のように記述します。

```scss:sample.scss
$mainColor: #FFEC00;  /* #FFEC00という色をmainColorという変数名で定義する */
```

###mixin
mixinとは、まとまったスタイルを定義することができる機能です。
変数は値を定義するものでしたが、mixinはスタイルを定義するものです。
mixinを利用することで、何度も同じスタイルを記述する必要がなくなります。
mixinを定義するには、@mixin mixin名() {}のように記述します。

```scss:sample.scss
@mixin mainContents1 {
  border-radius: 50%;
  margin: 10px;
  text-align: center;
  height: 64px;
  width: 64px;
  background-color: #FFF;
}
```
こちらのmixinは、@includeで呼び出します。

```scss:sample.scss
.main{
 @include mainContents1;
}
```
一度の定義で使いまわせるので、本当に便利ですよね。


## 引数を使った応用ができる
先ほど紹介した変数や、mixinを見ると、使いたくなりますよね。
しかし、定義しまくっていると、似たような中身ができてしまいます。
こんな感じ

```scss:sample.scss
@mixin mainContents1{
  border-radius: 50%;
  margin: 10px;
  text-align: center;
  height: 64px;
  width: 64px;
  background-color: #FFF; /*  background-colorが#FFFか#EEEかの違い */
}
```

```scss:sample.scss
@mixin mainContents2{
  border-radius: 50%;
  margin: 10px; 
  text-align: center;
  height: 64px;
  width: 64px;
  background-color: #EEE; /*  background-colorが#FFFか#EEEかの違い */
}
```
記述量は減るのでメリットはあるのですが、もっといい方法でスマートにできます。
そこで出てくるのがみんな大好き引数です。
こんな感じ

```scss:sample.scss
@mixin mainContents1($color) { /* 関数 */
  border-radius: 50%;
  margin: 10px;
  text-align: center;
  height: 64px;
  width: 64px;
  background-color: $color; /* (#FFF)や(#EEE)が場合に応じて入る */
}
```


```scss:sample.scss
.main1{
 @include mainContents1(#FFF); /*  #FFFと記述するだけでいい */
}
.main2{
 @include mainContents1(#EEE); /*  #EEEと記述するだけでいい */
}
```

#３. 最後に
sassを最近、progateで復習しましたので、書いてみました。
今度は、今勉強しているLaravelでなんか書きます。
bashでforループを使ってzip圧縮


# 背景
普段ファイルをzip圧縮したい時は、コマンドラインから下記の様に処理していました。

```bash:bash
# テキストファイルsample01.txtをsample01.zipに圧縮
$ zip sample01.zip sample01.txt
```
しかし、この処理を大量のファイルに対して圧縮及び採番するとなるとあまりにも面倒(というか非現実的)な為、bashでforループ回せないかな？と思って調べたことをメモります。

# bashでforループ
まずはbash上でのforループの構文を確認。

```bash:bash
$ for 変数 in 値リスト
> do
> なんか処理
> done
```
となります。意外とシンプル。
例えば、forループお決まりの0から9までの数字を出力する例だと

```bash:bash
$ for i in 0 1 2 3 4 5 6 7 8 9
> do
> echo $i
> done
```
もしくは

```bash:bash
$ for i in `seq 0 9`
> do
> echo $i
> done
```
```bash:出力結果
0
1
2
3
4
5
6
7
8
9
```
となります。

# sample01.txt ~ sample50.txtを1つずつzip圧縮
さて、本題に入ります。
連番で名前が付いているファイルを1つずつ圧縮するには上記のfor文を使うのですが、桁数の都合上01から09までと10から50までの処理を分ける必要があります。
ifで分岐して処理しても良いのですが、そんなにしょっちゅう使うものでもないしなぁ、ということでご容赦下さい。以下のように書きます。
※他に何か良い方法があれば是非教えて下さい！

```bash:bash
$ for i in `seq 1 9`
> do
> zip sample0$i.zip sample0$i.txt
> done
```
```bash:bash
$ for i in `seq 10 50`
> do
> zip sample$i.zip sample$i.txt
> done
```
これでsample01.zip ~ sample50.zipが作成されているはずです！

# 2020/02/23追記：1回の処理で圧縮する！
@kkdd さんにアドバイス頂き、以下のコマンドで一括で処理できるようになりました！
ありがとうございました！

```bash:bash
$ find . -maxdepth 1 -name "*.txt" | sed s/.txt// | xargs -P8 -I% sh -c 'zip -r %.zip %.txt'
```
処理の解説ですが、
```find . -maxdepth 1 -name "*.txt"```
で今いるディレクトリ内でファイル名が".txt"で終わるファイルを検索し、その出力結果を
```sed s/.txt//```
に渡すことで、それぞれのファイル名から.txtという文字列を削除し、最後に
```xargs -P8 -I% sh -c 'zip -r %.zip %.txt'```
で渡されたファイル名を1つずつzipコマンドの引数に入れて処理をします。
findコマンドの-nameオプションで指定するファイル名は、同ディレクトリ内に他に.txtファイルが存在する場合は、"sample*"等に修正することで対応できますね。
【Valgrind入門】Macユーザーのための明快Valgrindインストール

## Valgrindを超簡単にインストールしたい

### valgrindについてちょっと

valgringは、僕のようなC言語ユーザーが直面する**メモリーリークとの戦い**を手助けしてくれるらしい。

google翻訳によるとvalgrindは
>動的分析ツールを構築するための計測フレームワーク

らしい。

僕はとにかく`leaks`ではわからないメモリーリークの場所を発見しなければならず、Valgringの使用を迫られた。


あとちなみに読み方は**ヴァルグリンド**である。
公式によるとこうだ。
>**「Valgrind」はどう発音するのか？**
"Val"は”value (ヴァリュー)”のように、”grind”は短い”i”で ーー つまり”grinned (グリンド)” (”tinned”のリズムで) の方が”grined (グラインド)” (”find”のリズム) と発音するよりも好ましい。
*気を悪くしないで欲しい： 最初は皆ほとんど違うのだ。*


valgringはこんな感じで使う

```terminal
$ valgrind ./a.out
$ valgrind --leak-check=full ./a.out
```

## 【準備】 インストールするためのインストール

### どのツールを使うのか

valgrindについて検索したところ、

```terminal
$ yum install valgrind
```
という`yum`でインストールするコマンドばかりで、謎の沼にはまってしまった。
`zsh: command not found: yum`と出るので、『Mac yumインストール』とググり出したが見つからない。
なぜ`yum`を攻略できないのか理解できず困っていたところに[似たような質問](https://teratail.com/questions/100312)を発見。

そしてやっと**yumはMacOS用ではない**ということを理解した! 

>**yum**はLinuxのディストリビューションで使われるパッケージ管理ソフトで、MacOSでは代わりに**Homebrew**が使われる



時間はかかったがMacユーザーの僕は`brew`を使うべきだと理解した！
そう、Macユーザーの皆さん、**僕たちは`yum`ではなく`brew`を使うのだ**！！
Homebrewをインストールしておけば、

```terminal
$ brew install valgrind
```

上記のような`yum`と同じようなコマンドで、簡単にValgrindインストールできる。

### brewを使うには

`brew`は**Homebrew**のコマンドである。

```
$ brew --version
```

で**Homebrew**最新版が存在していれば、次のステップへ。

そうでなければ

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
これをターミナルに貼り付けてhomebrewをインストールする。

[**Homebrew**](https://brew.sh/index_ja)の日本語サイトもわかりやすいので一読するのをおすすめする。


これで準備は完了だ！


## Valgrindインストール

ここまで来ればあとは簡単。

```
$ brew install valgrind
```

でvalgrindがインストールできる。
はい便利。

**<追記：エラーが出る場合>**

macOS High Sierra 以降では上記のコマンドでは以下のようにインストールできないとのエラーが表示される

```zsh

valgrind: This formula either does not compile or function as expected on macOS
versions newer than High Sierra due to an upstream incompatibility.
Error: An unsatisfied requirement failed this build.
```

この場合は、代わりに下記コマンドでValgrindをインストールする

```zsh

brew install --HEAD https://raw.githubusercontent.com/LouisBrunner/valgrind-macos/master/valgrind.rb
```
>version等が更新されているかもしれないので、[Valgrind GitHub](https://github.com/LouisBrunner/valgrind-macos)も参照してください。


もうこれで使えます。
とにかくvalgrindを使わなくてはならない、というときのためのまとめでした。
Amazon S3 バケットへのアクセスを許可する VPC や IP アドレスを指定する方法を教えてください。をやってみる。

# はじめに
某金融業界にもようやくAWSの波が来つつあるこの頃、とりあえずデータセンターとAWSをDirect Connectでつないでセキュリティを確保しつつ、AWSのElasticなコンピューティングパワーを活用するというやり方が今後スタンダードになりそうな予感です。

# 今回のゴール
そうすると問題なのがインターネット禁止という制約。今回は、S3のStatic Web Hostingで作るWebサイトを、インターネットアクセス禁止、特定のVPC経由のみ可能とする。というのをやります。

# AWS Developer Forum最高
ググったけど全然わからなかったので、AWS Developer Forumに聞いてみたところ、一瞬で解決したので、みなさんもググってQiita読んでも解決しなかったら、Forumに投稿してみるとよいと思います。

・Discussion Forums > Category: Japanese Forums
https://forums.aws.amazon.com/category.jspa?categoryID=9

# 参考URL
Amazon S3 バケットへのアクセスを許可する VPC や IP アドレスを指定する方法を教えてください。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/block-s3-traffic-vpc-ip/

# 手順
## 設定手順
### VPC
- 「1 個のパブリックサブネットを持つ VPC」を作成する
- サービスエンドポイントに「com.amazonaws.us-east-1.s3」を追加する
    - こいつがVPCからS3にインターネット経由しないでアクセスするためのもの
- エンドポイントのメニューで、作成したVPCのエンドポイントIDをメモしておく（vpce-xxxxxxxxxxxxxxxxx）

### S3
- バケットを作る
- 作ったバケットのルートフォルダにindex.htmlをアップロードする
    - index.htmlを公開する
- 作ったバケットのプロパティ＞「Static website hosting」
    - 「このバケットを使用してウェブサイトをホストする」にチェック
    - インデックスドキュメントに「index.html」を入力
    - 保存ボタンをクリック
    - エンドポイントURLをメモしておく
- 作ったバケットのアクセス権限＞ブロックパブリックアクセス
    - 「パブリックアクセスをすべてブロック」をオフにして保存（つまり全部公開）
- 作ったバケットのアクセス権限＞バケットポリシー
    - 下記を入力して保存する
    - [bucketname]と[VPC Endpoint ID]は適宜置き換える

```
{
  "Version": "2012-10-17",
  "Id": "VPCe and SourceIP",
  "Statement": [{
    "Sid": "VPCe and SourceIP",
    "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": [
      "arn:aws:s3:::[bucketname]",
      "arn:aws:s3:::[bucketname]/*"
    ],
    "Condition": {
      "StringNotLike": {
        "aws:sourceVpce": [
          "[VPC Endpoint ID]"
        ]
      }
    }
  }]
}
```

## テスト手順
- 作成したVPC内にEC2インスタンスを起動する
- sshでログインして、curlコマンド等でS3のエンドポイントURLにアクセス可能であることを確認する。
- 端末のブラウザ等からS3のエンドポイントURLにアクセス不可であることを確認する。（403 Forbidden）

# たぶん
API Gateway回りも同様にハマりそうな予感。
[AWS] EC2にMysqlを入れた後の設定

Mysqlを最初に入れた時はrootのパスワードは決まっているようで
`$ sudo cat /var/log/mysqld.log | grep 'temporary password'`
で確認できます


```console:ターミナル
[ec2-user@ip-10-0-1-255 ~]$ sudo cat /var/log/mysqld.log | grep 'temporary password'
2020-02-22T07:34:12.667336Z 1 [Note] A temporary password is generated for root@localhost: F+aB(=GYo2jh
```

初期のパスワードは `F+aB(=GYo2jh` らしいです

#### rootユーザーのパスワードの変更

```sql:ターミナル

# とりあえずのパスワードを設定、あとで変更します
mysql> set password for root@localhost=password('passwordPASSWORD@666');
Query OK, 0 rows affected, 1 warning (0.00 sec)

# パスワードの設定情報を確認
mysql>  SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.01 sec)

#文字数制限変更
mysql> SET GLOBAL validate_password_length=4;
Query OK, 0 rows affected (0.00 sec)

#パスワードを簡単なものに設定できるように変更
mysql>  SET GLOBAL validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)

# パスワードの設定情報を確認
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 4     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)

# 新しくパスワードを再設定
mysql> set password for root@localhost=password('666666');
Query OK, 0 rows affected, 1 warning (0.00 sec)
```
FlutterでSDKインストールの際にエラー Expected a key while parsing a block mapping.

## はじめに
モバイルアプリ開発初心者でFlutter学習中です。自分用メモとしても残しております。
Flutterでフォルダ内の画像を表示しようと`pubspec.yaml`を編集していました。

Flutterの画像表示方法は[こちらのqiita記事](https://qiita.com/yu124choco/items/a2710ec004d3425a2a0b)が大変参考になりました。

## エラーでパッケージ取得できない
assetsを追加してパッケージを取得しようとしたら以下のエラーが発生

```
Error detected in pubspec.yaml:
Error on line 45, column 4: Expected a key while parsing a block mapping.
   ╷
45 │    assets:
   │    ^
   ╵
Please correct the pubspec.yaml file at pubspec.yaml
Process finished with exit code 1
```
assetsが間違ってるっぽいけど、タイポでもなさそうなのでどうしてだろうと悩んでいたのですが、
エラーログをよく見るとcolumnって書かれていることに気がつきました。
なんで行だけじゃなく、列についても指摘されてるんだろう？

## 原因
[こちらの記事](https://medium.com/@tashpemhiwa/expected-a-key-while-parsing-a-block-mapping-5512965dafca)が大変参考になりました。

原因はYAMLの文法エラーでした。
YAMLはインデントでデータ構造を表現するようで、今回はインデントが崩れていてエラーが出ていました。そのためエラーログではcolumnについても指摘してくれていたのですね。

新規Flutterプロジェクト作成で生成されるpubspec.yamlではassetsが自動でコメントアウトされており、当初はコメントアウトを外しただけでした。
その場合インデントが崩れている状態になってしまっていたので、揃えてあげる必要がありました。

### NG(単純にコメントアウトを外したもの)

``` pubspec.yaml
# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
   assets:
    - images/a_dot_burr.jpeg
  #  - images/a_dot_ham.jpeg
```

### OK(インデント揃えたもの)

``` pubspec.yaml
# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  assets:
    - images/a_dot_burr.jpeg
  #  - images/a_dot_ham.jpeg
```

こんな簡単なエラーだったとは！
でもおかげでYAMLも少し知れて、いい勉強になりました！

## 参考
- https://medium.com/@tashpemhiwa/expected-a-key-while-parsing-a-block-mapping-5512965dafca
- https://magazine.rubyist.net/articles/0009/0009-YAML.html
- https://qiita.com/yu124choco/items/a2710ec004d3425a2a0b
[Android]LeakCanaryによるメモリリークの検知

### Androidアプリにおけるメモリリーク
Androidアプリ開発をしている上で、メモリリークって怖いですよね。
「Contextの扱いを誤るとメモリリークするよ！」って言われても
「そもそもContextってなんやねん！」って思われている方も多いのではないでしょうか。

### LeakCanary
開発中のアプリでRecyclerViewを使っていて、[こちら](https://qiita.com/yfujiki/items/7a01039e0c7b0d25c31e)の記事を拝見しました。
たまたま開発中のアプリでも同様の実装をしており、メモリリークが身近なものであるということを再認識したので
上記の記事でも紹介されているLeakCanaryを導入してみました。

#### 導入
appレベルのbuild.gradleに依存関係を追加するだけです。
古いバージョンではちょこっとソースコードを書く必要があったようですが、
最新バージョンではソースコードを書く必要すらありません。

```
dependencies {
    def leakcanary_version = "2.2"

    // LeakCanary
    debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakcanary_version"

}
```

#### 使い方
アプリ実行中するだけ。
メモリリークを検知するとアプリが通知してくれるようになります。
![Screenshot_1582356636.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238072/e37806c7-615c-26d1-4a36-1463dfdc40eb.png)

通知をタップすると、より詳細なダンプを確認できます。
めっちゃ便利。

### 参考
- [LeakCanary公式ページ](https://square.github.io/leakcanary/)
- [RecyclerView 周りで割と簡単に起きるメモリリーク 2つとその解決方法](https://qiita.com/yfujiki/items/7a01039e0c7b0d25c31e)
RaspberryPiで重さ測る その1 導入編

##モチベーション
重さ測りたい

##参考ページ
https://qiita.com/KZ2/items/5492e15cc15f766ca9bd

##環境
RaspberryPi3B+
Raspbian 9.8
RPi.GPIO
python

##追加購入品
- デジタルロードセル 電子スケール ロードセル計量センサ 重量センサ5KG + HX711 24BIT精密ADモジュール Arduinoと互換、ナイロンガイドポストとネジ付き、教育DIY ￥1,300
https://www.amazon.co.jp/gp/product/B07JL7NP3F/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1

- 構成物
    - ロードセル
    - HX711 : 24bitのA/Dコンバータ

## 接続
VCC - Raspberry Pi3 5V  Pin 2
GND - Raspberry Pi3 GND Pin 6 
DT  - Raspberry Pi3 BCM5 Pin#29
SCK - Raspberry Pi3 BCM6 Pin#31 

## テスト用ソフトウェアの入手

```
pi@raspberrypi:~/loadcell $ git clone https://github.com/tatobari/hx711py
Cloning into 'hx711py'...
remote: Enumerating objects: 22, done.
remote: Counting objects: 100% (22/22), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 220 (delta 11), reused 14 (delta 5), pack-reused 198
Receiving objects: 100% (220/220), 58.69 KiB | 0 bytes/s, done.
Resolving deltas: 100% (116/116), done.

```

##実行
```
pi@raspberrypi:~/loadcell/hx711py $ python example.py
Tare done! Add weight now...
-1763
285
797
2845
2845
3869
2845
797
5149
3869
2845
3869
3869
3869
2845
4381
4893
4637
^CCleaning...
Bye!

```

## 補正値(REFFERENCE UNIT)を決める

キッチンスケールで測ったら274.5gであったマグカップをロードセルに乗せて実行

```
pi@raspberrypi:~/loadcell/hx711py $ python example.py
~~省略~~
102959
102931
102967
102935
102981
102987
102965
102946
103002
```

平均すると102973.8438なので
102973.8438 / 274.5 = 375.1324
を補正値に採用する。
ソースコードを一部改変。

``` example.py
referenceUnit = 375.1324
```


```
pi@raspberrypi:~/loadcell/hx711py $ python example.py
~~省略~~
274
274
274
```

g単位の精度はありそうです。
おわり。
Nuxtのグローバルスタイルシート備忘録

グローバルスタイルシートは、よほど小さいプロジェクトでない限り使うことになるので、各種設定を備忘録的にここに記しておきます。

```js:nuxt.config.js

export default {
  modules: [
    'bootstrap-vue/nuxt', // Bootstrap Vueの例
    '@nuxtjs/style-resources',
  ],

  styleResources: {
    scss: [
      // アンダースコア "_" とか ファイルの拡張子 ".scss" はちゃんとつける
      './assets/style/_global.scss'
    ]
  },
}
```

```scss:./assets/style/_global.scss
@import '~@/node_modules/bootstrap/scss/bootstrap'; // Bootstrapの例
@import '~@/node_modules/bootstrap-vue/src/index'; // Bootstrap Vueの例
@import '~@/assets/style/_variables';
@import '~@/assets/style/_style';
```

あとは、`_variables.scss`に変数を指定したり（`$hoge: 128px;`）、`_style.scss`にその変数を使ったスタイルクラスを定義したりするだけです。
streamを使ってBigDecimalの計算をする - sum編 - 

# 基本構文

```java

List<BigDecimal> heightList = Arrays.asList(new BigDecimal("70.20"), new BigDecimal("80.12"));
BigDecimal sum = hogeList.stream.reduce(BigDecimal.ZERO, BigDecimal::add);
```

# オブジェクト内のBigDecimalの合計

```java
class Person {
    private final String name;
    private final BigDecimal weight;
    
    Person(String name, BigDecimal weight) {
        this.name = name;
        this.weight = weight;
    }
            
    public BigDecimal getWeight() {
        return this.weight;
    }
    
}

public class Main {
    public static void main(String[] args) throws Exception {
        Person p1 = new Person("太郎", new BigDecimal("72.1"));
        Person p2 = new Person("二郎", new BigDecimal("79.1"));
        
        List<Person> personList = Arrays.asList(p1, p2);
        
        BigDecimal totalWeight = personList.stream().map(Person::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
        
        System.out.println(totalWeight);
    
    }
}
```

## おまけ utilクラスを作ろうと思うと

```java
public class Main {
    public static void main(String[] args) throws Exception {
        Person p1 = new Person("太郎", new BigDecimal("72.1"));
        Person p2 = new Person("二郎", new BigDecimal("79.1"));
        
        List<Person> personList = Arrays.asList(p1, p2);
        
        BigDecimal totalWeight = sumBigDecimal(personList, Person::getWeight);
        
        System.out.println(totalWeight);
    
    }
    
    public static <T> BigDecimal sumBigDecimal(List<T> list, Function<T, BigDecimal> mapper) {
        return list.stream().map(mapper).reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}
```
COTOHA アクセストークンの取得 (Node.js)

[COTOHA API Portal](https://api.ce-cotoha.com/contents/index.html) の使用例です。

次と同じことを Node.js で行いました。
>[COTOHA アクセストークンの取得](https://qiita.com/ekzemplaro/items/e2f120bb0848e119be60)

```js:access_token.js
#! /usr/bin/node
// ---------------------------------------------------------------
//
//	access_token.js
//
//					Feb/22/2020
//
// ---------------------------------------------------------------
console.error ("*** 開始 ***")
const dotenv = require('dotenv')
var Client = require('node-rest-client').Client

dotenv.config()

var config = {
	client_id: `${process.env.CLIENT_ID}`,
	client_secret: `${process.env.CLIENT_SECRET}`,
	developer_api_base: `${process.env.DEVELOPER_API_BASE_URL}`,
	access_token_publish_url: `${process.env.ACCESS_TOKEN_PUBLISH_URL}`,
}

const data = {
	"grantType": "client_credentials",
	"clientId": config.client_id,
	"clientSecret": config.client_secret
	}

const url = config.access_token_publish_url

const headers={
	"Content-Type": "application/json"
	}

const args = {
	data: data,
	headers: headers
}

var client = new Client()

client.post(url, args, function (data, response) {
	console.log(data)
	console.error ("*** 終了 ***")
})

// ---------------------------------------------------------------
```

実行コマンド

```bash
export NODE_PATH=/usr/lib/node_modules
./access_token.js
```

使ったバージョン

```text
$ node --version
v13.9.0
```
Ruby on Rails チュートリアル(windows10環境)

# Ruby on Rails チュートリアルをWindows10で動かしてみた h1
初投稿なので書き方は徐々に覚えていくつもりです

2･3･3　ユーザーはたくさんおおくのマイクロポストを持っているで
詰まっている

--------------------------------------------------------------
irb(main):040:0> first_usr = User.first
  User Load (0.5ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "MH", email: "MH@example.com", created_at: "2020-02-22 05:06:50", updated_at: "2020-02-22 05:06:50">
irb(main):041:0> first_usr.microposts
  Micropost Load (0.5ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? LIMIT ?  [["user_id", 1], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Micropost id: 1, content: "FirstPost!", user_id: 1, created_at: "2020-02-22 05:05:13", updated_at: "2020-02-22 05:05:13">, #<Micropost id: 2, content: "SecondPost", user_id: 1, created_at: "2020-02-22 05:05:40", updated_at: "2020-02-22 05:05:40">]>
irb(main):042:0> micropost = first_user.microposts.first
  Micropost Load (0.4ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."id" ASC LIMIT ?  [["user_id", 1], ["LIMIT", 1]]
=> #<Micropost id: 1, content: "FirstPost!", user_id: 1, created_at: "2020-02-22 05:05:13", updated_at: "2020-02-22 05:05:13">
irb(main):043:0> micropost.user
Traceback (most recent call last):
        1: from (irb):43
NoMethodError (undefined method `user' for #<Micropost:0x00000000063c1ad0>)
Did you mean?  user_id
irb(main):044:0> p micropost
#<Micropost id: 1, content: "FirstPost!", user_id: 1, created_at: "2020-02-22 05:05:13", updated_at: "2020-02-22 05:05:13">
----------------------------------------------------------

Tracebackで
micropost のdid you mean? user_id
pメソッドで確認すると確かにmicropostの中にid やuser?id はあるがuserはないですね

チュートリアルをやっているのかやらされているのかわけがわからなくなってきた

次いってみよ
個人アプリの作り方


⓪作る目的
誰に対して、
なんのために使って欲しいのか
アプリができたことによってどんなことが起きるのか
これをしっかり明確にする

①フロント実装
マークアップ言語で実際になりを書いてみる
いろ、や

②計画の作成
ガントチャート、トレロを駆使して

③ER図
ユーザー、グループ、ツイート
各項目ごとの関係を洗いなおす。

■アプリ作成は
・１つのアプリの質を上げまくる
・簡単なアプリをつくりまくる
↓
結論どちらでもOK
⓪番の目的がしっかりしているならおk！！
ユーザーがいかに使いやすく
「サービスを利用するユーザーにとって使いやすいかどうか」を常に忘れずに





２
Swift UI + SwinjectでDI(Dependency Injection)する方法

SwiftUIで[Swinject](https://github.com/Swinject/Swinject)などのDIコンテナを使ってDIするときの解決策として、ネストした型を使う方法を考えてみたので共有します。

### SwiftUIの場合、どこでDIする？

SwinjectでDIするとき、従来のStoryboardなら[SwinjectStoryboard](https://github.com/Swinject/SwinjectStoryboard)というものが用意されていました。SwiftUIの場合はどうしたらよいでしょうか？

例えば、次のコードの`SomeContentView`をDIしたいときはどうすればよいか？

```swift:'SwiftUIの例
struct BookMarkRow: View {
    var body: some View {
        HStack {
            Text(bookMark.title)
            NavigationLink(destination: SomeContentView()) {
                Text("Next Page")
            }
        }
    }
}
```



### 解決策

まず、 `DependencyInjectable`というDI可能なprotocolを宣言します。

```swift:DIできるprotocolの宣言
protocol DependencyInjectable {
    associatedtype DependencyType
    var di: DependencyType! {get set}
    func resolveDependencyInstance() -> DependencyType
}

extension DependencyInjectable {
    internal func resolveDependencyInstance() -> DependencyType {
        let container = DIContainer.shared.getContainer()

        return container.resolve(type(of: self.di))!!
    }
}
```

次に、これを実装したstructを作ります。
`struct Dependency`の中に依存するオブジェクトが注入されます。

```swift:DIできる型を実装したstruct
struct SomeContentView: DependencyInjectable {
    typealias DependencyType = Dependency
    struct Dependency {
        var p: TestProtocol
    }
    var di: Dependency!
    
    init() {
        di = resolveDependencyInstance()
    }
    
    func use() {
        di.p.test()
    }
}
```

依存性を解決するDIコンテナを宣言します。
※ `SomeProtocol`や`SomeProtocolImpl`は何でも良いので省略します

```swift:DIコンテナの宣言
class DIContainer {
    static let shared = DIContainer()

    private init () {}

    func getContainer() -> Container {
        let container = Container()

        container.register(SomeProtocol.self) { r in
                return SomeProtocolImpl()
        }

        container.register(SomeContentView.DependencyType.self) { r in
                return SomeContentView.DependencyType(p: container.resolve(SomeProtocol.self)!)
        }
        
        return container
    }
}
```

実際に使うときは次のようにすれば、`SomeContentView`は依存性が注入された形でインスタンスが生成されます。

```swift:使い方
let c = SomeContentView()
c.use()
```

### まとめ

`DependencyType`の中に依存するオブジェクトを宣言しておけば、あとはDIコンテナ内で依存関係を解決してやれば良いので、手間いらずだと思います。

extensionの中にDIコンテナが入るので、Service Locatorのようにも見えますが、依存するものはすべて`DependencyType`の実装の中で確定し、依存するものはすべてDIコンテナの中で生成しているので、Service Locatorのように依存関係がわかりづらくなることはないと思います。

ほかに、もっと良い方法があれば教えて下さい。
CSVファイルに地物情報を付加させて別形式で出力させる(Python3, GeoPandas)

#はじめに
何かと必要な情報はCSVで転がっているが、地物情報を付加させるのにひと手間必要でもう疲れた。のでフォルダ内全てのCSVをGeoJSONに変換することを検討した。

#使用モジュール
geopandas
pandas
shapely
os

#プログラム
読み込むフォルダーはhogefolder
ファイルは
20200222_1.csv
20200222_2.csv
....
と構成されており、それぞれのCSVファイルは

|date|londitude|latitude|data|
|---|---|---|---|
|2019-01-01|133.0000|33.0000|hoge|
|2019-01-02|132.0000|34.0000|hoge|
|...|...|...|...|

のような形になっているものとする。


```python
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point
import os

file_list = os.listdir('./hogefolder')
for file in file_list:
    name = file[-14:-4]
    opfile = './OutputCSV/'+opfile
    df = pd.read_csv(file,header = 0)

    Geometry = [Point(xy) for xy in zip(df.longitude, df.latitude)]
    df = df.drop(['longitude', 'latitude'], axis=1)
    Crs = {'init': 'epsg:4326'}
    gdf = gpd.GeoDataFrame(df, crs=Crs, geometry=Geometry)

    outputname = './OutputJSON/'+str(name)+".geojson"
    gdf.to_file(outputname, driver='GeoJSON')
```

CSVファイルを直接geopandasには読み込めないためpandasを経由している。
pandasで読み込ませたデータフレームからlongitudeとlatitudeを読み込み、Point(XY)というgeopandasで読み込めるGeometry形式に書き換えをしている。
元のlon, latは今回`drop`で削除しているが、残しておいても問題ない。
CRS(今回はWGS84)を指定し、geopandasに読ませている。

出力は出力先と形式を指定すればよい。(シェープファイルやGeoPackageにも出力できる。)

様々な形に応用ができるので、活用してほしい。


簡単にでしたが以上です

何かご意見等ございましたら
twitterまでご連絡ください@ohcelot

2020/02/22 新規作成

参考サイト
[GeoPandas公式](https://geopandas.org/)
https://gist.github.com/nygeog/2731427a74ed66ca0e420eaa7bcd0d2b