OmniAICreator/Qiita-1.07M huggingface dataset:
【SwiftUI】Viewを回転アニメーションさせる方法

# はじめに
SwiftUIでViewを回転アニメーションさせる方法を紹介します。この記事を読むと、SwiftUIでViewを回転アニメーションさせる方法を理解できます。

# 作るもの
SF Symbolsを回します。

https://twitter.com/shota_appdev/status/1676102696343080961?s=61&t=S-KppgfCsLquIc91X5lxsg

# やり方
```swift
import SwiftUI

struct ContentView: View {
    @State private var isAnimating = false

    var body: some View {
        Image(systemName: "fanblades")
            .resizable()
            .scaledToFit()
            .frame(width: 160, height: 160)
            .foregroundStyle(.cyan)
            .rotationEffect(.degrees(isAnimating ? 360 : 0))
            .animation(
                .linear(duration: 0.5).repeatForever(autoreverses: false),
                value: isAnimating
            )
            .onAppear {
                isAnimating = true
            }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```

## 解説

0.5秒かけて、360度回転するアニメーションを永遠に繰り返します。


```swift
.rotationEffect(.degrees(isAnimating ? 360 : 0))
```
Viewを回転させるには、rotationEffectを使います。rotationEffectには、回転する角度を指定します。isAnimatingがfalseのときは0度回転し、trueのときは360度回転します。

```swift
.animation(
    .linear(duration: 0.5).repeatForever(autoreverses: false),
    value: isAnimating
)
```
Viewをアニメーションさせるには、animationを使います。animationは、valueに指定した値が変更されたときに変化するViewのアニメーションを指定します。アニメーションの種類は第一引数に指定します。第一引数には、.linear(duration: 0.5).repeatForever(autoreverses: false)を指定しています。これにより、0.5秒かけて変化するアニメーションを永遠に繰り返します。

初期状態は、isAnimatingがfalseなので、Viewは0度回転しています。onAppearで、isAnimatingをtrueにすることで、Viewを360度回転します。これが永遠に繰り返されることで、Viewの回転アニメーションを実現しています。

# おわりに
SwiftUIでViewを回転アニメーションさせる方法を紹介しました。このテクニックを使うと、独自のローディングスピナーを作れそうですね。この記事が参考になったと思った方は、いいねとフォローしていただけると嬉しいです☺️
Railsチュートリアル３章まとめ

# 目的
静的なページの作成および自動化テストの作成

# 3-2 静的ページの生成
この章ではコマンドでのコントローラー作成方法について学びました。

・コントローラーの作成
コントローラーとアクションをまとめて指定することができ、コマンドラインでHomeページとHelpページ用のアクションもまとめて生成している

```
$ rails generate controller StaticPages home help
```
・変更の破棄
rails generateで作成したものを元に戻せる
```
$ rails destroy  controller StaticPages home help
```

・作成したメソッドはルーターへ追加する
```
Rails.application.routes.draw do
  get  "static_pages/home"
  get  "static_pages/help"
  root "application#hello"
end
```

# 3-3　テストから始める
この章ではテストの作成方法とテストの必要性について学びました。

・なぜテストが必要か
変更を行う際には、常に「自動化テスト」を作成して、機能が正しく実装されたことを確認する習慣をつける方が良い。
テストが揃っていれば、バグを追うために余分な時間を使わずに済むため
開発速度がアップできる。
上記のような考えをテスト駆動開発と呼ぶ。
テスト駆動開発（TDD）
「失敗するテストを最初に書く」
「次にアプリケーションのコードを書いて成功させる（パスさせる）」
「必要ならリファクタリングする」のように進む。

・StaticPagesコントローラのデフォルトのテスト
```
require "test_helper"

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

  test "should get home" do
    get static_pages_home_url
    assert_response :success
  end

  test "should get help" do
    get static_pages_help_url
    assert_response :success
  end
end
```
テストクラスではアサーションで正常に動作していることを確認する

# 3-4 少しだけ動的なページ
この章では、動的なページを作成する技法を学びました。

・やること
ページの内容に応じて、ページのタイトルを自ら書き換えて表示するようにする。

・タイトル変更方法
ビューで「ERB」（埋め込みRuby: Embedded Ruby）を使用して
ページごとにタイトルを設定する。

<% provide(:title, "Home") %>で
<%= yield(:title) %> にHomeを設定する
```
<% provide(:title, "Home") %>
<!DOCTYPE html>
<html>
  <head>
    <title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>
  </head>
  <body>
    <h1>Sample App</h1>
    <p>
      This is the home page for the
      <a href="https://railstutorial.jp/">Ruby on Rails Tutorial</a>
      sample application.
    </p>
  </body>
</html>
```
・重複の排除
Home,help,aboutではbodyのコンテンツが同じため
HTMLの使い回しができる

HTMLのテンプレート
```
<html>
  <head>
    <title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <meta charset="utf-8">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```
・<%= yield %>
各ページの内容をレイアウトに挿入できる。
/static_pages/homeにアクセスするとhome.html.erbの内容がHTMLに変換され、<%= yield %>の位置に挿入される

・HTMLを省いたhome
これが上のyieldに挿入される
テンプレートのtitleにhome、bodyにporovide以下の内容が挿入される
```
<% provide(:title, "Home") %>
<h1>Sample App</h1>
<p>
  This is the home page for the
  <a href="https://railstutorial.jp/">Ruby on Rails Tutorial</a>
  sample application.
</p>
```


# 3-6高度なセットアップ
・minitest reporters
テスト結果の出力を見やすくフォーマットしてくれる。
テスト結果が色付きで表示されて見やすくなる
・Guard
テスト対象のファイルが変更されるとテストが自動で実行されるようになる機能

# 感想
３章ではrailsの特有の機能などを実装することができました。
コントローラーとメソッド名を同時に設定できるのがすごく便利だと感じたとともに
普段からコマンドを使って効率化を図りながら作業を進めていけたらと思いました。
JavaScriptでPDF生成5パターン

PDFの生成は様々なシチュエーションで必要とされる機能です。JavaScriptではいくつかの方法があります。
以下5パターンについて一通り実装した経験からメリット・デメリットを簡単に書きます。

## バックエンドでの生成

### 1. HTML + Puppeteer

PuppeteerはGoogle ChromeまたはChromiumをヘッドレス（UIなし）で操作するためのNode.jsのライブラリです。Puppeteerを使えばHTMLをレンダリングしてPDFとして保存することが可能です。

**メリット**：

- HTMLとCSSを用いたレイアウトなので、デザインの自由度が非常に高いです。

**デメリット**：

- レンダリングのためにはブラウザのエンジンが必要なので、サーバー側のリソース消費が大きいです。
- ブラウザのセキュリティ制限により、一部の機能が利用できない場合があります。

### 2. PDFKit

