OmniAICreator/Qiita-1.07M huggingface dataset:
スレッドセーフについて

# スレッドセーフとは
マルチスレッド環境で、ライブラリやプログラム、クラスなどが複数のスレッドから同時に利用されても正常に動作すること
マルチスレッド環境では、一つのデータや手続きを同時に複数のスレッドが利用することがある
一方のスレッドがあるデータを操作したことで他のスレッドが利用するデータを破壊することがある
こうした環境を想定して正常に動作するよう設計されていることをスレッドセーフであるという
# スレッドセーフの条件
- 静的またはグローバルな変数を、参照、操作してない
- グローバルな制限のあるリソース（ファイル、プロセスなど）を確保・解放していない
- 関数外で確保したメモリを、参照、操作してない
- スレッドセーフが保証されてない関数を呼んでいない
# スレッドセーフのレベル
この関数はスレッドセーフである」といっても人それぞれとらえ方が違います。
「スレッドセーフとはこうである」という正式な文章がないため
「Effective Java」では「スレッドセーフ」の齟齬をなくすためスレッドセーフにレベルを持たせています。
|レベル|説明|
|---|---|
|不変(immutable) | 値は状態を持たないので本質的にスレッドセーフ|
|無条件スレッドセーフ(unconditionally thread-safe) | 値は状態を持つが、どのように使用されてもスレッドセーフ|
|条件付きスレッドセーフ(conditionally thread-safe) | 値は状態を持ち、一部スレッドセーフであるが、スレッドセーフでない部分も存在する|
|スレッドセーフでない(not thread-safe) | 複数のスレッドからアクセスされることを想定していない|
|スレッド敵対(thread-hostile) | 全てのメソッドを同期的に使用してもスレッドセーフにならない ようはバグってる|
# スレッドセーフにするには
## リエントラント関数にする
ある関数を複数同時に実行した際、割り込まれたとしても、すべてのスレッドで結果が変わらない関数
また共通のメモリ(グローバル変数など)を破壊しないことが証明された関数
静的な変数、グローバル変数を保持しない関数
### ダメな例(リエントラントではない) 
```c++
int g_var = 1;
 
int f()
{
 g_var = g_var + 2;
 return g_var;
}
 
int g()
{
 return f() + 2;
}
```

### 良い例(リエントラント) 
```c++
int f(int i)
{
 return i + 2;
}
 
int g(int i)
{
 return f(i) + 2;
}
```
## 排他制御する
共有のメモリのアクセスを「逐次化」する
ミューテックスを用いてクリティカルセクション(同時にアクセスされると困る共有メモリ)を排他制御する
### 「mutex_lock」を用いた例 
```c++
int g_var = 1;

int function(int i)
{
 mutex_lock();

 g_var = i;

 mutex_unlock();
}
```
## スレッド局所記憶を用いる
静的もしくは大域的なメモリをスレッドごとに局所的に使用するためのプログラミングの方法
例えばint型のグローバル変数を定義する際、生成するスレッド数分の配列にしておく
生成したスレッドに一意の値を振っておく
スレッドがグローバル変数を利用する際、自分に振られた一意の値の要素を利用する
こうすることでグローバル変数でありながら、スレッド固有の値を利用することができる
### 例 
```c++
// スレッドの生成上限を100とする.
int g_val[100] = {0};

int get(int thread_no)
{
 // 自分の要素の値を取得する.
 return g_val[thread_no];
}

void set(int i, int thread_no)
{
 // 自分の要素の値に保持する.
 g_val[thread_no] = i;
}
```
## アトミック操作にする
ロックはリソースへの同時アクセスを排他する操作
アトミック操作はメモリへの同時アクセスによるメモリ破壊を防ぐ操作
メモリ破壊されないが、プログラム上問題が起きるのであれば排他が必要
### 例 
```c++
bool g_Flg= true;

int function(bool Flg)
{
//mutex_lock(); // bool値の変更は排他しなくてもメモリ破壊されないことが保障されている.

 g_Flg = Flg;

//mutex_unlock(); // bool値の変更は排他しなくてもメモリ破壊されないことが保障されている.
}
```
(積分)例題7:x=aで集中荷重を受ける片持ち梁 ＜【② 構造力学の「構造」例題】を参考にsympyで実行した。

:::note info
前　 [(積分)例題6:端モーメントを受ける単純梁 へ 
](https://qiita.com/mrrclb48z/items/cfe3e67d286c02c7d288)戻　 [(積分)例題1:集中荷重を受ける片持ち梁 へ](https://qiita.com/mrrclb48z/items/3247352386176f692a1d)
　　[私のsympyの目次 へ](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7
)
:::

# オリジナル
Youtube 仮想仕事の原理の教育に関する研究会 様 　
**例題7:x=aで集中荷重を受ける片持ち梁** (16:00〜19:21)
https://youtu.be/NMP0Q78Wl9Q?t=000
＜目次(18:50)
https://youtu.be/NMP0Q78Wl9Q?t=1130
＜フル【② 構造力学の「構造」例題】(0:00〜19:21)
https://youtu.be/NMP0Q78Wl9Q

# sympyで
・ver0.2 未 差し替え
・ver0.1
```python
# ver0.1
# (積分)例題7:x=aで集中荷重を受ける片持ち梁 ＜【② 構造力学の「構造」例題】
from sympy import *
var('P,a,L,EI,x')
v=-P*x**2*(-3*L + x)/(6*EI)
rep={L:a,x:a}
va =v        .subs(rep)        #;print(va)
va1=diff(v,x).subs(rep)        #;print(va1)
print("#",va+(L-a)*va1)
# P*a**3/(3*EI) + P*a**2*(L - a)/(2*EI)
```
#### plotで作図
・省略

# sympyで(Beamで）
勉強中
https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam.html
https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam_problems.html
https://qiita.com/tags/beam

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞単純ばり 12)~~
~~＞構造力学公式集 表5.2 単純ばりの公式　p138~~
【LaTeX Workshop】PDFビューが表示されないときの対処法

## VSCodeのLaTeX WorkshopでPDFが表示されない
LaTeXファイルで作業していましたがある時点から右のタブが表示されなくなってしまいました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987385/7d20519f-8cc7-f073-de05-68a766cc431f.png)
ビルド自体は成功しており，外部PDFビュアーを使うと正しく表示されるのでVSCode側の問題のようでした．

## 失敗した対処法
* VSCode再起動
* LaTeX Workshop再起動
* PC(MacOS)再起動
* VSCode再インストール
* OSアップデート
* VSCodeクリーンインストール
うえのような代表的な対処法を試してもどうもだめで，違うPCでも同じ問題に直面していました．

## 原因
そもそもLaTeX WorkshopのPDFビュアーは127.0.0.1のLocalHostにアクセスする形で表示されているようであり，これがブラウザでも表示されなかったため原因がネットワーク関連にあることがわかりました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987385/67c3493a-6811-893c-e59d-558afbe370c4.png)



## 対処法
PCにはESET CyberSecurityがインストールされており，試しにファイアウォールをオフにするとPDFビューが正しく表示されました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987385/4a20ab1c-4dcf-8cb3-af4d-ae7a8d18c03e.png)
ただファイアウォールをオフにするのはセキュリティ的には良くないので，詳細設定からVSCodeのファイアウォールを甘くしてみました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987385/f0af8bc5-998b-0a92-5052-b173dd8d9b6f.png)
ちなみに「信頼できる受信接続を許可」だと同様に表示されませんので受信接続はすべて許可する必要があるようです．

思い返してみれば問題発生のちょうど直前にカフェで作業しており，そこでESETのセキュリティ設定が大型アップデート以来久しぶりに出てきてそこでネットワークをパブリックにするかプライベートにするかの選択を迫られました．
ただこれが異なるPCでの問題発生にもつながるということはESET側のセキュリティ設定が変わったのかもしれません．
ですので将来的なアップデートで解決するかもしれません．
(積分)例題6:端モーメントを受ける単純梁 ＜【② 構造力学の「構造」例題】様を参考にsympyで実行した。

