OmniAICreator/Qiita-1.07M huggingface dataset:
plotHeatmapのカラーバランスを自動で全通り作成する方法。

# ChIP-seq のヒートマップの色バリエーションを全パターン作成する方法

各ターゲットとする領域におけるChIP-seq シグナルを可視化する方法にHeatmapが一覧的に見やすく便利です。

bamfile から，deeptools のbamCoverageもしくはbamCompare, bigwigCompareなどを用いて，bigwigファイルを作成し，computeMatrixやplotProfile, plotHeatmapの機能を用いて，ヒートマップを作成しています。

データ解析を頼まれるときに，時に元々のChIP-seqのシグナルがあまり出ていないのに，カラーバランスを調整して見やすくするよう求められることがあります。

どうやっても無理な場合は，想定しうるカラーコントラストを全通り作成して，当人に選んでもらうことで納得される場合があります。

このようなときに役立つplotHeatmapの色のグラデーションのパターンをすべて網羅する方法を作成しました。
用途としては，やや後ろ向きですが，納得しない方に無限に時間を吸い取られることを考えると，役に立つときもあります。
現在は、SLURMシステムを用いているのですが，Deeptoolsをインストール済みの通常のLinuxでも実行可能と思います。
pythonを用いてコードを複数作成してそれを実行するイメージです。


```python3:all-color-variation.ipynb
import numpy as np
import itertools

# provide the color-code information to decide the color for the lowest signal and for the highest signal
print("color example : white >> ffffff, black >> 000000, blue >> 0000ff, red >> ff0000, green >> 00ff00")
print("You can also check color-code in https://www.color-hex.com/")
print("")
LowColor  = input("Input the color for the lowest signal. (eg: ffffff) : ")
HighColor = input("Input the color for the highest signal. (eg: 0000ff) : ")
Color_div = int(input("How many color point do you need for color contrast ? (2~8) : ")) - 1

# convert the color-code (hex) to the int
int_lowCol = [int(LowColor[0:2], 16), int(LowColor[2:4], 16), int(LowColor[4:6], 16)]
int_highCol = [int(HighColor[0:2], 16), int(HighColor[2:4], 16), int(HighColor[4:6], 16)]

loColarr = np.array(int_lowCol)
hiColarr = np.array(int_highCol)

lo2high = hiColarr - loColarr
div_lo2high = lo2high / Color_div

color_dict = {}
color_dict[0] = "#" + LowColor
color_dict[Color_div] = "#" + HighColor

for i in range(1, Color_div):
    div_color_arr = loColarr + div_lo2high * i
    div_color_arr = div_color_arr.astype(int)
    div_color = "#" + '{:02x}'.format(div_color_arr[0]) + \
                      '{:02x}'.format(div_color_arr[1]) + \
                      '{:02x}'.format(div_color_arr[2])
    color_dict[i] = div_color

# For confirmation of color list
print(color_dict)

# make the list of the combinations with the replacement for the color_dict.keys()
ColIntList = list(itertools.combinations_with_replacement(np.arange(Color_div + 1), Color_div + 1))

# convert the number to the colors with color_dict
for ind, arr in enumerate(ColIntList):
    ColorList[ind] = [color_dict[elm] for elm in arr]
    
    Color_choice = ",".join(ColorList[ind])
    
    COLOR_CODE = "'" + Color_choice  + "' '" + Color_choice + "' '" + \
                 Color_choice + "' '" + Color_choice + "'"
    
    code = "plotHeatmap -m ComputedMatrix.gz -out ChIPsignalTopltHeatmap_KClust5_ver" + str(ind + 1) + ".pdf --plotFileFormat 'pdf' --colorList " + COLOR_CODE + " --plotTitle ChIPsignalTopltHeatmap --refPointLabel Center --kmeans 5"
    print(code, file = open("codes_plotHeatmap_colorVariationsWithHEXcode_KmeansClust5", "a"))
```

こうすることでcodes_plotHeatmap_colorVariationsWithHEXcode_KmeansClust5というファイルに，今回はkmeans clusterで5分割されたheatmapに色のグラデーションパターンを組み合わせたコードを作成することができます
color pointが7の場合, 約1716通りの色のグラデーションパターンを作成することができます。

これで,微妙なコントラストの調整も可能です.
Nuxt typescript vue-jestでcannot find module .vue file

## 環境
```json:package.json
{
  "dependencies": {
    "@nuxt/typescript-runtime": "^0.2.1",
    "nuxt": "^2.10.1"
  },
  "devDependencies": {
    "@nuxt/typescript-build": "^0.3.1",
    "@types/jest": "^24.0.18",
    "@vue/test-utils": "^1.0.0-beta.29",
    "jest": "^24.9.0",
    "ts-jest": "^24.1.0",
    "vue-jest": "4.0.0-beta.2"
  },
  "jest": {
    "moduleFileExtensions": [
      "js",
      "ts",
      "json",
      "vue"
    ],
    "transform": {
      "^.+\\.ts$": "ts-jest",
      ".*\\.(vue)$": "vue-jest"
    },
    "moduleNameMapper": {
      "^@/(.*)$": "<rootDir>/$1",
      "^~/(.*)$": "<rootDir>/$1"
    },
    "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
    "testURL": "http://localhost/"
  }
}
```

tsconfig.jsonは
- nuxt typescriptのガイドにあるものに、
- typesに @types/jestを追加して、
- vue-jestのバージョンを4.0.0-beta.2に変更した(stableだと動かない)

## 問題
```vue:components/HelloWorld.vue
<template>
  <h1>HelloWorld</h1>
</template>

<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
})
</script>
```

```__tests__/components/HelloWorld.test.ts
import HelloWorld from '@/components/HelloWorld.vue';
import { mount } from '@vue/test-utils';

describe('HelloWorld', () => {
  it('is a Vue component', () => {
    const wrapper = mount(HelloWorld);
    expect(wrapper.isVueInstance()).toBeTruthy();
  });
});
```

```console
$ npx jest
 FAIL  __tests__/components/HelloWorld.test.ts
  ● Test suite failed to run

    TypeScript diagnostics (customize using `[jest-config].globals.ts-jest.diagnostics` option):
    error TS5060: Option 'paths' cannot be used without specifying '--baseUrl' option.
    __tests__/components/HelloWorld.test.ts:1:24 - error TS2307: Cannot find module '@/components/HelloWorld.vue'.
```

何故かjest上から.vueファイルが認識されていない模様。(tsファイルはimportできてることは確認)
意味が全くわからない。
ググっても誰もerror and resolveを書いていない。

## 対策

全く意味がわからないが以下のファイルを置いてみた(適当な位置で良い)

```vue-shims.d.ts
declare module '*.vue' {
  import Vue from 'vue'
  export default Vue
}
```

```console
root@808a71578157:/app# npx jest
 PASS  __tests__/components/HelloWorld.test.ts
 PASS  __tests__/hoge.test.ts

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.799s, estimated 2s
Ran all test suites.
```

意味がわからないと言ったが、guideに書いてある。(でもいみがわからない)

https://github.com/Microsoft/TypeScript-Vue-Starter#single-file-components

なんか治った。


試しに vue-shims.d.tsを消してみた。
↓
通ったまま。
再起動したらまた動かなくなる

もうわからん。


## サンプルプロジェクト
https://github.com/hikaruna/nuxt-vue-jest-example/tree/master
【Unity】public static な変数をインスペクター上で表示する (実行前のみ編集可能)

# 対象
シングルトンを使うのが面倒だけど、public staticな変数をインスペクター上で表示・実行前に編集したい人
# やり方
public static な変数に対して、[SerializeField] private の変数をセットで宣言し、void Awake() 内で代入するだけになります。

### 例
```C#
[SerializeField]
private GameObject objTemp;

public static GameObject obj;

void Awake () {
    obj = objTemp;
}
```

Awake() 内で代入しているため、実行中にインスペクターから変数をいじっても反映されません。
【Unity】【2D】画像を分割読み込みする。

# やりたいこと
キャラクタやマップの画像を分割して読み込む。

## 画像を分割する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/feba4d3d-6cdb-fae7-6fd2-2cc8e5d49b9a.png" width =50%>
- Unityに追加した画像を選択
- 「Texture Type」を「sprite」にする。
- 「Sprite Mode」を「Multiple」にする。
- ドットバイドットならば「Pixels Per Unit」を「1」にする。
- Sprite Editorを選択する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/611f0614-00ed-0ac4-3a67-8f3f3d082893.png" width = 50%>
- Sliceを選択する。
- 「Type」を「Grid by Cell Size」にする。
- 「Pixel Size」を設定する。
- Sliceを選択する。

## 注意点
分割画像が歯抜けになっている場合、Unity側がそれを無視してしまうため、
適当な色で設定する必要がありそうだ。

■ 歯抜けあり(11個の画像として扱われる。)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/f38a203a-7a57-e7d5-2706-d2391e066e69.png">