[PDFKit](https://github.com/foliojs/pdfkit)は、PDFをプログラムで生成するためのNode.jsのライブラリです。

**メリット**：

- PDFストリームを直接生成するため、パフォーマンスが良いです。
- フォント、色、グラフィックスなど、PDFの全ての要素を自由に制御できます。

**デメリット**：

- HTMLやCSSの知識が直接活用できないため、レイアウトの制作には時間がかかります。

### 3. Konva + PDFKit

[Konva](https://konvajs.org/)は2D描画を行うためのライブラリで、これをPDFKitと組み合わせることで、2Dグラフィックスを含んだPDFを生成することが可能です。

**メリット**：

- 2Dのグラフィックス表現が可能で、図やイラストを含むPDFが作成できます。
- Konvaは直感的なAPIを持つため、開発が容易です。

**デメリット**：

- HTMLやCSSの知識が直接活用できないため、レイアウトの制作には時間がかかります。
- KonvaとPDFKitの両方を理解する必要があります。
- Konvaで生成した画像をPDFに埋め込む部分はラスター形式になるため、ベクター形式と比べ粗く表示されます
- ラスター形式のためベクター形式と比べ同じレイアウトデザインでもサイズが大きくなります。

## フロントエンドでの生成

### 4. Konva + jsPDF

この方法はKonvaを使用して2Dグラフィックスを作成し、jsPDFを使用してフロントエンドでPDFを生成するものです。

**メリット**：

- バックエンドに負荷をかけずにクライアントサイドでPDF生成が可能です。
- 2Dのグラフィックス表現が可能で、図やイラストを含むPDFが生成できます。
- [Canva](https://www.canva.com/)のようなユーザー側で自由度のあるPDFを生成できます。

**デメリット**：

- クライアントのリソースに依存しますので、大規模なPDFの生成には向かないかもしれません。

## その他

### 5. SpreadSheet + GAS

Google Apps Script(GAS)を用いて、SpreadSheetからPDFを生成する方法です。

**メリット**：

- 上の4つ方法より最速である程度の見た目のデザインをもったPDFが生成可能です。
- エンジニア以外もデザインのカスタマイズが可能です。
- スプレッドシートを更新するだけですぐに修正が可能です。
- Google Driveのセキュリティと統合性を享受できます。

**デメリット**：

- レイアウトやデザインの自由度が低いです。
- GASの実行には制限（クォータ）がありますので、大量のPDFを短時間に生成することは難しいかもしれません。
- GASに関するエラー調査がしずらいため、中長期の運用には向いていません。

この記事はChatGPTにベースを作成してもらい、私が追記しました。これまで実際に実装してきたPDF生成パターンについてのみ取り上げています。参考になれば幸いです。
minicondaでpytorchをインストールしたときのエラー

# ResolvePackageNotFound: - conda==23.3.1      
pytorchをインストールしようとしたところ，こんなエラーが出た．
```python
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

....(中略)

ResolvePackageNotFound: 
  - conda==23.3.1      
```
condaのバージョンを確認したところ
```
conda info

....(中略)
          conda version : 23.5.0
```
まさかと思い，23.3.1にダウングレード
```
conda install conda=23.3.1  
```
したら無事インストールできました．

なお，pytorchのインストールの時に同時に23.5.0にバージョンアップされました．
# 感想
そんなことあるんか．
# 環境
windows 10 19045
Python 3.10.10
プログラミング未経験大学生がエンジニアになるために

## はじめに

私の経験をもとにプログラミング未経験学生がエンジニアになるための私が思う最適な学習ルート、開発経験の獲得に関してここに記載していきたいと思います。

## プログラミング学習教材

最近ではオンライン学習教材として多くの教材があると思います。例えば、、

- paiza
- Progate
- SAMURAI engineer

ほかにも書籍で学習するなど、、、、

その中で私が一番学習して身についているなと感じたのは、圧倒的に「paiza」一択です！！

書籍だとモチベージョンが続かず一冊の教材を読破するのがなかなか難しいのが現状、、大学生は大学の課題、試験勉強、遊びなどどうしても書籍で勉強をするモチベージョンが続きません、、

ではなぜpaizaがいいと思うのかについてですが、いい点としては以下の通りです！

- 初学者に優しい教材内容
- スキルチェックサービスでアウトプットする場が存在する
- スキルに応じて企業からスカウトが来るのでモチベーションを維持できる
- コードテストの問題数が豊富

## 開発経験の獲得

エンジニア就職するにあたって、開発経験がある場合とない場合で全くと言っていいほど就職のレベルに差が出ます。

そのため、次の段階としては、長期インターンなどで開発経験を積むことです！

しかし、注意点としてエンジニアの長期インターンは

- 即戦力が求められ、開発物の作成経験や開発経験が必要とされる企業が多い
- Git Hubアカウントやポートフォリオなどの提出が求められる

のように未経験学生にはなかなか厳しい現状、、、:disappointed_relieved:

逆に未経験で頑張って何とか長期インターンにたどり着けた場合も

- QA業務等の仕事内容ばかりで結局開発などのエンジニアらしい業務は任せてもらえず、、、
- エンジニアというポジションながらほとんど営業なのではないかという業務ばかり、、、

これら二つはまさに僕がそうでした、、、。

ですので、焦って長期インターンにこぎつけるよりは、半年くらい勉強する期間として設けてある程度の実力がついてから長期インターンを始めるのがいいと思います！！

## おすすめの学習順序

プログラミングは言語が多く、何から学習したらいいのかあまりわからない、、、という方も多いと思いますので、私のおすすめの学習順序に関してここにつづっていきたいと思います！鵜呑みにせず、あくまで参考にしてもらえればと思います！！

私はWeb系志望なのでそっちに偏っていますが、、、。

HTML,CSSの学習→Git Hub(コマンドも) の学習→Webサイトを作成し、アップロード→Javascriptの学習→Webアプリケーション作成

これくらいの学習と成果物を作成してからであれば長期インターンに応募しても戦えると思います！！

## 長期インターンに参加した後は

長期インターンに参加した後は、いざ就活！となりますよね

後は、長期インターンでの経験をうまく就活でアピールして内定獲得を目指します！

面接ではびっくりするくらい長期インターンでの経験が聞かれるので(面接官の人は長期インターンでの経験に対して特に興味深々:grin:)詳細に話せるようにしておくといいですね！

## 最後に

僕自身、プログラミング未経験学生でエンジニア就職にはだいぶ苦戦していた人生ですので同じような境遇の方にはこの記事を見て役に立つといいなと思います。

見ていただきありがとうございました:bow_tone3:
【Xcode】Unable to process request - PLA Update available

# はじめに
Archiveをしようとしたらエラーが出ました
解決方法を記録しておきます


# エラー
```
Unable to process request - PLA Update available
You currently don't have access to this membership resource. To resolve this issue, agree to the latest Program License Agreement in your developer account.
```

```
No signing certificate "¡OS Distribution" found
No "¡OS Distribution" signing certificate matching team ID "XXXXXXXXX" with a private key was found.
```

![スクリーンショット 2023-07-04 1.31.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b3587ed7-816c-fe1a-5ffe-57efefd7f4cf.png)

# 解決方法
① [こちら](https://developer.apple.com/account)にアクセスします
② 「契約を確認」をタップします
![スクリーンショット 2023-07-04 1.35.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0f4abae2-5b8f-16e4-81f6-c9fcd649498e.png)
③ 「同意する」をタップします
![スクリーンショット 2023-07-04 1.36.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/78c1a149-91eb-b54d-141f-1d118f5fe1ea.png)

# おわり
契約更新なんて頻繁にないので確実にやり方を忘れます笑

# 参考記事
https://hawksnowlog.blogspot.com/2022/02/unable-to-process-request-pla-update.html
Next.js - エラーハンドリングをカスタマイズする方法 

## イントロダクション

Next.jsでは、クライアントサイドのエラーハンドリングをカスタマイズすることができます。例えば、デフォルトのエラーメッセージの代わりに、独自のエラーページを作成することができます。このブログは、このカスタマイズ方法について説明します。

## _error.jsを使用したカスタマイズ

エラーハンドリングをカスタマイズするために、pagesフォルダ配下に_error.jsを使用します。このファイルを、あなたのアプリケーションのルートディレクトリのpagesフォルダ内に配置します。次に、このファイルに、独自のエラーメッセージを追加します。

以下は、カスタムエラーページを作成する例です。

```
// pages/_error.js

import React from 'react'

function Error({ statusCode }) {
  return (
    <p>
      {statusCode
        ? `An error ${statusCode} occurred on server`
        : 'An error occurred on client'}
    </p>
  )
}

Error.getInitialProps = ({ res, err }) => {
  const statusCode = res ? res.statusCode : err ? err.statusCode : 404
  return { statusCode }
}

export default Error

```

この例では、サーバーサイドでエラーが発生した場合は、そのHTTPステータスコードを表示し、クライアントサイドでエラーが発生した場合は、「An error occurred on client」と表示します。

しかし、これは単なる例であり、アプリケーションのデザインに合わせて、エラーページを自由にカスタマイズすることが可能です。

## エラーページの設定方法

カスタムエラーページを作成するために、まず、アプリケーションのルートディレクトリに_error.jsという名前のファイルを作成します。このファイル内には、独自のエラーメッセージを書き込みます。

次に、エラーが発生した際に、このエラーページを表示するように設定します。エラーが発生した場合、Next.jsは自動的に_error.jsを探します。そして、このファイルが見つかった場合、そのファイルの内容を表示します。

## エラーハンドリングの例

以下は、カスタムエラーページを使用したエラーハンドリングの例です。この例では、エラーが発生した場合に、独自のエラーページが表示されます。

```
// pages/_error.js

function ErrorPage({ statusCode, errorMessage }: Props) {
  // 直前のページ
  const handleBack = () => {
    Router.back()
  }
  // トップページ
  const handleHome = () => {
    Router.push('/')
  }

  if (statusCode) {
    return (
      <div>
        <span type='header2'>{statusCode} Not Found</span>
        <p>{errorMessage}</p>
        <div>
          <div>
            <button label={'前のページに戻る'} onClick={handleBack} />
          </div>
          <div>
            <button label={'トップ'} onClick={handleHome} />
          </div>
        </div>
      </div>
    )
  }

  return (
    <div>
      <div>
        <span>{statusCode} Not Found</Span>
      </div>
      <Paragraph>{errorMessage}</Paragraph>
      <div>
        <div>
          <button label={'前のページに戻る'} onClick={handleBack} />
        </div>
        <div>
          <button label={'トップ'} onClick={handleHome} />
        </div>
      </div>
    </div>
  )
}

ErrorPage.getInitialProps = ({ res, err }: NextPageContext) => {
  const statusCode = res ? res.statusCode : err ? err.statusCode : 404
  const errorMessage = err ? err.message : 'お探しのページは見つかりませんでした。'

  return { statusCode, errorMessage }
}

export default ErrorPage
```

この例では、ユーザーが存在しないページにアクセスするなどのエラーが発生した際、ステータスコードとエラーメッセージを表示します。また、「前のページに戻る」ボタンと「トップ」ボタンで、ユーザーが他のページに容易に移動できるようにしています。**`getInitialProps`**関数で初期化されます。

## 結論

Next.jsを使用すると、クライアントサイドのエラーハンドリングをカスタマイズすることができます。_error.jsページを作成することで、独自のエラーページを作成し、アプリケーションのデザインに合わせてカスタマイズすることが可能です。
アプリ広告収益10倍達成！222円から2300円への道のり

## アプリ広告収益をあげたくなった
当方、仕事をやめて暇になってしまっため、個人アプリを伸ばそうかと思い重い腰をあげました。
### ４月時点の収益
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/2ad0a884-d075-6783-819c-7f04bcc60f4c.png)

### ６月時点の収益
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/2bb0576e-3bd9-8786-7fd8-25e01ff73f63.png)

今回は、この収益**収益10倍**を達成するために行ったこと、今後行っていきたいことをつらつらと書き記します。

## 今まで作ったアプリの伸び率を調査
当方はiOSアプリ開発をガッツリやっていたので、個人でもアプリを5つほど出していました。
見て欲しいのは「ユニット数」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/4636fea8-75e1-58eb-659c-38d3a53b5223.png)
１番上のアプリより１年以上遅くリリースしたアプリがすんごい伸びていたのです。
このアプリは最終アップデートからかなり時間が経っていたので、UIの見直しとAdmob広告の付与を行いました。

入れてみてね💙

https://apps.apple.com/jp/app/harmonydirector/id1640956919

## リリースするアプリのプライマリ言語を英語に
文字を読む必要のないアプリをリリースしている当方は、Storeの文言や画像を英語・日本語対応させることでより海外のユーザーを増やそうと考えました。
ある程度増えたのかなと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/a89e5d84-4ae0-2508-6f19-9ac883950514.png)

