OmniAICreator/Qiita-1.07M huggingface dataset:
イミュータブルってなに？

# イミュータブルとは何か

### 説明

イミュータブル（immutable）とは、「不変」という意味です。

イミュータブルオブジェクトは、インスタンス作成後に内部状態を変更できないオブジェクトを指します。

一度値が設定されると、その値が変更されることがなく、新たに設定し直すこともできません。

### 例

- boolean、int等のプリミティブ型
- String、Integer等のラッパークラス
- java.util.Collectionsの不変コレクション

などがあります。

### 特徴

- 初期化時にのみ値を設定できる
- 設定された値は変更不可
- 値を変更する操作は新しいオブジェクトを生成する

### 対比

イミュータブルに対して、ミュータブル（mutable）オブジェクトは、その内部状態を自由に変更できるオブジェクトです。ArrayListやStringBuilder、Calendarなどがミュータブルオブジェクトです。

# なぜイミュータブルオブジェクトを使うのか

イミュータブルオブジェクトを使用する主な理由には以下のものがあります。

### 1. スレッドセーフ

イミュータブルオブジェクトは、その状態が変更されないため、複数のスレッドから同時にアクセスされてもデータ競合が発生しません。これにより、マルチスレッド環境での安全性が保証されます。

例えば、スレッド間で共有されるマップやリストなどは、イミュータブルなオブジェクトとして実装するのが一般的です。

### 2. シンプルなデバッグ

状態が変わらないため、イミュータブルオブジェクトは予測可能であり、バグの追跡が容易です。ある時点でのオブジェクトの状態がその後変わることがないため、一度状態を確認すれば、それ以降その状態について心配する必要がありません。

### 3. キャッシュの効率化

イミュータブルオブジェクトは変更されないため、キャッシュに保存しても一貫性が保たれます。

キャッシュキーは、キャッシュされた値と一意に結びついているため、変更されないことが重要です。イミュータブルなオブジェクトを使用することで、キャッシュキーの整合性を保ち、キャッシュのヒット率を向上させることができます。これにより、キャッシュの利用効率が向上し、パフォーマンスの改善につながります。

# イミュータブルオブジェクトはどう動くのか

一般的に、イミュータブルオブジェクトは**コピーオンライト方式**と呼ばれる仕組みで実装されます。これは、オブジェクトへの変更操作を行う際、既存のオブジェクトを変更するのではなく、新しいオブジェクトを生成することで実現する手法です。

### イミュータブル(String)

Stringはイミュータブル（不変）オブジェクトです。つまり、一度作成されたStringオブジェクトの内容は変更できません。文字列を結合すると、新しいStringオブジェクトが作成されます。

```java
public class StringExample {
    public static void main(String[] args) {
        String str = "Hello";
        str += " ";
        str += "World";
        System.out.println(str); // 出力: Hello World
    }
}
```

上記のコードでは、文字列の結合が行われるたびに新しいStringオブジェクトが作成されます。これは、小規模な文字列結合では問題ありませんが、大規模な結合ではメモリとパフォーマンスに悪影響を及ぼす可能性があります。

### ミュータブル(StringBuilder)

StringBuilderはミュータブル（可変）オブジェクトで、内部の文字列を変更することができます。文字列を結合する際に、新しいオブジェクトを作成せずに内部バッファを使用して効率的に操作を行います。

```java
public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append("Hello");
        sb.append(" ");
        sb.append("World");
        System.out.println(sb.toString()); // 出力: Hello World
    }
}
```

上記のコードでは、StringBuilderを使用して文字列を結合しています。内部バッファを利用することで、Stringのように新しいオブジェクトを作成することなく効率的に文字列結合が行われます。

### コピーオンライト方式のメリット

- スレッドセーフ: 複数のスレッドからオブジェクトに同時にアクセスしても、データ競合が発生しない。
- メモリ効率: 多くの場合、変更頻度が低いオブジェクトを効率的に共有できる。
- 単純な実装: オブジェクトをコピーするだけのシンプルな実装が可能。

### コピーオンライト方式のデメリット

- メモリ使用量の増加: オブジェクトのコピーが生成されるため、メモリ使用量が増加する可能性がある。
- パフォーマンスの低下: オブジェクトのコピーが発生するたびに、パフォーマンスが低下する可能性がある。
セキュリティも政治も、権限集中はよくないね。必要な時は内部通報を。

# 背景

> アプリケーション開発に注力するための工夫をシェアしよう！

ってのをみて思ったのが・・

同僚が関わってる案件・・明らかに燃えそうだから、なんか助言できないか考えてみるか？

ってことで、思考してみた記録

# はじめに

通常なら・・以下のような、開発自体の効率をよくする方向性を考えるべきだけど・・

- 優先順位の明確化：やるべきことをリストアップし、優先順位をつける。
- 時間管理：ポモドーロテクニックやタイムボクシングなどの時間管理方法を活用する。
- ツールの活用：効率的な開発環境を整えるためのツールやプラットフォームを導入する。
- コミュニケーションの効率化：チャットツールやドキュメント管理ツールを活用して、情報共有をスムーズに行う。
- 自動化：CI/CDパイプラインを構築して、手作業を減らす。

今回の案件は、そもそも開発に集中出来るような環境ではないという状況

# 問題点はなにか？

聞こえてきただけで・・

- 見積もった人が既にいない
- 見積もった内容と既に違っている
- 見積の前提すら違う
- 見積の根拠すら決まってない
- ベースがあるといってたのに無い
- ソースがまともに管理されてない
- 構成管理ツールを使ったことない状態だった？
- 納期が削られた
- 工数も削られた
- ハードが遅れてる（組み込み系ソフト）
- 既に元請けは逃げる体制確立済み
- 元請けは、同じ会社の別部署
- 会社としては逃げられない案件（ハードのせい）

いや、もう救いようないじゃん？という世界
今どきこんな開発有るの？って思ったんですが、あるみたいですよ :laughing: 

# ではどうするか？

- 記録をきちんと残す。Teams 会議はすべて録画する。
    - プロジェクトの問題点を明確にし、どの部署が責任を持っている、持っていたのかを記録に残し、将来的起こり得る水掛け論を予防する。こうすることで、多くは最初に請けた部署の問題であり、それらの火消しをしたという点で逆に評価されやすくなる・・はず？
    
- 上位層を巻き込む
    - 赤字になること前提で支援に入っていることを評価してもらう必要があることと、他部署との力関係で損害だけ押し付けられることを防ぐことが大切。問題のあるのが部署なのか一部の人なのかを精査して、再発しないように上申することも。
- 可能な限り周りもサポート
    - 会社として逃げられない以上、文句言っててもしょうがないので、どうやりきるか？も考える必要はある。やりたくないけど :sweat: 
- 内部通報
    - 聞くところによると、これが初めてではないし、結構上の人も関わってるらしいので、本社マターにしちゃう。これこそパワハラの見本なんじゃないですかね

PMBOK でのリスク管理、うちでもPM研修とかあって、勉強させてるはずなんですけどね。

- リスクの特定：プロジェクトに潜むリスクを洗い出す。
- リスクの評価：リスクの影響度と発生確率を評価し、優先順位を決める。
- リスク対応計画の策定：リスクを回避、転嫁、軽減、受容するための計画を立てる。
- リスクの監視とコントロール：リスク対応計画を実行し、リスクの状況を継続的に監視する。

# 結論

システムで防ごうよ！って思うけれど、運用するのは人です。
人は、権力を持ち出すと、ついつい我が儘になりがちです。
セキュリティでも政治でも、権力集中しちゃダメですね。

なぜこれが結論か？

だって、こんな案件請けなければいいじゃんって思うでしょ？でも、ぶっちゃけ上位層の意向ですから、根治療法・・はねぇ！？


記載内容は架空の話であり、必ずしも所属組織の事実を暗示するものではありません。<font color=gray>って言えたらいいね</font>
ScalaCheckのPropertyについて

# 概要

ScalaCheckのPropertyは、プログラムの特定の特性を表現し、それを検証するためのものです。
この記事ではPropertyに定義されている様々なメソッドを呼び出した結果について共有します。

## Prop.forAll

`Prop#forAll`メソッドは、生成された入力データに対してプロパティを定義し、
そのプロパティがすべての入力データに対して満たされるかどうかをチェックします。

```scala
import org.scalacheck.Prop.forAll

val propConcatLists = forAll { (l1: List[Int], l2: List[Int]) =>
  l1.size + l2.size == (l1 ++ l2).size
}
```

## Prop.throws

`Prop.throws`は、ScalaCheckでプロパティが特定の例外をスローするかどうかをテストするためのメソッドです。
これは、プロパティが例外を期待通りにスローすることを確認するために使用されます。

```scala
import org.scalacheck.Prop
import org.scalacheck.Prop.{throws, forAll}

val propThrowsException = forAll { (n: Int) =>
  throws(classOf[IllegalArgumentException]) {
    require(n >= 0, "n must be non-negative")
  }
}
```

## Prop.classify

`Prop.classify`を呼び出すと、テストケースの分布を確認することができます。
以下は、テストコードおよび実行時の標準出力内容ですが、インプットの偶数と奇数の割合が確認できます。

