OmniAICreator/Qiita-1.07M huggingface dataset:
和積公式「22年 弘前大 人文・教育・医・農 1」をwolframalphaとsympyでやってみたい。

オリジナル
sin 40° − sin 80° + sin 160°
tan40° − 4sin 80° + 4sin 160°

https://kamelink.com/blog/2022/07/30/22%e5%b9%b4-%e5%bc%98%e5%89%8d%e5%a4%a7-%e4%ba%ba%e6%96%87%e3%83%bb%e6%95%99%e8%82%b2%e3%83%bb%e5%8c%bb%e3%83%bb%e8%be%b2-1/

# wolframalphaで
(1)
sin 40° − sin 80° + sin 160°

https://www.wolframalpha.com/input?i=sin+40%C2%B0+%E2%88%92+sin+80%C2%B0+%2B+sin+160%C2%B0

(2)
tan40° − 4sin 80° + 4sin 160°

https://www.wolframalpha.com/input?i=tan40%C2%B0+%E2%88%92+4sin+80%C2%B0+%2B+4sin+160%C2%B0&lang=ja

# sympyで
わかられる方教えてください。よろしくお願いします。

```python
from sympy import *
var('t a b ')
def tand(x):
    return tan(x * pi / 180)
def sind(x):
    return sin(x * pi / 180)
# def cosd(x):
#     return cos(x * pi / 180)
y1=sind(40)-  sind(80)+  sind(160)
y2=tand(40)-4*sind(80)+4*sind(160)
print("#(1)",y1)
print("#(1)",y1.simplify())
print("#(2)",y2)
print("#(2)",y2.simplify())
#(1) -sin(4*pi/9) + sin(pi/9) + sin(2*pi/9)
#(1) -cos(pi/18) + sin(pi/9) + sin(2*pi/9)
#(2) -4*sin(4*pi/9) + tan(2*pi/9) + 4*sin(pi/9)
#(2) -4*cos(pi/18) + tan(2*pi/9) + 4*sin(pi/9)
```

(1)はTR9:Sum of cos or sin terms as a product of cos or sin. 
(2)は数学入試問題様の手順でやってみた。分母y2Uと分子y2Sに分けています。

```python
from sympy import *
from sympy.simplify.fu import TR9
var('x')
y0=sin(x)-sin(x*2)+sin(x*4)
print("#(0)",y0     .subs({x:Rational(40,180)*pi}))
print("#(1)",TR9(y0).subs({x:Rational(40,180)*pi}))
#
y2=tan(x)-4*sin(x*2)+4*sin(x*4)
y2=y2-4*y0
y2U=(y2*cos(x)).expand()
y2S=   cos(x)
#
y2U=TR9(fu(TR9(y2U))-y0)
y2=y2U/y2S
print("#(2)",y2.subs({x:Rational(40,180)*pi}))
#(0) -sin(4*pi/9) + sin(pi/9) + sin(2*pi/9)
#(1) 0
#(2) -sqrt(3)
```

TR9,fuです。

https://docs.sympy.org/dev/modules/simplify/fu.html#sympy.simplify.fu.TR13



# 参考
https://qiita.com/mrrclb48z/items/fa4c295cf877206889e6
三角関数「和積公式と積和公式(Sum-to-product,Product-to-sum)」についてwolframalphaとsympyで調べてみた。

オリジナル
和積公式と積和公式＜

https://ja.m.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0%E3%81%AE%E5%85%AC%E5%BC%8F%E3%81%AE%E4%B8%80%E8%A6%A7#%E5%92%8C%E7%A9%8D%E5%85%AC%E5%BC%8F%E3%81%A8%E7%A9%8D%E5%92%8C%E5%85%AC%E5%BC%8F

Sum-to-product,Product-to-sum ＜

https://en.wikipedia.org/wiki/List_of_trigonometric_identities#Product-to-sum_and_sum-to-product_identities


# wolframalphaで

# sympyで

# 入試問題

https://qiita.com/mrrclb48z/items/da2e7d7adf1cc9d41edf


# 参考

https://docs.sympy.org/dev/modules/simplify/fu.html

https://python.atelierkobato.com/simplify/

https://stackoverflow.com/questions/25355617/sympy-trigonometric-sum-product-identities
python mapを使った置換 pandas

dataframeの値を置換する
sex_dictを作って、置換する組み合わせを作成する。
dataframeの中の性別をmapを使用して文字に置換する。

```python
import pandas as pd

sex_dict = {1:'男',2:'女',3:'出生前',4:'不明'}

df = pd.DataFrame(
    data ={'年齢': [10, 20, 30, 40], 
          '性別': [1, 2, 1, 3],
          '列3': ['a', 'b', 'c', 'd']}
    )

print(df)
#=>
  年齢  性別 列3
0  10   1  a
1  20   2  b
2  30   1  c
3  40   3  d

#map使用
df['性別'] = df['性別'].map(sex_dict)

print(df)
#=>
  年齢   性別 列3
0  10    男  a
1  20    女  b
2  30    男  c
3  40  出生前  d
```

参考：

https://note.nkmk.me/python-pandas-map-replace/

https://www.self-study-blog.com/dokugaku/python-pandas-dataframe-make/
【Xcode】Google-Mobile-Ads-SDK関係でエラー発生

# はじめに
放置してたプロジェクトを久しぶりに開いてみたら`Google-Mobile-Ads-SDK`関係でエラーが出たので解決した方法を紹介します。

# エラー
![スクリーンショット 2022-08-02 19.22.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d09b2df5-2349-a863-f74a-0520b6de2474.png)
![スクリーンショット 2022-08-02 19.25.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/9b8327b3-e67b-ee24-041a-136050258451.png)
```
Command PhaseScriptExecution failed with a nonzero exit code
```
```
rsync error: some files could not be transferred (code 23) at /AppleInternal/Library/BuildRoots/66382bca-8bca-11ec-aade-6613bcf0e2ee/Library/Caches/com.apple.xbs/Sources/rsync/rsync/main.c(996) [sender=2.6.9]
```
# 解決方法
```
cd プロジェクトのパス
pod update
```

# おわり
簡単でよかったです
【CentOS7】SSH公開鍵認証設定/鍵生成〜サーバーへの転送

## 概要
CentOS7でsshを使用するにあたり、鍵の生成〜転送までの流れを記述しました。（学習メモ）
また、ローカルマシンはmacOSを使用しております。

