OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 20.04へのOpenFOAMのインストール

#0. はじめに
OS: Ubuntu 20.04
インストールするソフトウェア: OpenFOAM v2106

#1. リポジトリの追加
[OpenFOAM公式](https://www.openfoam.com/)の[ダウンロードサイト](https://develop.openfoam.com/Development/openfoam/-/wikis/precompiled/debian)に行く。
UbuntuのリポジトリにOpenFOAM関連サイトを追加する。

```
wget -q -O - https://dl.openfoam.com/add-debian-repo.sh | sudo bash
```

あるいは

```
curl -s https://dl.openfoam.com/add-debian-repo.sh | sudo bash
```

どちらのコマンドも機能は同じだが、少なくとも私の環境ではデフォルトではcurlコマンドがインストールされていなかったので、wgetを使用した。
なお、**プロキシ環境では上記コマンド内のshファイルに修正が必要**。修正方法は追って記載します。

#2. OpenFOAMのインストール
以下のコマンドを実行してOpenFOAM v2106をインストールする。

```
sudo apt-get install openfoam2106-default
```

上記のコマンドについて、[公式サイトのガイド](https://develop.openfoam.com/Development/openfoam/-/wikis/precompiled/debian)には"openfoam2112"と記載されているが、この記事の執筆時点(2021年12月21日)では、リポジトリにOpenFOAM v2112がまだ追加されていないようた。apt-getコマンドでv2112をインストールしようとすると、エラーが吐き出されてしまう。

#3. テスト
端末で以下のコマンド

```
openfoam2106
```
を実行すると、コマンドラインでOpenFOAM shell sessionが起動する。こうすると、カレントディレクトリがどこであろうとかかわらず、sessionの初期ディレクトリは./になる。
書籍等で

>端末にコマンドとして"tut"と打ち込むと、チュートリアルケースのパスに移動できる。

とあるが、これはOpenFOAM shell sessionでの話である。ただの端末では"tut"と打ち込んでもエラーが返されるだけである。
なお、OpenFOAM shell sessionを立ち上げると$FOAM_TUTORIAL等の環境変数が自動的に付与される。
コンテナイメージ内にCloud SDKをインストールしてみる

この記事は[NI+C Advent Calendar 2021](https://qiita.com/advent-calendar/2021/niandc_teamgcp) 22日目の記事となります。

今回はGoogle Cloudでホストされるリソースやアプリケーションの管理に使用できるツールのCloud SDKをコンテナに導入する方法を紹介します。
以前、コンテナにCloud SDKの導入が必要なことがあったため、その時のメモを元に備忘録的な感じで書いていきたいと思います。

# 手順

##0. 準備
適当なフォルダを準備して、その中にDockerfileを用意します。

```
mkdir sample && cd sample
touch Dockerfile 
```
以降は用意したDockerfileに記述していく内容となります。

##1. イメージ
今回はUbuntu18.04のOSイメージを使用して作成していきます。
このイメージを使用した理由としては、DebianとUbuntuでは導入方法がほぼ同じな為です。
どういうことかと言いますと、pythonやGoなどの[dockerhub](https://hub.docker.com/)に公開されているイメージを見ると```FROM buildpack-deps:xxx```がOSイメージとして採用されているのですが、大元をたどるとDebianベースなので、今回の方法を流用することで他のイメージにもインストールできるかと思います。

```
FROM ubuntu:18.04
```

##2. ツールインストール
Cloud SDKの導入の際に必要なツールをUbuntu内にインストールしていきます。
ツールは以下のものをインストールしていきます。

* curl
* sudo
* apt-transport-https
* ca-certificates
* gnupg

```
RUN apt-get update  -y && \
    apt-get install -y curl && \
    apt-get install -y sudo && \
    apt-get install -y apt-transport-https && \
    apt-get install -y ca-certificates && \
    apt-get install -y gnupg
```

##3. Cloud SDKインストール
最後にCloud SDKのインストールを行います。

```
RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg  add - && \
    sudo apt-get update -y && \
    sudo apt-get install google-cloud-sdk -y
```
これでDockerfileの作成は終わりです。このあと```Docker build```を行い作成したコンテナに入り、初回起動コマンドの```gcloud init```を行って完了となります。

# まとめ
作成したDockerfileをまとめて載せたいと思います。

```
FROM ubuntu:18.04

# 必要なコマンド類のインストール
RUN apt-get update  -y && \
    apt-get install -y curl && \
    apt-get install -y sudo && \
    apt-get install -y apt-transport-https && \
    apt-get install -y ca-certificates && \
    apt-get install -y gnupg 

# Cloud SDKインストール
RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg  add - && \
    sudo apt-get update -y && \
    sudo apt-get install google-cloud-sdk -y
```
今回は作成のみでイメージの軽量化なんかはできていないのでそのあたりもチャレンジしていけたらなと思っています。

#おわりに
今回この記事をまとめている際にこのようなものを見つけました。

[Cloud SDK Docker イメージ](https://cloud.google.com/sdk/docs/downloads-docker?hl=JA)

ちゃんと公式から出ていたのですね。。。（ドキュメントは隅から隅まで見ろ）

この記事を利用してdevコンテナを作ってみたり、他のイメージにCloud SDKをインストールして利用していただければ幸いです。
最後までご覧いただきありがとうございます。

参考文献：
[Cloud SDK のインストール](https://cloud.google.com/sdk/docs/install?hl=JA)
Macでファイル移動のショートカットキー

WindowsからMacへ乗り換えた方で、1番最初に悩むのがファイル移動だと思います。
「⌘ + X」で切り取りができない！！！と1度は思ったことがあるはずです。
そんな方へMacでファイル移動する方法を紹介します。

## ファイル移動のショートカットキー
||Mac|Windows|
|:---|:---:|:---:|
|コピー|⌘ + C|Ctrl + C|
|貼り付け|⌘ + V|Ctrl + V|
|移動|⌘ + C → ⌥ + ⌘ + V|Ctrl + X → Ctrl + V|
Cloud paksの下回りのOpenshiftのCNIの話

# はじめに
Openshift Container Platform(以下OCP)はご存知の方が多いと思いますが、
実態はKubernetes(以下、k8s)となっています。
そのためk8sでも様々なCNI (Container Network Interface)が使用できるように、
OCPでもデプロイ時にCNIを選択することができます。

この記事では使用できるCNIについて軽くまとめようと思います。

# この記事を書くに至った背景

業務の都合でWindows ContainerをデプロイできるOCP環境を構築しようとしていたところ、
CNIの都合でデプロイしなおしになったことが何度もあったので自分の調査結果をまとめておこうと思いました。


# CNIとは
公式の記事ではこちらを参照ください。

https://kubernetes.io/ja/docs/concepts/cluster-administration/networking/#the-kubernetes-network-model

KubernetesはPod同士のネットワークを確保するため様々なSDN(Software Defined Network)ソリューションを使用することができます。

OCPで使用することができる3rd party CNI Plug-inは下記にまとまっています。

https://access.redhat.com/articles/5436171


その他OCPが標準で使えるCNI は下記の２つがあります。

1 Openshift-SDN
2 OVN-Kubernetes
3rd party製のCNIについては各ベンダーの記事に任せるとして、この記事では上記２つのCNIについてまとめたいと思います。

# Openshift-SDNについて
Openshift SDNはOCP環境に対してはVXLANを使用して、Pod同士の疎通を可能とするCNIです。
VXLANを使用するCNIと言えばflannelが有名ですが、じゃあflannelと何が違うんでしょう。

詳細は下記記事をご覧ください

https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.4/html/networking/openshift-sdn-default-cni-network-provider

（きちんと黒沢も読み取れていませんので後日追記いたします。）




## (ところで)VXLAN とは
https://www.nic.ad.jp/ja/basics/terms/vxlan.html

パケットに対してさらにカプセリングを行うことでVLANに縛られないネットワークを構成することが可能です。
一方でカプセリングするするのでネットワーク機器側のMTUを大きくするか、
もしくはサーバ側のMTUを小さくする必要があります。
Openshift-SDN、Flannel共にサーバ側のMTUを小さくしています。

 
# OVN-Kubernetesについて

詳細はこちらで確認

https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.9/html/networking/_ovn-kubernetes-default-cni-network-provider


OVN KubernetesはVXLANではなくGeneveというプロトコルを使用してL2ネットワークを広げるという特徴があります。

少し難しい話になりますが、VXLANでは固定長のヘッダでカプセリングをしていましたが
Geneveでは非固定長のヘッダを用いています。

非固定長になるとじゃあ何が嬉しいの？という話になるわけですが
非固定長にすることでService Chaningという技術を実現することができます。
普通の通信をするときは最低限のカプセリングを行い、
セキュアな通信を行わないといけない場合はルーティングをいじることなく
セキュリティアプライアンスを通るようにするということも可能になるわけです。

ここでポイントになるのがルーティングはいじらなくて良いということです。
Openshift側がセキュリティレベルを通信毎に確認し、フラグが上がっているかどうかで通信をどこに飛ばすかを決定してくれます。

一方で課題もあり、Geneve自体に対応しているベンダーが少なくService chainingという世界観は実現できていません。

Geneveのカプセリングについての展望に興味がある方は以下の記事をご参照ください。
前職の北アジア担当CTOである進藤さんがわかりやすく解説をしてくれているblog 記事があります。

https://blog.shin.do/2014/05/geneve-encapsulation/

また、OVN KubernetesをOCP環境で使用するときのメリットはRed Hat社の織さんが記事を書いてくれていますのでぜひご参照ください。

https://rheb.hatenablog.com/entry/openshift42ovn

加えて、OVN KubernetesにすることでWindows Nodeを追加可能になるなど、今後の展開が非常に楽しみなCNIです。


# まとめ
3rd party製も含めてOCP環境で使えるCNIについてまとめてみました。
環境に応じて適用すべきCNIは異なりますので、ぜひ詳細を確認してからご選択をお願いいたします。

例：
シンプルなKVM環境、もしくは独立のコンテナ環境を作る -> Openshift-SDN
上記に加えてWindows node を使いたい、iptablesをあまり使いたくない -> OVN-Kubernetes
VMware NSXを使用した環境でOCP環境を構築したい -> Antrea、NSX-T
Cisco ACIを使っている -> Cisco ACI CNI

以上となります。ありがとうございました！
【後輩たちのためのEV3rt講座(改)】もくじ

# はじめに

こんにちは!
私は数年前まで某中学・高校でロボット研究会に所属し、WROなどのロボコンに出場していた者です。
現在は大学生です。

この記事シリーズでは、【後輩たちのためのEV3rt講座(改)】と題し、TOPPERSが開発したμITRON RTOS、**EV3rt**の使い方について記していきたい思います。

基本的には中高生向けに書いているため、少々表現が易しすぎることがあるかと思いますが、何卒ご了承ください。

なお、私は数年前に[後輩たちのためのEV3rt講座](https://qiita.com/koushiro/items/4d18c877c93f823fc236)というほぼ同じタイトル記事を書いています。このころより時間が経ち様々変更点があるので、今回より正確に、より分かりやすく書き直そうという次第で書いております。ただ、当時の記事が全く役にたたない訳ではないので、必要に応じて参照していただければと思います。

# もくじ

## #1 Windows(Cygwin)版開発環境構築

https://qiita.com/koushiro/items/6edd0a41803d06de7541

## #2 Windows(WSL)版開発環境構築

https://qiita.com/koushiro/items/a9cd60178e0981d27020

## 【番外編】EV3rtで "no implicit conversion of Hash into String (TypeError)" となるエラーの対処法 (rubyのバージョンの変更)

https://qiita.com/koushiro/items/a071de5e3b6ae9cfc3bb
[py2rb] self.extend

# はじめに
移植やってます
# self.extend (Python)
```python
class xlist (list):
    def add(self, *args):
        self.extend(args)

class xint (int):
    def add(self, value):
        self += value

x = xlist([1,2,3])
print (x)
x.add (4, 5, 6)
print (x)

x = xint(10)
print (x)
x.add (2)
print (x)

# [1, 2, 3]
# [1, 2, 3, 4, 5, 6]
# 10
# 10
```
`self`に直接`extend`や`+`ってできるんですね。
# どうする？ (Ruby)
```ruby
class Xlist < Array
  def initialize(*args)
    args.each do |x|
      self << x
    end
  end

  def add(*args)
    args.each do |x|
      self << x
    end
  end
end

class Xint < Array
  def initialize(*args)
    args.each do |x|
      self[0].nil? ? self[0] = x : self[0] += x
    end
  end

  def add(*args)
    args.each do |x|
      self[0] += x
    end
  end
end

x = Xlist.new(1, 2, 3)
p x
x.add(4, 5, 6)
p x

x = Xint.new(10)
p x[0]
x.add(2)
p x[0]

# [1, 2, 3]
# [1, 2, 3, 4, 5, 6]
# 10
# 12
```
トリッキーですが、何とかできました。
# メモ
+ Python の self.extend を学習した
+ 道のりは遠そう
Macのプレビューでpdfの墨消しが反映されない時の対策

# 問題
Macのプレビューでpdfの墨消しを行ったが、反映されない。
（参考：[Macのプレビューで黒塗り文書を作る方法](https://blog.skeg.jp/archives/2021/08/pdf-paint-black-howto.html)）


# わかっていること
+ 他のpdfならできた。（ので、プレビュー側の問題ではなさそう）
+ 墨消ししたいpdfには「透かし」なるものが入っているらしい。

# 対策
1. Google Chromeでpdfを開く
1. 印刷で送信先にPDFで保存を選択
1. 再度墨消し
1. できた！！

# 環境
macOS Big Sur バージョン 11.6
Jest + @testing-library/react + mswのtips

JavaScriptではSinonをはじめとして、さまざまなモックの仕組みがあります。
その中で、最近Mock Service Worker(以下msw)が良いよ、とNode.js会長に教えてもらいました。

https://mswjs.io/

mswはブラウザではService Workerとして動き、通信をフックすることでフロントのJavaScriptコードからは本物のサーバーに見えるのが特徴です。また、Node.jsでも動きます。isomorphicではないのですが、モック用のハンドラー、ブラウザ用、Node.js用、エントリーポイントとファイルを4分割して作成すると、ブラウザ単体でもSPAとして動きつつ、サーバーサイドレンダリングでNode.jsでも動作するというNext.jsでも動作します。

https://github.com/vercel/next.js/tree/canary/examples/with-msw

Sinonでテストを書くと、どうしても内部実装べったりな壊れやすいテストになるのですが、mswだと疑似的なサーバーを実装している感じで書けますので、素結合な感じになります。

便利なのでJestのユニットテストでも使ってみようと思ったところ少し情報が少なかったり見つけにくかったりまとまってなかったのでいくつか紹介します。

# setupServerだけでいい

よくある利用例だとsetupWorkerを使ったり、環境によってsetupServerとsetupWorkerを呼び分けますが、JestのテストだとsetupServerだけでよいです。テストコードの中にインラインで書けるので影響範囲が分かりやすくて読みやすいテストになりますよね。

```js
describe("通信をモックするテスト", () => {
  const server = setupServer(
    rest.get("/hello", (req, res, ctx) => {
      return res(ctx.json({ message: "hello world" }));
    })
  );

  beforeEach(() => {
    server.listen();
  });

  afterEach(() => {
    server.close();
  });

  // ここにテストをかける
});

```

# fetchのPolyfillが必要

他のサンプルはブラウザ前提なのか書いてないのが多いのですが、Node.js環境だとfetchなんて定義されてない！というエラーが出ます。Polyfillを足す必要があります。

```
$ npm i -D whatwg-fetch
```

テストが書かれているスクリプトにそれぞれ以下のimport文を足します。

```js
import "whatwg-fetch"
```

# マッチしているかどうかの確認

モックを利用していて一番もやもやするのが、本当に正しく呼ばれているの？という点です。ウェブアプリケーションフレームワークだとnotFoundハンドラーとかあったりしますが、mswには残念ながらありません。で上から評価されるのかというとそういうわけでもなさそうで、範囲の広いものを書くとそっちにマッチしちゃいます。

とりあえず既成の通信がよくわからない部品をテストする場合、こういう書き方をすると、全部ダミーの方に吸われちゃいます。

```js
const server = setupServer(
  rest.get("/hello", (req, res, ctx) => {
    // なぜかこっちが呼ばれなくなる
    return res(ctx.json({ message: "hello world" }));
  }),
  rest.get("/*", (req, res, ctx) => {
    // 試しに呼ばれたURLをダンプしてみる
    console.log(`🐣 ${req.url.toString()}`);
    return res(ctx.json({ dummy: "call test" }));
  }),
);
```
最初は全部扱うアスタリスクのハンドラを書いておいて、その中でswitch文で分岐させて、全部の通信が明らかになったらいつもの書き方に・・・というのがいいのかな、と考えているところです。

# クエリーのマッチ

URLの末尾のクエリーにマッチするのはrest.get()の引数ではなくて、本体の中で取得します。　

```js
  rest.get("/hello", (req, res, ctx) => {
    const name = req.url.searchParams.get("name");
    return res(ctx.json({ hello: name }));
  }),
```

# モック通信待ち

useSWRを使ってサーバーから取ってきた内容を表示するコンポーネントを作ったとします。そのまま走らせると、ダウンロードが完了する前にテストが走り切ってしまうのでテストに失敗してしまいます。

```ts
import useSWR from "swr";

function Message() {
  const { data, error } = useSWR("/hello", fetcher);
  if (!data && !error) {
    return <div>loading</div>;
  } else if (error) {
    return <div>{error}</div>;
  }
  const { message } = data;
  return <div data-testid="loaded">{message}</div>;
}

```

@testing-library/reactであれば、waitForというのがいるのでこれを使います。ロード中か完了したのかが即座にわかるような書き方をしていれば（ここでは完了後にdata-testidがloadedになる前提)、こんな感じで書けます。

```ts
import { render, screen, waitFor } from "@testing-library/react";

// ここにモックサーバーを置く

test("Message", async () => {
  render(<Sample />);
  await waitFor(() => screen.getByTestId("loaded"));
  expect(screen.getByTestId("loaded").innerHTML).toBe("hello world");
});
```

# まとめ

調べてみたけど試行錯誤したりとかいろいろなサイトを見たらようやく出てきたものをまとめました。まあ情報が少ないというだけで使い勝手はかなり良いので、今後は積極的に使っていきたいと思います。Reactのカスタムフックのテストとかはかどりますよ。
[rails×Heroku]ActionCable を本番環境でRadisを使って実装する方法


# railsプロジェクトを編集

```ruby:conig/enviroment/production.rb
  # すべての送信元からのリクエストを許可
  config.action_cable.disable_request_forgery_protection = true
```

```yml:config/cable.yml
development:
  # adapter: async
  adapter: redis
  url: redis://localhost:6379

test:
  adapter: test
# 本番環境ではredisを使う、URLの部分を以下のように変更
production:
  adapter: redis
  # url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
  #  ↓ herokuのアドオンでradisを作成するとREDIS_URLという環境変数に自動的にURLを設定してくれる。
  url: <%=ENV['REDIS_URL']%>
  channel_prefix: room_api_production

```

## Herokuでradisサーバーを作成する

`heroku addons:create heroku-redis:プラン名`でradisを新たに作成
プランは色々あるので、以下の本家サイトを参考にしてください。

https://elements.heroku.com/addons/heroku-redis

```terminale:ターミナル
heroku addons:create heroku-redis:hobby-dev
```
で、作成できたらradisのURLを確認する。

```
 heroku config:get REDIS_URL
```

![スクリーンショット 2021-12-21 15.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239663/84d6cb99-5472-b6dc-e386-40460c4c76ae.png)


## 完了！
helm/helmfileとkustomize入門したのでリンク集とメモ

# 準備
kubernetesをある程度理解しておく

https://qiita.com/munaita_/items/c40954089f6789a653cd


# helm

- helmとは: kubernetsのパッケージマネージャー

https://helm.sh/ja/docs/intro/quickstart/

- クイックスタートでhemlに慣れる
- リポジトリがあり、`helm install` するとクラスタにリリースされる

https://helm.sh/ja/docs/intro/using_helm/

- 使い方ページでもう少し詳しく理解する
  - チャート: kubenetesにおけるhomebrew, apt dpkg, yum RPMに相当するようなもの
  - リポジトリ: チャートを収集して共有できる場所
  - リリース: Kubernetes クラスタで実行されているチャートのインスタンス
- valuesの設定方法なども理解する


https://knowledge.sakura.ad.jp/23603/

- Chartについてさらに深掘りする


> Helmでは、Chartのvalues.yamlファイルで指定されたパラメータや、「helm install」コマンドの実行時に与えられたパラメータをtemplatesディレクトリ内に格納されているテンプレートに与えてKubernetesのマニフェストファイルを作成し、それを適用（apply）することで各種リソースを作成する仕組みになっている。



# helmfile

- helmfileとは: helm の values.yaml やパラメータ、バージョン情報などを YAML ファイルで宣言的に管理できるツール

https://github.com/roboll/helmfile#installation

- インストールする

https://github.com/roboll/helmfile#getting-started

- Getting Startedでhelmfileに慣れる
- helmの設定をyamlで宣言的に定義してapplyでデプロイできるようになることを理解する

https://hawksnowlog.blogspot.com/2021/06/getting-started-helmfile.html

- こちらもシンプルなチュートリアルを提供してくれる
- `apply` と `sync` の違いなど把握する


# kustomize

- kustomizeとは: kubenetesのマニフェストファイルのoverlayを可能にすることにより、環境ごとの管理などがしやすくなるツール


https://kubectl.docs.kubernetes.io/installation/kustomize/

- installする(macはbrewでおk)

https://github.com/kubernetes-sigs/kustomize#usage

- README.mdで概要把握する
- resourceの指定やoverlaysしたbuildでmanifest 情報を生成する流れを把握する

https://atmarkit.itmedia.co.jp/ait/articles/2101/21/news004.html

- 日本語でより実際の使用シナリオを把握する

https://www.youtube.com/watch?v=ASK6p2r-Yrk&t=131s

- 動画を通して使用イメージを掴める
paiza予想をPython3で解く

##はじめに
今日も初学者がpaizaで遊ぶ。

問題の全文は下記から確認できる。
変数名は基本的にpaiza解答例順序で、自分用に見やすくしたい部分などは変えたりしている。

https://paiza.jp/works/mondai/prime_number_primer/prime_number_primer__paiza_conjecture

#問題文

>今の時点でゴールドバッハ予想（「全ての 3 よりも大きな偶数は 2 つの素数の和として表すことができる。」）に反例がないことを知った paiza 君は、
>自分もそれっぽい予想を言えば数学界に名を残せるのではないかと思い、正しいかもわからない次の paiza 予想を立てました。

>「全ての 3 よりも大きな平方数は 2 つの素数の和として表すことができる。」

>この予想が正しいかどうかを検証するために、4 以上 10^8 以下の平方数（9999 個）の中に paiza 予想を満たさないものが存在するかを調べましょう。

数字大好き人間なら一度は予想を妄想するものなのだろうか、paiza君は自分では証明したくないようなので私がします。
ゴールドバッハ予想の方ついての現状の理解度は、素数なんていっぱいあるんだからフィットする組み合わせも存在するでしょという感じ(浅い)

#アルゴリズムを賢くする
9999の平方数は99980001で、99980001全ての素数判定をするとタイムオーバーするんだろうなとは察する、それはそう。
これをスッキリさせるためのアルゴリズムを実際に思いついた順に書くと

①2つの素数の和が奇数の平方数は全て、2+奇数
②偶数の平方数はゴールドバッハ予想により、2つの素数の和
③判定が必要な平方数は全て奇数のため、平方数x-2の素数を判定する時の最大値は少なくとも```(x-2)**0.5```

#実際にpaizaに提出したコード

```py
n = 10000
    
def n_root_range(i):
    return int((i**2-2)**0.5)

for i in range(3,n,2):
    x = i**2
    for j in range(3,n_root_range(i),2):
        if (x-2)%j == 0:
            print(x)
            break
```

この予想が正しい場合は``` "paiza's conjecture is correct."```を出力してね？という条件なのだが、流石に```121```の段階で反例が出てきたらpaiza君には「諦めてくれ」という気持ちしか出てこない。
集計したらマイナス21億になった件

# 何があった

大規模な給与計算システムで給与計算処理を実行したら、総支出額がマイナス21億円で出てきました。

# どうしてそうなった

桁溢れしてました。

4バイトの符号ありint型だと最大の正の数値は2,147,483,647で、それに1を加えると最小のマイナス値-2,147,483,648になります。

```example.java
int i = 2147483647;
System.out.println("before i=" + i); // before i=2147483647
        
i += 1;
System.out.println("after  i=" + i); // after  i=-2147483648
```

４バイトでの２進数の計算式を表すと

01111111111111111111111111111111 + 1 = 10000000000000000000000000000000
↓
2147483647 + 1 = -2147483648

# どうすればよかった

集計した結果は思わぬ大きい値になるので、変数の型やDBのカラムの型は十分大きい値にしましょう。

ちなみにrubyだと自動で型が変わるようで桁溢れしないようです。
RubyのC拡張でint32_tをRubyのNumericに変換したいときはどうすればいいのか？

RubyのC拡張を作成する時、`int` や `long` に関しては `INT2NUM` `NUM2INT` `LONG2NUM` `NUM2LONG` などの便利なマクロが用意されているが、`int32_t` `uint32_t` などの型と相互に変換するマクロは用意されていない。intやlongなどの型のサイズはシステムによって変わる可能性もゼロではない。そこで、ruby-jpで質問したところ、

マクロを使用すればいいという回答を頂いた。すこし厄介ですが、こんな感じになると思います。

```c
#define SIZEOF_INT32 4
#define SIZEOF_INT64 8
```

```c
#if SIZEOF_SHORT == SIZEOF_INT32
#define NUM2UINT32 NUM2USHORT
#define NUM2INT32 NUM2SHORT
#define UINT32_2NUM USHORT2NUM
#define INT32_2NUM SHORT2NUM
#elif SIZEOF_INT == SIZEOF_INT32
#define NUM2UINT32 NUM2UINT
#define NUM2INT32 NUM2INT
#define UINT32_2NUM UINT2NUM
#define INT32_2NUM INT2NUM
#elif SIZEOF_LONG == SIZEOF_INT32
#define NUM2UINT32 NUM2ULONG
#define NUM2INT32 NUM2LONG
#define UINT32_2NUM ULONG2NUM
#define INT32_2NUM LONG2NUM
#else
#error "Neither int, long, nor short is the same size as int32_t"
#endif
```

```c
#if SIZEOF_INT == SIZEOF_INT64
#define NUM2UINT64 NUM2UINT
#define NUM2INT64 NUM2INT
#define UINT64_2NUM UINT2NUM
#define INT64_2NUM INT2NUM
#elif SIZEOF_LONG == SIZEOF_INT64
#define NUM2UINT64 NUM2ULONG
#define NUM2INT64 NUM2LONG
#define UINT64_2NUM ULONG2NUM
#define INT64_2NUM LONG2NUM
#elif SIZEOF_LONGLONG == SIZEOF_INT64
#define NUM2UINT64 NUM2ULL
#define NUM2INT64 NUM2LL
#define UINT64_2NUM ULL2NUM
#define INT64_2NUM LL2NUM
#else
#error "Neither int, long, nor short is the same size as int64_t"
#endif
```

けっこう面倒くさい。
もしもこういったものを簡単にやりたいという要望が多ければ、将来的には `UINT32TONUM` などのマクロがRuby本体に入る可能性もあるかも知れませんとのことです。

この記事は以上です。
Rを使ってExcelシートの年間予定表をGoogleカレンダーに登録する

初投稿です。

元々比較的デジタルな職場にいたのですが、2021年9月にてんやわんやで学校という割と（~~かなり~~）アナログな職場に移りました。（教員です。）
そうしたら当然と言うべきかIT系の色々を面倒見る立場になったので、その過程（と趣味）でやってみたことを文章化しておこうと思い立ち見る専だったQiitaを書き始めました。続くことを祈りながらやっていきたいと思います。

## 背景
皆さんの中でExcel製の年度予定表を見たことがある方は多いのではないでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629376/9585d118-26b1-bffb-7b51-8395d9705e2f.png)
↑こういうの

　これ自体は年間の予定がひと目で見やすくなかなか便利です。ただ、紙ベースでは持ち運びが効きませんし、データで持っておくにしても毎回Excelを開くのは少し面倒です。なんとかGoogleカレンダーのような連携可能なカレンダーアプリに登録しておきたい。
　ただ、この予定を一々Googleカレンダーに入力するのは**絶対に**嫌です。
　そこで、どうにかしてこれをGoogleカレンダーに一括で登録する方法を考えたというのが記事の趣旨となります。

##Googleカレンダーが取り込める形式
　まずは、どのような形式にすればGoogleカレンダーに一括登録できるかを知る必要があります。Googleのサポートを見るとどうやら.csvか.icsであればインポートできるようです。ただし、それぞれの列にGoogleカレンダーが読み込める名前をつけておく必要があります。

https://support.google.com/a/users/answer/37118?hl=ja&co=GENIE.Platform%3DDesktop

　となると方針は

1. なんとかしてExcelファイルを加工してデータを取り込めるかたち（CSV）にする
2. 加工したCSVをGoogleカレンダーでインポートする
3. 完成!

となるでしょうか。

以下コードになります。
ちなみに

* R4.1.2
* Windows11 x64

環境下で実行されています。
大幅なバージョンアップが発表されているR4.2環境下ではまだ試していません。

##実際に書いたコード

```R:calendar_kakou.R

#ライブラリを入れてない人
install.packages("tidyverse")
install.packages("lubridate")

google_schedule_csv <- function(){
  

library(tidyverse)
library(lubridate)
  
i = 0
t = 0
a <- data.frame(NULL)
b <- data.frame(NULL)

#ファイルの整形
for (i in 1:12) {
  
#ここの数字は予定表の1ヶ月あたりの列数によって書き換えてください
  t <- (1+(i-1)*7)
  a <- as_tibble(yotei[t:(t+6)])

  colnames(a) <- str_replace(colnames(a),pattern = "\\...*","")
  b <- rbind(b,a)
  }

b %>%  
  filter(.,!is.na(月)) %>% 
  mutate(.,
         年=if_else(
           月>3,
            as.double(year(today())),
            as.double(year(today())+1)
                 )
            ) %>% 
  filter(.,
         !is.na(行事)
         ) %>% 

#Googleの書式に合わせて列の名称を変更→必要な行だけ抽出
  mutate(.,
    date=
    str_c(年,月,日,sep="/"),
    `All Day Event` = TRUE,
    Private = TRUE,
    `Reminder On/Off` = FALSE
    ) %>% 
  select(
      `Start Date` = date,
      Subject = 行事,
      `All Day Event`,
      Private,
      `Reminder On/Off`
    ) -> b
  view(b)
  write_csv(b,"年間行事予定_Googleカレンダー.csv")
  }

google_schedule_csv()
```

　使用しているライブラリは

* tidyverseのdplyr&stringr&readr
* lubridate

だけなのでそれほど難しくはないはず…です。気力が持てば（自分向けの備忘録も兼ねて）簡単な解説等つけようかと思います。


##CSV取り込み

　上にも貼りましたが、[Google カレンダーに予定を読み込む]("https://support.google.com/a/users/answer/37118?hl=ja&co=GENIE.Platform%3DDesktop")が参考になるかと思います。一度読み込んでしまうと取り返しがつかないので、**取り込む用の個人カレンダーを作成してから取り込むことを強く**おすすめします。



##おわりに
　とりあえず何でもかんでも取り込んでしまえばあとは毎日Googleから通知が来るというのは忘れっぽい自分にとってかなり楽です。少なくともExcelの配布カレンダーを開くことは滅多になくなりました。今後もこの調子で、少しでも自分が楽になるよう蟷螂の斧を振りかざしていく所存です。
ホラー映画の怖さを誰かとリアルタイムで共有するアプリをAgoraSDKで簡単に実現してみた

こちらは「[ライブ配信/ビデオ通話SDK（Agora）を使用したサービスのアイデアを大募集！【PR】V-CUBE Advent Calendar 2021](https://qiita.com/advent-calendar/2021/agora)」 19日目の記事になります。
※ ちょっと遅れました

募集は
> ①こんなライブ配信があったら面白いのでは？このリアルの体験をオンラインにできるのでは？
超低遅延ライブ配信/ビデオ通話SDKを使ったサービスアイディアを大募集！
②AgoraSDKを触ってみて、感想を投稿下さい！
ライブ配信/ビデオ通話が簡単に作れることにきっと驚きます！

とのことだったので、
「**ホラー映画を一緒に見る人を募集して通話しながら恐怖を分かち合おうぜ！**」
なアプリを考えて作ってみることにしました。

## どんなアプリ？
* 募集側はホラー映画のタイトルで一緒に見てくれる人を募集
* 参加側は一緒に見たい募集を選んで部屋に参加
* 通話が始まったら挨拶して同時に動画視聴開始（アマプラとかNetflixとかなんでも）
* お話しながら見たり悲鳴あげたりしながら楽しもう！

## こんな人がターゲットです
* 怖い映画が好き、だけど一人で見るのは怖い
* 友達や恋人・家族は怖いものが苦手
* 友達がいない

## 機能概要
* 募集側： 見たい映画のタイトルで募集する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249961/937559bd-a5d4-0c81-5ae4-6a908160e68b.png)

* 参加側： 募集一覧から一緒に見たい映画の部屋に参加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249961/a36a4667-a38e-8b8b-f841-319edeae0284.png)

##実装してみた
考えるだけだとつまんないのでかる～く実装してみました。
アプリ自体はFlutterで作ってます。
※ ソースはそのうち公開するかも

## 使用技術
* Flutter 2.8.1
* Firebase ([FlutterFire \| FlutterFire](https://firebase.flutter.dev/))
* Agora SDK for Flutter ([agora\_rtc\_engine \| Flutter Package](https://pub.dev/packages/agora_rtc_engine/versions/4.0.7))

## 実現方法
###ユーザー募集機能

FirebaseのCloudFirestoreに以下の部屋情報を登録することで実現しました。

| フィールド名 | 型 | 用途 |
|:-:|:-:|:-|
|title|文字列|映画のタイトル|
 owner_name|文字列|ユーザー名|
|comment|文字列|コメント|
|room_id|文字列|部屋ID（AgoraSDKのChannelName）|

今回、プロトということでチャンネル名は固定です。

###通話機能

ビデオ通話部分は以下のサンプルコードを参考にしました。
というか通話する部分は丸まま持ってきました。
[AgoraIO\-Community/Agora\-Flutter\-Quickstart: Quickstart guide for the Agora Flutter SDK\(Android/iOS\)](https://github.com/AgoraIO-Community/Agora-Flutter-Quickstart)

## デモ
今回はAndroidの実機で募集してAndridのエミュレータで参加してみました。

* ユーザーの募集
![2021-12-21-13-33-38_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249961/dd6dd5c1-9293-4926-a99a-1d72c3c89686.gif)

* 部屋への参加
![画面収録 2021-12-21 13.39.49.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249961/f9dfc804-d863-3d3c-79f6-887fe0c8779d.gif)

※ カクカクしてるのはGIFにしているからで実際はヌルヌルです。

## 使ってみた感想
###メリット
* とにかく簡単！ただ通話したりライブ配信するだけならすぐに実現できる
* 通話や配信はAgoraに任せられるのでサービスの開発に注力できる
* 本当に高品質・低遅延だったすごい

### デメリット
* ちょっと難しいことしようとするとAPIの使い方とかがすぐには理解しにくいかも？
  * 英語だけどドキュメントは充実してるしちゃんと頑張ればいけそう＆V-CUBEさんを通せばサポートしてもらえる
* クラウドサービスだから料金とかの面で考えると個人ではハードル高いかも？

### まとめ
* Agoraを使って高品質・低遅延の通話アプリを簡単に実現できた
* 簡単なのでとりあえず試してみて使用感を確かめてみるといいかも
* 次はライブストリーミングのアプリでも作ってみたいな

以上！
【BluePrism】コレクションに連番を付与する

# やりたいこと
小ネタです。

コレクションに連番を付与したいときありますよね。
単純なことなのですが、いちいちプロセス側でループ回して連番セットしていくのはイヤだ。。。
というわけで、Utility - Collection Manipulationを拡張して作ってみました。

# 実装
## アクション全体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/961951ab-0570-0a97-8ff4-6fb731a3f167.png)

## 開始ステージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/1c8c5ad0-0aee-7832-d782-df307fd2b877.png)

## コードステージ
### 入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/3dd26f33-ba88-be36-c981-3f06eb6981e2.png)
### 出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/d42aaf94-ec21-2023-275f-421b25f7d55d.png)
### コード
コレクションの先頭列に連番フィールド（名前は任意に設定可）を追加して、各レコードに連番を付与しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/744fde1a-edf6-8cea-271b-022ecd596dc9.png)

```vb
If Not Collection.Columns.Contains(Column) Then

	Collection.Columns.Add(Column, Type.GetType("System.String"))

	Dim cnt As Long = 1
	For Each dr As System.Data.DataRow In Collection.Rows
		
		dr(Column) = CStr(cnt)
		cnt += 1
	Next

	Collection.Columns(Column).SetOrdinal(0)

Else
	Throw New Exception("The field already exists")
End If

New_Collection = Collection
```

# 実行結果
## 呼び出し元のプロセスの実装
Utility - Collection Manipulationオブジェクトの**連番付与**アクションを呼び出してます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/3baa88a1-81ed-f32d-758e-506e96ca85ee.png)

## コレクション
このコレクションに連番を追加してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/62794b54-f94e-59c5-a07c-1ba71bb46306.png)

## 連番付与アクション
### 入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/5d9a55cd-197d-a8af-3d2c-0c72d7875b7a.png)

### 出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/d0a7eaac-04ef-e6d6-9327-b0cdc48d42f1.png)

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/ac8097ac-f387-b1a5-2282-ad6e33e5ea6c.png)

確かにコレクションの先頭列に連番が付与されており、連番の値も正しくセットされていることが確認できました。
Sublime Text 3からVisual Studio Codeへ…目に優しいTheme探しをしました

## こんにちは

オークファンWebデザイナーの@azneです。
Advent Calendarも4年目ですね。

今回はコードエディタのカラーテーマについて書きます。
Sublime Text 3を長年使っているのですが、時代はVisual Studio Codeときいて早速インストールしました。


## カラーテーマはMaterialだ！

Sublime Text 3のカラースキームはMaterial Themeを好んで使っています。
なのでVSCodeにもMaterial Themeを入れます。
[Material Theme (Visual Studio Marketplace)](https://marketplace.visualstudio.com/items?itemName=Equinusocio.vsc-material-theme)

ところが…

![material.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59260/d5107f61-815f-e34a-f1bf-a843af1f6372.png)

色が全然違うんですけど！ナンデ？？？
VSCodeの方が、なんか全体的に彩度が高くてギラギラしてる…？
ヤダ！目が痛い！見づらい！

（ちなみにMacBook Proの画面で見るとここまでギラギラしていません。
外付けのモニター（DELL、ASUS、BenQで試しました）だとこうなってしまいます。
こりゃHDMIケーブルを変えるしかないのか…？）


## 違うテーマを探す

どうやらSublime Text 3のMaterial ThemeはVSCodeのものとは全く別物のようです。
[Material Themeの公式サイト](https://material-theme.site/)にもSublime Textについては書かれていません。

でもSublime Text 3のMaterial Themeみたいな、黒板にチョークで書いたようなやさしい色にしたい！

設定をいじってテーマの色を変えるか…？
と、よくない考えがよぎりました。
めちゃくちゃ時間がかかりそうなので代わりになるテーマを探すことにしました。

探すとVSCodeのテーマについて紹介されてる記事がたくさんあったので色々と試してみました。


## Rainglow

[Rainglow (Visual Studio Marketplace)](https://marketplace.visualstudio.com/items?itemName=daylerees.rainglow)

これでどうだ！！

![rainglow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59260/e1942ebc-11f6-d79d-37ce-761dc94ea632.png)

いいじゃないか！！

こういうのでいいんだよ こういうので（ ˘ω˘）

ちなみにRainglowをインストールするとテーマがたっっくさんあり、
ライトテーマ・コントラスト高めのテーマもあります。
（上の画像はComrade、Coffeeのものです）

ざっと見てみたところ、目に優しい配色のものが多いです。
お気に入りを見つけて気分で変えてみたりできるじゃないですか！いいですね！最高！
覚えたぞ！⌘K⌘T！


## おわりに

丁度いいカラーテーマが見つかってよかったですヽ(=´▽`=)ﾉ
私が気にしすぎなのかもしれないですが、やはり長時間見るものは目に優しいほうがいいですよね。

VSCodeのMaterial Themeが嫌で、VSCode入れたものの全く使わないまま半年くらい放置してました。
↑度々検索してたんですが「VSCodeのMaterial Themeが嫌」とか言ってる人全く見つかりませんでした…同志がいたらコメントください。LGTMあげます。
nRF Connect For VSCodeのトラブルシューティング

# 環境
- macOS Big Sur

# ビルド時に「The toolchain is unable to build a dummy C file」というエラーが発生する

キャッシュを消せば治る可能性があります。

```
rm -rf ~/Library/Caches/zephyr
```

参考: https://devzone.nordicsemi.com/f/nordic-q-a/55475/the-toolchain-is-unable-to-build-a-dummy-c-file
【総務・秘書向け】Slackのワークフローで仕事効率化！


こちらは [Voicy Advent Calendar 2021 19日目](https://qiita.com/advent-calendar/2021/voicy)の記事です。

# はじめに
こんにちは！株式会社Voicyで人事、総務、秘書を担当しておりますみのりーです。
Voicyでは「カンパニークリエイター」という肩書きで仕事をしています。

昨年は、エンジニアではないながらもアドベントカレンダー執筆に参加させていただき とても良い機会だなと感じたので
今年も、私のような人事 総務 秘書に関わる仕事をされている方におすすめのSlackTipsをご紹介します😊！

昨年の記事は[こちら](https://qiita.com/minorii_jp/items/700a86447f69fb9deab8):point_up:
[【非エンジニアでもできる】お役立ち情報をつぶやくSlackbotを作ったら、総務問い合わせが減って幸せになった話](https://qiita.com/minorii_jp/items/700a86447f69fb9deab)


# Slackワークフローとは
2019年10月15日にリリースされた、Slack上で定型的なアクションやコミュニケーションを自動化するワークフローが作れる機能です。
コーディングの必要はなく、Slack で直接実行することも、他のツールやサービスと連携させることもできます。
特に、ワークフローフォームに記入してもらった事項は、2020年の10月からスプレッドシートに反映される設定も導入されています。これが超絶便利なんです！
リリースされた直後はそれほど使いこなせていなかったのですが、今年色々とトライしてみた結果、標準のワークフローだけでかなり効率化ができたので、その内容を紹介します！
※Webhookを使う高度なワークフローもあるのですが、実装に時間がかかるので使えてない...


# 総務系便利ワークフロー
### ①受電報告
Voicyでは問い合わせ電話を総務・インターン生で受け取り、現場に報告しています。リモートワークの普及により、現場宛ての電話がかかってきても直接取り次ぎができないため、
1. 一度総務・インターン生で受け取り
2. かけ直しが必要な場合は総務・インターン生から現場に報告
というフローにしています。

今年からインターン生に受電報告をお願いしたこともあり、伝えることの抜け漏れがないように、報告する相手にも伝わりやすいようにワークフローを取り入れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887239/303a6f43-930e-54c8-a055-5dd571c8fddc.png)

裏側は、下記のようになっていて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887239/63a3c25c-467d-1844-d903-b56deb397f14.png)

1. 特定のチャンネルでショートカットで開始
2. フォームを開く、で必要条件を記入し、提出された回答をどのチャンネルに送るかを設定
3. フォームが送信されたことを確認するためのメッセージ送信

内容としては、[fondesk](https://www.fondesk.jp/)さんをイメージし、参考に作成しました。


### ②他部署へのタスク依頼
Voicyではインターン生へお願いするタスクの窓口を総務が担当し、タスクの振り分けを行っているため、全社誰でもインターン生にタスク依頼ができる状況になっています。
そのため、「どうやってインターン生のタスク依頼をすればいいの？」という疑問をなくすために、下記の２つのワークフローを入れています。

1. インターン生にタスク依頼をするチャンネルに入ったらbotがメッセージを送信
![mosaic_20211221143058.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887239/8a0319dc-d3e6-b213-96ff-31ff42219926.png)

2. 依頼したいタスクの内容を抜け漏れなく記入するフォーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887239/143d59c5-3428-4a26-8844-8fce886a2170.png)
さらにこのフォームに記入してもらった事項はスプレッドシートに反映するようにできており、週にどれだけの工数がかかったかをスプレッドシートで確認できるようにしています。

弊社ではこのような運用にしていますが、部署を越えた依頼がある際に似たような形でお使いいただけるかと思います！


# 秘書系便利ワークフロー
Voicyでは現場と代表緒方とのMTGを組む際には申請をしてもらうようにしています。Slackに秘書チャンネルがあり、そこから誰でも申請が行えます。記載してもらう内容は下記の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887239/36386874-4005-b934-ab17-d6fc1f9824e2.png)

ワークフローの流れとしては、1つ目に紹介した受電報告と似たような流れです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887239/d8635c6f-35d5-0e0b-9f5f-f0cb4248c80d.png)

この運用にしてから、依頼側の記入時間が短縮され、秘書側も再確認することなくスムーズに予定を確保できるようになりました！


# 最後に
今回はちょっとしたSlackのTipsをご紹介しました。
日々の業務の中で、ちょっと便利にしたいなー、整えたいなーと思っているけど放置してしまっているタスクって、いくつかあると思います。
そんな時に、少し立ち止まって業務を整理して、ワークフロー設計の時間を取ることで未来のあなたの時間を有効に使えるかもしれません。

noteの深津さんがわかりやすく「斧を砥ぐこと」に例えている記事があるので、そっと置いておきます
[https://note.com/fladdict/n/n14d18afc14ed](https://note.com/fladdict/n/n14d18afc14ed)
作業の進捗を定期的にTwitterで呟くアプリをPythonで作ってみた

タイトルの通り作業の進捗を定期的にTwitterで呟くアプリをPythonで作ってみました．
自分がサボりやすいのでフォロワーに監視してもらいたいのと，作業量を可視化したいのが目的です．

ということで早速コードをどーん，と置きたいのですが丸々置くと邪魔なのでGithubのリンク:[ProgressTweet](https://github.com/kurumethreestars/ProgressTweet)を置いておきます．
主要部分だけ置いておくと，

```Python
import time
import tweepy
from tweepy import api
import datetime

if __name__=='__main__':
    char_num = 0
    num_diff = 0
    consumer_key,consumer_secret,access_token,access_token_secret = getAllKeys()
    auth = tweepy.OAuthHandler(consumer_key,consumer_secret)
    auth.set_access_token(access_token,access_token_secret)
    api = tweepy.API(auth)
    wait_time = 1200
    dt_now = datetime.datetime.now()
    tweet_first = str(dt_now.hour) +  "時" + str(dt_now.minute) + "分開始"
    api.update_status(tweet_first)

    while True:
        char_num,num_diff = get_progress(file_name,char_num)
        tweet_content = "二十分間の進捗は"+str(num_diff)+"字です."
        api.update_status(tweet_content)
        print(tweet_content)
        time.sleep(wait_time)
```

こんな感じですかね．

因みに例によって例の如くすんなり作れなくて色々引っかかりました．
今回引っかかった点はTwitter APIの権限の問題ですね．
最初に↓

https://developer.twitter.com/en/apps/

でAPI使うためにあれこれする必要があるんですけど，最初に取得した権限だけだと作ったアプリケーションに呟く権限がないので，アプリの権限をEssentialからElevatedにアップグレードする必要があります．

あと引っかかったのが"time.sleep()"ですね．
何故か知らないけどtimeをimportしたらVScodeで自動的に補完されてて，

```Python
import time from time
```

ってなってたんですけど，この表記だとhas no attributeって怒られるので

シンプルに

```Python
import time
```

って書き直す必要があります．



参考にしたサイト:[Twitter APIで遊んでみた ~2. ツイートの投稿と取得~](https://tech-lab.sios.jp/archives/21400)
[Python][Pillow][numpy]画像ファイルの透過処理（コマンドライン）

性懲りもなく、コマンドラインにて画像ファイルの透過処理（１ピクセルのRGB平均値 >= threshold ならば100%透過）し、png で保存。

```transparent.py
import os
import sys
import argparse
import glob
from PIL import Image, ImageDraw
import numpy as np


def create_parser():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "source",
        type=str,
        help="This is source file or dir. (Specify a file or directory. Wildcards cannot be used.)"
    )
    parser.add_argument(
        "destination",
        type=str,
        nargs="?",
        default=None,
        help="This is destination file or dir."
    )
    parser.add_argument(
        "-t", "--threshold",
        type=str,
        default="250",
        help="The brightness of the pixel is the threshold. Brightness is the average of rgb. Default is 250."
    )
    parser.add_argument(
        "-v", "--verbose",
        action="store_true",
        help="Give more output."
    )
    return parser

def select_color(color, threshold):
    mean = np.array(color).mean(axis=0)
    return (255,255,255,0) if mean >= int(threshold) else color

def transparent(img, threshold):
    w, h = img.size
    transparent_img = Image.new('RGBA', (w, h))
    np.array([[transparent_img.putpixel((x, y), select_color(img.getpixel((x,y)), threshold)) for x in range(w)] for y in range(h)])
    return transparent_img

def trans(f, dst_dir, verbose, threshold):
    try:
        original_img = Image.open(f).convert("RGB")
        root, ext = os.path.splitext(f)
        file_name = os.path.basename(root)
        transparent(original_img, threshold).save(os.path.join(dst_dir, file_name + ".png"))
        if verbose: print("Success Transparent: " + dst_dir + file_name + ".png")
    except OSError as e:
        print("Error: " + f.title)
        pass


def main():
    parser = create_parser()
    args = parser.parse_args()

    dest_dir = "." if args.destination is None else args.destination
    try:
        os.makedirs(dest_dir, exist_ok=True)
    except FileExistsError as e:
        print("ERROR: Destination is " + e.filename)
        sys.exit(1)

    if os.path.isfile(args.source):
        trans(args.source, dest_dir, args.verbose, args.threshold)
    
    elif os.path.isdir(args.source):
        files = glob.glob(args.source + "/*")
        for f in files:
            trans(f, dest_dir, args.verbose, args.threshold)

    else:
        print("ERROR: Source file or dir does not exist.")
        sys.exit(1)


if __name__ == '__main__':
    main()
```
github は[こちら](https://github.com/VoshVolk/public_python/blob/main/image/transparent.py)。


####参考
[https://gammasoft.jp/blog/convert-pdf-to-image-by-python/](https://gammasoft.jp/blog/convert-pdf-to-image-by-python/)
テックキャンプを卒業して

##### いよいよ始まります。私のエンジニア人生が。
こんにちは。教育維新です。
テクノロジーの力で教育現場の課題解決をしたいという気持ちで学習を始め、テックキャンプに在籍して、エンジニア転職に成功しました。私の経験をまとめておきます。

## テックキャンプ入学前
テックキャンプを知ったのはマコなり社長の動画がきっかけでした。賛否両論あることは承知していますが、私はマコなり社長の仰ることは大半支持し、そこからたくさんのことを学んでいます。マコなり社長が仰ったとおり、プログラミングスクールもいろいろ調べて、それぞれのスクールの良さを比較してテックキャンプに決めました。決め手はメンターに質問できる時間が長いこと、（コロナ禍の中でも）大阪で教室の利用ができること、同じタイミングで未経験の人と同じ内容を学べることでした。入学前にカウンセリングがあり、事前にまとめていた質問を端的に答えてくれたので、スムーズに入会を決めることができました。

## 入学後～学習中
キックオフで、同期の方々とライフコーチとの顔合わせがありました。
皆さん、それぞれの思いで参加されていることを把握し、一緒に頑張っていけそうな気がしました。最初はHTMLとCSS、Rubyの基本を学びました。同期の方々と学習ペースを共有できるので、モチベーション下げずに進めることができました。
その後Rubyを使った実際のアプリ開発やJavaScriptを使用したページ作成GitHubを使用した開発など具体的にエンジニアに必要なことを体系的に学ぶことができました。教材もわかりやすかったですし、ライフコーチが進捗の確認をしてくださるので無理なく学習を進めることができました。最後にメルカリのようなフリーマーケットのコピーアプリを作るのですが、これはかなり大変でした。これに関してはメンターの方が丁寧に教えてくださるので大変でしたが何とか乗り切ることができました。

## 学習終了～ポートフォリオ作成
フリマのコピーアプリを作成後は、ポートフォリオの作成に移ります。ここで、アイデアが浮かばない人はフリマアプリの追加実装をすることもできるのですが、そればかりに頼っていると「量産型エンジニア」になってしまうなと思ったので、しっかりオリジナルのアプリを作りました。オリアプかける思いを語れるかどうかは転職活動に大きな影響を与えたと思っています。

## ポートフォリオ完成～転職活動
メンターやライフコーチとは別にキャリアアドバイザーの方がついて、転職活動をサポートしてくださいました。職務経歴書の添削や面接の回答についてアドバイスをいただけたのは非常に良かったです。自分は転職活動にかける「思い」を伝えやすいという理由で転職サイトはWantedlyを主として利用していました。テックキャンプ経由でも応募しましたが、自分は希望をかなり絞っていたので、あまり多くは応募していませんでした。
この間にも同期の方と情報共有しながら、進めました。同期の方との時間が非常に大きな心の支えになっていました。本当に出会えて良かった。

## 転職活動結果
応募：２９社
　書類不合格：５社
　面接不合格：９社
　内定：７社
　選考辞退：８社

本当にありがたいことに多くの会社から内定をいただくことができました。
内定をいただいた会社のうち３社が教育関連事業の社内ＳＥとしての採用でしたので、正直自分が３人いれば３社とも入らせていただきたい気持ちでした。ありがたい悩みでしたが、一番自分のやりたいことに近い１社に決めました。やりたいことだけではなく、社内保育所などの福利厚生の充実度合なども決め手の一つでした。また、不合格になった会社の面接は本当に勉強になりました。経験豊富なエンジニアの方の目線を垣間見ることができたように思います。

## 謝意
テックキャンプで出会えたすべての方々に感謝します。
最初のカウンセリングをしてくださった方、ライフコーチのお二人、キャリアアドバイザー、同期の方々、夜間交流会でご一緒した方々、そして、すべてのきっかけを作ってくださったマコなり社長、本当にありがとうございました。

## エンジニア転職を考えている方々へ
私はテックキャンプを卒業して本当に良かったと思っています。
いろんなプログラミングスクールが存在していますが、頑張りたい人を応援するシステムがそろっています。テックキャプの魅力については「メンターに質問し放題」「挫折しないようにライフコーチが付く」「キャリアアドバイザーによる転職サポートで高確率のエンジニア転職が可能」などがありますが、これら自体は割と他のスクールでも揃っていると思っています。自分的に一番良かったのはモチベーションの高い仲間と出会えるということです。私自身が教育事業をやっているので一番理解しているつもりですが、どれだけ良い指導者がついてもその人がやる気を出さないと何事もうまくいきません。当然その人次第の部分もありますが、等身大の仲間がいることが一番モチベーションキープに大切なのです。そして、その仲間どうしで交流するしくみがしっかりと作られているのがテックキャプの良いところだと感じました。そんなしくみや出会いがあるスクールは他にあまりないのではないかなと思います。多額の費用がかかることなので、慎重に考えて決めてほしいですが、あなたに強い気持ちがあるのであればテックキャプはそれに確実に応えてくれます。頑張ってください！

## 夢
通信機器は明治から令和にかけて、モールス信号レベルからスマートフォンまで進化しました。しかし、学校現場はどうでしょうか。先生が黒板を使って３０～４０人の生徒に授業をするというスタイルは明治から令和までずっと変わらないままです。
皆さんが手元で操作しているスマホのYouTubeや広告はあなたが見たそうなものが表示されていませんか？その画面に表示されている内容は一人一人違うものになっているはずです。しかし、教育はどうでしょうか。個性を大切にすると言いながら内容は全く個別最適化されていません。
様々な仕事でテクノロジーの力で業務負担が減ってきています。しかし、教育はどうでしょうか？先生方は校務に追われ、本当に割くべき子どもたちへの時間が少ないです。

私はテクノロジーの力で教育現場の課題を解決したいです。
もっと個々人に合わせて最高の教育を届けたいし、多忙を極める先生方の負担を減らしたいです。
ようやくスタートラインに立ちました。
ここからも全力で駆け抜けていきたいと思います。
全ては子どもたちのために。そして一緒にはたらく先生方のために。
AWSでリモート接続できなくなったサーバを復旧する方法

自分の不注意でリモート接続できなくなったEC2サーバがあり、復旧を諦めていたのですが、下記サイトを見つけた為、試してみました。
現象が同じであったこともあり、記事通りに操作するだけで無事リモート接続できるようになりました。
同じ様に困っている方に見てもらえたらと思いましたので、リンクを掲載します。

https://aws.taf-jp.com/blog/52550
Google ChromeでALBを通るブラウザ接続をすると遅くなる問題

株式会社パーソンリンクアドベントカレンダー21日目です！🎉

## はじめに

案件作業中、dev環境においてALBを通してwebサーバーにブラウザ接続すると1分ほど接続に時間がかかった。この現象がGoogle Chromeのみ現れsafariなどでは特に問題はなかった。stg環境ではChromeでも特に問題なくブラウザ接続でき、dev環境だけ現れる現象ということで調査した。

## ALB（Application Load Balancer）とは

AWSのシステムの一部で、webサービスに発生する負荷を分散するロードバランサーのこと。
突然webアプリケーションへアクセスが集中したときに、webサービスにかかる負荷を分散し、安定性や高可用性を向上させることができる。

## 原因

ALBのアベイラビリティーゾーン(以下AZ)設定の際に、igwがないsubnet(以下private subnet)がアタッチされていると、Chromeでの接続が遅くなる。画像にprivate subnetをアタッチしている簡易的な構成図を示す。(本来はALBの役割として、負荷分散があるためec2は複数台設置するべき)

![bad-access.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1398017/0cb4a473-d1f7-eb20-b972-8586b7e74784.png)



以下の画像はALB作成の際の、AZの設定部分
![スクリーンショット 2021-05-21 1.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1398017/b109b523-a1f8-52c1-a26a-25da7de3d7a3.png)



画像のように、ALBの作成は別々のAZにある2つのサブネットが必要であり、またその選択しているサブネットがprivate subnetであると警告文のようなのが出る。

この設定でALBを作成するとGoogle Chromeでのブラウザ接続が遅くなるようだ。

## 解決策

### 1.新しくpublic subnetを作成し、ALBにアタッチする

以下の構成図のようにpublic subnetを増築し、ALBにアタッチしてprivate subnetをアタッチしない様にする
![Good access.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1398017/2236fe8f-b175-6588-28a6-982e7d2852b6.png)



### 2. private subnetをpublic subnetにする

以下の構成図の様に、private subnetをigwを接続されるルートテーブルに編集し、public subnetに変更することで、ALBにアタッチしているサブネットにprivate サブネットがないようにします。
![解決策2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1398017/95d453fa-4423-793b-6de7-d6faf79911f2.png)

注意点:webサーバが置いてあるsubnetがprivateではなくpublic subnetになり、外のネットワークと直接繋がってしまうため外部から攻撃を受けたりする可能性がある。

## 結論
stg環境では、構成的に解決策1のようになっていたため、問題なく接続できておりdev環境にだけ現れた現象だった。

解決策1と2どちらも試した結果、Chromeでの接続が特に問題のない接続の速さになった。

今後としてALBの作成の際に選択するsubnetを2つともpublic subnetにすれば良い。
もし最初の構成図のようにprivate subnetをアタッチしてしまっていた場合は、解決策1のような方法を取れば良い。
[Stripe Updates] Stripe ElementのフォームをRTL（右から左）に表示できるようになりました

Stripe Elementで表示する決済フォームを、アラビア語やヘブライ語圏向けに右から左で表示できるようになりました。

![スクリーンショット 0003-12-21 13.58.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/8a6ea899-73b8-3e53-27ad-cf9749360971.png)
# 親要素への`dir="rtl"`の設定で対応可能に

RTLへの対応方法はとてもシンプルです。

`element.mount`の対象となるHTMLの親に`dir="rtl"`を設定すれば、表示がRTLに切り替わります。

```html
<div dir="rtl">
  <div id="payment-element">
  </div>
</div>
<script>
  const stripe = Stripe(process.env.STRIPE_PUBLIC_API_KEY)
  const elements = stripe.elements({
     // 省略
  });
  const paymentElement = elements.create('payment');
  paymentElement.mount("#payment-element");
</script>
```

Reactの場合も同様です。

```jsx
import {PaymentElement } from "@stripe/react-stripe-js";

// 省略

  <div dir="rtl">
    <PaymentElement id="payment-element" />
  </div>
```

# 各フィールドのラベルを変更する

ラベルをアラビア語やギリシャ語などに対応させる場合は、`locale`オプションを利用します。

利用できる言語、コードについては[Stripe javaScript SDK ドキュメントの"Supported locales"](https://stripe.com/docs/js/appendix/supported_locales?utm_source=qiita&utm_medium=stripeUpdates)をご確認ください。

## ギリシャ語
```html
<script>
  const stripe = Stripe(process.env.STRIPE_PUBLIC_API_KEY)
  const elements = stripe.elements({
    appearance: {
      theme: 'stripe'
    },
    clientSecret: 'pi_xxxx',
    locale: 'el',
  });
  const paymentElement = elements.create('payment');
  paymentElement.mount("#payment-element");
</script>
```

![スクリーンショット 0003-12-21 14.20.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/e2bbd850-67ba-2372-c0e9-424ffe08d054.png)

## アラビア語
```html
<script>
  const stripe = Stripe(process.env.STRIPE_PUBLIC_API_KEY)
  const elements = stripe.elements({
    appearance: {
      theme: 'stripe'
    },
    clientSecret: 'pi_xxxx',
    locale: 'ar',
  });
  const paymentElement = elements.create('payment');
  paymentElement.mount("#payment-element");
</script>
```

![スクリーンショット 0003-12-21 14.17.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/d4cc89de-0004-5f0d-5111-4dc8fb5caf77.png)




# [PR] Stripe開発者向け情報をQiitaにて配信中！
2021年12月よりQiitaにて、Stripe開発者のためのブログ記事更新を開始しました。

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について随時更新してまいります。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
コマンドプロンプトが開かなくて困った

不意にコマンドプロンプトが開かなくなった。
正確には、開いた後で強制終了される感じに見えた。
バッチファイルは動かず、```pause```をしても停止出来ない。

バッチファイルが動かなかったり、一部のプログラムが動かなくなったりと、案外業務に影響があった。

## 解決方法

以下のコマンドを、管理者権限で起動したPowerShellから実行したら開けるようになった。

```powershell
PS C:\WINDOWS\system32> Reg Delete "HKCU\Software\Microsoft\Command Processor" /v AutoRun /f
この操作を正しく終了しました。
```

## 原因
Anacondaの処理や、Anacondaをアンインストールした時に発生するような記述が見つかったが、それが原因だろうか？

## 参考

https://qiita.com/migihidari/items/9a07883f6ce03d6fd9c6
AWS上に複数システムを稼働させる時に考えたこと

---
##背景
後の事を考えず、AWS上に複数のシステムを継ぎ足し継ぎ足しでガシガシ開発していくと、ごちゃごちゃになって、どうにもならん。って事ないですか？そうならないためにも、後に複数システムが稼働する環境（つまり標準化環境）を開発する際に考えた事をつらつら書いていこうと思います。

##標準化の目的を考える
前提として何を目的として標準化するのか？標準化に向けた検討の拠り所となる道しるべを定める必要があると考えます。つまり、標準化により誰にどのような効果やメリットを提供するのか明確にする必要あり、この目的の明確化が最重要と考えます。

- 標準化の目的（例）
    - 個々のシステムの要求に応じ、迅速に環境を払いだし開発スピードの向上に寄与する
    - 統一されたセキュリティ基準に沿ったシステムの展開によるセキュリティ事故の未然防止
    - 最低限のセキュリティ基準は満たしながら、クラウドの特性を十分に活用すべく、アプリケーション開発に有効となるPaaS機能の開放（個別システムにクラウドサービス利用の自由度を与える）
    - 個々のシステム個別で考えてきた、同種の機能を共通機能として実装し、個別システム開発の負荷を軽減する　　　　　
    - 個々のシステムで共通項となる運用を一元的に管理し、運用効率化を実現すると共に運用品質を向上させる
    - 既存システムからの確実で迅速な移行

##標準化の対象箇所を考える
標準化対象の範囲を定義し、個々のシステムで開発する範囲、標準化基盤で提供する範囲を明確にする必要があります。例えば、システムの例として赤背景の箇所を標準化対象とする場合のシステム構成概要は概ね下図のようになると思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261436/24309663-f898-78bb-f29f-cf75a0683776.png)

##標準化検討の観点
- インフラ基盤

原則、複数企業が同一環境を共同利用するマルチテナント環境と認識し、クラウドサービスが提供する環境分離機能やデータ分離、認可機能等の活用を検討し、資産の混在を防止する

| 検討項目       |       検討内容 |
|:-----------------|:------------------|
| アカウント管理  　|契約単位となるアカウントの適用範囲や方法。また、アカウント間の連携を意識したアカウント構成方法 |
| 認証、認可          |クラウドサービス管理コンソールへ接続する際の認証、認可の方法。運用チーム体制（どのチームが何の運用をするのか）と、認可は密に連携するため、詳細に検討する必要あり。また、外部委託先の開発ベンダーに対する認証、認可の方法も必要。利用者が既存で利用しているIDを利用し認証したい場合など、個別ケースも要検討。|
| シークレットキー管理       | クラウドから提供するシークレットキー（クラウドサービスをAPIで操作）の管理方法|
| システムランク定義               |個別システムのシステム重要度に応じた可用性、拡張性定義や構成パターン。また、個別システムにおける、本番、検証、開発環境の構成も意識する|
| 提供サービス             |クラウドが提供しているサービスを何処までユーザに標準化し開放するのか。ユーザに開放するサービスについてサービス利用時に情報漏洩の可能性等、サービス仕様を確認、検証したうえで提供が必要|
| 開発ガイドライン          |利用者（個別システム開発者）に提供する開発ガイドラインの作成。クラウドサービスの特徴、システム開発の流れ、設計・開発・運用のポイント、責任範囲等を解説する為の資料|

- ネットワーク

インターネットとIN/OUTになる接続口を標準化基盤として提供するのか、各システムに委ねるのかを検討し、前者であれば、セキュリティ機能の適用を検討

| 検討項目       |       検討内容 |
|:-----------------|:------------------|
| 個別システム内のサブネットの分割  　|個々のシステム内のネットワークセグメントの構成方法やセグメント間の通信制御方法 |
| 個別システム間のネットワークアクセス経路|個々のシステムどうしを接続するネットワークアクセス経路や通信制御方法|
| 各社からのネットワークアクセス経路       | 利用者の各社から共通基盤にアクセスする際の接続パターンやネットワークアクセス経路|
| 開発ベンダーのネットワークアクセス経路              |利用者が個別システムの開発を外部開発ベンダーに委託した際の、開発ベンダーから共通基盤へのアクセス経路や通信制御方法|
| インターネットから外部公開環境へのクセス経路             |インターネットから個別システムにアクセスする際のネットワークアクセス経路や通信制御方法|
| インターネットへのアクセス経路          |個別システムがインターネットにアクセスする際のネットワークアクセス経路や通信制御方法|
| ドメイン管理          |ドメインゾーンの管理方法や、インターネットからのシステムの名前解決、また外部ネットワークからの当システムの名前解決の方法|

- セキュリティ
インプットとなるセキュリティポリシーに従い、標準化基盤では最低限のセキュリティ基準を満たし、利用者にセキュリティ対策を要求する箇所を明確にする


- 非機能
受入想定の個別システムが個々に実装している非機能を整理し、標準化基盤として標準的に提供する非機能の見極め


- 運用
運用項目を整理し、個別システムと標準化基盤の運用範囲の明確な定義


- 移行
既存システムからの移行パターンを整理、検証し、標準化基盤構成にマッチした移行方式の提供


##まとめ
複数システムが稼働する共通化基盤であるが故に考えないといけない事は多々あります。また標準化された基盤は末永く利用される環境であるため、後々の構成変更は容易ではなく、慎重に検討したいものです。

南野様も「3年間のプロジェクト中、ほぼ1年3ヶ月をこの標準化に費やした」と言われていますね。

https://aws.amazon.com/jp/solutions/case-studies/dena-leaders-voice/
Javaで5のつく日曜日を出力するプログラム

コードを書く練習として作ってみました。
Yahoo!ショッピングにて「5のつく日」と「毎週日曜日」はそれぞれ個別のキャンペーンで、「5のつく日曜日」はその2つが重なるダブルポイントアップデーです。

こちらは現在の日付から1ずつ日付を加算していき、
次の5のつく日曜日が出力されていくプログラムです。

**プログラム要件**

* endと入力されるまで無限ループ
* Enterキーを押すと1つずつ次の5のつく日曜日の年月日が表示される

```java

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);
		Date date = new Date();
		Date d = null;
		int week = 0, day = 0;
		String pointday = "", str = "";

		// Date型の日時をCalendar型に変換
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);

		System.out.println("現在の日付から5のつく日曜日を表示します…");
		System.out.println("Enterキーを押すと次の日付を表示");
		System.out.print("endと入力するとループ終了");

		while (!(str.equals("end"))) {
			str = scanner.nextLine();
			while (!(str.equals("end"))) {
				// 日付を加算する
				calendar.add(Calendar.DATE, 1);
				// 曜日、日付の取得
				week = calendar.get(Calendar.DAY_OF_WEEK);
				day = calendar.get(Calendar.DATE);
				// 5の付く日曜日の日付の場合、年月日を出力
				if (week == 1 && (day == 5 || day == 15 || day ==25)) {
					d = calendar.getTime();
					pointday = new SimpleDateFormat("yyyy/MM/dd").format(d);
					System.out.print(pointday);
					break;
				}	
			}
		}
		scanner.close();
	}
}
[UE4] Windowsのスリープ検出方法

 検証バージョン：UE4.27.2

　コンソールやモバイルOSにおいて、レジュームなどの操作によるゲームのバックグラウンド移行や解除を以下のイベントで検出することができます。

`FCoreDelegates::ApplicationWillEnterBackgroundDelegate`
`FCoreDelegates::ApplicationHasEnteredForegroundDelegate`

 このイベントは[UApplicationLifecycleComponent](https://docs.unrealengine.com/4.26/en-US/API/Runtime/Engine/Components/UApplicationLifecycleComponent/)を利用してゲーム側でもトリガーすることができ、
以下のように実装することでバックグラウンド移行時にゲームポーズを適用するようなこともできます。

![2021-12-21_13h51_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/ff421f5c-6c13-52bc-f86b-b2e30d71b7c4.png)

　しかしながら、Windowsのスリープイベントはデフォルトでは検出することができません。
これを適用したい場合は、以下のエンジンコードに電源管理イベントの処理を追加することでスリープ実行/解除時にも同様の処理を適用することが可能です。

```cpp:WindowsApplication.cpp
int32 FWindowsApplication::ProcessMessage( HWND hwnd, uint32 msg, WPARAM wParam, LPARAM lParam )
{
	if( Windows.Num() && CurrentNativeEventWindowPtr.IsValid() )
	{
		switch(msg)
		{
 
		//...
//ここから 
		case WM_POWERBROADCAST:	// 電源管理イベント
		{
			switch (wParam)
			{
			case PBT_APMRESUMEAUTOMATIC:	// スリープ復帰
				FCoreDelegates::ApplicationHasEnteredForegroundDelegate.Broadcast();
				break;

			case PBT_APMSUSPEND:			// スリープ移行
				FCoreDelegates::ApplicationWillEnterBackgroundDelegate.Broadcast();
				break;

			default:
				break;
			}
		}
		break;
//ここまで 
		//...
 
	return DefWindowProc(hwnd, msg, wParam, lParam);
}
```