OmniAICreator/Qiita-1.07M huggingface dataset:
sh script.sh と bash script.sh では動きが違います

※不正確。コメントみたほうがいいです

# どういうこと
Linux のように bash しかない OS があります。sh コマンドは使えるのですが、 /bin/sh や /usr/bin/sh が /usr/bin/bash へのシンボリックリンクになっていて、プログラムのバイナリは同一なのです。

**バイナリが同一だからといって動きは同じではありません。**

bash の文法には伝統的な sh から相変わらず使えるものと、bash で独自に拡張されたものがあります。bash 拡張は sh という名前で起動されたときには使えないのです。

# bash 拡張構文の例

コマンドの結果をコマンドにリダイレクトする

```bash:bash
bash$ wc <(ls -l)
     15     128     867 /dev/fd/63
```
```sh:sh
sh$ wc <(ls -l)
sh: 1: Syntax error: "(" unexpected
```

標準出力と標準エラー出力を両方パイプでプログラムに流し込む

```bash:bash
bash$ ruby -e 'puts("stdout"); STDERR.puts("stderr")' | wc
stderr
      1       1       7
bash$ ruby -e 'puts("stdout"); STDERR.puts("stderr")' |& wc
      2       2      14```
```
```sh:sh
sh$ ruby -e 'puts("stdout"); STDERR.puts("stderr")' | wc
stderr
      1       1       7
sh$ ruby -e 'puts("stdout"); STDERR.puts("stderr")' |& wc
sh: 2: Syntax error: "&" unexpected
```

FORTRAN みたいな回数指定の for ループ

```bash:bash
$ for ((k=1; k<=10; k++)) ; do echo $k ; done
1
2
3
4
5
6
7
8
9
10
```
```sh:sh
$ for ((k=1; k<=10; k++)) ; do echo $k ; done
sh: 1: Syntax error: Bad for loop variable
```

# bash マニュアルページの記述

このことは bash のマニュアルページの "INVOCATION" の節で、 "sh" という名前で起動されたときには posix モードになる、というふうに説明されています。

https://www.man7.org/linux/man-pages/man1/bash.1.html#INVOCATION

> __If bash is invoked with the name sh__, it tries to mimic the
> startup behavior of historical versions of sh as closely as
> possible, while conforming to the POSIX standard as well.  When
> invoked as an interactive login shell, or a non-interactive shell
> with the --login option, it first attempts to read and execute
> commands from /etc/profile and ~/.profile, in that order. 
> （設定ファイルに関する話が続くので略）
> __When invoked as sh__,
> bash enters __posix mode__ after the startup files are read.

そんで posix mode だと何が変わるという記述は、マニュアルページのあちこちに散りばめられていて、正直拾う気力がありません。マニュアルページの最後に次のウェブを見ろとあるのですが、これはシェル組み込みコマンドの動作変更一覧のようです。

https://tiswww.case.edu/php/chet/bash/POSIX

構文的な差異については、次の POSIX のシェルの規定に書いていない機能はあてにするな、と考えるのがよいでしょう。

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html

# sh という名前で起動されるって何

ところで動作を変える条件、「sh という名前で起動される」というのは何でしょうか。

* コマンドラインから `sh script.sh` のようにスクリプトを起動する場合
* コマンドラインから `sh -c 'commands ...'` のようにコマンドを起動する場合
（上記、sh とあるところは /usr/bin/sh や /bin/sh としても同様）
* スクリプト先頭行に `#!/bin/sh` と書いて実行可能ビットを立ててコマンドとする場合
（/bin/sh の代わりに /usr/bin/sh などとしても同様）

## せっかくだからbashのソースコードを追う

bash は C 言語で書かれていますから容易に読むことができます。
main 関数は shell.c にあって、main 関数の引数 argv のうちコマンド名にあたる argv[0] が set_shell_name 関数に渡されます。

https://github.com/bminor/bash/blob/4b0f8ba28449c60d6b3436d0c98b14e016b232c2/shell.c#L1793

その中では base_pathname 関数によって「最後のスラッシュ以下のファイル名」が抜き出されて、それが "sh" であれば act_like_sh フラグが立てられます。

```c:bash shell.c
static void
set_shell_name (argv0)
     char *argv0;
{
  /* Here's a hack.  If the name of this shell is "sh", then don't do
     any startup files; just try to be more like /bin/sh. */
  shell_name = argv0 ? base_pathname (argv0) : PROGRAM;

  if (argv0 && *argv0 == '-')
    {
      if (*shell_name == '-')
	shell_name++;
      login_shell = 1;
    }

  if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
    act_like_sh++;
```
Macをかったからおすすめのアプリを５つ紹介してみた。

<h1><a href="hhttps://apps.apple.com/jp/app/hand-mirror/id1502839586?mt=12">HandMirror</a></h1>
オンライン面接などでどう映ってるか確認したい時に使える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1223603/bec9d81d-34de-3b56-079e-7680ad5cbf66.png)
<h1><a href="https://rectangleapp.com">Rectangle</a></h1>
winodowsでいう　windowsキー　+ 矢印キーでウィンドウ操作をする動作をホットキーでやろうぜってアプリ。

![スクリーンショット 2024-01-10 23.26.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1223603/608abe04-ffcb-3d42-bbca-ace3f08cc7a2.png)
<h1><a href="https://apps.apple.com/jp/app/hiddenme/id467040476">HiddenMe</a></h1>
一時的にデスクトプを非表示にしてくれるアプリ。画面共有したときデスクトップにえっちな画像があったとしてもこれがあればバレることはない。テレワーク必須のアプリじゃないだろうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1223603/428f7ba1-3fb2-44d9-cb43-e14d23603ae7.png)

<h1><a href="https://cheatsheet-mac.en.softonic.com/mac">cheatsheet</a></h1>

結構有名かもしれないが⌘キーを長押しするとそのアプリのショートカットキーを教えてくれる。
僕みたいなお猿さんにはかなり重宝するアプリ。
他の人が詳しく買いてくれてるのでこれをみてくれ↓
<a>https://yama-mac.com/cheatsheet/</a>

<h1><a href="https://www.raycast.com">Raycast</a></h1>
ランチャーアプリ。簡単にいうと有名なAlfredみたいなやつ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1223603/4439e0a1-209d-58a8-10f6-a2193167e624.png)
option + spaceキーで起動してアプリ名いれると開いてくれるアプリ。
電卓としても使える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1223603/36d9ac67-5b48-537d-f896-56174bafcfaa.png)
クリップボードの履歴を残してくれるのでこの機能もかなり便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1223603/34222089-bfc4-5294-d4c0-ce33c5e2efe6.png)
:pig:
詳しく買いてくれてる人がいたのでこちらをみてくれ↓
<a>https://qiita.com/kabechiyo13/items/544edf52f7281bf325e0</a>

よかったらいいねしてね。
Bandlab by cakewalkを立ち上げてすぐオーディオデバイスの確認中(WDM Kernel Streaming)とでて落ちる場合の対策

# こんなのが出て落ちる場合

![973167306_Screenshot2.jpg.23ac2e93cb9f873867d8be6a5083c33f.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354194/79336007-e5ce-bc58-9db7-1e1e1c0042d9.jpeg)

# 手順に従ってクリーンインストールする
https://help.cakewalk.com/hc/en-us/articles/360034066393-Clean-Install-Cakewalk-by-BandLaba

- cakewalkをアンインストール
- `Win+R`からレジストリエディタを`regedit `で起動
- バックアップとる
- こいつらを消す
  - HKEY_CURRENT_USER\Software\Cakewalk Music Software
  - HKEY_LOCAL_MACHINE\Software\Cakewalk Music Software
  - HKEY_LOCAL_MACHINE\Software\Wow6432Node\Cakewalk Music Software

-　隠しフォルダを表示する設定にする
- `win+R`から`%appdata%`に移動、`AppData\Roaming`にある`cakewalk`ディレクトリを削除

- リンク先にあるexeから再インストール

# 参考
https://egg.5ch.net/test/read.cgi/dtm/1623310772/420-426
https://discuss.cakewalk.com/index.php?/topic/40674-cakewalk-now-starts-up-then-dies/
https://help.cakewalk.com/hc/en-us/articles/360034066393-Clean-Install-Cakewalk-by-BandLaba
[Python] matplotlibでグラフ描画時に日本語のラベル名が文字化けする際の対処方法

## 環境
- MacOS
- Python 3.10

## 問題点
- matplotlibを使ってグラフ化した時に日本語を使うと文字化けする

```python
import matplotlib.pyplot as plt

fruits = {'りんご': 10, 'もも': 20, 'スイカ': 14}
key = list(fruits.keys())
val = list(fruits.values())

plt.bar(key, val)
plt.title('果物の収穫量')

plt.show()
```

![mojibake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728622/730d48dd-c07c-9bc4-10f4-c4a393462a3f.png)


## 対処方法

- matplotlibの日本語パッケージをインストールする

