OmniAICreator/Qiita-1.07M huggingface dataset:
has_many_attachedなActiveStorageに属性を付与する

とあるModelに複数のファイルをAttachさせるときに、
`ActiveStorage` の `has_many_attached` を使うことはよくあると思いますが、
このとき、

- ファイルに属性を付与したい
- 同じ属性のファイルが既にあるなら削除したい

的な感じの気持ちが溢れ出ると思います。

ので、やります。

```ruby
class Foo < ApplicationRecord
  has_many_attached :bars
end
```

このクラスで何かをattachします

```ruby
class Foo < ApplicationRecord
  has_many_attached :bars
  def attach_bars
    bar = 'something' #何らか適当なファイル的なやつ
    bars.attach(
      io: StringIO.new(bar),
      filename: 'なんらかてきとうなふぁいるめい.txt',
      content_type: 'text/plain',
      metadata: { bar_type: 'something' }
    )
  end
end
```

`metadata: { bar_type: 'something' }` の部分が何かいい感じのやつで、これで `active_storage_blobs.metadata` に `"bar_type": "something"` な感じでデータが保持されるようになります。やったね。


これで属性付与できたので、 `bars` の中で `bar_type == 'something'` なattachmentを削除したい場合は、

```ruby
foo = Foo.find(xxx)
foo.bars.select {|bar| bar.metadata[:bar_type] == 'something' }
  .each {|bar| bar.purge }
```

みたいな感じでpurgeすることはできるんですが、仮に `bars` が100件とか200件とかなってきたらウザウザなので、事前にクエリで絞り込む的なことがしたくなりました。

というわけで、しました。

```ruby
foo.bars.joins(:blob).where(
  "`active_storage_blobs`.`metadata`->>'$.bar_type' = ?", 'something'
).each { |bar| bar.purge }
```

やったね！
手順メモ: ec2でmecabをインストールする

