OmniAICreator/Qiita-1.07M huggingface dataset:
Eclipse上でTomcatを走らせるときの相対パス

#結論

サーバで実行する[^1]時のカレントディレクトリは
`/Applications/Eclipse_2019-03.app/Contents/MacOS/`
になる。

#環境

Eclipse 2019-03 (4.11.0)
Tomcat9
macOS 10.13.6
Java11

#きっかけ

相対パスでファイルを指定する時にカレントディレクトリがどこか把握しておく必要がある。
EclipseでJavaアプリケーションを実行する時、カレントディレクトリはプロジェクトディレクトリだった。しかし、今回サーバで実行した際には、カレントディレクトリは別の場所になっていた。


[^1]: Eclipse+Tomcatアプリ https://searchman.info/java_eclipse/1100.html
【Swift】チャットアプリのUIをちょっとだけ良くしてみた

# 1.はじめに
こちらの記事は、下記の記事のUIを変更していく過程を記載しています。
[【Swift】Firebase Realtime Database を用いてチャットアプリを爆速コーディングしてみた。](https://qiita.com/tetsukick/items/638501babc692ec55858)

# 2.入力域にラベルの設定
<img width="515" alt="スクリーンショット 2019-06-30 2.04.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/2a2c30e1-28ae-caba-68d8-043e0c042297.png">
↓↓↓↓↓↓↓
<img width="489" alt="スクリーンショット 2019-06-30 2.10.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/89318deb-fa26-477d-e267-8a1228bd1e03.png">
こんな感じに変更したいと思います。

### UITextFieldの左端の制約を削除
UITextFieldの左側に設定されている、マージンの制約を選択します。
Deleteキーで削除します。
<img width="515" alt="スクリーンショット 2019-06-30 2.04.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/f4da3e6f-3979-f104-78c9-37c4a6fef102.png">

### UILabelの追加
削除したら左側にスペースができるので、UILabelを追加します。
制約は、以下で設定。
左側: 15, 右側: 15
<img width="705" alt="スクリーンショット 2019-06-30 2.05.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/5672cda4-325b-491f-b760-6ab1b4853498.png">

### 相対的な制約の設定
この状態だとまだ制約が不十分なため、UILabelの周りが赤くなっています。
不足しているのは、Y座標の位置になります。
「name:」UILabelとUITextFieldを選択した状態で、「Vertical Centers」を選択します。
そうすることで、UILabelとUITextFieldの位置関係が水平になります。
<img width="661" alt="スクリーンショット 2019-06-30 2.06.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/a2226629-41c4-b24e-be59-1c1995f6d6a4.png">

同様にメッセージ入力欄も変更します。※省略

### ボタンの色変更
Textの色変更、背景色の変更は、赤枠の箇所で変更できます。
<img width="857" alt="スクリーンショット 2019-06-30 2.28.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/e13abbcd-bbe3-dc1d-55bd-e7b3e0d3b2c2.png">
<img width="828" alt="スクリーンショット 2019-06-30 2.09.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/fffb08ad-4cbd-8dad-eba1-9ff5116edd37.png">

これで入力域のラベル設定・ボタンの色変更が完了
<img width="489" alt="スクリーンショット 2019-06-30 2.10.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/33673588-561b-fb88-7279-bb49a0711944.png">

## 3.背景色の変更
画面自体の背景をグレーに変更してみました。
<img width="1168" alt="スクリーンショット 2019-06-30 2.34.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/fb64eff5-6e7e-e714-224b-cd4bbdbcc2e6.png">

## 4.ボタンの角丸化
下記の箇所に以下を追加。
`layer.cornerRadius`
<img width="994" alt="スクリーンショット 2019-06-30 2.42.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/142cedbc-5e3e-7f5d-3258-855b2dbfdb48.png">
<img width="375" alt="IMG_5601.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/11939de2-80d3-0773-1b12-921a2db18b68.png">

# GitHubはこちら
https://github.com/Tetsukick/Firebase-chat-iOS
未経験者に向けた Angular 入門 (1) 環境構築とはじめてのプロジェクト作成

#はじめに
本記事では、わかりやすさを担保するために、チュートリアル形式で進めていきたいと思っています。
開発に必要な環境の用意からAngularの（簡単な）構造の紹介を含めて、簡単なアプリケーションを完成するまでの手順を紹介していきます。

###本記事が対象としている方

- HTML・Javascript・CSS について簡単な知識はあるけども本格的なアプリケーションを作成した事のない方
- jQuery を使った簡単なアプリケーションからステップアップしたい方
- SPA を作成した事のない方

#Angular とは
Angular とは、Googleが提供しているWebアプリケーション向けのフレームワーク（部品集、ひな形集）です。
Angular だけでWebアプリケーションに必要な殆どの機能を作り上げることができますが、独特の書き方やルールが存在しているので、
これについても少しずつ紹介していきます。
# 開発環境の用意
### Visual Studio Code のインストール
Angular のコードを書くために必要な機能を持ったエディタ（IDE:統合開発環境）を用意します。
ここではマイクロソフトが提供しているVisual Studio Code というエディタを利用します。

以下のURLにアクセスしてお使いのOSに合わせてインストーラをダウンロードしてください。

[Visual Studio Code] 
https://code.visualstudio.com/ 


### Node.jsのインストール
Angular を動かすために必要な Nodejsをインストールします。
Nodejsについての詳しい説明は本記事では省略することとします。

[NodeJS] 
https://nodejs.org/
※Angular 6 からはNodeのバージョンが8以上でないといけないので、ダウンロードするバージョンには注意してください。

### Angular CLI のインストール
Angular CLI を利用することで、Angularプロジェクトの作成や実行が簡単に行えます。
また Angular CLI は npm コマンドを利用してインストールすることができますので、Visual Studio Code を開いて下記のコマンドを実行してください。

```
 npm install -g @angular/cli
```

### 初めてのAngularプロジェクトの作成
Angular CLIのインストールが完了したらいよいよAngularアプリを作成していきます。
Visual Studio Code を開いて、画面下のTerminalから以下のコマンドを実行してください。Angularプロジェクトに必要なライブラリのインストールが自動的に始まります。


```
ng new myApp
```

ngコマンドはAngular CLIを利用するときに先頭に記述します。
半角スペースを空けて new {プロジェクト名} と続きますが、プロジェクト作成の他の使い方は、必要に応じて説明していきます。

またコマンドを実行すると、いくつかの質問をされますが、それぞれに yes と答えてプロジェクトの作成を進めてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57819/d6b4da88-43d4-bf5b-478a-5de512603385.png)


ちなみに1つ目の質問「Would you like to add Angular routing? (y/N)」はページ遷移のために必要なモジュールの要不要を、
2つ目の質問「Which stylesheet format would you like to use? (Use arrow keys)」は利用するスタイルシートの形式を問っています。
特にこだわりがないようであれば、ここでは CSS を選択しておきましょう。

しばらく待つと myApp というフォルダが出来上がっているかと思います。
これでプロジェクトの作成は完了です。
ここで作成されたプロジェクトはひな形ですので、これをベースにアプリケーションの作成をスタートしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57819/8a94504f-0d77-5415-ee6d-394cc93b8f43.png)

e2eやnode_modules等のフォルダが自動的に作成されていますが、アプリケーションを作成していく中で実際に触れていくのはsrcフォルダの中身です。
今は気にしないようにしましょう。

#次回

次回はサンプルページの中身について触れていきたいと思います。

https://qiita.com/toguchi/items/dab1cef46c6acde47bef
【swift】 UIImageViewの画像表示サイズ調整

毎日何かしらをアウトプットするつもりが、いざやろうとするとやっぱりなかなか難しい。。
（コーディングは毎日やってるので、書くネタはいくらでも出てきてるハズなんですけどね。メモさえきちんと残していれば。）

今日は、UIImageViewを使って画像を表示しようとしたけど、なぜかどうしても拡大表示されたようになって、自分が想定してる”等倍”で表示されない。

だいぶ悩んだ挙句、しょうもないトコで詰まってました。
オチとしては、なんで「画面サイズ」が何種類もあるんだ！？ってトコです。

### 画面イメージ
表示したいのは以下”成功パターン”のような空の写真だったんですが・・・

|成功パターン|
|:-:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126315/bccd0c4f-2413-3c0c-2563-5254a7114e95.png" width="250">|

|失敗パターン|
|:-:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126315/1860e18b-2627-ddfd-877e-b122fc646038.png" width="250">|

失敗パターンでは、なんとなく画像が思いっきり拡大されてるんだろうな〜、って感じですね。