```terminal
pip install japanize_matplotlib
```


```python
import matplotlib.pyplot as plt
import japanize_matplotlib # 追加

fruits = {'りんご': 10, 'もも': 20, 'スイカ': 14}
key = list(fruits.keys())
val = list(fruits.values())

plt.bar(key, val)
plt.title('果物の収穫量')

plt.show()
```

![no_mojibake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728622/a5fc3b00-ca6a-d228-1722-fcfe6d38c9ce.png)

**解決！**

以上
自己署名証明書を作成してパワーシェルスクリプトに著名する手順

自己署名証明書を作成して、PowerShellスクリプト（xxx.ps1ファイル）に署名する手順は以下の通りです。

1. **自己署名証明書の作成:**
   ```powershell
   $cert = New-SelfSignedCertificate -DnsName "YourCertificateName" -CertStoreLocation Cert:\CurrentUser\My
   ```

   このコマンドで、"YourCertificateName"に適切な名前を指定して自己署名証明書が作成されます。

2. **証明書情報の確認:**
   ```powershell
   $cert | Format-List
   ```

   これにより、作成した証明書の詳細情報が表示されます。CertのThumbprintをメモしておいてください。

3. **PowerShellスクリプトに署名:**
   ```powershell
   Set-AuthenticodeSignature -FilePath "Path\To\Your\xxx.ps1" -Certificate $cert -TimestampServer http://timestamp.digicert.com
   ```

   上記のコマンドで、`"Path\To\Your\xxx.ps1"`には署名を付けたいPowerShellスクリプトのパスを指定します。自己署名証明書が選択され、タイムスタンプサーバーが指定されています。

これで、PowerShellスクリプトに自己署名が付きます。なお、この方法は開発環境やテスト環境での使用向けであり、本番環境では信頼できるサードパーティ製の証明書を検討することが推奨されます。
【React】アプリ100本ノックやってみた 001 Hello World

## はじめに

Reactでアプリを作る経験を積みたいと思っていたところ、以下の記事を見つけました。

https://qiita.com/Sicut_study/items/3c5cd798313854a471a0

せっかくなので、できる限り挑戦していきたいと思います。

:::note info
ルール・問題・達成条件は上記の記事から引用します。
:::

## Reactアプリ100本ノックルール

> React、TypeScriptを使用する
> その他のツール・ライブラリの使用は自由

## 001.Hello World

### 問題

> "Hello World" React コンポーネントの作成

### 達成条件

> 1. Reactの新しいプロジェクトが正しくセットアップされていること。
> 2. 画面に"Hello World"というテキストが中央に表示されていること。

## 解いてみた

### 完成品

![スクリーンショット 2024-01-09 21.57.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911578/e7f8ba80-dc27-99fa-c063-4a0b6d545b7f.png)

https://wsigma21.github.io/react-100-knock-001/

### ソースコード

https://github.com/wsigma21/react-100-knock-001

### 利用技術

- React
- TypeScript
- Vite
- Emotion
- GitHub Actions

解答時間：3時間程度

### 感想

課題の内容自体は簡単だったため、Emotionの使用とGitHub Actionsでのデプロイに挑戦しました。
Emotionがなかなか効かず、解答時間の98%はそれに費やしました。。

Emotionの件については別途まとめました。

https://qiita.com/wsigma21/items/be58590731b8b063db08

## おわりに

不定期ですが今後も少しずつ100本ノックに挑戦していきたいと思います。

## 参考

### Emotion

https://emotion.sh/docs/introduction

https://emotion.sh/docs/typescript

### Vite

https://ja.vitejs.dev/guide/

https://ja.vitejs.dev/guide/static-deploy.html

https://github.com/vitejs/vite-plugin-react-swc
【UWP】MediaCompositionを使った動画出力に関するTips


## 出力動画のフレームレート制限や画面サイズの指定

EncodingProfileを変更することで指定できます。

```csharp

// MediaCompositionを作成
MediaComposition mc = GenerateVideoAsync();

MediaEncodingProfile GetMediaEncodingProfile(MediaComposition mc)
{
    var profile = mc.CreateDefaultEncodingProfile();
    // フレームレートを24fpsに指定
    profile.Video.FrameRate.Numerator = 24;
    profile.Video.FrameRate.Denominator = 1;

    // 動画サイズを指定
    // 指定しないとMediaClipで指定された
    profile.Video.Width = (uint)OutputVideoCanvasSize.Width;
    profile.Video.Height = (uint)OutputVideoCanvasSize.Height;        
    return profile;
}

// 
var profile = GetMediaEncodingProfile(mc);

// ファイルに保存する場合
mc.RenderToFileAsync(file, MediaTrimmingPreference, profile);            

// アプリ内で利用する場合
var mss = mc.GenerateMediaStreamSource(profile);            
PreviewVideoSource = MediaSource.CreateFromMediaStreamSource(mss);
```

https://learn.microsoft.com/ja-jp/uwp/api/windows.media.mediaproperties.videoencodingproperties.framerate?view=winrt-22621


## テキストを描き込んだCanvasRenderTargetを生成する

（CanvasTextFormat を引数で受け取るようにしても可）

```csharp
static CanvasRenderTarget GenerateTimeBitmap(string text, int fontSize, int canvasWidth, CanvasDevice? canvasDevice = null)
{
    canvasDevice ??= CanvasDevice.GetSharedDevice();
    var format = new CanvasTextFormat()
    {
        FontSize = fontSize,
        HorizontalAlignment = CanvasHorizontalAlignment.Left,
    };
    using var textLayout = new CanvasTextLayout(canvasDevice, text, format, canvasWidth, fontSize + 4);
    var crt = new CanvasRenderTarget(canvasDevice, (float)textLayout.LayoutBoundsIncludingTrailingWhitespace.Width, (float)textLayout.LayoutBoundsIncludingTrailingWhitespace.Height, 96);
    using (var ds = crt.CreateDrawingSession())
    {
        ds.Clear(Colors.Black);
        ds.DrawTextLayout(textLayout, 0, 0f, Colors.White);
    }
    return crt;
}
```

## フレームレート指定時にテキストのフレームが飛ぶ問題への対応

MediaOverlay.Delayを指定しても、フレームとフレームの境界上に描画される場合に意図せずフレームスキップが生じる可能性があります。

フレームスキップを回避するには、MediaOverlay.Delay の設定を調整することで対応します。１フレーム内の真ん中 に描画サンプル地点？をズラすことで１フレーム毎に１つのMediaOverlayを表示する動画を生成できます。

```csharp

bool isFirstFrame = true;
TimeSpan oneFrameTime = TimeSpan.FromSeconds(1d / 24);
TimeSpan halfOneFrameTime =  oneFrameTime * 0.5f;
TimeSpan currentTime = TimeSpan.Zero;
foreach (var timeClip in timeClips)
{
    mediaOverlayLayer.Overlays.Add(
        new MediaOverlay(timeClip, position, 1.0) 
        { 
            Delay = currentTime + (isFirstFrame  ? TimeSpan.Zero : - halfOneFrameTime) 
        });
    isFirstFrame = false;
    currentTime += timeClip.OriginalDuration;
}
```
実務で使うショートカット集

|意味|Windows|Mac|使用場面|
|--|--|--|--|
|コピー|ctrl + C|command + C|長い文章、コードの複製など|
|ペースト|ctrl + V|command + V|コピーや切り取りをしたものを貼り付ける|
|全選択|ctrl + A|command + A|文章全体をスクロールせずにコピーするとき|
|切り取り（削除＆コピー）|ctrl + X|command + X|文章の位置を変更したい時|
|保存|ctrl + S|command + S|こまめに記述したコードや文をファイルで保存|
|操作を戻す|ctrl + Z|command + Z|書いてる途中でやっぱ違うってなったとき|
|操作を進める|ctrl + Y|command + Y|↑のやつで戻しすぎた時|
|スクリーンショット|ctrl + shift + S|command + shift + F3|操作画面等を共有、保存したい時|
|VScodeをターミナルから起動|code|code|ターミナルで作業ディレクトリに入って起動|
|画面ロック|Windows + L|command + ctrl + Q|離席時|
【Electron + Vite + Vue】音楽再生アプリ「Muwviz」を作成しました


## はじめに

ビジュアライザーを眺めながら音楽を聴けるアプリが欲しいなと思い、
Electron、バックエンド／フロントエンドの勉強を兼ねて作成してみました。

音楽を耳と目で楽しめるアプリ『Muwviz』です。

<img align=left width="160px" alt="ロゴ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370744/2f669688-1608-3520-5666-c14d0f3593d5.png" />

![muwviz_screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370744/8a10334e-4621-7685-f345-22e148b9488d.png)

## 成果物

- リポジトリ（GitHub）

https://github.com/antimacho612/Muwviz

- ダウンロード（GitHub Releases）

お使いのPCに合った最新版のインストーラをダウンロードし、インストールしてください。

