OmniAICreator/Qiita-1.07M huggingface dataset:
型について

たまに苦しむ型について改めて調べてみました。

## JavaScriptの基本的な型
|型名|例|判定で表示される値|
|---|---|---|
|Null型|null|object|
|Undefined型|null|undefined|
|他のオブジェクト|{a: 1}|object|
|数値型|1|number|
|文字列型|abc|string|
|真偽値型|true / false|boolean|
|関数|function() {}|function|

## 型を判定する typeofの使い方

```js
typeof "123" // "string"
typeof 123 // "number"
typeof {} // "object"
```
やってみた
<img width="497" alt="スクリーンショット 2020-01-26 12.50.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/6a390fdb-6974-0619-4599-dbc9adf65e52.png">

## new String　と　new Number()
**new String**と**new Number**いう書き方もあります

```js
const testStr = new String('test')
const testNum = new Number(1)
```
一見、string型とNumber型を作っている感じですが、違います.

<img width="491" alt="スクリーンショット 2020-01-26 13.10.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/a6c0b1f5-947c-b34a-0459-eec95c7787d9.png">








他にも多くに型がありますが、よく使うもの書いてみました。
みてわかるように**object型**はなんでもありな感じなので、型定義をるする時はなるべく使わない方がよいです。





参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date
#Ruby #AWS S3 / upload not UTF-8 ( e.g SJIS ) file / publish presigned url / directly open download file from browser / as text/csv



```rb
tempfile = Tempfile.new

csv_string = 'あ,い,う'
File.write(tempfile.path, csv_string, encoding: Encoding::SJIS)

s3_object.upload_file(tempfile.path)
s3_object.upload_file(
             tempfile.path,
               content_disposition: 'attachment; filename="example.csv"',
               content_type: 'text/csv'
           )

tempfile.close
tempfile.unlink

s3_object.presigned_url(:get, expires_in: 60 * 60)

```


