OmniAICreator/Qiita-1.07M huggingface dataset:
[Python] __repr__メソッドをカスタマイズする

# インスタンスのprint表示をカスタマイズしたい

自分でクラスを作る。

```python
class Dummy():
    def __init__(self, argument, *args, **kwargs):
        # インスタンス変数
        self.argument = argument
        self.arg1 = args[0]

    def fit(self):
        pass

    def predict(self):
        pass
```

これをprintすると、、

```python
print(instance)

# <__main__.Dummy object at 0x7ff7177d8990>
```
ななな、なんじゃこら。

こんなふうに引数を表示したい。。。

```python
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier(max_depth=2, random_state=0)
print(clf)

# RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
#                        criterion='gini', max_depth=2, max_features='auto',
#                        max_leaf_nodes=None, max_samples=None,
#                        min_impurity_decrease=0.0, min_impurity_split=None,
#                        min_samples_leaf=1, min_samples_split=2,
#                        min_weight_fraction_leaf=0.0, n_estimators=100,
#                        n_jobs=None, oob_score=False, random_state=0, verbose=0,
#                        warm_start=False)
```
Scikit-learn likeのAPIをつくるなら、`sklearn.base`の配下のクラス（`base.ClassifierMixin`、`base.RegressorMixin`等）を継承すればよいが、自分でカスタムしたいという人もおられるだろう。そんなときは、特殊メソッドの`__repr__`を書き換えれば良い。

