OmniAICreator/Qiita-1.07M huggingface dataset:
[Next.js+Typescript] Swiperでカルーセルを作成する

Webで実装したことを記事にしました。
カルーセルを作ることになり、Swiperについて、いろいろと調べたので、
まとめるために記事にしました。

同じようなことを実装するときに、この記事が少しでもお役に立てれば幸いです。

## Swiperをインストールする

まずはドキュメントを参考にしました。

https://swiperjs.com/get-started

```
  $ npm install swiper
```

cssをインポートします。私は、`_app.tsx`に追加しました。

```react
import 'swiper/css/bundle'
```

## カルーセルを作成する

```typescript
import Image from 'next/image'
import { Swiper, SwiperSlide } from 'swiper/react' //カルーセル用のタグをインポート
import SwiperCore, { Pagination, Navigation } from 'swiper' //使いたい機能をインポート

SwiperCore.use([Pagination, Navigation]) 

// カルーセルにする画像のソースをリストにします
const images = [
  '/test_image.jpg',
  '/test_image2.jpg',
  '/test_image.jpg',
  '/test_image2.jpg',
]

const TestCarousel = () => {
  return (
    <Swiper
      slidesPerView={1} //一度に表示するスライドの数
      pagination={{
        clickable: true,
      }} //　何枚目のスライドかを示すアイコン、スライドの下の方にある
      navigation //スライドを前後させるためのボタン、スライドの左右にある
      loop={true}
    >
      {images.map((src: string, index: number) => {
        return (
          <SwiperSlide key={`${index}`}>
            <Image
              src={src}
              layout="responsive"
              width={640}
              height={400}
              alt="test_image"
            />
          </SwiperSlide>
        )
      })}
    </Swiper>
  )
}

export default TestCarousel

```
![test_carousel.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435645/80e06db4-a0c3-2b88-6273-73569438b74e.jpeg)

スライドの左右に`navigation`があり、スライドの下の方には`pagination`が表示されています。 
デフォルトでは両方とも、色が青なので、CSSの変更がしたいところです。

さらに、機能を追加してCSSを変更するところは、別記事にまとめます。

## 最後に

参考にしたサイトは、下に貼ってあります.
間違っているところやよりよい方法をご存知の方がいれば、ご指摘いただけると助かります。

## 参考にしたサイト
https://www.npmjs.com/package/swiper

https://www.webdesignleaves.com/pr/plugins/swiper_js.html

https://stackoverflow.com/questions/66441697/swiper-slider-pagination-navigation-not-working-when-i-use-swiper-effect-in-reac
freeroutingでdsnファイルが読み込めないエラー(java.lang.Error: Illegal character)の解決策

# 結論
ココ参照
https://forum.kicad.info/t/language-error-reported-by-freerouter-for-dsn-file/20287

# 解決策
使っている文字の中にunicodeが入っているのが原因なのでそれを取り除く
例を出すとμやΩなど
got an unexpected keyword argumentエラーを駆逐してやる！

# はじめに
Djangoからurls.pyで引数を指定してViewをコールした時に、
発生した「got an unexpected keyword argumエラー」を駆逐したので調査報告します。

この世から、エラーを1件も残らず駆逐してやる！！

