OmniAICreator/Qiita-1.07M huggingface dataset:
windows10 にタブ機能付き端末エミュレータ Fluent Terminal を入れる

Windowsデフォルトの端末はタブ機能がありません．
ローカルサーバーを複数立ち上げて作業していると，端末ウインドウの管理が大変です．
そこで，端末エミュレータをインストールすることで，タブ機能を持つ端末で CMD・PowerShell・WSL のコマンドを触れるようにします．
今回はなんとなく Fluent Terminal を選択しました．
C# 製だそうです．

# Fluent Terminal インストール
[README](https://github.com/felixse/FluentTerminal)では3つのインストール手順が紹介されています．
自分は[Chocolatey](https://chocolatey.org/)を用いたインストール方法を使用しました．

#### 1. **管理者権限でPowerShellを開く**
`Windows`+`x`からPowerShellを管理者権限で開けます．

#### 2. **Chocolateyをインストールする**
PowerShell で以下のコマンドを実行し，Chocolateyをインストールします．

``` powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-ObjectSystem.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

> 参考 [Windows10でChocolateyを使ってみた](https://qiita.com/hideki0145/items/e760eebcc5019275ae6a)

#### 3.**Fluent-Terminalをインストールする** 
PowerShellで```choco install fluent-terminal```を実行します．
実行後，色々聞かれますが全部Yesです．

これだけです．簡単でした．

# 見た目
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402968/1100a085-7c3c-7da9-694d-c0d518f8aad3.png)
なかなか格好いいですね．

テーマは5種類デフォルトで用意されています．自分で作るのも可です．
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402968/7ea386e8-111d-c83f-565a-cdd3e26359d2.png)

# まとめ
タブ機能付き端末が使えるようになったので満足です．パフォーマンスも良好です．
起動時のプロファイル設定なんかもできます．
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402968/8777c434-97d3-d9e4-eb5e-0647d1f36380.png)


ただ背景透過がにじんだ感じになるのが微妙です．
端末ごしにブラウザで記事を読めない... 
設定でどうにかなるのかな．

端末シミュレータは，Fluent Terminal の他にも色々あるみたいなので，「こっちの方がいいよ！」とかあれば教えて欲しいです．
VisualStudio2019のオプションからC#用の.editorconfigを生成する

[ツール] > [オプション] > [テキストエディター] > [C#] > [コードスタイル] の"設定から .editorconfig ファイルを生成"ボタン1つで生成できるので便利

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50790/70e3a628-f082-a526-d63f-dcceef68c0e5.png)

# 自動生成した .editorconfig に文字コードの設定を追加

文字コードの設定は自動生成したファイルには含まれていないようなので

```
# 文字コード
charset = utf-8
```

を生成したファイルに追記する

[editorconfig](https://editorconfig.org/#overview) によると

> charset: set to latin1, utf-8, utf-8-bom, utf-16be or utf-16le to control the character set.

の文字コードを設定できるようなので、開発環境に合わせてどうぞ

# コード整形のショートカットを叩くのも面倒な場合

[Productivity Power Tools 2017/2019](https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.ProductivityPowerPack2017)

上記の拡張機能をインストールして

[ツール] > [オプション] > [Productivity Power Tools] > [PowerCommands] の "Format document on save" のチェックボックスを ON すれば

保存時にフォーマットしてくれるようになるので、楽になります

参考: [Visual Studio で保存時にフォーマットする](https://kido0617.github.io/unity/2016-07-06-visual-studio-auto-format/)

# EditorConfig をよく知らない場合

どんなものなのかを知るには、下記の記事を見るのが1番早いと思います

[どんなエディタでもEditorConfigを使ってコードの統一性を高める](https://qiita.com/naru0504/items/82f09881abaf3f4dc171)

# 公式ドキュメント

[Visual Studio 2019](https://docs.microsoft.com/ja-jp/visualstudio/releases/2019/release-notes)

[コードのスタイル設定](https://docs.microsoft.com/ja-jp/visualstudio/ide/code-styles-and-code-cleanup?view=vs-2019)

[EditorConfig の .NET コーディング規則の設定](https://docs.microsoft.com/ja-jp/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2019)

[EditorConfig で移植可能なカスタム エディター設定を作成する](https://docs.microsoft.com/ja-jp/visualstudio/ide/create-portable-custom-editor-options?view=vs-2019)
Cache問題　解説編




1．Cache write → Cache Readの場合
図の通り、CPU1でCacheにコマンドを書き込んだとしてもそれがCPU2側の
Cache2から読み出す値と同じ値になっているかどうかは保証できない為、
タイミングによっては正しくコマンドが伝わらない。(下図)
![cache1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409991/ccba7f7d-d371-d6e1-841e-a404fb1c586a.png) 


2．Non Cache write → Cache Readの場合
図の通り、CPU1でShared memoryにコマンドを書き込んだとしてもそれが
CPU2側のCache2から読み出す値と同じ値になっているかどうかは保証できない為、
タイミングによっては正しくコマンドが伝わらない。(下図)
![cache2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409991/4df0aa11-5e87-9aec-8a45-6c41320311ef.png)


3.．Cache write → Non Cache Readの場合
図の通り、CPU1でCacheにコマンドを書き込んだとしてもそれがCPU2側で
Shared memoryから読み出す値と同じ値になっているかどうかは保証できない為、
タイミングによっては正しくコマンドが伝わらない。(下図)
![cache3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409991/5adc30f8-45f6-7aef-2d4a-4e7e4984b6f3.png)


4.Non Cache write → Non Cache Readの場合
以下①～④のような事が起きるとCPU2がNon Cache Readする際に事前にCPU1がNon Cache　writeしておいたコマンドが書き換えられしまっていて、正しくコマンド通信出来ない事がある。(下図①～④)

①CPU1内のスレッドAからコマンドをNon Cache Write
![cache4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409991/a92379e6-0cb9-0927-f58b-b64c5b1dffd0.png)

②CPU1内のスレッドBからコマンドと同じCache line上の別の値を変更
![cache4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409991/fba0f5fb-422b-62cd-42ff-78a77c26ae37.png)

③②によりCPU1内のCacheがあふれてコマンドと同じline領域がNon Cache領域へライトバックされる事でShared memorｙ上のコマンドが書き換えられる
![cache4-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409991/f415ca68-cf67-9750-24f8-66ff81482d7d.png)

④CPU2がNon Cache Readしたコマンド領域はすでにライトバックで破壊された後の不定な値となり、正しくコマンドが伝わらない。
![cache4-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409991/a9abb97d-8649-f9e1-895b-ac43fc8412b1.png)
ブランチ切らずにうっかりmasterで作業してた(Github)

####はじめに
初学者のアウトプット備忘録です。
ご指摘アドバイスあればよろしくお願いします。


###うっかりmasterで作業していた。。。。

はい。現在チーム開発カリキュラム中なのですが今回はブランチを切らずにうっかり、ずっとmasterで作業していました。。。。(時既に遅し感)

なんと初心者あるあるのなのかわからないですが、コミットも一回もしてませんでした。
これ、作業内容をなんとかmasterじゃなくて他のブランチに移動できないものかということで、
Google先生に聞いてみました。

ありました。

####参考

・[間違えてmasterで作業してしまった修正内容を別のブランチに移動させる方法](https://hacknote.jp/archives/17111/)


###手順

まず、ターミナルでgit status(コマンドを打つ)をして修正内容を確認します。(ターミナルに作業内容、変更内容が出てくる)

↓


コミットはせずにgit stashを入力する(コマンド打つ)ことで、先ほどの修正内容が、別の場所に一時保管されます。

↓

もういちどgit statusを行うと先ほどの修正内容はなくなっているはずです。

```
ターミナルにてこういう文章がでてきます。


On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
```


コマンドやGitHub Desktop.appで本来作業をしたかったブランチに切り替えorブランチ作り切り替えます。

↓

git stash applyを入力(コマンド打つ)することで、先ほど一時保管されていた内容を切り替えたブランチに適用できます。

そんで忘れずにしっかりコミットしてください。

とりあえず、命拾いした感じでした。
焦りは禁物ですね。。。
では、また
とあるRailsエンジニアが再就職活動を共有したがっているようだ 2019-05-03 on Twitter

# とあるRailsエンジニアが再就職活動を共有したがっているようだ 2019-05-02 on Twitter


<a href="https://twitter.com/YumaInaura/status/1123966999804174343">2019-05-02 15:06:29 UTC</a>
# エンターキーを強く叩く人で、仕事ができる人を見たことがないけど、ただ僕が見たことがないだけだと思う。



<a href="https://twitter.com/YumaInaura/status/1124142923434549250">2019-05-03 02:45:33 UTC</a>
# 新元号を新言語と聞き違えるプログラマは多そうというツイートをしている人は無数に多そう。


探さないけど。


<a href="https://twitter.com/YumaInaura/status/1124143346140585984">2019-05-03 02:47:13 UTC</a>
# 筋肉エンジニアを目指している、りおさんにフォロー頂きました。


>今日からコツコツと頑張ります。
>
>目指せ、理想の体型…！！

<a href="https://twitter.com/YumaInaura/status/1124225416972029952">2019-05-03 08:13:21 UTC</a>
# 石油と同じで、自分が選べる仕事の埋蔵量というものがなかなか分からない。


世の中広いのでそれなりに選択肢はあるものと思いたい。


<a href="https://twitter.com/YumaInaura/status/1124239111680811009">2019-05-03 09:07:46 UTC</a>
# a. Twitterでバズっても就職できない
b. Twitterでバズったら就職できる
c. この質問に意味はない


<a href="https://twitter.com/YumaInaura/status/1124239686631710720">2019-05-03 09:10:03 UTC</a>
# 就職で頭を悩ませる時間もかけがえのない人生のひとときだとオーヤンフィーフィーはかく語りき。



<a href="https://twitter.com/YumaInaura/status/1124240046465273857">2019-05-03 09:11:29 UTC</a>
# フリーランスの凄腕エンジニアの腕にApple Pencilで触れるイベントがあったらしいけど残念ながら見逃していた。


>令和記念にパーティーします！
>5月1日夜ピザパーティー19時から。氷結グレープフルーツ飲み放題、ほか持ち込み可、アマゾンプライム見放題、近くにセブン、参加無料、iPad ProとApple Pencilにさわれる、フリーランス凄腕エンジニアいます。

<a href="https://twitter.com/YumaInaura/status/1124248462885703681">2019-05-03 09:44:55 UTC</a>
# プログラミングしようとした瞬間に音が気になり始めるので、やはりプログラミングに静寂は必要。



<a href="https://twitter.com/YumaInaura/status/1124256709789093888">2019-05-03 10:17:41 UTC</a>
# プログラミング界のハードな話を聞いていると、なんで自分がこんなソフトな世界で生き延びられているのか不思議になってくる。
単に15年ぐらい運が良かっただけなのかもしれない。


<a href="https://twitter.com/YumaInaura/status/1124288030901096448">2019-05-03 12:22:09 UTC</a>
# 石油と同じで、自分が選べる仕事の埋蔵量というものがなかなか分からない。
  2019-05-02 on Twitter


<a href="https://twitter.com/YumaInaura/status/1124297958038622208">2019-05-03 13:01:36 UTC</a>



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1606








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
LaravelでGoogle2FAを使用して詰まった点メモ

LaravelでGoogle2FAを使用しようとして、QRコードが生成できなくって詰まったのでメモ

・google2faとQRコードのライブラリ導入

```
composer require pragmarx/google2fa
composer require bacon/bacon-qr-code
```

このとき`composer.json`

```
 "pragmarx/google2fa": "^5.0"
```

となっています。

Lravelの二段認証で調べると下記のような、`getQRCodeGoogleUrl`というメソッドを使っていますが、`google2fa 5.0`で消えていて使えません

```
 $qrUrl = $g2fa->getQRCodeGoogleUrl(
            config('app.name'),
            $user->email,
            $user->g2fa_key
        );
```

4.0.2では使用できるので、バージョンを変えましょう

```
 "pragmarx/google2fa": "^4.0"
```

5.0のREADMEでのQRコードの生成は下記のようにするようにあるのですが、パクっても
`You need to install the imagick extension to use this back end`
とでて、サーバーにインストールが必要らしく諦めました

```
//Bacon/QRCode
<?php

use PragmaRX\Google2FA\Google2FA;
use BaconQrCode\Renderer\ImageRenderer;
use BaconQrCode\Renderer\Image\ImagickImageBackEnd;
use BaconQrCode\Renderer\RendererStyle\RendererStyle;
use BaconQrCode\Writer;

$google2fa = app(Google2FA::class);

$g2faUrl = $google2fa->getQRCodeUrl(
    'pragmarx',
    'google2fa@pragmarx.com',
    $google2fa->generateSecretKey()
);

$writer = new Writer(
    new ImageRenderer(
        new RendererStyle(400),
        new ImagickImageBackEnd()
    )
);

$qrcode_image = base64_encode($writer->writeString($g2faUrl));
//And show it as an image:

<img src="data:image/png;base64, <?php echo $qrcode_image; ?> "/>
```
M-FunctionでのMATLAB関数の使い方とmxArrayエラーの回避方法

# はじめに
この記事では、SimulinkのM-Functionを使用して自作関数を作るときに最初に躓いたところを書きました。
なぜこうなるのかまではまだ理解できていないので、こうすれば動いたという内容です。

主に以下の２点です
・標準のMATLAB関数が「サポートされていません」と出る
　解決策：coder.extrinsic('関数名')で宣言する
・「mxArrayにできません」のエラーがでる
　解決策：変数の初期化処理を入れる
　　　　　構造体ならgetfield, setfield関数を使う

例として、Simulink上で現在時刻を出力する処理を実装する流れで説明していきます。

#1.MATLAB動作とSimulinkへの実装失敗
まず、MATLABでは現在時刻を出力する標準関数があります。
now関数で現在時刻の数値データを取得でき、
その数値をdatestr関数にいれると見慣れた時刻表示の文字列にできます。
![now.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406714/17cd847d-004f-714e-1825-fdef37c95bf0.png)

そこでSimulinkにてシンプルな実装をしてみます
・NowTimeという名前のM-Functionを作成。入力無し、出力１つ(y)。
・M-Functionの内容は、y = now;　のみ。
・出力にDisplayを接続
![now2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406714/ad5ce643-e0ba-829e-a2d0-dbc09bab37f8.png)


感覚的には、現在時刻の数値データがDisplayに表示されるはずです。

#2.標準のMATLAB関数が「サポートされていません」
ところが実際に実行すると、「'now'はコード生成でサポートされていません」というエラーが出てきます。
![コード生成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406714/b86513eb-4e07-5ded-24f1-59df61bb6e23.png)
MATLAB標準関数なのにサポートされてないの？と言いたくなりますが、この関数を使うという宣言文のようなものを入れることで使用できます。具体的には
coder.extrinsic(string);
を入れます。
この宣言で、stringで使いたい関数名を入れることで、そのM-Function内でMATLAB関数が使用できます。
例：coder.extrinsic('now');
![coder追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406714/0ce3d1e1-c161-59e5-4681-d230e7be9551.png)

#3.mxArrayのエラー
ただし、これで実行すると、今度は「mxArrayにはできません」というエラーが出てきます。
![mxArrayエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406714/6f19d61c-057a-1513-fc4f-457992456a12.png)

簡単に言えば、実行時の時点で、出力yを何の型（short型かfroat型か）で作ればいいのか、どのくらいの大きさを確保すればいいのか分からないという状態みたいです。
now関数は戻り値が数値型ですが、外部関数のため実行時には分からないのです。

これを解決するため、now関数の前に、yは小数点ありの数値型であると宣言します。
具体的には、「y=0.1;」を先に入れることで、実行時に数値データであると確定させます。
![時刻出力成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406714/da226f1a-4388-9318-e603-7c106b493194.png)
以上の修正をして実行すると、無事Displayに現在時刻の数値データが表示されました。

ちなみにこの表示された数値をdatestr関数に入れると日時が表示されるので、数値が正しく出力されていることが分かります。
![時刻確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406714/e97a72ea-63b7-6be8-c5a7-361eaf519755.png)


#補足　配列が戻り値の場合
mxArrayのエラーは配列も同様であり、例えば戻り値が[3 4 1]みたいな1×3の配列が来る関数を使用したときに、戻り値を変数aに入れてa(3)を取り出そうとするとエラーになります。
これも実行時にはaが1×3の配列か不明なので、その添え字が正しいか判断付かないためです。
回避するためには、a=zeros(1,3);や a=[0 0 0];というように、配列の大きさを事前に書いておく必要があります。逆に言うと、配列数が変わる関数の場合、次の構造体と同様の対応が必要になります。

#補足　構造体が戻り値の場合
now関数の戻り値は数値でしたので変数の型を事前に定義できましたが、MATLAB関数には戻り値が構造体のものも多くあります。当然ながら構造体を一つ一つ記述するのは大変な手間ですし、多数なデータが入っているので型自体分からないというのも多くあります。
figure関数の戻り値とかまさにそうですね。
例えばax=figure;と書いて図を出し、x軸の目盛りを変更しようとすると、
ax.XTick = [2 4 6 8 10];
と書きたくなりますが、axの下にXTickがあるか実行時は分からないのでエラーになります。
そこで使うのが、「getfield」「setfield」です。
これは構造体の値を操作する関数です。
詳細はMATLABのヘルプに任せますが、先ほどの例で行くと、
setfield(ax, 'XTick', [2 4 6 8 10]);
と書くと、やりたかったことが実現できます。
また、データを取得したい場合は、例えば
str = getfield(ax, 'Title', 'String');
と書くことで、
str = ax.Title.String;
と同じく処理になり、図のタイトルの文字列がstrに入ります。

#おわりに
以上で現在時刻のデータが無事データが出力できました。
ただ、このままでは人の目では読めませんので、見やすくする方法を別の記事で記載しようと思います。

また、M-Functionではなく、S-Function(MATLAB System)だとこの問題も起きないようですが、使い方が変わってきます。そちらも出来次第、記事にしようと思います。
推しの名前でgitを叩きたいッ！

## この記事は何？

コマンドラインからgitを叩く時でさえ推しキャラを感じていたい **~~オタクなエンジニア~~ 末期患者**向けの記事。
**コマンドにエイリアス張ってるだけの話なので多くの人にはまったく役に立たん！**

## 環境

macOS Mojave 10.14.4

## 任意の文字列でgitを呼び出すには？

ざっくり以下の手順を踏みます。

1. ホームディレクトリに移動
2. 「.bashrc」ファイルを作成(あるいは編集)
3. 「.bash_profile」を編集
4. ターミナルを開き直す
5. ターミナルで推しを呼ぶ

## 1.ホームディレクトリへ移動

おもむろにターミナルをひらけばホームディレクトリだと思いますが、とりあえず以下の呪文を打ち込めばホームディレクトリに戻れます。

```terminal:ホームディレクトリに戻る
$ cd ~
```

## 2.「.bashrc」ファイルを作成(あるいは編集)

「.bashrc」ファイルを作っていきましょう。
ファイルの有無にかかわらず、エディタ(vim)で編集するコマンドを叩きます。

```terminal:ホームディレクトリに戻る
$ vim .bashrc
```

突然今までのコマンドが消えてエディタの画面になりますが、以下の手順を踏めば大丈夫。
※ 何をやっているのか興味がある方は自分で調べてみてね！

1. 「I」キーを押してInsertモードに入る(最下部に「--INSERT--」と表示されればOK)
2. 「alias %推しの名前%='git'」と打ち込む
3. 「esc」キーを押して、Insertモードを抜ける(最下部の「--INSERT--」が消えればOK)
4. 「:」キー、「w」キー、「q」キーを**順に**入力し、「Enter」キーを叩く。

上記設定を行ったぼくの「.bashrc」はこんな感じ。

<img width="649" alt="スクリーンショット 2019-05-03 18.18.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304374/09c0af2b-1ec1-00c6-51dd-b989b8b63c7d.png">

## 3. 「.bash_profile」を編集

次に「.bash_profile」を編集していきましょう。
前述した「.bashrc」を見るように記載してあげるだけですね。

```terminal:ホームディレクトリに戻る
$ vim .bash_profile
```

先ほどと同じように以下の手順を踏みましょう。

1. 「I」キーを押してInsertモードに入る
2. 最下部に「source ~/.bashrc」と打ち込む
3. 「esc」キーを押して、Insertモードを抜ける
4. 「:」キー、「w」キー、「q」キーを**順に**入力し、「Enter」キーを叩く。

上記設定を行ったぼくの「.bash_profile」はこんな感じ。

<img width="649" alt="スクリーンショット 2019-05-03 18.21.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304374/11f9da6c-f3e0-f245-ff0a-f01e6ded83b0.png">

## 4. ターミナルを開き直す

設定は完了していますが、設定内容が読み込まれていません。
ということで、ターミナルを開き直しましょう。
別タブを開いてもいいですよ。

## 5. ターミナルで推しを呼ぶ

さぁさぁいよいよ推しを呼んでみましょう。

```
$ %推しの名前%
```

<img width="516" alt="スクリーンショット 2019-05-03 17.49.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304374/f3c6e560-dd27-3b82-cdb3-0ea765b0026f.png">

これでgit管理を推しに任せることができます。
推しがaddしてくれたりstatusを教えてくれたりcommitしてくれたりpushしてくれたり、まるで秘書のようですね。
開発は推しと二人三脚、これはもう止まりませんね、いざ次のプロジェクトへ！！

<img width="515" alt="スクリーンショット 2019-05-03 17.50.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304374/80ad5c3c-4741-6ca5-6038-87ecbc44474c.png">


~~艦これの比叡ちゃんをすこってくれたのむ~~
Github + Rails + Heroku Buttonの作り方

先日作った[Wikiアプリ](https://github.com/fukmaru/wiki)をHerokuボタンを使ったHerokuデプロイができるようにしてみます。

Wikiシステムの作り方は、[こちら](https://qiita.com/fukmaru/items/625845471df2110cc718)！

[git commit log](https://github.com/fukmaru/wiki/commit/79373d338e8d3c68e0919e74df7f41b4f671f232)

# Heroku Button とは？

> Heroku Button を使用すると、アプリケーションを Heroku プラットフォームで開発して運用するまでの期間を簡単に短縮できます。Heroku Button とは、コードのデプロイ方法や設定方法を定義するごく小さなファイルで拡張された、ソースコードリポジトリへのポインターです。Heroku Button をクリックすると、アプリケーションのデプロイを開始したり、アプリケーションの設定オプションを表示したり、実行中のアプリケーションを Web に配信したりできます。

<https://jp.heroku.com/elements/buttons>

# 実装してみる

**REAMEにボタンを設置します。**

```bash
$ touch ./README.md
```

```md:./README.md
+ [![Heroku Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/fukmaru/wiki)
```

`template=[GithubのURL]` をGETパラメータとして指定します。

** app.json を作って、テンプレートを作ります。**

<https://devcenter.heroku.com/articles/heroku-button>

```bash
$ touch ./app.json
```

```json:./
{
  "name": "wiki",
  "description": "Rails Wiki System",
  "website": "https://github.com/fukmaru/wiki",
  "repository": "https://github.com/fukmaru/wiki",
  "logo": "https://github.com/fukmaru/wiki/blob/master/public/icon_512x512.png",
  "success_url": "/",
  "keywords": [
    "wiki",
    "tool"],
  "addons": [
    "heroku-postgresql"
  ]
}
```

[git commit log](https://github.com/fukmaru/wiki/commit/79373d338e8d3c68e0919e74df7f41b4f671f232)

# Wikiサービス作りました

(小さく告知させてください:ear:)
簡単なWiki検索を、社内コミュニケーションチャネルから検索できるツールで、「[Poii.io](https://www.poii.io)」と言います。
TweepyでTwitterのタイムラインを取得する

#はじめに
Tweepyを用いたTwitterへの投稿は[以前の記事](https://qiita.com/pontyo4/items/da8ba576c6281d67c0c7)で紹介しました. 今回は自分のタイムラインに表示されている投稿を取得していきたいと思います. 

#タイムラインの取得
home_timeline()を用いることでタイムラインの取得ができるようです. 取得できる投稿はデフォルトで20件となっています. 
以下のコードで最新タイムライン20件の取得ができます. 

```python
import tweepy

# 先ほど取得した各種キーを代入する
CK="Consumer Key"
CS="Consumer Secret"
AT="Access Token"
AS="Access Token Secret"

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

api = tweepy.API(auth)

#1ツイートずつループ
for status in api.home_timeline():
    #見映えのため区切る
    print('-------------------------------------------')
    #ユーザ名表示
    print('name:' + status.user.name)
    #内容表示
    print(status.text)
```
home_timeline()の引数のcountによって, 取得するツイートの件数を設定できます. 下記コードはcountを5に設定しています. 

```python
import tweepy

# 先ほど取得した各種キーを代入する
CK="Consumer Key"
CS="Consumer Secret"
AT="Access Token"
AS="Access Token Secret"

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

api = tweepy.API(auth)

#1ツイートずつループ
for status in api.home_timeline(count=5):
    #見映えのため区切る
    print('-------------------------------------------')
    #ユーザ名表示
    print('name:' + status.user.name)
    #内容表示
    print(status.text)
```
#特定のユーザーのツイートを取得
user_timeline()を使うことで特定のユーザーのツイートを取得できます. 
idの部分にツイートを取得したいユーザーのidを入れるとオッケーです. 
デフォルトで20件のツイートを取得するので, 先ほどと同じようにcountの値を指定することで, 取得件数を絞ることができます. 

```python
import tweepy

# 先ほど取得した各種キーを代入する
CK="Consumer Key"
CS="Consumer Secret"
AT="Access Token"
AS="Access Token Secret"

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

api = tweepy.API(auth)

#1ツイートずつループ
for status in api.user_timeline(id=''):
    #見映えのため区切る
    print('-------------------------------------------')
    #ユーザ名表示
    print('name:' + status.user.name)
    #内容表示
    print(status.text)
```
#関連記事
[TweepyでTwitterに投稿する](https://qiita.com/pontyo4/items/da8ba576c6281d67c0c7)
[TweepyでTwitterの検索, いいね, リツイート](https://qiita.com/pontyo4/items/4ef6c9cb8e15a01a3129)

# 参考サイト
[Tweepyを使って自分のタイムラインを取得する](http://loghouse.hatenablog.jp/entry/2016/05/08/011932)
[【Python】Tweepyを使って特定のユーザーの投稿を取得](https://free-free.site/post-310/)
C# で名前空間接頭辞入りの XML を作る

# C# で名前空間接頭辞入りの XML を作る

この XML を作る.

```xml
<Root xmlns="http://example.com/foo">
  <Item1></Item1>
  <Item2 xmlns:i="http://example.com/bar">
    <Item3 />
    <i:Item4 />
  </Item2>
</Root>
```

その場合のコードは以下のようになる.

```csharp
var ns1 = XNamespace.Get("http://example.com/foo");
var ns2 = XNamespace.Get("http://example.com/bar");
var xml =
    new XElement(ns1 + "Root",
        new XElement(ns1 + "Item1", ""),
        new XElement(ns1 + "Item2", new XAttribute(XNamespace.Xmlns + "i", ns2),
            new XElement(ns1 + "Item3"),
            new XElement(ns2 + "Item4")));
Console.WriteLine(xml.ToString());
```

大きな XML を吐こうと思うと便利なんだろうけど、小さい XML を吐く分にはまだるっこしい感.
deiviseでインストールしたviewを編集するを試してみた。

#deviseで作成されたviewを編集する。


今回はdiviseのgemをダウンロードし、rails g devise:viewsで生成された
ファイルのビューを編集できるのかなと思い、色々調べたので、備忘録として残しておきます。

参考サイト
https://github.com/plataformatec/devise#configuring-views

一応上記参考サイトを参考にして変更しましたが、、、、
見つけるまでに時間がかかってしまいました。

変更した内容は下記です。

app/config/initializers/devise.rb

```ruby

config.scoped_views = false
```

上記を

```ruby
config.scoped_views = true
```
に変更しました。

そこからrails g devise:viewsで生成されたファイルを自分の好きなように編集し、
編集が完了しました。

ルーティングやコントローラーもカスタマイズしていく事になると思いますので、
また次回に書いて見たいと思います。


訂正や追加あればお願い致します！！！
[Ubuntu 19.04]ウィンドウを自動で最大化したりモニターを移動する

wmctrlをインストール

```bash
sudo apt install wmctrl
```


# モニター間の移動
![Screencast from 2019年05月04日 00時02分40秒 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/1c2b13b6-69c2-5dd0-4e8f-e7fdf65dd601.gif)
[YouTube](https://youtu.be/8F1qQeZsG4E)

```bash
wmctrl -r Chrome -e 0,1920,-1,-1,-1
```
1920(左のモニターの横幅)はX座標。
Chromeはウィンドウのタイトルの一部を指定。


```bash
# ウィンドウのタイトル一覧
wmctrl -l
0x03001c9c  0 desktop disco@desktop: ~/Downloads
0x0240003a  0 desktop wmctrl(1) - Linux man page - Google Chrome
0x0240005d  0 desktop 「[Ubuntu 19.04]ウィンドウを自動で最大化したりモニターを移動する」を編集 - Qiita - Google Chrome
```

# ウィンドウの最大化

![Screencast from 2019年05月04日 00時03分03秒.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/4cde9cd1-cf60-caff-374b-8d0b3fd5b703.gif)
[YouTube](https://youtu.be/bPnik3bbzZo)

```bash
wmctrl -r Chrome -b add,maximized_vert,maximized_horz
```

# ウィンドウの最小化
```bash
wmctrl -r Chrome -b remove,maximized_vert,maximized_horz
```

## 引用
> Move Active Window to Different Screen (dual head)
> https://ubuntuforums.org/archive/index.php/t-1045417.html

> How to close, minimize, and maximize a specified window from Terminal?
> https://askubuntu.com/questions/703628/how-to-close-minimize-and-maximize-a-specified-window-from-terminal
macOS 10.14 Mojave 以降で pac ファイルを使って proxy の設定を行いたいけど出来なかった話

## 超要約

- mac の proxy はローカルの pac ファイルを読み込めないようになったぽい
- あきらめてchromeの拡張等を使うのがいい：[Chrome ウェブストア Proxy SwitchyOmega](https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif/related)

## 以下簡単に調べた内容

macOS 10.14 以前までは [Macでproxy.pacを設定したいとき](https://qiita.com/siukaido/items/340f46e9bbc86887d218) を参考にローカルに pac ファイルを使ってproxyが行えました。
実際私も業務で使っていました。
ただ、最近突然使えなくなりました。

調べたところ、

https://developer.apple.com/documentation/macos_release_notes/macos_mojave_10_14_release_notes?language=objc

```
Deprecations
The ftp:// and file:// URL schemes for Proxy Automatic Configuration (PAC) are deprecated. HTTP and HTTPS are the only supported URL schemes for PAC. This affects all PAC configurations including, but not limited to, configurations set via Settings, System Preferences, profiles, and NSURLSession APIs such as connectionProxyDictionary, and CFNetworkExecuteProxyAutoConfigurationURL. (37811761)
```

との記載がありました。
どうやらローカルのpacファイルを指定して使うことが出来ないみたいです……
これはpacに限らずmacのシステム用の設定ファイル等でも同様のようです。

今はchromeの拡張機能を使ってproxyを使っています。

[Chrome ウェブストア Proxy SwitchyOmega](https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif/related)

設定方法とかはここを参考にしました。

[Chromeで特定サイトのみプロキシ経由でアクセスする拡張機能Proxy SwitchyOmega](https://qiita.com/zakisanf05/items/acaf0b27bdf614a8cf44)

この拡張機能はpacファイルも使えるので、以前使っていたpacファイルの中身をコピペして設定しています。
そう頻繁に切り替える内容ではないのでこれで自分は問題なく使えてます。
gitの簡単な使い方(メモ)

#はじめに
　git初心者です。
　使いたいときに忘れるので、メモしていこうと思います。

#前提
　Gitがすでに入っている。

#Gitを触る
なんかよくわからないけど、gitのコミットやらプッシュやらするディレクトリを作る。
※作業スペースとこのディレクトリは分けた方がいいらしい。ミスったら前のやつが上書きされるみたい。

GitHubでリポジトリを作る。
　create repositoryで作れる

```
mkdir git_space
cd git_space
```
gitの初期化

```
git init
```
ファイルをインデックスに追加する。らしい。

```
git add helloworld.js
```

インデックスに追加されたものをローカルレポジトリにコミットする。
※メッセージを入力しないと怒られる。しなくてもいいかもしれないけど、した方がいい。
**※ファイル内にアクセストークンみたいなのが含まれる場合は事前に消しておくこと！**
筆者はやらかして、修正したけど、履歴がgit上に残って公開されてしまった。

```
git commit -m "first commit"
```
リモートリポジトリを指定する。

```
git remote add origin https: //github.com/※※※
```
ローカルレポジトリの内容をリモートリポジトリに反映させる。

```
git push origin master
```

#ファイルの更新
とりあえず以下のコマンドを放つ

```
git add helloworld.js
git commit -m "fixed"
```
すると、
何行が修正されたみたいなのが表示される
そして、

```
git push origin master
```

ファイルの修正もできた！
【備忘録】PowerAppsで親ドロップダウンの選択によって子ドロップダウンをフィルターする

「[Power Appsで画像を撮影して投稿するアプリに、ドロップダウンを選択して投稿できるようにする](https://qiita.com/hisssa0102/items/26e1e7a50a015ed05aa2)」にて、ドロップダウンを選択して投稿できるようにした。

ドロップダウンの選択肢が数が少ないうちはまだいいけど、10を超えてきてドロップダウン一つだと面倒。100を超えてきたら目も当てられない。

というわけで、ドロップダウンを2つ作り、親カテゴリを選んだら、子カテゴリーがフィルターされるようにしてみたので、備忘録でまとめてみた。


#SharePointでマスタを作る

カテゴリー列に親。タイトル列にサブカテゴリーに相当するものを入れてみた。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/953f4339-a8ac-2ed4-db8f-dbe164cc3626.png" width=50%>






#親になるドロップダウンに重複を削除して表示する設定(Distinct)

挿入→ドロップダウンから配置して、データソースに先ほど作成したカスタムリストと、列を指定。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/4b87b319-c965-0dda-9a64-b4ccdaf9fd5a.png" width=50%>

しかし、このままでは親ドロップダウンは重複も全部表示されちゃう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/dd919b79-df2c-e1b1-6c4c-46b4e71fd585.png" width=25%>

重複を削除したいので、処理を入れる。

||データItemsの値|Valueの値|
|:---|:---|:---|
|before|categoryMaster|category|
|after|Distinct(categoryMaster,category)|Result|
|書式|Distinct(ソース名,対象列)|自動でResultにかわる|

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/de96b178-cd51-26d0-6432-82803079ccc0.png" width=50%>
ドロップダウンも重複が消えてる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/e67da692-0a07-2613-1c22-111e77148cf9.png" width=25%>




#子になるドロップダウンに親ドロップダウンでフィルターする(Filter)

挿入→ドロップダウンから配置して、データソースに先ほど作成したカスタムリストと、列をそれぞれ指定。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/df9aaade-6bac-e82f-ce47-42dcbe1a7acc.png" width=50%>
しかし、このままでは子ドロップダウンもフィルターされてない。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/8e82b835-03ca-61ec-b668-765b63167284.png" width=25%>

フィルターしたいので、処理を入れる。
ドロップダウンの[依存先]を選択すると、親コントロールを聞いてくるので、親にするドロップダウンを選択。

子でフィルター条件にする列を指定する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/b75c35fc-046c-ba14-9fe0-9004cc02a37e.png" width=50%>

親ドロップダウンで、やさいを選ぶと、ドロップダウンは絞られた。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/85ce5eb3-ae5b-92ec-1a03-20bf08d859c3.png" width=25%>

できた！

#課題

だいぶアプリっぽくなってきた。関数は使ってるけど、コードは何も書いてない。

Flowに渡して、SharePointに書き込ませたい。しかし、Flowの引数にはそのままドロップダウンではできてなくて、いっかいラベルにして変数にしてた。しかし、Distinctかけたドロップダウンならラベル経由させなくても、[Dropdown1.Selected.Result]などで変数として使える。いい方法ありそう。
Chromeのコンソールでログをクリアする方法

## Chromeのコンソールでログをクリアする方法
便利ですので、ぜひ覚えておきましょう。

方法１
commnad + k を押す。 これは他のターミナルアプリと同じですね。
方法2
`clear();`を呼び出す。ちょっと面倒ですね。方法１の方が良いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
CUDA 10とcuDNNをUbuntu 18.04LTSにインストールする

作業概要は、NVIDIAのパッケージレポジトリの追加、NVIDIAのドライバのインストール、CUDA 10.0とcuDNNのインストール、TensorRTのインストールという流れ。

### NVIDIAのパッケージレポジトリを追加
```text:terminal
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt-get update
```

### NVIDIAのドライバーをインストールして再起動する
先にNVIDIAのパッケージレポジトリを追加しておくと、最新のドライバがインストールできる。

```text:terminal
ubuntu-drivers devices  # インストールされているデバイスと利用可能なドライバの確認。
sudo ubuntu-drivers autoinstall
sudo reboot
```
再起動後`nvidia-smi`でnvidiaのドライバがインストールされているか確認。

### CUDA 10.0 と cuDNNのインストール
```text:terminal
sudo apt-get install -y --no-install-recommends cuda-10-0 libcudnn7 libcudnn7-dev
```
### TensorRTのインストール
```text:terminal
sudo apt-get install nvinfer-runtime-trt-repo-ubuntu1804-5.0.2-ga-cuda10.0
sudo apt-get update
sudo apt-get install -y --no-install-recommends libnvinfer-dev
```


#### 参考
https://www.tensorflow.org/install/gpu
https://linuxconfig.org/how-to-install-the-nvidia-drivers-on-ubuntu-18-04-bionic-beaver-linux
[CUDA 8.0とcuDNN 6をUbuntu 16.04LTSにインストールする](https://qiita.com/JeJeNeNo/items/05e148a325192004e2cd)
[CUDA 9.1とcuDNN 7.1をUbuntu 16.04LTSにインストールする](https://qiita.com/JeJeNeNo/items/a56be3be69dc88e6dfa4)
Day002 webエンジニアへの道 - Ruby on Railsの基礎を学ぶ -

こんにちは。
webエンジニアを目指すtomoです。

エンジニアの勉強をしている日々の学びをQiitaに記録しています。

私自身の頭の整理と今後迷った時のリファレンスも兼ねて書き連ねていきますが、同じようにエンジニア転職を考えている方の参考にもなればと考えています。
また、「ここ間違ってる！こっちが正しい！」といったご指摘もあれば頂けると嬉しいです🙏

---

前回は仮想マシンの環境設定を行いました。

しかし、実際にRuby on railsを使い始めたところ必要な関連ソフトが足りずエラーが連発しました。

必要な関連ソフトは何かなどちゃんと把握した上で進めたいのですが、それでは時間がいくらあっても足りなさそうなので、関連ソフトの理解は後にしてまずはdot-installのレッスン通りCentOS6を用いた環境で学習を進めることにします。

また、ひとつひとつのコードを全て書き写しているとキリがないので、学習を進める中で調べたことやエラー対応したことに絞って記述していきます。

##railsサーバの起動

```:commandline
rails server -b [ipアドレス] -d
```

-b オプションでバインドするipアドレスを指定。
-d オプションでデーモンとしてサーバを起動。
デーモンとはメモリ上に常駐し、いつでも処理できるよう待機するプログラムのこと。

[参考]
[railsコマンド(rails)](http://railsdoc.com/rails)
[デーモン (daemon)](https://wa3.i-3-i.info/word11000.html)

rails(5.1.4)以降ではリンク先が表示されないため、ブラウザに直接`http://[ipアドレス]:3000`と入力して動作確認する。

##scaffoldで作成したファイルを削除する

```:commandline
rails destroy scaffold [name]
```

[name]は削除したいscaffoldの名前。
`rails g scaffold [name]`で要素を間違えて指定した時に有用

[参考]
[scaffoldで作成したファイルを全削除](https://tamamemo.hatenablog.com/entry/20120113/1326435969)

##Modelの作成

```commandline
rails g model Post title:string body:text
```

Post →　Modelは個々のデータ構造を定義するので単数形で指定する。
string →　1行テキスト
text →　複数行のテキスト

##追加した変更が反映されない時の対応

Transmit5を利用して仮想マシンとのファイル転送を行っていたが、エディタで保存したはずの変更がブラウザに反映されなかった。
↓
原因：Transmitとの接続が途中で切れていたため。(Transmit上で「サーバから切断」を行うと、再接続しても既に開いているエディタのファイルとのリンクが切れてしまう）

tips：ブラウザまたはコンソール上で見える簡単な変更（htmlの文章やplaceholderなど）を加えてみると、どこに不具合があるか特定しやすい。目で見て確認しづらい処理の不具合をチェックする場合は処理の内容を簡素化（文字列の出力など）すると特定しやすい。

##★メモ

######*後日調べること & 気づいたこと

- kill -9 [プロセス番号]　→　killコマンドで-9以外の場合どうなる？
- Convention over Configuration　→　どのファイルがどこのディレクトリにあるか、指定は単数形か複数形かといった細かいルールがrailsには設定されている。ということらしいので調べる。
- Active Recordとは何か？
- MVCのフローを理解するため整理して図に書き出す。
- 開発環境構築が始めの1歩だと思っていたが、「どのパッケージをどのバージョンで入れるか」というのは難易度が高いので詳しくは後で学んだ方が良い...

##さいごに

2日目にして完全に自分用の学習メモと化してきました...

続けていった後で、「うわ、このとき自分はこんな簡単なことで悩んでたのかよ...」ってなれるよう精進します。

---

twitterもやっているので、宜しければフォローお願いします！
[@tomo_tech_](https://twitter.com/tomo_tech_)
スタックマシンを勉強するための便利なコマンド dc

# 経緯
スタックマシンを勉強する機会があった．
そのときに，スタックマシンの命令を使った実例があったが，実際に手を動かしてみたくなった．
そのためのコマンドを紹介したい．

それは，**「dc」** コマンドである．

# dc コマンドとは
dc は，逆ポーランド記法の卓上計算機であり，定義やマクロが使えるのがすごい（今回は紹介の対象ではなない）．
逆ポーランド記法計算機は，数（やマクロ）をスタックに保存するため，スタックマシンの勉強には最適である．

## 最低限のコマンド
正規表現で記述してある．

|コマンド|効果                         |
|:-----:|:--------------------------:|
|q      |終了                         |
|p      |スタックの最上部を表示          |
|n      |スタックの最上部を取り出して，表示|
|c      |スタックのクリア               |
|[0-9]* |値をスタックに追加             |
|[+-*/] |演算子                       |

# 実例
さて，計算を実際にやってみよう．

## 2*3+4*5
この計算での，スタックマシンの命令をいかに示す．

```:2*3+4*5のスタックマシン命令
PUSH 2 # 2
PUSH 3 # 2 3
MUL    # 6
PUSH 4 # 6 4
PUSH 5 # 6 4 5
MUL    # 6 20
ADD    # 26
```

この命令の結果，26という値がスタックに入っている．

```bash:dcコマンド
$ dc # dcインタプリタ起動
2 # スタックに2を追加
3 # スタックに3を追加
* # スタックから2つ(2と3)を取り出し乗算，結果(6)をスタックに追加
4 # スタックに4を追加
5 # スタックに5を追加
* # スタックから2つ(4と5)を取り出し乗算，結果(20)をスタックに追加
+ # スタックから2つ(6と20)を取り出し加算，結果(26)をスタックに追加
p # スタックの最上部にある値を表示
26 # 表示 (スタックには，残っている)
```
スタックマシンの命令が1対1で対応しているのが，分かる．

```
2 # PUSH 2
3 # PUSH 3 
* # MUL
4 # PUSH 4
5 # PUSH 5
* # MUL
+ # ADD
```

また，dcコマンドは連続して記述もできる．

```
$ dc
2 3 * 4 5 * + p
26
```

もちろん途中で確認のために取り出すことも可能．
 
```
2 3 4
p
4 # 表示
p
4 # 表示
n # スタックから取り出す
4 # 表示
p
3 # 表示
c # clear
p 
dc: stack empty
```

# さいごに
このように比較的簡単にスタックマシンの仕組みを理解することができるだろう．
まずは，手を動かすことが大事です．やってみよう！
ただ，dcコマンドは奥が深く，マクロやレジスタを駆使し，階乗の計算なんかもできる．
それはまた次の機会にでもやってみてください．

# スタックマシンを勉強する経緯
1. コンパイラを勉強する
2. 構文解析で，トークン列から抽象構文木を作る
3. 抽象構文木からアセンブリをそのまま作れない
3. スタックマシンが出てくる
Leetcode #98: Validate Binary Search Tree


```swift
func isValidBST(_ root: TreeNode?) -> Bool {
    return helper(root, Int.min, Int.max)
}
   
func helper(_ node: TreeNode?, _ lower: Int, _ upper: Int) -> Bool {
    guard let node = node else { 
        return true 
    }
    if node.val > lower && node.val < upper {
        return recurse(node.left, lower, node.val) && recurse(node.right, node.val, upper)
    }
    return false
}
```
PushKitでVoIPの通知を受ける

今までプッシュ通知を受けるには
`didRegisterForRemoteNotificationsWithDeviceToken`
でdeviceTokenを受け取ってきましたが、PushKitをつかった通知を受ける場合は、まず

```
- (void)voipRegistration {
    PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
    pushRegistry.delegate = self;
    pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
}
```

とやっておき、PushKitのdelegateを受けるようにします。

```
- (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(NSString *)type;
-(void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type;
-(void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type;
```

これら3つです。
tokenの登録は

`didUpdatePushCredentials`で行います。
`[credentials.token description]`

として取り出せるので今までと同じようにNSStringとしてPushサーバーのDBなどに保存しておけば良いです。あとはそのtokenに対して、Push通知をしてあげれば、`didReceiveIncomingPushWithPayload`が通知のダイアログなどなしにキャッチできますので、ここでVoIPの着信通知などの処理を行えばよいです。
【Unity】簡単かもしれないTextだけで選択メニュー

#はじめに
Textだけで選択メニュー的なのを作ってみました。デザインをこったりすることはできませんが、簡単なUI作るのになら使えそうです。

#コード

```cs:Sentaku_Text.cs
    public int SentakuID = 0;
    int cnt = 0;

    Text _text;
    
    void Start(){
        _text = GetComponent<Text>();
    }

    void Update(){
        float YAxis = Input.GetAxisRaw("Vertical");
        
        //長押しで連続入力
        if (YAxis != 0) {
            cnt++;
            if (cnt == 1) SentakuID -= (int)YAxis;
            else if (cnt >= 20) SentakuID -= (int)YAxis;
        } else if (YAxis == 0) cnt = 0;

        //一番端にいったら反転
        if (SentakuID > 2) SentakuID = 0;
        if (SentakuID < 0) SentakuID = 2;

        Sentaku();
    }

    void Sentaku() {
        switch (SentakuID) {
            case 0:
                _text.text = ">0だよ<" + "\n" + "1だよ" + "\n" + "2だよ";
                break;

            case 1:
                _text.text = "0だよ" + "\n" + ">1だよ<" + "\n" + "2だよ";
                break;

            case 2:
                _text.text = "0だよ" + "\n" + "1だよ" + "\n" + ">2だよ<";
                break;

            default:
                break;
        }
    }
```
条件分岐の処理で該当する部分を"＞＜"で挟むことで、選ばれてる感を出してます。
ちょっと説明しづらいので動作の様子は以下の通りです。
![Sentaku_Text.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367795/1c7bfb79-95a9-a651-f786-1906b929ae7f.gif)

今回は処理で書いてないですが、非表示にしたいときは空文字をいれれば大丈夫です。

#終わり
問題は選択肢が増えてきたときに、文字の入力がかなり面倒なことになりそうなところです。
でもちょろっと使う分には結構楽だと思います。選択肢が多いときは別の方法でやったがいい気がします。
Pythonコマンドラインアプリケーションのサンプルコード

## 目的
Pythonでコマンドラインインタフェースのアプリケーション、ツール類を作ったりする場合、すべてスクラッチでプログラムを書いていくのは面倒なものです。
開発現場でさっとコピーして適用しやすいように簡単なサンプルコードを作成しました。

## サンプルコードの実行
python2.7で実行して確認済み。
`$ python cli.py --help`

## サンプルコードの実行結果

```
usage: cli.py [-h] [--id ID] [--amount AMOUNT] {create,show,update,delete}

コマンドラインインターフェースのサンプルコード。

positional arguments:
  {create,show,update,delete}
                        create: データを作成する | show:
                        データを確認する | update:
                        データを更新する | delete:
                        データを削除する

optional arguments:
  -h, --help            show this help message and exit
  --id ID               ID指定 $ python cli.py show --id 1
  --amount AMOUNT       数量を指定する $ python cli.py create --id 1
                        --amount 100.0
```

## サンプルコード
本体は[Github](https://github.com/MKJP/PythonSamples/blob/master/cli.py)に設置してあります。これを雛形にコマンドラインアプリケーションを作成すると便利です。特徴としては、具体的なビジネスロジックの実装をクラス定義して、コマンドライン引数の解析処理と分割管理している点です。

```python:cli.py
# -*- coding: UTF-8 -*-
"""
Command Line Interface Sample.

"""

import argparse
from pprint import pprint 

class Command(object):
	"""
	"""
	def __init__(self, args):
		# Get argument parse options
		self.args = args

	def create(self):
		id = self.args.id
		amount = self.args.amount
		if id == 0:
			raise Exception("--id is required.")
		if amount == 0:
			raise Exception("--amount is required.")
		txt = 'create(id={}, amount={})'.format(id, amount)
		print(txt)

	def show(self):
		id = self.args.id
		if id == 0:
			raise Exception("--id is required.")
		txt = 'show(id={})'.format(id)
		print(txt)


	def update(self):
		id = self.args.id
		amount = self.args.amount
		if id == 0:
			raise Exception("--id is required.")
		if amount == 0:
			raise Exception("--amount is required.")
		txt = 'update(id={}, amount={})'.format(id, amount)
		print(txt)

	def delete(self):
		id = self.args.id
		if id == 0:
			raise Exception("--id is required.")
		txt = 'delete(id={})'.format(id)
		print(txt)
		
def run(args):
	# クラスメソッドをコール
	try:
		c = Command(args)
		getattr(c, args.command)()
	except Exception as e:
		print(e)

if __name__ == '__main__':
	parser = argparse.ArgumentParser(description='コマンドラインインターフェースのサンプルコード。')
	# 主要コマンド
	command_list = ['create', 'show', 'update', 'delete']
	command_help = 'create: データを作成する'
	command_help += ' | show: データを確認する'
	command_help += ' | update: データを更新する'
	command_help += ' | delete: データを削除する'
	parser.add_argument('command', type=str, choices=command_list, help=command_help)

	# コマンドオプション指定
	parser.add_argument('--id', type=int, help='ID指定 $ python cli.py show --id 1', default=0)
	parser.add_argument('--amount', type=float, help='数量を指定する $ python cli.py create --id 1 --amount 100.0', default=0)
	
	args = parser.parse_args()
	
	# Get start
	run(args)
	
```

## 参考資料
- [Python2.7 - 標準ライブラリ - argparse](https://docs.python.org/ja/2.7/library/argparse.html#module-argparse)
- [Python2.7 - HOWTO - argparse](https://docs.python.org/ja/2.7/howto/argparse.html)
【Apache】困った、困ったApacheの再起動に失敗したらときと、ゾンビちゃんを一網打尽にする方法

## 概要

みなさんはこんな経験ないですか？

```
# /etc/init.d/httpd restart
httpd を停止中: [失敗]
httpd を起動中: httpd: Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xx.xx for ServerName
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
[失敗]
```


**apache再起動したいけど、できないざますー！！！**


そんな時はこのコマンドを叩いてみましょう
httpdのプロセスが ざわついていませんか？ ざわざわっ

```
$ ps auxw | grep httpd
user    24484  0.0  0.3 285604 13060 ?        S    Jan01   0:08 /usr/sbin/httpd
user    24485  0.0  0.3 285604 13048 ?        S    Jan01   0:08 /usr/sbin/httpd
user    24486  0.0  0.3 285604 13044 ?        S    Jan01   0:08 /usr/sbin/httpd

```

上記は、通常の状態ですが、起動時間がやたら長いのがいたり、ユーザーが?????とかよくわからん
プロセスがいたりして再起動に失敗している場合があります
怪しいプロセスがいた場合は下記コマンドを実行して、ゾンビちゃんを一網打尽にしましょう w

```
kill -9 `ps auxw | grep httpd | awk '{print $2}'`
```


## 解説

`kill -9 ` はプロセスを強制終了します。
プロセスをキルするとか殺すとかいいますね。


`ps auxw | grep httpd | awk '{print $2}'`
こちらは httpdのプロセスの２要素目のリストを出力しています。
参考までにこのコマンドだけ実行すると↓のようになります

```
$ ps auxw | grep httpd | awk '{print $2}'
1633
9901
24484
24485
24486
```

## 結論

要はhttpdのプロセスを全部killしているだけです。

実行する際は、webを参照しているユーザもいるかもしれないので、
えいやー！！！　ではなく、関係各所やタイミングを図りましょうw


それではよい　Linux Apache　ライフを！！
【初心者向け】プログラミングのエラー3選

こんにちはアキトです。

本日は、プログラミングのエラー3選をご紹介します。

特に初心者が陥りがちなエラーは以下です。

①全角スペースが入っている
②スペル間違い
③閉じタグを忘れている

では詳しく見ていきましょう。

## ①全角スペースが入っている

コード中に全角スペースが入っているとエラーが起きます。

```ruby:qiita.rb
input　= gets.chomp
```
上記のコードは「input」と「=」の間に全角スペースが入っています。


## ②スペル間違い

「puts」が正しいところ「put」としている場合などです。

地味にスペル間違いしていることがあるので、見返してみましょう。

```ruby:qiita.rb
put input
```

## ③閉じタグを忘れている

「if」や「while」などは必ずendが必要です。

中身の処理を書くまえに先にendを書いてしまいましょう。

```ruby:qiita.rb
if 条件式 
　# 処理を書くまえにendを先に書いておく
end
```

## まとめ
以上まとめると、プログラミング学習初心者はこれら3つのことを気をつけましょう。

①全角スペースが入っている
②スペル間違い
③閉じタグを忘れている

エラーが起きるとテンション下がりますが、落ち着けばきっと解決できるはずです。
sketch39.1(買い切り時代のバージョン)で、RenameItプラグインを利用するメモ

諸事情で買い切り時代のSketchを使っており、プラグインが中々使えないので対応しているバージョンをメモ

## 環境
* Sketch 39.1
* mac OS High Sierra 10.13.3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/30d96484-d8c6-2aee-b65d-44d602549cdd.png)


## 結論 RenameIt 2.0.1 なら Sketch39.1でも動きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/3751a4cf-f113-42de-c0ca-c686a0b41ee9.png)

**こちらからダウンロードしました↓**
https://github.com/rodi01/RenameIt/tree/v2.0.1


## メモ

* LayerとArtBoard両方とも、Ctrl + Cmd + R　で一括名前置換できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/fc68bbd5-a487-6da1-9a8e-ef0d23779cd0.png)
Windows7をVirtualBoxで動かす(OVA)

#概要
アプリ検証のためwindows7環境が必要。VirtualBoxで動かす。
ホストOSがWindows10HomeのためHyperVが使えないのでVirtualBoxを採用

## 環境
- HostOS: windows10 Home 64bit

## Windows7の仮想マシンイメージ（OVA)を入手
参考　https://qiita.com/hi85/items/e25fa4c39647c00fd8fc

評価版はダウンロードできるのか？
 →　MSが評価版を公開している（Free Vuirtual Mashines)
[Download virtual machines](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158724/6b3551ee-2a24-87f3-29a7-93b8fb48aace.png)

## Setup Virtual Machine
### (optional) イメージ保存先を変更
File>Preference>Gneral から変更可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158724/bcaed8c4-c2fe-5ecb-d456-7320a932ee1a.png)

### Windows7 仮想マシン作成(OVAから)
[File] > [Import Appliance] 
を開き、ダウンロードした「IE11 - Win7.ova」を選択する。設定はデフォルトのまま。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158724/9ef601d4-6320-e0b3-a90f-60c4add765fa.png)

### Copy&Paste, Drag&Drop　の設定
仮想マシンの[setting]>[Genera]>[Advanced]から設定
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158724/03a64c11-809f-efdc-6fc7-5a274bf40363.png)

## Setup Windows7 (GuestOS)
 - Windows Update
 - Microsoft Security Essentials のインストール
  - https://qiita.com/hi85/items/b3ba52e314d20d06129b
 - HostOSと同じネットワークに参加したい場合はネットワークをブリッジ接続にするのが簡単

## 仮想マシンをOVAとして出力
 [File]>[Export Appliance]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158724/aee91f94-18f1-203a-e5d1-52c55f7dcd91.png)
出力されたファイルは下記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158724/f9a260d8-f9bf-8c21-7234-1d99c845ca4e.png)



## 参考
- https://qiita.com/hi85/items/e25fa4c39647c00fd8fc
[Unity] シェーダーで画像を回転させる

```
m_cameraTex = new WebCamTexture()
```
で指定できるテクスチャサイズはあくまでもリクエストサイズで、リクエストそのままのサイズが返ってくるとは限りません。
さらに、返ってきたwidth,heightも、デバイスの向きによって

```
m_cameraTex.videoRotationAngle　// 0,90,180,270
```
の角度分だけ回転した値が返ってきます。
つまりwidth,heightが入れ替わっていることがあります。
また、デバイスによって画像が左右反転していたりします（iOSだと反転、PCだとそのままなど）。
これの補正をUIやGameObject側で行うと何かと面倒だったので、
マテリアルで吸収するシェーダーを作りました。

```
Shader "Video/UnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        [ToggleOff] _Mirror("Mirror", Float) = 0
        [Enum(0deg,0,90deg,1, 180deg,2, 270deg,3)] _RotType ("Rotate Type", Float) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue" = "Geometry+10" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _Mirror;
            float _RotType;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                float2 edtuv = TRANSFORM_TEX(v.uv, _MainTex);
                float tmp;
                if(_RotType==0){}
                else if(_RotType==1){ tmp = edtuv.x; edtuv.x = 1-edtuv.y; edtuv.y = tmp; }
                else if(_RotType==2){ edtuv.x = 1-edtuv.x; edtuv.y = 1-edtuv.y; }
                else if(_RotType==3){ tmp = edtuv.x; edtuv.x = edtuv.y; edtuv.y = 1-tmp; }
                if(_Mirror==1){ edtuv.x = 1-edtuv.x; }
                o.uv = edtuv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                float4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
        }
    }
}
```

![スクリーンショット 2019-05-03 21.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/f6851a67-70fe-e24c-3f4b-fea138c84f0e.png)

![スクリーンショット 2019-05-03 21.34.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1c406921-931c-6247-bff6-3d24a5cf6ee4.png)

iOSなどでAutoRotationにしている場合などに便利です。
beam のトランザクションを取得する

beam のトランザクションを取得します.

beam は block explorer でアドレスを指定してログを取得することができません.

GUI wallet もコピペができないので, cli のウォレットを使います.

## beam cli wallet document

https://documentation.beam.mw/en/latest/rtd_pages/user_cli_wallet_guide.html

## procedure

すでに GUI wallet でアドレスを作っているものとします.

CLI の `beam-wallet.cfg` に GUI wallet で作った wallet.db のパスを指定します.
たとえば Windows だと

`C:\Users\syoyo\AppData\Local\Beam Wallet\2.xxx\wallet.db`

などになります. GUI wallet で `wallet.db` のありかを確認できます.


```
$ beam-wallet.exe info
```

として, 内容が表示されるのを確認します. ここで "wallet が無いから init してね"と表示される場合は, wallet_path の指定が間違っていますので, `.cfg` での `wallet.db` のありかを再確認しましょう.

トランザクションを表示する

```
$ beam-wallet.exe info --tx_history
```

として, トランザクションを取得できます :tada:
(`info` をつけないとエラーになるので注意です)

`.cfg` でパスワードを設定しておけば, ファイルへリダイレクトしてトランザクションを保存もやりやすくなります
 (Windows Terminal など, コピペしやすいコンソールアプリを使うのも手でしょうか)

あとは, python あたりで CSV などのフォーマットに整形するといいでしょう!

## TODO

* [ ] beam-node を建てて同期を取る https://documentation.beam.mw/en/latest/rtd_pages/user_cli_wallet_guide.html#rescan-wallet
kotlinでJUnitをやってみよう

kotlinでJunitをやってみました
Javaをやってたので抵抗はないんですが、Junitをやってバグに気づけたので、導入することをお勧めします。
なので、手順を残したいと思います。

#### ①プラグインの追加

Junitをやるためにプラグインを追加します。
AndroidStudioで開発しているんですが、もともと入っていたので、追加する必要がない人が多いかもしれません。

build.gradle(Module:app)に下記を追加します。

```build.gradle
dependencies {
    testImplementation 'junit:junit:4.12'
}
```

これでテストコードが書けるようになります。

#### ②テストコードの記載

Junitに関しては、(test)フォルダーに格納します。
(androidTest)フォルダーにはEspresso等のUIテストを入れます。


今回テスト対象コードは下記になります。

```CalculateUtil.kt
fun addCalculate(num1: Integer, num2: Integer): Integer? {
    var addNum = num1 + num2
    return addNum 
}
```

テスト用フォルダーにファイルを追加したら、テストコードを記載します。

```kotlin

@Test
fun DateUtilTest_OK_001() {
    var calUtil = CalculateUtil
    val addNum = calUtil.addCalculate(1,2)
    Assert.assertEquals(addNum, 3)
}
```

テストを実行するには下記2点を意識する必要があります。
① `@Test`をつけてテストケースだと認識させる
②テスト対象メソッドをテストで使えるようにする

②に関してですが、クラスをインスタンス化して、対象のメソッドを呼び出し、引数に実際の値を入れて、戻り値が想定通りであることを確認するのが一通りの流れだと思います。
※今回は対象の実装がUtilでObjectにしているため初期化が上記になっています。

これで、実行できるはずなので、テストクラスを指定して、Runします。
※AndroidStudioではテストケース右クリック→'Run 〇〇〇〇Test'を押すとできます。

動作確認である程度の担保は取れますが、Junitを合わせることで、画面確認前にバグに気づけるのと、仕様の理解を深めることができるので、使ったほうがいいと感じました。
今後はMockも使ってみたいと思いました。
Leetcode #100: Same Tree

Time Complexity: O(n), where n is the number of nodes
Space Complexity: O(log(n)) is the best case for a balanced tree and O(n) is the worst case for a completely unbalanced tree.

```swift
func isSameTree(_ p: TreeNode?, _ q: TreeNode?) -> Bool {
    if p == nil && q == nil {
        return true
    }
    if p == nil || q == nil {
        return false
    }
    if let p = p, let q = q {
        return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right)
    }
    return true
}
```
37日目。Rubyでクラスの継承など。

クラスの継承

RubyⅢ(8分)
RubyⅣ(18分)

やっばりちょっと難しいですね・・・。
２周目だけどてこずりました。

###クラスの継承
```ruby

class Food < Menu
end
```

###継承されるもの
親クラスのインスタンスとメソッド

###子クラスにインスタンスを追加
クラス継承のところで`attr_accesso`にて追加できる。

```ruby
class Food < Menu
  attr_accessor :calorie
end
```

###子クラスにメソッドを追加
同様に、クラス継承のところで`def`にて追加できる。

```ruby
class Food < Menu
  attr_accessor :calorie
  def calorie_info
    return "#{self.name}は#{self.calorie}kcalです"
  end
end
```

###メソッドのオーバーライド（上書き）
子クラスと親クラスに同じ名前のメソッドがある場合、子クラスが優先される。

###親クラスの同名のメソッドを呼び出す(super)
`super(name: name, price: price)`

###日付を扱う(Dateクラス)
Rubyにて事前定義済みなので呼ぶだけでいい

```ruby
# requireを用いて、Dateクラスを読み込んでください
require "date"

# 変数birthdayに、Dateクラスのインスタンスを代入してください
birthday = Date.new(2019,5,1)

# 変数birthdayをputsしてください
puts birthday

# 変数birthdayにsunday?メソッドを用いた結果をputsしてください
puts birthday.sunday?

# 変数todayに、Date.todayの戻り値を代入してください
today =Date.today

# 変数todayをputsしてください
puts today

# 変数todayに対してsunday?メソッドを用いた結果をputsしてください
puts today.sunday?
```

###クラスメソッド
`Date.today`のようちクラス名に対して呼び出すメソッドのこと

```ruby
class A
  def A.B?
  end
end
```

###インスタンスメソッドの中でクラスメソッドを呼び出す
```ruby
class A
	def B
		if A.C
		end
	end
end
A.C
```

###完成！
さらに頭がこんがらがっています。
インスタンスメソッド、クラスメソッド。
よく似ていますよね。。。実際どうやって使い分けるんでしょう。
アルゴリズム体操ですかね。。。

(所要時間 52分)
(２周目 21分）