https://github.com/antimacho612/Muwviz/releases

## 機能・特徴

- PC内の音楽ファイル（`.aac`, `.mp3`, `.ogg`, `.wav`, `.flac`, `.webm`, `.m4a`）を再生します
  - シャッフル再生（アーティスト単位、アルバム単位など）
  - リピート再生（全曲、一曲）
- 楽曲再生時、リアルタイムで楽曲を解析し、ビジュアライザーを表示します
- ビジュアライザーのカスタマイズが可能です
- ビジュアライザーの設定をプリセットとして保存できます
- 音楽ファイルに登録されている詳細情報・歌詞（メタデータ）を参照できます
- 外観（テーマ、メインカラー、フォント）のカスタマイズが可能です
- 楽曲のリアルタイム検索（曲名、アーティスト名、アルバム名）が可能です

使い方としては、一般的な音楽再生アプリと同様で、PC内にある音楽ファイルをアプリに読み込ませる（スキャンさせる）ことでライブラリに追加され、以降、再生や検索、詳細情報の確認ができるようになります。

ビジュアライザーの表示には、`audiomotion-analyzer` ライブラリを使用させていただきました。

https://audiomotion.dev/#/

## 使用技術・ライブラリ

- ネイティブアプリ化
  - `Electron`（`electron-vite`）
    - メインプロセス／レンダラープロセス両方のホットリロードに対応
- バックエンド（メインプロセス）
  - `Node.js`
  - `TypeScript`
  - `music-metadata`
    - 音楽ファイルからメタデータを取得するために使用
  - `jimp`
    - アートワークを保存するために使用
- フロントエンド（レンダラープロセス）
  - `Vite`（`electron-vite`）
  - `Vue3`, `TypeScript`, `Sass`
    - ニューモーフィズムデザインを採用
    - 必要なコンポーネント数があまり多くないことと、デザインを統一させるために、UIフレームワークは使用せずほぼ自作
  - `audiomotion-analyzer`
    - リアルタイムスペクトラムアナライザー
    - ビジュアライザーの表示に使用
  - `waveform-data`
    - 再生中の楽曲の波形データを取得するために使用
  - `d3`
    - waveform-dataで取得した波形データを描写するために使用（画面下部）
- その他
  - `electron-log`
    - ロガー, メインプロセス／レンダラープロセス共通で使用
  - `electron-updater`
    - 自動アップデートに対応するため使用

## 最後に

最後まで読んでいただきありがとうございます。
今後余裕があれば、具体的な実装についての記事も書こうかと思っています。

もし興味があれば、ダウンロードお願いします！
※フィードバックいただけると大変うれしいです！
Stringのnull、空文字チェックにはStringUtilsのメソッドを使おう！

# はじめに
こんにちは。なっしーです！
前回に引き続き、Java（Apache、Spring環境）のtipsを紹介しようと思います！

前回はこちら↓

https://qiita.com/nashi-nashi/items/e1b0b7cf6d8934857950

# 想定読者層
前回と同じく若手向けの記事です。
Javaでの業務ロジックや個人開発などでコードを書き始めた人を想定しています。

# 忙しい人向け結論
- Stringのnull、空文字チェックにはStringUtilsのメソッド（isEmpty()、isBlank()）を使おう！
- StringUtilsには他にも便利なString用のメソッドがあるよ！
- Apache版とSpring版で同じメソッドとかがあるけど機能が違うよ！
    - Spring版StringUtils.isEmpty()は非推奨になったよ！

# 本編
今回は主に**Apache**版の`StringUtils.isEmpty()`と`StringUtils.isBlank()`について解説します。

皆さんはString型の文字列のnullチェックや空文字チェックはどう書いていますか？
`null`やら`""`やら`" "`やら考えないといけないことが多くて大変ですよね。
それらの条件を何個も書かなきゃ…そんな苦労から解放するメソッドが`StringUtils.isEmpty()`と`StringUtils.isBlank()`です。

実際に文字列のnullチェックを行う様子がこちら↓
```Java
String hoge = "";

if (StringUtils.isEmpty(hoge)) {
    // hogeは""で空なのでtrue
}
```

# Apache版StringUtils.isEmpty()
StringUtils.isEmpty()は`null`と`""`の場合のみ**true**を返します。
`" "`（半角スペース）は**false**を返します。当然`"Apple"`や`" Apple "`も**false**です。

# Apache版StringUtils.isBlank()
一方、StringUtils.isBlank()は`null`と`""`、`" "`（半角スペース）のすべてに**true**を返します。
StringUtils.isEmpty()と同じく、`"Apple"`や`" Apple "`は**false**です。

# Apache版とSpring版の違い
前回のCollectionUtilsと同じく、StringUtilsはApache版とSpring版がありますが、Spring版StringUtilsにはisBlank()がありません。

また、StringUtilsで提供されているメソッドの品数と内容も大きく異なります。

今回取り上げたisEmpty()、isBlank()を使う際は、Apache版を推奨します。
Spring版StringUtils.isEmpty()は非推奨のメソッドになっています。

# StringUtilsには他にも便利なメソッドが！
StringUtilsにはisEmpty()、isBlank()だけでなく、他にも便利な文字列操作用のメソッドがたくさん存在します。
詳しくは公式ドキュメントをチェックしてみてください！

Apache版StringUtils

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html
互联网ユーザーに人気の9つのツールを推薦します

1. Google Chrome：Google Chrome は非常に人気のあるウェブブラウザで、高速、安全、ユーザーフレンドリーな特徴があります。多様な拡張機能とプラグインをサポートし、カスタマイズされたオンライン体験を提供します。プライバシー保護機能（インコグニートウィンドウなど）とGoogleアカウントとのシームレスな同期機能も備えています。

2. **Dropbox**：Dropbox はクラウドストレージサービスで、ドキュメント、写真、その他のファイルを保存し、複数のデバイス間で同期できます。ファイル共有と協力機能もサポートし、チームワークとリモートワークをより便利にします。

3. **Slack**：Slack はプロフェッショナルなチームコミュニケーションツールで、リアルタイムメッセージング、ファイル共有、協力機能を提供します。会話の整理、他のアプリケーションとの統合、検索機能により、チームの効率を向上させます。

4. **Zoom**：Zoom はビデオ会議ソフトウェアで、リモートワーク、オンライン教育、バーチャル会議に広く使用されています。高品質のビデオ・オーディオ通話、画面共有、録画、リアルタイム字幕などの機能をサポートしています。

5. **Trello**：Trello はカードベースのプロジェクト管理ツールで、個人やチームのタスク管理に適しています。視覚的な看板とカードを使用して、タスクの整理、期限の設定、協力が容易になります。

6. **Evernote**：Evernote は強力なノートアプリで、テキスト、画像、オーディオなど、多様な形式のノートをサポートしています。強力な検索機能とタグシステムにより、資料の整理と検索が簡単になります。

7. **Flowlist**：Flowlist.jp はシンプルなアウトラインノートツールで、迅速に思考を構造化するのに役立ちます。特にモバイル端末で非常に使いやすく、アウトラインノートの内容をワンクリックで思考マップに変換し、簡単にエクスポートや共有ができます。

8. **LastPass**：LastPass はパスワードマネージャーで、ユーザーのすべてのパスワードを安全に保存・管理できます。また、強力なパスワードを生成し、アカウントのセキュリティを向上させることができます。

9. **Canva**：Canva はグラフィックデザインツールで、デザインの専門家でなくても利用できます。多くのテンプレートとデザイン要素を提供し、ユーザーが素早く美しいグラフィック、プレゼンテーション、ソーシャルメディアの投稿を作成するのに役立ちます
Jestで効率化する: it.eachを使った異なるデータセットでのテスト実行方法