### ソース
```swift:ViewController.swift
    func setBgImage() {
        // 成功パターン
        let width = UIScreen.main.bounds.size.width
        let height = UIScreen.main.bounds.size.height

        // 失敗パターン
        //let width = UIScreen.main.nativeBounds.size.width
        //let height = UIScreen.main.nativeBounds.size.height

        bgImage = UIImage(named: "sky(828_1792)")!
        bgImgView.image = bgImage
        let bgImageWidth = bgImage.size.width
        let bgImageHeight = bgImage.size.height
        let scale = height / bgImageHeight
        // 画像表示サイズの設定("scale"で倍率調整)
        bgImgView.frame = CGRect(x: 0,
                                 y: 0,
                                 width: bgImageWidth * scale,
                                 height: bgImageHeight * scale)
        // 画像表示の中心を画面の中心に
        bgImgView.center = CGPoint(x: (width / 2),
                                   y: (height / 2))
        
        self.view.addSubview(bgImgView)
        self.view.clipsToBounds = true
    }
```

添付する画像のサイズを`UIScreen.main.nativeBounds.size`に合わせた解像度に調整していたんですが、実際の画面サイズは`UIScreen.main.bounds.size`のようなので(前者は後者の２-３倍に設定されている)、いざ自分が”等倍”だと思って画像表示してみると、想定より2-3倍大きく表示されてしまった、というコトのようです。

### ポイント
ちゃんとそこを意識してサンプルのロジックと見比べてみればすぐに気づけたでしょうが、「画面サイズ」という概念の理解が浅かったために、どハマりして長々と悩んでしまいました。

とりあえずは「UIViewを取り扱う時の画面サイズは`UIScreen.main.bounds.size`を使おう」を教訓にしておこうかな、という感じです。
Vue.jsで画面サイズによってClassやidを付与したい

#どんだけ探しても画面サイズの取得とクラスの付与に関する記事はあるが、なぜかタイトルの記事が無かったから書く

今回やりたいのは画面サイズが800px以下になった時にクラスを付与したい。ってだけ
だから`v-if`を使ってコンテンツ非表示とは少し違う。

##クラスを付与したいHTML

```vue:Test.vue
<!-- ここに800px以下になったら hoge というクラスを付与したい -->
<div>
    <p>これはテストです。</p>
</div>
```

##ぱぱっとコードを先に置いておく

```vue:Test.vue
<div v-bind:class="{active:hoge}">
    <p>これはテストです。</p>
</div>

<script>
    export default {
        data() {
            return {
                hoge: {}
            }
        }
    },
    methods: {
        handleResize: function() {
            if (window.innerWidth <= 800) {
                this.hoge = true
            } else {
                this.hoge = false
            }
        }
    },
    created() {
        window.addEventListener('resize', this.handleResize)
        this.handleResize()
        },
    destroyed() {
        window.removeEventListener('resize', this.handleResize)
    }
</script>
```

##クラス付与する部分の説明

###ここでv-bindに与えたDOM要素が真の場合ならクラスに`hoge`が付与されます。

```vue:Test.vue
<div v-bind:class="{active:hoge}">
    <p>これはテストです。</p>
</div>
```
##画面サイズによってクラスを付与する処理の説明

###ここのメソッドで`handleResize`という関数を作成しています。

`window.innerWidth`には画面幅サイズが入っているので、それが800px以下ならという分岐をしています。

真なら`hoge`に`true`を与えて偽なら`hoge`に`false`を与えます。

```vue:Test.vue
<script>
    methods: {
        handleResize: function() {
            if (window.innerWidth <= 800) {
                this.hoge = true
            } else {
                this.hoge = false
            }
        }
    }
</script>
```

##画面サイズが変わる毎にイベントを実行したり削除したり

###created()で`handleResize`をイベントを実行、destroyedでイベントを削除

```vue:Test.vue
<script>
    created() {
        window.addEventListener('resize', this.handleResize)
        this.handleResize()
        },
    destroyed() {
        window.removeEventListener('resize', this.handleResize)
    }
</script>
```

###こうすれば画面サイズが800px以下になった時に`hoge`というクラスが付与されて、逆に800px以上になった時はクラスが無くなります。

ただもっとスマートなやり方があるはず。。こうした方が良いって意見がある方はコメントお願いします( ◠‿◠ )
DjangoでWebアプリを作ってみる。【vol. 10 Ajaxを使ってみる。】