:::note info
前　 [例題5:等分布荷重を受ける両端固定梁 へ 
](https://qiita.com/mrrclb48z/items/6021e63713235d79acb8)次　 [例題7:x=aで集中荷重を受ける片持ち梁 へ](https://qiita.com/mrrclb48z/items/5a7477fcfde4ddb85f77)
　　[私のsympyの目次 へ](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7
)
:::

# オリジナル
Youtube 仮想仕事の原理の教育に関する研究会 様 　
**例題6:端モーメントを受ける単純梁** (14:10〜16:00)
https://youtu.be/NMP0Q78Wl9Q?t=850
＜目次(18:50)
https://youtu.be/NMP0Q78Wl9Q?t=1130
＜フル【② 構造力学の「構造」例題】(0:00〜19:21)
https://youtu.be/NMP0Q78Wl9Q

# sympyで
・ver0.2 未 差し替え
・ver0.1
```python
# ver0.1
# 例題6:端モーメントを受ける単純梁【② 構造力学の「構造」例題】を参考にsympyで実行した。
from sympy import *
var('x,C1,C2,C3,C4,Mbar,L,EI')
def myMujigennka(v,com):
    return ( str(com)+"*("
            +str((v/com).expand())                \
                 .replace("x**2/L**2","(x/L)**2") \
                 .replace("x**3/L**3","(x/L)**3") \
                 .replace("x**4/L**4","(x/L)**4") 
            +")").replace(" ","")
def myKakeruPw(v,Pw):
    return Pw+"*"+str(v).replace("*"+Pw,"")
EIv4=0                                     #;print(EIv4)
EIv3=integrate(EIv4,x)+     C1             #;print(EIv3)
EIv2=integrate(EIv3,x)+L   *C2             #;print(EIv2)
EIv1=integrate(EIv2,x)+L**2*C3             #;print(EIv1)
EIv =integrate(EIv1,x)+L**3*C4             #;print(EIv )
sol =solve([Eq(1/EI*EIv .subs({x:0}),0),   # 幾何的境界条件
            Eq(1/EI*EIv .subs({x:L}),0),
            Eq(    -EIv2.subs({x:0}),Mbar),# 力学的境界条件
            Eq(    -EIv2.subs({x:L}),0),           
           ],[C1,C2,C3,C4])                # ;print(sol)
v   =(1/EI*(EIv.subs({C1:sol[C1],C2:sol[C2],C3:sol[C3],C4:sol[C4]}))).factor()     #;print(w)
print("#",myKakeruPw(myMujigennka(v,Mbar*L**2/(6*EI)),"Mbar"))                   
print("# あと少し",                 v.subs({x:Rational(1,3)*L}))    # L*1/3に同じ
print("# あと少し",                 v.subs({x:Rational(2,3)*L}))    # L*2/3に同じ
# Mbar*L**2/(6*EI)*(2*x/L-3*(x/L)**2+(x/L)**3)
# あと少し Mbar*5*L**2/(81*EI)
# あと少し Mbar*4*L**2/(81*EI)
# 
rep={Mbar:1,L:1,EI:1}
plot (diff(v,x,3).subs(rep),(x,0,1),ylim=(-1.5,1.5))
plot (diff(v,x,2).subs(rep),(x,0,1))
```
#### plotで作図
・値は、適当に1.0です。yscaleは、ylim=(,)で対応です。

SFD (-) 例題6:端モーメントを受ける単純梁
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/689a480c-b3d6-a0f1-c2dc-96dca1f5d050.png)

BMD (+)下に凸 例題6:端モーメントを受ける単純梁 
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/d94dd7d7-9971-3bc8-a583-0b3fe3be446b.png)

# sympyで(Beamで）
勉強中
https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam.html
https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam_problems.html
https://qiita.com/tags/beam

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
＞単純ばり 5)
＞構造力学公式集 表5.2 単純ばりの公式　p136
Pythonでプロットの対話性を向上させる方法

# **今回行ったこと**

- `plotly` ライブラリを使って、インタラクティブな散布図を作成。
- ズーム、ホバー情報表示、データポイントの選択が可能な対話型グラフを実現。
- Python コードだけで高品質なビジュアライゼーションを生成。

---

# **私の環境**

- **Python**: 3.10.9  
- **plotly**: 5.15.0  
- **numpy**: 1.23.5  
- **pandas**: 1.5.3  

---

# **インタラクティブなプロットの概要**

`plotly` を使用すると、対話型グラフを簡単に作成できます。ユーザーはマウス操作で以下のような操作が可能です：

- ズームイン・ズームアウト
- データポイントにホバーして詳細を表示
- 特定のデータを選択・強調表示

これにより、データを深く探索しやすくなります。

---

# **サンプルコード**

以下は、カテゴリ別のデータをインタラクティブにプロットする例です。

```python
import numpy as np
import pandas as pd
import plotly.express as px

# データ生成
x = np.linspace(0, 2 * np.pi, 100)  # X軸の値
df = pd.DataFrame({
    'x': np.tile(x, 3),  # xの値を3つの曲線で共通化
    'y': np.concatenate([np.sin(x), np.sin(2 * x), np.sin(3 * x)]),  # 各曲線のy値
    'category': ['sin(x)', 'sin(2x)', 'sin(3x)'] * len(x)  # カテゴリを指定
})

# インタラクティブな線グラフを作成
fig = px.line(
    df,
    x='x',
    y='y',
    color='category',
    title='Interactive Sin Curves',
    labels={'x': 'X軸', 'y': 'Y軸', 'category': '関数'}
)

# グラフを表示
fig.show()
```

# **実行結果**

以下のコードを実行すると、次のようなインタラクティブな散布図が生成されます。

- **ズーム可能**: グラフの特定の領域をマウスでドラッグしてズームインできます。
- **ホバー情報表示**: グラフ上の任意の点にマウスを合わせると、x、y、および関数の名前（例: sin(x)）が表示されます。
- **カテゴリ別の色分け**: `category` 列に基づいてデータポイントが自動で色分けされ、視覚的にわかりやすくなります。
![画面収録 2025-01-14 15.17.12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2887299/fb686915-2e8a-2756-d877-8d688c8838bc.gif)

---

# **カスタマイズ例**

1. **線のスタイルを変更**  
   各曲線の線の種類（点線、破線など）を変更し、デザインを調整できます。
   ```python
   fig = px.line(
    df,
    x='x',
    y='y',
    color='category',
    line_dash='category',  # 線の種類をカテゴリごとに変更
    title='Styled Sin Curves'
    )
    fig.update_traces(line=dict(width=2))  # 線の太さを調整
    fig.show()
    ```

2. **ホバー情報をカスタマイズ**  
   ユーザーに必要な情報だけをホバー表示するように設定できます。
    ```python
    fig = px.line(
    df,
    x='x',
    y='y',
    color='category',
    hover_data={'x': True, 'y': True, 'category': False}  # categoryはホバーに表示しない
    )
    fig.show()
    ```

3. **タイトルとラベルの翻訳**  
   日本語のタイトルやラベルでグラフをわかりやすくできます。
    ```python
    fig.update_layout(
    title='インタラクティブなサイン波のプロット',
    xaxis_title='X軸の値',
    yaxis_title='Y軸の値'
    )
    fig.show()
    ```

# **実用例**
- **データ探索**
大量のデータを可視化して、パターンや傾向を発見できます。特に時系列やカテゴリ別データの分析に有用です。

- **プレゼンテーション資料**
視覚的に訴えるだけでなく、リアルタイムでデータを探索できるインタラクティブなグラフを組み込むことで、説得力を高められます。

- **教育用途**
データサイエンスや統計学の学習において、動的なビジュアライゼーションは学習者の理解を深めます。
---
インタラクティブなグラフを使えば、データの「見やすさ」だけでなく、深い理解を得る手助けができます。ぜひお試しください！
実務未経験からのエンジニア転職前に確実に押さえておいて欲しいRubyの文法

## はじめに

株式会社シンシアでは、日本のITエンジニア不足という課題解決に向け、実務未経験のエンジニアの方向けのエンジニア転職支援サービスを運営しております。

https://naminori-user.xincere.jp

シンシアでは、年間100人程度の実務未経験の方が応募し技術面接を受けます。
その経験を通し、多くの人が身についていないな、と思う文法をここでは紹介していきます。

ポートフォリは作り終わったが意外と文法は身についていないな、というのが面接を多くする中で思っている所感なの
で、ぜひしっかり勉強してみてください。

## Rubyで重要な文法

### 四則演算

`%`（余りを求める）演算子を見についていない人が多いです。

https://naminori.xincere.jp/courses/3/lectures/17

### データ形

- `.to_s`で文字列に変換
- `.to_f`で小数に変換
- `.to_i`で整数に変換

https://naminori.xincere.jp/courses/3/lectures/18

### 条件分岐

- `&&`：AND条件の連結に使用します
- `||`：OR条件の連結に使用します

https://naminori.xincere.jp/courses/3/lectures/20

```ruby
age = 20
country = "Japan"

# AND (かつ) の場合
if age >= 18 && country == "Japan"
  puts "条件を満たしています（AND）"
else
  puts "条件を満たしていません（AND）"
end

# OR (または) の場合
if age >= 18 || country == "Japan"
  puts "条件を満たしています（OR）"
else
  puts "条件を満たしていません（OR）"
end
```


### caseを使った条件分岐

いままでの面接でcaseをうまく使ってコーディングしている人をあまり見かけていないので、ぜひ勉強してみてください！

https://naminori.xincere.jp/courses/3/lectures/21

### 繰り返し

- `next`はループ内の現在の反復処理を途中で終了し、次の反復に移ります
- `break`はループを中断してその繰り返しを修了させます

https://naminori.xincere.jp/courses/3/lectures/22

### `.each`や`.times`を使った繰り返し

- `配列.each`で配列内の要素に対して繰り返し処理ができます
- `数字.times`で`数字`の回数、その処理が行われます

https://naminori.xincere.jp/courses/3/lectures/23

### 関数の書き方

- 引数（ひきすう）とはなにか
- 返り値（かえりち）とはなにか

このあたりを理解してない人が多いので、ぜひしっかり身につけてください。

```ruby

# 下記の関数では場合、a,bの括弧内のものが引数
# 返り値はreturnで直接明示する場合もあれば、
# 最後の行に書かれているものが返り値の場合もあります

def max(a, b)
  if a < b
    ## これは明示的に返り値を書いてる場合
    ## 関数はここで返り値を返して修了する
    return b
  end
  ## 明示的にreturnを返さない場合は、
  ## 最後の行にかかれているものが返り値となる
  a
end

## この関数を呼び出す場合はこのように書く

puts max(5, 2) # => 5が表示される

```

https://naminori.xincere.jp/courses/3/lectures/25


### 実践では

このあたりを勉強してみてください。

https://naminori.xincere.jp/courses/3/lectures/26

https://naminori.xincere.jp/courses/3/lectures/27

