OmniAICreator/Qiita-1.07M huggingface dataset:
Streamlitによる為替チャートの作成


UdemyでStreamlitの講座を受講しました。
講座内では、簡単な株価のグラフ表示アプリの説明でしたが
応用として為替のチャートの作成をしてみました。

# Streamlitのインストール

インストールについては、以下の記事が参考になるかと思います。

https://qiita.com/keisuke-ota/items/a18f158389f1585a9aa0


#為替データの取得

為替データは、Yahooファイナンスより、yfinanceにて取得します。
（以前紹介したDataReaderより、少し詳しいデータが取れますが為替データについてはあまり違いがないようです。）

↓20日間のUSDJPYの為替データの取得

```python:

import yfinance as yf

usd = yf.Ticker('USDJPY=X')
days = 20
hist = usd.history(period=f'{days}d')

```

#為替データの整形

取得する日数(days)、通過ペア(countries)を画面で指定できるようにした上で、以下の関数の整形を行う。

```python:
def get_data(days, countries,targets):
    df2 = pd.DataFrame()
    for target in targets:
        df = pd.DataFrame()
        for country in countries:
            tkr = yf.Ticker(tickers[country])
            hist = tkr.history(period=f'{days}d')
            hist.index = hist.index.strftime('%d %B %Y')
            hist = hist[[target]]
            hist.columns = [country]
            hist = hist.T
            hist.index.name = 'Name'
            df = pd.concat([df, hist])
        
        df = df.T.reset_index()
        
        df = pd.melt(df, id_vars=['index']).rename(
            columns={'value': target}
        )
        if target == 'Open':
            df2 = df
        else:
            df2 = pd.concat([df2,df[target]],axis=1)
        
    return df2
```

#チャートの描写

チャートの描写には、altairを使いチャートを作成する。

```python:

        open_close_color = alt.condition("datum.Open <= datum.Close",
                                 alt.value("#06982d"),
                                 alt.value("#ae1325"))

        base = alt.Chart(df).encode(
            alt.X('Date:T',
                axis=alt.Axis(
                    format='%m/%d',
                    labelAngle=-45,
                    title='Date in 2021'
                )
            ),
            color=open_close_color
        )

        rule = base.mark_rule().encode(
            alt.Y(
                'Low:Q',
                title='Price',
                scale=alt.Scale(zero=False),
            ),
            alt.Y2('High:Q')
        )       

        bar = base.mark_bar().encode(
            alt.Y('Open:Q'),
            alt.Y2('Close:Q')
        )
        st.altair_chart(rule+bar, use_container_width=True)

```


作成した画面は、下のような感じです。
![streamlit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004109/383f28bb-9abe-2488-b491-adb2ab5c828e.jpeg)


とりあえず、今回は試してみましたというところです。
時間があれば、分析用の機能などつけて見ようと思います。
SwiftUI Tutorialsの解説と振り返り