## Flutterを用いてAndroidにも対応
Flutterを使うことによってiOS、Androidにアプリをリリースすることがかなり簡単になりました。Androidユーザーにもアプリを届けることによって、更にユーザーが増えることを期待しました。
-> 結果、あまり伸びない
iOSに比べて、Androidはアプリが豊富(良くも悪くも)なのであまりヒットしなかったです。

・Flutterの勉強アプリ「Flutter Widget」💙

https://apps.apple.com/jp/app/flutter-widget/id6448849730

https://play.google.com/store/apps/details?id=net.sogablog.flutter_widget

## 自分が作ったアプリの再開発
このアプリが伸びているということは、似たアプリも伸びるはず。。！

https://apps.apple.com/jp/app/harmonydirector/id1640956919

そう思った当方はアプリの別バージョンを開発しました。

https://apps.apple.com/jp/app/super-harmony-director/id6450298296

https://apps.apple.com/jp/app/simple-brasswind-keyboard/id6450298170

https://apps.apple.com/jp/app/simple-woodwind-keyboard/id6450298021

伸び率は、、まぁまぁ？

## ユーザーとの共感を生むSNS活用
### Twitter
Twitterを利用し、ユーザーとのコミュニケーションを重視しました。
まずは、Twitterのフォロワーを２倍に！！
４月と６月だけで216人増えました！みんなありがとう💙

<a href="https://twitter.com/soga_pg">**Twitterのリンク：@soga_pg**</a>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/90532ecc-0ab4-8369-a485-e11b48da2526.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/934ff887-941c-26e9-7879-dc6aa8326d25.png)

### TikTok
こちらは今後本格運用していく予定です！
動画投稿時間は平日は16時頃、休日は9時頃と15時頃と18時頃が良いようです！

https://www.tiktok.com/@soga_app

## とにかくアプリを作る
5個しかリリースしていませんでしたが、ここ２ヶ月で14個に増えました。
Flutterならこんなことも可能なんですね

https://apps.apple.com/jp/developer/kira-soga/id1542553141?see-all=i-phonei-pad-apps

https://play.google.com/store/apps/developer?id=kira+soga

## リリース失敗例
App Boostという、個人開発者向けのアプリリリース・アップデート告知アプリです。
App Storeは適したアプリを探すのに長けていますが、このアプリでは無差別にみんなにアプリの存在をアピールできる、、

そんなはずでしたが、ガイドライン違反で無事永年リジェクト☹

https://qiita.com/Soga_/items/6b956659f6ab53c4b797

## 収益の驚異的な増加！

これらの取り組みで、アプリ収益が倍々になりました。
ちなみに、毎月2300円貰えれば、Apple Developer Programは実質無料、そしてTwitter Blueも実質無料です！
嬉しいね💙

ここまで呼んでくださり、ありがとうございました。

<a href="https://twitter.com/soga_pg">Twitterのリンク：@soga_pg</a>

https://sogablog.net/
モダンな技術がわからないけどコーディングしなきゃいけないデザイナー(自分)の脳内

:::note warn
・極めて個人的な脳内整理の備忘録です
・専門用語や作法がわかりません
:::
## 背景
- サービス説明(BtoB)のランディングページを作ろうとしている
- ワイヤーフレーム作成からコーディングまで一貫してデザイナー（自分）が担当
- 今回はPardotLPじゃなくて全部手書き（静的ページでもスクラッチって言う？）なのでデザイン自由度は高
- 先任とかはいないのでコーディングの方法などは自由
## 気持ち
- 新しい技術や考え方はどんどん取り入れたい
    - 脱jQueryとかアクセシビリティとか……
    - CSSも安定版ブラウザで使える新しいプロパティがどんどん出てきてるし……
### JavaScriptまわり
- タブ切り替えだのカルーセルだの使う予定なので、JavaScriptの使用は必須
- 脱jQueryには取り組んでおきたい
    - jQueryしかわからないようなスキル感の場合は無理に置き換える必要無しという論もあるが、自分のスキルアップのためにやりたい
- 脱jQueryの手段として、最近流行ってるフレームワークを使いたい気持ちがある
    - しかし、今から1週間で実務で使えるレベルまで学習するのはさすがに無茶
- そもそも素のJavaScript(Vanilla JS)すらよくわかってないことに気付いた

**結論**
まずはVanilla JSを概念や用語から改めて学習し、ある程度書けるようになってからフレームワークに手を出したほうが良いのでは？と考えました。
会社の本棚を見たところ、[これ](https://www.amazon.co.jp/dp/144934013X)しか無かったため、さすがに改めて買ってもらうことにしました。英語の技術書を読む英語力は無いです。ちょっと古いし……。
調べた中で比較的自分に合いそうな[いちばんやさしいJavaScriptの教本](https://book.impress.co.jp/books/1118101141)を読みます。
これで概念と基本的な書き方を把握したら今後のために追加で[JavaScript コードレシピ集](https://gihyo.jp/book/2019/978-4-297-10368-2)を買おうと考えています。
### CSSまわり
- 3年くらい前に通ったスクールにおいて当時ですら最新でない教材で学んだ知識しか無く、最近Twitterとか見てたらシンプルな実装に置き換えられるプロパティがいくつもあることを知った
- 2023年6月現在において安定版ブラウザで使えるプロパティはどんどん使っていきたい
    - とはいえ最新バージョンしか対応してないようなものは使わない方針(さすがにそこまで全面的に客や社内を信頼してないので)
- コンテナクエリが気になっているが、まだ使わないほうが良い？
- タブ切り替えは今後広告の都合でデフォルト表示させるタブを変える可能性が高い
    - 開いてるタブ別にURLで指定できるといい
    - そうなるとJavaScriptでの実装よりCSSでの実装のほうがいいのかもしれない…

**結論**
まだよくわからないので、使ってみたいプロパティを一旦書いてみて自分の手元環境で動作を再現できなければ使わない、のトライアンドエラーでいこうと思います……。
とりあえず7/28のCSS Niteは申し込みました。CSS理解したい。

# オチ
- ないです。
- 勉強しなきゃなって思ったくらいです。
IBM Cloud の Watson Studio プロジェクトへサービスを関連付けする

Watson Studioプロジェクトで一部の資産タイプを作成する場合、事前に前提サービスのリソースをWatson Studioプロジェクトへ関連付けておくことが必要となります。
サービスの関連付けの方法を紹介します。

製品資料；資産タイプ
https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assets.html?context=cpdaas&audience=wdp#types

### 1. プロジェクトにサービスを関連付け

- 作成したプロジェクトにアクセスし、[管理] > [サービスおよび統合] ページを開きます。
- [サービスの関連付け]をクリックします。
- 関連付けるサービス・インスタンスを指定し、[サービスの関連付け]をクリックします。
- 一覧へサービス・インスタンスが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/09cd0b5a-6121-360d-054a-7e339c40f9c1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/9c0d2d99-7eab-d7d0-25b0-10ab7c66e64f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/5880cfc4-c347-651f-eb00-f6489ee4ae4f.png)


### 2. 関連資料

製品資料：プロジェクトへの関連サービスの追加
https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/assoc-services.html?context=cpdaas&audience=wdp
デプロイ　本番環境で環境変数を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/8a515491-5d59-38c2-cdd5-05b0b800e78f.png)
１：本番環境で環境変数を設定

render上に環境変数を設定します。

以下のリンクから、renderのダッシュボードを開きましょう。
https://dashboard.render.com/

続いて、リストからデプロイしたアプリケーションを選択します。TYPEが「Web Service」になっていることを確認してクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/1e17ddd3-7d86-5c8a-ce5f-b29109fe72b5.png)

２：環境変数の設定
アプリの作成時と同じ方法で、環境変数を設定します。以下３つの操作を行いましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/0e838395-8fcd-4474-6525-826db892b522.png)
① メニューの中の「Environment」をクリックします。

② 次に、以下の表の内容で環境変数の設定を行います。
Key：BASIC_AUTH_PASSWORD	Value：2222
Key:BASIC_AUTH_USER	Value:admin

③ 入力できたら、「Save Change」をクリックします。

３：変更したコードをコミットし、GitHubにプッシュします。
　変更内容を反映させるため、GitHub Desktopを使ってコードをプッシュします。

４：render上の挙動を確認します。
GitHubにコードをプッシュしmainブランチが更新されるとrenderでのデプロイが自動的にスタートします。

デプロイが終わったら、render上に公開したアプリケーションへアクセスし、Basic認証をパスできるか確認します。

設定したユーザー名とパスワードでログインができれば、正しく実装できています。