■ 歯抜けなし (16個の画像として扱われる。)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/83ea5263-ef51-b4dd-c0c6-d7a2bf2cafe8.png">

## 分割画像を読み込む。
```csharp
    Sprite[] spritePlayer;
    void Start()
    {
　　　　 // 画像をロードする。
        spritePlayer = Resources.LoadAll<Sprite>("Images/Player/001");

        // 新しくSpriteRendererコンポーネントを追加し，スプライトを設定する。
        SpriteRenderer renderer;
        renderer = GameObject.Find("Player").AddComponent<SpriteRenderer>() as SpriteRenderer;
        renderer.sprite = spritePlayer[1];
    }
```

#参考サイト
[【Unity】スクリプトから画像を分割して読み込む](https://allmoreidea.hatenablog.com/entry/2018/07/15/141444)
[公式リファレンス : GameObject.AddComponent]
(https://docs.unity3d.com/ja/2017.4/ScriptReference/GameObject.AddComponent.html)
Haskellで減少配列の動きが理解できなかったけど頑張って理解できた話

対した話でもないので自分用のメモ書きみたいなものですが…。

## 発端

> [Learn You a Haskell for Great Good!](http://learnyouahaskell.com/chapters)

これの日本語翻訳された書籍版(すごいHaskell楽しく学ぼう！)があってそれを読んでHaskell入門をしていたわけですが、 
1章のRangeに関する部分で **減少列** についてが出てきたんですよね。 
簡単に言うと減少列は例えば10から1までの1づつ減っていく配列のこと。

普通に増えていく配列、増える数を指定して増やす配列までは理解がまぁできた。 
だけど減少列に関する部分だけ、なんでこの書き方でこうなるの？？？と 
完全に :Thinking_face: をしていたわけですね。:thinking: 
自分で自分にggrksしてもぜんぜんどうしてなのか書いてあるサイトが見つからないし。 ~~(調べ方が下手なだけかも)~~

それで書籍・GHCIとおよそ二日ほどにらめっこしてたわけですが 
それでようやく自分で理解できる解を見つけたので忘れないうちに書き記しておこうと思いここに書くことにしました。

## リストでのRange

* 通常のRange  
* ステップ付きRange  
* 減少Range  

の3種類の説明を一応書いときます。

書籍文中より軽く引用すると

### 通常のRange

> 1から20の全ての自然数を含むリストを作るには、 `[1..20]` とタイプするだけです。
> Haskellでこれは
> `[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]`
> とタイプするのと全く同じことです。
> これら2つの書き方の唯一の違いは、長い列挙列を手で入力するのはバカげてる、ってことです。

これは普通に書いてある通り1から20までの整数を配列にぶち込んで生成するRange。
全然普通に理解できる。

### ステップ付きRange

> レンジにはステップを指定することもできます。
> 1から20までの全ての偶数のリストが欲しいときはどうすればいいでしょうか？
> あるいは1から20までの全ての3の倍数は？
> 最初の要素と二つ目の要素をカンマで区切って、上限を指定するだけです。 
> 
> ```
> ghci> [2,4..20] 
> [2,4,6,8,10,12,14,16,18,20] 
> ghci> [3,6..20] 
> [3,6,9,12,15,18] 
> ```  

ステップとして2を指定したら2づつ、3なら3づつで次は4..20・3..20と指定してやれば2と3それぞれの倍数取れるのね、とこの時自分は解釈した。
が、実はこの解釈の仕方も実際の動きとはまた違ったものだった。

### 減少Range

> 20から1までの減少列を作るためには、 `[20..1]` ではなくて、 `[20,19..1]` と書かなければなりません。
> ステップなしで( `[20..1]` のように)レンジを書いた場合、Haskellは空リストから始めて、最初の要素が最後の要素より大きくなるまで要素を列挙します。
> 20は既に1より大きいので、結果はただの空リストになります。

この説明を読んだ時点でもだいぶ頭に？？？が浮かんでいた。
書き方をそのまま真似すれば確かに同じように減少列が作れるだろうけど、どうしてステップ付きでそう指定しなければ動かないのかが全く理解できなかった。

## ステップを付与したときのRangeの動き方

結局のところどういうことなのっていうと

仮にリストとして
`[x,a..b]`
があるとして

* 間違った解釈(過去の自分)

ステップとして `x` を指定して `a` に `x` を一回足したしたものを次々とリストにぶち込んでいく。 
最終的に `(a + x) > b` になったら終わる。

* 正しい(はず)の解釈

ステップとして設定された `x` と 範囲 `a` の差分(仮に `y` としておく)を `a` に足してそれをリストにぶち込んでいく。
`y` は `y = a - x` で求められる
最終的に `(a + y) > b` になったら終わる。
(減少列の場合は `(a + y) < b` なのか？ここだけちょっと曖昧)

**そういうことね！！！！！**

これが理解できた時マジで脳汁溢れそうだった。

### 結論として

最初に自分がそうだと思っていた1番目の動きでいくとどうしても減少列として作ったときにそうはならんやろとなってしまう。
ついでに言えば `[2,2..20]` としたとき2づつ増えると思ってたのになぜか配列が `[2,2,2,2,2,2...]` で無限ループしてしまうのにも納得がいかなかった。

けれど2番目の動きが正しいとすれば `[10,9..1]` のとき `9 - 10` した結果の-1をどんどん10に **足して** いけば結果的に10から1までの減少列となる。
`[2,2..20]` であれば `2 - 2 = 0`なので2を配列に入れ続け無限ループに入る。
普通のステップ付きレンジではあるけど `[2,5..20]` なんかであれば `5 - 2 = 3` なので3を足しながら増えていくので
配列としては `[2,5,8,11,14,17,20]` となる。

## おわり

~~いかがでしたか？~~ おい

レンジとしてどう配列にぶち込まれるのかの動きを完全に勘違いしていましたというお話。
解が出ると自分でなんであんなに悩んでたんだろうとなるくらいには単純な動きだった。
そして全てに納得がいった。

すごいHaskellたのしく学ぼう！本こと、すごいえっち本はまだ2章を読み始めたくらいしか読んでないのでこれから頑張ろうと思います。
【iOS】Firestoreを使ったアプリのPRODUCT_NAMEを日本語にすると落ちる


## 問題
Firestoreを使ったアプリで、今まで開発プロジェクト名を英語名称で進めていたのですが、リリースに向けてアプリの表示名を日本語名称にするため、Xcode>TARGETS>General>Identity>Display Nameで日本語名称に変更したところ、突如アプリが落ちるようになりました。

## 原因
どうやらPRODUCT_NAMEが日本語になっていると落ちてしまうようです。
参考：https://stackoverflow.com/questions/58155123/ios-swift-firebase-firestore-crashed-at-nsbundle-bundlewithidentifier-org-coc

## 解決方法
Display Nameから直接変更するのではなく、Info.plistでBundle display nameのキーを追加してアプリの表示名を指定することで回避できるようになりました。

Info.plistには最初からBundle nameというキーで`$PRODUCT_NAME`が指定されています。
初めの方法でアプリ表示名を変更すると、この`$PRODUCT_NAME`がそちらに書き換えられるのでしょうか...？
RESTとは

#REST (REpresentational State Transfer)
- Restとは、2000年にRoy Fielding氏が提唱した、分散システムにおいて宇久数のソフトウェアを連携されるのに適した設計原則の集合。また、狭義には、それをWebに適したソフトウェアの設計様式のこと。一般には後者の意味で用いられることがほとんどである。
- 後者の意味のRESTは、パラメータを指定して特定のURLにHTTPでアクセスすると、XMLで記述されたメッセージが送られてくるようなシステム及び呼び出しインターフェース(RESTful API)のことを指す。
RailsでつくったLINEBOT

#RailsでLINEBOTつくりました。
技術的な話はあまりありませんが、ポートフォリオのために、ここにまとめます。

##どんなアプリか？
みんなでバーベキューとかした時の費用を割り勘計算してくれる幹事用アプリです。
幹事をやるとわかるのですが、みんなでバーベキューとか旅行した後に割り勘計算するのってめちゃくちゃめんどくさいです。支払者が一人であればまだいいですが、この費用はAさんが払ってて、あの費用はBさんが払ってて…とか最悪です。またレシートとかを保存しておくのもめんどくさいし、可能であれば透明性のために計算した後に内訳を公開したいと思い、このアプリをつくりました。

##アプリの流れ
・グループLINEにこのBOTを招待する
・各個人は支払をした際に、botに個別LINEの方で連絡する
・BOTがグループLINEの方で割り勘してくれる
・これをくり返し、最終的には誰がいくら払えばいいか教えてくれる
こんな感じ
https://twitter.com/hrnEaSwzbOLaWj6/status/1124184182744178688

##このアプリでできること
・割り勘の計算をしてくれる
・合計額と何にいくら払っているのかの内訳を各自LINE上で確認可能

##構成
Railsで全て書いています。サーバーはherokuを使っています。

##データ構成
モデルは主に、Userモデル、Itemモデル、costモデルに分かれます。それぞれの概要は以下となります。
costとItemは今思えば名称逆だった気がする。。。

Userモデル　Lineユーザー（例：たろうさん）
Costモデル　ある支払（例：バーベキュー代３０，０００円）
Itemモデル　ユーザー単位の支払額（例：たろうさんが３００円）

###関連付け
User←Cost
User←Item
Cost←Item
なんでこんな感じにしたかというと、①User単位の支払額を集計したかったのと②Costの支払額の人別の内訳を集計したかったからです

①たろうさんは結局いくら払えばいいの？というのを知りたい
→Userに関連付けされているItemを全て集計すればOK
②バーベキュー代って誰がいくら払うの？というのを知りたい
→Costに関連付けされているItemを全て集計すればOK
という感じですね

##コード
https://github.com/tarou1235/portfolio
【MySQL】条件に当てはまるテーブルをまとめて削除

suffixだけが違う複数のテーブルをまとめて削除したくなった。
こういうやつ↓

```
test_20191013000000
test_20191013001000
test_20191013002000
...
```

↓でもこういうのできないしなあ…

```sql
drop table test_*;
```


# やりかた
対象スキーマ名（＝データベース名）は`test_schema`、
対象テーブル名は`test_`の後ろにsuffixがついているとする。

## 1. 対象のテーブル名のカンマ区切り文字列を得る
information_schema.tablesにテーブルの情報が入っているので、条件に当てはまるものを抽出し、`group_concat`でテーブル名をカンマ区切りの文字列にする。
※対象テーブルが多い場合の表示を見やすく（垂直形式に表示）するために\Gをつけている。

- likeバージョン

```sql
select group_concat(table_name)
from information_schema.tables
where table_schema = 'test_schema' and table_name like 'table\_%' \G
```

- regexpバージョン

```sql
select group_concat(table_name)
from information_schema.tables
where table_schema = 'test_schema' and table_name regexp 'table_.*' \G
```

### 結果
```
*************************** 1. row ***************************
group_concat(table_name): table_20191013000000,table_20191013001000,table_20191013002000
1 row in set, 1 warning (0.00 sec)
```
※対象テーブルが多すぎる場合、途中までしか表示されないことがある。これはgroup_concatの結果文字数に制限があるため。設定を一時的に変更することで対処できる。
（参考：https://qiita.com/nwsoyogi/items/196cb92f79c6f01871e0 ）


## 2. 1の結果をdrop tableの後ろに貼り付けて実行し、テーブル削除
```sql
drop table table_20191013000000,table_20191013001000,table_20191013002000;
```

### 🎉
PlayFab、GameManager（管理画面）上でCloudScriptを実行する

定義したCloudScriptを実行するために、
わざわざクライアントから接続して[ExecuteCloudScript](https://api.playfab.com/documentation/client/method/ExecuteCloudScript)してたんですが、
管理画面から簡単に実行できました。

# 管理画面上からCloudScriptを実行する方法

### CloudScriptを定義

好きに定義します。

ここではチュートリアルのHelloWorldを使用

```cloudscript.js
// Cloud Script (JavaScript)
handlers.helloWorld = function (args, context) {
    var message = "Hello " + currentPlayerId + "!";
    log.info(message);
    var inputValue = null;
    if (args && args.hasOwnProperty("inputValue"))
        inputValue = args.inputValue;
    log.debug("helloWorld:", { input: inputValue });
    return { messageValue: message };
}
```

### ユーザーを作っておく

CloudScriptはログインしたクライアントから呼び出すことが多いと思います。（たぶん）

[UnityでPlayFabを使い始める方法（インストール〜匿名ログイン）](https://qiita.com/naichilab/items/b286babac60932792f0a)

上記手順で一度クライアントからログインしてプレイヤーを作っておきます。

> もちろんすでに存在する場合は不要です。

### プレイヤーのCloudScript画面を開く

ログインしたプレイヤーを選択し、CloudScriptタブを開きます。

![スクリーンショット 2019-10-13 2.41.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/cff65ceb-705e-2376-5b1b-368a0fe570fd.png)

### スクリプトを実行する

* リビジョンを選択（デフォルトでライブが選ばれている）
* 関数名を選択
* 必要に応じて引数を入力


![スクリーンショット 2019-10-13 2.42.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/ff138ba8-4920-e716-210d-3985ed654550.png)

入力したら `実行` を押すだけ。

これで右側に戻り値やログもろもろ表示されます。

# ログインユーザーの情報を扱う

`currentPlayerId` というグローバル変数が使えるので、以下の様に書いておけばログインユーザーを扱えます。

> [GetUserAccountInfo](https://api.playfab.com/documentation/server/method/GetUserAccountInfo)を叩いてみるだけの例

```sample.js
handlers.getAccountInfoSample = function(args, context) {
    var request = {
        "PlayFabId": currentPlayerId
    }
    var userAccountInfo = server.GetUserAccountInfo(request)
    log.info(userAccountInfo)
}
```

<img width="1175" alt="スクリーンショット 2019-10-13 2.50.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/0496a32c-50f3-586c-5a82-47529db613de.png">

# まとめ

1. `自動化 -> CloudScript -> リビジョン` 画面でCloudScriptを書き換える。そのままデプロイ。
2. `プレイヤー -> CloudScript` 画面にて実行

この方法で書いたScriptをすぐ試せる様になりました。

これでも地味に面倒なのでもっといい方法ある気はします...

（もっといい方法知ってる方は教えてください〜）
How to load word vector ( pretrained fasttext ) : fasttextで事前学習したvectorを読み込む方法

# 概要
+ 埋め込み層への適用
+ [追記]「ValueError: invalid literal for int() with base 10: ','」のようなエラーが出た場合の対処法

# 環境
+ Ubuntu 18.04.3 LTS
+ python 3.7.3
+ pytorch 1.3.0
+ gensim ( pip install gensimでok )

# 方法

 FastTextのサイト([link](https://fasttext.cc/docs/en/english-vectors.html?fbclid=IwAR1min8_xIRYPGEJORNYxtCZvgoEf4525qTAtsSTEjihTtoWc_GnC2qp_jo))からwiki-news-300d-1M.vec.zipをダウンロードして解凍。（他にvector fileがあるならそれでもよし。)
*以下のような内容([word] [分散表現, .....])

```
engage -0.0935 0.0512 0.1021 ........
Mayor -0.0162 0.1117 -0.2773 ........
```  

 python上でgensimを使って読み込み(かなり遅い)、次回以降高速に処理するためにbinファイルとしてsave

```
>>> import gensim
>>> m = gensim.models.KeyedVectors.load_word2vec_format('wiki-news-300d-1M.vec')
>>> m.save_word2vec_format('wiki-news-300d-1M.bin', binary=True)  
```

 確認

```
>>> m = gensim.models.KeyedVectors.load_word2vec_format('wiki-news-300d-1M.bin', binary=True)  
>>> m['oh']  
array([-6.550e-02,  8.530e-02, -1.158e-01, -6.580e-02, -5.300e-03, .... ])  
```


# 埋め込み層への適用
上記の配列をFloatTensorに変換し、weightとしてEmbedding層にloadさせる.(変換方法は省略)
具体例は[ここ](https://codeday.me/jp/qa/20190406/516428.html)を参照。下記のような内容が書かれている。
>\>> weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]])
>\>> embedding = nn.Embedding.from_pretrained(weight)
>\>> input = torch.LongTensor([1])
>\>> embedding(input)

# [追記]ValueError: invalid literal for int() with base 10: ','」のようなエラーが出た場合の対処法
vectorファイルは、最初の行に単語の数と次元を明記する必要があります。

```
999994 300
```  

以下のように対処してください

```
python -m gensim.scripts.glove2word2vec --input wiki-news-300d-1M.vec --output wiki-news-300d-1M.vec
```
PlayFab、CloudScriptをGitHubと連携して管理する

PlayFabのCloudScriptをGitHubで管理できるみたいなので試してみました。


# CloudScriptリポジトリの作成

GitHubで適当にリポジトリを作ります。 `playfab-sample-game-cloudscript` って名前にしました。

とりあえずGitHub上でそのままファイルを作ってみます。

```HelloWorld.js
// CloudScript (JavaScript)
handlers.helloWorld = function (args, context) {
    var message = "Hello " + currentPlayerId + "!";
    log.info(message);
    var inputValue = null;
    if (args && args.hasOwnProperty("inputValue"))
        inputValue = args.inputValue;
    log.debug("helloWorld:", { input: inputValue });
    return { messageValue: message };
}
```

> 公式チュートリアルそのままです。
> https://docs.microsoft.com/en-us/gaming/playfab/features/automation/cloudscript/writing-custom-cloudscript




# PlayFabにてGitHub連携設定

自動化 -> CloudScript -> リビジョン -> GitHubを使用

<img width="1438" alt="スクリーンショット 2019-10-07 23.01.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/eb92f6b0-13f5-0c13-a8a3-52b05e5316ea.png">

特に追加料金は要らないようです。 `GitHubアカウントを承認` してみます。

<img width="1193" alt="スクリーンショット 2019-10-07 23.04.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/ede450a6-dfac-b0a6-ea3c-360e521b445f.png">

認可する権限を確認して `AuthorizePlayFab`

リポジトリ一覧が出てくるので先ほど作ったものを選択して `設定を保存`

<img width="566" alt="スクリーンショット 2019-10-07 23.17.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/99a4e02b-a9c1-7874-fd08-15cf276f35d3.png">

インストール済みに変わりました。

<img width="382" alt="スクリーンショット 2019-10-07 23.18.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/cb94ce08-11f1-e483-55bb-537a98355404.png">

もう一度 `自動化` 画面に戻ると...何も変わってないw

<img width="850" alt="スクリーンショット 2019-10-07 23.20.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/acd2923e-aa85-5f23-a0e6-475af5f3081b.png">

もしかして連携後にコミットしなきゃ反映されない？
と思い追加コミットしてみたら反映されました。

<img width="416" alt="スクリーンショット 2019-10-07 23.25.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/456f10a3-6d6b-1df9-65f4-39df46c839cd.png">

たしかに作ったものになっています。

リビジョンを切り替えてデプロイ。

<img width="735" alt="スクリーンショット 2019-10-07 23.25.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/9c738179-fab5-e9a3-b10c-923882c49c5b.png">

# あとがき

最初は便利〜と思ったけど、GitHubにプッシュしたあと管理画面でデプロイが必要でめんどくさいですね。

自動デプロイとかONにできたらいいのに。

GitHub連携せずに管理画面で直接書いてもリビジョンは残るようなので、とりあえずそちらでコーディングすることにしました。

複数タイトルでスクリプトを共有（開発と本番とか）する場合にメリットが出てくるかと思います。


# リンク

* CloudScript概要
    * https://docs.microsoft.com/ja-jp/gaming/playfab/features/automation/cloudscript/
【JavaScript】parseInt() 関数は文字列中に基数変換できない文字があると解析途中の値を返す

`parseInt()` 関数を用いて基数変換を行うコードを書いたのですが、意図しない変換をされてしまうことがあったので自分なりの解決策を記録しておきます。

#要約
- `parseInt()` 関数は文字列中に指定の基数へ変換できない文字があると**それ以降の文字列を無視した途中までの解析結果**を返す。
- `parseInt()` 関数で変換した値を**`toString()` メソッドで逆変換を行い、変換前の文字列と比較**する。

#どんなプログラムを書いていたのか
1. 文字列を指定の基数の値であるとして、10進数に変換するプログラム。
2. 変換できない場合は **-1** を返す。

| 文字列  | 基数 | 出力 |
|:------:|:----:|:---:|
|AF      |  16  | 175 |
|100     |  10  | 100 |
|101     |   2  | 5   |
|Z       |  15  | -1  |
|AZ      |  15  | -1  |
上記の表のように、例えば `AF` という文字列に `16` の基数が与えられていたならば、`AF` を**16進数の値**だとして、10進数に変換するようなプログラムです。
また、上記の表にある `Z` や `AZ` は**15進数に存在しない値**です。このような入力の場合は、-1 を返します。

この問題を解決するために、`parseInt()` という便利な関数があります。
これで変換すればよい！と私は考えました。

#parseInt() 関数で変換を試みた
##コード

```javascript:convert.js
function f (str, rad) {
    var ret_val = parseInt(str, rad);
    if (Number.isNaN(ret_val)) {
        return -1
    }
    return ret_val
}
console.log(f("AF",16)); // => 175 correct
console.log(f("100",10));// => 100 correct
console.log(f("101",2)); // => 5   correct
console.log(f("Z", 15)); // => -1  correct
console.log(f("AZ", 15));// => 10  incorrect
```

**15進数の AZ は存在せず、10進数に変換できない**ので、出力は **-1** を期待しますが**10**が返ってきました。
変換できないのだから、`NaN` を返すんじゃないの？？？
>戻り値
与えられた文字列を解析した整数値です。最初の文字を数値に変換できない場合、NaN が返されます。
>[MDN web docs: parseInt() 構文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt#%E6%A7%8B%E6%96%87)より引用

これは意図しない返り値です。どうしましょう
 
#parseInt() 関数の仕様
もう一度、しっかり MDN web docs の `parseInt()` のページをチェックしました。

>parseInt()関数が第1引数の文字列の中に第2引数の基数で数字とされない文字を認めると、それ以降の文字は無視され、そこまでの値を解析した整数値が返されます。
>parseInt()関数は数値を整数に切り捨てます。
>第1引数の文字列の前と後の半角スペースは無視されます。
>[MDN web docs: parseInt() 説明](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt#%E8%AA%AC%E6%98%8E)より引用

ここらへんに私が意図しない返り値を返す理由がありそうです。

上記のように、`parseInt()` 関数は文字列の中に指定した基数に存在しない文字があるとき、**それ以降の文字列を無視して解析途中の値**を返します。
つまり、`AZ` の場合、`Z` は15進数に存在しない文字であるため、それまでの解析結果、つまり `A` を10進数に変換した値である**10**が返ってくるということなんですね。

#解決策
10進数に変換した値を**もう一度、指定の基数に変換し**、入力時の文字列と同値かどうかチェックする。

##コード
```javascript:convert.js
function f(str, rad) {
    var converted_val = Number.parseInt(str,rad);
    var re_converted_val = converted_val.toString(rad).toUpperCase();
    if (re_converted_val != str) {
        return -1;
    }
    return converted_val;
}

console.log(f("AF",16)); // => 175 correct
console.log(f("100",10));// => 100 correct
console.log(f("101",2)); // => 5   correct
console.log(f("Z", 15)); // => -1  correct
console.log(f("AZ", 15));// => -1  correct
```

できました！
先ほど意図しない値を返していた `AZ` ですが、**`converted_val(10)` を `toString()` メソッドを用いて、もう一度 `15進数(A)`に変換**します。
そして、**元の文字列(`AZ`)**と比較し、異なる値であることを確認し、**-1**を返しています。

#参考
[MDN web docs: parseInt()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt)

#最後に
最後まで変換できないなら途中までの値を返さないで `NaN` を返してよ...と思ったのですが、何か事情があるんでしょうか。
道のりは長いですね笑
誤字脱字や解釈の誤りなどございましたら、ご指摘くださると大変ありがたいです。
ここまで読んでくださり、ありがとうございました。
SESから情シスに転職した軌跡~枯れた技術を応用~

はじめまして、私は中学生の頃からプログラマーになることを夢見ていたSI及びSES出身のエンジニアです。2012年頃、現在の勤務先から内定をいただき、社内SEに転身しました。当時は、30代前半でした。

元々、社内SEには憧れていたのですが、20代の頃から応募しても最終面接でお祈りをいただく等、何度も失敗を繰り返してきました。なので、今の情勢に合わないかもしれませんが、以前掲載した記事をブラッシュアップして更新させていただきました。

とりあえず、当時探していた求人は以下のような条件でした。

- 情報システム部門が存在する
- データベースの経験が活かせる
- 都内近郊かつ転勤がない
- 通勤45分以内
- 社員が50人以上
- 年齢の近い社員がいる
- 年収が400万を下回らない

正直、きりのない条件をあげていた気がします。。

# 目次
[1.簡単な職務経歴][link-1]
[2.過去の振り返り][link-2]
[3.時代の変化…][link-3]
[4.アニキとの出会い][link-4]

[link-1]: https://qiita.com/legend_of_roto/items/98ff1f843b7581231101#%E7%B0%A1%E5%8D%98%E3%81%AA%E8%81%B7%E6%AD%B4%E7%B5%8C%E6%AD%B4
[link-2]: https://qiita.com/legend_of_roto/items/98ff1f843b7581231101#%E9%81%8E%E5%8E%BB%E3%81%AE%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A
[link-3]: https://qiita.com/legend_of_roto/items/98ff1f843b7581231101#%E6%B4%BE%E9%81%A3%E6%99%82%E4%BB%A3%E3%81%AE%E5%A4%89%E5%8C%96
[link-4]: https://qiita.com/legend_of_roto/items/98ff1f843b7581231101#%E3%82%A2%E3%83%8B%E3%82%AD%E3%81%A8%E3%81%AE%E5%87%BA%E4%BC%9A%E3%81%84


# 簡単な職歴経歴
ここまで前置きが長くなってしまいましたけれど、簡単にこれまでの職歴を洗い出してみると、
以下のように何度か転職を繰り返しています。フリーランスを入れて、ざっと４回になります。

- 中小SI企業
 - メインフレーム系エンジニア(主にCOBOL)
 - オープン系エンジニア（主にVB）
- フリーランス
 - 社内システム保守（主に雑用）
 - メインフレーム系エンジニア(主にCOBOL)
- 中小SES企業
 - メインフレーム系エンジニア(主にCOBOL)
 - WEB系データベースエンジニア(主にOracle)
 - WEB系システムエンジニア（主に設計）
- 某通信商社
 - 情報システム部門の技術業務（主はデータ抽出ですが、ヘルプデスク等も経験）
 - データエンジニア
 - マーケティングツール導入
 - データエンジニアリング
 - データに関する何でも屋

# 過去の振り返り
このように振り返ってみると、広く浅くIT業界に関わってきたんだな～と自分自身感じます。
企業側の買い手市場だったら間違いなく書類審査で引っ掛かかる経歴ですよ！

未だに金融機関等で需要があるとはいえ、枯れた言語であるコボルでは不利になるケースが多かったです。

それでは、何故低スペック寄りの私でもスキルチェンジする事が出来たのかと言いますと、
時代の変化と世間のニーズにマッチしたことに尽きるのではないでしょうか。

# 派遣時代の変化
私がSESで最後に客先常駐していた時期は、iPhoneが国内で浸透し始めた頃であり、
ガラケーとスマホで争っている全盛期でした。そして、震災の直後でもあります。

経験者ならお分かりだと思いますが、派遣先の職場でネットへの接続など一切出来ず、
ひたすら常駐先のPMやクライアントの視線を気にしながら日々仕事をしていました。

そんな居心地の悪い人売りのブラック臭が漂うSESから脱出したかったワタクシ、、、
SEのオアシスであると認識されやすい社内SEという括りの職種に数十社と応募しました。

しかし、世の中そこまで甘くはありませんでした。

# アニキとの出会い
引退前のプロ野球選手のように打率025・ホームランと打点が0のような厳しい時期が続き、
なかなか思うように面接にも行き着けなかったわけです。。。

この時期は本当に上手くいかず苦しかったです。本当に社内SEへの道を引退しようかと考えました。

そんな時に何気なく某Aブログを眺めていたら、転職のアニキと呼べるような年上の鉄人に出会いました。
その方のアドバイスを元に自己応募を止めて、転職エージェントを3社くらい活用するようにしました。

転職の終盤には得点圏の打率アップのスキルを身に付けて、2～3社から最終面接の案内をいただきまして、
晴れて現在の勤め先で社内のシステムエンジニアとして転職することが決まりました。

# そして…伝説へ
現在もエンジニアとして働く身ではありますが、勤務先で職種のロードマップが存在しないため、
40代のキャリアプランに悩む日々を過ごしてます。（※2020年頃、転職を視野に入れていました）

社内SEに転身した後の話については、コロナの問題を加味して、続きを書こうかなと思います。
【Unity】【基礎】2Dプロジェクトにおける座標系について

#調べたいこと
Unityの2Dプロジェクトのウィンドウサイズと画像サイズの関連性がわからない。
①下図は、ウインドウサイズをStandalone(1024 * 768)に同サイズの背景(緑)を表示させているが、背景のほうが小さく表示されてしまう。
②座標系も正規化されているのか、カメラに映る座標の範囲が、(X : -7 ~ 7, Y :-2.5 ~ 2.5)となっている。
③2Dゲームでは，座標をドット単位で扱うにはどうすればよいか。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/2e23d1f8-6c51-23f7-0945-f1d4ef28524a.png" width = 50%>

# 画像の場合
##Unity(2D)の座標について
Unityの描画範囲はカメラの領域に依存するため、具体的な範囲は存在しない。
デフォルトでは、Main CameraのSizeが5なのでY軸は±5の範囲が描画される。
X軸は1024 * 768であれば、 5 * 1024 / 768 = 6.666666になる。
よって**カメラの描画範囲は(X : -6.66 ~ 6.66, Y : -5 ~ 5)**

![pos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/d22c0ac5-2280-5fe9-6690-09569643ea62.png)

##画像のサイズについて
![calc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/279b1819-c12a-046a-7b36-d1de4d9a408d.png)
画像のサイズは画像のインスペクタの「Pixels per Unit」で決まる。
この値はデフォルトでは「100」になっていて、サイズを1/100して取り込まれる。
つまり、**1024 * 768の画像はUnity上では (X : -5.12 ~ 5.12, Y : -3.84 ~ 3.84)**
これが**カメラの描画範囲(X : -6.66 ~ 6.66, Y : -5 ~ 5)**より小さいのが原因で、カメラの背景色(青)が映ったのだ。

##ドットバイドットの描画
Unityでの座標をドット単位で扱うには、以下の２つのステップを行う。
①カメラの描画範囲を変更する。
　「Main Camera -> Size」を (1024 * 768)の高さの半分を設定する。 768 / 2 = 384 
②インスペクタの「Pixels per Unit」を「100」から「1」にする。
　これにより画像の1ピクセルがUnityにおける座標の1となる。
ちなみにこのように単位を合わせることをドットバイドットと呼ぶ。
(ドット絵といわず、2Dゲームであれば全てこれを適応してもよい気がするが、どうなんだろうか。)

#参考サイト
[ドット絵ゲームをunityで作るときに押さえておきたいポイント](https://qiita.com/pixelflag/items/ad817bdd64931e084a46)
Railsの削除のルーティンがうまく行かない Unknown action The action 'show' could not be found for BlogsController

削除機能を実装中、画面にこんなエラーが。
showのルーティングがうまくいっていません？
showはメソッド実装していないから出るかもしれいけど、もしかして削除のリクエストを送るときのリクエストのメソッドが違う？

```
Unknown action
The action 'show' could not be found for BlogsController
```

```ruby:app/controllers/blogs_controller.rb

  def destroy
    @blog = Blog.find(params[:id])
    @blog.destroy
    redirect_to blogs_path
    flash[:success] = 'delete success'

  end
```


```ruby:config/routes.rb
Rails.application.routes.draw do
  resources :blogs
end
```

たくさんぐぐる。
ルーティングはresourcesでおまかせにしているし、リクエストのメソッド指定も合っていそう。

```ruby:app/views/blogs/index.html.slim
 = link_to '削除', blog_path(blog.id), method: :delete, class: 'btn btn-primary'
```

いろいろぐぐって、参考サイトにたどりつく。


```javascript:app/assets/javascripts/application.js

//= require activestorage
//= require turbolinks
//= require jquery
//= require popper
//= require bootstrap
//= require_tree .
//= require jquery_ujs  // <- これを足す
```

おそらくjquery-railsを入れているとこういうことになるっぽい。

参考サイト

[Rails 削除機能の実装方法　手順 \- Qiita](https://qiita.com/STHEXA/items/bebd35d67013fe0f19dd)

[forms \- ruby on rails link\_to delete method not working \- Stack Overflow](https://stackoverflow.com/questions/12997167/ruby-on-rails-link-to-delete-method-not-working)
NumberFormatterで少数点有りの値をカンマ区切りにする際は注意してほしい

### 問題
桁数が多い値をDouble型へキャストする際に、DoubleのイニシャライザやNSStringを使用すると四捨五入が発生する場合があるようです。
<img width="962" alt="スクリーンショット 2019-10-13 1.01.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15703/7c95788a-438a-41dd-9f79-798f00ff9d9f.png">


### 解決策
NSDecimalNumberを使用して、`string(from: NSNumber)`を使うことで解決します。
<img width="961" alt="スクリーンショット 2019-10-13 1.04.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15703/63da0b7c-4a98-5b88-0b74-e05a167ab970.png">
Bootstrapで使える表現メモ

2019年10月12日及び13日の学習メモを以下に残す。


ーーーーーーーーーーBootstrapーーーーーーーーーーーーーー
CSSでクラス指定して書いていたデザインもbootstrapを使うことで
class＝””の中に書くだけで簡単に指定できる。

ただし、bootstrapにはimportantという指定がされていて他のクラスで上書きできない。
CSSで指定してもbootstrapが優先される。

【文字色指定】
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513152/3899bb10-fed1-a3c4-2d72-36d1b3dd2e6e.png)

【背景色指定】
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513152/d29e9b94-be1c-07c8-4c90-6143813db706.png)



【width,height】
width:25%;→w-25
height:25%;→h-25
25,50,75に使える。

【余白】
[p|m][location]-[size]
p:padding /:margin
location t:top r:right b:bottom l:left x y
size 0~5 marginのみautoも
1:0.25rem
2:0.5rem
3:1rem
4:1.5rem
5:3rem

【ボタン】
btn-primaryで青いボタン
btn-sm:小さいボタン
btn-lg:大きいボタン
divタグやaタグにも使える

【グリッドレイアウト】
グリッドレイアウトを使うには全体をある程度の幅を持たせて中央ぞろえにするocntainerクラスの中に書く
row（列）
col（行）
row-4など指定するお12分割で割合を指定できる
12より小さい指定は足りない部分が空白に。
12より大きい指定は次の行へ。

【レスポンシブ】
Bootstrapでは４つのブレークポイントを用意。
576px以上:sm(small)
768px以上:md(midium)
992px以上lg(large)
1200px以上:xl(extralarge)

col-md-2と書くことでmd以上のときに2に指定できる。
d-noneで非表示。col-2 のあとにd-md-noneなど。
d-none　のあとに d-md-blockとすることで閾値以上のとき表示

【画像切り抜き】
rounded-circleで画像を丸く切り抜く

【順序指定】
order-sm-1
order-sm-2
などと書くことで順序を指定できる。sm以上のとき1が先に来る。

≪おまけ：VSCodeで使えるショートカットキー≫
ctrl+c→ctrl+v1行下にコピー
ctrl+k→ctrl+cコメントアウト
ctrl+Alt+Enter→上に空白行追加
ctrl+Enter→下に空白行追加
nuxt-i18nでno_prefixを使用する

## やったこと
- nuxt用にvue-i18nを拡張したプラグイン、nuxt-i18nというプラグインがあったので使った
- ルートにロケールプレフィックスを含まずに表示させる

## 前提
- nuxtプロジェクトを作成済み
- nuxt-i18nをインストール済み


## nuxt.config.tsの設定


```nuxt.config.ts
modules: [
    :
 'nuxt-i18n'
],
i18n: {
     :
  strategy: 'no_prefix', // ロケールプレフィックスを含まなくする
},
```

## 言語の切り替え方法
vue-i18nの拡張メソッド `setLocale` or `setLocaleCookie ` を使用する。
ちなみに、nuxt-i18nをインストールだけで `this.$i18n` が使える。

```index.vue

<template lang="pug">
template(v-for="locale in locales")
  .a(@click="changeLocale(locale.code)") {{$t('val')}}
</template>
<script lang="ts">
import { Component, Vue } from 'nuxt-property-decorator';

@Component
export default class Index extends Vue {
  /** 対応言語一覧を取得する */
  computed: {
    locales: {
      get () {
        return this.$i18n.locales;
      },
    },
  }

  /**
   * リロードあり
   * クッキーへ言語設定。リロード後、言語切替
  */
  changeLocale(locale: string) {
    this.$i18n.setLocaleCookie(locale);
    this.$router.go(0);
  }

  /**
   * リロードなし
   * クッキーと、$i18n独自ストアのlocaleに言語を設定する
   * 直接storeを書き換えるためリロードは不要
  */
  async changeLocale(locale): Promise<void> {
    await this.$i18n.setLocale(locale);
  }
```

これで、ルートにロケールプレフィックスを含まずに画面遷移などができる。
リロードの有無は、お好きな方で。

### 参考
https://nuxt-community.github.io/nuxt-i18n/api/#extension-of-vue
(勉強中)Blazorとか言うのがすごそうなので触れてみた

※勉強中なのでメモとかリンクとかをただただベタベタ張ってるだけです。

#今後はASP.NET Webフォームの代わりにBlazor使って、ていう話らしいので勉強開始。
ASP.NET Webフォームってサーバーサイドでのページ生成という最近のトレンドとは真逆を行ってるので廃れていくのは理解できるけど、イントラネット内で動くちょろっとしたもの作る分には便利なんだけどなぁ・・・
(社内にIISが立ってれば「ボタンとかコンポーネントをGUIでペタペタ→動作記述→ビルド→デプロイ」だけ。デバッグも普通のWindowsと全く同じでステップ実行可能で超簡単)

- [[ASP.NET Core] Blazor Server 入門 (セットアップ編)](https://mseeeen.msen.jp/asp-dotnet-core-blazor-install/)
- [がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは - slideshare](https://www.slideshare.net/jsakamoto/c-single-page-web-blazor-148130367?qid=80ce1408-1982-428a-969b-7abd5bdd50de&v=&b=&from_search=1)
- [C# で Single Page Web アプリを開発できる Blazor ― その魅力 - slideshare](https://www.slideshare.net/jsakamoto/c-single-page-web-blazor?qid=80ce1408-1982-428a-969b-7abd5bdd50de&v=&b=&from_search=2)
- [WebAssemblyとBlazor: 何十年の問題を解決する](https://www.infoq.com/jp/articles/webassembly-blazor/)
- [【翻訳完了待ち】ASP.NET Web Forms 開発者向け Blazor - Microsoft Doc](https://docs.microsoft.com/ja-jp/dotnet/architecture/blazor-for-web-forms-developers/)
 
#Razorって何？
→.NET以前のASPに先祖返りしたみたいなやつ。但しASPと違ってクライアントサイドで動く。
- [Razor ビューエンジン](https://aspnet.keicode.com/basic/razor-index.php)

#VS Codeなので完全に同じではない(うちの環境はVisual Studio professional 2019)けど超参考になる。
- [[ASP.NET Core] Blazor Preview 9 入門 (EF Core + SQL Server 編)](https://mseeeen.msen.jp/asp-dotnet-core-blazor-preview9-ef-core-sqlserver/)
- [[ASP.NET Core] Blazor 入門 (Secret Manager 編)](https://mseeeen.msen.jp/asp-dotnet-core-blazor-secret-manager/)

#Visual Studioでの動作
サンプルプロジェクト眺めてるけどようわからん・・・
とりあえずRazorコンポーネント(.razor)を足してナビメニューにアイテム足したら簡単にページ(っていうと語弊があるか？)が追加できた。
【BAT】UTF-8ファイルのBOMを削除する

# はじめに
1999年に発売されたDelphi5で作成されたレガシーアプリケーションがあり、サーバーリプレース作業に伴いデータベースもOracle→PostgreSQLに変更になることで改修作業をしました。
Delphi5では標準でUTF-8に対応していないため、外部コンポーネントを使用してUTF-8のファイルを読み込みと保存をするのですが、UTF-8のBOM付きしか対応していません。

PostgreSQLではCSVファイルをインポートする際、UTF-8のBOM無しにする必要がありまして、BOMを削除するのに下記サイトを参考にしました。

* [バッチファイルだけで、UnicodeLE や UTF-8 の BOM を除去する。](http://scripting.cocolog-nifty.com/blog/2009/05/unicodele-utf-8.html)
* [BATファイルでBOM付きUTF-8ファイルからBOMを取り除く方法](https://kunst1080.hatenablog.com/entry/2017/08/06/210139)

```bat
utf8-bom.cmd BOMありUTF-8ファイル BOMなしUTF-8ファイル

start /min /wait cmd /c chcp.com 65001 ^& cmd /u /c type %1 ^>$$$ ^& cmd /c type $$$ ^>%2 ^& del $$$
```

# 文字化け
データ量が少ないファイルなら問題がなかったのですが、データ量が多いと幾つか文字化けが発生しているところが出てきました。
文字化けしている文字に問題があるのかと思ったのですが、ごく普通の文字「ャ、ー、ン、ウ、鳥、オ、中、野」で、別行のところでは正常に変換されているのです。
文字化けした行に正常に変換されている文字にしてみたところ文字化けしたので、桁位置に問題がありそうです。ただ文字化けした行位置に特に規則性がありませんでした。
データ量としては5600バイトを超えたあたりから幾つかの文字化けが発生します。

文字化けした部分をバイナリーエディターで見たところ、「EF BF BD」がセットされていました。
この文字列は「[謎の文字列 %EF%BF%BD](http://www.pppea.com/triflesthings/efbfbd.html)」の記事によると「REPLACEMENT CHARACTER」でUTF-8でエンコード／デコードして失敗したときに使われる文字のようです。

# 対応
バッチからPowerShellを呼び出して、ワンライナーでUTF-8のBOM無しに変換するようにしました。
参照：[UTF-8 BOM付きでファイルを、BOMなしで保存する。](https://w.atwiki.jp/maisenakajima/pages/36.html#id_2fdc5fd2)

```bat
powershell -NoProfile -ExecutionPolicy Unrestricted -Command "& { $MyPath = 'test.csv';$MyFile = Get-Content $MyPath; $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False);[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)}"
```

複数ファイル(例 csv形式)を一括変換する場合

```bat
@echo off

cd /d %~dp0

for %%a in (*.csv) do (
  powershell -NoProfile -ExecutionPolicy Unrestricted -Command "& { $MyPath = '%%a';$MyFile = Get-Content $MyPath; $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False);[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)}"
)
```

# 最後に
このPostgreSQL対応自体は2013年に行ったものでしたが当時は使われることがなく、今回のサーバーリプレース作業により本格的に使用するようになって問題が判明することになりました。
一番の問題はユーザーから指摘されたことですね。データ量によって文字化けするとは思いもしてなかったのでテスト漏れしてしまった。
【Rails】form_withのlocalオプション

#form_withとform_for
Rails5.1からform_forとform_tagが統合され、form_withに。
form_forとそんなに変わらない。

共通の特徴
- 自動でパスを選択してくれて、HTTPメソッドを指定する必要が無いこと
- コントローラーから渡された、ActiveRecordを継承するモデルのインスタンスが利用できること
- inputタグは用いないこと

**使用例**

```hoge.html.erb
<%= form_with(model: @user, local: true) do |form| %>
  <%= form.text_field :name %>
  <%= form.submit "SEND" %>
<%= end %>
```

form_withではデフォルトの状態ではajaxでの通信がおこなわれる。
それをキャンセルするためのオプションんが　local: true
cronでpmsetを複数登録する

以前seleniumでchrome自動操作を定期的に行う処理をしたいたが、macのシステム環境設定からのスケジュール設定数には限界があることを知りこの機会にまとめておく。

# 問題点
<img width="663" alt="スクリーンショット 2019-10-12 23.18.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413679/6e94c2ed-8232-ca46-841f-c0d33ba63e88.png">
見ればわかるが起床またはスリープ解除はそもそも１つしか設定できない。

## 解決策
調べたらmacでは電源の操作をpmsetで行うらしい。
簡単な例文は下記になる

```
# 現在設定されているスケジュール確認
pmset -g sched

# 1回のみ実行．以下は起動させる場合
# ほかに sleep, wake, shutdown, wakeorpoweron がある．
sudo pmset schedule poweron "10/20/11 18:00|00"

# 繰り返し実行．曜日は MTWRFSU の部分集合で記述する
sudo pmset repeat shutdown RF 07:50:00
```

GUIじゃ最大２個のスケジュールしか登録できないが、pmsetとcronをうまく組み合わせれば実際何個でもスケジュールを登録できる！

## 注意する点
これでうまく行くかと思いきや、cronでpmsetが起動しなかった。
エラー文にはpmsetってそもそもroot権限でしか作動しないらしい。
なのでsudoのcrontabでスケジュールやらを設定する。

```
# rootにログイン
sudo su

# rootとしてcronを書く
crontab -e
```

## 実際に書いてみよう
例文は下記になる。

```
0 1 * * * /path/to/script1
1 1 * * * pmset repeat shutdown MTWRFSU 01:02:00 wakeorpoweron MTWRFSU 02:59:00

0 3 * * * /path/to/script2
1 3 * * * pmset repeat shutdown MTWRFSU 03:02:00 wakeorpoweron MTWRFSU 00:59:00
```
これを解釈すると
1. 01:00にscript1を実行する
2. 01:02にパソコンをシャットダウンさせることと、02:59にパソコンを起動させるスケジュールを01:01に登録する
3. 02:59にパソコンが起動する
4. 03:00にscript2を実行する
5. 03:02にパソコンをシャットダウンさせることと、翌日00:59にパソコンを起動させるスケジュールを03:01に登録することで原点に戻る

上記の原理でいくらでも定期的な命令を実行できるわけだ！
素晴らしい！以上！

## 参考になったサイト
https://apple.stackexchange.com/questions/56635/schedule-multiple-wake-up-times-for-mac
http://kapibara3kapibara3.blogspot.com/2019/03/pmsetmac.html
バッチ処理とCronとシェルの関係

バッチ処理とCronとシェルの関係の理解を深めるため、整理してまとめてみました。

## 環境
Linux

## 関連用語と意味の整理

### バッチ処理
一定期間ごとなど何らかの条件に基づいて自動的に特定のジョブを起動する処理方式

### ジョブ
コンピュータに対して与えられる処理の実行単位
実行するプログラム名やその所在、実行時の設定などがジョブ制御言語によって記述され、ジョブスケジューラによって自動制御が行われる

### クーロン
ある時点で定義されたジョブの実行をスケジュールするデーモン（ジョブスケジューラの一種）
言い換えれば、バッチ処理（の一種）を行うプログラム
/etc/crontabもしくは/etc/cron.d配下のファイルにジョブのスケジュールを記述する
※記述方式は以下の通り

```
minute  hour  day  month  day of week  username  command
```
commandの部分にシェルスクリプトを記述することで、シェルによる処理を行わせることができる

### シェル
人間が入力した内容をコンピュータに伝達するプログラム

### シェルスクリプト
シェルに対する命令を記述したファイル

## 図で表してみた

### バッチ処理とクーロンの関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/9b5337d2-9979-2a09-1087-8564a49dfcd7.png)
※「・・・・・」は他のタイプのバッチ処理やジョブを表す

### クーロンとシェルの関係
※cronの設定ファイルのコマンドの箇所にシェルスクリプトが記入されている場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/eedc9cd4-6cd1-7f76-afa3-34f78d02228b.png)

①cronは/etc/crontab or /etc/cron.d配下のファイルでスケジュールされた内容をもとに
②シェルを動作させ
③対象のシェルスクリプトの内容を実行する

## まとめ
「クーロン」は指定された日時に「シェル」を動作させて、設定ファイルのコマンド欄に記述されている内容を実行する（「バッチ処理」の一種）

## 参考

[バッチ処理【 batch processing 】| IT用語辞典e-Words](http://e-words.jp/w/%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86.html)
[ジョブ【 job 】| IT用語辞典e-Words](http://e-words.jp/w/%E3%82%B8%E3%83%A7%E3%83%96.html)
[デーモン  【 daemon 】| IT用語辞典e-Words](http://e-words.jp/w/%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3.html)
[第21章 システムタスクの自動化 | RedHat](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/ch-Automating_System_Tasks#s1-autotasks-cron-anacron)
[ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりました | SlideShare](https://www.slideshare.net/ssuser1f3c12/cronrundeck)
[Linux上でシェルが実行される仕組みを，体系的に理解しよう　（bash 中級者への道）| 主に言語とシステム開発に関して](https://language-and-engineering.hatenablog.jp/entry/20110617/p1)
PythonでOP/COMPを制御する

TouchDesignerはノードベースのプログラミング言語ですが、Pythonでも書けます。
『どこに書くか？』については[satoruhigaさん](http://satoruhiga.com/post/extending-touchdesigner/)が、Pythonの基本的な書き方は[いろんなひと](https://qiita.com/sanokazuya0306/items/d733b17854a566801d00)が書いているので今回は『TouchDesignerの機能を具体的にPythonで制御するには？』について書きたいと思います。

# TouchDesignerで主に扱う3つのClass
TouchDesignerをPythonで扱う場合、主に4つのクラスを扱います。
[COMP Class](https://docs.derivative.ca/COMP_Class), [OP Class](https://docs.derivative.ca/OP_Class), [Par Class](https://docs.derivative.ca/Par_Class)、[Connector Class](https://docs.derivative.ca/Connector_Class)です。
COMP ClassはBase COMPなどのCOMPを扱うときのクラス、OP ClassはTOPやSOPなどを扱うクラス、そしてOPやCOMPが持つ各種の値、例えばtx, ty, tzやbuttonのw(width), h(height)などがPar Classとなっています。
Connector ClassはOPやCOMPが持つコネクタの部分（OP同士をつなげるワイヤを繋ぐところです）のクラスです。

また、細かく言えばOP Classは各OPごとにOP Classを継承して作られていますが、今回は個別のメソッドには触れず、全体に共通した処理を紹介していきます。
個別のを見たければ[CHOP Class](https://docs.derivative.ca/CHOP_Class), [TOP Class](https://docs.derivative.ca/TOP_Class), [SOP Class](https://docs.derivative.ca/SOP_Class), [MAT Class](https://docs.derivative.ca/MAT_Class), [DAT Class](https://docs.derivative.ca/DAT_Class)で確認できます。 

# Python上での変数名の確認方法
マウスカーソルを知りたいパラメータの名前の上にロールオーバーすれば名称が表示されます。
"Width"のPython上の変数名は"w"のようです。
![pythonmember.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152718/6d36c4f1-592a-6399-3972-5bfaf3a64cfa.png)

# よく書くやついくつか
よく書く処理を挙げておきます。チートシート替わりにどうぞ。

## Constantの値を変更する
直接値の読み書きができます。

``` python
op('circle1').par.radiusx.val = 0.5
```


## expressionのパスを変更する
パスを文字列として書き込みます。

``` python
op('circle1').par.radiusx.expr = 'absTime.seconds'
```

## モードを変更する
Expressionモードにするには、  

``` python
op('circle1').par.radiusx.mode = ParMode.EXPRESSION
```

Constantモードにするには、

``` python
op('circle1').par.radiusx.mode = ParMode.CONSTANT
```

## Connector Classの例1. OP同士をつなぐ
コネクタが一個しかないものは、

``` python
op('circle1').onputConnectors[0].connect(op('level1'))
```

コネクタが複数あるのものは、

``` python
op('circle1').onputConnectors[0].connect(op('comp1').inputConnectors[0])
```

ちなみにconnectメソッドはインプットコネクタからも叩けます。

``` python
op('level1').inputConnectors[0].connect(op('circle1').outputConnectors[0])
```

## COMP同士をつなぐ
基本OPのコネクタと一緒で、名称がinputCOMPConnector/outputCOMPConnectorになってるだけです。

``` python
op('button1').outputCOMPConnectors[0].connect(op('container1').inputConnectors[0])
```

## Inputの数を数える

``` python
len(op('circle1').inputConnectors)
len(op('button1').inputCOMPConnectors)
```

## コネクションを解除する

``` python
op('circle1').inputConnectors[0].disconnect()
op('button1').inputCOMPConnectors[0].disconnect()
```

## OPやCOMPの位置を移動する

``` python
op('circle1').nodeY = op('circle1').nodex + 10
op('button1').nodeY = op('button1').nodeY + 10
```
【JavaScript】特定のスクロール量を基準にする

##開始タグ
「スクロールしたらヘッダーをあれこれしたい」的なことは日々増えている気がするのでメモ。

##方法
例えば、
・スクロールしたらヘッダーの背景を白色にしたい
・ヘッダーの文字サイズを大きくしたい

みたいなCSSで解決できそうなものであれば
・特定のスクロール量を基準にクラス名をつけ外しさせる
方法で対処できます。

```javascript:common.js
$(window).on("load resize scroll", function() {
	var body = $("body");
	var browseWid = $(window).width(); //ブラウザの横幅取得
	var widPc = browseWid > breakpoint; //PC表示のとき
	var widSp = browseWid <= breakpoint; //SP表示のとき

	var amount = 250; //スクロール量（px）
	var scrollPoint = $(this).scrollTop(); //スクロールした量
	var scrollStartPc = "js-scroll_start_pc"; //PC用
	var scrollStartSp = "js-scroll_start_sp"; //スマホ用

	if (widPc) {
		body.removeClass(scrollStartSp);
		if (scrollPoint > amount) {
			body.addClass(scrollStartPc);
		} else if (scrollPoint == 0) {
			body.removeClass(scrollStartPc);
		}
	} else if (widSp) {
		body.removeClass(scrollStartPc);
		if (scrollPoint > amount) {
			body.addClass(scrollStartSp);
		} else if (scrollPoint == 0) {
			body.removeClass(scrollStartSp);
		}
	}
});
```

あとは、PCの場合なら「.js-scroll_start_pc」を頭に書いて、各CSSを書いてあげればOK。

##閉じタグ
もっといい方法はある気がするけど、現状はこの状態。
今後改善方法を発見し次第取り入れていきます。
Rails、Slimでflashメッセージがうまくだせない

Slimで新規登録に成功したらフラッシュメッセージを表示してindexに戻りたいのに次のように書いたらエラーが出る。

classを書かずにやると素テキストで成功メッセージが出るのでコントローラー側は大丈夫なはず。

```ruby:app/controllers/blogs_controller.rb
  def create
    @blog = Blog.create(blog_params)
    redirect_to blogs_path
    flash[:success] = 'add success'
  end
```

```ruby:index.html.slim
= flash[:success], class: 'alert alert-primary'
h1 Blog articles

= link_to '新規登録', new_blog_path, class: 'btn btn-primary'

- @blogs.each do |blog|
  br
  = blog.id
  br
  = blog.title
  br
  = blog.article

```

```ruby:error

syntax error, unexpected ':' ..._safe((flash[:success], class : 'alert alert-primary'))).to_... ... ^

```
---

いろいろぐぐり、試行錯誤した。
classの書き方が違っていた。
link_toのクラスの書き方が、「class: 'btn btn-primary'」だったから同じだと思っていたが違うみたい。

ネットでいろいろぐぐったけど、Slimでflashのclassの書き方の参考が見つけられなかった。
これでエラーが取れたけど、ずっとフラッシュの緑枠がある。

```ruby
  .alert.alert-success
    = flash[:success]

h1 Blog articles
```


勘違いしていた。if文を入れないと常にフラッシュが出てしまう。
flashでるときだけ値をコントローラーから勝手に渡してくれるような気がしていた。
if文を書く。
これでOK。


```ruby
- if flash[:success]
  .alert.alert-success
    = flash[:success]

h1 Blog articles
```


参考サイト
 [redirect\_to使った時にBootstrap対応のフラッシュメッセージを表示させる \- Qiita](https://qiita.com/Yama-to/items/4d19a714d8bf5bfbabdd)

 [railsでflashを使ってサクセス・エラーメッセージを表示する \- Qiita](https://qiita.com/you8/items/94057315e7334e4adc99)
AWS EC2インスタンスの作成手順

# はじめに
EC2インスタンスの作成手順をメモする
# EC2インスタンスの作成
- AWS マネジメントコンソールにログイン
- 下記画像のサービス→EC2をクリック
![スクリーンショット 2019-10-12 23.05.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/376f1cce-0020-bb71-b00c-d2d4c66cfdea.png)
- インスタンスの作成をクリック
<img width="972" alt="スクリーンショット 2019-10-12 23.10.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/5fb06b98-b4f8-3b92-5f95-97b4e25b97e5.png">
- AMIを選択
<img width="1257" alt="スクリーンショット 2019-10-12 23.12.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/9377a761-176d-1343-bcc8-5772d828727c.png">
Amazon Linux AMIを選択する
- タイプの選択
<img width="1279" alt="スクリーンショット 2019-10-12 23.15.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/a35eead6-66c0-3e24-66fa-c6702f496795.png">
図のように上から2つ目の無料枠を選択しておく。その後画像右下の【確認と作成】をクリック
- インスタンス作成の確認画面
    - ここでは右下にある【起動】をクリック。
- キーペアをダウンロードする
    - modalが表示されるので、【新しいキーペアの作成】を選択し、【キーペア名】を任意で入力後、キーペアのダウンロードを行う。
    - 【インスタンスの作成】をクリック
- インスタンス一覧からインスタンスを選択
    - インスタンスIDをメモ
# Elastic IPと紐付ける
-　下図の Elastic IPをクリック後、【新しいアドレスの割り当て】をクリック
<img width="214" alt="スクリーンショット 2019-10-12 23.28.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/61bc32d4-d3b8-50e8-1b37-15bf729a7ebc.png">
<img width="1237" alt="スクリーンショット 2019-10-12 23.29.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/97838713-a8fb-546a-545c-bc639ad7bcc7.png">
 - 　その後、割り当てをクリック
 - 　その後、閉じるをクリック
- 取得したElastic IPアドレスを紐づける
<img width="1237" alt="スクリーンショット 2019-10-12 23.29.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485253/1e42fe0e-ac91-fa58-0328-af564fd0f5b4.png">
上図の【アクション】から【アドレスの関連付け】を選択
- 【アドレスの関連付け】ページにあるインスタンスには先ほどメモしたIDを入力、【プライベートID】には入力しない、【関連付け】をクリック
- インスタンス画面からElastic IPが紐づけられたことを確認する

# ポートを開く
- インスタンス画面
    - セキュリティグループのリンクをクリック
    - 「インバウンド」タブの中の「編集」をクリック
    - 開かれたモーダルで、ルールの追加」をクリック、タイプを「HTTP」、プロトコルを「TCP」、ポート範囲を「80」、送信元を「カスタム / 0.0.0.0/0, ::/0」に設定

# EC2インスタンスへのログイン
```
$ cd ~

$ mv Downloads/鍵の名前.pem .ssh/

$ cd .ssh/

$ chmod 600 鍵の名前.pem

$ ssh -i 鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
```
【SFDX】Org Browserを使ってみる

## Org Browser is 何
VSCodeのSF拡張の機能の一つ。
接続組織のMetadataを一覧で見れて、Retrieveも出来るっぽい
https://developer.salesforce.com/tools/vscode/articles/user-guide/org-browser

## 組織Metadata情報を一覧化する
1. 「SFDX: Create Project with Manifest」で新規プロジェクト作成する
![スクリーンショット 2019-10-12 23.19.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186422/0b5e2ec8-476d-01aa-2ed1-20c2e073909b.png)
2. デフォルト組織に接続する（初めての場合は作成も）
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186422/c5fa89e2-1359-298c-d72c-a003d4c261d3.png)
3. 接続すると、メニューアイコンに雲マークが追加されるのでクリック
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186422/1cde1b2d-ffd0-0d6d-2e99-45049d9253a5.png)
4. Metadataが一覧で表示される
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186422/245f5ef5-3eea-aa41-af43-18b2e4cd97b5.png)
5. カスタムオブジェクトを取得してみる
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186422/df125388-3b0d-db18-ccee-2c7449f51709.png)
6. 実際にこんな感じで取得できてる
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186422/f9807f75-7a56-2e24-53d1-57496cd32b6d.png)
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186422/99cfee80-876b-ff5f-7a98-f901726afe1d.png)
「Linker command failed with exit code 1」のデバッグ方法【Xcode】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# 前提
- Mac: Version 10.14.6
- Xcode：Version 11.1

# バグ内容
`Linker command failed with exit code 1 (use -v to see invocation)`
（`Duplicate Symbols for Architecture arm64`というバグの時も同様のデバッグ方法で直ります。）

# デバッグ方法
色々なパターンがあると思いますが、`Build Settings`の`No Common Blocks`と`Enable Testability`を**【Yes => No】**にすることで直りました。

<img width="700" alt="noCommonBlocks.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240280/9d406d78-68df-d245-5680-ccc6bb5a4f00.png">


# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)