## 最後に

シンシアでは、日本のITエンジニア不足という課題解決に取り組んでいます。

積極的に、実務未経験者の採用を行っているので、ぜひそちらもよろしくお願いいたします！

※ シンシアにおける働き方の様子はこちら 

https://www.wantedly.com/companies/xincere-inc/stories
(積分)例題5:等分布荷重を受ける両端固定梁 ＜【② 構造力学の「構造」例題】様を参考にsympyで実行した。

:::note info
前　 [(積分)例題4:等分布荷重を受ける固定-ローラ梁 へ 
](https://qiita.com/mrrclb48z/items/ae55d11120841ebd8a34)次　 [(積分)例題6:端モーメントを受ける単純梁 へ](https://qiita.com/mrrclb48z/items/cfe3e67d286c02c7d288)
　　[私のsympyの目次 へ](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7
)
:::

# オリジナル
Youtube 仮想仕事の原理の教育に関する研究会 様 　
**例題5:等分布荷重を受ける両端固定梁** (12:30〜14:10)
https://youtu.be/NMP0Q78Wl9Q?t=750
＜目次(18:50)
https://youtu.be/NMP0Q78Wl9Q?t=1130
＜フル【② 構造力学の「構造」例題】(0:00〜19:21)
https://youtu.be/NMP0Q78Wl9Q

# sympyで
・ver0.2 未 差し替え
・ver0.1
```python
# ver0.1
# (積分)例題5:等分布荷重を受ける両端固定梁 ＜【② 構造力学の「構造」例題】
from sympy import *
var('x,C1,C2,C3,C4,w,L,EI')
def myMujigennka(v,com):
    return ( str(com)+"*("
            +str((v/com).expand())                \
                 .replace("x**2/L**2","(x/L)**2") \
                 .replace("x**3/L**3","(x/L)**3") \
                 .replace("x**4/L**4","(x/L)**4") 
            +")").replace(" ","")
def myKakeruPw(v,Pw):
    return Pw+"*"+str(v).replace("*"+Pw,"")
EIv4=w                                     #;print(EIv4)
EIv3=integrate(EIv4,x)+w*L   *C1           #;print(EIv3)
EIv2=integrate(EIv3,x)+w*L**2*C2           #;print(EIv2)
EIv1=integrate(EIv2,x)+w*L**3*C3           #;print(EIv1)
EIv =integrate(EIv1,x)+w*L**4*C4           #;print(EIv )
sol =solve([Eq(1/EI*EIv .subs({x:0}),0),   # 幾何的境界条件
            Eq(1/EI*EIv1.subs({x:0}),0),
            Eq(1/EI*EIv .subs({x:L}),0),
            Eq(1/EI*EIv1.subs({x:L}),0)
           ],[C1,C2,C3,C4])                # ;print(sol)
v   =(1/EI*(EIv.subs({C1:sol[C1],C2:sol[C2],C3:sol[C3],C4:sol[C4]}))).factor()     #;print(v)
print("#",myKakeruPw(myMujigennka(v,w*L**4/(24*EI)) ,"w"))                   
print("#",myKakeruPw(             v.subs({x:L/2})   ,"w"))                   
print("#",myKakeruPw(        diff(v,x,2).subs({x:0}),"w"))
# w*L**4/(24*EI)*((x/L)**2-2*(x/L)**3+(x/L)**4)
# w*L**4/(384*EI)
# w*L**2/(12*EI)
#
rep={w:1,L:1,EI:1}
plot (diff(v,x,3).subs(rep),(x,0,1))
plot (diff(v,x,2).subs(rep),(x,0,1),ylim=(-0.1,0.1))
```
#### plotで作図
・値は、適当に1.0です。yscaleは、ylim=(,)で対応です。

SFD (+から-) 例題5:等分布荷重を受ける両端固定梁  
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/426a45fc-8361-3d58-7670-5457b5ea10de.png)

BMD (-から+)上に凸,下に凸,上に凸 例題5:等分布荷重を受ける両端固定梁 
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/5b1016d5-f48b-c74f-5d5c-45c91bc4be0a.png)

# sympyで(Beamで）
勉強中
https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam.html
https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam_problems.html
https://qiita.com/tags/beam

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
＞両端固定ばり 2)
＞構造力学公式集 表5.4 両端固定ばりの公式　p148
【小ネタ】顧客カーボンフットプリントツールが新しい専用ページに移動されました（2025.01.16）

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

2025.01.16のAWSアップデート数が多かったですが、個人的に興味深かったので簡単に記事にしてみました。サクッと読める分量で執筆しておりますので、お気軽に読んでいただければ幸いです。

# 目次
- アップデート内容
- コンソール画面
- 運用者視点での**うまみ**

## アップデート内容

公式ブログによると以下の通り説明されていました。

>カスタマーカーボンフットプリントツールは、AWS 請求コンソールの [コストと使用状況の分析] の専用ページで利用できるようになりました。このページは廃止されるため、[コストと使用状況レポート] ページには
表示されなくなりました。カスタマーカーボンフットプリントツールは、持続可能性への取り組みを進めるお客様をサポ​​ートします。AWS 請求コンソールにサインインすると、お客様は過去 36 か月間の二酸化炭素排出量データを地理的な場所別、および Amazon Elastic Compute Cloud (EC2) や Amazon Simple Storage Service (S3) などの AWS のサービス別に表示できます。その他のすべてのサービスは [その他] として報告されます。クラウドに新しいリソースをデプロイするときに、時間の経過に伴う二酸化炭素排出量の変化を測定することもできます。
カスタマーカーボンフットプリントツールの詳細については、製品ページにアクセスするか、ユーザーガイドを確認してください。現在の AWS のお客様は、持続可能性への取り組みを進める中で、 AWS 請求コンソールにアクセスしてこのツールを使い始めることができます。

すごくざっくりと言えば、**コストと使用状況の分析ページで炭素排出量を確認できるようになった**といったアップデートでした。

## コンソール画面

コンソール上での表示イメージは以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/e9bfc58a-242e-094f-7188-0aa35d2d8746.png)

現在リソースを利用していないので、何も表示されていないですが、グラフなどで視覚的に判断できる印象です。

## 運用者視点での**うまみ**

個人的に感じた運用者視点での**うまみ**についてまとめてみたいと思います。

- **コスト分析と同じフィールドで炭素排出量を確認できるため、持続可能性の柱を考慮した運用への意識を向けやすくなっている**
- **炭素排出量に関するレポートを本画面からアウトプットできるため、レポート作成工数を削減できる**

ただし、コンソール最下部に**「顧客の二酸化炭素排出量ツールに表示されている排出量の推定値は、情報提供のみを目的としており、コンプライアンス、マーケティング、または報告の目的のために使用してはなりません。」**といった注意書きが示されていたため、取得したデータをどのくらい信用するかは考える必要があるかと思います。

そのうえで、各リソースへのタグ付けを行い、**タグごとでの炭素排出量の推移**を表現できるのかが気になりました。

サラッとした内容のブログでしたが、深堀りすると面白い発見があるかもしれません。
最後まで記事を読んでいただきありがとうございましたｇ
個人的な備忘録：「昔は全然わからなかった」NATの概要と役割を記事にまとめてみた

## はじめに

**NAT**（**Network Address Translation**）は、内部ネットワーク（プライベートIPアドレス）と外部ネットワーク（グローバルIPアドレス）の間で、IPアドレスを変換する技術です。

:::note info
**この技術は、ネットワーク通信を効率化し、セキュリティを向上させるために非常に重要です。**
:::

***この記事は個人的な備忘録としてまとめたものですが、どなたかの技術的な参考になれば幸いです。***

## 書こうと思ったきっかけ
インターネットの基盤を支える技術の1つであるNATは、非常に重要な役割を果たしています。今回の記事では、このNATについて解説します。

***私自身、CCNAというネットワークの専門資格を取得しており、実務でもネットワークの設計や運用に携わった経験があります。***

:::note warn
**そのため、この分野にはある程度自信を持っています。**
:::

しかし、学び始めた頃はNATの概念が全く理解できませんでした。***むしろ、IPアドレスの仕組みすら分からない状態から手探りで勉強を始め、多くの苦労をした記憶があります。***

この記事では、初心者の方にも分かりやすいようにNATの基礎を解説し、同じように苦戦している方の助けになればと思っています。

## 昔は全然わからなかった
NATの仕組みを理解するためには、まずグローバルIPアドレスとプライベートIPアドレスの違いや仕組みを理解する必要があります。

:::note alert
**しかし、当時の私はこれらの基礎的な概念すら把握していませんでした。**
:::

そのため、当然ながらNATがどのように機能するのかも全く理解できませんでした。

***もし、これらの知識に不安がある方は、以下の記事も参考にしてみてください。***

https://qiita.com/free-honda/items/cf5390dffb0732d7d96f

基礎知識の欠如が、さらなる混乱を招いていたのだと思います。

## 今ではかなり言語化できる
しかし、現在ではNATについて3時間ほど人に説明できるほど、自信を持って話せるようになりました。

***これは、NATを理解するために相当な苦労をした結果得られたスキルです。***

:::note warn
**一度苦労して身につけた技術は、記憶に深く定着するものだと実感しています。**
:::

NATに限らず、技術的に成熟し、これ以上大きな変化がない、いわゆる『**枯れた技術**』については、全般的に自信を持って言語化できる状態になっています。