![image](https://user-images.githubusercontent.com/13635059/73115067-ae31cc00-3f64-11ea-876d-5b33521d28d3.png)


ref

Class: Aws::S3::Client — AWS SDK for Ruby V2
https://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
js 値の操作_1

#引数の初期値設定
```js
function myfunc(price, tax = 0.1){
  const result = price + price * tax;
  return result;
}
myfunc(10); //11
myfunc(10, 0.08); //10.8
```

#複数の引数を渡す
```js
function myfunc(...numbers){
  let result = 0;
  for(const number of numbers){
    result += number;
  }
  return result;
}
```

#反復処理のスキップ
```js
//奇数だけ表示
for(let i = 0; i <10; i++){
  if(i % 2 === 0){
    continue;
  }
  console.log(i);
}
```

#文字列のトリミング
```js
const string1 = ' hello ';
string.trim(); //hello
```

#文字列の操作
```js
//文字列の検索
const mystring = 'javascript';
const string1 = mystring.indexOf('script'); //4
const string2 = mystring.indexOf('java'); //0
const string3 = mystring.lastIndex('a'); //3
const string4 = mystring.indexOf('html'); //-1
const string5 = mystging.search('script') //4

mystring.includes('script'); //true
mystring.startsWith('java'); //true
mystring.endsWith('script'); //true

//文字列を取り出す
mystring.slice(0,4); //java
mystring.slice(0); //javascript

mystring.substr(4,6); //script

//文字列の置き換え
const imageName = 'image1.png';
imageName.replace('1.png','2.png'); //images2.png

let phoneNumber = '080-1234-5678';
phoneNumber.replace('-', '');//0801234-5678
phoneNumber.replace(/-/g, '');//08012345678

```
Q18.テキストファイルを作成するには？

VBAではテキストファイルを作成することができます。
今回は日付.txtという日次で使えるようなファイルを複数日文出力するマクロを
作っていきましょう。


例えば、今日が20200126だとしたら、3週間分の20200215までのファイルを作成します。
20200126.txt ～ 20200215.txtというファイルです。


###■ポイント
ファイルを作成するには、
Open ファイル名(フルパス) For Output As #番号もしくは、Open ファイル名(フルパス) For Append As #番号
とします。番号は1から割り当ててください。
これは、ファイルを作成するというよりは、対象のファイルを開く(選択する)という意味合いになりますが、対象のファイルが存在しない場合は、新規で作成されます。

今回はこれを利用してファイルを作成していきます。

OutputとAppendの違いは、既存のファイルがあった場合の動作が異なります。
Outputの場合は新規のファイルで上書きされてしまいます。
Appendの場合は、追記で書き込むことができます。

例えば、マクロを利用して、日付ファイルを生成しました。
日付ファイルに内容を書き込みました。
また、同じようにマクロを動かしました。

この時、Outputで作成した場合は、同名ファイルがあった場合、
上書きされてしまいますので、元のファイルの内容があった場合、消失してしまいます。
appendで作成した場合は、追記されますので、元のファイルの内容は残されたままとなります。

ということで、今回はappenndを利用した方がいいでしょう。


###■回答
```VB
Sub Q18_Answer()
    Dim buf As String, cnt As Long, Path As String, i As Integer
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            Path = .SelectedItems(1)
        End If
    End With
    For i = 0 To 20
        Open Path & "\" & Format(Date + i, "yyyymmdd") & ".txt" For Append As #1
        Close #1
    Next i
End Sub
```

###■解説
今回は、出力先をダイアログから指定できるようにしました。
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            Path = .SelectedItems(1)
        End If
    End With

この記述で、フォルダを選択し、選択されたフォルダのパスが変数Pathに格納できます。

あとは、Forループで、テキストファイルを作成処理を複数回実行するだけです。
具体的には、以下の記述でファイルを作成しています。
Open Path & "\" & Format(Date + i, "yyyymmdd") & ".txt" For Append As #1


実行結果は以下のとおりです。

![Q18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/889a0a56-df1e-369b-4b12-ccf53b973036.png)

実行すると、フォルダ選択ダイアログが出力されますので、今回はデスクトップ配下に作成した新しいフォルダーを選択しています。

OKボタンを押すと、以下のように無事ファイルが生成されました。

![Q18-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/84ff55c6-891c-0614-588b-fa05e93098a2.png)


ただし、フォルダ選択ダイアログで、キャンセルを選択するとパスがないので、
エラーとなってしまいます。そこは別途エラー処理を記述するなど、対処が必要となります。
XMLファイルをsatyファイルに変換するソフトウェアを作りました


# はじめに

XMLファイルをSATySFiのsatyファイルに変換するソフトウェアを作成しました。

名前はやや安直で、"xml2saty"です。リポジトリは[https://github.com/puripuri2100/xml2saty](https://github.com/puripuri2100/xml2saty)です。

# インストール

- OPAMをインストールします

```
sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)
```

で入ります。

- OCamlをインストールします

```
opam init --comp 4.06.0

eval $(opam env)
```

などとすると良いでしょう（Ubuntu on WSLをを使っている人は`opam init`の際に`--disable-sandboxing`というオプションをつけてください）。
バージョンは古すぎなければ大体のもので動くと思われます。

- 依存ライブラリをインストールする

```
opam install xml-light
opam install menhir
```

でインストールできます。既に入っている場合はしなくて大丈夫です。

- リポジトリをクローンしてビルドする

```
git clone https://github.com/puripuri2100/xml2saty.git
cd xml2saty
make build
```

でビルドができ、フォルダに`xml2saty`という名前の実行ファイルができます。

後は適当にフォルダに移動させるなりしてパスを適切に設定してください。

# 使い方

- `-f`もしくは`--file`オプションでXMLファイルを渡すことができます。このオプションは省略することができます。
- `-o`または`--output`オプションで出力ファイル名を指定できます。無い場合は入力のファイル名を流用します。オプションそのものを省略するとXMLファイルの名前から自動的にファイルが作成されます。
- `-c`または`--config`で設定ファイルを渡すことができます。オプションそのものを省略するとXMLファイルの名前から自動的に設定ファイルが探されます。
- `-t`または`--text`で直接XML文字列を渡すことができます。このとき、`-o`・`--output`・`-c`・`--config`オプションは省略できません。

起動は

```
xml2saty -f 〈XMLファイル〉 -o 〈satyファイル〉 -c 〈設定ファイル〉
```

です。

## 入力するXMLファイルについて

xml-lightパッケージが処理できる正しいXMLファイルである必要があります。
また、要素の名前などについてはASCII文字以外である場合の動作については保証できません。
ファイル名を渡すときに拡張子は省略できません。

## 出力ファイルについて

`-o`や`--output`オプションに渡すファイル名では拡張子を省略できません。

## 設定ファイルについて

設定ファイルの拡張子は`.x2s-config`で、文法はオリジナルのものです。

```
require:[stdja; list]
```

のように

```
〈設定タグ〉: [〈リスト〉]
```

と記述します。リストの区切りはセミコロンです。
設定タグは

- `require`：`@require:`の後に記述されるパッケージ名（パス）をリストの形で書きます。
- `import`：`@import:`の後に記述されるパッケージの相対パスをリストの形で書きます。
- `attrib`：要素の属性の変換方法ついて指定をします。これだけは

```
〈要素名〉(〈要素の中身の型（省略可）〉)[
〈(〈属性名〉,〈子要素の型〉,〈その属性がコマンドの何番目の引数か〉)のリスト〉
]
```
のリストになります。ややこしいですが、例えば

```
attrib :
  [
    Paragraph (block-text)[
      (Hide, bool, 2);
      (Num, int, 1)
    ];
    ParagraphNum(inline-text)[];
    ParagraphCaption(inline-text)[];
    ParagraphSentence(inline-text)[];
    Sentence (inline-text) [
      (WritingMode, string, 1);
    ];
  ]
```

みたいな感じです。
このとき、属性のリストに含まれなかった属性は無視されます。

これらを与えることで出力されるファイルの中身を制御できるようになります。


使える型名は現在のところ

- `string`
- `int`
- `bool`
- `float`
- `length`
- `inline-text`
- `block-text`
- `funciton`

です。`function`を選択すると、要素の中にある子要素が全て関数扱いになり、先頭が小文字になります。
`inline-text`は先頭に`\`が付き、`block-text`は`+`が付きます。

子要素が続く場合は基本的に`inline-text`か`block-text`を指定しますが、文字列しかこないとわかっている場合は`string`や`int`などを指定することもあるでしょう。

上に挙げたSATySFiの型名と`require`と`import`と`attrib`は要素名やパッケージ名で指定できません。エラーになります。
ただし、パッケージ名の時はパスの形にしておけばエラーはでません。
たとえば、`require:[int]`はエラーになりますが、`require:[satysfi-base/int]`はエラーになりません。

# 使用例

リポジトリにexampleフォルダの中にe-Gov法令検索からダウンロードできる元号法と刑法のXMLファイルが置いてあります。

```
make example
```

でsatyファイルを作成することができます。

付属の`local.satyh`にコマンドの定義が書いてあるのでそれを使って

```
satysfi example/keihou.saty -o example/keihou.pdf
```
のようにしてコンパイルすることができます。

また、これを応用することによりHTMLファイルをsatyファイルに変換することも可能なはずです。

# おわりに

XMLファイルをsatyファイルに変換できるようになったことでSATySFi導入の敷居が下がると嬉しいです。
Angular９とFirebaseでブログを作ってみる６（ngx-markdownでブログ内容をリッチに表示できるようにする）

[前回](https://qiita.com/teracy55/items/517b2e88b4850312e8f6)、ブログの内容をFirestoreから取得できるようにしました。

今回は表示をリッチにしてみようかと思います。

# 方針

後々、ブログはQiitaのようにマークダウンでかけるようにしたいなーと思ってるので、まずは表示をマークダウンに対応させたいと思います。

[ngx-markdown](https://www.npmjs.com/package/ngx-markdown)を使います。


# インストール

```
npm install ngx-markdown --save
```

## angular.jsonの修正

- `marked.js`のパスを指定します
- ハイライト表示ができるようにprism.js/cssのパスも設定しておきます

```angular.json
{
  ・・・
  "projects": {
    "my-blog": {
      ・・・
      "architect": {
        "build": {
          ・・・
          "options": {
            ・・・
            "styles": [
              "node_modules/prismjs/themes/prism-okaidia.css",
              ・・・
            ],
            "scripts": [
              "node_modules/marked/lib/marked.js",
              "node_modules/prismjs/prism.js"
            ]
```

## MarkdownModuleのインポート

```src/app/app.module.ts
・・・
import { MarkdownModule } from 'ngx-markdown';

@NgModule({
  ・・・
  imports: [
    ・・・
    MarkdownModule.forRoot(),
```


# マークダウン形式の文字列を出力

- 表示するだけであれば`markDown`ディレクティブを指定します
    - `ngPreserveWhitespaces`で改行を有効にします

```src/app/blogs/detail/detail.component.html
<div *ngIf="detail" class="blog-detail">
    <div class="title-area">
        <h1>{{detail.title}}</h1>
        <span class="date">作成日：{{detail.created_at | date: 'yyyy/MM/dd HH:mm'}}</span>
    </div>
    <div class="contents-area">
        <div markdown ngPreserveWhitespaces>
            {{contents}}
        </div>    
    </div>
</div>
```

- コンポーネント側で`\n`と`<br>`を改行コードに変換するようにします

```src/app/blogs/detail/detail.component.ts
  get contents() {
    return this.detail.contents.replace(/(\\n|\<br>)/g, '\n');
  }
```

# Firestoreにデータを登録

- Firestoreには改行が登録できないので`\n`で登録します
    - Angular側で`\n`と`<br>`を改行コードに変換してます

```
# マークダウンに対応しました\n\n## リスト\n\n- リスト１\n- リスト２\n\n## テーブル\n\n|列１|列２|\n|---|---|\n|値１|値２|\n\n## コード\n\n```test.txt\nコード\n```\n\n## 引用\n\n> test\n\n
```



# こんな感じになりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/e0091d49-7ed5-ab80-2584-2965b7db00ef.png)


# まとめ

次回はレスポンシブ対応して、いろんな画面幅で良い感じに見えるようにしたいと思います。

（追記）
[Angular９とFirebaseでブログを作ってみる７（Qiitaの投稿履歴を表示する）](https://qiita.com/teracy55/items/9b6ed3b557a412549d20)
Google Classroom シェアボタンの設置方法

# 背景

2019年1月現在、[GIGAスクール](https://www.mext.go.jp/a_menu/other/index_00001.htm)で子どもたちに配布されるPCは1台4.5万円と言われています。そうなると、アメリカのようにChroombookの[シェアがかなり占める](https://biz-journal.jp/2019/09/post_120336_2.html)ようになるのは必然。それにあわせてGoogle Classroomの利用率も上がりそうなのですが、日本語のコンテンツが皆無。今頃、Googleさん協力の元、教材メーカーさんたちは必死にコンテンツを作っている頃なのかもしれませんが...

# 既存コンテンツを Google Classroom 対応に

[Google Classroom API](https://developers.google.com/classroom?hl=ja)を使って、ガリガリ作るのも楽しそうですが、まずはGoogle Classroom用シェアボタン

![classroom_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44523/49c6e935-74d3-7410-c4b3-2b763c81f145.png)

を既存コンテンツに設置するだけでも、先生側の使い勝手が良くなります。

```
<script src="https://apis.google.com/js/platform.js" async defer></script>
<g:sharetoclassroom url="http://url-to-share" size="32"></g:sharetoclassroom>
```

単に http://url-to-share の所にコンテンツのURLを記載するだけなのですが、先生はワンクリックで Google Classroomの特定の教室にサクッと取り込んで生徒に配布する事が出来るようになります。

# 参考

https://developers.google.com/classroom/guides/sharebutton?hl=ja
#Ruby - Tempfile write rewind close unlink – lifecycle

```rb
tempfile = Tempfile.new
# => #<File:/var/folders/nt/brt3bhdn50v57vqgz5t6xqc40000gn/T/20200125-67882-1mn35v6>

tempfile.write('ABC')
# => 3

tempfile.read
# => ""

File.read(tempfile.path)
# => "ABC"

tempfile.rewind
# => 0

tempfile.read
# => "ABC"

tempfile.close
# => nil

File.read(tempfile.path)
# => "ABC"

tempfile.read
# IOError: closed stream
# from /Users/yumainaura/.rbenv/versions/2.5.3/lib/ruby/2.5.0/delegate.rb:349:in `read'

tempfile.unlink
# => true

File.read(tempfile.path)
# TypeError: no implicit conversion of nil into String

```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Invariant Violation: query option is required. You must specify your GraphQL document in the query option.

import で名前を間違えて `undefined` を弾き返されると...

```js
import { 間違った名前 } from './queries.js'

result = await apolloClient.query({
  query: 間違った名前,  // <--- undefined
  variables: payload
})
```

以下のようなエラーを返されます。

```
Invariant Violation: query option is required.
You must specify your GraphQL document in the query option.
```
Dockerで作成したNetwork Namespaceへアタッチする方法

Dockerのネットワーク周りのトラシューをする時、
docker execでコンテナ内に入ってしまうとデバッグ用のコマンドが使えないことがあって不便なものです。

そんな時はNetwork Namespaceを切り替えることで、ホスト側のコマンド全て使える状態で対象のDockerコンテナのネットワーク環境で作業できて便利です。以下にその方法を記します。

Dockerのデフォルト・ネットワーク（bridge）では、コンテナを作成するたびにNetwork Namespaceが作成されます。
Network Namespaceの一覧は以下コマンドで取得できます。

```
$ sudo ip netns ls
```

このコマンドで対象のNamespaceを確認して、切り替えて...
と行きたいところですが、もう1ステップ必要です。

ip netns は/var/run/netns 配下のファイルを一覧表示する実装になっていますが、
Docker経由でNetwork Namespaceを作成した場合はこのディレクトリ配下にファイルが作成されません（というかこのディレクトリ自体作られません）。
そのためまず以下手順を実行する必要があります。

```
$ sudo mkdir /var/run/netns
$ pid=$(docker inspect $CONTAINER_ID --format '{{.State.Pid}}’)
$ sudo ln -s /proc/${pid}/ns/net /var/run/netns/[任意のファイル名]
```

以下、実際の利用例になります。

```
[ec2-user@dockerHost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
71de02f377ed        busybox             "sh"                45 minutes ago      Up 45 minutes                           c1
[ec2-user@dockerHost ~]$ ip netns list
[ec2-user@dockerHost ~]$ 
[ec2-user@dockerHost ~]$ CONTAINER_ID=71de02f377ed
[ec2-user@dockerHost ~]$ pid=$(docker inspect ${CONTAINER_ID} --format '{{.State.Pid}}')
[ec2-user@dockerHost ~]$ sudo mkdir /var/run/netns
[ec2-user@dockerHost ~]$ sudo ln -s /proc/${pid}/ns/net /var/run/netns/tmp-container-ns
[ec2-user@dockerHost ~]$ sudo ip netns ls
tmp-container-ns (id: 0)
[ec2-user@dockerHost ~]$ sudo ip netns exec tmp-container-ns bash
[root@dockerHost ec2-user]# 
```
[swift]CocoaPodsがビルドできないと思ったら開く場所の問題だった

##環境
xcode Version 11.3 
iTerm2
MacBookAir 
macos Mojave バージョン10.14.6

##背景
xcodeを使用して完全初心者独学でswiftのアプリケーションを作成しています。
今回何が起こったかというと、CocoaPodsをインストールしてアプリを作りたかったわけです。
参考書によるとinstallが終わった後のページを開くとこんな感じでファイルが２つになるらしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/8f811839-2575-485f-e45a-cf6431666227.png)

けれど、自分の奴はちゃんとディレクトリにpodsファイルがあるのにxcodeで立ち上げると
podsファイルが出てこない。（つまりinstallはできているのにビルドされてない？）
[ディレクトリにはある]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/5a223b20-8271-77be-c92e-823ee25d594a.png)
[出てこなーい]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/b4b0e2fb-b22b-e8d5-bdd9-fc9d8aad4e0d.png)

##解決方法
白い方を開く（拡張子は”ファイル名.xcworkspace”）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/ded1bbcc-72e1-c221-9455-41059400d237.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/7db6a8a3-b0fa-ee69-92e0-729cbb8b36a9.png)
\ 出たー/

参照ページ
[猿でも解るCocoaPodsの使い方！movajeでインストールできない場合の原因や対処方法も！](https://blog.guttyo.jp/apple/ios-app/ios-app-dev/3990/#xcworkspace)

他のページでも白いほうとは書かれていたのですが「白い方ってどこにあるの？」の状態でここに行き着くまで時間かかりました。
よく見ればxcodeからも開けました（落ち着くの大事）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/8493ed5d-5d46-7e88-dd2a-046057b5e0b3.png)
知識があればなんでもないことが初心者はびっくりするほどつまづくものですね。
インストールで詰まった部分は別途記事書くことにします。

**アプリ完成目標日まで後３５日！**
#Ruby で SJIS のCSVファイルを書き込む、読み込む

encodingフラグを使って色々とやる
stringに対しての直接のencodeは必要なさそう

```rb
File.write('tmp/sjis.csv', "あ,い,う\nえ,お,か", encoding: Encoding::SJIS)
#  => 17

File.read('tmp/sjis.csv', encoding: Encoding::SJIS)
# => "あ,い,う\nえ,お,か"

CSV.read('tmp/sjis.csv', encoding: Encoding::SJIS)
# => [["あ", "い", "う"], ["え", "お", "か"]]


CSV.open('tmp/sjis2.csv', 'w', encoding: Encoding::SJIS) do |row|
  row << ['か', 'き', 'く']
  row << ['け', 'こ', 'さ']
end
# => <#CSV io_type:File io_path:"tmp/sjis2.csv" encoding:UTF-8 lineno:2 col_sep:"," row_sep:"\n" quote_char:"\"">

File.read('tmp/sjis2.csv', encoding: Encoding::SJIS)
# => "か,き,く\nけ,こ,さ\n"

CSV.read('tmp/sjis2.csv', encoding: Encoding::SJIS)
# => [["か", "き", "く"], ["け", "こ", "さ"]]

```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
🔰ねぇパパ、どうしてインフラ冗長化とアプリ冗長化は両方やらなきゃならないの？

聞かれたので...こどもにもわかるように答えるよ😘✨

「アプリケーション」つまりサービスとして提供しているのが、たとえば「クラスの担任」だったとすると...
![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/22c7a298-77f1-29c0-897a-99feb20f44ed.jpeg)

「**アプリケーション冗長化**」はクラスの担任を2名にして、担任の先生が休みの時はもうひとりの先生がクラスを受け持つ仕組み。
![kyoushi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/f92223f1-ae28-a469-2697-0fe75b545878.jpeg)

そして、「**インフラ冗長化**」は、先生自身のからだの冗長化。人間には目が2つ、鼻の穴が2つ、耳が2つ、肺が2つ、腎臓が2つ、手が2つ、足が2つあります。仮にどちらかが機能しなくなっても、もうひとつが働けば、先生としての機能は維持できます。ですので、先生は担任としてなるべく長く働けるようになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/0ffac267-6362-571b-adcb-1a03edfac716.png)


...という2段階の冗長化。冗長化をしているレベルが違うもので、どちらか一方だけで良いことはなく、両方とも必要だよね😘✨
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/036aa173-1cde-828a-61bd-c555ac161b77.png)
ES6構文をRailsでプリコンパイル

AWSにRailsアプリをデプロイしようとした時、、、

諸々設定も終盤、EC2へSSHでログインし、Railsアプリをプリコンパイルする

<img width="918" alt="スクリーンショット 2020-01-26 10.46.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425644/1a4ec3ba-2532-c20f-f39a-0ff6774659d4.png">

はい、怒られました。

原因は

```
Uglifier::Error: Unexpected token: punc ()). To use ES6 syntax, harmony mode must be enabled with Uglifier.new(:harmony => true).
```

この部分に書いてありますね。
google翻訳先生に聞くと、

>「Uglifier :: Error：予期しないトークン：punc（））。 ES6構文を使用するには、ハーモニーモードを>Uglifier.new（：harmony => true）で有効にする必要があります。」

なるほど、、、

と言うわけで、

<img width="1440" alt="スクリーンショット 2020-01-26 10.48.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425644/b487435f-7d43-5987-2537-0d2a44fb3699.png">

```ruby:config/environments/production.rb
config.assets.js_compressor = :uglifier
```

これを、、、

<img width="1440" alt="スクリーンショット 2020-01-26 10.49.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425644/258fc557-c4be-314e-dc13-891cbf2c09aa.png">

```ruby:config/environments/production.rb
 config.assets.js_compressor = Uglifier.new(harmony: true)
```

こう！

お疲れ様でした。
($a == 1 && $a == 2 && $a == 3) を常に真にできますか？

[(a == 1 && a == 2 && a == 3) を常に真にできますか？ その3](https://qiita.com/ryuta69/items/ed1e4a0362c8c6e40b57) を `($a == 1 && $a == 2 && $a == 3) を見て常に真にできますか？ その3` に空目して tie だろうな、と思ったら違っていたので tie の思い出しも含めて書いてみた。

コードはこちら。
追加したのは、 `package AAA` の部分と `tie $a, 'AAA';` の部分です。

```perl
use strict;
use warnings;

tie $a, 'AAA';
print "True!" if ($a == 1 and $a == 2 and $a == 3);


package AAA;
use strict;
use warnings;
require Tie::Scalar;
my @ISA = qw(Tie::Scalar);

sub TIESCALAR {
    my $class = shift;
    my $instance = @_ ? shift : undef;
    return bless \$instance => $class;
}

sub FETCH {
    ${$_[0]}++;      # 読みだし時に ++ する
    return ${$_[0]};
}

sub STORE {
    ${$_[0]} = $_[1];
}

sub DESTROY {
    undef ${$_[0]};
}
```

結果は `True!` と表示されます。

## tie とは何か？

以下にはオブジェクトクラスを単純な変数に隠す方法とあります。
上の例では、 FETCH (読み込み) 時に追加の処理を設定しました。
読み込み時に常にディスクから再読み込みするとかそういう用途に使うことができます。

詳しくは以下を読むと良いと思います。

https://perldoc.jp/docs/perl/5.26.1/perltie.pod
https://metacpan.org/pod/perltie
【備忘録】Office365の各グループの機能まとめ　その１

こちらの投稿は、移転しました。
移転先は、こちら
https://www.peridot-green.com/2020/12/office365.html

---

管理者側の視点だと、別の観点で使い分けが必要になってくる。
[【備忘録】Office365の各グループの機能まとめ　その2　](https://qiita.com/hisssa0102/items/4124f9d02adb10fea7ef)でまとめてみました。
GCPコマンドメモ

自分が良く使うGCPの設定やコマンドのメモ。

## SSH

### 準備

```bash
$ gcloud services list --filter=NAME:iap
$ gcloud services enable iap.googleapis.com
$ gcloud compute firewall-rules create allow-iap-forwarding-ssh \
  --network=iap-test \
  --allow=tcp:22 \
  --source-ranges=35.235.240.0/20
```

### 接続

```bash
$ gcloud compute ssh app --tunnel-through-iap --zone=us-west1-b --project dev-std-xxxxxxx
```

### ref:

- https://cloud.google.com/iap/docs/using-tcp-forwarding?hl=ja
- https://www.apps-gcp.com/gce-casual-knowhow-03/#Cloud_IAP


## Cloud Build

### Buildコマンド

```bash
$ gcloud builds submit --config cloudbuild.yaml .
```

### サンプル - cloudbuild.yaml: Java/Docker Build & Push

```yaml
steps:
    - name: 'gcr.io/cloud-builders/mvn'
      args: ['clean', 'package']
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'gcr.io/$PROJECT_ID/rcisucon-app', '-f', './src/main/docker/Dockerfile.jvm', '.']
      timeout: 500s
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'gcr.io/$PROJECT_ID/rcisucon-app']
```
わかりそうでわからない気もするunknown

TypeScriptには、`unknown`という型があります。どのような型なのか見ていきましょう。

## `unknown`型の変数

`let foo: unknown;`という変数を宣言したとします。すると、この変数には、`3`だろうが`'text'`だろうが`document`だろうが`() => {}`だろうが、TypeScript上にあるどのような型の値でも代入することができます。

ただ、昔から`any`という、TypeScriptの型をオフにするような仕組みがあって、`any`型の変数でも同様なことができました。では、`any`と`unknown`の違いは何でしょうか。

## `unknown`の値を使う

`any`の場合は、値を取り出すときも何のチェックもかからないのですが、`unknown`の場合は、そのまま使おうとすると「どの型にもできる操作（`!`で論理否定を取る、文字列と連結するなど[^num]）」あるいは「`unknown`型の引数を取る関数に渡す」ことしかできません。

ただ、Type Guardは`unknown`型の変数に対しても効きますので、型ごとに区分して処理をすることも可能です。

```typescript
function example(value: unknown): void {
  if(typeof value === 'number') {
    // この中では`value`は`number`として扱える
  }
}
```

わかりやすく言えば、`unknown`は`string | number | boolean | symbol | null | ...`というような、「TypeScriptにあるありとあらゆる型の`union`」として働きます。

## トップ型としての`unknown`

つまり、`T extends unknown`のようにすれば、TypeScriptの任意の型がこの`T`に当てはまる、ということになります。このような、「あらゆる型の基底となる型」のことを、型理論で**トップ型**といいます。

トップ型としての`unknown`を使える場面として、関数の返り値があります。`T extends () => unknown`としておくと、`() => unknown`は「引数を取らず、何かしらの値を返す（かもしれない[^never]）関数」という意味になって、それから派生する`T`は、「引数を取らない、ある返り値の型を持った関数」を指せることになります。

かつては`T extends () => any`で書くしかなかったのですが、`unknown`ができたことで`any`を使わなくてよくなっています。

（なお、トップ型の対義語として「ボトム型」もあって、TypeScriptでは`never`として存在するのですが、その話は後日といたします）

[^num]: どういうわけか、`foo - 0`のような数値演算はできません。
[^never]: 明確な返り値のない`void`や、制御を返さない`never`も、`unknown`がカバーする範囲内です。
存在しないファイルを!includeすると、同一ディレクトリ内の全てのワークフローがrunできなくなる

# 概要
Digdagでは他のファイルを読み込むときに!include機能を使うことが出来ます。
!includeで存在しないファイルを読み込もうとすると、そのワークフローだけでなく、同一ディレクトリのすべてのワークフローのdigdag runが失敗します。

↓検証した環境

```
$  digdag --version
0.9.41

$ java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
```

# 再現手順
### 存在しないファイルを!includeするワークフローを用意
```sh
$ cat fail.dig
!include : not_exists.dig # 存在しないファイル

$ digdag run fail.dig
2020-01-26 10:20:34 +0900: Digdag v0.9.41
error: /Users/takehiro.shiozaki/work/digdag_test/not_exists.dig (no such file)
```

このワークフローが失敗するのは当たり前なので、問題ありません。

### 同じディレクトリに正常実行するはずのワークフローを用意

```sh
$ ls .
fail.dig           should_success.dig

$ cat should_success.dig
+success:
  sh>: echo success

$ digdag run should_success.dig
2020-01-26 10:26:39 +0900: Digdag v0.9.41
error: /Users/takehiro.shiozaki/work/digdag_test/not_exists.dig (no such file)
```
同じディレクトリに存在するワークフローまで巻き添えを喰らって落ちる。

# 対策
`error: XXXXXXXX.dig (no such file)` というエラーが出た場合は、同じディレクトリにある他ファイルの!includeも疑う。
#Ruby – UTF8 SJIS でのファイル書き込み、読み込みの挙動を試す

```rb

# -----------------------------------------------------------
# String のエンコード
# -----------------------------------------------------------

# 日本語を文字列としてエンコードした結果
'あ'.encode(Encoding::SJIS)
# => "\x{82A0}"

# String的にUTf_8にエンコードし直すと、UTf_8に戻る
"あ".encode(Encoding::SJIS).encode(Encoding::UTF_8)
# => "あ"

# -----------------------------------------------------------
# A. UTF8の文字列を UTF_8指定で ファイルに書き込む
# -----------------------------------------------------------
File.write('tmp/utf8.txt', 'あ', encoding: Encoding::UTF_8)
# => 3

# 当たり前だがUTF_8で読める
File.read('tmp/utf8.txt', encoding: Encoding::UTF_8)
# => "あ"

# SJIS では読めない
File.read('tmp/utf8.txt', encoding: Encoding::SJIS)
# Encoding::InvalidByteSequenceError: incomplete "\x82" on Windows-31J

# -----------------------------------------------------------
# B. SJIS にエンコードした文字列を UTF_8指定で ファイルに書き込む
# -----------------------------------------------------------
File.write('tmp/sjis_string.txt', 'あ'.encode(Encoding::SJIS), encoding: Encoding::UTF_8)
# => 3

# なぜかUTF_8で読める
File.read('tmp/sjis_string.txt', encoding: Encoding::UTF_8)
# => "あ"

# SJIS では読めない
File.read('tmp/sjis_string.txt', encoding: Encoding::SJIS)
# Encoding::InvalidByteSequenceError: incomplete "\x82" on Windows-31J

# 文字列のStringでんエンコードは無視されて、Aパターンと全く同じ挙動になっているような気がした
# File.write がエンコード関係をすべてうまくハンドリングしてくれているのかもしれない

# -----------------------------------------------------------
# UTF_8の文字列を SJIS指定でファイルに書き込む
# -----------------------------------------------------------
File.write('tmp/sjis_encoding.txt', 'あ', encoding: Encoding::SJIS)
# => 2

# UTF8で読むとこのような文字列が返る
File.read('tmp/sjis_encoding.txt', encoding: Encoding::UTF_8)
# => "\x82\xA0"

# 文字列自体をUTF_8エンコードしても何も変わらない
# 何か自分がエンコードやデコードの関係を根本的に理解していない気はする
File.read('tmp/sjis_encoding.txt', encoding: Encoding::UTF_8).encode(Encoding::UTF_8)
# => "\x82\xA0"

# SJIS指定をしてファイルを読んだ時にUTF_8の文字列が返る
File.read('tmp/sjis_encoding.txt', encoding: Encoding::SJIS)
# => "あ"



```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
xysfdx+dockerでSalesforce開発環境構築

# xysfdx+dockerでSalesforce開発環境構築

## 必要なものをインストールする

- vscode
- docker
- [xysfdx](https://marketplace.visualstudio.com/items?itemName=ExiaHuang.xysfdx)

xysfdxでdocker images と　docker containerが作成できるから、手動でコマンドの発行が不要。 デフォルトショットキー：`ctrl+shift+j`


## pull images

pull images : `docker: pull image exiasfdc/sfdx`

![xysfdx-docker-image](https://raw.githubusercontent.com/exiahuang/xycode-doc/gh-pages/images/xysfdx-docker-image.gif)

## create container

create container : `docker: create sfdx container`

![xysfdx-docker-container](https://raw.githubusercontent.com/exiahuang/xycode-doc/gh-pages/images/xysfdx-docker-container.gif)

## use docker shell

use docker shell : `docker: attach docker shell`

![xysfdx-docker-bash](https://raw.githubusercontent.com/exiahuang/xycode-doc/gh-pages/images/xysfdx-docker-bash.gif)

おめでとうございます、 `xysfdx`のSfdx Docker開発環境構築完了しました。


## 注意点

- 現時点で `force:auth:web:login` or `force:auth:web:login:setdefaultusername`がwindowsのdocker環境で使えませんから、`xy:auth:username:login` を使って認証してください。
- `xy:auth:username:login`は[exiahuang/sfdx-xy-plugin](https://github.com/exiahuang/sfdx-xy-plugin)プロジェクトのコマンドです、すでにdocker image [exiasfdc/sfdx](https://hub.docker.com/r/exiasfdc/sfdx)　に含みます。
opencv.jsの作法 その9

#概要

opencv.jsの作法を調べてみた。
輪郭を検出して、背景を消すをやって見た。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a17a5187-553e-5c5a-5534-b51935a08749.png)


#サンプルコード

```
var cvs = document.getElementById('canvasInput');
var ctx= cvs.getContext('2d');
var img = new Image();
img.src = data;
img.onload = function() {
  ctx.drawImage(img, 0, 0);
	var src = cv.imread('canvasInput');
  var dstC1 = new cv.Mat(280, 500, cv.CV_8UC1);
	var dstC3 = cv.Mat.ones(280, 500, cv.CV_8UC3);
	var dstC4 = new cv.Mat(280, 500, cv.CV_8UC4);
	var mask = cv.Mat.ones(280, 500, cv.CV_8UC3);
	var dst = cv.Mat.ones(280, 500, cv.CV_8UC3);
	cv.cvtColor(src, dstC1, cv.COLOR_RGBA2GRAY, 0);
	cv.threshold(dstC1, dstC4, 205, 210, cv.THRESH_BINARY);
	let contours = new cv.MatVector();
	let hierarchy = new cv.Mat();
	cv.findContours(dstC4, contours, hierarchy, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE, {
		x: 0,
		y: 0
	});
	for (let i = 0; i < contours.size(); i++)
	{
	  var cnt = contours.get(i);
		var area = cv.contourArea(cnt, false);
		let color = new cv.Scalar(255, 255, 255);
		if (area > 30000 && area < 50000) cv.drawContours(mask, contours, i, color, cv.FILLED);
	}
	contours.delete();
	hierarchy.delete();
	for (var i = 0; i < src.rows; i++)
	{
		for (var j = 0; j < src.cols; j++)
		{
			if (mask.ucharPtr(i, j)[0] == 255)
			{
				dst.ucharPtr(i, j)[0] = src.ucharPtr(i, j)[0];
				dst.ucharPtr(i, j)[1] = src.ucharPtr(i, j)[1];
				dst.ucharPtr(i, j)[2] = src.ucharPtr(i, j)[2];
			}
			else
			{
			  dst.ucharPtr(i, j)[0] = 255;
				dst.ucharPtr(i, j)[1] = 255;
				dst.ucharPtr(i, j)[2] = 255;
			}
		}
	}
	cv.imshow('canvasOutput', dst);
	src.delete();
}	
	
	
	
```

#成果物

https://embed.plnkr.co/InvUzpeYDx4l7L1CWYnu/


以上。
restframework generic viewの種類


|クラス           |用途    |メソッド     |
|---------------|-------|----------|
|CreateAPIView  |登録    |POST     |
|ListAPIView    |一覧取得 |GET      |
|RetrieveAPIView|取得    |GET      |
|UpdateAPIView  |更新    |PUT、PATCH|
|DestroyAPIView	|削除    |DELETE   |
|ListCreateAPIView|ListAPIView + CreateAPIView|POST、GET|
RetrieveUpdateAPIView|RetrieveAPIView + UpdateAPIView|GET、PUT、PATCH|
|RetrieveDestroyAPIView|RetrieveAPIView + RetrieveDestroyAPIView|GET、DELETE|
|RetrieveUpdateDestroyAPIView|RetrieveAPIView + UpdateAPIView + DestroyAPIView|GET、PUT、PATCH|
OOP入門#1 ソフトウェアの品質とは

積読状態だった、[「オブジェクト指向入門」](http://www.amazon.co.jp/dp/4756100503)（第１版）Bertrand Meyer著 の読書記録です。
要約と自分なりの解釈を残しておけば教育・指導を行う際にでも役に立つかなってことで。
*([第２版](https://www.amazon.co.jp/dp/4798111112/)に手を出すガッツはない・・・)*

# 1 ソフトウェアの品質とは

品質の高いプログラムとは何だろうか？

それを左右する品質要因には、ユーザから認識されうる「外的品質要因」と、ユーザからは認識されない「内的品質要因」がある。ソフトウェアは最終的には外的品質要因の充足を目指さなくてはならないが、そのためには「内的品質要因」を満たす必要があるのだ。

この本の大部分は「内的品質要因」について書かれているが、その前にゴールとなる「外的品質要因」にはどのようなものがあるか？主要なものをあげてみよう。

### 1.2.1 正確さ

仕様通りに動くということ。仕様そのものが妥当かどうかは別として。

### 1.2.2 頑丈さ

想定外の異常な状態でも機能すること。または破滅的な状態（データを壊しちゃうとか）を避けて安全に停止などすること。

誤った形式のデータが送られてきたら？ディスク容量が不足していたら？オフラインになったら？これらを「想定外」とするのではなく仕様として定義するならば、これは「正確さ」の問題になる。だが常に想定外のことは起こるだろう？

### 1.2.3 拡張性

本来、ソフトウェアはハードウェアよりずっと変更することが容易なはずだ・・・本当にそうか？でっかいシステムの一部を修正するなどということがお気軽にできるだろうか？完成したはずのプログラムを修正しなければならない場合はよくある。

ここは「修正しやすさ」と言い換えたほうが正確じゃないかと思う。拡張に限らず、バグを直したときに他のバグを生んでしまわないかをあまり心配せずに済むかどうか、という観点でもある。

拡張性を向上させるカギは以下の2つ。これらは本書の主要なテーマとなる。

- 簡明さ
- 非集中性（モジュールの独立性）

### 1.2.4 再利用性

ソフトウェアの部品を使いまわせること。当然、使いまわせればコストの削減につながる。

### 1.2.5 互換性

他のソフトウェアとの協調ができるか、ということ。バイナリデータではなくテキストデータを使おう。XMLやJSONにしておこう。APIを提供しよう。

## 1.3 ソフトウェアの保守について

ソフトウェアの品質について考えるなら、開発段階しか考慮しないならそれは片手落ちだ。統計によればソフトウェアにかかる費用の70%は保守に費やされている。

本文で引用されてる統計は非常に古い（1979年）が、状況は現在もさほど変わってはいないだろう。ソフトウェアは完成した後の方が手間がかかる（ソフトウェアに「完成」という概念があればの話だが）。
laravel マイグレート、シード、MVC　備忘録


# ファクトリーファイル役割
カラムに挿入する具体的なデータを定義する。
# シードファイル役割
ファクトリーで作成したデータの何件DBに挿入するかを決める
# DatabaseSeeder.phpファイルの役割
どのデータをシードするかを決める。
# モデルファイルのシードでの役割
DBと接続したり、コントローラー使うスコープをここで、定義したりする。
LaravelのModelには命名規則がある。

例えば、テーブル名がusersの場合、Model名はUserになります。

テーブル名を単数形にしたものがModel名となり、自動的にテーブルを操作することができるようになる。

この命名規則は絶対的なものではなく、テーブル名を明示的に指定することもできる。
参考: https://udemy.benesse.co.jp/development/web/laravel-model.html



例
database/seeds/DatabaseSeeder.php

```php

<?php
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
  public function run()
  {
    // $this->call(UsersTableSeeder::class);
    $this->call(BookmarksTableSeeder::class); //★ここ
  }
}
```
# database/seeds/BookmarksTableSeeder.php
```php
<?php

use Illuminate\Database\Seeder;

class BookmarksTableSeeder extends Seeder
{
  /**
   * Run the database seeds.
   *
   * @return void
   */
  public function run()
  {
    factory(App\Models\Bookmark::class, 100)->create(); //ここ★
  }
}
```

DBとカラムを作成し、

```
php artisan migrate
```

上記４つをやって、シードコマンドを実行するとカラムにデータが保存される。

```
php artisan db:seed
```


###おまけ

```terminal
php artisan make:model Models/Bookmark -a
```
このコマンドでモデルとファクトリー、テーブルが同時に作成される
テーブルは複数形になっている。
わいわいSwiftc 番外編ワークショップ vol.3 福岡 3時間目（応用）


応用問題として、Passに関係ある話題を演習としておいておきます

# 応用課題: コンパイラにPassを登録しよう。ついでにコンパイラにオプションつけよう
さて、この`WaiWaiOptimizer`ですが、一つ問題があります。私達が`sil-opt`をSchemeに追加したように`swift`のSchemeを追加して`swiftc`をビルドしても、**今の段階でその`swiftc`から`WaiWaiOptimizer`が呼ばれることはありません**。

では、swiftcからSILOptimizerのフェーズで`WaiWaiOptimizer`が呼ばれるようにしてください。

ただし、制約をつけます。

- `Guaranteed Passes`の一つとしてPipelineに登録してください。(Hint: Passである`AllocBoxToStack`クラスがどのように使われているかをソースコードをたどりながら見るとわかる)
- swiftcの自作オプションでTriggerをするようにしてください。(Hint: 本物の`AssumeSingleThreaded`クラスの実装を参照)
  - オプションがOFFでもPassが呼ばれても大丈夫ですが、その時は`run`で即`return`するなどして最適化しないようにしてください。 

Hintを踏んでればだいたい解けますし、HintのことをやっているとちょっとだけPass関係のソースコードの渡り方を知ることができます。

事前準備で行った`sil-opt`同様、新しく`swift`のSchemeを追加して`swiftc`をビルドしてください。
ビルドされた`swiftc`は`sil-opt`と同じディレクトリにビルドされます。


## 問題が終わったら？
問題をテストしてください。テストの方法は以下のコマンドで可能です。

```shell:とおったpassの名前をすべて表示するコマンド.sh
# swiftディレクトリにいる前提
$ ../build/Xcode-DebugAssert/swift-macosx-x86_64/Debug/bin/swiftc [作ったオプション] 適当なswiftコードへのパス.swift -Xllvm -sil-print-pass-name
```

`-Xllvm -sil-print-pass-name` オプションを付けると最適化のときに通ったパスが表示されます。

以下、出力の例です。(-waiwai-optionという名前のオプションを追加したときの例)
ここに、その中に`WaiWaiOptimizer`という名前が出てきたら成功です。

```shell
$ ../build/Xcode-DebugAssert/swift-macosx-x86_64/Debug/bin/swiftc -waiwai-option waiwai.swift -Xllvm -sil-print-pass-name
  Run module pass #0, stage Guaranteed Passes, pass 0: SILGenCleanup (silgen-cleanup)
Start function passes at stage: Guaranteed Passes
  Run #1, stage Guaranteed Passes, pass 1: DiagnoseInvalidEscapingCaptures (diagnose-invalid-escaping-captures), Function: main
  Run #2, stage Guaranteed Passes, pass 2: DiagnoseStaticExclusivity (diagnose-static-exclusivity), Function: main
  Run #3, stage Guaranteed Passes, pass 1: DiagnoseInvalidEscapingCaptures (diagnose-invalid-escaping-captures), Function: $s4zeroAASiyF
  Run #4, stage Guaranteed Passes, pass 2: DiagnoseStaticExclusivity (diagnose-static-exclusivity), Function: $s4zeroAASiyF
 ... # 成功すれば、WaiWaiOptimizerが呼ばれている旨が出てくる
```
GPU を使用するバックエンドは利用できません。アクセラレータなしでランタイムを使用しますか？

`GPU を使用するバックエンドは利用できません。アクセラレータなしでランタイムを使用しますか？`

上記のようなエラーが出てColabでGPUが使えない。
GPUを使いすぎたようだ。

>Colab の使用量上限とは何ですか？
Colab では、状況によって変動する動的な使用制限を設け、無制限のリソース提供やリソースの保証を行わないことによって、無料でのリソース提供を実現しています。つまり、全体の使用量の上限、VM の最大存続期間、利用できる GPU タイプなどの要素は、時間とともに変更される可能性があります。Colab では、変更が頻繁に起きる可能性があることから、これらの上限を公開しません。
https://research.google.com/colaboratory/faq.html#gpu-availability

使用上限がわからないのはつらい。
#Ruby の tr でバックスラッシュと他の文字が同時に置換できない？

Wanna replace in string

Repladce backslash with A
Repladce colon with X

```rb
puts ' \\ : '
#  \ :

# Only backslash replace
# It works
puts ' \\ : '.tr('\\', 'A')
# A :

# Replace backslash and other calacter one time
# It does not work
puts ' \\ : '.tr('\\:', 'AX')
# \ A

# Above case maybe same as this
# Only colon replacing
puts ' \\ : '.tr(':', 'AX')
# \ A

# Use expression triple backslash as backslash
# It works
puts ' \\ : '.tr('\\\:', 'AX')
# A X

# It works
# backslash at last character in tr arg
puts ' \\ : '.tr(':\\', 'XA')
# A X
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Docker for Windows で Kubernetesが起動しないときのトラブルシューティング

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. 始めに

社内でKubernetesの勉強会をしたのですが、その時にKubernetesサーバーを立てるのも大変だったので、Docker for WindowsのKubernetesを使おうと言うことになり、複数の人にWindows10へDocker for Windowsを入れてもらい、Kubernetes機能を有効にしたのだけど、Kubernetes機能がいつまで経っても起動してこない人がいた(私です)ので、トラブルシューティングしてみました。

# 1. Docker for Windowsのインストールについて

以下をご参照ください。

Docker for WindowsでKubernetesを試してみる - Qiita
https://qiita.com/h-r-k-matsumoto/items/68f694650029ddf7351d

Dockerのトラブルシューティングについては以下をご覧ください。
Windows10 × Docker for Windows トラブルシューティング - Qiita
https://qiita.com/takeru08ma/items/7878a293c55a9902f404

# 2. インストールしたバージョン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/7912d571-16db-eb03-cd34-3da9df10266c.png)

Windows OSのバージョン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/6843695e-1e03-6c6d-e71b-59e7e154ece8.png)

# 3. 状況

下のDockerとKubernetesで、Kubernetes側がいつまで経ってもオレンジでした
(以下の画像は動くようになった時のステータスです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/b5ea754e-afc2-fa7a-c723-29d9fb1997d4.png)

Hyper-VマネージャーもずっとCPU使用率が0%でした。
(以下の画像は動くようになった時のステータスです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/23b17995-bd48-cbc6-df93-05b187151585.png)

# 4. 対応策

3日ほど放っておいても改善しないのでググってみました。
以下を見つけました。

Unable to start kubernetes on docker desktop win 10 pro · Issue #3799 · docker/for-win 
https://github.com/docker/for-win/issues/3799

どうも、以前Docker for WindowsでKubernetesを動かしたことがある人の固有の問題のようです。

C:\Users\<Windowsアカウント>\.kubeフォルダー
と
C:\ProgramData\DockerDesktop\pki
が関係しているらしく、中を見ると
.kubeフォルダー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/edb10792-d726-44e4-eacb-4b5e57b7b8b2.png)

pkiのフォルダー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/ce652b9a-a830-23d5-2d3d-16011f7c4e55.png)
のようになっていました。

Kubernetesを構築したことがある人はピンとくると思いますが、各種Kubernetesのサービス用のサーバー証明書が入っています。

pkiフォルダーを削除します。
タスクトレイのDockerから「Restart」を選択してDockerを再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/2de42ee3-05d0-24f5-ee01-eb6cb6247355.png)

動き出しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/20140ae5-1f1a-bcc1-9635-5ec552da2dcc.png)

# 5. 原因

Hyper-Vで動くKubernetesの仮想サーバーで使うTLSの鍵情報を新しい鍵情報を作ろうとしていたが、以前インストールした時のものが残っていてDocker for Windowsはデフォルトでは上書きしない為、いつまで経っても起動しなかった。

ということのようです。

# 6. まとめ

Happy, Kuberneting! 

WSL2が待ち遠しいです。
n回失敗するまで繰り返し続けるlinuxコマンド ワンライナー


[How do I write a retry logic in script to keep retrying to run it upto 5 times?](https://unix.stackexchange.com/questions/82598/how-do-i-write-a-retry-logic-in-script-to-keep-retrying-to-run-it-upto-5-times)

より拝借。5回くらい同じコマンドを繰り返す。

```
for i in 1 2 3 4 5; do command && break || sleep 15; done
```
#Ruby tr replace backslash and other character netime

Wanna replace in string

Repladce backslash with A
Repladce colon with X

```rb
puts ' \\ : '
#  \ :

# Only backslash replace
# It works
puts ' \\ : '.tr('\\', 'A')
# A :

# Replace backslash and other calacter one time
# It does not work
puts ' \\ : '.tr('\\:', 'AX')
# \ A

# Above case maybe same as this
# Only colon replacing
puts ' \\ : '.tr(':', 'AX')
# \ A

# Use expression triple backslash as backslash
# It works
puts ' \\ : '.tr('\\\:', 'AX')
# A X

# It works
# backslash at last character in tr arg
puts ' \\ : '.tr(':\\', 'XA')
# A X
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
statsモジュールの関数

#cdf関数
累積分布関数を表す。cdfとは「Cumulative Distribution Function」の略。

##累積分布関数とは？
ある値以下となる確率を計算してくれる関数のこと。

###正規分布の時の関数の中身

```math
\begin{align}
F(x)&=P(X\leq x) \\
&=\int_{-\infty}^{x}\frac{1}{\sqrt{2\pi\sigma^2}}e^{-{\frac{(x-\mu)^2}{2\sigma^2}}}dx
\end{align}
```

```python
stats.hoge.cdf
```
- 正規分布のとき<br>

```python
stats.norm.cdf(loc = <平均値>, scale=<標準偏差>, x = x)
``` 
- t分布のとき

```python
sats.t.cdf(<t値>, df=<自由度>)
```

また、p値は累積分布関数で出力される値を１から引くことで求められる。

#ttest_1samp関数
1変量データのt検定を行う関数。
ただ、事前に、2変量の差分を求めれば、2変量データのt検定を行える。

```python
>>>stats.ttest_1samp(data, x)
>>>Ttest_1sampResult(statistic=hoge, pvalue=hoge)
```
dataは標本を表し、xは対象となる数値である。
出力に出てくるstatisticはt値、pvalueはp値を示す。

#ttest_rel関数
対応関係のある2変量データに対するt検定を行う関数。
データxの平均とデータyの平均との間に有意差があるかを検証。

```python
stats.ttest_rel(x, y)
```
#ttest_ind関数
対応関係のない2変量データに対するt検定を行う関数。

```python
stats.ttest_ind(x, y, equal_var = False)
```
equal_varがFalseの時は、データの等分散性がないと仮定（確定）している。

#stats.chi2_contingency関数
χ二乗検定を行う関数

```python
>>>stats.chi2_contingency(data, correction = False)
>>>(a, b, c, array([[d, f],
   [g, h]]))
```
デフォルトではcorrectionがTrueになっており、イェーツの補正が入る。
結果は、χ二乗統計量、p値、自由度、期待度数の表の順に出力される。

#stats.hoge.pmf関数
確率質量関数(Probability Mass Function)のこと。すなわち、確率論および統計学において、離散型確率変数にその値をとる確率を対応させる関数。

##二項分布のとき
```python
>>>sp.stats.binom.pmf(k = 1, n = 2, p = 0.5)
>>>0.500
```
引数は左から成功回数、試行回数、成功確率を入れる。

##ポアソン分布のとき
```python
>>>so.stats.poisson.pmf(k = 2, mu = 5)
>>>0.084
```
これは強度が5のポアソン分布において、2が得られる確率を示したものである。

#stats.hoge.rvs関数
乱数を発生させる。

##二項分布のとき
「『表が出る確率が20%であるコインを10回投げて、表が出た回数を数える』という試行を5回繰り返す。」というコードが下にある。

```python
>>>np.random.seed(1)
>>>sp.stats.binom.rvs(n = 10, p = 0.2, sizse = 5)
>>>array([2, 3, 0, 1, 1])
```
[Visual Studio 2019]プロジェクトテンプレートを作ったときにハマったメモ

Visual Studio 2019でプロジェクトテンプレート作ってみたんですがちょっとハマったのでメモ。

プロジェクトテンプレートっていうのはVisual Studioで新しいプロジェクトを作成するときに選ぶアレです（下の画像のやつ）

![すくしょ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253888/4512dc97-53d9-4bcf-5ccd-55fa25db0bb3.png)

# プロジェクトテンプレートの作り方

詳しくは [公式の説明書](https://docs.microsoft.com/ja-jp/visualstudio/ide/creating-project-and-item-templates?view=vs-2019) を見てほしいのですが、簡単に説明すると、

1. テンプレートの元になるプロジェクトを作成する
1. 「プロジェクト>テンプレートのエクスポート」からプロジェクトテンプレートを作る。 [参考](https://docs.microsoft.com/ja-jp/visualstudio/ide/how-to-create-project-templates?view=vs-2019)

   基本的にはこれだけです。
   ただ、プロジェクト内のパラメーターを置き換える([参考](https://docs.microsoft.com/ja-jp/visualstudio/ide/how-to-substitute-parameters-in-a-template?view=vs-2019))場合は上記に加えて下の処理が必要です。

1. (上の続き)作成されたプロジェクトテンプレート(zipファイル)を一度解凍する
1. 解凍したファイルの中の`.vstemplate`ファイルを編集する (普通にやると多分`MyTemplate.vstemplate`)
1. 再度zipに圧縮する

最後にできたzipファイルを`C:\Users\(ユーザー名)\Documents\Visual Studio 2019\Templates\ProjectTemplates`に配置して、Visual Studioを再起動すると、そのプロジェクトテンプレートを使えるようになっているはずです（ミスがなければ）

# ハマった点

解凍して再圧縮の処理をすると、プロジェクト作成画面に作ったテンプレートが表示されない。

# 解決方法

zipに圧縮するときにフォルダを選択して圧縮するのではなく、**ファイルを全選択して圧縮する**。

# 結論

**zipに圧縮する際にフォルダじゃなくてファイルを全選択して圧縮する！！！**

# おわり

これで半日溶かしました。悲しい😰

プロジェクトテンプレートを使って快適なVisual Studioライフを！
gnome-session-inhibitを使って, mpvで動画を再生中に画面をロックしないようにする

GNOME3 (archlinux) 環境において, mpvで動画を再生してしばらく経つと, GNOMEの省電力の設定に従って, 画面がロックされてしまう.

省電力設定を変更してロックしないようにして回避することはできるが, gnome-session-inhibit を使ってソフトウェアを起動してロックしないようにすることもできる.

```shell
$ gnome-session-inhibit mpv video.mp4
```

ゲームパッドを使うゲームでも, 遊んでる最中に画面がロックしてしまうことがあります.
試したわけではないけど, 同じやり方で回避できるんじゃないかな.

これまた確認したわけではないけど, GNOMEをベースにしているデスクトップ環境でも, 同じ方法はとれるのでは, と思います.
【Python】sympyで方程式を解く

# はじめに
三次方程式を楽に解きたい…
三次方程式の解の公式は、ものすごく長いものとなってしまいます。興味がある方は[こちら](http://hooktail.sub.jp/algebra/CubicEquation/)
これをプログラムで解けないかと検索したらPythonにsympyというモジュールがありました。本当にすごい。

# 環境
どちらも動きました

 - windows 10
  - Python 3.7

 - Ananconda 
    - Python 3.7
    - Jupyter notebook

# 使い方
## インストール
Anacondaの環境には既にインストールされていますがそうではない場合pipでインストールしましょう

```
pip install sympy
```

## 方程式を解く
とりあえず方程式を解きたいんだ！という方はこちら
`Symbol`で文字を定義して、`solve()`で方程式を解くことができます。
以下の3次方程式を解きます。

```math
3x^3 + 2x^2 + x + 10 = 0
```

べき乗は、Pythonの標準のべき乗の書き方で書くことができます。

```python
x**3 # xの3乗
```

以下がプログラムになります。

```Python
from sympy import *

x = Symbol('x')

sol = solve(3*x**3 + 2*x**2 + x + 10)

print(sol)
```
出力結果。listで3つの解が渡されます。

```
[-5/3, 1/2 - sqrt(7)*I/2, 1/2 + sqrt(7)*I/2]
```

これは以下と同じですね。

```math
[\frac{-5}{3}, \frac{1}{2} - \frac{{\sqrt{7}}i}{2}, \frac{1}{2} + \frac{{\sqrt{7}}i}{2}]
```

# その他色々な機能
～調査中～
追記します
irbのJupyter wrapper kernelをpoetryを使ってPyPIで公開する

タイトルの作業を行っていきます。
irbはRubyのREPLです。

先に出来上がったものを見せると
https://github.com/PyDataOsaka/irb_kernel
になります。

ここに至るまでに下記を行いました。

### poetryでパッケージソースの雛形を作成

```
pip install poetry
poetry new irb_kernel
cd irb_kernel
poetry add pexpect
poetry add notebook
```

### irb_kernel下にコードを追加

@antimon2 さんの [Jupyter の Egison 簡易カーネルを自作してみた。](https://qiita.com/antimon2/items/7d9c084b142d38b67b1f)
と
https://github.com/takluyver/bash_kernel
を真似ました。

https://github.com/PyDataOsaka/irb_kernel/blob/master/irb_kernel/install.py
は
`kernel.json`をインストールするコマンド用の雛形的コードで
https://github.com/takluyver/bash_kernel/blob/master/bash_kernel/install.py
の

```
kernel_json = {"argv":[sys.executable,"-m","bash_kernel", "-f", "{connection_file}"],
 "display_name":"Bash",
 "language":"bash",
 "codemirror_mode":"shell",
 "env":{"PS1": "$"}
}
```

を

```
kernel_json = {"argv": [sys.executable,"-m","irb_kernel", "-f", "{connection_file}"],
 "display_name": "Irb",
 "language":"ruby",
 "codemirror_mode": "ruby"
}
```

に置き換えただけです。
(`kernel.json`がインストールされるとJupyter NotebookのNewドロップダウンリストに`display_name`のvalueである`Irb`が追加されます。)

次にkernelが行うことを記述するkernel.pyを追加します。
kernel.pyに関してはbash_kernelのkernel.pyより @antimon2 さんの [Jupyter の Egison 簡易カーネルを自作してみた。](https://qiita.com/antimon2/items/7d9c084b142d38b67b1f)
の egison-kernel.py を真似ています。
egison-kernel.pyの肝の箇所は

```
            self.egisonwrapper = replwrap.REPLWrapper("egison --prompt " + prompt, 
                unicode(prompt), None)
```

です。
irb_kernelのkernel.pyでは上記を

```
            self.irbwrapper = replwrap.REPLWrapper("irb --simple-prompt", ">> ", None)
```
に変えています。
https://github.com/PyDataOsaka/irb_kernel/blob/master/irb_kernel/__init__.py
と
https://github.com/PyDataOsaka/irb_kernel/blob/master/irb_kernel/__main__.py
は
egison-kernel.py同様のkernel.py から bash_kernel同様に `__init__.py` と `__main__.py` を分離しただけのものです。

これでコードの追加は完了です。

### パッケージのビルドとPyPI での公開

```
# irb_kernel ディレクトリで実行します。
poetry build
poetry publish
```

これだけで完了です。
https://pypi.org/project/irb-kernel/

### PyPIからのパッケージのインストールとkernel.jsonのインストール，そしてJupyterの起動

```
sudo apt install ruby
pip install irb_kernel
# 下記コマンドはパッケージソースのディレクトリのひとつ上では実行しない方がいいです。
python -m irb_kernel.install
jupyter notebook
```

以上ですべての作業が終わりました。
インストールすることなくirb_kernelの動作を試されたい場合は
https://mybinder.org/v2/gh/PyDataOsaka/irb_kernel/master
をクリックしてください。

### 最後に

画像やテーブルのインライン表示はまだできないと思います。
もし興味のある方はぜひ開発を進めてください。
JuliaのDebuggerとしてはJunoがおすすめ！


Juliaで良いDebuggerがないなと思っていたのですが、Atomのパッケージで[Juno](https://junolab.org/)をインストールすることである程度解決しました。


#Junoインストール〜起動
手順としてはatomで`Edit > preferences > install > Junoと検索 ＞ uber-junoインストール`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/c42c2f17-622d-61a6-cb08-e164b2d29691.png)


インストールしたら、画面左側のアイコンからREPLを表示させる
ここで、
Press Enter to start Julia. でEnterを押しても
REPLでJuliaが起動しない場合がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/90ae473f-d5ad-8144-7d74-710be6e5f69c.png)


Starting Juliaとならない場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/5472be76-9404-aa67-3732-002445635829.png)


atomのversionが古い可能性がある。
再インストールしよう。
atom 1.43.0だとREPLでJuliaが起動しました
設定でJuliaのPathがあっているかの確認も必要です。


##deguggerの使い方
```
function func()
    i = 10
    while i>0
        println(sin(i))
        i-=2
    end
end
```
のコードをDebugするときは

####REPLで
`Juno.@enter func()`を実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254458/f4c062b1-cacc-d12a-f5ff-21495f1b7106.png)



残っている不満としては
`ctrl` + `Enter`でREPLに実行結果が出力されないこと！
何か方法ないのかな？
brewでSuperColliderをインストール

# はじめに
音響合成プログラミングのプラットフォームである[SuperCollider](https://github.com/SuperCollider/SuperCollider)をmacに簡単にインストールする方法です。

# 方法
普通に`brew search`したら`cask`にありました。

```shell
$ brew cask install supercollider
```

これでインストールできますー
標準出力をファイルに書き出す

## 標準出力をファイルに上書き保存する
```terminal
$ echo 'hoge' > sample.txt
```

## 標準出力をファイルに追記する保存する
```terminal
$ echo 'hoge' >> sample.txt
```

### 改行を表現したい場合
- **-eオプション**をつける

```terminal
$ echo -e "aaa\nbbb\nccc" > sample.txt

or

$ echo -e aaa\\nbbb\\nccc > sample.txt
```
capybaraでfields_forのformの要素をあいまい検索でテストする

# はじめに
最近はrspec書いてて、これどうすんねんーーーってとこあったので備忘録的な感じで書いておきます。

# 今回の困りごと
`fields_for`で`form`を追加した際に、`form`の要素をどうやって指定すればいいか困りました。
<img width="790" alt="スクリーンショット 2020-01-26 2.22.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285303/df1927e0-f7db-40a2-7376-c2fd99e351f6.png">

今回は画像のプラスボタンを押すとformが追加されるようになっており、値を入力して保存できるかどうかをチェックしたいのですが、追加した`form`のindex番号はランダムで生成されるため、
```
<input type="text" name="user[users_attributes][1579974088711][name]" id="users_attributes_1579974088711_name">
```
上記のような`[1579974088711]`が数字が生成されています。
なので、

```
fill_in 'user[users_attributes][2][name]', with: '夜勤'
```
というふうにindex番号の指定ができないです。

# 解決策
指定ができない場合どうやって空白のformに文字入力したらいい？ 
- ページ内の`form`を全部検索してきて、最後の要素を指定してやればいいです。
全体から検索してくるには、

```
all("input[name$='[name]']")[2].set("夜勤")
```
のようにすれば入力してくれるようになります。

```
find("input[name$='[name]']")[0].set("夜勤")
```
でもいけるようですが、自分は動きませんでしたので`all`で全体から探すようにしています。


# おわりに

今回findで動かなかったがすごい気持ちわるいなーと思ったんですが、無事テストはできたんでよかったです。
なので、動的に追加した`form`のテストはこれで`find` か `all`で全体から探して、そのindex番号で指定してやればいいかと思います。
なにかご指摘等あればよろしくお願いします。