OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi の microSD 関連の設定

# はじめに
安価かつ関連する情報も多いということで、インスタレーション等の作品製作に Raspberry Pi が使われることも多いかと思います（私自身も参加した作品に使用したことがあります）。

Raspberry Pi は HDD や SSD ではなく、microSD を使う珍しいシステムであり、また microSD はそのような用途に使用されることを想定されていませんので、使い方によっては簡単に壊れてしまいます（特別な設定無しでも問題なく使用できるという意見もありますが、私が関わった範囲では、最短で 2 週間で壊れてしまったという事例も経験しております）。

標準の設定のままでも問題ないかもしれないですが、microSD カードに優しい設定にしておくと良いかも（安心かも）…ということで、ここに関連する情報をまとめておきます。

ちなみに、毎日ではないですがボチボチと使う程度では、本記事の設定にて何年も使うことができております。これで絶対に大丈夫！ということではありませんが、皆様のラズパイ・ライフにおける心の安息に役立てば幸いです。

なお、当初は自分のためのメモということで、以下の情報は 5 年ほど前からコツコツとまとめていたものです。そのため、どのページから情報収集したのか記録しておりませんでした。このページにも書いてあるよ、という情報はコメント欄に書いていただければ幸いです。

# ステップ１： swap の無効化
まず、swapoff で swap の無効化を行います。
（参考： https://tech.nikkeibp.co.jp/it/article/COLUMN/20130909/503369/ ）

    sudo swapoff --all

chkconfig をインストールし、スワップファイルを生成しないようにします（もしかしたら swapoff だけで十分なのかもしれませんが、とりあえず）。

    sudo apt-get install chkconfig
    sudo chkconfig dphys-swapfile off

# ステップ２： /tmp, /var/tmp, /var/log の RAM ディスク化
各種プログラムがログを書き込むディレクトリを RAM ディスク上に作成し、microSD への書き込みを抑制します。なお、この設定を行うと、トラブル発生時にログファイルでの解析ができなくなります。その場合は fstab の該当エントリをコメントアウトするなどして、再度の問題発生時にファイルとして記録できるようにする等してください。

## fstab の編集
sudo vi /etc/fstab などして、fstab を以下のように編集します：

    tmpfs    /tmp        tmpfs    defaults,size=32m,noatime,mode=1777    0    0
    tmpfs    /var/tmp    tmpfs    defaults,size=16m,noatime,mode=1777    0    0
    tmpfs    /var/log    tmpfs    defaults,size=32m,noatime,mode=0755    0    0

編集が終了したら、sudo reboot now を実行して再起動します。

## きちんと RAM ディスク化されているか確認
再起動後、df -h でファイルシステム毎のファイルサイズを確認します。

    ...
    tmpfs             32M  156K   32M    1% /var/log
    tmpfs             16M     0   16M        0% /var/tmp
    tmpfs             32M     0   32M        0% /tmp
    ...

等という表示がされれば OK。

# ステップ３： 念のため起動時に確認するようにする
microSD 上のファイルシステムが正常であるかどうか、念のために起動のたびに確認するようにします。この設定をすると、起動に時間がかかるようになりますので、少しでも起動時間を短縮したい場合はこの設定をしないほうがよいです。

ファイルシステムのチェックには fsck コマンドを使いますが、fsck の対象とするデバイスを特定するため、以下のコマンドを実行します：

    mount -l | grep mmc

すると、次のような出力が得られます：

    /dev/mmcblk0p7 on / type ext4 (rw,noatime,data=ordered) [root]                             
    /dev/mmcblk0p6 on /boot type vfat  (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro) [boot]

root という記述のある、/dev/mmcblk0p7 がルートファイシステムとなっていることが分かるので、 これを fsck の対象とします。

    sudo tune2fs -c 1 /dev/mmcblk0p7

# 最新版にする
以上の設定にて、microSD に優しい状態となりましたので、

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get dist-upgrade
    sudo rpi-update

などして、最新の状態に更新します。

# まとめ
以上で、swap と一時ファイルに関して microSD に負担をかけないように設定となりました。この他にも「こんな風にしたほうが良いよ」とか、ここは誤っている、等の情報がありましたら、ご指摘いただければ幸いです。
EdgeTPU(USB接続)時にデバイス見つからない問題

もうすぐ夏ですね、めちゃ暑いのなるべく避けたいそんな時にCoral betaのEdgeTPUを使用して熱くない推論をしたいところ。

適当なLinux BoxにEdgeTPUぶっ刺してTensorFlowLiteのモデルさえ用意すれば一桁Wでガンガン推論してくれます。

# デバイス無いよ〜 (T^T)

```:shell
ERROR: Failed to retrieve TPU context.
ERROR: Node number 0 (edgetpu-custom-op) failed to prepare.

Failed in Tensor allocation, status_code: 1
```


やるたびに忘れるのでφ(..)

実行時にユーザーにUSBアクセラレーターへのアクセス権限がついてないぽいので、それをつければOK
実行したいユーザー(hoge)に `plugdev` というグループをつければ良い

```
sudo adduser hoge plugdev
```
Azure AD認証を使用して、Azure仮想マシン(Linux)にSSH接続する

# はじめに

Azure仮想マシンにはSSH接続用の公開鍵は一つしか設定できないため、複数マシンからの接続は困難です。
(公開鍵の再設定はできるが、毎回行うのは面倒)
Azure AD認証を使用することで、環境を選ばず接続することができます。

# 用意するもの

- Azure仮想マシン(Linux)

# 手順

1. 拡張機能をインストールする
2. ロールを割り当てる
3. SSH接続を行う

# 1. 拡張機能をインストールする

Cloud Shellを開きます。

![cloudshell](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-menu.png)

リソースグループと仮想マシンを指定し、Azure ADでの接続に必要な拡張機能をインストールします。

- リソースグループ：myResourceGroup
- 仮想マシン：myVM

```bash
$ az vm extension set \
    --publisher Microsoft.Azure.ActiveDirectory.LinuxSSH \
    --name AADLoginForLinux \
    --resource-group myResourceGroup \
    --vm-name myVM
```

# 2. ロールを割り当てる

Azureアカウントに仮想マシン接続用のロールを割り当てます。
接続に関するロールは以下の二つです。

- Virtual Machine Administrator Login(管理者権限)
- Virtual Machine User Login(ユーザー権限)

```bash
# アカウント名、仮想マシンIDを変数に設定
$ username=$(az account show --query user.name --output tsv)
$ vm=$(az vm show --resource-group myResourceGroup --name myVM --query id -o tsv)

# ロールの割り当て
$ az role assignment create \
    --role "Virtual Machine Administrator Login" \
    --assignee $username \
    --scope $vm
```

ロールの割り当てはポータル上でも行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111157/a4b499a7-c42c-02c6-775d-eaa65c0b1d82.png)

# 3. SSH接続を行う

ポータル上で仮想マシンのリソースを表示し、接続を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111157/510ecf50-77ba-28f0-ca2e-200f41692b83.png)

Azure ADでの接続用コマンドが表示されるので、コピーしてCLIでコマンドを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111157/041b5f8a-189a-b4b3-de59-e7c6a9f9b632.png)


```bash
~$ ssh azureuser@azure.com@13.71.141.35
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code GZ3KVMCHK to authenticate. Press ENTER when ready.
```

表示されたURL(<https://microsoft.com/devicelogin>)にブラウザでアクセスし、コードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111157/a37faab6-c486-da88-0a41-1b5c9bc41c6f.png)

指定したアカウントでサインインし、CLIに戻ってENTERを押せば接続完了です。

# 新規に仮想マシンを作成する場合(ポータル)

「Ubuntu Server」のマシンでは、Azure ADで接続する機能(プレビュー版)を選択できます。
この機能を有効にすることで上記手順1が不要となり、ロールの割り当てのみ行うことでSSH接続が可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111157/cba3bf94-c9dd-fceb-7c65-ee7f0476b663.png)

## 補足

仮想マシンはデフォルトでは全てのポートが閉じているため、SSHのポート(22)を開放する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111157/ec358680-1b9e-0d9e-bf7b-4221915c980c.png)

# 参考サイト

https://docs.microsoft.com/en-us/azure/virtual-machines/linux/login-using-aad
Firebase Hostingにドメイン（web.app）が追加されるってよ

Firebase Hostingのドメインが今までの&lt;site-name>.firebaseapp.com以外に&lt;site-name>.web.appも使えるようになるとアナウンスされました（というメールが来た）。

firebaseapp.comって長いなーと思ってたからweb.appいいね。これだけ短いとわざわざ独自ドメイン取得しなくてもいいじゃんとか思ってしまう。例えば 

   https://qiita.web.app

おー、これでいいじゃん。ドメイン取得競争みたいにFirebase（GCP）でプロジェクト作っとく競争が起きそう。5月28日から設定いらずで全てのFirebaseプロジェクトで使えるようになるようです。いままでのfirebaseapp.comも廃止の予定はないとのこと。これ早いもの勝ちですよね。プロジェクト作っとこ。

