OmniAICreator/Qiita-1.07M huggingface dataset:
deno v0.30.0の変更点

## 概要

https://github.com/denoland/deno/releases/tag/v0.30.0

denoのv0.30.0がリリースされたため、変更点をまとめます。

## 新規機能/主要な変更点

### スクリプト引数を`--`以降に渡す修正がrevertされた

https://github.com/denoland/deno/pull/3681

[v0.29.0](https://qiita.com/uki00a/items/c8f888dfaf137b5cb865#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E5%BC%95%E6%95%B0%E3%81%AF--%E4%BB%A5%E9%99%8D%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%95%E3%82%8C%E3%81%9F)で実施された変更がrevertされました。

スクリプト引数の扱いはv0.28.1以前と同様の挙動になります。

### `Deno.stat`の返却値に新しいプロパティが追加された(非Windows環境のみ)

`Deno.stat`から返却されるオブジェクトに下記プロパティが追加されました。

|プロパティ|説明|
|---|---|
|dev|ファイルを含むデバイスのID|
|ino|node|
|nlink|ハードリンクの数|
|uid|所有者のユーザID|
|gid|所有者のグループID|
|rdev|デバイスID|
|blksize|ファイルシステムIOのブロックサイズ|
|blocks|ファイルに割り当てられたブロック数|

https://github.com/denoland/deno/pull/3680

### `req.response`でレスポンスボディとして文字列を渡せるようになった

下記のように`req.respond`を実行する際に、`body`に直接文字列を渡せるようになりました。

```typescript:v0.30.0
import { serve } from "https://deno.land/std@v0.30.0/http/server.ts";
const server = serve({ port: 8000 });
for await (const req of server) {
  req.respond({ body: "hello" }); // v0.29.0以前までは、`req.respond({ body: new TextEncoder().encode("hello") })`のようにエンコードする必要があった
}
```


https://github.com/denoland/deno/pull/3705


### Node.jsのタイマーAPIのポリフィルが追加された(std/node)

`setImmediate`や`clearImmediate`等が実装されています。

```typescript
import { setImmediate } from "https://deno.land/std@v0.30.0/node/timers.ts";

setImmediate(() => console.log('hello'));
```

https://github.com/denoland/deno/pull/3634

### `Deno.symbols`が追加された

それに伴い`customInspect`の使用方法が若干変わります。

```typescript:v0.30.
const greeter = {
  name: 'hoge',
  [Deno.symbols.customInspect]() { // v0.29.0以前は`Deno.customInspect`を使用する
    return `My name is ${this.name}.`;
  }
};
console.log(Deno.inspect(greeter)); // My name is hoge.
```

https://github.com/denoland/deno/pull/3693

### gzip/brotliとETagがサポートされた

https://github.com/denoland/deno/pull/3597

リモートファイルのフェッチ時のgzip/brotliによる圧縮がサポートされました。

また、ETagヘッダを利用したキャッシュの実装が行われています。

## その他の修正点

- `Worker`内でUncaughtエラーが発生した際のハンドリング
  - https://github.com/denoland/deno/pull/3665
  - `Worker.onerror`で発生したエラーを受け取れるようになりました。
- std/multipartが削除された
  - https://github.com/denoland/deno/pull/3647
  - std/mime/multipart.tsと重複していたため削除されました
- `fetch`を呼ぶとプロセスが停止しなくなる問題が修正された
  - https://github.com/denoland/deno/pull/3657
- 過去のコンパイル結果をキャッシュすることで、TypeScriptのコンパイルが高速化された
  - https://github.com/denoland/deno/pull/3644
  - おおよそ1.5倍ほど高速化されているようです。
- リモートファイルをフェッチする際にHTTPクライアントが共有されるようになった
  - https://github.com/denoland/deno/pull/3683
Google Tasksを単独で新しいタブで開く

このURLを開くだけ。
https://tasks.google.com/embed/?origin=https://mail.google.com&fullWidth=1

ここからダイレクトされて最終的に違うURLになるので注意。


もちろん、VivaldiのWebパネルにも入れられます。

<img width="1649" alt="スクリーンショット 2020-01-19 20.47.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77782/a9711a89-9a78-1ce2-0a57-eaa4c547ff2a.png">
Ultra96v2 で device tree overlay を使って FPGAのimageを制御


ここを参考にして、device tree overlay を使ってFPGAのimageを制御
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841645/Solution+Zynq+PL+Programming+With+FPGA+Manager

Host側のpetalinux のimage/linux フォルダ以下にFull_Bitstream.bifというファイルを作成

~~~
$ cd ./image/linux
$ cat Full_Bitstream.bif
all:
{
                design_1_wrapper.bit /* Bitstream file name */
}
~~~

petalinux/tools の下にあるbootgen をいうツールを使って、bitstream file を .binに変換する。

~~~
$ ./../../../petalinux/tools/xsct/bin/bootgen -image Full_Bitstream.bif -arch zynqmp -p
rocess_bitstream bin


****** Xilinx Bootgen v2019.2
  **** Build date : Oct 23 2019-22:59:42
    ** Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
~~~

image/linux フォルダにできたdesign_1_wrapper.bit.binとpl.dtboをsdカードにコピー。

Ultra96V2側で上で以下を実行、すでにconfigfsが有効になっていてmountもされている。

~~~
# echo 0 > /sys/class/fpga_manager/fpga0/flags
# mkdir -p /lib/firmware
# cp /run/media/mmcblk0p1/design_1_wrapper.bit.bin /lib/firmware/
# cp /run/media/mmcblk0p1/pl.dtbo /lib/firmware/
# cd /sys/kernel/config/device-tree/overlays/
# mkdir full
# echo -n "pl.dtbo" > full/path
[   77.851677] fpga_manager fpga0: writing design_1_wrapper.bit.bin to Xilinx ZynqMP FPGA Manager
~~~

完了すると、device-tree 以下に登録される。

~~~
# ls -la /proc/device-tree/amba/example\@a0000000/
total 0
drwxr-xr-x    2 root     root             0 Jan  1 12:30 .
drwxr-xr-x   61 root     root             0 Jan  1 12:30 ..
-r--r--r--    1 root     root             7 Jan  1 12:30 clock-names
-r--r--r--    1 root     root             8 Jan  1 12:30 clocks
-r--r--r--    1 root     root            17 Jan  1 12:30 compatible
-r--r--r--    1 root     root             8 Jan  1 12:30 name
-r--r--r--    1 root     root             4 Jan  1 12:30 phandle
-r--r--r--    1 root     root            16 Jan  1 12:30 reg
-r--r--r--    1 root     root             4 Jan  1 12:30 xlnx,s-axi-axilites-addr-width
-r--r--r--    1 root     root             4 Jan  1 12:30 xlnx,s-axi-axilites-data-width
~~~

devmem を使ってレジスタのread/write ができるようになる。

~~~
# devmem 0xa0000000 32
0x00000000
~~~
迷惑メール情報提供用プラグインをOutlook2016に入れYahoo!メールで利用する設定手順

<h2>この記事について</h2>
本記事では総務省が提供している「迷惑メール情報提供用プラグイン」をOutlook2016に入れ、Yahoo!メール宛に届いた迷惑メールを報告する方法を解説します。

迷惑メールが一日20通程度届くのでさすがにそろそろ対策したいなと思い、検索したところプラグインを発見しました。しかしこのプラグインがIMAPには対応しておらず、POPでの設定が少々難しかったため設定手順を共有致します。ちなみにIMAPで接続してプラグインで報告しようとするとプラグインの利用時にエラーが発生するのですが、エラーコードが表示されるだけで原因が分かりづらい。これで諦めてしまった人も多いはず。。

こちらのツールを用いて報告を行った結果、迷惑メールの数が週140件程度あったところから、週20件程度にまで減少しました。
報告することでメールが減るだけでなく、悪徳業者の排除にもつながると思います。設定は少々面倒な部分もありますが、一度設定したらあとは簡単に利用できるので、ぜひ迷惑メールでお悩みの方はお試しあれ。

<h2>導入手順</h2>
それでは導入手順を解説していきます。
まずは、[公式のマニュアル](https://plugin.antispam.soumu.go.jp/install.html)があるので、参考にしながら[こちら](https://plugin.antispam.soumu.go.jp/)からプラグインのインストールを行いましょう。
ここまではさほど難しくないと思います。

次に、Outlook2016でYahoo!メールの設定をします。
・アカウントの追加を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527110/acf6ba13-561b-c259-0894-03a39c5e221a.png)

・メールアドレスを入力、手動で設定にチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527110/45e86ffe-b135-d414-2f6a-58de69f8bd7e.png)
・「POP」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527110/b0ff787d-21b1-58e4-58e4-e08b610320a2.png)

・下記と同様に入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527110/2d4aa05f-1aa1-79d2-991d-ff1170b00d0b.png)

・Yahoo!メールのパスワードを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527110/00c01f8b-6fef-08f0-4aa7-2e5395e3ce7f.png)
これで接続設定ができました。
続いてプラグインで報告を行います。

・迷惑メールを選択（複数選択可）、[アドイン]タブ>[情報提供]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527110/d23356a0-7bc1-b677-81f5-c9551c40410d.png)

・あとは送信するだけです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527110/69483cf5-ea3f-a5ca-270f-f1a9efd4e31b.png)