※Basic認証が現れないという方は、シークレットウィンドウにて確認してみましょう。
MagicGrabberの作り方

 ## 【操作に必要になる物 3点】
___・USBマウス___
___・USBキーボード___
___・microHDMIケーブル___

 ## 【MagicGrabberに必要となる物 5点】
___①Raspberry Pi 4 Model B___([参考](https://www.switch-science.com/products/5680))
必ず4を買ってください。RAMは4GBで十分ですが8GBでも問題はありません。
現状Model Aは出ていませんが、今後Model Aが出た場合でもModel Bを推奨します。
___②Raspberry Pi用microSDカード___([参考](https://www.amazon.co.jp/dp/B08K4214KB))
32GBもあればなんでも構いませんが、有名どころの方が壊れにくいのではないかと思います。
___③Type-A⇔Type-Cケーブル___
データ通信可能な物を買ってください。大抵はデータ通信可能です。
___④Type-A⇔ピンヘッダケーブル___([参考](https://www.amazon.co.jp/dp/B08RSH2485))
なかなか手に入りません。作った方が早いし安いので作りましょう。なれれば3分で作れます。
最悪なくてもいいですがRaspberry Piへの電源供給が不安定になります。作ることを強く推奨。
___⑤Raspberry Pi電源供給用モバイルバッテリー___([参考](https://www.amazon.co.jp/dp/B091KLF4B1))
出力用のType-Aポートがついている物を買ってください。
④が手に入らなかった場合、⑤モバイルバッテリーは不要ですがやはり④と⑤は出来るだけ、
入手したほうがいいです。

 ## 【MagicGrabber 組み立て手順】
1. [Raspberry Pi Imager](https://www.raspberrypi.com/software/)でRaspberry Pi OS <strong>Lite (64-bit)</strong>をmicroSDカードに書き込む。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502616/2aa0e442-b365-b336-ca85-acc8a1d6005f.png)

2. microSDカードをRaspberry Piに差し込む。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502616/2872f7a3-deb4-d0d7-fb4e-b7ac954eb8a4.png)
3. Type-CケーブルをRaspberry PiのType-Cポートに差し込む。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502616/fba063b3-cbf8-f0c7-1524-cab600d7ad0b.png)
4. ピンヘッダケーブルの黒線をGPIO GNDに、赤線をGPIO 5Vに差し込む。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502616/fa9b5f2d-f7fb-d061-7362-9c568c3436ae.png)
5. ピンヘッダケーブルのType-A側をモバイルバッテリーに差し込む。(給電が開始されるのでRaspberry Piが起動します。)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502616/a12b25b3-87e6-141e-6bb3-b92b4f6d818d.png)
6. 完成形がこちら↓
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502616/a828446e-96f4-3a71-1f85-98249e3cc8a8.png)


 ## 【MagicGrabber インストール手順】
前提条件①：Raspberry Piがインターネットに接続可能な状態になっている。
前提条件②：gitコマンドが使用可能である。
1. gitコマンドを使用してMagicGrabberのファイルをダウンロードします。
    ```
    git clone https://github.com/SatoNobuhiro/MagicGrabber
    ```
2. MagicGrabberというフォルダが作成されるので、cdコマンドでMagicGrabberフォルダに移動します。
    ```
    cd MagicGrabber
    ```
3. MagicGrabberフォルダ内のinitial_setup.shに実行権限を付与します。
    ```
    chmod 777 initial_setup.sh
    ```
4. initial_setup.shを実行します。沢山コマンドが流れます。
    ```
    ./initial_setup.sh
    ```
5. 再起動します。
    ```
    reboot
    ```
6. 再起動後http\://\<Raspberry PiのIPアドレス\>:8080/にアクセスをして、下記の画面が見えたらMagicGrabberの完成です！http<font color="Red">s</font>ではなく、httpなので要注意！
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502616/8895387c-af65-426a-16c2-9f67437d98b3.png)
streamlit helloで失敗する場合のメモ

streamlitという便利にwebアプリを作成できるフレームワークがあるそうです。

https://streamlit.io/

サイトに書いてあるとおり、

```pip install streamlit```
```streamlit hello```

すればスタート画面が立ち上がるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591033/cd1d04da-18ab-7d42-6a15-6e741272dff6.png)

……しかしうまくいかない！

原因は、Pathを通していないからでした。

Win11の人は、システム→バージョン情報→システムの詳細設定→環境変数で「Path」に以下の2つのパスを追加してください。

1. streamlit.exeのパス
2. streamlit.exeのあるフォルダのパス

2番目もないと失敗します。
済んだらコンピューターを再起動して、Pathの情報を反映させます。

あとは、コマンドプロンプトやらPowerShellで
```streamlit hello```

と打てば、ブラウザでstreamlitのスタート画面が開きます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591033/b05ea8be-b75b-de29-8341-0c96c430985c.png)
About useEffect

# Inside 'useEffect'
```dart
void useEffect(Dispose? Function() effect, [List<Object?>? keys]) {
  use(_EffectHook(effect, keys));
}
```
Function() is first argument, list of keys is second argument

the comment written above the useEffect function is
``` dart
/// [useEffect] is called synchronously on every `build`, unless
/// [keys] is specified. In which case [useEffect] is called again only if
/// any value inside [keys] as changed.
```
Elixirの対話モードでモジュールの属性の動作を確認してみた

# 概要
Elixirの対話モードでモジュールの属性の動作を確認してみました。以下のページを参考にしました。

https://dev.to/gumi/elixir-14--3511

# 対話モードで実行
以下のコマンドを実行しました。
```
$ iex
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> defmodule MyServer do
...(1)> @vsn 2
...(1)> end
{:module, MyServer,
 <<70, 79, 82, 49, 0, 0, 3, 196, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 134,
   0, 0, 0, 13, 15, 69, 108, 105, 120, 105, 114, 46, 77, 121, 83, 101, 114, 118,
   101, 114, 8, 95, 95, 105, 110, 102, 111, ...>>, :ok}
iex(2)> defmodule Example do
...(2)> @moduledoc """
...(2)> あいさつのモジュールです。
...(2)> """
...(2)> @doc """
...(2)> "hello, "のあとに`name`が加えられた文字列を返します。
...(2)> ## Examples
...(2)> iex> Example.greeting("world")
...(2)> "hello, world"
...(2)> """
...(2)> def greeting(name), do: "hello, #{name}"
...(2)> end
{:module, Example,
 <<70, 79, 82, 49, 0, 0, 6, 76, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 186,
   0, 0, 0, 18, 14, 69, 108, 105, 120, 105, 114, 46, 69, 120, 97, 109, 112, 108,
   101, 8, 95, 95, 105, 110, 102, 111, 95, ...>>, {:greeting, 1}}
iex(3)> defmodule Example do
...(3)> @greeting "hello"
...(3)> def greeting(name), do: "#{@greeting}, #{name}"
...(3)> end
warning: redefining module Example (current version defined in memory)
  iex:3

{:module, Example,
 <<70, 79, 82, 49, 0, 0, 5, 192, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 186,
   0, 0, 0, 18, 14, 69, 108, 105, 120, 105, 114, 46, 69, 120, 97, 109, 112, 108,
   101, 8, 95, 95, 105, 110, 102, 111, 95, ...>>, {:greeting, 1}}
iex(4)> Example.greeting("world")
"hello, world"
iex(5)> defmodule Example do
...(5)> @greeting
...(5)> end
warning: redefining module Example (current version defined in memory)
  iex:5

warning: undefined module attribute @greeting, please remove access to @greeting or explicitly set it before access
  iex:6: Example (module)

{:module, Example,
 <<70, 79, 82, 49, 0, 0, 3, 200, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 133,
   0, 0, 0, 13, 14, 69, 108, 105, 120, 105, 114, 46, 69, 120, 97, 109, 112, 108,
   101, 8, 95, 95, 105, 110, 102, 111, 95, ...>>, nil}
iex(6)> defmodule Example do
...(6)> @greeting "hello"
...(6)> def greeting(name), do: "#{@greeting}, #{name}"
...(6)> @greeting "こんにちは"
...(6)> def greeting_jp(name), do: "#{@greeting}、#{name}"
...(6)> end
warning: redefining module Example (current version defined in memory)
  iex:6

{:module, Example,
 <<70, 79, 82, 49, 0, 0, 6, 240, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 198,
   0, 0, 0, 19, 14, 69, 108, 105, 120, 105, 114, 46, 69, 120, 97, 109, 112, 108,
   101, 8, 95, 95, 105, 110, 102, 111, 95, ...>>, {:greeting_jp, 1}}
iex(7)> Example.greeting("world")
"hello, world"
iex(8)> Example.greeting_jp("日本")
"こんにちは、日本"
iex(9)> 
```

# まとめ
何かの役に立てばと。
IBM Cloud の Watson Machine Learning デプロイメント・スペースIDを確認する

Watson Machine Learningデプロイメント・スペースをREST API経由で操作する場合、デプロイメント・スペースの識別子であるスペースIDを指定することが必要です。
スペースID の確認方法を2つ紹介します。


### 1. デプロイメント・スペース アクセス時のURLから確認

- 作成したデプロイメント・スペースにアクセスし、URLを確認します。
- URLに含まれる `space/` 直後にあるUUIDがプロジェクトIDです。

```text:URLの構造
https://jp-tok.dataplatform.cloud.ibm.com/ml-runtime/spaces/<space_id>/overview?context=cpdaas
```

```text:URLの例：0c6d0a35-d444-43d1-9946-a586b952410a がスペースID
https://jp-tok.dataplatform.cloud.ibm.com/ml-runtime/spaces/0c6d0a35-d444-43d1-9946-a586b952410a/overview?context=cpdaas
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/c995e391-e65a-98b6-19af-4bdd55f9b64a.png)


### 2. デプロイメント・スペースの管理ページより確認

- 作成したデプロイメント・スペースにアクセスし、[管理] > [一般] ページを開きます。
- スペースGUID の値をを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/8b79802a-edbc-2c39-49db-58fb62dd71c1.png)


### 3. 関連資料

製品資料：デプロイメント・スペース
https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-spaces_local.html?locale=ja&audience=wdp
IBM Cloud の Watson Studio プロジェクトIDを確認する

Watson StudioプロジェクトをREST API経由で操作する場合、プロジェクトの識別子であるプロジェクトIDを指定することが必要です。
プロジェクトID の確認方法を2つ紹介します。


### 1. プロジェクトアクセス時のURLから確認

- 作成したプロジェクトにアクセスし、URLを確認します。
- URLに含まれる `projects/` 直後にあるGUIDがプロジェクトIDです。

```text:URLの構造
https://jp-tok.dataplatform.cloud.ibm.com/projects/<project_id>?context=cpdaas
```

```text:URLの例：9569520e-cc33-4260-b2f6-bad9abe5ac9f がプロジェクトID
https://jp-tok.dataplatform.cloud.ibm.com/projects/9569520e-cc33-4260-b2f6-bad9abe5ac9f?context=cpdaas
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/bb110a45-3423-1ca8-84e4-3fb1c7c6bd5d.png)


