OmniAICreator/Qiita-1.07M huggingface dataset:
AngularでFroala Editorを日本語にする設定方法

Angularのインストール手順は省きます。すいません。

Angularでwysiwygエディタを作るために
[Froala Editor](https://www.froala.com/wysiwyg-editor)の[angular-froala-wysiwyg](https://www.npmjs.com/package/angular-froala-wysiwyg)というライブラリを使います。

1.npm install

```
npm install angular-froala-wysiwyg
```

2.インストールが完了したら設定ファイルに追記

```typescript:app.module.ts
import { FroalaEditorModule, FroalaViewModule } from 'angular-froala-wysiwyg';
 
 imports: [
   ...
   FroalaEditorModule.forRoot(),
   FroalaViewModule.forRoot()
 ]
 
```

```json:.angular.json
  "styles": [
    "styles.css",
    "../node_modules/froala-editor/css/froala_editor.pkgd.min.css",
    "../node_modules/froala-editor/css/froala_style.min.css",
    "../node_modules/font-awesome/css/font-awesome.css"
  ],
  "scripts": [
    "../node_modules/jquery/dist/jquery.min.js",
    "../node_modules/froala-editor/js/froala_editor.pkgd.min.js",
    "../node_modules/froala-editor/js/languages/ja.js"
  ],
 
```
scriptsで"ja.js"を読み込ませていますが、これがFroala Editorを日本語化するためのファイルになります。他の言語も用意されています。詳しくは[こちら](https://www.froala.com/wysiwyg-editor/languages)。

3.エディタを表示させるコンポーネントファイルに追記

```typescript:hoge.component.ts
import { Component, OnInit } from '@angular/core';

@Component({
  ...,
  template: `<div [froalaEditor]="options"></div>`
})
export class AdminComponent implements OnInit {

  public options: Object = {
    language: 'ja',
  };

  constructor() { }

  ngOnInit () {
  }
}
```

optionsに"language"で"ja"を指定して完成です。

<img width="944" alt="Screen Shot 2019-02-05 at 19.08.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/103044/45d3196e-5471-61ac-13e0-817a681024d0.png">
OpenCV(with VS2017)をReleaseモード実行したらhdf5.dllが見つからないと言われた問題について

## 環境
- Windows 10
- OpenCV 4.0.1
- Visual Studio 2017 Community
- CMake 3.11.3

## 症状
OpenCV3.4とVisual Studio 2017で画像処理プログラムを組もうとしていたところ。
Debugモード(x64)ではビルド実行まで問題なく動くものの、Releaseモードにした途端に
ビルドは成功するものの、ランタイムエラーとなり以下のエラー文を出力された。
<font color="Red">**「hdf5.dllが見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。」**</font>

## 考察　(結果だけ見たい人は飛ばしてください)
　hdf5.dllがない問題について、Releaseモードでソースをコンパイルしてリンカーでdllと結合する時にhdf5.dllがないと言われているので、じゃあ安直だがhdf5.dllを探して該当ファイル構造に組み込んでやればいいと思った。調べるとwindowsではregsvr32.exeを実行して.dllファイルを登録することが出来るらしい。hdf5.dllは以前に構築したpython環境下にあったので、コピペして登録してみたが、上手くいかなかった。どうやらこれは間違いのようだ。

　新しくVC++プロジェクトを再作成し、OpenCVを設定した後、自動出力されたHello, WorldプログラムにOpenCVをincludeしてRelease実行したところ、同様のエラーを吐いたので、恐らくソースコードに問題があるわけではなさそう。

　同じ問題に直面している人がいたので、リンクを貼っておく。
[2018-9-18. Getting the error : 'The code execution cannot proceed because hdf5.dll was not found' in Visual Studio 2015]
https://stackoverflow.com/questions/52387277/getting-the-error-the-code-execution-cannot-proceed-because-hdf5-dll-was-not

　リンク先コメント欄ではプロジェクト設定のビルドイベントにxcopyを入れろとの回答があったが、質問者はpython tool for visual studio 2015インストールしたらエラー吐かなくなったよ！と言っていた。なんだそりゃ。

　試しにVisual Studio Installerでpythonツールをインストールしてみたがやはり同様のエラーだった。しかしソースに問題はない(はず)ので、opencvのcmakeビルドからやり直してみることにした。最初のcmakeビルド構築手順から間違っているのではないかと予想した。というわけで以下を参考にpython環境も同時にビルドすることにした。
[2016-01-05 OpenCV3.1の導入with CMake]
https://yumetodo.hateblo.jp/entry/2016/01/05/161620


## 結果
　<font color="Red">**結論から言うと無事にRelease, Debugモードで実行することが出来ました。**</font>
　
　原因はVisual Studio側ではなく、OpenCVをCMakeでビルドする時にPython環境をまとめてビルドしてやる必要があったということ。c++版をビルドしているはずなのに何故python？という疑問がありましたが、OpenCVが裏で何をやってるのかは分からないので、詳しい方は感想や意見をコメントで残してくれると嬉しいです。　
　
　ただ、この記事を書いてる時点で既にOpenCV4.0.1がリリースされていたので、CMakeで最初からビルドし直すならもうOpenCV4に移行しようと思いまして、冒頭の3.4ではなく4でビルドしていますのでご注意ください。

　![cmake_opencv4.0.1.png](https://qiita-image-store.s3.amazonaws.com/0/346981/ecd0493f-af80-ff79-671c-5be8dce867a0.png)

　コメントや意見、質問などありましたらお願いします。役に立ったと思ったらいいね押しといてください。
【Laravel5.7】No hint path defined for [pagination] ページネーションでエラーが出る場合の解決方法

# ページネーションを設定したらエラーが出て困った

```php:こんな感じにデータを取得して
$users = $query->paginate(50);
```

```php:こんな感じのページネーションを書いたことだろう。
{{ $users->links() }}
```

```zsh:
No hint path defined for [pagination]
```

どんなチュートリアルサイトにも簡単に実装できるぜ的な感じで書いてあるのに、なぜ！！！

いまだに詳しい原因はわかっておりませんが。

以下で解決できますし、どうせ最終的に以下のような実装をすることになるので良いでしょう。

## ページネーションのviewファイルを書き出す
ライブラリからviewのパーシャルファイルだけを書き出して、独自カスタマイズして、それを呼び出すようにしましょう。

```php:これを実行すると、ページネーション用のパーシャルファイルを呼び出す。
{{ $users->links() }}
```

### 手順1：書き出す
以下を実行しvendor以下にページネーション用のファイルを書き出す

```zsh:console
php artisan vendor:publish --tag=laravel-pagination
```


### 手順2：無駄なファイルは削除する
こんな感じにファイルが生成されるでしょう。
使うのは1つなので不要なものは削除

今回は `default` と書かれていたものを `admin` という名前にしてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69647/98b82c8f-ffc4-c95f-65a4-7dd05b81efdf.png)


### 手順3：viewで呼び出す
これで表示されるはず！
もしされなかったらさらなる探求を続けて欲しい、旅人よ。

```
{{ $clients->links('vendor.pagination.admin') }}
```




### 手順4：先ほどのファイルの中身を編集してデザインとかを適応していく。

ここはお好みで

最終的に本番環境などでページネーションを運用するのであれば、編集して利用することになると思います。
なのでこの方式を取っても問題ないかなと思いました。
JuliaとEinsum.jlで計量テンソルを計算してみた（アインシュタインの縮約記法）


Juliaで[アインシュタインの縮約記法](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E7%B8%AE%E7%B4%84%E8%A8%98%E6%B3%95)が使えるパッケージ[Einsum.jl](https://github.com/ahwillia/Einsum.jl)を使ってみました。

実は、Juliaを始めたのはこれが目的だったり。

使い方はEinsum.jlの[README.md](https://github.com/ahwillia/Einsum.jl/blob/master/README.md)を参照。

Juliaのインストール方法については[前回記事](https://qiita.com/MTNakata/items/54b8c0fc49df4d026eef)参照のこと。



## Einsumパッケージをインストール

前回同様、Juliaを立ち上げてパッケージをインストールします。

ターミナルで

```
$ julia
julia>[
(v1.0) pkg> add Einsum
```

これでOK。

## 問題

テンソル代数の問題は[テンソル解析 (基礎数学選書 23)](https://www.amazon.co.jp/%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB%E8%A7%A3%E6%9E%90-%E5%9F%BA%E7%A4%8E%E6%95%B0%E5%AD%A6%E9%81%B8%E6%9B%B8-23-%E7%94%B0%E4%BB%A3-%E5%98%89%E5%AE%8F/dp/4785311258) p179より。

以前の記事で、同じ教科書の別の問題をNumPyで解いてました。
過去記事1：https://qiita.com/MTNakata/items/c23b221fcafa23a095eb
過去記事2：https://qiita.com/MTNakata/items/8c431ca225c5576de18a

以下のような、直交基底$\Sigma${$e_1,e_2,e_3$}から基底$\Sigma'${$e'_1,e'_2,e'_3$}への変換式

```math
\begin{aligned}
&e'_1 = 2 e_1 \\
&e'_2 = -e_1 + e_2 \\
&e'_3 = e_1 -2 e_2 + 3 e_3
\end{aligned}

```
を持つ場合に基底$\Sigma'$の計量テンソル$g'_{ab}$を求める問題。

## 準備

共変の基底ベクトル$e_i$は行ベクトルを表すので、変換式を行列で書き直すと

```math
\begin{pmatrix}
e'_1 & e'_2 & e'_3
\end{pmatrix}
=
\begin{pmatrix}
e_1 & e_2 & e_3
\end{pmatrix}
\,
\begin{pmatrix}
2 & -1 & 1 \\
0 & 1 & -2 \\
0 & 0 & 3
\end{pmatrix}
```
のようになります。

アインシュタインの縮約記法で書くと以下の通り。

```math
e'_a = e_i \, \bar{A^i{}_a}

```

$\bar{A}$は行列$A$の逆行列です。

$\bar{A}$を`A_inv`に、$A$を`A`に、Juliaで変数代入します。

```julia
func1 = [2,0,0] #変換式1を列ベクトルで
func2 = [-1,1,0] #変換式2を列ベクトルで
func3 = [1,-2,3] #変換式3を列ベクトルで
A_inv = [func1 func2 func3]

#3×3 Array{Int64,2}:
# 2  -1   1
# 0   1  -2
# 0   0   3

A = inv(A_inv)

#3×3 Array{Float64,2}:
# 0.5  0.5  0.166667
# 0.0  1.0  0.666667
# 0.0  0.0  0.333333
```

Juliaで逆行列を求めるには、`inv()`を使います。

Python（というかNumPy）と行列の書き方が違うので違和感はありますが、なんとなくJuliaのほうがすっきりしているかな。

慣れればこっちのほうがラクそう。

## 解答

計量テンソル（共変・反変）の変換式は以下の通り。

```math
\begin{aligned}
g'_{ab} &= \bar{A^i{}_a} \, \bar{A^j{}_b} g_{ij} \\
&= \bar{A^i{}_a} \, \bar{A^j{}_b} \delta_{ij} 
= \bar{A^i{}_a} \, \bar{A^i{}_b}
\end{aligned}
```

```math
\begin{aligned}
g'^{ab} &= A^a{}_i \, A^b{}_j g^{ij} \\
&= A^a{}_i \, A^b{}_j \delta_{ij}
= A^a{}_i \, A^b{}_i
\end{aligned}
```

ここで、$g_{ij}, g^{ij}$は基底$\Sigma$の計量テンソル。$g'_{ab}, g'^{ab}$は基底$\Sigma'$の計量テンソル。

$\Sigma$は直交基底なので$g_{ij}=g^{ij}=\delta_{ij}$です。


では、早速Juliaで計算していきます。

Jupyter notebookを立ち上げて、Einsumパッケージを読み込みます。

```julia
using Einsum
```
まずは、$g'_{ab}$を計算。

```math
\begin{aligned}
g'_{ab} = \bar{A^i{}_a} \, \bar{A^i{}_b}
\end{aligned}
```

```julia
@einsum g1[a,b] := A_inv[i,a] * A_inv[i,b]

#3×3 Array{Int64,2}:
#  4  -2   2
# -2   2  -3
#  2  -3  14
```

次に、$g'^{ab}$を計算。

```math
\begin{aligned}
g'^{ab} = A^a{}_i \, A^b{}_i
\end{aligned}
```

```julia
@einsum g2[a,b] := A[a,i] * A[b,i]

#3×3 Array{Float64,2}:
# 0.527778   0.611111  0.0555556
# 0.611111   1.44444   0.222222 
# 0.0555556  0.222222  0.111111 
```

数式そのままで書けて、とてもわかりやすいですね。
Docker初心者がDockerでRailsの開発環境作るときに参考にしたサイトまとめ

# 入門編

とりあえず、dockerがなんだかよくわからないんだけど状態の人向け。
めっちゃわかりやすかった。何回も繰り返し読んでる。
docker-componentの説明までついてるのうれしい。

[さくらのナレッジ Docker入門(全5回)](https://knowledge.sakura.ad.jp/13265/)


# Rails -> MySQLの簡易アプリをDockerコンテナで作る

なんとなく使い方わかったので、Rails -> MySQLの簡易アプリを作った。
公式ドキュメントにTutrialがあったので参考にした。
Railsの起動とか、 Rails -> MySQLの連携をごにょごにょ触っているとだんだんなれた。
Qiitaの記事がMySQLでわかりやすかった。

[Quickstart: Compose and Rails](https://docs.docker.com/compose/rails/)

[Docker入門 #5 【Ruby on Rails5環境構築】](https://qiita.com/wMETAw/items/8cb41425a5d0bdace2df)

# Nginx -> Rails -> Cloud_SQL_proxy -> Cloud_SQLのコンテナを作る

Nginx はさくらの記事にあったのでそれを参考にした。
CloudSqlProxyの使い方は以下の記事がわかりやすかった。

[docker-composeでGoogle Cloud SQLに開発環境から接続する](https://qiita.com/wasanx25/items/0e888f656c101dd90853)
ある要素の後に特定のテキストノードがある場合の xpath の書き方

gem の [html-pipeline](https://github.com/jch/html-pipeline) を使って、独自のマークダウンフィルターを追加しているとき、ビジネスロジック上、かなり変化球なフィルターを作りたくなるときがあると思います。もしくは、コード上は入り組んでるけど諸事情があってそういった仕様にしなきゃいけないときとか。

今回、結局使わなかったけど、なかなかイレギュラーな xpath の書き方だなと思ったので、備忘録的にここにメモしておきます。
（こういう備忘録的なこと書くのってやっぱ個人のブログの方が良いんだよね…？ブログ作ろ…）

## 特定のテキストノードが a タグの後にある場合とは
html-pipeline の `HTML::Pipeline::MarkdownFilter` を使うときの依存 gem である Commonmarker のそもそもの設計思想として、「マークダウンはHTMLを書くためのものじゃないよ」ってのがあります。そのため、変換できない要素とか属性とかが結構あったりします。

たとえば、 `<div>` とか、 `target="_blank"` とか。

なので、これらをもしマークダウンで書けるようにしたいのであれば、独自のフィルターを作るしかない。うん作ろう。


### リンクに `target="_blank"` をつけるための記法を決める
`[]():blank` のように、リンクの末尾に `:blank` がある場合は、 `target="_blank"` をつけようみたいな仕様を考えたとします。

```markdown
[これは target="_blank" のリンクです。](https://example.com)       → target="_blank" つかない
[これは target="_blank" のリンクです。](https://example.com):blank → target="_blank" つく
```

このとき、`HTML::Pipeline::MarkdownFilter` の内部で動いてる [nokogiri](https://github.com/sparklemotion/nokogiri) は以下のようにパースしてくれています。

```ruby
(Element:0x3fc248dead9c {
  name = "p",
  children = [
    #(Element:0x3fc248df7330 {
      name = "a",
      attributes = [
        #(Attr:0x3fc248f308dc { name = "href", value = "https://example.com" })],
      children = [ #(Text "これは target=\"_blank\" のリンクです")]
      }),
    #(Text ":blank")]
  })
```

このように、 `Element` の後に `Text` が続いてるのが分かると思います。つまり、 `[]():blank` のように書く場合はおおよそ上記の構造になると考えて差し支えなさそう。

### nokogiri で `target="_blank"` を付与する
詳細は html-pipeline の仕様とも絡むので詳細は割愛しますが、 `HTML::Pipeline` を初期化するときに引数に独自のフィルターを渡すと、内部の `call` メソッド内で `doc` メソッド経由で `Nokogiri::HTML::DocumentFragment` にアクセスすることができます。このインスタンスにパースされる HTML 要素が全部詰まっています。

```ruby
class HogeFilter < HTML::Pipeline::Filter
  def call
    # your custom filter goes here
    # ex) doc.css('a').each { |a| a[:rel] = "nofollow" }
    #     doc.search('.youtube-movie').wrap("<div class='wrapper'>")
  end
end
```

ここで、 直後に `:blank` というテキストを持つ a タグのみを抽出する方法を xpath で書きたいと思います。

```ruby
doc.xpath('.//a[contains(following-sibling::text(), ":blank")]')
```

ところで xpath の記法については [クローラ作成に必須！XPATHの記法まとめ](https://qiita.com/rllllho/items/cb1187cec0fb17fc650a) がおすすめです！

ということで、これバカみてーに一日試行錯誤してこういう記法に落ち着きましたが、他にもっと短い（もしくは xpath を使わない）記法がありましたら教えていただけると幸いです。 RuboCop に怒られる確率も減ることでしょう…。

## 参考文献

https://qiita.com/rllllho/items/cb1187cec0fb17fc650a
https://github.com/jch/html-pipeline
https://github.com/sparklemotion/nokogiri
https://gogodiet.net/z/xml/7.htm
https://www.techscore.com/tech/XML/XPath/XPath3/xpath03.html/
Nextcloud の同期アプリケーション

#はじめに
Nextcloudはオンラインストレージ環境を自前のサーバーで構築できるパッケージです。構築したNextcloudにはChromeやEdgeなどのブラウザーでアクセスするのが基本ですが、他のオンラインストレージサービスと同じように、同期アプリケーションでのアクセスも可能です。今回は、同期アプリケーションの設定方法について、紹介したいと思います。

#インストール・設定
[Nextcloudのダウンロードサイト](https://nextcloud.com/install/#install-clients)から、同期アプリケーションをダウンロードします。![168.png](https://qiita-image-store.s3.amazonaws.com/0/308127/9b935ffd-4327-5fbf-59a5-69a8312f55f0.png)

ダウンロード後、exeファイルを起動し、インストールを行います。インストール完了後、設定画面が起動しますので、ログインをクリックします。
![169.png](https://qiita-image-store.s3.amazonaws.com/0/308127/d42d9046-5eb9-b6ff-5584-40fd4cd0b559.png)

構築したNextcloudサーバーのアドレスを入力し、次へ。
![170.png](https://qiita-image-store.s3.amazonaws.com/0/308127/378681eb-8bfb-471c-9fd5-e085a51cbea5.png)

同期アプリ画面上に、ブラウザーと同じような画面が表示されますので、ログインをクリックします。
![171.png](https://qiita-image-store.s3.amazonaws.com/0/308127/6f600855-977b-21ba-da1e-c1c5bd3a93e0.png)

自分のユーザー名とパスワードを入力します。
![172.png](https://qiita-image-store.s3.amazonaws.com/0/308127/32e37614-ef48-7716-62fd-b4ca9f6964ab.png)

アクセス許可をクリックします。
![173.png](https://qiita-image-store.s3.amazonaws.com/0/308127/18a9c078-e219-746b-d917-1ae9b2b57c66.png)

ログイン設定が完了しました。次は同期設定です。ローカルフォルダーは、任意のフォルダーを指定します。
![174.png](https://qiita-image-store.s3.amazonaws.com/0/308127/9bfe3c77-30b7-fee7-aa2f-1db85ab9b231.png)

同期設定も完了しました。Nextcloudサーバーと同期がかかります。同期が完了すると緑色のチェックがつきますので、ローカルフォルダーへファイルがダウンロードされているか、確認してみてください。
![175.png](https://qiita-image-store.s3.amazonaws.com/0/308127/e299bc22-646e-6297-49e1-6536487babcd.png)

同期対象のフォルダーも設定できます。あまり使わないフォルダーや、大容量のフォルダーなどは、同期対象から外しておいた方がよいかもしれません。
![176.png](https://qiita-image-store.s3.amazonaws.com/0/308127/cc5f11fb-8053-3f04-7c2d-d3cead5b206c.png)

同期アプリは、常に動いていますので、タスクバーにアプリのアイコンが表示されています。
![178.png](https://qiita-image-store.s3.amazonaws.com/0/308127/c31891ec-7356-6d98-354a-a984ac686ff0.png)

同期アプリの便利なところは、ローカルフォルダー内のフォルダやファイルを右クリックすると、Nextcloudのメニューが表示され、共有設定やリンクのコピーができるところです。
![179.png](https://qiita-image-store.s3.amazonaws.com/0/308127/20b824a3-59c0-13f2-8525-e526806ee8b7.png)

このように、共有設定もすることができます。わざわざブラウザーでログインする必要がなくなります。
![180.png](https://qiita-image-store.s3.amazonaws.com/0/308127/ec7f5d4e-69d4-b394-aaff-6a18fbbdf007.png)

#まとめ
日頃、業務で利用するデスクトップPCは、同期アプリを利用した方が、利便性がよくなります。同期は、PC側にもファイルを保持しますので、PCのディスクに余裕があるのであれば、同期アプリの利用をお勧めします。逆に、常にファイルを同期していますので、外に持ち歩くノートPCで、テザリングなどを利用している方にはお勧めできません。（私もあっという間にデータ利用上限に達してしまった事が何回もあります。）

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
Ruby.学習その2

#### 投稿目的
- 個人の学習目的で投稿していきます。
- Rubyの入門を読みながら自分なりの思考で記述しています。

#### 参考資料

[ゼロからわかる Ruby 超入門 (かんたんIT基礎講座)](https://www.amazon.co.jp/ゼロからわかる-Ruby-超入門-かんたんIT基礎講座-五十嵐/dp/4297101238/ref=sr_1_3?ie=UTF8&qid=1549614126&sr=8-3&keywords=ruby+入門)

## 条件分岐とは？
- 条件とは[もし、〇〇以上だったら〇〇をする]みたいに条件を付けることで分岐点を作ることができ、そうすることでプログラムの幅が広がる。

#### trueとfalse
- trueとfalseも文字列と整数と同じでオブジェクトの一種。
- 条件式の結果はtrueかfalseで返る、条件が正しい場合はtrue、条件が誤っている場合はfalseとなる。

#### if文、end
- Rubyで条件分岐をする上で必要となるのがif(もし)とend(ここまで)を利用する。

```ruby
if 10 >= 10  #  条件
  puts "trueだよ"  #  条件がtrueの場合の処理を実行
end  /  ifの終わり
```

- 条件がtrueではない場合は何も実行せずにendの次の処理へ進む。
- 条件を満たされていないケースには2つあり、false(偽)とnil(何もない)が存在する。

#### unless
- unlessはifとは違って条件を満たしていない場合に処理を実行をする。
- 後置で記述する事もできる。

```ruby
unless 30 >= 100  # 条件
  puts "falseだよ"  # 条件がfalseの場合に処理を実行
end  / unlessの終わり
```

#### else
- 条件が満たせている場合と満たせていない場合どちらの場合でも処理を実行するようにするにはelseを利用します。

```ruby
if 10 >= 15 
  puts "trueの場合の処理"  # trueの処理
else 
  puts "falseの場合の処理"  # falseの処理
end
```

#### elsif 
- elseとifを組み合わせたelsifで分岐先を増やすことができる。

```ruby
if 10 <= 1
  puts "条件1true"  # 条件1がtrueの場合の処理
elsif 10 >= 1
  puts "条件2true"   # 条件2がtrueの場合の処理
else 
  puts "条件がfalse"  # 両方の条件がfalseの場合の処理
end
```

#### 後置if(if修飾子)
- 後置ifを利用することで複数行で記述したプログラムを1行で書くことができendを記述する必要がない。

```ruby
puts "trueだよ" if 10 >= 10 
```

## 条件分岐2
- 条件分岐にはifの他にcaseなども存在する。

#### case
- caseを利用することで条件1つに対して複数の処理候補を記述することができる。
- 候補は二つ以上追加しても問題はない。
 
```ruby
case 変数
when "候補1"  #  変数と候補1が等しい場合、処理を実行
    候補1と等しい場合の処理
when "候補2"  #  変数と候補2が等しい場合、処理を実行
    候補2と等しい場合の処理
end
```

- どの候補にも一致しない場合elseで一致しない場合の処理を記述することもできる。

```ruby
case 変数
when "候補1"  #  変数と候補1が等しい場合、処理を実行
    候補1と等しい場合の処理
when "候補2"  #  変数と候補2が等しい場合、処理を実行
    候補2と等しい場合の処理
else
    どの候補に一致しない場合の処理
end
```

- caseには変数を記述しないで条件式を記述して行うやり方もある。
- 条件式はif同様比較演算子などを利用して記述する。

```ruby
case
when 条件式1  
  puts "処理1"  #  条件1がtrueの場合の処理
when 条件式2
  puts "処理2"  #  条件2がtrueの場合の処理
end
```

## 条件演算子
- 複数の条件を組み合わせる時に利用するのが条件演算子。
- 条件はいくつ付けても問題はない。
  
##### ||条件演算子、&&条件演算子
- || は[または]、[or]を意味する。

```ruby
if 条件1 || 条件2  #  条件1または条件2という意味
  puts "どちらかの条件がtrue"  #  条件1か条件2がtrueの場合処理が実行される
end
```

- && は[かつ]、[and]を意味する。

```ruby
if 条件1 && 条件2  #  条件1かつ条件2という意味
  puts "両方の条件がtrue"  #  両方の条件がtrueに場合処理が実行される
end
```

## 比較演算子
- 条件式には比較演算子が利用される。
- 比較演算子とは〇〇より〇〇などと比較をするための記号.

|比較演算子|意味|
|:-:|:-:|
| < |左辺が右辺より小さい|
| > |左辺が右辺より大きい|
| <=|左辺が右辺より小さいまたは等しい|
| >=|左辺が右辺より大きいまたは等しい|
| ==|左辺が右辺と等しい|
| !=|左辺が右辺と等しくない|

#### 末尾に?が付くメソッド
- ?が付くメソッドはtrueかfalseで返すことが多い。

- even?メソッドは偶数かどうかを判断する。

```ruby
puts 10.even?  # true
```

- odd?メソッドは奇数かどうかを判断する。

```ruby
puts 10.odd?  # false
```

## timesメソッド
- timesメソッドは繰り返し処理を行うことができる。
- doがここから、endがここまでその間に処理内容を記述する。
- doとendのセットをブロックという。
 
```ruby
繰り返す回数.times do
    繰り返す処理内容
end
```

- doとendの代わりに{}を使用する事もできる。

```ruby
繰り返す回数.times {
    繰り返す処理内容
}
```

## while文
- 条件を付けてその条件が満たしている間は繰り返し処理を行う。
- whileはdoとendではなくwhileとendをセットで利用する。

```ruby
while 条件
  繰り返し行う処理内容
end
```
STARを動かすときに気をつけたいこと

# 概要

たまに STAR が動かないという話を聞くのと、よく同じ答えをしているのを聞くので。

# まとめ

普通の個人所有のPCでは動かないケースが多いだろう。
研究室などの強力なサーバーを使うことを検討する。

## 必要なメモリ容量

- 最低16GBあればよさそうだが
- 32GB以上はあったほうがよい
    - ヒトは、32GBでも無理だろう
    - マウスは、いけるかもしれないけど、32GBは厳しいのではないか？
        - 石井追記：コメントをいただいて、マウスも32GBは厳しいとのこと。ギリギリ32GBで動いていても、ときどきメモリ使用量が跳ね上がることがあるとのこと。

多ければ多いほうが良いだろう。

## スレッドについて

スレッドはデフォルトで、見えてるやつを全部使うはずなので、
STARを複数動かしたり、
共有計算機で複数人で使っているときは気をつけたほうがよい。

スレッド数は、オプションで指定できる。

# 参考情報

- https://academic.oup.com/view-large/figure/134103718/giz052fig5.jpg
- AWS
    -  r4.xlarge で失敗したが r4.2xlarge で成功
Oracle環境を新環境へまるまる移行する方法

以下の方法は、Oracleを停止させる必要はありますが（ダウンタイムは発生しますが）、手軽にOracleの環境を移行することができます。
なお、この方法はOracle環境一式をバックアップする方法としても有効です。

## 1.【現環境】Oracleを止める
```
# su - oracle
$ sqlplus sys as sysdba
SQL> shutdown immediate
SQL> quit
$ lsnrctl stop
```
## 2.【現環境】/u01ディレクトリを圧縮する
```
# cd /
# tar czvf u01.tgz /u01
```

## 3.【現環境】u01.tgzを新環境へコピー
```
$ scp u01.tgz <ユーザー名>@<コピー先のIPアドレス>:/home/<ユーザー名>
```

## 4.【新環境】u01.tgzを展開
```
$ tar zxvf u01.tgz
$ sudo -s
# mv u01 /
```

## 5.【新環境】以下のファイルを更新する
例）hoge.local -> fuga.localへ変更する場合

### /u01/app/oracle/product/x.x.x/dbhome_1/admin/listener.ora

変更前）

```
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hoge.local)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
```

変更後）

```
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = fuga.local)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
```

### /u01/app/oracle/product/x.x.x/dbhome_1/admin/tnsnames.ora

変更前）

```
HOGE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = hoge.local)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ACTIVITI)
    )
  )

LISTENER_HOGE =
  (ADDRESS = (PROTOCOL = TCP)(HOST = hoge.local)(PORT = 1521))
```

変更後）

```
HOGE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = fuga.local)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ACTIVITI)
    )
  )

LISTENER_HOGE =
  (ADDRESS = (PROTOCOL = TCP)(HOST = fuga.local)(PORT = 1521))
```

## 6.【新環境】Oracleを立ち上げる
以下のコマンドを実行し、特にエラー等が表示されなければ移行完了です。

```
# su - oracle
$ sqlplus sys as sysdba
SQL> startup
SQL> quit
$ lsnrctl start
```
和暦(平成)の日付を直書き(オンコーディング)しているソースを探す

# 経緯
悲しいことに、2019/05/01の元号代わりの対応をしないといけない状況に追い込まれています。
前回の平成の時に手抜きの対応したために、大量の修正が発生しそうです。

また、最悪なことに和暦の日付をコンスタント値で大小比較したりしていて、ロジックによっては誤作動しまくることが分かってきました。
取りあえず、影響箇所を絞り込むためにCOBOLソースを検索するのにちょっと苦労したので覚え書きを書いておきます。

# 正規表現で検索
```
grep -R -E "[ '][0-3][0-9](((01|03|05|07|08|10|12)(0[1-9]|[12]\d|3[01]))|((04|06|09|11)(0[1-9]|[12]\d|30))|(02(0[1-9]|[12]\d)))[ ']" */*.COBOL > /tmp/hizuke.txt
```
最初の[ ']は文字タイプと数値タイプ混在しているために、どちらもマッチさせるために両端に付けています。
スペースを入れないと、COBOLの場合行番号とかにもマッチするので、それを避けるためのおまじないです。

年はなんとなく平成以外にもマッチする感じですが、細かいことは無視しています。
月はある程度大小と閏月がある程度マッチすると思います。

厳密性には欠けますが、数千本のソースを全数チェックすることは免れそうです。
GAE/go 1.11 環境のパフォーマンスを最大化する方法

GAE つかってますかっ？

Go のランタイムも次世代のランタイム(2nd Gen)がリリースされ、 GAE 上の go アプリケーションから外部のサービス/サイトにアクセスする方法も Appengine　SDK だけではなく、 Go の標準的な api も利用できるようになりました。

なにげに次世代のランタイムになったので標準的な API/Google Cloud SDK を何も考えずに利用している方もいるかも知れませんので、現状（2019/02/05現在）、東京リージョンに於いて、どのように利用することでパフォーマンスが最大化できるか検証してみました。

1. Appengine Datastore SDK vs Cloud Datastore SDK
2. urlfetch vs http.Get

の２つです！

## 最初に結論

- Datastoreへの接続は **Appengine Datastore SDK** の方が高速
- 外部サイトへのアクセスは **http.Get** の方が高速

では、計測結果を見てみましょう
リージョンは asia-northeast1 を利用します。

## Datastore への接続の速度

Datastore へ GAEから接続する場合には
import に　`google.golang.org/appengine/datastore` と記述する Appengine Datastore SDK と `cloud.google.com/go/datastore` と記述する Cloud Datastore SDK の２種類があります。

利用したコードは 後ほど公開する予定です。

### Appengine Datastore SDK

Datastore から同一のkeyで30回エンティティを取得し、平均時間をだします。

<img width="441" alt="スクリーンショット 2019-02-05 17.05.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/fa97b79a-cce9-9eac-44e6-215a81bec1fc.png">

平均時間 8.7 msec. でした。

### Cloud Datastore SDK

同様に Cloud Datastore SDK の場合には

<img width="449" alt="スクリーンショット 2019-02-05 17.07.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/39ab24fc-a8ea-2bfa-717b-f3712f7a60a1.png">

平均 32 msec. 極稀に 8 msec. と早いものもありますが、 30-40 msec. は必要と考えたほうが良さそうです。

実際に URL を実行してクライアント側にレスポンスが返る応答時間も Appengine Datastore SDK を利用した場合より 4 倍ほど遅いです。（体感でも十分におそいと感じるレベル）

## 外部サイトへの接続の速度

外部の API を実行したり（Slack通知とか）、GAE でマイクロサービス的に相互に REST を実行する場合などで外部の URL へリクエストを実行する場合があると思います。
従来のように import に `google.golang.org/appengine/urlfetch` と記述する urlfetch と、 `net/http` と記述する http.GET の両方が利用できるため、実際に github.io で公開するページに向けてリクエストを実行してみます。

### urlfetch を利用する

同一の URL に対し、30回リクエストを実行し、平均時間を出します。

<img width="479" alt="スクリーンショット 2019-02-05 17.24.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/2e0d0054-165b-32a8-8e97-5813409d52cf.png">

平均で 295 msec. 程度かかるようです。
そんなに早くないという印象です。

### http.GET を利用する

同様に http.GET を利用した場合には

<img width="479" alt="スクリーンショット 2019-02-05 17.23.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/f591dc7d-3cb2-e539-e4c3-c856d6d05fbe.png">

平均で 185 msec. になります。結構早いです。

（ログのスクショは諸般の理由で30件全件撮れていません）

## 再度、結果まとめ

つまり一番最初にまとめたように、
Datastore へのアクセスには Appengine Datastore SDK を利用したほうが速く、
外部へのアクセスには http.GET を利用したほうが速い。
ということがわかりました。

## 速さ以外のメリット・デメリット

外部へのアクセスは http.GET を利用したほうが速いと書きましたが、 urlfetch を利用した場合には何もせずとも Stackdriver に　Trace が出力されます。
アプリケーションのパフォーマンスを計測する場合に重宝しますので、自前で Open Census を利用して Stackdriver に Trace を出力する事もできますが場合によっては urlfetch を選択するメリットもありそうです。

## 気になったところ

urlfetch, http.GET いずれの場合も、同一の URL に対して何度も上記のテストを行った場合、著しくレイテンシが向上する場合があります。
（以下 http.GET を利用した場合に複数回テストを連続で実行した場合の結果です。）
リクエストの結果がキャッシュされるのか 1 msec. ぐらいで終了します。

<img width="433" alt="スクリーンショット 2019-02-05 17.16.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/aaf7b913-b1f1-b472-237d-739847942723.png">


では、上手に使ってハイパフォーマンス GAE/go ライフを楽しみましょう！w
「SiTest（サイテスト）」でページを強制的に更新する方法

# SiTest（サイテスト）とは？
サイト改善に特化したツールです。サイト改善に活用できる「ヒートマップ解析」「ABテスト」「EFO対策」「レポーティング」などの機能がオールインワンで揃っているので、課題発見から施策、検証までを早く回すことが可能です。
また、既存のWebサイトにはjavascriptのタグを1行追加するだけで始められるので導入が手軽なのも魅力です。

[ヒートマップ解析・ABテスト・EFO対策ツール | SiTest](https://sitest.jp/)

実際に使ってみた感想としては、機能がふんだんにあり、特別な知識がなくても「ABテスト」や「多変量テスト」を回して結果を得る事ができるので、良いと思う反面、機能がありすぎて逆に使い勝手が悪くなってるなぁと感じるところもあります。
ですので毎回担当者さんに電話で使い方を伺う事になるので、ここに記載しておけば、同じ事で困る方がいなくなるのでは？と思ったので記載しておきます。

# ページを強制的に更新する方法
SiTestでは、多変量テストを設定する場合、一度Webページを読み込み、多変量テストを行いたい場所をSiTest上で書き換えます。
一度Webサイトを更新してから多変量テストを設定する事になりますが、場合によってはSiTest内でWebサイトの更新が行われない場合があります。
ランディングページなどで広告を出稿しているページの場合だと、この「Webサイトの更新が行われない」事でテストにも影響が出てきてしまいます。
![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/46262/0fbf1be6-37a9-7d8b-57cd-66587b9c1afb.png)

そのような場合は、下記の方法で強制的に最新のWebページに更新して設定してみてください。
また、同様にヒートマップが見れない場合でも同じ方法で見れる様になります。

## 1.左メニューから「ヒートマップと分析データ」をクリックして、対象のページの「ヒートマップを見る」をクリックします。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/46262/bb10d74a-69b8-c9e0-1c34-3c5080792def.png)

## 2.「スクロールデータを見る」の左側の歯車アイコンをクリックします。
**※他の歯車アイコンをクリックすると、サイトの設定に繊維してしまい戻って来れなくなるので注意してください。**
![002.png](https://qiita-image-store.s3.amazonaws.com/0/46262/f611ef86-4978-8bd8-4252-9af5024e44ea.png)

## 3.「ページの表示方法を変更する」をクリックします。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/46262/72ae48f5-bfc8-8497-f875-9fc271ad1ca1.png)

## 4.「最新のHTMLログから再現して表示する」から「リアルタイムで公開中のページを表示する」に変更
![004.png](https://qiita-image-store.s3.amazonaws.com/0/46262/2dc2f40c-acf6-5200-df8c-923967500a2d.png)

以上で、最新のデータに更新されますので、多変量テストなどの設定ができる様になります。
SiTestは有料です。そしてPV数やコンバージョン設定数で従量課金で増える仕様ですので、主力ページのみにSiTestを適用している会社が多いのかなと思います。ですので、「リアルタイムで公開中のページを表示する」を先に設定しておいた方が良いかと思います。
結構。。。。。結構更新してくれませんからね....。
DualTouchControlsのMoveTouchpad

# StandardAssetsのDualTouchControls

とりあえずAndroid用のゲームを作ってみようかなと思い
色々いじっています。

モバイルアプリで必要なのは、入力方法の実装ですよね。
マウス操作のAPIでもある程度実現できますが、
まるっと同じ訳にはいかないもの。
StandardAssetsにあるDualTouchControlsを使ってみることにしました。

## MoveTouchpad

CrossPlatformInputをインポートし、DualTouchControlsをSceneに追加します。
今回はMoveTouchPadのみ使用したかったので、
他のオブジェクトは削除してしまいました。

![TouchPad.png](https://qiita-image-store.s3.amazonaws.com/0/354674/3c01c4dd-7025-a086-21f7-49feb6149897.png)

こんなイメージ。

タッチパッドからの入力をそのままSphereのpositionにぶち込みます。

```cs:Sphere.cs
void Update(){
        var x = CrossPlatformInputManager.GetAxis("Horizontal");
        var y = CrossPlatformInputManager.GetAxis("Vertical");
        this.transform.position += new Vector3(x*.1f, 0, y*.1f);
 }
```

※ちょっと値が大きいので、その辺は調整しました。

タッチパッド内をタッチし、指の移動量でSphereを動かします。
指が停止したら、Sphereも停止させたい。
UnityRemote上で試す分には、思った通りの動きをしてくれました。

ですが、Android端末に入れて試したところ・・・

![NG.gif](https://qiita-image-store.s3.amazonaws.com/0/354674/4f67c61c-5017-260d-243d-423c145939fd.gif)

指の移動が停止しても、Sphereが動いてしまっています。
ジョイスティックみたいな動きをしていますね。

TouchPad.csを確認してみたところ、

```CS:TouchPad.cs
#if !UNITY_EDITOR
            if (controlStyle != ControlStyle.Absolute )
            m_Center = data.position;
#endif
```

上記のようにUNITY_EDITORでifdefされている箇所が、4か所もありました。
そうかなるほど、UnityRemoteで動作確認しているとは言え
実際はUnityEditor上で動いているわけで。
このプリプロセッサがAndroid端末で定義されている訳ありませんので
実機に入れたとたんに異なる動きをしてしまう訳なのです。

UnityEditorと同じ動きをしてほしいので、Android時にもUNITY_EDITORを定義しちゃえばいいじゃん、
という訳にはいきません。
他のどんなソースで、同様の切り替え方をしているかわかりませんので・・。

という訳で、TouchPad.cs内のUNITY_EDITOR切り替えを全て修正し、
実機で動かしたのがこちら。

![OK.gif](https://qiita-image-store.s3.amazonaws.com/0/354674/14d006d5-a622-e05c-00a0-183ff3a1a731.gif)

指の動きが止まったら、Sphereも止まっていることが確認できました。


---
Qiitaの画像容量ですが、制限があるみたいで。（そりゃそうだ）
何も考えずにデカいサイズの動画をアップしてしまいました:scream:
次から気を付けます・・・。
学びの記録　〜Progate PHP Ⅲ 〜　　

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているryota_miraidenshiです。
今回学んだことの中で重要なことをまとめておきます。

#クラスプロパティ
クラスプロパティとは個々のインスタンスが持つデータではなく、クラスが持つデータのことです。
クラスプロパティには「static」をつけ、使うときは「クラス名::$クラスプロパティ名」と書きます。
![スクリーンショット 2019-02-05 17.04.12.png](https://qiita-image-store.s3.amazonaws.com/0/351843/bc8761d3-626f-3e4b-b144-130793bd3010.png)

#クラスメソッド
自分のクラス内でクラスプロパティにアクセスする場合には「self」と言う変数を使います。
書き方は「self::クラスプロパティ名」です。
![スクリーンショット 2019-02-05 17.08.31.png](https://qiita-image-store.s3.amazonaws.com/0/351843/56d89cd7-4dc0-bc1e-6bbe-504946c79cd1.png)

次に個々のインスタンスの処理には関係のないクラス内の関数はクラスメソッドと呼ばれています。
これも先ほどと同様「static」を付け、呼び方も同じです。
![スクリーンショット 2019-02-05 17.12.34.png](https://qiita-image-store.s3.amazonaws.com/0/351843/92290f5e-e1aa-e3cf-e86d-b956dd567426.png)

#アクセス権
以下にprotected、public、privateのアクセス権についてまとめておきます。
pulicはあらゆる場所からアクセス可能、protectedはそのクラスと子クラスからアクセス可能、privateはそのクラス内のみアクセス可能となっています。
![スクリーンショット 2019-02-05 17.14.58.png](https://qiita-image-store.s3.amazonaws.com/0/351843/4ca4e2bc-1f55-7086-8604-d23fe3c23054.png)

#parent
親クラスで定義したメソッドを使用したい場合は「parent::メソッド名」とします。
例えばコンストラクタを使いたい場合は

```index.php
parent::__construct();
```

のように書きます。
ElixirでJson.getでAPIを取得するのは、どんな事をしてるのか

elixirでAPIを取得して使ってみたい！
そのためにはhexのsmallexと言うパッケージを使うといいですよー。

と、チュートリアルを見ながら進めると、確かにできる。
https://qiita.com/piacere_ex/items/4c212615a4eb699dd109

おぉ。
簡単に取得できるんだー。

と言うのは分かったけど、何でそう動くの？
そう書くの？

疑問が出たので、今回はその疑問について手を動かしてみて分かったところを書いてみることに。

## Json.getでAPIを取得する方法

smallexのパッケージを追加すると、使えるようになるよ。
https://hex.pm/packages/smallex

と言う事で
mix.exsファイル内に、{:smallex, "~> 0.2.3"}
を追記して、ターミナルで `mix deps.get`　しました。
　

次にJson.getを使って、APIを取得していきます。
まず[hexのリファレンス](https://hexdocs.pm/smallex/Json.html#get/3)をみてみますね。
>get(domain, path, header \\ [])
Get JSON API (header & map_function are optional)

使い方は上記の通り。

と言っても、これだけで理解ができなかったので疑問も生まれる訳ですが…
　

使い方は、例として下記のように書いてありました。

```elixir
iex> Json.get( "https://api.github.com", "/rate_limit" )[ "rate" ][ "limit" ]
60
```

（）の中はURL。
ドメインと、パスで分けてあるのがわかる。
必要なページの中のデータをこれで拾ってくる訳ですよね。

でも、後ろの[ "rate" ][ "limit" ]は何を意味するんだろう？

これが今回の疑問点です。

## ターミナルで実際に取得してみる
実際にiex内で打ってみると「60」が取得できた。
例の通りですねー。
　

で、結果の「60」と言うのは中身のどの部分なのだろう？
ドメイン、パスを分けてある所をくっつけて、URLとしてブラウザで表示してみる

https://api.github.com/rate_limit


```Json
{
"resources": {
    "core": {
      "limit": 60,
      "remaining": 60,
      "reset": 1548987900
    },
　・・・（中略）・・・
 "rate": {
    "limit": 60,
    "remaining": 60,
    "reset": 1548987900
  }
}
```
中身はこんな感じでした。

表示されたデータの一番下に`"rate"`があり
その中に`"limit"`が入っている。

そして、`"limit"`が「60」だった！

```
 "rate": {
    "limit": 60,
    "remaining": 60,
    "reset": 1548987900
  }
```

と言うことなので、[ "rate" ][ "limit" ]の部分は
"rate" の中の "limit"の中身を表示するための物だった。

と言う認識で合ってるのかな…と。

　
　
別の部分でも試してみる。
`"resources"` `"core"`


```elixir
iex()> Json.get( "https://api.github.com", "/rate_limit" )[ "resources" ][ "core" ] 
%{
  "limit" => 60,
  "remaining" => 60,
  "reset" => 1548988328
}
```

これだと、"core"の中身が全部出てくるのね！

さらに細かく出したい時は、[ ]をもう一つ後ろに足せば良い。

```
iex()> Json.get( "https://api.github.com", "/rate_limit" )[ "resources" ][ "core" ][ "limit" ]
60
```

`"limit"`の値が欲しいなら、`[ "limit" ]`を書き足せば良いわけですねぇ。
そうすれば、さらに中のをピンポイントで選んで取れました。

便利なんだなぁ。
　

そこでまた疑問。
任意の値を複数欲しい場合はこの書き方でできるの？

まぁ思いついたのでやってみた。


```elixir
iex()> Json.get( "https://api.github.com", "/rate_limit" )[ "resources" ][ "core" ][ "limit", "reset"]  
** (SyntaxError) iex:5: syntax error before: "reset"
```

「,」で区切ったらいけそうじゃない？というのも虚しくエラー。


まぁ、ここで呼び出して使うよりも、全部のリストを拾ってから後で分ける方が
何かと使いやすいんでしょうね。
チュートリアルでもそうしてたし。

すっきりと一行で収まったら面白いなー。
と思ったけど、私の頭ではできなかったですw

　

そうそう。
あと一つ気になったのは

```
get(domain, path, header \ [])
```

この`header \ []`ですが…
その前に[httpヘッダーの事](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers)を読もうと思います。

今回はここまで。


　
　


ちなみに、QiitaのAPIを使ってelixir関連の記事を取って来て、Web上に表示するやり方は
fukuokaex代表piacere_exさん
https://qiita.com/piacere_ex/items/4c212615a4eb699dd109
の記事を参考にすすめました。
　

smallexと言うパッケージを開発したのもfukuokaex代表piacere_exさんなんですね♪
チュートリアル進めた時はただ進めてただけだったので、気付かなかったです…
　



これで色んなのを抽出して使えそう。

QiitaのAPI自体のことに関してはQiita公式を見て活用してみたいな♪
https://qiita.com/api/v2/docs
と思います。
[CSS]TOPへ戻るボタンをつくる

# CSSでTOPへ戻るボタンをつくる
業務で久々にCSSを触ったので備忘録

動作確認はChromeバージョン: 71.0.3578.98

```html:index.html(抜粋) 
<div id="page-top"><span class="page-top-icon">TOP</span></div>
```

```css:main.css
#page-top {
	position: fixed;
	width: 40px;
	height: 40px;
	right: 8px;
	bottom: 48px;
	background-color: #505168;
	opacity: 0.7;
	border-radius: 50%;
	z-index: 10;
}

.page-top-icon {
	color: #FFF;
	font-size: 16px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%,-50%);
    font-weight: bold;
}
```

右下に「TOP」と表示される

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/306030/8d9663bd-e2e0-19f9-3f94-8fa6588a2704.png)

# 参考にしたサイト
https://cotodama.co/pagetop/
【一年生の頃の私へつづる言葉⑨】CSS初心者である私に最低限覚えて欲しいこと。

- 今となっては、当然のごとく使用していることを、ただ手紙としてしたためるだけの記事の第九弾。
- 久々の時間跳躍ごっこということもあり、「とうとう現実との乖離に成功したのかな」という激怒即答確実の自分への問いかけに、期待以上の速度で対応する、なんとも自己満足なたしなみ。
- やはり執拗な性格があだとなり、これからも幻想遊びは果てしなく継続することが決まり、似合わない「上流階級得意の舞い踊り」をしてみる。
- よし。今回は入社後、知っておけばよかったことを書こう。

## CSSについて
### ＜当時＞
- 「単位」・・・「px」「%」ぐらいしか知らないことに加えて、その意味もあまり理解することもなく、ただ使っていた。  
- 「規約」・・・idやclass名の命名やインデント等、きちんとした記法を統一せずにただ書いていた。
- 「ツール・サービス」・・・自動補完や整形等のツールから、記述参考にしてほしい各種サービスまで、あまり知らなかった。

※レイアウトのズレや、コードの可読性の低さ等が起き、効率的な質の良い学習ではなかった。

### ＜現在＞
各要素や単位の基礎的な意味や規約をきちんと学びなおす。
→意図せぬ配置表示のズレ回避、可読性・効率性向上につながる。

#### 単位
下記、最低限知っていてほしい種類。

- 「px」・・・・相対値。画面サイズが変わっても、指定したサイズは変わらない。  
※「絶対値」として使用されるケースが多いが、きちんとした仕組みとして、「相対値」に分類される。  
※下記の例では、bodyタグのフォントサイズは、40pxとみなす。

```css
body {
  font-size: 40px;
}
```

- 「%」・・・・相対値。親要素によって変わる。親要素を100%とみなす。  
※下記の例では、pタグのフォントサイズは、20pxとみなす。

```css
body {
  font-size: 40px;
}

p {
  font-size: 50%;
}
```
- 「em」・・・・相対値。親要素によって変わる。親要素を1em(100%)とみなす。  
※下記の例では、pタグのフォントサイズは、30pxとみなす。

```css
body{
  font-size: 60px;
}

p{
  font-size: 0.5em;
}
```

- 「rem」・・・・相対値。ルート要素(html要素)によって変わる。ルート要素を1rem(100%)とみなす。レスポンシブ対応に便利。  
※下記の例では、pタグのフォントサイズは、60pxとみなす。

```css
html{
  font-size: 40px;
}
 
p{
  font-size: 1.5rem;
}
```

- 「vw」・・・・相対値。利用画面幅によって変わる。画面幅を100vwとみなす。  
- 「vh」・・・・相対値。利用画面の高さによって変わる。親要素を100vhとみなす。  
※下記の例では、「項目1」の画面幅は50%、画面高さは100%。「項目2」の画面幅は20%、画面高さは100%。

```html
<body>
  <div class='item1'>項目1</div>
  <div class='item2'>項目2</div>
</body> 
```
```css
body {  
  margin: 0px;
}

.item1 {
  background-color: rgb(223, 168, 168);
  width: 50vw;
  height: 100vh;
}

.item2 {
  background-color: rgb(151, 226, 220);
  width: 20vw;
  height: 100vh;
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/6319724a-9afc-0489-9e50-00763f2d12f5.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/0709bc1d-86bf-0e4e-a27f-c2773b945c30.png)

#### 規約
下記のガイドや記事に従って、書いてみる。

- [Google HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssguide.html)
- [Googleスタイルガイド要約記事](https://www.wan55.co.jp/column/detail/id=485)

#### ツール・サービス
下記のツールやサービスを使用して、快適かつ効率的なコーディングをする。

- [cssreference.io](https://cssreference.io/)  
→CSSのまとめがわかりやすく載っている。
- [CSS Ruler](https://katydecorah.com/css-ruler/)  
→CSSの長さ等にまつわるチートシートが載っている。
- [extractCSS](http://extractcss.com/)  
→CSSひながた作成ツール。HTMLのコードを貼りつけるだけ。
- [CSS Shrink](http://cssshrink.com/)  
→CSS圧縮ツール。CSSのコードを貼りつけるだけ。
- [px-em](https://www.webdesignrankings.com/resources/px-em/)  
→pxとemの変換ツール。サイズ調整に便利。
- [CSSスニペット](https://ferret-plus.com/6036)  
→便利なCSSコードがスニペットとしてまとめられている。

### ＜過去の私へ送る言葉＞
- <font color = "tomato">flexboxやCSS Grid等、複雑なことは、初心者のうちは覚えなくてよいから、基礎からしっかり学んでいこう。</font>
- <font color = "tomato">基礎からの積み重ねはきっと力になるから、焦らず取り組もう。</font>

## まとめ
- 今回は、CSSで伝えたいことということで、「レイアウトデザインと絵心は確実に比例している。」と根っから思い込んでいたころを思い出しながら、記事を書く。
- フロントは本当に苦手で、必死に距離をとっての生活を試みたが、天才的執着性により、だましだまし取り組むことにする。
- 「こういう記事を書けば、この執着から逃れられる」という、粉砕確実の安易発想をこしらえて、今日も逃避生活を続けよう。

## 参考
- https://www.webprofessional.jp/a-walkthrough-of-css-length-units-you-can-use-for-font-size/   
→単位はこちらの記事を参考にしました。
- http://photoshopvip.net/109622  
→ツールはこちらの記事を参考にしました。
Double -> Float キャストメモ

#はじめに
DoubleからFloatにキャストした時のメモです。キャストといってもDoubleとFloatではビット数の違いにより有効桁数が異なるので、floor/ceil/roundあたりでDoubleの桁数を調整する。
#記述
今回はTaskのprogressを監視するオブサーバーでDoubleが帰ってきたことを例にします。

```swift:TaskViewController.swift
task.observe(.progress) { (snapshot) in
            let percentComplete = 100.0 * Double(snapshot.progress!.completedUnitCount) / Double(snapshot.progress!.totalUnitCount)
            //桁数調整
            let roundPercent = round(percentComplete * 10e6) / 10e6
            //Double -> Float
            let floatPercent = Float(roundPercent)
            print(floatPercent)
}
```

#最後に
Float -> 32bit -> 有効桁数：約7桁(10進数)
Double -> 64bit -> 有効桁数：約15桁(10進数)
CGFloatだと実行環境によってbit数が変わるみたいです。

参考)https://qiita.com/shimesaba/items/dbbc0f4ec80d011273d6
最新のm4なのに、最新のが必要と怒られる…

# autom4te: need GNU m4 1.4 or later: /usr/bin/m4

bitcoinをgithubから落として、`/autogen.sh`でビルドしようといたら以下のエラーが……

```
autom4te: need GNU m4 1.4 or later: /usr/bin/m4
aclocal: error: echo failed with exit status: 1
autoreconf: aclocal failed with exit status: 1
```

まず、一番上のエラーを検索するものの、「autoconfぶっ壊れてるから、もいちどインストールすれば治るよ」とか書いてあって、

```
brew rm autoconfしてbrew install autoconf
```

するんだけど、変化無く。
調べる順番が間違えたな思いつつ今更

```
m4 --version
```
してみるとこんなエラー。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

あ、Xcodeの方のあれか、とhttps://qiita.com/ARTS_papa/items/60ba305b23dc967bba87 の見よう見まねで

```
xcode-select --install
```

してみたら、問題無く動いた。
そんなお話でした。
Swift：UIColorを16進数カラーコードの文字列に変換する

# 背景
前に[Swift：UIColorを16進数カラーコードで初期化する](https://qiita.com/Kyomesuke3/items/eae6216b13c651254f64)という記事を書いたら思いの外人気だったので，前やったことの逆を実装してみた．

# ソースコード
```swift:Extension.swift
import UIKit

extension UIColor {
    public func hex(withHash hash: Bool = false, uppercase up: Bool = false) -> String {
        if let components = self.cgColor.components {
            let r = ("0" + String(Int(components[0] * 255.0), radix: 16, uppercase: up)).suffix(2)
            let g = ("0" + String(Int(components[1] * 255.0), radix: 16, uppercase: up)).suffix(2)
            let b = ("0" + String(Int(components[2] * 255.0), radix: 16, uppercase: up)).suffix(2)
            return (hash ? "#" : "") + String(r + g + b)
        }
        return "000000"
    }
}
```


```swift:使用例
var c = UIColor.cyan
Swift.print(c.hex())    // 00ffff
Swift.print(c.hex(withHash: true))    // #00ffff
Swift.print(c.hex(uppercase: true))    // 00FFFF
Swift.print(c.hex(withHash: true, uppercase: true))    // #00FFFF
```

Webと連携したアプリの場合は役立つ可能性が微レ存？
VisualStudioCodeでMarkdownを書く際に入れておきたい便利な拡張機能5選

# ドキュメント類はMarkdownで書きたい。エディタはVSCで。

何でもかんでもMarkdownで書きたいお年頃なVSC愛用エンジニアな方に向けて、入れておいて損はない（気がする）拡張機能を5つ紹介しておきます。  
特にQiita用のメモ書きやらシステム要件定義やら書く機会が多いエンジニアの方なら役立つんではないでしょうかね

# Markdown All in One

インストール：[Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)

> All you need for Markdown (keyboard shortcuts, table of contents, auto preview and more).

この拡張機能はMarkdownを記述する際に便利なショートカットキーを提供してくれる拡張機能です。
以下にショートカットと使えるコマンドを簡単に書いておきます。

## キーボードショートカット

| キー | コマンド |
| :--- | ----: |
| Ctrl + B | **太字** |
| Ctrl + I | *イタリック体* |
| Alt + S | ~~取り消し~~ |
| Ctrl + Shift + ] | ヘッディングレベル上げ |
| Ctrl + Shift + [ | ヘッディングレベル下げ |
| Ctrl + M | 数学記述（$4^3$とか書ける） |
| Alt + C | タスクリストのチェック・チェック解除 |
| Ctrl + Shift + V | プレビュー切り替え |
| Ctrl + K V | プレビューを横に表示 |

## `Markdown All in One`のコマンド

### 目次の作成

```
Markdown: Create Table of Contents
```

### 目次の更新

```
Markdown: Update Table of Contents
```

### コードスパンの切り替え（`を付けたり消したりする）

```
Markdown: Toggle code span
```

### HTMLへ書き出し

```
Markdown: Print current document to HTML
```

### 数学環境の切り替え（$を付けたり消したりする）

```
Markdown: Toggle math environment
```

### 番号なしリストの切り替え（- + * を切り替え）

```
Markdown: Toggle unordered list
```

# Markdown PDF

インストール：[Markdown PDF](https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf)

> This extension convert Markdown file to pdf, html, png or jpeg file.

この拡張機能はMarkdownをプレビュー後の状態でPDFとして書き出してくれる拡張機能です。
PDFのほかにHTML、PNG、JPEGファイルにも対応してます。 → [日本語ドキュメント](https://github.com/yzane/vscode-markdown-pdf/blob/master/README.ja.md)

## `Markdown PDF`のコマンド

### PDF出力

```
Markdown PDF: Export (pdf)
```

### HTML出力

```
Markdown PDF: Export (html)
```

### PNG出力

```
Markdown PDF: Export (png)
```

### JPEG出力

```
Markdown PDF: Export (jpeg)
```

### 全部出力

```
Markdown PDF: Export (all: pdf, html, png, jpeg)
```

# Excel to Markdown table

インストール：[Excel to Markdown table](https://marketplace.visualstudio.com/items?itemName=csholmq.excel-to-markdown-table)

> This VSCode extension converts Excel data to Markdown table format. Available through command Excel to Markdown table and keyboard shortcut Shift+Alt+V.

この拡張機能はExcel上でコピーしたセルを貼り付ける際に`Shift+Alt+V`で貼り付けると、Markdownのテーブル形式で貼り付けてくれます。

![FFF.gif](https://qiita-image-store.s3.amazonaws.com/0/85815/5ebc7e70-8215-0b31-3ad3-db36dd4d6883.gif)


# markdownlint

インストール：[markdownlint](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint)

> Markdown/CommonMark linting and style checking for Visual Studio Code

この拡張機能はMarkdownの一般的な構文チェックを行ってくれます。
色々な書き方ができるMarkdownをある程度統一させることで保守性が高いMarkdownドキュメントが作成できることでしょう。
（※結構きつめのチェックが受けれます）

# Copy Markdown as HTML

インストール：[Copy Markdown as HTML](https://marketplace.visualstudio.com/items?itemName=jerriepelser.copy-markdown-as-html)

> This extension will copy the currently selected markdown text to the clipboard as HTML.

この拡張機能は選択されたMarkdownテキストをHTML化した状態で（クリップボードに）コピーします。

## `Copy Markdown as HTML`のコマンド

```
Markdown: Copy as HTML
```
![ggg.gif](https://qiita-image-store.s3.amazonaws.com/0/85815/6ca92728-941a-9e12-8bf7-6b7b917968f4.gif)



# おわり

- ほかにおすすめな拡張機能あれば教えてくださいな
Raspberry Pi のGPIOをコマンドで確認する方法

#　方法

```
pinout
```

実行するだけで、以下のようなものが出てくる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309467/2231b71d-2b87-aa65-bf62-7a6c787313ee.png)

自分的に便利

参考
https://www.raspberrypi.org/documentation/usage/gpio/README.md
Spine のアニメーションを任意の場所から開始する (cocos2d-x での場合)

##Spine のアニメーションを任意の場所から開始する
デザイナーさんから「とあるシーンの進行中にアニメーションを追加したいんだけど、そのアニメを他の再生中アニメと同じ状態で再生開始させて欲しい」と言われた時にとった対応です。

Spine で setAnimation() でアニメーション再生を指定した際は内部で update(0) が呼ばれており、問答無用でアニメが最初から再生されていました。
この update() の引数で再生開始箇所をコントロールできることは分かったのですが、今再生中のカウントがどれなのか探すのに難儀したので備忘録も兼ねて下記に記します。

```
spine::SkeltonAnimation* anotherAnimation = {再生中のアニメ};
spine::SkeltonAnimation* currentAnimation = {追加しようとしているアニメ};

float updateCount = anotherAnimation->getCurrent()->trackTime;
currentAnimation->setAnimation(0, "animationName", isLoop);
currentAnimation->update(updateCount);
```

構造体 spTrackEntry の trackTime が再生後の経過カウントのようです。
これを指定することで他のアニメと再生位置を合わせる事ができました。
(不適切だったり間違ってたりしたらごめんなさい…)
silkを使用したAPIのテスト自動化（ドキュメント駆動）Windows環境

#go言語でAPIを実装した場合、REST APIテストをドキュメント駆動で行うにあたりその設定方法

APIのテストを自動化で行うにあたり、swaggerを使用していた為、当初はdreddで行うように進めていた。
ところが、dreddでswaggerを使用する所から、make all　した場合、予期せぬ動作が起こりえた為
（swaggerの.gitkeepが消える）現象が起きた為、本来のAPIが動作しなくなる。
その為、swaggerを使用したテストは避けるべく、今回のsilkを使用することにした。

　　
##前提条件
1 既にgoで実装したAPIが存在すること
2 make allが実行できる環境であること



```
$ go get github.com/matryer/silk

$ make all
```
main.goと同じ階層に、test.silk.md ファイルを作成する

test.silk.md

```
# TEST API

## `GET /v1/project/1111`

Gets a personalised greeting.

===

* Status: `200`

{"id":22777}

```



テストするAPIを起動させておく

テスト実行

```
$ silk -silk.url="http://localhost:8080" test.silk.md
```

テストFAILした場合

```
silk: running 1 file(s)...
body expected:
{"id":22777}

actual:

{"id":22222}
```

```
--- FAIL: GET /v1/profiles/1326219617999257600
 test.silk.md:14 - body doesn't match
--- FAIL: silk (0.34s)
FAIL
```
*値が同じでも、FAILになる場合がある。これは改行コードが違うためにFAILとなっているので、一度改行コードを確認するとよい

テストPassした場合

```
silk: running 1 file(s)...
PASS
```

POST等の書き方は下記にあります。
https://github.com/matryer/silk


##GETは良いがPOSTでcreated_Atなんかを取得する場合、created_Atのチェックを外す方法
POSTとなると、idのインクリメント等や、created_Atなどで答えの見えない値がある。
この場合、照合したいキーvalueのみを書いておき、idやcreated_Atなんかはkey,valueは書かないでおく。
但し、その際は、
json(strict)
を記載しておく。
```json(strict)
backtics の書き方がわからないので、こんな感じで書いておく。
iOSのFirebase Analyticsでユーザーデータを無効、または削除する

## 背景
2018年10月3日よりApp Storeに公開するアプリはプライバシーポリシーが必須になりました。

[予定されているプライバシーポリシー要件の変更について](https://itunespartner.apple.com/jp/apps/news/100002362)

また、App Store Reviewガイドラインには取得したユーザーデータをユーザーが削除を求めた場合は削除できるようにしないといけないと記載されています。

[App Store Reviewガイドライン](https://developer.apple.com/jp/app-store/review/guidelines/#privacy)

そこでFirebaseを利用している場合のユーザーデータの無効と削除の方法をまとめます。

## アナリティクスの収集を無効にする

参考: [iOSでアナリティクスの収集を無効にする](https://firebase.google.com/support/guides/disable-analytics?hl=ja#disable_collection_on_ios)

こちらに一時的に無効にする方法や完全に無効にする方法が記載されています。
ユーザーの同意無しにはユーザーデータを収集してはいけませんので、記載されている通り一時的に無効にして、ユーザーが同意を終えてから`setAnalyticsCollectionEnabled`メソッドを呼び出して設定する必要がありそうです。

## 関連付けられているアナリティクスデータを削除する

ユーザーに関連付けされているアナリティクスデータを削除する方法はアプリ側とWeb側の２種類あります。

### アプリ側

```swift
import FirebaseAnalytics

Analytics.resetAnalyticsData()
```
このメソッドを呼び出すことでアナリティクスデータを削除することができます。

参考: [resetAnalyticsData](https://firebase.google.com/docs/reference/swift/firebaseanalytics/api/reference/Classes/Analytics#resetanalyticsdata)

### Web側


User Deletion APIを利用することで削除できます。
[User Deletion API - 概要
](https://developers.google.com/analytics/devguides/config/userdeletion/v3/)
設定する`APP_INSTANCE_ID`はクライアント側で取得する必要があり

```swift
import FirebaseInstanceID

InstanceID.instanceID().getID(handler: { identity, error in
})
```

こちらの`identity`から`APP_INSTANCE_ID`が取得できます。
Googleアナリティクスを使っている場合、`CLIENT_ID`は

```swift
GAI.sharedInstance()?.defaultTracker.get(kGAIClientId)
```

で取得できます。

会員の削除を申請された場合などはこのWeb側の対応を行う感じでしょうか。

## まとめ

今回はFirebase Analyticsのユーザーデータの無効化と削除を紹介しましたが、Appleの規約に従い対応していく必要があります。
もし他にもユーザーデータを取得しているサービスを利用している場合はそれぞれ対応していかなければなりません。
できるだけ利用するサービスは少なめに考えていきたいところですね。
Raspberry Pi（Raspbian）でスクリーンショットを撮る方法

#はじめに
Raspberry Pi（Raspbian）でスクリーンショットを撮る方法です。

#必要なもの
- RaspbianがインストールされているRaspberry Pi
- Scrot
- インターネット回線

#Scrotのインストール方法
1. LXTerminalを起動する
2. `sudo apt-get install scrot`コマンドを実行し、Scrotをインストールする
3. インストール完了

#スクリーンショットを撮る方法
1. LXTerminalを起動する
2. `scrot`コマンドを実行する
3. `/home/pi`直下にスクリーンショットが保存される![2019-02-05-113927_943x653_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/263360/f419de52-fe29-2db8-7d9f-ebb12f04db67.png)
4. スクリーンショット撮影完了![2019-02-05-113603_1824x984_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/263360/eb9a6832-0509-36d7-1ef0-4030f6201ec1.png)

#Scrotのオプション一覧
|オプション|機能|
|:-----------------:|:------------------:|
|-h, --help|ヘルプを表示する|
|-v, --version|バージョン情報を表示する|
|-b, --border|-sで選択したウィンドウのウィンドウ名を入れる|
|-c, --count|-dのカウントダウンを表示する|
|-d, --delay NUM|スクリーンショットを撮る前にカウントダウンを行う。NUM＝待ち時間(秒数)|
|-e, --exec APP|run APP on the resulting screenshot|
|-q, --quality NUM|画質の設定。NUM＝1〜100。NUMが大きいほど高画質|
|-m, --multidisp|For multiple heads, grab shot from each and join them together.|
|-s, --select|指定したウィンドウのスクリーンショットを撮る。コマンド実行後にマウスで対象のウィンドウをクリックする|
|-s, --select|指定したウィンドウのスクリーンショットを撮る。コマンド実行後に対象のウィンドウをマウスで選択する|
|-u, --focused|現在フォーカスされているウィンドウのスクリーンショットを撮る|
|-t, --thumb NUM|generate thumbnail too. NUM is the percentage of the original size for the thumbnail to be, or the geometry in percent, e.g. 50x60 or 80x20.|
|-z, --silent|ビープ音を鳴らさない|

#参考
|やりたいこと|コマンド|
|:-----------------:|:------------------:|
|指定したウィンドウをウィンドウ名付きで撮る|scrot -s -b|
|5秒以内に別の操作を行ってから選択中のウィンドウを撮る|scrot -u -c -d 5|
Raspberry Pi（Raspbian）のアップデート/アップグレード方法

#はじめに
Raspberry Pi（Raspbian）のアップデート/アップグレード方法です。

#必要なもの
- RaspbianがインストールされているRaspberry Pi
- インターネット回線

#アップデート/アップグレード方法
1. LXTerminalを起動する
2. `sudo apt-get update`コマンドを実行し、システムのパッケージリストを更新する
3. `sudo apt-get dist-upgrade`コマンドを実行し、パッケージを更新する
4. アップデート/アップグレード完了

#アップデート/アップグレードできない場合の対処法
- LXTerminalに入力したコマンドに誤記が無いことを確認する
- Raspberry Piがネットワーク接続されていることを確認する
- Raspberry Piのストレージに空きがあることを確認する

#参考
- [Updating and Upgrading Raspbian - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/raspbian/updating.md)
Tera TermでSSH接続して、サーバサイドでtmuxを使ったらデタッチできなくて困った話

# あらまし
高スペックなマシンでも実行時間が数時間かかりそうな処理をしたかったので、AWSでEC2をたてて実行することにした。
バックグラウンド処理して通知とかすれば良いのだが、手間がかかる上にもし一瞬で終わると悲しいので、通信が切れても問題ないようにtmuxを使うことにした。
tmuxは起動するが、デタッチできずハマった。
原因はBashの便利機能でした。

# 準備
1. EC2(Amazon Linux 2)をたてる。
1. tmuxをインストールする。

# 実行
tmuxを実行する。

```
$ tmux
```

デタッチする。
`PREFFIX d`（`PREFFIX`のデフォルトは`ctrl - t`）
結果は、、、

```
[exited]
```

セッションを確認する。

```
$ tmux ls
failed to connect to server
```

# 動作確認＋実験
最初はTera Termが用意しているショートカットキーになっているのかと思ったが、検索しても一向にそれらしい記事は見つからない。
Tera Termが原因ではないかと思った理由は、`PREFFIX d`が利くには2回押下する必要があり、入力どおりにコマンドを送れていないように見えたから。
ターミナルを複数開いて、tmuxが動作していることを確認できたがデタッチだけできないまま。
何回か実行していると、ある時Tera Termが終了することに気がついた。
原因は前述の「`PREFFIX d`が利くには2回押下する」で、連打をし過ぎて、tmuxをexitしてからSSH接続もexitしてしまったから。
`ctrl - d`でexitすることがわかったので、検索するとすぐに対応方法が見つかる。
# 対応
Bashで`ctrl - d`を無効化するよう。
再ログインしても効果が出るように`~/.bashrc`に追記する。

```:~/.bashrc
IGNOREEOF=10
```
即時で設定反映する。

```bash
$ source ~/.bashrc
```
これで`ctrl - d`でexitしなくなるが、tmuxでexitもデタッチもできなくなる。
tmuxの設定ファイル`~/.tmux.conf`を作成する。

```~/.tmux.conf
bind-key -n C-d detach
```
即時で設定反映する。

```bash
$ tmux source-file ~/.tmux.conf
```
以上でデタッチができるようになりました。
# 最後に
`PREFFIX d`と書きましたが、実際には`ctrl - d`でデタッチできるようになっています。
現状のキーバインド一覧が確認できれば正確なことがわかるのですが、今のところ確認できていません。
Amazon Linux 2だけではないと思いますが、他のOSでは確認していません。
Oracleのアーカイブログを全て削除する方法

開発環境のようなアーカイブログが不要な環境や、逆にアーカイブログが肥大化してディスクを圧迫した場合は、以下のコマンドを実行することで、アーカイブログを全て削除することができます。

```
$ rman
RMAN> connect target
RMAN> delete archivelog all;
```