必要な設定は以上となります。あとは定期的に迷惑メールの選択、報告を行います。注意点として、POPでは受信箱に入ったメールしかOutlookに受信できないので、報告する際には迷惑メールフォルダに入った報告対象メールを一度受信箱に移す必要があります。

おまけとして、以下に迷惑メール関連のtipsを記載しておきます。

<h2>報告対象となる迷惑メール</h2>
[迷惑メール情報提供用プラグインダウンロードサイト](https://plugin.antispam.soumu.go.jp/)内で「迷惑メール」は、次のように定義されています。
>・送信に同意した覚えのない広告宣伝メール
>・表示義務違反メール
>・送信者情報（電子メールアドレス、IPアドレス、ドメイン名　等）偽装メール

許可していない事業者からのメールはすべて迷惑メールに該当します。

また、日本データ通信協会の提供する[迷惑メールの概要について](https://www.dekyo.or.jp/soudan/contents/taisaku/1-2.html)の記事も参考になります。

<h2>報告するとどうなるのか</h2>
[同サイト](https://plugin.antispam.soumu.go.jp/)では提供された情報は次のように利用されると書かれています。
<BLOCKQUOTE>なお、提供された迷惑メールの情報は、総務大臣及び消費者庁長官による特定電子メール法違反送信者への措置等に活用されます。</BLOCKQUOTE>
具体的な「措置」は[こちら](https://www.dekyo.or.jp/soudan/contents/taisaku/1-2.html)に記載があります。
<BLOCKQUOTE>総務大臣及び消費者庁長官は、メールの送受信上の障害を防止するため必要があると認める場合、送信者に対しメールの送信方法の改善に関し必要な措置をとるよう命ずることができます。</BLOCKQUOTE>

消費者庁長官の命令に従わない場合には、刑罰が課される場合があります。

<BLOCKQUOTE>送信者情報を偽って送信した場合や、送信者が総務大臣及び消費者庁長官の命令に従わない場合には、1年以下の懲役または100万円以下の罰金（法人の場合は、行為者を罰するほか、法人に対して3000万円以下の罰金）に処せられます。</BLOCKQUOTE>

<h2>報告を行った結果</h2>
私が実際に報告をした結果をお伝えします。

実施期間：2019年11月10日～2020年1月13日
報告対象：受信した迷惑メールすべて
ペース：週2～3回（不定期）
結果：最初の1週間130件→最後の1週間20件

このように迷惑メールの数が減りました。きちんと対応してくれているようですね。

<h2>コメント</h2>
どんどん報告してメール整理の邪魔者を減らしていきましょう！
Hugoでhtmlを直書きしたいときにやること

Hugoでブログを書いているのだが，markdown中にhtmlのコードを直書きしたところ反映されなかったので，解決方法を備忘録的に書き留めておく．

# 結論
`config`に以下を追加する．

```config.toml
[markup.goldmark.renderer]
unsafe= true
```

どうやら`Hugo 0.60.0`以降では，markdown中に生のhtmlを書くと，出力されるhtmlでは
`<!-- raw HTML omitted -->`
と省かれてしまうようだ．
VS Codeの拡張機能「Peacock」設定後に元に戻す方法

皆さん、こんにちは。職業「戸倉彩」です。

今回は、Visual Studio Code (以下、VS Code)を複数開いて利用する場合に、ワークスペースの色を変えられる便利な拡張機能「Peacock」を設定し、後から設定を解除したい場合の方法について紹介します。拡張機能「Live Share Extension Pack」をインストールすると同時にインストールされる拡張機能の一つでもあるので、試しに遊んでいて何気に元に戻せなくなって困っているという方がいたら参考にしてください。

# 拡張機能「Peacock」とは
2020年1月19日現在、ダウンロード数が45万超えを突破した多くのVS Codeユーザーがインストールし、利用している人気の拡張機能の一つです。
VS Code Marketplaceで公開されており、誰でもVS Codeの拡張機能として利用することが可能です。
[<img src="https://hhoipa.by.files.1drv.com/y4mEsFK0yfA4PNC-1ef8x9Ow3QHRM_VegzZamRtr6fppCJIug88gW7HguBgRkXP5GOqC8JPpyW-RmTar5Ny2OBi3mELDDItGyUNqYPFW9qSvtdwtcytyxJuzDSvbJIhRhuWNd6ybqv5Kvj-m_R2tin0ypuewooK0wVDFlhibFvDdBipa1Ub80vU33H-qnMGvoQg4UzjdE_Gjr9LXg1p4xiyxw?width=1520&height=1129&cropmode=none" width="600">](https://marketplace.visualstudio.com/items?itemName=johnpapa.vscode-peacock)
[<img src="https://g3ocpa.by.files.1drv.com/y4mzO_jTkkhPAjNSUp-bTM8yTEHwndQaW2Y1_iGJXjJDTCMf4cRYPmS4bUKxSCU1qHiA7DcV7V8CI2UsxctyRukDKPHv6bWaUQo_yFckRQdG-jwP0z6RFM2mTl5NNoQsj1J1HKutJPSbRJYvGgJUpGPSYdEoHRTxrHDO4__-IZebGEP9XA7_1Ex7fyB7fb7ofzJEieV_KUxUyz1e_xS3L7y-g?width=800&height=441&cropmode=none" width="600">](https://marketplace.visualstudio.com/items?itemName=johnpapa.vscode-peacock)


# 設定後に元に戻す方法
Marketplaceの拡張機能「Peacock」ページのOverviewに記載されていないので、少々分かりにくのですが、設定をリセットする方法がメニューとして用意されています。手順は下記の通りです。
1. VS Codeのメニュー項目**[表示]**→**[コマンドパレット]**、またはショートカット(macOS環境で日本語キーボードを使用している場合は[command]+[shift]+[P]を同時押し)からコマンドパレットを開く。
2. **[peacock]**と入力し、**[Peacock: Rest Workspace Colors]**を選択する。
<img src="https://g3oapa.by.files.1drv.com/y4mOlljYFEX-bG0iNOj1hDSiA-ZVY6RMZu8SDCsmnl0b4x8tEPmiEBZA2If08G55zWJNzOFGxY86BSdrgm1CQh7JP2htbnPlyIhZmeyzeoBS4Vw_AxcNWuMaWh980RtFuEpsu2-TdKSTrvAcZTcGnggo6T5Wba0nGVFreTc2QZ6Rl2bGihiiiewGAIdoavjsXLU5W4BSXVn5td7Yc-7j9IGKg?width=2034&height=1374&cropmode=none" width="600">
3. 設定は即座に反映され元に戻る。
以上です。

# 注意点
・拡張機能「Peacock」を無効にしたり、アンインストールするだけでは設定は解除されません。拡張機能が有効になっている状態で、上記の手順で設定をリセットしてから無効化またはアンインストールを行いましょう。

# 備考
本件に関連しているIssueがGitHubでOpenになっていました。拡張機能をアンインストールしたタイミングで設定がリセットされるのが望ましいと考えている他のユーザーさんからの声もあがっているようです。
[Clear all Peacock settings and colors on uninstall · Issue #98 · johnpapa/vscode-peacock](https://github.com/johnpapa/vscode-peacock/issues/98)

Have a nice Geek Life♪
※Twitterで最新情報配信中 [@ayatokura](https://twitter.com/ayatokura)
PHPの「define」と「const」の違い

> なんとなくてきとーに書いたけど
> 見てくれている方が結構いるみたいなので 名前空間 について追記しました

どちらも定数を定義するときに使う

```php
<?php

define('MY_CONST_1', 'defineで定義した定数');
const MY_CONST_2 = 'constで定義した定数';

echo MY_CONST_1;
// defineで定義した定数
echo MY_CONST_2;
// constで定義した定数
```

## 1.関数と構文

`define` は関数
`const` は構文

`define` は関数の呼び出しのオーバーヘッドがあるため **遅い**
`const` は関数じゃないから **速い**

## 2.変数や、関数の戻り値を使えるか使えないか

`define` は変数や、関数の戻り値を使える

```php
<?php
$val = '適当な変数';
define('MY_CONST', $val);
echo MY_CONST; // 適当な変数
```

```php
<?php
define('NOW', microtime(true));
echo NOW; // 1579431033.9034
```

`const` は変数や、関数の戻り値を使えない

```php
<?php
$val = '適当な変数';
const MY_CONST = $val;
// PHP Fatal error:  Constant expression contains invalid operations in ...
```

```php
<?php
const NOW = microtime(true);
// PHP Fatal error:  Constant expression contains invalid operations in ...
```

**いったん定数にすれば使える**

```php
<?php
define('NOW', microtime(true));
const MY_CONST = NOW;
echo MY_CONST; // 1579431879.0664
```

## 3.トップレベル以外で使えるか使えないか

`const` は `if` や `for` `function` の中では使えない

```php
<?php
if (true) {
    define('MY_CONST', 'defineはifの中でも使える');
}
```

```php
<?php
if (true) {
    const MY_CONST = 'constは構文エラーになる';
    // PHP Parse error:  syntax error, unexpected 'const' (T_CONST) in ...
}
```

## 4.クラス定数

`define` はクラス定数を定義するときに使えない

```php
<?php
class Example
{
    public define('MY_CONST', 'defineは関数だから構文エラーになる');
}
// PHP Parse error:  syntax error, unexpected 'define' (T_STRING), expecting function (T_FUNCTION) or const (T_CONST) in ...
```


```php
<?php
class Example
{
    public const MY_CONST = 'クラス定数を定義するときに使う';
}

echo Example::MY_CONST;
// クラス定数を定義するときに使う
```

## 5.名前空間

`const` は名前空間上に登録される
`define` はグローバルに登録される

```php
<?php

namespace My {
  define('MY_CONST', 'defineで定義した定数');
  const MY_CONST = 'constで定義した定数';
}

namespace Example {
  echo MY_CONST; // defineで定義した定数
  echo \My\MY_CONST; // constで定義した定数
}
```


## まとめ

クラス定数を定義するときは `const` を使う

~~クラス定数以外は `const` を使うと速いけど
何回も定義するわけじゃないし、 `const` には制約もあるから
`define` を使った方が無難~~
`define` は実行時じゃないと何が入っているか分からないしグローバル汚染になるので `const` がおすすめ
IE11でURLSearchParamsがエラーになる

# エラー
Vue.jsで開発中に、axiosでPOSTするのに`URLSearchParams`を使ったらIE11でエラーが出てしまった。

```
[Vue warn]: Error in v-on handler (Promise/async): "ReferenceError: 'URLSearchParams' は定義されていません。"
```

# axios
こんな感じで使っていた。

```js
const params = new URLSearchParams();
params.append("hoge", "hoge");

axios
  .post(url, params)
  .then(res => {
    return res;
  })
  .catch(error => {
    return error;
  });
```

# URLSearchParams
[URLSearchParams](https://developer.mozilla.org/ja/docs/Web/API/URLSearchParams)はそもそもIE11では使えないものらしい。
https://developer.mozilla.org/en-US/docs/Web/API/URL#Browser_compatibility


# url-search-params-polyfill
以下のpolyfillを追加して解消した。
[jerrybendy/url-search-params-polyfill: a simple polyfill for javascript URLSearchParams](https://github.com/jerrybendy/url-search-params-polyfill)


### 追加
```bash
npm i --save url-search-params-polyfill
```

```main.js
import "url-search-params-polyfill";
```

# 参考
[IE11 > axios > POSTのつもりがうまく送れてないとき](https://qiita.com/sugasaki/items/b8c22be73d71438b1ee3)
[IE11でURLSearchParamsを使った処理でエラーが発生する](https://keyama.hatenablog.com/entry/2018/07/23/113515)
Google メールアプリケーション用のパスワードを取得する

# 目的

- Googleのアプリケーション用パスワード出力を取得する方法をまとめる
- ※公式のドキュメントにも記載があるのでそちらの方がわかりやすい可能性がある

# 前提情報

- 本作業はGoogleアカウントでの２段階認証プロセスがオンになっている状態で初めて実施できる、未実施の方は下記を先に実施する。
    - [Google 二段階認証設定をONにする方法](https://qiita.com/miriwo/items/0331e7241710fb4759fe)

# 実施詳細

1. Googleに任意のアカウントでログインする。
1. Googleのホームにアクセスする。
1. 右上に存在する自分の画像をクリックする。(画像の「み」と書いてる丸い部分)
![スクリーンショット 2020-01-18 9.42.43（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b67d4005-52d4-0be5-97f7-f0ea4d5e65c7.png)

1. 「Googleアカウントを管理」をクリックしてアカウント管理画面に移動する。
![スクリーンショット 2020-01-18 9.42.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6c84b83d-cf67-32d2-ce1c-dd4940449e97.png)

1. 左のメニューの「セキュリティ」をクリックする。
![スクリーンショット 2020-01-18 9.44.19（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/2d37ebbd-3138-fb5e-6c31-a66ec548d01f.png)

1. 「Googleへのログイン」の「アプリパスワード」の「>」をクリックする。
![スクリーンショット 2020-01-18 10.02.13（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/332d9598-3520-b19e-3137-34c96e279619.png)

1. パスワードを入力して「次へ」をクリックする。
![スクリーンショット 2020-01-18 10.02.30（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ea5441a0-a6ee-56f4-3e1f-18d4fe0f6ba6.png)

1. 「アプリを選択」をクリックして「メール」を選択する。
![スクリーンショット 2020-01-18 10.03.23（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ae901546-0bd0-295a-bbf4-3249ff8ef5eb.png)

1. 「デバイスを選択」をクリックして任意のデバイスをクリックする。(これはどれを選んでも良い)
![スクリーンショット 2020-01-18 10.05.12（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/153b85c8-a18f-5a4b-3b86-cec701e19d89.png)

1. 内容を確認して「生成」をクリックする。
1. 生成されたアプリパスワードに出力されたパスワードをスクリーンショットを撮ったり、テキストベースのコピーを行う。
![スクリーンショット 2020-01-18 10.05.42（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/787190d3-1947-07e5-0533-20a42eccb8de.png)


1. 記録が終わったら完了をクリックする。
laravelで作った画像も表示できるブックレビューの機能について　※ポートフォリオの解説です

#こんなアプリを作りました
http://book-review123456.herokuapp.com/articles

<img width="1440" alt="スクリーンショット 2020-01-19 17.29.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501141/c9df238e-e99b-864b-7b8b-991ef1bbda99.png">

書籍のカバー画像も表示できる掲示板アプリです。画像はGoogleBooksAPIsを利用して取得します。
　　　　　APIを利用した画像の取得方法については下記にまとめました　↓

[laravelでカバー画像も表示できるブックレビューアプリを作った。※自分の学習用です](https://qiita.com/Shogo_S/items/7b02b7573a0c69e62bf5)

###機能はこんな感じです。

* 画像も表示できるブックレビューの投稿
* ログイン/新規登録
* バリデーション（ログイン時だけレビューの投稿・編集ができる）
* お問い合わせ
* 退会処理

#なぜ作ったか
プログラミングスクールでプログラミングを学んでいたのですが、卒業制作としてRuby、フレームはsinatraでほぼ同様のアプリを制作しました。Laravelでも同様のアプリを制作し、理解を深める狙いです。

#反省と今後の課題

###機能について

- マイグレーションでエラーが発生したため、下記URLを参考にCSRFの仕組みを無効化することで対処しています。なので参考にされる際は注意してもられると。CSRFの仕組みを理解するため、今は生のPHPで掲示板を制作しています。順番おかしいですね。
- APIで画像を取得する際の例外処理がまだできていません。if文でできそうですが、現状うまくいっていません。また現状、配列が変化するとエラーになってしまいます。例えば、GoogleBooksAPIsを利用してJSONのデータを１０件取得した場合、その中に配列['thumbnail']を含んでいないデータが一つでもある場合はエラーになってしまいます。いくつか方法は試したのですが、まだ解決できていません。

###今後の学習について
- しばらくはLaravelではなく、生のPHPで制作し勉強した方がいいのかなと思いました。
なので、下記の記事を参考に勉強を進めたいです。特に
 - CSRF対策
 - XSS対策
 - SQLインジェクション対策 <br>
 など脆弱性と対策について確認したいと考えています。

　　[Web開発初心者がLaravelで実務開発するまでの3ヶ月の研修ステップ](https://qiita.com/bumptakayuki/items/446d4b29e6a12a8a9c2b)
head内に書くタグについて

参考にしたもの
[サルワカ]https://saruwakakun.com/html-css/basic/head

[creive]https://creive.me/archives/17610
より詳しく見る場合にはこちらを参照してください。




>基本的metaタグ

>```html
<head>
<!-- 文字コードの指定 -->
<meta charset="utf-8">

><title> そのページのタイトル </title>

><meta name="description" content="ページの内容を端的に要約し書いてください。">

><!-- IEで常に標準モードで表示させる -->
><meta http-equiv="X-UA-Compatible" content="IE=edge">

><!-- viewport(レスポンシブ対応) -->
><meta name="viewport" content="width=device-width, initial-scale=1.0">

><!-- 公開前は検索エンジンにインデックスさせず、他のページの巡回を促す。 -->
><meta name="robots" content="noindex,follow">

><!-- 電話番号の自動リンク化を無効 -->
><meta name="format-detection" content="telephone=no"> 
```

***

SEO対策の補助的措置

```html
<!-- サイトのタイトル -->
<title>サイトのタイトルをここに書く</title>

<!-- キーワード -->
<meta name="keywords" content="キーワード1,キーワード2,キーワード3...body内で記載できなかったキーワードがあれば、入れておくと良いでしょう。">

<!-- サイトの説明 -->
<meta name="description" content="ページの要約。130文字以内(目安)">

<!-- 重複するURLを一本化 -->
<link rel="canonical" href="正規化するURL">
```
***

SNS対策

```html
<meta property="og:site_name" content="サイト名をここに書きます。">
<meta property="og:title" content="上記titleと同じとする。">
<meta property="og:description" content="上記descriptionと同じとする。">
<meta property="og:type" content="website(トップページ)/article(下位ページ)">
<meta property="og:url" content="サイトのURL">
<meta property="fb:app_id" content="AppID">
<meta name="twitter:card" content="summaryあるいは、summary_large_imageの指定ができます。">
<meta name="twitter:site" content="サイトのURLを記載します。">
></head>
```
***

その他の指定

```html 
<!-- faviconの指定 -->
<link rel="icon" href="favicon.ico"> 
<!-- 外部のCSSファイル -->
<link rel="styleshee" href="CSSファイルのURL">
<!-- 外部のJsファイル --> 
<script src="JavaScriptファイルのURL"></script>
</head>
```

***

外部ファイル

```html
<link href="text.css" rel="stylesheet">
<script src="text.js"></script>
```
***

その他

```html
スマートフォン用のアイコン表示
<link rel="icon" href="faviconのURLをここに"> 

ios
<link rel="apple-touch-icon" href="./images/apple-touch-icon.png"sizes="180x180"

android
<link rel="icon" type="image/png" href="./images/android-touch-icon.png" sizes="192x192">
```
【SharePoint Framework】Failed to load component エラー対処

#はじめに
開発したWebパーツをSharePoint ページに展開した所、以下の画像のようなエラーが発生しました。
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246142/907aaec8-f97d-7067-9bee-9aed256e89b4.png)

#解決策
以下のコマンドを実行する事で解決しました。

```shell
gulp clean
gulp build
gulp bundle --ship
gulp package-solution --ship

```

#参考
SPFx | Failed to load component.
https://www.koskila.net/failed-to-load-component-original-error-failed-to-load-path-dependency-contosospfxwebpartlocalization-from-component-guid-contosospfxwebpart/
(Ruby)文字列を16進数に変換する

文字列を16進数で確認したい時に使う。

# 動作確認環境
`Ruby 2.7.1`
`UTF-8`

# 16進数への変換
`String#unpack` や `String#bytes`を利用できる。

## unpack

UTF-8のコードポイントを調べる方法
引数に `("U*")` を指定し、得られた数字を `to_s(16)` で16進数に変換している

```ruby
"𩸽".unpack("U*").map { |s| "U+#{s.to_s(16).upcase}" }
=> ["U+29E3D"]

"あいうえお".unpack("U*").map { |s| "U+#{s.to_s(16).upcase}" }
=> ["U+3042", "U+3044", "U+3046", "U+3048", "U+304A"]
```

または引数に`("H*")`を指定することで、16進数の値が返される。

```Ruby
text = "1"
text.unpack("H*")
# => ["31"]
```

文字列をまとめて `unpack` すると読みづらい。

```Ruby
text = "123αβγあいう🌀"
text.unpack("H*")
# => ["313233ceb1ceb2ceb3e38182e38184e38186f09f8c80"]
```

この場合、1文字ずつ `unpack` すると読みやすい。

```Ruby
text = "123αβγあいう🌀"
text.chars.map { |t| t.unpack("H*") }
# => [["31"], ["32"], ["33"], ["ceb1"], ["ceb2"], ["ceb3"], ["e38182"], ["e38184"], ["e38186"], ["f09f8c80"]]
```

## bytes
文字列の各バイトが数値の配列で返される。
`bytes`を使うと10進数で表示される[^1]ので、16進数に変換する。

```Ruby
text = "吾輩は猫である。"
text.bytes
# => [229, 144, 190, 232, 188, 169, 227, 129, 175, 231, 140, 171, 227, 129, 167, 227, 129, 130, 227, 130, 139, 227, 128, 130]

text.bytes.map { |b| "%02X" % b }
# => ["E5", "90", "BE", "E8", "BC", "A9", "E3", "81", "AF", "E7", "8C", "AB", "E3", "81", "A7", "E3", "81", "82", "E3", "82", "8B", "E3", "80", "82"]

# こうも書ける
text.bytes.map { |b| b.to_s(16) }
# => ["e5", "90", "be", "e8", "bc", "a9", "e3", "81", "af", "e7", "8c", "ab", "e3", "81", "a7", "e3", "81", "82", "e3", "82", "8b", "e3", "80", "82"]
```

UTF-8の文字コード表と照らし合わせれば何の文字が入っているか分かる。
[UTF-8の文字コード表 - 備忘帳 - オレンジ工房](http://orange-factory.com/dnf/utf-8.html)

[^1]: `bytes`は10進数に変換しているわけではない。返り値のInteger オブジェクトを表示するときに、10進法に基づく文字列化を行っている。
Google Drive上のpdfをchromeで画像単位でダウンロードした

#はじめに

※一応Chrome Extensionを導入するので，導入については完全に自己責任でお願いします．

Google Driveに上がっているpdfで，たまに直接pdfに出来なくて，ちまちまスクショする必要がある場合がありますが，
そんな時でもpdfを画像単位にして一括でダウンロードする方法があります

#用意するもの
- Google Chrome
- Chrome Extentionの[Save All Resources](https://chrome.google.com/webstore/detail/save-all-resources/abpdnfjocnmdomablahdcfnoggeeiedb)

#やり方
1.Chromeで上記のExtentionをインストールして，ブラウザを再起動します
2.追加されたアイコンをクリックします
![icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213113/87e076e0-f1d6-c523-4fb0-1723c313c837.png)
3.開きたいdrive上のpdfファイルを開きます
4.デバッグツールモードに入ります（通常はF12キーで開きます)
5.ツールバーのResourceSaverを開きます（画像のように隠れている場合があります）
![rs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213113/e6a20fa2-f550-b869-6731-8a5ec04d9ae1.png)
6.' Include all assets by XHR requests (require page reload).'のチェックを入れます
7.チェックしたらページがリロードされるので，pdf全体をスクロールして，ドキュメント全体を読み込みます．
8.全部読み込んだら'Save All Resources'をクリックします
9.ダウンロードされたzipファイルの中の，'drive.google.com/drive.google.com/viewerng'を開きます

#結果

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213113/96dedb08-65a7-64af-6774-d96e2a276367.png)

こんな感じで，pdfの中身がダウンロードされます．
筆者の環境ではpngとhtmlが混ざっていましたが，中身は全部pngだったので，拡張子をリネームしてあげればよいはずです

#応用先
[第三者委員会からの調査報告書](https://drive.google.com/file/d/1s5t-RCZ3e-piWFVDp6F3ok-cmY8MGasc/view)

#おわりに
いかがでしたでしょうか
Google Driveに限らずwebでブラウザ上で生成されるコンテンツを一括でダウンロードしたいみたいな状況で色々使えると思うので，みなさんお気軽にお試しください．
Rails Tutorialの知識から【ポートフォリオ】を作って勉強する話 #17.5 MySQL導入編

# こんな人におすすめ
* プログラミング初心者でポートフォリオの作り方が分からない
* Rails Tutorialをやってみたが理解することが難しい

前回：[#17 VPC環境構築編](https://qiita.com/aokyo17/items/405d8eda3b6108c7af05)
次回：[#18 EC2環境構築, Nginx+Puma+Capistrano編](https://qiita.com/aokyo17/items/281b5a1658ea58bc7b24)

# 今回の流れ

1. SQLite3からMySQLに変更する

この記事は、**動画を観た時間を記録するアプリのポートフォリオ**です。
今回は**RailsアプリのDBをSQLite3からAWSによるRDSのMySQLに変更**します。
**RDSはすでにAWSで作成しているものとします**（詳しくは[#17](https://qiita.com/aokyo17/items/405d8eda3b6108c7af05)をご覧ください）。

# SQLite3からRDSのMySQLに変更する
RailsアプリのDBをSQLite3からRDSのMySQLに変更します。

* Gemfileを編集する
* エンドポイントを確認する
* database.ymlを編集する
* RDS（MySQL）に接続する
* DBを更新する

## Gemfileを編集する
Gemfileから使っているDBを削除し、MySQLを入れます。

```diff:Gemfile
+ gem 'mysql2'

group :development, :test do
- gem 'sqlite3'
end

group :production do
- gem 'pg'
end
```

```shell:shell
$ bundle install
```

## エンドポイントを確認する
RDSのエンドポイントはDBを設定する際に必要なので、確認します。

AWSにログイン → AWSマネジメントコンソール『RDS』
画面左のダッシュボード『データベース』 → 『自分のアプリ名』 → 下部タブ『接続とセキュリティ』のエンドポイントをコピー

## database.ymlを編集する
DBの設定を編集します。

```yml:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: lantern（自分のアプリ名）
  pool: 5
  username: ①任意の名前
  password: ②任意のパスワード
  socket: /var/lib/mysql/mysql.sock
  host: コピーしたエンドポイント

development:
  <<: *default
  database: lantern_devlopment（自分のアプリ名）

test:
  <<: *default
  database: lantern_test（自分のアプリ名）

production:
  <<: *default
  database: lantern_production（自分のアプリ名）
```

## RDS（MySQL）に接続する
RDS（MySQL）に接続します。

```shell:shell
$ mysql -h コピーしたエンドポイント -P 3306 -u ①任意の名前 -p
Enter password:②任意のパスワード
```

繋がらない場合は、一度MySQLを再起動します。

```shell:shell
$ sudo /etc/init.d/mysqld restart
```

その後はユーザーを作成し、ルート権限を与えます。

```sql:mysql
mysql> create user '①任意の名前'@'コピーしたエンドポイント' identified by '②任意のパスワード';
mysql> grant all on `%`.* to '①任意の名前'@'コピーしたエンドポイント' identified by '②任意のパスワード';
```

参考になりました↓
[MySqlのソケットエラーを解決する](https://qiita.com/kanohisa/items/564035efd74d9c75bdcb)
[RailsのDBを(初めから| |後から)MySQLに変更する](https://qiita.com/reeenapi/items/9fc38c4f2f8186c78288)
[RDSのMySQLでGRANT文が通らない](https://qiita.com/tisk_jdb/items/9c07da5811f95f6b7f3d)

## DBを更新する
後はいつも通り、DBを更新します。

```shell:shell
$ rails db:reset
$ rails db:migrate
$ rails db:seed
```

以上でMySQLの移行が完了しました。

---
前回：[#17 VPC環境構築編](https://qiita.com/aokyo17/items/405d8eda3b6108c7af05)
次回：[#18 EC2環境構築, Nginx+Puma+Capistrano編](https://qiita.com/aokyo17/items/281b5a1658ea58bc7b24)
Rで複数の条件で行を選択・抽出する方法色々


#まず一つの条件で絞る

```r
iris[iris$Species=="virginica",]
```



#複数の条件を演算子で結ぶ

```r
iris[iris$Species=="virginica" | iris$Species=="setosa",]
```

#ベクトルで複数条件を指定する

```r
iris[iris$Species==c("virginica","setosa"),]
```

#dplyrのfilterを使う
慣れるとdplyrは使い方無限大

```r
library(dplyr)
iris %>% filter(Species == "virginica" | Species == "setosa")
```

もちろん一つの条件でも絞れる。

以下だと25レコードづつしかとってきてくれない。
なぜだ。

```r
iris %>% filter(Species == c("virginica","setosa"))
```


#match関数を使う
いちいちベクトルや演算子に記述できないほど多い条件で絞りたいときはmatch関数を使ってNAにならなかった部分を指定すると便利
よく使ってるけど、なんか汚い・・・

```r
iris[is.na(match(iris$Species, unique(iris$Species)[c(1,3)]))==FALSE,]
```


#以上
他にも方法あったら教えてください
iOSで複数人で開発する際のアカウント設定

# 目的
- 複数人で開発する際のアカウントの共有設定

# 事業アカウントの場合流れ
itunes connect > ユーザとアクセス > ⊕ボタン
<img width="694" alt="スクリーンショット 2019-12-30 18.46.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237101/c00d1709-ad40-ddde-3843-3341f0ccefa9.png">
①招待したいメールアドレス入力
②AppManagerにチェック（バージョンの作成まで行える最低限の権限）
③対象APPを選択
④チェックする（individual アカウントだとチェックつけられない）
LambdaでPHPを実行する手順


なるべく、簡潔にできるようにまとめてみました。

##前提
Mac
AWSアカウント作成済
Dockerインストール済


##手順
1. Docker内で、PHPの実行環境を作り、それをzip化
2. そのzipファイルをLambdaにアップロード
3. API GatewayでAPI作成


##1. Docker内で、PHPの実行環境を作り、それをzip化
[stackery/phplambdalayer](https://github.com/stackery/php-lambda-layer)というツールを使うと、**makeコマンド一つ**で簡単にできました。

このツールには、PHPの実行環境をzip化するために必要なスクリプトや、Lambdaでカスタムランタイム自体を動作させるboostrapファイル等がまとめて入っている

```
$ git clone https://github.com/stackery/php-lambda-layer.git
$ cd php-lambda-layer
$ make php71.zip
```

`php71.zip`というファイルが作成される

`make php71.zip` の内容を見ると、

```:Makefile
php71.zip:
	docker run --rm -e http_proxy=${http_proxy} -v $(ROOT_DIR):/opt/layer lambci/lambda:build-provided /opt/layer/build.sh
```

+ [lambci/lambda](https://hub.docker.com/r/lambci/lambda/)というlambda環境のDockerイメージを使っている
+ そのイメージで起動したDockerコンテナ内で、[build.sh](https://github.com/stackery/php-lambda-layer/blob/master/build.sh)が実行されている
+ `build.sh`の内容を見ると、Lambda用のPHP7.1実行環境を作って、zip化している


```shell:build.sh
#!/bin/bash

# 依存関係により、php本体もここでインストールされている
yum install -y php71-mbstring.x86_64 zip php71-pgsql php71-mysqli

mkdir /tmp/layer
cd /tmp/layer
cp /opt/layer/bootstrap .
sed "s/PHP_MINOR_VERSION/1/g" /opt/layer/php.ini >php.ini

mkdir bin
cp /usr/bin/php bin/

mkdir lib
for lib in libncurses.so.5 libtinfo.so.5 libpcre.so.0; do
  cp "/lib64/${lib}" lib/
done

cp /usr/lib64/libedit.so.0 lib/
cp /usr/lib64/libpq.so.5 lib/

cp -a /usr/lib64/php lib/

zip -r /opt/layer/php71.zip .
```

##2. 作成したzipファイルをLambdaにアップロード
ここから下は、全てAWSのコンソールでやりました。
####2-1. レイヤー作成
レイヤーは、実行環境をアップロードしておくことで、複数のLambda関数で利用できるようにするもの

+ レイヤーを作成し、作成したzipファイルをアップロードする
+ レイヤーバージョンARNは、後で使うため、メモっておく


####2-2. Lambda関数作成

+ 「一から作成」
+ ランタイム：「ユーザー独自のブートストラップを提供する」
+ 「実行ロール」(IAMロール)も一緒に作成される
+ すでにある３つのファイルは使わないため、削除。代わりに、以下のindex.phpを作成

```php:index.php
<?php phpinfo(); ?>
```

####2-3. Lambda関数とレイヤーを結びつける
「レイヤーバージョンARNを提供」を選択し、上でメモった「レイヤーバージョンARN」を貼る

##3. API GatewayでAPI作成
「APIの作成」

+ メソッドの作成：Any
+ 「Lambdaプロキシ統合の使用」にチェックを入れる
+ 最後にAPIのデプロイ（ステージ名入力。このステージは、アクセスするパスになる）

APIへのアクセスは、該当するLambda関数を選択→APIGatewayを選択すると、APIエンドポイントが表示され、ワンクリックでできる。

###参照
[PHPでゼロからはじめるAWS Lambda Custom Runtime](https://github.com/taiko19xx/LambdaCustomRuntime_with_PHP)
javascriptでmp3ファイルを再生

<h1>HTMLを編集</h1>

```html
<button id="btn">再生</button>
<button id="btn2">停止</button>

<audio id="audio"></audio>
```
これらを追加する

<h1>javascriptを書く</h1>
<p>HTMLの中にscriptタグをかいてHTMLにjavascriptを書くか、<br>
javascriptファイルを作ってそれでjavascriptを書くか。
<br>
今回はめんどくさいのでHTMLのなかにjavascriptを書きます。
headタグ内に書いてみてください<br>。
エラーでたら、bodyタグ内に書いてみましょう。
</p>

```html
<script>
var btn = document.getElementById("btn"); //document.getElementByIdを使ってHTMLのbtnというIDを取得
var btn2 = document.getElementById("btn2");//document.getElementByIdを使ってHTMLのbtn2というIDを取得

btn.addEventListener('click', function(){   //もしbtn(再生)をクリックしたら..
   audio.src='ここにmp3ファイル名を書く';
   audio.play(); //audioを再生
});

btn2.addEventListener('click', function(){
   audio.pause(); //audioを止める
   audio.currentTime = 0; //時間を０に
});
</script>
```

これで再生と停止ができたみたいです！
Amazon Prime VideoやAbema TVなどを画面端の小さいウィンドウで再生する方法


```js
javascript:document.querySelector("video[src]").requestPictureInPicture();
```

をブックマークのURLに追加。

動画を再生してるときにブックマークを開く。

# 参考

https://qiita.com/saa/items/55411d5c0c7fd9bc8651

https://qiita.com/iHok/items/2a51a71c26c8abf820e0
Railsチュートリアル 第14章 ユーザーをフォローする - 前提

# この章で実装する機能

基本的な機能としては、以下の機能を実装していきます。

* 他のユーザーをフォロー、およびフォロー解除する機能
* フォローしているユーザーの投稿をステータスフィードに表示する機能

上記の機能を実装するためには、さらに以下のような前提知識が必要になります。

* ユーザー間の関係性のモデリング
* モデリング結果に対するWebインターフェースの実装
    * Webインターフェースの例としてのAjax
* ステータスフィードの完成版の実装

ステータスフィードの完成版の実装にあたっては、今までに学んできたものよりもさらに一歩高度なRuby/SQLの利用についても学習していきます。

# 「ユーザーをフォローする機能」の全体像

Railsチュートリアル本文においては、ユーザーをフォローする機能の実装に先駆けて、いくつかのモックアップが示されています。

[図 14.1](https://railstutorial.jp/chapters/following_users?version=5.1#fig-page_flow_profile_mockup)では、「John Calvin」というユーザーが自分のプロフィールページを表示しています。「フォロー50人、フォロワー77人」という人数表示があります。

[図 14.2](https://railstutorial.jp/chapters/following_users?version=5.1#fig-page_flow_user_index_mockup)では、全ユーザーの一覧が（ページネーションされた上で）表示されています。

[図 14.3](https://railstutorial.jp/chapters/following_users?version=5.1#fig-page_flow_other_profile_follow_button)では、「Thomas Hobbes」というユーザーのプロフィールページが表示されています。現在のログインユーザーである「John Calvin」とは別のユーザーです。現状の人数表示は「フォロー23人、フォロワー144人」です。当該ユーザーのプロフィールページには、[Follow]というボタンが表示されています。

図 14.3の状態から、CalvinがHobbesのプロフィールページに表示された[Follow]ボタンをクリックします。すると、Hobbesのプロフィールページの表示は[図 14.4](https://railstutorial.jp/chapters/following_users?version=5.1#fig-page_flow_other_profile_unfollow_button_mockup)のようになります。[Follow]ボタンが[Unfollow]ボタンに変わり、人数表示も「フォロー23人、フォロワー145人」になります。フォロワーのカウントが1増えたのですね。

[図 14.5](https://railstutorial.jp/chapters/following_users?version=5.1#fig-page_flow_home_page_feed_mockup)は、図 14.4の状態から、Johnが自身のHomeページを表示したところです。HomeページのMicropostフィードにThomasのマイクロポストが表示されるようになり、人数表示が「フォロー51人、フォロワー77人」となりました。図 14.1の状態からは、フォローのカウントが1増えていますね。
Neural Network Consoleなら簡単にDeep Learningができる（GPU, Windows）  



Neural Network ConsoleはSonyが作っているツールで、GUI操作で簡単にDeep Learningができます。
クラウド版は基本有料ですが、自分のPCで使うローカル版は無料で使用することができます。
セットアップも簡単で、Cドライブのシステムフォルダにインストールする必要もなく、ImageJのように任意の場所にダウンロードしてそこから起動できます。

内部はPython(Miniconda,TensorFlow,keras)で作られているようですが、
GPUを使用するときも、**CUDAやcuDNNといったツールをインストールする必要がありません**。(PythonでDeep Learningをするときに障壁になりがち)
またSony製のため日本語もマニュアルが充実していて便利です。

##インストール
https://dl.sony.com/ja/app/ からアプリをダウンロードします。現在はWindows OSのみ対応のようです。
ダウンロードしたフォルダの中にはマニュアル(日本語・英語)が入っています。
他に必要なソフトはVisual Studio 2015 Visual C++が必要です。もし、2015より新しいVisual Studio Visual C++が既に入っているとインストールできないので、その場合は新しいVisual Studio Visual C++をアンインストールします（「アプリと機能」で確認できる）。
neural_network_console.exeで起動します。
また、初回のアクティベートにはSonyのアカウント(Googleアカウントでもできる)のログインが必要のようです。

##デモを動かす
MNSITなどのいくつかのデモのプロジェクトが存在します。
プロジェクトは、ネットワークを構成する「EDIT」、学習を行う「TRAINING」、モデルの評価を行う「EVALUATION」の3つのステップからなります。
RUNボタンを押していくだけで学習が始まりました。
<img width="568" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521288/d6e534f7-2fbb-b42a-42ee-ad0ebdab7967.png">

エポック数やバッチサイズ、最適化法などのハイパーパラメータはCONFIGで選択できるようです。
自動の最適構造探索を使用する場合には、CONFIGのStructure Searchを用います。これはハイパーパラメータを調整するのではなく、ネットワークの構造を最適化させるもののようです。

##感想
簡単なDeep Learningツールでは、他にMATLABのDeep Learning Toolboxがありますが、本体もツールボックスも有料です。
もし最新の論文に出ている手法やネットワーク、複雑なツールを使用するには、TensorFlowやPyTorchを勉強する必要があると思いますが、
基本的なDeep LearningならNeural Network Consoleで十分対応可能だと感じました。
画像認識だけでなく、画像生成(VAE、GAN)やセマンティックセグメンテーション、RNN、LSTMのサンプルがありました。
自動の最適構造探索も非常に便利です。
また、決定木やナイーブベイズもできるようです。
Windowsのみ対応なのが残念ですが、これからも使い方を勉強していこうと思います。
Excel VBA 64bit版の「Declare ステートメント」エラーを解消する方法

### はじめに
Windows10に買い替えてExcelも64bit版をインストールしました。
特に問題ないだろう…と高を括っていたのですが、32bit版から修正しないと動かないVBAが出てきましたので、後学のためにも書き残しておきたいと思います。

### 問題が起こったマクロはどんな内容？
Win32API URLDownloadToFileでファイルをダウンロードするマクロでした
そりゃ～Win32APIって名前なんだから32bit専用ですよね～
64bit用に修正しなきゃ動きませんよね～💦


### Declare ステートメントの確認および更新のエラー
エラーメッセージのキャプチャです。
![WS000036.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362908/543830e9-c4eb-fbdf-c3ef-e0a8c980ed68.jpeg)


### Declare FunctioをDeclare PtrSafe Functionに修正
エラーメッセージにすべて答えが書いてあります。
* 修正前
![WS000037.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362908/1df94d0f-9711-bf8c-4737-e085ffba2fb1.jpeg)

* 修正後
![WS000040.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362908/7ff58442-3b07-7324-3cb0-11e0e76ff5c4.jpeg)

FunctionのまえにPtrSafeを付け加えることで、あっさりエラーは消えました。
これでマクロを実行できる～と思いきや、今度は別のエラーが発生！

### コンパイルエラー 型が一致しません
![WS000034.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362908/37f8ed55-7f74-ed42-a6c4-eff7545effe7.jpeg)

型が違いますって？アイエエエエ! ニンジャ!? ニンジャナンデ!?
どう見ても整数でいいでしょーが(# ﾟДﾟ) まだ子供が食べてるでしょーが！

### Long型をLongLong型に修正
どうやら64bitになって扱える数値が増えたので大容量な箱にしてやる必要があるみたいです。

* 修正後
![WS000038.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362908/5214beec-2615-9619-e1c6-e85aa451b633.jpeg)
![WS000039.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362908/3d7d1860-a8ea-93bc-0552-fbf8a1de8af5.jpeg)

そのまんまLongを付け加えるという、なんとふざけた書き方なのだろうか？
だがわかりやすくてイイ！
**※追記**
コメントでありがたい情報をいただきました。
LongLongにすると64bit専用になってしまうため、今度は32bitで動かなくなるとのこと。32bitと64bit環境を両立させる必要がある場合は、LongLongではなくLongPtrに修正してください。

LongLong型の詳しい解説は以下を参照ください。

**cpprefjp - C++日本語リファレンス**
https://cpprefjp.github.io/lang/cpp11/long_long_type.html

### まとめ
* 32bit用のAPIなどを使っていた場合は、PtrSafe をつける。

* 整数はLongLong型で宣言する。（32bitと64bit環境を両立させる場合は、LongLongではなくLongPtrで宣言する）

プログラムに詳しい方なら当たり前すぎて書き残す人はいないのかもしれませんが、
私のような独学ポンコツアマグラマーは、見事にハマってしまったので、
似たような事象でお困りの方の参考になれば幸いです
アル中カタカタ〜！大事なキーを異世界に転生！また俺何かやっちゃいました？




システムエンジニアになって10ヶ月のピッチピチのJK（Java書き）のキー太郎です！
先日最近購入しましたMacBook Proを友達の家に持って行って、酒呑みながらカタカタいじってたときの失敗談です。ゆる〜く聞き流してください。



週末久しぶりに友人と食事をした私はそのまま友人宅飲み会をすることに。MacBook Proを開きながらあれこれよくわからんウンチクを語りながら例の飲み物（角ハイ金）を飲んでいました。そしてどういう流れからか私は友人に自慢をしたくなりました。

キー太郎「そういえばさ〜最近秒で俺サーバ作れるようになったんだよね〜」
友人「どうやって？」
キー太郎「EC2ていうえーだぶりゅーえす？を使うと簡単にサーバ立ち上げることができるんだぜ〜」
友人「すげーーーーーーーーーー！！！！！！！！！！！！！！！！」
キー太郎「また俺何かやっちゃいました？笑笑」


macでEC2を立ち上げるには
１：AWSマネジメントコンソールからEC２を選択し、キーペアを作成する。
２：作成した秘密鍵(pem)をダウンロードする。
３：キーの権限を変更する。

chmod 400 ●●●●●.pem

４：sshコマンドを実行する。

ssh ec2-user@00.00.00.00 -i ●●●●●.pem

５：サーバが稼働する。

  __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|



ざっくりと説明しましたがこんな感じです。


さてその後一通り自慢を終えた私はキーを保存しておくためのディレクトリを作成し、作成後にキーを移動しようと思い実行に移します。そのことがある悲劇を生むとは梅雨知らず、、、


キー太郎（酔）「キーをただ外にほっぽり出しておくのもなんかアレだしディレクトリでも作成してそんなかで管理しておきますかね〜」
キー太郎（酔）「まずはディレクトリを作るぞーい」
キー太郎「ディレクトリを作るには確かmkdir or touch だったけな・・・」

touch SSH

キー太郎「そんで次はカレントディレクトリにあるキーを移動させると・・・」
キー太郎「mvコマンドで異世界転生させたるわ！！！！！」

mv ●●●●●.pem /●●/●●/SSH/

キー太郎「実行っと・・・うん！特にエラーもなく実行できたみたいだな」
キー太郎「さて無事に作業終わったし祝酒でも開けますかね笑笑」



その後達成感に浸りながらとりあえず再びssh接続をしようと試みます。まずキーが入っているSSHディレクトリ移動しようとします。

cd SSH

キー太郎「移動っと・・・あれ？」


cd: not a directory: ●●●●●.pem


キー太郎「ディレクトリじゃない・・・？どういうこと？アクセス権限の問題か？いやディレクトリじゃないよってターミナルに言われとるし・・・」


その後あらゆる手段試してもそのディレクトリには移動できませんでした。


キー太郎「はあああああああ・・・・終わったわ。完全に詰んだ。ディレクトリに入れなかったら鍵取り出せんわ・・・・」


さて感の良い方なら最初の方に気づいているかもしれません。その通りです。この悲劇は最初に実行したコマンドであるtouchコマンドが原因なのです。

touchコマンドはファイルのタイムスタンプを変更するコマンドであり、存在しないファイル名を指定することで、内容の入っていないファイルを新規作成する機能を持っています。詳しくはググってください。


最初から整理します。

カレントディレクトリには

●●●●●.pem

touch SSH コマンド実行後のカレントディレクトリは

●●●●●.pem SSH

という状態になっておりtouchコマンドをディレクトリを作るコマンドだと思っていた私はSSHをディレクトリだと認識しています。その後キーをSSHディレクトリに移動させようとmvコマンドを実行します。

mv ●●●●●.pem SSH

ここでも深刻な問題が起っています。mvコマンドは移動させることだけではなく名前を変更させることもできるコマンドなのです！つまり・・・・

mv 名前を変えたいファイル名　変更したい名前

というように上記の私が実行したコマンドは移動させるのではなく名前を変えるコマンドととらえられてしまったのです。笑笑　また名前を変えた後SSHという同じ名前をしたファイルが存在することになるので、旧SSHファイルはSSHという名前に変わったキーである新SSHファイルに上書きされます。そうなるとカレントディレクトリに残るのはSSHという文字のみ・・・あたかもSSHディレクトリにキーの移動が成功したように見えるのです。

mvコマンド実行後のカレントディレクトリは

/**SSHというディレクトリが存在するのではなくSSHという名前の●●●●●.pemが存在しているだけ*/
SSH

酔っ払っていてそのことに気づかなかった私はあたかもキーがnot a directoryという自分で作った謎のディレクトリにキーを異世界転生させてしまったと錯覚したのです。

また俺何かやっちゃいました？




●今回の事件からの学び
・大事なファイルを移動させるときは細心の注意を払う。
・コマンドを正確に理解した上でコマンドを実行する。
・酒を飲みながら作業してはいけない。


その後・・・
キー太郎「なんだったんだこれは・・狐に包まれた気分。」
友人「ぱっと見.txtとか.html.javaとかついてないとディレクトリかと思うよな」
キー太郎「まあ擬似異世界転生体験できたし良いか笑！！！」
友人「委員会！」


以上です。ここまで駄文を読んでいただき本当にありがとうございます。何か気づいた点、突っ込みどころがありましたらなんなりとコメントを送ってください。
Sassで出来ること【vol.2】入れ子(ネスト)・変数

Sass勉強中の為、出来ることを備忘録がてら纏めて書いていきます。

#入れ子(ネスト)

**scssでは要素を入れ子にすることが出来ます！**
cssでこんなファイルがあるとします。

```css:.css
.main-nav{
   display: flex;
   font-size: 1.5rem;
   text-transform: uppercase;
   list-style: none;
}
.main-nav li{
   margin-left: 30px;
}
.main-nav a{
   color: #000;
   display: inline-block;
   position: relative;
   text-decoration: none;
}
```

**全く同じ内容をscssではこのように書くことが出来ます！**

```scss:.scss
.main-nav{
   display: flex;
   font-size: 1.5rem;
   text-transform: uppercase;
   list-style: none;
   li{
      margin-left: 30px;
   }
   a{
      color: #000;
      display: inline-block;
      position: relative;
      text-decoration: none;
   }
}
```

一見そんなに変わらないのですが
**例えば「.main-nav」の名前を変更する必要が出た際に記述し直す部分が一カ所だけになり、
メンテナンスやコードの再利用がとても楽になります。**

##プロパティのネスト

**プロパティも入れ子にすることが出来ます。**

```scss:.scss
p {
   margin-top: 10px;
   font:{
      color: #432;
      size: 15px;
   }  
}
```
コンパイルするとこの様になります。

```css:変換後のcss
p {
   margin-top: 10px;
   font-color: #432;
   font-size: 15px;
}
```

これは普通に書いた方が分かりやすそうです。
**scssでは入れ子に出来ますが、しなくても生成されるcssファイルは変わらないという点がすばらしいと思います。
他の出来ることについてもそうなのですが、都合の良い時だけ拡張機能を使えるイメージです。**

#変数
なんと、変数を使用することが出来ます！

**変数の名前は$から始め、「：」で区切ります。
上から２行が変数宣言です。**

```scss:.scss
$text_color: #333;
$top_margin: 20px;
p {
   font-color: $text_color;
   margin-top: $top_margin;
}
h1 {
   font-color: $text_color;
   margin-top: $top_margin;
}
```

コンパイルするとこの様になります。

```css:変換後のcss
p {
   font-color: #333;
   margin-top: 20px;
}
h1 {
   font-color: #333;
   margin-top: 20px;
}
```

色やサイズ等、繰り返し使う値を宣言するととても便利です。
**「ここの色、変更し忘れた！」とか「あの時使った色何だっけ？」と記述を探す時間が大幅に減りました。**

#リンク

[Sassで出来ること【vol.1】Sassとは？](https://qiita.com/torajiro_u/items/f7b5ba19b51de956cb88)
Sassで出来ること【vol.2】入れ子(ネスト)・変数
[Sassで出来ること【vol.3】関数]
(https://qiita.com/torajiro_u/items/5f9d34206316325f8f95)
[Sassで出来ること【vol.4】継承](https://qiita.com/torajiro_u/items/fa4b492753b4a1925724)
[Sassで出来ること【vol.5】mixin(ミックスイン)]
(https://qiita.com/torajiro_u/items/96ee60174c1b3e561f3e)
カンマ区切りで複数ワードをsubmitできるテキストフィールド[React, Material-UI]


# やりたいこと

Material-UIベースで、テキストを入力し、Tabを押したらChipでテキストを登録して、複数ワードを配列でsubmitできるテキストフィールドが欲しい。

↓こんなの

![Jan-19-2020 18-33-28.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174325/201a632e-a84d-eadc-1e25-26fa1102eaf5.gif)

# サンプル

codesandboxにサンプルを上げたので触ってみてください

[![Edit creatable-chip-input-comma-separatable](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/creatable-chip-input-comma-separatable-ubj52?fontsize=14&hidenavigation=1&theme=dark)

# ロジック

materual-ui-chip-inputという、ベストなライブラリがあったので使っています。
やっていることは、これにpropsを色々詰めているだけですが、カンマ区切りのところだけイベントハンドラで制御しています。

条件は、

* カンマで区切られた場合は複数を一度に入力
* カンマはじまり、カンマおわりで空の配列を登録してしまわないようにする
* 重複は登録しない

といった感じです。
カンマがなければ普通に入力されます。

こちらがイベントハンドラです。

```js
  // Enable comma separation, Do not allow duplicates.
  handleAddKeywords = (...chips) => {
    const separetedChips = chips.shift().split(",");
    const combinedChips = [...this.state.keywords, ...separetedChips];
    const newKeywords = combinedChips.filter(
      (v, i, self) => [...self, ...this.state.keywords].indexOf(v) === i && v
    );
    this.setState({ keywords: [...newKeywords] });
  };
```

1. 入力されたワードをカンマで区切って
2. 既に入力されている配列と結合して
3. 重複チェック & 空チェック
4. stateにset

という流れです。
spread operatorが多くて少しわかりにくいですが、割と簡単に実装できました。
Sassで出来ること【vol.1】Sassとは？

CSSやHTMLの勉強をしている時にたまたま **"Sass"(サース)** に出会い、
「これは便利！」と感動したので備忘録がてらにSassについての記事を書きます。

#Sassとは？
####Sass :　**S**yntactically **A**wesome **S**tyle Sheets
の略で日本語に訳すと「構分的にすばらしいスタイルシート」なのですが簡単に言うと、
**「CSSをより効率よく記述することの出来る言語」**です。
間違いなく普通にcssを記述するよりも、効率よく記述することが出来ます！


##記法について
Sassには記法が２種類あります。

####・拡張子が.sassの「SASS記法」

```sass:.sass
.hoge
  margin: 0 auto
  .huga
    color: #000
```

元々Sassは名前の通りこちらの記述方法だったようです。
インデントで依存関係を示します。rubyっぽいですね。


####・拡張子が.scssの「SCSS記法」

```scss:.scss
.hoge{
  margin: 0 auto;
  .huga{
    color: #000;
  }
}
```

よりcssと記法が近く、括弧{}を入れ子にすることで依存関係を示します。
個人的には入れ子に出来るだけでもコピペから解放されて嬉しいのですが
**SCSS記法はCSSの完全な上位互換となっていて、
CSSの書き方もそのまま使うことが出来てさらに様々な便利機能が追加されています。**
記事ではこちらの「SCSS記法」でSassの出来ることを纏めていきたいと思います。


**.cssファイルにコンパイル**

```css:変換後の.css
.hoge{
  margin: 0 auto;
}
.hoge.huga{
    color: #000;
}
```
.cssファイルにコンパイルすると
上のsass,scssファイル両方ともに同じ結果が出力されます。

##環境構築について
**scssファイルはcssファイルにコンパイルする必要があります。**
なのでその為の環境を構築する必要があります。
というとすごく面倒くさそうですが自分は10分位で終わりました。

環境は様々ありますが、
自分は**「Atom」**というテキストエディタに**「sass-autocompile」**というパッケージを入れて使用しています。

[Atomのsass-autocompileでSassのコンパイルをしてみよう](http://weblifetimes.com/atom-sassautocompile/)
上記の環境の構築についてすごく分かりやすく解説してくれています。

**コンパイルといってもscssファイルを保存すると、
自動でcssファイルを生成してくれるので全く手間になりません。**

#リンク

Sassで出来ること【vol.1】Sassとは？
[Sassで出来ること【vol.2】入れ子(ネスト)・変数](https://qiita.com/torajiro_u/items/2f8370b92eaee17beb61)
[Sassで出来ること【vol.3】関数]
(https://qiita.com/torajiro_u/items/5f9d34206316325f8f95)
[Sassで出来ること【vol.4】継承](https://qiita.com/torajiro_u/items/fa4b492753b4a1925724)
[Sassで出来ること【vol.5】mixin(ミックスイン)]
(https://qiita.com/torajiro_u/items/96ee60174c1b3e561f3e)
javascript R

JavaScript関数型プログラミング 複雑性を抑える発想と実践法を学ぶ impress top gearシリーズ Kindle版

https://www.amazon.co.jp/gp/product/B072JVPFL4/ref=ppx_yo_dt_b_d_asin_title_o01?ie=UTF8&psc=1
https://www.webprofessional.jp/functional-programming-with-ramda/

```javascript
> var R = require('ramda')

> function isString (test) {
...     return R.is(String, test);
... }
undefined
>
> var result = isString('foo'); //=> true
undefined
> result
true
```

最近関数言語に興味がある
Javaで実行しているディレクトリの絶対パスを取得する方法

##はじめに
Qiita初投稿です。
#環境
java1.8.0_221
#やりたいこと
`C:\Users\Miyayu\IDEA\example\example.jar`を実行しているとする。
`C:\Users\Miyayu\IDEA\example`(String型)を取り出したい。
#コード
```java
FileSystems.getDefault().getPath("").toAbsolutePath().toString()
```
これだけ！かんたんでしょ？
##指定したファイルの絶対パスを知りたいときは
`.\expdir\hoge.json`の絶対パスを知りたい

```java
FileSystems.getDefault().getPath("expdir","hoge.json").toAbsolutePath().toString()
```
より問題の起こりづらいAPI 定義のリファクタリングを目指して

#はじめに
継続的な運用が必要な API を作成・運用したことがあるひとなら誰でもぶつかる問題の一つがリファクタリング。既存で走らせている API があるが、もともとの設計が良くなかった、作ったときとは状況が変わったために使いづらくなった、など様々な理由でリファクタリングをする必要が生じる場合があると思います。この記事ではなるべく問題の少ない方法でリファクタリングする方法を考えてみたので紹介します。

なお、前提条件として、サーバー側とクライアントが同時にアップデートできない状況（クライアント側がアプリである場合など）とし、API の例として書籍のデータを JSON データを通信に使用して読み書きするシステムを例とします。

#ケース１: API のパラメータ名を変更したい
以下のように、書籍のリストを取得する API があったとします。パラメータとして sort をとり、指定されたフィールド名で昇順でソートされるとします。

```
GET /api/v1/book/book?sort=[filed_name]
```

sort (英語の意味：並び替えすること)はソートするフィールドを表す単語としては適切でないと判断し、orderBy と変更したいとします。この場合、すでに存在する```sort```と```orderBy```を両方サポートする期間を設け、その期間を経過した後に```sort```パラメータを廃止します。

#ケース2: API の URL path を変更したい
ID を指定して一つの書籍のデータを取る API があったとします。

```
GET /api/v1/book/getBook/:id
```

```getBook``` という名前は REST の考え方とあっていなかったので```book``` というリソースを意識した名前に変更したいとします。この場合もパラメータ名の変更と同様に以下の２つの path を生かした期間を設け、その期間を経過した後に```getBook```を使用している path を削除するとよいでしょう。

```
GET /api/v1/book/getBook/:id
GET /api/v1/book/book/:id
```

#ケース3: API が返すモデルのなかのフィールドの型を変更したい
以下のような Book モデルがあったとします。

```
{
  id: number
  title: string
  description: string
  author: string
}
```
それを以下のように```author```を```string```から Author モデルに変更したいとします。

```
{
  id: number
  title: string
  description: string
  author: Author {
    name: string
    age: number
  }
}
```
ここでは注意が必要です、author フィールドはもともと```string```であったため、単純に```string```から```Author モデル```にしてしまうとクライアントでパースエラーが出てしまうことは目に見えています。そこで、一度 authorModel というフィールド名を経由して最終的に author とする方法をとります。上述のように、author と authorModel の両方のフィールドをそれぞれ```string```、```Author モデル```でサポートする期間を設ける。その後、author を```Author モデル```に変更し、author と authorModel 両方を```Author モデルで```サポートする期間を設けます。その後、authorModel フィールドを削除します。かなり回りくどいですがこれは仕方ないですね ....

#ケース4: API の返すモデルのあるフィールドが必要なくなった
以下の Book モデルがあったとします。

```
{
  id: number
  title: string
  description: string
}
```

システム開始当初、description フィールドを用意したはいいものの、実際にはほとんど使用されておらずデータ量を増やして DB 維持コストを増やしている原因であるので削除することにしたとします。期限を設けてクライアント側の開発者に対処してもらうのですが、もしかするとクライアント側が対応した後もユーザーが古いクライアントを使用していることも考えられますので、DB から description のデータを削除した後も description フィールドに空文字を入れた状態にすると、少なくともクラッシュを防げる状態になると思います。

#最後に
クライアントが API のアップデートと同時にアップデートできないケースではこのような回り道をどうしてもしなければなりません。これは保守するエンジニアにとって負担のかかることです。スタートアップでリソースかつかつだよ〜（僕もそう）という場合には、API アクセス数を計測しておけば、使用者が限りなく少ない API に関してはえいやで API を落としてしまうという判断も場合によってはあるかもとは思います。（クライアント側でその機能だけ動かないがとりあえずクラッシュしない状態には最低限しておく必要がある）
macにJulia（1.3.1）をインストールする

# 概要
mac に Julia をインストールします。

この記事では、ターミナルでコマンドを実行できるところまでを扱います。
IDEの利用やライブラリのインストールなどについては、今後の記事で書く予定です。

ちなみに、この作業を行ったのは 2020/1/19 です。
バージョンや、公式サイトの更新等によって手続きが変わる可能性があります。
# 環境
macOS：10.15.2 (Catalina)
Julia：1.3.1
# Juliaのインストール手続き
## ダウンロード
公式サイトより、dmgファイルをダウンロードしてきます。

**The Julia Language**
https://julialang.org/

### トップページ
`Download v1.3` をクリック
![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/e8bd0ddf-ed44-8fd8-0d60-43d7d851825f.png)
↓
### ダウンロードページ
`mac OS10.8+` の項目にある `64-bit` をクリック。
`julia-1.3.1-mac64.dmg` がダウンロードされる。
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/01e16793-a4fa-194c-505d-55aed30f5c86.png)

## インストール
dmgファイルを実行して、 `app` ファイルを `Application` フォルダに入れるだけです。
![dmg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/d67e2ab5-abeb-8d93-97b2-716c592c44ca.png)

# Juliaを使ってみる
## Juliaの起動
`Application` フォルダに入れた app ファイルを実行すると、
ターミナルが起動し、 `Julia` が起動した状態となります。
また、この状態は、`REPL(インタラクティブモード)`と呼ばれ、
`enter`が押されるたびに、一行ずつ命令が実行されます。

![julia_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/9a9e2979-bcb7-2944-17e1-7d605a37e60e.png)

REPLの使い方については、以下記事で解説しています。

**JuliaのREPL（インタラクティブモード）の使い方**
https://qiita.com/beckyJPN/items/bde9913498f789c8d144

### 起動できない場合
インターネットから落としてきたファイルの場合、セキュリティ上の関係で直接実行できない場合があります。
その場合は、以下サイトなどを参考に、実行できる状態としてください。

**Mac - インターネットからダウンロードしたアプリの実行許可 - PC設定のカルマ**
https://pc-karuma.net/download-app-security/

## 何か表示してみる
試しに以下コマンドを入力して、文字を表示してみましょう。

```julia
print("Hello Julia!")
```
次の行に `Hello Julia!` と表示されました。
![スクリーンショット 2020-01-19 18.35.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/2e5aa738-e932-a673-e49f-ce4f1892b55c.png)



## Juliaにパスを通す
とりあえず、これで準備は完了ですが、現在の状態だとパスが通ってないため、
単にターミナルを起動した状態では、 `julia` のコマンドを認識しません。
![スクリーンショット 2020-01-19 18.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/21d0cb42-7e69-6e8f-b063-9d5807732b64.png)

なので、ユーザーのHomeフォルダにある、 `.bash_profile` にPATHを書いておきましょう。
ファイルがない場合は、作成しつつ書き込みます。

```bash
$ cd ~
$ echo "export PATH=${PATH}:/Applications/Julia-1.3.app/Contents/Resources/julia/bin" >> .bash_profile
```
これで、パスが通りました。
ターミナルを再起動して、 `julia` と打ち込んで立ち上がるか確認してみてください。