# 前提
- small以上のec2インスタンスを作成しておく。
   - ※mecab-ipadic-neologd をインストールする際に、[メモリに1.5G以上の空きがないとビルドが落ちてしまうから](http://blog.genies.jp/2016/05/aws-ec2mecabipa-mecab-ipadic.html)


- 必要なファイルを用意する
    - [mecab](http://taku910.github.io/mecab/)から本体と辞書のtarファイルをダウンロードして、s3の適当なバケットにアップロードする

- 作成するディレクトリ構造（自由に決めてもらってかまわない）

```
    src
     └── api
         ├── asset
         │   ├── mecab-0.996.tar.gz
         │   └── mecab-ipadic-2.7.0-20070801.tar.gz
         └── dev
             └── mecab-0.996
                 ├── mecab-ipadic-2.7.0-20070801
                 └── mecab-ipadic-neologd
```

# 手順

```
## ec2に最初にログインしたときに、yumをアップデート
$ sudo yum update -y

## 日本時間に設定
#＃ ZONE="Asia/Tokyo"に書き換える。
$ sudo vi /etc/sysconfig/clock
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ sudo reboot

## reboot後、sudoにパスワードが求められるので、一旦ec2から抜ける
$ sudo yum -y install -y gcc* 
$ sudo yum -y install -y make
$ sudo yum install -y git
$ sudo yum install -y patch

## S3に適当なバケットを作り、mecab, neologdを保存する
## ec2にs3のオブジェクトをgetできるIAMロールを付与する
$ mkdir -p src/api/dev
$ aws s3 cp s3://バケット名/hogehoge/mecab-0.996.tar.gz .
$ tar zxvf ../../asset/mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./configure --with-charset=utf8
$ make
$ sudo make install
$ which mecab
/usr/local/bin/mecab
$ sudo bash -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/usr-local.conf'
$ sudo ldconfig

## 辞書をインストール IPA （Neologdを利用するのでスキップしてもかまない）
$ aws s3 cp s3://バケット名/hogehoge/mecab-ipadic-2.7.0-20070801.tar.gz .
$ tar zxvf ../../asset/mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8
$ make
$ sudo make install

## 辞書をインストール　Neologd
$ cd ../
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ ./bin/install-mecab-ipadic-neologd -n -y

## 下記ディレクトリにNeologdがあれば良い
$ ls -la /usr/local/lib/mecab/dic/
ipadic/               mecab-ipadic-neologd/ 

## mecab+Neologdの動作確認
$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/
ブラタモリを見た
ブラタモリ	名詞,固有名詞,一般,*,*,*,ブラタモリ,ブラタモリ,ブラタモリ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
EOS

```
mecabの設定完了！

# メモ
- 手元のマシンにあるmecabのtarファイルをec2に持っていきたいとき、[aws-cli](http://yamada.daiji.ro/blog/?p=186)の他に[s3cmd](http://bioinfo-dojo.net/2016/07/21/aws_and_s3/)を使う方法もある。

- mecabの辞書について
ipaかneologdどちらでもかまないが、neologdはipaより固有名詞をうまく分けてくれる。
【pandas】dataframe同士の結合時の注意

# 謎
類似記事を取得する関数を作っていたときに、なぜか結果が2回出力される。

```Python:実行プログラム
for index, row in df3.iterrows():
    result = model.docvecs.most_similar([model.infer_vector([texts[490]])], topn=5)
    print(result)
```

```Python:結果
[(61986, 0.4148428440093994), (93717, 0.40714001655578613), (67228, 0.39675790071487427), (18714, 0.39518919587135315), (71296, 0.39392682909965515)]
[(61986, 0.4148428440093994), (93717, 0.40714001655578613), (67228, 0.39675790071487427), (18714, 0.39518919587135315), (71296, 0.39392682909965515)]
```

most_similar関数の使い方が間違っているのかなと思い、公式サイトを読む。
特に関数の使い方で間違ってはなさそうだった。

不思議なので、ちょっと変更したプログラムで再度実行してみる。

```Python:実行プログラム
i = 0
for index, row in df3.iterrows():
  if index == 490:
    result = model.docvecs.most_similar([model.infer_vector([texts[490]])], topn=5)
    print(i, result)
    i += 1
```

```:結果
0 [(61986, 0.4148428440093994), (93717, 0.40714001655578613), (67228, 0.39675790071487427), (18714, 0.39518919587135315), (71296, 0.39392682909965515)]
1 [(61986, 0.4148428440093994), (93717, 0.40714001655578613), (67228, 0.39675790071487427), (18714, 0.39518919587135315), (71296, 0.39392682909965515)]
```

.........んんー？！if文が2回反応してるだとっ？！  ｺﾞｼ(っд⊂)ｺﾞｼ

# ハマりポイント

df3は、下記のようにpandasライブラリのdataframeで作りました。

```Python:実行プログラム
df = pd.read_json('/hoge_01.json')
df2 = pd.read_json('/hoge_02.json')
df3 = pd.concat([df,df2])
```

はい、これが原因でした。

pandasでは、dataframe同士をどう結合させるか決めることができ、上記のようにconcatする際に何も指定していないとindexは **振り直されません** 。

つまり、

```Python:実行例
tdf = pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})
tdf1 = pd.DataFrame({'a':[4,5,6],'b':[7,8,9]})
pd.concat([tdf, tdf1])
```

```:実行結果
 	a 	b
0 	1 	4
1 	2 	5
2 	3 	6
0 	4 	7
1 	5 	8
2 	6 	9
↑
index
```

ということですね。

結合の仕方は色々とあるようで用途にあったやり方で結合させましょう。

dataframe同士の結合についての参考サイト
参考サイト：http://sinhrks.hatenablog.com/entry/2015/01/28/073327

終わり
[まとめ] Http(s),Cookie,Sessionについて

#Http(s),Cookie,Sessionについて

勉強ついでに上記3つについて簡単にまとめてみました。

##Http(s)とは

ホームページを表示するための世界共通のルールでホームページを閲覧する上での約束事。

もし約束事を決めずにサーバーやブラウザごとに独自のルールを作っていたら、アクセスする環境によっては表示できないという問題が発生してしまうため、全世界でホームページを表示するためのルールを作ろうというために作れたのがhttp(s)。

##httpsのsは何か

簡単に比較するとhttpは暗号化されていないデータ。httpsは暗号化されているデータ。
sがつくとセキュリティ対策がされている。対策はされてはいるが、URL欄のところでエラーが表示されていた場合、安全とは言い切れないので注意が必要。

##Cookieとは

Cookieとはブラウザに保存されるWebデータのこと。データはクライアント側のパソコンで保存されるため、見ようと思えば見れるが、他人のを勝手に見るのは法律的にアウト。

Cookieを使えば、例えばSNSなどで一度ログインすると、次回開いたときログイン処理をしなくても入れるようになる。
だが、開発側目線で見るとログイン情報をCookieに保存すると一部の悪い大人たちが、Cookieに保存されてるログイン情報を抜きとって悪用する恐れがあるため、Cookieにそのままログイン情報を保存するようなことは基本ない。

##Sessionとは

CookieとSessionの大きな違いは保存先が違うということ。
上記でCookieの保存先はクライアント側のパソコンと書いたが、Sessionの場合はホームページのサーバー側に保存される。
サーバーはホームページを運営してる人しか基本、閲覧、操作できないため、セキュリティ面での安全性はSession > Cookieというような形になり、Sessionのほうに軍配が上がる。

SessionはIDのみCookieの中で保存されている。
なので、Sessionの中身を参照する場合、Cookieの中に保存されてるSessionのIDをサーバー側に投げて、サーバー内にあるIDと関連した情報を持ってくるような形になる。

上記から分かるように、一度サーバーを介して情報を取得しているため、Cookieと比べると実装する際、ひと手間加える必要がある。

##CookieとSessionの比較

上記で長々と書いたが、簡潔に比較すると...

Cookieは手軽に実装できる分、セキュリティ面でSessionより劣っている。
Sessionは実装に手間がかかる分、セキュリティ面でCookieより優れている。

なので、とりあえずこっち使ってればいいとかではなく、その時、その時の状況に応じて使い分けていくのがベスト。
AIエンジニアに直ぐになる！Python / AI / 機械学習 / 深層学習 / 統計分析を数日で網羅的に習得！

# 絶対に読んでほしい、手元に置いておきたい３冊（実務で使えること勉強しません？）

事業会社にいるITスタッフとして事業会社の実務で使えるコンパクトな網羅的な書籍や情報がなくかなり悩んでおりました。本屋に行ってもネットの情報を見ても多くの本や情報が溢れていますが、実際のソースコードが乏しく情報がかなり断片的、「網羅的な情報」（これ重要！）でなく理解に苦しむことが多かったです。プログラミングスクールのカリキュラムと比較しましたが、これら３冊の本を読破して実務で実践した方がよっぽどか身に付くと思いました。大規模書店に出向き本を徹底的に比較しクイックに（私のイメージでは数日で）網羅的に習得したい場合にお勧めな書籍がこちら、次の３冊になりました。実際に私も買いましたが、数日で読み切り基本的な機械学習、深層学習のコードが書けるレベルまで成長できました。初心者が網羅的なAIのフルスタックエンジニアとしてすぐに自立するには必携なはずです！

**（１）すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方
https://amzn.to/2OSFeSh**

断然この一冊は一押しです！実務への応用がすぐにイメージがつきました。Google Colaboratoryの説明だけではなくほぼ全ての演習で実際にColaboratory上でコピペして流せるコードがついています（手元にJupyter Notebook環境を構築した場合も想定されています）。NumPy, SciPy, Pandas, scikit-learn (学習とテストケース分け), OpenCV (OCR, 手書きや画像認識、ぼかし処理、動画解析),自然言語処理、スパム判定への応用、TensorFlowやKeras, MNIST, CNNなどのライブラリを活用した深層学習についても網羅的に学べてすぐに実行可能なソースコードがついています。TensorFlowやKeras, CNNライブラリなどを使った場合や使わなかった場合のコードの違いにまで言及されており、この一冊で誰もが明日からAIエンジニアになれそうです。 https://amzn.to/2OSFeSh

**（２）東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~
https://amzn.to/2R4BIY1**

東京大学松尾研究室がネットで公開している情報をより詳細を加えて書籍化されたもの。Pythonの言語特性や統計分析、機械学習のエントリーレベルとしてすごく役立ちます。 Google Colaboratoryで実行可能。大方の内容が研究室で公開はされていてそれだけでも勉強できなくもないのですが、とにかく量が多いので、ネットのファイルだけでは混乱し復習が大変だと思いましたし頭の中にスーッと入れるには本があった方が助かりました。そんなに高くないので時間短縮を考えると手元に本があった方がいいです。　https://amzn.to/2R4BIY1

**（３）統計学図鑑
https://amzn.to/2R0zys3**

一番コンパクトで一番網羅的に統計学の基礎が書かれている本に見えました。データサイエンティスト必携だと思います。記述統計学、確率分布、推測統計学、信頼区間、仮説検定、分散分析と多重比較、ノンパラメトリック、実験計画、回帰分析、多変量解析、ベイズ統計学とビッグデータと誰もが何かしら聞いたことがあるキーワードについて網羅的に図などを活用しコンパクトにまとめられています。https://amzn.to/2R0zys3

私の場合は経済学で統計学を一部学んでいたこととプログラミングの知識もゼロではなかったというバックグラウンドではあるもののどちらもゼロベースでも十分に使える書籍だなあと思いました。バックグラウンドが少しでもあれば復習や知らない知識の補完が非常に楽な３冊だと思います。
統計学の知識はAI処理で必須ではないこともあると思いますが、電算処理の業務要件によっては統計分析のエリアになるので信頼を得るにも基礎固めはしておいた方が良さそうです。
Oracle Bronze SQL基礎I -副問合せ-

#副問合せ

本日の勉強中。今回は、副問合せについて。
サブクエリはややこしくて序盤、躓いてしかいなかった。

理解しきらなかったところを
重点的にまとめる**あくまで備忘録**。

副問合せは、SELECT文のSELECT句、FROM句、WHERE句、HAVING句、ORDER BY句の他、INSERT文やUPDATE文等のDML文でも使用することができます。

##副問合せの使用方法

副問合せには、次のようにいろいろな使用方法があります。
・SELECT文のSELECT句、FROM句、WHERE句、HAVING句、ORDER BY句や、
　INSERT文、UPDATE文等のDML文で使用できる
・主問合せと副問合せで異なる表にアクセスできる
・1つの主問合せに対し、複数の副問合せを指定できる
・副問合せをネストできる(WHERE句に指定した副問合せでは255レベルのネストが可能)
・副問合せの中でGROUP BY句やHAVIMG句、ORDER BY句を使用できる

なお、副問合せには、**1件のデータを返す単一行副問合せ**と
**複数行の結果を返す複数行副問合せ**があります。

複数行副問合せとは、複数件のデータを返す副問合せです。
単一行副問合せと同じようにGROUP BY句を指定したり、
副問合せを(*1)ネストしたりすることができます。

また、複数列のデータを返すこともできます。

(*1)用語は次項で解説

副問合せを記述する場合は必ず()括弧で囲みます。
また、副問合せは通常比較演算子の右辺に記述しますが、左辺に記述してもかまいません。

また、単一行副問合せの場合、比較演算子に複数行演算子を使用しても
エラーにならず正常に実行されます。
しかし、複数行副問合せに単一行演算子を使用するとエラーとなります。

##用いられる用語

|用語 | 説明|
|:-----------------|:------------------|
|インライン・ビュー|FROM句の副問合せのこと|
|ネスト|関数の引数に別の関数を指定すること|
|内部結合|表の結合において結合条件を満たすデータのみを取り出す方法|
|複数行副問合せ|複数件のデータを返す副問合せのこと|

##特徴

Oracle DatabaseではSQL文の中に別のSQL文を入れ子にして実行することができ、
入れ子の内側の問合せのことを副問合せといいます
(副問合せに対し、外側の問合せを主問合せといいます)。

通常の副問合せを使用したSQL文ではまず副問合せが実行され、
副問合せの実行結果をもとに主問合せが実行されます。

##演算子

|演算子|説明|
|:-----------------|:------------------|
|IN|リスト内のいずれかの値と等しい場合にTRUEを返す|
|NOT IN|リスト内の全ての値と等しくない場合にTRUEを返す|
|ALL|'リスト内のすべての値と'という意味で等号不等号記号等を用いて使用される|
|ANY|'リスト内のいずれかの値と'という意味で等号不等号記号等を用いて使用される|

###IN演算子

IN演算子はリスト内のいずれかの値と等しい場合にTRUEを返すため、
IN演算子の値のリストにNULL値以外の値が含まれていて、
その値と比較対象の値が等しければ、主問合せでデータが取り出されます。

なお、NULL値同士を判定してもNULL値となり、
値が等しいという判定ができないため、"NULL"である行は取り出されません。

###NOT IN演算子

NOT IN演算子は、リスト内の全ての値と等しくない場合にTRUEを返します。
そのため、NOT IN演算子の値のリストにNULL値が含まれていると、
NULL値と比較対象の値の比較結果がNULL値になるので、
全ての値と等しくないという判定がなされず、
主問合せではデータが1件も取り出されません。

・NOT IN(値のリスト)は<>ALL(値のリスト)と等価である
・NOT IN(値のリスト)にNULL値が含まれている場合は、データは1件も返されない

###ALL

'リスト内のすべての値と'という意味で等号不等号記号等を用いて使用されます。

|演算子|説明|
|:-----------------|:------------------|
|=ALL|リスト内すべての値と一致|
|<>ALL|リスト内すべての値と不一致|
|>ALL|リスト内すべての値より大きい|
|>=ALL|リスト内すべての値以上|
|<ALL|リスト内すべての値より小さい|
|<=ALL|リスト内すべての値以下|


・=ALL(値のリスト)はIN(値のリスト)と等価ではない

###ANY

'リスト内のいずれかの値と'という意味で等号不等号記号等を用いて使用されます。

|演算子|説明|
|:-----------------|:------------------|
|=ANY|リスト内のいずれかの値と一致|
|<>ANY|リスト内のいずれかの値と不一致|
|>ANY|リスト内のいずれかの値より大きい|
|>=ANY|リスト内のいずれかの値以上|
|<ANY|リスト内のいずれかの値より小さい|
|<=ANY|リスト内のいずれかの値以下|

・=ANY(値のリスト)はIN(値のリスト)と等価である

##次回

ハッピーターンを食べながら書いた今回の記事ですが、
見落としが多く、落ち着いて解いたら取れそうなんだよなあ。

引き続き進めていきます。。

随時更新中＠あんず飴
【Python】Matplotlibを日本語化するメモ【Windows】

#結論

1.（ https://ipafont.ipa.go.jp/node26 ）からIPAexゴシック(Ver.----)をダウンロードする
2. zipファイルを解凍し、中のipaexg.ttfをコピーする。
3. Pythonの環境フォルダの\Lib\site-packages\matplotlib\mpl-data\fonts\ttfのフォルダ内に張り付ける。
4. C:User/name/.matplotlibフォルダ内のデータを全て消す。

```
plt.rcParams["font.family"] = "IPAexGothic"
```

OK
kotlinのプロパティとカスタムアクセサ

kotlinは、プロパティという仕組みによって、メソッドによるアクセサ(いわゆるgetterやsetter)の記述を省略できる。
一方で、アクセサを省略せずに記述することも可能である。これをカスタムアクセサという。

カスタムアクセサを使う場面を調べてみた。

#1.kotlinでカスタムアクセサを使う場面
単純に、変数に値を設定する場合、もしくは変数の値を取得する場合には、アクセサの記載は不要である。
そのままプロパティを利用すればよい。

**条件つけて変数の値を取得したい**場合、もしくは、**条件をつけて変数に値を設定したい**場合に、カスタムアクセサが必要になる。
カスタムアクセサにその条件を記述する。

以下は、カスタムアクセサの利用例だが、単純に変数の値を設定、取得するのではなく、取得、設定する際にString形式に変換しようとしている。

```
var stringRepresentation: String
  get() = this.toString()
  set(value) {
    setDataFromString(value) // 文字列をパースして他のプロパティへ値を代入する
  }
```
>Kotlinリファレンス　プロパティとフィールド
>https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/properties.html

#2.補足
###2.1.getter/setterとは
#####2.1.1.getter/setterの仕組み

>「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典「setter」
>https://wa3.i-3-i.info/word15855.html

#####2.1.2.getter/setterのメリット・デメリット

>Javaにおけるgetter/setterは必要性とは？オブジェクト指向プログラミング言語の動向
>https://geechs-magazine.com/tag/tech/20170215_2

###2.2.プロパティ
#####2.2.1.プロパティの登場

>getter/setterとはなんだったのか
>https://nagise.hatenablog.jp/entry/20141010/1412930502

######2.2.2.kotlinのプロパティ
kotlinでプロパティを利用すると、getter/setterのようなメソッドのアクセサが記述が省略できる。

クラス内で定義された変数(以下の例ではresult.name)に対して値を設定したい場合、次のようにおこなう。

```
public class Address { 
  public var name: String = ...
}

fun copyAddress(address: Address): Address {
  val result = Address() // 'new' キーワードは Kotlin にありません
  result.name = address.name // プロパティの利用。
  // ...
  return result
}
```


######2.2.3.kotlinのプロパティの中身

プロパティを利用するとkotlinにメソッドによるアクセサがなくったようにも思えるが、処理の中身はそうではない。
プロパティとはgetter/setterにあたるメソッドの自動生成である。

>プロパティの正体
>https://sys1yagi.gitbooks.io/anatomy-kotlin/content/%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E6%AD%A3%E4%BD%93.html
DEBUG定数のパターンを増やしたい

.netでよく使いがちな

``` 
#if DEBUG
XXXXXXXX
#endif
```

ってやつをDEBUGかReleaseか以外の判断をさせたい場合の対応方法です。

対象のプロジェクトを右クリックしてプロパティを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/0290e6c1-bc12-0521-5839-88dcf8c1e68d.png)

こんな感じで何かしらの文字列を入れておくと、、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/e71da457-41fa-09c1-c49a-a84cf6c406f9.png)

いい感じに切り替えができます。
openapiでswaggerのdefinitionsのようなことをする

業務でswaggerを使用する機会がありまして

```
{
  "pet": {
    "id": 0,
    "name": "doggie"
  },
}
```

このような感じでネストするobjectのレスポンスを作りたくて備忘録として残しておきます

https://techblog.zozo.com/entry/swagger_yaml#definitions%E3%82%92%E4%BD%BF%E3%81%86

こちらの記事を参考にさせて頂いて `definitions` を定義すればいいのかと思い
`.yml` ファイルに記述したのですがエラーが発生してしまい

`.yml` ファイルの中のversionを確認すると

```
openapi: 3.0.1
```

swaggerは2系のことで3系はopenapiで全く違ったことを忘れていました

調べているとopenapiはこのようなdifinitionsのような定義も全部`Components`に纏めているように変更されたようで（間違っていたら教えてください）

```
components:
  schemas:
    PetData:
      id: 
        type: integer
      name: 
        type: string
```
このように纏め

```
pet:
 $ref: '#/components/schemas/Pet'
```

こういう風に定義することで表示することができました

公式を見たらしっかり記法が載っていたので確認しろよって話でした。。。
pythonを触りながら基礎を学んでいく　変数編

# Pythonしてますか？
私ははじめました
question = あってます？あってますよね！そうですよね！
# progateというサイトで学んでいます
[ここはめっちゃわかりやすい！](https://prog-8.com/dashboard)

# 学んだこと`変数`
なんだかあだ名みたいなものかなという認識です
**あってます？あってますよね！そうですよね！**

`aaa = 15`
と先に指定しておけば
`bbb = aaa * aaa`と
繰り返し使えるそうです

でも、なんか回りくどいなって印象もあります
# なんで`変数`を指定するの？
その数字が何を表すものかを明確にしたいからです
**あってます？あってますよね！そうですよね！**

先に言っていた変数はあだ名みたいなもの
というイメージとちょっと変わってきましたね
あだ名は明確なものをある意味わかりづらくしてます
（知ってる人だけがわかる感じ）

# つまり`aaa = 15`これは良くない
`aaa`も`15`も何を表しているのかわかりませんものね

# こう書けばわかりやすいんじゃね？
my_age = 15
これで私の年齢は１５才なんだなっていう意味がわかってきますね
年齢、ばれちゃいましたね

# コレは便利という考え方
じゃあ私が５年後何歳になっているのかな？
という疑問を答えたい場合

```bash:私は１５才…そう…私は１５才…絶対私は１５才…
my_age = 15
five_years = 5

my_future = my_age + five_years
# 15 + 5 っていう数字より意味がわかりやすい
print(my_future)
# 何を知りたいのかわかりやすい

20
```
二十歳になりました`ヤッピー！マンモスうれピー！`

ちなみに
`print(ホニャララ)`で結果を表示することができます

っていうことで…いいのかな…
どうですか？
みなさん

こういうことで
# print(question)
ルーティングのグループ化

# ルーティングのグループ化

Laravel のシステム開発を行ったときの備忘録です。

大きなシステムになればなるほど、
〇〇系画面、△△ 系画面、✖✖ 系画面・・・・
と膨大に増えていきます。

そうすると、ルーティングが

```php:web.php
Route::get("/〇〇", "〇〇Controller@index");
Route::get("/〇〇/create", "〇〇Controller@create");
Route::post("/〇〇/create", "〇〇Controller@store");
･
･
･
```

と、どんどん長くなり、何がなんだか分からなくなりますし、
複数行に渡って記述していると、ミスだって増えます。

何よりひとつひとつ **何のための画面か**を考えながら読まなければならなくなります。

私も、初めは以下のようにコメントで区切ってました。

```php:web.php
// 〇〇系画面
Route::get("/〇〇", "〇〇Controller@index");
Route::get("/〇〇/create", "〇〇Controller@create");
Route::post("/〇〇/create", "〇〇Controller@store");
･
･
･
// △△系画面
Route::get("/△△", "△△Controller@index");
･
･
･
```

というのも、<font color="red">**まとめられる**</font>ことを知らなかったからでした。

## Group

グループ化するのだから、Group
そのままですね！

早速まとめてみます。

```php:web.php
// 〇〇系画面
Route::group(["prefix"=> "〇〇"], function() {
    Route::get("/", "〇〇Controller@index");

    Route::get("/create", "〇〇Controller@create");
    Route::post("/create", "〇〇Controller@store");
    ･
    ･
    ･
});

// △△系画面
Route::group(["prefix"=> "△△"], function() {
    Route::get("/", "△△Controller@index");
    ･
    ･
    ･
```

すこし見やすくなりました。

しかし、落とし穴がありました。
Group は<font color="red">**何をまとめているか**</font>を考えないといけないのです。

そのため、書いた本人は分かっても
他の人に見せるには少ししんどいコードになっていました。

## prefix

なんだ、prefix でグループ化できるやつがあるじゃないか。
これなら何でまとめているグループかすぐに判断できるので、こちらの方が適切です。

```php:web.php
// 〇〇系画面
Route::prefix("〇〇")->group(function() {
    Route::get("/", "〇〇Controller@index");

    Route::get("/create", "〇〇Controller@create");
    Route::post("/create", "〇〇Controller@store");
    ･
    ･
    ･
});

// △△系画面
Route::prefix("△△")->group(function() {
    Route::get("/", "△△Controller@index");
    ･
    ･
    ･
```

共通部分をまとめると、スッキリして見やすくなります。
これからも読み手のことも考えて、コードを書いていけたらと思います。
LINE Notifyのnpmライブラリ作った

## はじめに

[LINE Notify API](https://notify-bot.line.me/doc/ja/)の Node.js ライブラリを作りました。
https://www.npmjs.com/package/line-notify-nodejs

使い方とサンプルソースを紹介します。

## 使用イメージ

![Lwie2cZnxIv4eVYeEe9e1574930325-1574930375.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90087/be445a22-ef3c-be3c-4eaa-601b1f4b4858.gif)

## インストール

```
$ npm install line-notify-nodejs
```

## 使い方

簡単 2STEP です。

### STEP1. トークンを発行する

下記ページからトークンを発行します。

  - https://notify-bot.line.me/my/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90087/416bc8f9-8d0f-5ec1-cec0-020bfbc8354d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90087/43b87872-a9c6-0164-e042-dd9aaba2cd32.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90087/92783e7f-e000-5691-cbe4-31e180ee0d6b.png)

### STEP2. 通知を送信する

```javascript:index.js
const lineNotify = require('line-notify-nodejs')('****************'; // 先ほどコピーしたトークン

await lineNotify.notify({
  message: 'send test',
});
console.log('send completed!');
```

```
$ npm run index.js
```

これで通知が送信されます！
![Lwie2cZnxIv4eVYeEe9e1574930325-1574930375.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90087/be445a22-ef3c-be3c-4eaa-601b1f4b4858.gif)
IBM CloudでParentになっているユーザーを削除する方法

Parentになっているユーザーを削除しようとすると、次のエラーが表示されます。

```
Remove User:
User cloud not be removed. User cloud not be removed - You must disable or delete users first: ......
```

しかし、削除したいユーザーの子になっているユーザーを削除しなくても、子のユーザーのParentを別の親ユーザーに付け替えればOKです。
注意: 自分の親を変更することはできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/5d07f937-3acd-f866-66b0-096d51220b80.png)
Railsでeach（ループ）の中にモーダルを入れても変数が適用されない問題

# 問題
`variables.each do |variable|`という繰り返しのブロックの中で
それぞれの異なるvariableをmodalに渡す場合、
下記コードだと最初のvariableの値しか表示されない。


```
<% books.each |book| do %>
  <a href="#book_modal">クリックするとモーダルを表示するリンク</a> 
 
  <div class="modalList" id="book_modal">
    # ここはモーダル
  </div>
<% end %>
```


例えば、
`variables = [var1, var2, var3, var4]`
とした場合、本来期待する動きは
`1つめのモーダルには、var1`
`2つめのモーダルには、var2`
`3つめのモーダルには、var3`
`4つめのモーダルには、var4`
だが、上記だと４つのモーダルすべてに
`variable = var1`
が反映され、`var2, var3, var4`が反映されない。


# 解決策
<b>モーダルのidが一意となるような実装にしてやればよい。</b>

```
<% books.each |book| do %>
  <a href="#book_modal-<%= book.id %>">クリックするとモーダルを表示するリンク</a> 
 
  <div class="modalList" id="book_modal-<%= book.id %>">
    # ここはモーダル
  </div>
<% end %>
```

最初にあげたコードだと、４つのモーダルのidがすべて `book_modal`のため、
最初のvariableしか反映されなかった。

なので、Bookオブジェクトに一意に定められている `id`を使用して、
`id = "book_modal-<%= book.id %>"`
とした。

すると、

`1つめのモーダルのid: book_modal-var1`
`2つめのモーダルのid: book_modal-var2`
`3つめのモーダルのid: book_modal-var3`
`4つめのモーダルのid: book_modal-var4`

のように各モーダルのidが変わってくれるので、
eachで回している変数のそれぞれの値を反映させることができた。
UXデザイナーと連携する際に考慮したい事項

1ピクセルのデザインにこだわるUXデザイナーとの連携で、いろいろ苦労した経験からの知見を簡易的にまとめます

## ピクセル単位での調整を可能にする
エンジニアが、都度、確認できるデザインスペックが必要
XD、Sketch、Prott、Abstractなど、ピクセル単位で確認でき、素材を書き出せるツール・サービスを使う

## 要件定義書
最初、エクセルやスプレッドシートを使っていたが、エンジニアは更新しやすいものの、デザイナーや企画者は使いづらい
さらに、デザインスペックを別で用意する必要がある
→ XDで要件定義を作成してもらい、デザインスペックも同時に作成&確認できるようにした

## ワイヤーフレーム
要件定義からデザインを起こすまでのステップで、デザイナーがどのレベルまでデザインに落とし込めばいいか分からない
→ アプリエンジニアは、要件とデザインの両方がないと、実現可能かを判断できないケースが多いので、ある程度のデザインは必要だが、完成版を見せられると、その時点で判断不能に陥ることが多いので、ワイヤーフレームレベルのデザインで十分。
デザイナーとエンジニアで話し合うステップが必要なので、ワイヤーフレームレベルのデザインで一旦、エンジニアに共有する

## デザインスペックの指示通りに、修正は結構な手間がかかる
デザイナーがXcodeを使えるようにして、文字サイズやフォント、ピクセル単位での修正は、デザイナーにやってもらう

## デザイナーから受け取った素材を、リネームする手間がかかる
スプレッドシートで、素材依頼シートを作って、名前を指定して書き出してもらう
※あまりいい運用じゃなかったので、もっといい方法を考えた方がいい

## ピクセル単位で調整していると同じような素材が増え、アプリサイズが肥大化する
共通で使う素材は、命名規則で判別しやすいようにする。common_XXXXX など
デザイナーがエンジニアに渡す際に、共通で使う素材かどうかを伝えてもらえると助かります。

## カラーが細かくなり、どのカラーを使えばいいか、迷ってしまう
基本は、デザインスペック通りだが、間違えてるのではと思う箇所が出がちなので、大まかに、テキスト用のカラーとか、テーマカラーとかを決めて、間違いに気づけるように

iOSのTips
- 行間は、TextFieldだと行間指定できないので、UILabelかTextViewに変更する必要がある
- フォントを、システムフォントじゃなくて、ヒラギノに明示的に設定する
AndroidのTips
- Android は、dpで指定 (端末のフォントサイズ設定に対応する場合は、spがいいが、フォントサイズ対応すると、レイアウト崩れを考慮しないといけないので、逆にdp指定で対応させない)

## デザインのベースにする解像度の決め方
各プラットフォームでの端末シェアを考慮

【2019最新】スマホ・タブレットの解像度一覧表（画面サイズの割合）
https://webdesign-abc.com/tech/resolution-list/

【2019年】最新のディスプレイ・モニター解像度シェアが知りたい！
https://web-knight.net/display-resolution/

「iPhone6/7/8」で解像度は「375 * 667」
「Android XPERIA」。解像度は「360 x 640」
が無難

## デザイナーにお願いしたいこと
### Atomic Design を考慮して、パーツ・コンポーネント単位で定義してほしい→
これが出来ると、開発でもコンポーネント化しやすい
[参考]
Atomic Design を分かったつもりになる
https://design.dena.com/design/atomic-design-%E3%82%92%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A4%E3%82%82%E3%82%8A%E3%81%AB%E3%81%AA%E3%82%8B/
### AppleのHIGを隅々まで熟読してほしい
Human Interface Guidelines
https://developer.apple.com/design/human-interface-guidelines/
HIGから学ぶ、3つのナビゲーションとそのあるべき姿とは
https://note.com/ta0o_o0821/n/n140cd75cc023
### HIGを理解したあと、iOSとAndroidアプリの違いや、マテリアルデザインを熟読
マテリアル デザインでアプリの魅力を高める
https://developer.android.com/distribute/best-practices/develop/use-material-design?hl=JA
ただ、個人的には、マテリアルデザインのリファレンスは、より具体的な実装方法のマニュアル的な部分が多く記事も多いので、熟読するというより、マテリアルデザインがどういうもので、どんな事ができるかを把握してほしいという感じ
Human Interface Guidelines は概念的な内容で、マテリアルデザインはデザイン手法のマニュアルといった感じ

## その他
iOSとAndroidのUIの違い
https://nogson2.hatenablog.com/entry/2018/11/16/123256

iOS、Androidの解像度について(iOSはpt / Androidはdp)
https://qiita.com/eKushida/items/ff1ecaacdb54ce7f9f5c

## エンジニアもデザインのことを知る必要がある
【これからのスキル】デザイナーとエンジニアの境界線がどんどん無くなる
https://blog.btrax.com/jp/designer-engineer/
優れたプロダクト開発のために。エンジニアがデザインを学ぶ時のおすすめ本
https://goodpatch.com/blog/designbooks-for-developer/
Android(Pixel 3) OSダウングレード手順メモ

#はじめに
Androidアプリ開発で、OS依存の問題かを確認するためにAndroidOSをダウングレードする必要がありました。
少しハマったので手順をメモします。Android Studioは使わずに実施しました。
バックアップしてから実施してください。

#環境
PC：MacBook Pro
Android端末：Pixel3 AndroidOS10

#やりたいこと
Pixcel3のAndroidOSのバージョンを10から9にダウングレードしたい。

#手順
###1.ファクトリーイメージのダウンロード（PC）
pixcel3のイメージは以下にありました。
https://developers.google.com/android/images#blueline

###2.ダウンロードしたファクトリーイメージのフォルダを展開する（PC）

###3.カレントディレクトリを2で展開したフォルダに変更する（PC）

###4.開発者向けオプションの『OEMロック解除』と『USBデバッグ』を有効にする(Android)
開発者オプションの表示の仕方は以下。
https://enjoypclife.net/2018/12/23/android-9-developer-option-pixel-3/

###5.Android端末とPCをUSB接続する

###6.電源ボタンと音量（下）ボタンを長押しでBootloaderを起動する(Android)
PC側では`adb reboot bootloader`を実行すれば起動できます。

###7.`fastboot flashing unlock`を実行する(PC)
ブートローダーがアンロックされます。

###8.「Unlock fastboot」を選択する(Android)
これでDevice statusがunlockになります。

###9.`sh flash-all.sh`を実行する
しばらく待つと、Pixcel3が再起動して無事にダウングレードすることができました。

#おわりに
手順4の「OEMロック解除」をせずに実施していたこと、手順8が抜けていたことが原因で少しハマりました。
普段Androidを使っていないこともあって、Androidの勝手が分からず簡単なところで躓いてしまいます。。
Java暗号化、Word文書の解読

いくつかの重要な文書に対して，文書の内容が漏れないように保証します，常にファイルを暗号化する必要があります。ファイルを表示する時，パスワードを正しく入力してからファイルを開く必要があります。 本論文では、Word文書に対してSpire.Doc for Javaを使ってパスワード保護を設定し、パスワードを削除する方法を紹介します。

【示例1】Wordパスワード保護設定

```java
import com.spire.doc.Document;
import com.spire.doc.FileFormat;

public class EncryptWord {

    public static void main(String[] args) {

        // Word文書を読み込む
        Document document = new Document();
        document.loadFromFile("sample.docx");

        // パスワードで文書を保護します
        document.encrypt("abc-123");

        //文書を保存
        document.saveToFile("Encrypt.docx", FileFormat.Docx);
    }
}
```

ファイルの暗号化結果：
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/2885a95c-36a9-703e-09a9-7df87561b7e8.png)


【示例2】Wordパスワードの保護を解除します

```java
import com.spire.doc.Document;
import com.spire.doc.FileFormat;

public class DecryptWord {

    public static void main(String[] args) {

        //パスワード付きのファイルを読み込み、元のパスワードを入力して解除します
        Document document = new Document();

        document.loadFromFile("Encrypt.docx", FileFormat.Docx, "abc-123");

        //文書を保存
        document.saveToFile("Decrypt.docx", FileFormat.Docx);
    }
}
```

プログラムを実行すると、作成されたファイルはパスワード保護されなくなります。
Laravel6.0始める前にMacのphpは7.2以上にすべき話【対策を解説】

Laravel6.0を遂に試してみようということで、

いつもの通り、

```
$ composer create-project laravel/laravel qiita --prefer-dist "6.0.*"
```

とバージョンを指定して、composerでプロジェクトを作成しようとしました。

そしたら、エラーが出てしまいました。

理由は、

<b>Laravel6.0はpcのphpが7.2以上である必要がある</b>

ということでした。

`MAMPはphp7.3.1なのになんでやと思ってたんですが、pcは7.1.2だったんですね...`

ということで、

<b>pc（Mac）のphpのバージョンを7.3~にあげる方法を解説します</b>

<b>前提環境</b>
MacOS MOjave 10.14.5
composerインストール済み
homebrewインストール済み

*homebrewまだの人は各自インストールお願いします🙏*

##brewコマンドでphpをインストールする

まずはbrewコマンドでphp7系を検索してください。

```
$ brew search php@7
```

すると、以下の画面になります。

```
==> Formulae
php@7.1                    php@7.2                    php@7.3
```

そしたら、以下のコマンドを入力してください。

```
$ brew install php@7.3
```

これでphp7.3がインストールされます。

一応コマンドでバージョンを確認します。

```
$ php -v
```

![スクリーンショット 2019-11-28 14.32.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472701/057d72d2-ea80-deea-5b5c-ec0b9292bcf7.png)

<b>やったぜ</b>
MS Accessのデータをcsvエクスポートする

# TL;DR（一言でまとめると）

- mdbtoolsというツールを使うと、Accessに入ったデータをcsvでエクスポートできます
- mdbtoolsはLinuxなら`yum install` (CentOS) や `apt install` (Ubuntu) で簡単にインストールできます
- Windows版も[有志の方が作っているようです](https://github.com/brianb/mdbtools/issues/107#issuecomment-351161823)

# 背景

社内でテキストマイニングを布教していると「うちのAccessに入ってるデータも分析できない？」というお話をいただくことがあります。

そんなとき、データを一旦csvに出力できれば、既存のソフトに読み込ませたり、Pythonで加工したりすることも楽になりますよね。

# 手順

Linuxであれば以下の3ステップで終了です：

1. `yum install mdbtools` (CentOS) または `apt install mdbtools` (Ubuntu) でmdbtoolsをインストールする
2. `mdb-tables -1 (*.mdbかまたは*.accdbファイルのパス)` でAccessデータベースに格納されているテーブルの名前の一覧を表示する
3. `mdb-export (*.mdbかまたは*.accdbファイルのパス) (テーブル名) > (csvファイル名)` でcsvエクスポートする

Windows版も[有志の方が作っているようなので](https://github.com/brianb/mdbtools/issues/107#issuecomment-351161823)、[こちらの配布サイト](https://github.com/lsgunth/mdbtools-win)にあるファイル一式をダウンロードして、コマンドプロンプトから上記のようなコマンドを実行すれば、同様の操作を行うことができると思います（未検証）

# 参考資料

こちらの記事を大いに参考にさせていただきました。ありがとうございます: https://qiita.com/ekzemplaro/items/f2e59076c94d460c7fa6
自社で開催している Web 系テック企業のイベント・カンファレンスまとめ

自社で開催している Web 系テック企業のイベント・カンファレンスまとめ。
開発や運用の参考になりそうなもの。ビジネス系は含んでいない。
`mm/dd` でソートしてます。

---

# クックパッド株式会社
- Cookpad TechConf
- https://techconf.cookpad.com/2019/
- 2019/02/27

# 株式会社ディー・エヌ・エー
- DeNA TechCon 2020
- https://techcon.dena.com/2020/
- 2020/03/04

# 株式会社メルカリ
- Mercari Tech Conf
- https://techconf.mercari.com/
- 2018/10/04
- (2019 は未開催?)

# 株式会社AbemaTV
- AbemaTV Developer Conference
- https://developer.abema.io/2018/
- 2018/10/13
- (2019 は未開催?)
- CA BASE CAMPという社員限定テックカンファレンスもあるらしい

# 楽天株式会社
- Rakuten Technology Conference
- https://tech.rakuten.co.jp/
- 2019/11/09

# LINE株式会社
- LINE DEV DAY
- https://linedevday.linecorp.com/jp/2019/
- 2019/11/20-21

# ヤフー株式会社
- Yahoo! JAPAN Tech Conference
- https://techconference.yahoo.co.jp/2019_shibuya/
- 2019/12/13
Segment Routing(SID被った場合の挙動)をお兄さんと一緒に見てみよう

# はじめに

この記事はシスコの同志による Advent Calendar の一部として投稿しています
- 2017年版: https://qiita.com/advent-calendar/2017/cisco
- 2018年版: https://qiita.com/advent-calendar/2018/cisco
- 2019年版: https://qiita.com/advent-calendar/2019/cisco

今年度から入社したので一発目緊張しながら書いてますが
夏ぐらいから書きたいネタだったので書きます。
初めに少し前提知識を書いていきますが、Segment Routing知ってるしそんなのいらないという人は
本編まで飛ばしてください。

# Segment Routingとは
ネットワークをSegmentという単位で表してそのSegmentを利用してRoutingして
パケットを転送しようとするものです。
概念自体は5~6年前からあった気がします。
Segment Routing特有の大切な言葉としてSIDというものが存在しています。
この言葉を解説したものが次のURLにあるので気になる人は見てください。
[SIDについて](https://qiita.com/katu7414/items/0cedfe702a5ee4a23e03)

#本編
今回はNode SIDが被った時の処理を確認します。
そもそもコンフィグなどで設定するSIDのindex値は、ただの整数値なので間違えて入れちゃったなんてこともありそうな気がします。

### NodeSID
簡単にいえばloopbackを示す特別なprefix-SIDのこと
意味的にはNodeのことを指し示すことが多い。
Node SIDはIGPのPrefix SIDです。
ユニークな値ではないといけない。

それでは今回のネットワーク図を確認していきましょう
<img width="810" alt="スクリーンショット 2019-04-17 18.23.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314181/26de62ed-d1aa-aeed-9fee-300cca4791d8.png">

今回はMPLSネットワークを作成しました。
役割的には
R1~R4 P
R5~R6 PE
CE-A1~CE-B2 CE
の役割を果たしています。
想定ではA社とB社がそれぞれMPLSなネットワークを利用して論理的には独立しているネットワークになっています。

では各ルーターのNodeSIDです。
R1 1001
R2 1002
R3 1003
R4 1004
R5 1005
R6 1006


まずCE-A1のLoopback0からCE-A2のLoopbackに対してpingをうってみます。

<img width="529" alt="スクリーンショット 2019-11-28 14.13.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314181/92c030fd-a704-6dbc-1593-ad996d1964ae.png">


特に問題がないので通ります。
続いてSIDを変更します。
<img width="463" alt="スクリーンショット 2019-11-28 14.25.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314181/ac764ae9-4db8-70bc-fd3c-17f8d57bfa07.png">

途中で間違えまくってますが気にしないでください。
個人的な意見になるんですが router ospf 1の配下とかにinterfaceを適用させるのって
毎回間違えるのでわかりにくいですね。
これでR5 1006　R6 1006になりました。
ではまたCE-A1のLoopback0からCE-A2のLoopbackに対してpingをうってみます。
<img width="553" alt="スクリーンショット 2019-11-28 15.55.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314181/c04da04a-e53d-1f01-55e1-99731c2c4eeb.png">

通らなくなりました。

これってどういう処理が起きているんでしょうか？
draftを見ていきましょう。
[draft](https://tools.ietf.org/html/draft-ietf-spring-conflict-resolution-05)

読んでみるとSIDが競合した場合いくつかのルールがありそのルールに乗っ取って
どちらかを有効にする判定がされているみたいです。
ではルールを見ていきましょう(ここは翻訳しただけです)
競合を解決するための優先規則

競合が検出された場合は、次のアルゴリズムを使用して、
優先マッピング・エントリー。順番に評価する
が指定されました。接頭辞の競合が最初に評価されます。SIDの競合は次のとおりです。
プレフィックスの衝突後に残っているアクティブなエントリを評価します。
が解決されました。

1.高い優先度値が優先される
2.小さな範囲の勝利
3.IPv6エントリがIPv4エントリよりも優先されます
4.より長いプレフィックス長が勝ちます
5.小さい開始アドレス (符号なし整数と見なされる) 
6.小さなアルゴリズムが勝つ
7.開始SIDが小さいほど勝つ
8.トポロジIDが同一でない場合、両方のエントリを無視しなければなりません

では今回の場合はどちらが優先されたのでしょうか？
結果から見ればR5が優先されていました。
<img width="322" alt="スクリーンショット 2019-11-28 16.06.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314181/d02a487a-4db0-7708-b1c0-00738c722d69.png">

<img width="338" alt="スクリーンショット 2019-11-28 16.06.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314181/0c936c15-6610-6312-bc9a-c8ce07b3a108.png">

R6が経路に入った瞬間おかしくなっていました。
今回はより小さい開始アドレスを持っていたR5が判定で勝ったと考えています。(本当はよく分かってないです。教えてください。)

# 最後に
まだdraft読んでもわからないことが多いので勉強します。
小さなアルゴリズムが勝つの部分や分かってないことあるので
今月中に第二弾の記事書きます
しばらくお待ちください。
[playframework2][sbt]ライブラリの互換性警告対応 There may be incompatibilities among your library dependencies

# 背景・問題点

playを2.6にバージョンアップしたところ、`sbt update`時に以下の警告が発生するようになりました。
直訳すると「ライブラリの依存関係に互換性がない可能性があります。追い出されたライブラリの一部を次に示します。」

競合されたライブラリと矢印の右側に採用されたバージョンが表示されています。
動作は問題ないのですが目障りなので消したい。という話

```
[warn] There may be incompatibilities among your library dependencies.
[warn] Here are some of the libraries that were evicted:
[warn] 	* com.typesafe.play:play-java-jdbc_2.11:2.5.0 -> 2.6.0
[warn] 	* com.typesafe.play:twirl-api_2.11:1.1.1 -> 1.3.2
[warn] Run 'evicted' to see detailed eviction warnings
```

# 原因（の調査方法）
警告メッセージの末尾に記載されているように、`evicted`で詳細を確認できます。

```bash
$ sbt evicted | grep jdbc
```

以下のような出力が得られました。`play-jdbc`が2.6.0、`play-jdbc-evolutions`が2.5.0を使っているようです。

```bash
[warn] 	* com.typesafe.play:play-jdbc-api_2.11:2.5.0 -> 2.6.0 \
(caller: com.typesafe.play:play-jdbc_2.11:2.6.0, com.typesafe.play:play-jdbc-evolutions_2.11:2.5.0)
```

# 対策・手順
理想的には`evicted`コマンドを使ったり、各ライブラリのリポジトリや文書を調査して、互換性を維持できるように各ライブラリを選択してバージョンを明示的に指定することです。が！それを調べるのも、整合性を維持するのも現実的には難しいと思います。

そこで、選択されたバージョンに固定することで対応します。（もちろん、この警告が出ていても正常動作していることが前提です）

具体的にはbuild.sbtに以下の行を追加します。

```sbt:build.sbt
dependencyOverrides += "com.typesafe.play" %% "play-java-jdbc" % "2.6.0"
```

ここでは`jdbc`しか指定していませんが、これを指定するだけで`twirl`の警告も消えました。

`dependencyOverrides` については[公式ドキュメント](https://www.scala-sbt.org/1.x/docs/Library-Management.html#Overriding+a+version)の説明がわかりやすいです。
UiPath Betaアクティビティフィードを追加する方法

UiPathに新たなOCRツールとしてOmniPage OCRが追加されました！

噂によるとMicrosoftOCRよる読取制度がいいとか…

ふむふむ、どうやら以下の2つを追加すればいいみたいだね:thinking:
・UiPath.OmniPage.Activities
・UiPath.OmniPage.Bundle.Extended


早速使ってみようと思いパッケージ追加を行いました^^
![8d452be449434bb5437f45ebd1bb8deb2f9a0b61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521108/25388ffc-c5e3-1989-a6b4-d207579c695e.png)

あれ:thinking:
ないけど…

・・・・・・・・・・・・

・・・・・・・・・

・・・・・・

・・・




 
 
 
 
 
 
 

この後めちゃくちゃ探したけど見つかりませんでした:angry:


このままだと収まりがつかないのでUiPath社の非公式Twitterに問い合わせ。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/UiPathJapan_TS?ref_src=twsrc%5Etfw">@UiPathJapan_TS</a> OmniOCRを導入しようとパッケージ管理よりUiPath.OmniPage.Bundle.Extendedが見当たりません。<br>まだ追加されていないのでしょうか？<a href="https://t.co/DWlfKEThVH">https://t.co/DWlfKEThVH</a></p>&mdash; 池袋ゼロボ (@ccasterr_bdg) <a href="https://twitter.com/ccasterr_bdg/status/1199501826149629952?ref_src=twsrc%5Etfw">November 27, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


返事が返ってきた:vulcan:


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">確認したところ、beta版フィードをつくりそこからUiPath.OmniPage.Bundle.Extendedがインストールできます。<br>下記forumを参照していただきまして、betaフィードを作成していただけますか。(2号)<a href="https://t.co/mTfpxKIyTc">https://t.co/mTfpxKIyTc</a> <a href="https://t.co/09wgeynmOR">https://t.co/09wgeynmOR</a></p>&mdash; UiPath Japan TS Team🍌🍊 (@UiPathJapan_TS) <a href="https://twitter.com/UiPathJapan_TS/status/1199581331476246528?ref_src=twsrc%5Etfw">November 27, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


なるほど！
betaフィールドを追加してやればいいんだな:relaxed:
簡単なんだ:grin:


①UiPathのパッケージを管理を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521108/acad85c0-5d77-8620-ada1-61d3a4aaf4d3.png)


②設定を開く

③右下の[名前][ソース]を記載する欄の[ソース]に以下のURLを設定する
※名前はなんでもよい
https://www.myget.org/F/uipath
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521108/4b751471-e595-551a-b8e4-460457f7e949.png)

④追加ボタンを押す

⑤左の欄に追加された事を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521108/bc39d407-ee4f-5d6b-9b1d-65891745e465.png)

後はいつも通り、すべてのパッケージから[omnipage]と検索してあげると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521108/10e69a38-3cea-3995-9e2c-0d0a0c984db4.png)



・UiPath.OmniPage.Bundle.Extendedが出てきたんだ:relaxed:

後はインストールすればOmniPage OCRが使えるようになります！

それはまた今度
NISAの積み立てシュミレーションをざっくり書いてみた

#概要
複利計算が電卓でやると面倒なので、ざっくり書いてみました。
細かいものは省いているのでご容赦ください。:bow_tone1:

#参考
- [積立NISAの税率(金融庁)](https://www.fsa.go.jp/policy/nisa2/about/tsumitate/overview/index.html)

#コード

```
//Swift

var year = 0 //現在の継続年数を示す
var targetYear = 30 //継続期間
var beforeMonthlyPrincipal: Double = 33000 //毎月投入金額
var afterMonthlyPrincipal = 100000.0 //税免除後の毎月投入金額
var beforeInterestRate = 1.08 //免除前金利
var afterInterestRate = 0.08 //免除後金利
var assets: Double = 0 //資産
var devidedAmountOfMoney: Double = 0 //配当金額
var realIncome: Double = 0 //実収入
var incomeTax = 0.8 //20%
//税免除時
while year < 20{
    assets += beforeMonthlyPrincipal*12
    assets *= beforeInterestRate
    year += 1
    print("\(year)年: \(Int(assets))円")
}
print("税免除終了時の資産額: \(Int(assets))円")
print("税免除終了時の投入金額: \(Int(Double(year)*(beforeMonthlyPrincipal*12)))円")
//税免除終了時
while year < targetYear {
    assets += afterMonthlyPrincipal*12
    devidedAmountOfMoney = afterInterestRate * assets
    assets += devidedAmountOfMoney * incomeTax
    year += 1
}
print("\(year)年後の資産額: \(Int(assets))円")
print("\(year)年後の投入金額: \(Int(Double(10)*afterMonthlyPrincipal*12) + Int((Double(year)*(beforeMonthlyPrincipal*12))))円")

```

#GitHub
[GitHubへのリンク](https://github.com/tbskgm/NISA-)
[UE4] BlueprintエディタのPalette機能を使って、自分だけのお気に入りノードリストをカスタマイズしちゃおう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/634be5df-9c0d-a2a4-e280-55d14e6d6fbe.png)
BlueprintエディタにはPaletteという機能が昔からあるのですが…少しマイナーな気がするのでご紹介。
公式ドキュメント：
https://docs.unrealengine.com/ja/Engine/Blueprints/Editor/UIComponents/Palette/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/02c2cca0-c6a1-4a1e-2f36-90095a932c30.png)
Blueprintエディタのツールバーにある「Windows->Palette」を選択すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/25555a1d-54f8-f480-b2ec-fedd61a2057c.png)
エディタ右側にPaletteタブが追加されます。上はお気に入りのノードを管理するFavoritesパネル、下はBlueprintで使用可能なノードのリストを表示するPaletteパネルです。
![search.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/1473514b-e6d1-6e6b-9709-7b060248edab.gif)
Paletteパネルではノードをクラス単位で表示できますし、ActorクラスのBPで使えるノードの一覧を表示ということもできます。
![favorite.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/7360cc2a-4d0b-65cf-61c6-fbaad285248b.gif)
そして、右クリックメニューの「Add to Favorites」からFavoritesパネルに指定のノードを登録できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/6bd9a13d-ce35-2578-4085-88349ea5426a.png)
ちなみに、```<PROJECT>\Saved\Config\Windows\EditorPerProjectUserSettings.ini``` にてこのように設定が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/435cac61-0f19-fe7c-b431-e184ab4528ca.png)
もしチーム内でFavoritesを共有したい場合は(Base)Editor.iniにおける```[BlueprintEditor.Favorites]```設定を編集するのが良いかと思います。