```scala
import org.scalacheck._
import Prop.forAll

val prop = forAll { (n: Int) =>
  Prop.classify(n % 2 == 0, "even", "odd") {
    true // 本当はここでプロパティが満たすべき性質を確かめる実装をする
  }
}

prop.check()

// 【テスト実行結果】
// $ scala-cli test.sc
// Compiling project (Scala 3.4.2, JVM (21))
// Compiled project (Scala 3.4.2, JVM (21))
// + OK, passed 100 tests.
// > Collected test data: 
// 60% odd
// 40% even
```

## Prop.undecided

`Prop.undecided`を使用すると、プロパティベースのテストにおいて、特定の入力や条件に対して判断を保留することができます。

```scala
import org.scalacheck._
import Prop.forAll

val prop = forAll { (n: Int) =>
  if (n == 0) Prop.undecided
  else Prop(n > 0)
}
```

## Prop.falsified

`Prop.falsified`を使用すると、
特定のプロパティが常に偽であることを示すことができます。

```scala
import org.scalacheck._
import Prop.forAll

val prop = forAll { (n: Int) =>
  if (n % 2 != 0) Prop.falsified // 常に失敗する
  else Prop(n % 2 == 0)
}
```

## Prop.proved, Prop.passed

`Prop.proved`もしくは`Prop.passed`を使用すると、プロパティが成功したことを示すことができます。

```scala
import org.scalacheck._
import Prop.forAll

val prop = forAll { (n: Int) =>
  if (n % 2 != 0) Prop.proved // もしくはProp.passed
  else Prop(n % 2 == 0)
}
```
備忘メモ: csvファイルの一部を更新したいときに見る

windowsでpythonを実行中、csvファイルを作成していてなんだろうこのもじれつや改行は...?と思ったので備忘メモ


読み取ったcsvファイルのヘッダーに\ufeffという文字列が追加されてしまっていたので、読み取るときのエンコーディングを指定する.
```python
import csv

with open(csv_path, 'r', enconding='UTF-8-sig') as r_obj:
    reader = csv.DictReader(r_obj)
```



書き込むときは、改行コードをブランクになるように指定する
```python
with open(write_csv_path, 'w', encoding='UTF-8', newline='') as w_obj:
    fields = ['ID', 'BUILD_TYPE']
    writer = csv.DictWriter(w_obj, fieldname=fields)
    writer.writeheader()

```

まとめ
```python
import csv


read_csv_path = r'.\Python\android_version_cookbook.csv'
write_csv_path = r'.\Python\new_android_version_cookbook.csv'

_tmp = []
with open(read_csv_path, 'r', encoding='UTF-8-sig') as r_obj:
    csvreader = csv.DictReader(r_obj)
    for line in csvreader:
        for i in range(1, 5):
            d = {}
            d['ID'] = line['ID']
            d['POSITION_ID'] = line['POSITION_ID']
            d['GSI_CODE'] = f'0{i}'
            d['RELEASE_DATE'] = line['RELEASE_DATE']
            d['BUILD_TYPE'] = line['BUILD_TYPE']
            d['VALUE'] = line['VALUE']
            d['NAME'] = line['NAME']
            _tmp.append(d)


with open(write_csv_path, 'w+', encoding='UTF-8', newline='') as w_obj:
    fields = ['ID', 
              'POSITION_ID', 
              'GSI_CODE', 
              'RELEASE_DATE', 
              'BUILD_TYPE', 
              'VALUE', 
              'NAME']
    writer = csv.DictWriter(w_obj, fieldnames=fields)
    writer.writeheader()

    for row in _tmp:
        writer.writerow(row)


```


参考：
https://qiita.com/Ryo-0131/items/7d6b1c772b32c3bbe15e
改めてみるReact公式はいいかも

## はじめに
Reactとは
以下chatGPTより
> Facebookによって開発された、ユーザーインターフェースを構築するためのJavaScriptライブラリ。
特に、単一ページアプリケーションや大規模なデータのリアルタイム表示を行うウェブアプリケーションにおいて、効果的なUIコンポーネントの構築を目的としている。

開発を始めた当初こそクイックスタートの実装をハンドオンで実施したものだが、
今の公式はよりみやすく学びやすくなっている。

## 推しポイント
### チャレンジ問題が楽しい

ちょこちょこ挟まるチャレンジ問題が面白いかつ手をつけやすいです。
簡単な三項演算子の処理から`state`の保持管理まで楽しく学ぶことができます。

![スクリーンショット 2024-06-17 22.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812987/d1862a99-ad0b-f67b-702f-3bf81b7f38eb.png)

### 図やイラストがわかりやすい

理解のための図解やわかりやすい流れなどを細く情報としてたくさん添付してくださっているので
文章だけだとなかなか理解しづらい人も学びへのハードルが下がると思います。

![スクリーンショット 2024-06-17 22.06.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812987/8ec939e1-23d4-c40b-b834-45653e8b4978.png)

#### 地味に嬉しい日本語対応

今までもそうだった気がするけど、改めて嬉しいポイント。
すでに英語・日本語・フランス語・スペイン語・トルコ語は翻訳がなされていて
その他多数の言語にも対応中らしい。