### 2. プロジェクトの管理ページより確認

- 作成したプロジェクトにアクセスし、[管理] > [一般] ページを開きます。
- プロジェクトID の値を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/ab1c82cf-64b8-476b-46d7-000b9b8d3685.png)



### 3. 関連資料

製品資料：プロジェクトの作成
https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/projects.html?locale=ja

製品資料：プロジェクトの管理
https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/admin-project.html?locale=ja&audience=wdp
【AZ-900】クラウドの基礎まとめ

## はじめに
AZ-900の資格取得に向けた学習の中で学んだことを簡単にまとめます。

## クラウドコンピューティングとは
クラウドコンピューティング(クラウド)とは、
**コンピューティングリソースをインターネット経由でどこからでも必要な時に利用できる**というコンピューティングサービスの提供モデルのこと。

コンピューティングリソースは、サーバーやストレージ、ネットワーク等を指す。

## クラウドの利点
#### 1. 高可用性
故障が発生してもシステムを継続利用できること

#### 2. スケーラビリティ
コンピューティング容量を垂直方向/水平方向に容易に増減できること

- 垂直スケーリング：サーバーマシンの台数を変えずに性能の異なるマシンに入れ替える(高価)
- 水平スケーリング：並列処理するサーバーマシンの台数を増減させる

#### 3. 機敏性
ビジネス要件の変化に応じて迅速にシステムを構成・変更できること

#### 4. 弾力性
システムに対するリクエスト量の変化に応じて**自動的に**必要なコンピューティング容量を確保できること

#### 5. ディザスターリカバリー
広域災害などが起きた場合でもシステムやデータを安全に保護/復旧できること


## システム支出モデルの種類
#### 資本的支出(CapEx = Capital Expendiuture)
支出して入手した物品/設備を会計上は資産として所有し、数年かけて減価償却を行う。

(例)自社所有のデータセンターの増設、ハードウェアの購入


#### 運用支出(OpEx = Operating Expenditure)
使用した部分だけを都度支払いを行い、会計上は資産として所有しない。

(例)レンタルサーバー、技術サポート契約
    ※毎月更新型のサービス利用契約

## クラウドサービスモデル
### サービスごとの共同責任モデル
- オンプレミス：全てシステムを所有する利用者の責任
- IaaS：ハードウェアやデータセンターはプロバイダー責任、OSは利用者責任
- PaaS：上記に加え、OS設定とネットワーク制御設定・ランタイム制御設定はプロバイダー責任、その他アプリに関する設定は利用者責任
- SaaS：データ・アカウント管理・認証設定以外はプロバイダー責任

### クラウドサービスの種類
- IaaS：OSのレベルまでクラウド利用者が構成・管理できるため、構成の自由度が最も高い
- PaaS：アプリケーションをデプロイするだけですぐにシステムを使える。
- SaaS：プロバイダーが提供するアプリケーションをそのまま使える。カスタムアプリケーションのデプロイは不可。

### クラウドのデプロイモデル
#### 1. パブリッククラウド
- プロバイダーが管理するデータセンターから提供され、マルチテナントで利用されるクラウド
- 利用者が管理ポータルからサービスを構成し、ユーザーがインターネット経由でアクセスできるITシステムを構築できる
- (例)Azure、AWS　異なるプロバイダーのクラウドを組み合わせる場合は**マルチクラウド**という

#### 2. プライベートクラウド
- 自社/サードパーティーのデータセンターから提供される
- 自社専用/特定のシステム利用者のみで利用
- パブリッククラウドの特性を取り入れたオンプレミスの強要のインフラストラクチャ実装方式
- ユーザーのいる自社オフィスと自社データセンター間はプライベートネットワーク経由でアクセス可能

#### 3. ハイブリッドクラウド
- パブリッククラウドとプライベートクラウドを組み合わせて利用


## 参考書籍
「Microsoft認定資格試験テキスト AZ-900:Microsoft Azure Fundamentals」　須谷聡史/富岡洋/佐藤雅信
Laravelのsail 開発環境をhttps化

## 目的
Laravelをsail環境で開発していたところ、OAuthの実装の時にhttpsでcallbackを受ける必要があった。
Laravelはartisan serverで動いているので、https化するにはsailが動いているdockerに別途 nginxを導入する必要があった。
Sail-SSLは初期インストール直後でも`https://localhost`で最低限 https通信ができるので導入が楽。

## 手段
1. オレオレ認証（localhostやhostsファイルで使うドメイン）で証明書を発行とインストール
2. Sail コンテナでSail-SSLを利用してnginxを導入

```
sail up -d
sail composer require ryoluo/sail-ssl --dev
sail artisan sail-ssl:install
sail down
sail up -d
sail npm run dev
```

3.`https://localhost`へアクセスしてhttps化を確認。
### 以下はmixed contentエラー対策
4. `.env`ファイルの`APP_URL`、`ASSET_URL`のURLをhttpsに書き換え
5. /etc/nginx/certsを作成して、keyとpem(crt)ファイルを置く
6. nginxの設定ファイルにkeyとpem(crt)ファイルを指定
``` vendor/ryoluo/sail-ssl/nginx/templates/default.conf.template
ssl_certificate     /etc/nginx/certs/server.pem;
ssl_certificate_key /etc/nginx/certs/server.key;
```
4.AppServiceProvider.phpにhttps通信を強制

```app/Providers/AppServiceProvider.php
    public function boot(): void
    {
        URL::forceScheme('https');
    }
```
5.vita.config.jsでhttpsを追加、keyとpem(crt)ファイルを指定してvitaの通信もhttps化
```vita.config.js
            server: {
                host: true,
                hmr: {
                    host: env.APP_HOST
                },
                https: {
                    key: fs.readFileSync('./server.key'),
                    cert: fs.readFileSync('./server.pem'),
```
6.再起動
```
sail down
sail up -d
```
`docker ps`で443ポートの通信確認、場合によってはオレオレ認証を閲覧PCに読み込ませる。
bashでコマンド履歴を即座に保存する

以下の記事を読んだのでbashだとどうなるのかと思い調べました。

https://qiita.com/punkshiraishi/items/3c502159c71c225f250d

# 背景

>解決したかったこと
> 通常の terminal から実行した zsh のコマンドは履歴に保存されるが、VSCode で開いた zsh で実行したコマンド履歴が保存されない。

> 原因
> 通常は zsh を終了したときに、そのセッションで実行していたコマンド履歴が ~/.zsh_history に保存されます。
しかし、VSCode で開いた zsh では、通常の終了処理が行われず、コマンド履歴が保存されないようです。

# TLDR

以下をbashrcに追加しておく。

```bash:.bashrc
shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
```

# 解説
https://askubuntu.com/questions/67283/is-it-possible-to-make-writing-to-bash-history-immediate

shopt -s histappendを設定すると、シェルに入力された新しいコマンドがHISTFILE変数の値で指定されたファイルに追加されます。これで.bash_historyの上書きを防ぎます。
二行目で各コマンドを実行する前にhistoryに追加することをしています。
ABC308 - C - Standings 自己解法

# 問題

https://atcoder.jp/contests/abc308/tasks/abc308_c

# 結論
ピックした2人「人$i$と人$j$」に対して下記の比較をするようにカスタムしたソートを実装します。これでソートすれば題意を満たす順にソートできます。

:::note info
- $A_i(A_j + B_j) - A_j(A_i + B_i) > 0$ → 人$i$のほうが前
- $A_i(A_j + B_j) - A_j(A_i + B_i) < 0$ → 人$j$のほうが前
- $A_i(A_j + B_j) - A_j(A_i + B_i) = 0$ → 人の番号がより小さいほうが前
:::

なぜこれでOKなのか、考察で説明してきます。