おしまい
Scratch 3.0の開発動向を、開発者が語る!

みなさーんこんにちはー! apple502jでーす! というわけで、Scratch Advent Calenderの初日の枠を押さえていたので、この記事に使いまーす!

# 自己紹介
apple502j。収穫後十数年たったリンゴ。(多分)世界で数少ないOSSの**Scratch開発者**です。給料も出ないし全部ボランティアですが、結構開発に参加しています。

いったい何をやったのかは省略

# 開発動向
多分さかのぼるとしたら**2017年後半**までいけると思いますが、まずは直近のものから。

## Scratch Androidのリリース!
Scratch Androidがリリースされました。(公式には「Scratchアプリ」ですが、Windowsの.exeまでアプリに入っちゃうのは困るのでこれで呼びます) 6月くらいからの開発で、予定リリース日が「10月7日」と決まったのが9月の24日くらいですかね。翻訳者だったのでメール通知が来ました。「その日までに翻訳レビュー済ませとけ」です。

結果: Scratchチームは大ウソつきでしたw **11月20日**が本当の「リリース日」です。Playストアには前日には公開されていました。あとは、**オープンソース化**だけですね! Scratchデスクトップは3か月半でOSSになったので、多分来年の1～2月ごろかな。

## Migration: Join Flow
Scratchの開発者界で「migration」はDjangoベースのコードベース「scratchr2」からReact+Node.jsでできた「scratch-www」に移植することを意味します。実は私もやったことがあります: 「保護者の方へ」ページが新しくなったのは私のせいです。ミッチさんのTEDスピーチの代わりのYouTube動画がやってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237877/25ea8dbe-9ad6-9af1-f34f-0ccf245e3bd3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237877/522fa487-ed1b-fb50-71cd-934ba6bb448d.png)