[枯れた技術について](https://wa3.i-3-i.info/word18031.html)

## NATについて

NAT（Network Address Translation）は、一言で簡単にまとめると、ネットワーク上でIPアドレスを「翻訳」する技術のことです。

![Screenshot 2025-01-16 at 14.02.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/dc0cf08a-7b76-c748-d95e-484ebc210469.png)
引用画像：https://amnimo.com/column/021/

:::note info
***NATは主にプライベートIPアドレスをグローバルIPアドレスに変換、もしくはその逆を行いインターネットへ接続するために利用されます。***
:::

## NATの主な役割

### 1. IPアドレスの節約
- プライベートIPアドレスを複数のデバイスに割り当て、外部には1つのグローバルIPアドレスを使用します。
- この仕組みにより、IPv4アドレスの枯渇問題を軽減します。

### 2. セキュリティ向上
- 内部ネットワークのIPアドレスを外部に公開しないため、不正アクセスを防ぐ効果があります。

### 3. ネットワーク接続の管理
- 複数の内部デバイスが1つのグローバルIPアドレスを共有してインターネットにアクセスできるようにします。

## NATの種類

### 1. 静的NAT（Static NAT）
- 1つのプライベートIPアドレスを特定のグローバルIPアドレスに対応付ける方式です。
- 主にサーバーなど特定のデバイスに適用されます。

### 2. 動的NAT（Dynamic NAT）
- 内部のプライベートIPアドレスに対して、プールされたグローバルIPアドレスの中から一時的に割り当てる方式です。
- 必要に応じて動的にIPアドレスを割り当てるため、柔軟性が高いのが特徴です。

### 3. NAPT（Network Address Port Translation）
- ポート番号を使用して、複数の内部デバイスが1つのグローバルIPアドレスを共有する方式です。
- 一般的なNATの形式で、「IPマスカレード」とも呼ばれます。

## まとめ
ここまで読んでいただき、ありがとうございました。

:::note warn
**今回は基本的な知識の整理が中心でしたが、改めて自分自身もネットワークについてより深く理解する機会になりました。**
:::

***今後も、このような基礎的な内容を積極的にアウトプットしながら、自分の知識を整理し、振り返るきっかけを作っていきたいと思います。***
モデル層、リポジトリ層、サービス層の役割

アプリケーションの設計において、モデル層 (Model)、リポジトリ層 (Repository)、サービス層 (Service) の役割を明確に分けることは、コードの保守性、再利用性、可読性を高めるために重要です。本記事では、それぞれの層の役割と使い分けについて説明します。

# モデル層 (Model)

役割

モデル層は、アプリケーションで扱うデータの構造を表現します。具体的には、データベースのテーブルと1対1で対応するエンティティクラスとして定義されることが一般的です。

特徴

データの属性や構造を定義します。

アプリケーションの「状態」を保持します。

データベースのテーブル設計をそのまま反映することが多いです。

例: ユーザーエンティティ
```java
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String email;
    private String password;

    // Getters and Setters
}
```

# リポジトリ層 (Repository)

役割

リポジトリ層は、データベースへのアクセスや永続化処理を担当します。この層は、モデル層（エンティティ）を操作するメソッドを提供し、データアクセスロジックをアプリケーションの他の部分から隠蔽します。

特徴

データベース操作に特化した責務を持つ。

Spring Data JPA を使用する場合は、JpaRepository や CrudRepository を継承して簡潔に記述可能。

データベースの CRUD (Create, Read, Update, Delete) 操作を抽象化。

例: ユーザーリポジトリ
```java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
}
```

上記のコードでは、findByUsername メソッドがユーザー名でデータを検索する機能を提供します。このメソッドは Spring Data JPA により自動的に実装されます。

# サービス層 (Service)

役割

サービス層は、ビジネスロジックを実装する責務を持ちます。リポジトリ層を呼び出してデータを操作し、アプリケーション固有のロジックを組み合わせます。

特徴

アプリケーションの主要な処理を担当。

リポジトリ層を呼び出し、必要なデータ操作を実行。

複数のリポジトリや外部サービスを組み合わせた複雑な処理を実現。

例: ユーザーサービス
```java
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User findUserByUsername(String username) {
        return userRepository.findByUsername(username)
                             .orElseThrow(() -> new UsernameNotFoundException("User not found"));
    }

    public void createUser(User user) {
        user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
        userRepository.save(user);
    }
}
```

# 層間の関係

各層は、それぞれ明確な責務を持ち、以下のように連携します：

コントローラ層 (Controller)

ユーザーリクエストを受け取り、サービス層を呼び出します。

サービス層 (Service)

ビジネスロジックを実行し、リポジトリ層を呼び出します。

リポジトリ層 (Repository)

モデル層（エンティティ）を通じてデータベースを操作します。

モデル層 (Model)

データの構造を定義し、リポジトリ層やサービス層で操作されます。

# フロー例

ユーザーが新規登録フォームを送信。

コントローラがフォームデータを受け取り、サービス層に渡す。

サービス層が入力データを検証し、必要に応じてリポジトリ層に保存処理を依頼。

リポジトリ層がデータを保存し、結果をサービス層に返す。

サービス層が結果をコントローラに渡し、コントローラがユーザーにレスポンスを返す。


**使い分けのポイント**

モデル層はデータそのものを表現し、アプリケーションの状態を保持する。

リポジトリ層はデータベースとのやり取りを抽象化し、CRUD 処理を提供する。

サービス層はビジネスロジックを実装し、アプリケーション全体の中核を担う。

この分離により、各層の責務が明確化され、保守性と再利用性が向上します。
shadcn/ui SheetContent 内で Popover を使う際の注意点

この記事は、shadcn/uiのSheetコンポーネントの内でPopoverを使用する際の注意点について解説します。

# 問題点

Sheetの中で、Calendarを用いて日付の入力を行おうとしたところ、カレンダーがクリックできないという現象に限りました。
z-index的な問題なのか表示はされるけどクリックができないのです。

これは、Popoverコンポーネントの表示を控えるmodalプロパティのデフォルト値が関係しています。
この値がfalseになっているため、Sheet内のイベントと交叉し、カレンダーの操作が不可能となっていました。

# 解決策

この問題は、Popoverコンポーネントに modal={true} を追加することで解決します。

```jsx
<SheetContent>
  <Popover modal={true}>
    <PopoverTrigger asChild>
      <Button>日付を選択</Button>
    </PopoverTrigger>
    <PopoverContent>
      <Calendar />
    </PopoverContent>
  </Popover>
</SheetContent>
```

# 解説

modal={true} を設定することで、Popoverは表示中に他の要素と交互しないようになります。
これにより、Sheet内でも不具合なくPopoverを利用できるようになります。

この設定は、Calendar以外のPopoverを使用する際にも有効です。
たとえば、フォームやサブメニューのアイテム選択にも実用的に利用できます。

# 結論

shadcn/uiのSheet内でPopoverを使用する際は、modal={true} の設定を忘れずに追加しましょう。
これにより、ユーザー体験を向上させることができます。

# 参考
https://qiita.com/bon10/items/5f057571be5ebce66d2e
Workato：契約プランと利用可能な機能を確認する

# はじめに

Workatoの現在の契約プランで利用可能な機能を把握するために、Workatoの現在の契約プランや、契約プランに含まれる機能を確認したい場合があります。そのような場合は、次の手順で確認することが出来ます

# 手順
## 1. 「Usage」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/abca5787-72f3-7622-fd52-d7fc02566366.png)

## 2. 「Plan details」タブをクリックします。

契約プランと、契約プランに含まれる（契約プランで利用可能な）機能を確認することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/24665f39-2e3a-bf09-e71a-37bc1fe09bfc.png)
情報処理安全確保支援士試験（SC）に合格！挑戦の記録と今後の展望

## はじめに

高校生のvalkyrie263です。この度、情報処理安全確保支援士試験（SC）に合格しました。基本情報技術者試験（FE）、応用情報技術者試験（AP）に続き、高校生ながらSCにも合格することができました。この経験が、これからSCを目指す方、特に同じ高校生の皆さんの参考になれば幸いです。

私がSC受験を決意した理由は以下の通りです：

- 先輩がSCに合格した姿に刺激を受け、私も挑戦したいと思いました。
- 将来、IPA資格を全て取得する目標を掲げ、その第一歩として選びました。
- 資格手当がある企業への就職を視野に入れ、早めに資格取得を目指しました。
- Webアプリ開発時に、セキュリティを考慮した設計を行えるスキルを身につけたかったからです。
- 午後IIがないため、他の試験に比べて挑戦しやすいと感じたのも理由の一つです。

この記事では、私の学習方法や試験当日の様子、そしてこれからSCを目指す皆さんへのメッセージをお伝えします。

## 試験対策

### 使用した教材

以下の教材を中心に試験対策を行いました：

