OmniAICreator/Qiita-1.07M huggingface dataset:
administrate で refileを使ってファイルを読み込めるようにしたい【rails6】

ハードはMacBook Air, 開発環境はVScodeを用いています。
ruby2.6.5
rails6.0.3.2

rails6で管理者gemにadministrate, 画像読み込みgemにrefileを用いた時に, administrateとrefileの連携でハマってしまったので, その詳細と解決方法を紹介します.

ちなみに、administrate_field_refileはrails6に対応していなかったので、使わない方向で頑張りました！

 管理者画面(localhost:3000/admin)で,　新しいデータを追加しようとすると, 画像の入力部分がファイル選択ではなく, テキストボックスになってしまっている
---

localhost:3000/admin へ移動し, 新規Userを作製しようとすると, profile_imageの部分がテキストボックスになっています。（二枚目の画像の一番下）

![スクリーンショット 2020-09-08 21.47.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676016/b4b24563-dc9a-2bbd-2fff-89df33302bff.png)
![スクリーンショット 2020-09-08 21.47.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676016/7ab79541-86bc-068a-070f-98aed1db4f60.png)

そこでこれを解決するために, いろいろ調べてみるとadministrate_field_refileというgemがあるらしいのですが、こちらはrails6に未対応だったので、administrateをカスタムする方向で進めることにしました。


administrateをカスタムする
---