## さいごに
正直色々な参考書を読むよりも公式を見た方が勉強になるなと感じています。
新人用の作業がない時などスタートアップを実施してみてもらうのもありかもしれません。
その時は[typescriptサバイバル](https://typescriptbook.jp)も忘れずに！
ScalaCheckでテスト失敗時にデバッグする

## 概要

この記事では、ScalaCheckでデバッグする際に使える機能について共有させていただきます。

## ラベルを貼る

`:|`や`|:`を使うことによって、 テスト失敗結果が見やすくなります。

以下はテストが失敗するようなテストコードになります。
テスト結果として、`ARG_0`および`ARG_1`, `ARG_0_ORIGINAL`, `ARG_1_ORIGINAL`というラベルがテストで使用した値に貼られますが、
どのラベルがどのインプットに対応しているか分かりにくいですね。

```scala:test.sc
//> using dep "org.scalacheck::scalacheck::1.18.0" 

import org.scalacheck.Prop.{forAll, propBoolean}
import org.scalacheck.Gen

val genEvenNumber = Gen.choose(0, 100).suchThat(_ % 2 == 0)
val genOddNumber = Gen.choose(0, 100).suchThat(_ % 2 == 1)

val propEvenAndOdd = forAll(genEvenNumber, genOddNumber) { (even, odd) =>
  // 故意にテストを失敗させる    
  (even % 2 == 1) && (odd % 2 == 0)
}

propEvenAndOdd.check()

// 【テスト結果】
// $ scala-cli test.sc
// Compiling project (Scala 3.4.2, JVM (17))
// Compiled project (Scala 3.4.2, JVM (17))
// ! Falsified after 0 passed tests.
// > ARG_0: 0
// > ARG_1: 0
// > ARG_0_ORIGINAL: 50
// > ARG_1_ORIGINAL: 97
```

`:|`を使うと、以下のように、
テストが失敗した際のインプットや条件式が分かりやすくなります。

```scala: :|の使用例
//> using dep "org.scalacheck::scalacheck::1.18.0" 

import org.scalacheck.Prop.{forAll, propBoolean}
import org.scalacheck.Gen

val genEvenNumber = Gen.choose(0, 100).suchThat(_ % 2 == 0) :| "even number"
val genOddNumber = Gen.choose(0, 100).suchThat(_ % 2 == 1) :| "odd number"

val propEvenAndOdd = forAll(genEvenNumber, genOddNumber) { (even, odd) =>
  // 故意にテストを失敗させる    
  (even % 2 == 1) :| "even check" &&
  (odd % 2 == 0) :| "odd check"
}

propEvenAndOdd.check()
// 【テスト結果】
// $ scala-cli test.sc
// Compiling project (Scala 3.4.2, JVM (17))
// Compiled project (Scala 3.4.2, JVM (17))
// ! Falsified after 0 passed tests.
// > Labels of failing property: 
// even check
// > even number: 0
// > odd number: 0
// > even number_ORIGINAL: 30
// > odd number_ORIGINAL: 29
```

## 期待値と実際の値の差異を確かめる

`=?`を使うことによって、期待値と実際の値の差異を確かめることが可能です。

```scala
//> using dep "org.scalacheck::scalacheck::1.18.0" 

import org.scalacheck.Prop.{forAll, propBoolean, =?, AnyOperators}
import org.scalacheck.Gen

val propEvenAndOdd = forAll(Gen.const(1)) { (num) =>
  num =? 2
}

propEvenAndOdd.check()

// 【テスト結果】
// $ scala-cli test.sc
// Compiling project (Scala 3.4.2, JVM (17))
// Compiled project (Scala 3.4.2, JVM (17))
// ! Falsified after 0 passed tests.
// > Labels of failing property: 
// Expected 0 but got 2
// > ARG_0: 0
// > ARG_0_ORIGINAL: 1
```
ScalaCheckのArbitraryについて

# 概要

ScalaCheckのArbitraryとは、特定の型のジェネレーターを提供するためのクラスです。
ジェネレーターとは、ランダムな値を生成するためのオブジェクトであり、テストデータを作成するために使用されます。

# forAllメソッドにArbitraryを渡す

forAllメソッドは、暗黙のパラメータとしてArbitraryを受け取り、
Arbitraryによって提供されるジェネレータを使ってテストを行います。

```scala:forAllの定義
  def forAll[A1, P](
      f: A1 => P
  )(implicit
      p: P => Prop,
      a1: Arbitrary[A1],
      s1: Shrink[A1],
      pp1: A1 => Pretty
  ): Prop = forAllShrink(arbitrary[A1], s1.shrink)(f andThen p)
```

## 具体例

以下のコードは、`Arbitrary[Int]`を`implicit val`として定義して、
`forAll`に渡すサンプルコードです。

`forAll`内では数値が0から100であることを検証していて、
テスト結果は`+ OK, passed 100 tests.`と、成功しています。

```scala:test.sc
//> using dep "org.scalacheck::scalacheck::1.18.0" 

import org.scalacheck.{Arbitrary, Gen, Prop}
import org.scalacheck.Prop.forAll

implicit val arbitraryInt: Arbitrary[Int] = Arbitrary(Gen.choose(0, 100))

val prop = forAll { (n: Int) =>
  n >= 0 && n <= 100
}

prop.check()
```

```txt:実行結果
$ scala-cli test.sc
Compiling project (Scala 3.4.2, JVM (17))
Compiled project (Scala 3.4.2, JVM (17))
+ OK, passed 100 tests.
```
約3年間リモートワークで働きました

## リモートワークで働いてみて感じたこと
リートワークはやっぱり良い！
満員電車乗らなくていいし、夏でも汗をかかずに過ごせる！

## 働く時に気をつけなければいけないこと
* PRやドキュメントなど、とにかくアウトプットを出すこと
* 毎日何をしたかの記録を残しておくと、評価の時に助かる
* テキストコミュニケーションなので、大袈裟なくらい明るく振る舞う（絵文字必須）
* 仕事のことは、仕事の時間にだけ考える

## コードは積極的に見せていく
コードが、ゴッホのように、死後その成果が讃えられることは絶対にない
私は天才ではない。自分のコードが誰かより優れていることもない。
1. フィードバックを早めに貰えばもらうほど、修正は早く楽になる
2. 自分の成果を他人に見てもらえる
3. そもそもコードが不要で、開発しなくてよくなる

フィードバックをもらえないと、成長もできない、汚いコードやバグを抱えたまま過ごしてしまい、のちに大惨事が😖
私は、辞めた後にそれが発覚して、残っていたメンバーに迷惑かけました・・・

## コミュニケーションが大事はその通り
テキストコミュニケーションでは、想像力を働かせて会話しないといけないこともある。
* 相手が伝えたいことを、文章からだけで読み取る
* 自分が伝えたいことを、短くわかりやすく
* 相手が受け取った時に、どんな感情になるかを考えて文章をつくる
* ダメ出しや嫌味などは、絶対に送らない。自分が後で絶対に嫌になる。

新卒でよく言われるコミュニケーション力が大事って、今噛み締めてます。

## 臆せず質問や失敗をしまくろう
後悔していることは、もっと全体やグループにチャットで早期に相談すべきであった。
何時間作業が早くできただろう・・・
失敗もしまくっていいと思う。失敗からしか学ばない（くらいの気持ち）

## リモートワークに向かない人はいるか
いないと思う。
向かないと思ったのは、勤めていた会社の落ち度だと思う。
リモートワークで働きやすい会社は、出社しても良い会社だと思う。

## まとめ
たくさん失敗して、たくさん質問して、たくさん人とコミュニケーションを取りましょう。
リモートと出社どんな働き方でもできる世の中にもっとなって欲しいです。

自分の最近の目標は、テキストコミュニケーションだけで、人を笑わせることです！
Micrsoft Word文書をGitでバージョン管理する

# はじめに
こちらの記事ではGitを用いてMicrosoft Wordで作成した文書をバージョン管理されている方を対象に、より便利に活用するためのGitのカスタマイズ方法について解説しています。Gitでファイルをバージョン管理する方法そのものについては解説しておりません。

対象OS：　MacOS（OS X以降）

Word文書をGitで管理する上で、一つ問題が生じます。
それは下記のように前のバージョンとの比較がうまくできないのです。

> 人類にとって最も厄介な問題のひとつ、Wordで作成した文書のバージョン管理ではないでしょうか。 奇妙なことに、Wordは最悪のエディタだと全ての人が知っているにも係わらず、皆がWordを使っています。 Word文書をバージョン管理したいと思ったなら、Gitのリポジトリにそれらを追加して、まとめてコミットすればいいのです。しかし、それでいいのでしょうか？ あなたが git diff をいつも通りに実行すると、次のように表示されるだけです。

```terminal
$ git diff
diff --git a/chapter1.docx b/chapter1.docx
index 88839c4..4afcb7c 100644
Binary files a/chapter1.docx and b/chapter1.docx differ
```

> これでは、2つのバージョンをチェックアウトして、目視で見比べなくては、比較はできませんよね？

git-scm.comより引用
[8.2 Git のカスタマイズ - Git の属性](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E5%B1%9E%E6%80%A7)

# 事象と解決策
Word文書はファイル形式が一般的なテキストファイルと違い、独自の「docx」となっています。
そのためGit上では画像ファイルなどと同等のバイナリファイルでの比較となり、テキストファイルでの比較とは違い、記述が変わったことはわかりますが文書のどこがどう変わったのかという目視での確認ができません。

そこでMacOSに付属しているテキスト変換ツールの「textutil」を用いて、Gitでの文書比較前に「docx」ファイルを「txt」ファイルに変換した上で比較するように、Gitをカスタマイズします。

## Gitのカスタマイズ
フォルダ構成
```terminal
word/
└── .git/
└── sample.docx
└── .gitattributes(※新規作成)
```
まずはじめにGit管理をしているフォルダ直下（Gitリポジトリのルートディレクトリ）に「.gitattributes」ファイルを作成します。※.（ドット）始まりのファイルです。
※[.gitattributesファイルとは？](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E5%B1%9E%E6%80%A7)

ファイルの中身に下記を記述して保存します。
```text:.gitattributes
*.docx diff=textutil
```

次にGitの設定ファイルであるconfigファイルを編集します。
「.git/config」（.gitフォルダ内のconfigファイルになります。）

:::note info
.（ドット）始まりのフォルダ／ファイルは隠しフォルダ／ファイルと呼ばれ、MacのFinderアプリでは初期状態で可視化されていません。この隠しフォルダを開く場合は、フォルダ上で「Cmd + Shit + .」を同時に押すことで可視化設定をオン／オフすることができます。
:::

```text:.git/config
...
（中略）
...

（以下、追記）

[diff "textutil"]
	textconv = textutil -convert txt -stdout
```

設定は以上となります。



それでは具体的にどう変わるのか、確認してみましょう。
```terminal
$ git diff
index 88839c4..4afcb7c 100644
--- a/chapter1.docx.docx
+++ b/chapter1.docx.docx
@@ -10,7 +10,9 @@ Maecenas mauris lectus,
 ‏       •       Mauris id ex erat.
 ‏       •       Morbi viverra semper lorem nec molestie. 
 ‏       •       Maecenas tincidunt est
-‏Diff Text
+Diff Text
+Vestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut varius sem. 

 ...（以下略）
```
🍺🍺🍺
Contact Form7を導入する際は画像認証を設定しよう

近年、スパム配信や不正ログイン、web改竄といったセキュリティ侵害は大幅に増加しております。

知らぬ間に、攻撃の踏み台にされていたケース等も多くございます。

そこで今回はスパム配信の対策記事となります。

## お問い合わせフォームは悪用できる

一般的なお問い合わせフォームの流れは以下となっております。

1.フォームに情報入力
2.確認ページ
3.管理者へメール通知
4.受付完了メールを入力者に送信

上記の受付完了機能を悪用する事でお問い合わせフォームを踏み台にしたスパム配信を行う事が出来ます。

## スパム配信を行ってしまうと

第三者に悪用されスパム配信を行ってしまうと外部のサーバーに意図せずブロックされるリストがございます。

その他にもドメインの信用にも影響する場合があり、最悪の場合、会社自体の信用低下につながってしまうケースもございます。


## 対策方法
![ps001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/2b1fadae-02a7-2ac1-658d-8e47965745dc.png)

基本的に先程の手順を悪用したスパム配信は機械的に行われてる事が多くございます。

その為、reCAPTCHA等の画像認証を導入する事で対策を行う事が出来ます!!

上記の理由からContact Form7を導入する際は画像認証をご設定する事をお勧めいたします!
【Python】関数(def)

Pythonの`def`は、関数を定義するためのキーワードです。関数は、一連の命令をまとめて再利用可能にするための構造です。ここでは、`def`の基本的な使い方について説明し、サンプルコードも紹介します。
# 基本的な関数定義
まずは簡単な関数の定義方法を見てみましょう。次のコードでは、`greet`という名前の関数を定義し、"Hello, World!" と表示します。
```python
def greet():
    print("Hello, World!")

# 関数の呼び出し
greet()
```
**解説:**
- `def greet():` は関数の定義部分で、`greet`が関数名です。`()`は引数を指定する部分で、今回は何も引数を取らない関数を定義しています。
- 関数の内部のコード（ここでは`print("Hello, World!")`）はインデント（通常スペース4つ）して書きます。
- `greet()` と書いて関数を呼び出すと、`print("Hello, World!")` が実行されます。
# 引数を取る関数
次は、引数を使った関数を見てみましょう。引数を使うと、関数に追加の情報を渡して処理をカスタマイズできます。
```python
def greet(name):
    print(f"Hello, {name}!")

# 関数の呼び出し
greet("Alice")
greet("Bob")
```
**解説:**
- `def greet(name):` では、`name` という引数を取る関数を定義しています
- 関数の内部では、`name` を使って挨拶のメッセージを作り、表示しています
- `greet("Alice")` の呼び出しでは、`"Alice"` が `name` に渡されて、"Hello, Alice!" が表示されます
# 戻り値がある関数
関数は値を返すこともできます。次のコードでは、2つの数を足してその結果を返す関数 `add` を定義しています。
```python
def add(a, b):
    return a + b

# 関数の呼び出しと結果の表示
result = add(3, 5)
print(result)  # 8 と表示される
```
**解説:**
- `def add(a, b):` では、`a` と `b` という2つの引数を取る関数を定義しています
- `return a + b` は `a` と `b` を足した結果を関数の呼び出し元に返します
- `add(3, 5)` は `3` と `5` を足した結果を返し、`result` に `8` を格納します
# デフォルト引数
関数の引数にデフォルト値を設定することもできます。次のコードでは、`greet` 関数にデフォルトの挨拶文を設定しています。
```python
def greet(name="World"):
    print(f"Hello, {name}!")

# 関数の呼び出し
greet()        # "Hello, World!" と表示される
greet("Alice") # "Hello, Alice!" と表示される
```
**解説:**
- `def greet(name="World"):` の `name` はデフォルトで `"World"` という値を持ちます
- `greet()` と引数なしで呼び出すとデフォルト値が使われ、`"Hello, World!"` が表示されます
- `greet("Alice")` のように引数を与えると、その値が使われます
# 可変長引数
関数に可変長の引数を渡すこともできます。これは、引数の数が決まっていない場合に便利です。
```python
def print_numbers(*numbers):
    for number in numbers:
        print(number)

# 関数の呼び出し
print_numbers(1, 2, 3)  # 1, 2, 3 と順に表示される
print_numbers(4, 5)     # 4, 5 と表示される
```
**解説:**
- `*numbers` は可変長引数を意味し、関数は任意の数の引数を受け取ります
- 関数内で `numbers` はタプルとして扱われ、ループで各引数を処理できます
# まとめ
- `def` キーワードで関数を定義する
- 引数を使って、関数にデータを渡せる
- `return` キーワードで関数から値を返せる
- デフォルト引数や可変長引数を使うと、関数の柔軟性が増す

これらの基本を理解すると、複雑なプログラムでも関数を使ってコードを整理しやすくなります。関数は、コードの再利用性を高め、読みやすく保つのに役立つ強力なツールです。
######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)
ネットワーク入門: ネットワークデバイスについて

# 導入
ネットワーク技術は、現代の情報社会において不可欠な要素です。

ネットワークを構成する基本的なデバイスについて学び、ネットワークの理解を深めてもらえたらと思い、記事にしました。
コンピュータから始まり、ルーター、スイッチ、ハブ、アクセスポイント、ファイアウォールといった各デバイスの役割や機能を紹介します。

# コンピュータ:computer:
## コンピュータとは
はじめがコンピュータの話？と疑問が浮かぶかもしれませんが、コンピュータも立派なネットワーク機器になります。

ご存知の通り、コンピュータは、情報を処理し、データを保存し、様々なタスクを実行する電子機器です。
一般的に、デスクトップ、ノートパソコン、タブレット、サーバなどが含まれます。
ネットワーク内で通信するために、各コンピュータにはネットワークインターフェイスが必要です。

## ネットワーク内での役割と機能
ネットワークに接続されたコンピュータは、データの送受信、共有、及びリソースの利用などの役割を担います。これらのコンピュータは、通常、クライアントまたはサーバのいずれかの役割を果たします。

## クライアントとサーバの違い
- クライアント
    - ネットワーク上でサービスを要求するコンピュータです。
    - 例えば、ウェブブラウザを通じてウェブサイトにアクセスする際のPCはクライアントとして機能します。
- サーバ
    - クライアントの要求に応じてサービスを提供するコンピュータです。
    - ウェブサイトをホスティングするウェブサーバや、ファイルを保管するファイルサーバなどが例です。

# ルーター:cyclone:
## ルーターとは
ルーターは、異なるネットワーク間でデータを転送するためのデバイスです。
ルーターは、ネットワーク間の通信を管理し、データの適切な経路を決定する機能を持っています。
家庭用のルーターには後述のWi-Fiの機能を有しているものが多いかと思いますが、その機能がないルーターも存在します。

:::note info
参考
https://network.yamaha.com/products/routers
:::


## 役割
### パケットのルーティングとネットワーク間の接続
ルーターは、ネットワークパケットを目的地に向けて送る際に最適な経路を決定します。
これはルーティングと呼ばれるプロセスで、IPアドレスに基づいて行われます。

ルーターは、ローカルネットワーク（LAN）とインターネットなどの広域ネットワーク（WAN）を接続する役割も果たします。

### NAT（ネットワークアドレス変換）
NAT（Network Address Translation）は、プライベートIPアドレスをパブリックIPアドレスに変換する技術です。
これにより、内部ネットワークのデバイスがインターネットにアクセスできるようになります。

また、NATはセキュリティの一環として、外部からの直接アクセスを防ぐ役割も果たします。

# スイッチ:left_right_arrow:
## スイッチとは
スイッチは、ネットワーク内でデータを送受信するデバイスで、複数のコンピュータを接続する役割を持ちます。スイッチは、ネットワークの各デバイスにユニークな接続を提供し、データフレームを宛先に転送します。
一般的にスイッチというとレイヤ2スイッチ(L2SW)の事を指すことが多いです。
ただ、レイヤ3SWという、ルーターと似た役割のデバイスもあるので、注意です。

## 役割
### データフレームの転送とネットワークのセグメント化
スイッチは、MACアドレス（物理アドレス）を使用して、データフレームをネットワーク内の正しいデバイスに送ります。
スイッチは、データを正確に転送することで、ネットワークのセグメント化（分割）を行い、各セグメントが互いに干渉しないようにします。

### VLAN（仮想LAN）の構成
VLAN（Virtual LAN）は、ネットワークを論理的に分割する技術です。
これにより、同じ物理ネットワーク上で異なるセキュリティレベルやアクセス権を持つ複数の論理ネットワークを構成できます。
VLANは、ネットワーク管理の柔軟性を高め、セキュリティを強化します。

# ハブ
## ハブとは
ハブは、ネットワーク内のデバイスを接続するための単純なデバイスです。
データがハブに到達すると、そのデータをすべてのポートにブロードキャスト（送信）します。

ハブは、受信した信号をネットワーク全体にブロードキャストしますが、これは効率が悪く、ネットワークの帯域幅を無駄にします。
さらに、全てのデバイスが同じネットワークセグメント上にいるため、衝突が発生しやすくなります。

## ハブとスイッチの違い
### ハブ
受信したデータをすべてのポートに送信します。
簡単で安価ですが、効率が低く、ネットワーク負荷が高くなります。
### スイッチ
受信したデータを宛先MACアドレスに基づいて特定のポートに送信します。
効率的で、ネットワークパフォーマンスが向上します。

# アクセスポイント:round_pushpin:
## アクセスポイントとは
アクセスポイント（AP）は、無線LAN（Wi-Fi）ネットワークへの接続ポイントです。
これにより、ワイヤレスデバイスがネットワークに接続できるようになります。

アクセスポイントは、無線デバイス（ノートパソコン、スマートフォンなど）と有線ネットワーク（LAN）を接続します。APは、SSID（Service Set Identifier）と呼ばれる識別子を使用して、無線ネットワークを識別し、接続します。

無線ネットワークは、有線ネットワークに比べてセキュリティリスクが高いため、アクセスポイントのセキュリティ設定は非常に重要です。WPA3（Wi-Fi Protected Access 3）などの暗号化プロトコルを使用し、不正アクセスを防ぐことが推奨されます。

# ファイアウォール:fire:
## ファイアウォールとは
ファイアウォールは、ネットワークのセキュリティを強化するためのデバイスまたはソフトウェアです。ファイアウォールは、ネットワークトラフィックを監視し、不正なアクセスや攻撃を防ぎます。

ファイアウォールは、トラフィックをフィルタリングして、許可されたトラフィックのみがネットワークに入るようにします。これにより、外部からの攻撃や内部からのデータ漏洩を防止できます。

## ハードウェア型とソフトウェア型の違い
### ハードウェア型ファイアウォール
専用のデバイスとしてネットワークに設置され、高速で信頼性の高いセキュリティを提供します。通常、企業ネットワークで使用されます。
### ソフトウェア型ファイアウォール
コンピュータ上のソフトウェアとして動作し、個々のデバイスを保護します。主に個人や小規模オフィスで利用されます。

# 最後に

各デバイスの役割や機能を理解することで、ネットワークの設計やトラブルシューティングに役立つと思います。
この記事が、ネットワークデバイスの理解に役立つことを願っています。
TeXファイル内に直接gnuplotを書く

## はじめに

### 対象読者
- gnuplotを使っているが、毎回`gnuplot`コマンドを使ってコンパイルをするのが面倒くさい人

### 最終目標
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770944/7e7d20df-c497-eb48-4ef7-486e504cc747.png)