- **過去問道場** (https://www.sc-siken.com/)
- **情報処理安全確保支援士合格教本**（技術評論社）

### 学習方法

**過去問演習の徹底:**

過去問道場で午前問題は過去10年分、午後問題は過去7年分を解きました。初回は時間を気にせず内容を深く理解することを重視。間違えた問題は3周以上復習し、完全に理解できるよう努めました。

**ノートに記録:**

間違えた問題は原因と共にノートに記録。復習時には「なぜ間違えたのか」を意識し、改善点を把握しました。

**参考書の活用:**

「情報処理安全確保支援士合格教本」を使い、関連知識を補強しました。特に、SQLインジェクション対策やプリペアドステートメントの重要性など、実務経験とリンクさせて理解しました。

### 午前問題、午後問題 の対策

- **午前問題:** 過去10年分を一通り解き、間違えた問題はさらに復習。関連知識を参考書で確認し、正答率を上げました。
- **午後問題:** 長文読解と記述練習に重点を置き、時間配分の練習も並行して行いました。特にWebアプリ開発経験は問題理解に役立ちました。

### 試験直前の追い込み

試験前日は18時間ほどかけて、過去3年分の問題を時間を計りながら解き、最終確認を行いました。

### 試験対策で感じた重要なポイント

- **過去問演習:** 出題傾向の把握や形式への慣れが大切です。
- **基礎知識の理解:** 単なる暗記ではなく、技術の仕組みを深く理解すること。
- **時間配分:** 午後問題では特に、各問題にかける時間をあらかじめ決めておくと良いです。

## 試験当日

試験会場では、次の点を意識して取り組みました：

- **問題選択:** 得意な分野から優先的に解答し、効率よく進めました。
- **時間配分:** 各大問ごとに解答時間を設定し、時間内に解き終える練習を活かしました。

## 合格発表

合格発表の瞬間、受験番号を見つけたときの喜びは忘れられません。これまでの努力が報われたと感じました。

## 今後の展望

- **2025年4月:** ネットワークスペシャリスト試験（ネスペ）挑戦。
- **2025年10月:** データベーススペシャリスト試験（DBスペシャリスト）挑戦。

セキュアなアプリケーション開発やサーバのセキュリティ対策に取り組み、ITエンジニアとして社会に貢献したいと考えています。

## 高校生へのメッセージ

SC試験は簡単ではありませんが、しっかりと対策を行えば、高校生でも合格可能です。過去問を繰り返し解き、基礎知識を深めることが重要です。

また、Webアプリを自作するなど、実務に近い経験を積むことで、試験対策以上の力が身につきます。若いうちに高度な資格に挑戦することは、将来必ず役立つでしょう。

「為せば成る」の精神で、一緒に頑張りましょう！

## まとめ

SC合格は、私にとって大きな自信となりました。この経験を糧に、さらなる挑戦を続けたいと思います。この記事が、SCを目指す皆さんの参考になれば幸いです。質問があれば、ぜひコメントでお知らせください！
【Pyxel】Pyxel × Pymunkで、、、

追記20250311
Pyxel version 2.3.8あたりでまた動作しなくなりました。
micropipが見つからない・・・と。
pyodido対応ライブラリの設定方法が変わったらしい。
公開用htmlの"launchPyxel({ command:"に「packages: "micropip"」を追加すると動くようになりました。

追記20250124
Pyxel version 2.3.1になったあたりでWeb版が動作しなくなりました。
pymunkがロードできません。
何が変わったのか？
2.3.0までは動いていたのに・・・
そんなわけでローカルでしか遊べない代物になってしまった。
しばし様子見しつつ、対策・・・できるかなぁ？

追記20250125
Pyxelでのversion up内容聞きました。
特に影響ある更新は無いとのこと。
micropipもpyodideも問題はなさそうで行き詰まり・・・
しばらく様子を見ます。

追記20250125_2
pymunkを絶対パスとすることで解決しました。
Pyxel 2.3.0あたりでpyodideのバージョンを上げたことによるmicropip等の兼ね合いが影響あるかもとのこと。
ひとまず解決して良かった。

---

前回記事でpymunkライブラリのサンプルをpyxel化しまして、その後ピンボールとスマートボールをPyxelで作ってみました。


![white_stage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927925/3201a3b7-4aa8-0550-f339-ed1e78cf44dd.png)

https://sanbunnoichi1962.web.fc2.com/pyxel_contents.html#pymunk_de_pinball

![sm_game.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927925/19a150af-1883-b822-6039-27af2dd8033e.png)

https://sanbunnoichi1962.web.fc2.com/pyxel_contents.html#pymunk_de_smartball

pymunkで使える形状は、線、円、矩形の三種類。
これらを定義（spaceにadd）するだけでこれらの衝突判定を行うことができます。

つまりは、打ち出す玉を円、枠線を線で作成、バンパーや穴を円で作成、その他を矩形で作成し弾性や摩擦を設定して、spaceの重力や摩擦を設定するだけです。
設定したものの座標を取得できるので該当箇所に表示物を置けばそれっぽく見えます。

衝突判定に少し癖があるようなので回避策を考える必要がありましたが、上記二種のプログラムを動作させることができました。

まだpymunkを熟知できていないので、もしかしたら「癖」ではないのかもしれません。

「癖」の例としては、
「CollisionHandlerの判定がcollision_type=0とそれ以外でしか判定してくれない。」
スマートボールにおいては、複数のボールが複数の穴に入ることを前提としているのですが、ボールが１個しか穴に入れられない問題がありました。
回避策としては衝突ハンドラを使わずにshapeのshapes_collideを使うことで回避しました。

当たり判定をライブラリがやってくれるなら楽だなとか思います。
重力や摩擦を無視するように作れば何でもアリだなと思いました。
あとは処理負荷がどうなるか・・・ですかね？

追記：
pymunkのweb化ではバーチャルゲームパッドは非対応になるようです。
弱小プログラマー、個人開発に挑戦！ 1年で生活を成り立たせるという淡い夢（笑）


こんにちは、32歳で育児中のchantoです。

「なんちゃってプログラマー」として何年か働いていましたが、「なんだか違うなぁ」と感じて、思い切って辞めてしまいました（笑）。

現在は、畑仕事をやってみたり、自分用のツールを作ったり、資格の勉強をしたり、育児をしたりしています。ですが、さすがに中年のモラトリアムにも限界が見えてきたので（家計的な限界が・・・）、せいぜいあと1年程度の余裕しかありません。

このモラトリアムを少しでも延ばすために、個人開発で何とかできないかと挑戦中です。個人開発でなんとかできている猛者がいれば、どうかお助けください（泣）

というわけで、開発過程や怠けている様子を、これから投稿していきたいと思っています。実験体として見守ってもらうか、優しいコメントをいただけると嬉しいです。。
アリババクラウド、国際顧客向けにACSを発表 - ワークロード展開を革新

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/alibaba-cloud-unveils-acs-for-international-customers-to-revolutionize-workload-deployment_601934?spm=a2c65.11461433.0.0.4ee35355YuBnwJ)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# アリババクラウド、革新的なコンテナ計算サービスACSの国際デビューを発表

中国杭州、2025年1月14日 – アリババグループのデジタル技術とインテリジェンスの基盤であるアリババクラウドは本日、コンテナ技術を使用したワークロードの展開を簡素化および最適化するための革新的なAlibaba Cloud Container Compute Service (ACS) の国際デビューを発表しました。ACSは2025年1月から国際顧客向けに利用可能となります。ACSはKubernetesをインターフェースとして使用し、コンテナ標準に準拠したコンピュートリソースを提供するサーバーレスコンテナサービスです。この新しい製品により、ユーザーが下位のノードやクラスターを管理する必要がなくなり、コンテナ展開に関連するコストと技術的な障壁が大幅に削減されます。また、ペイ・アズ・ユー・ゴー方式を採用しており、過剰割り当てを避けるとともに、需要に応じてスケーリングが可能で、高負荷時と低負荷時のコスト最適化を実現します。

