OmniAICreator/Qiita-1.07M huggingface dataset:
googleでuser登録をする

自分のアプリにgoogleログイン機能を追加したのでメモ
公式ドキュメントに沿っただけなのであしからず

<h1>前提条件</h1>
<ul><li>googlecloudで認証用のキーを取得していること(以下のサイトで取得できます)</li>

<li>google認証用のgemを追加していること</li>
<li>deviseを入れていること</li>
</ul>

```
gem 'omniauth-google-oauth2'
```

https://console.developers.google.com

<h1>公式ドキュメント(Github)</h1>

https://github.com/zquestz/omniauth-google-oauth2

このサイト通りに追加していきます。

まずは```config/initializers/devise.rb```に以下を追加します

```
config.omniauth :google_oauth2, 'GOOGLE_CLIENT_ID', 'GOOGLE_CLIENT_SECRET', {}
```

ここにクライアントIDとシークレットIDを入力するのですが、直接書くのはよろしくないと思うのでENVを使ってください

次は`config/routes`に追記します

```
devise_for :users, controllers: { 
  omniauth_callbacks: 'users/omniauth_callbacks' 
  #以下省略
}
```

次に`app/models/user.rb`のデバイスモジュールを追記します

```
devise :omniauthable, omniauth_providers: [:google_oauth2]
#i%として書くこともできます
```

次に先ほど設定したルーティングのomniauth_callbacks_controller.rbを作成してください

```
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def google_oauth2
      # (app/models/user.rb)に以下のメソッドを定義する必要があります
      @user = User.from_omniauth(request.env['omniauth.auth'])

      if @user.persisted?
        flash[:notice] = I18n.t 'devise.omniauth_callbacks.success', kind: 'Google'
        sign_in_and_redirect @user, event: :authentication
      else
        session['devise.google_data'] = request.env['omniauth.auth'].except('extra') # Removing extra as it can overflow some session stores
        redirect_to new_user_registration_url, alert: @user.errors.full_messages.join("\n")
      end
  end
end
```


`app/models/user.rb`に記載します

```
def self.from_omniauth(access_token)
    data = access_token.info
    user = User.where(email: data['email']).first

    # userを作成する場合は以下のコメントアウトを外してください
    # unless user
    #     user = User.create(name: data['name'],
    #        email: data['email'],
    #        password: Devise.friendly_token[0,20]
    #     )
    # end
    user
end
```

これでfrom_omniauthメソッドが使えるようになりました。
＊unless以下に書いてある記述の中でDevise.friendly_tokenとあるのですがそれはdeviseのヘルパーメソッドでランダムな値を作成してくれるというものです

最後にregistration,sessionの２つのviewにリンクを作成します.

```
<%= link_to "Sign in with Google", user_google_oauth2_omniauth_authorize_path, method: :post %>

<%= link_to "Sign in with Google", user_google_oauth2_omniauth_authorize_path %>
```

とりあえず公式通りに書いて行ったら認証できました
いろんな記事があるので書き方もそれぞれ違います。
この記事は公式の丸写しなのでそっち見た方が遥かにいいです笑
公式を読む習慣をつけた方がいいと思ったので次に僕が読む時ように記事を書きました。

こんな書き方いいよ！っていうアドバイス等ありましたらコメントで教えてくださるとありがたいです。
MySQLについて

・MySQLとは
・MySQLの構文紹介

#MySQLとは
データベースにあるテーブルからどの情報を「取り出す」「削除する」「更新する」「追加する」といった、データベース管理が出来るプログラミング言語。

#MySQLの構文紹介
①基本構文
SELECT　カラム名　FROM　テーブル名;

②条件付きのデータ抽出
SELECT　＊　FROM　テーブル名　WHERE　カラム名　=　レコードの値;

・複数条件での抽出
SELECT　＊　FROM　テーブル名　WHERE　カラム名　=　レコードa　OR　カラム名　=　レコードb;
SELECT　＊　FROM　テーブル名　WHERE　カラム名　=　レコードa　AND　カラム名　=　レコードb;

③あいまい検索
SELECT ＊　FROM　テーブル名　WHERE　カラム名　LIKE'%検索ワード%';　

※「%」ワイルドカードと呼ばれている。「%」を検索ワードの前後、もしくは前、後のどちらかに付ける事で検索結果の表示のさせ方を変える事ができる。

④レコードの追加
INSERT　INTO　テーブル名（カラムa,カラムb,カラムc）　VALUES(レコード1,レコード2,レコード3);

⑤レコードの更新
UPDATE　テーブル名　SET　カラム名　='新規レコード'　WHERE id　=　更新したい番号(id); 

⑥テーブル作成
CREATE　TABLE　テーブル名(カラム名a データ型,カラム名b データ型,カラム名c データ型);

⑦テーブルの結合
SELECT　カラム名　FROM　テーブル名a　JOIN　テーブル名b
                   ON テーブル名a.外部キー　=　テーブル名b.主キー;


今回は私が学習したSQLの構文をまとめました。参考にしていただけますと幸いです。
新社会人の初開発作業

今年からsier企業に就職し、今日からようやくvscodeを使用した開発作業を始めました。

既存システムのIEからedgeへの移行作業を行ったます。

ITはアウトプットすべきとよく聞くので、業務中に学んだことを気が向いたら書いていこうと思います。
サイバー攻撃について

# はじめに
本記事では、本日私が学習した分の`サイバー攻撃`について記述します。

# サイバー攻撃
コンピューターに不正侵入し、
`情報の盗聴や窃取`、データ改ざんや破壊などを行うことを言います。

組織や企業、個人を標的にするケースや、
不特定多数を無差別に攻撃するケース、その目的も様々です。

以下、サイバー攻撃方法を記述します。

## 標的型攻撃
`特定の組織`を標的に、
電子メールに`ウイルスを仕込む`攻撃です。

件名や本文を業務に関するようなものにしたりし、
`添付ファイル`を開かせようとします。

`標的が一定の組織`であることから、
ウイルス対策ソフトでは検知が難しく、
対策として、社員などに`情報セキュリティ研修`や`ダミーメールで訓練`するなどする必要があります。

前職場では、この攻撃をくらったことがあり、
ダミーメールを不定期に送って検査していました。

開いた社員はもれなく、データを全削除してました。。。

## 水飲み場攻撃
`標的型攻撃`の一種です。
多く利用する`Webファイル`に`ウイルスを仕込む`攻撃です。

## ビジネスメール詐欺
`金銭の窃盗`を目的とする攻撃です。
*標的型攻撃は、機密情報などの窃盗を目的にしています。

その企業の取引先を装い振込先のメールを送ったり様々なことをし、
金銭を振り込ませようとします。

## フィッシング詐欺
電子メールを発信して受信者を誘導し、
実在する会社などを`装った偽Webサイト`にアクセスさせ、
`個人情報を抜き取る攻撃`です。

不審なメールの特徴として、

- 誤った、不自然な日本語を使っている
- URLのドメインが正確に記載されていない
- 送信元のメールアドレスの文字列が本物と少し違っている

などがあります。

## 不正侵入
いくつか種類があります。

#### 辞書攻撃
`ユーザーIDを１つに絞り`、よく知られている初期パスワードや、
パスワードで利用されそうな単語を集録している`辞書データ`を活用してログインを試行する攻撃です。

#### 総当たり攻撃
ユーザーIDを１つに絞り、アルファベットと数字、記号を組み合わせたパスワードを総当たりし、
ログインを試行する攻撃です。

#### パスワードリスト攻撃
`複数のサービス`で使い回ししているユーザーIDやパスワードを悪用した攻撃です。

入手したユーザーIDとパスワードで、ログインを試行します。

## クロスサイトスクリプティング
攻撃者が用意したトラップや有害な文字列を、
利用者のWebブラウザを通して脆弱なWebサイトに送り込み、
利用者のWebブラウザ上で実行させることで、
利用者のcookie情報や個人情報などを盗む攻撃です。

```
わかりにくいので、流れ説明。

①攻撃者がWebサイトにトラップを仕込む。

②利用者がそのWebサイトを閲覧する。

③そのWebサイトがリンクなどで、脆弱なWebサイトへ利用者を誘導する。

④利用者が脆弱なサイトを閲覧する。

⑤そこで被害を受ける。

⑥マルウェア感染
```

という流れです。

https://qiita.com/mkato1013/items/01a627b8ca30d70304f3

## SQLインジェクション
`データベースと連携している脆弱なWebページ`の入力領域に、
トラップや有害な文字列を埋め込み、データベースのデータを不正に取得したり、
改ざんや削除をする攻撃です。