"Migration"はトップページ、法的文書ページ、「見る」(言語のフィルターが解けたせいで「英語のばっかり」と迷惑らしいですが)、検索(これも機能が減ったせいで迷惑らしい)、通知(アラートの使用に私も不満です)、ヘルプ(Bring It Back運動の発端)、プロジェクトページの順に行われています。(IIRC)

そして、その"migration"のひとつとして、「アカウント作成画面」の変更があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237877/4d7816ee-bec2-aee7-fc8d-820e78604705.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237877/1b743265-c39b-eb8d-fd79-5d5d548e7159.png)

変更点は多すぎてわかりませんが、個人的には(そしてボクの仲間のtowerofnixさんも)性別選択にXジェンダーが増えたのを気に入っています。

## いまやってます: Join Flowがもしかすると:
おもしろいIssueが出ています。
* [ユーザー名自動生成?](https://github.com/LLK/scratch-www/issues/3518)
* [アバター自動生成?](https://github.com/LLK/scratch-www/issues/3517)

## いまやってます: E16N
すべてのブロックの実装を「拡張機能化」する「extensionification」プロジェクトが進行中です。いつやってくるかはわかりません。
Site24x7のアラートを課題追跡ソフトJira上に反映させてみた

みなさん、こんにちは。@Miu24x7です。

先日、Site24x7とJiraの連携機能が新しくリリースされました。
この連携によるメリットはいかほどなのでしょう？？実際に連携させてみました。

#Site24x7とは
Site24x7はWebサイト、サーバー、AWSなどのクラウド等を監視できるオールインワン型クラウド製品です。
Webサイト監視機能の1つ、Webトランザクション監視ではWebページの遷移状況のパフォーマンスを監視できます。ECサイトなどの購入フローを監視するのに利用してみるのも良さそうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514960/47e2f7f4-ed05-7d7b-d627-728eeb6d0a25.png)

#ゴール
Site24x7とJiraの連携によって、Site24x7の監視アラートをJira上で課題として反映させることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514960/8642c6c6-e343-dd6e-31dc-8382dcb27cd6.png)