##### --追記--

プロジェクト作ろうとしたら全然ID取れなかった。GCPのプロジェクトだもんなあ。短くてわかりやすいIDはほぼ使われてますね。がっくり
jsonpの基本

#　はじめに
jsonpって言葉は聞いたことあるけど、jsonと何が違うのか全く理解していませんでした。
jsonと同じようにデータ取得できるだろうと思っていたら、全く取得できず、詰みました。
初めて違いを理解し、実際に使ったので、その備忘録です。

##仕組み
jsonpとはjson with paddingの略だそうです。jsonpのurlを叩くと、下記のように返ってきます。

```js

callback({"りんご":1,"ぶどう":2,"もも":3});
```

jsonpのurlを叩くと、scriptが実行されます。そのcallbackとして、データが返ってきます。

## jsonとの違い
・jsonはjavascriptから生まれたデータ用フォーマットで、下記のような感じのデータを保持するものです。

```json
{
  "りんご":1,
  "ぶどう":2,
  "もも":3
}
```

つまり、jsonはデータそのものだが、jsonpはjsの関数です。
jsonとjsonpはちょっと記述が違うだけ、という認識をすると混乱します。(私がそうでした。)


##データ取得方法
違いはわかったけど、じゃあデータをどうやって取得するのがいいのでしょうか。
方法はいくつかあると思います。
ライブラリを使用して取得する方法が一番簡単で良いのかもしれませんが、今回はライブラリを使用しない方法を記載します。
(モジュールの一部を記載するので、もし参考にされる場合は、適宜classの中とかに入れる必要があります。)

```ConfirmationAPI.js

let index = 0;
confirmSerialCode(url) {
  index++;
  const callbackName = `confirm${index}`;
  const random = Math.round(Math.random() * 10000000);
  return new Promise((resolve, reject) => {
    const $base = document.getElementsByTagName('script')[0];
    const $script = document.createElement('script');

    window[callbackName] = function (res) {
      resolve(res);
      document.body.removeChild($script);
    };

    $script.id = `jsonp${index}`;
    $script.async = true;
    $script.src = `${url}?callback=${callbackName}&cache=${random}`;
    $script.onerror = function () {
      reject('Request Error');
    };

    $base.parentNode.insertBefore($script, $base);
  });
}

```

```index.js
this.confirmationAPI
  .confirmSerialCode(url)
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log(err);
  });
```

今回は、この関数が走って、callbackから返ってきた値をconsoleに出力しています。
また、2回走っても大丈夫なように、indexの連番を付与しています。
(連番をつける理由は、2回関数が実行されてしまって、コールバックが一緒だった時にうまく動かない可能性があるためです。)

##最後に
これはjsonpで値をどう取得すればよいかわかっていなかった私自身の備忘録です。
もし使いやすいライブラリをご存知の方いらっしゃいましたら、教えていただきたいです。
VSCode コピペ時正しくIndentさせる設定

**File---> 基本設定 -----> 設定**

`"editor.formatOnPaste": true`

![vs-intent.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125746/45cb4189-9933-ee3c-4cb2-7ad2ebbd9347.png)
= mltermでRictyを使う [Qiita] [HowTo]


# はじめに