# 考察
「成功率が高い順→番号が小さい順」の優先順位でソートしてくださいという問題です。人$i$の成功率が$\dfrac{A_i}{A_i + B_i}$と問題文で定義されています。この定義に従ってそれぞれの成功率を求めてソートをかけていけば良さそうな気がします。ところが、成功率は多くの場合小数で出てきます。そのため、誤差が生じてWAになる可能性があります。うまく工夫して小数が発生することなくソートをかけることができないか考えていきたいです。
ところで、配列のソートは2つの要素をピックして比較することを繰り返すことで成り立っています。ソートを標準で備えているプログラミング言語については、「ピックした2つの要素をどのように比較するか」をカスタムできる仕組みを備えていることがほとんどです。C++の場合、下記の記事が参考になります。

https://qiita.com/threecups/items/aa1923a9922dc0a7abfe#%E6%AF%94%E8%BC%83%E9%96%A2%E6%95%B0%E3%81%AE%E6%88%BB%E3%82%8A%E5%80%A4

この比較をカスタムすることで小数が発生しないようにできるか考えていきます。
ピックした2人を「人$i$と人$j$」とします。それぞれの成功率は$\dfrac{A_i}{A_i + B_i}$と$\dfrac{A_j}{A_j + B_j}$です。今回の問題は成功率がソートに関わってきます。そこで、成功率を比較していきます。比較するときは、2つ差と0との大小を考えればいいです。2つの差を通分してみましょう。
$$\dfrac{A_i}{A_i + B_i} - \dfrac{A_j}{A_j + B_j} = \dfrac{A_i(A_j + B_j) - A_j(A_i + B_i)}{(A_i + B_i)(A_j + B_j)}$$
通分すると上記のように1つの分数になります。これが0より大きいと人$i$の成功率のほうがより高く、0より小さいと人$j$の成功率のほうがより高いということになります。肝心なのは0との大小関係になってきますので、分数の分子のみに注目すれば良いことになります。分子のみで0との大小関係を考えれば、小数を発生させることなく比較できそうです。ここまでから、$A_i(A_j + B_j) - A_j(A_i + B_i)$と0との大小関係で比較するようにカスタムしたソートを用意すれば良いことがわかりました。
あとは$A_i(A_j + B_j) - A_j(A_i + B_i) = 0$のケースも注意し、比較をカスタムしてソートすれば題意を満たす順になります。

# 提出コード(コンテスト後)

https://atcoder.jp/contests/abc308/submissions/43241784

ご不明点などがあれば教えていただけると幸いです。

# 参考

https://qiita.com/threecups/items/aa1923a9922dc0a7abfe#%E6%AF%94%E8%BC%83%E9%96%A2%E6%95%B0%E3%81%AE%E6%88%BB%E3%82%8A%E5%80%A4
AWS CLIでスケーラブルウェブサイトを構築する

# はじめに
個人的な学習のアウトプットを目的とした記事です。
AWS CLIで構成図の環境を一から作成したものになります。