# 目次
[1.やりたいこと](#1-やりたいこと)
[2.発生したエラー](#2-発生したエラー)
[3.原因](#3-原因)
[4.解決策](#4-解決策)

#1. やりたいこと
urls.pyで引数を指定してViewをコールしたい。

#2. 発生したエラー
urls.pyのpath関数とviews.pyのviews関数に引数を指定したら
「got an unexpected keyword argum」エラーが発生した。
<img alt="エラー画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218426/808ebf21-300f-3f32-8a05-a543d0a589df.png">

#3. 原因
urls.pyの「実引数名」とviews.pyの「仮引数名」が不一致なのが原因だった。
実引数名と仮引数名を一致させればgot an unexpected keyword argumエラーを駆逐できる。

```python:urls.py
urlpatterns = [
    path('<int:id>/', detail, name='detail'),
]
```
```python:views.py
def detail(request,no):
    snippet = get_object_or_404(Snippet, pk=no)
    return render(request, 'snippets/detail.html',{'snippet': snippet})
]
```

#4. 解決策
どちらも「id」に修正し、urls.pyの実引数名とviews.pyの仮引数名を一致させて駆逐した。

```python:urls.py
urlpatterns = [
    path('<int:id>/', detail, name='detail'),
]
```
```python:views.py
def detail(request,id):
    snippet = get_object_or_404(Snippet, pk=id)
    return render(request, 'snippets/detail.html',{'snippet': snippet})
]
```
Databricksのサンプルデータ

[Databricks datasets \| Databricks on AWS](https://docs.databricks.com/data/databricks-datasets.html) [2021/10/4時点]の翻訳です。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksでは、Databricksファイルシステム(DBFS)にマウントされている様々なサンプルデータセット(Databricksデータセット)が提供されています。これらのデータセットはドキュメントを通じてサンプルデータとして活用されています。

# Databricksデータセットを参照する

Python、Scala、Rを用いたノートブックからData Science & EngineeringやDatabricks Machine Learningでこれらのファイルを参照するために、[Databricks Utilities](https://docs.databricks.com/dev-tools/databricks-utils.html)を活用することができます。以下のサンプルコードは利用可能なDatabricksデータセットの完全なリストを表示します。

```py:Python
display(dbutils.fs.ls('/databricks-datasets'))
```

```scala:Scala
display(dbutils.fs.ls("/databricks-datasets"))
```

```r:R
%fs ls "/databricks-datasets"
```

![Screen Shot 2022-01-02 at 18.27.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/129eb774-73d8-cdb6-6db9-b189aee6efcb.png)


# Databricksデータセットに関する情報を取得する

データセットに関する情報を取得するには、以下のサンプルのように(利用できる場合には)データセットの`README`を、Data Science & EngineeringあるいはDatabricks Machine LearningからPython、R、Scalaを用いて参照します。

```py:Python
f = open('/dbfs/databricks-datasets/README.md', 'r')
print(f.read())
```

```scala:Scala
scala.io.Source.fromFile("/dbfs/databricks-datasets/README.md").foreach {
  print
}
```

```r:R
library(readr)

f = read_lines("/dbfs/databricks-datasets/README.md", skip = 0, n_max = -1L)
print(f)
```

![Screen Shot 2022-01-02 at 18.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/28a227e0-8cf1-321f-a94f-1e980a156dae.png)


# Databricksデータセットを用いてテーブルを作成する

以下のコードでは、Databricks SQLのクエリーエディタでのSQLの使用方法、そして、Data Science & EngineeringあるいはDatabricks Machine LearningにおけるノートブックでPython、Scala、Rを用いて、Databricksデータセットからテーブルを作成する方法を説明しています。

```sql:SQL
CREATE TABLE default.people10m OPTIONS (PATH 'dbfs:/databricks-datasets/learning-spark-v2/people/people-10m.delta')
```

```py:Python
spark.sql("CREATE TABLE default.people10m OPTIONS (PATH 'dbfs:/databricks-datasets/learning-spark-v2/people/people-10m.delta')")
```

```scala:Scala
spark.sql("CREATE TABLE default.people10m OPTIONS (PATH 'dbfs:/databricks-datasets/learning-spark-v2/people/people-10m.delta')")
```

```r:R
library(SparkR)
sparkR.session()

sql("CREATE TABLE default.people10m OPTIONS (PATH 'dbfs:/databricks-datasets/learning-spark-v2/people/people-10m.delta')")
```

サンプルデータのより詳細な説明に関しては以下を参照ください。

https://qiita.com/taka_yayoi/items/3f8ccad13c6efd242be1

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Pythonクローリング＆スクレイピング

C言語で副業をしようと思いましたが、言語の性質上か短期での案件がありませんでした。。。

案件を見ているとpythonでスクレイピングが多そうだったので、下記を学習することにします。
[Pythonクローリング＆スクレイピング[増補改訂版] -データ収集・解析のための実践開発ガイド](https://www.amazon.co.jp/dp/B07VZV2QHL/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

随時更新していきます。
更新日(2022/01/02)

# 環境構築
本の記載に従って、VatiualBoXとVagrantを使用します。
記載の通りでスムーズに行えました。

# Webページの取得
サードパーティ ライブラリRequestを使用した。
importには本書記載の方法ではうまくいかず、下記の赤字部を追加する事で動作できた。
★後日調査する。★

import sys
<span style="color: red; ">sys.path.append('/usr/lib/python3/dist-packages')</span>
import requests

#その他
本書のサンプルコードをダウンロードする事ができ、学習に便利です。
移動軌跡ルートの地図上アニメーション（deck.gl, Tripslayer ）

こんにちは。

移動軌跡ルートを地図上でアニメーション表示しました。
* deck.gl の [Tripslayer](https://deck.gl/docs/api-reference/geo-layers/trips-layer)を利用し、オリジナルソースを参考にし[^1] [^2]、ローカルデータファイル読み込み動作へ書き換えました。

[^1]: オリジナルのデモ動作およびソースは：　https://deck.gl/examples/trips-layer （または https://docs.carto.com/deck-gl/examples/advanced-examples/trips-layer ）

[^2]: 他の参考情報は、[stevekirks/deckgl-trips](https://github.com/stevekirks/deckgl-trips) (GitHub)　、 [Deck GL Time Frame Animations](https://ckochis.com/deck-gl-time-frame-animations) ([Craig Kochis](https://ckochis.com/))

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/bea050d5-5159-d637-ff8f-234436887b2c.gif)

* デモ動作およびソースはこちら： [deck.gl trips-layer animation: reading trips files dropped-onto](https://bl.ocks.org/kkdd/34f691afbf089e92a2cb4b1cca4cb582) (bl.ocks.org)

* サンプルデータファイル（タクシーの移動軌跡）の入手先は：

```console
$ curl https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/trips/trips-v7.json 2> /dev/null | jq -c 'map(select(.path[0][0] < -73.98 and .path[-1][0] < -73.98 and .path[0][0] > -74.02 and .path[-1][0] > -74.02 and .path[0][1] < 40.75 and .path[-1][1] < 40.75 and .path[0][1] > 40.70 and .path[-1][1] > 40.70))' | jq -c '.' > trips-v7_0.json
```
Solana のトランザクションを stake.tax で CSV で取得して税金計算を行うメモ

Solana チェーンで DeFi とかウェイェイやってもうた...
税金計算どうしよ...

Step finance のだと transaction 出るけど CSV とかでダウンロードできなさそうだし...

etherscan で DeFi トランザクションを集計して税計算を行う(だいたいできた. 進捗 89%)
https://qiita.com/syoyo/items/288f14fe76fa0d4d02bf

があるが, Solana は EVM 系ではないのでやり方がことなりめんどい...

https://www.reddit.com/r/solana/comments/mxrigs/solana_csv_downloadtranslation_to_human_ledger/

stake.tax がありました!

web app 上では取引ごとに取引形態(わかれば)と, コインのアイコン出してくれます.

![Screen Shot 2022-01-02 at 18.22.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/697807be-2afd-04f4-e19f-b3711be4d06b.png)

Ultra super coooooooooool!!

これで勝てます! ... と思いましたがいろいろ情報抜けていてだめでした...
(たとえば Solfarm(現 Tulip)での vault 運用とか)

solscan の csv は 2021/07 以前のは取得できないし...

とりあえずはそれぞれのトランザクションを solscan や solana explorer で手動でチェックして...となるでしょうか.
Xperia Console 〜Android 11 の外部モニターアプリはコンソールモニターの夢を見るか〜

# はじめに
> Q: なぜこんなネタを書いた、言え！！
> A: 家に手頃なモニターが無くてつい最近手に入れた Xperia 1 III の外部モニターアプリだったら何とかいけるのではと思ったんです。

# 概要
>そぷらのさん＠気まま気ままでがんばらない [@soprano1125](http://www.twitter.com/soprano1125) 2021年12月24日
>> 久しぶりに赤い帽子をアップデートしてさあリブートだーと意気揚々とリブートしたら帰って来なかったのが今朝までの話で今はゲストから家のネットワークの疎通が出来るのにホストから家への通信が出来なくてどういうことなん状態など(^_^；)

上のツイートに書いたとおりこんな変な状況に陥ってしまったので何とかしようと考えた時手元にすぐ使える[^TV][^CRT]モニターがなかったので色々検索したところ「Xperia 1 II と [UVC(USB Video Class)](https://infinitegra.co.jp/blog/uvc_is/) のデバイスを使って PC モニターにしたよ」という[記事](https://lib.hatenablog.com/entry/2021/02/11/Xperia_1_%E2%85%A1%E3%82%92PC%E3%81%AE%E5%A4%96%E9%83%A8%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)があったので「(ちょうど手元に Xperia 1 III があるし)もしかすると CUI の表示用に使えるんじゃね？」と思ってやってみた記録です。

# とりあえず買ってみた
https://www.amazon.co.jp/gp/product/B0963JG2X3/

https://www.amazon.co.jp/gp/product/B014I8UL8U/

あけましておめでたい31日深夜(1日早朝)に注文して2日に届いて「いやぁ Amazon さまさまですわぁ」と思ったのは（ｒｙ
ちなみに HDMI-DVI 変換ケーブルは実際に操作する筐体に刺さっているグラボに HDMI や VGA の端子がなかったので購入しました。

# とりあえず繋げてみた
Quadro のグラボを取り付けている RedHat が入った筐体(写真後ろ)に HDMI-DVI 変換ケーブルとキャプチャーデバイスを繋げて「外部モニター」アプリを起動したあとが下の画像になります。

![monitor](https://i.imgur.com/TkpfmPL.jpg)
「やったぁぁぁぁぁぁぁぁ 映ったぁぁぁぁぁぁぁ！！！！」と喜んでいたら1、2分でキーボードの操作が受け付けないように見えたので Xperia とキャプチャーデバイスを繋ぎ直して「やったぁぁぁぁぁぁぁぁ ついたぁぁぁぁぁぁぁ！！！！」と喜んで1、2分で（ｒｙ という状況に。試しに Radeon のグラボを取り付けている Ubuntu が入った別の筐体に HDMI ケーブルとキャプチャーデバイスを繋げたところ、こちらは3・4分ほどでキャプチャーが止まってしまいました。／(^o^)＼ﾅﾝﾃｺｯﾀｲ
~~GNOME などデスクトップ環境を整えて使って検証してないのは鯖だし単に入れてないのと面倒だったからなのと（言い訳~~

# まとめ
「一応（今回買ったデバイスなら）使えるけど実用的かどうか聞かれたら **CUI だったらちょっと微妙**かなぁ・・・」という感じです。
あとはスマホを充電しながらモニターとして使うことができないキャプチャーデバイスなのでそこら辺をどうにかしたらマジ最強のコンソールモニターなのかもしれないですね（真顔

# おまけ
どっかのベンダーさんの保守作業員の方が**_スマホやタブレットの持ち込み OK な_データセンターで使う時、画面録画してログと一緒に今後の動作検証で（ｒｙ**ってことが今後できるようになるかもしれないですね（適当

[^TV]: 以前32型の液晶テレビの前に運んで HDMI-DVI 変換をして接続したのですがテレビの前まで運ぶのが面倒になりリブートしてから数分経っても SSH 接続できない時だけ運んで緊急で使っていました。
[^CRT]: CRT モニターもあるんですが置き場所がなく普段物置に入れていて 1F の物置から 2F の鯖の部屋まで運ぶのが~~重いし往復して運ぶのが正直~~ツラいのであまり使ってません。
メソッドチェーンをやってみた。。

# 初めに
年越し暇だったので、ちょっと変わったコーディングしようと思ったので実装してみました。
特に意味はありません。

## 更新履歴：
2022/01/02: ユーザー定義リテラルのサフィックス名に```_```の漏れ対応。

# 用意するもの
- メソッドチェーン
- ユーザー定義リテラル
- 演算子オーバーロード ```<<```
- お好みでクロージャーデザイン

※今回はC++17以上の環境で行っています。


# 状況
以下のようなCのオブジェクト(CLASS_C)をC++用のメソッドチェーンにラップしたいと思います。

```C++:row.h
#pragma once

struct CLASS_A{
  int x;
  int y;
  int z;
};

struct CLASS_B{
  float r;
  float g;
  float b;
};

struct CLASS_C{
  int type;
  float priority;
  unsigned int a_count;
  CLASS_A* p_a;
  unsigned int b_count;
  CLASS_B* p_b;
};
```

# 手順
1. 適当にCLASS_Cをカプセル化します。
1. CLASS_Cの中でポインタのメンバをvectorで用意し上のカプセルと一緒にラップします。
1. CLASS_Cの中のスカラーのメンバ共を適当な構造体でラップします。
1. CLASS_Cの各セッタ系の処理を用意し、メソッドチェーンかつ演算子オーバーロードにします。
1. 3で用意したラップ構造体に対してユーザー定義リテラルを用意します。
1. 4の演算子オーバーロード＆メソッドチェーンのせいで演算子オーバーロード以外のメンバ関数がメソッドチェーンで呼び出せないのであらゆるメンバ関数を演算子オーバーロードに合わせます。その際、関数名が```<<```になるので名前を引数に渡す構造体自体にします。

### ポイント・コツ
step6で説明が難しかったので補足すると、

```C++
class SAMPLE{
  void func() {...}
};
```
上記のSAMPLEのメンバ関数であるfuncを
演算子オーバーロード＆メソッドチェーンに対応させると下記のようになります。

```C++
class SAMPLE {
  struct func{};
  SAMPLE& operator<<(const func _){
    ...
    return *this;
  }
};
```

手順を反映したオブジェクトがこちらになります。

```C++
struct CreateCObject {
  CLASS_C m_instanceC; // step 1
  std::vector<CLASS_A> m_instanceA; // step 2
  std::vector<CLASS_B> m_instanceB; // step 2

  struct update{};
  struct type {int value;};  // step 3
  struct priority {float value;}; // step 3
  // step 4
  CreateCObject& operator<<(type&& type){
    m_instanceC.type = type.value;
    return *this;
  }
  // step 4
  CreateCObject& operator<<(priority&& priority) {
    m_instanceC.priority = priority.value;
    return *this;
  }
  // step 4
  CreateCObject& operator<<(std::function<void(std::vector<CLASS_A>&)> update) {
    update(m_instanceA);
    return *this;
  }
  // step 4
  CreateCObject& operator<<(std::function<void(std::vector<CLASS_B>&)> update) {
    update(m_instanceB);
    return *this;
  }
  // step 6
  void operator<<(const update _) {
    m_instanceC.a_count = m_instanceA.size();
    m_instanceC.p_a = m_instanceA.data();
    m_instanceC.b_count = m_instanceB.size();
    m_instanceC.p_b = m_instanceB.data();
  }
};

// step 5
CreateCObject::type operator""_Type (unsigned long long v) {
  return CreateCObject::type{static_cast<int>(v)};
}
// step 5
CreateCObject::priority operator""_Priority (long double v) {
  return CreateCObject::priority{static_cast<float>(v)};
}
```
# 結果

これらのステップを全て行るこうなります。
どうでしょうか。。。意味がないですねｗ

非常に満足しました。

```C++
...
  CreateCObject instance = {};
  instance
    << 10_Type
    << 0.5_Priority
    << [](std::vector<CLASS_B>& vec){
      const int size = 10;
      vec.resize(size);
      for(auto& v : vec) {
        v.b = 0.5f;
        v.r = 0.8f;
        v.g = 1.0f;
      }
    }
    << [](std::vector<CLASS_A>& vec){
      const int size = 5;
      vec.resize(size);
      for(auto& v : vec) {
        v.x = 1;
        v.y = 2;
        v.z = 3;
      }
    }
    << CreateCObject::update();
...
```

おわり。。
キャスト中や記録中にプライベート情報が公開されます

Androidで新しいアプリをインストールして設定を行っていると、以下のメッセージが表示されることがあります。

***「キャスト中や記録中にプライベート情報が公開されます」***

個人情報がネットに公開される？？？
ちょっと驚くというか、ビビりますよね。
しかもこのメッセージを表示しているのがAndroidなのか、そのアプリなのか、それ以外なのかも判断できないことがあります。

このメッセージを表示しているのはAndroidです。
iOSは知りませんが、Androidは自身が発するメッセージに、その発信元がAndroidであることを明記しません。
私はその仕様が大嫌い。不親切極まりない。
何度か遭遇すれば慣れますけど、初見のときは、本当にその指示に従っていいのかどうかとても悩みます。
OSのアップデートとか特にそう。

そして今回のメッセージのように、英語からの機械翻訳が下手で、元メッセージのニュアンスが欠落しているときも不安になります。

Androidの言語を英語にすると以下の表示になりました。

***"Exposing sensitive info during casting/recording"***

これを直訳すれば確かに
「キャスト中や記録中にプライベート情報が公開されます」です。
しかしこの日本語文章は、メッセージが言わんとすることを表現しきれていません。
表現しきれていないというのは私の主観に過ぎませんが。

私なりに表現すると、
「キャスト中や記録中に個人情報がこのアプリに晒されます」

これをもうちょっと丁寧に言えば
「このアプリによってデータ変換や記録が行われるとき、個人情報がその対象となることがあります」

要するに「画面のスクリーンショットなどを行うアプリを使うと、その画面に個人情報が表示されていたら、その情報も対象になります」という当たり前のことを言っているだけなのです。

そんなこと言われなくても分かっとるわい！！
最悪のUIでセキュリティを爆アゲしよう

# は？
と思ってますね？わかります。ですが、最悪のUIでセキュリティが爆アガりするって事実だと思うんです（どっち）。

ある日ネットでこんなものを見つけました。

>最近のアプリはUIが優れていて、子どもでも直感で操作できてしまう<sup>[1](#出典)</sup>

なるほど。確かに最近のappは直感で操作できます。では、直感で操作できないほどのUIにしたらセキュリティ爆アガりするのではないでしょうか。

# 最近のアプリ

Webアプリで試してみましょう

## Twitter
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053860/edd17590-8ab2-5e66-574a-2c64e718ff0c.png)
最高すぎませんか？？？
Twitterは日々UIのアップデートがされていますが、最高です。語彙力なくなります。

## Instagram
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053860/f48fe4af-e8ae-ae08-4b6d-5683ee5d1f03.png)
こちらも最高すぎます！
クッソわかりやすいですよねー。

#Google Drive
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053860/d65bd8da-7ea2-03e2-df02-eace962c46f5.png)
使いかた教えてーと言わずにらくらくと使っている縄文人の姿が思い浮かびます！

# 最悪のUI

最悪のUI、つまり、わかりづらくすればいいだけですね。
それにもセンスが必要です。

## それぞれ共通していること
共通のデザインを考えていきましょう。

+ 線が少ない
+ 直感でわかる
+ アイコンがある
+ やりたいことはすべて見えているところからできる
+ あまり必要ないものは隠す
+ 色が少ない

これくらいですか？もっとあったら教えてください！
これらを逆にすれば良いのです。

# 最悪にする
## Twitter
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053860/33ff24d8-fe23-f553-632f-cd085ee6ed7d.png)

+ 枠線だらけ
+ ぱっと見てどうしたらいいかわからない
+ 色が多い
+ 大きさミスってる
+ 見づらい
+ ロゴをやたらと主張する

やばいですね

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053860/3a96e172-7e2e-f1cd-5c9a-8d38a860af20.png)
TwitterロゴをクリックするとModalが表示されるシステムです。わからんだろ。

これが毎日表示されると考えてみてください。寒気がします。

作っている間に頭痛くなりました

## Instagram

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053860/f04b5438-1f77-67bd-f9ae-be8135697dd8.png)
（写真は著作権の関係でカット）

バカですね。こんなデザイン。
どこをどうしたらどうなるのかが全くわかりません。
Twitter改が良く見えます

## Google Drive

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053860/b39abf23-2d35-3133-0073-3840ab1036e8.png)

は？シンプル過ぎません？
ですが、ようやく見慣れたハンバーガーが出てきました。そこにすべてが詰まっているのでしょうか？
ちなみに、ドラッグ、副ボタンクリックはできません。どうやって使うのか考えてみてください！


# まとめ

+ 線（太い）
+ 色とりどり（ダサい）
+ シンプルすぎる（どうしたらいいかわからない）
+ アイコンは一切ない
+ 大きさがアホ

これらのことを大切に、素敵なセキュリティライフを送りましょう！
ではまた！

※体調悪くなっても責任取りません。

# 出典

1: [夫のiPadで楽しく遊ぶ娘、やたらパスワードを聞いてくるのが怪しい…まさかの事実にショック](https://otonanswer.jp/post/104632/)
テスト57

```vb

Sub Duplicate_Check()
'同じ管理コードのデータの中で価格が最大のデータだけ残す
'(同じ管理コードで価格が最大ではないデータは全て削除する)

Dim WS_Dup As Worksheet
Dim i As Long
Dim Last_Row As Long

Set WS_Dup = ThisWorkbook.Sheets("重複データ")
Dim dic As Variant 'Dictionaryオブジェクト
Set dic = CreateObject("Scripting.Dictionary")

With WS_Dup
    '最終行取得...φ(ﾟωﾟ*)ﾉ<メモです
    Last_Row = .Cells(.Rows.Count, 1).End(xlUp).Row
'------------------------------------------------
'並べ替え
    With .Sort
        '同じ管理コードは行ごとに連続するようになる
        .SortFields.Clear
        .SortFields.Add _
        Key:=Range("D1"), _
        SortOn:=xlSortOnValues, _
        Order:=xlAscending, _
        DataOption:=xlSortNormal
        
        '価格が一番高いデータが一番上にくるようにする
        .SortFields.Add Key:=Range("E1"), _
        SortOn:=xlSortOnValues, _
        Order:=xlDescending, _
        DataOption:=xlSortNormal

        .SetRange Range("A1:E" & Last_Row)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        
    End With
'------------------------------------------------
Back:
    '最終行取得
    Last_Row = .Cells(.Rows.Count, 1).End(xlUp).Row
    
    'チェックするごとに要素を全て削除
    dic.RemoveAll
    
    For i = 2 To Last_Row
    
        If dic.Exists(CStr(Trim(.Cells(i, 4).Value))) = False Then
        
            dic.Add CStr(Trim(.Cells(i, 4).Value)), .Cells(i, 5)
            
        Else
            '同じ管理コードだった場合はその行を削除
            .Rows(i).Delete
            GoTo Back
            
        End If
    
    Next i
    
End With


End Sub
BigQueryのパーティション分割テーブルで最新だけ取り出すビューを作るとテーブル全走査してしまう

# 概要

毎日のスナップショットが見たいデータについて、日次で全件データをパーティション分割テーブルに蓄積している。
利用者が使いやすいように最新のパーティションだけのデータを取得するビューを作成しようとしたが、なぜかテーブル全件を走査してしまうビューになってしまう。
それだとクエリ料金がバカにならないので回避策を探した話。

# 結論

ビューで上記を実現する方法はいまのところなさそう。
近似的にやる方法はあり、WHERE句でパーティション分割列をcurrent_timestampなどの関数で指定する。
この場合、データ投入時刻のスケジュールによっては厳密には最新のパーティションでない場合が発生してしまう。

# やったこと

一番最初に思いつく方法はこれだと思うが、クエリ走査量を見るとテーブル全件を取得した量になってしまう。
参考文献によると、BigQueryのエンジンがそのように処理してしまうのかもしれないとのこと。

```sql:全件走査してしまうview
SELECT * FROM [table_name]
WHERE _PARTITIONTIME = (
    SELECT MAX(_PARTITIONTIME) FROM [table_name]
)
```

このようにWHERE句のサブクエリでテーブルを参照しない形にすると、全件ではなく当該パーティションだけ取得した量になる。

```sql:全件走査しないview
SELECT * FROM [table_name]
WHERE _PARTITIONTIME = (
    SELECT TIMESTAMP('2022-01-01 00:00:00')
)
```

```sql:全件走査しないview
SELECT * FROM [table_name]
WHERE _PARTITIONTIME = (
    SELECT timestamp_sub(timestamp_trunc(current_timestamp(), day), INTERVAL 1 day)
)
```

DECLAREとSETで変数にタイムスタンプを格納すると全件は走査しないが、DECLAREとSETを含むSQLはビューにできない。

```sql:全件走査しないがviewにできない
DECLARE latest TIMESTAMP;
SET latest = (SELECT MAX(_PARTITIONTIME) FROM [table_name]);
SELECT * FROM [table_name]
WHERE _PARTITIONTIME = latest;
```

# わかったこと

current_timestamp()でパーティションを指定すれば最新のパーティションを取得できそうだが、
日次のデータ投入バッチの時刻前後で、データが返ってこないパターンやデータが最新パーティションではないパターンが発生しうるので注意が必要。

# 参考文献

https://stackoverflow.com/questions/39733826/how-to-choose-the-latest-partition-in-bigquery-table
オーバースクロール効果を無効にする方法

android12からスクロールした際にポヨンというようなアニメーションをするようになりました。

こちらはデフォルトでアニメーションする為、アニメーションをさせたくない場合にどうすれば良いのかをまとめてみました。

# xmlに記載する

```
  android:overScrollMode="never"
```
こちらをオーバースクロール効果させたくない、スクロールするViewのxmlに記載すると無効化できます。


# プログラムで無効にする場合

```
  recyclerview.overScrollMode = View.OVER_SCROLL_NEVER
```

# アプリ全体で無効にしたい場合

xmlと同じですが、こちらをxmlではなくstyleやtheme等にも設定することができます。

```
  android:overScrollMode="never"
```

# 最後に

こちらを設定するとandroid12以下の端末では、EdgeEffectが無効になります。
スクロールの端に来た時に出る半円のエフェクトです。

## 公式リファレンス


https://developer.android.google.cn/about/versions/12/overscroll?hl=ja
アロー演算子で動的に要素を指定する方法

※自分用のメモ

##問題
PHPを使っていると->(アロー演算子)を使うことがあります。
使い方としては連想配列の要素を指定したり、Laravelのコレクションで使うことがあり

```php:
$fruits = ['apple'=>'りんご', 'peach'=>'もも', 'pear'=>'なし'];
$select = $fruits->peach;
print($select);   //もも
```
↑ざっくりですが、こんな感じで連想配列の要素を指定してやると、その要素を取得してきます。
ただ、このアロー演算子、使っていると指定する要素を動的に変更してやりたいと思うときがあり、その場合は以下のように記載します。
##やり方

```php:

$animals = ['animal_1' => 'らいおん','animal_2' => 'さる','animal_3' => 'しまうま'];
for ($i = 1; $i <= 3; $i++) {
  $select = $animals->{'animal_' . $i};
  print($select);   
}
  /*
  らいおん
　さる
　しまうま
  */
```
もしくは

```php:
$animals = ['animal_1' => 'らいおん','animal_2' => 'さる','animal_3' => 'しまうま'];
for ($i = 1; $i <= 3; $i++) {
    $prop = 'animal_' . $i;
    $select = $animals->$prop;
    print($select);
}
   /*
    らいおん
  　さる
　  しまうま
    */
```
という風に書いてやるとanimal_1からanimal_3までの要素を動的に取得してきます。
知っている人からすると基本的なことですが、教わるまで地味にわからなかったのでメモ代わりに残します。
[Nuxt] エラー「Property '$axios' does not exist on type 'CombinedVueInstance'」が発生する

# エラーについて

Nuxt で`@nuxtjs/axios` を使用したときに、TSのエラーが発生した

```zsh
Property '$axios' does not exist on type 'CombinedVueInstance ...
```

## 動作環境

```json:package.json
{
  "dependencies": {
    "@nuxt/types": "^2.15.8",
    "@nuxtjs/axios": "^5.13.6",
    "@types/google.maps": "^3.47.2",
    "nuxt": "^2.15.8",
    "typescript": "^4.5.4"
  },
}
```

## 解消方法

`tsconfig.json` で `@nuxtjs/axios` の型を指定できていなかったことが原因
`types` に必要な型の指定を追加する

```json:tsconfig.json
{
  "compilerOptions": {
    "types": [
      "@types/node",
      "@nuxt/types",
      "@nuxtjs/axios", // 型を追加
      "@types/google.maps",
    ]
  }
}
```
Rackアプリ向けWebサーバーの選択(Puma vs Unicorn)

それぞれ調べた結果

- Puma: 導入が簡単.Rails5系以降のデファクトスタンダード？Herokuが推してるらしい。
- Unicorn: 広帯域で高速な動作向き(メモリは食う) Rails4系以前のデファクトスタンダード？

「rails unicorn ゲーム」でググるだと、アカツキ(ドッカンバトルとかロマサガの開発会社)ではUnicornを採用してるっぽい。
これらはかなりの人気ゲームなので、アクセス負荷もかなり高いことが予想される。
逆に「rails puma ゲーム」でググっても、特にゲーム会社の記事がヒットしたりしなかった。
となると・・・あまり実績もない可能性がある。
**高負荷向けならunicorn安定か。**

**参考**

- https://stackshare.io/stackups/puma-vs-unicorn
- [環境変数を設定するだけでRuby on Railsサーバが10%高速化する(かもしれない)話](https://hackerslab.aktsk.jp/2019/12/01/141551)


**関連**

https://qiita.com/WisteriaWave/items/6344533ca3462b909904
Rails案件で一般的に「Nginx - Puma, Unicorn - Rails」構成を取る理由

それぞれの説明

- **Nginx**: 一般的なWebサーバ。デフォでクライアントからのリクエストをバッファリング可能
- **Puma, Unicorn**: Rackアプリ向けWebサーバ。クライアントからのリクエストをバッファリングができないため、低速回線によるリクエストだと接続が完了するまでつまってしまう。UnicornはRackの機能をあわせ持つ(Pumaも？)
- **Rack**: Rackアプリ向けWebサーバとRailsとをつなぐAPIを提供するアプリケーションサーバ(ライブラリ).一般的なWebサーバNginxとの接続は想定されていない。

・・・というわけで、一般的に
　Nginx - Puma, Unicorn - Rails
という構成が取られているみたい。


**参考**

- [【Rails】Webサーバー「Unicorn」の基本情報と実装方法](https://www.autovice.jp/articles/146)
- [Apacheとnginxのリバースプロキシ挙動差（バッファリング）](https://qiita.com/no_clock/items/df1e4bdd5bbddd76c01b)
- [NginxとUnicornでRubyonRailsの本番アプリサーバー構築手順](https://www.techbox.jp/entry/nginx-unicorn)
『エラトステネスの篩』の記述例（bc版）

[元記事](https://qiita.com/ytaki0801/items/40060bdad04edcd1bd3c)より分離しました．趣旨は元記事と同じく『「[エラトステネスの篩](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)」だとこれだけ速く[素数](https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0)が求まる！』ですが，仕様・処理系に大きな制約のあるプログラミング言語については，他の言語との比較を避けるため，個別記事としている次第です．`bc`はどちらかというと計算コマンド扱いですし…．

# 記述例

```sh:sieve.bc
x = read()
a[1] = 1
c = 0

for (i = 1; i <= x; i++)
  if (!a[i]) {
    if (i <= sqrt(x))
      for (j = i * i; j <= x; j += i) a[j] = 1
    c += 1
    r[c] = i
  }

c
r[c-1]
```

# 実行例

次の実行環境にて，百万までの素数の個数と最大の素数を表示しています．

* ASUS Zenfone 5: Qualcomm Snapdragon 636 1.8GHz, 6GBメモリ
* Android 9 + Termux + AnLinux(Debian GNU/Linux 10) + GNUbc1.07.1

```sh
$ time bc sieve.bc <<< 1000000
78498
999979

real    0m2.907s
user    0m2.860s
sys     0m0.000s
```

# 備考

## 更新履歴
* 2022-01-12：アルゴリズムおよび実行例（百万までの素数）の変更
* 2022-01-03：素数一覧を求めていなかった箇所その他を修正
* 2022-01-02：元記事より分離
オブジェクトが破壊されたらその周辺を吹き飛ばす

### 1.はじめに
地雷・機雷で爆発させるのはいいが、爆風などで周辺を巻き込むことはできないかと思い調べたら方法があったので、アウトプットする

### 2.やり方

赤Cube：爆発の中心
白Cube：障害物。RigidbodyをAddComponent・TagをCubeに設定

という形で配置をした。白CubeにはRigidBodyをコンポーネント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/9572a79f-0af0-1362-ce31-4d55cfdaf3f5.png)

###3.スクリプト
以下のスクリプトを作成して赤CubeにAddComponentする。

~~~c#
public class Explosion : MonoBehaviour
{
    public float radius = 5;
    public float upwardModifier = 0f; 
    public float explosionPower = 100; 

    void Start()
    {
        Destroy(gameObject);
    }

    private void OnDestroy()
    {
        Collider[] col = Physics.OverlapSphere(gameObject.transform.position, radius);

        foreach (var colliders in col)
        {
            if (colliders.gameObject.tag == "Cube")
            {
                colliders.gameObject.GetComponent<Rigidbody>().AddExplosionForce(explosionPower, gameObject.transform.position, radius, upwardModifier, ForceMode.Force);
            }
        }
    }
}
~~~

###4.OverlapSphere
~~~c#
Collider[] col = Physics.OverlapSphere(gameObject.transform.position, radius);
~~~

**transform.position(中心)から半径radius(m)の球体にあるColliderを配列で返す**

実際に配列に入っているのかわからないので、すぐ下に以下を追加して確認してプレイしてみる

~~~c#
for (int i = 0; i < col.Length; i++)
{
      Debug.Log(col[i].transform.position);
}
~~~

プレイした結果しっかりと配列に格納されていることがわかる（原点はTerrain）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/1374df41-7f32-d402-f87b-2121607ab53c.png)

###5. AddExplosionForce


~~~C#
foreach (var colliders in col)
{
      if (colliders.gameObject.tag == "Cube")
      {
          colliders.gameObject.GetComponent<Rigidbody>().AddExplosionForce(explosionPower, gameObject.transform.position, radius, upwardModifier, ForceMode.Force);
      }
}
~~~

名前のとおりRigidbodyを使って爆発を再現する。配列なのでForeach・For等を使う。
AddExplosionForceの中身は以下を参照

~~~C#
AddExplosionForce(爆発力(float), 爆発の中心(Vector3), 爆発の半径(float), 爆発による上昇値(float), ForceMode)
~~~

Tagは周辺にRigidbodyが付いていないオブジェクトがある場合MissingComponentExceptionが出る。

###6.結果

![ice_video_20220102-152433_edit_0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/ad75fc15-c722-f64f-7fc0-249b425c5b86.gif)

###7.まとめ
爆発させるアセットと組み合わせれば、かなり見栄えの良いものができると思う。ただ遮蔽物を通した場合に影響されないケースも考慮しないといけないので、それらも今後加筆しておく。
ddの進捗を最初から表示する

あまりなかった気がするので

# 結論
最後に`status=progress && sync`をつければ良い

```sh
dd if=xx of=xx status=progress && sync
```

# 参考

https://wiki.archlinux.jp/index.php/USB_%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2#GNU.2FLinux
databricks notebookで将棋の盤面を表示する(SVG)


# はじめに

こちらの山岡さんのブログ「[Pythonで将棋の盤面をSVGで表示する](https://tadaoyamaoka.hatenablog.com/entry/2019/08/17/163308)」をdatabricksのnotebook上で試してみました。

**ライブラリのインストール**

```
%pip install cshogi
```

```
from cshogi import *
board = Board()
board
```

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/c654a06a-450a-148f-60c3-106d44d858a7.png' width='400' />

表示はできましたが、ブログのイメージと違いますね。Google Colab だとこのあたりをよろしくやってくれるようです。
データブリックスではSVGを表示するのに　`displayHTML` という関数が用意されているためこれを利用してみます。

エラーになってしまいました。SVGフォーマットで引き渡さないとダメぽいですね。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/5708bbf1-ce80-8628-89f6-0525109b10a4.png' width='600' />

cshogiのライブラリーをチェックしていたら、 to_svg() という関数がありました。これを使ってみます。

```
board = Board()
displayHTML(board.to_svg())
```

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/50eeb317-e3bd-d2f7-2a49-fc00c3878e38.png' width='600' /> 

これで見やすくなりました。
コマを少し動かしてみます。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/c7f57e3f-4574-d9c1-3bad-fec24947b8a9.png' width='700' /> 


残念ながらtutorialにあった web appは、google colabのモジュールが必要となりうまく動かせられませんでしたが、このcshogiライブラリ非常に面白いです。本当に感謝。

## About cshogi
cshogiは、盤面管理、合法手生成、指し手の検証、USIプロトコル、および機械学習向けフォーマットのサポートを備えた高速なPythonの将棋ライブラリです。
https://github.com/TadaoYamaoka/cshogi
PHPでNullバイトアタック対策

　新年初めてのコード書き始めを行っていて。とりあえず、PHPのNullチェックを作ってみた

```php
class Secure {
	// Null Byte Check.
	public function sanitizer($arr) {
		array_walk_recursive($arr, function($val, $key) {
			if (preg_match('/\0/', $val) === 1) {
				// エラー処理.
			}
		});
	}
}
```

　良くある、array_mapのルーチンよりかはスマートかと。「Nullバイトがあるデータがあるのが変なので、そのデータは弾け」おじさんが居たので、そう実装してみました。手動で簡単なテストもしてます

　今年も、よろしくお願いします:blush:
競技プログラミングでの標準入力

真面目に取り組み始めたばかりでよく忘れるので整理（Atcoder:灰色）

```python:入力1
a = input() # <= 'abc'
print(a) # abc
```

```python:入力2
b = int(input()) # <= '10'
print(b) # 10
```

```python:入力3
c, d = input().split() # <= 's t'
print(c) # s
print(d) # t
```

```python:入力4
e, f = map(int,input().split()) # <= '10 20'
print(e) # 10
print(f) # 20
```

```python:入力5
g = input().split() # <= '1 2 3 4 5'
print(g) # ['1', '2', '3', '4', '5']
```

```python:入力6
h = list(map(int, input().split())) # <= '1 2 3 4 5'
print(h) # [1, 2, 3, 4, 5]
```
『エラトステネスの篩』の記述例（awk版）

[元記事](https://qiita.com/ytaki0801/items/40060bdad04edcd1bd3c)より分離しました．趣旨は元記事と同じく『「[エラトステネスの篩](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)」だとこれだけ速く[素数](https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0)が求まる！』ですが，仕様・処理系に大きな制約のあるプログラミング言語については，他の言語との比較を避けるため，個別記事としている次第です．

# 記述例

```sh:sieve.awk
BEGIN {
  getline x
  a[1] = 1
  c = 0

  for (i = 1; i <= x; i++)
    if (!a[i]) {
      for (j = i * i; j <= x; j += i) a[j] = 1
      r[c] = i
      c++
    }

  print c
  print r[c-1]
}
```

# 実行例

次の実行環境にて，百万までの素数の個数と最大の素数を表示しています．

* ASUS Zenfone 5: Qualcomm Snapdragon 636 1.8GHz, 6GBメモリ
* Android 9 + Termux + AnLinux(Debian GNU/Linux 10) + mawk1.3.3

```sh
$ time awk -f sieve.awk <<< 1000000
78498
999983

real    0m5.335s
user    0m5.080s
sys     0m0.120s
```

# 備考

## 更新履歴
* 2022-01-12：アルゴリズムおよび実行例（百万までの素数）の変更
* 2022-01-02：素数一覧を求めてなかった箇所を修正
* 2022-01-02：元記事より分離
『エラトステネスの篩』の記述例（bash版）

[元記事](https://qiita.com/ytaki0801/items/40060bdad04edcd1bd3c)より分離しました．趣旨は元記事と同じく『「[エラトステネスの篩](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)」だとこれだけ速く[素数](https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0)が求まる！』ですが，仕様・処理系に大きな制約のあるプログラミング言語については，他の言語との比較を避けるため，個別記事としている次第です．なお，POSIXシェルによるシェルスクリプト版は[別記事](https://qiita.com/ytaki0801/items/6a939fa636397c886415)としています．

# 記述例

```bash:sieve.bash
read x
a[1]=0
c=0
r=()

i=1
while [ $i -le $x ]
do
  case ${a[$i]} in ("")
    j=$((i*i))
    while [ $j -le $x ]
    do
      a[$j]=0
      j=$((j+i))
    done
    c=$((c+1))
    r+=($i)
  ;;esac
  i=$((i+1))
done

echo $c
echo ${r[$c-1]}
```

# 実行例

次の実行環境にて，十万までの素数の個数と最大の素数を表示しています．

* ASUS Zenfone 5: Qualcomm Snapdragon 636 1.8GHz, 6GBメモリ
* Android 9 + Termux + AnLinux(Debian GNU/Linux 10) + bash5.0.3

```sh
$ time bash sieve.bash <<< 100000
9592
99991

real    0m4.717s
user    0m4.630s
sys     0m0.020s
```

# 備考

## 更新履歴
* 2022-01-12：アルゴリズムおよび実行例（十万までの素数）の変更
* 2022-01-02：元記事より分離
機械学習でPyCaretを使ってみる

## １はじめに
[PyCaret](https://pycaret.org/)は、Pythonのオープンソースの機械学習ライブラリです。
データの前処理、モデル（アルゴリズム）の比較、チューニングの自動化をしてくれます。

## 2　環境・バージョン
PyCaret 2.3.5
Google Colaboratory

## 3 PyCaretのインストール
```
!pip install pycaret
```
## 4　データセットの取得

```
from pycaret.regression import *
from pycaret.datasets import get_data
```
・Diamndのデータを取得

```
dataset = get_data('diamond')
```
![スクリーンショット 2021-12-30 0.09.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/ebc736fa-8726-67c1-029d-34284e1b9bef.png)

## 5　集計対象を指定
・集計対象をPriceに指定。
・項目のデータタイプがあっているかを確認して下に表示される四角い箱でEnter。
・この操作で前処理が自動でセットアップしてくれている。
・Priceの後ろに,をつけると設定情報が表示されて確認できる。

```
exp = setup(dataset,target='Price')
```
![スクリーンショット 2021-12-30 0.13.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/5a5dafc0-2b35-bc5d-4089-e28d422d825b.png)


## ６　モデリングの比較をする
・モデリングのアルゴリズムを比較してくれる。
・R2 決定係数が高い順で並ぶ。今回は、Extra Trees Regressorが一番良い結果となった。
・一番下にExtra Trees Regressorのパラメーターが表示される。

```
compare_models()
```
![スクリーンショット 2021-12-30 0.15.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/e92f67ac-3ac1-87b0-1bf4-2d046edbf9b6.png)

## ７　モデルを指定する
```
model = create_model('et')
```
・交差検証（[クロスバリデーション](https://aiacademy.jp/media/?p=263)）を行なってくれる。
・それぞれの指標を試してみて平均の結果が出る。createを使うとクロスバリデーションを実行できる。

```
print(model)
```
print(model)でmodelのパラメーターが確認できる![スクリーンショット 2021-12-30 0.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/7097be0b-618c-1ad0-b848-c42566ce5591.png)
## ８　ハイパーパラメーターのチューニング
・チューニングしたモデルをtuned_modelに入れる。

```
tuned_model=tune_model(model)
```
![スクリーンショット 2021-12-30 0.23.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/ad77f779-7529-246f-697e-6c909bb95897.png)


## ９　学習済みモデルで予測を行う

ここでは、6000行を７：３（1800行）で分けて入っていて実際のPriceに対してLabelがどれくらいずれているか確認する。このデータではおおむね価格を予想できていると言える。

```
predict_model(tuned_model)
```

![スクリーンショット 2021-12-30 0.26.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/525c5de9-2aa5-3527-8dba-5752d9e91073.png)

## １０　結果のプロット
実際の値からどれくらい離れているかの誤差について残差で表示される。0を中心にばらつきが少ない良い結果になっている。
![スクリーンショット 2021-12-30 0.28.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/e5a21824-cc32-bd52-f2d2-c6d3a587f9ea.png)

## １１　特徴量ごとの重要度をプロット
Carat Weightが一番重要度が高い結果となった。

```
plot_model(tuned_model, plot='feature')
```
![スクリーンショット 2021-12-31 13.40.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256115/41af75f6-cfaf-9888-3c94-2f984401eb6b.png)
【Flutter】Error: Not a constant expression.

# Error: Not a constant expression.

このエラーは日本語で「定数式ではありません」という意味です。

このエラーを起こすことができるコードはこちらです。

```dart
// fail
var a = 'hello';
const b = a;
```

エラーの原因は修飾子の`const`を付けている`b`という変数に`a`という変数を代入しようとしたからです。
`const`を付けるとコンパイル時に式が評価されるため、実行しないと値が確定しない変数を入れることはできません。
そのため、下記のように`const`の変数は代入することができます。

```dart
// success
const a = 'hello';
const b = a;
```

また、`final`は実行時に式が評価されるため、下記のように値が確定していない式を代入することができます。`final`を`const`に変更するとエラーが発生します。

```dart
// success
import 'dart:math';
final c = Random().nextBool();
```

# 参考

https://dart.dev/guides/language/language-tour


間違えている箇所があったら指摘してもらえると助かります。
Selenium(ver.3)のインストール〜Chrome Driverの実行まで(Windows 10)

# 概要
- Webスクレイピングに使用するSeleniumのversion3のインストールと、Chromeブラウザをプログラムで動かす為のドライバーの実行までの手順を記載します。

# 環境
- OS: Windows10
- Jupyter Notebookをインストール済み　　  
※以下URLの手順を　実行済みであること  

https://qiita.com/takayuki_matsukawa/items/1466e2b2e375277fb739

# 準備事項
### selenium(version.3)のインストール
1. Windowsの検索バーで、"コマンドプロンプト"と検索し、コマンドプロンプトというアプリを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/9246e99f-5ca3-7b0d-fb0f-67800bfaa29a.png)

2. コマンドプロンプトで、以下コマンドを実行し、seleniumをバージョン指定してインストールする

```
pip install selenium==3.141.0
```
下記のようにSuccessfullyという文言がありましたら、問題なくインストール出来ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/a8db3a59-b327-1e7c-a535-3a5f762273c4.png)

※ここでエラーになってしまう方は、"コマンドプロンプト"ではなく、"Anaconda Prompt"に置き換えて、上記手順を再度実行してみてください。

### Chrome Driverのダウンロード
Pythonを使ってGoogle Chromeを操作する際に使う、Chrome Driverをダウンロードしにいきます。
1. Google Chromeで以下URLにアクセスし、使用しているChromeのバージョンを確認します。  
chrome://settings/help
![スクリーンショット 2022-01-02 14.01.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/d3dea8c7-0d0b-fe84-839c-a7e96f68b321.png)

2. 以下URLにアクセスします。
https://chromedriver.chromium.org/downloads  

3. 先ほど確認したバージョンと、同じ番号のページにアクセスする。
※全く同じ番号がない場合については、末尾の番号が一番近いものを選びます。
　(今回でいうと、96.0.4664.45.**まで同じもの)
![スクリーンショット 2022-01-02 14.03.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/e0237197-3f50-2f86-9cba-152e4958e8a3.png)

4. 各プラットフォームのファイルがあるが、Windows用はwin32と書いてあるファイルであるため、"chromedriver_win32.zip"をダウンロードします。
![スクリーンショット 2022-01-02 14.05.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/f4faa1d2-3422-23cb-cd3c-a1543c137be4.png)

5. ダウンロードしたzipファイルを解凍します。

# 動作確認
1. 作業用フォルダを、任意の名前で、任意の場所に作成する。  
(例：デスクトップにworkという名前でフォルダを作成する)  
2. 作成したフォルダに、先ほど解凍したChrome Driverを格納する。
3. Windowsの検索バーで、"コマンドプロンプト"と検索し、コマンドプロンプトというアプリを起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/9246e99f-5ca3-7b0d-fb0f-67800bfaa29a.png)
4. 以下コマンドを実行し、Jupyter Notebookを開く。 

```
jupyter notebook
```
5. Chromeでjupyter notebookが開いたあと、先ほど作成した作業用フォルダに移動する。
※jupyter notebookではデスクトップなどが、英語名になっているので注意  
![スクリーンショット 2022-01-02 14.13.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/f6513c56-de59-6343-39c4-1ae9b5b07633.png)
6. 作業フォルダまで移動できたら、画面右側にあるNewボタンを押下し、"Python 3"を選択する。
![スクリーンショット 2022-01-02 14.15.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/47322ca2-350f-3e6d-1ff1-6328df15765f.png)

7. 以下コードをjupyter notebookで、１行ずつ入力しRunボタンを押下し、実行する。
(1行目入力した後、Runボタンを押していただくと、2行目が入力できるようになります)
```
from selenium import webdriver
driver = webdriver.Chrome()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/b97cd156-b27e-d55d-cd48-e325e58c43ec.png)

8. Chromeのウィンドウが立ち上がり、そのChromeに以下のようなメッセージが表示されていれば成功です。  
※Windowsで最初の実行の場合、セキュリティに止められることがありますので、許可した上で、再度上記コードの2行目の実行をお願いいたします。）
![スクリーンショット 2022-01-02 14.26.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2447513/bf00d4ba-fa79-1577-e45b-636ee965f4d1.png)
ターミナルでの出力結果をコピーしたい(Mac)

# ターミナルでの出力結果をコピーしたい(Mac)

### 概要
ターミナルの出力結果をpbcopyコマンドに入力することでコピーすることができる．

### ex1.) treeコマンドの出力結果をコピー

```zsh
❯ tree | pbcopy
❯ pbpaste
.
├── Articles
│  └── ターミナルの出力結果をコピーしたい(Mac).md
├── LICENSE
└── README.md
```

README.mdに書くことがない時に，treeの出力結果を`pre`タグで囲むといい感じになる．
ターミナル上で出力結果を表示するために`pbcopy`の対となる`pbpaste`コマンドを使用しているが，`Command+v`でペースト可能である．

### ex2.) ファイルの内容をコピー

```zsh
❯ cat ~/.ssh/github.pub | pbcopy
```

GitHubの公開鍵をコピーするのに役立つ．くれぐれも秘密鍵をコピーしないように．

### ex3.) 作業ディレクトリのパスをコピー

```zsh
❯ pwd | pbcopy
```

pwd は print working directory の略である．
`git mv`など，ファイルのパスを正しく入力したいときによく用いる．

### aliasの設定
毎度コピーするごとに`pbcopy`と入力するのが億劫なので，aliasを設定する．
`~/.zshrc`に以下の行を追記．

```sh
alias pb='pbcopy'
```

pb は`pasteboard`の略である．
alias名は何でもいいが，自分がわかりやすいものがいい．

:::note warn
aliasの = 間に半角空白を入れてはいけない．詳しくはシェルスクリプトを参照．
:::

### 終わりに
本記事は個人的な備忘録を修正したものです．至らぬ点があるかと思いますがご了承ください．
『エラトステネスの篩』の記述例（シェルスクリプト版）

[元記事](https://qiita.com/ytaki0801/items/40060bdad04edcd1bd3c)より分離しました．趣旨は元記事と同じく『「[エラトステネスの篩](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)」だとこれだけ速く[素数](https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0)が求まる！』ですが，仕様・処理系に大きな制約のあるプログラミング言語については，他の言語との比較を避けるため，個別記事としている次第です．なお，ここでのシェルスクリプトはPOSIX準拠シェルのそれを指し，bash版は[別記事](https://qiita.com/ytaki0801/items/3bb2d6ea2d3fca8a0bb7)としています．

# 記述例

※言語仕様に配列がないため，数字連番の変数を配列代わりとしています．

```sh:sieve.sh
read x
A1=1
c=0

i=1
while [ $i -le $x ]
do
  R=$((A$i + 0))
  case $R in (0)
    j=$((i*i))
    while [ $j -le $x ]
    do
      : $((A$j = 1))
      j=$((j+i))
    done
    c=$((c+1))
    r=$i
  esac
  i=$((i+1))
done

echo $c
echo $r
```

# 実行例

次の実行環境にて，一万までの素数の個数と最大の素数を表示しています．

* ASUS Zenfone 5: Qualcomm Snapdragon 636 1.8GHz, 6GBメモリ
* Android 9 + Termux + AnLinux(Debian GNU/Linux 10) + dash0.5.10.2

```sh
$ time dash sieve.sh <<< 10000
1229
9973

real    0m0.357s
user    0m0.330s
sys     0m0.010s
```

# 備考

## 更新履歴
* 2022-01-12：アルゴリズムおよび実行例（一万までの素数）の変更
* 2022-01-02：元記事より分離（コメントよりコード反映）
Next.js で緯度経度を使って Contentful 上の近隣エントリを取得する

### やりたいこと
Contentful を使ってカフェの口コミサイトのようなもの (https://www.cafeinmap.com) を作っているのですが、あるカフェの近隣カフェを取得したいと思っています。もう少し細かく書くと**「あるカフェから半径Xkm以内のカフェを距離の近い順に最大N件取得したい」**となります。

ちなみにフロント側はNext.jsで作っており、SSG (Server Side Generation)で呼び出される `getStaticProps()` 内で Contentful Content Delivery API から近隣カフェデータを取得することとします。

### やり方
フロント側のコードを記載します。位置情報を利用したクエリ[near]と[within]を同時に利用するのがポイントです。

なお、[contentful.js](https://contentful.github.io/contentful.js/contentful/9.1.5/index.html) を利用して Next.js からContentfulへアクセスしています。

```js
export const getStaticProps = async (context) => {
  /* 基準となるカフェデータ取得 */
  const entry_id = context.params.id //基準となるカフェIDはクエリパラメータで受け取る
  const data = await contentful.getEntry(entry_id)

  /* 近隣カフェデータ */
  const lat = data.fields.location.lat //基準となるカフェの緯度
  const lng = data.fields.location.lon //基準となるカフェの経度
  const radius = 10 //10km
  const near = await contentful.getEntries(
    {
      'content_type': 'cafe',
      'limit': 6,
      'sys.id[nin]': data.sys.id,  //基準となるカフェ自身は除外
      'fields.location[near]': lat + ',' + lng , //近隣絞り込み
      'fields.location[within]': lat + ',' + lng + ',' + radius //10km圏内絞り込み
    }
  )

  return {
    props: {
      cafe: data,
      near: near.items
    },
  }
}
```

上記のコードから実際にContentful Content Delivery APIに投げられるクエリは、curlコマンドで叩くとすれば以下のようになるはずです。

```bash
curl https://cdn.contentful.com/spaces/{space_id}/environments/{environment_id}/entries?access_token={access_token}&content_type=cafe&limit=6&sys.id[nin]={data.sys.id}&fields.location[near]={lat + ',' + lng}&fields.location[within]={lat + ',' + lng + ',' + radius}
```


### 参考
contentful.js: 
https://contentful.github.io/contentful.js/contentful/9.1.5/index.html

Contentful Content Delivery API:
https://www.contentful.com/developers/docs/references/content-delivery-api/
apscheduler(Advanced Python Scheduler)を使おうと思った時にwarningがでる。`The zone attribute is specific to pytz's interface; please migrate to a new time zone provider`

以下実行時に表題のwarningがでた時の解決策（回避策）

> [pythonのapschedulerでkeepaliveの練習する](https://qiita.com/seigot/items/9e52aa7f70da5c6457ed)

apschedulerについては以下

> [Advanced Python Scheduler](https://apscheduler.readthedocs.io/en/3.x/)
> Advanced Python Scheduler (APScheduler) is a Python library that lets you schedule your Python code to be executed later, either just once or periodically. 

`warning`は以下

```
`The zone attribute is specific to pytz's interface; please migrate to a new time zone provider`
```

以下の実装部分がwarning出している様子
> [https://github.com/agronholm/apscheduler/blob/v3.8.1/apscheduler/util.py#L95](https://github.com/agronholm/apscheduler/blob/v3.8.1/apscheduler/util.py#L95)
>         if obj.zone == 'local':

原因は以下のようにapscheduler内で使っているzoneinfoがdeprecatedであるためである様子

> [PytzUsageWarning: The zone attribute is specific to pytz's interface; please migrate to a new time zone provider](https://stackoverflow.com/questions/69776414/pytzusagewarning-the-zone-attribute-is-specific-to-pytzs-interface-please-mig)
> The problem is pytz is considered deprecated in favor of zoneinfo module and its backports. So even if you set directly timezone argument as suggested before, you'll probably face the same warning from some other places until apsheduler would fix pytz usage for modern Python version.

以下の通りtzlocalのバージョンが起因しているようなので、tzlocalのバージョンを更新すると解決した。

> [https://github.com/agronholm/apscheduler/discussions/570](https://github.com/agronholm/apscheduler/discussions/570)
> This happens with tzlocal 4.0. You can either (safely) ignore those warnings or downgrade tzlocal to 2.x. The problem is "properly" fixed on master but likely won't be in the 3.x branch.

```
pip3 install tzlocal==2.1
```

ただし、記載の注意点の通り、他の依存関係に影響あるかもしれないので注意

> But, please, pay attention it could break other project dependencies, so be careful.

#参考
[PytzUsageWarning: The zone attribute is specific to pytz's interface; please migrate to a new time zone provider](https://stackoverflow.com/questions/69776414/pytzusagewarning-the-zone-attribute-is-specific-to-pytzs-interface-please-mig)
[Advanced Python Scheduler](https://apscheduler.readthedocs.io/en/3.x/)
[https://github.com/agronholm/apscheduler/discussions/570](https://github.com/agronholm/apscheduler/discussions/570)
[PytzUsageWarning: The zone attribute is specific to pytz's interface; please migrate to a new time zone provider. #187](https://gitmemory.cn/index.php/repo/viniciuschiele/flask-apscheduler/issues/187)
配列のコピー(Ruby) 

Ruby3.0.0
<a href="https://docs.ruby-lang.org/ja/latest/class/Array.html">class Array</a>

```ruby
#配列の作成(配列の長さ,値)：全要素が同じ値を参照する。値が複製される訳ではないことに注意
a = Array.new(3,"foo")
#=> ["foo","foo","foo"]

#配列のコピー：要素を複製しない浅い複製
b = Array.new(a)
#=> ["foo","foo","foo"]

#全要素を複製する：各要素は違うオブジェクト
c = Array.new(3){"foo"}
#=> ["foo","foo","foo"]
c[0] = "fo"
#=> ["fo","foo","foo"]
```
C＃でFirebaseのStorageとRealtime Databaseを操作する

# この記事は?
EC2+Firebaseで作ったWebサイトで使用するメディアファイルをFirebaseにアップロードする機能が必要になったのでC#で作ることにした。
その中で使用したFirebase関連の処理を備忘を兼ねて記事にした。

# 使用するパッケージ
Firebaseを使用するためのパッケージはいくつかあるようだが、今回はFirebaseXXX.netを使う事にした。

https://github.com/step-up-labs/firebase-authentication-dotnet

https://github.com/step-up-labs/firebase-database-dotnet

https://github.com/step-up-labs/firebase-storage-dotnet

# 使用例
メディアファイルをStorageにアップロードして、そのファイルに関する情報をReal Time Databaseに登録する処理を例にする。

## 認証用のトークンを取得する
StorageとReal Time Databaseを使うにあたってFirebaseの認証を通してトークンを発行する必要がある。

```C#
using Firebase.Auth;

// 途中省略

var auth = new FirebaseAuthProvider(new FirebaseConfig("APIキー"));
var token = await auth.SignInWithEmailAndPasswordAsync("メールアドレス", "パスワード");
```

APIキーはFirebaseのプロジェクトの設定ページに表示されている「ウェブ API キー」を指定します。
トークンの発行方法はいくつか種類があるようですが、ここではメールアドレスとパスワードを使った一番単純なものを使いました。
## Storageにメディアファイルを登録する
取得したトークンで認証を通してStorageにファイルをアップロードする。

```C#
using Firebase.Storage;

// 途中省略

using (var fp = File.Open("ファイルのパス", FileMode.Open)){
    // ファイル登録
    var task = new FirebaseStorage("Storageのフォルダパス", new FirebaseStorageOptions
    {
        AuthTokenAsyncFactory = () => Task.FromResult(token.FirebaseToken)
    }).Child("ファイル名").PutAsync(fp);

    // アップロードの進捗が変わった時のイベント
    task.Progress.ProgressChanged += (s, e) =>
    {
        Console.WriteLine($"{e.Percentage}%");
    };

    // アップロードが終わるとダウンロードURLが発行される
    var downloadUrl = await task;
}
```

StorageのフォルダパスはStorageの管理画面に表示されている「gs://」で始まる部分から「gs://」を除いた部分。

## Realtime Databaseにファイル情報を登録する
取得したトークンで認証を通してRealtime Databaseにファイルの情報を登録します。

```C#
using Firebase.Database;

// 途中省略

var firebaseDB = new FirebaseClient(
    "Realtime DatabaseのURL",
    new FirebaseOptions
    {
        AuthTokenAsyncFactory = () => Task.FromResult(token.FirebaseToken)
    }
);

await firebaseDB.Child("データ名" + "/" + "キー").PutAsync(
    "{\"datetime\":\"" + time.ToString("yyyy/MM/dd HH:mm") + "\",\"title\":\"" + title + "\"}"
);
```

Realtime DatabaseのURLはRealtime Databaseの管理画面に表示されているURLです。
apacheがきどうできない。


状況
AWS EC2でWebサーバーを作りたい。
index.htmlに接続できるようにする。

参考
https://qiita.com/shtwangy/items/e290805f9ea44bda79aa#3-ec2%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%ABapache%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B



つまったところ
service httpd startを打ったら、画像のようなエラーが出た。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628630/69350e11-5c11-5e2e-9839-8b3409e9c36c.png)
Redirecting to /bin/systemctl start httpd.service
Failed to start httpd.service: The name org.freedesktop.PolicyKit1 was not provided by any .service files
See system logs and 'systemctl status httpd.service' for details.


解決策
service httpd startの頭にsudoをつける

感想
すごいシンプルな解決で、びっくりして思わずqiita書きました。
パーミッションエラーなら、すぐ気づいたのに。。

引用
https://m77.hatenablog.com/entry/2015/03/05/111930
[rejected] git push heroku master

# 何が起こったか
ローカルの変更(masterブランチ)をcomit。
そしてHerokuにpush。
→ここでGitのリモートにpushを忘れる。
[![Image from Gyazo](https://i.gyazo.com/7766329ae8fc2412f917e3c9f9230ef3.png)](https://gyazo.com/7766329ae8fc2412f917e3c9f9230ef3)

その後、ローカルで再度変更をし、commit。
そしてGitリモートにpush。
[![Image from Gyazo](https://i.gyazo.com/ecbe6e164221d3ddcb285333e6db3bb4.png)](https://gyazo.com/ecbe6e164221d3ddcb285333e6db3bb4)

ここで、Gitリモートにpusbhした変更をherokuにpushしようと、「git push heroku masterを実行。
→以下のエラーが出る。

```
 % git push heroku master
To https://~ 略 ~.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://~ 略 ~.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
```

# どうしてそうなったか
[![Image from Gyazo](https://i.gyazo.com/9d7f1eff0ffd6be4c7a3b3e76285adc2.png)](https://gyazo.com/9d7f1eff0ffd6be4c7a3b3e76285adc2)
herokuにpushしたcommitを、Gitリモートにpushし忘れたため、
上記のようにズレが生じた。
そのため、「前回の変更が抜けてるブランチなので・・・」とお断りされたと考える。

# どう解決したか

以下を実行し、ローカルのcommit履歴を追加。


```
git pull heroku master
```


[![Image from Gyazo](https://i.gyazo.com/2d934ce7e07bf41166a96d22af4e7616.png)](https://gyazo.com/2d934ce7e07bf41166a96d22af4e7616)


そしてGitリモートにpushした。

これで、Gitリモートに 「commitピースの欠け」がなくなり、
無事[git push heroku master」が成功！


# 感想
GitとHerokuの関連の理解の深めていきたいなぁと思ったエラーだった。
見えない部分で何をしてくれているか、
少しでも仕組みを理解していれば、
エラー解決も早いだろうし、
そもそもエラーを回避できるのだとうと感じた。
備忘録：「saveメソッド」と「save!メソッド」の違い

## saveメソッドとは
DBにデータを保存するメソッド。（インスタンスメソッドです。）

※ちなみにsaveはActiveRecordの基本メソッドです。


## 「saveメソッド」と「save!メソッド」の違い
saveメソッド：
保存に成功した場合→trueを返す
保存に失敗した場合→falseを返す
※saveメソッドを使う場合は、if/else文で「保存できた場合」と「保存できなかった場合」とで処理をわけると良い。

save!メソッド：
保存に成功した場合→trueを返す
保存に失敗した場合→例外を発生させる
※保存に失敗した場合の処理はrescue節で行う必要がある。

>引用元：
>https://techacademy.jp/magazine/22082
>http://www.code-magagine.com/?p=9275