OmniAICreator/Qiita-1.07M huggingface dataset:
React Bootstrapで右に出る余白なんやねん

ご無沙汰してます、おおのんです。
今日はBootstrapに関すること。（あんまりReact関係ない）

# 右に余白がいてはる

とある日、Bootstrapを使って画面を作っていました。
レスポンシブ対応でスマホ画面サイズで見てみると、右に余白が！！！

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207237/2539860b-8bb1-a687-f1ed-72c44f7f4da3.png)

どこが悪さしてるのか見てみると・・・

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207237/bfca2a54-ca23-9935-bf2f-8052ccaa34bf.png)

ここだった。

本来指定した領域をはみ出して表示しちゃってますので、overflow: hiddenしてみる。

```javascript:index.js
..省略..
  return (
    <div className="overflow-hidden">
      <Carousel />
      <Row className="justify-content-center" md={10}>
..省略..
```

すると・・・！

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207237/d7d22f43-8834-3d18-8867-8bf316b1fb9b.png)

余白を消し去ることに成功しました。
【Laravel】クエリビルダした結果のreturnを消してddしてた人

# なんのこっちゃ

たとえば

```php
public function search($name)
{
  return DB::table('users')->where('name', $name)->get();
}
```

これの取得結果を確認したいときに `dd()` を使いたい。
――で、一旦 `return` を消してこんなふうに書いて検証していた。

```php
public function search($name)
{
  $test = DB::table('users')->where('name', $name)->get();
  dd($test);
}
```

他にもやり方はあると思うが。

## もっと簡単にできる

一番後ろに `->dd()` を付けるだけでできる。知らなかった。

```php
public function search($name)
{
  return DB::table('users')->where('name', $name)->get()->dd();
}
```

Laravel公式マニュアル『クエリビルダ』の『デバッグ』に書かれていた（一番下）。

**Laravel 6.x データベース：クエリビルダ**
<https://readouble.com/laravel/6.x/ja/queries.html>

[マニュアルには書かれていなかったけど](https://readouble.com/laravel/5.5/ja/queries.html)バージョン5.5でもできた（[5.8のマニュアル](https://readouble.com/laravel/5.8/ja/queries.html)から追記されるようになったぽい）。
UINavigationBarのLargeTitleと同じ振る舞いのfontを取得して利用する

素直に同じものを取得して利用しましょう。

```swift
let navigationAppearance = UINavigationBarAppearance()
navigationAppearance.configureWithDefaultBackground()
let font = navigationAppearance.largeTitleTextAttributes[.font] as? UIFont
```

# 注意
この記事の内容は一見うまくいきそうに見えますが、アクセシビリティ設定でサイズをXXXLargeとかにしていくと、途中でNavigationBarのlargeTitleとサイズが異なっていきます。

https://stackoverflow.com/questions/47577717/how-to-change-dynamic-type-to-use-different-text-styles
vendor/bin/phpunit　実行時エラー「Your XML configuration validates against a deprecated schema」の対処法　

Laravelでテストコードを作成しようとした際にエラーが起きたので解決策を自分用のメモとしてまとめようと思います。

テストコードを記述しターミナルで実行しようと思い

```
vendor/bin/phpunit
```
を打つと以下のエラーが発生しました。


```
Warning:    Your XML configuration validates against a deprecated schema.
Suggestion:  Migrate your XML configuration using "--migrate-configuration"!
```


このエラーの原因は、phpunit.xmlにテスト用のデータベースを作成しようとし、

```Laravel:phpunit.xml
<php>
 <server name="DB_DATABASE" value="database/database_test.sqlite"/>
<php>
```


を追記したため上記のエラーがおきていたようです。
なので、

```
vendor/bin/phpunit --migrate-configuration
```


をターミナル上で打つとphpunit.xml.bakという新しいファイルが作成され、今回のエラーを無事解決することができました。
[TailwindCSS] Error: PostCSS plugin tailwindcss requires PostCSS 8.

## エラー発生状況
Gatsbyで制作を進めていたサイトにTailwindを導入しようとした（21年1月時点）

```
PostCSS plugin postcss-nested requires PostCSS 8.
Migration guide for end-users:
https://github.com/postcss/postcss/wiki/PostCSS-8-for-end-users
```

## 対処
一度アンインストールして、互換性ビルドを再インストール

```
npm uninstall tailwindcss postcss autoprefixer
npm install tailwindcss@npm:@tailwindcss/postcss7-compat @tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9
```

## 原因
PostCSS8対応が追いついていないという感じでしょうか。
サポートされたら`latest`使ってくれとのこと。

## 参照
[PostCSS 7 compatibility build
](https://tailwindcss.com/docs/installation#post-css-7-compatibility-build)[PostCSS plugin postcss-nested requires PostCSS 8 #2799
](https://github.com/tailwindlabs/tailwindcss/issues/2799)
【React Native】 SVGを表示して動的に色を変える方法【Expoなし】

## エラー出まくったり情報が古いのばっかりだ
React Nativeでsvgを使う方法が色々散見していてエラー出たりしてる人多いと思いますが、個人的なやり方を記載します。  
あと、今はダークモード対応とかで動的に色を変更したい時もあると思うので、それも記載します。  

環境は下記

```
react-native-cli: 2.0.1
react-native: 0.63.4
```


## とりあえず react-native-svg-transformer を使うまで

react-native-svg-uriを使うという記事とかも見かけましたが、私は「react-native-svg-transformer」を使い続けています。  
使い方は、git見れば分かるんですが意外と公式見ずに英語分からない(?)人もいるので、記載します。
（というか、react-native-svg-uriまともに動いたことあったっけなぁ…）


```
yarn add react-native-svg
npx pod-install
yarn add --dev react-native-svg-transformer
```

App.jsのあるルートにmetro.config.jsを以下に書き換え

```
const { getDefaultConfig } = require("metro-config");

module.exports = (async () => {
  const {
    resolver: { sourceExts, assetExts }
  } = await getDefaultConfig();
  return {
    transformer: {
      babelTransformerPath: require.resolve("react-native-svg-transformer")
    },
    resolver: {
      assetExts: assetExts.filter(ext => ext !== "svg"),
      sourceExts: [...sourceExts, "svg"]
    }
  };
})();
```

### とりあえず表示する時は？
svgをimportしてJSX上でサイズ指定してあげれば使えるはず。

```
import Logo from '../img/logo.svg'

/*~略~*/

<Logo width={100} height={100} />
```

## 動的に色を変更する場合 -その1 (単色の場合)
該当の、svgのfillの部分を「currentColor」に変える。(HTMLでSVGの色を変更する方法と同じですね。)  

```
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <rect width="300" height="100" fill="#f00"/>
</svg>
```

これを下記にする

```
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <rect width="300" height="100" fill="currentColor"/>
</svg>
```

で、JSX上でstyleで設定する

```
<Logo width={100} height={100} style={{color:'#ccc'}}  />
```

## 動的に色を変更する場合 -その2 (複数の色、ただし5色まで)
これもreact-native-svg-transformerの公式に書いてあるけど[SVGR](https://github.com/gregberge/svgr)を使う。

1. App.jsのあるルートに.svgrrcのファイルを作る(隠しファイル面倒だねー)
2. SVGファイルのfillの値を「#000,#f00,#ff0,#ff1,#f11」の５色のどれかに変更する。
2. .svgrrcを以下のように書く
 
```
{
  "replaceAttrValues": {
    "#000": "{props.hoge}",
    "#00f": "{props.foo}",
    "#ff0": "{props.bar}",
  }
}
```

3. JSXで

```
<Logo width="100" height="100" hoge={"#f00"} />
```

### SVGRでの問題点
なんか該当svgのfillが#000じゃないと動かないとか、動かないとかあった…
結論、svgの色の置き換えはrgbの3桁のみで、置き換え可能な文字列は

|RGB|
|---|
|#000|
|#f00|
|#ff0|
|#ff1|
|#f11|

この5つぐらいしかできなかった、websafeカラーの0,3,6,9,cの組み合わせは殆どダメだった。(#f0fがダメとか、#0ffがダメとか納得いかねー)
まぁ、色数が多いものは動的に変えるなちゅー話だろうなぁ…
以下はダメだったもの

```
#fff
#00f
#ccc
#222-999
#11f
#1f1
#1ff
#f01
#f1f
#f12
#0ff
#f01
#ff0
#ff1
#f1f
#3ff
#321
#f03
#90f
#100
#101
```

まぁ、５色以上変える場合は、そもそも別のSVG作れちゅー話なんだろうけど、SVGRの仕様的には6桁のRGB値でも変更できるはずだし、正規表現まで対応できているはずなのになぁ…
VSCode と Docker で LaTeX 執筆環境の構築

# モチベーション
昔に比べればましになったものの、やっぱり LaTeX の環境構築は時間がかかる
→ Docker で構築すれば解決するのでは

# TL;DR

- **とりあえず環境構築したい人向け**
- ~~Docker イメージを作成 & DockerHub に公開~~ → 別記事
- VSCode + 拡張機能で LaTeX 執筆環境を構築

# 必要なもの

- Git + Github アカウント
- Docker (Desktop)
- VSCode

# インストール

- VSCode: https://code.visualstudio.com/
- Docker (Desktop): https://www.docker.com/get-started
- Git: https://git-scm.com/

Docker Desktop はインストール後、起動させる必要あり

# 作業フォルダの作成

特にこだわりがなければ [このテンプレート](https://github.com/nshun/vscode-latex-template) を使用（[既にフォルダがある場合](#既にある作業フォルダでビルドしたい)）

緑の `Use this template` ボタンを押す
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265627/1ec3032c-3fdf-aca4-f0c8-a5f020a7276e.png)

自分の Github アカウントにフォーク
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265627/fee853f3-c509-fe5f-0127-6dd4266f5cdd.png)

無事作成できたらローカルにクローンしてくる
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265627/f963b22b-6c8d-aefd-f4c7-c8faf4eb075b.png)

# (Mac向け) フォルダ共有の設定

`作業フォルダの作成` で作ったフォルダを Docker で共有するための設定が必要

Docker Desktop の設定を開いて、 `Resources -> FILE SHARING` からフォルダを追加する
追加したら `Apply & Restart` で設定を適用させる
 
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265627/08acfc3d-371b-58b4-7c1b-7e907a37db75.png)

# Docker サービスの起動

Windows や Mac だとバックグランドで Docker のサービスを起動させておく必要がある。
基本は Docker Desktop を起動させておけばOK

- Win → スタートメニューから `Docker Desktop` を起動
- Mac → Launchpad から `Docker Desktop` を起動

# 執筆！

VS Code を起動させ `⌘ + O` を押して作業フォルダを開く
`tex` フォルダ内の `sample.tex` を選択する

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265627/4bb54ddc-cc33-abfe-31b5-5d95bba07ce1.png)