## (1) gnuplotのインストールを確認
次をターミナルで実行します
```shell:terminal
gnuplot --version
```
> VSCodeの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770944/d4390774-485e-313f-ea2e-2b48842b26e1.png)

`gnuplot x.x patchlevel x`ならOK。gnuplotがインストールがされています。次へ進んでください
<details><summary>違う場合</summary>

- `bash: gnuplot: command not found`
- `'gnuplot'は、内部コマンドまたは(ry`

のようなときは、gnuplotがインストールされていません。
Google先生にインストール方法を尋ねてください。
</details>

## (2) gnuplot-lua-tikzの用意

必要なファイルを生成します。ターミナル上で、使いたい.texファイルがあるディレクトリまで移動します。
その上、次を実行してください

```shell:terminal
gnuplot -e 'set term tikz createstyle'
```

次の4つファイルが生成されます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770944/0ede6dc1-ebab-07fd-fcca-9bc0903a15a8.png">

これで準備完了です。
（*.styの2つ以外は必要ないので消しても構いません）

## (3) 使用してみる

サンプルコードを用意したのでコピペして試してみてください。

```tex:main.tex
\documentclass[uplatex,dvipdfmx,a4paper]{jsarticle}

% 追加を忘れずに
\usepackage{gnuplottex,gnuplot-lua-tikz}

\begin{document}

\begin{figure}[h]
  \centering
  \begin{gnuplot}[terminal=tikz]
    a = 0.1
    plot sin(x) * exp(a * x), exp(a * x), -exp(a * x)
  \end{gnuplot}
  \caption{減衰曲線のグラフ} \label{fig:sample}
\end{figure}

\end{document}
```
グラフが出力されたら成功です
texファイルの場所が変わるたびに(2)を行う必要があります。これが面倒な場合は番外編に進んでください。