# はじめに
この記事では、Jestを使用して異なるテストデータで同じ内容のテストを行う際に`it.each`を用いる方法について紹介します。`it.each`に関する詳細は、[公式ドキュメント](https://jestjs.io/ja/docs/api#testeachtablename-fn-timeout)を参照してください。

https://jestjs.io/ja/docs/api#testeachtablename-fn-timeout

# 動作環境
使用したNode.jsのバージョン:
```shell
node -v        
v18.12.1
```

# `each`関数の活用
`each`関数を使用することで、異なるテストデータに対して同じテストを効率的に実行できます。これにより、コードの重複を減らすことが可能です。

## テスト対象の関数
以下の関数に対するテストコードを作成します。
```typescript:sum.ts
export function sum(a: number, b: number): number {
  return a + b;
}
```

## `each`関数を使用しない場合
`each`関数を使用しない場合のテストコードは以下のようになります。
```typescript:sum.test.ts
import { sum } from "./sum";

it("1と2を足すと3になる", () => {
  expect(sum(1, 2)).toBe(3);
});

it("1と-10を足すと-9になる", () => {
  expect(sum(1, -10)).toBe(-9);
});
```

## `each`関数を使用する場合
`each`関数を使用すると、テストコードは以下のようにシンプルになります。
```typescript:sum.test.ts
it.each`
  a    | b    | expected
  ${1} | ${2} | ${3}
  ${1} | ${-10} | ${-9}
`("$aと$bを足すと$expectedになる", ({ a, b, expected }) => {
  expect(sum(a, b)).toBe(expected);
});
```

実行結果:
```shell
npm test src/section2/sum.test.ts

> jest-lesson@1.0.0 test
> jest src/section2/sum.test.ts

 PASS  src/section2/sum.test.ts
  ✓ 1と2を足すと3になる (2 ms)
  ✓ 1と-10を足すと-9になる (1 ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.466 s, estimated 2 s
Ran all test suites matching /src\/section2\/sum.test.ts/i.
```

`each`関数を使用することで、定義したパラメータごとに独立したテストケースを実行でき、テストケース名にそれらの変数を含めることが可能です。
mindの研究 その70 一文字置換

# 概要
mindが、謎なので調べてみた。
練習問題やってみた。

# 練習問題
mindで、一文字置換を実装せよ。

# サンプルコード

```



一文字置換とは
　文字列１は　文字列
　数１は　変数
　数２は　変数
　数３は　変数
　変換後は　文字列実体
　変換後を　クリア
　数２に　入れ
　数１に　入れ
　文字列１に　入れ
　ここから
　　文字列１から　一文字切り出し　数３に　入れる
　　もし　数３が　０に　等しい
　　ならば
　　　打切り
　　つぎに
　　もし　数３が　数１に　等しい
　　ならば
　　　数２を　変換後に　一文字追加し
　　さもなければ
　　　数３を　変換後に　一文字追加し
　　つぎに
　繰り返す
　変換後を　返すこと
。

メインとは
　「abc def ghi」をつみ
　' 'をつみ
　','をつみ
　一文字置換し　一行表示する
。



```

# 実行結果

```
>tika0
abc,def,ghi

```


以上。
ジェネレーティブAIのリスク管理：デジタル時代の不確実性をナビゲートする

本記事は、[Entrepreneur](https://www.entrepreneur.com/en-in/technology/managing-the-risks-of-generative-ai-navigating-the/467998)により翻訳された記事です。
![QQ20231222112008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298092/033919e6-8175-701e-09d2-2ccfd527a5b9.png)


進化し続けるテクノロジーの中で、ジェネレーティブAIは革新の道標として立ち、様々な分野で前例のない進歩を約束します。コンテンツを生成し、人間の行動を模倣し、創造的なプロセスを促進するその能力は、コンテンツ制作、デザイン、カスタマーサービスなどの業界に革命をもたらしました。私たちは、ジェネレーティブAIが持つ変革の力をよく知っています。しかし、不確実性があらゆるところに潜むこのデジタル時代においては、ジェネレーティブAIに関連するリスクを管理することが最も重要である。

## リスクを理解する
ジェネレーティブAIに関連する重大なリスクのひとつは、誤報やフェイクコンテンツを生み出す可能性です。AIアルゴリズムは強力ですが、完璧ではありません。不注意に誤った情報や誤解を招く情報を生成し、風評被害や信頼の失墜につながる可能性があります。さらに、AIが生成するコンテンツの倫理的な意味合いは、データのプライバシー、同意、偏見に関する問題を提起し、慎重な検討が求められています。

## 倫理的懸念への対応
ジェネレーティブAIを取り巻く倫理的懸念は、今に始まったことではありません。CIOやマーケティングの責任者にとって、組織内に強固な倫理的枠組みを確立することは必須である。これには、コンテンツ生成に関する厳格なガイドラインの導入、AIプロセスの透明性の確保、アルゴリズムの偏りを緩和するための積極的な取り組みなどが含まれます。倫理的なアプローチを育成することで、組織の評判を守り、利害関係者の信頼を維持することができます。

## データのセキュリティとプライバシー
ジェネレーティブAIが効果的に機能するためには、膨大な量のデータに大きく依存します。この依存性は、データ・セキュリティとプライバシー侵害に関する懸念を引き起こします。組織のデータの管理者として、CIOが厳格なセキュリティ対策を実施することは極めて重要である。暗号化、安全なデータ保管、定期的なセキュリティ監査は、機密情報が悪用されるのを防ぐために不可欠です。

## 規制コンプライアンス
AI技術を取り巻く規制環境は絶えず進化しています。既存の規制に準拠し、将来の変化を予測することは極めて重要です。組織は、ジェネレーティブAIの利用が法的要件に合致していることを確認するために、テクノロジー法を専門とする法律専門家と連携する必要があります。規制を理解し遵守することに積極的になることで、将来的に法的な複雑さから組織を守ることができます。

## 人間の監視の役割
ジェネレーティブAIは強力なツールではありますが、単独で運用すべきではありません。人間の監視が不可欠です。コンテンツ制作者やマーケティングチームは、AIが生成したコンテンツを監視し、検証する仕組みを確立しなければなりません。人間の専門家は、AIが見逃してしまうようなニュアンスや文脈、感情的なニュアンスを見分けることができます。人間の判断とAIの能力を統合することで、企業は生成されるコンテンツの質を高めると同時に、誤った情報に関連するリスクを最小限に抑えることができます。

## 結論
ジェネレーティブAIは諸刃の剣である。業界に革命をもたらす可能性は否定できませんが、そのリスクも無視できません。これらの不確実性を効果的に回避することは、CIOとコンテンツ制作者の責任です。倫理的な慣行を受け入れ、データセキュリティを優先し、規制遵守を徹底し、人間の監視を統合しなければなりません。そうすることで、組織は潜在的な落とし穴から身を守りつつ、ジェネレーティブAIの力を活用することができます。情報に基づいた意思決定と責任ある実践は、組織を保護するだけでなく、より倫理的で安全なデジタルの未来の形成にも貢献します。

以上、ジェネレーティブAIのリスク管理について紹介しました。今流行っているAIトレンドに関心を持つ方に、AI技術で画像の[背景削除](https://bgremover.vanceai.com/ja/)に務めるBGremoverを試すことをおすすめします。
TCPDFにフォントをインストールしてPDFを生成する方法

TCPDFはPDF（帳票）を生成するための無料PHPライブラリです。
TCPDFにフォントを追加する方法を紹介したいと思います。

# 1. フォントをダウンロードする
以下のリンクを使って「meiryo」ってフォントをダウンロードする。
https://japanesefonts.org/download/meiryo

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427598/bc4fbcd3-36c7-8f37-af03-3944f9770939.png)

# 2. フォントファイルをTTF形式に変換する
TCPDFはTTF形式のフォントをTCPDFで使用できる形式に変換して使います。このためTTF形式のフォントを用意する必要があります。

ダウンロードしたフォントを以下のリンクにアップロードする
https://transfonter.org/ttc-unpack

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427598/cdd67573-dbc5-cac4-68ff-d4828e69c003.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427598/dda3a831-c609-0872-5024-e249f77179ae.png)

# 3. フォントをTCPDFにインストール
tcpdf/tools/
ここにttfフォントを移動させておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427598/9647d3db-148c-66a5-3780-0fd49f8c71a3.png)

ターミナルで以下のコマンドを実行します。
 ```bash
 php tcpdf_addfont.php -i meiryo02.ttf
 ```

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427598/d7eed0f5-8fed-4d3e-9f80-b0a2424d051c.png)

 成功するとfontsフォルダにファイルが作成されます。
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427598/22b9a2a8-51f7-d5dd-fcac-a3d6209f01e6.png)

PHPプログラムの中で, 作成されたファイル名を設定します。
 ```php
$pdf->SetFont('meiryo02', ”, 10);
 ```
[例えシリーズ]構造体とは家であり、ポインタとは住所である

# はじめに
本当にシリーズ化するかは分からないですが、ひらめいたときに書いていきたいのでシリーズと銘打っておきます。

C言語における躓きやすい概念として、
・構造体
・ポインタ
がよく挙げられる(し、自分も躓いた)ので、
それをなにかわかりやすそうなものに例えようとしました。

前提として、配列や簡単な関数の書き方など、
構造体・ポインタ以外の概念に関しては
ほんのり理解していることとします。




# 構造体
「磯野くんの家」というと何を想像するだろうか。家ということは、
・家賃
・築年数
みたいなデータが存在するだろう。

勘のいい人は
・サザエ
・カツオ
・ワカメ
が暮らしていることも想像できるかもしれない。


C言語における配列の扱いでは、「ある1つの配列には同じ型のデータしか入れられない」
家に住んでいる人の数も、その名前であるサザエもカツオもみんな同じ家に゙関係するデータなのに、
isonoke[]のような配列ではまとめられないのだ。

これらを関連付けられる機能が「構造体」であり、この場合、以下のように宣言と代入ができる。