# 前提条件
* AWS CloudShellを使用して構築しています。
* 構築するサービス別に、構築手順の例を記載しています。
* VPCのサブネット作成などは手順例とは別に、複数作成する必要があります。
・[1.VPCの作成](https://qiita.com/kokichi8/items/eec77450d79c6415c32e)
・[2.EC2の作成](https://qiita.com/kokichi8/items/20d52fb266677f0e88f3)
・[3.RDSの作成](https://qiita.com/kokichi8/items/834ca1f26e80fe264733)
・[4.ELBの作成](https://qiita.com/kokichi8/items/6b146899936bea8cd3c9)
・[5.AMIの作成](https://qiita.com/kokichi8/items/b6cff42945b902f57bf8)
・[6.作成したAMIから2つ目のEC2インスタンス起動](https://qiita.com/kokichi8/items/9a3e21e798b2535d90a6)
・[7.RDSのマルチAZ配置](https://qiita.com/kokichi8/items/67fda13b2cac5a80f54d)
* 各手順における「設定値の確認」では、出力された結果が上段と下段で一致していることを確認します。

# 構成図
構成図は以下の通りです。
![all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501605/98c3987b-f932-9e0e-b5bd-0cdd124e295b.png)

# まとめ
* アウトプット資料をブログ記事として公開することが初めてだったので、サービス毎に（すべて完璧とはいかなかったが）自分なりの言葉でまとめることができた。
* 【ハンズオン】＋【ブログ記事としてアウトプット】をセットで学ぶことで、今まで学習してきた方法でいちばん頭の中を整理できた。
* ハンズオン以外にも、「普段の業務で新しく学んだこと」「ほかのAWS検証」についても時間を見つけて記事にしていきたい。
電池の内部抵抗と負荷消費電力

# はじめに
レモン電池で豆電球がつかないという話を受けて，内部抵抗と負荷消費電力に関して簡単な考察を行った．

# 負荷抵抗と負荷消費電力
ここでは，電池の起電力 $E$，内部抵抗 $R_\mathrm{b}$，負荷抵抗 $R_\mathrm{l}$ のみが介在する，簡単な回路を考える．この負荷抵抗が豆電球だとすると，ここでの消費電力が大きいほど明るく光ることになる．この回路に流れる電流は，
```math
I=\frac{E}{R_\mathrm{b}+R_\mathrm{l}},
```
だから，負荷での電圧降下 $V_\mathrm{l}$ は，
```math
V_\mathrm{l}=IR_\mathrm{l}=\frac{R_\mathrm{l}E}{R_\mathrm{b}+R_\mathrm{l}},
```
となる．よって，負荷消費電力 $P_\mathrm{l}$ は，
```math
P_\mathrm{l}=V_\mathrm{l}I=\frac{R_\mathrm{l}E^2}{(R_\mathrm{b}+R_\mathrm{l})^2},
```
となる．ここで，$R_\mathrm{l}=xR_\mathrm{b}$ とおいて整理すると，
```math
P_\mathrm{l}=\frac{E^2}{R_\mathrm{b}}\cdot\frac{x}{(1+x)^2},
```
と書ける．定数 $E^2/R_\mathrm{b}$ で除したものを$x$について微分すると，
```math
\frac{\mathrm{d}}{\mathrm{d}x}\frac{x}{(1+x)^2}=\frac{1-x}{(1+x)^3},
```
となり，$x=1$のとき，つまり$R_\mathrm{l}=R_\mathrm{b}$のときに最大となることが分かる．

通常，内部抵抗は十分小さいと考えられるから，負荷抵抗が小さいほど消費電力も大きくなるが，内部抵抗が負荷抵抗より大きい場合は，負荷抵抗を大きくしたほうが，負荷消費電力は大きくなるのである．このような場合，抵抗値の大きい，「暗い豆電球」のほうが明るくなる場合がある．ただし，抵抗器をつないでも，抵抗器で電力が消費されるようになるだけで，豆電球での電圧降下も電流も低下するので，より暗くなる．

また，上記は$R_\mathrm{b}$を固定して，$R_\mathrm{l}$を変数として見たときの話であり，$R_\mathrm{l}$を固定して$R_\mathrm{b}$を変数にした場合は，内部抵抗が小さいほど，負荷消費電力が大きくなる．

# 電池の直列つなぎと並列つなぎ
起電力と内部抵抗が同じ電池2つを直列につなぐと，電圧と抵抗はともに$2$倍になり，並列につなぐと，電圧はそのままで，抵抗は半分になる．このとき，直列につないだときの負荷消費電力$P_\mathrm{s}$と，並列につないだときの負荷消費電力$P_\mathrm{p}$は，それぞれ次のようになる．
```math
P_\mathrm{s} =\frac{R_\mathrm{l}(2E)^2}{\left(2R_\mathrm{b}+R_\mathrm{l}\right)^2}=\frac{4R_\mathrm{l}E^2}{\left(2R_\mathrm{b}+R_\mathrm{l}\right)^2}, \\
P_\mathrm{p} =\frac{R_\mathrm{l}E^2}{\left(\frac{1}{2}R_\mathrm{b}+R_\mathrm{l}\right)^2} =\frac{4R_\mathrm{l}E^2}{\left(R_\mathrm{b}+2R_\mathrm{l}\right)^2}.
```
すなわち，$R_\mathrm{l}>R_\mathrm{b}$ のときは直列のほうが明るくなるが，$R_\mathrm{l}<R_\mathrm{b}$ のときは並列のほうが明るくなるのである．境界は負荷消費電力が最大となる $R_\mathrm{l}=R_\mathrm{b}$ の場合であり，このときは直列につないでも，並列につないでも，負荷消費電力は変わらない．
Ruby 3 を古い gcc でコンパイルしたい

rbenv をつかって ruby を管理しており、v3（v3.1.3~、v3.2.0~）をインストールしたところ以下のようなエラーが出て困っている人向けの記事です。

```
compiling miniinit.c
In file included from vm_core.h:164:0,
                 from iseq.h:14,
                 from mini_builtin.c:3,
                 from miniinit.c:51:
thread_pthread.h:109:39: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'struct'
 RUBY_EXTERN RB_THREAD_LOCAL_SPECIFIER struct rb_execution_context_struct *ruby_current_ec;
                                       ^
In file included from iseq.h:14:0,
                 from mini_builtin.c:3,
                 from miniinit.c:51:
vm_core.h: In function 'rb_current_execution_context':
vm_core.h:1865:34: error: 'ruby_current_ec' undeclared (first use in this function)
     rb_execution_context_t *ec = ruby_current_ec;
                                  ^
vm_core.h:1865:34: note: each undeclared identifier is reported only once for each function it appears in
miniinit.c: At top level:
cc1: warning: unrecognized command line option "-Wno-tautological-compare" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-self-assign" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-parentheses-equality" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-constant-logical-operand" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-cast-function-type" [enabled by default]
make: *** [miniinit.o] Error 1
```

gcc を新しいものにすれば解決するようですが、環境がそれをゆるさらない人もいるかもしれません（わたしがそうでした、許されないってほど強いものではないですが…）

https://github.com/overleo/ruby322patch
ここにパッチを用意したのでこれを使ってインストールすれば解決するはず。

```
rbenv install --patch 3.2.2 < ruby32_bugfix.patch
```

あとはどうやってこのパッチを作ったか、です。

## なぜコンパイル時にエラーが出るのか

https://ml.ruby-lang.org/mailman3/hyperkitty/list/ruby-core@ml.ruby-lang.org/thread/Q4Y44DVL3FIBNZ3WFIACLED46C75LXPU/
こちらにバグレポートが上がっていますが、autoconf が `-std=gnu11` を追加し、古い gcc では通らなくなるようです。

3.2.x ではこの対処のための変更が追加されているようにも見えますがなぜか同様のエラーでコンパイルできない…。

## Ruby 3.3.0-preview1 をためしてみた

コンパイルが通る。
つかり 3.3.0-preview1 までの変更でなにかが変わったはず…。ということでそのコミットを頑張って探しました。

## 該当コミットをパッチにする

https://github.com/ruby/ruby/commit/96d1acfdf6c6b42f2029f44d5b5920961d6efa92
これです。

```
git format-patch -1 f99af43
```
該当コミットをパッチ形式にして github にあげたものが、この手順で作成したものです。

以上。
🍪初回だけ表示させるページを実装

***:cherries:学んだことを随時まとめてく:cherries:***
<font color="MistyRose">~間違っている点があれば是非教えてください~<font>

# やりたいこと:cloud::cloud_rain::sunny:
:cloud:→:sunny:ページに初めて遷移する前に別の:cloud_rain:ページを表示させたい
# 使うもの
- session
セッション機能を利用してユーザーの一時的なデータの保存を行う
- if
セッションの真偽値で遷移ページを分岐させる
- and return
if文の中にrenderを複数使用するならアクションを明示的に終了させる

# 実装
```ruby:controller.rb
def cloud
    session[:キー名] = true          #1.sessionの初期化/初回だよ〜ってデータ持たせる
end

def rain
    session[:キー名] = false         #3.遷移したら初回じゃないよ〜ってデータ持たせる
end

def sunny
    if session[キー名]　== true       #2.初回ならrainページ遷移
      render rain_path and return 
    end    
end
```
```:cloud.html.erb
<%= link_to sunny_path %>           #1回目も2回目もsunnyアクションへ行くことがpoint

```

- 注意すること
[if文の中で複数renderを使う時](https://qiita.com/katsuyuki/items/abf6b8d1cd43915e5586)
JavaScriptにおけるオブジェクトの分割代入とその便利な使い方

# 概要
JavaScriptでは、分割代入を使用することで、コードの簡潔化や効率的な開発が可能になります。本記事では、特にオブジェクトの分割代入について解説します。さらに、オブジェクトの値の更新を簡単に行う方法についても解説します。

## 目次
1. 分割代入とは？
2. 便利なオブジェクトの分割代入のユースケース
3. 便利なオブジェクトの分割代入の書き方
4. オブジェクトの値の更新と分割代入
5. まとめ

## 1. 分割代入とは？
[JavaScriptにおける分割代入とは、配列やオブジェクトから必要な要素を取り出し、変数として別々に扱う手法です](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)。これにより、コードの可読性を向上させることができます。

## 2. 便利なオブジェクトの分割代入の書き方
オブジェクトの分割代入の書き方は簡単です。以下のコード例を参考にしてください。

```javascript
const personalInfo = {
  firstName: "Michel",
  lastName: "Smith",
  hobby: "swimming"
};

const { firstName, lastName, hobby } = personalInfo;

console.log(firstName); // Michel
console.log(lastName); // Smith
console.log(hobby); // swimming
```

上記のように、分割代入を利用することで、オブジェクトの各プロパティを別々の変数として取り出すことができます。

## 3. オブジェクトの値の更新と分割代入
オブジェクトの分割代入は値の更新にも便利です。

以下のコード例を見てみましょう。

```javascript
const setInfo = (firstName, lastName, email, hobby) => {
  const personalInfo = {
    firstName: firstName,
    lastName: lastName,
    email: email,
    hobby: hobby,
  };
  return (updateItem, updateContent) => {
    return { ...personalInfo, [updateItem]: updateContent };
  };
};

const data = setInfo("Michel", "Smith", "michel@sample.io", "swimming"); 
// { name: "Michel", email: "Smith", birthday: "michel@sample.io", hobby: "swimming" } と情報がセットされる。

console.log(data("hobby", "running")); // { name: "Michel", email: "Smith", birthday: "michel@sample.io", hobby: "running" }　
// hobbyが swimmingから runningへ更新されている
```

上記のコードでは、`setInfo`関数によって作成された`data`関数を呼び出しています。`data`関数には、第一引数に更新したい項目名（例えば、"hobby"）を指定し、第二引数に更新したい値（例えば、"running"）を指定します。

`data("hobby", "running")`という呼び出しを行うと、`personalInfo`オブジェクトの"hobby"プロパティの値が"running"に更新された新しいオブジェクトが返されます。これは、分割代入とスプレッド演算子を組み合わせて実現しています。この手法は特にReactで入力フォームを実装する際に便利です。

## 5. まとめ
本記事では、JavaScriptにおけるオブジェクトの分割代入について解説しました。分割代入を使うことで、コードの可読性を向上させるだけでなく、効率的な開発が可能になります。さらに、オブジェクトの値の更新にも分割代入が役立つことを紹介しました。JavaScriptの開発において、オブジェクトの分割代入をマスターし、効果的に活用しましょう。


最後まで読んでいただき、ありがとうございます。お気づきのことがあればコメント頂けますと幸いです。

### 引用
[分割代入](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)
符号ベース暗号スポット解説 1/10〜符号ベース暗号で用いられる計算問題〜

実は今Zennで符号ベース暗号と量子アルゴリズムに関する本（というより今までの自分の知識の整理をする予定のもの）を書いています
（構成だけ作って満足している人()）
[符号ベース暗号と量子アルゴリズム](https://zenn.dev/0917laplace/books/d68277f585878a)

そこでは，符号ベース暗号に関する基本的事項（必要な数学も全て）から最先端の話題（筆者の研究も少し書きます）まで取り扱うつもりなのですが，完成までに割と（３年ぐらい？）時間がかかりそうですし，いくつかのリクエスト記事に答える形で「美味しい」部分を先に扱おうと思います

といっても，このスポット解説も書き終えるのに１年ぐらいかかりそうではあるため，月１本ペースで気長に待ってくださればと思います

| 回目 | 内容 |
|---|---|
| 第1回 | 符号ベース暗号で用いられる計算問題 |
| 第2回 | McEliece暗号方式, Niederreiter暗号方式, CFS署名方式 |
| 第3回 | BIKE, Classic McEliece, HQC（Hamming符号ベース暗号方式） |
| 第4回 | ROLLO, RQC（Rank符号ベース暗号方式） |
| 第5回 | LESS-FM, Durandal（符号ベース署名方式） |
| 第6回 | Information Set Decodingアルゴリズム, Dumer のアルゴリズム |
| 第7回 | MMT, BJMMアルゴリズム, DOOM |
| 第8回 | Nearest-Neighbor, Syndrome Decoding Estimator |
| 第9回 | 量子Information Set Decodingアルゴリズム |
| 第10回 | GRSアルゴリズム |

構成を簡単に説明します

符号ベース暗号の論文は

1. どのような符号を用いるのか
2. その符号に対してどのような計算問題を用いるのか
3. 暗号方式 or 署名方式
4. 設計 or 攻撃

という視点で分類すると，読みやすくなると思っています．

そこで
第１回 → 1.と2.
第２回 → 3.の概要(暗号方式と署名方式・設計)
第３・４回 → 3.と4.（暗号方式・設計）
第５回 → 3.と4.（署名方式・設計）
第６-10回 → 3.と4.（暗号方式・攻撃）
という構成を取って，なるべく最新の話題までさらえるように仕上げていきます

# 1. どのような符号を用いるのか

符号理論で考察の対象となる符号はたくさんあるのですが，その中でもよく符号ベース暗号で使われるのはHamming距離を用いた符号とRank距離を用いた符号です

またその中でも代数系か組合せ（という呼び方が適切かは知らない，モダンと呼ばれるもの）系かに分かれます

大雑把にですが，

|  |Hamming  |Rank  |
|---|---|---|
|代数    |Reed-Solomon 符号 <br> Goppa 符号 | LDPC 符号 <br> QC-MDPC 符号 |
|組合せ  | Gabidulin 符号 | LRPC 符号 |

みたいな分類ができます

はじめにこれらの符号を使ってどのような暗号方式や署名方式が構成されるのかを理解してから，徐々に（自分の中で）扱える符号を増やすと良いと思います

# 2. その符号に対してどのような計算問題を用いるのか

以前の符号ベース暗号の連載記事では，シンドローム復号問題というNP完全な問題を紹介しましたが，他にも計算困難な問題はあります（その問題が実際の暗号方式や署名方式に用いられているかは一旦別として）

参考文献
[耐量子計算機暗号の研究動向調査報告書](https://www.cryptrec.go.jp/report/cryptrec-tr-2001-2022.pdf)

格子暗号で用いられるLWE問題を弱めたLPN（Linear Parity with Noise）問題という問題があります
大雑把にいうと $\mathbb{F}_2$ 上のLWE問題がLPN問題に対応します

また，Rank距離を用いた符号では，いずれ紹介しますがDurandalという署名方式の原論文において，いくつかの計算困難問題が紹介されています．
[N. Aragon, O. Blazy, P. Gaborit, A. Hauteville, Gilles Zémor: ``Durandal: a rank metric based signature scheme'', In: Advances in Cryptology–EUROCRYPT 2019: 38th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Darmstadt, Germany, May 19–23, 2019, Proceedings, Part III 38. Springer International Publishing, pp.728-758, 2019.](https://eprint.iacr.org/2018/1192.pdf)

＊↑の引用先はePrint

例えば，シンドローム復号問題のRank距離版であるRank SDP（Rank Support Decoding Problemとも）やRSLP（Rank Support Learning Problem），PSSIP（Product Spaces Subspaces Indistinguishability Problem）などが議論されています
＊PSSIPについては，つい先日それ関連のePrintが出ましたね（Nicolas Aragon, Philipe Gaboritは符号ベース暗号だとめちゃくちゃ有名ですね・・・）
[N. Aragon, V. Dyseryn, P. Gaborit: ``Analysis of the security of the PSSI problem and cryptanalysis of the Durandal signature scheme'', Cryptography ePrint Archive, 2023/926, 2023.](https://eprint.iacr.org/2023/926.pdf)

----------------------------
今回の内容はここまでです．ここまでご覧になってくださった方々ありがとうございます！
プログラミング未経験者の記録vol.02

# ◉はじめに
以前に「プログラミング未経験者の記録」をvol.01として投稿しております。
よろしければそちらも踏まえてご覧いただけますと幸いです🔥

▶︎ [プログラミング未経験者の記録](https://qiita.com/ayumi-katsuki/items/e44166ed726a28fffd47)

# ◉簡単なおさらい
以下は０からSTARTして今まで行ってきた内容です。

①ITパスポートで基礎的なITを学ぶ
②UNIXコマンドをWEBで学習
③Kotlin学習
④同時進行で用語集も作成
⑤CodelabでAndroidを基礎から学ぶ　<font color="Red">←現在</font>


# ◉⑤CodelabでAndroidを基礎から学ぶ　←現在

[「プログラミング未経験者の記録」vol.01](https://qiita.com/ayumi-katsuki/items/e44166ed726a28fffd47)をご覧いただいた方はご存知かと思いますが、Codelabの続きの記録となります。

Codelabでは、下記のカリキュラムに沿って勉強しています。
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172794/7bb3a18b-76ec-229c-94f3-90b8cb8ca84b.png">
記載している現在はLesson8まできています。

:::note warn
同じようにこちらのCodelabをやる方へ
公式にも記載の通り```古い```ため、指定のプロジェクトをダウンロードして、いざやろうと思っても、しょっぱなエラー祭り開催です💣💥
そのため、様々なバージョンの変更等をしなくてはなりません。
（私は周りの方々にたくさん協力いただき、なんとか…🥲）
:::




と、いろんな障害をなんとか乗り越えたりしましたが、私の理解力の足りなさからこのように座学的なことをさせて頂いていても、決して理解したとはいえない状態なのが正直なところです…。

# ◉実践編カリキュラム（お試し）

そんなCodelabの途中ですが、`実践編カリキュラム`というのをやらせて頂きました！
これは覚えておいた方がいいというところなどに特化してお試しで授業のような形で行なって頂きました。

実際に、現在会社で使用しているコードを見ながらやるような感じで、最後には問題を回答していきます。
実質行った時間は1時間ほどでしたが、私のモヤポイントをピンポイントにおさえていた内容で、非常に勉強になりました。

▼それがこちら（一部目隠ししています🙏🏻）
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172794/f9b90baf-98bd-26cf-82b3-0d604e0d7956.png">
※自部署の方が作成してくれました！すご✨
※①は左の付箋を右の正しい場所に配置してみるってやつです。




---
以下、個人的な感想です！
内容はとても勉強になったのはもちろんですが、やらせて頂いている時にふと思ったことがあり、今までわからないことしかない中で、聞くことしかできていなかったと気づき、痛感しました。
聞いたその後、自身で考えてとにかくやってみるということに億劫になっていました。
「今まで学んできたのにまだそんなこともわからないの？」って誰かに言われてもないのに勝手にそう思い、ネガティブになり、どんどん殻に篭るような感じで見事に引きこもってたなぁと。笑
今はまだリハビリ？中ですが、また殻に篭るようなことがないように自身でしっかりメンタル面も管理していこうと思います。
もし同じような方がいた場合、些細な部分ですがこれが何かの参考になれば幸いです😂


以上です。
ご覧いただきありがとうございました❤️‍🔥
(リンクだけです)「順像法と逆像法」を調べてみたい。

**順像法と逆像法を英訳したら、どうなりますか。教えて下さい。**
**wikipediaを探しています。**
**よろしくお願いします。**


# ???deeplより???
https://www.deepl.com/ja/translator#ja/en/順像法
https://www.deepl.com/ja/translator#ja/en/逆像法

https://www.deepl.com/ja/translator#en/ja/
https://www.deepl.com/ja/translator#en/ja/progressive_probation
??累進課税
https://www.deepl.com/ja/translator#en/ja/sequential_imaging
??シーケンシャル・イメージング

# オリジナル

https://manabitimes.jp/math/2737

https://examist.jp/category/mathematics/inverse-image/

# wolframalphaで

https://www.deepl.com/ja/translator#en/ja/restricted
https://www.deepl.com/ja/translator#en/ja/restriction

＞Specify a restriction on the independent variable:
＞独立変数の制約条件を指定する：

https://ja.wolframalpha.com/examples/mathematics/mathematical-functions/domain-and-range


# 内部検索
＞順像法＜大学入試数学問題集成

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%E9%A0%86%E5%83%8F%E6%B3%95&oq=%E9%A0%86%E5%83%8F%E6%B3%95&gs_l=partner-web.3..0i512l10.5174.23531.0.25433.26.26.0.0.0.0.291.3019.5j20j1.26.0.csems%2Cnrl%3D10...0....1j4.34.partner-web..5.21.2549.LkAyyptIj48

https://www.google.com/search?q=site%3A%2F%2Fkamelink.com+%E9%A0%86%E5%83%8F%E6%B3%95&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fkamelink.com+%E9%A0%86%E5%83%8F%E6%B3%95&aqs=chrome..69i57j69i58.10739j0j4&sourceid=chrome&ie=UTF-8

https://www.google.com/search?q=site%3A%2F%2Fmathmathmass.exblog.jp+%E9%A0%86%E5%83%8F%E6%B3%95&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fmathmathmass.exblog.jp%E3%80%80%E9%A0%86%E5%83%8F%E6%B3%95&aqs=chrome..69i57j69i58.10856j0j4&sourceid=chrome&ie=UTF-8
Salesforce Chatter　ライセンスについて分かりやすく解説してみた

こんにちは
本橋孝昭です

今回はSalesforce Chatterの中でも、Chatterライセンスについて解説します

今回の内容を確認すればChatterのライセンスについてよくわかります


## そもそもSalesforce Chatterって何？
SakesforceのChatter機能とは
Salesforce内に実装されているSNSのようなチャットツールです。
社員間のコミュニケーションに使えることも可能ですし、社外のお客様をSakesforce環境に招いて一緒にチャットをすることも可能です


サクセスナビではこのように書いてありますね
https://successjp.salesforce.com/article/NAI-000034

＞Chatter（チャター）とは、社内向けのSNSツール。
Facebookや Twitterのような使い勝手で社内での情報共有が簡単・安全に行えます。

ChatterはSalesforce内でコミュニケーションが可能ですが、
Salesforce Chatterのみをつかえる設定のユーザを作成することが可能です
Salesforce Chatterのみをつかえる設定のユーザライセンスは大きく２つあります

・1  社外用ライセンス「Chatter　External」
・2　社内用ライセンス「Chatter　Free」

上記２つはともに
・Chatter機能しか使わないライセンスのユーザ作成

という点では同じですが社内用と社外用なので大きくできることが異なります

図にするとこのようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/03256172-7e4c-346b-ed43-016b86970fb4.png)

・まず、「Chatter　External」「Chatter　Free」ともに一般的なSalesforceで使われるレコードの閲覧などはできないです
（あくまでChatterおよびその周りの機能しかつかえない）
・「Chatter　Free」ライセンスはSalesforce環境にあるどの公開Chatterグループも見ることや投稿をすることが可能ですが「Chatter　External」は公開Chatterグループ内で投稿することはもちろん、見ることもできません

・「Chatter　External」は非公開Chatterグループでなおかつその非公開Chatterグループで招待されたChatterグループでしか見ることや投稿はできません

・「Chatter　External」「Chatter　Free」ともにファイルの共有や共有したファイルのダウンロードは可能


いかがでしたでしょうか

今回は分かりそうで分かりにくい？「Chatter　External」「Chatter　Free」のライセンスについて解説しました

ぜひこのライセンスの違いを理解しChatterの有効利用をしましょう