## (番外編) (2)を飛ばす

楽を得るにはそれなりの努力が必要ということで多少難易度は上がります。

```tex:main.tex
\usepackage{gnuplot-lua-tikz}
```
この部分で、(2)で生成された4つのファイルの読み込んでいるわけです。（生成されたファイル名と一致していますね）
つまり、(2)で生成されたファイル群を、どのtexファイルからもアクセスできる場所に持っていけば良いです。

```shell:terminal
kpsewhich -var-value=TEXMFLOCAL
```
でパスが得られます。ターミナル上で`得られたパス/tex/latex`に移動してください。
そこで`gnuplot`ディレクトリを作成して、その中に移動してください。つまり今は`得られたパス/tex/latex/gnuplot`にいますね。
ここで、(2)のコマンド↓を実行します。大抵の場合権限が必要です。`sudo`などをつけて対処します。
```shell:terminal
sudo gnuplot -e 'set term tikz createstyle'
```
同じように4つファイルができたと思います。加えて、次のコマンドを実行して、新しく生成されたファイルを登録するという処理をします。
```shell:terminal
sudo mktexlsr
```
これで、(2)を毎回行わなくても良くなりました
Salesforce DataCloud練習問題について解説してみた

こんにちは
本橋孝昭です

Data Cloudコンサルタントは公式練習問題があるのはご存じでしょうか

今回はこちらの公式練習問題の解説を行います

Knowledge Check: Data Cloud Overview
知識チェック: データクラウドの概要

https://rise.articulate.com/share/fK5l29AYS7GZ9btZMnZd7Iyp6ipjbo1O#/


## 問題１
![００１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d8e2453d-4c54-0994-befe-e6eee3301e23.png)


## 問題1 解説

こちらのTableauの記事内に以下の記述を見つけました


>Let’s get into the nuts and bolts. Think of Tableau as your data visualization and business intelligence layer on top of Data Cloud—allowing you to see, understand, and act on your live customer data.
These features cover functionality for enterprise customer data in five key categories: Connect, Harmonize, Unify, Analyze and Predict, and Act.These features cover functionality for enterprise customer data in five key categories: Connect, Harmonize, Unify, Analyze and Predict, and Act.

Google翻訳では下記となります

>では早速本題に入りましょう。 Tableau を Data Cloud 上のデータ視覚化およびビジネス インテリジェンス層と考えてください。これにより、顧客のライブ データを確認し、理解し、それに基づいて行動できるようになります。
これらの機能は、接続、調和、統合、分析と予測、および対処という 5 つの主要なカテゴリにおける企業顧客データの機能をカバーしています。


## 問題2

![００２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ba6c59e2-00eb-b003-a985-c9da133d909a.png)

同意についてはこちらのヘルプをご確認ください

>Data Cloud での同意管理について説明します。
データ保護とプライバシーの多くの規制では、あなたとあなたの会社が連絡方法と個人データの使用方法に関するコンシューマーの要求を尊重することが求められます。Data Cloud には、コンシューマーの同意設定を取り込んで保存するための複数の方法が用意されています。

https://help.salesforce.com/s/articleView?id=sf.c360_a_consent_management.htm&type=5

## 問題3

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e27c7d2b-6960-26e3-8780-ecfb22ad1489.png)


解説
Data Cloudはほぼリアルタイムでのデータ更新が可能です
https://help.salesforce.com/s/articleView?id=release-notes.cdp_rn_2023_summer_streaming_data_transforms.htm&release=244&type=5



![Data004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9caa29f3-b7dd-c82a-017f-056153f154de.png)




Data Cloud の Customer 360 データモデルはこちら
https://trailhead.salesforce.com/ja/content/learn/modules/customer-360-data-model-for-customer-data-platform

Data CloudはSalesforce 製品のため他Salesforce製品に簡単に結合可能です



![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/87e937c9-7e66-b8be-5d2d-e384f8b956c6.png)



こちらのヘルプの内容か

https://help.salesforce.com/s/articleView?id=sf.c360_a_data_ingestion.htm&type=5

専用のコネクタを使用して、Amazon S3、Marketing Cloud、Google ストレージなどのデータソースを Data Cloud に接続できます。データのインポート元であるデータソースコネクタを選択し、取り込むオブジェクトまたはデータセットを指定します。Data Cloud によってデータのサンプルが取得され、確認用の推奨ソーススキーマが提供されます。



![００６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e498cb87-8bfb-098c-5acc-3d419ada4c76.png)


![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6665d1df-0146-f35d-1cf9-40e4a51a9c93.png)

![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/86ade343-c53d-77d7-dc6f-1272111c64d2.png)

![００９.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8edd0fb3-8816-5fd6-ec21-f8b7605e487e.png)
vi エディタで楽に最下部に移動する方法

今回はviエディタで楽に最下部に移動する方法をご紹介します。

## まえおき

viエディタでは多くの操作やカーソル移動方法がございます。

その為、操作を覚えるのが苦手といった方もいるのではないでしょうか？

今回は「楽」を重視した移動方法をご紹介いたします。

## 移動方法

ファイル最下部に楽に移動するには下記の様に実行します。

```
:999
```

上記は999行目に移動するコマンドです。

対象のファイルが999行以下だった場合は最下部に移動する事ができます。

ただしログファイル等の行数が非常に多いファイルは上記指定では最下部まで移動する事が出来ません。

そこで同様の原理でより大きい数字をし対応します。

下記例となります。

```
:9999
```
多対多のマイグレーションファイルの用意

# 概要
- ちょっとハマった


# 内容

こんな感じの要件を満たすためにマイグレーションファイルを用意した

- 既存モデルA
- 追加モデルB
- AとBの中間テーブル


```ruby
class CreateModelB < ActiveRecord::Migration[6.0]
  def change
    create_table :model_b, id: :bigint, unsigned: true do |t|
      t.integer :xxx, null: false, default: 0
      t.integer :yyy, null: false, default: 0

      t.timestamps
    end
  end
end
```

```ruby
class CreateModelAModelB < ActiveRecord::Migration[6.0]
  def change
    create_table :model_a_model_b, id: :bigint, unsigned: true  do |t|
      t.bigint :model_a_id, null: false, unsigned: true
      t.bigint :model_b_id, null: false, unsigned: true

      t.timestamps
    end

    add_foreign_key :model_a_model_b, :model_a, column: :model_a_id
    add_index :model_a_model_b, :model_a_id

    add_foreign_key :model_a_model_b, :model_b, column: :model_b_id
    add_index :model_a_model_b, :model_b_id
  end
end
```

マイグレーションファイルを用意したらあとは実行するのみ

```bash
$ rails db:migrate
```

# ハマった話

ModelBのマイグレーションファイルが処理されているときに、テーブルがないよ。的なエラーでて中断されるので、なぜ？？？ってなっていたが、そりゃそうだなってことに気づく