```c:
//構造体の宣言
struct House{
    int rent; //家賃
    int age; //築年数
    char member[20]; //住人の名前
}

//代入
House isonoHouse;
isonoHouse.rent = 200000; //適当な数字
isonoHouse.age = 55;
strcpy(isonoHouse.member , "Sazae,Katsuo,Wakame");
```

これで、型の異なる int,char[] をひとまとまりのデータとして扱えるようになった。


# ポインタは住所
「磯野くんの家」には、もちろんだが住所が存在する。
もしかしたら家を建て替えて
`isonoHouse.age = 0;`
になるかもしれないし、

磯野くんたちが退去して野比家が越してくる
`char nobiFamily[20] = "Nobita,Doraemon";`
`strcpy(isonoHouse.member, nobiFamily);`
かもしれない

でもこの家が建っている住所は変わらない。
住所を示しているのがポインタで

`House* isonoAddress = &isonoHouse;`

と書き、このとき上でした代入(建て替え、引っ越し)は

`isonoAddress->age = 0;`
`strcpy(isonoAddress->member, nobiFamily);`

のように書くことができる。


## なぜポインタが必要になるのか

例えば「家の建て替え」をrebuildという関数にして、
フグ田家が家を建て替えたときも`rebuild(fugutaHouse)`のような書き方をしたいと考えたとする。


```c:
void main(){
    //isonoHouse, fugutaHouseの宣言は省略
    rebuild(isonoHouse);
    rebuild(fugutaHouse);
}

//家の築年数に0を代入する
void rebuild(struct House house){
    house.age = 0;
}
```

でもこれはうまくいかない。
直感的ではないかもしれないが、これは
どこか近くの空き地に磯野君の家とそっくりな家(house)が建ち、
そこを建て替えた(house.age = 0)だけになってしまう。

「"この住所"の家を建て替えました」と行政に届け出を出さないといけない。

正しくは
```c:
void main(){
    //isonoHouseの宣言は省略
    House* isonoAddress = &isonoHouse;
    rebuild(isonoAddress);
    rebuild(fugutaHouse);
}

//この住所の家を建てかえた
void rebuild(struct House* address){
    address->age = 0;
}

```

このようにすると、磯野家もフグ田家も新築になる。
要は、別の関数の中で引数に入れた値を書き換えたい時にポインタが必要になる。



# 違法建築
少し突っ込んだ話なので理解できなくても構わない。

C言語に慣れている人はこう感じたかもしれない。
「member、20文字で大丈夫か？」と。

本当は磯野家にはもっと人がいるので、例えば

```c:
//isonoHouseの宣言は省略
_house* isonoAddress = &isonoHouse;
char isonoFamily[50] = "Sazae,Katsuo,Wakame,Namihei,Fune,Masuo,Tara,Tama";

strcpy(isonoAddress->member, isonoFamily);
```

みたいな書き方ができる。
オイオイmemberは20字の文字列じゃないのか？と思うかもしれないが、ここで示している

`isonoAddress->member`

はあくまで磯野くんの家のカツオの部屋、くらいの意味しか持っていない。
ただの住所の延長なのだ。

`strcpy(isonoAddress->member,isonoFamily);`

は、この部屋にisonoFamilyが全員来たということを示すのみであって、C言語の行政は間抜けなのでハンコを押してしまう。

結果どうなるかと言うと、部屋をはみ出た波平、フネ、マスオ、タラ、タマが伊佐坂先生の家にお邪魔することになって、伊佐坂先生の家の家賃や築年数がすごい値になってしまう。
迷惑な家族だ。





# おわりに
「違法建築」によるエラーは残念なことにコンパイルが通ってしまう上に、心当たりがないとデバッガで見つけるのがかなり大変なので、
おかしいと思った時に文字列まわりを一度疑ってみると、6時間費やしてようやく文字列が1文字はみ出してるミスに気付く……みたいな悲しい出来事を減らせます。

ふと思い立って書いたものの、これが分かりやすいのかどうか自分には判断がつきません。
間違いなど気付かれましたらご指摘いただけると嬉しいです。よろしくお願いします。
Figma Educationの申込方法