以上です。

# 終わりに
前職で、このような攻撃にあった経験があり、
攻撃を受けてしまうとその後の仕事のリカバリーが大変です。
大変でした。
セキュリティについてももう少し学習していこうと思います。

以下参考サイトです。
[クロスサイトスクリプティング（XSS）とは｜攻撃の仕組みと対策方法を解説](https://www.amiya.co.jp/column/cross_site_scripting_20210118.html)
[SQLインジェクションを防ぐ対策とは｜わかりやすく仕組みを解説](https://www.amiya.co.jp/column/sql_injection_20200518.html)

明日も頑張ります！
ABC181 C - Collinearity を解いた。おまけ B 問題付き

https://atcoder.jp/contests/abc181/tasks/abc181_c

![abc181_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/f1d68148-8953-23fc-8ec0-7bd3a553aced.png)
![abc181_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/d2cd0e92-df51-6333-e302-71bd17bdcbfa.png)
![abc181_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/f184a40b-3d0e-1872-a4c1-390d0e61453f.png)

100C3 : 全探索しても ザックリ O(300000)。
間に合う。

```abc181c.py
N = int(input())
lis = []
for _ in range(N):
    x,y = map(int,input().split())
    lis.append([x,y])
 
from itertools import combinations
for a,b,c in combinations(range(N),3):
    if (lis[a][0]-lis[b][0])*(lis[a][1]-lis[c][1]) == (lis[a][0]-lis[c][0])*(lis[a][1]-lis[b][1]):
        print("Yes")
        exit()
print("No")
```

https://atcoder.jp/contests/abc181/tasks/abc181_b

サクッと書いて TLE。理由もコメントで入れました。

```abc181b_ng.py
N = int(input())
memo = []
 
for _ in range(N):#O(10^5)
    a,b = map(int,input().split())
    memo.extend(range(a,b+1))#worst O(10^6)
print(sum(memo))
##maximum O(10^11) => TLE
```

対策はこれ。

https://univ-juken.com/wp-content/uploads/2020/01/tousa-suretsu-zukei2.png


```abc181b_ok.py
N = int(input())
memo = []
 
def cal(n):#n が偶数、奇数の何れでも必ず 2 で割り切れる
    return (n*(1+n))//2
 
for _ in range(N):
    a,b = map(int,input().split())
    memo.append(cal(b)-cal(a-1))
print(sum(memo))
```
jquery と cssの読み込み順序について (importantも含む)


cssの読み込みをする場合、読み込み順序がバッテングしてどれが反映されているかわからなくなることが合ったため整理してみた。

読み込み → `style.css, preindex.js, index.js`の3つ
preindex.jsは上に配置、index.js下に配置
cssは上で別ファイルを読み込み、html上で定義しているものもある。

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
  <script src="preindex.js"></script>
  <link rel="stylesheet" href="style.css">
  <style type="text/css">
    .test{
      background-color: gold !important;
    }
  </style>
</head>
<body>
  <div>
    <div class="test" style="width:300px;height:300px;"></div>
  </div>

  <style type="text/css">
    .test{
      background-color: black;
    }
  </style>
<script src="index.js"></script>
</body>
```

```style.css
.test{
  background-color: yellowgreen;
}
```

```preindex.js
let test = $(".test")
test.css(
  "cssText","background-color:red !important;",
);

//index.jsも同様
```


それぞれのファイルに背景の指定を行い、何が反映されるか検証。
jqueryを使ってcssをいじったらうまくいかなかったため、cssTextというプロパティを追加しました。
これは、完全にcssを上書きしてしまうもので全て書き換えてしまう。
つまり、widthを設定していたとしてもこの書き方をすれば、widthは当たっていなかったことになり背景だけが当たっていることとなる。
(プラス+ ではなく、削除してからプラスするイメージ)

### 結論
上から読まれ下の方が優先度としては高い という当たり前の結果に。
たとえjsが挟まれてたとしても、headでjsを読むのかbodyの下で読むのかによって優先度は変化する

より下に書かれているcssが反映され、!importantも例外ではなく
`<style type="text/css">
    .test{
      background-color: gold !important;
    }
  </style>`にimportant
index.jsにimportantをつけたとしても、後に読み込まれるjsの方が優先されるみたいですね。
jsにdeferをつけたら、黒色(html上の最後のやつ)が優先されて、後に読み込んでも優先はされないみたいですね。
【CSS】object-fitで画像の大きさを揃える

#はじめに#
　imgタグを使って画像を表示させたのはいいものの、大きさが合ってなくてガタガタになる・・・なんてことはないでしょうか。
CSSを使って大きさを揃えることができますので備忘録として残していきます。

#object-fit#
　object-fitを使うことで画像を指定したサイズにフィットさせることができます。
object-fitは、コンテナに対して、画像や動画をどのように表示するかを設定します。

```style.css
 image{
     object-fit: contain;
 }
```

このように指定することで、縦横比を維持しつつコンテナからはみ出さないようフィットさせることができます。

#色々な値#
 object-fitプロパティには、contain以外にも様々な値を設定することができます。

・fill:縦横比を無視して画像をコンテナにフィットさせます。
・cover:コンテナに余白が出ないよう、全体を覆う形で表示されます。はみ出す部分はトリミングされます。
・none:画像のリサイズはせずに縦横中央に配置します。
・scale-down:コンテナより画像が大きい場合はcontain、小さい場合はnoneを指定します。

#終わりに#
便利なプロパティなのでぜひ使ってみましょう！
Amazon WorkDocs とは

## 勉強前イメージ

docsだから文章の共有的なやつ？

## 調査

### Amazon WorkDocs とは

フルマネージド型のファイルコラボレーション用のサービスです。
コンテンツの作成や編集が簡単に行うことができ、
マルチデバイスからのアクセスに対応しており、AWS内で一元管理されているのでどこからでもアクセスが可能です。
GoogleDriveやDropboxと似たようなサービスです。
[Amazon workspace](https://qiita.com/miyuki_samitani/items/23d38070bae718f5c72b) を使用する人には追加料金無しで
workdocsへのアクセス権限が付与され、1人当たり50GBのストレージが含まれます。

### メリット

- コスト削減

アクティブなユーザアカウントとストレージの使用量に対する従量課金で、
1ユーザあたり5ドルで、各ユーザに1TBのストレージが提供されます。

- セキュアなファイル共有

すべてのファイルやコメントが暗号化されるので、
もしDBを見られたとしても直接中身が流出する可能性は低く、また通信も暗号化されています。
管理者はコンソールから各ユーザの変更履歴も見ることができます。

- シームレスに動機が可能

専用アプリケーションでPCにあるファイルを自動的に共有できます。
簡単にファイルの共有・バックアップが可能でスマートフォンにも対応しています。

- コンテンツリポジトリとしての利用が可能

workdocsを連携させることでコンテンツを定期的にスキャンしてレポートするということが可能です。

### デメリット

- ADとの連携が必要

workdocsだけでは運用ができず、ActiveDirectoryとの連携が必要です。
企業ではよく使用されるので、既存のADとの連携で使用することができます。

## 勉強後イメージ

安いのかな？あんまり良くわからん
めっちゃ使いたいって気にはならないけどworkspace使ってるならありなのかもしれない・・・・

## 参考

- [Amazon WorkDocsの特徴とできる事](https://www.acrovision.jp/service/aws/?p=1031)
- [企業内のファイル共有と円滑な業務推進を実現するAmazon WorkDocsとは](https://business.ntt-east.co.jp/content/cloudsolution/column-177.html)
DB操作の基礎勉強ノート(更新していきます）

### 普段DB操作などしないけど勉強したいので参考になる記事を集めてみる


##DBの基礎が勉強できる記事

新人研修の記事ですが、知見が全くない状態からでもわかりやすかったです。
https://qiita.com/devopsCoordinator/items/dca5aa9c155292f1c6ea
Railsで外部テーブルに条件をつけて数順で並び替える、外部テーブルにレコードがなくても表示する

## 前提
投稿の`Post`モデルと、投稿を評価する`Evaluation`モデルがあり、
`evaluations`テーブルには`posts`の外部キー`post_id`がある

`evaluation`には`status`というカラムがあり、enumで管理されており値は以下の通りである

``` models/evaluation.rb
  enum status: {
    bad: 0 ## 低評価
    good: 1 ## 高評価
  }
```

また、`post`は会員と管理者どちらでも投稿することができる
管理者が投稿する場合には`post.admin_id`に自分のidを入れる


簡略化したschema情報は以下の通りである

``` schema.rb
  create_table "posts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", force: :cascade do |t|
   t.bigint "admin_id"
  end

  create_table "evaluations", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", force: :cascade do |t|
    t.bigint "post_id", null: false
    t.integer "status", default: 1, null: false
    t.index ["post_id"], name: "index_evaluations_on_post_id"
  end
```

## 要件

**この場合に、評価なしの場合も含めてユーザーが投稿した投稿を高評価順に並び替えたい**


## コード

後の外部結合で使うため、条件付きのリレーションをpostモデルに作成しておく

``` model/post.rb
has_many :good_evaluations, lambda { where(status: :good) }, class_name: 'Evaluation'
```
コントローラーでは以下のように記述する

``` some_controller.rb
Post.left_joins(:good_evaluations)
     .where.not(admin_id: nil)
     .order('cnt_good desc')
     .group(:id)
     .select('posts.*, count(evaluations.post_id) ctn_good')
```

・ `left_joins(:good_evaluation)`で高評価されていないものも含めて取得したいため`left_joins`を使うが`left_joins`の中で条件を指定できないため、結合先を高評価のみの条件指定をしているリレーションを持ってくる
・　　`group(:id)`で外部結合されたevaluationの数を知りたいため投稿ごとにグルーピングする
・　　`count(evaluations.post_id)`で投稿ごとのレコード数を持ってくる


上記によって高評価のレコードがない投稿を含めて並び替えて取得ができる

## 実現できなかったクエリ


``` model/post.rb
has_many :evaluations, dependent: :destroy
```

``` some_controller.rb
Post.left_joins(:evaluations)
     .where.not(admin_id: nil)
     .where.not(evaluations: { status: :good })
     .order('cnt_good desc')
     .group(:id)
     .select('posts.*, count(evaluations.post_id) ctn_good')
```

これだと外部結合した後にwhereで絞り込んでいるのでinner_joinと同じような感じになってしまう
Xcode 実機にアプリアイコンが反映されない時

## 環境  
- MacOS Big Sur 11.6
- Xcode 13.0
- Swift 5.5

### 状況
Simulator, Xcode 内の Scheme ではアイコン画像は表示されているが実機だけ反映されない。
試せることは全部試した。

### 解決
アイコン画像が反映されていない開発アプリを削除せずに、iPhone 再起動。
ワークフローのスクリーンショットを保持したままコピーする

#はじめに

かなり初歩的な内容ですが、自分が最近まで知らなかった＋意外と忘れそうなので、備忘録として残します。

#xamlファイルのコピーで不便なこと

他プロジェクトで再利用したい部分があった場合、私は該当部分をコピーして新規プロジェクトにペーストしていました。
すると…

##元プロジェクトでのアクティビティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/b697f224-5999-c5bb-687f-4e01035e9f58.png)

##コピーしたアクティビティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/6e09a200-a95f-78f7-2a39-51a34e50f102.png)

Oh…このように参考スクリーンショットが参照できなくなっています。
（画像ではアプリケーションを開くアクティビティのみを別シーケンスにコピーしていますが、xamlファイルごとコピーしても同様に参考スクリーンショットは参照できません）

それもそのはず、参考スクリーンショットを保管しているのは「.screenshots」というディレクトリなのです。
ただ該当部分のアクティビティやファイルをコピーしただけでは、参照できるはずもありません。

##.screenshotsディレクトリの場所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/fd7b892b-043b-9b9e-7a29-61801fe19abc.png)

私はこの問題について「そういうもんなんだな…」と思い、愚直にコピペしては参考スクリーンショットを撮りなおす（？！）といったことを
繰り返していました。しかし、ちゃんとUiPath Studioにはスクリーンショットを保持したままコピーする機能がありました。

#ワークフローをインポート

それが、「ワークフローをインポート」という機能です。
以下にてワークフローのインポート手順を解説します。

##手順

###①インポート先のプロジェクトのプロジェクトウィンドウを右クリック「ワークフローのインポート」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/727e0a36-e7ec-6e73-d813-64feaaffb665.png)

###②対象のワークフローを選択
今回は「ExecutePowerShell」をインポートしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/46cdbf66-8269-6e92-c4aa-d465b2782cd5.png)

###③インポート先のプロジェクトにxamlファイルが追加されたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/2340b010-63e9-3658-ca84-e2d0ec4f2b02.png)


###④インポート先プロジェクトにて参考スクリーンショット含めてコピーされていることを確認
無事にxamlファイルがインポートされていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/c6714c71-5908-6f20-025a-1e7006286a88.png)

#おわりに
毎回参考スクリーンショットを撮りなおしていたという恥ずかしい二度手間を何の抵抗もなく受けて入れていたことを反省するとともに、これからUiPathを扱う方が同じ轍を踏まないことを願ってこれを書きました。

何かありましたらコメントいただけますと幸いです。
python-docxで日本語用のフォントを設定する

## できること
「日本語用のフォント」を設定できるようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/4ddca1bb-4bdc-2bd9-d2de-64d1cf264a80.png)

## 利用法
```Python3:real_usecase.py
# 東アジア言語用のフォント設定をします
paragraph.runs[0].font.name_eastasia = "ＭＳ ゴシック"
```

## 設定
python-docxのファイルをいじって、東アジアの言語（いわゆるCJK Languageだと思われる）に対応させます。
私はminicondaを利用していますが、各自の環境に合わせていじるファイルの場所を特定してください

```Python3:miconda3/envs/<MY_ENVIRONMENT>/Lib/site-packages/docx/text/font.py/Font
# 以下の部分をnameのgetter/setterの後あたりに追加
    @property
    def name_eastasia(self):
        """
        Get or set the typeface name for this |Font| instance, causing the
        text it controls to appear in the named font, if a matching font is
        found. |None| indicates the typeface is inherited from the style
        hierarchy.
        """
        rPr = self._element.rPr
        if rPr is None:
            return None
        return rPr.rFonts_eastAsia

    @name_eastasia.setter
    def name_eastasia(self, value):
        rPr = self._element.get_or_add_rPr()
        rPr.rFonts_eastAsia = value
        rPr.rFonts_hint = "eastAsia"

```

```Python3:miconda3/envs/<MY_ENVIRONMENT>/Lib/site-packages/docx/oxml/text/font.py
# 以下の部分をrFont_hAnsiのgetter/setterの後あたりに追加
    @property
    def rFonts_eastAsia(self):
        """
        The value of `w:rFonts/@w:eastAsia` or |None| if not present.
        """
        rFonts = self.rFonts
        if rFonts is None:
            return None
        return rFonts.eastAsia

    @rFonts_eastAsia.setter
    def rFonts_eastAsia(self, value):
        if value is None and self.rFonts is None:
            return
        rFonts = self.get_or_add_rFonts()
        rFonts.eastAsia = value

    @property
    def rFonts_hint(self):
        """
        The value of `w:rFonts/@w:hint` or |None| if not present.
        """
        rFonts = self.rFonts
        if rFonts is None:
            return None
        return rFonts.hint

    @rFonts_hint.setter
    def rFonts_hint(self, value):
        if value is None and self.rFonts is None:
            return
        rFonts = self.get_or_add_rFonts()
        rFonts.hint = value
```
SourceTree で Azure DevOps に繋ぐ方法 2021/10/18


# 背景

以下で記述はされているんですが、今はもう少し楽になっているので備忘録
※いつからかは不明。去年も楽にできた記憶。

https://qiita.com/tajima440/items/336a730c3c7d29429b39

# 環境

- SourceTree 3.4.6<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/07d22577-df5b-9c45-1162-23cb1c75f696.png)

# 方法
## Azure DevOpsから必要な情報の取得
:::note info
Windows + V でクリップボード履歴を有効化しておくと（Windows10 以降)
VS-Code とかへのペースト作業がなくなるので便利
:::
1. ホストURL取得<br>アドレスバーからURLをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/3bd329a3-23c0-50d7-ef52-6c92f055ae78.png)

1. Username と Password(PAT: Personal Access Token) の取得
下図のようにして、Credentialsを生成して取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/31c832de-3ab6-4cfb-2e0e-050a7a3a3c26.png)


:::note info
既存の PAT は以下から設定変更可能
:::
### 編集メニュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/a6489d88-fa60-0c0b-8398-a9cbaf6c2183.png)
### 編集画面：削除や無効化、権限の詳細設定（Edit）とか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/ecb6e88c-1c2c-9354-51a8-6aaa2c3d7b2e.png)

## SourceTree での設定
1. アカウント追加
    1. アカウントを追加
    1. ホストURLを貼り付け
    1. Username を貼り付け
    1. Password を貼り付け
    1. 認証させて完了<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/87e90483-fd3e-2fd4-ca84-c9ae745ce8e2.png)
1. アカウントに紐づいたリポジトリが表示されるのでクローンするだけ<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/82720c19-8b37-76b2-3b4e-fff8bf1a567a.png)


:::note warn
URLとして正しくありません、と出た場合以下を試してみると改善されるかも
:::
### プロキシーの設定
実際のエラー<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/0c040ffe-5023-654a-18c8-0734a16d8ce0.png)
対処法<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/27460636-0040-b178-21ce-e446af0918cd.png)

ターミナルでの設定・確認例：たぶんこっちは不要

```bash:Proxy設定例
git config --global https.proxy 123.456.789.000:1234
```

```bash:Proxy確認例
git config --global -l
```
参考

https://qiita.com/HibiU1/items/76ac6edb43cffd9da081
dismissはdelegateで親ビューからしなければいけないらしい。

dismiss
--
通常modalで遷移した後に親ビューに戻るときはdismissメソッドを使ってなんの疑いもなく戻ってました。

が、しかし！！！
本来は親ビューからdismissメソッドを呼ぶ責任があるらしい。公式ドキュメントにもそう書いてある。
なお理由はよく分からないんですが、公式ドキュメントのいうことは絶対だ！！と思い、今後はそう書くことにしました。


例コード

```swift
class ParentViewController:UIViewController {

///①どこかでModal画面遷移する

//④ どこかで こビュー.delegase = self で僕が委任するよ！とする
//⑤ メソッドを呼び出して
func メソッド名(controller:ChildViewController) {
 controller.dismiss(animated:true,completion:nil)
//ここでdismissする！
}

}
protocol DismissDelegate:AnyObject {
 func メソッド名 (controller:ChildViewController)
}

class ChildViewController:UIViewController {
//②遷移先を作成しdelegateメソッドと上記のプロトコルを作成
weak var delegate:DismissDelegate


///③引数を自分にしてdismissしたい部分で下記を呼び出す
self.delegate.メソッド名（controller:self）
}

うーむIOSは奥が深い、、
git checkout -b出来なくなった

最近転職しました。新規に入ったプロジェクトではブランチ名の頭に#をつけるのがルール。

早速masterからgit checkout -bで新しいブランチを切ります。
```git checkout -b #hoge```
張り切ってエンター！
```error: switch `b' requires a value```
**ファッ！？**

調べたところ#がつく場合コメント扱いになってしまいシングルクオートで囲わないといけないそう

再び張り切って
```git checkout -b '#hoge'```

無事#hogeブランチができました
Rust(5) LT＆パネルを企画するにあたって

TOPPERS開発者会議
https://toppers.jp/devconf.html

>パネルディスカション & LT
日　：2021年10月24日(日) 
場　所：Zoom
16:00 - 18:00
TOPPERSとRustの今後について考えよう
モデレーター　小川 清 氏（開発者会議実行委員）
高田広章氏、 河田 智明氏、杉本明加氏と共にRustとRTOSをテーマに議論します。
前半では、TOPPRESの上でRustを動かす事例、C言語以外の言語でTOPPERSを実装した事例を紹介していただきます。
Rustから見たTOPPERSやRTOSあるいはTOPPERSから見たRustについて、その可能性や課題、将来への期待や提案などについてお話ししていただきながらTOPPERSとRustの今後について、みなさんと一緒に考えてみたいと思います。 新しい試みとして、RustとRTOSをテーマにLT(~~10-20~~5-10分程度)を募集します。
RustでRTOSを作ることに関する考察や、実装してみた例などをお待ちしています。
TOPPERS以外のOSも歓迎です。未完プロダクトの紹介でも構いませんので、お気軽にご応募ください！
（LT応募方法は後日参加者宛に案内しますので、ご興味のある方はひとまず参加申し込みお願いします）

なお、下記は、モデレータの案です。実際には、当日、開催直前に合意した方法によります。

# 原則（案）
公序良俗、公共の福祉に反しない限り、何を言っていただいても結構です。

# 展開 LT 1回目（案）
LT１回目は１人５分で申込者全員を回す方向で調整。

# 展開 LT２回目（案）
LT２回目は、５分を超える時間を用意された方用で、
制約条件として、最初の１回目の誰かの発表との関係を加えること。

一番望ましいのは、１ページごとに、このページは誰のどのLTと関係があるとか。
全体で一人でもよい。

# パネル
パネラに１人３分以内で、一番気になった人のLTへの意見（賛成、反対、批判、よいしょ、別の視点の提供、他の技術との接続など）を述べてもらう。

全員、一人１分以内で意見を述べる。

誰かと同じ意見は禁止。必ず別の視点を提供する。

「XXと同じですが」という前置きの時間は無駄時間。

# 参考資料
TOPPERS開発者会議にて、当社スタッフが講演します
https://solid.kmckk.com/SOLID/archives/5087

## 自己参照
「Rust Advent Calendar 2021」集計してみる
https://qiita.com/kaizen_nagoya/items/f6431cec90a49879dcd8

RustのLT＆パネルを企画するにあたって
https://qiita.com/kaizen_nagoya/items/dca0e71fddc189ad622f

Programming Rust on docker(149)
https://qiita.com/kaizen_nagoya/items/d71b2c1932562ac1ecfc

初めてのRUST
https://qiita.com/kaizen_nagoya/items/dd8f5e3b218d48fb79e1

RUPT入門
https://qiita.com/kaizen_nagoya/items/b3a42bf5a849dabe52c5

dockerでRUST
https://qiita.com/kaizen_nagoya/items/c07350f6ab6ec656c42c

# Reference
Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

C++ Support(0)　
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514

Coding Rules(0) C Secure , MISRA and so on
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0

Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
#### 文書履歴(document history)
ver. 0.01 初稿 20210725
ver. 0.02 タグ追記　20221105
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
【Vue.js】双方向データバインディング v-model

#はじめに
こんにちは！　松本　佑大（まつもと　ゆうだい）と申します！
今回は双方向データバインディング v-modelについてアウトプットしていきます！

#双方向データバインディング、v-modelとは
双方向データバインディングとは、

dataオブジェクトの値変更:point_right_tone4:テンプレートの値変更
に加えて
dataオブジェクトの値変更:point_left_tone4:テンプレートの値変更

というように双方向にデータをバインディングすることを指します。

v-modelは双方向データバインディングを実行するときに使用するディレクティブになります。

#書き方
```HTML:HTML
<p>
  <input type="text" v-model="message">
</p>
<p>
  <input type="text" v-model="message">
</p>
<pre>{{ $data.message }}</pre>
```

```Vue.js
var app = new Vue({
    el:'#app',
    data:{
      message=`Hello Vue.js`
    }
})
```
![スクリーンショット 2021-10-10 20.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/9095a141-7b44-27fd-a83a-2e2b3ed428ea.png)

書き方は`v-bind`とさほど書き方は変わりません。しかし、`v-bind:value`ではなく`v-model`とすることによって上記画像のように双方向にデータをバインディングすることが可能になります。


#まとめ
・`<input type="text" v-model="message">`と記述する。
・`value`はいらない。

#最後に
今回は双方向データバインディング v-modelについてアウトプットしました。
今回の記事を読んで気になったこと、質問等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
IBM Cloud: ROKS(Red Hat OpenShift on IBM Cloud)のworker nodeにsshでログインできるように構成する

#1. SSHの構成

実際は、DaemonSetとかを作ればいいんだろうけど、その前の事前動作確認ということで。

```shell:node情報を取得
[root@new-syasuda-tok1-vpc1 ~]# oc get nodes -oname
node/10.0.0.25
node/10.1.0.17
```

```shell:debugコンテナでnodeにアクセス
[root@new-syasuda-tok1-vpc1 ~]# oc debug node/10.0.0.25
Creating debug namespace/openshift-debug-node-stfkg ...
Starting pod/100025-debug ...
To use host binaries, run `chroot /host`
Pod IP: 10.0.0.25
If you don't see a command prompt, try pressing enter.
sh-4.4# 
```
```shell:chrootでホスト環境に移動
sh-4.4# chroot /host
```

```shell:公開鍵を配置
sh-4.4# mkdir /root/.ssh
sh-4.2# vi /root/.ssh/authorized_keys
（公開鍵をコピーする）
sh-4.2# chmod 600 /root.ssh/authorized_keys
```
```shell:sshdを構成
sh-4.2# vi /etc/ssh/sshd_config
#PermitRootLogin no
PermitRootLogin yes
sh-4.2# systemctl restart sshd
```

#2. テスト

```
[root@new-syasuda-tok1-vpc1 ~]# ssh 10.0.0.25
Authorized uses only. All activity may be monitored and reported.
Last login: Mon Oct 18 06:27:02 2021 from 10.0.0.4
[root@kube-c3j463dt0o165mnm7be0-privonlysya-default-000009a0 ~]#
```
Databricksにおける機械学習の10分チュートリアル

[10\-minute tutorials: Get started with machine learning on Databricks \| Databricks on AWS](https://docs.databricks.com/applications/machine-learning/tutorial/index.html) [2021/6/11時点]の翻訳です。

このセクションのノートブックは、皆様がDatabricksの機械学習に関連する機能をすぐに使い始められるために提供されています。これらでは、データロード・準備、モデルトレーニング、チューニング、推論、モデルのデプロイメントおよび管理までを含む機械学習ライフサイクルにおいて、どのようにDatabrikcsを活用するのかを説明しています。ここでは、ハイパーパラメーターチューニングを自動化するための[Hyperopt](https://docs.databricks.com/applications/machine-learning/automl-hyperparam-tuning/index.html#hyperopt-overview)や、モデル開発のための[MLflowトラッキング](https://qiita.com/taka_yayoi/items/ba0c7f46ff7c3dbf87bb)、オートロギング、モデル管理のための[モデルレジストリ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995)のような有用なツールが説明されています。

# scikit-learnノートブック

| ノートブック | 要件 | 機能 |
|:--|:--|:--|
| [機械学習クイックスタート](https://qiita.com/taka_yayoi/items/22f45cc82f6b5b1170ad)  |Databricksランタイム7.5ML以降   |分類モデル、MLflow、HyperoptとMLflowを用いたハイパーパラメーターチューニングの自動化   |
|[モデルレジストリを用いた機械学習](https://docs.databricks.com/applications/machine-learning/train-model/sklearn-tutorial.html)   |Databricksランタイム7.0ML以降   |分類モデル、MLflow、HyperoptとMLflowを用いたハイパーパラメーターチューニングの自動化、モデルレジストリ   |
|[エンドツーエンドのサンプル](https://qiita.com/taka_yayoi/items/f48ccd35e0452611d81b)   |Databricksランタイム6.5ML以降   |分類モデル、MLflow、HyperoptとMLflowを用いたハイパーパラメーターチューニングの自動化、XGBoost、モデルレジストリ、モデルサービング   |

# Apache Spark MLlibノートブック

| ノートブック | 要件 | 機能 |
|:--|:--|:--|
|[MLlibによる機械学習](https://docs.databricks.com/getting-started/spark/machine-learning.html)   |Databricksランタイム5.5LTS以降   |ロジスティック回帰モデル、Sparkパイプライン、MLlib APIを用いたハイパーパラメーターチューニングの自動化   |

# ディープラーニングノートブック

| ノートブック | 要件 | 機能 |
|:--|:--|:--|
|[Kerasを用いたディープラーニング](https://docs.databricks.com/applications/machine-learning/train-model/keras-tutorial.html)   |Databricksランタイム7.0ML以降    |ニューラルネットワークモデル、インラインのTensorBoard、HyperoptとMLflowを用いたハイパーパラメーターチューニングの自動化、オートロギング、モデルレジストリ  |

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
添付ファイル付きPDFにMBOXを変換する方法

MBOXを添付ファイル付きPDFに変換する場合は、専門家が<strong><a href="https://www.zooksoftware.com/mbox-to-pdf/">ZOOK MBOXをPDFコンバータ</a></strong>に使用することをお勧めします。 これは、MBOXからPDFへの変換を実行するための最も顕著なソリューションです。 これは、安全にPDFにMBOXをエクスポートし、PDF形式にMBOX電子メールを印刷することができます。 これは、ユーザーがMBOXを添付ファイル付きPDFに変換するためのシンプルで分かりやすいソリューションです。

<h2>MBOXのPDFコンバータの主な特長</h2>
1.バッチMBOXをPDF形式に変換します。
2. MBOXをPDFファイルに完全に変換します。
3. MBOXをPDFファイルに保存するフォルダ構造を維持します。
4.ユーザーフレンドリーなインターフェースは、MBOXからPDFへの変換を容易にします。
5. Thunderbird、Mac Mail、Eudora、EntourageなどのすべてのMBOXベースの電子メールクライアントに完全に対応可能
<h2>MBOXをPDFファイルに変換する2ステッププロセス</h2>
1. MBOXをPDFコンバータにダウンロードする
   ![step1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2188983/fbab5359-e098-4dd6-ae87-482a3acab6e9.png)

2.[MBOXファイル/フォルダ]を選択します.
   ![step2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2188983/2c5b3210-63c8-cfef-3b2c-34e39ca853ac.png)

3.目的地の場所を選択します。

![step3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2188983/1183f3b9-f3e1-3d9e-65e6-daa88f6ee07b.png)

4.変換ボタンを押します。

![step4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2188983/64b10b56-fbba-7b28-86f5-2e22c60eb2ff.png)


自由ダウンロード元： - http://www.zooksoftware.com/trials/mbox-to-pdf.exe
Databricksにおける機械学習チュートリアル

[Machine learning tutorial \| Databricks on AWS](https://docs.databricks.com/applications/machine-learning/ml-quickstart.html#) [2021/6/11時点]の翻訳です。

> **プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。

Databricksで機械学習をスタートする最も手っ取り早い方法は、モデルトレーニングのチュートリアルノートブックを開くことです。[スタートページ](https://qiita.com/taka_yayoi/items/bb475b184e335733a3c3)で、右上の**Start guide**をクリックします。ノートブックでは、MLflowによるモデル開発のトラッキングや、ハイパーパラメーターチューニングの並列実行、モデルのパフォーマンスの比較・分析、推論へのモデル活用など、機械学習にDatabricksを使うことのメリットが数多く説明されています。
![](https://docs.databricks.com/_images/ml-quickstart.png)

機械学習、ディープラーニングの追加のチュートリアルについては、[Databricksにおける機械学習の10分チュートリアル](https://qiita.com/taka_yayoi/items/24d240adabb63291643e)をご覧ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
AzureCLIにWebAPIのデプロイテスト

# 要約

* なるべくAzureCLIでやりたい人向け
* 細かい説明は省いています（ほぼ備忘録）
* AzureCLI
    * Azureポータルから数回のクリックでAzureCLIが使えるようになる
        * ストレージアカウント必須
        * 参考：https://docs.microsoft.com/ja-jp/azure/cloud-shell/quickstart
    * 上記でストレージ作成後、Windows Terminalから行うのがおすすめ
* 構成の概要
    * ResourceGroup（課金単位）
        * AppService（アプリだけを載せられるサービス）
        * AzureSqlserver（DB）
        * Storage Account（ストレージ）

## Create ResourceGroup

```sh
$resourcegroup = "test"
# 東日本をこれで探す
az account list-locations | grep japan
# 上のコマンドででたロケーションにリソースグループを作成
az group create --name $resourcegroup --location "japaneast"
```

## Create AppService

```sh
$resourcegroup = "test"
$webappname = "testapp"

# create appservice plan
# skuは適宜変更
az appservice plan create --name $webappname -g $resourcegroup --sku S1 -l "japaneast"
# create appservice
az webapp create --name $webappname -g $resourcegroup --plan $webappname
# 作成したappserviceのipアドレスを取得
# 下記のSqlServerのファイアウォール設定で使うのでメモする
az webapp config hostname get-external-ip --webapp-name $webappname -g $resourcegroup

```

## Create AzureSqlserver

```sh

$sqlserver = "testsqlserver"
$resourcegroup = "test"
$sqluser = "user"
$sqlpass = "pass"
$dbname = "testdb"

# create sqlserver
az sql server create -n $sqlserver -g $resourcegroup -l "japaneast"  -u $sqluser -p $sqlpass
# set firewall
# ファイアウォール設定は上記のappserviceのipアドレスを入れる [appservice_ip]
az sql server firewall-rule create -g $resourcegroup --server $sqlserver -n "[appname]" --start-ip-address "[appservice_ip]" --end-ip-address "[appservice_ip]"
# その他のファイアウォール設定 管理者のアドレスとかをいれる
az sql server firewall-rule create -g $resourcegroup --server $sqlserver -n "[name]" --start-ip-address "[ip]" --end-ip-address "[ip]"
# create DB
# collationやmax-sizeは適宜変更
az sql db create -g $resourcegroup --server $sqlserver -n $dbname --edition Basic --bsr Geo --collation "Japanese_XJIS_100_CI_AI_WS" --max-size 2147483648 

```

### 確認事項
* セキュリティセンター
  * "Azure Defender for SQL"を有効にする
* ファイアウォールと仮想ネットワーク
  * "Azure サービスおよびリソースにこのサーバーへのアクセスを許可する"を"はい"にする

## Create Storage Account

```sh
$storagename = "teststorage"
$resourcegroup = "test"
# storage accountの作成
# skuは適宜変更　access-tierも適宜変更
az storage account create -n $storagename -g $resourcegroup -l "japaneast" --access-tier "Cool" --sku "Standard_LRS" 
# update用の定義ファイルを置いておく
az storage blob service-properties update --account-name $storagename --static-website --404-document "update.xml" --index-document "update.xml"


```
Azureを使用したインフラ環境構築（超初心者向け）



# Azureを使用したインフラ環境構築  
（超初心者向け）

## 目的
　パブリッククラウドであるAzureを使用しインフラ環境を構築してみる。

## 目標
　Azure上のWindows Serverで動作するWEBアプリケーション環境を構築する。
　目指す構成は以下の通り。まずはミニマムスタートでAzureに慣れる。
　![Azure構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100775/cae35cd8-8514-c884-9dc8-2308886e24e7.jpeg)

　
## やること
1. 基礎知識習得
1. 構築作業  
1. 接続確認
1. 構築作業・・・続き

## やったこと  
1. 基礎知識習得
    1. Microsoft Learnを学習材料としてAzureの全体概要を掴む
    Microsoft Learn  
    Azure をはじめとする Microsoft の各種サービスの使い方をハンズオン形式で学ぶことができるサイトです。  
     [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/paths/az-900-describe-cloud-concepts/ "Microsoft Learn")  
     
    1. 各サービスの概要を確認  
    Azureのドキュメント  
    Microsoft Azure Cloud Services を使用して、強力なアプリケーションを構築し、管理する方法について説明されています。  
    ドキュメント、サンプルコード、チュートリアルなどを入手できます。  
    [Azureのドキュメント](https://docs.microsoft.com/ja-jp/azure/?product=featured "Azureのドキュメント")
　　　
1. 構築作業
   1. アカウント登録  
      1. アカウントの種類  
      Azureを利用するためのアカウントにはビジネス向けの「Azure AD アカウント」とコンシューマ向けの「Microsoft アカウント」が存在する。  
      今回は「Microsoft アカウント」を利用する。 
       
      1. アカウント登録  
      以下のURLにアクセスし、必要事項を入力し、アカウント登録  
      [アカウント登録](https://azure.microsoft.com/free "アカウント登録")
      
   1. リソースグループの作成  
   Azureでは作成される仮想マシンやストレージなどを指して「リソース」と呼びます。  
   リソースグループはAzureにおいて複数のリソースを管理するためのしくみであり、  
   リソースグループを利用することによってリソースグループに含まれるリソースを一覧表示したり、  
   複数のリソースを一括で削除したり、互いに関連するリソース同士をまとめて管理することができます。  
   以降では１つのリソースグループ内にサービスを含めていきます。
   
   1. 仮想ネットワークの作成  
   Azure内に他ネットワークと論理的に分離されたプライベートなネットワークを構築できるサービスです。
   作成したリソースグループに含めます。
   
   1. Web App Serviceの作成  
   Web App Serviceはインフラを管理することなく、任意のプログラミング言語で Web アプリケーション、  
   モバイル バックエンド、および RESTful API を構築し、ホストできます。  
主な特徴は    
      1. インフラを管理する必要がない(PaaSの特徴)
      1. 任意のプログラミング言語を動作させる事ができる  
           対応言語は、.NET、.NET Core、Java、Ruby、Node.js、PHP、Python
      1. WindowsとLinuxOSをサポートしている
      1. 自動的なスケールアップとスケールアウトによる高可用性
      1. 標準で自動デプロイに対応している(GitHub、Azure DevOps、Gitリポジトリ) 

   1. アプリケーションデプロイ  
   アプリケーションのデプロイには以下のような方法が参考に挙げられる。  
   今回は「Visual Studio」を経由のデプロイ方法で検証した。
      1. Azure ポータルからデプロイする
      1. ARM テンプレートを使ってデプロイする
      1. 予めビルドしておいたパッケージを PowerShell から手動でデプロイする
      1. Visual Studio からビルドした WebApp を直接 App Service としてデプロイする
      1. DevOps でビルドしたものを Azure Pipeline 経由でデプロイする  

1. 接続確認  
無事にAzure上のリソースにアクセスできました。
![Azure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100775/2084c140-eae0-ed2d-d3b0-1324402fe914.png)

  
1. 構築作業・・・続き  
基礎的なルートは疎通確認出来たので、今後取り組んでいきたいこと。   

      1. SQL Databaseの連携
      1. 可用性の向上（N-Act構成）
      1. Azure Application GatewayまたはAzure Load Balancerの連携
      1. 仮想マシンにWEBサーバを構築する方法とWeb App Serviceを利用する方法との比較

## コスト計算
コストを計算するにはAzureが提供している料金計算ツールが利用できます。  
     [料金計算ツール](https://azure.microsoft.com/ja-jp/pricing/calculator/ "料金計算ツール")

|#|サービス|費用|備考|
|---|---|---|---|
|1|Web App Service|0円|レベル：無料|
|2|仮想ネットワーク|0円|-|
|-|合計|0円||

## 作業記録
|#|作業|だいたいの作業時間|
|---|---|---|
|1|アカウント登録  |60分程度|
|2|リソースグループの作成|30分程度|
|3|仮想ネットワークの作成|20分程度|
|4|Web App Serviceの作成|60分程度|
|5|アプリケーションデプロイ|60分程度|
|-|合計|230分程度（4時間程度)|
超初心者としては「良し」とする

## AWSとのサービス比較
更新中
Databricks機械学習ホームページの説明

[Databricks Machine Learning home page \| Databricks on AWS](https://docs.databricks.com/applications/machine-learning/ml-dashboard.html) [2021/9/20時点]の翻訳です。

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

> **プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。

Databricks機械学習ホームページは、Databricksにおける機械学習におけるメインのアクセスポイントとなります。

このページにアクセスするには、Databricksワークスペースの左のサイドバーにマウスを移動します。マウスを移動するとサイドバーが展開します。サイドバーの上部にあるペルソナスイッチャーから**Machine Learning**を選択します。
![](https://docs.databricks.com/_images/select-persona.gif)

Databricks機械学習に属するページ([Feature Store](https://qiita.com/taka_yayoi/items/88ddec323537febf7784)、[モデルレジストリ](https://docs.databricks.com/applications/mlflow/model-registry.html)、[エクスペリメントページ](https://docs.databricks.com/applications/machine-learning/experiments-page.html)、あるいは、MLflow[エクスペリメント](https://qiita.com/taka_yayoi/items/ba0c7f46ff7c3dbf87bb#%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88)、[ラン](https://qiita.com/taka_yayoi/items/ba0c7f46ff7c3dbf87bb#%E3%83%A9%E3%83%B3)ページ)を訪れると、自動で機械学習ペルソナに切り替わります。

機械学習ペルソナがアクティブな際には、サイドバーのトップにあるDatabricksロゴ![](https://docs.databricks.com/_images/databricks-logo.png)をクリックすることで、Databricks機械学習ホームページに戻ってくることができます。

# Databricks機械学習ホームページの概要

Databricks機械学習ホームページには、Databricksにおける機械学習に必要なリソースへのクイックなアクセス手段を提供します。

- 上部には一連のショートカットがあります。空の[ノートブック](https://docs.databricks.com/notebooks/index.html)の作成、[AutoMLのスタート](https://qiita.com/taka_yayoi/items/0ed860131a02aeade14f)、[チュートリアルノートブック](https://docs.databricks.com/applications/machine-learning/ml-quickstart.html)を開くことができます。
- スクリーンの中央には、最近アクセスしたアイテムの一覧が表示されます。[ノートブック](https://docs.databricks.com/notebooks/index.html)、[登録されたモデル](https://docs.databricks.com/applications/mlflow/model-registry.html)、[特徴量テーブル](https://qiita.com/taka_yayoi/items/88ddec323537febf7784)、[エクスペリメント](https://docs.databricks.com/applications/mlflow/tracking.html)、[サービングのエンドポイント](https://docs.databricks.com/applications/mlflow/model-serving.html)がリストに表示されます。アイテムの名前をクリックするとオープンすることができます。
- サイドバーは、機械学習向けにカスタマイズされ[エクスペリメントページ](https://docs.databricks.com/applications/machine-learning/experiments-page.html)、[特徴量ストア](https://qiita.com/taka_yayoi/items/88ddec323537febf7784)、[モデルレジストリ](https://docs.databricks.com/applications/mlflow/model-registry.html)にアクセスできるようになります。
- スクリーン下部にドキュメントのリソースへのリンクが表示されます。
![](https://docs.databricks.com/_images/ml-dashboard-aws-gcp.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Salesforceブラウザ別タブでPDFファイルを表示する

##Salesforceブラウザ別タブでPDFファイルの表示について、本文にて整理します。

### Visualforceの場合
◆静的リソースのPDFをブラウザの別タブで表示する場合、apex:outputLinkタグを利用して、静的リソースを直接開くことが可能です。

```
<apex:outputLink value="{!URLFOR($Resource.PDFFileName)}" />
```
◆ContentVersionオブジェクトに登録されるPDFをブラウザの別タブで表示する場合、Visualforce側に特に制限がないため、通常のJSを利用して実現できることはVisualforce側でも実現できることです。
以下は実装列です。

```Apex側の実装.cls
@RemoteAction
global static List<String> getPdfData(String cvId) {
    
    // コンテンツバージョンを取得
    ContentVersion cv = [SELECT Id, PathOnClient, IsLatest, Title, FileExtension, VersionData
              	FROM ContentVersion WHERE Id =: cvId];
    List<String> result = new List<String>();
    result.add(EncodingUtil.base64Encode(cv.VersionData));
    result.add(cv.PathOnClient);
    return result;
}
```
ページ側の実装について、いくつかの案があります。

```ページ側の実装.page
{!$RemoteAction.ApexCtrl.getPdfData}(cvId, function(result, event){
    if(event.status) {

        // 案①
        let _pdfWindow = window.open("");
        _pdfWindow.document.write(
            "<iframe width='100%' height='100%' src='data:application/pdf;base64, " +
            encodeURI(result[1]) + "'></iframe>"
        );
        _pdfWindow.document.title = result[0];

       // 案②
       var byteCharacters = atob(result[1]);
       var byteNumbers = new Array(byteCharacters.length);
       for (var i = 0; i < byteCharacters.length; i++) {
           byteNumbers[i] = byteCharacters.charCodeAt(i);
       }
       var byteArray = new Uint8Array(byteNumbers);
       var file = new Blob([byteArray], {type: 'application/pdf'});
       var fileURL = URL.createObjectURL(file);
       window.open(fileURL);

       // 案③：PDF.js
       「PDF.js」を利用してポップアップ画面でPDFを表示することもできます。詳細の実装に対し、以下のサンプルを参照してください。
       https://mozilla.github.io/pdf.js/examples/
    }
});
```
### LWCの場合
カスタムLWCコンポーネントに対し、PDFをブラウザの別タブで表示することができないです。
上記の案①、②を利用して、LWCに実装されると、「Unsupported mime type」、「securewindow.open supports http:, https:, mailto: schemes and relative urls」のエラーが発生してしまう。
原因：カスタムLWCが「ユーザモード」として実行され、JSのドキュメント又はWindowsオブジェクトのアクセス権限がないため。
https://developer.salesforce.com/blogs/developer-relations/2016/04/introducing-lockerservice-lightning-components
目指せ200人生活サーバー！！


[統合版]
サーバーメンバー募集
ルールなどは全てdiscordにあります
24時間サーバーです
バージョン1.17.34
ーーーdiscordに入ったらまずやる事ーーーーー
1. 自己紹介テンプレートの文字をコピーして　自己紹介のところに貼り付けて名前などを書き換える
2. 1でやった後主が事前にipを見れるようにしてくれます
3 . ipをマイクラに貼り付ける
4. 後はルールに反さない様にサバイバル生活をしましょう！！
DISCORDはこちら！！　↓
https://discord.gg/weN9wN4Tyh

discord参加リンクが切れている場合は
　Fordan [フォーダン]#4821　　
　にご連絡お願いします！！！


discordをやっていない場合は今すぐダウンロードしましょう！！
https://discord.com/
【VSCode】editor.fontLigatures設定にはBoolean以外も設定できる

# はじめに

VSCodeで合字を有効にするために

```jsonc
"editor.fontLigatures": true
```

のように指定すると思いますが、この`editor.fontLigatures`の引数にはBoolean以外にも、`ss01`のようなStylistic Setsと呼ばれるものも指定できることを知ったので共有しようと思います。

# 方法

`true`/`false`の代わりに、`ss01`などのStylistic SetsのコードをString型で書くだけです。
全体を`"`で、それぞれの要素を`'`で囲んで、カンマ（`,`）区切りで記述します。

```jsonc
"editor.fontLigatures": "'ss01', 'zero'"
```

# 実際にやってみる

[Fira Code](https://github.com/tonsky/FiraCode)を使って、実際に細かい設定をしてみようと思います。
このフォントには、以下の画像のようにグリフを変えられます。
![Image](https://raw.githubusercontent.com/tonsky/FiraCode/master/extras/stylistic_sets.png)

今回は違いのわかりやすい`ss02`、`ss03`、`ss05`、`zero`を変えてみます。

まず、普通に`"editor.fontLigatures": true`と指定した場合がこちら。
上のスクリーンショットのDefaultに指定されている部分がすべて反映されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091433/c30f86c6-7009-87c8-3c29-ef2c52d3aa78.png)

そして、`"editor.fontLigatures": "'ss02', 'ss03', 'ss05', 'zero'"`と指定した場合がこちらです。
ここに指定した部分だけ別の文字セットが使われていて、指定しなかった部分はデフォルトのものが使われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091433/bce2a9d9-fc16-15d7-c20b-d2f313e3837b.png)

# Stylistic Setsはフォントによって違う

このStylistic Setsはフォントによって対応しているものが違うので、使えるかどうかはフォントを提供しているページで調べましょう。

# おわりに

スラッシュ0とドット0みたいな、合字とは別の部分の選択もできるので、より自分の好みの字形でエディタを使うことができますね。
さらに合字オフかつこの異字体を使うみたいな柔軟な設定ができたらなーと思ったり。

# 参考

* [Visual Studio Code October 2019](https://code.visualstudio.com/updates/v1_40#_font-feature-settings)
* [How to enable stylistic sets · tonsky_FiraCode Wiki](https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylistic-sets)
pip install chromedriver-binary が ssl.SSLCertVerificationError で失敗したときの解決方法

## はじめに

`pip install chromedriver-binary` コマンドを実行したとき、 ssl.SSLCertVerificationError エラーで失敗したため解決手順をメモします。

## 再現環境

+ MacOS 11
+ Python 3.9.6
+ pip 21.2.4 

## エラー時のログ

```sh
$ pip install chromedriver-binary
Collecting chromedriver-binary
  Using cached chromedriver-binary-95.0.4638.17.0.tar.gz (4.8 kB)
Building wheels for collected packages: chromedriver-binary
  Building wheel for chromedriver-binary (setup.py) ... error
  ERROR: Command errored out with exit status 1:
  （中略）
  running bdist_wheel
  running build
  running build_py
  
  Downloading Chromedriver...
  
  Traceback (most recent call last):
    File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py", line 1346, in do_open
  （中略）
  ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)
```

**ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate** とあるので、証明書検証時のエラーらしい。


## 解決方法

エラーメッセージをググったところ、次のコマンドを実行すればいいとのこと（以下 MacOS の場合）。

```
/Applications/Python\ 3.9/Install\ Certificates.command
```

上のコマンドを実行後、再び `pip install chromedriver-binary` を実行したところ無事インストールできました。


## 参考

https://github.com/authomatic/chromedriver_installer/issues/7
LWCにContentVersionファイル一括ダウンロードする

##LWCを利用して、Salesforceのコンテンツバージョンに登録される添付ファイルや画像を一括ダウンロードしてZIPファイルで圧縮する処理について、本文にて整理します。

#### LWC側のサンプルコード

```bulkdownload.js
import { loadScript } from 'lightning/platformResourceLoader';
import jszip from '@salesforce/resourceUrl/jszip'
import FileSaver from '@salesforce/resourceUrl/FileSaver'
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
import getAttachedFiles from '@saleforce/apex/BulkdownloadCtrl.getAttachedFiles';

初期表示時、JSロード処理とデータ取得処理を行う。
connectedCallback() {
    console.log('* connectedCallback');
    Promise.all([
        // 初期表示処理
        getAttachedFiles({ recordId : this.recordId}),
        // JSZIP、FileSaverのJSプラグインをロードする。
        loadScript(this, jszip),
        loadScript(this, FileSaverNew)
    ])
    .then(result => {
        // 初期表示処理
        // do something
    })
    .catch(error => {
        // Error
        this.showExceptionToast(error.body.message);
	    const event = new ShowToastEvent({
	        title: 'messageTitle',
	        message: error.body.message,
	        variant: 'error',
	        mode: 'sticky'
	    });
	    this.dispatchEvent(event);
    });
}

/*
添付ファイルを取得して、ファイルを圧縮する処理
※ここがファイル毎に非同期処理を実行して、ファイルを取得する理由について、一括で複数ファイルを取得して12MB、ヒープサイズガバナ制限(12MB)が抵触するため。
*/
let zip = new JSZip();
let zipCount = 0;                // 取得したファイル数
let zipFileName = 'testZipFile'; // ZIPファイル名

// 初期表示時に取得されたコンテンツバージョンID Listに基づいて、ループ処理を行う。
for(let i = 0; i < contentVersionIdList.length; i++) {
    let _cvId = contentVersionIdList[i];
    // コンテンツバージョンIDにより、非同期処理を呼出し、コンテンツバージョン情報を取得する。
    getAttachedFile({"contentVersionId": _cvId})
    .then(result => {
        // 取得したファイル情報をJSZIPに設定する。
        zip.file(result[0], result[2], {base64: true});
        zipCount = zipCount + 1;
        // 処理件数が最後となる場合、JSZIPをローカルに保存する。
        if (zipCount == contentVersionIdList.length) {
            zip.generateAsync({type:"blob"})
            .then(function(content) {
                saveAs(content, zipFileName);
            });
        }
    })
    .catch(error => {
        // Error
        this.showExceptionToast(error.body.message);
	    const event = new ShowToastEvent({
	        title: 'messageTitle',
	        message: error.body.message,
	        variant: 'error',
	        mode: 'sticky'
	    });
	    this.dispatchEvent(event);
    });
}
```
#### Apex側のサンプルコード

```BulkdownloadCtrl.cls
@AuraEnabled(cacheable=false)
public static List<String> getAttachedFile(Id contentVersionId) {
    ContentVersion cv = [SELECT Id, PathOnClient, VersionData, Title, FileExtension FROM ContentVersion
                                     WHERE Id =: contentVersionId AND IsLatest = true limit 1];
    
    List<String> result = new List<String>();
    result.add(cv.PathOnClient);
    result.add(EncodingUtil.base64Encode(cv.VersionData));
    return result;
}
```

### コード説明
添付ファイル一括ダウンロードできるキーポイントはファイル圧縮「JSZIP」、ファイル保存「FileSaver」のインポートです。
◆JSZIPのサンプルコードとソースのダウンロードは以下のリンクを参照する。
https://stuk.github.io/jszip/
◆FileSaverのサンプルコードとソースのダウンロードは以下のリンクを参照する。
https://github.com/eligrey/FileSaver.js
※JSZIP、FileSaverのプラグインはJSの共通のため、LWCだけでなく、ほかのWEB言語も利用できる。
Atomic Designを理解する①

#はじめに
みなさんはAtomic Designと聞いてすぐにイメージできますか？

私は最近仕事でAtomic Designに触れるようになり、なんとなーくイメージは掴んできていますが、分かりやすく他者へ説明できるかなと少し不安でした。そこで今回はAtomic Designについて簡単に言語化してまとめてみます。

今回の記事は二本立てとなっております。初心者でも理解できるような内容ですので、ぜひ読んでみてください！

#Atomic Designとは
Atomic Designとは、webページや画面をパーツ・コンポーネント[^1]単位で定義し、それらを組み立てて作るUIデザイン手法の一つです。画面構成要素を段階的に分解・部品化することで、画面部品の統⼀性や再利用性を高める手法となっています。


<blank/>
<blank/>
これだけだとよくわからないと思うので、もう少し簡単に説明しますと...
<blank/>
<blank/>
UIコンポーネントを粒度に応じたカテゴリーに明確に区別し利用するデザインの方法がAtomic Designというわけです。例えば、「入力テキストボックス」というコンポーネントを用意します。そして、「入力テキストボックス」が必要な場所にそのコンポーネントを配置し画面を作っていきます。カテゴリーを明確にした素材（UIコンポーネント）を用意し配置・組み立てることで画面を作っていく。これが一連の流れと言えます。

次の章では具体的にどういったカテゴリーで分けてデザインするのか説明していきます。


#Atomic Designの考え方
「atomic design」では画面の構成要素を以下のような段階で分解、コンポーネント化しています。
<blank/>
<b>★Atomic Designの構成要素</b>
1. Atoms（原子）
2. Molecuels（分子）
3. Organisms（有機体（生体））
4. Templates（テンプレート）
5. Pages（ページ）

それぞれがどういった役割を持っているか、以下の表にまとめました。

|レベル  |名称  |役割  |
|:--:|:--:|---|
|1   　　　|Atoms  |「ボタン」「ラベル」のような、これ以上分解できないUIコンポーネント。  |
|2   　　　|Molecuels  |Atomの組み合わせたコンポーネントの単位で、「入力フォーム」のような単一の機能を提供する。 |
|3   　　　|Organisms  |AtomsとMolecuelsを組み合わせたコンポーネントの単位で、独立して機能し、他のページでも同じ意図で使うことが可能とします。  |
|4   　　　|Templates  |Atoms、Molecuels、Organismsの組み合わせで、何もデータがない空っぽのページというイメージ。  |
|5   　　　|Pages  |Templatesにデータを流し込んだもの。ユーザが利用する画面そのもの。  |

以下イメージ図です。
実際の画面をコンポーネントを見てみるとイメージがしやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/9c4e0c62-ba9d-2d1f-9e13-fa1d7ec802c6.png)
（引用 : https://atomicdesign.bradfrost.com/chapter-2/）

#Atomic Designのメリット・デメリット
ここまで「Atomic Design」の概要について説明してきました。ここまで読んでくださった方は、「結局このAtomic Designは何が良いの？」と思いましたよね。本記事では最後に、「Atomic Designのメリット・デメリット」を説明します。

###Atomic designのメリット
まずはメリットから見ていきます。ざっとメリットを挙げると以下のようなことが考えられます。
<ul>
<li>スタイルを書く回数がめちゃくちゃ減り、デザインの効率が格段に上がる</li>
<li>作成したコンポーネントを再利用できるため、ページデザインに統一感が生まれる</li>
<li>別の人が見ても、このコンポーネントがどういう役割を持っているかを理解しやすくなる</li>
<li>データの流れを追いやすくなる</li>
</ul>
それぞれの部品を再利用することで、デザインの効率が上がったり、デザインに統一感が生まれるなど、Atomic Designは非常に便利なデザイン手法となっています。

###Atomic designのデメリット
ではデメリットはどういったことがあるでしょうか。考えてみました。
<ul>
<li>プロジェクトの規模によってはコンポーネントの数が増え過ぎて、管理が大変になる</li>
<li>ルールを決めて管理、認識を統一しないと、コンポーネントを分割する粒度がバラバラになる</li>
</ul>
プロジェクトでルールを決めてコンポーネントを管理しないと、粒度がバラバラのファイルがたくさん増えて大変なことになりますね。Atomic Designはあくまでも手法の一つです。実際に開発する際は、ルールを決め、認識を揃え、適宜確認を取りながらプロジェクトを進めていく必要があります。

#まとめ

今回はAtomic Designについて簡単に概要をまとめてみました。ここまでの内容をざっくり言い換えると、Atomic Designとは、部品の組み合わせでUIを作れるようにするデザイン手法で、コンポーネントのグループやその役割は自由にカスタマイズできる。自由度が高い分、ルールをしっかり決めること、分割粒度をなど認識をしっかりチームでとっていくことが大切ということになります。


次回は、実際にAtomic Designを用いて開発した際に感じたことなどをまとめてみます！


[^1]: コンポーネント… 画面の部品（例えば入力テキストボックスや、戻るボタンなど）でOK