まず先にadministrate内部のコード、カスタムするであろう部分をローカルで表示できるようにします。[administrateのドキュメント](http://administrate-prototype.herokuapp.com/customizing_page_views)を参考に、dashbordのコントローラ, views, fieldを追加していきます。

```
$ rails generate administrate:dashboard User
$ rails generate administrate:views User
$ rails generate administrate:field refile
```

次に、dashbordの  profile_image_id: Field::String,　となっているところを次のように書き換えます。参考；http://administrate-prototype.herokuapp.com/adding_custom_field_types

```:app/dashboards/user_dashboard.rb
  ATTRIBUTE_TYPES = {
   ~省略~
   profile_image_id: RefileField,
  }.freeze
```

次にフォームのviewsをテキストボックスからファイルを選択に変更します.

```:app/views/fields/refile_field/_form.html.erb

<div class="field-unit__label">
  <%= f.label field.attribute %>
</div>
<div class="field-unit__field">
  <%= f.attachment_field :profile_image, direct: field.direct, presigned: field.presigned, multiple: field.multiple %>
</div>

```

次に, app/fields/refile_field.rbを次のように書き換えます.

```:app/fields/refile_field.rb
require "administrate/field/base"

class RefileField < Administrate::Field::Base
  def to_s
    data
  end

  def direct
    options.fetch(:direct, false)
  end

  def presigned
    options.fetch(:presigned, false)
  end

  def multiple
    options.fetch(:multiple, false)
  end
end
```

このままだと、Unpermitted parameters:という赤い文字がコンソールに表示されて画像を設定できないと思うので、以下で許可します。(~~~には, 登録する要素を入れておく。抜けがあると、ターミナルに赤く表示されるので、その都度確認して追加する)

```:
def resource_params
  params.require(:user).permit(:profile_image,:~~~,:~~~,:~~~)
end
```


恐らくこれでadministrateから画像データを登録できるようになると思います。

パスワードとかも設定できるようにしたい、もっと登録画面を見やすくしたいという人は、以下を参考にしてみてください。
http://blog.319ring.net/2016/05/14/custom_view_administrate/

---
役に立ったら是非LGTMボタンをポチッと押していただけると嬉しいです:raised_hand_tone1:
Mastodon API のリクエスト制限と確認（quota 残量確認）

> [「Mastodon API 制限」でググって](https://www.google.com/search?q=Mastodon+API+%E5%88%B6%E9%99%90)もピンポイントの情報がなかったので自分のググラビリティとして。

## Mastodon API のリクエスト／アクセス制限

分散型 SNS の [Mastodon](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B9%E3%83%88%E3%83%89%E3%83%B3_(%E3%83%9F%E3%83%8B%E3%83%96%E3%83%AD%E3%82%B0)) には Web API（[REST](https://ja.wikipedia.org/wiki/Representational_State_Transfer)ful API）にアクセス／リクエストできる頻度に制限があります。


**[アクセストークン](https://qiita.com/KEINOS/items/dfe79bc3923fa79e3d1c#fn1)を必要としない API へのアクセスは IP アドレスを制限対象としている**ため、気づかないうちに制限されている可能性があります。特に、同一ネットワーク内（例えば社内）からのアクセスの場合は、そのグローバル IP アドレスが対象となるからです。

Mastodon の API を利用したアプリを作る時は、そのリミット（限界）に触れていないか注意を払う必要があります。

### 現在のアクセス制限のリミット残の確認

制限レートの情報は応答ヘッダーで返されます。

| ヘッダ | 説明 |
|:-:|:--|
| `X-RateLimit-Limit` | 期間ごとに許可されるリクエストの数  |
| `X-RateLimit-Remaining` | 実行できるリクエストの残数  |
| `X-RateLimit-Reset` | 制限レートがリセットされるタイムスタンプ |

```shell-session:QiitaのSNS「Qiitadon（β）」の例
$ curl -s --head https://qiitadon.com/api/v1/instance | grep ratelimit
x-ratelimit-limit: 7500
x-ratelimit-remaining: 7495
x-ratelimit-reset: 2020-09-08T13:25:00.019685Z
```

API のメソッドによって異なる制限レートがあるため、複数の制限による影響を受ける可能性があります。ヘッダーは、そのうち最も制限が近いものに関する情報を返します。

### API メソッド毎のアクセスの制限レート

| API のエンドポイント | 制限対象 | 対象期間 | 期間内の<br>最大回数 | 目安 | 制限タイプ |
|:--|:-:|:-:|:-:|:-:|:-:|
| `*/api/*` | アカウント情報<br>（アクセストークンあり） | 5分 | 300 | 1 回/秒 | アカウント毎 |
| `*/api/*` | 一般アクセス<br>（アクセストークンなし） | 5分 | 300 | 1 回/秒 | IP 毎 |
| `POST /api/v1/accounts` | アプリのサインアップ | 30分 | 5 | 6 分/回 | IP 毎 |
| `POST /api/v1/media` | メディアのアップロード | 30分 | 30 | 1 回/分 | アカウント毎 |
| `DELETE /api/v1/statuses/:id` | トゥートの削除 | 30分 | 30 | 1 回/分 | アカウント毎 |
| `POST /api/v1/statuses/:id/unreblog` | ブーストの削除 | 30分 | 30 | 1 回/分 | アカウント毎 |

## 参考文献

- 出典: [Rate limits](https://docs.joinmastodon.org/api/rate-limits/) | REST API @ Mastodon 公式
- ソースコードの制限箇所
  - [/config/initializers/rack_attack.rb](https://github.com/tootsuite/mastodon/blob/93dd413a47f828f386d84cc1c7db15536c4d80c3/config/initializers/rack_attack.rb#L45-L106) | v3.2.0 | Tootsuite @ Mastodon 公式 @ GitHub

## 合わせて読みたい

- [Qiitadon の Streaming API を受信する時の注意点](https://qiita.com/KEINOS/items/75febc1d5391ae5c7bd9) @ Qiita
- [Mastodon API で「返信」をトゥートする 1 行サンプル（bash, PHP）](https://qiita.com/KEINOS/items/68ae99c7f98fe309f9bf) @ Qiita
- [Mastodon API から「LTL」を取得する 1 行サンプル](https://qiita.com/KEINOS/items/94b755c1afc5e3ab34ff) @ Qiita
- [Mastodon API から「未収載」でトゥートする PHP サンプル](http://qiita.com/KEINOS/items/27d201afed4ed665cb11) @ Qiita
- [Mastodon API で「You are being redirected」とアクセストークンの取得](http://qiita.com/KEINOS/items/78445aad59e5818bf87e) @ Qiita
【Laravel】ラズパイのDBと連携させる

ラズパイ側の操作とLravel側の操作に分けて解説していく。

**DBでのユーザの作成と権限付与は別々でやる**

#ラズパイ側の操作
##DB操作用ユーザ作成
```sql
 CREATE USER 'user'@'%' IDENTIFIED BY 'pass';
```
`%`を使用することでどんなホストでも接続ができる

##権限確認
###登録されているユーザ名を確認

```sql
select user,host from mysql.user;
```
###特定ユーザの権限確認

```sql
show grants for 'ユーザ名'@'ホスト名';
```
ユーザ名とホスト名は`'`か`"`で囲むこと

##権限付与
```sql:形式
GRANT [権限] ON [レベル] TO [ユーザ] IDENTIFIED BY PASSWORD '[パスワード]'
```
#####権限は
- select
- update
- insert
- delete
- all




|レベル|説明|
|---|---|
|**GRANT [権限] ON \*.\* TO [ユーザ]**|グローバルレベル|
|**GRANT [権限] ON [DB名].\* TO [ユーザ]**|データベースレベル|
|**GRANT [権限] ON [DB名].[テーブル名] TO [ユーザ]**|テーブルレベル|
|**GRANT [権限]\(カラム1,カラム2,...\) ON [DB名].[テーブル名] TO [ユーザ]**|カラムレベル|

##ポートの確認
```sql
show variables like 'port';
```
```
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
```

#Laravel側の操作
後は今まで得た情報を`.env`と`database.php`に反映するだけ
ここでは`.env`だけ書いておく

```:.env
DB_CONNECTION=mysql
DB_HOST=IPアドレス
DB_PORT=3306
DB_DATABASE=DB名
DB_USERNAME=作成したユーザ名
DB_PASSWORD=パスワード
```

#参考
- [[MySQL]権限の確認と付与](https://qiita.com/shuntaro_tamura/items/2fb114b8c5d1384648aa)
- [mariadb mysql ポート番号を調べる](https://qiita.com/yusk24/items/923305e5acae19f6976d)
- [接続/要求の承認](https://rfs.jp/server/mysql/m02/04-11.html)
Hasuraで「Error: Unable to find native implementation, or alternative implementation for WebSocket!」

# 結論: WebSocketLinkはサーバーサイドでは使えない

- SSRが問題
- WebSocketLinkはブラウザで動作させて上げないといけない
- WebSocketLinkがSSR時にサーバー側でエラーを起こしている
- `process.browser`で判定してブラウザでのみWebSocketLinkを使う

```tsx
import { ApolloClient, InMemoryCache } from "@apollo/client";
import { WebSocketLink } from "@apollo/client/link/ws";

const wsLink = process.browser ? new WebSocketLink({
    uri: "ws://localhost:8080/v1/graphql",
    options: {
      reconnect: true,
      connectionParams: {
        headers: {
        },
      },
    }
  }) : undefined;

const client = new ApolloClient({
  link: wsLink,
  cache: new InMemoryCache(),
});
```

### 前提
Hasura, Apollo, React, SSR（サーバーサイドレンダリング）
でGraphQLのSubscriptionsでリアルタイム更新をしたくてwebSocketを使った。

### エラー内容

```bash

Error: Unable to find native implementation, or alternative implementation for WebSocket!
```
![スクリーンショット 2020-09-08 23.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206542/53a72db9-67a6-caf4-27e6-414ef1d327d3.png)

## 解決

この実装ではエラーが出ます。

```tsx
import { ApolloClient, InMemoryCache } from "@apollo/client";
import { WebSocketLink } from "@apollo/client/link/ws";

const wsLink = new WebSocketLink({
    uri: "ws://localhost:8080/v1/graphql",
    options: {
      reconnect: true,
      connectionParams: {
        headers: {
        },
      },
    },
  });

const client = new ApolloClient({
  link: wsLink,
  cache: new InMemoryCache(),
});

```
### わるかったところ

結局SSRでサーバーサイドでのレンダリングをしている時に問題が起こっているようでした。
どうやらWebSocketはブラウザ側で動作させて上げないといけないらしい。

node.jsにもwsなるプラグインがあったので色々やれば動作するのかも知れないが

### 回避

`process.browser`でブラウザ動作かを判定して三項演算子でtrueならWebSocketLinkのインスタンスを返す。
falseなら返さないとしたいので`undefined`を返す

undefinedがいいかは分からなかったが、もっといい案があれば教えて下さい。

```tsx
import { ApolloClient, InMemoryCache } from "@apollo/client";
import { WebSocketLink } from "@apollo/client/link/ws";

const wsLink = process.browser ? new WebSocketLink({
    uri: "ws://localhost:8080/v1/graphql",
    options: {
      reconnect: true,
      connectionParams: {
        headers: {
        },
      },
    }
  }) : undefined;

const client = new ApolloClient({
  link: wsLink,
  cache: new InMemoryCache(),
});
```

## 参考

GitHub
https://github.com/apollographql/subscriptions-transport-ws/issues/333#issuecomment-359261024

Hasura Subscription
https://hasura.io/learn/graphql/react/subscriptions/1-subscription/
お爺さまにAndroid持たせて失敗した話

# 始まりはおよそ1年前
### 携帯（スマートフォン）を持たせたいなと思いました
理由はなんと...
**事故りやがった！！**　← 言い方

単独事故だったんですけどね、
それでも十分こっちには心配するお話しです...

で、その時何が困ったかっていうと、
電話がかかってきた時、向こうもテンパってたとは思うんですけど、
**場所を言わない!!**

「◯◯号線沿いのなんちゃら〜」

正直こちらからすると
免許取得したてな上に
元から地理には弱かったおかげでさっぱりでした。

その時は親の協力もありなんとかなったんですが、
これを期に運転の制限やスマホを持たせる事で

- 頭を働かせる事（多少小難しくてもなんとかやっていけるだろうと思ってました）
- 居場所を追跡できる事
 
この辺が改善してくれるかなと思い、
**Android購入しました**


で、まぁ追跡アプリはLife360を使いました
無料で、家族グループができるので!

> 事故を期に、運転を近所にするだとか、ドライブレコーダーをつけるだとか、安全装置のついた車に乗るとか決めておきました。

> 本人がまだ乗る気でいたのに驚きですが、買い物とかを考えると仕方ないのかなと思う反面、人様にやられると孫である私にまで被害が出る可能性があることを考えているのかは謎
> つい最近免許更新の手前の高齢者がやる奴を受けてきた模様
> 点数ギリギリだったため、1,2年以内にはやめさせる方向に持っていく途中

# 持たせてからおよそ1ヶ月
### 変化はあった
まぁ、いろいろと聞かれました。
充電や、電話の仕方、Life360で他の家族の居場所をみる方法
いろいろ触る事で多少は元気でいられるのかな...なんてね

### ちょっとした異変も感じてはいた
時々電話がかかってくるものの無言だったので押し間違いだろうと思いました

# 持たせて9ヶ月程
### いつまでも電話がかかってくる
Androidってお年寄り用に大きい画面にしたり、電話やメールのショートカットがデフォルトで表示されるじゃないですか.
当然ショートカットに家族を登録してたんですが、
どうやら携帯に鍵をつけていたのがポケットで反応してたようで、
そこから電話がかかってきているのではと予想しました.

### 改善しよう
電話のかけ方もわかってるみたいなので、不要だろうという事で
ショートカット全部削除しましたw

# ついこの間
### ん...ん〜〜？？？？？
ここまで言ってこなかったんですが、MVNO（昔の楽天モバイル）と契約していたんです。
で、手続きがネットで済むという事もあり、（親が）携帯料金を負担していたんですが、
**電話料金がえげつない**

とある1日の通話代がなんと...
**¥35,780-**

目を疑いました....
ちなみに通話時間は14時間54分
ほとんど15時間ですね

# 実はあった落とし穴(?)
私はiphoneだったのであまり気にしていなかったというか
感づいてたんですが、大丈夫だろうと放っておいてたんです。

Androidって電話中にホーム画面に戻れるじゃないですか？
そこから電話に戻るにはスワイプしてコントロールパネルから電話の履歴（？）を見つける必要があるんですが、
**その操作を理解させるのがめちゃくちゃ難しい**

という事もありほぼ半日電話がかけっぱなしになっていたようです

# 改善策
- 現在のケースはストラップがつけれるようなソフトタイプのケース
    - 手帳型にする事で、間違って鍵が触れる事を防ぐ
- Androidをやめる
    - 先ほど言った通り電話中にホーム画面戻っちゃうので、iphoneにするのか
    - あるいはガラケーに戻るのか

# 結果
### ってことで
AndroidのSIMを解約してガラケーに移行する予定です

居場所に関してはGPSでどうにかなるのか.
あるいは他の方法を探すのか...

できればお年寄りのためのAndroidの簡単モード(？)を
操作がもっともーっっとわかりやすいのを作ってくれることを祈りますが、
おそらく次の世代のおじいちゃんおばあちゃんはスマホ扱える年代が増えてくるでしょうから、需要は少ないのかもしれませんね。

という事でAndroid持たせて失敗した話でした.
PDF のページ番号を振りなおす

# PDF のページ番号を振りなおす必要性

報告書や書籍などのページ番号について、目次にはローマ数字 (i, ii, iii...)、本編はまた 1 から始まるアラビア数字 (1, 2, 3...) を振ることが一般的です。

![PDF_page_number.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704500/5dbb9b5b-c137-fe90-3f4d-437dccdc50ec.png)


しかし、その PDF 版はそうなっておらず、PDF のページ目から単純な連番のページ番号が振られていることが多いです。その場合、目次に n ページと書いてあっても、PDF 版では目次の総ページ数 m を足した (m + n) ページに飛ばなければなりません。

こうした不便さを解消するために、書籍と同様のページ番号を PDF に振る方法を紹介します。

# 環境

* Python
* [pagelabels](https://pypi.org/project/pagelabels/) (python パッケージ)

pagelabes をインストールするには、`pip install pagelabels` を実行してください。



# 実行

```shell
python -m pagelabels --startpage 1 --type "roman lowercase" --outfile out.pdf in.pdf
python -m pagelabels --startpage 9 --type "arabic" out.pdf
```

## pagelabels のオプション

* `startpage` : PDF全体の何ページ目から、このスキームでページを振るか。
* `style` : 数字のスタイル。`arabic` アラビア数字 (1, 2, 3, ...), `roman uppercase` 大文字のローマ数字 (I, II, III, ...), `roman lowercase` 小文字のローマ数字 (i, ii, iii, iii), `letters uppercase` 大文字 (A, B, ..., Z, AA, BB, ...), `letters lowercase` 小文字 (a, b, ..., z, aa, bb, ...)
* `prefix` : ページ番号の前に付ける文字列。"page - " とか。
* `firstpagenum` : 割り振るページ番号の最初の番号。指定しない時は 1 からページ番号が振られる。

# Adobe Acrobat Reader での見栄え、操作性

* ページサムネイルでは、きちんと i, ii, iii, ..., 1, 2, 3, と表示されます
* ページ番号は、i (1/140), ii (2/140), ..., viii (8/140), 1 (9/140) というように表示されます。
* ページ番号を直接入力して所望のページにジャンプするときは、ページ番号のところに ii と入れたり、1 と入れたりします。
JavaScript 高階関数 Higher-Order Functions とは

## この記事を読むとわかること
JavaScript初心者が高階関数(Higher-Order Functions)を理解できます。



## 高階関数 Higher-Order Functions とは

### 高階関数 Higher-Order Functions とは

高階関数とは、次のいずれかを実行する関数です。

* 関数を引数として扱う
* 関数を戻り値として扱う



### 高階関数を使うことのメリット

* 抽象化により、人間の読者が簡単に再利用、デバッグ、理解できる方法で複雑なコードを書くことができます
* 新しい変数に再割り当てするなど、他のタイプのデータと同じように関数を操作できます
* 機能のまとまりを細切れに保つことにより、テストが容易になります



### 第一級関数 first-class function とは
高階関数を理解する上でJavaScriptの関数の持つ基本の性質を知る必要があり、第一級関数 first-class function について触れておきます。

第一級関数とは、第一級オブジェクトとして扱うことのできる関数のことであり、JavaScriptがサポートしています。
第一級関数は他のすべての変数と同じように扱われます。 よってこれらを引数として関数に渡したり、他の関数から値として返したり、変数やデータ構造に割り当てたりすることができます。 

第一級関数の複雑さ(関数の引数が関数..)に特に制限が設けられていない時，プログラミング言語が高階関数(higher-order function) をサポートしている、と表現できます。第一級関数は、高階関数のような形で日常的に用いられます。

以下は、関数を変数に割り当てる例です。

```javascript:関数を変数に割り当てる例
function greet(name) { 
 console.log('Hello ' + name) 
}
greet(“John”) // “Hello John”
var sayHello = greet 
sayHello(“Alex”) // “Hello Alex”
```





## 高階関数の例
以下にて高階関数の例を2つ見てみましょう。

### 1. 配列の内容を順に処理するforEachメソッド
以下は、配列の要素を順番に取り出すための高階関数です。

```javascript:配列の内容を順に処理するforEachメソッド
array.forEach(callback [,that])
// array : 配列オブジェクト
// callback : 個々の要素を処理するための関数
// 関数callbackの中でthisが示すオブジェクト
```


以下は処理用の関数として、配列の要素を二乗するコールバック関数です。
コールバック関数とは、呼び出し先の関数の中で呼び出される関数のことです。
この関数では配列の中身を受け取れるように引数`value(要素の値)`,`index(インデックス番号)`,`array(元の配列)`を指定する必要があります。ちなみに`index(インデックス番号)`,`array(元の配列)`は不要であれば省略可能です。

```javascript:配列の要素を二乗するコールバック関数
var data = [1, 2, 3, 4];
data.forEach(function(value,index,array){
  console.log(value * value);// 結果 1, 4, 9, 16
});
```


### 2. 配列を指定されたルールで加工するmapメソッド
以下は、配列の要素を順番に取り出すための高階関数です。

```javascript:配列を指定されたルールで加工するmapメソッド
array.map(callback [,that])
// array : 配列オブジェクト
// callback : 個々の要素を加工するための関数
// 関数callbackの中でthisが示すオブジェクト
```


以下は処理用の関数として、配列の要素を加工した結果をまとめて新たな配列として返すコールバック関数です。
この関数では配列の中身を受け取れるように引数`value(要素の値)`,`index(インデックス番号)`,`array(元の配列)`を指定する必要があります。

```javascript:配列の要素を二乗した結果を新たな配列として返すコールバック関数
var data = [1, 2, 3, 4];
var result = data.map(function(value,index,array) {
  return value * value ;
});

console.log(result); // 結果 : [1, 4, 9, 16]
```

``上記の2例に共通して言える事ですが、高階関数から呼ばれるコールバック関数は自由に差し替える事ができます。
これこそが高階関数を使う理由です。``



## 高階関数を使わない場合と使う場合の違い

元の配列の各値を2倍した新しい配列を作成するコードで違いを見てみます。

```javascript:高階関数を使わない場合
const arr1 = [1, 2, 3];
const arr2 = [];
for(let i = 0; i < arr1.length; i++) {
  arr2.push(arr1[i] * 2);
}
// prints [ 2, 4, 6 ]
console.log(arr2);
```


```javascript:高階関数を使う場合
const arr1 = [1, 2, 3];
const arr2 = arr1.map(function(item) {
  return item * 2;
});
console.log(arr2);
```







## 参考情報

[Higher Order Functions]
(https://medium.com/functional-javascript/higher-order-functions-78084829fff4)

[Higher Order Functions in JavaScript]
(https://www.lullabot.com/articles/higher-order-functions-in-javascript)

[Higher-order functions in Javascript]
(https://dev.to/damcosset/higher-order-functions-in-javascript-4j8b)

[Understanding Higher-Order Functions in JavaScript]
(https://blog.bitsrc.io/understanding-higher-order-functions-in-javascript-75461803bad)

[改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで]
(https://amzn.to/337hyku)
form_tag内のsubmitが反応しないときの対処

#前提
Ruby on Railsでローカル開発中、Chromeで動作確認をしていたとき。
form_tag内にJavaScriptとsubmitが含まれているページにlink_toを使って移動したときに発生した。
#症状
form_tag内のsubmitをクリックしてもリアクションを返さない。
（URLを直打ちした場合や、link_toを通してページを読み込んでも再リロードした場合に限りsubmitが反応するため、バグかもしれない。）

#対策
form_tag内にJavaScriptを記述しないこと。
JavaScriptが記述されている場合にのみ、上記のような不具合が発生するした。
Remove-Itemコマンドレットとは？

##Remove-Itemコマンドレットとは？
Windows PowerShellコマンドレット「Remove-Item」は、特定の名前を含むファイルやフォルダなどのアイテムを削除するためのコマンドレットです。例えば、「temp」や「.exe」といった名前を含むファイルやフォルダを削除することができます。

　また、Remove-Itemコマンドレットは、コマンドプロンプトの「del」コマンドや、Linuxの「rm」コマンド、「rmdir」コマンドと同じ要領で使用できます。

####Remove-Itemコマンドレットの書式
```powershell
Remove-Item [パス] [オプション]
```


####Remove-Itemコマンドレットの主なオプション
Remove-Itemコマンドレットの主なオプションは次の通りです。

|オプション|意味|
|:--|:--|
|-Path   |ファイルのパスを指定する。省略可能|
|-Exclude|指定したパターンに一致するファイルやフォルダを指定する|
|-Force  |隠しファイルや読み取り専用ファイルなどを削除する|
|-Recurse|指定したフォルダとそのサブフォルダに含まれるファイル／フォルダを削除する|
udemyの講座でCentOS7を使ってyum -y install dockerした際にCannot find a valid baseurl for repoとエラーが出た場合の対処法

## 状況
udemy
Linuxコマンドから始めるDocker　～　BE A FIRST PENGUIN AND GROW AS WHALE
https://www.udemy.com/course/linuxdocker-be-a-first-penguin-and-grow-as-whale/learn/lecture/16684274#questions/12224904
セクション３−１５

にて、CentOSをインストール後

```
# yum -y install docker
```

した際に

```
Cannot find a valid baseurl for repo
```
とエラーが出ました。
CentOSは、そのままインストールしただけではyumコマンドが使えないことがあります。
少なくとも、私が使用したCentOS7.8.2003ではそうでした。

## 環境
macでVirtualBox上にLinux（CentOS7.8.2003）をインストール
rootユーザーで全操作を行った


## CentOSをインストール後、dockerをインストールしようとしたらエラーになった
```
# yum -y install docker
```

![スクリーンショット 2020-09-05 23.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702554/eccaf036-f10a-e913-8fa7-8bccaf370678.png)


## 1.ONBOOTの記述の変更とDNSの設定をする
以下を開きます。

```
# vi /etc/sysconfig/network-scripts/ifcfg-？？？
```
???は

```
# cd /etc/sysconfig/network-scripts
# ls
```
でご自身のディレクトリを確認して入力してください。
私の場合はifcfg-enp0s3とifcfg-enp0s8の二つが存在しましたが、ifcfg-enp0s3のみで行っています。


開いた先でONBOOTの記述を"no"から"yes"に変更し、DNSの設定を記述します。

```
ONBOOT=yes

DNS1=8.8.8.8
DNS2=8.8.4.4
``` 
## 2.再起動

設定が終わったら再起動をします。

```
# systemctl restart network
```

以上でうまくいかなかった場合はLinuxを再起動してみてください。


## 3.確認
念の為動作確認をします。
試しにupdateしてみました。

```
# yum update
```

ちゃんと動きました。
![スクリーンショット 2020-09-08 12.47.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702554/01d2fb69-4740-2e10-8fbe-08bb75875160.png)

## 4.Dockerのインストール

```
# yum -y install docker
```
無事ダウンロードできました。
![スクリーンショット 2020-09-08 13.16.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702554/ab34d24a-f1d8-b739-6c48-8ab4bea4a1ca.png)



## もしうまく動かなかったらbaseurlを書き換える
それでも動作が思う通りにならなければbaseurlに問題があるかもしれません。

```
# vi /etc/yum.repos.d/CentOS-Base.repo
```
初期状態
![スクリーンショット 2020-09-05 23.57.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702554/14d85572-dbf0-7f7e-7063-38ceeb1cc891.png)


全てのbaseurlを以下の記述に変更します。

```
#baseurl=http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/7.8.2003/os/x86_64/
```

編集後
![スクリーンショット 2020-09-05 23.59.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702554/b06d767e-944e-43f8-56e4-2e10a302a1ce.png)

お使いのバージョンのURLで設定してください。
私は以下のサイトから
https://blog.77jp.net/linux-iso%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8-%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%82%B5%E3%82%A4%E3%83%88%E5%9B%BD%E5%86%85%E3%83%9F%E3%83%A9%E3%83%BC

http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/
を開き
自分のバージョン ➡︎ os/ ➡︎ x86_64/
と開いたURLをbaseurlに設定しています。



## 参考
https://mebee.info/2020/03/21/post-7689/
https://qiita.com/ntkgcj/items/fd8588dcd65a42c34875
【初心者向け】矢印(>)の位置でボタンの作り方を変えた方がいい話。

# どうも7noteです。ボタンをCSSで作るとき、ボタンに付いている矢印（>）の配置で作り方を分ける方がいい話。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/technique/arrow-potision/
【Rails】本番環境でのデータベースをリセット

## はじめに

####【前提】
・Railsを使用してアプリケーションを開発
・AWSを使用
・EC2にてWebサーバを作成

## 既存のデータベースをリセット
今まで私自身ローカル環境にて開発を行うにあたり、DBをリセットしたいことがあった場合
```rails db:riset```を使用し、DBの再作成を行なっておりました。

今回デプロイ後ですが、マイグレーションファイル等に変更を色々と加えたため、
一度本番環境でもリセットし、再構築しようと考えました。

## 本番環境でのデータベースリセット

```ruby
RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rails db:drop
```
このコマンドで本番時でのDBをリセットすることができます
（本番環境でのDBリセットは、実務ではありえるのでしょうか・・）


#### 再度データベースの内容を反映させる

```ruby
   rails db:create RAILS_ENV=production
   rails db:migrate RAILS_ENV=production
   rails db:seed RAILS_ENV=production
```

※シードに情報を記載していない方は、最後の１行は不要です
上記コマンドを使用すれば本番環境へ無事変更点等が反映されているはず・・・

上記記載内容では、こういったリスクがあるのでは等の改善案や提案がございましたら、
コメント等にてお伝えいただければありがたいです。


以上、ご参考になれば幸いです。
【SpringBoot】DataSourceProperties$DataSourceBeanCreationException

## 発生事象
簡単に動作検証のために、SpringBootを使用してWebアプリを作ろうと思ったら、ビルド時に失敗。
下記のようなエラーが出た。

```
Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

Action:
Consider the following:
	If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
	If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
```

データソースの設定に失敗しているらしい？


## 対応方法
どうやら、後で使おうと思って記載していたMyBatisを記載していたことが原因だったみたいでした。
pom.xmlからMyBatisの定義を削除したら正常に起動しましたが、他にも以下のような解決方法があるみたいです。

### 1.EnableAutoConfigurationアノテーションをつける。
[プロジェクト名Application.java]ファイルに、アノテーションを追加します。

```sample.java
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@SpringBootApplication
public class MyAppSampleAppApplication {

	public static void main(String[] args) {
		SpringApplication.run(MyAppSampleApplication.class, args);
	}
}
```

### 2.素直にデータソースを設定する

```application.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driverClassName=org.postgresql.Driver
```
※ドライバーを予め落としておく必要があります。



## 補足：複数のデータソースを設定する方法
調べている中で、複数のデータベースを利用したい場合の記述を見つけたので、メモ。
[２つのデータソースを指定する方法](https://www.it-swarm.dev/ja/java/spring-boot%E3%81%AF2%E3%81%A4%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B/1053464638/)
ServiceNow - 複数のレコードを取得するAjax呼び出し

#概要
次のような選択された複数のユーザレコードのメールアドレスを取得するフォームを作成します。
![display_several_emails_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/a0026c48-2810-54f7-f039-cd3491cc87b2.png)


#フォーム
1.ユーザ選択と選択されたユーザのメールアドレスを表示する２つのフィールドを作成します。
コンテナ変数はフィールドの幅を狭くするために使いますい。
![variables_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/87947343-0cd3-9867-1e2c-5016cdea7abe.png)
2.変数ユーザを「リストコレクタ」タイプにします。
![variables_users_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/2ccd1384-eaa2-6ffb-ab87-7835995e07a5.png)
3.「リストコレクタ」タイプはデフォルトでは選択可能な項目一覧と選択された項目一覧の2つの一覧を表示しますが、今回は一覧を一つにするために項目変数の属性に「glide_list」を指定します。
![variables_users_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/3c5c6edb-1df8-f7a9-4de3-e014821f5c2e.png)
4.メールアドレスのタイプは「複数行テキスト」にします。
![variables_email_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/f625193b-a065-9a7e-9160-d208da6bc319.png)

#スクリプトインクルート
サーバ側で実行されるスクリプトを作成します。
![client_script_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/de37ce05-0820-ab91-21f3-78a0bee3ed18.png)

```
function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }

    var ajax = new GlideAjax('getUserEmail');     //呼び出すスクリプトインクルード名
    ajax.addParam('sysparm_name', 'getEmail');    //呼び出すメソッド名
    ajax.addParam('sysparm_uid', newValue);       //引き渡す値。選択されたユーザのsys_id（コンマ区切り）
    ajax.getXMLAnswer(function(answer) {          //サーバスクリプトを呼び出す
        if (answer.length > 0) {                  //メールアドレスを取得できた場合はメールアドレスをメール一覧フィールに設定
            var emailArray = answer.split(',').sort();  //コンマ区切りのメールアドを配列に変換
            g_form.setValue('email_addresses', emailArray.join('\r\n')); //配列を改行区切りの文字列に変換してメールフィールドに設定
        }
    });
}
```

#スクリプトインクルード
注意が必要なのでpush()する要素がStringでないと最初の値が繰り返し追加されることです。正しく各レコードデータを追加させるのには値をtoString()して文字列に変換します。
![client_script_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/e73e2685-a627-acb4-4081-2f48605e1ea2.png)

```
var getUserEmail = Class.create();
getUserEmail.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getEmail: function() {
        var user_ids = this.getParameter('sysparm_uid'); //クライアントから送られて来るユーザのsys_idを取得。sys_idはコンマ区切り
        var user_lookup = new GlideRecord('sys_user');   //ユーザテーブルを参照する
        user_lookup.addQuery('sys_id', 'IN', user_ids);  //user_idsに含まれるsys_idを取得
        user_lookup.query();                             //クエリーを実行
        var returnArray = [];                            //結果を保管する配列
        while (user_lookup.next()) {                     //結果レコードをループ
			returnArray.push(user_lookup.email.toString()); //結果レコードのメールアドを配列に追加
        }
        return returnArray.join(',');                    //配列をコンマ区切り文字列に変換
    },
    type: 'getUserEmail'
});
```
AtCoder記(2020/09/08)

#AtCoder Beginner Contest 006
ということで、さっそくAtCoder Beginner Contestの006から始めていきましょう！
（「001から始めないんかい」という気持ちは胸にしまっておいてください、、、）

##[問題-A](https://atcoder.jp/contests/abc006/tasks/abc006_1)
数字Nが与えられます。Nに3が含まれる、もしくは3で割り切れる場合はYES、それ以外はNOと出力してください。

```python:A.py
N = int(input())
if N % 3 == 0:
    print("YES")
else:
    print("NO")
```
FizzBuzz問題の少し簡単版でしょうか。答える際に改行を入れることを忘れずに。

##[問題-B](https://atcoder.jp/contests/abc006/tasks/abc006_2)
トリボナッチ数列というものがあります。この数列は3つ前までの数字を足したものです。
厳密には、

```math
a_1=0, a_2=0, a_3=1 \\
a_n=a_{n-1}+a_{n−2}+a_{n−3}
```

と定義されています。この数列の第n項、$a_n$を10007で割った余りを求めてください。

```python:B.py
n = int(input())
a, b, c = 0, 0, 1

for i in range(n-1):
    a, b, c = (b % 10007), (c % 10007), ((a+b+c) % 10007)
print(a)
```
この手の大きな数(10^7とか)で割って余りを表示する問題に弱いんです、、最近は最終的な答えを大きな数で割るのではなくてその都度計算するように対策しています。
この問題のほかの考え方としては、$a_1$と$a_2$の場合は0を出力するように分岐してそれ以外の場合はループ回数をn-3としたfor文を回すくらいかなと思います。(gitに上げようと思います。)

##[問題-C](https://atcoder.jp/contests/abc006/tasks/abc006_3)
「この街には人間がN人いる。人間は、大人、老人、赤ちゃんの3通りだ。この街にいる人間の、足の数の合計はM本で、大人の足は2本、老人の足は3本、赤ちゃんの足は4本と仮定した場合、存在する人間の組み合わせとしてあり得るものを1つ答えよ。」

```python:C.py
n, m = map(int, input().split())

for a in range(n+1):
  b = 4*n -2*a - m
  c = n -a -b
  if b >= 0 and c >= 0:
    print(a, " ", b, " ", c)
    break
else:
  print("-1 -1 -1")
```

何かいろいろ書いてありますが

```math
a+b+c=N \\
2a+3b+4c=M
```

の連立方程式を解くということと同値ですね。意外と数学の知識を使うことがあるので、頭の中から抜け落ちないように気を付けておきたいところです。

ところで、解法を参考にしているとrange関数ではなくxrange関数というものを見かけました。初めて見かけたので調べるとこのような記事を発見しました。

[Python2からPython3.0での変更点](https://qiita.com/cstoku/items/353fd4b0fd9ed17dc152)

なるほど、知らぬ間に廃止されていたわけですね。python3から使用してきた身としては全く知らないものでした。これを機にイテレータなどを勉強するのもよいかもしれませんね。

##[問題-D](https://atcoder.jp/contests/abc006/tasks/abc006_4)
数字が書かれたカードがN枚あります。このカードの束（山札）に対して以下の操作が可能です。
山札からカードを1枚抜き取り、任意の場所に挿入する。
山札の上から下に向けて、カードを昇順に並べ替えるために必要な、最小の操作回数を求めてください。

```python:D.py
import bisect

n = int(input())
cards = [int(input()) for i in range(n)]

sort_after_cards = [0]
for card in cards:
  if sort_after_cards[-1] < card:
    sort_after_cards.append(card)
  else:
    index = bisect.bisect_left(sort_after_cards, card)
    sort_after_cards[index] = card    
print(n - len(sort_after_cards) +1)
```

イメージ的には山札の上にあるカードを一枚引き別の山札を作る感じです。そして昇順にするためには、山札の下に本来元々あるカードよりも大きな数字がこなければならないため、もし小さい数字が来た場合は二分探索で本愛の位置に戻してあげましょう。最終的には交換したカードが除外された昇順の山札リストが作成されます。昇順にするだけならsortやsortedを使えばすぐですね。

#おわりに
初回としてはなかなか理解に苦しみながら進めました。特にC問題やD問題は数学的思考やアルゴリズムを駆使して、いかに計算量を抑えて効率化することが求められているかというのを感じます。
最近のコンテスト的には調子が良くてC問題までしか解けないので、たくさん練習していろんなか発想が思いつくように努力します。
［Android］RecyclerView のアニメーションの時間を調整する

# はじめに

RecyclerView では ItemAnimator をセットすることでアニメーションを表示できるようになります。ItemAnimator は次のようなライブラリがあって好みのアニメーションに簡単に切り替えられるようになってます。

* [recyclerview-animators](https://github.com/wasabeef/recyclerview-animators)
* [ItemAnimators](https://github.com/mikepenz/ItemAnimators)

例えば [ItemAnimators](https://github.com/mikepenz/ItemAnimators) の ScaleUpAnimator を使ってアニメーションを実装すると次のような感じで表示されます。

```kotlin
    val scaleUpAnimator = ScaleUpAnimator()
    recycler_view.also { view ->
        // 省略 : Adapter や LayoutManager をセットアップする
        view.itemAnimator = scaleUpAnimator
    }
```

![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/96ce2823-b49c-f40e-c2d9-f053ddc3fe0a.gif)


# 調整方法

こういったアニメーションをもう少し早くまたは遅くしたいときがあると思います。そういったときは setAddDuration、setChangeDuration、setMoveDuration、setRemoveDuration を設定することで簡単に時間を調節できます。

- [RecyclerView.ItemAnimator | setAddDuration](https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator#setAddDuration(long))
- [RecyclerView.ItemAnimator | setChangeDuration](https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator#setChangeDuration(long))
- [RecyclerView.ItemAnimator | setMoveDuration](https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator#setMoveDuration(long))
- [RecyclerView.ItemAnimator | setRemoveDuration](https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator#setRemoveDuration(long))a

例えば ScaleUpAnimator の setAddDuration と setRemoveDuration を変更してみます。すると追加と削除のときのアニメーションの表示間隔が変わります。

```kotlin
    val scaleUpAnimator = ScaleUpAnimator().apply {
        // 追加時のアニメーション間隔
        addDuration = 2000 
        // 削除時のアニメーション時間
        removeDuration = 4000
    }
    
    recycler_view.also { view ->
        // 省略 : Adapter や LayoutManager をセットアップする
        view.itemAnimator = scaleUpAnimator
    }
```

![image2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/cada9509-813b-374b-e3b2-19d85b367a19.gif)

# おわりに

RecyclerView でのアニメーションの時間を調整するには次の特徴を理解する必要がある。

- RecyclerView では ItemAnimation をセットすることでアニメーションを変更できる
- RecyclerView でアニメーションの時間を調整する場合は ItemAniamtor の setAddDuration、setChangeDuration、setMoveDuration、setRemoveDuration で変更できる。

本記事の内容の動作確認をしたプロジェクトがこちらにあります。 
詳細を知りたい方は以下を参照してください。


<a href="https://github.com/kaleidot725-android/item_animator"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/kaleidot725-android/item_animator.png" width="460px"></a>
CakePHP3のfindでcontain要素に検索条件を追加する

例えばUsersテーブルにUserInfoテーブルが紐付いていて、prefecture_id=2で名字が佐藤か工藤の１名をFindしたいときは下記のようになります。

useで$prefecture_idをわたしてあげるのがミソです。

```php:UsersController.php
$prefecture_id = 2;
$user = $this->Users->find()->contain(
    ['UserInfo' => function($q) use ($prefecture_id) {
        return $q->where(['UserInfo.prefecture_id' => $prefecture_id]);
    }])
    ->where([
        'Users.last_name IN' => ['佐藤', '工藤']
    ])
    ->first();
```

かんたんですね。
GORMでの主要メソッドによるゼロ値の取り扱いについて

## 前提

gorm v2.0 で確認しています。

```go
"gorm.io/gorm"
```

User 構造体は以下のものを使用しています。

```go
type User struct {
	ID        int       `gorm:"column:id;primary_key:yes"`
	Email     string    `gorm:"column:email"`
	Age       int       `gorm:"column:age"`
	IsAdmin   bool      `gorm:"column:is_admin"`
	CreatedAt time.Time `gorm:"column:created_at"`
	UpdatedAt time.Time `gorm:"column:updated_at"`
}
```

## Where

構造体を利用した書き方ですとフィールドがポインタ型でない場合ゼロ値（"", 0, false）は検索できないため、事故を防ぐならベタで書くのが一番安全かと思います。

ただ、DB の構造体のフィールドをすべてポインタ型で宣言するようなルールになっている場合は構造体を利用した書き方で統一しても良いかと思います。

```go
db.Where(User{Email: "example", Age: 10, IsAdmin: true}).Find(&user)
// => SELECT * FROM `users` WHERE `users`.`email` = "example" AND `users`.`age` = 10 AND `users`.`is_admin` = true;

db.Where(User{Email: "", Age: 0, IsAdmin: false}).Find(&user)
// => SELECT * FROM `users`;

db.Debug().Where("email = ?", "").Where("age = ?", 0).Where("is_admin", false).Find(&user)
// => SELECT * FROM `users` WHERE email = "" AND age = 0 AND `is_admin` = false;
```

## Update

v1 では Where 句と同様に更新するフィールドがポインタ型でない場合はゼロ値の更新はできませんでした。

```go
db.Where("id = ?", 1).Updates(User{Email: "", Age: 0, IsAdmin: false})
// => UPDATE `users` SET `updated_at`="2020-09-08 17:26:26.386" WHERE id = 1;
db.Where("id = ?", 1).Updates(User{Email: "example", Age: 10, IsAdmin: true})
// => UPDATE `users` SET `email`="example",`age`=10,`is_admin`=true,`updated_at`="2020-09-08 17:25:07.501" WHERE id = 1;
```

しかし、v2 で更新するカラムを明示的に選択した状態だとゼロ値でも更新することが出来るようになりました。

```go
db.Select("is_admin").Where("id = ?", 1).Updates(User{Email: "", Age: 0, IsAdmin: false})
// => UPDATE `users` SET `is_admin`=false WHERE id = 1;
```

## Save

save はゼロ値に関わらず構造体に設定してる値を INSERT・UPDATE します

```go
db.Debug().Save(&user)
// => INSERT INTO `users` (`email`,`age`,`is_admin`,`created_at`,`updated_at`) VALUES ("",0,false,"2020-09-08 08:01:09","2020-09-08 13:34:23");
// => UPDATE `users` SET `email`="",`age`=0,`is_admin`=false,`created_at`="2020-09-08 08:01:09",`updated_at`="2020-09-08 22:34:22.664" WHERE `id` = 1;
```

## Delete

delete は特にゼロ値は関係ありませんので割愛。

## オマケ
v2からUpdateとDeleteに条件文が必須になりましたので、全件更新・削除の事故がなくなりました。
`primary_key:yes`つけ忘れて全件削除事故が起きた後にO/Rの仕様をしって驚愕したのはいい思い出です。
【Java】printfで書式を指定して出力する%s,%d,%f【フォーマット指定子】

###表示形式を指定する関数
 printf（）などの、最後にfがつく関数を使用する場合には、表示形式を指定して出力することが可能。

今まで使っていなかったが、いろいろ自分で使って試してみないことにはものにできないので、みながら試してみましょう。

###それぞれの書式の意味

指定子|対応する型|説明|
:--|:--|:--
%s|string|文字列を出力
%d|int|整数を10進法で出力
%f|float|実数を出力


###使用例
```java
public class MyApp {
		
	public static void main(String[] args) {
		int score = 50; // %dが対応する
		double height = 165.8; // %fが対応する
		String name = "mako"; // %sが対応する

		System.out.printf("name: %s, score: %d, height: %f\n", name, score, height);
		System.out.printf("name: %-10s, score: %10d, height: %5.2f\n", name, score, height);

		String s = String.format("name: %-10s, score: %-10d, height: %5.2f\n", name, score, height);
		System.out.println(s);
	}
}
```

```:実行結果
name: mako, score: 50, height: 165.800000
name: mako      , score:         50, height: 165.80
name: mako      , score: 50        , height: 165.80
```

###アルファベットの意味を理解していればそれほど敬遠するものでもなかった

1. %sのsはString
2. %fのfはfloat（浮動小数点）
3. %dのdはDecimal（10進法）

これを念頭に考えれば、それほど敬遠するような物でもなかったですね。ただ、printfの引数の書き方はちょっと初心者にはややこしく移る気がしますが、後ろに順番通りに変数名を引数として渡してあげればいいだけのこと。

落ち着いて2、3個自分で試してみるとすぐ理解できる。


###表示桁を指定したり、右詰め左詰めも指定できる

```java
%10s // 10桁分準備して右詰め
%-10s // 10桁分準備して左詰め
%10s // 10桁分準備して右詰め
%-10s // 10桁分準備して左詰め
%5.3f // 整数部分を5桁、少数部分を3桁で表示

```

最後の%5.3fについては、整数部分は指定してもあんまり意味がないような気がします。。。

```java
public static void main(String[] args) {
  double f = 12345.12345;
	System.out.printf("%f\n", f);
	System.out.printf("%.3f\n", f);
	System.out.printf("%3.3f\n", f);
  }
}

```

```:実行結果
12345.123450
12345.123
12345.123

```
整数部分は指定した桁数よりも多い場合はそのまま表示される。
変化があるのは少数部分。

%.3fと%3.3fでは表示は同じ。
Railsのformを素のJavaScriptで送信する

## やりたかったこと

form送信後にJS側で何かしらの処理をしたい。

## 方法

fetchAPIのコールバックチェーンで行うことができる。

`turbolinks` や `rails-ujs` は使用しないので、 `remote: true` を使ったAjax通信とも異なるやり方。

「form送信後のJS処理」を、
当初 `form.submit() ~ setTimeout()`  のような感じで書いたが、実行順序が担保されなかったので書き直した。

## ポイント

`fetch` では
1. `credentials` に `'same-origin'` 
2. `body` に `new FormData(form)` 
を指定。

`= f.submit` や　`%button{ type: 'submit' }` を使うと Railsによってリクエストが飛ばされてしまうので、`%button{ type: 'button' }` を使って送信ボタンをクリックしたときにJavaScriptを呼び出すようにしている。

## サンプル

あまりサンプルがなかった気がするのでさらっと残す。
送信ボタンを押した後に二度押せないようにする処理も入れてるが、もっとちゃんとした書き方はあるのかも。

```js
const userForm = document.getElementById('user-form');
const submitBtn = document.getElementById('submit-btn');

submitBtn.addEventListener('click', () => {
  submitBtn.textContent = '送信中...';
  submitBtn.disabled = true;

  fetch('/users', {
    method: 'POST',
    credentials: 'same-origin',
    body: new FormData(userForm),
  }).then(response => {
    // 送信後の処理があればここに書く
  }).catch(error => {
    // 例外処理
  });
});
```

```haml
= form_with(model: @user, id: 'user-form') do |f|
  = f.text_field :name
  = f.text_field :mail
  %button{ type: 'button', id: 'submit-btn' }
    送信
```

### 追記

コントローラ側でリクエストを受け取るアクションに、 `protect_from_forgery` を適切に使うととりあえずリクエストを送信できるようになる
が、CSRF対策をちゃんとやるなら、`fetch` のパラメータに `headers: { 'X-CSRF-Token': csrfToken }` を付与する必要な場合がある。

jQueryを使っていると rails-ujs がよしなにやってくれるが、Vanilla.js で書く場合は Rails 側からCSRF のトークンを取ってくる必要がある。
詳しくは以下。

* [今さらjquery-railsがcsrfトークンをいい感じにしてくれていたことを知った](https://masaru-tech.hateblo.jp/entry/2018/03/27/151531)
* [RailsでCSRFを無効にせずにAjaxからRESTなAPIを叩く](https://kazumalab.hatenablog.com/entry/2018/01/10/021607)
* [Rails で CSRF トークンの検証を制御する
](https://qiita.com/kurashita/items/d1c8f6d79daec89c368c)
* [Rails の API モードで CSRF 対策機能を実装する](https://daido.hatenablog.jp/entry/2020/12/05/094648)

#### これが一番良さそう

* [Vue.jsとRailsの最適な融合を考える](https://tech.medpeer.co.jp/entry/2018/02/26/080000)

### 追記2

`ajax` イベントをキャッチして、フォーム送信を制御する方法もある模様。

- [rails-ujs と form_with の使い方](https://www.bokukoko.info/entry/2017/12/22/194327)

### 参考リンク

- [Fetch APIを使ってRailsのAPIを叩く](https://yanamura.hatenablog.com/entry/2017/05/12/094103)
- [railsサーバーとのAPI通信](https://naughtldy.hatenablog.jp/entry/2016/09/01/211714)
- [railsアプリ fetchを使ったajax通信のエラーハンドリングで気をつけること](https://qiita.com/ShuntaShirai/items/ce5042b7b5c814480933)
- [JavaScriptのFetch APIについて](https://morizyun.github.io/javascript/function-fetch-api.html)
- [HTTP通信 - JS Primer](https://jsprimer.net/use-case/ajaxapp/http/)
【Elixir/Phoenix】OTP 23.0にする。


# version確認
```
$ kerl list releases
.
.
.
22.3.4.10
23.0-rc1
23.0-rc2
23.0-rc3
23.0
23.0.1
23.0.2
23.0.3
Run '/usr/local/bin/kerl update releases' to update this list from erlang.org
```

# install
`23.0`をインストールする。

```
kerl build 23.0 23.0
kerl install 23.0 ~/erlang/23.0
```

（`kerl build`は1時間要することもあるらしいです。）

# 有効化
__有効化__
`source ~/erlang/23.0/activate`

__.zprofileに追記しておく__
`vi ~/.zprofile`
下記１行を追加しておく。

```~/.zprofile
export PATH="$HOME/erlang/23.0/bin:$PATH"
```

# 確認

```
$ mix hex.info
Hex:    0.20.5
Elixir: 1.10.4
OTP:    23.0

Built with: Elixir 1.10.0 and OTP 21.3
```

４行目のOTPが23.0になっていればOK。
Becky! Internet Mail Ver.2におけるフォルダ・ファイルが読み取れないトラブルへの対処（参考）

#概要
[Becky! Internet Mail Ver.2](http://www.rimarts.co.jp/becky-j.htm)を利用しているPCの移行を行ったところ、以下のエラーメッセージに遭遇した。
「フォルダが読み取り用に開けません。ファイルが破損しているか、何らかの理由で読み取り不能になっている可能性があります。ファイルメニューから、「フォルダ」「修復」を実行してみて下さい。」

このエラーで[検索](https://www.google.co.jp/search?q=%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%8C%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E7%94%A8%E3%81%AB%E9%96%8B%E3%81%91%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E7%A0%B4%E6%90%8D%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%80%81%E4%BD%95%E3%82%89%E3%81%8B%E3%81%AE%E7%90%86%E7%94%B1%E3%81%A7%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E4%B8%8D%E8%83%BD%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%8B%E3%82%89%E3%80%81%E3%80%8C%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%80%8D%E3%80%8C%E4%BF%AE%E5%BE%A9%E3%80%8D%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%BF%E3%81%A6%E4%B8%8B%E3%81%95%E3%81%84%E3%80%82+becky&ie=UTF-8&oe=)をしても明確な回答が得られるわけではなく、自分でトラブルシュートをして解決した内容を共有する。

#前提知識
* Becky! Internet Mailがどんなツールかを知っていること。（メールツール）
* どんなWindows OSを使っているか把握していること。
* HDDまたはSSDがどんなフォーマット形式になっているかを把握していること。（FAT系かNTFSか）
* Becky! Internet Mailはフォルダ内にメールの内容が格納されていることを知っていること。

#メールの移行
メールの移行は基本的にメールが入っているフォルダごとコピーまたは移動して移行する。今回は移行元→移行先へファイルのコピーで移動。一般的なファイルのコピーの仕方は省略。

Becky!の最新バージョンをインストールして移行先のフォルダを指定して実行すると・・・・・あれ？エラーだ。
![becky-error.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/e6a2b125-9eb8-d536-4400-f1da28760936.jpeg)

#どうやって直したのか？
Becky!のBBSやその他検索エンジンで探すといくつか対処法が出てくる。

1. ファイルメニューから「フォルダ」→「修復」
2. スキャンディスクをかける
3. 読み取り専用属性を外す
4. フォルダの数を減らす[^減らす]

いずれも解決できなかった。ではどうやったのか。

1. Becky!を「管理者として実行」で実行する。（これは一時的）
![administrator.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/cc1caea2-19a7-1865-45e3-1e571693a72b.jpeg)

2. Becky!の格納フォルダに対して自分自身のアクセス権（フルコントール権限）をつける。[^権限設定]

1.で実行できたのがわかった[^admin]ので、2.を対応してやっとまともに動くようになった。

#想定されるエラーの原因
1. Becky!のメールを格納しているフォルダに対して読み書きする権限がなかった。
2. exFAT環境からNTFS環境へ移行したため、自分のユーザに対して書き込み権限がなかった。（Domain AdminsにいてもNG）（1.に関連）
3. UAC設定が緩い（脆弱な）権限でない。

#終わりに
今回の自分の環境を書いてませんでした。

|状態|環境|
|:-:|:-:|
|移行前|Windows Server 2008 R2,exFAT|
|移行後|Winsows Server 2012 R2,NTFS|


[^減らす]: 移行前のPCで動かしてたのに移行後で動かないってことは基本ないはず。
[^admin]: 管理者で実行をしないとエラーは継続した。
[^権限設定]: エクスプローラーを付けて権限を付けてください。
Minecraft Skript 超入門編 Part.1 プレイヤーをテレポートする 

# 超入門編を書く理由
私が運営しているDiscordサーバーに簡単な質問をする人が居ました。はい、それが書く理由です。まぁ、あるあるなのが大きなSkriptコミュニティに参加して初歩的なことを聞くと「ggrks」って言われることが多いんですよね（そこまでひどい事は言われない）。そして辞めちゃう人が居るんで思いつき次第超入門編をかいていきます。

# コマンド実行でプレイヤーをテレポート
```vb:main.sk
command /main <number> <number> <number> <text>:
    trigger:
        teleport player to location at arg-1, arg-2, arg-3 of the world arg-4
```
`/main 1 1 1 world`とコマンドを実行すると実行者をworldという名前のワールドのX座標1、Y座標1、z座標1にテレポートします。

#コマンド実行で指定したプレイヤーをテレポート
```vb:main.sk
command /main <number> <number> <number> <text> <player>:
    trigger:
        teleport arg-5 to location at arg-1, arg-2, arg-3 of the world arg-4
```
引数5を追加してその方を`player`にしました。

次はまだだよ

前は[コチラ](https://qiita.com/meoto2408/items/fe236ca64ea1d970fd5c)
Visual Studio Codeの拡張機能Remote Development 設定テンプレート

# はじめに
まずVisual Studio Codeの拡張機能であるRemote Developmentをインストールします。
WindowsもMacも同じ設定になります。

# configファイルの設定
以下のように設定します。

```
Host hostname
   HostName IP_address
   User user_name
   IdentityFile ~/.ssh/key.pem
   StrictHostKeyChecking no
   UserKnownHostsFile /dev/null
```
- Host　ホスト（サーバー）のニックネーム
- User SSH接続するホスト（サーバー）のユーザー名
- IdentityFile ホスト（サーバー）の秘密鍵のパス
- StrictHostKeyChecking　SSHで信用できるホスト（サーバー）として登録されていない場合に表示される警告をどうするか。
  `no`の場合は、無条件にそのサーバに接続する。
- UserKnownHostsFile known_hostsファイルのディレクトリ。`/dev/null`の場合は、known_hostsに影響を与えない。
ABC127 A,B,C 解説（python)

## A問題
https://atcoder.jp/contests/abc127/tasks/abc127_a

``` python
a,b = map(int,input().split())
if 13 <= a:
    print(b)
elif 6 <= a <= 12:
    print(b//2)
else:
    print(0)
```
if文にて年齢ゾーンを判別、金額を出力する。

## B問題
https://atcoder.jp/contests/abc127/tasks/abc127_b

``` python
r,d,x = map(int,input().split())
for i in range(10):
    print(r*x-d)
    x = r*x-d
```
漸化式（前の計算結果を次の計算結果に当てはめる）問題

## C問題

https://atcoder.jp/contests/abc127/tasks/abc127_c

``` python
n,m = map(int,input().split())
l = [0]*m
r = [0]*m
for i in range(m):
    l[i],r[i] = map(int,input().split())
if min(r)-max(l) < 0:
    print(0)
else:
    print(min(r)-max(l)+1)
```
全てにおいて重なっている区間と言うことで
もっとも大きいlと最も小さいrの間のキーが該当する。
[自分用] PostgreSQLコマンド

初心者です。
自分の開発環境用にPostgreSQLコマンドをまとめました。
使うコマンドが増えたら備忘録として随時更新します。

####DBの起動
```
sudo service postgresql start

```

####DBの再起動
```
sudo service postgresql restart
```

####DBに入る
```
psql -U <USER_NAME> <DB_NAME>
```

####DB一覧の表示
```
psql -l
#もしくは
\l
```

####DB切り替え
```
\c <DB_NAME>
```

####テーブル一覧
```
\dt
```

####テーブル作成
```
-- 人間テーブル
create table human_table (
    -- index
    id serial not null primary key,

    -- 姓 文字列型
    first_name varchar(25),

    -- 名 文字列型
    last_name varchar(25),

    -- 年齢 数値型
    age intger,

    -- 作成日時 タイムスタンプ
    create_at timestamp,

    -- 更新日時 タイムスタンプ
    update_at timestamp
);
```
anacondaがcudnnを認識しない場合

# anacondaがcudnnを認識しない場合

前提
----------

cudnn もCUDA入れてtensorflow = 2.1 をインストールして以下のコードを実行してGPUを認識してる確認した。


    from tensorflow.python.client import device_lib
    device_lib.list_local_devices()


結果

CPUしか認識していない。これは困った



調査
----------

conda list を実行して作った環境の中にcudnnが存在するか確認する。

今回私の環境ではcudnnの欄が存在しなかった。


解決策
----------

conda install tensorflow-gpu をインストールする。

tensorflow = 2.1 をインストールしたら同時に対応するものだと思っていたがtensorflow-gpu を入れたら自動的にcudnnを認識してくれるようになった。
Azure Static WebApps の CI-CD で ESLint の警告を警告のままにする

#ES Lint の警告で Buildエラー

![2020-09-08 222722.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439179/9963fea5-aa54-75d1-a7d7-f3814b02eb22.png)

自動で作ってくれるのはすごいうれしいけど、開発途中のものだと警告（未使用変数など含め）でちゃうので、エラーだと困るし、Lint を外す選択肢はない

#env:CI:falseの追加
![2020-09-08 223035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439179/1f949a47-9b06-f4c3-c5ab-63d8307329c0.png)
sympyで「薄肉円筒(Thin cylinder)」をやってみた。技術士機械令和元年度問Ⅲ-10

技術士第一次試験－令和元年度機械部門Ⅲ-10

https://www.engineer.or.jp/c_topics/006/attached/attach_6834_3.pdf#page=7

＜　公式ホームページ

https://www.engineer.or.jp/c_categories/index02021.html

（参考）技術士第一次試験－令和元年度機械部門Ⅲ-10解答例

https://pe-mech-iot.com/gijutsushi-test/first-r1-3-10

入力														
```python
from sympy import *
var('σt σz d t p')
s = solve(Eq(p*d, 2*t*σt), σt)
print("σt=",s)
print("σt=",Float(s[0].subs({d:370,t:2.5,p:3.0}),4))

var('σz π t r p')
s = solve(Eq(π*(d/2)**2*p, σz*π*d*t), σz)
print("σz=",s)
print("σz=",Float(s[0].subs({d:370,t:2.5,p:3.0}),4))
```
出力

```
σt= [d*p/(2*t)]
σt= 222.0
σz= [d*p/(4*t)]
σz= 111.0
```
超初心者のReact(create-react-app)基礎学習覚え書き①

##Reactの最大の利点はコンポーネントの使いまわしが可能なこと！！

基礎学習をしていて思ったのは編集の際に修正点が少ない。
CSSのSass(Scss)で変数にしたような感じに近いものを感じる。
はっきり理解できとらんが、備忘録として

##create-react-app内のディレクトリー
１．**src**:コンポーネントを作るJSファイル
２．**public**:htmlファイルや設定ファイル
３．**build**:本番環境用のファイル
※他のディレクトリ(node_modulesなど)は割愛

##実行コマンド
**npm run build**
srcとpublic内のファイルをバンドル(まとめて)buildディレクトリに出力

**npm start**
ローカルサーバーを起動してReactアプリを確認できる

**npm run eject**
babelやwebpackの設定を変更したい時に使用

##Atomicデザイン
※これは余談
パーツコンポーネント単位で定義していくUIデザイン手法で、端的にはパーツの最小単位からデザインしていくこと

##用語
**state**
・コンポーネントの"状態"を指す。Reactのコンポーネント内だけで使うものを「ローカルステート」と呼ぶ
※Reduxでは「グローバルステート」
・コンポーネント内で管理する変数
・propsを使用して親→子コンポーネントに渡せる

**props**
コンポーネント間でデータを受け渡すためのオブジェクト

##コンポーネントの種類
###Class Component


```ClassComponent.jsx
import React from 'react';

class Hoge extends Rect.component {
    construtor(props) {
        super(props);
    }
    render() {
        return(
            <div>
                <h2>{this.props.hoge}</h2>
            </div>
        );
    }
}
```

**クラスによって定義されたコンポーネント(見た目：複雑-記述量は増える)**
(最近のReactではあまり使わないように記述する流れが多いらしい)
・関数ではないのでクラスとして宣言する
・React.Componentってやつを継承する
・stateってやつとライフサイクルをもつ
・propsってやつにはthisってやつが必要
・JSXはrenderメソッド内でreturnする

###Functional Component

```FunctionalComponent.jsx
import React from 'react';

const Hoge = (props) => {
    return (
        <div>
            <h2>{props.hoge}</h2>
        </div>
    );
};
```

**関数型で定義されたコンポーネント(見た目：シンプル-記述量は少ない)**
・JSX(HTMLっぽい書き方のやつ)をreturnする
・ES６のアロー関数で記述
・stateってやつを持たない(stateless)
・propsってやつを引数に受け取る

##React.Fragment
**JSX上でコンポーネントをラップする為だけに使われる**
コンソールで確認した時にhtml上で無駄に\<div>\</div>タグが多いときにつけるタグ
省略形として、ただの\<></>でも良い

##props
**Functional Componentでは**
propsを引数に受け取り、受け取った引数をprops.hogeというように呼び出せる
**Class Componentでは**
１．"constructor"で初期化しなければならない
２．{this.props.hoge}のように記述する必要がある

###propsで受け渡せるデータ型
１．{}内に記述　※文字列のみ{}なしでも良い
２．文字列、数値、真偽、配列、オブジェクト変数

```例文.
   title="HogeHoge"
   order={7}
   ispublished={true or false}
   builder={builderName}
```

##state
stateが必要なわけ
１．render内では**値変更は禁止**の為
２．setState()メソッドで値変更の管理をする為
３．レンダー内でのstate変更は再レンダー（無限ループ）のきっかけになる為
→だからsetStateを使いなさいよ

##stateの設定、取得、変更
###設定
・Classコンポーネントの使用が前提
・constructor()内で宣言
・オブジェクト型で記述

###取得
１．stateの取得は同一コンポーネント内で{this.state.hogeHoge}
で取得可能
２．子コンポーネントで参照したい場合はpropsとして渡す

###変更
１．関数にラップする
２．setState()内に記述されたstateのみを変更する為、他のstateに変更を与える心配はない

```state例文.jsx
class Blog extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isPublished: false
    }
  }

  //公開状態の反転
  togglePublished = () => {
    this.setState({
      isPublished: !this.state.isPublished
    })
  };

  render() {
    return (
      <>
        <Article title={"React基礎"} isPublished={this.state.isPublished} toggle={() => this.togglePublished()}/>
      </>
    )
  }
}

export default Hoge
```

続きは②
Azure Static WebApps に GitHub の Organizations リポジトリをデプロイ

# 2020/09現在
Azure のポータルサイト上では、GitHubの個人アカウント上のリポジトリしか選択できないので、Organizations リポジトリをデプロイするためには Visual Studio Code から作成します



![2020-09-08 221255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439179/a5aa05df-9baf-1979-566e-ce202c939450.png)

Organizations リポジトリ　が選択できない

# VS Code　の拡張機能を二つインストール

+ Azure Account
    + これで、自分のAzureのアカウントとVS Code を 紐付ける
    + ![2020-09-08 221723.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439179/7a928c8a-9eb9-6d5e-23e8-a2d7251ee0a4.png)
    + F1で Azure : Sign In 

+ Azure Static WebApps(Preview)
    + 次にこれで、今開いている Organizations リポジトリ から Static WebApps を作成
    + ![2020-09-08 221835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439179/5ba08294-09f3-2c1a-ec29-a42c2ba0b802.png)
    + 使い方はそのまま↑に書いてます



多分、そのうち対応してくれると思うから、それまでのメモ
勉強日誌3日目

今日のBGMもポポロクロイス。
ハマるとしばらく同じのハマるんですよね
今日もヘルプデスク頑張ってきました。
土日も仕事の勉強したので少しはスムーズに。
仕事ができない自分が許せないので基本的に帰って覚えるまで復習する。
それが終わってから自分の勉強へのルーティン。
残業多いので平日の自分の勉強以外の自由時間は1時間もないですね。

10代で頑張らなかった者は20代で頑張らないといけなくなる
20代で頑張らなかった者は30代で頑張らないといけなくなる
30代で頑張らなかった者は一生頑張らないといけなくなる



X11のインストールと設定　正答率　53％


xhost +
Xサーバーに対して、全てのアクセスの許可

xhost + サイト
Xサーバーに対して、サイトからのアクセスを許可するコマンド。


xhost -
Xサーバーに対して、許可リストにあるホストのみ接続を許可するコマンド。

xhsot - サイト
Xサーバーに対して、サイトからのアクセスを拒否するコマンド。

Wayland
コンポジタと呼ばれるウィンドウマネージャが各アプリケーションのバッファの画像を合成し直接カーネルに描画を要求する　X　Window Systemに代わる新しい仕組み。

Screen
MonitorセクションとDeviceセクションの組み合わせ、色の深さの設定。

.xsession-errors
X Windows Systemのエラーが出力されるファイル

xauth
Xサーバーへの接続に使用される資格情報の表示、クライアント認証ファイルを編集するコマンド

デスクトップ　正答率　62％

startx
↓
xinit
↓
~/.xinitrc
↓
/etc/X11/xinit/xinitrc
ランレベル３から　X Windo Systemを起動するスクリプト

/etc/inittab
Linux起動時のデフォルトランレベルを指定するファイル

/etc/X11/xdm/xdm-config
ディスプレイマネージャ　XDM　の設定ファイル

XDM
X.org標準のディスプレイマネージャ

XDMCP
ネットワーク上にあるリモートホストにグラフィカルログインする際に使用されるプロトコル

アクセシビリティ　100％