# Figmaアカウントの作成
 [Figmaの登録方法](https://scrapbox.io/hyouhyan/Figmaの登録方法)を参照

# 学割申請
[Figma Education公式ページ](https://www.figma.com/ja/education/)にアクセス

「認定資格を受ける」をクリック
[![Image from Gyazo](https://i.gyazo.com/dee0b57abc4ca711aa01f01a7fa9a181.png)](https://gyazo.com/dee0b57abc4ca711aa01f01a7fa9a181)

必要事項を入力  
大学名は**英語**で入力してください
[![Image from Gyazo](https://i.gyazo.com/e81f5249d666a8cae36065f5b63c9779.png)](https://gyazo.com/e81f5249d666a8cae36065f5b63c9779)

完了です
[![Image from Gyazo](https://i.gyazo.com/9e75d8564d059090b19f2c47714e4731.png)](https://gyazo.com/9e75d8564d059090b19f2c47714e4731)

# チームに学割プランを適用
学割プランを適用するチームを選んでください  
選ぶ必要がなければバツで閉じましょう  
学割プランをチームに適用した場合、**チームメンバー全員が学割申請**をする必要があります  
[![Image from Gyazo](https://i.gyazo.com/11384cb182364796afd2b4fb7975b120.png)](https://gyazo.com/11384cb182364796afd2b4fb7975b120)

チェックをつけて、完了ボタンをクリック
[![Image from Gyazo](https://i.gyazo.com/ad5e90c8f196ce7fdc27a73ed02ace3a.png)](https://gyazo.com/ad5e90c8f196ce7fdc27a73ed02ace3a)
GitHub Educationの申込方法

# はじめに
この記事の手順はMacユーザー向けのものです。  
WindowsやLinuxをご利用の方は、頑張ってください。

# 登録手順
## メールアドレスの追加
大学メアド以外でGitHubに登録してる人のみ  
GitHubアカウントに大学のメールアドレスを追加する
[プロフィール設定ページ](https://github.com/settings/emails)
[![Image from Gyazo](https://i.gyazo.com/f0fc403a738f1c2da5396187d4e81003.png)](https://gyazo.com/f0fc403a738f1c2da5396187d4e81003)

## GitHubEducationを申し込む
### 位置情報を有効にする
大学に居るよってことを証明する必要があります  
自宅からでも申し込めますが、審査が長引く可能性があります
1. Macのシステム設定を開く
[![Image from Gyazo](https://i.gyazo.com/dcef62ef25cfb47e1a523532e9253bef.png)](https://gyazo.com/dcef62ef25cfb47e1a523532e9253bef)
2. プライバシーとセキュリティ>位置情報サービス を開く
[![Image from Gyazo](https://i.gyazo.com/210212d1eb65b78185f63b38432d5b3b.png)](https://gyazo.com/210212d1eb65b78185f63b38432d5b3b)
3. 自分が使ってるブラウザをオンにする
[![Image from Gyazo](https://i.gyazo.com/9162aae9b7be15c827d88ea565e5db12.png)](https://gyazo.com/9162aae9b7be15c827d88ea565e5db12)

### 申請する
[申請ページ](https://education.github.com/discount_requests/application)にアクセス
[![Image from Gyazo](https://i.gyazo.com/d05d3f8fb51ef44df749d89dda1e1484.jpg)](https://gyazo.com/d05d3f8fb51ef44df749d89dda1e1484)

**MacBookのカメラ**で学生証の写真を撮る  
スマホで撮った写真だと**弾かれる**ことがあります  
[![Image from Gyazo](https://i.gyazo.com/3bea97e462d6920a6e6fee99374c167f.png)](https://gyazo.com/3bea97e462d6920a6e6fee99374c167f)  

後は待ちです  
**1~2日**で審査が通ります  
[![Image from Gyazo](https://i.gyazo.com/91b96df3e4dd07a96e2741832d3343bd.png)](https://gyazo.com/91b96df3e4dd07a96e2741832d3343bd)

申請が通ると、自分のプロフィールに**Proバッジ**が付きます  
申請が通っても通知は来ないので自分で確認しましょう  
[![Image from Gyazo](https://i.gyazo.com/4cc3abfb8d076a68a8c0c698277eb9e0.png)](https://gyazo.com/4cc3abfb8d076a68a8c0c698277eb9e0)
【ServiceNow】ダッシュボード・レポート機能を使ってみた

2024年最初の投稿はServiceNowのダッシュボード・レポート機能について触れてみようと思います！
ServiceNowの本機能では何ができるかお客様に聞かれることもあるかと思いますので、ざっくり「こんな事ができます！」と説明できるよう役立ててもらえればと思います。

![ダッシュボード画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/2ff7ab55-07b1-8551-50a4-4808ae923f00.png)

# 目次
- [**ダッシュボード機能とは**](#ダッシュボード機能とは)
　　
- [**レポート機能とは**](#レポート機能とは)
　　
- [**レポートの作成方法**](#レポートの作成方法)
　　
## ダッシュボード機能とは
ダッシュボードは、定期的に使用されるビジュアル化されたレポートをドラッグ＆ドロップで１つの場所に集めるためのキャンパスです。
複数のビジュアライゼーション（レポート）でアプリケーションダッシュボードをデザインし、ユーザーに意義のある情報を整理して伝えることができます。
共有範囲はユーザー/グループ/ロール指定で設定可能です。

![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/4b10046a-0514-4629-f161-20a496644520.png)
　　

:::note info
**※補足**
ダッシュボードでよく見られる「インシデントの概要」を例に取り上げています。
詳細は公式ドキュメント[[インシデントの概要] ダッシュボード](https://docs.servicenow.com/ja-JP/bundle/vancouver-it-service-management/page/use/dashboards/application-content-packs/incident-overview-dashboard.html)を参照ください。
:::
　　
## レポート機能とは
レポートは、既存テーブル上のデータを整理・要約し、有意義な情報を図表化して可視化するための機能です。
開発者がアプリケーションのレポートを作成するのには、以下のような理由があります。
　・トレンドの特定
　・フィールド値の監視
　・突出したデータを探す
　・作業の追跡
　・進捗状況の確認
 
以下のレポートタイプの中から目的に応じて可視化する形式を選択します。
棒グラフ
データディメンション全体で個々のスコアまたはスコアの集計を比較します。
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/6c00a92d-280f-513f-cb3c-2020c9111e9d.png)

円グラフとドーナツグラフ
円グラフとドーナツグラフには、全体を構成する割合が表示されます。
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/76bae07c-d7a1-6044-7add-5621a4f6425e.png)

時系列
データを経時的に可視化します。
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/693e9a76-66a6-625e-a0ce-90cd35d55ccb.png)

マルチディメンション レポート
複数のディメンションを使用してデータを可視化します。
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/175483d0-6c2a-6622-a9ca-0859cbab768c.png)

スコア
1 つのデータポイントを可視化します。
![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/7f497842-413f-4f75-3769-cc1b75bcff61.png)

その他
選択肢のグラフタイプが他にもあります。
![無題7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/58636af7-aac7-97e8-6577-5bba97cd36e5.png)
![無題8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/53c98f22-3bdb-2171-bb2f-842f3f7e7315.png)

  
:::note info
※参考
各種レポートタイプの詳細説明については、
公式ドキュメント[「レポートの作成」](https://docs.servicenow.com/ja-JP/bundle/tokyo-now-intelligence/page/use/reporting/reference/report-types-creation-details-rd.html)を参照ください。
:::
　　
## レポートの作成方法
レポートはReport Designerを使用してGUIベースで設定可能です。
設定は以下の4つのタブと条件編集画面で構成されます。
　・データ：レポートのデータソース(作成元となるテーブル)を選択
 
　・タイプ：棒グラフ、円グラフ、ヒストグラムなどのレポートの視覚化の種類を選択
 
　・構成：レポートタイプに基づくレポート構成を設定
 
　・スタイル：レポートの外観を設定

![無題9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/56cf8b16-a5ac-669a-1f84-00a122182724.png)

ソートやフィルター条件も設定できます。
![無題10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840666/c69d8abb-712e-ff57-c66e-beaae655d17c.png)

　　
　　
### 最後に・・・
今回はITSMのインシデント管理の例に挙げて試してみましたが、HRSD等でも利用されることが多いです。
＜例＞
・社内申請件数の合計や推移
・承認されるまでの平均時間　etc...
週次報告や月次報告資料を作成するのに是非とも役立ててください。:+1::+1:
アスクルのサイトの購入履歴取得〜スクレイピング〜

前回、アスクルの購入履歴をCSVに保存するため、まず該当ページのhtmlをローカルに保存するコードについて紹介しました。

https://qiita.com/tkedjp/items/da8b9fa6a128168fa0ae

今回は、保存したhtmlから情報をCSVに書き込むコードの投稿となります。

```scraping.py

import os
from glob import glob

from bs4 import BeautifulSoup
import pandas as pd

#htmlファイルを読み込み、スクレイピングするため、まずhtmlファイルのあるディレクトリパスを取得する
html_path = os.path.join(os.path.dirname(
    os.path.abspath(__file__)), 'html', '*')

list = []

#htmlファイルをforループで回し、スクレイピングする
for path in glob(html_path):
    with open(path, 'r') as f:
        html = f.read()

    soup = BeautifulSoup(html, 'lxml')

    order_tags = soup.select('div.view2_order_history div.view2_record')

    for order_tag in order_tags:
        #注文日の取得
        order_day = order_tag.select_one('div.view2_record_head_box > p > span').text
        #合計価格の取得
        #total_price = order_tag.select_one('div.view2_tooltip_status_2 > p').text
        
        product_tags = order_tag.select('div.view2_record_detail')

        for product_tag in product_tags:
            name_tags = product_tag.select('h3 > a')
            #品名の取得
            for name_tag in name_tags:
                name = name_tag.text

            #価格の取得
            price = product_tag.select_one('td.money > span').text
            #数量の取得
            quantity_tags = product_tag.select('#qtyTd > span')
            for quantity_tag in quantity_tags:
                quantity = quantity_tag.text

            #小計の取得
            subtotal_tags = product_tag.select('#intaxSubttlAmntTd > span')
            for subtotal_tag in subtotal_tags:
                subtotal = subtotal_tag.text

            list.append({             
                '注文日': order_day,
                # '合計価格': total_price,
                '品名': name,
                '価格': price,
                '数量': quantity,
                '小計(税込)': subtotal,
                })  
            print(list[-1])

#作成した辞書をデータフレームにする
df = pd.DataFrame(list)
#重複する行を削除
new_df = df.drop_duplicates()
#注文日の列を降順でソート
df_sorted = new_df.sort_values('注文日', ascending=False)
#最後にCSV出力
df_sorted.to_csv('list.csv', index=False, encoding='utf-8-sig')
```

これで情報を取得できました。以下は、取得したCSVファイルのスクリーンショットです。
![CSVファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586165/8ba26f5f-9063-7798-f094-585477a7429e.png)


#### 参考サイト
https://solution.soloel.com/buyer/view/a010/DAA01010.html
GitHubのプルリクの通知をDiscordのチャンネルに送信する方法

# Discordにプルリクの通知を飛ばす
[![Image from Gyazo](https://i.gyazo.com/b77e2c76a1da22989dc21a3bbab99cdd.png)](https://gyazo.com/b77e2c76a1da22989dc21a3bbab99cdd)
こんな感じ

# Discord Webhook URLの作成
## チャンネルの作成&編集
プルリクエストの通知を飛ばしたいチャンネルを作成。  
チャンネルの編集をクリック。
![SCR-20240111-qhsu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685958/659d36aa-b26c-a3c3-c680-f0193db30808.png)


## 連携サービスの設定
画面左の「連携サービス」クリック。  
画面右「ウェブフックを作成」をクリック。
![SCR-20240111-qhzq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685958/6e06bfec-cd76-32d7-2026-d8ef6738fbe0.png)
「ウェブフックを作成」をクリック。
![SCR-20240111-qifd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685958/b3e7aaf3-c814-d81d-78a4-a5e30283dcfd.png)

## urlの発行とコピー
botが作成されるので、「ウェブフックURLをコピー」をクリック。  
botの名前はなんでもいいです。  
![SCR-20240111-qiia.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685958/f55c9f4b-5dcc-6faa-8bf1-221012b6a17e.png)

# GitHubリポジトリ側の設定

## リポジトリのsettingsにアクセス
github.comでリポジトリを開いて、画面上部の「Settings」をクリックしてください。
[![Image from Gyazo](https://i.gyazo.com/b6dfdce568da207f30089220c1b63c4b.png)](https://gyazo.com/b6dfdce568da207f30089220c1b63c4b)

## Webhook設定にアクセス
画面左側のメニューから「Webhooks」をクリックしてください。
[![Image from Gyazo](https://i.gyazo.com/9e79f7158fe94275e24db0fc12580bc9.png)](https://gyazo.com/9e79f7158fe94275e24db0fc12580bc9)

## Webhookの追加
画面右上の「Add webhook」をクリックしてください。
[![Image from Gyazo](https://i.gyazo.com/54f3532091f80dec7325acae9bf3c3b2.png)](https://gyazo.com/54f3532091f80dec7325acae9bf3c3b2)

## Webhookの設定
Payload URLに先程コピーしたDiscord Webhook URLを貼り付けます。  
Content typeは「application/json」を選択、少し下のWhich~~は「Let me select individual events.」を選択してください。
[![Image from Gyazo](https://i.gyazo.com/36ab350404c75d41878a306bbafc00c2.png)](https://gyazo.com/36ab350404c75d41878a306bbafc00c2)

チェックボックスがたくさん出てきますが「Pull requests」**のみ**を選択してください。  
デフォルトでPushにチェックが入っていますが、外してください。
[![Image from Gyazo](https://i.gyazo.com/77ad6f3e6fed1319c05dfee9b848dad0.png)](https://gyazo.com/77ad6f3e6fed1319c05dfee9b848dad0)

最後に一番下の「Active」にチェックを入れ、「Add webhook」をクリックします。
[![Image from Gyazo](https://i.gyazo.com/061e7bfa12507954cce15cc0967a7d2a.png)](https://gyazo.com/061e7bfa12507954cce15cc0967a7d2a)

以上
ProcessingのPoint命令の色

# はじめに
　Processingで1ピクセル描画するのにstrokeとpointを使う際の、色の問題について解決方法をいくつか紹介します。

# 環境
Processing 4
MacOSX
Win11

# 問題点　「色が想定と違う」
以下のように、点を描画すると、想定した白色にならない。
255になって欲しいが、181になる。なぜ？
```java
background(0);
stroke(255);
point(50,50);
print(red(get(50,50)));
```
```
181.0
```

# 解決方法１「noSmoothを使う」
ベタ塗りのみ有効。
半透明(RGBA)を使う場合はおかしくなる。
```java
background(0);
noSmooth();
stroke(255);
point(50,50);
```

# 解決方法２「点描画モードを変更する」

https://processing.org/reference/point_.html
strokeCap(PROJECT)で、円ではなく、正方形になる。
```java
background(0);
strokeCap(PROJECT);
stroke(255);
point(50,50);
```


# 解決方法３「set()を使う」

```java
background(0);
set(50,50,#FFFFFFFF);
```
もしくは
```java
background(0);
set(50,50,color(255));
```

# 解決方法４「square()を使う」

```java
background(0);
fill(255);
noStroke();
square(50, 50, 1);
```

# 解決方法５「pixels[]」を使う
読みにいが最速。
```java
background(0);
loadPixels();
pixels[50+50*width] = color(255);
updatePixels();
```

# 描画速度を比較する

```java:No1
size(1920, 1080);
background(0);
noSmooth();
int t = millis();
for (int y=0; y<height; y++) {
  for (int x=0; x<width; x++) {
    stroke(x, y, 255);
    point(x, y);
  }
}
print(millis()-t);
```

```java:No5
size(1920, 1080);
background(0);
int t = millis();
loadPixels();
for (int y=0; y<height; y++) {
  for (int x=0; x<width; x++) {
    pixels[x+y*width] = color(x,y,255);
  }
}
updatePixels();
print(millis()-t);
```


| 方法 | 時間 |
|:-----------|------------:|
|noSmooth|690ms|
|strokeCap|300ms|
|set|40ms|
|square|420ms|
|pixels[]|30ms|

# 考察
太さ100の点を描画する。

```java
strokeWeight(100);
background(0);
stroke(255);
point(50,50);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/693a51ee-ec33-4d37-789e-7e8bbe45d09d.png)
100 * 100の黒背景に、半径50の円が描かれる。
面積を考えて、
50 * 50 * PI : 100 * 100
= PI : 4
= 64 * PI : 256
= 201 : 256
ここで、181が登場すると嬉しいのだが、201となった。

さらに、以下のような点の太さを変更しながら、描画色を確認するプログラムを実行する。
```java
for (float f=0.9; f<1.4; f+=0.025) {
  strokeWeight(f);
  background(0);
  stroke(255);
  point(50, 50);
  println(f,red(get(50, 50)));
}
```
```
0.9 146.0
0.92499995 155.0
0.9499999 163.0
0.9749999 172.0
0.9999999 181.0
1.0249999 189.0
1.0499998 198.0
1.0749998 205.0
1.0999998 212.0
1.1249998 219.0
1.1499997 226.0
1.1749997 232.0
1.1999997 237.0
1.2249997 243.0
1.2499996 247.0
1.2749996 249.0
1.2999996 251.0
1.3249996 252.0
1.3499995 254.0
1.3749995 255.0
1.3999995 255.0
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/497c04ee-3396-36a8-77e3-fbc1c56f33ac.png)
ここでは、1.375以上であれば、白色になることがわかるが、頭の中の想定では√2=1.414であってほしかった。
試しに以下のように半ピクセルずらしてみたけど、何も変わらなかった。
```java
background(0);
stroke(255);
point(50.5,50.5);
print(red(get(50,50)));
```
【Swift】条件分岐について（if文）

今回は、ifについて学習したので、アウトプットしていきます
※以下の内容は、学習内容のアウトプット用のため、誤りがある場合があります。予めご了承ください

# 条件分岐
プログラムは、条件が真（true）か偽（false）で処理を分岐させて処理を行います。
その確認方法として制御文が提供されています。
今日はその制御文の中でも一番代表的なif文について内容を纏めました。

# if文
```swift:title.swift

if "条件" {
   "条件が合致した時に実行されるコード"
}

```
評価はBool値で評価されます。

* 条件が真(true)の時は、{ }ブロック内のコードが実行される。
* 条件が真(false)の時は、{ }ブロック内のコードは実行されない。

### サンプル
下記に簡単な例を用いてコードを紹介します。

```swift:title.swift
let number: Int = 15

if number >= 10 {
   print("値は１０以上です。")
}

```

# else節
真（true）の場合のみの処理を実装してましたが、更にelseを付与することによって、偽（false）の処理も追加することができるようになります。
if文が成立しなかった時に何らかの処理を行いたい場合は、else節で処理を行えます。

```swift:title.swift

if "条件" {
   "条件が合致した時に実行されるコード"
} else {
   "上の条件で合致しなかった時に実行されるコード"
}

```

### サンプル
下記に簡単な例を用いてコードを紹介します。

```swift:title.swift
let country: String = "Japan"

if country == "Japan" {
   print("この国は日本です")
} else {
   print("この国は日本ではないです")
}
```


# if else節
if else節は上から順番に条件が一致するか確認します。
いずれの条件も一致しなければ、elseブロックのコードが実行されます。

```swift:title.swift
if "条件"　 {
  "条件が合致した時に実行されるコード"
} else if "条件"　{
  "この条件で合致した時に実行されるコード"
} else if "条件" {
  "この条件で合致した時に実行されるコード"
} else {
  "どの条件にも合わなかった時に、ブロック内の処理が実行されるコード"
}
```

### サンプル
下記に簡単な例を用いてコードを紹介します。

```swift:title.swift
var score: Int = 80

if score == 　100 {
  print("大変良くできました。")
} else if  score >= 80 {
  print("良くできました。")
} else if  score >= 60 {
  print("もう少し")
} else { 
  print("頑張りましょう")
}
```

# まとめ
今回は条件分岐の制御構文の中でも、基本中の基本であるif文について纏めさせて頂きました。基本であるが故にしっかりとマスターしておく必要がありますね。
次回は他の制御構文でswitch文についてご紹介させて頂きます。
batファイル名をコマンド（exe）名にしてはいけない

## どういうことか
例えば、以下のようなバッチファイルがあったとき、
同じ処理がひたすら繰り返されることになります。

※exp.batの中で、exp.exeを実行するバッチです。
~~~exp.bat
exp system/password
exit
~~~

## こんな感じになる
「exp」がexp.batの「exp」と解釈されるようで、
こんな感じでひたすら繰り返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658170/42d92e5c-4f28-811d-901e-e8cd7bab6345.png)
Multi-Head Attention と Multi-Query Attention と Grouped-Query Attention

## Multi-Head Attention は性能がいいけど、遅い。

一時期流行った Bert から、現在流行っている ChatGPT のような大規模言語モデルまで、最近のモデルには Transformer という機構が利用されています。
この Transformer には Multi-Head Attention という要素技術が使われています。
ただ、Multi-Head Attention は Key と Value のロードに伴うメモリ帯域幅のオーバーヘッドが大きいという問題がありました。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  Transformer のアーキテクチャ\n(出典：Attention Is All You Need)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/88dd86aa-e302-9946-3b07-4f88b17e0a08.png>
@enduml
```

## Multi-Query Attention は早いけど、品質劣化の可能性がある

そのメモリへのオーバーヘッドを解消するために提案されたのが Multi-Query Attention です。

Multi-Query Attention は単一のキー・バリューヘッドのみを使用することで、デコーダの推論を大幅に高速化します。
しかし、Multi-Query Attention は品質の劣化を招く可能性がありました。
（「Head が複数だと時間かかるけど性能いい。一方、1 個だと早い代わりに性能的には不十分だよね」という話）



## Multi-Head と Multi-Query の中間択：Grouped-Query Attention

Grouped-Query Attention は下図のように、Head のサブグループごとに共有します。
Grouped-Query Attention は、マルチヘッドアテンションに近い品質を実現しつつ、マルチクエリアテンションとほぼ同じ速度で動作するらしいです。
（Multi-Query よりは遅い気もしますが、論文曰く同等らしいです。）

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  各 Attention の概要図\n(出典：GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/18f91711-e96b-76fe-5503-164219fc2c85.png>
@enduml
```
pythonのrequestsライブラリで、x-www-form-urlencodedでpost送信し、タイムアウト時間を設定してみた

# やりたいこと
pythonのrequestsライブラリでpostリクエストを投げたいけど、システムの制限でタイムアウトエラーで処理結果をコントロールしたい

# 前提
・Pythonインストール済み
・requestsライブラリインストール済み
・urllibライブラリインストール済み

# やり方
今回の要件は以下となります

・**x-www-form-urlencoded**形式でpostリクエストを送信する

　⇒headersパラメータに**Content-Type**を設定すべき

・**connect timeout**（相手のサーバーと接続を確立するまでの待ち時間）を3秒、**read timeout**（接続確立後、相手のサーバーからレスポンスが帰ってくるまでの待ち時間）を5秒にする

　⇒このパラメータが必要、timeout=(connect timeout, read timeout)

・相手サーバーからのレスポンス値を、**json**形式で呼び出し元へ返す

コードはこんな感じです～

```ruby:qiita.rb
import requests
import urllib
import json


def post_req(id, password, text, path):
    req = {
        'id': id,
        'pass': password,
        'text': text,
    }
    req = urllib.parse.urlencode(req_data)

    try:
        res = requests.post(path, headers={"Content-Type": "application/x-www-form-urlencoded"}, data=req_data, timeout=(3.0, 5.0))
    except requests.exceptions.Timeout:
        # try exceptでエラー時の処理を記述できる
        print('タイムアウトエラーが発生')
        
    return res.json()
```

# 終わりに
pythonのrequestsライブラリはまたいろんなパラメータ設定があり、より高度なリクエストを投げられそうなので、今後はそれらパラメータを調べてみたいです～

# 参照サイト
https://blog.cosnomi.com/posts/1259/

https://qiita.com/TeruhisaFukumoto/items/0eb3a81e75ff8e029ab1

https://requests.readthedocs.io/en/latest/
データ変更アクションで入力を動的に設定する

2024年1月９日のリリースのAppSheetの新機能のリリースがあったので。

https://www.googlecloudcommunity.com/gc/Release-Notes/January-9-2024/ba-p/696638


>データ変更アクションで入力値を動的に設定できるようになりました

早速ヘルプをもとに試してみる

https://support.google.com/appsheet/answer/13779963

というわけで作ってみたトレーニング記録（簡易）。

![スクリーンショット 2024-01-10 17.38.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/ab82afe3-0f65-c7a2-22a8-f6a69e881eb9.png)

開始時刻と終了時刻を記録、何分間のトレーニングをしたか見られるアプリ。
運動中はカードで表示。

![スクリーンショット 2024-01-10 17.38.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/b97999e7-7bfb-4c63-821e-9de3374378d6.png)

データ変更アクションを使って終了時刻の登録と同時にトレーニング内容を記録してみたり。

![スクリーンショット 2024-01-10 17.39.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/584ad173-b0b5-2704-5c1b-f1e2ba956b93.png)

保存。

![スクリーンショット 2024-01-10 17.39.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/c8f88c48-86b0-a4cc-586c-eefb6de3051d.png)


> 全ユーザーの 25% に導入されました。

というのが理由か、お試し中に機能自体が消えたり戻ったりしていたけど笑
今日は安定しています。

編集フォームを開かないで更新できるのは便利だなあ。
Pythonのリストを使ったzip関数の活用

:::note warn
このページはもう更新しません。最新の情報はここで更新しています。
https://cpudotland.com/posts/python-list-zip
:::

Pythonのリストは、データを効果的に管理し、処理するための重要なデータ構造の一つです。リストを効果的に操作するために、`zip`関数は非常に便利なツールの一つです。この記事では、`python list zip`に焦点を当て、リストと`zip`関数を組み合わせてどのように活用できるかを探ります。

### `zip`関数の基本

`zip`関数は、複数のイテラブル（リスト、タプル、文字列など）をまとめて、要素をペアにして新しいイテラブルを生成します。基本的な構文は以下の通りです。

```python
zipped = zip(iterable1, iterable2, ...)
```

### リストの同時イテレーション

`zip`関数を使うと、複数のリストを同時にイテレートすることができます。これにより、対応する要素同士を簡単に取得できます。

```python
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']

for item1, item2 in zip(list1, list2):
    print(item1, item2)
```

このコードは以下の出力を生成します。

```
1 a
2 b
3 c
```

### 複数のリストを組み合わせる

`zip`関数を使用して、複数のリストを組み合わせて新しいリストを生成することもできます。

```python
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']

zipped_list = list(zip(list1, list2))
print(zipped_list)
```

このコードは以下の出力を生成します。

```
[(1, 'a'), (2, 'b'), (3, 'c')]
```

### リストの分割

逆に、`zip`関数を使ってタプルのリストを分解して、元のリストに戻すことも可能です。

```python
zipped_list = [(1, 'a'), (2, 'b'), (3, 'c')]
list1, list2 = zip(*zipped_list)

print(list(list1))
print(list(list2))
```

このコードは以下の出力を生成します。

```
[1, 2, 3]
['a', 'b', 'c']
```

### まとめ

`python list zip`を使うと、リストを効果的に操作する新しい手法が得られます。`zip`関数は、複数のイテラブルを組み合わせて同時に処理する際に特に有用です。これを活用することで、コードの可読性を向上させ、効率的なプログラミングが可能となります。
simple beam,uniformly distributed load 第6章 はりのたわみと不静定はり 基本例題6.06 P160「材料力学演習(20221021)」をsympyでやってみたい。

# latexで
 ```math
\dfrac{d^{4}y}{dx^{4}}=\dfrac{q}{EI_{z}}
```
 # オリジナル
[基本例題6.06 P160 (pdf)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=165)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
？？？タブレット等で、pdfを開く事ができないかも。？？？　

:::note info
曲げモーメントの式は　[基本例題4.23 P101から](https://qiita.com/mrrclb48z/items/565137273dbbbd702b06#sympy%E3%81%AEbeam%E3%81%A7%E4%BD%9C%E5%9B%B3)
:::

# sympyで
・ver0.1
```python
# ver0.1
# 基本例題6.06 P160
from sympy import *

var('l,EIz,q,vA,x,z,θA,RA',real=True)
repxl={x:l}
repvA={vA:0}
repRA={RA:Rational(1,2)*q*l}
M  =RA*x-Rational(1,2)*q*x**2                                       ;print("# M   =",M)
θ  =θA-integrate(M/EIz,x)                                         ;print("# θ  =",θ)
v  =vA+integrate(θ    ,x)                                         ;print("# v   =",v) 
sol=solve(v.subs(repxl),θA)[0].subs(repvA).subs(repRA).factor()  ;print("# θA =",sol)
# M  = RA*x - q*x**2/2
# θ  = θA - RA*x**2/(2*EIz) + q*x**3/(6*EIz)
# v  = vA + x*θA - RA*x**3/(6*EIz) + q*x**4/(24*EIz)
# θA = l**3*q/(24*EIz)
```

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

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

#### 参考文献

＞等分布荷重を受ける単純支持はり
＞JSME p85
　
＞表5.2 単純支持ばりの公式 2)
＞構造力学公式集 p134
Simply supported beam with moment loads applied at both ends 第6章 はりのたわみと不静定はり 基本例題6.05 P159「材料力学演習(20221021)」をsympyでやってみたい。

# latexで(勉強中)
・[基本事項１（はりのたわみ）p155 (pdf)]( http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=163)より
 ```math
\dfrac{d^{2}y}{dx^{2}}=\dfrac{M}{EI_{z}}
```
 # オリジナル
[基本例題6.05 P159 (pdf)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=164)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
　　　　　　　　？？？タブレット等で、pdfを開く事ができないかも。？？？　
# sympyで
・ver0.1
```python
# ver0.1
# 基本例題6.05 P159
from sympy import *

var('l,EIz,MA,MB,vA,x,z',real=True)
θA = Symbol('θA')
RA  = Symbol('RA')
repxl={x:l}
repvA={vA:0}
repRA={RA:-(MA-MB)/l}
M=RA*x+MA                                                         ;print("# M   =",M)
θ=θA-integrate(M/EIz,x)                                         ;print("# θ  =",θ)
v =vA+integrate(θ    ,x)                                         ;print("# v   =",v) 
sol=solve(v.subs(repxl),θA)[0].subs(repvA).subs(repRA).factor()  ;print("# θA =",sol)
# M   = MA + RA*x
# θ  = θA - MA*x/EIz - RA*x**2/(2*EIz)
# v   = vA + x*θA - MA*x**2/(2*EIz) - RA*x**3/(6*EIz)
# θA = l*(2*MA + MB)/(6*EIz)
```

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



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

#### 参考文献

単純支持はりの支点A,Bに曲げモーメント
JSME p87
　
~~＞単純支持ばり 7)~~
~~＞構造力学公式集 p136~~