`__repr__`はオブジェクトの公式な文字列表現である。[公式](https://docs.python.org/3.3/reference/datamodel.html#object.__repr__)には、この表現を見れば元のオブジェクトを再生成できるように表示すべし、と書いてある。まさにscikit-learnのようにすべしということである。

```python
class State:
    _defaults = {"A": 1, "B": 2}

    def __init__(self, argument, *args, **kwargs):
        # インスタンス変数
        self.argument = argument
        self.arg1 = args[0]
        # クラス変数
        self.__dict__.update(self._defaults)
        # キーワード引数
        self.__dict__.update(kwargs)

    def __repr__(self):
        kws = [f"{key}={value!r}" for key, value in self.__dict__.items()]
        return "{}({})".format(type(self).__name__, ", ".join(kws))

    def __eq__(self, other):
        return self.__dict__ == other.__dict__  # you might want to add some type checking here
```

```python
instance1 = State('a', 'b')
print(instance1)

# State(argument='a', arg1='b', A=1, B=2)
```
インスタンス変数ではないが、表示したいものは`self.__dict__`に辞書で登録する。

インスタンス変数に後から追加したものも表示される。

```python
instance1.name = 'name'
print(instance1)

# State(argument='a', arg1='b', A=1, B=2, name='name')
```
上の例では`__eq__`メソッドも実装してあるので、インスタンスの比較は引数の比較になるぞ。

```python
instance1 = State('a', 'b')
instance2 = State('a', 'b')
instance3 = State('c', 'd')

print(instance1 == instance2)  # True
print(instance1 == instance3)  # False
```

## 参考
https://stackoverflow.com/questions/67327282/extend-dataclass-repr-programmatically
git で push 前の古い(最新じゃない)コミットメッセージを変更する方法

# 背景
* 古いコミットメッセージにプロジェクト名を追記したい。

# 手順
## 修正したいコミットまでの数を確認
```bash
$ git log

# コミット番号は省略
    [nest-retrospective] first commit  # ← 最新のコミット（1番目）

    DailyReview機能、WeeklyReview機能作成 # ← 修正したいコミット

    first commit
```

* 一番新しいコミットを1とする。
* `git rebase -i HEAD~n` の`n`には、修正したいコミットまでの数字が入る。
* 今回、最新のコミットから数えて2番目のコミットを変更したいので`n`は`2`となる。

```bash
$ git rebase -i HEAD~2

# 最新のコミットから２つまでのコミットが表示される
pick 2520311 DailyReview機能、WeeklyReview機能作成
pick 228e7f4 [nest-retrospective] first commit
```

* vimエディタが開くので、`i`を押して入力モードに切り替える。
    * エディタの下側に `--INSERT--`が表示される。


# 修正したいコミット先頭の`pick`を`edit`に書き換える。

```bash
edit 2520311 DailyReview機能、WeeklyReview機能作成
pick 228e7f4 [nest-retrospective] first commit
```

* `esc`（コマンドモードに切り替わる）→`:`→`w`→`q`（ファイルを上書き保存しvimエディタを終了）→`Enter`

# コミットメッセージを修正

```bash
$ git commit --amend -m "[nest-test] DailyReview機能、WeeklyReview機能作成"
```

# rebase処理を再開
```bash
$ git rebase --continue
Successfully rebased and updated refs/heads/main.
```

# コミットメッセージを変更できたか確認
```bash
$ git log

Date:   Tue Oct 12 12:13:53 2021 +0900

    [nest-retrospective] first commit


Date:   Mon Oct 11 17:06:23 2021 +0900

    [nest-test] DailyReview機能、WeeklyReview機能作成 # ← 無事変更されてる


Date:   Sun Sep 26 18:49:07 2021 +0900

    first commit
```

# 参考サイト
* [Git commit メッセージの変更方法](https://qiita.com/kenose0328/items/185f7e8634d816c85a84)
* [Gitのコミットメッセージを後から変更する方法をわかりやすく書いてみた](https://www.granfairs.com/blog/staff/git-commit-fix)
* [git rebase についてまとめてみた](https://qiita.com/KTakata/items/d33185fc0457c08654a5#git-rebase---continue)
ABC195 C - Comma を解いた

https://atcoder.jp/contests/abc195/tasks/abc195_c

![abc195_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/3685e997-8825-e581-aa41-af231639d45d.png)
![abc195_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/970bfc2b-2317-3326-2ca1-d7cf79d4b9b5.png)

右から数えて  1 つ目のコンマ
右から数えて  2 つ目のコンマ
右から数えて  3 つ目のコンマ
右から数えて  4 つ目のコンマ
右から数えて  5 つ目のコンマ

と分けてカウントしてみた。

```abc195c.py
N = int(input())
cnt = 0
if len(str(N))>3:
    cnt += N-999
    if len(str(N))>6:
        cnt += N-999999
        if len(str(N))>9:
            cnt += N-999999999
            if len(str(N))>12:
                cnt += N-999999999999
                if len(str(N))>15:
                    cnt += N-999999999999999

print(cnt)
```
【備忘録】HTML 5のデータ属性を使う



## はじめに

- HTML 5 では、要素と関連するけど定義なしのデータを簡単にデータ属性を使って保存できる。
- *data-*属性をつけることで、簡単に HTML 要素に追加の情報として保存することで無駄にクラスを作ったり、意味のない要素を作らなくてよい、カスタムでの属性を作れる。
- String 型(JSON 等 String にエンコードできるものはなんでも保持できる。)
- サーチエンジンなどの外部システムからは無視される。

### 文法

*data-*から始まる全ての属性がデータ属性となる。
視覚的に表現しなくてもいいような情報を入れるのに使う。HTMLの要素とか他の属性と被らなければ自由に設定可能。

```html
<article
  id="electric-cars"
  data-columns="3"
  data-index-number="12314"
  data-parent="cars"
>
  ....
</article>
```

### JavaScript からアクセス

```js
// 1. HTML要素取り出す
const article = document.querySelector("#electric-cars");

// 2.datasetオブジェクトを使用してプロパティを取得する
article.dataset.columns; // "3"
article.dataset.indexNumber; // "12314"
article.dataset.parent; // "cars"

//datasetオブジェクトで取得するプロパティはStringであり、上書き可能。
article.dataset.columns = 5; // -> "5"
```

### CSS からのアクセス

```css
/* arrtibuteを指定してのスタイリングも可能*/
article[data-columns="3"] {
  width: 400px;
}
article[data-columns="4"] {
  width: 600px;
}
```

データ属性はゲームのスコアなど、よく変化する情報のために使える。

### 参照

[MDN](https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes)
[sitepoint](https://www.sitepoint.com/use-html5-data-attributes/)
【第九回】コロナ禍だから何かできることをー　自宅療養者連絡ツール　ー

#前回までのあらすじ
[【第八回】コロナ禍だから何かできることを](https://qiita.com/STYLE-D/items/c32e9098a3948e8f32f2)

####実装イメージ図
LINEを利用して保健所の担当者の負担を軽減するとともに、自宅療養者はいつでもつながっている安心感を持たせるためのツールイメージです。
![メイン.00_00_51_12.Still002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/cf85391e-aef8-5a59-0a1d-63d8e15412ce.jpeg)

今回が最後なので、まとめていきたいます。

#イメージ動画
まずは、第１回でも公開したイメージ動画です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/huckVYRFGzE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

##このアプリで期待できる効果

###・コロナ感染した自宅療養者の不安や寂しさを解消
LINEで担当者（保健所職員）とつながっていることや、
自動でシステムに管理してもらっていることから、
今までより格段に速く異常を察知できます。
そのため、一人という不安から解消されるはずです。

###・担当者（保健所職員）の負担軽減
第５波の時、自宅療養者が格段に増えたとき、担当者は毎日確認の連絡や訪問を行っていました。
それにより、１人辺りの担当人数がキャパシティをオーバーし、長時間労働をする形になりました。
今回、初めて知ったのですが、緊急時の場合は36協定等が適用外になるそうです。
つまり、緊急事態が解除されるまで働き続けることもありうるそうです。

そのため、このシステムで管理することにより、本当に連絡が必要な人を判断するこができ、
無症状の人を含めた全員に連絡をする必要がなくなるのです。
このことで、病院の手配や他の必要な業務にまわることができます。

##システム構成まとめ
![システム構成-まとめ１.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/535a1067-53e8-e498-2e3a-7511f2b36cf4.jpeg)

構成自体はシンプルです。

<b><font color="#f00">地区ごとに作業者と利用者を登録し、利用者の状態を履歴で保存し、異常を検知したら連絡をする。</font></b>

##いまさらながら、システムの流れ
地区と作業者は登録されているものとします。

１．陽性が判明すると、病院などから保健所へ連絡がきます（ここは憶測）
２．連絡を受けた保健所の担当者はこのシステムに利用者の登録をします。
３．保健所の担当者は陽性者へ連絡をします。
　　この時に、２で登録したユーザーコードを渡します。
　　※メールでも、QRでもなんでもOK（ここは未実装）
４．陽性者はLINEのチャンネル登録後に伝えられたコードを入力します（ここで連携済）
５．陽性者は自宅待機中は常に症状の報告をします。
６．保健所の担当者は陽性者の登録パターンによって変えます。
　　　・LINEの連携がない場合は今まで通り
　　　・LINEの連携がある場合は異常になるか状態が変化するまで待機
７．保健所の担当者は陽性者の状態が変化したら状態を更新する。
　　　・未連絡、自宅待機、入院、その他
　　　未連絡・自宅待機は管理対象
　　　入院・その他は管理対象外

８，今回は、管理対象の陽性者から１２時間以上連絡がない場合は注意喚起、
　　２４時間以上連絡がない場合は警告を画面上に表示するとともにメールを送信
　　※LINE連携がない陽性者は保健所の担当者が電話連絡や訪問を行い、画面上から登録します。

#さいごに
ニュースとかみてて、孤独死や保健所の担当者が大変な場面を見ました。
この時、自分には何ができるのかと思ったのですが、システム開発しかできません。
なので、ITの力で解決できるためにはを考えていたらこの仕組みを思いつきました。

この仕組み自体、だれでも思いつくし、だれでも実装できるのでもっと世の中に広まればいいのにって思いで公開に至りました。
第６波が来るのか来ないのかはわからないですが、仮に来たら第５波以上になることは確実です。
医療崩壊もそうですが、役所崩壊にならないことを祈るばかりです。



#コロナ禍だから何かできることをー　自宅療養者連絡ツール　ー
[【第一回】実装イメージ図と動画](https://qiita.com/STYLE-D/items/743bbecae1c52be15505)
[【第二回】LINEからデータを取得して返すまでの流れ](https://qiita.com/STYLE-D/items/9e0addd8df44be8590b7)
[【第三回】LINEからデータベースまでの流れ](https://qiita.com/STYLE-D/items/345e9142948c00330e71)
[【第四回】データベースへの更新までの流れ](https://qiita.com/STYLE-D/items/8af17d7f94f5c351ede0)
[【第五回】ユーザー登録の仕組み-LINEbotの設定部分](https://qiita.com/STYLE-D/items/a745bd5faeb68caa1d7c)
[【第六回】ユーザー登録の仕組みLIFFで表示する画面の開発](https://qiita.com/STYLE-D/items/321038c8028eb9e9231f)
[【第七回】データベースの構造](https://qiita.com/STYLE-D/items/71085dc9a04042f33f0e)
[【第八回】WEB画面上でできる機能](https://qiita.com/STYLE-D/items/c32e9098a3948e8f32f2)
->>[【第九回】まとめ](https://qiita.com/STYLE-D/items/77eb6a8e61ae2201565f)
zypperの簡易的なまとめ

# zypper(ZYpp/libzypp)とは
おもにopenSUSE、SLES(SUSE Linux Enterprise Server)で使われるパッケージマネージャです。
[Wikipedia](https://en.wikipedia.org/wiki/ZYpp)

## 筆者の環境
![1634016803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269735/a9f6ab25-2605-3901-3205-3c25d2982446.png)


## おもなつかいかた(括弧内は略なし)
```console
# zypper in (install) package-name
---パッケージをインストールします。
# zypper se (search) package-name
---パッケージを登録済みのリポジトリ内から検索します。
# zypper rm (remove) package-name
---パッケージを削除します。
# zypper up (update) 
---パッケージを更新します。
# zypper up --allow-vendor-change
---ベンダ変更を伴うアップデート処理を行います
# zypper dup (dist-upgrade)
---ディストリビューションのアップデート処理を行います。
```
追記: 以下のパッケージはインストールしません 的なメッセージになやまされている人は[こちら](https://qiita.com/Nick_san_/items/a8a31211d40b8399fa54)

## リポジトリかんけい (括弧内は略なし)
```console
# zypper ref (refresh)
---すべてのリポジトリを更新します。
# zypper repos
---登録済みのリポジトリの一覧を表示します。
# zypper ar (addrepo)
---リポジトリを登録します。
# zypper rr (removerepo)
---リポジトリを削除します。
# zypper mr -d repo-name
---リポジトリを無効にします
# zypper mr -e repo-name
---リポジトリを有効にします
```

マアれぽ関連はYaSTでイジったほうが明快かもネ

CDNを用いたパッケージ提供もあります。→[http://cdn.opensuse.org/](http://cdn.opensuse.org/)

- 環境によってはこちらのほうが速度が出るかも
カラム数に制限を設ける

モデルに独自のバリデーションを書かずにコントローラー内で処理をする方法を考えてみました。

<h1>環境</h1>
ruby 2.6.5
rails 5.2
Mac OS

必要な gem　無し

テーブルは
Post : comment が　1対多になってます。

<h1>実装したいこと</h1>
userの投稿にたとえばコメントがあったとして、そのコメント数を制限する。
みたいな感じの機能です。

大雑把な流れとして
userが投稿詳細ページからコメントを追加
↓
createアクションが動く
↓
投稿に対するコメント数が条件より少ない場合、そのまま作成され
条件を超えた場合はflashと共に元のページにリダイレクトさせる

<h1>何を使うか</h1>
コメントのカラムには自身が持つ"id"の他に外部キーとして"post_id"を持たせています。
これによって「post_idがn番のコメント」と表現することができます。
今回数えたいのはまさにこのpost_idです。

情報を取得するメソッドはたくさんあるのでそのなかから最適なものを探します。
<ul>
<li>all</li><li>find または find_by</li><li>select</li><li>where</li>
</ul>

くらいでしょうか。

allはモデルの情報全て持ってくるし、findはidのレコード持ってくるだけだし、find_byも同じく使わないし、selectは指定したカラムの情報を全て返すし、みたいな感じでいろいろ試していったところ
「where」が1番適していました。

```ruby:各メソッドの書き方
 ALL:
  @posts = Post.all
　　インスタンス　　＝　　モデル名

 FIND:
  @post = Post.find(id)
　　　　#引数には必要なレコードのidを指定

 FIND_BY:
  @post = Post.find_by(email: params[:email])  ←他にも指定できます。
　　　　#カラムと実際の値を記載する
 SELECT:
  @comment = Post.select(:post_id)
   #カラムを指定

 WHERE:
  @comments = Post.where(post_id: params[:post_id])
  #カラムと実際の値を記載
```

みてわかる通り、find_byは1件のレコードを返すのに対して、whereは指定された値のカラムを全て返します。

Commentモデル内に10個くらいデータがあったとして、そのうちpost_idが"3"のものがいくつあるか知りたい場合は

```
  @comments = Comment.where(post_id: 3)
```

とすることでpost_idが3のものが帰ってきます。

__注意としてはここで返ってきた情報に対して、他のカラムを参照したりすることはできないです。__

あくまでpost_idが3のものを表示しているだけなので
、
findやfind_byなどはidに対応するレコードを持ってくるので

```
  @user = User.find(1)

  @user.id
  @user.nickname
  @user.age
```

こう書いてカラムを呼び出すことができます。

<h1>実装</h1>
さっき書いた

```
comments = Comment.where(post_id: post_id)
```
これをコントローラーのcreateアクションに書いて

```
def create
  @comment = Comment.new(comment_params)
  comments = Comment.where(post_id: params[:post_id])

  if comments.count < 10

    if @comment.save?
      flash[:notice] = "成功しました"
      redirect_to root_path
    else
      flash[:alert] = "失敗しました"
      redirect_to post_path(@post)
   end

  else
    flash[:alert] = "これ以上追加できません"
    redirect_to post_path(@post)

  end
end
```

こんな感じで10件まで追加できるようになりました！
[Git] git-flow

Gitのブランチモデル「**git-flow**」について調べてみた。

# git-flowとは
Vincent Driessen氏が提唱した「**A successful Git branching model**」というブランチモデルをサポートするツールのこと。
git-flowでは、役割の決められた5つのブランチを切り替えながら開発を行う。
ブランチ管理にルールを設けることで、不用意なマージなどの問題を避けることができる。

#git-flowのメリット
git-flowのメリットとして、以下の4つが挙げられてた。
・本番リリースしたデータと、製作中のデータの区別が明確になる。
・修正、リリース、機能追加などのいくつもの種類の違う作業を並行して進められる。
・リリースした内容の調査が簡単になる。
・git-flow用のコマンドでほとんど管理が行えるので、操作マニュアルを用意しやすい。


#5つのブランチの役割
git-flowでは開発の内容によってブランチの切り替え行う。その5つのブランチの役割について紹介する。
### ■ メインブランチ
**メインブランチ**は直接作業やコミットすることはなく、マージを行うだけのブランチ。
#### ・masterブランチ
安定して動作し、常にリリース可能な状態のブランチ。
#### ・developブランチ
開発の中心となるブランチで、最新の開発作業の変更を常に反映させている。
developブランチのコードが安定し、リリース準備ができたらdevelopブランチの変更をmasterブランチへマージする。

### ■ サポートブランチ
タスクごとに**サポートブランチ**を作成し、作業を行う。
ブランチはメインブランチから作成され、マージ後に削除する。
#### ・ featureブランチ
開発を行うためのブランチで、新しい機能の追加や変更、バグの修正を行う。
developブランチから分岐して、developブランチにマージされる。

#### ・ releaseブランチ
リリースをする段階になった時点で使用するブランチ。
developブランチから分岐して、developブランチとmasterブランチにマージされる。

#### ・ hot-fixブランチ
masterブランチ内で重大なバグが見つかった場合は、hot-fixブランチをmasterブランチから切って修正を行う。修正が完了したら、リリース作業もこのブランチで行い、developブランチとmasterブランチにマージする。
天使「クズの単価が上がるとか💢」

# 天使「クズの単価が上がるとか💢」

天使「ヽ(`Д´)ﾉ」

僕「天使ー、どうしたん？話聞くよ？」

天使「くぁｗせｄｒｆｔｇｙふじこｌｐ」

僕「落ち着けや！」
( ‘д‘⊂彡☆))Д´) 

天使「カクカクシカジカでさ…本当ゴミのせいで市場大荒れや！」

僕「ふむ…」

# 市場の状況

僕「昨今のエンジニアバブルの単価高騰のせいでどんなゴミでも儲かってしまうと？」

天使「マジで迷惑。ザコが強気単価で勉強してるｱｯﾋﾟもして顧客としては『期待して』現場に入れてくるやん。」

僕「高単価のゴミが大量に湧くと…」

![01.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/b2a7b3cc-a77b-8ee7-2ea0-94fb591b63ee.png)

# 牧場と仲買人

天使「さらにクソなのが家畜の教育をしない牧場と装置と化した仲買人よ」

僕「牧場と仲買人って何よ？」

天使「牧場は会社ダヨー。ただこの牧場は家畜の教育をしないから出先でオイタしまくる。」

僕「(›´ω`‹ ) 」

天使「仲買人は営業会社の事ダヨー。未経験のクソ営業を雇って身代わり装置にするんダヨー」

僕「((›´ω`‹ ))ﾌﾟﾙﾌﾟﾙ… 」

天使「この2つが揃うと…クズが儲かる…」

僕「(# ﾟДﾟ)」

天使「さらにバブルの一因に営業会社の粗利を載せてきて単価が上がったんダヨー」

僕「🪓(๑╹ω╹๑ )」

![02.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/72626b0a-1481-1bce-2642-27c781d075a8.png)

# 使えなくても使える仕組み

天使「現場としては使えない粗悪品を返品したいのよ。」

僕「後任が見つからないとか色んな理由ははあるけど実際に返品される事もあるね。」

天使「本当ならここで会社が再教育なりして質の向上を図るんだけど営業会社を通していることにより、会社の看板を隠して即再出荷出来るんダヨー」

僕「現場も会社も迷惑…」

天使「そして営業会社は『単価を上げたら良い人が来る』と言うんダヨー」

![03.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/d6ec25c6-f38a-1b85-83bf-5293c94b1d62.png)

# 単価が上がる仕組み

天使「更に簡単に単価を上げることが出来るんダヨー」

僕「わかった！色んな現場に短期で返品されることによって色んな経験を積んだことになるんだね！」

天使「Exactly！！」

僕「何も出来ないのに参画した案件の経歴だけ見るとフルスタックとかになるんだねwww」

天使「しかも一旦現場が決まると『2〜3ヶ月くらいの売上が確定』する」

僕「( ﾟ∀ﾟ)･∵. ｸﾞﾊｯ!!」

![04.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/993deac0-a821-966d-b3ee-d2356f80b3aa.png)

# 本当に迷惑

天使「マジで回転だけ回して経歴つけるゴミ迷惑」

僕「回っているだけで単価が上がるってマジで最悪やん」

天使「しかも捨て台詞は『レガシーな現場』で言い訳だらけ…」

僕「下手すると営業会社って販売装置を複数使って同じ現場にまた経歴書が回ってくるとかあるねぇ…」

天使「出禁にしたくても元々の会社がわからないし、回ってくる経歴書に名前はないから出禁にする事も出来ないのよな」

![05.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/550abe72-85cc-c7ee-2b5d-ea206e97205f.png)


# 最後に
技術力 = 単価などではない。

そして天使…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/c3bec554-8656-a74f-ddd3-db89deff24a6.png)
Vuetifyプロジェクトの作成方法

#はじめに
Vuetifyを使用した画面を作成したいときにこれを見る。

#概要
1. VueCLIのインストール
1. プロジェクトの作成
1. Vuetifyライブラリの追加

# VueCLIのインストール
ターミナルを開いて次のコマンドを実行。
vueCLIがインストールされているか確認できる。
@vue/cli x.x.xと表示されればインストール済み

```
vue --version
@vue/cli 4.5.13
```

ない場合はインストールする

```
npm install -g @vue/cli
```

#プロジェクトの作成
適当なディレクトリに移動し、下記コマンドでVueプロジェクトを作成する。
Documentディレクトリの中にvueディレクトリを作成、
その中にvue-applicationという名前でvueプロジェクト作成。

```
cd Document
mkdir vue
vue create vue-application
```

途中で選択肢が発生する。
default
vue2
て感じで選ぶ。
完了すると下記のような表示。

```
🎉  Successfully created project vue-application.
👉  Get started with the following commands:

 $ cd vue-application
 $ npm run serve
```

$の2行を実行する。
表示されるlocalのアドレスをブラウザで開くとvueのロゴが画面に表示される。

#Vuetifyライブラリの追加
下記コマンドでVuetifyをインストールする。

```
vue add vuetify
```

App.vueを編集していけばOK。


#参考
* https://reffect.co.jp/vue/finally-understand-vue-cli
* https://vuetifyjs.com/ja/getting-started/installation/
LightGBMのカスタムメトリック

## カスタムメトリックの作り方
LightGBMのScikit-learn APIの場合のカスタムメトリックとして、4クラス分類のときのF1スコアを作ってみます。
`(y_true, y_pred)`を引数に持つ関数を作ればよいです。次のような関数になります。

```python
from sklearn.metrics import f1_score

def f1(y_true, y_pred):
    N_LABELS = 4  # ラベルの数
    y_pred_ = y_pred.reshape(N_LABELS, len(y_pred) // N_LABELS).argmax(axis=0)
    score = f1_score(y_true, y_pred_, average='macro')
    return 'f1', score, True
```
返り値は、メトリックの名前、スコアの値、値が大きいほうが良いか否か、です。3つ目の返り値はEarly stoppingなどに使用されます。
また、他クラス分類のように予測が複数列を持つ場合は、`y_pred`が1列で渡されるため、`reshape`する必要があるのですが、並び替えの向きが行方向をラベルにする必要があるので気を付ける必要があります。

カスタムメトリックは`eval_metric`に渡してあげれば使用できます。

```python
params= {
    'objective': 'multiclass',
    'num_class':4, 
    'learning_rate': .01, 
    'max_depth': 6,
    'n_estimators': 1000,
    'colsample_bytree': .7,
    'importance_type': 'gain',
}

clf = lgb.LGBMClassifier(**params)
clf.fit(X_train, y_train, 
        eval_set=[(X_valid, y_valid)],  
        early_stopping_rounds=100, 
        eval_metric=f1,
        verbose=verbose)

## 出力
# Training until validation scores don't improve for 100 rounds
# [100]	valid_0's multi_logloss: 0.103872	valid_0's f1: 0.92157
# [200]	valid_0's multi_logloss: 0.0416318	valid_0's f1: 0.971213
# ...
```

カスタムメトリックはあくまで参考値で、`objective`のみvalidationに使いたい場合は`params`に`'first_metric_only': True`を追加します。

逆に[validationをカスタムメトリックのみで行いたい場合](https://tawara.hatenablog.com/entry/2020/05/09/162633)は、`params`に`"metric" : "None"`を追加すればOKです。
a = (1 and 2 or 3 and 4)を説明できますか？

# 目的
pythonのand/or演算子を掘り下げておきたい。

# 題材
and/or演算子が複数含まれている文。a = 1 and 2 or 3 and 4 
タイトルでは（）をつけたがなくても一緒。※括る場所を変えると結果は変わる。
ポイントは右辺の演算結果は何者か？なぜそうなるか。

# 先走って結論
a = 2 と同等です。

# ポイント
* TrueやFalse以外の変数だってand/or演算子の処理ができる。
* and/or演算子は結果としてTrueやFalseを返さない。(演算子の左右にそれ自体がいれば話は別)
* and/or演算子は左右のどちらかを選ぶ処理。
* 同時に and/or (またはnot)が含まれるとき、優先順位がある。

# 解説
## and/or演算子
`if money >= 1000 or points >= 1200` 
こんな感じの条件分岐はよく見るでしょう。現金1000以上さもなくばポイント1200以上の場合は、って意図です。
現金なくてもお買い物ができそうなケースに使えるif文です。

次のケースでは、財布を忘れずに持ってきていれば現金が1000以上かという判定を行います。
`wallet and money >= 1000`
ここまでは文章でスルッと理解できると思います。

それでは、現実的ではないケースですが。財布を所持していなかったら？

pythonでは、`wallet and money >= 1000`の答えとして`wallet`が残ります。
結果、「財布を持ってないよ」という情報のみが残ることになります。

ということで、pythonのand/or演算子の挙動ですが、
* <b>or演算子は左がTruthyの変数なら左を、さもなくば右をそのまま返す
* and演算子は左がTruthyの変数なら右を、一方でFalsyなら左をそのまま返す</b>
となっています。直感的ではなくなってくる部分ですがこれがルールです。

or演算子が日本語っぽい理解もできるんですが、and演算子はそういう理解がしづらいです印象です。

補足ですが、
TruthyとはFalsyではない変数と覚えた方がいいです。
中身のある変数とか、Trueになれる変数とか、bool関数を通してTrueになるやつらとか言われます。
Falsyとは、数値なら0、文字列型なら文字数0の空文字、配列や辞書などでは要素数０の空の変数が該当します。
中身の存在しない変数などと言われることもあります。

## 複数のand/or演算子
さてタイトルの`1 and 2 or 3 and 4`ですが、先程のルールだけで愚直に左から順に読むと、
1 and 2 →2
2 or 3 →2
2 and 4 →4
という演算が行われそうですが、python上で実行してみると結果は2です。
【理由・大事なルール】andとorが並列されているときは andの処理が優先。（notがあればさらにnotが優先）
※カッコで括ることで演算の順番を変更することは可能です。

ということで、正しい処理の順番は
1 and 2 →2
3 and 4 →4
2 or 4 →2
となっています。

# 最後に
ここが初〜中級者から先に進む時のpython引っ掛かりポイントとして有名な点だと思います。
間違ったこと書いてる記事も複数見かけたので正しい知識を広めたいとの思いも込めて記事書きました。
ABC203 C - Friends and Travel costs

https://atcoder.jp/contests/abc203/tasks/abc203_c

![abc203_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/9357967b-3687-ec23-5cb2-3314234f0c2b.png)
![abc203_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/905671ef-9d84-2725-0172-1d3b356955ea.png)
![abc203_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/705ace89-c5c2-b71a-a101-ad2d7ae38f1d.png)
![abc203_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/8fdb9950-4e1f-cb05-77d9-e6875b3c5d31.png)

約半年前、難解な問題文だと嘆き、悶絶しながらコードを書いていたころが懐かし良い。

```abc203c.py
N,K = map(int,input().split())

#与えられる Ai,Bi は昇順になっていないケースがある
#以下で並び替え
lis = []
for i in range(N):
    a,b = map(int,input().split())
    lis.append([a,b])
lis.sort()

#ソートしたリストを小さい順から確認していく
plot = 0
ans = 0
for a,b in lis:
    target,charge = a,b
    #目的時と現在地が同じ場合は K だけチャージ
    if target == plot:
        K += charge
    else:
        #目的地と現在地の差が K 以下なら
        #給油ポイントに辿り着ける
        if target-plot <= K:
            K =K-(target-plot)+charge
            plot = target
        #たどり着けなかったら break
        else:
            break

#現在地の plot と残りの手持ち金額 K だけ進める
print(plot+K)
```
激重 pyinstaller バイナリを軽くする

# はじめに
pyinstaller、とても便利です。なにせ配布が楽ですから。
ただ、出来上がったバイナリが重すぎです。これを（場合によっては）さくっと解決するために、この記事を書きました。なお、本記事では Windows で Anaconda 環境の例になります。

## 例
まずは `pyinstaller` でそのままバイナリ（exe）を作ってみましょう。

```
$ pyinstaller hogefuga.py --onefile
```

なんと **287MB** ありました。
とても気軽に配布できそうもありません。

ちなみに、`hogefuga.py` では、以下が import されています。

```python
import bs4
import openpyxl
import shutil
import sys
```

## 対処
次に、以下のように `--exclude-module` オプションに `numpy` を指定して実行してみます。

```
$ pyinstaller <hogefuga.py> --onefile --exclude-module numpy
```

出来上がったバイナリは、**81.9MB** あります。だいぶ減りましたが、あと一声ほしいところです。

次は、さらに `pandas` も除外してみます。

```
$ pyinstaller <hogefuga.py> --onefile --exclude-module numpy --exclude-module pandas
```

**14.6MB** のバイナリができました。これなら、そこまで気を使う大きさではないかと思います。

`fogefuga.py` と同ディレクトリに `fogefuga.spec` なるファイルができています。
このファイルを覗いてみると、` excludes` に `numpy` と `pandas` が設定されているのがわかりますね。

```python
# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['hogefuga.py'],
             pathex=['D:\\hogefuga'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=['numpy', 'pandas'],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='hogefuga',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

```

# おわりに
いかがでしょうか。せっかく便利にバイナリまでできたのに、ファイル容量が激重だったら残念ですよね。
仕事もファイルも少しでもスリム化できたら幸いです。
Get-ADUserでアカウントの有効を確認したい

## 概要
ActiveDirectoryの環境でアカウントの有効を確認したい。
Get-ADUserコマンドで確認を行う。

## 環境
 - Windows 10 Enterprise 20H2
 - PowerShell 5.1
 - ActiveDirectory、WSUS環境
 
## RSATインストール
[Windows10 1809以降でのRSATインストール方法(WSUS環境でのエラー解決方法も)](https://kuruwi.net/2020/0410/204126/)
こちらのサイトを参考に、「RSAT:Active Directory Certificate Services Tools」をインストール。
また、WSUS環境であったため、上記ページの後半の内容も行いました。

## メールアドレス指定でユーザの情報を取得する
```PowerShell
Get-ADUser -Filter {EmailAddress -eq "aaa@example.com"}
```

## ユーザ情報からEnabledだけを取得する
```PowerShell
Get-ADUser -Filter {EmailAddress -eq "aaa@example.com"} | Select -Expand Enabled
```

## 参考
 - [Windows10 1809以降でのRSATインストール方法(WSUS環境でのエラー解決方法も)](https://kuruwi.net/2020/0410/204126/)
 - [Get-ADUser (ActiveDirectory) | Microsoft Docs](https://docs.microsoft.com/en-us/powershell/module/activedirectory/get-aduser?view=windowsserver2019-ps)
【Docker】起動してもすぐ落ちるときの解決法

##環境
Docker version 20.10.7
docker-compose version 1.29.2

##状況
Dockerを起動してもすぐに落ちる


```
% docker-compose up -d
Creating XXXXX_db_1     ... done
Creating XXXXX_redis_1 ... done
Creating XXXXX_worker_1 ... done
Creating XXXXX_app_1    ... done
Creating XXXXX_webpacker_1 ... done
Creating XXXXX_web_1       ... done

% docker ps -a        
CONTAINER ID   IMAGE                COMMAND                  CREATED         STATUS                      PORTS                                                  NAMES
XXXXXXXXXXXX   XXXXX_web           "/docker-entrypoint.…"   4 seconds ago   Up 2 seconds                80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp          XXXXX_web_1
XXXXXXXXXXXX   XXXXX_webpacker     "/bin/bash -c 'rm -r…"   4 seconds ago   Exited (7) 2 seconds ago                                                           XXXXX_webpacker_1
XXXXXXXXXXXX   XXXXX_app           "/bin/bash -c 'rm tm…"   5 seconds ago   Exited (7) 2 seconds ago                                                           XXXXX_app_1
XXXXXXXXXXXX   XXXXX_worker        "/bin/bash -c 'bundl…"   5 seconds ago   Exited (7) 2 seconds ago                                                           XXXXX_worker_1
```

##解決法

Docker Desktopでログを確認すると下記のエラー

```
Could not find　　XXXXX in any of the sources
Run `bundle install` to install missing gems.
```

指示どおり```bundle install```実行

次のコマンドでbundle installしようとするので、Gemfileを更新したらbuildし直す

```
% docker-compose build
```

次のエラー出現

```
The git source https://github.com/XXX/XXXXXXXXXXXXX.git is not yet checked out. Please run `bundle install` before trying to start your application
```

Gemfile修正

```
gem 'XXXXXXXXXXXXX', github: 'XXX/XXXXXXXXXXXXX'
↓
gem 'XXXXXXXXXXXXX', git: "https://github.com/XXX/XXXXXXXXXXXXX"
```

ここでDockerfile内でbundle installしないと意味ないことに気づく…

```
% docker-compose run app bundle install
```

もう一度buildしてupしてみる

```
% docker-compose build
% docker-compose up -d
```

成功！！

##参考

https://qiita.com/mom0tomo/items/2e7f7c2dbe2855b2c91d

https://suzutukiblog.com/index.php/2021/04/06/docker-3/
ABC206 C - Swappable から学んだ

https://atcoder.jp/contests/abc206/tasks/abc206_c

![abc206_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/b279e52a-4360-61a5-4c10-aca565186bbc.png)
![abc206_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/b2026293-3ec1-1609-ae40-2090aa961d6b.png)
![abc206_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/621b2107-e98f-9dd2-5bc1-d78c6795a339.png)

うーん。分からんので回答を見た。

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

なるほど。NG を数えるか。
勉強になりました。

```abc206c.py
N = int(input())
A = list(map(int,input().split()))
dic = {}

for i in range(N):
    if A[i] not in dic:
        dic[A[i]] = 0
    dic[A[i]] += 1

num = 0
for i in dic.keys():
    if dic[i] > 1:
        num += ( dic[i]*(dic[i]-1) )//2

print( (N*(N-1))//2 - num )
```
Ubuntu Server が突然 GUI モードになってしまう問題の対処法

# 事の発端
数週間ぶりに Ubuntu Server を再起動したら、突然 GUI モードになってしまった。

もちろん Ubuntu Desktop をインストールしたわけではない。だから、Ubuntu Desktop ではない GUI だった。

なんというか、非常にちゃちな造りの GUI で、デスクトップ画面の背景が無地の青色なのだが、SSH すると画面の中央部分だけが紫色になる。さらにマウスをつないでカーソル移動すると、カーソルの軌跡が変色する。そして、数分間、操作がないと画面が薄暗くなるのだが、マウスやキーボードを操作しても画面が復活しなかったりする。これはどうみてもおかしい。

![](https://raw.githubusercontent.com/noraworld/blog-content/main/disable-ubuntu-server-gui/IMG_0434.JPG)

というかそもそも GUI を入れるつもりは毛頭ないので、もちろん無効にすることにした。



# 解決方法
直し方は非常にシンプル。以下のコマンドを実行するだけ。

```shell:Shell
sudo systemctl set-default multi-user
```

そして再起動するだけ。

```shell:Shell
sudo reboot
```



# 原因不明
直すのは簡単だったが、原因が不明だった。最近インストールしたパッケージの中で、怪しいものをすべて完全に消去したりもしたのだが、それでは直らなかった。



# 参考
* [Ubuntu 20.04 Server Suddenly has GUI and No Terminal](https://askubuntu.com/questions/1250026/ubuntu-20-04-server-suddenly-has-gui-and-no-terminal#answer-1297572)
* [How to disable/enable GUI on boot in Ubuntu 20.04 Focal Fossa Linux Desktop](https://linuxconfig.org/how-to-disable-enable-gui-on-boot-in-ubuntu-20-04-focal-fossa-linux-desktop)
Railsのセキュリティについて

Railsのセキュリティについて勉強した時のメモです。

# セッションハイジャック
### セッションハイジャックとは？
セキュリティに問題のあるネットワークを使用するとCookieの内容を盗み取られる可能性がある。
Cookieの中にセキュリティIDがあるのでそれを奪われると代わりにログインされてしまうこと。

### 対策
Railsには`config/environments/production.rb`に

```ruby:config/environments/production.rb
config.force_ssl = true
```
というオプションがありこれを追加することでssl通信(セキュリティ的に安全な通信)しか受け付けないようにできる。

# CSRF
### CSRFとは？
Cross Site Request Forgeriesと言い、攻撃者が他人のサイトにコードを埋め込むことでユーザーが操作した際に意図しない挙動を生み出す攻撃のこと。
例えば、ECサイトで戻るボタンが購入ボタンになっていて、戻るを押すと決済されていたみたいな感じ。

### 対策
post,put,deleteなどのデータに変更を加えるものは、tokenと一緒にリクエストしないといけないようにする。
Railsには`app/views/layouts/application.html.erb`に

```ruby:app/views/layouts/application.html.erb
  <%= csrf_meta_tags %>
```
という記述があり、ここでtoken（鍵のようなもの）が生成されるのでこれを取得してリクエストを送れば対策できる。

# SQLインジェクション
### SQLインジェクションとは？
SQLを操作するパラメーターなどを送ることでデータベースを操作して攻撃をする手法。
データベースを操作されるので場合によっては全てのデータを削除したり取り出されてしまう恐れがある。
具体的には、

```sql
User.where("name = '{params[:name]}'")
```
のように`where`にハッシュではなく文字列を渡した場合、

`params[:name]`に`' OR 1 -- `のように送られてきた場合

```sql
SELECT * FROM user WHERE name = " OR 1 --'
```
という全てのデータを取得するクエリが発行されるらしい‥ やばすぎ‥

### 対策
ユーザーから送られてくる値を直接使ってSQLのクエリを作らない。
`find`、`find_by`、`where(name:params['name'])`など限定的なメソッドを使う。
Rails、Rubyっぽい書き方をする。

# XSS 
### XSSとは？
Cross Site Scriptingと言い、コード付きのリンクなどを攻撃者が掲示板などに書き込み、そのリンクを踏んだユーザーに対して不正なプログラムを実行する手法。
ユーザー投稿型サービスではユーザーが投稿した内容をそのまま表示するので、ユーザーが投稿した内容にコードが含まれていた場合、投稿内容をクリックなどした人がプログラムを実行してしまう。

### 対策
投稿時にコードを入力してもコードではなく文字列として表示するようにする。
例えば以下のようにjQueryでコメントした内容を追加する処理の場合、
pタグに`${comment.content}`のように書くとコメントにコードを書いた場合そのままコードが反映されプログラムが実行される恐れがある。

```javascript
const appendNewComment = (comment) => {
  $('.comments-container').append(
    `<div class="article_comment"><p>${comment.content}</p></div>`
  )
}
```

`escape`を使うことでコードではなく文字列に変換してくれるので対策できる。

```javascript
const appendNewComment = (comment) => {
  $('.comments-container').append(
    `<div class="article_comment"><p>${escape(comment.content)}</p></div>`
  )
}
```
データサイエンティスト検定™ リテラシーレベル　の試験対策方法

データサイエンティスト検定（DS検定）は、
2021年9月に第1回の試験が行われました。
データサイエンティストの基礎知識を学ぶにはよい試験だったかなと思います。
次回試験開催日は未定ですが、
今回受験したDS検定と実施した試験対策について共有したいと思います。

（60-80）


#データサイエンティスト検定™ リテラシーレベルとは

『データサイエンティスト検定™ リテラシーレベル』（略称：DS検定™ ★）とは、アシスタント・データサイエンティスト（見習いレベル：★）と数理・データサイエンス教育強化拠点コンソーシアムが公開している数理・データサイエンス・AI（リテラシーレベル）におけるモデルカリキュラムを総合し、実務能力と知識を有することを証明する試験です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1786195/9710d8be-3dfd-9969-3de8-0acfb032c9e7.png)


データサイエンティスト協会ではデータサイエンティストに必要なスキルや知識をスキルチェックリスト・タスクリストという形で定義し、高度IT人材の育成と業界の健全な発展への貢献、啓発活動を行ってきました。内閣府が策定した「AI戦略2019」においても、デジタル時代の人材育成や教育改革は国全体の重要な課題となっています。本検定の取得により、データサイエンティストに必要なデータサイエンス力・データエンジニアリング力・ビジネス力についてそれぞれ見習いレベルの実務能力や知識、また、数理・データサイエンス・AI教育のリテラシーレベルの実力を有していることを証明することができます。 データサイエンティストを目指す人達とそれを必要とする産業界を結びつける一つの指針となることを目指しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1786195/c9eaaa9a-de8d-58e1-73e4-377a1d38399b.png)

##検定の対象者

本検定の受験対象者は以下のような方を想定しているそうです。
・データサイエンティスト初学者
・これからデータサイエンティストを目指すビジネスパーソン
・データサイエンティストに興味を持つ大学生や専門学校生など


##検定の概要

・受験資格 : なし
・問題形式 : 選択式問題
・試験方法 : CBTで開催
・試験時間 : 90分　
・　問題数 : 80-90問程度
・受験費用 : 11,000円（税込)


以下は模擬問題です。このような難易度の問題が出題されます。

https://www.datascientist.or.jp/common/docs/practice_v1.1.pdf

・データサイエンス力：3問
・データエンジニアリング力：2問
・ビジネス力：1問


###参考

https://www.datascientist.or.jp/dskentei/


#試験対策方法

今後いろいろな会社で出てくるそうですが、
記事作成者が実施してみたものは下記内容になります。

スキルアップAI株式会社
対策講座「DS検定リテラシーレベル対応データサイエンティスト基礎講座」
https://www.skillupai.com/ds/

DS検定™ リテラシーレベル対策アプリ　
https://www.skillupai.com/ds-app/


書籍名：「<a href="https://hb.afl.rakuten.co.jp/ichiba/214916f3.5af53358.214916f4.064ba814/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2Fcd2ab83d59f53ae284fe2104fc42a0e4%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  >最短突破　データサイエンティスト検定（リテラシーレベル）公式リファレンスブック【電子書籍】[ 菅由紀子 ]</a>」
発売日：2021年9月4日　
出版社：技術評論社


<a href="https://hb.afl.rakuten.co.jp/ichiba/214916f3.5af53358.214916f4.064ba814/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2Fcd2ab83d59f53ae284fe2104fc42a0e4%2F&link_type=pict&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  ><img src="https://hbb.afl.rakuten.co.jp/hgb/214916f3.5af53358.214916f4.064ba814/?me_id=1278256&item_id=20429171&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Frakutenkobo-ebooks%2Fcabinet%2F6661%2F2000010206661.jpg%3F_ex%3D240x240&s=240x240&t=pict" border="0" style="margin:2px" alt="" title=""></a>


DS検定リテラシーレベル対応　データサイエンティスト
基礎講座の講座資料　+ 模擬セット　8,800円　

DS検定™ リテラシーレベル対策アプリ　980円
アプリの問題は上記の模擬セットと同じです。

模擬セットを購入された方はアプリは購入しなくてもよいかなと思います。

G検定の内容に
SQL、統計、法律、ビジネス的な考え方と広く浅く問われる問題が多かったです。

模擬試験で全体の内容を把握しつつ、
DS検定の公式テキストで用語や内容を理解していくことと
SQLの操作を理解しておくとよいかなと思います。
php-webdriver(selenium webdriver)でWeb-DevToolsのBlockedURLsを設定する方法

DXを実践するためにphp-webdriver selenium webdriverでクローリング等を行っているのですが
どうもページの読み込みに詰まることがあって、応答がなくタイムアウトしてしまうことが多々あり
調べてみると画像ファイル取得でどうもなかなか応答がないっぽい。

こちら側の問題なのか先方のWebサーバの問題かわからず途方に暮れてた時、
別に画面スクショ取るわけではないので
画像取得は無視できたらいろいろ捗るなぁ・・と思いついて調べた次第。


HeadlessはChromeをつかっているけど、さくっとググっても見つからず
たどり着いたのは公式のwiki。
https://github.com/php-webdriver/php-webdriver/wiki/Chrome
まあ灯台もとぐらしってやつですな。
(github wikiってgoogle検索では引っかからない。あのUIでは多分クローラーが辿れないよね)

use Facebook\WebDriver\Chrome\ChromeDevToolsDriver;
と
new ChromeDevToolsDriver()
と
execute('Network.setBlockedURLs',["urls"=> [array])
で実現できた。
（個人的にはレベルクズなエンジニアなので、何をuseすればいいのかがいつもわからない・・）


RemoteWebDriverで対応してるのでlocalではこの方法ではないっぽいけど
てめーのしたいことはこれで十分なので


あと
use Facebook\WebDriver\Chrome\ChromeDevToolsDriver;
をするとExceptionが拡張されちゃう？っぽいので、
それぞれExceptionを拾うか
catch(\Exception $e)
と\をつけておくと良いっぽいです。

```php
<?php
namespace Facebook\WebDriver\Chrome;

require_once('vendor/autoload.php');

use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use PHPUnit\Framework\TestCase;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverBy;

use Facebook\WebDriver\Chrome\ChromeDevToolsDriver;


// selenium
$seleniumhost = 'http://localhost:4444/wd/hub';

// chrome ドライバーの起動
$driver = RemoteWebDriver::create($host,DesiredCapabilities::chrome());

// ChromeDevToolsDriverの設定
$devTools = new ChromeDevToolsDriver($driver);

//アクセスをブロックしたいURL
$devTools->execute('Network.enable');
$devTools->execute('Network.setBlockedURLs', ["urls"=> [
	"http://hogehoge/*/img/*.png",
	"http://hogehoge/img/*/*/*.gif",    
		]
	]
);

$oktitle="タイトル";
try{
    $driver->get($url);
    $driver->wait(1)->until(
        WebDriverExpectedCondition::titleIs($oktitle)
    );
    $html = $driver->getPageSource();
}
catch (\Exception $e) {
    echo "Exception: " . $e->getMessage() . PHP_EOL;
}
```
【node・git】リリース操作周辺

初書：2021/10/12
mac : 11.6
node：v16.6.1

# 前書き
node.jsでアプリケーションをリリースする際によく調べ直すことが多い項目をメモしておく。


# package.jsonのバージョンを更新する

参考サイト：[npm versionコマンドで出来ること。 - Qiita](https://qiita.com/minamo173/items/8b8b27bc6ecd17ad925e)

`% npm version xxx`でパッケージのバージョンを更新することができる

xxxは、
`major`で1.0.0
`minor`で0.1.0
`patch`で0.0.1
の部分を更新する。

また、先頭に`pre`をつけることで、各部分を更新した上で、x.x.x-0と、最後に-0を追加する。
また`-0`は、`prerelease`で更新することができる。

# タグをgithubにpushする

参考サイト：[git tagの使い方まとめ - Qiita](https://qiita.com/growsic/items/ed67e03fda5ab7ef9d08)

上記のコマンドを実行すると、自動的にコミットされるが、そのコミットにタグが付けられる。

ただそのタグは、単にpushしても何故かgithubに行かない[^1]

[^1]: vscodeの機能でpushしたから？その辺りは検証していない。

そのため、タグだけ別途pushする必要がある。

`% git push origin タグ名`

これでgithub側にもタグが共有される。

# 終わりに

他にも何か追加するかも。
【Docker Desktop 4.1.0 (69386)】docker-compose up でエラーが出た場合の対処法

## 各種バージョン

* Docker 20.10.8
* Docker Desktop 4.1.0 (69386)
* docker-compose version 1.29.2

## エラー内容

今日、いつも通りの手順で、`docker-compose up`を行うと下記のようなエラーが出ました。

```terminal:docker-compose
unexpected character “-” in variable name near “-p default_grace=3600

or

unexpected character “\”" in variable name near “\”thumbor.filters.contrast\”

or

key cannot contain a space
```

## 原因

![スクリーンショット 2021-10-12 10.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/6bd503e6-6eca-59d0-bb2f-ef9cad35bbe5.png)

私の場合、赤枠で囲んでいるDocker Desktopの設定項目にチェックが入っていたのでエラーが出ていました。
このチェックを外して、設定適用、Docker desktopの再起動を行えば、無事コンテナを立ち上げることができました。

誰か困っている方の助けになれば幸いです。
もし、他の方法で解決したという方がいれば、コメント欄にて教えていただけますと幸いです。

そろそろ、`docker-compose`卒業して、`docker compose`にしないとですかね。

## 参考サイト
https://stackoverflow.com/questions/69512549/key-cannot-contain-a-space-error-while-running-docker-compose
【UE4】EUWでシーケンサーのPost Infinityを設定するやつ。

シーケンサー使っててちょっと不便だなーと思って効率化のために作ってみたやつ。

https://twitter.com/xxJulexx/status/1447741116632100865

Post Infinityの以下をボタンで設定できるように。
-Constant
-Linear
-Cycle
-Ocillate
![SequencerTools-EventGraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102588/71634dab-86ac-7450-e389-e388bba015fa.png)
Pluginのsequencer scriptingを有効にするとシーケンサーで使える機能がけっこう増えるので、シーケンサーをよく使う人は一度見ておいてもいいかなと。
![スクリーンショット 2021-10-12 105637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102588/978f106f-7c69-2282-bc13-c14277c453b8.png)
複数セクション選択すれば一括で変更も可能。
こういうのちょいちょい作っておくと効率上がる！

Download >> [SequencerTools.uasset](https://xxjulexx.gumroad.com/l/mUFKBZ)
*UE4.27
【Rails4.2】Postgresqlの配列リテラルを配列に変換

## 背景

- 少々古いプロジェクトでPostgresqlの配列型が使われていた。
- ActiveRecord経由であれば取得カラムは自動で配列に変換されるが個別に変換したい場合があった

## 概要

- Rails側で以下の変換を行いたい
- 半角スペースや改行などの要エスケープ文字がある要素だけダブルクォート囲みされたりしている
- アポストロフィーエス `'s` なども少々変換が必要らしい

input | output
--- + ---
`{}` | `[]`
`{1,2,3}` | `[1,2,3]`
`{赤,青,緑}` | `["赤","青","緑"]`
`{"徳川 家康",豊臣秀吉,"織田 信長"}` | `["徳川 家康","豊臣秀吉","織田 信長"]`

## 実装

モデルのconcernを追加する形にしてみた

``` ruby:app/models/concerns/varying_array_parsable.rb
module VaryingArrayParsable
  extend ActiveSupport::Concern

  class VaryingArrayParser
    # @see {https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb}
    # Loads pg_array_parser if available. String parsing can be
    # performed quicker by a native extension, which will not create
    # a large amount of Ruby objects that will need to be garbage
    # collected. pg_array_parser has a C and Java extension
    begin
      require 'pg_array_parser'
      include PgArrayParser
    rescue LoadError
      require 'active_record/connection_adapters/postgresql/array_parser'
      include ActiveRecord::ConnectionAdapters::PostgreSQL::ArrayParser
    end
  end

  module ClassMethods
    private

    # @param value [String] varying arrayカラムの値
    # @return [Array] 型キャスト後の配列
    def cast_to_array(value)
      @pg_parser ||= VaryingArrayParser.new
      @pg_parser.parse_pg_array(value)
    end
  end
end
```

使用例

``` ruby:app/models/hoge.rb
class Hoge < ActiveRecord::Base
  include VaryingArrayParsable

  class << self
    # @param str [String]
    # @return [Array]
    def hogehoge(str)
      cast_to_array(str)
    end
  end
end
```

## まとめ?

- :smiley: pgのarray型の文字列→railsの配列 への変換ができるようになった
- :smiley: エスケープなどの考慮もされていた
- :thinking: postgresqlには `array_to_string` 関数や `unnest` 関数があるのでSQL側でこれを使うのもアリだった
- :scream: もっと良い書き方がありそう。ActiveRecordにすでに実装済みのものを真似ているだけなので

## 参考

- rails4.2がActiveRecordでやってる部分
    - https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb
- pg_array_parseのgem
    - https://github.com/DavyJonesLocker/pg_array_parser#usage
【Gmail】特定のメールへの直リンクを取得する方法

# はじめに

2022年の改正電子帳簿保存法にNotionで対応するために、Gmail内のメールを紐付けられるURLを取得したかったのですが、直リンク発行が機能として提供されていないようでした。

GASや何かを使う方法は目にしましたが、よりシンプルな方法で実現できたので共有します。

# 直リンク取得方法

下記のスクリプトをブックマークレットとして登録して、Gmailメール本文上で実行します。
( `my_email` をあなたのGmailアドレスに置き換えます。)

```javascript:ブックマークレット
javascript: (function () {
  async function copyPermalink() {
    try {
      my_email = "example@gmail.com";
      search_url = "https://mail.google.com/mail/u/" + my_email + "/#search/msgid%3A";
      message_id = document
        .querySelector("div[data-message-id]")
        .getAttribute("data-message-id")
        .substring(7);
      await navigator.clipboard.writeText(search_url + message_id);
      alert("Copied!\n\n" + search_url + message_id);
    } catch (err) {
      alert("Error!");
    }
  }
  copyPermalink();
})();
```

**メッセージIDで検索するリンクをクリップボードにコピーする** 動作です。

# さいごに

改正電子帳簿保存法的には、メール本文への直リンクなどなくてもスクショで十分な雰囲気ですが、メールに限らず原本へのリンクがあると便利だと思うので、用意しておきました。
Unityroomの投稿の拡張子の変更(Gzip)

Unityroomに投稿する際に拡張子でつまづいたため、記録します。
Unityroom Gzipの検索で解決できるようになったらいいなという記事です。

![スクリーンショット 2021-10-12 104117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2160268/ea3c3344-07ee-0f56-ff2c-c20e2b63783c.png)

このように、Gzip形式にすると、Unityroomに投稿する際の拡張子による問題が解決すると思います。

[参考]
https://gaprot.jp/2020/10/26/unity2020-webgl-01/
[Rails]validatesについて

##初めに
####なぜこの記事を書きたかったのか
modelでなにをするかまとめたかったから

####環境
・Macbook Air (Retina, 13-inch,2019)
・プロセッサ 1.6GHz デュアルコアIntel Core i5
・メモリ　8GB 2133 Mhz LPDDR3
・MacOS Big Sur　バージョン 11.5.2

####記事の目次
**１）Validatesとは**
**２）できることリスト+使い方**
**3）最後に**

##Validatesとは
![markmodelsample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/043bf1c9-76ac-6808-3db4-c310a3e632c4.png)
**イメージは、controller内で設定した内容にルールをつけてDATABASEと情報のやり取りができる機能を持つ。**

##条件が複数ある場合におすすめな書き方！
**[+α]with_option内に別のwith_optionを設定しても大丈夫！**

```ruby
with_options ルール: true do
  validates :条件, ：条件, :条件, ：条件
end
```

##できることリスト+使い方
**指定した条件の有無を設定する**
**[when?]＝ユーザに記入してほしいものは必須条件にするとか。**

```ruby
  validates :条件, :条件, presence: true
```
**with_optionを使った例**
![presencetruedo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/783a39b0-3077-5086-66f2-7db1c5a4a490.png)

**指定した条件の完了後にメッセージを出力させる**
**[when?]＝新規登録/ログイン時にユーザの記入事項に誤りがあればエラー文を、ないときは”成功！”と表示させれる**

```ruby
validates :条件, ルール: {message: "出力したい文章"}
```
![messagesample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/1273b5d1-789f-7a8e-7dc1-d5c042d351a6.png)



**データベースで保存するものを重複しないようにできる**
**[when?]＝会社名やメールアドレスの重複を防げれる**

```ruby
validates :条件, uniqueness: true, on: :アクション
```
**新規登録/ログイン時にemailを保存するときに重複しないようにするの例
![uniquenesssample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/9972e218-f66c-e332-0d52-e56722cd468b.png)


**記入事項を数字だと限定する**
**[when?]＝誕生日や値段の記入時に数字以外の記入をぺけにすることができる**

```ruby
  validates :条件, numericality: true
```

```ruby
  validates :条件, numericality: {only_integer: true}
```



**文字数の制限を設定する**
**[when?]＝パスワードの文字数制限、値段記入欄の上限、ジャンケンアプリとか**

**〜以上と設定したいとき**

```ruby
numericality: {greater_than:　数字}
```
**〜以下と設定したいとき**

```ruby
numericality: {less_than:　数字}
```
**条件より大きく＋等しいと設定したいとき**

```ruby
numericality: {greater_than_or_equal_to:　数字}
```
**等しいと設定したいとき**

```ruby
numericality: {equal_to:　数字}
```
**条件より小さく+等しいと設定したいとき**

```ruby
numericality: {less_than_or_equal_to:　数字}
```
**奇数と設定したいとき**

```ruby
numericality: {odd: true}
```

**偶数と設定したいとき**

```ruby
numericality: {even: true}
```

**ぺけにしたい条件を事前に準備したい場合**

```ruby
numericality: {other_than: 数字}
```
**other_thanでの例
![sampleofother_than.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/e7908f7c-2bd7-ede8-55d6-4213b10f8a0b.png)



**記入事項の文字や数字の形態を制限することができる=[正規表現]**
**[when?]＝全角、半角英数字など状況に応じて文字の形態を制限することができる**

**{with}で囲むと正規表現に一致するものを制限することができる。**

```ruby
validates :条件, format: {with:　正規表現}
```

**{without}で囲むと正規表現に一致しないものを指定することができる。**

``` ruby
validates :条件, format: {without:　正規表現}
```

**withで囲んで正規表現を使った例**
![seikihyougensample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/1458a01a-d361-b373-4766-5eaeb9fee408.png)

##最後に
modelでできることをまとめてみたが、まだvalidatesがあるとのこと。。使い勝手がわかったらもう一回別の記事に書いてみようと思う!

よくつかう正規表現についてのリンク　→　https://qiita.com/janani/items/aeb139516c8bb8e70661

ココまで読んでいただきありがとうございます!
[Rails]よくつかう正規表現について

##初めに
####なぜこの記事を書きたかったのか
自分がよくつかう正規表現のリストのチートシートを残したかった。

####環境
・Macbook Air (Retina, 13-inch,2019)
・プロセッサ 1.6GHz デュアルコアIntel Core i5
・メモリ　8GB 2133 Mhz LPDDR3
・MacOS Big Sur　バージョン 11.5.2

####記事の目次
**１）正規表現とは？**
**２）条件に合わせた正規表現リスト**
**3）最後に**

##正規表現とは？
####イメージは、作成した記入欄の文字、数字、記号に対してルールを設けられる。
####不安なときもしくは試したい正規表現があれば”正規表現チェッカー”で検索すると試せれるよb

##条件に合わせた正規表現リスト
####携帯電話の正規表現1

```ruby
/^0[789]0-\d{4}-\d{4}$/
```
####郵便番号の正規表現

```ruby
/^\d{3}-\d{4}$/
```

####全角の正規表現

```ruby
/\A[ぁ-んァ-ン一-龥々]/
```
####カナ表記の正規表現

```ruby
/\A[ァ-ヶー－]+\z/
```

####半角の正規表現

```ruby
/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i
```
##最後に
何を制限したいかを言語化させて、書き方の基本を覚えて試す。でもやはり正規表現の書き方はかなりあるので、新しい表現の仕方を使用するときは”rubyリファレンス”もしくは”基本的な正規表現”と検索をかけることをおすすめしますb
PID毎に使用しているファイルディスクリプタの数を調べる

# コマンド

```.sh
for i in $(ps aux | awk '{print $2}'); do  ls /proc/$i/fd | wc -l | xargs -I{} echo $i:{}; done
```

# 出力例

```
ls: cannot access '/proc/PID/fd': No such file or directory
PID:0
1:96
2:0
3:0
4:0
6:0
9:0
10:0
11:0
12:0
13:0
14:0
15:0
16:0
17:0
18:0
19:0
20:0
21:0
22:0
...
```
Android用のXDの画像を書き出す

書き出したい画像を選択
`ファイル`→`書き出し`→`選択したオブジェクト`をクリック
![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/e37e3fc1-1c2c-2f5d-3140-235eeef74390.png)

形式を`PNG`、書き出しサイズを`Android`、書き出し先に適当なフォルダを選択して、書き出しをクリック
![screen2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/ee8bb08a-9d86-0702-813d-15a36631fb28.png)
UiPathでフォルダ内にあるファイル名を全て取得し、出力タブに出力する

#はじめに
今回はUiPathを使用してフォルダ内にあるファイル名を全て取得し、出力タブにファイル名を出力する方法をご紹介したいと思います。

#参考フロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/9d359c6a-a7d8-78a8-4a5f-091ce3153f6a.png)
上記のアクティビティだけでフォルダ内のファイル名を取得することができます。
では、詳しく説明をしていきます。

#設定方法
①変数をString型で作成し、既定値にフォルダのパスを記入します。
※代入などを使用して変数に入れたり、Excelからパスを取得するというやり方でも構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/1e6a229c-2437-59d7-a614-f92c22cef48b.png)


②もう一つ変数を作成します。
この変数はファイル名を格納する変数です。
変数の型：String[]
既定値：なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/b5bff852-ff1c-c034-eff2-129534a3eeac.png)

③代入アクティビティを配置して、以下のように設定します。
左辺値：ファイル名を格納する変数
右辺値：System.IO.Directory.GetFiles(フォルダパスを格納している変数)

④繰り返し（コレクションの各要素）アクティビティを配置します
繰り返し：item
次のコレクション内の各要素：ファイル名を格納する変数
【プロパティ】
TypeArgument：String
上記を設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/cc33955f-1413-aa1b-8868-c4b5dc6f8e4c.png)

⑤繰り返しの中に「1行を書き込み」を設定し、Textを以下のようにします。
Text：System.IO.Path.GetFileName(item)

これで完成です。

#実行結果
このようにフォルダ内にある、全てのファイル名が出力タブに出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/885313f3-e742-835a-9314-c5d249ac9867.png)
例えば、条件分岐を入れて特定の拡張子だけを出力させたり、
出力のExcelにファイル名を出力させることも出来るので、ぜひ試してみてください！

#さいごに
あくまでこれは参考ですので、使用する機会があれば是非使用していただければ幸いです。

最後までご覧いただきありがとうございました。
DatabricksでSparkコードのデバッグを容易にする

[Easier Spark Code Debugging \- The Databricks Blog](https://databricks.com/blog/2015/09/23/easier-spark-code-debugging-real-time-progress-bar-and-apache-spark-web-ui-integration-in-databricks.html)の翻訳です。

> この記事で説明されている機能を試したいのであれば、[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)にサインアップしてください。

:::note info
2015年の記事です。
:::

Sparkアプリケーションをより効率的に理解し、デバッグできるように、Databricksノートブックに[Apache Sparkのweb UI](https://qiita.com/taka_yayoi/items/7d63795bbe6a0b443468)をインテグレーションを導入できたことを嬉しく思います。

オープンソースSparkのコンポーネントとして、web UIはお使いのSparkアプリケーションをモニタリングし、理解することを支援するために設計されており、メモリー使用量、実行しているエグゼキューター、スケジューラーのステージ、タスクに関する有用な情報を提供します。

[Databricksノートブック](https://databricks.com/jp/product/data-lakehouse)は、ユーザーがApache Sparkを用いてインタラクティブにデータを探索し、アプリケーションを開発するために活用できる、ビジュアルかつコラボレーティブなワークスペースです。[アクセスログの解析](https://databricks.com/blog/2015/04/21/analyzing-apache-access-logs-with-databricks-cloud.html)や[機械学習](https://databricks.com/blog/2015/06/04/simplify-machine-learning-on-spark-with-databricks.html)のようなサンプルワークフローにあるように、データの取り扱いが容易になります。

ノートブックで分散アプリケーションのデバッグはいまだ課題となっています。web UIは必要な情報を保持していますが、web UIと開発環境の間にはギャップが存在しています。調査しているコードに関連する情報をweb UI上で特定するのは通常困難です。また、ランタイムの履歴情報を簡単に探す方法も存在していません。

# インテグレーションされたweb UIがどのようにコーディングを支援するのか

この問題を解決するために、開発環境から直接ランタイム情報にアクセスするための方法を提供しました。

今やDatabricksノートブックでは、"プログレスバー"の形で、Sparkノードからのアップデートをリアルタイムで表示します。内部でコマンドがSparkジョブを起動すると、プログレスバーは自動でジョブの実行に応じて更新され、より簡単にコマンドの状態をモニタリングできるようになります！
<iframe width="560" height="315" src="https://www.youtube.com/embed/qTMSb1pRsN0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
*プログレスバー: Databricksノートブック上でSparkジョブの実行進捗をリアルタイムで表示*

また、プログレスバーはそれぞれのSparkジョブに対する詳細情報への直接のリンクを提供し、ユーザーはそれぞれのジョブのさらなる調査のために、web UIにドリルダウンすることができます。この追加の可視化機能によって、デバッグに必要な全てのシステム状態とランタイム情報をコードを記述したところと並べて参照することができます。
<iframe width="560" height="315" src="https://www.youtube.com/embed/mnD3SkJOrKw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# まとめ

Sparkのweb UIとDatabricksノートブックの統合によって、あなたの開発環境において容易にデバッグ情報にアクセスするためのショートカットを作成しました。この機能によって、皆様がSparkアプリケーションをより効率的にデバッグできるようになることを望んでいます。

この機能は全てのDatabricksユーザーが利用できます。試すには[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)にサインアップしてください！

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)