最初はModelBでも外部キーを用意してたが、そもそも関連付けるテーブルはまだ存在しないので、そりゃそうだってなった

```ruby
class CreateModelB < ActiveRecord::Migration[6.0]
  def change
    create_table :model_b, id: :bigint, unsigned: true do |t|
      t.bigint :model_a_model_b_id, null: false, unsigned: true # この辺と
      t.integer :xxx, null: false, default: 0
      t.integer :yyy, null: false, default: 0

      t.timestamps
    end

    # こいつら
    add_foreign_key :model_b, :model_a_model_b, column: :model_a_model_b_id
    add_index :model_b, :model_a_model_b_id    
  end
end
```

* 先にテーブルを用意
* 中間テーブルで外部キー関連の定義を行う

これで良し


# 参考にした記事（感謝）

https://qiita.com/Kohei_Kishimoto0214/items/cb9a3d3da57708fb52c9
.gitignoreファイル生成ツール

便利

### gitignore.io
https://www.toptal.com/developers/gitignore/

![スクリーンショット 2024-06-17 21.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67859/a236391b-7b70-992f-88c4-fd0fb254bb8f.png)


### Terraform
```
# Created by https://www.toptal.com/developers/gitignore/api/terraform
# Edit at https://www.toptal.com/developers/gitignore?templates=terraform

### Terraform ###
# Local .terraform directories
**/.terraform/*

# .tfstate files
*.tfstate
*.tfstate.*

# Crash log files
crash.log
crash.*.log

# Exclude all .tfvars files, which are likely to contain sensitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
*.tfvars
*.tfvars.json

# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json

# Include override files you do wish to add to version control using negated pattern
# !example_override.tf

# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
# example: *tfplan*

# Ignore CLI configuration files
.terraformrc
terraform.rc

# End of https://www.toptal.com/developers/gitignore/api/terraform
```
Salesforceで行動以外もカレンダーで表示させよう

本橋孝昭です

Salesforceの行動はカレンダーで表示させることができる　というのは有名な話ですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/711d7adc-1862-5a73-5f07-a64b4433b540.png)

さて、今回は行動以外にも標準オブジェクトやカスタムオブジェクトでカレンダー画面に表示させる方法をご紹介します


## 設定1  まずはカレンダーを作成しよう

まずはカレンダーを作成します。
右側の歯車マークから「新しいカレンダー」をクリックしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/08b16d14-caf6-2852-1563-9ef4db60d00a.png)


そうすればオブジェクトを表示できる画面になるのでカレンダーとして表示させたいオブジェクトを選択しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8a64067a-cbe5-b7d1-110b-eb3c41f4a34f.png)


今回は分かりやすくカスタムオブジェクト「test01」というオブジェクトを例に説明します

なお、test01オブジェクトは下記のようにStartとEndの日付項目を持っています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6048adc7-aeb1-b18e-0901-dde7633f752f.png)

カレンダーでオブジェクトtest01を選択し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6771465a-9460-95b0-d999-2c7d1bfa0cca.png)


開始日と終了日項目　表示する項目名を設定しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/064791f4-d359-4138-e53e-25381fbf5e4e.png)


以上で設定は完了です
カスタムオブジェクトのレコードでも開始と終了日付でカレンダー表示がされます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/55618178-a39d-090e-4d2f-25deefc581b9.png)

# 応用編　特定のレコードのみカレンダーに表示させたい

次に、オブジェクトの中でさらに特定のレコードだけカレンダー表示させる方法を説明します

今回は例としてtest01オブジェクトにはTypeという選択リストがあり、これのTypeがAのもののみカレンダーに表示　という設定を行います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f9455cd3-288d-8661-2eb5-0eaf9db54689.png)

## 設定1 test01オブジェクトにリストビュー作成

test01オブジェクトにはTypeという選択リストがあり、これのTypeがAのもののみ表示させるリストビューを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3fd3790b-e55c-5aa8-fb6b-61196f36aa15.png)


## ステップ2 カレンダーを編集しリストビューを絞り込み

以下の手順でカレンダーを編集しリストビューで絞り込みます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ad617721-9421-5420-42dc-c347fd116b1f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8bf17b37-9e8b-a76b-c67b-07bceb3b79e1.png)

こうすればリストビューと同じTypeがAのレコードのみカレンダー表示が可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/288d5fad-d0ce-5874-cb19-8697b7d8c7ac.png)
自宅にsnapでnextcloudを建てた

# nextcloudって何？
nextcloudはファイル共有OSSプラットフォームです。
OSSのファイル共有システムなので社外秘のファイルなどを安心して保存することができます。
また、特定のファイルだけをメンバーではない人に共有することができわざわざ招待をしないといけないという問題が解決されます。

# nextcloud建ててみた
nextcloudを入れる方法はいくつかありますが、個人的に一番楽に入れることができるのはsnapでのインストールだと感じています。
## 環境
snap    2.63
snapd   2.63
series  16
ubuntu  22.04
kernel  5.15.0-1055-raspi

## 注意
{}の中には自分用で適当に入力してください。
ドメインの取得についてはこの記事では触れないので、事前に取得しておいてください。

## インストール方法
```
sudo snap install nextcloud
```
以上です。簡単でしたね。

## 初期設定
今回はユーザー追加とhttps通信を行います。

この動作は必要なのか？？？
一応やっておきましょう。
```
snap changes nextcloud

snap info nextcloud

snap connections nextcloud
```


### ユーザー追加
nextcloud起動時の初期アカウントをコマンドで作ります。
```
sudo nextcloud.manual-install [your_name] [your_password]
```
以下のように出力されれば完了です。
```
Output
Nextcloud was successfully installed
```

### ドメインの設定
以下のコマンドで現在のドメインを確認できます。
```
sudo nextcloud.occ config:system:get trusted_domains
```
おそらく以下のようにlocalhostだけになっていると思われます。
```
Output
localhost
```
まずは自分のドメインを登録しましょう。
```
sudo nextcloud.occ config:system:set trusted_domains 1 --value={your_domain}
```
先程のように以下のコマンドを打つと保存されていることが確認できます。
```
sudo nextcloud.occ config:system:get trusted_domains

Output
localhost
{your_domain}
```
### DNSの設定
なんと今回のセッティングをする家のルーターはIPv6を採用しており、使用可能なポート番号が決められています。
そのためLet's encriptを使用すると80と443関連のポート番号でエラーが発生します。

ゆえに今回はlet's encriptをDNSチャレンジで実行します。

以下のコマンドでTXTレコードを生成します。
最後にEnterを押してと警告が出ますが、DNSサーバーの設定を行ってから実行してください。
```
certbot certonly --manual -d {your_domain} --preferred-challenges dns
```
実行した際の中心にVALUEが出ているはずなのでコピーをしておいてください。
DNSサーバーで以下のように記入

|ホスト名    |TYPE          |VALUE |
|:-----------|------------:|:------------:|
| _acme-challenge.{your_domain}       | TXT        | {your_VALUE}         |

更新されるまで数分ほどかかるので焦らずに待ちましょう。
エンターを押すと正しく設定されるはずです。

### ポート開放
Nextcloudではデフォルトで80番と443番が開いているので変更していきます。
以下のコマンドでポートを変更することができます。
```
sudo snap set nextcloud ports.http={your_http_port}

sudo snap set nextcloud ports.https={your_https_port}
```
Firewallの設定をします。
```
sudo ufw allow {your_ports}
```

### 証明書の作成
DNS-01チャレンジで取得した証明書を手動で設定します。
/etc/letsencrypt/archive/{your_domain}/ の中に入っている3つの証明書を以下のディレクトリにコピーします。
/var/snap/nextcloud/current/certs/custom
certsの中にcustomというファイルが無いので自分で作成してください。

```shell
mkdir -m 777 /var/snap/nextcloud/current/certs/custom

sudo cp /etc/letsencrypt/archive/{your_domain}/{your_keys} /var/snap/nextcloud/current/certs/custom
```

自己証明を有効にします。
```shell
sudo snap run nextcloud.enable-https custom -s cert.pem private.pem chain.pem
```

これで接続をするとhttps通信になっていると思います。

終了です。お疲れ様でした。

# 参考記事

https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-nextcloud-on-ubuntu-20-04-ja

https://massie0414.com/index.php/letsencrypt/4308/

https://help.nextcloud.com/t/change-nextcloud-snap-port/162572

https://qiita.com/murachi1208/items/1b59c537197dca7c7b1b
【Credly】SAP認定試験の合格証明書・バッジのダウンロード方法

# 概要
受託開発企業で働くfussasyといいます。普段は、SAP BTP（PaaS）上でSAP Fioriアプリケーション開発をしています。SAP導入プロジェクトへ関わるようになると、多くの場合はSAP認定試験を受験することが多いかと思います。SAP認定試験に合格後Credlyへの登録を案内されるのですが、合格証やバッジをダウンロードする方法が分からないと質問されたことから、確かにやや分かりづらいと感じたので手順を解説しようと思います。

※Credlyとは、デジタルバッジと呼ばれる認定資格を発行し、管理するプラットフォームです。デジタルバッジは、特定のスキルや能力を持っていることを証明するもので、オンラインで共有することができます。Credlyでは、企業や教育機関が自分たちの認定資格を作成し、それを取得した人々に発行することができます。