※[この記事](https://qiita.com/TsJazz27Sumin/items/248c65fa712bc443c084)の続きです。
### onclickイベントをトリガーにアラート出してみる。

非同期で何か情報を取ってくる足がかりを作りたいので、以下の処理を作りたいと思います。

 - onclickイベントをトリガーにAjaxでサーバーに問い合わせる。
 - 問い合わせた結果、文字列を返してアラート表示をさせる。

Ajaxを試すためにボタンを一つ追加します。

```html
<a id="try-ajax" href="#" class="btn btn-lg btn-info">Try Ajax</a>
```

続いて、javascript側の処理を書きたいと思いますが、ここからjQueryを[ダウンロード](https://jquery.com/)して前回作成した`static`フォルダ配下に配置しておきます。cssとjsが同じフォルダ内にいるのは、違和感があるのでフォルダ構成も見直しています。

 - staic
    - css
        - edinet.css
    - js 
        - jquery-3.4.1.min.js

フォルダ構成の見直しに対応して、cssの読み込み宣言も修正しています。

```html
{% block extrahead %}
  <link href="{% static 'css/edinet.css' %}" rel="stylesheet">
{% endblock %}
```

続いて、jsフォルダ配下に`edinet.js`というファイルを作ります。
中身は、ボタンのonclickイベント発火するか確認するため、こんな処理です。

```js
$(document).ready(function(){
    $("#try-ajax").click(function() {
        alert( "Click!" );
      });
  });
```

HTMLにjs読み込ませる設定を追加して試してみます。

```html
{% block extrahead %}
  <link href="{% static 'css/edinet.css' %}" rel="stylesheet">
  <script type="text/javascript" src="{% static 'js/jquery-3.4.1.min.js' %}"></script>
  <script type="text/javascript" src="{% static 'js/edinet.js' %}"></script>
{% endblock %}
```

javascriptの読み込み方は、[こちらの記事](https://qiita.com/t-iguchi/items/20dc31d5e004d7145634)を参考にさせていただきました。
`Try Ajax`ボタンを押すと「Click!」というアラートが表示されました。

### お試しでAjax通信をさせる

続いて、Ajax呼び出しに対応するメソッドを準備します。
JSONで文字列を返したいと思います。[こちらの記事](https://qiita.com/t-iguchi/items/ac9638dbdbe509515148)を参考にさせていただきました。

```py
def try_ajax(request):
    data = {"message" : "Success"}
    return JsonResponse(data)
```

無事通信出来た際には、「Success」と表示されます。
続いてURLマッピングをします。

```py
urlpatterns = [
   # 省略
   path('try-ajax', views.try_ajax, name='try_ajax'), #追加
]
```
できれば、URLマッピングが修正された際に追随させたいので`name`要素に相対URLを仕込んでおきます。

```html
<a id="try-ajax" name="{% url 'try_ajax' %}" href="" class="btn btn-lg btn-info">Try Ajax</a>
```

そして、onclickイベント発火時にAjax通信されるようにjsを修正です。

```js
$(document).ready(function(){
    $("#try-ajax").click(function() {

        targetUrl = window.location.href + this.name.replace("/","");

        $.ajax({
            type: "GET",
            url: targetUrl,
            dataType: "json"
          }).done(function(data) {
            alert(data.message);
          });
      });
  });
```

これで実行すると、無事「Success」の文言が確認できました。

※「部分ViewをAjaxで差し替える。」については、[Windows環境だと起こるバグ](https://github.com/django-helpdesk/django-helpdesk/issues/621)に出くわし、さっぱり上手く行きませんでした。。すぐにbugfixしそうにないので、いったんAjaxテーマの投稿はここまでとしたいと思います。
【Rails5.2】credentials.yml.encとmaster.keyでのデプロイによる今までとの変更点

## はじめに
Rails5.2からsecrets.ymlが廃止になり、credentials.yml.encとmaster.keyに置換されました。
今までamazonS3のaws_access_key_idなどを保存をsecrets.ymlでやっていましたがそちらが変更となりました。
その変更において少し引っかかったところがあるので、備忘録として残しておきたいと思います。

### ①credentials.yml.encを編集する
```
$ EDITOR=vim bin/rails credentials:edit
```

上記コマンドで暗号化されていない、credentials.yml.encを開くことができ、編集することができます。

```credentials.yml.enc
 aws:
   access_key_id: 123
   secret_access_key: 123

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
```

`
 aws:
   access_key_id: 123
   secret_access_key: 123
`

上記のところにaccess_key_idとsecret_access_keyを記述します。
※デフォルトだとコメントアウトされているので外しておきましょう。

②deploy.rbを編集

```deploy.rb
set :linked_files, fetch(:linked_files, []).push("config/master.key")
```

deploy.rbに上記の行を追加します。

##③本番環境のshared/configにmaster.keyを作成
このままデプロイしても以下のようなエラーが出てしまいます。

```terminal
ERROR linked file /var/www/techlog/shared/config/master.key does not exist on 13.114.255.24
```

エラー通り、shared/configにmaster.keyを作ります。

```
#本番環境
$　touch　/var/www/アプリケーション名/shared/config/master.key
```

作成したmaster.keyを編集します。

```
$　vim　/var/www/アプリケーション名/shared/config/master.key
```

ローカルのmaster.keyの内容をコピーし、本番環境のmaster.keyにコピーします。


以上で作業完了です。




## 参考記事

ローカルからAWSのEC2にファイルをコピー
https://qiita.com/Yorinton/items/df24281fcf07729fa0f9

Rails5.2から導入されたcredentials.yml.encを極める
https://qiita.com/yuuuking/items/53a37a2e998972be32b8
PHPerがPythonを始めてみた

# PHPerがPythonを始めてみた
PHPで経験積んできたけど、自分がやっていきたいこと、やりたいこと考えるとPythonのほうがいいと思い始めたのでPythonを始めてみた。
(※正確に言うと、始めるにあたって必要なことを調べてまとめた。

## インストール
普通にインストール。
https://www.python.jp/install/windows/install_py3.html

※機械学習やデータ分析に特化したAnacondaというパッケージがあるため、こちらのほうが便利か。
https://qiita.com/nishimae/items/ba6ee92992b3c517e7a4、

Anacondaのインストール
https://qiita.com/Raphael_de_murl/items/6942fee692de2f13c623

## おすすめのIDE
インストール時にIDLEというものが付属しているが、
Anaconda、PyCharmがおすすめらしい。

ブラウザ上でインタラクティブに実行できるJupyter Notebookもよさそう
https://qiita.com/Fortran/items/a8bd3e050baf25add082

無料のクラウドの実行環境がGoogleから提供されている。
Google Colabratory
https://cpp-learning.com/python_colaboratory/ラリー



## 基本的な文法（公式ドキュメント）
https://docs.python.org/ja/3/index.html

ちなみにPHPとPythonの文法の比較サイトも併せてみると探しやすい？
https://www.php2python.com/wiki/function.file-get-contents/

## ユニットテスト
Python標準のunittestの使い方メモ
https://qiita.com/aomidro/items/3e3449fde924893f18ca

## CMS
こちらの記事が詳しい。
https://qiita.com/jumpyoshim/items/5ec4ef7a5615b3c2e9ac

## フレームワーク
こちらの記事が詳しい。
https://www.high-performer.jp/engineer/trend/python-framework/

## テンプレートエンジン
こちらの記事が詳しい。
https://www.cmscom.jp/blog/af0ga8

## パッケージ管理、ライブラリ
pipというコマンドで使う
最新バージョンではpythonのインストール時に入っている模様。

ライブラリの一覧
https://pypi.org/

ちなみに
pip list 
でインストールしているものが表示される

参考：https://qiita.com/Masaaki_Inaba/items/fe4a246a7e6fcd9c4726

### グラフ作成
Matplotlibというライブラリで行う。
https://qiita.com/namitop/items/31326293c92522cf11c1

### データ集計
pandasというライブラリで行う。
https://qiita.com/ysdyt/items/9ccca82fc5b504e7913a

### 機械学習
scikit-learnというライブラリで行う。
実例
https://www.randpy.tokyo/entry/python_random_forest

他にもいろいろある。
https://www.sejuku.net/blog/11551

### スクレイピング
requestsというライブラリでHTMLを取得し、HTMLのパースはBeautifulSoupというライブラリで行う。
https://tonari-it.com/python-beautiful-soup-html-parse/

### Excel操作
OpenPyXLというライブラリで行う。
https://www.sejuku.net/blog/75536

### 自動化
PyAutoGUIというライブラリで行う。
https://qiita.com/hirohiro77/items/78e26a59c2e45a0fe4e3

こちらの書籍がオススメ
退屈なことはPythonにやらせよう
https://www.amazon.co.jp/%E9%80%80%E5%B1%88%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AFPython%E3%81%AB%E3%82%84%E3%82%89%E3%81%9B%E3%82%88%E3%81%86-%E2%80%95%E3%83%8E%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E8%87%AA%E5%8B%95%E5%8C%96%E5%87%A6%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Al-Sweigart/dp/487311778X

##　感想
ライブラリが豊富だね（小並感
もう全部pythonでやればいいんじゃないかな（適当
インフラエンジニアの種類

##きっかけ
エンジニアに転職して早1年経ち、ある程度業務にも慣れてきました
現在の業務内容としてはサーバーの運用・保守をしています

転職する以前からインフラと開発系の区別はざっくりと理解していたつもりですが
インフラエンジニアの種類、領域はどこまでなのかと思い、今一度整理してまとめてみました

##分けてみる
企業の業務システムを大きく2つに分けるとアプリ(開発)とインフラ基盤に分けられます
![Untitled Diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407680/db23433f-0428-c45d-283b-bf76b63a1671.jpeg)

インフラ基盤に従事する人がインフラエンジニアと呼ばれます
さらにインフラエンジニアを分けると

- ネットワークエンジニア
- セキュリティエンジニア
- サーバーエンジニア
- データベースエンジニア 

となり、それぞれの領域の設計・構築・運用・保守を担当します

この他にもカスタマーエンジニアやクラウドエンジニアなど
インフラエンジニアは多岐にわたっています

また、開発系ではシステムの設計(要件定義・基本設計など)をするのが狭義のSEであり
その設計書に基づいてコーディングしていくのがプログラマの仕事となります

##おわりに
ざっくりとまとめてみました
業態(Web系など)や企業によってもこの範囲は変わるため
一言で定義することはできないと思いますので、参考程度にとどめていただければと思います
何か気になる点やご指摘点などありましたらコメントください

##参考
リクナビ
https://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002064
ThinkIT
https://thinkit.co.jp/article/11526
Web系はこちらの方の記事がとても分かりやすいです
https://qiita.com/shuntaro_tamura/items/e1a20e33c57c71679688
SIerから大企業の自社開発（web系ではない）に転職したあれこれ

##はじめに
4月に、SIerから内資の大手機械メーカーのSEへ転職をしました。
SIer→web系や外資へ転職、大企業disの記事は頻繁に見ますが、
残念ながらSIer→内資大企業メーカー転職の情報あまり見かけません。
なので、振り返りを兼ねて「こんないい面もあるよ」を綴ります。

##自己紹介
- 情報系院卒30歳で転職2回。経歴だけ見たらジョブホッパー
- SIer→SIer→現職
- これまでの主な経験は制御系開発SE、現在はR&D寄りの自社製品開発SE

##転職経緯
客先常駐勤務から脱出したくて1回目の転職
↓
良さげな求人があったので転職したが、求人詐欺に合い再び客先常駐勤務に
↓
工場の一角に客先常駐、~~SES契約なのに顧客に管r~~ お客様と協力して仕事をする、
典型的なイケてない客先常駐SEとして勤務
↓
流石に嫌気がさしたので、それなりに経験したタイミングで再転職して今に至る

2社目はこのザマでもIT系の就職人気ランキング上位に名を連ねています。~~イメージ戦略強い・・・~~

##転職時のスキルセット
- 実務経験が有る「ブロック線図」「c言語」「業界・製品ドメイン知識」の3本がメインウェポン
- プライベートで習得した広く浅くの技能をサブで使用（Linux、UML、python、各ディープラーニングツール、etc...を受ける企業に合わせて抜粋）
- 大学院では機械学習関連の研究をしており、国内外の学会での発表・受賞経験有り
- DeepLeaning G検定や人事総務系の資格も保有  

大学院の研究内容や資格は、面接時に話のタネになりました。

##転職戦術
自社開発志望でしたが、経験・スキル面でweb系は最初から狙いませんでした。
（スキルセット的に値切られる場所へ、わざわざ飛び込む理由もありませんし）
やりたい事と経歴を鑑みて、自社製品を持っているメーカーのSEが最適との結論に至り、エージェント経由で35社ほど書類を出しました。
数が多いのは、同職種とはいえSIer→メーカーと業界が変わる分の保険を兼ねたからです。
数撃った中で「一番やりたいけど一番難しい」と思っていた求人が現職なので、
世の中やってみないと分からないものです。

転職活動自体は多くの記事にあるような、オーソドックスな内容だったので細かくは書きません。
（知りたければ自分で調べて下さい、もっと良い記事がすぐ出てきます）
ただ、客先常駐転職の例に漏れず面接時間の工面が一番大変でした。
自社の制度として半休はあるけど顧客都合で使えませんし、
客先担当者から見える場所に居たので、朝遅い・帰りが早いと「何してるの？」と釘を刺されますし。
~~**契約は請負なのに！**~~

##転職して良かった事
客先常駐を脱出して、落ち着いた環境で念願の自社製品開発ができて非常に充実しています。
「あれウチで作ってるんだぜ」を言える環境だとモチベーションを高く保てます（個人差があります）

内容がR&D寄りなのもあり、高度なIT技術に関われて、いい刺激を受けています。
現職の方が IoT・AI・ML等の新しい技術への取り組みは進んでいます。レベルも高いです。
前職SIerで使わせてもらえなかったGitも、現職では普通に使っていました。
~~前職SIerの方が優れているのはExcel・PowerPoint芸と下請け管理スキルくらい・・・~~

あと、残業が減って年収が増えました。超うれしい。
福利厚生もハンパないです。社食はワンコイン未満で十分に食べられますし、
家賃だって一都三県住みで自己負担2万かそこらです。
老後の備えとして2000万蓄えるのだって可能です。

「大企業はオワコン」な風潮はありますが、社会的信用は歴史ある大企業の方が圧倒的に高いです。
（某所で見たPFN[パナソニック・富士通・NEC]は私でも笑いましたが）

##転職して大変な事、残念な事
先進IT技術に関われる分、新しい技術の吸収速度を必死で上げています。今までのスキルでは貧弱過ぎる。
プライベートでG検定取得したりしていた分は何とかなっていますが、
前職SIerの仕事で身につけた知識だけでは戦えません

また、ハードウェアの技能知識が必須なので、こちらもカバーしようと試行錯誤しています。
前職SIerに居た頃はテスト用ECUの配線がぎこちなくても許されていましたが、
今はその程度の事に時間を費やせません。

あと、大企業らしい古い文化はあるのは事実です。
検印待ち行列に数日かかったり、一部のやり取りはFAX文化（令和なのに！）が残っていたりします。

##結論（というか主張）
SEの転職だとweb系やベンチャー・スタートアップがもてはやされている昨今ですが、
**歴史ある大企業への転職も良い所はたくさんありますよ**と言いたい。
IT化が遅れている、無駄な慣習が多いと散々叩かれている大企業も、少しずつ変わってきています。

ソフトだけでできる事は限界がありますが、
メーカーだとソフト・ハード両面からアプローチできるので可能性が広がるのでは。
ビッグデータだって、センサーというインターフェース機械があってのものだと思います。

4カ月プログラミングスクールに通っただけで内定が出る類の仕事ではありませんが、
スキルセットが合う転職検討中の方は、メーカーへの転職という選択肢もいかがでしょうか。

そしてキラキラweb系やイケイケベンチャー系に負けないように情報発信していきましょう！
組み合わせ nCk  mod m を求める

$nCk \mod m$ の組み合わせの求め方を3つ紹介します。

間違っている、もっといい方法があるなどありましたらコメントで知らせていただけると嬉しいです。

# [求め方1] もっとも一般的な方法

フェルマーの小定理より

```math
a^p \equiv a \mod m
```

よって

```math
a^{-1} \equiv a^{p-2} \mod m
```

```Rust
// 冪乗余計算アルゴリズム
// a^b mod m を計算します。
fn pow_mod(a: i64, b: i64, m: i64) -> i64 {
    if b == 0  {
        1
    } else if b % 2 == 0 {
        let d = pow_mod(a, b/2, m);
        (d * d) % m
    } else {
        (a * pow_mod(a, b-1, m)) % m
    }
}

// nCc mod m を計算します。
fn combination(mut n: i64, c: i64, m: i64) -> i64 {
    let mut upe = 1;
    let mut dow = 1;
    for i in 1..c + 1 {
        upe = upe * n % m;
        dow = dow * i % m;

        n -= 1;
    }
    upe * pow_mod(dow, m-2, m) % m
}
```

# [求め方2] バイナリ法

[求め方1]より早いです。
バイナリ法はRSA暗号で冪乗余を計算する際に使用されたりします。

combination関数は上と変わりません。

```Rust
trait MOD<T> {
    // べき乗余計算アルゴリズム
    // a^n mod m を計算する
    // バイナリ法
    fn pow_mod(a: T, n: T, m: T) -> T;
}

impl MOD<i64> for i64 {
    fn pow_mod(mut a: i64, mut n: i64, m: i64) -> i64 {
        let mut res: i64 = 1;
        while n > 0 {
            if n & 1 == 1 {
                res = res * a % m;
            }
            a = a * a % m;
            n >>= 1;
        }
        res
    }
}

impl MOD<usize> for usize {
    fn pow_mod(mut a: usize, mut n: usize, m: usize) -> usize {
        let mut res: usize = 1;
        while n > 0 {
            if n & 1 == 1 {
                res = res * a % m;
            }
            a = a * a % m;
            n >>= 1;
        }
        res
    }
}
```

# [求め方3] 拡張ユークリッド互除法

今回紹介した3つの方法の中でもっとも速いです。
[別記事](https://qiita.com/Cassin01/items/181746c3bb6781aa6a73)に詳しく説明しました。

```Rust
// 拡張ユークリッド互除法
// 入力: 整数 u, v (u > v > 0)
// 返り値: e := v^{-1} mod u を満たす e (=t)
fn extended_euclidean(u: i64, v: i64) -> i64 {
    let mut r0 = u;
    let mut r1 = v;
    let mut s0 = 1;
    let mut s1 = 0;
    let mut t0 = 0;
    let mut t1 = 1;
    while r1 != 0 {
        let q = r0 / r1;
        let r = r0 - q * r1;
        let s = s0 - q * s1;
        let t = t0 - q * t1;
        r0 = r1;
        s0 = s1;
        t0 = t1;
        r1 = r;
        s1 = s;
        t1 = t;
    }
    if t0 < 0 {
        t0 + u
    } else {
        t0
    }
}

// nCc mod m を計算します。
fn combination(mut n: i64, c: i64, m: i64) -> i64 {
    let mut upe = 1;
    let mut dow = 1;
    for i in 1..c + 1 {
        upe = upe * n % m;
        dow = dow * i % m;

        n -= 1;
    }
    upe * extended_euclidean(m, dow) % m
}
```

# [PS] パスカルの三角形を使った方法

[パスカルの三角形を使ったnCk mod [備忘録]](https://qiita.com/Cassin01/items/f220ea316497ab6fc95e)


# 過去AtCoderでの出題

[abc123 D問題](https://atcoder.jp/contests/abc132/tasks/abc132_d)

[abc034 C問題](https://atcoder.jp/contests/abc034/tasks/abc034_c)

[M-SOLUTIONS プロコンオープン C問題](https://atcoder.jp/contests/m-solutions2019/tasks/m_solutions2019_c)

など

# 参考
[AtCoder abc034 解説](https://www.slideshare.net/chokudai/abc034)

[ビット演算 (bit 演算) の使い方を総特集！ 〜 マスクビットから bit DP まで 〜](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361)
WSLの`cron`

WSLはバックグラウンド実行できるようになり`cron`の実行もできますが、自動実行まではできません。
そこでWindows起動時に`cron`を立ち上げるよう以下のバッチをスタートアップに登録しています。

WSLには予め`expect`のインストールが必要です

```bat
wsl expect -c ^
"spawn sudo service cron start; ^
expect \"sudo\"; ^
send \"password\n\"; ^
expect \"$\"; exit 0;"
```
PHP7.4からのマルチスレッド

PHPで並列処理と言うと、マルチプロセスではpcntl、マルチスレッドではpthreadsを使う方法が一般的です。そのpthreadsについて、___PHP7.4以降のサポートの中止___が[告知](https://github.com/krakjoe/pthreads/issues/929)されました。PHP7から内部仕様が急速に変化しているためサポートが難しくなったようです。そこで、今後のPHPに対応できるよう新たに設計された拡張モジュールの開発が始まっています。
https://github.com/krakjoe/parallel

# Parallel
Parallelはpthreadsと比べるとAPIが大きく異なります。最新のマルチスレッディングモデルを採用しているので非常に使いやすくなっています。
使用する際は7.2以降のPHPで、pthreadsと同様にZTSでコンパイルしたものが必要です。

APIに関してちょっと詳しく説明した記事を書きました。
→https://qiita.com/WhiteGrouse/items/025227aff86416a1d720

https://www.php.net/parallel

↓README.mdに記載されているコードです。

```php
<?php
$runtime = new \parallel\Runtime();

$future = $runtime->run(function(){
    for ($i = 0; $i < 500; $i++)
        echo "*";

    return "easy";
});

for ($i = 0; $i < 500; $i++) {
    echo ".";
}

printf("\nUsing \\parallel\\Runtime is %s\n", $future->value());
```
tfenvを用いたterraformのインストール方法

業務でterraformを用いてAWSでインフラ構築を行ったので、インストールから実際の構築までまとめたいと思います。

今回はterraformのインストール手順を紹介します。

# 環境
- macOS Mojave 10.14.5
- MacBook Pro, 13-inch, Early 2015

#terraformのインストール方法
tfenvを使うとインストールとバージョン管理が楽なので今回はtfenvを用いたインストール方法を記載します。

- tfenvのインストール  

```
$ brew install tfenv
```

- インストール可能なバージョンを確認

```
$ tfenv list-remote
```

- terraformのインストール

```
$ tfenv install 0.12.0 # 上記で確認したバージョンを指定
```

下記コマンドでバージョンが表示されればインストールは完了しています。

```
$ terraform --version
Terraform v0.12.0
```


- AWSのcredentialを設定

AWSでインフラ構築する場合はAWSの認証情報を設定する必要があります。
以下は認証情報の設定方法です。

credentialファイルの作成

```
mkdir ~/.aws # ~/.awsのフォルダが存在しない場合
touch ~/.aws/credentials
vi ~/.aws/credentials
```

~/.aws/credentialsに`aws_access_key_id`と`aws_secret_access_key`を追記
(下記認証情報はIAMでユーザー作成した時に発行されます)

```~/.aws/credentials
[default]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key
```

操作するAWSのリージョンを指定したい場合は~/.aws/configに`region`を指定

```~/.aws/config
[default]
region = ap-northeast-1
```

実際にterraformでAWSのリソースを操作するためには他にも準備が必要ですが、terraformのインストールはこれにて完了です！

# AWSアカウントを複数使い分けたい場合
こちらにアカウントの切り替え方法まとめましたので、参照ください！


direnvを用いてterraformで複数のAWSアカウントを使い分ける方法
https://qiita.com/sasshi_i/items/609044aa106cdcb43a89
Unicornでデータベースが！

問題　
Unicornでデータベースが作れない！


rails db:migrate RAILS_ENV=productionが通らない！
仮説　unicornのlessを確認すると

```
 ERROR -- : Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) (Mysql2::Error::ConnectionError)
```
と出ている

 MySQLサーバーで使っているUNIXソケットとクライアントソフトで使っているUNIXソケットのパスが違う??
ソケットに問題がある？

検証したこと
・まずMysqlが正常に起動しているか

```
$ sudo service mysqld status
```
・ソケットの確認

```
$  mysql_config --socket
```
でソケットを確認してみた
database.ymlの[　production：　〜:socket]の記述と本番環境のソケットが一致しているか





<img width="601" alt="スクリーンショット 0001-06-29 18.39.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445389/56992b68-0f0d-512b-2cb7-c800764ff87c.png">
$ rails db:create RAILS_ENV=production入力後に
$ mysql -u root -pからmysqlをSHOW　DATABASEで確認すると、、、

原因
そもそも、$ rails db:create RAILS_ENV=productionでDatabaseが作られていなかった！


解決方法
database.ymlのproduction：に$ rails db:create RAILS_ENV=productionで作成されるデータベース名の指定を追加する
[　production：　〜database：データベース名]
￼
<img width="481" alt="スクリーンショット 0001-06-29 18.39.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445389/856ad367-a345-fe62-b795-43cffd50a32d.png">

```
production:
  <<: *default
  database: freemarket_sample_53a_production  ←これを追加
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```

これでデータベースが作られるようになった。めでたし
  

￼
kubectl patchのJSON KEYに"/"スラッシュが入っているのはなし

`kubectl patch`コマンドでPodのAnnotationsを修正したいですが、Keyが流行っている`abc.com/def`の形にして、エラーとなりました。

```shell
$ kubectl patch pod simple-pod --type='json' -p='[{"op": "add", "path": "/metadata/annotations/abc.com/my-key", "value": "abcde" }]'
The  "" is invalid
```

エラーメッセージはいい加減で、それは当然だ、KeyにJSON PATHの区切る符号が入ってるからじゃないかと思っていました。。

エスケープしようとして、バックスラッシュはだめでした。調べたどころ、`/`を`~1`しなければなりません。


```shell
$ kubectl patch pod simple-pod --type='json' -p='[{"op": "add", "path": "/metadata/annotations/abc.com~1my-key", "value": "abcde" }]'
pod "simple-pod" patched
```

結果OKです。

```shell
$ kubectl get pods -o yaml   
```

```yaml

apiVersion: v1
items:
- apiVersion: v1
  kind: Pod
  metadata:
    annotations:
      abc.com/my-key: abcde
```
Debian/Ubuntuのロケールを日本語にする方法

最近、Dockerを使えるようになってプログラミングのスピードがとても早くて楽しいです。
環境構築に手間取っていた時期が懐かしいです。

けど、立ち上げたDockerコンテナは、デフォルトのロケールが日本語に対応してないので、locale変更する必要がありますよね。
毎回、設定方法を調べてやっているので、メモとして残しました。


# Debinの場合

```bash
# root環境
apt-get update
apt-get install locales -y
# ja_JP.UTF-8の行のコメントを解除
sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen
locale-gen
update-locale LANG=ja_JP.UTF-8
```

# Ubuntuの場合

```bash
# root環境
apt-get install language-pack-ja
update-locale LANG=ja_JP.UTF-8
```

# bashに書き込み読み込む(共通)

```bash
# root環境
echo 'export LANG=ja_JP.UTF-8' >> ~/.bashrc
source ~/.bashrc
```
AtCoder Beginner Contest 132をRubyで解いてみた

# [A - Fifty-Fifty](https://atcoder.jp/contests/abc132/tasks/abc132_a)

```Ruby
s=gets.chomp.chars
f=0
4.times do |i|
  if s.count(s[i])!=2 then
    f=1
  end
end
puts f==0 ? 'Yes' : 'No'
```

各文字について2文字ずつ存在するか評価します。
[解答例](https://atcoder.jp/contests/abc132/submissions/6166448)

# [B - Ordinary Number](https://atcoder.jp/contests/abc132/tasks/abc132_b)

```Ruby
N=gets.chomp.to_i
P=gets.chomp.split.map(&:to_i)
c=0

(N-2).times do |i|
  if ((P[i] < P[i+1]) && (P[i+1]< P[i+2])) || ((P[i] > P[i+1]) && (P[i+1]> P[i+2])) then
    c+=1
  end
end

puts c
```

p(0)~p(N-2)まで
p(i)\<p(i+1)\<p(i+2) または p(i)>p(i+1)>p(i+2) の条件の個数を算出します。
[解答例](https://atcoder.jp/contests/abc132/submissions/6169517)

# [C - Divide the Problems](https://atcoder.jp/contests/abc132/tasks/abc132_c)

```Ruby
N=gets.chomp.to_i
D=gets.chomp.split.map(&:to_i).sort!
a=D[D.size/2]-D[D.size/2-1]
puts a
```
下記の２つが同値なため、ソートして N/2 番目の要素と N/2 - 1 番目の要素の差で求められます。[解説PDFより](https://img.atcoder.jp/abc132/editorial.pdf)

- N/2 番目に難しい問題が「ARC 用の問題」、N/2 − 1 番目に難しい問題が「ABC 用の問題」となる
こと
- 「ARC 用の問題」の数と「ABC 用の問題」の数が同じになること

(解答例)[https://atcoder.jp/contests/abc132/submissions/6189546]

# おわりに
C問題時間内に閃かなかった。。。
D問題以降は解けるようになったら追記します。
Macbookのキーボードのキーが反復入力される場合の対処法

## Macbookのキーボードのキーが反復入力される場合の対処法
結論から言うと、アップルもこの問題については非を認めており、無償交換プログラムがあります。
https://support.apple.com/ja-jp/keyboard-service-program-for-mac-notebooks

### 体験談
頻繁に使用しているMacbookPro2018の「N」キーが稀に反復入力を起こすようになりました。そこで銀座アップルのジーニアスバーにPCを持ち込み診断してもらったところハードウェアの問題と判明し、無償交換プログラムを説明してもらいました。

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
正規化・非正規化のトレードオフ

#前段
勤めている会社で新システムのテーブル構造を作る上で、どこまで正規化するか困ったので勉強してみました。
今回は、『達人に学ぶDB設計徹底指南書』(著：ミック)より学んだ内容と先輩に伺った内容を自分用にまとめました。

#正規化のメリット・デメリット
正規化することで生まれるメリット・デメリットを今一度確認

###メリット
####・データの整合性が保たれる。

…正規化を進めるとデータの冗長性が排除される。
冗長性が排除されることで、①データ登録時に懸念される不都合、②オペレーションミスによるデータ不整合の2点の減少が期待できる。

####・テーブルの意味が明確になる。
　　　
…正規化が進めば、テーブルが持つ情報は最小単位になるので。

###デメリット
####・SQLのパフォーマンスが落ちる可能性がある。

…テーブルが分割されれば、SQL発行時に結合を必要とする場面が増える。パフォーマンス悪化の原因になる。

#正規化・非正規化のトレードオフ
非正規化を選ぶ際に考慮すべき事項

前提；正規化はできるならする。（少なくとも第3正規化くらいは）
　　　その先をどこまで正規化するかという点で以下の点が考慮されうる。

####・検索時・更新時のパフォーマンス

非正規化は検索時のパフォーマンスは向上させるが、データ更新を行う際のパフォーマンスは低下させる。
非正規化することでインデックスがより機能し検索のパフォーマンスが上がる一方で、
更新処理を行う際には、非正規化した分、負荷がかかるようになる。

####・カラム数は増える可能性はあるか？
　　
今後カラムが増える余地がある項目の場合、非正規化するとカラムが増えるごとにALTERしないといけないなど不都合が増える

####・製造工数
　　
正規化すれば、SQL作成時に表結合する場面は増え、求めるデータの形によってはSQLが難解になる。
これによって製造工数が非正規化した時よりも膨らむ可能性がある。
Pythonのprintで%dや%sを使う方法やformatメソッドについてもメモ書き

# はじめに
しがない地方大学院生をしています、Sotaです。
プログラミング初心者のため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するので、どんどん指摘してください。

自分はC言語からプログラミングを勉強したので、%dや%fの表現に慣れています。
そのため、桁数指定などで、ストレスを感じたので、Pythonでも%dや%fを使える表現をメモします。

# Pythonで%dや%sを使う

Pythonでprintf関数のような表現を使うには、
` '文字列' % 変数 ` とすれば記述できます。
(例)

```Python
y = 10000
d = 100

print('100$は%d円' % y) #100$は10000万円
print('%d円は%d$' % (y, d)) #10000万円は100$

```

このような感じです。
もちろん文字列やfloat、桁数指定`%.2f`なども可能です。
# formatメソッド

文字列メソッド`format()`でも似たような書き方ができます。
文字列中に置換フィールド`{}`が指定した引数と対応して置換されます。
`文字列.format(変数)`と書きます。
(例)

```Python
y = 10000
d = 100

print('100$は{}万円'.format(y)) #100$は10000万円
print('{}万円は{}$'.format(y, d)) #10000万円は100$
```
AppDelegateでのPUSH通知の受信処理

# はじめに
iOSでPUSH通知を受信する時のAppDelegateのメソッドをまとめておきます。
**2021年6月追記** : Xcode 12では、`UIKit App Delegate`と`SwiftUI App`が選択できる。`UIKit App Delegate`を選択した場合は、`AppDelegate`と`SceneDelegate`がある。本記事は、ios12で利用されていた`AppDelegate`を利用した場合のことを記載している。


# 環境
- Xcode : 10.2.1 (2019年7月), 12.5 (2021年6月確認)
- ios : 12.3.1 (2019年7月), 14.6 (2021年6月確認)


# AppDelegateでのPUSH通知の種類
iosアプリがPUSH通知を受信する種類は以下の3つがあります。
以下ではそれぞれを説明します。

- アプリが起動していない時にPUSH通知を受信した場合
- アプリが起動している時にPUSH通知を受信した場合
- バックグランドPUSH通知を受信した場合

###  アプリが起動していない時にPUSH通知を受信した場合
アプリが起動していない時にPUSH通知を受信した場合は、通知センター等に通知されます。この通知をタップするとアプリが起動されます。アプリが起動される時には、AppDelegateの以下のメソッドが呼ばれます。

``` swift
userNotificationCenter(_:didReceive:withCompletionHandler:)
```

### アプリが起動している時にPUSH通知を受信した場合
アプリが起動している時(Foreground)は、AppDelegateの以下のメッセージが呼ばれます。通知センターには表示されません。

``` swift
userNotificationCenter(_:willPresent:withCompletionHandler:)
```

### バックグランドPUSH通知を受信した場合
画面にPUSH通知表示せず、アプリが起動していない状態でも、PUSH通知を受信した時に30秒間だけアプリを起動して処理を実行できるバックグランド通知があります。通知メッセージには`content-available`を入れます。サーバ側からのPUSH通知に関しては、以前の[記事](
https://qiita.com/KenNagami/items/61e147e1db1b216a86bc)を参照ください。

バックグランドPUSH通知を受信するためには、Xcodeのプロジェクトで、以下のようにCapabilityでRemote Notificationsにチェックを入れます。これによって、バックグランドPUSH通知を受信することができます。

<img width="600" alt="background Notification.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/8b28a52c-3b29-3a7b-dc70-298df2babe8b.png">

バックグランド通知を受信した場合は、AppDelegateの以下のメソッドが呼ばれます。

``` swift
application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 
```


# 参考文献

- [PUSH通知受信(userNotificationCenter(_:didReceive:withCompletionHandler:))](https://developer.apple.com/documentation/usernotifications/unusernotificationcenterdelegate/1649501-usernotificationcenter)
- [PUSH通知受信(userNotificationCenter(_:willPresent:withCompletionHandler:))](https://developer.apple.com/documentation/usernotifications/unusernotificationcenterdelegate/1649518-usernotificationcenter)
- [バックグランド通知](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_background_updates_to_your_app)
仙台CTF2018 Net.1 工場用PCの調査 100

#問題

http://ctf.sectanlab.jp/2018/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f5aff5df-3307-cc17-c292-8be5f1c03dfc.png)


#解いてみた

ファイルをダウンロードするとpcapファイルでした。
wiresharkで開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/cc356d55-c16a-d064-e6b2-f9e6abe57f59.png)

たくさんパケットがあります。
感染を拡大させようとしているくらいだから、通信パケットが多いのが答えですかね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9a655f8e-8541-8b9b-e293-11cc6e6c3b5c.png)

正解でした。
正解画面すぐ消えるのでキャプチャは難しそうです。。。
LeetCode / Length of Last Word

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/07/19/230538)からの転載）

[https://leetcode.com/problems/length-of-last-word/]

Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the length of last word in the string.

If the last word does not exist, return 0.

Note: A word is defined as a character sequence consists of non-space characters only.

Example:

Input: "Hello World"
Output: 5

Discussionで<b>'This problem is not fun at all'</b>とか言われちゃってましたが、、、LeetCodeは個人的にはなかなか難易度高い問題も多いので、こういう箸休め的問題は欲しいなと思います。
英単語で構成された文の中で、末尾の単語の長さを返す問題です。

#### 解答・解説

##### 解法1
リストlsに対して、2つのポインタとなる変数slow, fastを用意し、slowは末尾の単語の末尾を、fastは末尾の単語の先頭のインデックスを返すように計算します。
末尾の単語の長さを判定するので、リストを逆向きにループさせていきます。
まず、slowは初期値を-1とします。list[-1]とするとlistの末尾の要素を示すのは自明ですね。そこから逆向きにループさせて、ブランクでない位置まで辿ります。
通常、'Hellow World'のように末尾の単語の後ろにブランクはなく、slowは初期値の-1のまま（ループは進まない）になることが多いと思います。

```python
ls = len(ls)
slow = -1
while slow >= -ls and s[slow] == ' ':
    slow -= 1
```

次に、fastは初期値をslowと同値とします。そこから逆向きにループさせて、ブランクの位置まで辿ります。

```python
fast = slow
while fast >= -ls and s[fast] != ' ':
    fast -= 1
```

最後に、slow - fastとすれば、末尾の単語の長さを計算できます。
まとめると以下のようになります。

```python
class Solution:
    def lengthOfLastWord(self, s: str) -> int:
        ls = len(s)
        slow = -1
        while slow >= -ls and s[slow] == ' ':
            slow -= 1
        fast = slow
        while fast >= -ls and s[fast] != ' ':
            fast -= 1
        return slow - fast
```

##### 解法2
1 line solutionを示して、今日は終わります。rstripで文末の余計なブランクを剥ぎ取ってしまうという力技。

```python
class Solution:
    def lengthOfLastWord(self, s):
        return len(s.rstrip(' ').split(' ')[-1])
```
バーチャル脱出ゲーム：バリデーションからの脱出（問題編）

[Rubyのサンドボックスを作って、evalするBotを作った](http://tolarian-academy.net/ruby-sandbox-eval-bot/)という記事をこの間読んだんですよ

この記事自体は大分前のものですが、最新版を突破できないかと試行錯誤している時に「もしバリデーションでサンドボックスを作ろうとしたら」とか考えまして

まあ、軽く考えてブラックリスト方式はもちろん、ホワイトリストでもまず無理だと思いましたが

今回の問題は、その際に軽く考えた内容をベースにしたものです

# 問題

```quiz.rb
class Tester < Ripper::Filter
  def on_ident(name, *)
    raise
  end
end

code = gets

Tester.new(code).parse
eval(code)
```

# ルール
上記スクリプトの eval(code) に到達し、'escape!' を何らかの形で出力すればok
実は結構色々出来ます

# 予備知識
RipperはRubyコードをパースするライブラリで、on_identはローカル変数っぽいもので呼ばれます
で、rubyのメソッドの呼び出し方はわりとローカル変数っぽいので、ここに投げ込まれます
つまり大まかに言えば、普通のメソッドっぽいものが書かれていた時点でエラーになります

# 最後に
回答編は日曜夜を予定しています
ゆっくりかんがえていってね！！！
Unity チュートリアル（１）play & edit mode

Unityでゲームを作るときの基本手順
　・自分のゲームに変更を加える
　・自分のゲームをやってみて変更をテストする
gameを繰り返し繰り返し試してみて、どうやってゲームをテストするかを学ぶってことで。
![コメント 2019-07-19 223133.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/d8b766e2-413d-e593-ded1-800f04a91ebb.gif)

光ってるやつがチュートリアルウィンドウね。
![コメント 2019-07-19 223226.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/f7895d23-b785-e8bd-1aa6-1ab70e508b00.gif)

今光ってるウィンドウがシーンビュー
このなかでゲームを作るようだ。
![コメント 2019-07-19 223330.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/8f4c9794-52ac-3df8-ed41-0c31eea99291.gif)

今光ってるウィンドウがgameビュー
プレイヤーがゲームやってるときの画面の見え方はコッチになる。
![コメント 2019-07-19 223429.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/4766aef5-0d7b-01a8-bc8f-c8828a88eed5.gif)

画面上部のプレイボタンを押して遊んでみよう～ってことで。
![コメント 2019-07-19 223511.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/a7a752ef-d6a2-0be9-a507-9e60ca49288d.gif)

方向キーを押したら動くっぽい。確かに動く。
![コメント 2019-07-19 22362ｈ9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/e71577fe-075c-fc9d-ca4a-071cf23735af.gif)

クリアした。どっちかというとgameビューから見たらどんな感じかを見てみてって感じ。
![コメント 2019-07-19 223722.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/d00ec52b-5148-f624-9352-e71bfc21c046.gif)

![コメント 2019-07-19 223752.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/f169624a-903b-8e7a-451c-63e7e3284536.gif)

ここでまとめのようだ。
　エディター使ってgameテストしてね、とのこと
　プレイモードとエディットモードの動かし方
がこれでわかったねってことらしい。
![コメント 2019-07-19 223828.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/5147d3e0-15bf-e421-b46e-c4856f7017bf.gif)

～おしまい～
create-react-app --typescriptでejectした後に動かなかったとき

create-react-appを利用した際に、ejectしたときに動かず一瞬困ったので、記事として書いておきます。

といっても、記事にするほどのものでもなくすごくシンプルな対処です。

- create-react-app: v3.0.1

```zsh
create-react-app my-app --typescript
```

まずこれでreactのアプリケーションが作れます。
さて、ejectしてstartしてみます。

```zsh
cd my-app
yarn eject
yarn start
```

すると、私の環境では以下のようなエラーが出てきました。

```
Cannot find module '@babel/plugin-transform-react-jsx-source'
```

解決方法は非常にシンプルですが、node_modulesを一旦全部消して再度インストールするだけです。

```zsh
rm -rf node_modules
yarn install
```
ExcelのPowerQuery便利リンク集

## PowerQuery便利リンク
[ExcelでPowerQueryを使ってデータ収集分析	](https://qiita.com/mosugi/items/71df310b35db81722d1e#m%E8%A8%80%E8%AA%9E%E3%81%AE%E6%83%85%E5%A0%B1)
とっても参考になる入門編。下部の「役に立つリンク」が実際役に立つ。

[Excel で Power Query を使い始めるには](https://qiita.com/PowerBIxyz/items/52e563037b855a099ca9#%E6%83%85%E5%A0%B1)
バージョン別の違いなどがよくまとまっていて参考になる。

[Power Query 101](https://support.office.com/ja-jp/article/power-query-101-008b3f46-5b14-4f8b-9a07-d3da689091b5)
[複数のデータ ソースからデータを結合する (Power Query)](https://support.office.com/ja-jp/article/%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF-%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B-power-query-70cfe661-5a2a-4d9d-a4fe-586cc7878c7d)
とりあえずの公式チュートリアル

[Understanding Power Query M functions](https://msdn.microsoft.com/en-us/library/mt185361.aspx)
PowerQueryの記述言語であるM言語のリファレンス

## PowerQuery TIPS系リンク
[[Power Query] 大量のデータベースから、セルに指定した条件でデータを取り出したい](https://road2cloudoffice.blogspot.jp/2017/03/power-query.html)
セル入力条件でテーブル全体を変えたいときに。パラメータの選択をクエリ発行のトリガにできる。
		

[ExcelでPowerQuery式を使用する](https://support.office.com/ja-jp/article/Excel-%E3%81%A7-Power-Query-%E5%BC%8F%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-8e5e49a2-01c2-496e-b639-41f98f163238)
詳細エディターの使い方。

[Excel ユーザーのための Power Query](https://road2cloudoffice.blogspot.jp/2014/12/excel-power-query.html)
PowerQueryのテーブルマージ機能

## PowerQuery TIPS系リンク（英語）

[Power Query and Stored Procedures with Parameters](https://reevessmith.wordpress.com/2014/08/19/power-query-and-stored-procedures-with-parameters/)
PowerQueryでパラメータ付きでストアド実行。
ちなみにSQLServerが対象。Oracle(PL/SQLのFunction/Procedure)はPowerQueryでは非対応。

[Exporting Power Query tables to SQL Server](https://querypower.com/2017/04/04/exporting-power-query-tables-to-sql-server/)
PowerQueryのデータをSQLserverへ読み込む。XMLやJSON形式でのインターフェースも可能。

[Json.ValueFrom](https://msdn.microsoft.com/en-us/library/mt637075.aspx)
Excel上のデータをJson化する

[Refresh Power Query With VBA](https://www.excelguru.ca/blog/2014/10/22/refresh-power-query-with-vba/)
PowerQueryのテーブルをVBAで更新する。

[Enable or Disable Background Refresh on All Power Query Connections](https://www.excelcampus.com/library/enable-background-refresh-on-all-power-query-connections/)
PowerQueryのテーブルをバックグラウンド処理する。

[11 updates to Power Query](https://blogs.office.com/en-us/2015/05/08/11-updates-to-power-query/)
PowerQueryのNative Database Queryの警告を抑制する方法。
ラズパイと安価なウェブカメラで安定した定点観測（スチル）システムを作る方法（UVCウェブカム＋Stretch）

## よくある話、では済まなかった

ラズパイで定点観測カメラ、よくある話だと思っていたのですが、実際に長期運用してみると問題がありました。定期的なスチル撮影の場合について、克服したと思われるのでまとめておきます。

USB接続のウェブカメラ、いわゆるUVC (USB Video Class)のものをつないだ時、少なくともRaspberry Pi 3B / Rasbian Stretchでfswebcamコマンドを使う場合、問題がありました。Busterでは問題無くなっていると良いのですが。

## どんな問題だったか、そして、解決方法は

長期運用、と言っても数時間から1日ほどで発生する高頻度で、しばしばカメラがコマンドを受け付けなくなりました。しかも、時々システム再起動するぐらいでは回避できない。

解決方法は、ドライバーモジュールのunload / reloadという、原始的な対処療法。しかも、撮影後にキレイにしとく、程度ではダメで、毎回の撮影前に行う必要あり。カメラの型番、メーカーが変わっても同じ。問題発生時にもシステム全体的には特別におかしなことは起きておらず、ドライバーとカメラの接続だけがおかしい状況。

### 実際のスクリプト、キモの部分。
これを撮影前に毎回行う。fswebcamコマンドが悪いのか、UCVドライバーが悪いのか。根本的な原因は不明のまま。世界的にも解決はされていないと思われる。

```
sudo /sbin/rmmod uvcvideo
sudo /sbin/modprobe uvcvideo
```

## システム概要

 - 5分毎に撮影。 日の出 - 日の入りの時間帯には、毎分撮影。
 - 日の出 - 日の入りの撮影前にシステム再起動、撮影後にタイプラプスムービーを作成、サーバーにアップロード。
 - １日撮影後にタイプラプスムービーを作成、サーバーにアップロード。再起動。
 - タイミングごとにメール送信も行う。

### 詳細は他の記事に掲載予定

 - 「ラプスムービーの作り方」ffmpegコマンドを使う。
 - crontabによってスクリプト起動や再起動をして、上記スケジュールを実現。「crontabの使い方」
 - メールサーバーを立てずにメール送信。「ラズパイからメールサーバーを立てずにメール送信」
 - アップロードはncftpputコマンドを使い、ブックマークを活用、パスワードをスクリプトに書かなくても良い。「ncftpputでラズパイからレンタルサーバーにアップロード」
 - アップロード先ではjsでブラウジングを可能に。lightbox-plus-jquery.js
 - 撮影はfswebcamコマンドを使い、上下反転やタイトル設定、サムネール生成など。「fswebcamコマンドの使い方」
jsのsplit()で区切り文字を残す

```js
  
  let str = 'a1:b2:c3:d4:e5:f6::';
  console.log(str.split(':')); //普通
  // ["a1", "b2", "c3", "d4", "e5", "f6", "", ""]
    
  console.log(str.split(/[1-9]/g));//正規表現
  //["a", ":b", ":c", ":d", ":e", ":f", "::"]
  
  console.log(str.split(/(:)/g));//区切り文字も一つの要素として分割する
  //["a1", ":", "b2", ":", "c3", ":", "d4", ":", "e5", ":", "f6", ":", "", ":", ""]

  console.log(str.split(/(?<=:)/g));//区切り文字を直前の要素に含める
  //["a1:", "b2:", "c3:", "d4:", "e5:", "f6:", ":"]

  console.log(str.split(/(?=:)/g));//区切り文字を直後の要素に含める
  //["a1", ":b2", ":c3", ":d4", ":e5", ":f6", ":", ":"]
```
Textastic＆Working Copyで、iPhoneにコーディング環境作った話



# Textastic＆Working Copyで、iPhoneにコーディング環境作った

# はじめに

- 平日、もう少し隙間時間を勉強にあてがいたい。
- PCを持ち歩けない出先でも、細かい修正したり、githubに草生やしたい。

そんな感じで、iPhone6上に環境を作った話。

## 参考にした先駆者

[iPhoneでも快適プログラミング！ with GitHub](https://www.hobbby.net/pc/programing/post-403/)
[Working_CopyとTextasticでモバイル開発環境(導入編)](http://ninna2.hatenablog.com/entry/2017/03/06/Working_Copy%E3%81%A8Textastic%E3%81%A7%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%28%E5%B0%8E%E5%85%A5%E7%B7%A8%29)
[iOSアプリWorking CopyとTextasticでgitが使えるモバイル開発環境を作る](https://liginc.co.jp/323828)

上記参照すれば、ほとんどの方は問題なく環境構築完了すると思う。
今回は上記を参考にする中で、現在は変わっていること、個人的に詰まったポイントに重きを置いて書いていく。

# インストール

## Textastic
「Textasticはいいぞ！」という先人たちの声を信じてインストール。
無料版なども特になく、1200円のアプリをインストールする緊張感。
ソシャゲへの万課金は躊躇わないのにな。

## git2go
pushまで無料で出来るとのことで「これだ！」と思ったものの、現在は配信終了しているよう。(2018年6月現在)
公式サイトは残っているので、いつか改良版が出るのかも。

## Working Copy
git2go以外で多くの人がおススメしていたこちらを導入することに決定。
commitまでは出来るものの、pushは有料ユーザー機能。1300円?で機能のロックを解除できる。
ちなみに、お試しで10日間だけ、無料でpush機能のロックを解除できた。

# いざ構築

##1. Working Copyでの作業
Appストアからインストール後、起動するとリポジトリー画面が表示される。
右上の+ボタンを押して「Clone repository」でClone。
初めは認証情報を聞かれるので、入力してsign in。

ここまでは、他の方が上げて下さっている情報通りに、問題なく作業できた。

##3. Textasticでの作業

### TextasticでWorking Copyのデータへアクセス
参考にした先駆者たちの解説では、

1. 「Open...」から「Working Copy」を選択
1. クローンしてあるリポジトリ一覧が表示される

とのことだったが、以下の2点で戸惑った。

- 「Open...」がなく、「Open File or Folder」がある
- 「Open File or Folder 」を押してみたがWorking Copyが表示されない

まず一点目についてだが、「Open」は「Open File or Folder 」と読み替えて問題ない。
インストールしたTextasticがバージョン8だった為、以前のものと変更があったのかもしれない。

つぎに二点目だが、「Open File or Folder」の選択肢から「その他」(英語版だとMore?)を選ぶと、
その中にWorking Copyを見つけることができた。わかりにくい…。

Working Copyを選択すれば、無事にアクセス完了。
次回からは「その他」の配下ではなく、「Open File or Folder」の選択肢にWorking Copyが表示されるようになる。

### Working Copyのリポジトリを、Textasticで開く
次にリポジトリを開く手順。個人的にハマったので詳しく書いておく。

- 「Open File or Folder」→「Working Copy」で、リポジトリの一覧を表示。

<img width="375" alt="IMG_0735.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445857/ecfff227-c7d8-9072-d8d8-3f16e9abd504.png">


- 右上の「選択」を押す

<img width="375" alt="IMG_0736.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445857/e291d90b-bfd4-28ae-ccc6-067991cdfa39.png">

- 開きたいフォルダをチェックして「開く」

- トップに表示されるようになるので、そこからフォルダ内を参照できる

「選択」→「開く」でなくとも、フォルダ自体をタップして配下のファイルを開くことは可能。
ただその場合、プレビュー機能が使えなかった。
(アイコンが表示されず、Safariでのプレビューが使えない。)

「Working Copyのリポジトリを直接見に行っている」か「Textastic上でリポジトリを開いている」かの違いなのか…？
詳しいことは、あまり調べていないのでよくわからないが。

### 編集とプレビュー

ここまでくれば、あとは先駆者の情報とそれほど際もなく、直観的に操作していけば問題なさそうだ。
最後に一点、左下のサングラスアイコンがプレビューボタン。何故サングラスなのだろう。

<img width="375" alt="IMG_0744.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445857/0bb3873d-c4fa-06cf-5fdf-a3bd94dd4df5.png">


## まとめ
以降、PC上でコミット時は、WorkingCopy上でfetchしてpullすれば、Textasticでは最新のコードを確認できる。
CSSで簡単なお絵かきして遊ぶ程度は可能になったので、概ね満足。

今回は、iPhone6上での作業のため、もしかしたら機種による差異があるかもしれない。
未検証の為、そのあたりはご容赦いただきたい。

環境構築後、とりあえず作ってみた米のイラストでお別れ。

<img width="375" alt="IMG_0745.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445857/8b6b171f-b8ca-c589-d266-c69e9e263b39.png">
JavaScriptのスプレッド構文(...)ことはじめ

## スプレッド構文とは
ドットを3つ使用した構文(`...`)で、[公式の回答](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)では

> 関数呼び出しでは 0 個以上の引数として、Array リテラルでは 0 個以上の要素として、Object リテラルでは 0 個以上の key-value のペアとして、Array や String などの iterable オブジェクトをその場で展開します。

長くてわかりにくいですが、スプレッド構文を使える場所が下記のようになっています。

1. 関数呼び出し `function(...hoge)`
2. array `[...hoge]`
3. オブジェクト `{ ...hoge }`

### iterableオブジェクトって？
iterableは繰り返し可能なという意味の単語です。
繰り返しの処理(for)で扱えるオブジェクトかどうかということだと認識しています。
for文の中で使われる`i`は`iterater`の`i`だという話は聞きますね。

そしてそのようなオブジェクトを展開してくれる構文がスプレッド構文だそうです。

## 具体例
先ほどの公式の例にログを追加したものです。
これで`numbers`が展開されて、それぞれの引数`x,y,z`に入っていることがわかります。

```js
function sum(x, y, z) {
  console.log(x)
  console.log(y)
  console.log(z)
  return x + y + z;
}

const numbers = [1, 2, 3];

console.log(sum(...numbers));
// 1, 2, 3, 6

```

### 便利な使い方
便利だから色々と使えますが、ここら辺の使い方を知っておくと便利だなと思いました。

#### html要素を取得して配列として扱う
> odeList や HtmlCollection を配列のように操作する

このコードでは、特定のクラスの要素を取得して、それをスプレッド構文で展開して、配列として扱っています。
そのためそのままfilterメソッドがしようできて、取得したクラスの要素一覧から、特定の要素のみを抜き出すということができます。

```js
const elems = document.getElementByClassName('checkboxClassName');
const filtered = [...elems].filter(el => el.checked && el.classList.contains('foo'));

// こうもかける
const filtered = [...document.getElementByClassName('checkboxClassName')].filter(el => el.checked && el.classList.contains('foo'));
```

#### 連番の作成
ちょうど少し前にスプレッド構文を使用して連番を作成する記事がありました。
[JavaScriptで[ 0, 1, 2, 3, 4 ]のような連番の配列を生成する方法](https://qiita.com/suin/items/1b39ce57dd660f12f34b)


## スプレッド構文を使わない場合はどのように書くか？
### apply
[Function​.prototype​.apply()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)を使うと同じようなことができるそう。

> apply() メソッドは与えられた this 参照値と、配列 (もしくは配列風のオブジェクト) の形で与えられた引数を用いて関数を呼び出します。

```js
console.log(sum.apply(null, numbers));

// スプレッド構文を使った方がシンプル
console.log(sum(...numbers));
```


## 参考
使い所については、この記事わかりやすかったです。
[【JavaScript】スプレッド演算子の便利な使い方まとめ](https://qiita.com/Nossa/items/e6f503cbb95c8e6967f8)