![O1CN01RFkJZG1dcIeSfJTCy_!!6000000003756-](https://img.alicdn.com/imgextra/i2/O1CN01RFkJZG1dcIeSfJTCy_!!6000000003756-0-tps-1107-601.jpg)

「ワークロードのコンテナ技術への展開がますます一般的になるにつれて、お客様の進化するニーズに対応できるよりアクセスしやすいソリューションを開発しました」と、アリババクラウドのインフラストラクチャ製品のゼネラルマネージャーである江偉江（Jiangwei Jiang）は述べています。「ACSは、ビジネスがコンテナ技術を利用する方法において大きな前進を示しており、コスト効率と使いやすさを提供して生産性を最大化することを支援します。コンテナ技術は、プログラムを動作させるために必要なすべてをパッケージ化する仮想化の一種であり、異なるハードウェアやシステム間でのアプリケーションの一貫した展開を容易にします。効率性とリソース最適化の利点により、コンテナは主流の開発手法となっています。ガートナーによると、過去1年間でコンテナ管理市場は20%以上の成長を遂げており、2028年には市場価値が45億ドルになると予測されています。ガートナーはまた、2027年までに、全てのAI展開の75%以上がコンテナ技術を基盤とするコンピュート環境を使用すると予測しています。」

## コンテナ採用の課題への対応
ACSは、Kubernetes構成、リソース管理、オンデマンド弾性に関する複雑さを克服するように設計されています。アリババクラウドの神龍アーキテクチャに基づくコンテナとリソースを統合することで、最大限のコンピュートリソースのスケーリングを可能にし、コンピュートパワーのコストを最大55%削減できるソリューションを提供します。「ACSは、コンテナオーケストレーションサービスを包括的なコンピュート製品に変革しました。ユーザーは使用したコンピュート容量のみを支払うことで利益を得ることができます」と江は付け加えています。この製品は完全にKubernetes技術と互換性があり、オープンソースエコシステムや自社開発製品の両方のクラウドへのシームレスな移行をサポートしています。これにより、ユーザーはお馴染みのKubernetes管理方法とファイル形式を継続して使用できます。また、ノードを事前に購入する必要がないため、ユーザーはワークロード要件を宣言するだけで、ACSが必要な下位コンピュートリソースと一致させます。これにより、追加のコストと人的リソースのインフラストラクチャメンテナンスの要求が最小限に抑えられます。

## 顧客と業界から認められた実証済みの技術
アリババクラウドコンテナサービスは、パブリッククラウド、プライベートクラウド、ハイブリッドクラウドを含む複数のクラウド環境で展開でき、異なるアーキテクチャをサポートしています。現在、アリババクラウドコンテナサービスは幅広い業界で活用されています。中国の主要なHR管理SaaS企業であるMokaは、ACSの導入により大きな利益を得ています。ACSクラスターのメンテナンスフリーな性質により、Mokaはインフラストラクチャ管理ではなく、コアビジネスの優先事項に集中することができました。また、オンデマンドスケーリングとペイ・パー・ユースモデルにより、特に採用シーズンのピーク時には必要な柔軟性が得られました。最近、アリババクラウドは2年連続で2024年のガートナー® マジッククアドラント™ for Container Managementでリーダーに選ばれました。同社の包括的な製品ポートフォリオ、ハイブリッドクラウドとエッジシナリオの両方のソリューション、アリババグループエコシステム全体での普及、そして中国市場でのリーダーシップが、この重要な認定に寄与しました。
(積分)例題4:等分布荷重を受ける固定-ローラ梁 ＜【② 構造力学の「構造」例題】様を参考にsympyで実行した。

:::note info
前　 [(積分)例題3:等分布荷重を受ける単純梁 へ
](https://qiita.com/mrrclb48z/items/49ad3cca9e645a1428ad)次　[(積分)例題5:等分布荷重を受ける両端固定梁 へ](https://qiita.com/mrrclb48z/items/6021e63713235d79acb8)
　　[私のsympyの目次 へ](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7
)
:::

# オリジナル
Youtube 仮想仕事の原理の教育に関する研究会 様 　
**例題4:等分布荷重を受ける固定-ローラ梁** (10:50〜12:30)
https://youtu.be/NMP0Q78Wl9Q?t=650
＜目次(18:50)
https://youtu.be/NMP0Q78Wl9Q?t=1130
＜フル【② 構造力学の「構造」例題】(0:00〜19:21)
https://youtu.be/NMP0Q78Wl9Q

# sympyで
・ver0.2 未 差し替え
・ver0.1
```python
# ver0.1
# (積分)例題4:等分布荷重を受ける固定-ローラ梁 ＜【② 構造力学の「構造」例題】
from sympy import *
var('x,C1,C2,C3,C4,w,L,EI')
def myMujigennka(v,com):
    return ( str(com)+"*("
            +str((v/com).expand())                \
                 .replace("x**2/L**2","(x/L)**2") \
                 .replace("x**3/L**3","(x/L)**3") \
                 .replace("x**4/L**4","(x/L)**4") 
            +")").replace(" ","")
def myKakeruPw(v,Pw):
    return Pw+"*"+str(v).replace("*"+Pw,"")
EIv4=w                                     #;print(EIv4)
EIv3=integrate(EIv4,x)+w*L   *C1           #;print(EIv3)
EIv2=integrate(EIv3,x)+w*L**2*C2           #;print(EIv2)
EIv1=integrate(EIv2,x)+w*L**3*C3           #;print(EIv1)
EIv =integrate(EIv1,x)+w*L**4*C4           #;print(EIv )
sol =solve([Eq(1/EI*EIv .subs({x:0}),0),   # 幾何的境界条件
            Eq(1/EI*EIv1.subs({x:0}),0),
            Eq(1/EI*EIv .subs({x:L}),0),
            Eq(    -EIv2.subs({x:L}),0)    # 力学的境界条件          
           ],[C1,C2,C3,C4])                # ;print(sol)
v   =(1/EI*(EIv.subs({C1:sol[C1],C2:sol[C2],C3:sol[C3],C4:sol[C4]}))).factor()  # ;print(w)
print("#",myKakeruPw(myMujigennka(v,w*L**4/(24*EI)),"w"))                   
print("#",myKakeruPw(     v     .subs({x:L/2})     ,"w"))
print("# あと少し", diff(v,x,1).subs({x:L}))
print("# あと少し",-diff(v,x,2).subs({x:0}))
print("# あと少し",-diff(v,x,3).subs({x:0}))
print("# あと少し",-diff(v,x,3).subs({x:L}))
mrrclb48z@penguin:~$ /bin/python3 /home/mrrclb48z/aaa.py
# w*L**4/(24*EI)*(3*x**2/(2*L**2)-5*x**3/(2*L**3)+(x/L)**4)
# w*L**4/(192*EI)
# -L**3*w/(48*EI)
# あと少し -L**2*w/(8*EI)
# あと少し 5*L*w/(8*EI)
# あと少し -3*L*w/(8*EI)
rep={w:1,L:1,EI:1}
plot (diff(v,x,3).subs(rep),(x,0,1))
plot (diff(v,x,2).subs(rep),(x,0,1),ylim=(-0.2,0.4))
```
#### plotで作図
・値は、適当に1.0です。yscaleは、ylim=(,)で対応です。

SFD (-) 例題4:等分布荷重を受ける固定-ローラ梁 
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/e9ba1b89-f8d4-3337-2173-9f857578485f.png)

BMD (-から+)上に凸から下に凸 例題4:等分布荷重を受ける固定-ローラ梁 
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/bc8a53b3-f5d2-2671-65bf-217319f81e60.png)


# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
＞一端固定他端単純支持ばり 1)
＞構造力学公式集 表5.3 一端固定他端単純支持ばりの公式　p142
python 辞書におけるリストとタプル

## 例
```py
dict0 = {('key0', 'key1'): 'value0'}
dict1 = {['key0', 'key1']: 'value0'}
dict2 = {'key': ('value1', 'value2')}
dict3 = {'key': ['value1', 'value2']}
```

## 説明
辞書のkeyにできるのはタプル〇、リスト×
辞書のvalueにできるのはタプル〇、リスト〇

そもそもタプルとリストの違いって…
- タプルはハッシュ可能、変更不可能
- リストはハッシュ不可能、変更可能

であるため、ハッシュ不可能なものはkeyに入れられない。
ただし、タプルであっても、ハッシュ不可能な要素を含んでいる場合にはハッシュ不可能なのでkeyにできない。

```py
dict0 = {('key0', ['key1']): 'value0'}  # エラー
```

※なお、厳密にはハッシュ可能性と変更可能性は、同じではない。
例えば、 ユーザー定義のクラスのインスタンスは変更可能だけど、ハッシュ可能なのでkeyにできる。
csv作成マクロ2

```
Sub ExportSheetsToCSV()
    Dim FileSystem As Object
    Dim Folder As Object
    Dim File As Object
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim CsvFileName As String
    Dim SavePath As String
    Dim TxtFile As Object
    Dim DataRow As Range
    Dim DataText As String

    ' マクロが保存されたディレクトリを取得
    SavePath = ThisWorkbook.Path

    ' ファイルシステムオブジェクトを作成
    Set FileSystem = CreateObject("Scripting.FileSystemObject")
    Set Folder = FileSystem.GetFolder(SavePath)

    ' フォルダ内の各ファイルをチェック
    For Each File In Folder.Files
        If FileSystem.GetExtensionName(File.Name) = "xlsx" Or FileSystem.GetExtensionName(File.Name) = "xlsm" Then
            Set wb = Workbooks.Open(File.Path)
            
            ' 各シートをCSVにエクスポート
            For Each ws In wb.Sheets
                CsvFileName = ws.Cells(1, 1).Value
                
                ' A1セルが空白ならスキップ
                If CsvFileName <> "" Then
                    CsvFileName = SavePath & "\" & CsvFileName & ".csv"

                    ' テキストファイルを作成
                    Set TxtFile = FileSystem.CreateTextFile(CsvFileName, True, False) ' FalseはUTF-8 (BOMなし)

                    ' シートのデータを1行ずつ書き込み
                    For Each DataRow In ws.UsedRange.Rows
                        DataText = ""
                        For Each Cell In DataRow.Cells
                            DataText = DataText & ",""" & Replace(Cell.Value, """", """""") & """"
                        Next Cell
                        DataText = Mid(DataText, 2) ' 最初のカンマを削除
                        TxtFile.WriteLine DataText
                    Next DataRow

                    TxtFile.Close
                End If
            Next ws

            wb.Close SaveChanges:=False
        End If
    Next File

    MsgBox "すべてのシートをCSVにエクスポートしました。"
End Sub
```
(積分)例題3:等分布荷重を受ける単純梁 ＜【② 構造力学の「構造」例題】様を参考にsympyで実行した。