[mlterm](http://mlterm.sourceforge.net)は、多言語対応した仮装端末です。SIXELやDRCSの対応もしていること、日本語が化けないことから愛用しています。
[Ricty](https://www.rs.tus.ac.jp/yyusa/ricty.html)は有名なプログラマー用フォントです
mltermではコンフィグファイルを用いて様々な設定を記述するため、Terminal.appやiTerm2といったターミナルと比べると多少わかりづらいところがあります。
(GUIなmlconfigというツールもあるのですが筆者の環境では現在なぜか動かない為ファイルを編集します。)
その為軽く手順をまとめておきます。

## 環境前提

- OS: macOS
- 端末: mlterm
- パッケージマネージャー: homebrew

## 目次

- [はじめに](#はじめに)
  - [環境前提](#環境前提)
  - [目次](#目次)
- [Rictyのインストール](#Rictyのインストール)
- [Mltermに認識してもらう](#Mltermに認識してもらう)

---

# Rictyのインストール

[こちらの記事](https://qiita.com/segur/items/50ae2697212a7bdb7c7f)を参考に、Homebrew経由でインストールします。

```
# formulaレポジトリをtap
brew tap sanemat/font

# rictyをインストールします
# powerlineフォントも入れたかったので、オプションを追加しました。
brew install ricty --with-powerline --with-patch-in-place

# Fontファイルをコピーしてパソコンに認識させる(あまり理解していないおまじない状態)
cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
fc-cache -vf
```

これでインストールが完了しました。FontBookを開くと確認できると思います。

[!picture here]

# Mltermに認識してもらう

`~/.mlterm/font`をいじります。

```
DEFAULT	= RictyDiscord-Regular
```

自分は、可読性をあげた`Ricty Discord`の方を使いたかったのでこう指定しましたが、素のRictyを使いたければ

```
DEFAULT	= Ricty-Regular
```

でいけると思います。

この後mltermを再起動するとRictyが使われているはずです!やったね!!

---

# あとがき

ちなみにこれ以外のfont関連の設定ファイルもあるのですが、自分はあまり違いをわかっていません。
とりあえず上記のように`font`をいじることで適応できていますが、より良い方法があるかもしれないので詳しい方、コメントください...


[2019-05-23 12:30]
php-master-changes 2019-05-22

今日は opcache 最適化のバグ修正、curl_multi_select()で 1 秒未満のタイムアウト指定が 0 になっていた問題の修正、unixODBC の検出の pkg-config への移行、spl で arg_info がドキュメントと乖離していた部分があったのの修正、テストの修正、mysqli.allow_local_infile が off の際に LOAD DATA LOCAL INFILE しようとすると出るエラーメッセージの修正があった！

# 2019-05-22
## nikic: Fix null check in sccp add_array_elem chain handling
- https://github.com/php/php-src/commit/30f1b172625030c78d564ceede46e7490152fcb4
- [7.3~]
- ext/opcache で、SCCP 最適化器の null チェックを修正

## nikic: Don't evaluate functions with partial array arguments
- https://github.com/php/php-src/commit/97ba6b0d8bbb20b0d4a4a0c950b582f6cfeeea27
- [7.3~]
- ext/opcache で、SCCP 最適化器の partial array の扱いを修正

## rlerdorf: Fix precedence issue causing sub-second timeouts to be 0 in
- https://github.com/php/php-src/commit/7b42cdf95ee91b723e7df51ac96f880de51f4591
- [7.2~]
- ext/curl で、[curl_multi_select()](https://www.php.net/manual/ja/function.curl-multi-select.php) の際に 1 秒未満のタイムアウト指定が式中のキャストの優先度問題で 0 になっていた問題の修正
- [rasmus のおっさんが言ってた](https://twitter.com/rasmus/status/1130947871606431744)奴だ

## hughmcmaster: Use PKG_CHECK_MODULES to detect unixODBC
- https://github.com/php/php-src/commit/9df3e097b88533dd9abae4360500c849054dc410
- ext/odbc で、unixODBC の検出を pkg-config へ移行

## kukulich: Fixed some arg infos to match documentation
- https://github.com/php/php-src/commit/d6c0c5ef8e90b26b8cf1632be1baa379405d0ba9
- [7.4~]
- ext/spl で、arg_info がドキュメントと乖離していた部分があったのを修正

## nikic: Fix bug [#78034](https://bugs.php.net/bug.php?id=78034)
- https://github.com/php/php-src/commit/ff4b0ce0e8d582e4b8f6c44270a77f511d28bacd
- [7.4~]
- ext/opcache で、最適化器のバグにより pecl が動かなくなっていた問題の修正

## dstogov: .text segment may be not the first one
- https://github.com/php/php-src/commit/7c99589be210eac023bf780263ed6ebcddf76a16
- [7.4~]
- ext/opcache で、[PHP のコードを Huge Page へリマップする最適化](https://github.com/php/php-src/commit/669f0b39b184593e01e677360fd79b2b63058ca0)の際にコードセグメントが先頭にあるという雑な仮定をしていたのを修正
- [opcache.huge_code_pages](https://www.php.net/manual/ja/opcache.configuration.php#ini.opcache.huge_code_pages) の実装はじめて見たけどこういう奴だったかー、なるほど

## nikic: Use a different URL in bug44811.phpt
- https://github.com/php/php-src/commit/3a0de243c389af40c703e0ef018d8f95f6eab563
- [7.2~]
- ext/soap で、テストの参照 URL がスラドだったのを php.net へ修正

## nikic: Mark bug44811.phpt as an online test
- https://github.com/php/php-src/commit/b162c8f55a3d92f611febbcc14014eb2ca3244ac
- [7.4~]
- ext/soap で、外部アクセスするテストケースをオンラインテストとしてスキップできるよう修正

## cmb69: Fix test case for cURL 7.65.0
- https://github.com/php/php-src/commit/62fe6ba20c229bb6ffd910f1b494a310c950cef6
- [7.2~]
- ext/curl で、cURL 7.65.0 用にテストこけの修正

## SjonHortensius: Fix [#77956](https://bugs.php.net/bug.php?id=77956) - When mysqli.allow_local_infile = Off, return a client error
- https://github.com/php/php-src/commit/96404eb8e223bde0f5f697987a81acb640cc539f
- [7.2~]
- ext/mysqli で、mysqli.allow_local_infile が off の際に LOAD DATA LOCAL INFILE しようとすると出るエラーメッセージの修正
【GitHub Pages】で簡易webサイトを作る

#はじめに
GitHub Pagesを使って簡単に静的(HTML, CSS, js)ポートフォリオサイトを作ってみたい！
と思ったので作りました。

HTMLファイルをサーバーに表示させるまでが目的のため見た目は無視しますが、
これから対応するのでその都度記事を更新します。

初めてQiitaに投稿するため、何かありましたらご指摘いただけるとありがたいです。

#GitHub Pagesとは
[GitHubPages](https://pages.github.com/)
無料でサイトを作れる

※無料ユーザーはpublicリポジトリでのみ公開可能

#GitHub Pagesでwebサイトを作る
####リポジトリを作成
無料ユーザーの場合はPublicリポジトリにします。
![スクリーンショット 2019-05-23 13.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422374/1f983410-3546-8256-c880-4fe2faa42fc3.png)
作成後、表示するためにindex.htmlを作成

```html:index.html
<h1>これはサンプルです</h1>
```
####リポジトリ公開の設定
リポジトリの設定画面（SettingsページのOptions）でサーバーにあげる設定を行います。

下の方にある、GitHub Pagesを見ると、Sourceが**None**になっているので
![スクリーンショット 2019-05-23 13.21.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422374/f1c643f5-9d65-0381-0cb3-45a569435e90.png)
**master branch**に変えます。
![スクリーンショット 2019-05-23 13.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422374/ae14ecdd-42d7-f183-f970-c471e42de56e.png)

####GitHubPages URLの取得
公開URLができました。
![スクリーンショット 2019-05-23 13.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422374/4027946f-731d-8ef4-5ad9-9c31deffa09c.png)

青いURLを押すと、先ほど作成したindex.htmlが公開されました！
![スクリーンショット 2019-05-23 13.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422374/88975bd8-3279-d13a-aeb7-e42db7165c47.png)

#GitHub Pagesを使ってみて
こんなに簡単にwebサイトができてびっくりです。
もっといいツールがあればそっちも試したいです！

有識者からみたら、こんなのでって思われるかもしれませんが、
自分のサイトができてワクワクしてます！

#おわり
Qiitaをはじめて書いたのですが、マークダウン方式って楽しいですね。
作ったらまたQiita更新します！
TWA(Trusted Web Activity) アプリを aab(Android App Bundle) でリリースするときは気をつけてください！

# はじめに

TWA は、 PWA サイトのアプリ版を簡単に作れる便利なやつです。

TWA の仕組みとして、 PWA サイト側に 「信頼して良いか」 を判断するための設定ファイル `.well-known/assetlinks.json` を配置する必要があります。

今回その設定ファイルの値を間違っていたせいでハマったので、ぼくと同じ人が現れないように記事にしておきます。
誰かの助けになれば幸いです 🙏

# 気をつけること

`.well-known/assetlinks.json` の `sha256_cert_fingerprints` の値

# どうするのか

![スクリーンショット 2019-05-23 13.07.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34926/fc504277-f6eb-e543-8d59-b4ccfaefa6cb.png)

Google Play Console - リリース管理 - アプリの署名 で、上記画像の該当箇所を確認してください。
これを間違えると、URLバーが永遠に出続けてしまいます。。

似たような見た目で 「アップロード証明書」 という項目がありますがソチラではありません！
（aab ファイルでリリースしていない場合は画像のような画面は表示されないようです。）

# （おまけ） apk でリリースする場合

```
keytool -list -v -keystore Keystoreファイルパス -alias エイリアス名 -storepass パスワード -keypass パスワード
```

上記コマンドで出力される `SHA256` の値を設定すれば良いです。
SqlServer_SSISパッケージ


拡張子：.dtsx
①「SQL Server Business Intelligence Development Studio」で開き、変更できる。
②テキストで開き、変更できる。
 下記はパスワードを非暗号化に変更する設定です。

```
<DTS:Property DTS:Name="Retain">0</DTS:Property><DTS:Password DTS:Name="Password" Sensitive="1" Encrypted="0">password</DTS:Password>
```
バッチで実行
--
DTEXEC.EXE /F "import.dtsx"

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/b51c3640-4d7e-adc4-9490-4c58088d6c2d.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/b1503f2d-a1fd-c87c-ef54-6b65e285e9ed.png)
高橋くんと木の直径

- [高橋くんと木の直径](https://atcoder.jp/contests/abc019/tasks/abc019_4)

## 考察

- 最大で100回まで聞ける。
- 頂点数は最大で50。
- なので、1を始点とする最大の距離とその終点vを求める。
- そんで、vを始点とする最大の距離を求める。
- 結果、その距離が答えとなる



## [コード](https://atcoder.jp/contests/abc019/submissions/5551596)

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

int N;
vector<int> G[55];

int main() {
	cin >> N;

	// 始点を1とする最大の距離とその終点を求める
	int maxDist = 0;
	int start = 1, end = 0;
	for (int i = 1; i <= N; i++) {
		if (start == i) continue;
		cout << "? " << start << " " << i << endl;
		int dist;
		cin >> dist;
		if (dist > maxDist) {
			maxDist = dist;
			end = i;
		}
	}

	// 始点をendとする最大の距離とその終点を求める
	start = end, end = 0;
	maxDist = 0;
	for (int i = 1; i <= N; i++) {
		if (start == i) continue;
		cout << "? " << start << " " << i << endl;
		int dist;
		cin >> dist;
		if (dist > maxDist) {
			maxDist = dist;
			end = i;
		}
	}

	cout << "! " << maxDist << endl;

	return 0;
}
```
STIX 2 (Scientific and Technical Information Exchange) フォントの紹介

LaTeXの数式フォントを含むフォントで最も見た目が良いと思うSTIX 2 (Scientific and Technical Information Exchange) フォントの紹介です。見た目は以下のような感じになります(LaTeX Font Catalogueよりスクショ）

![Screenshot at 2019-05-23 13-25-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/e4268f47-4f06-6454-0493-ca4945012082.png)

LuaLaTeXまたはXeLaTeXの場合

```latex
\usepackage{unicode-math}
\setmathfont{STIX2Math.otf}
\setmainfont{STIX2Text-Regular}[
    Extension=.otf,
    BoldFont=STIX2Text-Bold,
    ItalicFont=STIX2Text-Italic,
    BoldItalicFont=STIX2Text-BoldItalic
]
```

それ以外の場合

```latex
\usepackage{stix2}
```

で使えます。 `TeXLive 2018` 以降が必要で、Ubuntuなら18.10以降、Debianなら10以降に入っています。

[ここ](https://tex.stackexchange.com/questions/425098/which-opentype-math-fonts-are-available) に `unicode-math` で使える数学フォントの見本一覧があります。
Xcode 9.4.1やXcode 10.1でiOS 12.3やiOS 12.4 betaをデバッグする方法

# この方法は非公式です

Xcode 9.4.1でiOS 12.1のデバッグを行いたいときに
/Xcode_10.1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/12.1
を
/Xcode_9.4.1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
にコピーしてデバイスを接続することで
/Users/UserName/Library/Developer/Xcode/iOS DeviceSupport
に 12.1 (16B91) のファイルがデバイスから吸い上げられデバッグが可能になります。
この方法は多くの方がご存知なのではないかと思います。

## 2019/05/23段階でXcode 10.3がリリースされていない

Appleさん、どうしたんでしょうか。
もうiOS 12.4 beta 2がリリースされているというのにXcodeのバージョンは10.2.1が最新版のままです。
Xcode 10.3やXcode 10.4 betaがリリースされないため DeviceSupport をコピーしようにもできず
iOS 12.3や12.4 betaでデバッグができません。

## 対処法

1. Xcode 10.2.1をダウンロード
2. /Xcode_10.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/12.2 をコピー
3. /Xcode_10.1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/ に貼り付けて 12.3 (16F156) や 12.4 (16G5027i) にリネーム
4. Xcodeを再起動してデバイスを接続

以上でXcode 9.4.1や10.1でiOS 12.3や12.4 beta 2のデバッグが可能です。

この方法はあくまでも非公式であり何らかの問題が発生する可能性も無くはないため、実施は自己責任でお願いします。
Appleさん、早いとこXcodeの更新お願いしますよ…。

## 2019/06/04 追記

Xcode 11 betaがリリースされました。
このXcodeにはiOS 12.3とiOS 11.0 betaのDeviceSupportが入っているため、DeviceSupportをコピーする従来の方法で対応が可能になりました。
iOS 12.4 betaについては引き続き上記の方法を取るしかない状態のようです。

/Xcode_11.0_beta.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/12.3
/Xcode_11.0_beta.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/13.0
↓
/Xcode_10.1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/ にコピー
ロミオとジュリエット

- [ロミオとジュリエット](https://atcoder.jp/contests/arc022/tasks/arc022_3)

## 考察

- 連結で辺がN-1本なので与えられるグラフは木
- 2頂点間の距離をできるだけ長くしたいので、木の直径を求めればよい



## 解法

- 木の直径となるような任意の2頂点を出力する。



## [コード](https://atcoder.jp/contests/arc022/submissions/5551428)

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

const int maxV = 111111;
int N;
vector<int> G[maxV]; // 頂点情報のみのグラフ

// treeDFS(親, 現在地, 根から現在地までの距離, 根からの最大の距離, 根から最大の距離となる頂点
void treeDFS(int from, int current, int dist, int &maxDist, int &maxVertex) {
    // 距離と終点を更新
    if (dist > maxDist) {
        maxDist = dist;
        maxVertex = current;
    }

    for (auto to : G[current]) {
        // 逆流を防ぐ
        if (to == from) continue;
        treeDFS(current, to, dist + 1, maxDist, maxVertex);
    }
}

void getTreeDiameter() {
    int start = 0, end = 0, maxDist = 0;
    treeDFS(-1, start, 0, maxDist, end);
    start = end, end = 0, maxDist = 0;
    treeDFS(-1, start, 0, maxDist, end);
		cout << start + 1 << " " << end + 1 << endl;
}

int main() {
	cin >> N;
	for (int i = 0; i < N-1; i++) {
		int a, b;
		cin >> a >> b;
		a--, b--;
		G[a].push_back(b);
		G[b].push_back(a);
	}

	getTreeDiameter();

	return 0;
}
```
誰も使っていないときだけ、マシンを自動停止させたい

# これはなに？

誰もログインしていないとき**だけ** `shutdown` を実行するスクリプトです。

AWS(Amazon Web Service) の [EC2(Elastic Compute Cloud)](https://aws.amazon.com/jp/ec2/) インスタンスを自動停止させるために作りました。
EC2のインスタンスは起動している時間で課金されるので、たとえば開発用などで誰も使わない夜中には停止させて経費を浮かせたい、ということがしばしばあります。

こういった自動停止は `AWS Lambda` を使う例がよく紹介されていますが、それだと問答無用で落としてしまいます。残業して開発している人がキレないよう、あえて `cron` でやることにしました。

# 使い方

1. 以下のスクリプトを適当なところに置き、実行権限を付与する
2. `root `権限の `crontab` で自動実行を設定する

私が扱っているインスタンスでは以下のようにしています。

```console:crontab
0,30 20-23 * * * /usr/local/sbin/condhalt
```

※ 20:00～23:30 まで30分毎。細かな書式はQiitaの記事「[cronの設定方法](https://qiita.com/hikouki/items/e744b3a4d356d2af12cf)」が分かりやすかったです

# 注意

* `shutdown` の実行には root 権限が必要なので、このスクリプトも root 権限が必要です<br>
root の `crontab` に設定すると問題が少ないと思います
* `w` と `shutdown` コマンドの位置を確認する<br>
OS、ディストリビューションによってはこれらのコマンドが置かれているパスが違う可能性があるので、適宜書き換えてください

# スクリプト本体

## 最新版

これまでのスクリプトは、仮想端末(pts)を使わずに接続しているケースを取りこぼしていたので、ログイン状態の確認に sshd を使うようにしました。(ちなみに、Visual Studio Code でSSH接続するときには pts を使いません。それで気づいたという……)

```perl:condhalt2.pl
#!/usr/bin/perl

use strict;
use warnings;

my $user = 0;
open(PCMD, '/usr/bin/ps auxww |');
while ( <PCMD> ) {
    $user++ if ( /sshd: [\w_\.-]+ \[priv\]/ );
}
close(PCMD);

if ( $user == 0 ) {
    system('/usr/sbin/shutdown -h now');
}
```

## 古いバージョン

```perl:condhalt.pl
#!/usr/bin/perl

use strict;
use warnings;

my $user = 0;
open(PCMD, '/usr/bin/w |');
while ( <PCMD> ) {
    $user++ if ( m| pts/[0-9]+ | );
}
close(PCMD);

if ( $user == 0 ) {
    system('/usr/sbin/shutdown -h now');
}
```

# 今後

この方法はお手軽なので対象インスタンスが1台2台ならいいんですが、数が増えるとスクリプトを置いたり `crontab` の設定をするのは面倒です。`AWS Lambda` でなんとかしたいところなので、暇を見つけて作りたいと思っています。
MSAccessのaccdb/accde/mdbファイルみたいなのを自動でPC起動時に起動したいときのアレ

# はじめに
社内ではMSAccessをアプリ基盤としてごりごり使っているのですが、
PC起動時に勝手にアプリが上がってくるようにしてほしい(という方向性のアプリを作ってほしい)なんて話が上がってきました。

だが、調べてみると、意外にまとまった情報が無い。

# ということで
つくってみました。以下のソースを適当な標準モジュールにインポートして使うと幸せになれるかもしれないです。

とりあえず動作確認してるのは

・Windows10 Pro 1903
・Microsoft Access 2013と2012

です。
(バージョン依存してる書き方などしていないと思うので、ほとんどのバージョンで動くだろうとは思いますが)

## おソース
```VB
Option Compare Database
Option Explicit

Const SHORTCUTNAME = "\hogehoge.lnk"    '拡張子はlnkないしurlで終わらないとダメらしい

Public Sub CreateShortCut_ToStartup()
    Dim ws As Object
    Dim myShortcut As Object
    
    Set ws = CreateObject("WScript.Shell")
    Set myShortcut = ws.CreateShortCut(ws.SpecialFolders("startup") & SHORTCUTNAME)
    
    With myShortcut
        .TargetPath = CurrentProject.FullName
        .Save
    End With
End Sub

Public Sub DeleteShortCut_ToStartup()
    Dim ws As Object
    
    Set ws = CreateObject("WScript.Shell")
    If 0 < Len(Dir(ws.SpecialFolders("startup") & SHORTCUTNAME)) Then
        Kill ws.CreateShortCut(ws.SpecialFolders("startup") & SHORTCUTNAME)
    End If
End Sub
```

なにかあればコメなりプルリクで。
実務未経験からRails開発に途中参加した際の環境構築

# 　はじめに
実務未経験から内定をいただいた企業のrailsでの開発に途中参加することになり、環境構築を行う中で躓いた部分があったため振り返り用として記録します。

#　 環境
- プログラミングスクールにてRuby、Railsの環境構築済み
- データベースはMySQLを使用
- GitHubアカウント登録済
- Homebrew、rbenvインストール済み
- mac OS使用

#　前提
- 与えられた情報はGitHubのリポジトリのみ
- ローカル環境で起動できることを目標とする

#   やったこと
## GitHubリポジトリの共有
1.プライベートリポジトリを共有するためGitHubに登録しているアドレス又はアカウント名を伝える
2.GitHubのリポジトリへ招待され参加する
3.ローカルリポジトリの作成

##  開発環境構築
### 1.Ruby、Rails等のバージョンを開発環境に合わせる
Ruby、Railsのバージョンなどは 「**Gemfile**」 で確認をします

```ruby:Gemfile
ruby '2.5.0'

gem 'rails', '~> 5.2.0'
gem 'pg', '>= 0.18', '< 2.0'
gem 'sass-rails', '~> 5.0'

```

ここではRubyのバージョンを合わせます
自分のPCにインストールしているバージョンを確認

```
$ rbenv install --list
Available versions:
  1.8.5-p52
  1.8.5-p113
　　：
```

下記コマンドで変更したいバージョンを指定
**インストールしていた場合**

```
$　rbenv local 2.6.0
```
**インストールしていない場合**

```
$　rbenv install 2.6.0
```
バージョンも合わせ、いざ　**Gemをインストール**　

```
$　bundle install
```

そしたらこんなエラーが…
何やらpgがインストールされてないとか？

```
An error occurred while installing pg (1.1.3), and Bundler cannot
continue.
Make sure that `gem install pg -v '1.1.3' --source 'https://rubygems.org/'`
succeeds before bundling.
```
pgってなんだというところから検索し…データベースが**PostgreSQL**であることがは判明！！
[こちら](https://www.dbonline.jp/postgresql/install/index1.html)を参考にインストール



ターミナルでコマンドを打ち

```
$ sudo gem install pg -v '1.1.4' --source 'https://rubygems.org/'
```

またしてもエラー…
エラー内容は忘れましたが[こちら](https://qiita.com/tdrk/items/812e7ea763080e147757)を参考にし解決（恐らく同じエラーでした）

```
$ brew install postgresql
```

### ２.PostgreSQLも無事インストールできたので再度Gemをインストール

```
$　bundle install
```
### ３.データベース作成

```
$ bundle exec rake db:create
```
### ４.マイグレーションファイルの実行

```
$ bundle exec rake db:migrate
```
### ５.PostgreSQLを起動

```
$ postgres -D /usr/local/var/postgres
```
### 6.サーバーを起動

```
$ rails s
```

これで無事にローカル環境構築完了！！
#####　※手順としては前後している可能性がありこれが正しいとは限りませんのでご了承ください

# 　おわりに
プログラミング初心者として検索していく中で、同じような状況の人の手助けになればと思い記事にしました。
やり方としてはエラーに遭遇しながら手探り状態で調べて進めたため参考程度に。

# 　参考
https://qiita.com/nasutaro211/items/d69a5e0b883293537b7e#_reference-a0cf0f3d167d682de2dc
https://qiita.com/youcune/items/5b783f7fde45d0fd4b35
https://qiita.com/yh2020/items/8be3087004d100fe752b
仮想環境でsbtを起動して、IntelliJでデバッグする

# IntelliJで仮想環境のsbtに接続してデバッグする方法

## まとめ

sbt起動オプションに 0.0.0.0:をつけて、InttelJのEdit Configurations でremote指定

~~~
sbt -jvm-debug 0.0.0.0:5005
~~~

## 内容

リモートのデバッグ設定自体は、[$shibayu36->blog;](https://blog.shibayu36.org/entry/2017/08/25/073104) とかでできるのだけど、仮想環境で立ち上げたsbtにアタッチしようとすると "Connection refused"になり接続できない。

## 切り分け

- jdbコマンドで色々試した
- ゲストOSでsbt 起動

~~~
$ sbt -jvm-debug 5005
~~~

### ゲストOSの別ターミナルでアタッチ

これはOK

~~~
$ jdb -attach 5005
~~~

これもOK

~~~
$ jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=5005
~~~

### ホストOSのターミナルでアタッチ

- Connection refusedで失敗

> $ jdb -connect com.sun.jdi.SocketAttach:hostname=192.168.1.2,port=5005

### ゲストOSでIPアドレスを指定

- Connection refusedで失敗

> $ jdb -connect com.sun.jdi.SocketAttach:hostname=192.168.1.2,port=5005

## 解決

1. localhostからの接続しか受け付けないようなのでそれを調査
2. LISTENポートを調査

~~~
$  netstat -l | grep 5005
tcp        0      0 localhost:5005          0.0.0.0:*               LISTEN     
~~~

### 対応方法

- sbt起動時のオプション変更

~~~
sbt -jvm-debug 0.0.0.0:5005
~~~

成功!

~~~
> $ jdb -connect com.sun.jdi.SocketAttach:hostname=192.168.1.2,port=5005
~~~

## 参考
- [https://stackoverflow.com/questions/45890416/cant-get-java-app-to-listen-on-port-for-remote-debugging-purposes](https://stackoverflow.com/questions/45890416/cant-get-java-app-to-listen-on-port-for-remote-debugging-purposes)
RPA新人が上司にあったらいいよねと言われて作ってみたロボット

#はじめに
RPA課に新卒で配属されたyusukeです。
いやー、RPA結構楽しいなと思ってきて、何か便利なものを作れないかなと思っているんですが、
上司から、ネタをいただいたのでそのロボットを作るところを記事にしたいと思います。

そのネタとは「特定の文章を含むメールの受信をトリガーに、飲み会の場所を検索してリストにして返してくれるやつ」です。
いや、あんまり意味わかんないですよね、次から解説していきます。
長めですがお付き合い下さい。

##ロボットの全体像　設計フェーズ

1 UiPathStudioはoutlookmailと連携しているので、outlookを見るアクティビティで、メールの件名に【飲み会】とあるものを受信したときにロボットを動かすようにする。

２メールの件名を判断する機能で含まれていればという条件を加える。

３飲み会の店を検索するために、件名の６文字目から文字の最後までを取得する。

４検索の動作を行う（WEBレコーディング）

５データテーブルの出力

６出力したやつをメールにきれいにして記述して、メールを返す。

なんかやたら長いですね。ちなみに全体像はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416305/cc8afa2f-2998-9ffe-a608-9d9ee6f4a8ec.png)

ちょっと見ずらいですが、まあこんな感じかなと。

##実際に書いてみる。（今回はフローチャートで書きます）
まず、outlookメールメッセージを取得アクティビティを張ります。
ここでの設定では、プロパティパネルのところの設定に注意が必要です。
　　　　　　　　　　　　　　　<img width="191" alt="コメント 2019-05-23 105834.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416305/bac56c98-31b7-d0bb-0e2b-3f4992220394.png">　　　　

ここでは、上限数(メールを上からどれだけ読み取るか）、未読メッセージのみ読み取るかのチェック、メールフォルダの指定（初めはinboxになっているので修正が必要です)、出力のところではCtrl＋Kで変数を作成します。

変数を作成したあとで、メールの件名を変数名.subject.ToStringで別の変数に持たせて、それをIFで特定の文字を持っているか判定します。

判定に成功した際の、代入アクティビティを作ります。
ここで、代入する変数を作成し、代入される値を

　　```変数名.Substring(5,Search.Length-5)```

とします。これは件名のトリガーを【飲み会】にしており、飲み会自体が５文字なので５文字目を起点にして、文字列の長さから、【飲み会】の文字数を引いた文章をとる。ということです。

あとはレコーディングとデータスクレイビングをして、データテーブルを出力アクティビティで抽出し、それをoutlookメールを返信するアクティビティで設定してやればOKです。


##実際に動いたらどうなの？

<img width="943" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416305/3427fef2-aae6-7f15-f8b3-39211ed38fa1.png">

こんな感じのメールが返ってきます。
送信メールの件名には
```件名：【飲み会】新宿　居酒屋　おいしい```
と記入しています。

##まとめ

RPAってお堅い感じがあったと思うんですが、実はこんな便利なこともできます。
自動化の道はまだまだ遠そうですね・・・
【Java】Stringクラス比較時の等価判定・等値判定の判定違いについてノート

Sting型変数に文字列の値を格納する時、書き方の違いによって`String.equals`と`==`の間で判定結果が異なる。忘れないようにノート。

- newを使う書き方
   - `equals` -> true
   - `==` -> false
- 楽な書き方
   - `equals` -> true
   - `==` -> **true**

#newを使う書き方#
一般的にオブジェクト生成する時と同じ書き方

```
    String str = new String("文字列");
```
これで値を格納した変数同士を比較する。
（果たして「格納」という言葉の使い方がこれで合ってるのだろうか？）

```Main.java
    // オブジェクトを生成
    String cat1 = new String("たま");
    String cat2 = new String("たま");

    // 等価判定と等値判定
    System.out.println(cat1.equals(cat2));
    System.out.println(cat1 == cat2);
```
```出力結果.
true
false
```

#楽な書き方#
基本データ型に値を格納する時と同じ書き方

```
    String str = "文字列";
```
これで変数同士を比較する。

```Main.java
    // 変数に値を格納
    String cat3 = "みけ";
    String cat4 = "みけ";

    // 等価判定と等値判定
    System.out.println(cat3.equals(cat4));
    System.out.println(cat3 == cat4);
```
```出力結果.
true
true
```

つまるところ、`==`演算子を使って文字列同士を比較してしまうと、判定結果が異なってしまうので気をつけようということ。
Unity+Oculus GO メモ


###準備

下記、URLの記事を参考にすればできるので省略、PlayerSetting周りまではこの記事で可能

AssetStoreからOculuc Integration を入れる所までやっておく
（バージョンは1.37）

●参照URL
https://framesynthesis.jp/tech/unity/oculusgo/


### テストシーン作成

参考URL：http://kan-kikuchi.hatenablog.com/entry/Oculus_Integration_2

参照URLを元に作成していく、Ver1.37のPrefabには `TrackedRemote` がいないので焦った。

代わりを探してみたところ、`OVRControllerPrefab` に名前が変わっていたので、
こちらを使う。下図のような配置にしてOculusGoにビルドするとGo内でコントローラーが表示された。

使用するPrefabは 
**VR⇒Prefabs⇒OVRCameraRig**
**VR⇒Prefabs⇒OVRControllerPrefab**


![2019-05-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17904/7f7aa567-d52b-eac4-b310-50ca1232bab1.png)
インスタンスを生成しつつ参照渡し、できない(C++)

# 参照渡しの関数に(実質)定数を渡すとき

参照渡しで使っている関数があります。
値渡しなら引数のところにコンストラクタを書けますが、参照渡しの場合はこれができません。

``` cpp
void func1( Hoge & hoge )
{
}

void func2( Hoge hoge )
{
}

int main()
{
	Hoge v( 123 );		// 普通にインスタンスを生成.
	func1( v );			// 普通にOK.
	//func1( Hoge(123) );// できない.

	func2( v );			// 普通にOK.
	func2( Hoge(123) );	// できる.
}
```

この違いについて<sub>(日本語で)</sub>調べていたのですがわかんないですね、やっぱり。

## 考察

考えられることはライフタイム問題でしょうか。
例えば

``` cpp
func1( *(new Hoge(123) );
```

これはOKなのです。スタックから参照すると破棄の問題が出る、とかそういうことなのでしょうか。
しかし手前でインスタンスを生成し変数名をつけても同じことです。

ちゃんと規格を読めば判るのかな....
capistranoでのデプロイ時に、assets:precompile でメモリエラーが発生する

# エラー内容

capistranoでのデプロイ時に、デプロイ先サーバで`assets:precompile`をするのですが、これがメモリ不足で失敗しました。
以下はエラーログです。

```log/capistrano.log
 INFO [12ac274e] Running $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile as hoge@fuga.piyo
DEBUG [12ac274e] Command: cd /var/www/hoge/releases/20190523032428 && ( export RBENV_ROOT="$HOME/.rbenv" RBENV_VERSION="2.5.1" RAILS_ENV="staging" RAILS_GROUPS="" ; $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile )
...
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
```

# 対処法

## 1. サーバにSwap領域を追加する。

Ubuntu 16.04だったので、以下のサイトを参考にSwap領域を2GB追加しました。

参考: [swap領域拡張手順(ファイル割当)](https://l-w-i.net/t/ubuntu/swap_001.txt)

## 2. 環境変数 NODE_OPTIONS に max-old-space-size を設定する

デプロイ先のサーバにssh接続し、以下の環境変数を追加します。

```
$ sudo vim /etc/environment
# 以下の行を追加してください
export NODE_OPTIONS="--max-old-space-size=2048"
```
plunkerでsimcirjs その5

#概要

plunkerでsimcirjsやってみた。
2bit乗算器作ってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4b01dfb7-ef44-14ed-bd94-b7c0c2f58812.png)

#サンプルコード

```
{
  "width":800,
  "height":400,
  "showToolbox":true,
  "toolbox":[
    {"type":"In"},
    {"type":"Out"},
    {"type":"Joint"},
    {"type":"DC"},
    {"type":"LED"},
    {"type":"PushOff"},
    {"type":"PushOn"},
    {"type":"Toggle"},
    {"type":"BUF"},
    {"type":"NOT"},
    {"type":"AND"},
    {"type":"NAND"},
    {"type":"OR"},
    {"type":"NOR"},
    {"type":"XOR"},
    {"type":"XNOR"},
    {"type":"OSC","freq":1,"label":"OSC(1Hz)"},
    {"type":"7seg"},
    {"type":"16seg"},
    {"type":"4bit7seg"},
    {"type":"RotaryEncoder"},
    {"type":"BusIn"},
    {"type":"BusOut"},
    {"type":"RS-FF"},
    {"type":"JK-FF"},
    {"type":"T-FF"},
    {"type":"D-FF"},
    {"type":"8bitCounter"},
    {"type":"HalfAdder"},
    {"type":"FullAdder"},
    {"type":"4bitAdder"},
    {"type":"2to4BinaryDecoder"},
    {"type":"3to8BinaryDecoder"},
    {"type":"4to16BinaryDecoder"},
    {"type":"AltFullAdder"},
    {"type":"Transmitter"},
    {"type":"Delay"},
    {"type":"NumSrc"},
    {"type":"NumDsp"},
    {"type":"DSO"}
  ],
  "devices":[
    {"type":"OSC","freq":1,"label":"OSC(1Hz)","id":"dev0","x":32,"y":152},
    {"type":"8bitCounter","id":"dev1","x":96,"y":96,"label":"8bitCounter"},
    {"type":"4bit7seg","id":"dev2","x":192,"y":104,"label":"4bit7seg"},
    {"type":"4bit7seg","id":"dev3","x":192,"y":200,"label":"4bit7seg"},
    {"type":"4bit7seg","id":"dev4","x":600,"y":96,"label":"4bit7seg"},
    {"type":"HalfAdder","id":"dev5","x":512,"y":208,"label":"HalfAdder"},
    {"type":"AND","id":"dev6","x":312,"y":40,"label":"AND"},
    {"type":"AND","id":"dev7","x":312,"y":112,"label":"AND"},
    {"type":"AND","id":"dev8","x":312,"y":184,"label":"AND"},
    {"type":"AND","id":"dev9","x":312,"y":248,"label":"AND"},
    {"type":"HalfAdder","id":"dev10","x":408,"y":208,"label":"HalfAdder"}
  ],
  "connectors":[
    {"from":"dev1.in0","to":"dev0.out0"},
    {"from":"dev1.in1","to":"dev0.out0"},
    {"from":"dev2.in0","to":"dev1.out0"},
    {"from":"dev2.in1","to":"dev1.out1"},
    {"from":"dev3.in0","to":"dev1.out2"},
    {"from":"dev3.in1","to":"dev1.out3"},
    {"from":"dev4.in0","to":"dev8.out0"},
    {"from":"dev4.in1","to":"dev10.out0"},
    {"from":"dev4.in2","to":"dev5.out0"},
    {"from":"dev4.in3","to":"dev5.out1"},
    {"from":"dev5.in0","to":"dev6.out0"},
    {"from":"dev5.in1","to":"dev10.out1"},
    {"from":"dev6.in0","to":"dev1.out1"},
    {"from":"dev6.in1","to":"dev1.out3"},
    {"from":"dev7.in0","to":"dev1.out0"},
    {"from":"dev7.in1","to":"dev1.out3"},
    {"from":"dev8.in0","to":"dev1.out0"},
    {"from":"dev8.in1","to":"dev1.out2"},
    {"from":"dev9.in0","to":"dev1.out1"},
    {"from":"dev9.in1","to":"dev1.out2"},
    {"from":"dev10.in0","to":"dev7.out0"},
    {"from":"dev10.in1","to":"dev9.out0"}
  ]
}
```

#成果物

https://embed.plnkr.co/IesNn4k0Gk5f1fp5nFEW/


以上。
Verilog初心者がよく失敗するポイントと解決

#Verilog初心者の私が躓いたポイントと解決した手段について
　大学の講義にてVerilogに触れる機会がありましたので、初心者のうちによく躓いたポイントと私なりの解決方法を列挙します。

##モジュール名,レジスタ名などのタイプミス
　VSCodeのVerilogHDLやVerilog HDL/SystemVerilogといった拡張機能を使うと、ある程度タイプミスは減らせると思います。補完がめちゃくちゃ強力なわけではないのである程度自分で補完を書いてみるのがいいかもしれません。


##ブロックの指定がbegin/end
　現在よく使用される高級言語の多くは{ }を使ってブロックを指定しますがVerilogはbegin/endを使ってブロックを指定します。その為if begin end else begin end・・・の様なコードとなってしまいます。初めて扱うと少し冗長な表現に見え、またbeginとendの対応が分かりずらくなってしまいます。そのため次のように書くと比較的対応が分かりやすいかと思います。

```verilog:sample1.v
while(---) begin
    if (---) begin
        ---;
    end
    else if (---) begin
        ---;
    end
    else begin
        ---;
    end
end
```

##データのビット幅指定
 Verilogのデータはwire型(ワイヤ)とreg型(レジスタ)にがあります(wireとregの違いについては別の記事で)。これらを使用する際、wire <変数名>;のように宣言すると<b>1ビット</b>のワイヤとして扱われます。多ビットのワイヤもしくはレジスタとして扱いたい場合はwire [3:0] <変数名>のように宣言する必要があります。この場合だと3~0ビットが用意されるため4ビットのワイヤが宣言されます。
また[3:0]と[0:3]はレジスタの取得時に明確な違いが発生しますから、よっぽどのことがなければどちらかに統一しましょう。[^1]

```verilog:sample2.v
module sample
(
    input CLK,
    output reg [7:0] LED_DEC
);
    wire sample;
    wire [3:0] mult;
endmodule //sample
```

##module, function内のビット幅指定
moduleやfunctionは再利用できる一つのモジュールとして定義されます。上位モジュールと信号線を接続するためにinputとoutputの記述を必要とします。その記述内でもビット幅指定を必要とするので注意してください。sample2.vの( )内のようにビット幅を指定しながらinputかoutputかを指定する必要があります。またoutputはwireかregかを選択できるのでなるべく明示的に宣言しておきましょう。

##alwaysの中で書き換えるのは1つの変数のみ
　一般のプログラミング言語的にalways文で順序回路を書こうとすると、1つのalways内で複数の変数を書き換えたくなるかと思います。しかし、Verilogでは複数の入力⇔複数の出力と対応させてしまうと、中身が分かりづらくなり予期せぬ動作・エラーが発生してしまう可能性があります。
　1つのalwaysで1つの出力を作り出すように記述することで変数の対応が分かりやすくなります。

##レジスタの初期化
　回路記述を行っている際、initialでレジスタを初期化することはできません。書くならばレジスタを宣言した際に初期値として値を設定しましょう。しかし、初期値を使うのはあまり良いことではない（らしいソースは教員）のであまり使用しないようにしましょう。

```verilog:sample3.v
    reg foo;
    reg bar = 1'b0;  // どうしても初期化したいならこの方法を使う
    init begin
        foo = 1'b0; //initで初期化することはできない
    end
```


参考文献
[^1]:cf.リトルエンディアン・ビックエンディアン
https://qiita.com/kaizen_nagoya/items/4c02f1575db1f28310a7
位置情報を取得するAPIを解説してみた

完成形はこちらになります↓
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="yuji-yakena" data-slug-hash="NVXQYE" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="NVXQYE">
  <span>See the Pen <a href="https://codepen.io/yuji-yakena/pen/NVXQYE/">
  NVXQYE</a> by Yuji Yakena (<a href="https://codepen.io/yuji-yakena">@yuji-yakena</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#1.まずは簡単なhtmlを作成

```html:index.html
<!DOCTYP html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Geolocation</title>
</head>
<body>
  <h1>位置情報サンプル</h1>
  <button onclick="getPosition();">位置情報を取得する</button>
  <script src="app.js"></script>
</body>
</html>
```

ポイントは２箇所あります

`<button onclick="getPosition();">`
ボタンをクリックすることで、jsファイルで定義したgetPosition()メソッドを呼び出して実行します。

`<script src="app.js"></script>`
jsファイルを読み込みます。

#2.jsファイルにてメソッドの定義

```js:app.js
function getPosition(){
  navigator.geolocation.getCurrentPosition(
    function(position){
      let nowLatitude = position.coords.latitude;
      let nowLongitude = position.coords.longitude;

      alert("緯度："+nowLatitude+"、経度"+nowLongitude);
    },
  );
}
```

`function 関数名()`
任意の関数名を定義し、{ }内に実際の動作を記述します。
html側では、この関数名で呼び出します。

`navigator.geolocation.getCurrentPosition()`
デバイスの現在位置を取得するメソッドです。
引数として、success・error が使用されます。

メソッドの構文・定義など詳細はこちら↓
https://developer.mozilla.org/ja/docs/Web/API/Geolocation/getCurrentPosition

`function(position)`
先程引用した位置取得メソッドの引数として認識されます。

`let 変数名`
任意の変数を定義して、緯度・経度プロパティを格納します。

`position.coords.latitude`
`position.coords.longitude`
それぞれ緯度・軽度プロパティとして取得できます。

`alert(引数)`
先程定義した変数をアラート表示します。

#まとめ
APIを理解する最初のステップとして、参考になれれば幸いです。。


#参考元
MDN JavaScript リファレンス
https://developer.mozilla.org/ja/docs/Web/JavaScript
WordPressをマルチサイトで。vagrant vvv(Varying-Vagrant-Vagrants).v2.5.2上でやる場合。

Wordpressの設定ファイルを弄ってマルチサイト化し、サブドメインでセットアップしました。
次にサイト新規追加したんだけどサイトが表示されない。
インストールに失敗した的なメッセージが出て、アクセスしても
「このサイトにアクセスできません」ってなる。

で、でもここまで来たら実はあと少しで、
「*vvv-custom.yml*」ファイルを少し弄って*vagrant*を```vagrant reload --provision```すれば完了する。

```
sample-multi-site:
  description: "A standard WP install, useful for building plugins, testing things, etc"
  repo: https://github.com/Varying-Vagrant-Vagrants/custom-site-template.git
  hosts:
    - sample-multi-site.test
    - exsample01.sample-multi-site.test
    - exsample02.sample-multi-site.test
  custom:
    wp_type: subdirectory
```
こんな感じ。*hosts*の追加と*custom*の記述を追記する。それで再起動。
これでいけた。


久ぶりにWordpressを使うことになって環境構築から調べながらやってる。
vagrantもvvvも構築するのにわりと手間取ったけど調べれば何とかなった。
掲題の件は、
たまたま解決できた。
調べても、*host*とか*nginx*とかの設定を弄るみたいな感じの記事がヒットするけどどれもハズレ。
結局、VVVのドキュメントを眺めながら弄ってたらできた。
VVVすげえ！！
岩舘電気の中の人が JPiere を構築してみた

こんにちは、岩舘電気の中の人です。
今回は iDempiere を日本向けに開発した JPiere のインストール方法を解説します。テストのためインストールしただけなので解説というよりはメモですが、何かの役に立てばと思い公開します。なお2019年5月23日現在の最新のインストール方法です。

以下、常体で記載します。


Windows 10 Pro x64 を想定

iDempiere 6.2 の前提条件を https://www.idempiere.org/ から確認。

Java OpenJDK >= 11
PostgreSQL Database >= 9.6

Java OpenJDK 11.0.3 を Oracle からダウンロード、解凍して bin フォルダにパスを通す。`java -version` を実行してバージョンの確認と、`Server VM` がインストールされていることを確認する。(`Client VM`ではないことを確認)

```
C:\>java -version
java version "11.0.3" 2019-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.3+12-LTS, mixed mode)
```

PostgreSQL 9.6.13 を本家からダウンロード、インストールし、bin フォルダにパスを通す。
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

JPiere 2019-05-19 と export data をダウンロード。JPiere は `C\jPiere` 直下に解凍。
https://osdn.net/projects/jpiere/releases/71133

このリンクを参考に、pgAdmin 4 を使ってDBユーザの追加とDBのリストアを行う。ただしこの際DBのデータはダウンロードした `ExpDat_20190519\ExpDat.dmp` を使うこと。
https://www.compiere-distribution-lab.net/idempiere-lab/install/windows7/#no3

同じリンク内の解説を参考に、 `setup.bat` を実行して設定を行う。ただしWebサーバに `localhost` を使うとアクセスできない場合があるのでIPアドレスまたはサーバ名を指定する。（IPアドレスを入れると名前解決後のホスト名に変換されて保存される？）また `DB already exists` をチェックするのを忘れないこと。「テスト」を押してテストがすべて通ったら保存を押す。初回にSSLの設定画面が出るが、okを押して進める。
![setup.bat.qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61220/fb55db2d-92b0-9269-9720-a5f624380e3d.png)


`idempiere.exe` を実行してサーバを立ち上げる。立ち上がりには少し時間がかかる。起動直後に消費されているメモリは 3GB ほどなので、仮想マシンの場合最低でも4GBほどのメモリを割り当てたほうが良い。

アプリケーションへのログイン情報はこちらを参照。
https://www.compiere-distribution-lab.net/jpiere-lab/lets-start-jpiere/operation/#no01


以上です。
SynchroidでのDAにて画面をうまく認識しないときの対処方法

#何が起こったか

この動画(https://www.youtube.com/watch?v=UShabAHK38U&t=319s)
を見ながら、Synchroidでのデバイスオートメーションを体験しようとしたときのことである。


![メモ帳のファイルを押そうとするとずれる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/23e4c484-7aed-daba-4e6e-e61cff3f996c.png)


！？

ファイルボタンを押して、上書き保存をしようとしたのに、ボタンがずれてしまっている..


いや、まぁでも　たまたまかな？　いけるだろう。


と思って、このクリックを実行してみた。


![左クリックをしたらブランクに.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/11ceb11e-4d29-c238-b249-1e9d38f57405.png)


案の定、ブランク状態になった。。。。



実際にリモートで動かしているPCのほうを見てみると、ファイル(F)ボタンを押しておらず、メモ帳のすぐ隣のデスクトップのほうにマウスのカーソルがあった。
(おそらく、枠で囲まれた一番左の部分を押してしまっているからだと推測できる)

***

#対処法

今回実践したのは、二つ。


まず一つ目は、

##(1)直接選んでしまうやり方。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/f9d6de47-ae23-5a64-c21a-af38dc2695cb.png)

Program Managerのほうで、今回押したい　ファイル(F)の部分をドラッグしながら囲んでやる。
囲み終わって紫の四角が出来上がれば、その四角の上で右クリック
あとは、今回押したい左クリックに対応している Left　を押すだけ！

簡単！！



もう一つは


##(2)座標そのものをいじっちゃう


こっちは、さっきのProgram Manager　で作業するのではなく　メモ帳のほうで作業をするやり方。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/0700b33d-75b9-973b-0cf7-81ad5d929e9e.png)

まず、ずれた状態で構わないので、ファイルに該当する部分を左クリックするアクションを作る。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/6b600f60-4804-78d3-71a3-8e619db5828c.png)


こんな感じになっているはずです。

ここの「＋」となっている部分をクリックする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/69e48e33-24fe-5506-d66c-7dacbddd14d0.png)


画像の中に、Move Mouse　という箇所があるかと思います。

ここの「＋」となっている部分をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/12fd6005-229f-f4f3-ef03-6e6b40ca9e87.png)

Offsetを「None」　から　「Use」に変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/478eef08-f742-97ad-76ea-9eeb8d446482.png)


すると、画像のように　
Relative To ＝＞　上に移動させるか　左に移動させるか　などを決める部分
X　Y　　     ＝＞　座標をどれだけ移動させるかを決める

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/d51a6d3b-1d61-7f98-04f4-20565d8e8653.png)

参考にする座標に関しては、
画像の黒と黄色の四角の部分やを参考にするといいと思います。

今回は、斜め右くらいに「ファイル(F)」があるため


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/7733ff69-03a2-c799-29a7-b7c5d975c757.png)

Relative To　を　Bottom Right　に
X　Y 　　　　 に　それぞれ10を代入していきたいと思います。






##実行



それでは実行してみましょう



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/aadd173c-a140-c4a6-41a7-2cc302a255db.png)



押せた！！！！

***

##結論


画面をうまく認識してくれない場合には、

1.その箇所をそのまま選択してみる
2.座標をいじってみる

(あとは、キーボードショートカットで対応するなどもあるらしいですが、これは試しておらず）

方法がある。
[Vue.js] vue.jsでアンカーリンクを作成する

## やりたいこと
vue.jsでアンカーリンク（ページ内リンク）の実現

## 手順

###[その1] vue-smooth-scrollのインストール

```bash
cd *** // プロジェクトのディレクトリに移動 
npm i -D vue-smooth-scroll
```

###[その2] main.jsファイルにプラグインの使用を宣言

```javascript
import vueSmoothScroll from 'vue-smooth-scroll'
Vue.use(vueSmoothScroll);
```

###[その3] 挿入

```html
<a href="#section1" v-smooth-scroll="{ duration: 1000, offset: -50 }">セクション1</a>

<div id="section1">
  <!-- セクション1のコンテンツ -->
</div>
```
eclipseのカラーをダークに変更する。

### 全体の外観を変える
ウィンドウ > 設定 > 一般 > 外観をクリック
ダークを選ぶ。

### エディタの色を変える

ウィンドウ > 設定 > 一般 > 外観 > 色とテーマ

私は普段使っているVScodeのテーマ色に近い
「Sunburst」を選びました。

### エディタの背景色を変える

ウィンドウ > 設定 > 一般 > エディタ > テキストエディタ > 外観色オプション「背景色」

背景色が暗すぎる！と思った方におすすめです。

### フォントを変える
ウィンドウ > 設定 > 一般 > 外観 > 色とフォント > 編集 > お好みのフォントを選択

私はメイリオにしました。
jsdoでsimcirjs

#概要

jsdoでsimcirjsやってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7b214cee-0522-6f7f-2b04-99f63d37524a.png)


#成果物

http://jsdo.it/ohisama1/COzx

以上
Laravelプロジェクトcloneしてやることメモ

毎回忘れるのでメモ

githubからclone

```
$ git clone 【cloneするプロジェクト】
```

パーミッション変更

```
$ chmod -R 777 storage
$ chmod -R 777 bootstrap/cache
```
vendorがないので

```
$ composer install
```

.envをコピーして作成
作成後DBの設定等する

```
$ cp .env.example .env
```

アプリケーションキーの初期化

```
$ php artisan key:generate
```
マイグレーション実行

```
$ php artisan migrate
```

#参考
http://vdeep.net/laravel-git-clone
LD_LIBRARY_PATH を 設定したら /usr/lib/x86_64-linux-gnu/ 以下のライブラリが読み込めなくなった。


Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-1039-aws x86_64) で ORACLE 接続 の為に LD_LIBRARY_PATH を 次のように設定しました。

```:LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
```

すると vi を 起動すると次のようなエラーが出るようになりました。

```:viのエラー
vi: symbol lookup error: /usr/lib/x86_64-linux-gnu/libpython3.6m.so.1.0: undefined symbol: XML_SetHashSalt
```

↓ld に、このように設定しているのですが、なぜかデフォルトのパスが読み込めていない様子でした。

```:x86_64-linux-gnu.conf
/etc/ld.so.conf.d# cat x86_64-linux-gnu.conf
# Multiarch support
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
```

結果として、次のように記述することで対応しました。

```:LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:$ORACLE_HOME/lib:$LD_LIBRARY_PATH
```
TensorFlow.jsでDeepLearning（学習用画像データURLの収集）

こんにちわ。Electric Blue Industries Ltd.という、ITで美を追求するファンキーでマニアックなIT企業のマッツと申します。TensorFlow.jsでDeepLearningをする際に学習データ用の画像を収集することがあると思いますが、Google画像検索を使って簡単におこなう小ネタです。

Google画像検索で取得したい画像がリスト表示されたところで、下記のjavascriptをブラウザ（Google Chrome推奨）の開発者ツールのコンソールで実行すると、表示された画像のソースURLがCSVファイルとしてダウンロードできます。

```javascript:ggl_image_urls.js
// 検索結果のHTMLソースから各検索結果のアイテムごとにソースURLを取得し配列化
urls = Array.from(document.querySelectorAll('.rg_di .rg_meta')).map(el=>JSON.parse(el.textContent).ou);

// 改行コードを各行末尾に付けたCSVとして吐き出す
window.open('data:text/csv;charset=utf-8,' + escape(urls.join('\n')));
```

---

追伸：　Machine Learning Tokyoと言うMachine Learningの日本最大のグループに参加しています。作業系の少人数会合を中心に顔を出しています。基本的に英語でのコミュニケーションとなっていますが、能力的にも人間的にもトップレベルの素晴らしい方々が参加されておられるので、機会がありましたら参加されることをオススメします。
【Python】Tkinterによる40行で作るGUIアプリ「ハッシュ化ソフト」

# はじめに
私の研究分野であるブロックチェーン技術において、**ハッシュ関数はめっちゃ大事な技術の一つ**です。今回はそのハッシュ関数の一種である**SHA256**を使って、簡単に**ハッシュ値を生成できるもの**を作っていきましょう！コマンドプロンプトに出すだけだと面白くないので、**Tkinterを使ってGUIアプリ**を作成していきます。

ハッシュ関数の具体的な内容に関しては、ブロックチェーン技術及び関連技術の記事にありますので、興味があれば、ぜひこちらをご参照ください。→ [ハッシュ関数の詳細(ブロックチェーン技術及び関連技術)](https://qiita.com/MichihiroTsukano/items/1485f05a45a37d7ffe08#3-2-1-%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0)

完成するとこんな感じに動きます！
![ハッシュ化ソフト.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/b1954c53-812c-93a6-6369-d5e597ae7bb5.gif)



# 環境

- Windows 10 home
- Python 3.7.1




# ハッシュ関数(SHA256)によるハッシュ化ソフトの制作

## インポート

使うライブラリは以下の２つです。
**hashlib**をインポートすることで、ハッシュ関数**SHA256**を使うことができるようになります。

```py
import tkinter as tk
import hashlib as hash
```

## ウィンドウの作成

```py
import tkinter as tk

class Application(tk.Frame):
    def __init__(self,master):
        super().__init__(master)
        self.pack()

        master.geometry("480x200")
        master.title("ハッシュ関数(SHA256)によるハッシュ化ソフト")


def main():
    win = tk.Tk()
    app = Application(master = win)
    app.mainloop()


if __name__ == "__main__":

    main()

```

このプログラムでウィンドウを作っていきます。
サイズは**480×200**です。タイトル名は**ハッシュ関数(SHA256)によるハッシュ化ソフト**です。
詳しくは[PythonによるTkinterを使った雛形（クラス化手法）](https://qiita.com/MichihiroTsukano/items/4d8721aaa59e1c913d9a)の記事をご参照ください。



## 完成したプログラム

こちらが完成したプログラムになります。

```hash.py
import tkinter as tk
import hashlib as hash

class Application(tk.Frame):
	def __init__(self,master):
		super().__init__(master)
		self.pack()

		master.geometry("480x200")
		master.title("ハッシュ関数(SHA256)によるハッシュ化ソフト")

		self.setGUI()

	def setGUI(self):
		self.txt1 = tk.Entry(width=75)
		self.txt1.place(x=15,y=50)

		self.txt2 = tk.Entry(width=75)
		self.txt2.place(x=15,y=100)

		self.btn = tk.Button(text="ハッシュ化",command = self.btn_click,width=30)
		self.btn.place(x=125, y=150)

	def btn_click(self):
		if self.txt1.get() == "":
			self.txt2.delete(0, tk.END)
			self.txt2.insert(0,"")
		else:
			self.txt2.delete(0, tk.END)
			self.txt2.insert(0,hash.sha256(self.txt1.get().encode()).hexdigest())


def main():
	win = tk.Tk()
	app = Application(master = win)
	app.mainloop()


if __name__ == "__main__":
	main()
```

setGUI関数でテキストボックスやボタンを配置していきます。
btn_click関数でボタンを押した時の処理を行います。ここで、上部のテキストボックスの内容をハッシュ関数に入れ、そのハッシュ値を下部のテキストボックスで表示します。

以上でハッシュ関数(SHA256)によるハッシュ化ソフトは完成になります。
ここまで読んでいただき、ありがとうございました。