**他記事に関して**
[【ContOS7】SSHのセキュリティ設定/sshd_config](https://qiita.com/MitsukiYamauchi/items/50ef7db5657cd74dc700)
[【CentOS7】SSHのセキュリティ設定/firewall](https://qiita.com/MitsukiYamauchi/items/ca82dc6496bc857b5cb1)

## SSH生成〜サーバーへの転送
**鍵の生成**
`ssh-keygen`を使用して鍵の生成
```shell
ssh-keygen -t rsa
```
**鍵の転送**
.sshディレクトリを作成（サーバー）
```shell
# サーバーにssh接続
ssh {user_name}@{ip_address}

# .ssh作成
mkdir .ssh

# 権限変更
chmod 700 .ssh

# 確認
ls -la
drwx------  2 hoge hoge  4096  8月  2 00:19 .ssh

# logout
exit
```

公開鍵の転送（リモートマシン→サーバー）
`scp`コマンドにて行います。
転送先は先ほど作成した`.ssh`ディレクトリ内
```shell
scp ~/.ssh/{key_name} {user_name}@{ip_address}:~/.ssh/authorized_keys
```

**確認(鍵を使ったサーバーへのログイン)**
```shell
ssh -i ~/.ssh/{key_name} {user_name}@{ip_address}
```
※`-i`は秘密鍵を指定するオプションですが、デフォルトの鍵名の場合、「id_rsa」の場合は省略可

## 関連記事
sshのポート番号の変更など、sshを利用する上で最低限必要なセキュリティ設定に関する記事も作成したので、よかったら参考にしていただけるとありがたいです。
[【ContOS7】SSHのセキュリティ設定/sshd_config](https://qiita.com/MitsukiYamauchi/items/50ef7db5657cd74dc700)
[【CentOS7】SSHのセキュリティ設定/firewall](https://qiita.com/MitsukiYamauchi/items/ca82dc6496bc857b5cb1)
pythonのいろんな書き方 pep8を見て

pep8を見て少しだけ、自分の記述と違うところがあったので書き方を学ぶ。

## 1レベルインデントするごとに、スペースを4つ使いましょう。
これまでは、エディタでenterを押すと勝手に２スペース開けてくれていたが、4スペース入れた方が良い。
少し不思議な感じ

```python
#これまで
def test():
  return 1

#pep8
def test():
    return 1

def test(
        var1,var2
        var3):
    print(11)

def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)
```

## すべての行の長さを、最大79文字までに制限しましょう。
どうしてもif文の条件が多くなってしまうことがありますが、そういった場合には折り返しを行い長くならないように調整。

## 1行にまとめすぎない
多分文法的にどちらも正しいのだろうけど、見やすいのは正しい方かな。
個人開発などで、かっこいい書き方をしてドヤ顔したいのであれば、後者かな。

```python
# 正しい:
if foo == 'blah':
    do_blah_thing()
do_one()
do_two()
do_three()


# やらない方が良い:
if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()
```

## 演算子の場所

gross_wagesの後ろに付けたがりですが、前につけて、段落を揃えた方がわかりやすくなる感じ。
```python
# 正しい:
# 演算子とオペランドを一致させやすい
test = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)
```
## 余計な空白文字を使うのはあかんで。
```python
# 正しい:
spam(ham[1], {eggs: 2})

# 間違い:
spam( ham[ 1 ], { eggs: 2 } )
```




## 代入(や他の)演算子を揃えるために、演算子の周囲に1つ以上のスペースを入れる:
これやってた人結構いるのでは？
見やすくしようという気持ちが逆になる例。
まぁ、結局現場によるが。。。。

```python
# 正しい:
x = 1
y = 2
long_variable = 3

# 間違い:
x             = 1
y             = 2
long_variable = 3
```

## 他色々あるよね
気が向いたら閲覧して、ヘェ〜といっておこう。

参考：
https://pep8-ja.readthedocs.io/ja/latest/

https://qiita.com/simonritchie/items/bb06a7521ae6560738a7
作業時間がうまく算出されない勤務表を修正した

# 問題発覚
何ヶ月か前の話です。
毎月末に提出する勤務表（エクセルファイル）に、「特定条件下で作業時間が正確に算出されない」という問題が見つかりました。
具体的には、作業開始時刻の記入欄に09:00より前の時刻を書いても、09:00から作業を開始したものとして作業時間が計算されてしまっていました。

# 作業時間のセルに書かれていた計算式
作業時間を表示するセルを確認したところ、下記の計算式が書かれていました。
`IF(AND(F16="",G16=""),"",IF(AND(F16<>"",G16=""),7.5-N16,IF(AND(F16="",G16<>""),"開始時刻入力無し",O16-N16)))`

F列が作業開始時刻でG列が作業終了時刻なので、
　①両方とも無記入なら何も表示しない。
　②作業開始時刻だけ書かれているなら、7.5（標準勤務時間が7.5時間ということになっているようです）からN列の値を引き算する。
　③作業終了時刻だけ書かれているなら「開始時刻入力無し」と表示する。
　④両方とも記入済みならO列の値からN列の値を引き算する。
という仕組みのようです。

単純に作業終了時刻から作業開始時刻を引き算するだけで良いだろうに…と思いつつ、隠されていたN列～R列を表示させてみました（上記の計算式を見るまで、隠されている列があることに気づきませんでした）。

# 隠されていた列に用意されていた表
|N列|O列|P列|Q列|R列|
|-|-|-|-|-|
|09:00～開始|09:00～終了||タイムテーブル||
|0.0|7.5||09:00|0.0|
|0.0|7.5||09:30|0.5|
|1.0|8.5||10:00|1.0|
|…|…|…|…|…|

Q列とR列には「タイムテーブル」と名付けられた表が作られていました（範囲選択して右クリックメニューから「名前の定義」を選択することで、セル範囲に名前を付けられるそうです）。
09:00との時間差を0.5時間単位で表示しており、09:00から48:00まで用意されていました。

P列には何も書かれていませんでした。

N列は作業開始時刻と09:00との時間差を、O列は作業終了時刻と09:00との時間差を表示する列のようです。
下記の計算式が書かれていました。
`N列：IF(ISERROR(VLOOKUP(F16,タイムテーブル,2)),0,VLOOKUP(F16,タイムテーブル,2))`
`O列：IF(ISERROR(VLOOKUP(G16,タイムテーブル,2)),0,VLOOKUP(G16,タイムテーブル,2))`
F列やG列に記入された時刻がQ列に存在するか確認し、無ければ0を、あればR列の値を表示する仕組みのようです（ISERRORは指定したデータがエラー値だった場合にTRUEを、そうでない場合にFALSEを返す関数です）。

# 問題解決
つまり、タイムテーブルに09:00以降しか対応表が用意されていないために、09:00より前の時刻を記入すると不具合が起こるようです。
下記の表をタイムテーブルに追加してタイムテーブルのセル範囲を修正したところ、問題なく動くようになりました。
|Q列|R列|
|-|-|
|タイムテーブル||
|08:00|-1.0|
|08:30|-0.5|

さほど難しくない問題だったので助かりましたが、そもそもこのような複雑な処理をわざわざしなくても良いのではないか、と思ってしまいました。
この勤務表を作った人なりに意図があってのことかもしれないので、もし機会があったら教えていただこうかな、と思います。

以上、ご覧いただきありがとうございました。
【Swift】Hashableプロトコルのヘルプドキュメントを読む

# この記事は何？

Swiftプログラミングにおける`Hashable`プロトコルについて、公式のヘルプドキュメントを翻訳および解説します。
参考: [Hashable | Apple Developer Documantation](https://developer.apple.com/documentation/swift/hashable)

# 宣言

```swift
protocol Hashable : Equatable
```

# 概要

`Hashable`プロトコルに適合した型は、セットや辞書のキーとして使用できます。
標準ライブラリの型は、その多くが`Hashable`プロトコルに適合しています。
文字列、整数、浮動小数点数、ブール値、そしてセットもデフォルトでハッシュ化可能です。
オプショナル、配列、範囲などの他のいくつかの型は、実装する型パラメータが適合すると、自動的にハッシュ可能になります。

独自に定義した型もハッシュ化可能です。
例えば、関連値のない列挙型は、定義するだけで自動的に`Hashable`プロトコルに適合します。
また、格納プロパティがすべて`Hashable`な構造体や、関連値がすべて`Hashable`な列挙型については、コンパイラが自動的に`hash(into:)`の実装を提供します。

「値をハッシュする」ことは、その値の本質的な構成要素を`Hasher`型で表されるハッシュ関数に引き渡すことを意味します。
本質的な構成要素とは、その型が「どのように`Equatable`を実装したか」に依存します。
互いに等しいインスタンス同士は同じ順序で、同じ値を`hash(into:)`メソッドの`Hasher`に与える必要があります。

# Hashableプロトコルへの適合

独自に定義した型をセットまたは辞書のキーとして使用するには、その型を`Hashable`プロトコルに適合させます。
`Hashable`プロトコルは`Equatable`を継承しているため、そのプロトコルの要件も満たす必要があります。

元となる型が`Hashable`を採用した上で、以下に挙げる条件を満たしている場合、コンパイラは`Hashable`への適合に必要な実装を自動的に生成します。

* 構造体の場合、すべての格納プロパティが`Hashable`に適合している。
* 列挙型の場合、すべての関連値が`Hashable`に適合している（関連値のない列挙型は宣言なしでも`Hashable`に適合します）。

型の`Hashable`適合性をカスタマイズしたり、上記の基準を満たさない型に`Hashable`を採用したり、既存の型を拡張して`Hashable`に適合させるには、独自に`hash(into:)`メソッドを実装してください。

`hash(into:)`メソッドの実装では、提供されたHasher型インスタンスに対して、カスタム型の重要な構成要素とともに`combine(_:)`メソッドを呼び出します。
`Hashable`および`Equatable`プロトコルのセマンティック要件を確実に満たすために、型の`Equatable`適合性もカスタマイズすることをお勧めします。

例として、ボタンのグリッド位置を記述する`GridPoint`型を考えます。
以下では、最初に`GridPoint`型を宣言します。

```swift
/// x軸とy軸からなる平面座標における点のモデル
struct GridPoint {
    var x: Int
    var y: Int
}
```

次に、ユーザーがタップしたことのある位置を示す「グリッドポイントのセット」を作成します。
`GridPoint`型はまだ`Hashable`プロトコルに適合していないので、セットで使用することはできません。
`Hashable`に適合させるには等価演算子関数`==`を実装してから、`hash(into:)`メソッドも実装してください。

```swift
extension GridPoint: Hashable {
    static func == (lhs: GridPoint, rhs: GridPoint) -> Bool {
        return lhs.x == rhs.x && lhs.y == rhs.y
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(x)
        hasher.combine(y)
    }
}
```

この例の`hash(into:)`メソッドは、提供されたハッシャーに「`x`と`y`のプロパティ」をフィードします。
これらのプロパティは、等価演算子関数`==`で「互いに等しいかどうか」を比較するために使用されるものと同じです。

`GridPoint`が`Hashable`プロトコルに適合できたので、タップされたグリッドポイントのセットを作成できるようになりました。

```swift
var tappedPoints: Set = [GridPoint(x: 2, y: 3), GridPoint(x: 4, y: 1)]
let nextTap = GridPoint(x: 0, y: 1)
if tappedPoints.contains(nextTap) {
    print("Already tapped at (\(nextTap.x), \(nextTap.y)).")
} else {
    tappedPoints.insert(nextTap)
    print("New tap detected at (\(nextTap.x), \(nextTap.y)).")
}
// Prints "New tap detected at (0, 1).")
```
チェックボックスを読み込み動作分岐させてみた

## はじめに
チェックボックスへのクリック動作をキーとして動くマクロの紹介は多々あるが、チェックボックスの状態を基に動作させるようなマクロの紹介が少なかった。
ググりつつ実装したものを振り返りを兼ねて簡易版に編集したうえで紹介していく

## 動作概要
マクロを実行した時点でのチェックボックスの状態(TRUEorFALSE)をによって動作を変える。


チェックが入っているとき(☑)　→「チェック有」とメッセージボックスを出す
チェックが入っていないとき(☐)　→「チェック無」とメッセージボックスを出す


## コード

```
Sub チェックボックス動作分岐()
    
    If Sheets("Sheet1").CheckBox1.Value = True Then
        MsgBox ("チェック有")
    Else
        MsgBox ("チェック無")
    End If
    
End Sub
```


## イメージ

【チェック有　時】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351505/77423440-5150-8675-d399-399a236bf432.png)



【チェック無　時】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351505/96b510ef-384c-1182-f8b8-1e08c9483888.png)


## TIPS
#### チェックボックスの挿入方法
開発タブ<挿入<activeXコントロール<チェック ボックス



#### 複数のチェックボックスについて
「CheckBox(i)」
チェックボックスは増やした分(i)がカウントされ属性(?)として1チェックボックスに1つ付属されるため、チェックボックスごとに識別が可能。
1つ目　→「CheckBox1」
2つ目　→「CheckBox2」
【Django】ページをPDF出力する(オプション)【Python】

# 初めに
※以下の記事の続きです。未読の場合は先に目を通してください。
[【Django】ページをPDF出力する【Python】](https://qiita.com/nagisa_O/items/3eaaa18d68468e8de7e5)

前回、Djangoで作成されたWebアプリケーションのページの最も簡単なpdf出力をまとめました。
今回はpdfkitで指定できるオプションを検証します。

# 環境
|名称  |バージョン  |
|---|---|
|Python  |3.10.4  |
|Django  |4.0.6 |
|pdfkit  |1.0.0 |

# 書式指定
pdfkitのオプションは辞書型のオブジェクトで設定できます。
そして引数の「options」を指定してオブジェクトを渡します。
前回のpdf出力関数にオプション設定部分を追記しました。
```php:views.py
def to_pdf(request):
    url = 'http://127.0.0.1:8000/test_app/'
    options = {
            'page-size': 'A4',
            'margin-top': '50',
            'margin-right': '50',
            'margin-left': '50',
            'margin-bottom': '50',
            'zoom': '1.0',
            'encoding': "UTF-8"
          }
    pdfkit.from_url(url, 'sample.pdf', options=options)
    return redirect('test_app:index')
```
各設定箇所はキー名で直感的にわかると思うので説明は割愛し、実際に設定が効いているかpdfを出力し確認します。
![キャプチャ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225075/da44e29b-51e8-ff72-bd77-9861865df5d9.jpeg)
前回出力時よりmarginが取られているのが確認できました。

# cookie
pdfkitのオプションで「cookie」のキーでセッションID等のcookieでやりとりされる値を受け渡しできます。

pdfkit.from_urlは第一引数で指定されたurlにGETでアクセスするので、セッションIDが受け渡されている確認として、
pdf出力ボタンを押下時の自分のセッションIDと、pdfkitがページをpdf出力するリクエストのセッションIDを出力してみます。

その前に、セッションIDを渡さない状態で一度各々のセッションIDを出力します。
pdf出力関数のpdfkit呼び出し前に自分のセッションIDの出力を追記し、pdf出力対象のページにも同様に出力部分を追記します。
```php:views.py
def to_pdf(request):
    url = 'http://127.0.0.1:8000/test_app/'
    options = {
            'page-size': 'A4',
            'margin-top': '0',
            'margin-right': '0',
            'margin-left': '0',
            'margin-bottom': '0',
            'zoom': '1.0',
            'encoding': "UTF-8",
          }
    print('自分のsessionid: ' + str(request.session.session_key))     #セッションID出力部分
    pdfkit.from_url(url, 'sample.pdf', options=options)
    return redirect('test_app:index')
```
出力結果は以下のようになりました。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225075/bec43d54-e78d-b410-d3e8-fc569bf9a619.jpeg)
ではpdfkitのオプションの「cookie」にセッションIDを設定します。
```php:views.py
def to_pdf(request):
    url = 'http://127.0.0.1:8000/test_app/'
    cookie_list = request.COOKIES
    options = {
            'page-size': 'A4',
            'margin-top': '0',
            'margin-right': '0',
            'margin-left': '0',
            'margin-bottom': '0',
            'zoom': '1.0',
            'encoding': "UTF-8",
            'cookie': [
                ('sessionid', cookie_list['sessionid']),
            ]
          }
    print('自分のsessionid: ' + str(request.session.session_key))
    pdfkit.from_url(url, 'sample.pdf', options=options)
    return redirect('test_app:index')
```
出力結果は以下のようになりました。
![キャプチャ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225075/67857a8b-32c8-9fb3-8ac1-b335f987b90e.jpeg)
pdfkitのリクエストが「cookie」に指定したセッションIDを持っていることを確認できました。

# まとめ
今回はpdfkitの「options」での細かい設定の方法を検証しました。
セッションIDの受け渡しは自分とpdfkitでセッションを利用した値受け渡しに繋がってくるので、それはまた別の記事にまとめます。
SIPについてのメモ

# 用語
UA(User Agent): SIPでは端末のことをこう呼ぶ。
セッション：UAのIPアドレス、RTPで使用するport番号、メディアの符号化方式を纏めたもの
SDP(Session Description Protocol):セッションの記述方法を規定したプロトコル

# SDPの付与箇所
発信側は、SIP INVITEのボディに発呼側UAのSDPを記述して送信する。記載しなくてもよい。
着信側は、200 OKのボディに着信側UAのSDPを記述して送信する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2769525/36221f9f-aed5-86a6-939b-7127dc4ea5b6.png)

# SDPのパラメータ
### m (メディア種別)
``` 
表記例:　m=audio 3000 RTP/AVP 0
```
意味: m=(メディア種別) (受信側ポート番号) (トランスポートプロトコル) (ペイロードタイプ)
ペイロードタイプは、RFC3551に定義されている。
RTP/AVPは、Audio/Video Profile (RFC3551)に従ったRTPを使用することを意味する。

### a (メディア属性)
```
表記例: a=rtpmap:0 PCMU/8000
```
意味: a=rtpmap:(ペイロードタイプ) (符号化方式)/(クロック速度)
属性(attribute)のaと覚えるといい。
[oracle] HMW(ハイウォーターマーク)と実際の使用ブロック数の乖離の確認

HMW(ハイウォーターマーク)と実際の使用ブロック数の乖離を確認しようとして分かったことは、その確認は結構難しいということ。
HMWの確認はuser|all|dba_tablesのblocks, user|all|dba_segmentsのblocksを確認する。
実際の使用ブロック数は、MyOracleSupportに確認方法があるので、それを利用する。
しかし、後者の方は、ROWID数からざっくり実際に使用しているブロック数を確認するという方法となっていて、行連鎖/行移行などの要素が要因で、正確な値は割り出せない。でも、他に使用ブロック数を正確に把握する方法はない。
実際に社内環境で精度を計測してみると、前者と後者の値で、10%程度の誤差があった。
あと、テーブルのカラムにLOBがあると値がだいぶ変わるので注意。

結局、掲題の確認をするには、HWMとしては前者を、実際の使用ブロック数の確認としては後者を確認する必要がある。
ただし、後者の出力結果はざっくりであり、10%程度の差異は普通に発生することを考慮して、余裕を見ておく必要があるのと、前者の確認でも、カラムのデータ型などの影響を受けて微妙な値が出力されることがあるので、xxx_tablesとxxx_segments両方のblocksを取得して、後者と比較する必要がある。

※ナレッジとして残したかったのですが、対応から時間が経ってしまい、あまり有用なナレッジとして残せず申し訳ありません..
サイバーセキュリティお嬢様「クロスサイトスクリプティング？...美味しそうですわぁ！」

# ある日
サイバーセキュリティお嬢様（以下CSお嬢様）「じいや、今回はクロスサイトスクリプティングのお話でしたわよね？」

じいや「その通りですぞお嬢様」

CSお嬢様「なんだか美味しそうなお名前ですわね！」

じいや「お嬢様、」
じいや「クロスサイトスクリ**プディング**ではなく、**クロスサイトスクリプティング**ですぞい」
じいや「昨日のスイーツがチョコレートプディングだったからといって惑わされてはなりませんぞ」

CSお嬢様「まあ、わたくしとしたことがやってしまいましたわー！」
CSお嬢様「とにかく今回も張り切って参りますわよ！！」

# クロスサイトスクリプティングとは
じいや「クロスサイトスクリプティング（Cross Site Scripting）は**XSS**と略されますぞい」

CSお嬢様「Cross Site...なら、**CSS**ではなくって？」

じいや「Webサイトを構成するCSS（Cascading Style Sheets）と紛らわしいのでXSSの略称が使われているのですじゃ」
じいや「それではどういった攻撃なのか、実際に例を出してご説明いたしますぞい」

じいや「例えばお嬢様がよく使う掲示板にこんなフォームがあったとします」

| コメント |
|:-:|
|   |

じいや「まずは普通にコメントした場合↓」
| コメント |
|:-:|
| こんにちは  |

じいや「掲示板には"こんにちは"といったコメントが残されますな」

CSお嬢様「まあ、そうですわね」

じいや「では以下のようなスクリプト（※JavaScriptのコード）を入れたらどうなるでしょうかの？」
| コメント |
|:-:|
| `<script>alert('こんにちは');</script>`  |

CSお嬢様「皆目見当もつきませんわ」

じいや「実際には、ブラウザ上にこんなポップアップが表示されますぞい」
`こんにちは`

じいや「イメージがつかなかったら、"JavaScript alert"とググってみると良いですぞ」

CSお嬢様「でもポップアップが出てくるだけではさして問題なくってよ？」

じいや「今回の例はポップアップを表示させるだけですが」

じいや「例えばこんなシナリオを想定してみましょう↓」

**攻撃者→脆弱性のあるサイト←ユーザ**

じいや「①攻撃者が、脆弱性のあるサイトへスクリプトを仕掛ける」

じいや「②ユーザが、脆弱性のあるサイトへアクセスする」

じいや「③ユーザは脆弱性のあるサイトでログイン情報を入力する」

CSお嬢様「いまいちピンときませんわよ？」

じいや「この脆弱性のあるサイトには、攻撃者によりスクリプトが仕掛けられており、脆弱性のあるサイト（正規のサイト）上に偽のページが表示されているものとしたら...どうですかな？」

CSお嬢様「④ユーザは、正規のサイトのログインボタンを押すと、実際には攻撃者へ情報が送信されてしまうってことなんですわねー！」

じいや「さすがお嬢様、すっかり成長いたしましたな！」

# クロスサイトスクリプティングを防ぐには

じいや「クロスサイトスクリプティングを防ぐには」
じいや「以下のような対策が有効ですぞ」

:::note info
・エスケープ処理を行う
・WAFを導入する
:::

CSお嬢様「エスケープ処理...[SQLインジェクション](https://qiita.com/choco_py3/items/4a597f25f0c3dbbea437)の時にやったようなことですの？」

じいや「概ねその通りで」
じいや「例えばこんな感じ置き換えるのですじゃ↓」
`< → &lt;`
`> → &gt;`

CSお嬢様「じゃあ、さっきの例だとこんな感じになるんですのね？↓」

```javascript:例
&ltscript&gtalert('こんにちは');&lt/script&gt
```
じいや「その通りですじゃ！」

# おわりに
じいや「どうでしたかな」

CSお嬢様「よく分かったわ、ありがとうじいや」

じいや「これからも少しずつセキュリティの知識を身につけて」
じいや「**真のサイバーセキュリティお嬢様**を目指すのですぞ」

CSお嬢様「わたくし頑張りましてよー！」

**--- 第一部　完 ---**

# 参考文献
イラスト図解式　この一冊で全部わかるセキュリティの基本
情報処理教科書　情報処理安全確保支援士 2022年版


### 前回までのあらすじ

[サイバーセキュリティお嬢様「CIAってなんですの？」](https://qiita.com/choco_py3/items/51c04bdc8bfe25fe84f3)
[サイバーセキュリティお嬢様「しんせいせい...ってなんですの？」](https://qiita.com/choco_py3/items/0d05409534f267e40001)
[サイバーセキュリティお嬢様「き...脆弱性ってなんですの？」](https://qiita.com/choco_py3/items/15479e37b011c34abf36)
[サイバーセキュリティお嬢様「マルウェア...？スキーウェアのお仲間ですの？」](https://qiita.com/choco_py3/items/00af04f6906de4135b48)
[サイバーセキュリティお嬢様「クラッカー？何それ食べられますの？」](https://qiita.com/choco_py3/items/40fe5a27af3722daa654)
[サイバーセキュリティお嬢様「ハクティビストってなんですの？」](https://qiita.com/choco_py3/items/262df8fc893cf7fd303f)
[サイバーセキュリティお嬢様「F5攻撃（アタック）ってなんですの？」](https://qiita.com/choco_py3/items/f0164dedc7e4b761b25d)
[サイバーセキュリティお嬢様「SQLいんじぇくしょん...ってなんですの？」](https://qiita.com/choco_py3/items/4a597f25f0c3dbbea437)


# 宣伝
サイバーセキュリティお嬢様シリーズが薄い本になります！（書き下ろしアリ）
[技術書典13](https://techbookfest.org/event/tbf13)にサークル**choco_hack**で頒布予定です。
（※オフライン＋オンライン参加で、オフラインは2022/9/11(SUN)@池袋サンシャインシティ）
ぜひ[Twitter](https://twitter.com/choco_py3)をフォローしてください！
Homebrewでpython3系の最新をインストールする方法

Homebrewでpython3系の最新版をインストールする方法を説明します。

5分もあれば終わる作業でした👍

:::note warn
Homebrewがインストールされていることが前提となります
:::

## そもそもHomebrewとは・・・
Homebrew（ホームブルー）は、macOS（またはLinux）用パッケージマネージャーにです。

インストール方法や、基本的な使い方はこちらに記載していますので、まだインストールしていないという方やどう使うか分からないという方は是非一度ご覧ください！

## Python3系のインストール
当記事の執筆時点で、Python3系の最新版はPython@3.9になりますので、Python@3.9をインストールしていきます。

```bash
% brew search python@3
==> Formulae
boost-python3   python@3.7      python@3.9      bpython         cython
python@3.8      ipython         jython
```

HomebrewでPython@3.9をインストールします。

```bash
% brew install python@3.9
```

これでインストールされたはずです！

## バージョンを確認する

それでは、バージョンを確認してみましょう。

```bash
% python3 -V                
Python 3.9.10
```

Python3.9系が表示されるので、大丈夫そうですね。

上記のバージョン確認したときに、自分が入れたバージョンでない（たとえばPython 3.8系）が表示されたときは、インストールしたバージョンでPath（パス）を通してあげる必要があります！

`export PATH="/usr/local/opt/python@3.9/libexec/bin:$PATH"`

インストールは以上になります！

## ちなみに・・・pipも確認しておこう

pipとは、Pythonのパッケージを管理するためのツールを指します。

これがあることで、コマンド一つで、seleniumだったり、webdriver_managerだったりをインストールできる優れものです。

インストール方法としては、基本的にPythonをインストールした時点で自動的にインストールされます。

では、インストールされているかを確認しましょう！

```bash
% pip3 -V
pip 21.3.1 from /opt/homebrew/lib/python3.9/site-packages/pip (python 3.9)
```
全段でインストールしてPython3.9の配下にpipがインストールされていますね！
雀魂の外部ツールまとめ

:::note warn
利用規約に違反する行為を助長する目的はありません。
:::


# 雀魂牌譜検討サポーター


https://chrome.google.com/webstore/detail/mahjongsoul-review-suppor/kdmfnkdgpialmejpgflfllkjakolamcc


**雀魂牌譜検討サポーター**は、[Chrome](https://chrome.google.com/webstore/detail/mahjongsoul-review-suppor/kdmfnkdgpialmejpgflfllkjakolamcc) と [Edge](https://microsoftedge.microsoft.com/addons/detail/mahjongsoul-review-suppor/jopdfhmfehndjpnjjidmkkmjmkaebodb) の**拡張機能**です。牌譜画面を開いて検討したい局を選ぶと、[**NAGA**](https://naga.dmv.nico/naga_report/top/) や [**mjai-reviewer**](https://mjai.ekyu.moe/ja.html) が解析します。mjai-reviewer は無料で利用できますが、サーバーに大きな負荷が掛かるので、解析の回数をむやみに増やさないようにしましょう。

拡張機能の公開までの過程は、こちらの投稿をご覧ください。


https://qiita.com/Kenta_Kobayashi/items/0bc33cc0d2485f377e46



# majsoul-mods


https://github.com/NeverDecaf/majsoul-mods


**majsoul-mods** は、雀魂のユーザースクリプトの寄せ集めです。[キーボード操作での対戦を可能にするスクリプト](https://github.com/NeverDecaf/majsoul-mods/blob/master/KeyboardControls.js) [^ranked_match] や、[紫色の贈り物以外をまとめて奉納するスクリプト](https://github.com/NeverDecaf/majsoul-mods/blob/master/DonateAllButton.js)があり、どちらも開発者ツールで実行できます。



# majsoul-replay-editor


https://github.com/xiaolan16/majsoul-replay-editor


**majsoul-replay-editor** は、**任意の牌譜を牌譜画面に表示させる**スクリプトです。使用例を挙げるならば、雀魂外での牌譜を雀魂のリッチな UI で再生する、といったところでしょうか。実行するには、[Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja) [^extension] が基本的に必要となります。



# 牌譜屋


https://github.com/SAPikachu/amae-koromo-scripts


[Node.js](https://nodejs.org/ja/) で書かれた、[**牌譜屋**](https://amae-koromo.sapk.ch/)のソースコードです。**ゲームクライアントを起動せずに**雀魂の API を呼び出すことが可能で、牌譜データの取得や解析を行えます。雀魂の API については、こちらの投稿をご覧ください。

https://qiita.com/pearswatchover/items/fa0e70da0527d23eab6d



# 雀魂Plus


:::note alert
**雀魂のアカウントが凍結される可能性が高いため、使用しないでください。**
:::


https://github.com/MajsoulPlus/majsoul-plus


Electron 製の**雀魂専用ブラウザ『雀魂Plus』** です。このブラウザを使用する主な目的は **MOD** だと思われます。というのも、キャラクターの画像を差し替える MOD や、テキストと画像を差し替えて非公式に翻訳する MOD があるためです。

一例として、[majsoul-live2d-mods](https://github.com/giantpand2000/majsoul-live2d-mods) という MOD が適用された雀魂の映像を紹介します。キャラクターの画像が、Live2D のアバターに差し替えられています。


https://youtu.be/2Oxv03ox8tQ



[^ranked_match]: バグが発生しない保証はないため、段位戦での利用を控えるのが無難です。


[^extension]: [FireFox版](https://addons.mozilla.org/ja/firefox/addon/tampermonkey/)、[Edge版](https://microsoftedge.microsoft.com/addons/detail/tampermonkey/iikmkjmpaadaobahmlepeloendndfphd?hl=ja-JP)が公開されています。
Docker：sudoできないDockerコンテナを、rootでシェル操作するには

以下のコマンドでDockerコンテナへ入り、シェル操作を行うとします。
```
# docker exec -it <コンテナ名>
```

例えば、パッケージのインストールを行いたい場合は、 `sudo` コマンドを利用すると思いますが、もし以下のように `sudo` コマンドが実行できない場合、どうしたら良いでしょうか。

```
bash-4.2$ sudo yum update -y unzip 
bash: sudo: command not found
```

## 対応方法

`docker exec` コマンド実行時に、 `-u 0` をオプションに追加します。

```
# docker exec -it -u 0 <コンテナ名>
```

上記コマンドを実行すると、そのコンテナ内をrootユーザーとしてシェル操作が行えるようになります。

```
[root@920db1af3e80 webapps]#
```
JavaScriptとは何か？歴史の勉強備忘録

# はじめに
JavaScriptとは何か？歴史の勉強備忘録

# JavaScriptとは
JavaScriptエンジンによって事前コンパイル無しで実行されるプログラミング言語
コンパイルなしとは機械語に変換しないでJavaScriptエンジンを通して実行される
## JavaScriptエンジンとは

解析→機械語を用意→実行の手順をしている
主なJavaScriptエンジン
・V8
・SpiderMonkey
・JavaScriptCoreなどなど
それぞれのエンジンはブラウザに含まれている

ChromeはV8
FireFoxはSpiderMonkey
EdgeはV8
SafariはJavaScriptCore

## JavaScriptの歴史
|年月 |内容 |
|---|---|
|1995年 |NetscapeがJavaScript(LiveScript)を作成し、<br>Netscape Navigator2に搭載<br>・NNは当時のシェア80％越えのブラウザ<br>・SpiderMonkey<br>・買収やブラウザのオープンソース化を経て、現在のFireFoxに<br>・マーケティング戦略として、SunMicrosystems(現在のOracle)から許可をもらい、JavaScriptに改名<br>JavaとJavaScriptは全く違う言語→よく言われるのはメロンとメロンパンぐらい違う|
|1996年8月|Microsoftが対抗して、JScriptを作成しInternet Explorer3も搭載|
|1996年11月|Netscapeは標準化のためECMAインターナショナルにJavaScriptを提出<br>※ECMA(European Computer Manufacturers Association)|
|1997年6月|ECMAScriptのリリース、ルール決めのため仕様書みたいなもの。<br>JavaScriptの公式名のイメージみたいなもの|
|1998年6月|ECMAScript2をリリース|
|1999年12月|ECMAScript3をリリース|
|2000年上旬|ECMAScript4について議論が始まる|
|2008年7月|ECMAScript4が破棄される|
|2008年9月|GoogleChromeとV8エンジンのリリース今までのエンジンよりパフォーマンスが高いものがリリースされた|
|2009年3月|RyanDahlさんがV8エンジンを利用してNode.jsを作成|
|2009年12月|ECMAScript 5のリリース|
|2015年6月|ECMAScript 2015のリリース|
|2016年6月|ECMAScript 2016のリリース|
|2017年6月|ECMAScript 2017のリリース|
|2018年6月|ECMAScript 2018のリリース|
|2019年6月|ECMAScript 2019のリリース|
|2020年6月|ECMAScript 2020のリリース|
|2021年6月|ECMAScript 2021のリリース|
【Rust × WebAssembly】GitHub Pagesにデプロイする方法

## 背景

RustでWebAssemblyをやってみたいと思い、[こちら](https://rustwasm.github.io/docs/book/introduction.html)を参考に進めていました。

コードが完成して動作も確認できたため、デプロイしようと考えました。

一番手軽そうなGitHub Pagesでデプロイしていこうと思います。


## 環境
```
node: v17.0.1
npm: 8.15.1
```

## 前提

* ローカル上で動作することを確認できている
    * `wasm-pack build`して`npm run start`した時にきちんと動作する状態

* サーバ処理を含んでいない
    * GitHub Pagesなのでフロントエンドのみの処理

* gitを使っており、GitHubにリモートリポジトリを作成済み


## やり方

1. `npm run-script build`してビルドする

1. npmで作った方の`.gitignore`からdistディレクトリを除外しておく

1. mainブランチでコミットする

1. ` git subtree push --prefix www/dist origin gh-pages`コマンドでgh-pagesブランチをpushする
    * ここでは、`www`がnpmプロジェクトディレクトリであるため、各々のプロジェクト名に書き換えが必要
    
1. GitHubの設定画面でPagesの欄からGitHub Pagesを有効にする

以上の作業が終われば無事デプロイできているかと思います。


## おまけ

ビルドしたものがちゃんと動くか確かめたいという時の方法です。
`package.json`に下記を追加してビルドすると、ローカルで動作するかテストできます。
自分の場合は、VSCodeの[LiveServer](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer)で動作確認しました。
```
"homepage":"./",
```
Ruby - ハッシュの初期値を配列にする

```rb
example_hash = Hash.new{|hash, key| hash[key] = []}
```

ハッシュの要素にいきなり配列としてpush出来たりする

```rb
example_hash["foo"].push "bar"

example_hash # => {"foo"=>["bar"]}
```


# 参考

https://simanman.hatenablog.com/entry/2013/09/24/211044


<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ABAPとは

第１回
SAPシステム専用の特殊なプログラミング言語。
ABAPはAdvanced Business Application Programingの略称で、SAPシステムの開発に用いられるSAP専用の言語である。
1979年にSAP社が発売したR/2システムで初めて開発言語として開発された。
それ以降、標準機能はもちろんのこと、アドオン機能もABAPで作成されている。
Add-on、バッチプログラム、業務向けレポート等、SAPのビジネス・アプリケーションを追加開発できる。
ABAP言語は、オブジェクト指向型でCOBOL言語に似ていると言われている。
4GPi+Raspberry PiでSMS発着信

メカトラックス株式会社の@kakuutaです。
今回は、ラズパイ用4G（LTE）通信モジュール[4GPi](https://mechatrax.com/products/4gpi/)+Raspberry PiでSMS発着信を行います。
電源監視モジュール[slee-Pi](https://mechatrax.com/products/slee-pi/)も使うとSMS着信起動ができますが、今回の構成ではSMS着信起動はできません。
SMS着信起動の方法は以下の記事で紹介しております。

https://qiita.com/shikajiro/items/81dbcfbbafe829033ae3

# 用意したもの
・Raspberry Pi 3 Model B 
・[4GPi(ラズパイ用4G（LTE）通信モジュール）](https://mechatrax.com/products/4gpi/)
・[SORACOM IoT SIM](https://soracom.jp/store/13380/)（SMSが利用できるSIM）
・ACアダプタ(Raspberry Pi+4GPiの電力供給用。12V2A。)
・Micro SDカード
・PC（Windows）
・UART-USB変換アダプタ（コンソール接続用）
・携帯電話

# 前準備
Raspberry Piに4GPiをマウントして、インターネットに接続します。
接続方法は以下の記事を参考にしてください。

https://qiita.com/kakuuta/items/2c021b2f65a3748eb36f

# 4GPi+Raspberry PiでSMS着信
4GPi+Raspberry PiでSMS着信を行い、「Hello World」を表示できるか確認します。

1.　まずは4GPi+Raspberry Pi側の電話番号を調べます。
```console
$ sudo mmcli -m 0 | grep Numbers
  Numbers  |                     own:電話番号
```

2.　電話番号がわかったら、携帯電話から4GPi+Raspberry PiへSMS発信行います。
3.　4GPi+Raspberry Pi側で着信できているか確認します。
```console
$ sudo mmcli -m 0 --messaging-list-sms
   /org/freedesktop/ModemManager1/SMS/SMS番号 (received)
```
着信成功していたら、SMSの本文が表示できます。

```console
$ sudo mmcli -s SMS番号
  -----------------------
  General    | dbus path: /org/freedesktop/ModemManager1/SMS/SMS番号
  -----------------------
  Content    |    number: 着信した携帯電話番号
             |      text: Hello World
  -----------------------
  Properties |  pdu type: deliver
             |     state: received
             |   storage: sm
             |      smsc: +XXXXXXXXXXXX
             | timestamp: YYYY-MM-DDThh:mm:ss+09:00
  ```
# 4GPi+Raspberry PiからSMS発信
4GPi+Raspberry PiからSMS発信して、携帯電話に「こんにちは 世界」が着信するか確認します。

1.　送信先の電話番号とSMSの本文を作成します。
　　コマンド実行後、結果が表示されます。
```console
$ sudo mmcli -m 0 --messaging-create-sms="text='こんにちは 世界',number='電話番号'"
Successfully created new SMS: /org/freedesktop/ModemManager1/SMS/SMS番号
```


2.　メッセージを発信します。
```console
$ sudo mmcli -s SMS番号 --send
```

携帯電話に着信しました。
<img width="350" alt="example.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636124/4a2ff8c7-c98e-070e-23a9-32fd7fe4447e.png">

# まとめ
以上、4GPi+Raspberry PiでSMS発着信の手順を紹介しました。
基本的には、mmcliコマンドを駆使すればSMS発着信ができます。※mmcliコマンドの詳細は[こちら](https://www.freedesktop.org/software/ModemManager/man/1.14.0/mmcli.1.html)
死ぬほど難しいMAMP+PHPSTORM+Xdebugの設定方法

#　経緯
二日前まで動いていたXdebugがバグりました。
もともと動いていたと思っていたものがMAMPのphpじゃなくてMac本体のPHPに対してだったのかもしれません。
最近いつもと違うフレームワークのphpを動かすためにmac本体のphpバージョンを上げたので、それが原因の一つかも。

# 私の環境

MAC OS X :BigSur
チップ： Apple M1
PhpStorm 2021.3.3
MAMP 6.4
Xdebug 2.98

バーチャルホストを使用して
http://vhost1.local.com/
http://vhost2.local.com/
http://vhost3.local.com/
というURLでそれぞれ別のフォルダをローカルのドキュメントルートに設定している。

![スクリーンショット 2022-08-02 16.49.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/856d2125-8626-8e3e-dbcc-ddcec57200b5.png)

Apacheの方で動かしてます。

![スクリーンショット 2022-08-02 16.52.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/6310c217-49f1-faa2-dab1-000f26795d1c.png)

![スクリーンショット 2022-08-02 16.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/8ab3059e-a46f-ed80-bdc5-d92311c9ba15.png)


# 設定 php.ini

php.ini でコメントアウトしているところはXdebugのバージョン３以降の設定専用のためバージョン２有効にしてはいけない。
２系と３系では全く違うので注意。
Xdebugのバージョンはphp.iniを見る。この記事のはじめに貼った写真のような項目に書いてある。

バーチャルホストを使っていても、php.iniには書くのはlocalhostと書かなければいけない。
なんでかわからないけど一旦localhostで受けてからそれぞれのvhostへ転送しているイメージ？

xdebug.remote_host=localhost


```
pwd
/Applications/MAMP/bin/php/php7.4.16/conf
```

```php.ini
[OPcache]
;zend_extension="/Applications/MAMP/bin/php/php7.4.16/lib/php/extensions/no-debug-non-zts-20190902/opcache.so"
  opcache.memory_consumption=128
  opcache.interned_strings_buffer=8
  opcache.max_accelerated_files=4000
  opcache.revalidate_freq=60
  opcache.fast_shutdown=1
  opcache.enable_cli=1

[xdebug]
zend_extension="/Applications/MAMP/bin/php/php7.4.16/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so"

;xdebug.remote_enable=1
;xdebug.remote_autostart=1
;xdebug.remote_connect_back=1


xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9003
xdebug.remote_autostart = On
xdebug.mode=debug
xdebug.remote_log=/Applications/MAMP/bin/php/php7.4.16/conf
```

# 設定 PHPStorm

メニュー -> Preference -> PHP -> デバッグ
デバッグポートを上で指定したポートだけにする。
デフォルトだと9000,9003とかになってたりするけど片方消さないと失敗したりする。

![スクリーンショット 2022-08-02 17.04.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/b7a93f9d-453b-d902-ed5a-b923d36219e6.png)

# 設定 PHPSTORM サーバー
メニュー -> Preference -> PHP -> サーバー

名前　＝＞　たぶんなんでも良さそう。
ホスト　=> バーチャルホストのドメイン部分
下の写真のURLにアクセスする場合、
vhost1.local.com
になる。

ということは、バーチャルホストを追加するたびにここは書き足す必要があるらしい。

![スクリーンショット 2022-08-02 17.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/1b84d09b-d04a-f61e-1505-91055339ea6e.png)


![スクリーンショット 2022-08-02 17.24.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/c742ebe3-ced8-657d-1724-a14121a72850.png)


# 設定　PHPSTORM 実行構成

IDEキーでデバッグ接続をフィルターする => オフにしておく。
なんの機能かわからない。解説サイトによっては付けたりするが、私はこれつけると壊れた。
MAMPじゃ無い時につかうやつかも？

![スクリーンショット 2022-08-02 17.10.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/91316495-8044-fc5b-7e90-b079cd9b40c6.png)


# 起動状態
![スクリーンショット 2022-08-02 17.11.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/dff014e9-08d0-3472-1401-e3e754e1562e.png)

再生マークの右隣の亀だか虫だかっぽいアイコンを押すと光るけど、光らせているとXdebugが動かないので写真のようにオフにしておく。
仮想記憶管理

# 仮想記憶
実記憶管理でメモリ空間が細切れになったり、元々大きくて入らなかったりしてプログラムが入らなかった。
それは物理的な制約によって生まれる問題だった。
この問題をなくすために仮想的、論理的なメモリ空間を作って解決する。
プログラムはメモリがたくさんあるように見え主記憶、補助記憶を隠蔽している。

仮想的なメモリ空間が```仮想記憶```
```仮想アドレス(論理アドレス)```で中身を管理する。
物理的なメモリ空間が```実記憶```
```実アドレス（物理アドレス)```で中身を管理します。

## 気づき
メモリを仮想的にするのか。なんかかっこいい。
物理的に無理でも自由になれるのか？

# なんで仮想記憶だと自由なの？
## 物理的な制約
実記憶は使っているうちにフラグメンテーション（断片化）が発生して空き領域を一つにするためにコンパクションをする。

## 仮想記憶
仮想的なので```物理的な問題がなくなる```。
仮想的なメモリは```３２ビットで表せる数の範囲```を仮想アドレス空間として持っている。
そのうちのどれかにプログラムの領域をとる。

それを```実記憶のどのアドレスと対応づけするかは自由```になる。
```実記憶上ではプログラムはバラバラに入っている。```

この```仮想記憶のアドレスの仮想アドレスから実アドレスへの変換処理```は、メモリ変換ユニット(MMU:Memory Management Unit)というハードウェアが担当する。
この仕組みを```動的アドレス変換機構(DAT:Dynamic Address Translator)```と呼ぶ。

## 気づき
仮想にするとプログラムはひとまとめの領域にいるつもりだが実際はバラバラに保存されてるのか。
仮想アドレスと実アドレス紐付けをしているのが動的アドレス機構(DAT)なのか。
主記憶と補助記憶を一体にしているので大体のプログラムは物理的には補助記憶に入っているのか。
それをカーネル（OS)が仮想のメモリを作っているのか。
OS恐るべし。
なんでもOSで自由自在だな。
書き込み速度は下がりそうだな。

# 実記憶の容量よりも大きなサイズを提供する仕組み
実記憶入りきれないサイズのものはどこに入れるか？
プログラムは主記憶と補助記憶を一体にして捉えているのでその場合は補助記憶の方に書き込まれる。

仮想記憶とは```主記憶として使うことのできる見かけ上の容量を拡大させる仕組み```だ。

# ページング方式
仮想アドレス空間を```固定調の領域に区切って管理するページング方式```と、```可変長の領域に区切って管理するセグメント方式```の２つがある。
今回はこのページング方式について解説する。

## プログラムはページという単位に分けられる
ページング方式ではプログラムを```ページ```という単位に分割する。

現在のOSでは```デマンドページング```という```実行に必要なページだけを実記憶に読み込ませる。```手法が主流になっている。

## ページフォールト
p２５８のようにプログラム(ページABCDE）が仮想記憶に入っている。
しかし実記憶には読み込まれていない。
ページAを実行しようとすると```ページフォールト(必要なページが実記憶にない時発生する割り込み```が起きて実記憶に読み込まれる。

## ページテーブル
仮想記憶と実記憶の対応づけは```ページテーブル```という表によって管理されてる。
目的のページが実記憶上にないと判明したら、```補助記憶から実記憶へとそのページが読み込まれる```。

## ページイン、ページアウト
ページイン、ページアウトをすることによって必要なページが処理される。
### ページイン
```補助記憶から実記憶へのページ読み込み```
### ページアウト
実記憶に容量が少ないと```実記憶から補助記憶へとページを追い出す```
しかし
補助記憶に書き換えが必要となるのでシステムの処理効率は極端に低下する。
これを```スラッシング```という。

## 気づき
ページフォールトで割り込み、ページテーブルを利用して必要なページが処理されるのか。
それを可能にしているデマンドページングがすごいのかな。
考えている人は賢いな。
ページのおかげで想像しやすい。

# ページの置き換えアルゴリズム
ページインしようとした時に実記憶に空きを作るためにいずれかのページをページアウトしなければなりません。
ページアウトがダメだとせっかく追い出したものをページインし直すこともある。

ページインには置き換えアルゴリズムがある

## 置き換えアルゴリズム
### FIFO（Fiirst In First Out）方式
```最初にページインしたページ```を、追い出し対象とする。
なので最初にページインする。

### LIFO（Last In First Out）方式
```最後にページインしたページ```を、追い出し対象とする。
なので最後にページインさせる。

### LRU（Least Redently Used）方式
```もっとも長い間参照されていない```ページを、追い出し対象にします。

### LFU(Least Frequently Used)方式
```もっとも参照回数の少ないページ```を、追い出し対象にします。

### 気づき
LRUとLFUは同じように見えてしまうな。
気をつけよう。
回数が多いだけでもそれが全てすごい過去の場合があるからな。

# ページングとスワッピング
この２つは補助記憶装置と主記憶装置とでメモリ内容を出し入れすること全般を指す。
これには、両者に違いはない。

これらの違いは、出し入れする単位の違いだ。
スワッピングはプロセス単位
ページングはページ単位

## 気づき
なるほど単位の違いか。
### プロセスとページの違いはなんだっけ？
#### プロセス
タスクとは、コンピュータが「実行中のプログラムです」と識別する仕事の単位。
プロセスとも言われている。
#### ページ
プログラムを「ページ」という単位に分割して管理する。

一つの処理をプロセスと考えて、それは複数のページで構成されている。
こういう感じでいいのかな？

出典 キタミ式イラストIT塾　基本情報技術者　令和03年
M1 MacでFlutterをビルドした際に発生するエラーの対処法

# エラーの詳細
FlutterのプロジェクトにFirebaseを追加した際、以下のようなエラーに遭遇しました。
解決方法は記事の一番下に書いてあるので、必要がなければ読み飛ばして下さい。
~~~
Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.
To update the CocoaPods specs, run:
  pod repo update

Error running pod install
Error launching application on iPhone SE (3rd generation).
~~~
指示通りに $pod install を実行したところ、今度は別のエラーが発生。
~~~
$pod install
...
You have either:
 * out-of-date source repos which you can update with `pod repo update` or with `pod install --repo-update`.
 * mistyped the name or version.
 * not added the source repo that hosts the Podspec to your Podfile.
~~~
エラーの指示に従い進めていきます。
~~~
$ pod repo update
...
Don't forget to anonymize any private data!

Looking for related issues on cocoapods/cocoapods...
Searching for inspections failed: undefined method `map' for nil:NilClass
~~~

同じような状況で苦戦している方がいたので、下記のサイトを参考にさせていただきました。
[How to solve: Error updating CocoaPods after upgrading to flutter 3.0.1](https://flutterhq.com/questions-and-answers/2340/error-updating-cocoapods-after-upgrading-to-flutter-301)

どうやらM1Macでは下記の手順で解決できるようです。

***
# 解決手順
<b>手順１: FFIのアップデート</b>
任意のディレクトリでFFIをアップデートします。
~~~
sudo arch -x86_64 gem install ffi
~~~

<b>手順２:プロジェクトのiosフォルダに移動し、podをアップデート</b>
~~~
arch -x86_64 pod update
~~~

<b>手順３：podのインストール</b>
~~~
arch -x86_64 pod install
~~~
***

無事プロジェクトのビルドに成功しました。
ぜひ試してみて下さい。
mysql -uroot ERROR 1045 (28000) の対処法: 再インストール。Macのbrewで入れた人向け

- 環境
    - macOS Monterey Version 12.4
    - M1, 2020

- 問題
```
% mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
```

となってしまい、rootでmysqlにアクセスできない場合に、データを全て消して再インストールしたい。

- 方法

```
% brew services stop mysql
% pkill mysqld
% rm -rf /opt/homebrew/var/mysql
% brew postinstall mysql
% brew services restart mysql
```

これで問題なく、rootでログインできました。

```
% mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.30 Homebrew

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
Visual Studio 2019 gitignore 作成

gitignore の作成で、こんな便利なコマンドがあるのか！知らなかった。
今まで手で作ってた。。

コマンドプロンプトから、以下のコマンドで、gitignoreファイルが作成される。
```
dotnet new gitignore
```
(dotnetコマンドは、Visual Studio 2019がインストールされているだけで、入っていました)

### 参考
https://suzukaprogrammer.com/2022/06/gitignore/
https://wonwon-eater.com/dotnet-gitignore/

> dotnet core3.1で作成したgitignoreは以下の通りです
内容を直接コピーして使用することも出来ますが、dotnet coreのバージョンに伴って中身は変わっていきます。
バージョンが一致していれば構いませんが、出来れば各自の環境で作成することをお勧めします。

確かにdiffをとると、.NET 5で作成したのと少しだけ違いました。
Python データ型 (組み込み型）

Pythonには様々なデータ型があります。
よく皆さんが使用するデータ型はint,float,str,list型でしょう。
これはどれもPythonに最初からある組み込み型です。
ここではPythonにある組み込み型を紹介します。
|　　　型名　　　　|　　　　　　　　　説明　　　　　　　　　　　|　　　　　　　　　　　　使用例　　　　　　　　　　　　　　　　|
|:-:|:-:|:-:|
|[```str```](https://docs.python.org/ja/3/library/stdtypes.html#str)|文字列を表します。|```a = "paison"```|
|[```int```](https://docs.python.org/ja/3/library/functions.html?highlight=float#int)|整数を表します。|```b = -617```|
|[```float```](https://docs.python.org/ja/3/library/functions.html?highlight=float#float)|少数点のついた数(実数)を表します。|```c = 3.14```|
|[```complex```](https://docs.python.org/ja/3/library/functions.html?highlight=float#complex)|複素数という数の一種を表します。|```d = 63 - 2.7j```|
|[```bool```](https://docs.python.org/ja/3/library/functions.html?highlight=float#bool)|真、又は偽を表します。|```e = True``` ```e = False```|
|[```list```](https://docs.python.org/ja/3/tutorial/datastructures.html)|リストを表します。|```f = [5, True, 4.2, ["risuto", 4]]```<br>```print(f[3][0]) # ↳ risuto```|
|[```tuple```](https://docs.python.org/ja/3/library/stdtypes.html#typesseq-tuple)|組を表します。|```g = (5, True, 4.2, ("たぷる", 8))```<br>```print(g[3][1]) # ↳ 8```|
|[```dict```](https://docs.python.org/ja/3/library/stdtypes.html#dict)|辞書を表します。|```h = {3:6, "sakana":"魚", 3.14:"π"}```<br>```print(f["sakana"]) # ↳ 魚```|
|[```type```](https://docs.python.org/ja/3/library/functions.html?highlight=float#type)|変数のデータ型を表します。|```i = {3:5,4:2}```<br>```print(type(i)) # ↳ <class 'dict'>```|
|[```set```](https://docs.python.org/ja/3/library/stdtypes.html#set-types-set-frozenset)|集合を表します。<br>listに似ていますが中にlistを挿入することはできません。<br>辞書に挿入したい場合は別の「frozenset」というデータ型を使います。|```set([3,8,"raamen"]) # ↳ {8, 3, 'raamen'}```<br>```set([3,8,"raamen",[3,5.1]]) # ↳TypeError: unhashable type: 'list'```|

主な組み込み型を上に挙げました。
よく使うので覚えておくとよいでしょう。
Next/Reactで関数内の変数が予期せず初期値になることについて 


以下のような変数を関数コンポーネント内部で定義したとします。その後に `// ..`でuseEffectで`imagesOnWaitingList`にAPI経由で取得した値を配列に格納することがありました。その変数を後でボタンクリックイベントなどで参照すると、`imagesOnWaitingList`が何らかのタイミングで空`[]`になることがあり、原因がわからず時間がかかりました。

```
const Home: NextPage = () => {
  let imagesOnWaitingList: Array<ImageMetadataOnWaitingList> = []
  // ..
}
```

## 解決策と原因

関数コンポーネントの外側で変数を定義することで解決しました。関数コンポーネントのレンダリングの仕組みはわかりませんが、おそらく他のstateful valueが更新されたタイミングで関数コンポーネントが呼ばれると理解しています。そのため、stateful value出ない変数の初期化処理を関数に含めた場合、複数回関数コンポーネントがコールされて予期せぬ初期値が得られたのでしょう。



https://www.hypertextcandy.com/when-hook-is-called

```
let imagesOnWaitingList: Array<ImageMetadataOnWaitingList> = []

const Home: NextPage = () => {
  // ..
}
```

## Next/Reactとstateful values

そもそも、`imagesOnWaitingList`は、インターフェース上に表示するものでもないので、わざわざstatefulにする必要を感じていなかったのです。しかし、この`imagesOnWaitingList`を更新する条件は他のstateful valueに依存していたので、バグを避けるために、そのような時はstateful valueを使う、という方針がいいのでしょうか？

Stateful valueというものは、あくまで目に見える（インターフェースにレンダーする）ものに使うだけでなく、他のstateful valueの影響を受ける内部の状態にも使うべきなのかもしれません。React/Nextは変数の更新のタイミングやレンダリングなどで注意すべき点が多いと思います。

また、関数コンポーネントではuseStateを用いてローカルの変数を定義することができることを考えても、ローカルでの状態はなるべくstateful valueに統一するのが、関数のコールによる予期せぬ初期化に対する根治術かもしれませんね。

>ステートフックによって、React の歴史上はじめて、React の関数コンポーネントにローカル state を加えることができます！

https://ja.reactjs.org/docs/hooks-state.html
kintoneの添付ファイルフィールドから画像をURLとして取得

#　fetchで書いて関数化してみた

    async function getImageURL(fileKey){
        const url = 'https://ドメイン.cybozu.com/k/v1/file.json?fileKey=' + fileKey
        const header = new Headers({'X-Requested-with':'XMLHttpRequest'})
        const init = {method: 'GET', headers: header, mode: 'cors', cache: 'default}
        const res = await fetch(url, init).catch(err => console.log(err))
        const blob = await res.blob().catch(err => console.log(err))
        const imgURL = (window.URL || window.webkitURL).createObjectURL(blob)
        return imgURL
    }

エラーハンドリングは適当

参考
[公式にあるXMLHttpRequestでのやり方](https://developer.cybozu.io/hc/ja/articles/202166180-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)
Elixir Explorer のテーブルを見やすく表示する

## はじめに

以前の記事において、 Elixir の Livebook 上で Explorer を使ったデータ分析を実行しました

https://qiita.com/RyoWakabayashi/items/dfb5495b9c25eff710a2

https://qiita.com/RyoWakabayashi/items/a06ae639337726be2e9d

ただ、その時使った `DataFrame.table()` が非常に見づらかったため、見やすく表示する方法を紹介します

---

2022/11/16 更新

`DataFrame.to_rows()` を挟む必要がなくなった（もしくは最初からなかった？）ので省きます

---

実装コードはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/explorer/basics.livemd

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/explorer/pca.livemd

## 変更前の実装（DataFrame.table()）

Explorer の `DataFrame.table()` を使っています

`limit: :infinity` で全件表示指定しています

テキストでテーブルを作って表示していますが、ガタガタで見づらいです

```elixir
DataFrame.table(population_df, limit: :infinity)
```

![スクリーンショット 2022-08-02 15.43.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/2d64e3f7-9e24-5d11-620c-fe8182a2223c.png)

## 変更後の実装（Kino.DataTable.new()）

Kino は Livebook 上の出力をリッチにしてくれるパッケージです

https://github.com/livebook-dev/kino

Kino の `DataTable.new()` にデータフレームを渡すだけでキレイに表示してくれます

```elixir
population_df
|> Kino.DataTable.new(sorting_enabled: true)
```

![スクリーンショット 2022-11-16 9.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c650758d-fa89-75f0-06b6-b13a2a57c723.png)

スッキリしましたね

右上にページネーションも付きます

しかも、 `sorting_enabled: true` を指定することで、
列名をクリックするとソートしてくれます

![スクリーンショット 2022-08-02 15.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/debcecd5-c60a-ab1d-7166-17797f380756.png)

相関行列などで列名の順番が重要な場合は、
`keys:` で指定すればその通りに表示してくれます

![スクリーンショット 2022-11-16 9.35.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/67784e2b-3339-784a-229b-5c85587333a2.png)

## まとめ

Livebook はまだまだ進化しているので、今後も期待大ですね
[S3] 「バケットを空にする」に必要なポリシー

IAMポリシーで```s3:DeleteObject```を付与して、「バケットを空にする」を実行すると、結果のエラー列で、各オブジェクトでAccess Deniedが表示される。
結論、```s3:getBucketVersioning```も付与する必要がある。

※また、バケットの一覧 バケット内オブジェクトの一覧のリスト権限は必要ではないが、あった方が便利なので付与しておく
```s3:ListAllMyBuckets``` ```s3:ListBucket```

結果的に以下のようなポリシーのJSONとなる

※ListBucket/getBucketVersioningのResource限定してもいいかも

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:DeleteObject",
            "Resource": [
                "arn:aws:s3:::bucket1/*",
                "arn:aws:s3:::bucket2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:ListBucket"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:getBucketVersioning",
            "Resource": "*"
        }
    ]
}
```
[EC2]インスタンスタイプの変更クイックマニュアル

# 前提
インスタンスタイプの変更は、インスタンスを停止した状態でないとできない

# クイックマニュアル(2022/08/02時点)
1. **インスタンスの停止**
    - EC2ダッシュボードで対象インスタンスを選択 > インスタンスの状態 > インスタンスを停止
      →「停止済み」になるまで待つ
2. **インスタンスタイプの変更**
    - EC2ダッシュボードで対象インスタンスを選択 > アクション > インスタンスの設定 > インスタンスタイプを変更 > 変更後のインスタンスタイプを選択して「適用」
3. **インスタンスの開始**
    - EC2ダッシュボードで対象インスタンスを選択 > インスタンスの状態 > インスタンスを開始
      →「実行中」になるまで待つ

# 関連リンク
- [EC2のインスタンスタイプ一覧](https://aws.amazon.com/jp/ec2/instance-types/)
- [EC2のインスタンスタイプ別の料金一覧(オンデマンド)](https://aws.amazon.com/jp/ec2/pricing/on-demand/)
ONLYOFFICE デスクトップエディタに新しいフォントを追加する方法

## はじめに

テキストに適したフォントを探しているが、適当なフォントが見つからない？新しいフォントを手動でインストールすることができますよ!

このガイドでは、様々なOSのONLYOFFICEデスクトップエディタにフォントを追加する方法をご紹介します。

インストール前の重要な注意事項は下記の通りです。

* ダウンロードしたフォントは、**.zip**、**.rar**、またはその他のアーカイブ形式としてパックされている場合があります。インストールする前に、それらを抽出してください。
* デスクトップエディタは、OneType **.otf** と TrueType **.ttf** のフォントにのみ対応しています。もしあなたのフォントが他の拡張子を持っているなら、他のソースでお調べください。

## ステップ１．システムに新しいフォントを追加する

お使いのOSを選択し、推奨されるフォントのインストール方法のいずれかに従ってください。

### Windows

* **.otf** または **.ttf** ファイルをダブルクリックして、Windowsフォントビューアで表示するためにファイルを開きます。次に、「**インストール**」ボタンをクリックし、フォントがインストールされるのを待ちます。あるいは、フォントファイルのコンテキストメニューから「**インストール**」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/336398e1-b9a4-926b-66f9-b04dd594dec1.png)

* フォントファイルを `C:\WindowsFonts` フォルダにコピーします。
* Windows 10では、Microsoft Storeで追加のフォントを見つけることができます。そのためには、Microsoftアカウントにログインし、Storeで適切なフォントを探し、「**取得する**」ボタンをクリックする必要があります。

### Linux

* Linuxでは、フォントは次のフォルダに保存されます。すべてのユーザーが利用できるグローバル・フォントは`/usr/share/fonts/`、現在のユーザーが利用できるローカル・フォントは `~/.local/share/fonts` または `~/.fonts` です。フォントファイルをダウンロードし、これらのフォルダのいずれかにコピーする必要があります。

:::note warn
`/usr/local/share/fonts`フォルダーにインストールするには、root権限が必要です。また、フォントファイルのパーミッションは644(`-rw-r--r--`)である必要があり、そうでない場合は使用できません。
:::

手動インストールについての詳しい情報は、[こちら](https://www.linux.com/topic/desktop/how-manage-fonts-linux/)をご覧ください。

* 多くのLinuxシステム、例えばUbuntuにはフォントビューアが内蔵されているので、このアプリを使ってファイルを開き、「**インストール**」ボタンをクリックすればよいのです。
* パッケージマネージャを使用してフォントをインストールすることもできますが、まず、フォントを含むパッケージが存在することを確認します。Debianベースのシステムの例で見てみましょう。

```
sudo apt search tahoma
```

パッケージを見つけたら、インストールすることができます。

```
sudo apt install tahoma
```

### MacOS

システムアプリ「**Font Book**」を使ってフォントを追加インストールすることができます。

* フォントファイルをダブルクリックするだけです。Font Bookが開かれ、このフォントをインストールするかどうか尋ねられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/5137a9ef-97a8-53b1-b1ac-fec9c3446067.png)

* Font Bookを起動し、フォントパネルの「**追加**」ボタンを押します。フォントファイルを選択し、「**開く**」を押します。フォントは自動的にインストールされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/47a3ad82-a5e0-af2a-66cc-a493197d7283.png)

Font Bookアプリを起動します。ダウンロードしたファイルをFinderで探し、Dockパネル上のFont Bookアイコンにドラッグします。

こちらは、すべてのmacOSユーザーが利用できるが、あなたのシステムにはインストールされていないフォントを取得することができます。Font Bookで、左側のサイドバーの「すべてのフォント」をクリックし、おぼろげなフォントファミリまたは1つ以上のスタイルを選択します。プレビューペインで［ダウンロード］をクリックし、表示されるダイアログで［ダウンロード］をクリックします。

インストールしたフォントは、インストールしたフォントのデフォルトの場所として設定したもの（コンピュータまたはユーザー）によって、あなただけが利用できるものと、あなたのコンピュータを使用するすべての人が利用できるものとがあります。

macOSでのフォントのインストールについては[こちら](https://support.apple.com/ja-jp/guide/font-book/fntbk1000/mac)をご覧ください。

## ステップ２．エディタを再起動する

フォントが追加されたら、ONLYOFFICEエディタアプリを再起動します。

これで新しいフォントの利用ができるようになります。
「無理数有理数(Irrational_number,Rational_number)」についてwolframalphaとsympyで判定してみたい。

wolframalphaを使った証明、sympyを使った証明ができていません。

オリジナル
無理数判定法＜

https://ja.wikipedia.org/wiki/%E7%84%A1%E7%90%86%E6%95%B0#%E7%84%A1%E7%90%86%E6%95%B0%E5%88%A4%E5%AE%9A%E6%B3%95

https://ja.wikipedia.org/wiki/%E6%9C%89%E7%90%86%E6%95%B0

https://en.wikipedia.org/wiki/Irrational_number

https://en.wikipedia.org/wiki/Rational_number

# wolframalphaで

https://www.wolframalpha.com/input?i=5%5E%282%2F3%29%E3%81%AF%E7%84%A1%E7%90%86%E6%95%B0%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F&lang=ja

結果
5^(2/3)は無理数です

https://www.wolframalpha.com/input?i=5%5E%282%2F3%29%E3%81%AF%E6%9C%89%E7%90%86%E6%95%B0%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F&lang=ja

結果
5^(2/3)は有理数ではありません

# sympyで
うまくいきませんでした。「None」は、なんでしょうか？

```python
from sympy import *
print("#",simplify(5**(2/3)).is_irrational)
print("#",simplify(5**(2/3)).is_rational)
# None
# None
```


# 入試問題

https://mathmathmass.exblog.jp/32114650/

# 参考

主な仮定の属性値の一覧＜

https://qiita.com/simonritchie/items/4d171687f11fd59b911e#%E4%B8%BB%E3%81%AA%E4%BB%AE%E5%AE%9A%E3%81%AE%E5%B1%9E%E6%80%A7%E5%80%A4%E3%81%AE%E4%B8%80%E8%A6%A7

https://www.geeksforgeeks.org/python-sympy-is_rational-method/