右上の `▷` でビルドを開始。左下に進捗が表示される。
（最初はコンテナを pull してくるので時間がかかる）

無事ビルドできたら左側のツリーに `sample.pdf` が表示される
ビルドボタンのひとつ右のボタンがプレビューボタンなので押してプレビュータブを開く
![スクリーンショット 2021-01-21 16.28.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265627/d2a98437-231a-19d0-1d1e-8d979236042b.png)

Tips: プレビュータブで `⌘` キーを押しながらクリックすると、tex ファイルの該当箇所がハイライトされる

# カスタマイズ

作業フォルダの `.vscode/setting.json` を開くと、ビルド時の引数など編集できる

## ビルド設定
以下の引数を https://texwiki.texjp.org/?Latexmk を参考に変更

```json
    {
      "name": "latexmk",
      "command": "latexmk",
      "args": ["-gg", "-pdfdvi", "%DOC%"]
    }
```

## Docker コンテナの変更

以下の項目を変更
デフォルトのコンテナ → https://hub.docker.com/r/nshun/latex

```json
"latex-workshop.docker.image.latex": "nshun/latex"
```

## 自動ビルドの設定

以下の項目を変更
`onSave` にすると、ファイルを保存するたびにビルドされる

```json
"latex-workshop.latex.autoBuild.run": "never"
```

## 既にある作業フォルダでビルドしたい