Jira上にアラートを反映させているので、もちろん課題へのコメント共有やレポートの表示も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514960/297428f5-7b3c-73d5-45e4-79bf69e19692.png)

#連携方法
連携方法はSite24x7のユーザーガイド（準備出来次第関連付け）を参考にしているので、詳細はリンクを参照してください。

1. Jiraにサインアップ or ログインし、連携用のプロジェクトサイトを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514960/52a9feb8-aa05-19b4-1f8b-1bf3045b0069.png)
2. Site24x7にログインし、[管理]→[3rdパーティ連携]→[3rdパーティ連携の追加]→[Jira]の順にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514960/ee2cf4b3-d11c-cea0-41c4-75fae9f76a89.png)
3. ポップアップが表示されるので、連携させたいJiraアカウントを選択して、[Accept]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514960/e4e94854-9a97-b83a-3662-e5ce08466621.png)
4. リダイレクトされたSite24x7ぺージで、連携内容を設定し（どのサイトのどのプロジェクトかなど）、[保存]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514960/6ede23cf-44e1-0f55-2055-b3dcc00edf71.png)

#最後に
今回はSite24x7とJiraの連携によって、Site24x7の監視アラートをJiraの課題として作成させてみました。
この連携でアラートに関する情報共有や進捗度の確認などが迅速に行えるようになったのは**"メリット大"**だと思っています。