# この記事は投稿は何？
Appleの[SwiftUI Tutorials](https://developer.apple.com/tutorials/swiftui/)を一通り実践したので、振り返ります。

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。

## 実行環境
macOS 11.3.1
Xcode 12.5
Swift 5.4


# SwiftUI Tutorials
全部で3つのチャプターから構成されます。
それぞれのチャプターは、3つのセクションで構成されています。
ここでは最初のチャプターを振り返ります。

## Section 1
[Create a New Project and Explore the Canvas]()では、ビューを構築するための基本的な方法を学びます。
下図は、このSection1で作成したビューをツリー構造にしたものです。

![SwiftUI Tutorials1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/3269205a-8d55-b816-f513-98164dbfc987.jpeg)

ここでは、画面の表示を更新する仕組みも扱っています。それが`@State`という属性です。


## Section 2
[Building Lists and Navigation](https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation)では、データをリスト形式で表示する画面を構築します。

![SwiftUI Tutorials2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/c1d4905c-772e-7885-9bdf-36023ef6c711.jpeg)

Section2は、データから動的にビューを作成する方法を理解しておくことも重要なところです。

## Section 3
[Handling User Input](https://developer.apple.com/tutorials/swiftui/handling-user-input)では、アプリ全体で共有するデータモデルを導入します。

![SwiftUI Tutorials3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/d8646a68-f9c3-3aa0-49c7-b3de0c242564.jpeg)

上図は、理解しやすくするためにだいぶ簡略化して表現したものですが、データモデルを共有する仕組みがわかるかと思います。

#動画教材
Udemyという動画学習サービスで、チュートリアルを実践した様子と解説を動画にして、学べるようにしました。
[無料のクーポン](https://www.udemy.com/course/startswiftui/?couponCode=FREEFORQIITA3DAYS)を発行できたので、こちらで配布させていただきます。
本日（2021/5/12）より3日間以内の登録期限がありますが、どなたでもお気軽にご利用くださいませ。
PancakeSwapのコントラクトの全体像（PancakeSwap勉強会②）

BlockBaseのエンジニアの[@suhara_ponta](https://twitter.com/suhara_ponta)です。

【PancakeSwap勉強会シリーズ】

https://qiita.com/ksuhara/items/fc23ca9bea203f795054

前の記事ではAMMについて基本的な概念を説明しました。今回は実際にコントラクトのコードを見ていきます。
なぜUniswapではなくPancakeSwapなのかというと、PancakeSwapのほうがFarmやらPoolやら機能が多い部分があり、シリーズ化していく上でやりやすいと感じたためです。（あと実際に動かしてみるときに、gasが安いというのもあります）
LP作成とswapについては、完全にUniswap V2のコードをコピペしているだけなので、Uniswap V2の解説だと考えていただいても大丈夫です。

## githubレポジトリとコントラクトの全体像

PancakeSwapのgithubにはいくつかのレポジトリがあります。今回は

- https://github.com/pancakeswap/pancake-swap-core
- https://github.com/pancakeswap/pancake-swap-periphery

が対象になります。

### 全体像
![スクリーンショット 2021-05-12 13.37.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505435/5bffa95e-91b1-c7c9-78e7-aa4568cd2a4a.png)
ユーザーがフロントエンドから触るコントラクトはperipheryレポジトリのRouterコントラクトです。Routerコントラクトを経由してcoreレポジトリのPancakeFactory.solやPancakePair.solのロジックを利用します。

### ペアの作成
![スクリーンショット 2021-05-12 13.37.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505435/c0ec4d01-c32b-8a30-80b7-5989d5019957.png)
`addLiquidity`という関数内で、pairがない場合はPancakeFactoryコントラクトの`createPair`という関数をコールして、ペアのコントラクトをデプロイします。

### 流動性提供
![スクリーンショット 2021-05-12 15.27.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505435/ef2fa006-f657-2593-f177-6e07d7b46344.png)

ペア作成時と同じくRouterコントラクトの`addLiquidity`から、PancakeLibraryというperipheryレポジトリ内のコントラクトの関数を呼び出します。`getReserves`でPancakePair内に存在するreserveのamountを取得し、それを元に`quote`という関数でLPトークンの数量の見積もりをします。`pairFor`という関数でPancakePairのアドレスを取得し、そこにそれぞれのトークンをtransferします。PancakePairの`mint`が呼ばれ、userに対してLPトークンが発行されます。

### 流動性提供を止める（remove liquidity)
![スクリーンショット 2021-05-12 15.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505435/c4bb324b-91ad-2984-7947-6f45a644492c.png)
LPトークンを返還してトークンを償還する場合はRouterコントラクトの`removeLiquidity`という関数を実行します。`pairFor`でアドレスを取得してユーザーからpairのコントラクトへLPトークンをtransferします。その後PancakePairコントラクトの`burn`を実行して、関数内でLPトークンがburnされ、提供していたペアのトークンがそれぞれユーザーにtransferされます。


### Swap
![スクリーンショット 2021-05-12 15.23.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505435/4ccab327-703f-ab5c-e449-86f0097de0ee.png)
swapExactTokensForTokensという関数を実行します（ちなみに微妙に関数名が違うものは、ETHがERC20ではないのでETHとのペアを使うときに実行する関数です）。Libraryの`getAmounts`でswapで得られるトークンの量を計算します。libsレポジトリのtransferHelperを利用してユーザーからLPへtokenAをtransferします。Routerコントラクト内のprivate関数である`_swap`からPancakePairコントラクトの`swap`を呼んで、tokenBがユーザーにtransferされます。

## まとめ
- coreとperipheryの2つのレポジトリからなる。
- 基本機能はcreatePair、addLiquidity、removeLiquidity、swap

以上がコントラクトの概観になります。次は実際にコントラクトのコードの詳細を見ていきます。
【ターミナル】grepコマンド

##概要
grep:ファイル内の文字列を検索するコマンド
##検索例
###基本検索
```
$ grep 検索正規表現 ファイル名
```

###and検索
```
$ grep 検索文字列 ファイル名 | grep 検索文字列2
```

 正規表現を使うことで1文の中でand検索ができる

```
$ grep スタートの検索文字列.*終わりの検索文字列 ファイル名
```

>【正規表現】
>.→ 何らかの文字、* →直前の文字の0個以上の繰り返し

**and検索例**

```
$ grep r.*p work/*
```

##オプション一覧
###-i
大文字と小文字を区別せず検索

###-E
拡張正規表現で検索

###-e
一致処理に指定した正規表現で検索

###-v
一致しないものを検索

###-n
検索結果に行番号を表示

###-l
検索結果にファイル名のみ表示

###-h
検索結果にファイル名を表示しない

###-o
検索結果に一致した文字を表示

###-r
ディレクトリ内も検索対象とする

###-L
検索した結果、該当しなかったファイルを表示

##参考
https://eng-entrance.com/linux-command-grep
DEXの歴史とAMMの概要、x*y=kについて（PancakeSwap勉強会①）

BlockBaseのエンジニアの[@suhara_ponta](https://twitter.com/suhara_ponta)です

先日BlockBaseの[discord](https://discord.com/invite/7P3NChCxhM)でPancakeSwapの勉強会を開催しました。この記事から数回に渡ってその内容をまとめていきたいと思います。

## DEX（分散型取引所）の歴史
暗号資産の取引所はCEX（中央集権型取引所）とDEX（分散型取引所）に分類できます。
スマートコントラクトを用いて、ユーザーが秘密鍵を自分で管理したまま取引を行えるのがDEXです。

初期（2017~18年くらい）のDEXの例として0xやKyber Networkなどがあります。この頃のDEXはCEXと同様、Order Book方式を採用していました（現在はAMMに移行したりしています）。希望者が購入と売却のオーダーをそれぞれ作成してマッチすると取引が成立する方式です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505435/95a0a79f-7490-d243-0036-45feca8ceda7.png)(出典 https://thecontrol.co/a-comparison-of-decentralized-exchange-designs-1deef249f56a)


これらのプロトコルが抱えていた問題点として、DEXは流動性が低く、なかなか取引が成立しない点にありました。

[Uniswap](https://app.uniswap.org/#/swap)はAMM（automated market maker） という仕組みを生み出し、現時点ではこの課題を解決していると言えます。

## AMMについて
UniswapのAMMの仕組みについて見ていきます。
https://uniswap.org/docs/v2/protocol-overview/how-uniswap-works/

AMMでは流動性提供という概念があります。LP Providor（流動性提供者）は特定の通貨どうしのペアからなるLiquidity Pool（流動性プール、以下LP）というものを作ります。

このLPは`x * y = k` という式で端的に表されます。

![learning pancakewap@20210511 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505435/55e7bd76-0cb3-d68b-7154-8ecc9473750c.jpeg)
例としてDAIとETHのペアを考えます。xはDAIの量、yはETHの量を表します。
LP Providerが100DAIと1ETHのペアをPoolに追加すると`K = 100 * 1`で100になります。（このとき後述するLPトークンというものをLP Providerは手に入れます。）

ここに100DAIをETHに交換したい人がやってきます。LPに100DAIを追加すると、`x = 200DAI`になりますが、このとき`k = 100`を維持するようにyの量が `100 / 200DAI = 0.5ETH`に変化します。100DAIをETHに変換したい人は、元々LPの中にあった1ETHから変化後の0.5ETHの差額 `1ETH - 0.5ETH = 0.5ETH`を得ることができます。
![learning pancakewap@20210511 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505435/c9fbd0d3-6628-8936-ac54-a4fb51df481d.jpeg)

ここに0.3%の取引手数料が加わります。実際には0.5ETHを入手するためには100.3DAIをswapする必要があるということです。取引が行われるごとにkが少しずつ増えていきます。
![learning pancakewap@20210511 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505435/9087d9ca-8bcd-6973-54e4-e5c9f768ce38.jpeg)

最後にLP ProviderがLPの資金を引き上げます。前述したLPトークンをバーンして、DAIとETHを入手します。このとき返還されるのは元の100DAI + 1 ETHではなく、現在LPにある200.3DAI + 0.5ETHです。

図の例ではLP Providerは一人だけですが、実際には不特定多数が金利収入を得るために流動性を提供します。このとき自分がLPにいくら流動性を提供したかを示すのがLPトークンです。LPトークンの保有割合に応じたトークンが返還されます。

DeFiでよく聞くimpermanent lossというのは、この100DAI + 1ETHが 200.3DAI + 0.5ETHに変化することで、損失が起きていることを指します。増加した100.3DAIより減少した0.5ETHのほうが価値が大きい場合、損失が起きています。DeFiの高金利の裏にはこのリスクがあることを理解してください。

さらに各プロトコルは独自のガバナンストークンを発行したり、LPトークン自体をステーキングしてトークンを稼ぐ方法を提示したりなどして、利率を引き上げユーザーを獲得しようと競争していますが、Qiitaにふさわしくない内容になってくるのでここでは割愛します笑

## まとめ
- DEXの低い流動性という課題をAMMが解決した
- AMMは提供されている流動性が`x*y=k`で維持されるようにswap時のレートが決まる

以上、AMMについて解説しました。
[次の記事](https://qiita.com/ksuhara/items/8e6fdc4da527e77692de)ではUniswapの仕組みをBinance Smart Chain上に持ち込んだPancakeSwapのコントラクトを概観します。

https://qiita.com/ksuhara/items/8e6fdc4da527e77692de
Radeon Rays 4.1(Vulkan)のメモ

Radeon rays 4.1 から OSS 化されました

https://github.com/GPUOpen-LibrariesAndSDKs/RadeonRays_SDK

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">たのしい Radeon Rays 4.0 で Vulkan ray tracing(Vulkan 🥳 but closed source 😢). 60% powerlimit 2080 Ti で 380M rays/sec くらいでした(RT core はたぶん使ってないはず) <a href="https://t.co/nt1oFWx5hu">pic.twitter.com/nt1oFWx5hu</a></p>&mdash; Syoyo Fujita 🌸 レイトラ ® 🐯 3 周年 🎉 (@syoyo) <a href="https://twitter.com/syoyo/status/1261200336762449921?ref_src=twsrc%5Etfw">May 15, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

もともと 4.0(昨年 2020 年 5 月)で Vulkan 対応していましたが, closed source でした.

OpenCL 版はありません(closed source)

Vulkan backend の場合は, compute shader で対応しているため, Vulkan 1.2 対応であれば動きます(したがって Intel 内蔵 GPU でも動くと思われる. Android の場合は Vulkan 1.1 のままなので無理そう). 

Vulkan レイトレ拡張は使っていませんので, Polaris GPU などでも動くと思われます.

リアルタイムレイトレとオフラインレイトレの中間での利用が想定でしょうか.

いずれは Vulkan ray tracing 対応もでてきてほしいところですね.

Linux 対応していますので, GPU マイニングファームでレイトレ計算もするのによさそうです.

## ビルド

spdlog が必要な以外は特に問題なくビルドできます.


## TODO

* [ ] spdlog を nanolog https://qiita.com/syoyo/items/9e4162e51c16066c3100 に置き換えてよりビルドしやすくする
Raspberry Pi OS で無線マウスが遅い場合にすること

#はじめに
Raspberry Pi OS で無線マウスがすごく遅く感じたので、調べてみた。
#cmdline.txtに追記
`$sudo nano /boot/cmdline.txt`としてテキストエディタで開き、つぎの記述を最後尾に追記する。  

```
usbhid.mousepoll=0
```
保存して`$sudo reboot`。
#確認した機器
全ての無線接続マウスに有効か不明である。
私が確認したのは「All-in-One Media Keyboard」という専用無線接続タイプのもの。
多分Blutoothマウスでも問題ないとは思う。
nginx の設定を初期化する方法

# はじめに

nginx の設定ファイルをいろいろいじっていて、訳がわからなくなった際に初期化したかったが手間取ったので備忘録として残す。OS は Ubuntu-20.04 を使用している。

# nginx のアンインストール

apt ではパッケージを削除する際に remove と purge があり、remove は設定ファイルは残り、purge では設定ファイルごと削除する。apt remove 後に再度インストールしても、以前の設定ファイルが残っているため設定の初期化はできない。
さらに `sudo apt purge nginx` とするだけでは設定ファイルは消えず、以下コマンドのように nginx 関連の他のパッケージもまとめて削除することで完全にアンインストールすることができる。

```
$ sudo apt purge nginx nginx-common nginx-full
```

上記実行後に、再度 `$ sudo apt install nginx` とすれば設定を初期化した状態で nginx をインストールし直せる。
M1 MacでのZeroMQ (Node.js) 導入

フロントエンドの開発をやっている中で、既存のプロジェクトをクローンしてきた時に問題が起こりました。 `yarn` したら途中でエラーになる。どうやら `zmq` ライブラリがコンパイルできていないようです。M1 Macに変えたばかりなので「もしかして`zmq`はM1対応してないのかな〜」とも思いましたが、もしそうだとしたらお手上げなので地道に調べることにしました。

###結論

事前に依存ライブラリをインストールする！

###エラーメッセージ
エラーメッセージは次の通りです。

```zsh
error /Users/{myName}/develop/vue/o-GreenCheck/frontend/node_modules/zeromq: Command failed.
（略）
Building libzmq...
/Users/{myName}/develop/vue/o-GreenCheck/frontend/node_modules/zeromq/build/Release/../../script/build.sh: line 60: cmake: command not found
make: *** [libzmq/lib] Error 127
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/Users/{myName}/.anyenv/envs/nodenv/versions/14.16.1/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:194:23)
gyp ERR! stack     at ChildProcess.emit (events.js:315:20)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:277:12)
gyp ERR! System Darwin 20.4.0
gyp ERR! command "/Users/{myName}/.anyenv/envs/nodenv/versions/14.16.1/bin/node" "/Users/{myName}/.anyenv/envs/nodenv/versions/14.16.1/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users/{myName}/develop/vue/o-GreenCheck/frontend/node_modules/zeromq
```

###対策

[ZeroMQ.jsのリポジトリ](https://github.com/zeromq/zeromq.js/)を見ると事前にインストールしておかなければならないものがあるようです。上のエラーでは`cmake: command not found`と出ているのでインストールします。

```zsh
brew install cmake
（略）
==> Summary
🍺  /opt/homebrew/Cellar/cmake/3.20.2: 6,468 files, 67.5MB
```

もう一度`yarn`してみると、、、

```zsh
✨  Done in 88.35s.
```

成功しました！

###参考

[C++初心者がMacでCMakeを利用してみる - Qiita](https://qiita.com/kai_kou/items/df335eb7ee78229ee46f)
初心者向け　GitとGitHubについて③


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111652/c53644f9-468e-d165-ab70-5c1245a8d9d7.png)


前回はGitHubの基本的な用語、ローカルリポジトリの作成まで行いました。
次はGitを利用する上で重要なブランチをまとめておきます。

- [初心者向け GitとGitHubについて①](https://qiita.com/morioka1206/items/713ffaeff8d7075ba3b4)
- [初心者向け GitとGitHubについて②](https://qiita.com/morioka1206/items/926acec8642cefa1fcc5)


## ブランチとは
ブランチとはリポジトリで管理しているファイルやディレクトリの変更の流れ、コミットの連なりです。リポジトリは必ずブランチを持っています。

アプリケーションの開発では複数の新たな機能追加やバグ修正などを並行して行うことがあります。
その作業ごとに分岐して管理することができれば、チーム開発でも同じファイルを同時に編集することができるようになります。

大元のブランチを**masterブランチ**、分岐したブランチを**トピックブランチ**といいます。
大元のブランチからブランチを分岐させることを「**ブランチを切る**」といいます。

作業が完了した分岐したブランチをマージ(結合)することでまた一つのブランチに戻すことができます。

#### ブランチのメリット
- ブランチを切ることで目的別に同時並行で作業が行えること
- 不具合が発生した場合も対応が容易になること
- 他のメンバーの作業による影響を受けることなく、自分の作業に取り組める

## ブランチの作成
```console:現在のブランチ一覧
% git branch
```

`git branch`と入力すると現在のブランチ一覧が表示されます。
作業中のブランチには「*」が付きます。

```console:
* master
```

それではブランチを作成しましょう。

```console:ブランチを作成
% git branch　ブランチ名
```
作成したブランチへの移動は`checkoutコマンド`でできます。

```console:ブランチへ移動
% git checout ブランチ名
```

移動できると`Switched to branch 'ブランチ名'`と表示されます。
またブランチの作成と移動を同時に行う場合は`git checkout -b ブランチ名`でできます。

```console:ブランチの作成と移動
% git checkout -b ブランチ名
```

## ブランチにプッシュ
まずは`addコマンド`でインデックスへ追加します。

```console:インデックスへ登録
% git add 追加したいファイル
```

コミットします。

```console:ローカルリポジトリへコミット
% git commit -m "コメント"
```

リモートリポジトリへ反映させます。
ブランチ名を指定するだけでプッシュすることができます。

```console:ブランチにプッシュ
% git push origin ブランチ名
```

[![Image from Gyazo](https://i.gyazo.com/b2914c62edb91d6368cb5ee1a373fcca.png)](https://gyazo.com/b2914c62edb91d6368cb5ee1a373fcca)

一つだったブランチが2つになりました。

## masterブランチへのマージ
新機能の追加などが完了し、メインのmasterブランチに取り込むことになったとします。
通常はプルリクエスト、コードレビューなどがあると思いますが、それも終わったということにします。

ブランチに取り込むことを**マージ**といいます。
まずは作業中のブランチをmasterブランチに切り替えます。

```console:ブランチをmasterにする
% git checkout master
```

次にマージしたいブランチをマージする`git mergeコマンド`を入力します。

```console:ブランチをマージする
% git merge ブランチ名
```

次にGitHubへプッシュします。

```console:GitHubへプッシュ
% git push origin master
```

これでmasterブランチへのマージができます。


## ブランチからプルする
他の開発者がトピックブランチで作業するとします。
その場合はそのブランチに`checkoutコマンド`で移動して`pullコマンド`を入力することで可能になります、

```ブランチに移動する
% git checkout ブランチ名
```

次にリモートブランチのコードを`pullコマンド`で取得します。

```console:リモートブランチからコードを取得
% git pull
```

## ブランチの削除
使わなくなったブランチは削除することができます。

```console:ブランチの削除
% git branch -d ブランチ名
```

`git branch`コマンドで削除されているか確認しましょう。







>参考サイト
[【超入門】初心者のためのGitとGitHubの使い方](https://tech-blog.rakus.co.jp/entry/20200529/git)
[GitHub GITチートシート](https://training.github.com/downloads/ja/github-git-cheat-sheet.pdf)
[modis GitHubとは？使い方や知っておきたい知識を解説！
](https://www.modis.jp/staffing/insight/column_30/)[Gitではじめるバージョン管理 〜ローカルリポジトリでファイルを管理してみよう〜](https://www.hivelocity.co.jp/blog/34777/)
[TechAcademyマガジン 今さら聞けない！GitHubの使い方【超初心者向け】](https://techacademy.jp/magazine/6235)
XcodeのTimeProfilerでfunctionじゃなくメモリアドレスが表示される問題


dSYMファイルが生成されていませんでした！

http://www.swiftdevjournal.com/measuring-your-apps-memory-usage-with-instruments/

こちらを参考に設定を修正したら解決。

https://ja.stackoverflow.com/questions/25355/dsym%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%E4%BD%95%E5%87%A6%E3%81%AB%E3%81%82%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B
C# PDFの作成法

<p><strong>PDFは、「Portable Document Format」の略で、データを実際に紙に印刷したときの状態を、そのまま保存することができるファイル形式です。今回は Spire.PDFという無料のライブラリを利用して、PDFの作成法を紹介しましょう！</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/download-pdf-for-net-free.html">Free Spire.PDF</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210512/20210512144931.png" alt="f:id:lendoris:20210512144931p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>2.Visual Studioを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. PDF.dllを参照に追加してください。</strong></p>
<p><strong>（Net 4.0を例としたら、デフォルトパスは“Bin→NET4.0→PDF.dll”というようです。）</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210512/20210512144944.png" alt="f:id:lendoris:20210512144944p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>コード</strong></h4>
```C#
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //PdfDocument objectを作成します。
            PdfDocument document = new PdfDocument();

            //マージンを設定します。
            PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
            PdfMargins margins = new PdfMargins();
            margins.Top = unitCvtr.ConvertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
            margins.Bottom = margins.Top;
            margins.Left = unitCvtr.ConvertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
            margins.Right = margins.Left;

            //新規ページを追加します。
            PdfPageBase page = document.Pages.Add(PdfPageSize.A4, margins);

            //カスタムのPdfTrueTypeFont、PdfPenインスタンスを作成します。
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Ms mincho", 20f), true);
            PdfPen pen = new PdfPen(Color.Black);

            //DrawStringメソッドでテキストを書きます。
            string text = "初めてのPDFです！";
            page.Canvas.DrawString(text, font, pen, 100, 50);

            //保存します・
            document.SaveToFile("PDF作成.pdf");

        }
    }
}
```
<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210512/20210512145023.png" alt="f:id:lendoris:20210512145023p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p> </p>
基本情報で出てくる用語を五文字で説明した辞書　第一巻

#この記事は
<details><summary>五文字化</summary></details>
によって基本情報に出てくる用語を理解＆暗記してしまおうという記事です。

https://qiita.com/LaO/items/c185166d4058ab0721c9

正直、基本情報を取る気がないです笑。
というもの、一時期資格ゲッターの時代がありまして（誰にでもありますよね？ｗ）、ITパスポートを取得し、そんじゃ次は基本情報だぁぁぁぁ！と思い、勉強をしていたのですが、午後試験がムズイ…。

対策しても午後試験だけは、得点が上がらず合格最低ラインにたどり着かないので、もう諦めました。
また、そんな最中Androidと出会い、すっかり座学はおざなりになりました。
手を動かした方が自分のためになると思っているからですｗ

ただ、学校のテスト且CSの教養として、またいつか基本情報を取る！ってなった時に蓄積があった方が良いと思いますので、授業があるたびにこちらを更新していきたいと思います。

###論理演算
<details><summary>五文字化</summary>符号考慮</details>
###算術演算
<details><summary>五文字化</summary>非符号考慮</details>
###排他的論理和
<details><summary>五文字化</summary>片方の時1</details>
###OR(論理和)
<details><summary>五文字化</summary>足算</details>
###AND(論理積)
<details><summary>五文字化</summary>掛け算</details>
###⋂
<details><summary>五文字化</summary>論理積</details>
###∪
<details><summary>五文字化</summary>論理和</details>
###メモリ
<details><summary>五文字化</summary>作業机</details>
###CPU
<details><summary>五文字化</summary>脳みそ</details>
###RAM(read access memory)
<details><summary>五文字化</summary>揮発性</details>
###揮発性
<details><summary>五文字化</summary>消える</details>
###ROM(read only memory)
<details><summary>五文字化</summary>不揮発性</details>
###DRAM
<details><summary>五文字化</summary>主記専</details>
###SRAM
<details><summary>五文字化</summary>キャッシュ</details>
###フリップフロップ回路
<details><summary>五文字化</summary>防御0　補足説明：入力したら、他の信号が入るまで安定状態を保つよん。だから、防御0ｗ（入力されたら死ぬ）</details>
###マスクROM
<details><summary>五文字化</summary>読専</details>
###PROM
<details><summary>五文字化</summary>書込可</details>
###EPROM
<details><summary>五文字化</summary>紫外線消去</details>
###EEPROM
<details><summary>五文字化</summary>電圧消去</details>
###フラッシュ型EEPROM（通称フラッシュメモリ）
<details><summary>五文字化</summary>一括書換可 補足説明：USBメモリとか、SDカードとか</details>
###レジスタ
<details><summary>五文字化</summary>覚速量少、演算装置</details>
###タスク
<details><summary>五文字化</summary>パッソ視点</details>
###ジョブ
<details><summary>五文字化</summary>人視点</details>
###スレッド
<details><summary>五文字化</summary>分身</details>
###OS
<details><summary>五文字化</summary>人格</details>
###ディスパッチ
<details><summary>五文字化</summary>使用権割当</details>
###キャッシュ
<details><summary>五文字化</summary>メモ</details>
###仮想メモリ
なりすまし
###FIFO
<details><summary>五文字化</summary>先入先出</details>
###LFU
<details><summary>五文字化</summary>回数不人気</details>
###LRU
<details><summary>五文字化</summary>時間不人気</details>
###構文解析
<details><summary>五文字化</summary>2番目</details>
###字句解析
<details><summary>五文字化</summary>最初</details>
###意味解析
<details><summary>五文字化</summary>3番目</details>
###最適化
<details><summary>五文字化</summary>最後</details>
###バッファ
<details><summary>五文字化</summary>一時的蓄積</details>
###オーバーフロー
<details><summary>五文字化</summary>量多く溢れ</details>
###デジタルトランスフォーメーション
<details><summary>五文字化</summary>生活にIT</details>
venvの使い方（超簡易版）

### 環境構築
- 仮想環境を作成します

`python -m venv venv1`

作成後、以下の様なコマンドで仮想環境に入る

`.\venv1\Scripts\activate`

- pipコマンドで必要なパッケージをインストールします

`pip install lxml`

#### おまけ
仮想環境から出る時は`deactivate`
`pip freeze`でインストールパッケージ確認（仮想環境にちゃんと入れてるかの確認）
`pip uninstall lxml`のようなコマンドでアンインストール
Github リポジトリをPrivateからPublicに変更

#Settings＞options＞Change visibility
![スクリーンショット 2021-05-12 13.08.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/939706fe-1bd1-6a4e-9de4-dc83a16cd4f8.jpeg)

ずーっと下にスクロール！


![スクリーンショット 2021-05-12 13.08.53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/ec99b7e8-7812-98c6-8a5d-c2f3357f3810.jpeg)

ここで
・PrivateからPublic

・PublicからPrivate

どちらも切り替えることができます:thumbsup:

ほぼ画像だけの記事でした。。。
C#の文字列補完 $"{}" でInvariantCultureを強制する方法


結論から先に書くと、[FormattableString.Invariant(FormattableString) Method](https://docs.microsoft.com/en-us/dotnet/api/system.formattablestring.invariant) を使いましょう。

```C#
var now = DateTime.UtcNow;
var val = 12345.6789;
Console.WriteLine($"CurrentCulture  : {now}, {val:N}");
Console.WriteLine(FormattableString.Invariant($"InvariantCulture: {now}, {val:N}"));
FormattableString fmtString = $"{now}, {val:N}";
Console.WriteLine("CurrentCulture  : " + fmtString.ToString(System.Globalization.CultureInfo.CurrentCulture));
Console.WriteLine("InvariantCulture: " + fmtString.ToString(System.Globalization.CultureInfo.InvariantCulture));
Console.WriteLine("fr-FR-Culture   : " + fmtString.ToString(System.Globalization.CultureInfo.GetCultureInfo("fr-FR")));

/* result output
CurrentCulture  : 2021/05/12 5:21:10, 12,345.68
InvariantCulture: 05/12/2021 05:21:10, 12,345.68
CurrentCulture  : 2021/05/12 5:21:10, 12,345.68
InvariantCulture: 05/12/2021 05:21:10, 12,345.68
fr-FR-Culture   : 12/05/2021 05:21:10, 12 345,68
*/
```

## InvariantCulture での文字列補完が必要なケース

日付の表記や、数値の桁区切りと小数点記号、通貨記号などは国や文化によって異なります。
C#では、OS実行環境等から現在の国と文化を得て、CultureInfo.CurrentCulture に情報を保持しています。
そして C#の文字列補完 $"{}" は、CultureInfo.CurrentCulture に従って日付や数値を文字列化します。

UI上に表示する文字列は CultureInfo.CurrentCulture に従った内容で良いのですが、クラウドやファイル上にデータを文字列化して保存する場合は、文字列化に用いた CultureInfo.CurrentCulture の内容を同時に記録しないと、データの解釈ができなくなります。それでは困るので特定の国や文化に依存しない中立的な表記で記録したいのですが、それに用いるのが CultureInfo.InvariantCulture です。

CultureInfo.InvariantCulture はC/C++言語における"C"ロカールに相当し、基本的に米国文化の内容です。

## CultureInfo を指定して文字列補完するには

日付変数や実数変数の個々の文字列化であれば、`ToString (string? format, IFormatProvider? provider)` や `ToString (IFormatProvider? provider)` を用い、引数に CultureInfo を渡すことで、指定の CultureInfo に従った文字列化ができます。

文字列補完の場合は、`FormattableString.ToString (IFormatProvider? formatProvider)` を用い、`FormattableString fmt = $"{val}"; fmt.ToString(cultureInfo);` のように指定できますが、FormattableString を宣言する手間が必要となります。CultureInfo.InvariantCulture に限って、その手間を省くのが [FormattableString.Invariant(FormattableString) Method](https://docs.microsoft.com/en-us/dotnet/api/system.formattablestring.invariant) なのです。

逆に同じ文字列補完に対して、複数のCultureInfoを適用したい場合には `FormattableString.ToString (IFormatProvider? formatProvider)` が有用です。国や文化の違いを並べて表示したり、国や文化をユーザ選択させるようなケースに役立つでしょう。

## 参考資料
https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/string-interpolation#how-to-create-a-culture-specific-result-string-with-string-interpolation
Homebrewでbrew install ext4fuseするとError: ext4fuse has been disabled because it requires FUSE!で失敗する


## こんな感じで失敗する

```
$ brew install ext4fuse
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> Updated Formulae
Updated 5 formulae.
==> Updated Casks
Updated 4 casks.

Error: ext4fuse has been disabled because it requires FUSE!

```

## 本家のissuesで解消策を発見

https://github.com/gerard/ext4fuse/issues/66

本家は英語でエラーになる理由も読めばわかるが、自身の防備録を兼ねて要点だけ日本語化して転記する

任意のディレクトリに以下のファイルを作成

```ruby:ext4fuse.rb
class MacFuseRequirement < Requirement
  fatal true

  satisfy(build_env: false) { self.class.binary_mac_fuse_installed? }

  def self.binary_mac_fuse_installed?
    File.exist?("/usr/local/include/fuse/fuse.h") &&
      !File.symlink?("/usr/local/include/fuse")
  end

  env do
    ENV.append_path "PKG_CONFIG_PATH",
                    "#{HOMEBREW_PREFIX}/lib/pkgconfig:#{HOMEBREW_PREFIX}/opt/openssl@1.1/lib/pkgconfig"
    ENV.append_path "BORG_OPENSSL_PREFIX", "#{HOMEBREW_PREFIX}/opt/openssl@1.1/"

    unless HOMEBREW_PREFIX.to_s == "/usr/local"
      ENV.append_path "HOMEBREW_LIBRARY_PATHS", "/usr/local/lib"
      ENV.append_path "HOMEBREW_INCLUDE_PATHS", "/usr/local/include/fuse"
    end
  end

  def message
    "macFUSE is required. Please run `brew install --cask macfuse` first."
  end
end

class Ext4fuse < Formula
  desc "Read-only implementation of ext4 for FUSE"
  homepage "https://github.com/gerard/ext4fuse"
  url "https://github.com/gerard/ext4fuse/archive/v0.1.3.tar.gz"
  sha256 "550f1e152c4de7d4ea517ee1c708f57bfebb0856281c508511419db45aa3ca9f"
  license "GPL-2.0"
  head "https://github.com/gerard/ext4fuse.git"

  bottle do
    sha256 cellar: :any, catalina:    "446dde5e84b058966ead0cde5e38e9411f465732527f6decfa1c0dcdbd4abbef"
    sha256 cellar: :any, mojave:      "88c4918bf5218f99295e539fe4499152edb3b60b6659e44ddd68b22359f512ae"
    sha256 cellar: :any, high_sierra: "fc69c8993afd0ffc16a73c9c036ca8f83c77ac2a19b3237f76f9ccee8b30bbc9"
    sha256 cellar: :any, sierra:      "fe8bbe7cd5362f00ff06ef750926bf349d60563c20b0ecf212778631c8912ba2"
    sha256 cellar: :any, el_capitan:  "291047c821b7b205d85be853fb005510c6ab01bd4c2a2193c192299b6f049d35"
    sha256 cellar: :any, yosemite:    "b11f564b7e7c08af0b0a3e9854973d39809bf2d8a56014f4882772b2f7307ac1"
  end

  depends_on "pkg-config" => :build

  on_macos do
    depends_on MacFuseRequirement => :build
  end

  on_linux do
    depends_on "libfuse"
  end

  def install
    system "make"
    bin.install "ext4fuse"
  end
end
```
`ext4fuse.rb`が存在するディレクトリで、以下を実行する

```
brew install --cask macfuse
brew install --formula --build-from-source ./ext4fuse.rb
```

## もしも osxfuse が存在すれば削除する （必要なのは macfuse）

```
brew list --cask
osxfuse macfuse
brew rm --cask osxfuse
```
完全数またはほぼ完全数 [ruby]

あるプログラミングテスト問題に出会い、とても参考になったので、その学びを納めておきたいと思います。自身の回答に関しては、繰り返し処理が2重で存在するなど、まだまだ稚拙な回答ですが、この問題自体はとても参考になりました。

## 問題

　Xを2 以上の整数とし、X の約数のうち X 自身を除いたものの和を Y とします。

　このとき

- X = Y となるような X を完全数
- |X-Y| = 1 となるような X をほぼ完全数　（|X-Y| は X-Y の絶対値を意味する）

と言うことにする。

たとえば、X = 28 のとき
28 の約数は 1, 2, 4, 7, 14, 28 なので、Y = 1+2+4+7+14 = 28 となります。
従って、28 は完全数です。

また、X = 16 のとき
Y = 1+2+4+8 = 15 となるので、|16 - 15| = 1
従って、16 はほぼ完全数です。

入力された整数が完全数かほぼ完全数かそのいずれでもないかを判定するプログラムを作成する

### **入力される値**

入力は以下のフォーマットで与えらる

```terminal
Q
X_1
.
.
X_Q1
```

1行目のQには、判定したい整数の個数
続く Q 行には整数 X_1, ..., X_Q が入力されます。

### **期待する出力**

各 X_i に対して

- X_i が完全数であれば "完全数"
- X_i がほぼ完全数であれば "ほぼ完全数"
- どちらでもなければ "どちらでもない"と 1 行に出力してください。

### **条件**

すべてのテストケースで以下の条件を満たします。

- 1 ≦ Q ≦ 50
- 2 ≦ X_i ≦ 1000 (i=1, 2, ..., Q)

## 自分の回答

```ruby
input_lines = readlines.map(&:to_i)
count = input_lines[0]
given_numbers = input_lines[1..count]
given_numbers.each do |num|
    divide_numbers = [*1..num-1]  # 解説1
    sum = 0
    divide_numbers.each do |divide|
        sum += divide if num % divide == 0
    end
    if sum == num
        puts "完全数"
    elsif (sum - num).abs == 1  # 解説2
        puts "ほぼ完全数"
    else
        puts "どちらでもない"
    end
end
```

入力される数字の例

```terminal
3
4
28
777
```

出力される例

```terminal
ほぼ完全数
完全数
どちらでもない
```

## 解説

ちっぽけな解説ですが、一応載せておきます。

### 解説1　divide_numbers = [*1..num-1]

これは数学の話ではありますが、この問題は約数が重要です。また今回はその中でも、その数字自体は約数に含めてはいけないので、上記の構文で、1から始まり自分の一つ下の数字までの配列が格納されます。この配列は、今回の条件で約数になりうる数字の配列です。

```terminal
# 28の場合
[1, 2, 3, 4, 5, 6, .. , 26, 27]
```

### 解説2　(sum - num).abs == 1

`abs`はrubyで絶対値を出力するメソッドです。

```ruby
(-5).abs = 5
(5).abs = 5
```

解説は以上です。

## 余談

余談ですが、この問題を見て小川洋子さんの「博士の愛した数式」を思い出しました。
記憶が短時間しか続かない数学者の博士と主人公である家政婦のやりとりを基本とした人間ドラマです。

その中で、博士が主人公とコミュニーションを取る上で、「友愛数」という数学の面白さを基に家政婦とコミュニケーションを取るシーンがありました。博士らしい他者との距離の取り方で、とても印象的でした。

この完全数の考え方は「友愛数」の考え方に似ています。なので思い出しました。コーディングテストの練習中に、博士の愛した数式を思い出して、少し悲しくなる、という謎現象でした。

最後までお読み頂きありがとうございました！（笑
Julia 凡例の枠外表示

###Juliaのグラフで凡例を枠外に表示

凡例がグラフの中に入って見にくい。
例：

```
plot(time,[Cx1 Cx2 Cx3 Cx4],label=["Cx(1,-1)" "Cx(1,0)" "Cx(1,1)" "Cx(2,-2)" ])
```
![in_ex0840_cell1_Cx_ROI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052824/45ff76be-a360-1a4d-557c-4d9d9103299c.png)


解消例として、
例:

```
plot(time,[Cx1 Cx2 Cx3 Cx4],label=["Cx(1,-1)" "Cx(1,0)" "Cx(1,1)" "Cx(2,-2)"　, legend = :outertopleft ])
```

![out_ex0840_cell1_Cx_ROI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052824/416ba2bc-a0f1-cacd-4297-da6224f9bda5.png)


参考URL:
[How to move the legend to outside the plotting area in Plots.jl (GR)?](https://stackoverflow.com/questions/45097631/how-to-move-the-legend-to-outside-the-plotting-area-in-plots-jl-gr)
Laravel6で日付ごとにログを出力する方法

Laravelでログを出力する方法とそれを日付ごとに出す方法です。
# 環境
PHP 7.4.10 
Laravel Framework 6.18.40


# ログ出力の方法
```
Log::debug('An informational message.');
```
https://readouble.com/laravel/6.x/ja/logging.html

初期状態だと
\storage\logs\laravel.log
にログが出力されます。

# ログを日付ごとに出す方法と設定
config\logging.phpを開く


~~~PHP:logging.php
 'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single'],  //このsingleの部分をdailyに
            'ignore_exceptions' => false,
        ],

~~~
single部分をdailyに変えると日付ごとにログが出力されるようになる。

dailyの設定を見てみる

~~~PHP:logging.php
'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),  //logの保存場所
            'level' => 'debug',  //logレベルの変更
            'days' => 14,  //保存日数
        ],
~~~
設定を変えたいときはここから変えれる
[Laravel5.6以降のログの機能をちょっと調べた](https://qiita.com/miriwo/items/0a44b70f722a3863ff38)

ファイルを分けて、エラーのみ出力するチャンネルを作成する方法
[Laravelのログ出力をエラーログのみ出し分ける
](https://qiita.com/K-Shuuun/items/37b7cc9a95030fe79494)

# リクエストログやSQLログを出したいとき
[Laravel リクエストログを出力する](https://qiita.com/ucan-lab/items/bfd15b096a916f811468)
[Laravel SQLの実行クエリログを出力する](https://qiita.com/ucan-lab/items/753cb9d3e4ceeb245341)
【初心者でもわかる】文章を途中で直角に折り曲げてL字にする方法

# どうも7noteです。文章を途中で折り曲げる方法

某有名使徒アニメのタイトルで、文字がL字に曲がっていたので、「これCSSで再現できるのでは？」
ということで、まずは参考イメージを用意します。

※筆者は某アニメを見ていませんのであしからず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/6e1c9516-9305-380e-3c62-16e192a01d72.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/363a1ee6-2c9a-8bc1-6e4d-3a2de34c7697.png)



## 作り方

### 「縦(たて)書き」からの「横(よこ)書き」

```index.html
<p class="Ltype"><span>使徒</span>、襲来</p>
```

```style.css
.Ltype {
  font-family: 'Yu Mincho Light','YuMincho','Yu Mincho','游明朝体',serif;
  font-size: 40px;
  font-feature-settings: "palt";
}

.Ltype span {
  -webkit-writing-mode: vertical-rl;  /* Safari用 */
  -ms-writing-mode: tb-rl;            /* IE用 */
  writing-mode: vertical-rl;
}
```

**<結果>**
![sample01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/e208f9e4-5095-7966-0075-1cc7d1627638.png)

ふむふむ、それなりにいい感じ。


### 「横(よこ)書き」からの「縦(たて)書き」

```index.html
<p class="Ltype">せめて、人間<span>らしく</span></p>
```

```style.css
.Ltype {
  font-family: 'Yu Mincho Light','YuMincho','Yu Mincho','游明朝体',serif;
  font-size: 40px;
  font-feature-settings: "palt";
  line-height: 1;        /* ← 追記 */
  transform: scale(0.6,1); /* ← おまけで追記 文字を長体にする */
}

.Ltype span {
  -webkit-writing-mode: vertical-rl;  /* Safari用 */
  -ms-writing-mode: tb-rl;            /* IE用 */
  writing-mode: vertical-rl;
  vertical-align: top;  /* ← 追記 */
}
```

**<結果>**
![sample03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/110bcc22-62c8-3db2-7295-556dfe16cb11.png)


## 解説

予めbodyに対して、`color: #fff;`と`background: #000;`を指定しております。

いわゆる**L**の方向に文字を曲げるほうが指定が簡単で、縦書きにしたいところをspanで囲ってあげて、縦書きのCSSを当てるだけで簡単に作成できます。

https://qiita.com/7note/items/ca94c80ddd775c510de4

横書きから始まる場合は追加でいくつか指定が必要になります。特に`vertical-align: top;`がないと**( 」)**の形に配置されるので注意が必要です。

## まとめ

普通のwebサイトを作っていれば作ることのないものなので、発想力が鍛えられます
しやっていても結構面白いものです。

どうしても**webでは字詰めが甘いので完璧にはならない**ですが、それっぽさを出すには十分の出来ではないかなと思います。

他にも思いついたらどんどんやっていきたいと思います。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
コの業界を目指す大学生へ(おまけ)

<h2>補足</h2>
<a href="https://qiita.com/KLaboratory/items/30bbc880b0547c9f89b7">コの業界を目指す大学生へ(前編)</a>
<a href="https://qiita.com/KLaboratory/items/85f0d197f425a8c5f736">コの業界を目指す大学生へ(後編)</a>
と2度に分けてIT業界(コの業界)への就職を希望する学生に向けてのお話をしてきました。これはあくまで、<b>パソコンを授業やレポート作成で触った程度</b>の学生をターゲットにしています。そういうレベルでもチャレンジすることも、やっていくこともできる世界であると。もちろん文系の学生でもかまいません。

前編、後編を読んで疑問に思われる点と、本題に関係ないおまけ話をここで書きたいと思います。

<h2>Macintosh(Mac)</h2>
後編で、技術的準備をするところで、WindowsとLinuxのインストールや環境のインストールの話を書きました。そこでMacintoshではダメなのか？と思われるかもしれません。学校でMacintoshを使っている人は特に不安になるでしょう。それには大きな理由があります。

<h3>MacはハードウェアとOSでワンセットである。そして高い。</h3>
Macは原則として、ハードウェアとOSがワンセットで売られています。OSだけを購入する(そして自作PCにインストールする)ことはできません。ハードウェアとOSがワンセットなので、OSをインストールするという機会もないでしょう。それは単なるリカバリです。そして、Macは高価です。性能が低いものでも10万円以上します。一方でWindows搭載マシンは2万円台から購入できます。今は、自作のほうが高く付きますが、4万円位で組み立てられます。それに、WindowsとLinuxの両方の練習をすることができます。それさえできれば、Macは業界に入ってから使っても間に合います。

また、普段遣いのPCにインストールしてデュアルブート點せたらどうかという話もありますが、OSのインストールや環境設定をやっていると、最初のうちは失敗して、二度と起動できなくなってしまい再インストールを余儀なくされることも多々起こります。その間、普段遣いのPCも使えなくなります。さらには、それでハードディスクやSSDをクラッシュさせてしまうかもしれません。デュアルブートで使っていると、普段の作業もできなくなってしまいます。その意味でも、どうなってもいいPCがあると安心です。IT業界はスーツや革靴は必要ないので、その資金をPCに充てましょう。

<h3>Macは仕事にならない</h3>
これは昔話で今はそんなことはありません。MacOSも非常に安定した素晴らしいものになり、ほとんどのアプリケーションがWindows版、Mac版、Linux版(は一部を除くが)といずれも揃うようになったきました。一般業務に関してなら、Windowsを使おうがMacを使おうが変わりはほとんどありません。

私がデビューした頃は違います。WindowsもMacも今ほどは安定して動作しませんでした。特にMacは、アプリケーションがエラーを起こすと下のようなメッセージが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/8df2037d-cc9c-e965-4079-b9a881219b92.png)
右下に「Restart(再起動)」とあるように、ここから復帰するにはOSを再起動させるしかないのです。Windows10でアプリがトラブったときは「応答なし」などとなり、そのアプリを落とせば他のアプリやOSは影響は受けません。しかし、この頃はアプリケーションのエラーなのにOSを道連れにするという非常にこまったものでした。しかもこれが<b>頻発する</b>のです。うっかりセーブをし忘れて他のアプリが落ちたためにそれまで作業が台無しになるという苦い思いをした人も多かったものです。

しかし、それ以上に深刻な問題がありました。<b>Macのシェアが絶望的に低かった</b>のです。今のMacのシェアは15%くらいだそうです。しかし、筆者がこの業界に入ったときはちょうどアップルコンピュータ社の迷走期でもあって、シェアは数%ほどにまで落ち込みました。筆者は当時はWindows95搭載のNEC-PC9800と、PowerMacの2台を使っていました。当時の開発環境は、Windowsは今もあるVisual Studio、MacではCodeWarriorというものでした。Windows版のアプリが好評だったときに、Mac版への移植という話はしばしばでましたが、利用者があまりにも少ないのです。趣味であるならたとえ利用者が自分ひとりだけであっても作ることもありますが、仕事となると金にならないことはやれません。次第にMacの開発からは遠ざかってしまい、そのまま今に至っています。

しかし、今ではMacの利用者も増えていますので、Mac上での開発も必要とされています。

そんな昔話をちょこっとだけしてみました。
【GCP】リソースについてまとめた

GCPにはリソースという概念があるので、今さらながらそれについてまとめてみた。
別に難しいことはなく、GCPリソースが当てはまるだけなんですが。

具体的には、
Compute Engine インスタンス
Cloud Storage バケット
etc…

#参考URL
リソースと権限の関連性がよくわかります。
https://www.isoroot.jp/blog/1244/
https://christina04.hatenablog.com/entry/understand-gcp-iam
https://qiita.com/suzukihi724/items/6050897649681fc3aebf
Salesforce リリース準備状況戦略 ⇒ Salesforce のリリースプロセスの概要

１．Salesforce リリースはいつ行われますか?
２．エディション情報、重要な注記、新機能を有効化する手順を含め、新機能の詳細を学ぶためのベストプラクティスとは?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/d18bd207-4159-5bb2-893f-20e4e8790f85.png)
PythonでTweepyを使ってTwitterをごにょごにょする


####TwitterDevelopers
https://developer.twitter.com/en/portal/dashboard

###事前設定
初期設定はReadOnlyになっているでツイートするとエラーが発生する。
設定の変更が必要である。
設定を変更したら、各トークンの再発行が必要とのこと！
https://qiita.com/butsuli_shine/items/78fd5ee6fdb4a0581652

#基本系

```.py
import tweepy

# 認証に必要なキーとトークン
API_KEY = 'xxxxxxxxxxx'
API_SECRET = 'xxxxxxxxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxxxxxxxxx'
ACCESS_TOKEN_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxx'

# APIの認証
auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
```

###キーワードに関連するツイートを取得

```.py

# キーワードからツイートを取得
api = tweepy.API(auth)
tweets = api.search(q=['くるま'], count=10)

for tweet in tweets:
    print('-----------------')
    print(tweet.text)
```

###普通にツイート
```.py

api = tweepy.API(auth)

#tweet
api.update_status("hello tweepy")
```

###画像付きでツイート
```.py
api = tweepy.API(auth)

#tweet
api.update_with_media(status = "hello tweepy with media", filename = 'hoge.jpg')
```
ZONeエナジー プログラミングコンテスト “HELLO SPACE”　備忘録

https://atcoder.jp/contests/zone2021

結果
CとDが難易度逆という仕様。
なんでこんなことにした…
A：AC
B：AC ちょっと考えた
C：時間切れ
D：時間切れ
E：未
F：未

A - UFO襲来
ある文字列中に「ZONe」という文字列は何個あるか？
文字列12個程度なので、1個ずつ最初から数えて、あったらcount++って感じにした。

```php
#include <bits/stdc++.h>
#include <math.h>
using namespace std;

int main() {
    string S;
    cin>>S;
    int count=0;
    for(int i=0;i<S.size()-3;i++){
        if(S.at(i)=='Z'){
            if(S.at(i+1)=='O'){
                if(S.at(i+2)=='N'){
                    if(S.at(i+3)=='e'){
                        count++;
                    }

                }
            }
        }
    }
    cout<<count<<endl;
  }

```
B - 友好の印

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112433/2f37a920-6471-8b98-8275-1f9f1372fcc2.png)
邪魔なる高さがどこか？
タワーの高さとUFO位置を結ぶ直線を引き、Y軸切片を算出。
最小となるY軸切片がタワーの一番低い狙撃ﾎﾟｲﾝﾄ答え。
y=ax+bの考えでOK。

```php
#include <bits/stdc++.h>
#include <math.h>
using namespace std;

int main() {
    double N,D,H;
    double d[110];
    double h[110];
    double ans;
    double ansmax=0;
    cin>>N>>D>>H;
    for(int i=0;i<N;i++){
        cin>>d[i]>>h[i];
        if(h[i]>((H/D)*d[i])){
            ans=((D*h[i])-(H*d[i]))/(D-d[i]);
            if(ans>ansmax){
            ansmax=ans;
            }
        }
    }
    if(ans==0){
        cout<<"0.0"<<endl;
    }
    else{
    cout<<ansmax<<endl;
    }
  }
```
PythonでLINE Notifyへ通知を送る


ここからアカウントを登録してトークンを取得します。
https://notify-bot.line.me/ja/

###ターミナルからrequestsをインストールしておく
```hoge.py
pip install requests
```


```hoge.py
import requests


# LINEに通知させる関数
def line_notify(message):
    token = 'XF8fj16T**************dcqqS9CXOa'
    url = "https://notify-api.line.me/api/notify"
    headers = {"Authorization": "Bearer " + token}
    payload = {"message": message}
    requests.post(url, headers=headers, params=payload)
就職活動におけるGithubリポジトリの活用

# １．スキルの証拠をリポジトリで公開

　時々、役員をしているソフトウェア会社の書類選考や面談をすることがあります。
その時、できればGithubのリポジトリがあれば送ってほしいと事前にお願いすることがあります。

　コーディングの記録を見るには、commitをみることでどれだけの時間関わっているのかがわかりますし、コーディングのスキルもわかります。
　また、パッケージ管理のマ二フェストをみればどういった技術をつかっているのかも当然わかります。ですので、就職活動をするとき、自らの学習の記録として、Githubにコーディングの記録を載せていき、それを応募時に面接担当者に送るのもありだと思います。

# ２．応募者としてのポイント

## （１）READMEを整理する

　何のソフトをどのような技術や構成でつくったのか整理しておくと面接官がスキル判定しやすいです。

## （２）パッケージ管理ソフトのマニフェストを含める

　恐らくフルスクラッチでコーディングをする人は少ないと思いますが、できるだけいろいろなライブラリをつかってパッケージ管理ソフトのマニフェスト(package.json、composer.jsonなど）をみてもらうようにします。
　そうすると面接官は、どのようなライブラリをつかっているのか判別しやすいです。

## （３）issueやブランチも適宜利用する

　一人で開発しているとissueやブランチを作らずに開発をしてしまいがちですが、一応、スキルアピールなので、バージョン管理ツールを使いこなしているところもアピールする方がよいでしょう。

## （４）レビューをしてもらえるとなおよい
　
　知り合いでもいいので、コードレビューした記録があるとなおいいですね。一人ではなくいろいろな人から教えてもらっているというのは、コミュニケーション力の確認にもなります。

# ３．面接官のリポジトリの確認点

　Githubのリポジトリを送ってきた場合、当然、レビューをしますがその時ポイントがあります。

## （１）アカウントの確認

　時々、複数人で開発しているリポジトリを送ってくる人がいますが、その人のアカウンを確認しておく必要があります。

## （２）ランダムにソースについて質問する

　基本的に他人が作ったリポジトリをforkして送ってくる人はいないと思いますが、念の為、いくつかのソースについてランダムに質問するのがよいと思います。
　たとえば、どのあたりが苦労したとか。どういったライブラリをつかって対応したとか。

## （３）コミットから時間をみる

　コミットをみればどれだけの時間触っているのかわかります。ですので、必ずコミットを確認します。

# ４．さいごに

　今は、オンライン、かつ、無料でスキルをアピールする手段がたくさんあります。
　Githubはそのなかでも、学習過程を見せるにはもってこいのサービスだと思います。
　応募する人も、面接する側も活用することでよりよい就職活動、採用活動ができると思います。
Laravelとcomposerの名前空間やエイリアスの理解をしよう

Laravelを触っていて、`use Illuminate\~~~~`とか`namespace App\Http\Controllers;`みたいなのを見て、

「いや、`Illuminate`ってどのディレクトリ指してんの？」
「`App`って`appディレクトリ`のことだよね？なんで`app`を`App`って最初大文字にしてるの？」

みたいな疑問を抱いたことはないでしょか。

別に知らなくても良い部分ですが、ソースコードを追うことは理解を深めて、より柔軟な設計をするためにも必要なので、この機会に知っておくと良いかもです。

ということで、早速調べたことをメモっていきます。

## そもそもPHPにはautoloadという仕組みがある。

PHPにはファイルを自動でロードしてくれる`autoload`という仕組みがあります。

`autoload`を使わない場合は、

```
require_once "hoge.php";
```

みたいにしますが、こんなの面倒ですよね。

そこで登場するのがautoloadです。

## Laravelでもautoloadが使われいる。

Laravelで`app/composer.json`を見てみると、

```json:composer.json
"autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },
```

こんな記述があるはず。

`"psr-4"`というのは規約の名前なので、あまり気にしなくてOKです。

`\\`と2つのバックスラッシュがありますが、前の1つは次のバックスラッシュをエスケープしてるだけなので、実質`\`と同じ意味です。

そして、最初の`"App\\": "app/",`を見てください。

これは`app/`を`App\`と紐づけています。

つまり、`App\`と書けば`appディレクトリ`を読み込んできます。

## エイリアスについて

Laravelでは`use Auth`とするだけで、認証機能が使えます。

では、このAuthはなぜこれだけで使えるのでしょうか。

それはエイリアスが登録されているからです。

では`config.app.php`を開いてみてると

```
'Auth' => Illuminate\Support\Facades\Auth::class,
```

こんな記述があるはず。

ここで、`Auth`と記述したら`Illuminate\Support\Facades\Auth::class`を指しますよ。

と、登録しています。

## composerでインストールしたライブラリは自動的に名前空間が登録される。

実はcomposerでライブラリをインストールしたら自動的に名前空間を定義してくれています。

名前空間は`プロジェクト/vendor/composer/autoload_classmap.php`で定義されているので、見てみると、ズラーっと色々書かれていて、

```
'Illuminate\\Support\\Facades\\Auth' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/Auth.php',
```

こんな感じで書かれているところもあるはずです。

ここで、`Illuminate\Support\Facades\Auth`は`vender/laravel/framework/src/Illuminate/Support/Facades/Auth.php`を指しますよと定義されています。

なので、`use Auth`をすることで、`vender/laravel/framework/src/Illuminate/Support/Facades/Auth.php`が読み込まれるわけです。

## ちなみに

`vendor/laravel`というのがあるはずです。

さらに`vendor/laravel/frameworkディレクトリ`の中を見てみると、ここにも`composer.json`があります。

ここでは下記のように記述されています。

```json:autoload
"autoload": {
        "files": [
            "src/Illuminate/Collections/helpers.php",
            "src/Illuminate/Events/functions.php",
            "src/Illuminate/Foundation/helpers.php",
            "src/Illuminate/Support/helpers.php"
        ],
        "psr-4": {
            "Illuminate\\": "src/Illuminate/",
            "Illuminate\\Support\\": ["src/Illuminate/Macroable/", "src/Illuminate/Collections/"]
        }
    },
```

つまり、`Illuminate/`と記述すれば、`src/Illuminate/`を指しますので、Laravelのライブラリはこんな感じで作られてるのかーということがわかります。
クッキーの仕組み


### クッキーとは
---
ユーザーの情報を保存しておくためのファイルのことです。

### 仕組み
---
初回アクセス時サーバーがユーザーにクッキーを発行します。
クッキーデータは一定期間ユーザーのブラウザに保存されて次回以降のアクセス時に利用されます。

### どのように利用されるのか
---
たとえば、多くのショッピングサイトでは**ユーザーのID**や**カートの情報**をクッキーで保存しています。
これにより１回サイトを離れてしまったユーザーがまたサイトを訪れた際に、毎回IDを入力したり商品をカートに入れ直したりすることなくスムーズにショッピングの続きができます。
リッチテキストにあるURLだけを抜き取る

プロセスビルダーでリッチテキストフィールドに記入されているURLを抜くときのお話。

どうもURLに&があって、エンコードされているようです。

そのため、正常なURLにならないって。


解決策としては、強制的にエンコードされた文字を置き換えることです。

```
SUBSTITUTE(SUBSTITUTE(
RIGHT( LEFT( [Contact].Image__c, FIND(" alt", [Contact].Image__c) - 2 ), LEN( LEFT( [Contact].Image__c, FIND(" alt", [Contact].Image__c) - 2 ) ) - FIND("src=", [Contact].Image__c) - 4 )
,"&amp;amp;","&")
,"&amp;amp;","&")
```

https://trailblazers.salesforce.com/answers?id=9064S000000kFR0QAM

ベストアンサーいただけました。ありがとうございます。
amazon linuxにterraformとtfenvを入れる

##経緯
terraformをAmazon Linux2に入れるだけなのに、割とハマってしまったので備忘録として残します。
（特にtfenvのインストールで悩んだ）

##使用する環境
OS: Amazon Linux 2
Kernel: Linux 4.14.231-173.361.amzn2.x86_64

##terraformをインストールする
###やり方
①yum-utilesをインストールする

```
# sudo yum install -y yum-utils
```

②yum-config-managerをリポジトリに追加する

```
# sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
```

③terraformをインストールする

```
# sudo yum -y install terraform
```

##tfenvをインストールする
###tfenvって何？
terraformのバージョン管理できるツールです。これがないと色々困るので入れる。

###やり方
①gitからcloneする

```
# git clone https://github.com/tfutils/tfenv.git ~/.tfenv
```

②今現在のパスがどうなっているのか念のため確認する
ここに「/usr/local/bin」と記載があるので、ここのパスは通ることを確認する

```
# echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:
```

③パスを通す

```
# sudo ln -s ~/.tfenv/bin/* /usr/local/bin
```

④リストを表示する

```
# tfenv list-remote
```

⑤リストから使いたいバージョンをインストールする
今回は0.14.7をチョイス。（このバージョンが一番安定していると言われている為）

```
# tfenv install 0.14.7
```

⑤インストールしたものを使うよって宣言をする

```
# tfenv use 0.14.7
```

⑥使用するバージョンが宣言通りになっているのか確認する
対応しているバージョンの横に※がついているところが使うものと指定されています。

```
# tfenv list
* 0.14.7
  0.12.3
```

##まとめ
★ 公式の文章はよく読むこと
★ 上手くいかなかったらパスが通っているのかをよく確認すると良いということでした。
　私の場合パスが通っていなくて積んでいたので。。。

##参考にしたサイト
[公式サイト Terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli)
[EC2でtfenvを使ってみる](https://qiita.com/simis/items/19270c017c4193532f4d)
[Manage multiple terraform version with tfenv](https://opensource.com/article/20/11/tfenv)
ローコード/ノーコードブームなどを事例とした「ものごとの発展の法則」について

# これは何？
- 業務系(BtoB)の受託開発エンジニアの目線から、ものごとの発展の法則について考察したものです。
- ローコード、ノーコードブームも「かつて見た何か」である気がします。そこには過去と今と将来とに繋がる法則がありそうでなので、それをポエム形式にしました。

# ものごとの発展の法則とは（ヘーゲルの「事物の螺旋的発展」になぞらえて）

ものごとの発展は、常に違う新しいものに変化していると捉えられます（思います）。しかし、現実はそうではなく、少し長くこの業界にいると「かつて流行った何か」が今よみがえってくるように見えることがあります。

例えば、
・ローコード/ノーコードブームもかつて昔流行ったツールがWeb化して再ブームとなっていること
・かつてJavaで分散オブジェクト(CORBA = Common Object Request Broker Architecture）などと呼ばれていたリモート呼び出しの考え方が、RESTful APIやgRPCのようにリモート呼び出し手続きがWebベースかつ言語に依存しない形になり進化したこと
・言うまでも無いAIブーム（第3次AIブームなどと呼ばれることから、過去に2回のブームがあったということ）

この現象は、哲学者ヘーゲルがいう「[事物の螺旋的発展](https://jbpress.ismedia.jp/articles/-/50110)」の感覚があるということです。
端的に言えば、ものごとは螺旋階段を上がるように発展するということを言っています。螺旋階段は、横から見れば上にあがっていきますが、上から見れば同じところをグルグルと回っているに過ぎません。

IT業界における技術革新は、この螺旋的発展の宝庫ではないでしょうか。具体的な事例として二つほど見ていきます。

# 具体的な事例としてのローコード/ノーコードブーム

**＜昔＞**
かつては、現在のようなWebアプリの時代ではなく、デスクトップアプリケーション構築が主体でした。

* IBM社 [ロータスアプローチ](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%BB%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81)
  * 1993年頃ロータス社が開発し、1995年にはIBMへ買収されました。
  * ツールの雰囲気は、現在も現役で使われている方のサイトが参考になります。 http://ksdmiya.art.coocan.jp/page016.html
* ヴァル研究所 ナイル
  * 1991年、駅すぱあとで有名なあの会社がかつて作っていました。
* 管理工学研究所 [日本語データベースシステム「桐」](http://www.kthree.co.jp/kiri/index.html)
  * 1986年に初代バージョンをリリース

もっと他にもありますが、そういう意味では、「データベースソフトウェア」と呼ばれるブームでしたか。
今見ると、まさにローコードツールの走りだと思えてなりません。
今に無い特徴としては、業務で利用される帳票と印刷に力を入れていたのではないでしょうか。

**＜今＞**
いまは、Webを中心としたアプリケーション構築サービスが主体です。
Kintone、PowerApps、.bubble、OutSystems、FileMaker、yappli ･･･　ココに書き記せないほどのローコード/ノーコードツールが台頭しています。

かつてになかった特徴としては、Webが主体となったこと、データ連携の多様さ（他社サービスとの連携）にあることでしょうか。

# 具体的な事例としてのRPA(Remote Procedure Call)

**＜昔＞**

2000年頃書かれた記事「[スキルアップのための分散オブジェクト入門](https://www.atmarkit.co.jp/fjava/rensai2/objetry01/objetry_about.html)」（＠ITの記事）を拝見していると下記の様なワードが説明されています。

* [CORBA](https://ja.wikipedia.org/wiki/Common_Object_Request_Broker_Architecture)
* [EJB（Enterprise JavaBeans）](https://ja.wikipedia.org/wiki/Enterprise_JavaBeans)
* [COM+](https://ja.wikipedia.org/wiki/Component_Object_Model)
* [Java ARMI（Java Remote Method Invocation API）](https://docs.oracle.com/javase/jp/1.5.0/guide/rmi/hello/hello-world.html)
* [SOAP](https://ja.wikipedia.org/wiki/SOAP_(%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB))

EJBやJavaARMIあたりからは、何ともJavaという実装技術に依存した仕様で、しょっぱい臭いがしています。
SOAPあたりの登場で、XMLを活用したメッセージングが行われるようになり、実装技術から切り離されていく感じがします。

**＜今＞**

* gRPC - Protocol BuffersとHTTP/2が特徴
* JSON-RPC - HTTPをベースとしたJSON形式のRPCプロトコル

がっつりHTTPをベースとしたやりとりにシフトしている感じがします。
当然ながら流れは、実装技術非依存で、様々な言語で呼び出しができるのが当たり前の時代です。

# 結論

IT界隈の技術の発展・進化ばかりを追いかけていくと、「キャッチアップ疲れ」が起きてしまいます。私もそうです。
とはいえ、ある程度、この業界にいると「あれ･･･かつて見た何かと似ている」となります。

実は発展・進化しているように見えても、古く懐かしいモノ（こと）が復活してくることがよくあります。
ただ、その復活したモノ（こと）は、過去より何か一段上がっているということが特徴です。（＝事物の螺旋的発展）

この事物の螺旋的発展を通してみると、キャッチアップ疲れが少しでも解消されるのではないでしょうか。