1. [インストール](#インストール)を済ませる
2. `.vscode/settings.json` ファイルを作成
3. 中身を以下のようにする

```json
{
  "latex-workshop.latex.tools": [
    {
      "name": "latexmk",
      "command": "latexmk",
      "args": ["-gg", "-pdfdvi", "%DOC%"]
    }
  ],
  "latex-workshop.chktex.enabled": false,
  "latex-workshop.docker.enabled": true,
  "latex-workshop.docker.image.latex": "nshun/latex",
  "latex-workshop.latex.autoBuild.run": "never",
  "latex-workshop.latex.outDir": ".",
  "latex-workshop.synctex.afterBuild.enabled": true,
  "latex-workshop.view.pdf.viewer": "tab"
}

```
Ceph(Octopus)の構築(設定編 mon/mgr/osd)

##__はじめに__
この記事では、タイトルのとおり現時点(2021.01)で最新である__ceph(octopus)__の構築を目的としています。
また、自分で構築した手順の備忘録を兼ねているので、細かいところで間違いなどあるかもしれません。

基本的には公式のDOCUMENTATIONが必要なことを全て網羅しているので一読しておくことをお勧めします。
Linuxの知識もある程度必要になるので他サイトや書籍などで事前に基本は押さえておくとよいでしょう。

準備編等は関連記事を参照してください。

##__関連記事__
[Ceph(Octopus)の構築(準備編 ハードウェア)](https://qiita.com/iriya_v00v/items/651eff2955d5ad7eadf6)
[Ceph(Octopus)の構築(準備編 ソフトウェア)](https://qiita.com/iriya_v00v/items/e3268fe75423ba0304b3)
[Ceph(Octopus)の構築(設定編 共通)](https://qiita.com/iriya_v00v/items/d7d9e439cf4159acae2c)
[Ceph(Octopus)の構築(設定編 ブートストラップ)](https://qiita.com/iriya_v00v/items/d7bcf4dfa6324bacd91a)
Ceph(Octopus)の構築(設定編 mon/mgr/osd)　この記事
[Ceph(Octopus)の構築(設定編 cephFS/mds)](https://qiita.com/iriya_v00v/items/931838d6d56e568bd6d8)
[Ceph(Octopus)の構築(設定編 Crush Map)](https://qiita.com/iriya_v00v/items/2a263a7817434e8b91ed)

##__キーの配布__
cephクラスタに参加するためのキーと、sshを使ってrootアクセスするためのキーを各ノードへ配布しておきます。これは、ブートストラップを実行したceph-mon01から行います。
クラスタ用のキーは必須です。root用はsshを使って管理をすることを考えているのであればやっておいた方がよいでしょう。

```:cephクラスタ用
sshpass -p "rootのパスワード" ssh-copy-id -f -i /etc/ceph/ceph.pub -o "StrictHostKeyChecking no" ceph-mds01
```

```:root用
sshpass -p "rootのパスワード" ssh-copy-id -f -i ~/.ssh/id_rsa.pub -o "StrictHostKeyChecking no" ceph-mds01
```

上記コマンドはceph-mds01用の例です。他ノードも同様に行います。
なお、cephクラスタ用のキーはブートストラップを実行したタイミングで自動生成されています。root用は[Ceph(Octopus)の構築(設定編 ブートストラップ)](https://qiita.com/iriya_v00v/items/d7bcf4dfa6324bacd91a)で作成しているものです。

##__ノードの追加__
ノードはまずクラスタへ参加し、その後各役割のdaemonを動かします。クラスタへ参加させる作業はブートストラップを実行したmonノードから行います。

```
cephadm shell
　　ceph orch host add ceph-mds01
　　ceph orch host add ceph-osd01
　　ceph orch host add ceph-osd02
　　ceph orch host add ceph-osd03
　　ceph orch host add ceph-mon11
　　ceph orch host add ceph-mds11
　　・・・
```
##__各daemonの追加__
各daemonの追加もブートストラップを実行したmonノードから行います。
####mon

```
cephadm shell
　　ceph orch daemon add mon ceph-mon11
　　ceph orch daemon add mon ceph-mon21
```

####mgr

```
cephadm shell
　　ceph orch daemon add mgr ceph-mon11
　　ceph orch daemon add mgr ceph-mon21
```
####osd

```
cephadm shell
　　ceph orch daemon add osd ceph-osd01":/dev/sdb"
　　ceph orch daemon add osd ceph-osd02":/dev/sdb"
　　ceph orch daemon add osd ceph-osd03":/dev/sdb"
　　ceph orch daemon add osd ceph-mon01":/dev/sdb"
　　ceph orch daemon add osd ceph-mds01":/dev/sdb"
　　・・・
```


##__dashboardの確認__
ここまでくるとcephクラスタのステータスもHEALTH_OKとなっているはずです。
dashboardの各項目を確認して、意図したとおりの構成になっていることを確認しておきましょう。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033108/ed94b2d0-3bc8-5bc2-a290-fb959e6462fc.png)
cephクラスタのステータスは以下コマンドでも確認できます。

```
cephadm shell
　　ceph status
```


##__おわりに__
上記以外にmdsのdaemonが必要ですが、cephFSのボリュームを先に作成する必要があるので後の記事に書こうと思います。
以降はcephFSを使うための記事になるので、cephをオブジェクトデバイスやブロックデバイスとして使う場合は他のブログ等を参考にしてください。
余談ですが、octopusのdashboardのログイン画面は、蛸がかなり主張しているデザインですが私は好きです。
[Rails]DRYに書きたい(可読性、保守性)

[Rails]似たようなコードを1つにまとめたい(パーシャル)
https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-partials

[Rails]DRYなコードを書きたいが、一部分が違う場合
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-edit_form

[Rails]タイトルの可変要素をDRYする
https://railstutorial.jp/chapters/static_pages?version=5.1#sec-layouts_and_embedded_ruby
https://qiita.com/shumpeism/items/a0ad5930fa3bc0d24c70

[Rails]汎用性があるので異なるControllerでも定義したメソッドを使いたい
継承→application_controller.rb
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-micropost_access_control

[Rails]記法一覧
https://qiita.com/gakkie/items/3afcd505c786364aa5fa
https://blog.mothule.com/ruby/ruby-percent-syntax

[Ruby]記法一覧
https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.1#cha-rails_flavored_ruby

[Rails]キーワード引数とオプション引数の違い
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-users_index

Railsが暗黙的にやってくれること一覧
Railsは慣習に従って、アクションに対応するビューを暗黙的に呼び出します。例えば、showアクションの最後でshow.html.erbを呼び出す、といった具合です。

その他
[Rails]rails sがバックグラウンドにあり、ctrl+cで消せない場合
https://qiita.com/kanuu/items/fd6e33fca6ad6a90d059

[Rails]ユニーク制約とは？どんなメリットがある？

[Rails]シンボルを使うタイミング
https://uxmilk.jp/25934

[Rails]attr_accessor とは？
http://bryankawa.hatenablog.com/entry/2017/01/28/150537

非同期で通信がしたい→Ajax,JS
https://railstutorial.jp/chapters/following_users?version=5.1#sec-a_working_follow_button_with_ajax

http://railscasts.com/episodes/205-unobtrusive-javascript
[Rails]認可、認証、権限関連

[Rails]ログイン済みのユーザーだけにページを表示させたい
Controller
before_action :logged_in_user, only: [:edit, :update]
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-authorization

[Rails]自分だけを編集したい
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-requiring_the_right_user

[Rails]ユーザーがログインした後、ログイン直前に閲覧していたページヘとリダイレクトさせる機能
→ログインユーザー専用のページのURLにアクセスしたい→ログインする→さっき見てたログイン専用のページに行ける
フレンドリーフォワーディング request.url
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-friendly_forwarding
[Rails]一つ前のURLを返したい(リダイレクトしたい) request.referrer
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-destroying_microposts
[Rails]認可と認証の違い
https://qiita.com/kaysquare1231/items/c4e4736f2a924b03777b
Linux!Wine!!Python!!!Pyinstaller!!!!

#1.はじめに
ここに書いてある手順は、Pyinstallerによって推奨されていません。([こちら](https://pyinstaller.readthedocs.io/en/stable/index.html)を参照)
また、動作するかどうか、かなり微妙です。
出力されるファイルが正常でない可能性もあります。
それでもいいという方のみ先へお進みください。
また、すべてのこの記事の内容の実行についての責任はこの記事の読者側にあります。
環境がおかしくなったりしても、責任はとれません。
それでもいいという方のみ先へお進みください。

#2.前提
多分、wine_stableが入れば勝ちです。
バージョンは、6.0.0と、5.0.3で動きました。(環境に依存しそうですが。)
動作報告お待ちしてます。
Pythonは64bit and 32 bit 3.8.5はテスト済みです。
これも動作報告お待ちしてます。
また、ここでは、linux用バイナリについてではなくて、windowsのexeを生み出す方法を紹介しています。
念のため書いときます。
#3.wineインストール!
Ubuntuの方は[こちら](https://wiki.winehq.org/Ubuntu)
Debianは、[こちら](https://wiki.winehq.org/Debian)
をご覧の上、__Stable__をインストールしてください。
#4.Pythonインストール!
Pythonをインストールします。
まあ、使いたいバージョンを[ここ](https://www.python.org/downloads/windows/)から落としてきてください。installerですよ？exeですからね？
Windows版Pythonはバージョンが共存できるので、複数入れるのもありです。
インストール時の設定は、弄らずに、Recommandedで入れましたが、これは別になんでもいい気もします。
#5.PyInstallerインストール!
う〜ん...それにしてもこの記事てきと〜だな...
えっと、以下のようにして、Pyinstallerを突っ込みます。

```shell
wine py [-3-32とかのバージョン指定] -m pip install PyInstaller
```
これで入るでしょう。(超なげやり)
#6.いざ実行。
緊張の瞬間です...
とりあえず、なんでもいいのでやってみましょう。
念のため、テスト用コード置いときます。

```python:test.py
print("test")#適当の極み
```
まあ、実行してみましょう。

```shell
wine py [-3-64とかのバージョン指定] -m pyinstaller [ファイル名]
```
できたら赤飯を炊きましょう。
以上です。
Summernote 実装時に「閲覧できません Forbidden access」が出る問題

## 個人的に詰まったので備忘録
jsのライブラリであるsummernoteを入れて、記事作成＆表示機能を実装したときに本番環境側で以下のエラーが発生。

![495b72f12a555d11ec480c6fd299ac88.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527256/9c734c64-de5d-e3fb-92e5-5fdcf857c484.jpeg)

どうやらサーバー側でSiteGuardLiteが発動しているみたいなので、wafのログを確認

本番環境内から以下ファイルを参照
`waf_detect.log.***`

なんか出てました。

```
:WAF:RULE_SIG/PART_PARAM_VALUE|PART_REQBODY/***/sqlinj-97::replace(nL%2c+nlO):
```

SQLインジェクションが誤検出されて発動しているらしいですが、今回は全く関係がないのでこれをオフにしたい。

### .htaccess に以下を記述

```
<IfModule mod_siteguard.c>
     SiteGuard_User_ExcludeSig sqlinj-97 //該当シグネチャを除外する
</IfModule>
```

これで正常にページが表示されるようになりました。

**（注意）
あくまで私自身の環境でのエラーだったのでこの対応をしましたが、セキュリティに関わるところなので慎重に行って下さい。**

## 参考記事
- https://faq.zenlogic.jp/faqs/FAQ01792
- http://spot-web.jp/blog/2700/
[Rails]セキュリティ系

[Rails]ストロングパラメーター(Strong parameters)
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-revisiting_strong_parameters
[Rails]マスアサインメント
→リクエストのデータをそのままデータベースに保存すること(セキュリティ的に弱い)
https://thinkit.co.jp/story/2015/09/03/6389

[Rails]作業を元に戻したい！
rails destroy controller ~
https://railstutorial.jp/chapters/static_pages?version=5.1#sec-generated_static_pages

[Rails]アカウントの有効化
https://railstutorial.jp/chapters/account_activation?version=5.1#cha-account_activation

[Rails]SSL
ローカルのサーバーからネットワークに流れる前に、大事な情報を暗号化する技術
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-ssl_in_production

[Rails]CSRF対策[Controller]
protect_from_forgery with: :exception
https://qiita.com/tanaka7014/items/5b4e2204dc6bec83c90e

[Rails]プレースホルダー
https://wa3.i-3-i.info/word118.html

[Rails]パスワードをハッシュ化,暗号化して保存したい
https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-adding_a_secure_password
[Rails]DB,ActiveRecord系

[Rails]カラム名を変更したい
https://qiita.com/libertyu/items/93acd8733e34b1d0a63c

[Rails]シードを作る(サンプルユーザーをDBにたくさん作りたい)
https://qiita.com/takehanKosuke/items/79a66751fe95010ea5ee
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-sample_users
https://teratail.com/questions/7371

[Rails]マイグレーションファイルを削除する
https://qiita.com/tanaka-t/items/cd6aa0526725e88f5024

[Rails]ActiveRecordのSQLの可読性をあげたい →Scope
https://qiita.com/ngron/items/14a39ce62c9d30bf3ac3

[Rails]複数テーブルにまたがる検索をしたい
https://qiita.com/leon-joel/items/f26556c9e56833983856
https://qiita.com/makitokezuka/items/f13b2e7bad77b5594911
[Rails]複数テーブルにまたがる検索をするときにカラムが被る時

[Rails]中間テーブルの命名規則
https://qiita.com/tkawa/items/dc3e313021f32fd91ca6
https://ja.stackoverflow.com/questions/12618/rails%E3%81%AE%E4%B8%AD%E9%96%93%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

[Rails]多対多
https://qiita.com/Kohei_Kishimoto0214/items/cb9a3d3da57708fb52c9
[Rails]多対多のテーブルから検索や更新などしたい
https://qiita.com/Kohei_Kishimoto0214/items/cb9a3d3da57708fb52c9
https://qiita.com/ryutaro9595/items/e021eb789914cead4677

[Rails]中間テーブルのデータ保存
http://once-and-only.com/programing/ruby/%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%85%88%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E4%BF%9D%E5%AD%98/

[SQL]データモデリング　ER図
https://www.atmarkit.co.jp/ait/articles/0604/06/news110.html
https://jp.drinet.co.jp/blog/datamanagement/data_modeling_3minutes

[Rails]インデックス
インデックスを作成することでテーブルとは別に検索用に最適化された状態で必要なデータだけがテーブルとは別に保存される。検索用に並び替えをしている上、インデックスを貼ったカラムだけを検索できるので高速検索が可能。デメリットは、テーブルとは別に検索用のテーブルが保存される関係上データの追加に時間がかかること。なぜなら、データを追加するときに2つのテーブルを追加しなければならないから。
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-a_micropost_model
https://www.dbonline.jp/sqlite/index/index1.html
https://ja.wikipedia.org/wiki/%E7%B4%A2%E5%BC%95_%28%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%29

[Rails]親を削除した時に子も削除できることをしたい
dependent: :destroy
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-dependent_destroy

[Rails]リレーションの時の別テーブルのデータの呼び出し方
→micropost.userなど
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-destroying_microposts

[Rails]あるユーザーが同じユーザーを2回以上フォローすることを防ぐこと- 複合キーインデックス
add_index :relationships, [:follower_id, :followed_id], unique: true
の場合だと、follower_idとfollowed_idの組み合わせが必ずユニークであることを保証する仕組み
https://railstutorial.jp/chapters/following_users?version=5.1#sec-a_problem_with_the_data_model

[SQL]SQLの練習したい
https://paiza.hatenablog.com/entry/2019/12/22/SQL%E3%81%AE%E7%B7%B4%E7%BF%92%E3%81%AB%E6%9C%80%E9%81%A9%EF%BC%81%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E4%B8%8A%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%82%8B%E5%88%9D%E5%BF%83%E8%80%85%E5%90%91

[Rails]seedにSecureramdomを導入したい
https://qiita.com/takuyanin/items/5334908b22156ec7290f
git fsck でcommitせずに消えたファイルを救出する

## 概要
`git fsck`は，「データベース内のオブジェクトの接続性と有効性を検証する」([参考](https://git-scm.com/docs/git-fsck))

データベースに存在するが，git add したのにgit resetしてしまったなどで消えた宙ぶらりんのオブジェクトをとりだせる．


## 自分の状況

```
git: Version 2.30.0 
```


```
$ git add .
$ git reset --hard HEAD^
```
手が滑ってgit addしたのにgit resetしてしまった．
だからコミットできない．

```
$ git commit -m "hoge"
On branch master
Your branch is up to date with 'gitlab/master'.

nothing to commit, working tree clean
```
commitしていないからreflog使った救出もできない．

```
$ git reflog
5b916dc (HEAD -> master, gitlab/master) HEAD@{0}: reset: moving to HEAD^
d060d9a HEAD@{1}: commit: hoge
.
.
.
```

## 解決法
git fsckで消えたオブジェクトを見てみる．
--lost-foundのオプションを加えると，
「ぶら下がっているオブジェクトを .git/lost-found/commit/ または .git/lost-found/other/ に書き出します．オブジェクトが blob の場合は、オブジェクト名ではなく中身がファイルに書き込まれます．」([参考](https://git-scm.com/docs/git-fsck))
なるほど．

```
$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
Checking objects: 100% (77/77), done.
dangling commit 6a18de2e9c91d3357d7471b21a64bf7527d1e66a
dangling commit d060d9a81fe3d99bed3c519b4b41344849c40879
dangling blob 367187e5464b8e6e6faf7d21a702f0db31e6ff75
dangling commit 82997ff88a9542f69adf508066ae54e040478b28
dangling commit bbb9a5b0c0c3bd925fb160f348fa83a1a9dc68b8
dangling commit 555ec3c89716f7ab13f36443767bb4b0bce33bf0
dangling commit 6f0af95012d05fbc38bb8ddb7338bd8b0b240c48
dangling blob b33e342cdfdd49475a8ed114ff965373a851279f
dangling blob c9e63be87b5ff5c776db55708fae89e74ba613ed
dangling blob db425d36d2d0941731250c49e949c76623c3d0e8
dangling blob 6f531c6fbecb40ef9f8035e137075523f240c016
dangling blob f6cb583b7649358e7b23347eb037c72275590de8
```

中身を見るために一番下のハッシュを次のようにcatしてみる．

```
$ git cat-file -p f6cb583b7649358e7b23347eb037c72275590de8
```
出力された内容は，たしかに直前に編集して消えたものだった．
git fsckで出力されるdanglingにおいて，新しい宙ぶらりんのオブジェクト(ハッシュ)は一番下に追加されるようだ．
--lost-foundで書き込まれたファイルを探す．

```
$ ls .git/lost-found/other/
367187e5464b8e6e6faf7d21a702f0db31e6ff75  b33e342cdfdd49475a8ed114ff965373a851279f  db425d36d2d0941731250c49e949c76623c3d0e8
6f531c6fbecb40ef9f8035e137075523f240c016  c9e63be87b5ff5c776db55708fae89e74ba613ed  f6cb583b7649358e7b23347eb037c72275590de8
```
f6cb583b7649358e7b23347eb037c72275590de8があった．なので，

```
$vi .git/lost-found/other/f6cb583b7649358e7b23347eb037c72275590de8
```
で消えたファイルを開いてコピぺして戻した．
【Spring】@ModelAttributeの整理

**※追記していく**

・@ModelAttribute アノテーションは、
　Controllerクラスのメソッド、または引数に付与して使用する。
　ハンドラメソッドが動く前にアノテーションが検出され、Springフレームワークで処理される。

・キー名は、@ModelAttributeで指定するが、Modelを未指定の場合は戻り値のクラス名から自動生成される。

```ruby:例(未指定の場合)

 public void Test (@ModelAtttribute TestForm){
}
```
上記の属性名はtestFormとなる。
またModelAttributeは省略可能で、省略した場合(Modelを設定しない場合)も同様に、
Spring MVCがクラス名の先頭を小文字にした名前を、モデル名とみなして引数に渡す。


参考サイト：
・https://kazkn.com/post/2017/use-model-attribute/
[Rails]ルーティング系

[Rails]localhost3000/の状態でトップページを表示したい(3)
→root
https://railstutorial.jp/chapters/static_pages?version=5.1#sec-setting_the_root_route

[Rails]RESTfulなルーティング
https://railstutorial.jp/chapters/sign_up?version=5.1#table-RESTful_users
https://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2

[Rails]resourceを使ったRESTfulなルーティングにRESTful以外の新しいアクションを追加したい。
https://qiita.com/ebihara99999/items/37afb1486442e7c16a8a
https://railstutorial.jp/chapters/following_users?version=5.1#sec-stats_and_a_follow_form
[Rails]link_toを使ってパラメーターを複数送る方法
https://poyopoyo0.hatenablog.com/entry/2016/02/29/100431

[Rails]resourseでネストをする際に、ネスト元もonly:createなどで制限したい
https://railsguides.jp/routing.html#rails%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B

[Rails]id（並び順整数）をuuid（乱数）に変更したい(localhost:3000/user/ae6cdc44-68cd-4c76-b972-26d8a39b4bbb)みたいにしたい
https://qiita.com/params_bird/items/9e162fdcd9bdc2e42ccd

[Rails]ユーザー名(アカウント名)の初期設定を乱数にしたい。
https://teratail.com/questions/285445
username = SecureRandom.urlsafe_base64(10)

[Rails]パラメーターを追加で送信したい
hidden_tag
[Rails]Controller系

[Rails]フォームの入力に失敗した時の実装
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-unsuccessful_edits

[Rails]Railsのredirect_toにおける_pathと_urlの使い分け(同じようなもの)
https://teratail.com/questions/204077

[Rails]部分テンプレートを呼び出したい
render ‘ファイル名’
https://pikawaka.com/rails/render

[Rails]Destroyアクションとセキュリティ
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-the_destroy_action

[Rails]newとbuildの違い
newメソッドとbuildメソッドはともにインスタンスを生成するが、
buildは自動的にuser_idをセットしてインスタンスを生成することができる。
https://qiita.com/Kaisyou/items/8876f39e12631f4e5154

[Rails]CRUD(Create)
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-signup_form

[Rails]CRUD(Read)
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-showing_all_users

[Rails]CRUD(Destroy)
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-the_destroy_action

[Rails]なぜ、HTMLフォームにcreateやdestroyのmethodが記載されてないのに、createされたりdestroyされるの？
→
①URLリクエストをroutesに送る。
②そこで該当コントローラーの該当アクションに指示が行き、そこで事前に自らが記載したcreateやdestroyの処理を行う。
自ら描く事もあれば、resourseで自動で書いてくれる人もいる。
[Rails]View系

[Rails]ページネーション(ページ分割)
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-pagination

[Rails]編集フォーム
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-edit_form

[Rails]ラクに編集フォームを作りたい
https://qiita.com/Toshimatu/items/dbf4da62ab9951b67aa9

[Rails]一覧表示させたい
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-showing_all_users

[Rails]部分テンプレートを呼び出したい
render ‘ファイル名’
https://pikawaka.com/rails/render

[Rails]renderとredirect_toの違い
https://qiita.com/january108/items/54143581ab1f03deefa1

[Rails]マイクロポストの描画
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-rendering_microposts

[Rails]ボタンでアイコンをクリックしてページ遷移したい
https://github.com/neneti/Elily/blob/master/app/views/layouts/_header.html.slim
https://elily.herokuapp.com/
[Rails]Model系

[Rails]ActiveRecordはデータベースはデータベースのレベルでは一意性を保証していない(validateで一意性を保証したとしても)
→indexをつければ解決
https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-uniqueness_validation

[Rails]データベースに保存する前に保存する内容を検証したい - バリデーション
https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-user_validations

[Rails]文字列などをランダムに出したい。乱数
https://docs.ruby-lang.org/ja/latest/class/SecureRandom.html
Slackの今日のチャンネル内容をLINEに送信する(Google Cloud Functions)

表題の内容を試す機会があったので、作業内容とサンプルコードを紹介したい思います。

###環境
- Slack: フリープランでOK
- LINE
- GCP Coud Functions
- 実行環境はNode.js

*各サービスのドキュメントはすでにネットに豊富にあるので、今回は細かい設定方法の解説を省きます

###サービス設定
####Slack
#####slack api 設定
 https://api.slack.com/apps で
``Create New App`` から新規appを作成。その後以下を設定。

- Features -> OAuth & Permissions でBot Token Scopesに以下の権限を付与
``channels:history``
``chat:write``
``commands``
``groups:history``
``im:history``
``mpim:history``
``users:read``

- Features -> OAuth & Permissions -> OAuth Tokens & Redirect URLs -> ``Install to Workspace``ボタンをクリック
Bot User OAuth Access Token [xoxb-**...] を取得。後ほど利用する

- Settings -> Basic Information -> Signing Secretを``show``で一時的に表示してメモ。後ほど利用する

#####情報を取得したいチャンネルのidを取得する
[こちら](https://qiita.com/YumaInaura/items/0c4f4adb33eb21032c08)の記事が参考になると思います。

#####対象チャンネルに上記で作成したappを追加
slackの チャンネル詳細->その他 にあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935211/7c509975-a053-7dfc-7b55-76a9701d09a2.png)


####LINE
LINE Notifyを使用します。トークンを発行し、送信先トークルームにLINE notifyを招待します。
[こちら](https://qiita.com/iitenkida7/items/576a8226ba6584864d95)の記事が参考になると思います。


###Cloud Functions実装
デプロイの手法は複数あると思いますが、webインターフェースを用いた手法だと[こちら](https://cloud.google.com/functions/docs/quickstart-nodejs?hl=ja)が参考になると思います。

コードはこちらのリポジトリに置きました。
https://github.com/hisa-shimoji/SlackTodayCh2Line

今回のデプロイの際は

- トリガーのタイプ: http
- 認証: "認証が必要"

を選択します。ランタイム環境変数に以下の値を設定します。

| 変数名 | 解説 |
|:-----------|:------------|
| SLK_BOT_TOKEN| slack設定時に確認した Bot User OAuth Access Token [xoxb-**...] の値|
| SLK_BOT_SIGN_SECRET|slack設定時に確認したSigning Secretの値|
|SLK_BOT_MONITOR_CHANNEL|slack設定時に確認した対象チャンネルのid|
|L_NOTIFY_KEY|LINE notifyのトークン|
|L_MSG_PREFIX|LINEメッセージの前に付加する文字列 改行は\nで設定 必要なければ空白に|
|L_MSG_SUFFIX|LINEメッセージの後に付加する文字列 改行は\nで設定 必要なければ空白に|

###実行テスト
デプロイ後、webインターフェースから``関数をテストする``でテストできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935211/eab3649d-5b85-b117-acb1-48766d308ad2.png)

成功すると該当slackチャンネルの当日分のメッセージ(発言者と内容)がLINEへ送信されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935211/1b2db2d4-2522-5a0b-4f19-c88c9ae5216d.png)

###定期実行
GCP Cloud Schedulerを用いて定期実行が可能です。 [こちら](https://qiita.com/nirasan/items/0d9aad7da324ecd789f4)の記事が参考になると思います。


###参考情報
https://cloud.google.com/functions/docs/quickstart-nodejs?hl=ja
https://qiita.com/YumaInaura/items/0c4f4adb33eb21032c08
https://qiita.com/iitenkida7/items/576a8226ba6584864d95
https://qiita.com/nirasan/items/0d9aad7da324ecd789f4
【基本情報】セキュリティ

###ネットワークに潜む脅威

セキュリティマネジメントの３大要素

* 機密性（許可された人だけが情報にアクセスできるようにするなどして、情報が漏洩しないようにすることを指す。）
* 完全性（情報が書き換えられたりすることなく、完全な状態を保っていることを指す。）
* 可用性（利用者が、必要な時に必要な情報資産を使用できるようにすることを指す。）

企業としてどのように取り組むかを明文化して、社内に周知、徹底することを**セキュリティポリシ**という。
セキュリティポリシは、基本方針、対策基準、実施手順の３階層で構成されている。

個人情報保護法、、、個人情報を事業者が適切に取り扱うためのルールを定めたもの。

プライバシーマーク、、、個人情報の保護体制が整備できている事業者を認定するもの。

###ユーザ認証とアクセス管理

ユーザ認証には、次のような手法がある。

* ユーザIDとパスワードによる認証
ユーザIDとパスワードの組み合わせを使って個人を識別する認証方法。
* バイオメトリクス認証
別名、生体認証。指紋や声紋、虹彩などの身体的特徴を使って個人を識別する方法。
* ワンタイムパスワード
一度限り有効という、使い捨てのパスワードを用いる認証方法。
* コールバック
遠隔地からサーバへ接続する場合などに、いったんアクセスした後で回線を切り、逆にサーバ側からコールバック（着信側から再発信）させることで、アクセス権を確認する方法。


アクセス権には、
読み取り、修正、追加、削除
などがある。
これらは、ディレクトリに対して、ユーザごとに指定することができる。

人の心理的不注意をついて情報資産を盗み出すことをソーシャルエンジニアリングという。


#####さまざまな不正アクセスの手法

* パスワードリスト攻撃
* ブルートフォース攻撃
* リバースブルートフォース攻撃
* レインボー攻撃
* SQLインジェクション
* DNSキャッシュポイズニング


不正アクセスに成功したコンピュータに潜伏し、攻撃者がそのコンピュータをリモート制御できるようにするソフトウェアの集合体をrootkitという。

###コンピュータウィルスの脅威

自己伝染機能
潜伏機能
発病機能

ウィルス対策ソフト、、、ウィルス定義ファイルをもとに検出する。

**ビヘイビア法（動的ヒューリスティック法）**
実行中のプログラムの挙動を監視して、不審な処理が行われてないかを検査する手法。

###ネットワークのセキュリティ対策

ファイアウォール、、、LANの中と外を区切る壁として登場するのがファイアウォール。
特に定まった形はなく、主な実現方法としてはパケットフィルタリングやアプリケーションゲートウェイなどがあげられる。

パケットフィルタリング、、、パケットを無条件に通過させるのではなく、あらかじめ指定されたルールに乗っ取って、通過させるか否かを制御する機能。

アプリケーションゲートウェイ、、、LANの中と外の間に位置して、外部とのやりとりを代行して行う機能。プロキシサーバとも呼ばれる。

ペネトレーションテスト、、、既知の手法を用いて実際に攻撃を行い、これによってシステムのセキュリティホールや設定ミスといった脆弱性の有無を確認するテスト。

###暗号化技術とディジタル署名

ネットワークの通信経路上に潜む危険と言えば、盗聴、改ざん、なりすましの三つがある。

共通鍵暗号方式、、、送り手と受け手が同じ鍵を用いる暗号化方式。秘密鍵暗号方式とも呼ばれる。

公開鍵暗号方式、、、一般に広くばら撒いてしまうための公開鍵という公開用の鍵がある。この方式は、暗号化に使う鍵と、復号に使う鍵が別物。

ディジタル署名、、、ハッシュ化という手法で短い要約データ（メッセージダイジェスト）を作成し、それを暗号化することでディジタル署名とする。その署名をメッセージに付加することによって、受信者が送信者を確認できるようにする。
Int型の条件分岐を見やすくする

```MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val issue = Issue()
        val result = issue.LOSE

        when(result){
            issue.WIN->{
                findViewById<TextView>(R.id.textView).text = "勝ち"
            }
            issue.DRAW->{
                findViewById<TextView>(R.id.textView).text = "引き分け"
            }
            issue.LOSE->{
                findViewById<TextView>(R.id.textView).text = "負け"
            }
        }
    }
}

data class Issue(
    val WIN:Int = 0,
    val LOSE:Int = 1,
    val DRAW:Int = 2
)
```
【AT Command】 AT+CREG: Network registration(ネットワークの登録状況)の確認

# MEMO
`AT+CREG?`でNetwork registrationを調べてみると、ネットに記載されている例の返り値と異なっていた。
しかし、挿しているSIMの契約によって返り値が決定することがわかったので、正常のようだ。

## 環境

- OS: windows10
- ターミナル: m-center v.02.03.00

## ハードウェア

- インターフェースモジュール: mini pcie usbアダプタ
- セルラー通信モジュール: SIMCom SIM7500JC
- SIM: soracom plan-D

## AT+CREG
Network registration(ネットワークの登録状況)を確認するためのコマンド。
セルラー通信モジュールのメーカーによって確認のコマンドは異なるので注意。

### 音声通信SIM
```
AT+CREG?
+CREG: 0,1
OK
```

### データ通信SIM(SMS有)
```
AT+CREG?
+CREG: 0,1
OK
```

### データ通信SIM(SMS無)
```
AT+CREG?
+CREG: 0,3
OK
```

### SIMCOMの定義

>0    –    not registered, ME is not currently searching a new operator to register to 
1    –    registered, home network 
2    –    not registered, but ME is currently searching a new operator to register to 
3    –    registration denied 
4    –    unknown 
5    –    registered, roaming 

## 参考文献
- [データ通信専用SIM（SMS無し）を使うとActivate()でエラーが発生する](https://github.com/SeeedJP/WioLTEforArduino/issues/1)
Progate HTML & CSS 初級編〜上級編　Flexbox編

１．初級編
見出し以外の文には＜ｐ＞要素

＜ｉｍｇ＞要素はテキストを囲むことが無いため、終了タグは不要

＜ｌｉ＞要素は囲む要素によって種類が変わる
＜ｕｌ＞は黒点
＜ｏｌ＞は数字が連番
list-style: none;で黒点無し

「 font-family: フォント名; 」
フォント名にスペースがある場合はダブルクォーテーションで囲む

タグにはドットは不要　classはドットが必要

レイアウトは＜ｄｉｖ＞要素によって構成していく
「div」は「division」の略で、要素をグループ化するために使用される


２．中級編

containerクラスを中央寄せにする
中央に寄せるためにはmarginの左右にautoを指定する
marginにautoを指定するときは、必ずwidthを併せて指定する

containerクラスのように、広い範囲を囲うようなブロック要素の場合はmarginを、テキストやボタンのようなインライン要素・インラインブロック要素の場合はtext-alignを使うようにする

セレクタ:hoverではスペースを挟まない

opacityには要素の中身全てを透明にするという性質がある。色のみを透明にするには、rgbaというものを使う必要がある

クリック時に、以下の処理をすることによって、ボタンがへこんで見えるようになる。
・box-shadowをnoneにする
・position: relative;とtopによって影の分だけ位置を下げる

z-indexプロパティは必ずpositionプロパティと併用する必要があるので、注意する。


３．上級編
メディアクエリ　＠ｍｅｄｉａ(max-width: 1000px) {
cssを記述
}
1000pxの後にセミコロン付けない

box-sizingをborder-boxに指定すると、要素の幅(width)の合計にpaddingとborderが含まれるようになる
box-sizing: border-box;を指定するときは、*(アスタリスク)に対して指定することが推奨されている
*はすべての要素に対してCSSを適用したい場合に用いる
border-boxをすべての要素に対して適用することで、レイアウトを管理しやすくなる

レスポンシブデザインを適用する準備として、＜ｈｅａｄ＞タグ内にviewportを設定する
viewportを設定しないと、スマートフォンやタブレットでの閲覧時にメディアクエリが正しく機能しない

responsive.cssを読み込む際には、必ずviewportよりも下の行に記述するようにする

float解除にclear: left;

メニューアイコンはデフォルトでは非表示にし、画面幅が670px以下（スマートフォンサイズ）の時にのみ表示されるようにする↓
要素を非表示にするにはdisplay: none;を用いる
非表示にした要素を表示させる時は、display: block;を用いて表示する


4.Flexbox編
リストを横並びにするにはdisplay: flex;
横並びにしたリストを画面幅いっぱいにするにはflex: auto;

折り返したい要素の親要素にflex-wrap: wrapを指定する
折り返したい要素自身には列数に応じたwidthを指定
2列にしたい場合はwidth: 50%を指定

縦に並べたいときは親要素にflex-direction: column
margin: 0 auto;とwidthで中央寄せ
Tips : Power Systems Virtual Server のAIX インスタンス作成時のディスク接続順番について

##### はじめに

[Power Systems Virtual Server](https://cloud.ibm.com/docs/power-iaas) でAIX インスタンスの作成時に、外部ディスクを複数つけた場合に、rootvg が一番最後の hdisk になっていることに気づきました。

rootvg が hdisk0 でなくてもOSとして特に問題ないですが、「rootvg は hdisk0で」と順番を気にされる方もいるかと思いますので確認した内容を記載します。

---

##### 環境

IBM Cloud: IBM Power Systems Virtual Server AIX （ディスク追加)




##### 確認

１）AIX 7200-05-01 のデプロイで、外部ディスクを2つ追加。ストレージは層3 (Tier3) を指定

![スクリーンショット 2021-01-21 14.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/e0a33e96-1569-1552-af39-f5ab1ee527e1.png)


ストレージは層1と層3 が選択できますが、IOPS/GB が異なります。
　・層1 (Tier1) は 10 IOPS/GB 。お値段高い方。
　・層3 (Tier3) は 3 IOPS/GB 。お値段低い方。

詳細は以下を参照ください。
[ストレージのティア](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-about-virtual-server#storage-tiers)


２）デプロイ後の確認

```
# lspv
hdisk0          none                                None
hdisk1          none                                None
hdisk2          00xx00xxxxxx000x                    rootvg          active
```

rootvg は hdisk2 となっています。


---

同じ条件で何度か行いましたが、結果は同じでした。
上の例は層3でしたが、層1で試しても同じく rootvg が最後の hdisk になります。
最初に接続ディスクを作って、それからrootvg ボリュームを作成しているような作りになっているのかもしれません。(個人的推測です)




AIX のデバイス名修正コマンド、rendev コマンドは rootvg メンバーには使用できないので、rootvgの hdisk 名の修正もできませんね。


[rendevコマンド](https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_72/r_commands/rendev.html)
> ルート・ボリューム・グループのメンバーであるか、ルート・ボリューム・グループのメンバーになる予定の (LVM またはインストール手順を使用して) ディスク・ドライブ・デバイスは名前変更できません。このようなディスク・ドライブを名前変更すると、ブートの失敗など特定のシナリオから復旧するための機能が失われる場合があります。


---

##### まとめ


・GUI コンソールで AIX インスタンスを作成する際に同時にディスクの作成と接続を行うと、rootvg のディスクの順番が最後になるという結果が得られています。
・hdisk0をrootvg にしたい場合は、インスタンス作成時に外部ディスクは作成、接続せずOSイメージのみをデプロイし、インスタンス作成後にディスクを追加することが良さそうです。
・(rootvg ミラーリングを行う場合は、外部ディスクボリューム1つ追加してデプロイし、hdisk0,hdisk1 でミラーリングすれば hdisk0/hdisk1 がrootvg にはなりますね。)




以上です。
【Laravel】ルート名を使って条件分岐をする方法。ページごとに処理を切り分ける。

ページによって処理を切り分けたい場合、ルート名を使うことで簡単に実現できる。


・`Request::routeIs('ルート名')`
- RequestファサードのrouteIsメソッド
- 指定したルート名の場合はtrue、それ以外の場合はfalseとなる。

<br>

```php:使い方（.blade.php）
        @if( Request::routeIs('english'))
          <h1>Hello!!!</h1>
        @endif
```

ルート名が、englishのとき、h1タグを表示する処理となる。

```php:ルーティング（web.php）
Route::get('greetings/english', 'GreetingController@english')->name('english');
```

・`->name('english')`でルート名を指定している。


<br>
###使いどころ
条件分岐をページ固有の変数（例えばテキスト）で指定すると、変数の中身が変わったときに、処理が適用されなくなってしまう。

なので**ページによって切り分ける場合**は、Request::routeIsメソッドを使う。

```php:NG事例
        @if( $language === "english" ))
          <h1>Hello!!!</h1>
        @endif
```

変数$languageの値が、「英語」や「eng」になった場合に適用されなくなる。



<br>
##（補足）パスで処理を切り分ける場合
ルート名ではなくパスで切り分ける場合は、`Route::is()`を使う。

```php:使い方（.blade.php）
        @if( Request::is(/greetings/english))
          <h1>Hello!!!</h1>
        @endif
```
axios では xhr? が効かない

自分用メモ。

[axios](https://github.com/axios/axios)はAjaxで通信するときに、リクエストヘッダーに`X-Requested-With`を付けません。

参照: https://github.com/axios/axios/issues/1322

なので、Railsのxhr?メソッドは偽になります。

```ruby
if request.xhr?
 # axiosだと効かない
end
```

xhr?メソッドを使いたければ、JavaScript側でaxiosのヘッダーに`X-Requested-With`を追加する設定が必要です。


```javascript
Axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
```

あるいは、Rails側で`X-Requested-With`がなくても動くようにします。

```ruby
if params[:format] == 'json'
 # Ajaxの場合の処理
end
```
Qiitaの投稿方法について(自分用)

>参考記事　https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1

#見出し(h1)
\#あ
###見出し(h3)
\###あ

##コード
```book.rb
def index
 @book = Book.all
end
```
\`\`\`book.rb
def index
 @book = Book.all
end
```


##URL
[きーた](http://qiita.com/)
\[きーた](http://qiita.com/)

##画像
![Qiita](http://cdn.qiita.com/assets/siteid-reverse-6044901aace6435306ebd1fac6b7858c.png)
\!\[Qiita](http://cdn.qiita.com/assets/siteid-reverse-6044901aace6435306ebd1fac6b7858c.png)


>引用文です
\>引用文です

>>ネストです
\>>ネストです

##太字とイタリック
_イタリック_
*イタリック*
\_イタリック_
\*イタリック*

__太字__
**太字**
\_\_太字__
\*\*太字**

##リスト
* 順序なしリスト

\* 順序なしリスト

1.順序ありリスト
2.順序ありリスト
(そのまま)

水平線
---
\---
***
\***

###テーブル

|左揃え|中央揃え|右揃え|
|:---|:---:|--:|
|align-left|align-center|align-right|
|セルの左揃えです|セルの中央揃えです|セルの右揃えです|

\|左揃え|中央揃え|右揃え|
|:---|:---:|--:|
|align-left|align-center|align-right|
|セルの左揃えです|セルの中央揃えです|セルの右揃えです|

###マークダウンの無効化
\#見出し
\＃見出し

###他記事のマークダウンの記述確認
URLに「.md」と付けるだけで、書き方を確認できる
Salesforce の OAuth2 トークン　有効期限の仕様が独特だった件について

Salesforce の OAuth2 トークン。有効期限の仕様が独特だったので、調べた内容の記録です。「Web アプリケーションインテグレーションの OAuth 2.0 Web サーバフロー」で取得した OAuth2 トークンについて、調べた内容をまとめます。

Salesforce は、リフレッシュトークン／アクセストークンを返す際、有効期限 (expred_in) をレスポンスに含めません。実際には有効期限が存在し、

- アクセストークンは、ユーザセッションが有効である限り、有効
- リフレッシュトークンは、接続アプリケーションの設定に従う

となっています。ユーザセッションは Web アプリのログインセッションと同じように、それを使用してアクセスするたびに、有効期限が伸びます。つまり Salesforce のアクセストークンは、有効期限内に使用し続ける限り、その有効期限が伸び続けます。通常、OAuth2 アクセストークンの有効期限は伸びないので、この仕様は独特です。

ユーザセッションが有効な間、リフレッシュトークンから何度アクセストークンを取得しても、同じアクセストークンが返されます。リフレッシュトークンからアクセストークンを取得しても、ユーザセッションの期限は延長されます。

ユーザセッションが切れたあと、アクセストークンを使用すると、Session expired or invalid のエラーとなります。ユーザセッションが切れたあと、リフレッシュトークンからアクセストークンを再取得すると、これまでと同じアクセストークンが返されます。ユーザセッションも新たに作成されず、これまでのものの有効期限が更新されます。つまりリフレッシュトークンおよびアクセストークンとユーザセッションは、１対１に対応していると考えられます。

ユーザセッションの有効期限は、接続アプリケーションのタイムアウト設定によって決まります。接続アプリケーションのタイムアウト設定が「なし」の場合、ユーザプロファイルのタイムアウト設定によって決まります。（ユーザプロファイルのタイムアウト設定が未設定の場合、組織のタイムアウト設定によって決まるようですが、それは未確認です）
https://help.salesforce.com/articleView?id=connected_app_manage_session_policies.htm&type=5

リフレッシュトークンの有効期限も、接続アプリケーションの設定によって決まります。この設定が "Immediately expire refresh token" になっていると、リフレッシュトークンが発行されても、まったく使えないものとなります。注意が必要です。


なお認可からやり直すと、別のリフレッシュトークン／アクセストークンが返され、ユーザセッションも別のものとなります。これには注意が必要で、Salesforce には「１ユーザ・１接続アプリケーションあたり、トークン数 5 まで」という制限があるようです。
https://help.salesforce.com/articleView?id=remoteaccess_oauth_flows.htm&type=5

ただ制限はありそうだが、厳密でもなさそうです。試したところ、6 まで問題なくいけて、7 まで行ったときに、1 つアクセストークン破棄され、しばらくすると更に 2 つ破棄されて、4 だけ残る状態になりました。2 回試して、同じような感じです。古い順には破棄されるようです。

これで破棄されたものについては、リフレッシュトークンも破棄されています。リフレッシュトークンからアクセストークンを再取得しようとしても、"expired access/refresh token" のエラーになります。

不思議なことに、この状態になっても、Salesforce の "User Session Information" には残り続けます。かつ有効期限も伸びる。なので、「セッションが有効⇒トークンが有効」というわけでも無さそうです。逆「トークンが有効⇒セッションが有効」は言えると思います。いずれにせよ、「１ユーザ・１接続アプリケーション単位でトークン数に制限がある」ということは意識したほうが良さそうです。

以下、まとめです。

 - アクセストークンの有効期限はユーザセッションの有効期限に従う
 - アクセストークンを使うたびに、ユーザセッションの有効期限も伸びる
 - アクセス／リフレッシュトークンの有効期限は接続アプリケーションの設定に従う
 - ユーザセッションが切れた後（アクセストークンが無効になった後）も、リフレッシュトークンからアクセストークンを取得可能
 - 「１ユーザ・１接続アプリケーションあたり、トークン数 5 まで」という制約がある。複数種類 Salesforce への API アクセスがあるなら、接続アプリケーションを分ける等の工夫が必要。
IBMCloud VRA 19系 HA同期について

##HA同期時の注意点
VRA19xxでは、HA状態のconfig-sync時は全ユーザを**Group Secret**に所属させる必要がある。
下記では、細かい事が書かれていないが、必ず全ユーザを所属させる。同期の仕組みが変更されており、一部コマンドも変更されている。
https://cloud.ibm.com/docs/virtual-router-appliance?topic=virtual-router-appliance-synchronizing-high-availability-configurations&locale=ja

##Group Secret設定時の注意
* Group Secretがない場合、configの同期はされない
* 1号機と2号機の両方に同じ設定を入れる
* configを設定するユーザのみを所属させるのではなく、存在する全ユーザを所属させる
    * ログインユーザーがシークレットグループに属していない場合、同期が適切に行われたとしても、config-syncステータスは成功として表示されない

##同期確認コマンド
VRA18xx系では、存在したコマンドがなくなった

* show connsync internal-cache
* show connsync external-cache

VRA19xx系では、下記で確認する

* show session table
if文とunless文の使い分け

エラーばかり投稿してもつまらないので、今回はif文とunless文について学んだことを書いていきたいと思います。

# if文とは

```ruby:ruby

if A = B
#処理
end
```

`AはBである`という内容が、
正しければ処理を実行し、
正しくなければ処理を実行しません。

# unless文とは

```ruby:ruby

unless A = B
#処理
end
```

`AはBである`という内容が、
正しければ実行せず、
正しくなければ実行します。

`=`は等しいかどうかを比較するときに使います。
if文では**AとBが等しいとき**に`true`となり、処理を実行し、
逆にunless文では**AとB等しくない時**に`true`となり、処理を実行するというわけです。

それでは比較演算子の１つである`!=`を使うとどうなるでしょうか？
# 比較演算子の `!=`とは
`=`とは逆で等しくないことを比較するときに使う比較演算子です。
要するに


```ruby:ruby

if A != B
#処理
end
```

`AはBではない`という内容が
正しければ処理を実行し、
正しくなければ処理を実行しません。

```ruby:ruby

unless A != B
#処理
end
```

`AはBではない`という内容が、
正しければ実行せず、
正しくなければ実行します。

何やらこんがらがってきました。
文字に書くと難しくなってきましたが、要するに

`if A = B　 と unless A != Bは同じ`
`if A != B　と unless A = B は同じ`
という解釈で大丈夫そうです。

# どちらを使えばいいか

可読性も考え、基本的には`if文`を使用した方が良いみたいです。


# 英語における`ifの否定（if not）`と`unless`の違い

英語が得意だ！という人からすると信じられないかもしれませんね。
理由は、例えば
`A if he isn't B.`という英文と
`A unless he is B.`という英文は全く違う意味だからです

英語の授業ではないので英文の例文や意味は記述しません。
ただ、プログラミングにおけるifとunlessは難しく考えず、逆の意味程度にとどめておいた方が良いかもしれません。

#終わり
英語が得意ではなかったですが、ifとunlessの使い方を疑問に思い、調べたり聞いたりした結果でした。
調べる前までは、
肯定したければ`if`　否定したければ`unless`
という考え方でした。

これからは基本的にはif文を使っていきたいと思います。
CloudWatchAlarmの動作確認をしてみる

# 目的
わが社ではCloudWatchAlarmを設定し、アラート内容をタスクとしてチケット化するシステムを作っているのですが、「アラート内容をタスクとしてチケット化」の部分を確認したいので、CLIで無理やりアラートを発報させる方法を調査しました。備忘録です。

# 手順
CloudWatchの権限を持ったユーザでCloudShellからCLIをたたくだけ。

```shell-session
cat << EOF > ALARM.json
{
    "AlarmName": "【Alarm名】",
    "StateValue": "ALARM",
    "StateReason": "Test Alarm"
}
EOF
aws cloudwatch set-alarm-state --cli-input-json file://./ALARM.json
rm -f ./ALARM.json
```

今回はファイルインプットを採用。
ファイルインプットのほうが、設定内容の可視性を上げやすいのでよさげですね。

以上。
manimの作法 その24

#概要

manimの作法、調べてみた。
TextMobject使ってみた。

#サンプルコード


```
from manimlib.imports import *

class test(Scene):
	def construct(self):
		first_line = TextMobject('hello')
		second_line = TextMobject('world')
		third_line = TextMobject('nice', color = RED)
		second_line.next_to(first_line, DOWN)
		self.wait(1)
		self.play(Write(first_line), Write(second_line))
		self.wait(1)
		self.play(ReplacementTransform(first_line, third_line), FadeOut(second_line))
		self.wait(2)


```

#生成した動画

https://www.youtube.com/watch?v=mg32_XbyawA

以上。
Server at localhost is not responding. Do you want to terminate this server?

# 事象 : Tomcatを停止して待っていたらなんか言われた
- 環境
    - Windows10 Pro バージョン1909
    - Eclipse IDE for Enterprise Java Developers Version: 2020-09 (4.17.0)
    - Apache Tomcat 8.5.61

メッセージが表示されても[OK]ボタンで待っていればそのうち停止する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/1ca40895-b57f-5a1b-572a-f997ded66b86.png)

```text:メッセージ
Server at localhost is not responding. Do you want to terminate this server? Click OK to terminate the server or click Cancel to continue waiting.
(訳)
localhostのサーバーTomcat v 8.5サーバーが応答していません。このサーバーを終了しますか?[OK] をクリックしてサーバを終了するか、 [Cancel] をクリックして待機を続行します。
```

## 原因 : なんかで停止に時間がかかってタイムアウトしたから

> If a webapp doesn't cleanup completely, especially with respect to stopping non-daemon threads it starts, Tomcat will fail to shutdown.
> Clicking "Stop" has the advantage of providing a timeout.
> If Tomcat fails to stop within the timeout, a dialog will appear giving you the option to terminate the server or continue waiting.
> (訳)
> Webアプリケーションが完全にクリーンアップされない場合、特に起動する非デーモンスレッドの停止に関して、Tomcatはシャットダウンに失敗します。
> 「停止」をクリックすると、タイムアウトが発生します。
> Tomcatがタイムアウト内に停止できない場合は、ダイアログが表示され、サーバを終了するか待機を続けるかを選択できます。
> [java - Tomcat not shutting down within Eclipse - Stack Overflow](https://stackoverflow.com/questions/1998281/tomcat-not-shutting-down-within-eclipse?rq=1)

### 対応 : タイムアウトをのばす
1. Tomcatダブルクリック > [Timeouts] > [Stop] > 値を置きくする(デフォルト15sec)
2. Tomcatからアプリケーション削除 > Tomcatをクリーン
3. 次に使うときに再出風呂いしてTomcatを起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/df207172-5648-4f2e-6edb-a3624c5ac6d3.png)
(解決)Marpで画像サイズが変わらなくて困った話

Markdownでプレゼンテーションスライドが作成できる[Marp](https://marp.app/)。非常に便利で活用しています。

ある日、画像サイズを変更しようと下記のコードを埋め込んでみました。

```markdown:slide.md
---
marp: true

---
# 画像サイズ変わらず
![30%](image.jpg)

```

ところが、ここのパーセンテージをいくら変えても、画像のサイズが変わりませんでした。
一旦保存して開きなおしても同じで、Marpのバイナリをダウンロードしてエクスポートしても、変わらず・・・

試行錯誤してピクセル直指定にしたら問題なし。割合指定したいのに、これは使いづらいなぁ・・・

```markdown:slide.md
---
marp: true
---
# 直指定だとOK
![height:500](image.jpg)

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267148/a0ba2aab-0bcc-b1d3-ed78-51a36c53dca1.png)


ちなみに、背景だとOKなんですよね。

```markdown:slide.md
---
marp: true

---
# 背景だとOK
![bg 30%](image.jpg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267148/48b7cbe3-5296-de73-544f-711d5ca80f9d.png)

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267148/619f803a-b7d1-0931-1cdc-2400d2428284.png)

海外のサイトなども色々見てみたのですが、同じ問題に当たっている文献は見つからず・・・
悩んだ末に、HTMLのタグを使って埋め込みました。こちらの設定を有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267148/4d9b4975-2243-28c3-441a-9248665cb658.png)

で、比較のために2つのコードを埋め込んだ結果。

```markdown:slide.md
---
marp: true

---
# 画像サイズ変わらず
![30%](image.jpg)

---
# HTMLだと変わる
<img src="image.jpg" width=30%/>
```

プレビュー結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267148/0aaa2a57-0752-00ba-da4b-5072a36e8f0b.png)

折角Marp使ってるので、できるだけMDの記法にしたいんですが・・・当面はこれでしのぎます。

もしご存じの方がおりましたら、情報お待ちしております！

**2021/1/22 追記**

Marpの作者様から、単一画像のパーセンテージ指定はスライドサイズによって表示同一性が確保できないため、現状あえて対応していないとのことでした。
https://marpit.marp.app/image-syntax

オリジナル画像の縦横比を保持しながらの拡大縮小は、縦横いずれかのpixelの直指定もしくは、HTMLタグでの対応となります。
【Swift】遅延実行

#はじめに
この記事では、Swiftの遅延実行について簡潔にまとめました。
⚠️当方初学のため認識違いがある可能性大です
誤りを見つけた際はコメントにて指摘していただけると幸いです🙇‍♀️🙇‍♂️


#参考書籍
この記事は以下の情報を参考にして執筆しました。

- [Swift実践入門](https://www.amazon.co.jp/%EF%BC%BB%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88%EF%BC%BDSwift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-WEB-PRESS-plus-ebook/dp/B086VVQ3DJ/ref=sr_1_1?adgrpid=56053864951&dchild=1&gclid=CjwKCAiAo5qABhBdEiwAOtGmbtEdp97n9eQCgn4VQpffZut8DhCnND9sXQBMoTecHwls0LKIy4l-cxoCCZwQAvD_BwE&hvadid=338518511220&hvdev=c&hvlocphy=1009155&hvnetw=g&hvqmt=e&hvrand=13959960213026669174&hvtargid=kwd-306987067810&hydadcr=27263_11561109&jp-ad-ap=0&keywords=swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80&qid=1611048736&sr=8-1&tag=googhydr-22)


#遅延実行とは
遅延実行とは、特定の文をそれが記述されている箇所よりも後で実行すること。


#defer文 - スコープ退出時の処理
defer文において、{}内のソースコードはdefer文が記述されているスコープの退出時に実行される。
リソースの解放など、その後の実行フローの内容にかかわらず、スコープの退出時に確実に実行されて欲しい処理の記述に利用する

```defer {
defer文が記述されているスコープの退出時に実行される文
}
```
Macの動作が重いときに試したい方法

Macの動作が重かったときや、デザインアプリを起動するときに時間がかかってしまうのを解決したいためにまとめた記事になります。
##１ヶ月に１回くらい定期検診するといいもの
### 1.稼働しているつかわないアプリを強制終了する
`command + option + esc`を押すと稼働しているアプリケーション一覧がでるので、使わないアプリを強制終了する。
↓こんな画面が出てくる
![スクリーンショット 2021-01-21 12.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241068/ced8645d-31c6-b89b-b1a1-f1bf07638417.png)

### 2. ディスクのアクセス権を検証・修復する
`command+スペースボタン`でspotlightを開く→「ディスクユーティリティ」と検索→「FirstAid」をクリック→検証を開始(時間がかかります)
または
Finder→アプリケーション→ユーティリティ→ディスクユーティリティを開く
![スクリーンショット 2021-01-21 13.35.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241068/f7bd48a8-ee5d-4821-611c-ed7952a2c924.png)

###　3.「セーフブート」をする
別名「セーフモード」ともいうらしいです。
`Macを完全にシャットダウンする→電源ボタンを入れる→ジャーンという起動音がしたら、Appleロゴが表示されるまで「shiftキー」を長押しし続ける`
起動したらすでにセーフブートは終わっているので、右上に「セーフブート」と表示されていても気にせず使用してもいいし、再起動しても大丈夫です。


##1度きりの設定でいいもの
###1.投下表示をオフにして動作を軽くする
`Appleメニュー→システム環境設定→アクセシビリティ→ディスプレイ→「透明度を下げる」にチェックを入れる`
設定を変更しても、目視では透明度の違いはまったく気づきませんでした。少しでも軽くしたいなら設定変更しておくといいですね。

参考
---
[Macの動作が重いと感じた時のメンテナンス方法&高速化に役立つアプリ30選](https://biz.moneyforward.com/blog/17499/#1)
2. ディスクのアクセス権を検証・修復の参考→[アクセス権の修復を実践しよう!](http://www.dht.jp/imagefinder/accessken.html)
投下表示をオフにして動作を軽くするの参考→[Macで透過表示をオフにして動作を軽くしよう](https://chikara-kobu.com/curriculum/mac%E3%81%A7%E9%80%8F%E9%81%8E%E8%A1%A8%E7%A4%BA%E3%82%92%E3%82%AA%E3%83%95%E3%81%AB%E3%81%97%E3%81%A6%E5%8B%95%E4%BD%9C%E3%82%92%E8%BB%BD%E3%81%8F%E3%81%97%E3%82%88%E3%81%86/)
3.「セーフブート」をするの参考→[不調なMacが即効改善！お手軽メンテ「セーフブート」とは？どうやるの？](https://bamka.info/mac-safeboot)