Site24x7では無料期間を設けているので、ぜひSite24x7のJira連携を試してみてください！
https://www.site24x7.com/signup.html
cute-filesをオフラインで使う

#はじめに

オフライン環境で複数のメンバーにファイルを配るためにcute-filesを使ってみました。

ベースとなる環境は[こちら](https://qiita.com/y_hokkey/items/406b5a8c4bc15354d069#cute-files)の記事を元に構成しました。

webブラウザさえあればアクセス可能なのでお手軽ですね。。。と思っていたのですが、オフラインでアクセスできず。

どうやらindex.html内で「jquery-1.11.0.min.js」をクライアントにGETさせているのですが、そのURLがインターネット上のものでした。
なので、ローカルに保存した「jquery-1.11.0.min.js」を読み込ませるように少し手を加えてみました。



#ファイル構成
```
/どこか/cutefiles
           |--cutefiles
           |  |--Dockerfile
           |  |--index.html
           |  |--jquery-1.11.0.min.js
           |--docker-compose.yml

/data/cutefiles
           |--配布したいファイル
```

##docker-compose.yml
```
data-cutefiles:
  image: busybox:buildroot-2014.02
  volumes:
      - /data/cutefiles:/cutefiles
cutefiles:
  build: cutefiles
  volumes_from:
    - data-cutefiles
  ports:
    - "3000:3000"
```

##Dockerfile
```
FROM node:4.4
RUN npm install -g cute-files2@1.0.3
RUN sed -i 's/http:\/\//\/\//g' \
        /usr/local/lib/node_modules/cute-files2/frontend/index.html
RUN mv /usr/local/lib/node_modules/cute-files2/frontend/index.html /usr/local/lib/node_modules/cute-files2/frontend/index.html.org
COPY ./jquery-1.11.0.min.js /usr/local/lib/node_modules/cute-files2/frontend/
COPY ./index.html /usr/local/lib/node_modules/cute-files2/frontend/
WORKDIR /cutefiles
EXPOSE 3000
CMD ["/usr/local/bin/cute-files"]

```

##index.html
「script src="jquery-1.11.0.min.js」が元のindex.htmlから変更した箇所になります。

```
<!DOCTYPE html>
<html>
  <head lang="en">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>Cute file browser</title>
    <!-- Include our stylesheet -->
    <link href="assets/css/styles.css" rel="stylesheet"/>
  </head>
  <body>
    <div class="filemanager">
      <div class="search">
        <input type="search" placeholder="Find a file.." />
      </div>
      <div class="breadcrumbs"></div>
      <ul class="data"></ul>
      <div class="nothingfound">
        <div class="nofiles"></div>
        <span>No files here.</span>
      </div>
    </div>
    <!-- Include our script files -->
    <script src="jquery-1.11.0.min.js"></script>
    <script src="assets/js/script.js"></script>
  </body>
</html>
```

##jquery-1.11.0.min.js
[こちら](https://code.jquery.com/jquery-1.11.0.min.js)からダウンロードして配置する。

<hr>
オフラインでもjqueryファイルをクライアントが読み込むことができるようになるので、ページも表示できるようになりました。
03. 円周率

## 03. 円周率
"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．

###Go
```go
package main

import (
	"fmt"
	"regexp"
	"strings"
)

func main() {
	var src string = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
	var wlen []int
	rex := regexp.MustCompile("([a-zA-Z]+)")

	//	単語に分割
	words := strings.Split(src, " ")
	for _, word := range words {
		//	アルファベットのみを抽出
		match := rex.FindStringSubmatch(word)

		//	アルファベットの文字数を保存
		wlen = append(wlen, len(match[1]))
	}

	//	結果を表示
	fmt.Println(wlen)
}
```


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

src = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
wlen = []

#   正規表現パターン定義（アルファベットのみ）
pattern = re.compile('([a-zA-Z]+)')

#   単語に分割
words = src.split(" ")
for word in words:
    #   アルファベットのみ抽出
    result = re.search(pattern, word).group()

    #   アルファベットの文字数を保存
    wlen.append(len(result))

#   結果を表示
print(wlen)
```


###Javascript
```Javascript
var src = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
var wlen = [];

//	ループ版
var words = src.split(' ');
for (var i = 0; i < words.length; i++) {
    val = words[i].match(/[a-zA-Z]+/);
    wlen.push(val[0].length);
}
console.log(wlen);


//  forEach 版
var wlen = [];
src.split(' ').forEach(function (value) {
    this.push(value.match(/[a-zA-Z]+/)[0].length);
}, wlen)

console.log(wlen);
```

## まとめ
以外と簡単と作ったが、他の人の結果を見て間違ってることに気づいた。 "." や "," は抜くのか。
アルファベット判別は少し悩んだが、正規表現で対応。Goの正規表現処理は遅いんだったかな？。

問題の円周率の意味が解った時は、なんとなく嬉しかった。ｗ

[トップ](https://qiita.com/naoshin1984/items/3d7814e2f8eb01eea8dd)
02. 「パトカー」＋「タクシー」＝「パタトクカシーー」

## 02. 「パトカー」＋「タクシー」＝「パタトクカシーー」
「パトカー」＋「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ．

###Go
```go
package main

import (
	"fmt"
	"strings"
)

func main()  {
	var p1 string = "パトカー";
	var p2 string = "タクシー";
	var result string;

	//	文字を配列にする
	p1s := strings.Split(p1,"");
	p2s := strings.Split(p2,"");

	//	配列数ループ（「パトカー」に合わせる。同じ文字数だから・・・）
	for i := range(p1s) {
		//	各文字を１文字づつ連結
		result += p1s[i] + p2s[i];
	}

	//	結果を表示
	fmt.Println(result);
}
```


###python
```python
# -*- coding: utf-8 -*-
p1 = u"パトカー"
p2 = u"タクシー"
p1s = []
p2s = []

#   文字列を配列へ（「パトカー」に合わせる。同じ文字数だから・・・）
for i in range(len(p1)):
    p1s.append(p1[i])
    p2s.append(p2[i])

#   配列数ループ（「パトカー」に合わせる）
result = ""
for i in range(len(p1s)):
    # 各文字を１文字づつ連結
    result += p1s[i] + p2s[i]

#   結果を表示
print (result)
```


###Javascript
```Javascript
let p1 = "パトカー";
let p2 = "タクシー";
var result = "";

//	文字を配列にする
let p1s = p1.split("");
let p2s = p2.split("");

//	配列数ループ（「パトカー」に合わせる。同じ文字数だから・・・）
for (var i = 0; i < p1s.length; i++) {
    //	各文字を１文字づつ連結
    result += p1s[i] + p2s[i];
}

//	結果を表示
console.log(result);
```

## まとめ
どれも、イマイチ感がすごい。
他の人のソースを覗いてみる。

[トップ](https://qiita.com/naoshin1984/items/3d7814e2f8eb01eea8dd)
no app store connect access for the teamの対処法

# 概要 
archive後、validateやdistribute時に「no app store connect access for the team」と出てきて
苦戦したので対策を書いておきます。
知りたいのは結果だと思うので成功した対処法は先に書いておきます。

#成功した対処法
- 再起動。 
PCかXcodeを再起動するとエラーが解決できたので、この問題にぶつかった時はぜひやってみてください。

#試したこと
- app storeの識別子、認証、プロファイルなど
- archiveの右下にあるDetailsのTeamを入力し直す


#参考(他の参考になりそうな投稿を載せておきます)
[No App Store connect access for the team 対策](https://qiita.com/ganessa/items/591d8380b50e87b628ae)
[アプリをArchiveするときに No accounts with iTunes Connect access というエラーが出てアップロードできない時](https://qiita.com/eggmobile/items/d4eae3614046f558163a)
【FileMaker】FileMaker Go に置いてあるファイルの位置を知る

なんていう言葉で検索したらいいか迷う、このお題です。
FileMaker Goにcsvファイルを置いて、それを表示させるとかFileMakerアプリの中からデータファイルとして読み込むとかあるじゃないですか。
いわゆる、↓ここです。
![IMG_0309.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/e9b616ba-d76d-05e6-e285-1cd1c0691823.png)
FileMaker Goを開いて、"マイApp"にあるファイルです。
ここって、結局どの関数で場所がわかるの？
というお題です。

結果からいうと、
[Get(ドキュメントパス)](https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help%2Fget-documentspath.html%23ww1289621)
で取得できます。
FileMaker Pro 8.0以降であれば、提供されている関数です。

ここにあるファイルリストを取得したい場合は、
[Get(ドキュメントパス一覧)](https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help%2Fget-documentspathlisting.html%23ww1289689)で取得できます。
なぜかこの関数は、FileMaker Pro 10.0からの提供ですね。

つまり、絵的にいうと、こういうことです。
![IMG_0309.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/2713e993-232f-7a4a-8625-6f05e719cfc6.png)

試しにFileMaker Pro AdvancedとFileMaker Goでやってみましょう。

# 使用するスクリプト
<img width="585" alt="使用するスクリプト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/f907d621-4774-a698-ae67-3c367c0d1627.png">
スクリプトは、FileMaker Pro Advanced,FileMaker Goとも同じ関数を使います。

# FileMaker Pro Advancedでドキュメント情報を取得
では、通常PCでFileMaker Pro Advancedを実行している場合はどこがドキュメントパスになるかというと、こう取得できました。
<img width="1061" alt="FileMaker Pro Advancedでドキュメント情報" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/950a711d-d03a-cda2-5f89-8f5b0d883e74.png">
ドキュメントフォルダ、日本語設定だと「書類」フォルダですね。
<img width="361" alt="書類フォルダ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/4a848dc2-415a-d297-e5cf-1a1947a759a3.png">

# FileMaker Goでのドキュメントの情報を取得
次に、FileMaker Goにアプリをダウンロードして同じスクリプトを実行してみます。
![IMG_0310.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/7f9e49b5-075f-ec01-7c86-f99f5928768e.png)
それぞれのアプリケーションに割り当てられたドキュメントフォルダということですね。

# FileMaker Go のファイル場所を把握しておく
今時はFileMaker Appからファイルを出力するときに保存先をどうするかフォルダ情報が自動で出たりしますが、FileMaker Go用にFileMaker Appを開発する時は、こうしたフォルダやファイル場所を知っておくこともちょっとしたときに役立ちますね。
これがどこで役立つかというと、先に挙げたデータファイル操作の他にも、FileMaker App内からファイルを出力する時のパスを指定するときとか、もちろんスナップショットリンクで出力したFileMaker Appを別のFileMaker Appに読み込む時や処理の自動化を測るときなど考えられますね。