:::note info
前　 [(積分)例題2:等分布荷重を受ける片持ち梁 へ
](https://qiita.com/mrrclb48z/items/466808767079250487f9)次　 [(積分)例題4:等分布荷重を受ける固定-ローラ梁 へ](https://qiita.com/mrrclb48z/items/ae55d11120841ebd8a34)
　　[私のsympyの目次 へ](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7
)
:::

# オリジナル
Youtube 仮想仕事の原理の教育に関する研究会 様 　
**例題3:等分布荷重を受ける単純梁** (9:00〜10:50)
https://youtu.be/NMP0Q78Wl9Q?t=540
＜目次(18:50)
https://youtu.be/NMP0Q78Wl9Q?t=1130
＜フル【② 構造力学の「構造」例題】(0:00〜19:21)
https://youtu.be/NMP0Q78Wl9Q

# sympyで
・ver0.2 未 差し替え
・ver0.1
```python
# ver0.1
# (積分)例題3:等分布荷重を受ける単純梁 ＜【② 構造力学の「構造」例題】を参考にsympyで実行した。
from sympy import *
var('x,C1,C2,C3,C4,w,L,EI')
def myMujigennka(v,com):
    return ( str(com)+"*("
            +str((v/com).expand())                \
                 .replace("x**2/L**2","(x/L)**2") \
                 .replace("x**3/L**3","(x/L)**3") \
                 .replace("x**4/L**4","(x/L)**4") 
            +")").replace(" ","")
def myKakeruPw(v,Pw):
    return Pw+"*"+str(v).replace("*"+Pw,"")
EIv4=w                                     #;print(EIv4)
EIv3=integrate(EIv4,x)+w*L   *C1           #;print(EIv3)
EIv2=integrate(EIv3,x)+w*L**2*C2           #;print(EIv2)
EIv1=integrate(EIv2,x)+w*L**3*C3           #;print(EIv1)
EIv =integrate(EIv1,x)+w*L**4*C4           #;print(EIv )
sol =solve([Eq(1/EI*EIv .subs({x:0}),0),   # 幾何的境界条件
            Eq(1/EI*EIv .subs({x:L}),0),
            Eq(    -EIv2.subs({x:0}),0),   # 力学的境界条件
            Eq(    -EIv2.subs({x:L}),0)           
           ],[C1,C2,C3,C4])                # ;print(sol)
v   =(1/EI*(EIv.subs({C1:sol[C1],C2:sol[C2],C3:sol[C3],C4:sol[C4]}))).factor()    #;print(w)
print("#",myKakeruPw(myMujigennka(v,w*L**4/(24*EI)),"w"))                   
print("#",     v   .subs({x:L/2}))
print("#",diff(v,x).subs({x:0}))
# w*L**4/(24*EI)*(x/L-2*(x/L)**3+(x/L)**4)
# 5*L**4*w/(384*EI)
# L**3*w/(24*EI)
#
rep={w:1,L:1,EI:1}
plot (diff(v,x,3).subs(rep),(x,0,1))                   # (+)
plot (diff(v,x,2).subs(rep),(x,0,1),ylim=(-0.2,0.1))   # (+)下に凸
```
#### plotで作図
・値は、適当に1.0です。yscaleは、ylim=(,)で対応です。

SFD (-) 例題3:等分布荷重を受ける単純梁
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/41d4a640-bcee-ee17-73d4-d93e0863ae25.png)
BMD (+)下に凸 例題3:等分布荷重を受ける単純梁
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/e037ebc7-a97f-2bde-d515-7bee26b7e634.png)

# sympyで(Beamで）
勉強中
https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam.html
https://docs.sympy.org/latest/modules/physics/continuum_mechanics/beam_problems.html
https://qiita.com/tags/beam

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
＞単純ばり 2)
＞構造力学公式集 表5.2 単純ばりの公式　p132
【Rails】bundle lock--add-platformコマンド

# はじめに
こんにちは！ アメリカで独学でソフトウェアエンジニアを目指している者です。
現在は『Rails Tutorial』の8章まで学習を終え、2周目に取り組んでいます。
1周目と比べると基本的な内容は少しずつ理解が進んできましたが、まだ知らないコードや知識があり、日々新しい発見があります。

本記事では、その中でも特に「`bundle lock --add-platform`コマンド」について簡単にまとめました。
Railsを始めたばかりの方や、後々自分が見返すときの備忘録的な内容ですので、参考にしていただければ幸いです。

## bundle lock--add-platformコマンドとは
Rails Tutorialでは、`bundle lock --add-platform x86_64-linux`と記載されています。
これは特定のプラットフォーム（ここでは x86_64-linux）を Gemfile.lock に追加するためのコマンドです。

たとえば、次のようなケースを考えてみましょう。

1. 開発環境 → Mac
2. 本番環境 → Linux

このように、開発環境と本番環境のプラットフォームが異なると、Macでは正常に動作していても Linux ではエラーが発生する場合があります。
これは、一部の Gem が Linux 向けに作られていることが原因で、Mac 用の情報のみだと正常にインストールされない可能性があるためです。

そこで `bundle lock --add-platform x86_64-linux` を実行すると、Linux 用の Gem も `Gemfile.lock` に含まれるようになります。
その結果、本番環境で必要な Gem が欠けていることによるトラブルを未然に防ぐことができます。
Rails は環境依存が大きいフレームワークとも言われているため、このコマンドを導入しておくのは本番環境を想定するうえで非常に重要です。

なお、『Rails Tutorial』でも同様の説明があり、開発初期の段階で実行しておくことが推奨されています。

# まとめ
`bundle lock --add-platform` コマンドは、開発環境と本番環境が異なる場合に生じる Gem の依存関係トラブルを防ぐために非常に便利です。
特に Rails のように環境依存が比較的大きいフレームワークでは、早めのタイミングで実行しておくことをおすすめします。
Railsは学ぶことが多くまた、学習中に面白いなと思った内容があれば記事にしたいと思います
GitHub Pagesの404対策(Vite)

GtiHub Pagesでデプロイした場合,初期状態では`/`以外のページにアクセスすると`404 not found`になる問題の対策(無理やり解決)

# `vite.config.ts`
`base`をリポジトリ名にしておく

```ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";

export default defineConfig({
    plugins: [react(), { enforce: "pre", ...mdx(options) }],
    base: "/RepositoryName/", //リポジトリ名を指定
});
```

# `deploy.yml`
`deploy.yml`を以下のようにする.

今回の404対策は`404.htmlを作成`の行

```yml
name: Build and Deploy to gh-pages

on:
    push:
        branches: [main]

permissions:
    contents: write
    pages: write # 必須: Pagesに書き込み権限を与える
    id-token: write # GitHub OIDCトークンにアクセスするために必要

jobs:
    build:
        runs-on: ubuntu-latest
        steps:
            # コードのチェックアウト
            - uses: actions/checkout@v4

            # Node.jsのセットアップ
            - uses: actions/setup-node@v3
              with:
                  node-version: "20"

            # Node.jsモジュールのキャッシュ
            - name: Cache Node.js modules
              uses: actions/cache@v3
              with:
                  path: ~/.npm
                  key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
                  restore-keys: |
                      ${{ runner.os }}-node-

            # Node.js依存関係のインストール
            - run: npm ci

            # ビルドの実行 (distフォルダにビルド)
            - name: Build
              run: npm run build

            # 404.htmlを生成
            - name: Generate 404.html
              run: cp dist/index.html dist/404.html

            # GitHub Pagesの設定
            - name: Setup Pages
              uses: actions/configure-pages@v5

            # distフォルダをアーティファクトとしてアップロード
            - name: Upload artifact
              uses: actions/upload-pages-artifact@v3
              with:
                  # distフォルダのみアップロード
                  path: "dist"

            # GitHub Pagesにデプロイ
            - name: Deploy to GitHub Pages
              id: deployment
              uses: actions/deploy-pages@v4
```

# まとめ

これでmainブランチにマージしたタイミングで自動的にビルドからデプロイまでしてくれるかつ`/`以外のパスにアクセスしても404を吐かなくなった.
Homebrewで過去インストールしたパッケージのバージョンがbrew listからなくなったときの対処法

homebrewで過去にインストールしたパッケージのバージョンがいつの間にかなくなってしまっていたことって経験したことないでしょうか。
私はあります。というかさっき2回目に遭遇して過去どのようにしたのか忘れていたので、備忘録がてらその時とった対処法を記載しときます。
※ 公式の対処法ではありませんので自己責任でお願いいたします。