https://www.credly.com/earner/dashboard

# SAP認定試験の受験方法
SAP認定試験については、以下の記事で解説しています。

https://qiita.com/fusassy/items/d56ee48a2771bebf06ee

# SAP認定資格の合格証・バッジのダウンロード
①Credlyにログインして「Badge」画面を開きます。証明書をダウンロードしたい認定資格の画面へ移ります。
![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/860b5750-f64c-d56f-381b-4e1c7b16539c.png)

②認定資格の画面へ移ったら、「Share」ボタンを押下します。
![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/31618fdc-6baa-9d34-5320-0dcbd04fc0c5.png)

③合格証をダウンロードしたい場合、Share画面で「Download Certificate」を押下します。（④へ）また、バッジイメージをダウンロードしたい場合、「Download Badge Image」を押下します。（⑤へ）
![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/5e2ef0ff-7889-4c85-af4b-f77b8a453dba.png)

④「Download PDF」から合格証をダウンロードできます。
![image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/9290c820-84d2-30f5-188c-fd960fc48bc9.png)
![image (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/b8381fa0-2ca8-5489-54f3-67a00c5d3810.png)

⑤「Download Images」から合格証をダウンロードできます。
![image (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/f50bb921-bd70-d7c5-f7a7-4eaf558ce914.png)
![image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/e3b8a353-c1e2-1679-851f-023c5f355519.png)

# おわりに
以上となります。SAP認定試験はAWS認定試験と異なり、SAPのサイト上ではなくCredlyからダウンロードします。簡単なので一度、ダウンロード場所さえ把握してしまえば、以降は困ることが無いかなと思います。本記事がお役に立てれば嬉しい限りです。
コンテナのgo-cve-dictionaryでserverモード

毎回コンパイルしていたけどコンテナ化してシンプルにする

- 同じネットワークにredisを置く
- ホスト側ネットワークからアクセスたときにうまく動くように 0.0.0.0 でbind

```
docker network create go-cve-network
docker run -d --name redis-container --network go-cve-network redis:latest
docker run -it --rm --network go-cve-network vuls/go-cve-dictionary:latest fetch nvd --dbtype redis --dbpath redis://redis-container:6379/0
docker run -d --name cve-dictionary -p 1323:1323 --network go-cve-network vuls/go-cve-dictionary:latest server --bind 0.0.0.0 --dbtype redis --dbpath redis://redis-container:6379/0
```
VS Codeの効率化チップス4選 時間節約

# VS Codeの効率化チップス4選

こんにちは！今回は、日々のコーディング作業をもっと効率的にするためのVisual Studio Code（VS Code）の便利なチップスを4つご紹介します。興味のある操作があったら、紹介している動画の操作をチェックしてみてください。

## デモ動画の紹介

https://learn.microsoft.com/ja-jp/shows/visual-studio-code/serious-time-savers

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/34d53938-8422-1670-59b7-c6e126986c1e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e4469fa8-91e2-74fb-6f55-15f4aa19190b.png)

## 1. Word Wrap Code（テキストの折り返し）

### 概要
長い行のコードを画面幅に合わせて自動的に折り返す機能です。

### ショートカット
- `Alt + Z`

### メリット
- 横スクロールの手間が省け、コードの可読性が向上します。

### 使用例
```javascript
// 折り返しなし
const longString = "この文章は非常に長く、画面の幅を超えるため横スクロールが必要です。";

// 折り返しあり（Alt + Zを適用）
const longString = "この文章は非常に長く、
画面の幅を超えるため横スクロールが必要です。";
```

## 2. Joining Lines Hack（行の結合）

### 概要
複数行のテキストを一つの行に結合する機能です。

### コマンド
- `Ctrl + Shift + P` → `Join Lines`

### メリット
- テキストの整理やフォーマットの統一に便利です。

### 使用例
```plaintext
// Before
These,
lines,
I wish
they were joined together!!

// After (Ctrl + Shift + P → Join Lines)
These, lines, I wish they were joined together!!
```

## 3. Auto Save - More Than One Way（自動保存設定）

### 概要
変更を自動的に保存する設定です。設定により、保存のタイミングをカスタマイズできます。

### 設定方法
- `Files: Auto Save`

### オプション
- `afterDelay`, `onWindowChange`, `onFocusChange`, `off`

### メリット
- 作業中の変更が失われることを防ぎます。

### 使用例
```plaintext
// afterDelay: 一定時間後に自動保存
// onWindowChange: ウィンドウが変更されたときに自動保存
// onFocusChange: フォーカスが変更されたときに自動保存
```

## 4. Ctrl + Shift + K: 行の削除

### 概要
選択中の行を素早く削除するショートカットです。

### ショートカット
- `Ctrl + Shift + K`

### メリット
- 不要な行を効率的に削除できます。

### 使用例
```plaintext
// Before
line 1
line 2 (to be deleted)
line 3

// After (Ctrl + Shift + K applied)
line 1
line 3
```

---

これらのチップスを活用することで、VS Codeの操作がより効率的になるでしょう。ぜひ試してみて、あなたのコーディング体験を向上させてください！
Apple Vision Pro（visionOS2）のAR Quick Look 新機能 

## Apple Vision Pro の visionOS 2 で提供される機能
2024年秋頃に正式にリリースされる [visionOS 2](https://developer.apple.com/documentation/visionos-release-notes/visionos-2-release-notes ) は現在、ベータ版)としてリリースされています。今回、AR Quick Lookで新たに追加された機能について紹介します。

## PreviewApplication API（プレビューアプリケーション API）

https://twitter.com/tokufxug/status/1802506447596757004

PreviewApplication APIは、アプリがQuick Lookをコントロールできることを目標に構築された新しいAPIです。詳細情報について以下の記事をごらんください。

https://1planet.co.jp/tech-blog/applevisionpro-oneplanet-visionos2-quicklook

## Surface Mapping（サーフェスマッピング）
![Surface Mapping（サーフェスマッピング）](https://storage.googleapis.com/studio-cms-assets/projects/Kwa5KvdJOX/s-1742x1150_v-fms_webp_3fb3ed10-f979-46ff-8267-c71a717fa70a.webp "Surface Mapping（サーフェスマッピング）")

床やテーブルなどの平面を自動検出して3Dモデルを配置する機能になります。
## Configuration （コンフィグレーション）
![Configuration （コンフィグレーション）](https://storage.googleapis.com/studio-cms-assets/projects/Kwa5KvdJOX/s-1762x1218_v-fms_webp_c3fa45c6-f457-48ee-89b2-3b7f9d8b5027.webp "Configuration （コンフィグレーション）")

1つの3Dモデルに複数バリエーションを搭載して変更することが可能になりました。Surface Mapping（サーフェスマッピング）とConfiguration （コンフィグレーション）の詳細情報について以下の記事をごらんください。

https://1planet.co.jp/tech-blog/applevisionpro-oneplanet-visionos2-ar-quick-look
アプリ紹介(2023-10) ~初めてのmobile

# 目的
apple developerの有効期限が切れたため、紹介程度に記載。
# 技術stack
- ReactNatife(firebase)
- firebase(storage ,firestore,authication)
![](https://storage.googleapis.com/zenn-user-upload/57581fb3f90d-20240617.png)
# github
https://github.com/nagisa599/menmenMobileApp

https://github.com/nagisa599/MenMenWebApp
# 内容
##  ログイン,新規登録
#### apple,google,メールアドレスの
<img src="https://storage.googleapis.com/zenn-user-upload/c116900d026c-20240617.png" width=50%>




## ユーザ登録
<img src="https://storage.googleapis.com/zenn-user-upload/42a5c02fd093-20240617.png" width=50%>


## その他画面
#### スタンプカード機能(QRをカメラで読み込むとスタンプがつく)
<img src="https://storage.googleapis.com/zenn-user-upload/1c5bb8f509e4-20240617.png" width=50%>


<img src="https://storage.googleapis.com/zenn-user-upload/d9870eae19a2-20240617.png" width=50%>

<img src="https://storage.googleapis.com/zenn-user-upload/58cf4eade921-20240617.png" width=50%>

## 管理者画面
![スクリーンショット 2024-06-17 20.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3751344/f2056b81-5564-0d4f-23e1-fce70d0fdd94.png)
![スクリーンショット 2024-06-17 20.17.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3751344/f67442ae-fe9b-8816-7f41-1d35602573f0.png)
![スクリーンショット 2024-06-17 20.18.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3751344/412a3571-3be0-6e8c-e033-414f2237264d.png)
【Python】反復文(for文)

for文は、シーケンス(文字列、リスト、タプルなど)やその他のイテラブルオブジェクトの要素を1つずつ反復処理するのに使われます。
# シンプルなfor文
```python
fruits = ['apple', 'banana', 'orange']
for fruit in fruits:
    print(fruit)
```
このコードでは、fruitsリストの各要素が順番にfruit変数に代入され、print(fruit)が実行されます。結果は以下のようになります。
```console
apple
banana
orange
```
# range()を使ったfor文
range()関数を使うと、数値のシーケンスを生成できます。
```python
for i in range(5):
    print(i)
```
上記のコードでは、0から4までの数値が順に出力されます。
```console
0
1
2
3
4
```
Pythonの`for`文は、シーケンス（リスト、タプル、文字列など）の各要素に対して繰り返し処理を行うために使用されます。シンプルな構文で使いやすいので、プログラミング初心者にも理解しやすいでしょう。
# `for`文の基本構文
```python
for 変数 in シーケンス:
    実行するコード
```
`for`文は、シーケンスの各要素を順番に取り出し、変数に代入して、実行するコードを繰り返し実行します。
# 1. リストの要素を1つずつ表示
```python
fruits = ["apple", "banana", "cherry"]

for fruit in fruits:
    print(fruit)
```
**出力:**
```
apple
banana
cherry
```
# 2. 数値の範囲を繰り返す
`range()`関数を使って、指定した範囲の数値を繰り返します。
```python
for i in range(5):
    print(i)
```
**出力:**
```
0
1
2
3
4
```
# 3. 文字列の各文字を表示
```python
text = "hello"

for char in text:
    print(char)
```
**出力:**
```
h
e
l
l
o
```
# 4. リストの各要素に対して計算を行う
```python
numbers = [1, 2, 3, 4, 5]
squares = []

for number in numbers:
    squares.append(number ** 2)

print(squares)
```
**出力:**
```
[1, 4, 9, 16, 25]
```
# 5. `for`文と`if`文の組み合わせ
```python
numbers = [10, 21, 30, 41, 50]

for number in numbers:
    if number % 2 == 0:
        print(f"{number} is even")
    else:
        print(f"{number} is odd")
```
**出力:**
```
10 is even
21 is odd
30 is even
41 is odd
50 is even
```
# 6. 入れ子の`for`文
```python
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

for row in matrix:
    for item in row:
        print(item, end=" ")
    print()
```
**出力:**
```
1 2 3 
4 5 6 
7 8 9 
```
# 7. `enumerate()`でインデックスと要素を取得
```python
colors = ["red", "green", "blue"]

for index, color in enumerate(colors):
    print(f"{index}: {color}")
```
**出力:**
```
0: red
1: green
2: blue
```
# 8. `zip()`で複数のリストを同時に繰り返す
```python
names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]

for name, score in zip(names, scores):
    print(f"{name}: {score}")
```
**出力:**
```
Alice: 85
Bob: 92
Charlie: 78
```
# `for`文の基本的な使い方
以下のコードを実行して、`for`文がどのように動作するかを確認してください：
```python
names = ["Tom", "Jerry", "Spike"]

for name in names:
    print(f"Hello, {name}!")
```
このコードはリスト`names`の各要素を順番に取り出し、「Hello, 名前!」というメッセージを出力します。

`for`文を使うことで、リストや他のシーケンスの各要素に対して効率的に処理を行うことができます。基本を理解したら、さらに複雑な処理や他の構造とも組み合わせて使ってみてください。
######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)
【SwiftData】ModelContainerクラスの公式ドキュメントを読む

# ModelContainerクラス

アプリのスキーマとモデルストレージの構成を管理するオブジェクト

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。
> また、Swiftプログラミングを基礎から動画で学びたい方には、Udemyコース「[今日からはじめるプログラミング](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwii1qTuj_2BAxV4hlYBHbj5BqEQFnoECBYQAQ&url=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fstart-programming-today%2F&usg=AOvVaw2vs4Sccq-bpfA4ZD2rCyNm&opi=89978449)」をお勧めします。

## 概要

モデルコンテナは、モデルコンテキストとアプリの永続ストレージを仲介します。
モデルコンテナはストレージを総合的に管理し、一貫性と使用可能な状態の維持を保証します。
フェッチを実行するか、モデルコンテキストの`save()` メソッドを呼び出すたびに、モデルコンテナはスキーマに基づいて、実際にデータの読み取りや書き込みを実行します。
これによって、フェッチや保存が効率的に調整された方法でのみ行われて、アプリのリソースが保護されることを保証します。
さらに、アプリがCloudKitに対応している場合は、モデルコンテナがデバイス間の永続ストレージを自動的に同期します。

アプリスキーマの発展とともに、コンテナは永続モデルデータを自動的に移行してモデルクラスと一致させ続けます。
異なるスキーマのバージョン間の集約変更が自動移行の機能を超える場合は、コンテナに`SchemaMigrationPlan`を提供して移行に参加し、正常に完了できるようにします。

For example, you may want use a particular app group container or specify that the storage is ephemeral and should exist only in memory.
デフォルトでは、モデルコンテナは「アプリの永続ストレージをどのように設定するか」について、仮説を立てます。
この前提動作をカスタマイズするには、コンテナに`ModelConfiguration`インスタンスを提供します。
例えば、アプリのグループコンテナを使用したり、ストレージを一時的にしたり、データの存在をメモリ上に制限したりすることを指定できます。

Additionally, the view modifier makes an associated model context available in the SwiftUI environment, which the `Query()` macro depends on.
SwiftDataを使用するアプリには、少なくとも1つのモデルコンテナが必要です。
クラスのイニシャライザまたは対応するSwiftUIビューモディファイアを使用して、コンテナを作成します。
ビューモディファイアを使用すると、適用したウィンドウグループ内の全ウィンドウ、または適用したビュー階層に属する全ビューが共通のモデルコンテナにアクセスできます。
さらに、ビューモディファイアは、`@Query`マクロが適用されたSwiftUIビュー環境でモデルコンテキストを利用できるようにします。

```swift:レシピのSwiftDataモデルを利用する例
@main
struct RecipesApp: App {
    var body: some Scene {
        WindowGroup {
            RecipesList()
        }
        .modelContainer(for: Recipe.self)
    }
}

// レシピのリスト
struct RecipesList: View {
    @Query private var recipes: [Recipe]
    
    var body: some View {
        List(recipes) { RecipeRowView($0) }
    }
} 
```

## 参考

Apple Developer Documentation
- [ModelContainer](https://developer.apple.com/documentation/swiftdata/modelcontainer) 
- [Syncing model data across a person’s devices](https://developer.apple.com/documentation/swiftdata/syncing-model-data-across-a-persons-devices)
評価される人になる技術 

https://www.amazon.co.jp/%E8%A9%95%E4%BE%A1%E3%81%95%E3%82%8C%E3%82%8B%E4%BA%BA%E3%81%AB%E3%81%AA%E3%82%8B%E6%8A%80%E8%A1%93-%E5%B2%A1%E7%94%B0%E6%B4%8B%E4%BB%8B/dp/4827214069

# 本書を手に取った背景
そこそこコミュニケーション能力もあるし、会話もできるし、プレゼンや提案とかもできると思っている。作業とかもそこそこできるのだが、毎回、上司から評価されてないように感じていました。
感じてはいたものの何が悪かったのか、何を改善したらいいのかが検討つかなかったので、本書から学ぼうと思いました。

# 結論
手にとって良かった。☆５つけたい。

# 本書のテーマ
あなた自身が上司の期待にどう答えるかのコツを伝え、自分自身の期待の持ち方も伝える。

# 個人的なポイント
### ①　上司の期待と自分が力を入れることを一致させる
上司がやってほしいと思っていることをやってないと評価ができない。
なので、部下が力を入れてるところと上司が評価するところを一致させないといけない。
大事なのこの状態を自ら作り出すということ。


### ②　上司に贔屓にされる存在になる
上司の嫌なところをリストアップする
↓
リストアップした行動にポジティブな意味付けをする
↓
肯定的な言葉を上司に伝える

これは上司を理解する姿勢を見せれる

### ③　上司を育てる
上司を褒めることもする。上司も褒めて育てる。

１つ目は本人比較で褒める
２つ目は結果だけでなくプロセスも褒める

褒めるだけでなく、たまには図々しさも発揮して上司にお願いをしてみたりする。

### ④　上司をいじってみる
相手を観察
↓
観察して気付いた点を言葉にする。軽くさらっと口に出す。
↓
いじるときには愛所表現を付け加える

上司もこういう関係を築ければ相談とかを受けやすくなる。

### ⑤　アピールを履き違えない
自分のことを一方的に伝えることではなく、相手の期待や要望とすり合わせていく。

自分のやったことを「アピールするほどでもない」と思ってしまいがちだが、結果だけでなくプロセスを聞きたい上司もいる。

### ⑥評価面談でのアピール　
失敗を伝えると評価が下がると思いがちだが、失敗だけを捉えて評価が下がることはあまりない。
失敗を隠さず、そこから何を学んでどう挽回したかをはなすと逆に評価があがる。
前向きに考える姿勢が評価される。

### ⑦　自分軸をもつ
これがあればどんな評価をされてもずれなくなる。

# 今後やれること
・自分評価軸をもつ
・上司の分析をする
・目標づくりの段階でしっかりと上司とすり合わせる

# まとめ
こうして評価される人のやっているであろうことを見てみると、自分はまったくこういったことをできず、数字や行動だけで示そうとした結果、評価を得られてなかったのではないかと思った。

得られた知識を自分の強みとうまく組み合わせて、評価される人間になりたいと思った。