## 結論
1. [homerew-core](https://github.com/Homebrew/homebrew-core)リポジトリ内のFormulaディレクトリで必要なパッケージを探す（masterになければ過去コミットにcheckoutして探す）
2. Formulaディレクトリからインストールしたいパッケージのrbファイルをダウンロード
3. 以下コマンド実施
   ```
   $ brew install 2でインストールしたrbファイル
   ```

### そもそもHomebrewってどうやってパッケージをインストールしてるの?
Homebrew は Homebrew用に作成されたrubyスクリプトを実行して各パッケージのダウンロードURLからパッケージをDL、インストールしています。
各パッケージ用のrubyスクリプトは[homerew-core](https://github.com/Homebrew/homebrew-core)リポジトリ内のFormulaディレクトリにて管理されており、基本はここからrbファイルを取得してスクリプト実行することでパッケージがインストールされる仕組みになっております。

こちらの方の図解が分かりやすかったです。
[MacのHomebrewとは？仕組み・使い方と用語整理](https://blog.mothule.com/mac/homebrew/mac-homebrew-basic)

### 公式以外からパッケージをインストールする方法
[homerew-core](https://github.com/Homebrew/homebrew-core)リポジトリ内に存在しないパッケージは以下のいずれかで取得することができます。
1. `brew tap`で任意のFormulaディレクトリを追加してインストールする方法
2. rbファイルを用意してインストールする方法

正攻法としては1だと思います。ただ、自分の理解力が乏しくやり方がいまいちピンとこなかったため、今回は2の方法で実施することにしました。

※ 1についてはここあたりで解説されていましたので、ご興味ある方はどうぞ。
[HomebrewでFormulaにない任意のバージョンのパッケージをインストールする - ひよこまめ](https://blog.chick-p.work/til/brew-install-specify-version)
[Homebrewで任意のバージョンのパッケージをインストールする](https://zenn.dev/itouuuuuuuuu/articles/a4227c9f25b82a)

#### rbファイルの取得方法

rbファイルはFormulaディレクトリに存在しており、過去配布していた実績があるのであれば[homerew-core](https://github.com/Homebrew/homebrew-core)リポジトリの過去コミットに戻ることで過去インストールした際のバージョン向けのrbファイルを取得することができます。
git cloneして git checkoutで取得する方法もあるので、そこはやりやすい方で試し見ると良いと思います。

私の場合はプロジェクトで利用しているmysql-clientがversion 8.3でいつの間にかしれっとhomebrewのインストール可能ｎバージョンから8.3が消えていて絶望しましたが、色々調べてなんとか過去配布されていたrbファイルから取得できたので良かったです。
(バージョン変更はマイナーバージョンでもホント~~面倒~~手間がかかるので、何としてでも8.3をインストールしたかった…)

### 最後に
今回ご紹介した方法はあくまで一時的な解決策です。
本来あるべき姿としては最新の安定版にアップデートしていくことが大事ですので、そこのほどご留意いただけると幸いです。
JavaScriptでスライドショー #2 (リンクを設定)

どうもAtsu1209です。

今回はJavaScriptでスライドショーで画像をクリックすることでリンクに飛ばすやつを作ります。

**前回↓↓**

https://qiita.com/Atsu1209jp/items/8170623f753f01f81c4f

# スライドショー
前回のコード

```js
//スライドショー        
const pics_src = ["img/one.png", "img/two.png", "img/three.png"];
let num = -1;
const indicators = [
  document.getElementById("spanone"),
  document.getElementById("spantwo"),
  document.getElementById("spanthree"),
];

function updateIndicators() {
  indicators.forEach((indicator, index) => {
    if (index === num) {
      indicator.style.color = "black";
    } else {
      indicator.style.color = "#808080";
    }
  });
}

function slideshow_timer() {
  if (num === 2) {
    num = 0;
  } else {
    num++;
  }
  document.getElementById("top-img").src = pics_src[num];
  updateIndicators();
}

indicators.forEach((indicator, index) => {
  indicator.addEventListener("click", function () {
    num = index;
    document.getElementById("top-img").src = pics_src[num];
    updateIndicators();
  });
});

setInterval(slideshow_timer, 6000);

```

### リンクに飛ばす
```js
 document.getElementById("top-img").addEventListener("click", function() {

    if (num === -1 || num === 0){
        window.open("リンク1");
    }
    if (num === 1){
        window.open("リンク2");
    }
    if (num === 2){
        window.open("リンク3");
    }
});
```
【疑問・記事内に答え無し】複数のファイルを同時に圧縮する場合に容量が削減される圧縮形式は無いものか

同じ文字列が頻出する場合は
その文字列を覚えておく圧縮形式が
恐らくあると思います。

そうするならば

こんにちは
こんばんわ

という内容の aaa.txt と

おはよう
こんにちは
こんばんわ

という内容の bbb.txt があるならば

2
aaa.txt
bbb.txt
2,3
こんにちは
こんばんわ
おはよう
こんにちは
こんばんわ

という感じで内部的に 1 ファイルにして
圧縮を掛けたりしないのかと思う訳です。

一番上の 2 はファイル数です。
2,3 行目はファイル名です。ファイル数行あります。
2,3 は各ファイルの行数です。つまり
aaa.txt は 2 行 bbb.txt は 3 行です。

バックアップを取りながら作業したファイル等は
多くの箇所が同じような記述になると思うため
大きく圧縮される気がするのです。

恐らく各ファイルの
文字コードが統一されていない事が
原因だと推測されるのですが
何とかならないものでしょうか？

同じようなファイルを
同時に圧縮しているのに
容量がきちんと 2 個分
消費している事が疑問なのです。

byte 配列で読み込んで
List＜byte＞ に足していき
その List＜byte＞ を圧縮する等の方法で
単体を圧縮するより圧縮率を上げる事が
できそうに思うのです。

上記の方法の場合は
ファイル名や分割する行数を記憶する
テキストファイルを
圧縮ファイルに格納する必要はあります。

少し疑問に思ったため
呟いてみることにしました。

短い記事ですが今回はここまで。
閲覧ありがとうございました。
ラズパイからラズパイへSQliteの定期バックアップ方法 スクリプトコマンドを使用。

## 環境

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/8fe81cc0-f6dd-d81e-8085-abd46c1a9ed7.png)

家の中の無線環境。
今回は
アプリ兼DBサーバ から ファイルサーバへDBのバックアップを行います。


### バックアップするファイル

sqliteはこのdatabase.dbという中に入ってる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/0ad87726-599f-cb6f-d47f-6563f24407f9.png)



## ファイルサーバ側(バックアップデータを受け取る側)の設定
samba設定をする。
これやることでファイル共有できるようになる。

https://qiita.com/SHIJIMI_EN/items/9904ae0f17b5d329f192

ちなみにラズパイファイルサーバの作り方

https://qiita.com/SHIJIMI_EN/items/f57c7a3d705805a6662c

## アプリ兼DBサーバの設定(バックアップするデータがある方)

コンソール画面開いてひらすらコマンド打ってく作業

ファイルサーバー(バックアップ先)への認証情報の設定
```
sudo nano /etc/samba/backup_credentials
```
これ書く
```
username=ここにユーザー名かく
password=ここにパスワードかく
```


バックアップスクリプト作る＆書く
```
sudo nano /home/arisa/backup_sqlite.sh
```

これ書く
```
#!/bin/bash

# SQLiteデータベースの場所
SOURCE_DB="/home/arisa/Videos/database.db"

# 一時マウント先
MOUNT_POINT="/mnt/housework_db_back"

# Samba共有フォルダ
SHARE="//100.64.16.101/raid1"

# 認証情報ファイル
CREDENTIALS="/etc/samba/backup_credentials"

# 日付付きのバックアップファイル名
BACKUP_FILE="database_$(date +'%Y%m%d').db"

# 共有フォルダをマウント
if ! mountpoint -q "$MOUNT_POINT"; then
    sudo mount -t cifs -o credentials=$CREDENTIALS,iocharset=utf8,uid=$(id -u arisa),gid=$(id -g arisa),file_mode=0660,dir_mode=0770 "$SHARE" "$MOUNT_POINT"
fi

# バックアップをサブフォルダにコピー
if [ ! -d "$MOUNT_POINT/housework_db_back" ]; then
    mkdir "$MOUNT_POINT/housework_db_back"
fi

cp "$SOURCE_DB" "$MOUNT_POINT/housework_db_back/$BACKUP_FILE"

# パーミッションの設定
chmod 600 "$MOUNT_POINT/housework_db_back/$BACKUP_FILE"

# マウント解除
sudo umount "$MOUNT_POINT"


```

マウントポイントの作成
```
sudo mkdir -p /mnt/housework_db_back
```
systemdを再読み込み
```
sudo systemctl daemon-reload
```

スクリプトを定期実行するように設定します。
```
crontab -e
```
```
0 0 * * * /home/arisa/backup_sqlite.sh
```

スクリプトに実行権限を付与
```
sudo chmod +x /home/arisa/backup_sqlite.sh
```


スクリプトを手動で実行して動作確認します
```
/home/arisa/backup_sqlite.sh
```

できてるので成功。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/a2d01236-b78a-62f2-b4d0-e1dd79121b81.png)


-------

## cronジョブ（定期実行予定）が入っているか確認
```
crontab -l
```

もしジョブが設定されていない場合は↓
```
no crontab for arisa
```
ジョブ追加
```
crontab -e
```
追加内容
※毎日昼の13時にshファイル実行
```
0 13 * * * /home/arisa/backup_sqlite.sh
```
javascriptでテキストの変更・追加

エンジニア転職目指しているりんころです！今回はJavaScriptでの基本的な構文や、使い方を復習します。

既存の表記を条件によって書き換える場面が多くあります。

（例）ボタンをクリックしたときに、そのボタンのテキストを「送信」から「送信済み」に変更するなど…。

**⭐️こういったテキストの変更・更新をするときは、『textContent』を使うといいんです！**

### **手順**

**①** 変更したいHTML要素を識別します。通常、id 属性や class 属性を使用して識別させます。（つまり変更させたい部分にidやclassづけする）

**②** 要素の取得: JavaScriptを使って、特定の要素（idかclass）を取得します。これには、document.getElementById() や document.querySelector() メソッドを使用します。

**③** textContent プロパティを使用して、テキスト内容を変更します。

```html
<p id="idA"> Hello! </P>

<script>
document.querySelector('#idA').textContent = "Good Morning!";
</script>
```

以上の例のように、id=”idA”の要素内のテキストをdocument.querySelectorで取得して、textContent で上書きします。

## innerHTMLとどう違う？

よくHTMLのテキストを扱うもので、innerHTMLがありますが、違いがわからんかったので調べてみました。

ざっくりいうとこんな感じです…

### innerHTMLは、要素に含まれるすべてのテキストを扱う（htmlタグも含む!!）

です！

実例

```html
<p id="idA"> Hello! </P>

<script>
  const text =document.querySelector('#idA');
  console.log("text.innerHTML=${text.innerHTML}");
  console.log("text.textContent=${text.textContent}");
  
  // consoleの出力結果
//text.innerHTML
<p id="idA"> Hello! </P>
  
//text.textContent
 Hello!

</script>
```

この様に、innerHTMLは要素内に含まれるタグも全て取得するので、既存のHTMLのタグに影響を与える可能性があります。テキストだけ変えたければtextContentがベターかもです☺️