OmniAICreator/Qiita-1.07M huggingface dataset:
Androidでギャラリーから画像の形式を絞ったうえで複数選択して取り込む方法

仕事でAndroidアプリを開発することになり、Storage Access Frameworkというものを使い画像取込機能を作ったのですが、日本語の資料が少なく手間取ったので備忘録です。
開発してから内容をまとめるまで期間が空いたのと、初めてのAndroid開発のため間違いがあったらすみません。

##環境
・Android 6.0.1

##ギャラリーの呼び出し方
Androidでは、他アプリやAndroid標準の色々な機能を呼び出すときにintentというものを使うらしいです。

```
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, 0);
```
setTypeで"image/*"を設定することで、画像のみ取り込めるようにしてます。

startActivityForResultの2つ目の引数で0を設定していますが、ここではrequestCodeというものを設定してます。
これは、どのアプリや機能からの呼び出しかを判断するのに使うもので、後述の戻りの処理で使います。
値はintであればなんでもいいと思いますが、実装の際は定数化して呼び出しと戻りで同じ値を使えるようにしとくといいと思います。

###複数選択
一つ一つちまちま選ぶのが嫌なので、複数画像を選択できるようにします。

```
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 0);
```
###余計なアプリを呼び出したくない場合
上のままだと、ネットワークドライブや他アプリからもファイルが選択できます。
この場合、操作手順書を作る際に余計な機能について触れる必要がありめんどくさいので消します。

```
Intent intent = new Intent();
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 0);
```
###画像形式を選択
取り扱う画像形式を制限したいので、選択可能な画像形式を設定します。

形式が1つの場合（例はJPEG）

```
Intent intent = new Intent();
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 0);
```

2つ以上の場合（例はJPEGとPNG）

```
Intent intent = new Intent();
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"image/jpeg", "image/png"});
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 0);
```

呼び出しは大体こんな感じです。


##ギャラリーからの戻りの処理
ここからは受け取り側の処理についてです。
mainActivityの中に書けば動きます。

```
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
            Uri = uri;
            if (data.getData() != null) {
                // 選択画像が単数の場合の処理
                uri = data.getData();
            } else {
                // 選択画像が複数の場合の処理
                ClipData cd = data.getClipData();
                for (int i=0; i<cd.getItemCount(); i++) {
                    uri = cd.getItemAt(i).getUri();
                }
            }
        }
    }
}
```
requestCodeは、呼び出し側のstartActivityForResult()で設定したものが返ってきます。
複数機能からの戻りがある場合は、ifやらswichtやらで機能ごとに処理を変えてください。

resultCodeは、呼び出しの成否です。

これで選択画像のURIを取得できるので、あとは自由に。
Slackに翻訳botを足す

運用しているSlack ([競技プログラミングSlack](https://competitiveprogramming.info/slack)) に海外の方が入ってきたので、翻訳botを足してみた。
国旗のリアクションで、スレッドに翻訳してくれる。
![translate_bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20902/b0f81be6-930b-2943-ca68-1831f0ea0eee.png)

いくつかの記事を読んでみたところ、何点か変えたいところがあったので自作してみた。

- botに聞く形ではなく、国旗のリアクションで翻訳してほしい
- スレッドに返信してほしい
- できれば無料で

ということで以下の流れで作成した。

- Google Apps Script(GAS)を新規作成
- GASのPublish -> Deploy as web appで、GASを外部から叩けるようにする
- リアクションを取るためにSlack Appを作る
- Event Subscriptionsに `reaction_added` を追加し、Request URLにGASのURLを入力して保存する
- OAuth & Permissionsで `reactions:read` `chat:write:bot` `channels:history` を追加する
- Slackアプリを自分のワークスペースにインストールする

無料で翻訳するために、GASの `LanguageApp` を使った。
ということで、できたGASはこれ
https://github.com/firewood/test/blob/master/compprog-translator.js

どうやらreaction_addedは複数回呼ばれることがあるようなので、 `conversations.replies` でスレッドの内容を取得して、同じ国旗の翻訳がすでにあるかどうかチェックして、なかったら投稿するようにしてみた。(ただし10件しか確認していないので、すでにスレッドに10件以上投稿されているとそのまま足されてしまう)

会社のSlackに同様のbotがあるのだが、たぶん普通に有料のGoogle Translate APIを使っていると思われるので、実装は見なかった。(会社のものはスレッドの文章が翻訳できるなど、もう少し機能が充実している)

GASを使うのが初めてだったので、バージョンを上げてdeployしないと更新されないことにはまった。

参考にした資料
- [[Japanese] Developing a bot for your workspace 翻訳ボットを作る!](https://www.slideshare.net/tomomi/japanese-developing-a-bot-for-your-workspace-82133038) (GitHub: https://github.com/slackapi/reacjilator)
- [aws chaliceを使ってslackの翻訳botを作ってみた #aws #chalice #slack #bot - uchimanajet7のメモ](http://uchimanajet7.hatenablog.com/entry/2017/12/18/102237)
- https://qiita.com/zakiyamaaaaa/items/4873ba51646bda84d6ca
アクティブブザーの使い方(TMB12A05)

`TMB12A05`を使ったので忘れないようにメモ
[Arduino UNO チュートリアル: サインスマートのプロジェクト練習教本](https://ht-deko.com/arduino/uno_tutorial2.html#02_02_07)

より引用
```
アクティブブザー:
いわゆるブザーで、電気を流すだけでピーと音が鳴ります。digitalWrite() で ON/OFF して制御します。
```

##　配線
![IMG_1941.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176479/8351e069-09a5-9d82-292f-7e07844b71bd.jpeg)

## `TMB12A05`について
![IMG_1942.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176479/73f852b9-72d1-0199-14b8-510415878c57.jpeg)
![IMG_1943.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176479/eb36bf29-f173-5b86-f39c-adb9d91c2a37.jpeg)


## コード

```vim

void setup() {
  pinMode(13, OUTPUT);    // sets the digital pin 13 as output
}

void loop() {
  digitalWrite(13, HIGH); // sets the digital pin 13 on
  delay(1000);            // waits for a second
  digitalWrite(13, LOW);  // sets the digital pin 13 off
  delay(1000);            // waits for a second
}
```
## 結果　

ピーってなり続ける


## 参考文献
[Arduino　公式　digitalWrite()](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/)

[Arduino UNO チュートリアル: サインスマートのプロジェクト練習教本](https://ht-deko.com/arduino/uno_tutorial2.html#02_02_07)
PowerShellって何だ？　バッチから乗り換えた話

version 5.1
#はじめに
　Windowsでコマンド操作するってなるとバッチファイルぽちぽち作るって人も一定数いるんじゃないでしょうか。私もその一人でした。でも、複雑なことをさせようと思ったら、バッチファイルだと機能が足りないんです。楽するためにバッチファイル作ってるのに、なんかやだねっ調べたくないねってなるんです。怠惰ですね。というわけでバッチファイルよりも高度な処理ができると噂のPowerShellについて調べてみました。

　いまさら感Maxだけど、お手柔らかに。

#目次
windows7から標準装備されたっぽい。
IDEがあるってよ。
はじめてのPowerShell。
結局バッチも使った件。

#Windows7から標準装備されたらしい
　このPowerShell(正式には、Windows PowerShell)は、Windows Server 2008 R2とWindows7から標準装備されたCUIツールだそう。なので、2009年頃から誰でも使えたみたいですね。もう10年前。。。そんなわけで、2019年4月現在version6.0まで出てるみたい。でも、一般的なWindows PCには現時点でver5がインストールされているらしく、ver5からver6に変わる時点で大幅な変更があったそうなので今回はver5.1について(Windows10標準装備)の話をしていこうと思います。

　PowerShellはコマンドプロンプトよりも強力でスクリプトを書くための言語ってこと。つまり私が今まで使ってきたバッチファイルよりも出来ることが多いよ！ってことらしい。やったね！

#IDEがあるってよ
　Windows10にはPowerShell用のIDE(統合開発環境)が搭載されています。これはWindows PowerShell ISE(Integrated Scripting Environment)といい、PowerShellスクリプトを記述する専用のエディタ、実行環境、デバッグ環境が全部揃ったソフトウェアです。　
![ISE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398218/a283f990-d575-9ec1-662c-149130c66efd.png)
　ホームでISEと調べるとすぐ出てくるので使いやすいんじゃないかと思います。
　UIはこんな感じ。
　拡張子は.ps1を使います。バッチファイルは.batなので雰囲気はあまり変わらないのではないでしょうか。
![ISEIDE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398218/bbde8d86-6114-acf6-7696-b7433e26d41b.png)

#はじめてのPowerShell
　とりあえず最初のプログラムとして、Hello Worldを出力するPowerShellを作ってみようと思います。作り方としては、さっきの統合開発環境や、バッチファイルのようにメモ帳でも作ることが出来ます。

```powershell:helloworld.ps1
Write-Host "Hello world"
```

　こんな感じで簡単に作ることができます。PowerShellでは指示文のことをコマンドレットというであるとか、その種類だとかに関してはまた今度詳しく書けたら良いな。

　プログラムが出来たら実行となるところですが、ここで一つ問題が。このPowerShell、~~出来ることが多い分セキュリティ上危ういんです~~セキュリティが強化されています。勝手に予期しないPowerShellスクリプトが実行されたりしたら簡単にシステムの深い部分が実行されたりするので、最初はロックがかかっています。そのため、初めてPowerShellを実行するときにはWindowsのポリシーを変える必要があります。
　やり方としては、ホームでWindows PowerShellを検索、アイコンを右クリックして管理者として実行を選択します。
![shell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398218/8df0697c-e3a3-3f67-7795-744ed54bd978.png)
そして、

```
Set-ExecutionPolicy RemoteSigned
```

と入力してEnterします。そうすると、変更しますか？といった選択画面が出てくるのでyを入力すると変更されます。ここで変更するRemoteSignedというポリシーは、ローカルファイルと署名付きのPowerShellを実行可能とするポリシーになります。また、

```
Get-ExecutionPolicy
```

で現在のポリシーを確認できるので、実際に変更されたか確認してみると良いでしょう。

#結局バッチも使った件
　そうこうしてようやくPowerShellが使えるようになったわけですが、このファイルダブルクリックで実行されないんですよね。バッチファイルに慣れている身としてはなかなかやりづらい。右クリックで実行も出来ますが、無精な身としてはなかなか面倒くさい。そんなわけで結局バッチファイルでPowerShellを実行できるようにしました。ファイル名はhello.batとして、

```:hello.bat
powershell .\helloworld.ps1
pause
```

と記述しました。これでダブルクリックでPowerShellが使えるようになりましたね。めでたしめでたし。

#最後に
　PowerShellの使い方をだらだら書いてみました。これじゃあPowerShell使う意味ないとか、これだったらバッチファイルでも変わらないとかありますが、PowerShellにはlinuxのコマンドがそのまま使えたり、勉強するメリットは沢山ありそうです。今後少しづつ出来ることが増えてもっと楽できるようになれば良いなと思う次第。
JavaScript初心者が、とりあえずNode.jsでHello World!を表示してみた件

## JavaScriptとは

この辺で
https://techacademy.jp/magazine/8801

> 多くの人は知らないことですが、私たちはみんなJavaScriptのヘビーユーザーで、1日に何十回も使っています。デスクトップのコンピューター、携帯電話から、スマートテレビ、最新モデルの車に至るまで、ほぼ全てのデバイスにJavaScriptが相当使われています。私たちがウェブ検索をしたりコンピュータに囲まれた生活を送る上で、役立っています。

身の回りでそんなに使われているのね。知らなかった。。。

https://techacademy.jp/magazine/8735
非常に良くまとめられています。
このページを見ている人は、このリンクを見てからJavaScriptに取り組むモチベーションを設定しても良いのでは？
###### 他の言語の勉強を検討し直しても良いかもね 笑

## Node.jsとは

この辺りを参考
https://eng-entrance.com/what-is-nodejs
https://qiita.com/hshimo/items/1ecb7ed1b567aacbe559

なるほど、JavaScriptのサーバーサイド向けのプラットフォームなのね。
フロントエンドでもサーバーサイドでも使えるというのがJavaScriptが広く使われている要因のようです。

ここを見ながら、Node.jsのインストール
https://liginc.co.jp/web/programming/node-js/85318

``` Command
user$ git clone https://github.com/creationix/nvm.git ~/.nvm  → nvmのリポジトリをクローン
user$ source ~/.nvm/nvm.sh
user$ nvm help → 導入確認
user$ nvm ls-remote → ダウンロード可能なNode.jｓのバージョン一覧を確認

       ・・・
       v10.15.2   (Latest LTS: Dubnium)
       v10.15.3   (Latest LTS: Dubnium)
       v11.0.0
       ・・・
       v11.14.0
```
> 　「Node.jsは偶数のバージョンがLTS版（安定版）、奇数のバージョンが最新版となっています。」

```
user$ nvm install 10.15.3
```
特にこだわりはなかったので、安定版の最新をインストール

```
user$ node -v
v10.15.3
```

バージョンを確認。ちゃんと入ったみたい。

>
``` Sample.js
const http = require('http');
const PORT = 8124;
>
http.createServer((request, response) => {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World!!!!!!\n');
}).listen(PORT);
>
console.log(`Server running at http://localhost:${PORT}/`);
```

例にならってサンプルコードを入力して、

```
user$ node sample.js 
Server running at http://localhost:8124/
```

実行！

ブラウザ上で
「localhost:8124」と入力したら、

無事「Hello World!!!!!!」

と表示されました。めでたし、めでたし


### つぶやき

初投稿でした。
文書が適当、Markdownを使いこなせていない、などは勘弁ください 笑
ブロック引数付き proc をあるコンテキスト上で実行する

## 問題点

`#instance_exec` や `#module_exec` 等を使えば、あるコンテキスト上で、引数付きの proc オブジェクトを実行することができます。

OK

```ruby
object = Object.new
object.instance_variable_set(:@a, 1)

block = -> (b) { @a + b }
object.instance_exec(2, &block) # 3
```

しかし、これらのメソッドでは、ブロック引数付きの proc オブジェクトを実行できません。

Error

```ruby
object = Object.new
object.instance_variable_set(:@a, 1)

block = -> (b, &c) { @a + b + c.call }
object.instance_exec(2, &block) #  undefined method `call' for nil:NilClass (NoMethodError)
```

```ruby
object = Object.new
object.instance_variable_set(:@a, 1)

block = -> (b, &c) { @a + b + c.call }
object.instance_exec(2, &block) { 3 } # both block arg and actual block given
```

## 解決策

そこで、`#define_method` と `#instance_method` を組み合わせて、proc オブジェクトを **UnboundMethod** オブジェクトに変換し、`#bind` メソッドで実行したいコンテキストと結びつけます。`#call` メソッドなら、実行時にブロックを渡せるので、ブロック引数付き proc オブジェクトも扱うことが可能です。

```ruby
block1 = -> (b, &c) { @a + b + c.call }
block2 = Module.new.module_eval do
  define_method(:__unbound_method__, &block1)
  instance_method(:__unbound_method__)
end

object = Object.new
object.instance_variable_set(:@a, 1)
block2.bind(object).call(2) { 3 } # 6
```
枠付き文字がCSSとHTMLだけで作れる件

## 枠付き文字がCSSとHTMLだけで作れる件
CSSのtext-shadhowを使うことで文字に様々なshadowをつけることが出来ます。

なんと、これをGUIで操作できるページを見つけました。

<img width="1232" alt="Screen Shot 2019-04-13 at 23.50.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250231/b1295ff5-40d5-0d96-bcb4-0f6ce2e33db0.png">
リンクはこちらです。
http://owumaro.github.io/text-stroke-generator/

便利なので、ぜひ使ってみてください。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
【Unity】斜方投射の式を使って目標までの仰角を自動調整

#はじめに
　Unityの物理エンジンとC#で目標までの距離に応じて仰角を自動で変えてくれる的なプログラムです。
独学なので、ソースコードの書き方等かなりガバがあるかもしれません。ご了承ください。

#使用した式
[斜方投射ｰWikipedia](https://ja.wikipedia.org/wiki/%E6%96%9C%E6%96%B9%E6%8A%95%E5%B0%84)
Wikipediaの斜方投射に関する式からお借りしました。
イラストが下手すぎてすみません。目標までの距離と初速度と重力加速度から、仰角θが求まるのでそれを使います。
![ほうぶつ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367795/24886750-e7e3-0e37-c1cc-cc2992e3df73.png)

#ソースコードと実行結果
Luncher.csとBulletSc.csというそれぞれ発射台と弾につける二つのコードを書いてます。
乗せてるのはclassの中身だけで、とりあえず使ってないStart関数、Update関数をそれぞれ省いてます。
ランチャー側でいろいろ計算して、取得した弾インスタンスに値を渡しています。

```cs:Luncher.cs

    public GameObject Bullet;
    public float _Velocity_0;

    float _gravity = 9.8f;//重力加速度

    void Update(){
        //ランチャーの移動================================
        Vector2 pos = transform.position;
        pos.x += 0.1f * Input.GetAxisRaw("Horizontal");
        transform.position = pos;
        //================================================


        //スペースキーで弾の発射
        if (Input.GetKeyDown(KeyCode.Space)) {
            //ランチャーの座標取得
            Vector2 LuncherPos = transform.position;
            //ターゲットの座標取得
            Vector2 TargetPos = GameObject.Find("Target").transform.position;
            //ランチャーとターゲットの距離Lを取得
            float L = Vector2.Distance(LuncherPos, TargetPos);

             //Asinの中身を計算
            float AsinX = (L * _gravity) / (_Velocity_0 * _Velocity_0);
            if (AsinX >= 1) AsinX = 1.0f;//Asinの中身が1を超えるとまずいので
            
            //θ算出
            float _theta = 0.5f * Mathf.Asin(AsinX);
            //ターゲットとの位置関係で発射方向反転
            if (LuncherPos.x > TargetPos.x) _theta = Mathf.PI - 0.5f * Mathf.Asin(AsinX);
            

            //弾インスタンスを取得し、初速と発射角度を与える
            GameObject Bullet_obj = (GameObject)Instantiate(Bullet, transform.position, transform.rotation);
            BulletSc bullet_cs = Bullet_obj.GetComponent<BulletSc>();
            bullet_cs.Velocity_0 = _Velocity_0;
            bullet_cs.theta = _theta;
        }    
    }
```

```cs:BulletSc.cs

public float Velocity_0, theta;

    Rigidbody2D rid2d;
    void Start() {
        //Rigidbody取得
        rid2d = GetComponent<Rigidbody2D>();
        //角度を考慮して弾の速度計算
        Vector2 bulletV = rid2d.velocity;
        bulletV.x = Velocity_0 * Mathf.Cos(theta);
        bulletV.y = Velocity_0 * Mathf.Sin(theta);
        rid2d.velocity = bulletV;
    }
```

実行結果GIF　赤い四角がターゲットになります。
![Qiita_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367795/f0255bad-f540-d5d4-0946-ff4ba26c0c12.gif)
ターゲットとの位置関係で発射方向の切り替え
![Qiita_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367795/26a3a058-004f-f066-ea12-bd9c507c941a.gif)

#最後
発射した後の弾の処理はまったく考慮してないので、そのあたりはご了承ください。
今回の処理自体、汎用的というより用途はかなり局所的なものだと思います。何かの役に立ててもらえれば幸いです。
別セッションから一時表の内容を定義を変更せずに確認する方法

## 概要

データベースの一時表（一時テーブル、temporary table）は、使いこなすととても便利な機能なのですが、唯一扱いづらいところは、別セッションからレコードが覗けないというところです。

この難点のためだけに一時表を使わないのは勿体無いのでどうにかしたいと思います。

## ビューは使わない

タイトルにある「定義を変更せず」というのは、一時表の代わりに実テーブルとビューを組み合わせて一時表モドキにするという手法は用いないということです。

## やり方

それでは手順を説明します。サンプルのSQLはOracleで実行できる形式とします。
（MySQLやPostgreSQLでも応用可能です）

### サンプルテーブル

今回の説明用のサンプルテーブル定義は以下の通りです。

```sql
CREATE GLOBAL TEMPORARY TABLE USER1.TMPTBL (
  "ID"   NUMBER(3,0) NOT NULL ENABLE,
  "NAME" CHAR(128)   NOT NULL ENABLE,
   CONSTRAINT TMPTBL_IDX_00 PRIMARY KEY ("ID")
) ON COMMIT PRESERVE ROWS
```
### ログテーブルの作成

一時表の内容は当然他のセッションでは見れませんので、その内容のコピーを記録するログテーブルを作成します。

```sql
CREATE TABLE USER1.TMPTBL_LOG (
  "SESSIONID" NUMBER DEFAULT SYS_CONTEXT('USERENV', 'SESSIONID') NOT NULL ENABLE,
  "ID"        CHAR(3)   NOT NULL ENABLE,
  "NAME"      CHAR(128) NOT NULL ENABLE,
  CONSTRAINT TMPTBL_LOG_IDX_00 PRIMARY KEY ("SESSIONID", "ID")
);
```

一時表と同じテーブル定義に`SESSIONID`列を追加します。
名前からわかる通りセッションIDを格納します。セッションIDは同時には同じものが存在しない事が保証されますが、時間があくと同じIDを振られる可能性があるので、長時間保存しておく必要がある場合はさらに更新時刻も主キーに追加する必要があります。
（特にPostgreSQLはセッションIDの代わりにサーバプロセスIDを使用するので更新時刻は必須です）

### トリガーの追加

一時表（USER1.TMPTBL）にトリガーを追加します。

```sql
CREATE OR REPLACE TRIGGER USER1.TMPTBL_TRIGGER
AFTER INSERT OR UPDATE OR DELETE ON USER1.TMPTBL FOR EACH ROW
BEGIN
  IF INSERTING THEN
    INSERT INTO USER1.TMPTBL_LOG(ID,NAME) VALUES(:NEW.ID,:NEW.NAME);
  ELSIF UPDATING THEN
    UPDATE USER1.TMPTBL_LOG SET
      ID = :NEW.ID
      , NAME = :NEW.NAME
    WHERE
      SESSIONID = SYS_CONTEXT('USERENV', 'SESSIONID')
      AND ID = :OLD.ID;
  ELSE
    DELETE FROM
      USER1.TMPTBL_LOG
    WHERE
      SESSIONID = SYS_CONTEXT('USERENV', 'SESSIONID')
      AND ID = :NEW.ID;
  END IF;
END;
```

これで一時表にINSERT、UPDATE、DELETEが発生した際にログテーブルに内容が書き込まれるので、別セッションから内容を確認できる様になりました。

### 他のデータベースの場合

#### MySQL

MySQLの場合は、`SYS_CONTEXT('USERENV', 'SESSIONID')`を`CONNECTION_ID()`に変更してセッションIDを取得します。

#### PostgreSQL

PostgreSQLの場合は、`SYS_CONTEXT('USERENV', 'SESSIONID')`を`pg_backend_pid()`に変更してサーバプロセスIDを取得します。
前述の注意通りサーバプロセスIDはそこそこ同じIDが割り当てられる可能性があるので更新時刻も主キーに含めて一意制約違反が発生しない様に注意が必要です。
privateの構造体をjson.Marshalした時に空でreturnされる

## 概要
同package内でのみアクセスできる(private)構造体を json.Marshal した時に戻り値が空になる。

## 事象

privateの構造体を用意する

```golang:pkg/User.go
package pkg

type User struct {
	id    string
	name  string
	token string
}

func (u User) GetId() string {
	return u.id
}

func (u User) GetName() string {
	return u.name
}

func (u User) GetToken() string {
	return u.token
}

func New(id, name, token string) *User {
	return &User{id, name, token}
}
```

対象の構造体（User.go）をjson.Marshalする。

```golang:test.go
package main

import (
	"encoding/json"
	"fmt"
	"work/pkg"
)

func main() {
	user := pkg.New("0001", "test-user", "abcdefg")
	fmt.Println(user)

	userjson, err := json.Marshal(&user)
	if err != nil {
		fmt.Errorf("error marshal:", err)
	}
	fmt.Println(string(userjson))
}
```

実行結果は以下の通り、空で出力される

```
&{0001 test-user abcdefg}
{}
```

なんとなく、察してはいたけれどjson.Marshalはprivateな値は対象にしてくれない模様…
先頭文字を直してpublicにしようか迷ったがオブジェクト指向っぽく作りたかったため、今回はMarshalJSONで誤魔化す事にした。

```golang:pkg/User.go
package pkg

import "encoding/json"

type User struct {
	id    string
	name  string
	token string
}

func (u User) GetId() string {
	return u.id
}

func (u User) GetName() string {
	return u.name
}

func (u User) GetToken() string {
	return u.token
}

func New(id, name, token string) *User {
	return &User{id, name, token}
}

/* json.Marshalする時に各項目をGetする処理を追加 */
func (u *User) MarshalJSON() ([]byte, error) {
	v, err := json.Marshal(&struct {
		Id    string
		Name  string
		Token string
	}{
		Id:    u.GetId(),
		Name:  u.GetName(),
		Token: u.GetToken(),
	})
	return v, err
}
```

再度、実行する

```
&{0001 test-user abcdefg}
{"Id":"0001","Name":"test-user","Token":"abcdefg"}
```

## 追記
Getメソッドが不要な場合もあるので、下の様なやり方でも可能。
Goの場合だとこの方がやりやすかな？？

```golang:pkg/User.go
package pkg

import (
	"encoding/json"
)

type User struct {
	id    string
	name  string
	token string
}

func New(id, name, token string) *User {
	return &User{id, name, token}
}

/* 構造体から値を取得 */
func (u *User) MarshalJSON() ([]byte, error) {
	v, err := json.Marshal(&struct {
		Id    string
		Name  string
		Token string
	}{
		Id:    u.id,
		Name:  u.name,
		Token: u.token,
	})
	return v, err
}

```

## 所感
値にjsonパラメータを設定する際にprivateでも取得できる様な設定方法があるのかは随時調査して行く予定です。
jsonに変換する構造体自体をpublicで作るべきなのかは、正直分からず…
もっといい実装方法をご存知の方がいらっしゃいましたら教えて頂けると幸いです。

そもそも、Goではパッケージ外部からアクセスできない構造体をprivateと読んでいいのかも謎です。
（java脳ですみません。。。）
ローカルにpostgreSQLを入れないでgem pgをinstallする方法

背景
---
新しいMacに開発環境作ったけど、ローカル環境は極力クリーンに保ちたい
しかし、`gem 'pg'` するには、ローカルにpostgreSQLがインストールされてないといけない
postgreSQLはローカル環境に入れたくない(dockerでやる)

こんなエラーでるやつ

```
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
```

やること
---
postogreSQLの代わりに `libpq` をインストールする

``` sh
$ brew install libpq
```

gem インストール時に `--with-opt-dir` を指定する

``` sh
$ gem install pg -- --with-opt-dir="/usr/local/opt/libpq"
```

bundle 実行時に常に有効にする

``` sh
$ bundle config --local build.pg --with-opt-dir="/usr/local/opt/libpq"
$ bundle install
```

元ネタ
---
https://michaelrigart.be/install-pg-ruby-gem-without-postgresql/
てっとり早くReact.jsが導入されたElectronアプリを作成する。

雛形がGitHub上に公開されています。なのでそれをクローンするだけです。

必要最低限の構成が良い方はこちら
React + Babel + Webpack
https://github.com/alexdevero/electron-react-webpack-boilerplate

いろいろマシマシな構成が良い方はこちら
React + Redux + React Router + Webpack + React Hot Loader 
https://github.com/electron-react-boilerplate/electron-react-boilerplate

導入方法はそれぞれのRepositoryのREADME.mdに書いてあるので割愛します。

フロントエンドの技術に明るい方はマシマシな構成が良いと思います。
自分は初心者なので最小構成の方を選びました。便利だけどよく分からないパッケージがあると混乱するので。
ReactとかElectronの技術に慣れ親しんできたらマシマシな構成を使いたいですね。
Nuxt(Vue) + TypeScript で vuelidateの導入でハマった件

# はじめに

最近Nuxtを始めました。業務でAngularを使用していたので、TypeScriptは使っていきたいのですが、Nuxt + TypeScript ってなかなか苦慮する点が多いですね。今回はvuelidateを導入する際にハマったエラーの解消法を書きます。

# 問題のあらまし

デザインフレームワークとして、Vuetifyを使用しています。 Vuetify の form は vuelidate でバリデートできるので、 vuelidate を導入使用としましたが、テンプレート、スクリプトタグの中で、`$v` が空っぽになるバグに遭遇し、解消に時間がかかりました。

# 導入方法

インストール 

```sh
yarn add vuelidate
```

プラグインを作成

```typescript:@/plugins/vuelidate.js
import Vue from 'vue';
import Vuelidate from 'vuelidate';

Vue.use(Vuelidate);
```

設定も変更

```js:nuxt.condig.js
plugins:        [
    '@/plugins/vuetify.js',
    { src: '~/plugins/vuelidate' }
  ],
```

componentの記述

```vue:(バグ解決済み)
<template>
  <form>
    <v-text-field
            v-model="name"
            :error-messages="nameErrors"
            :counter="10"
            label="Name"
            required
            @input="$v.name.$touch()"
            @blur="$v.name.$touch()"
    ></v-text-field>

    <v-btn @click="submit">submit</v-btn>
    <v-btn @click="clear">clear</v-btn>
  </form>
</template>

<script lang="ts">
  import { Component, Vue } from "nuxt-property-decorator";
  import { required } from "vuelidate/lib/validators";

  @Component( {
    validations: {
      name: { required }
    }
  } )

  export default class Spread extends Vue {
    name: string = "";

    get nameErrors() {
      const errors = [];
      !(this as any).$v.name.required && errors.push( "名前な必須です。" );
      return errors;
    };
  }
</script>

```

# 解決方法

私の場合、\$v の undefined になっていた原因は validations をクラス宣言の中に書いていました。しかしながら、$v は ts に対応していないので、@component にjsと同じように記述する必要がありました。

# 結論

そもそもTypeScriptにする時の正しいポイントを理解していないのが原因でした。しかしながら、正しい記述方法がまとまった情報がなかなか見つかりませんでした。今回の結論は Nuxt + TypeScript を始める時は参考に記載する記事を一読してから始めるべきだったということです。（そのためにかなり遠回りしてしました。。。）

# 参考

https://mae.chab.in/archives/60167
ReactNativeにSentryを導入する（バグレポート・イベントログ収集）

# なぜSentryか
SentryはReact Nativeに対応したバグレポート・イベントログ収集ツールです。
類似ツールでReact Nativeに公式で対応しているものはあまりなく、ほとんどのサービスがコミュニティのラッパーでの対応ですが、Sentryならセットアップも簡単です。

例えば、おなじみのfetchやconsoleログがちゃんと認識されてログに残ります。


# Sentryに登録
[https://sentry.io/signup/](https://sentry.io/signup/)
上記よりチームを作成します。

# 以下のコマンドで自動セットアップ
アカウントの作成が完了したら、以下のURLにあるように、2行のコマンドだけでセットアップが完了します。
[https://sentry.io/settings/tenova/projects/react-native/install/react-native/](https://sentry.io/settings/tenova/projects/react-native/install/react-native/)

```bash
yarn add react-native-sentry
react-native link react-native-sentry
```

react-native linkの際にブラウザが開き、自動セットアップが開始します。

# ユーザーをidentificateする
どのユーザーがエラーを起こしたかを確認するために、idなどを設定します。

```javascript
import { Sentry } from 'react-native-sentry';

Sentry.setUserContext({
    id: 'XXXXXXXX',
});

// ログアウト時には空で実行
Sentry.setUserContext({
});
```

# 移動履歴を追跡する
captureBreadcrumbを使って画面遷移をトラッキングします。

```javascript
import { Sentry } from 'react-native-sentry';

...
  componentDidMount() {
    Sentry.captureBreadcrumb({
      category: 'Mounted',
      message: 'XXXScreen is mounted',
      data: {
        payload: 'meta sample'
      }
    });
  }
...
```
以下のように、エラーが起きる前にTopScreenがマウントされていることがわかります。

![スクリーンショット 2019-04-13 22.57.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114895/40b06c8c-7eb9-040e-077f-93740cbb72c3.png)

# 任意のメッセージを送る
デフォルトでconsole.warningやconsole.errorは認識されますが、そのほかに任意でイベントを送りたい場合はcaptureMessageが使えます。

```javascript
import { Sentry, SentrySeverity } from 'react-native-sentry';
...

Sentry.captureMessage('some warning', {
  level: SentrySeverity.Warning
}

Sentry.captureMessage('critical error', {
  level: SentrySeverity.Error
}
```

# まとめ
初めてSentryを使ったのですが、思った以上にReact Nativeにちゃんと対応していて驚きました。
今の所React Native向けのバグレポートではSentryが一番使いやすいです。
YOLOv3/4 の Docker イメージの作成方法

# 環境
OS: Ubuntu 18.04.4 LTS
GPU: Geforce GTX1080Ti
NVIDIA ドライバ: 440.100

# NVIDIA Container Toolkit のインストール
下記の記事を参考に NVIDIA Container Toolkit をインストール
https://blog.amedama.jp/entry/docker-nvidia-container-toolkit

下記の記事を参考に nvidia-container-runtime をインストール
https://github.com/NVIDIA/nvidia-container-runtime

デフォルトランタイムを変更

```bash
$ sudo tee /etc/docker/daemon.json <<EOF
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
EOF
```

# Docker イメージのビルド
下記の Dockerfile を使ってイメージをビルドする

```Dockerfile:Dockerfile
FROM nvidia/cuda:10.2-cudnn8-devel-ubuntu18.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt update && \
    apt install -y --no-install-recommends \
    libopencv-dev \
    build-essential \
    sudo \
    wget \
    git

RUN cd /opt && \
    git clone https://github.com/AlexeyAB/darknet.git && \
    cd darknet && \
    sed -i -e "/GPU=/s/0/1/" Makefile && \
    sed -i -e "/CUDNN=/s/0/1/" Makefile && \
    sed -i -e "/CUDNN_HALF=/s/0/1/" Makefile && \
    sed -i -e "/OPENCV=/s/0/1/" Makefile && \
    make -j$(nproc)

RUN cd /opt/darknet && \
    wget https://pjreddie.com/media/files/yolov3.weights && \
    wget https://pjreddie.com/media/files/yolov3-spp.weights && \
    curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=1cewMfusmPjYWbrnuJRuKhPMwRe_b9PaT" > /dev/null && \
    CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"   && \
    curl -Lb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=1cewMfusmPjYWbrnuJRuKhPMwRe_b9PaT" -o yolov4.weights

WORKDIR /opt/darknet

CMD echo "Finished!"
```

ビルドを実行する

```bash
docker build . -t yolo
```


# YOLOv3 の実行
USBカメラを接続して下記のコマンドを実行する

```bash
docker run --rm \
  --net host \
  -e DISPLAY=$DISPLAY \
  -v $HOME/.Xauthority:/root/.Xauthority \
  --privileged \
  yolov ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
```
VuejsのGUIジェネレーターを改良した話

# はじめに

作成中のGUIジェネレータを改良した。

- [前回](https://qiita.com/sterashima78/items/3d53d0721565a824d5f8)
- [GitHub](https://github.com/sterashima78/vue-webpage-builder)
- [デモ](https://sterashima78.github.io/vue-webpage-builder)

# 改良点

## vuetify 以外のコンポーネントフレームワークを利用可能にした

任意の css と javascript を読み込めるようにしたため好きなフレームワークを利用できるようになった。

![change_lib.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358387/f4a645cf-6e30-6ce2-465b-9eadd65b2bee.gif)


## プロジェクトデータの保存と読み込みを可能にした

作成中のプロジェクトをjsonファイルでダウンロードできるようにし、ファイルを読み込むことで保存した状態を再現できるようにした。

![project_export.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358387/573b5c2a-f119-8da8-06f5-c91bdc19fe67.gif)

## 任意のインラインスクリプトを挿入できるようにした

```
Vue.use(plugin)
```

などが書けるようにすることが目的

![inline.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358387/6970cf3b-6fa9-402c-65d8-ebfe69ca98b0.gif)


# 技術的な話

## iframeのリロード

スクリプトを読み直したりしたときはiframeをリロードしないといけないが以下のような感じで書けた

```js
private reload() {
  const ele = obtainIframe();
  ele.onload = () => {
    // 必要な処理
  };
  ele.contentWindow.location.reload();
}
```

インラインスクリプトが更新された時もリロードするが、イベントの間引きがしたかった。
`_.debounce` を使おうと思っていたが、https://github.com/duxiaofeng-github/typescript-debounce-decorator が使いやすくてよかった。

こんな感じで使える。

```js
@debounce(500, { leading: false })
private reload() {
}
```

# 類似ツール

今回の更新中に見つけた。

- [PreVue](https://www.prevue.io/)
   - 完全に使い方を理解していないが目的が異なるようなイメージを持った

# 終わりに

今後やりたいこと。

- 追加したい機能
  - 複数ページへの対応 (vue-routerで)
  - attribute の型指定
- 機能以外で対応したいこと
  - リファクタリング
  - CI・CDの導入
【Symfony4】PHPフレームワークの初期設定

こんにちは。
イエノカドです。
今日は今更ですが、忘れてしまうこともあるので
Symfony4.2で初期画面を表示させるまでをやってみました。

# Symfonyとは
* PHP上で動作するフレームワーク
* EC-CUBEでも採用されているフレームワーク
* 個人的にはLaravelより使いやすい印象

# 環境
* windows 10 pro
* Docker Quickstart Terminal
* PHP 7.3.3（PHPのインストール設定は省きます）
* composer 1.8.5

# 目次
* [Composer](https://getcomposer.org/)のインストール
* [Symfony](https://symfony.com/)のインストール
* 結果
* まとめ

# Composerのインストール
```
cd /c/php

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

# Symfonyのインストール
symfony用のディレクトリを作成

```
$ mkdir /c/workspace/symfony_sample
```
先ほどインストールしたcomposer.pharを移動

```
$ mv /c/php/composer.phar /c/workspace/symfony_sample/composer.phar
```
symfony4をインストール

```
$ php composer.phar create-project symfony/website-skeleton my-project
```
インストール完了後に移動

```
$ cd my-project/
```
symfony4を起動させるためにphpでサーバ立ち上げ

```
$ php bin/console server:run
```
# 結果
http://localhost:8000/ にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377903/45cb2a89-41fa-214d-387a-895acbc087f4.png)

# まとめ
* composer インストールからSymfony初期画面表示まで5分程度でできました。
* ここからControllerやEntityやらRoutingなど設定していき、何か処理を作っていかないといけないので、ここからです。

# 出典
* https://getcomposer.org/download/
* https://symfony.com/doc/current/setup.html
gitプロジェクトの除外ファイルを設定する。

gitプロジェクト直下にある.gitignoreを編集する。

①C:/Users/{userName}/.gitignoreを編集する。

```xml:.gitignore
pom.xml    // pom.xmlを除外する。
bin/       // classファイルを除外する。
*.csv      // 全CSVファイルを除外する。
```

②作成した除外ファイルを有効にする。
C:/Users/{userName}/.gitconfigを編集する

```xml:.gitconfig
[core]
	excludesfile = ~/.gitignore
```

【メモ】
・上記は、全プロジェクトに対して有効
・ただし、すでにaddまたはcommitしたファイルは除外されない。
・SourceTree上でも.gitignoreを編集できるけど
　それはプロジェクト単位のやつで、かつ「.gitignore」
　自体がaddの対象になってしまうので、あんまりやりたくない。
　(間違えてcommitしたら困る)
・逆にpullしてくるファイルが除外対象になるかどうかは未確認。
　(ならないとは思うけど。)
先輩に言われて印象に残っている言葉たち

## はじめに
文系未経験でIT業界に入り、パソコンの電源をいれることすら危うかった僕ですが、6～7年経った今でもこの業界でなんとか頑張れているのは最初に入った会社のおかげです。いろんな案件を経験した今思い返しても本当に良い会社でしたし、ITの基礎を叩き込んでくれたことに本当に感謝しています。今回はその会社で先輩から言われて今でも印象に残っている言葉を紹介したいと思います。あくまでこの言葉が自分に合っていたという話です。

## 「自分がチームに貢献できるものを見つけろ」
新人研修中、プログラムが全く理解できなくて、この業界に入ったのは失敗だったのかと思った時に教育担当に言われました。「極論、コード書けなくてもいいよ。コード書くだけが仕事じゃないし、仕事は1人でやるもんじゃないよ。例えばチームメンバーが疲れた時に肩を揉んでやったりしてチームの生産性が倍になるなら、お前がチームにいる意味がある。コードを書くことで貢献するのか、他で貢献するのか、強みを探していけばいいよ。」みたいなこと言われました。今ではコード書くの好きですが、常駐型のフリーランスをしていることもあり、客先で「自分がここで強みになることはなんだろう」と考えるときにこの言葉を思い返します。

## 「一緒に最高の仕事をしましょう！って言う人はあんまり信用できない」
社長が話していたことです。「100％の完成度ってのは現実的じゃないので、そこしか見てない人よりも「ほどほどに良い感じになるようやりましょうよ」って言いながら協力したほうが結果的に良いものが出来る」みたいなこと話していました。

## 「趣味に時間を使いたいので早く帰ります、って人の方が信用できる」
最初に配属された案件の女性リーダーはオフで合唱をやっていて、練習があるので特定の曜日は早あがりしていました。ボロカスだった自分を根気よく育ててくれ、顧客との調整もメンバー管理も上手く、技術もある尊敬できるリーダーでした。評価面談で「趣味を優先して帰るためには、普段からきっちりやることはやる必要がある。仕事がんばります！って口だけ言う人よりも、自分はそういう人と仕事したいので、趣味を楽しんでやることきっちりこなす道を進んでほしいな」と言われて、社会人になったら趣味の創作活動が大きく制限されると不安視していた自分はやる気をもらいました。

## 「図を書け、図を！」
新人研修中に何度も言われました。目の前の課題をこなすのに必死で、実装イメージが湧いていないのにコードを書こうとして失敗していました。「まず何がやりたいのか、日本語で説明できないのにコードは書けない。頭がごちゃごちゃするなら、まず図を書く。それを見せながら他の人に説明できるようにする。そこまで出来たらあとはコードを書くだけ。」僕は今でもすぐ図を書きます。

## 「わからないことをわからないって言えるのは良い」
これまた新人研修中、全然プログラムが分からなくて、定時後に教育担当につきっきりで教えてもらっていた時のこと。隣の席に座っていた教育担当の教育担当だったベテランが様子を見て、「教えて欲しいと言えることも、わからないって言えることも、すごく良いねぇ」としみじみ言ったのが妙に耳に残りました。

## その他
「仕事なんて出来るフリしてれば出来るようになるよ」
「コミュニケーションが上手く取れるだけで自信持って良い」
「コード書くのが一番好き。ずっとコード書いてたい。」
「わかりやすいドキュメントを書くってのは、ベテランだってめっちゃ難しいこと」

## おわり
先輩にとっては特に意図もなかった一言でも、何もわからない新人にとっては数年経っても心に残ったりするんですねぇ。
基本情報技術者過去問題 平成30年春期 午後問7 について

参考サイト:
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_1/2018h30h_fe_pm_qs.pdf
https://www.fe-siken.com/kakomon/30_haru/pm07.html
https://ceruleanart.net/sales
http://www.first-kessan.com/category/1329921.html

#まずは問題
収益の検討に関する次の記述を読んで，設問1～3に答えよ。

　小規模な部品メーカであるR社は，部品Tだけを生産して大手機械メーカに販売している。

##設問１
次の記述中の ( ) に入れる適切な答えを，解答群の中から選べ。

　利益計画を策定するために，部品Tの販売数について2通りの検討を行った。表1は，部品Tの販売数を1,000千個見込むケースXと，1,200千個見込むケースYについての収益検討表である。両ケースの，売上高に対する変動費の比率(以下，変動費率という)は等しく，固定費は同額である。
![syuekikento.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/6aba55c8-1d2f-dc68-09c5-648488d3bf82.png)

　表1から，変動費率は <font color="MediumVioletRed">( a )</font> %，固定費は <font color="DarkKhaki">( b )</font> 千円である。

#そもそも……

##<font color="blue">売上高</font>、<font color="green">利益</font>とは？
###<font color="blue">売上高</font>とは
本業から得られる収益のこと。
###<font color="green">利益</font>とは
収益から費用を引いたものが利益です。
##<font color="blue">売上高</font>と<font color="green">利益</font>の違い
２つの違いは、こちらの計算式を見れば一目瞭然。
><font color="green">利益</font> = <font color="blue">売上高</font> - 費用

どんなにたくさん<font color="blue">売上高</font>を稼いだとしても、費用をたくさん使ってしまえば<font color="green">利益</font>は少なくなってしまいます。

##<font color="DarkTurquoise">変動費</font>とは？
<font color="blue">売上高</font>に比例して増えたり減ったりする費用。
><font color="DarkTurquoise">変動費</font> = <font color="blue">売上高</font>に比例して増減する費用

##<font color="DarkKhaki">固定費</font>とは？
<font color="blue">売上高</font>に関係なく発生する費用のこと。
><font color="DarkKhaki">固定費</font> = <font color="blue">売上高</font>に関係なく発生する費用のこと

##<font color="MediumVioletRed">変動比率</font>とは？
<font color="MediumVioletRed">変動費率</font>は、変動費を<font color="blue">売上高</font>で割ったもの。
><font color="MediumVioletRed">変動費率</font>(%) = ( <font color="DarkTurquoise">変動費</font> ÷ <font color="blue">売上高</font> ) × 100

##<font color="Maroon">損益売上高</font>とは？
><font color="Maroon">損益分岐点売上高</font>（円）= <font color="DarkKhaki">固定費</font> ÷ ( 1 - <font color="MediumVioletRed">変動費率</font> ) × 100

#実際に解いてみる
変動比率と固定費を２つの変数とした連立方程式を立てて、値を導くことができる。

変動比率をA、固定費をBとする。

変動費は、売上高に比例して増えたり減ったりする費用であるため、
下記の式を立てることができる。
>変動費 = 売上高 × A

下記の式に、ケースX と ケースY それぞれの値を代入し、2つの式を立てる。
200,000 - ( 200,000 × A + B ) = 16,000 ・・・①
240,000 - ( 240,000 × A + B ) = 26,000 ・・・②

①、②の式を A についてまとめる。
A = ( 184,000 - B ) / 200,000 ・・・①'
A = ( 214,000 - B ) / 240,000 ・・・②'

①'のA と ②'のA は等しいため、
( 184,000 - B ) / 200,000 = ( 214,000 - B ) / 240,000
B = 34,000

よって、( b ) は 34,000 となる。

①'に、Bを代入する。
A = ( 184,000 - 34,000 ) / 200,000
A = 0.75

よって、( a ) は 75 となる。
Node.js・npmのインストール方法

なんとなく使っていたnode.jsとnpmについての今日、基礎を教わる機会があったのでメモ代わりに書いておく。

## Node.jsのインストール
Node.jsとはサーバサイド側で動くJavaScriptのこと。

インストール方法は、まずはnodeのwebページに行く。
[nodeのwebページ](https://nodejs.org/ja/)
![スクリーンショット 2019-04-13 21.18.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328873/c1a61758-a591-a3d0-5fe6-3aff4c64d1b9.png)

自分は最新版のインストールした。
インストールされているかの確認として、CLIで`node -v`をたたく。

```
v11.14.0
```
と出ればnodeがインストールされている。

## npmのインストール
npmとはNode Package Managerの略。
_npmのインストール_

```
sudo npm install -g npm
```
今回はグローバルにインストールをする。

npmも`npm -v`でインストールができているか確認できる。

共同開発をする場合は**package.json**でライブラリの管理やバージョン管理を行う必要がある。
npmを使って、**package.json**を作る。

```
npm init
```
**package.json**ができる。

package.jsonに必要なライブラリを追加していく。

```
sudo npm install ライブラリ名 --save
```
--saveオプションを付けることで、**dependencies**にインストールされる。
**dependencies**では本番環境での動作に必要なライブラリ等をインストールしておく。

開発環境のみに必要なライブラリは**devDependencies**にインストールする。

```
sudo npm install ライブラリ名 --save-dev
```

これで共同開発をする場合にバージョン管理や必要なライブラリを同じ環境で動作することができるようになる。
プロジェクト参画チートシート

一概に全てのプロジェクトに適用できるわけではないけど、個人的にプロジェクトジョイン時にやる事まとめ

## PCセットアップ
可能な限り自動化しとく

- Macを想定
- Homebrewを入れ必要なものをたくさん入れる
- 半日のつもりで1日のバッファを取る
  - 最低限なら1hくらい
- なんだかんだネットワークとか申請で掛かる

## 情報の集約場所を決める
ファクト->抽象化->転用のプロセスを通してメモを常にブラッシュアップする事を徹底する

- 雑多なメモ帳(オフライン)
  - ホワイトボードタイプ
  - 書き終わったらEvernoteにScanableで上げる

- 雑多なメモ帳(オンライン)
  - ある程度整ったら掲載したい場所に移す
  - Simplenote
  - 内容単位で新規作成する
  - 技術系
  - 業務知識系
  - 作業系
  - スマホにアプリ入れとく
  - tmp的位置付け

- Slackのピン留め
  - プロジェクト固有のスニペット的な情報を自分チャンネルに投稿しピンする

- Qiita
  - 技術知識がある程度まとまったもの
  - Simplenoteでまとまったもの
  - 書籍wikiでまとまったもの

- 書籍単位のwiki(独自wiki)
  - 読んだ本の登録
  - 本の内容メモる
  - kindle unlimitedの本は特に登録とメモをセットにする(保管制限あってあとで見返しづらい)
  - 紙も情報を取り出したい時大変(持ち運べない)なので意識してメモをセットにする

## 業務・ツール概要説明
認識合わせを忘れない(言葉の定義を確認する)

- 可能ならば必ずもらう
- 雑多なメモ帳を駆使する
- 網羅的にしてもらう
- 自分でまとめたものをレビューしてもらう

## ドキュメントインプット
インデックスを貼る目的で行う

- 案件によるが黙ってインプットさせてもらう期間を通算2日分(最低1日)くらいもらう
- どこに何があるかをメモする
- 一通り通読する
- 不明なものをメモする
- 不明なものをまとめて聞く
- 何回も取り出しそうな情報はslackにピン留めする

## 環境構築
後続のメンバーが自分よりも早くできるようにする事を目指してブラッシュアップする

- ドキュメントを読んで進める
- 分からないものはタイムリーで聞く
- 初見で想起やイメージできない表記は修正許可をもらう
- ないものは追加する
- 手作業のコマンドがある場合ShellScriptにメモる
- 可能ならばDocker化する

## メンバー理解
性格と立ち位置、長所と短所を押さえとく

- コミュニケーションを取る相手を認識する
- メンバーのやっている内容
- 要件確認する相手
- 仕様確認する相手
- 実装確認する相手
- 進捗共有する相手

## 改修・追加開発
現状把握と共有を常に徹底する

- 要件概要確認する
- やるメリットと効果を検討する
- 作業優先度を確認する
- 要件と対応するソース特定・確認する
- 既存の類似対応、類似箇所があるか確認する
- 影響範囲と認識があっているか確認する
- 過去に関連チケットがあるか探す
- 過去の関連git logあるか探す
- チケットを作成する
- 過去のソース変更者やその期間在籍している人を探す(背景が分からない場合)
- ざっくりその人に聞く(背景が分からない場合)
- やる事を分かる範囲で箇条書きにする
- 順番を確認する
- 更に細分化する
- 認識を確認する
- 工数を出す
- ざっくりの全体工数を共有する
- ソースコード調査・把握する
- 調査・把握経過をメモる
- 細めに見積もりを更新する
- レビュー、テストの工数考慮が漏れがちなので共有する
- ある程度明確なものはそのまま工数を共有し、不確実性の高いものはその旨を共有した上で作業する

## 新規開発
決裁権持つ人と一体となってやり取りする

- 可能ならば要求をRFPとしてもらう
- ヒアリングする
- 提案する
- 要件定義書作成する
- 工数見積もりをする
- 設計する
- プロトタイプ作る
- プロトを複製し拡張する
- アジャイル的に開発する
- テストする
- 納品する

## 保守運用
ナレッジを人依存にしないことを徹底する

- 障害対応記録の存在を確認する
- 障害対応記録を積んでいく
- 障害発生箇所の改修をする
- 既存の運用保守コストを可視化する
- 運用を自動化する
- 保守を自動化する

## 雑感
最低限すぐやれる事のレベルを常に上げておく
NSAttributedStringで下線をつける(Swift4)


##NSAttributedStringとは

NSAttributedStringではフォントの大きさを変えたり色を変更することができます。
今回はそれを使ってbuttonに下線を付けて見ます。

今回は下記画像のような実装をbuttonに装飾したかったのでやり方を載せておきます。


<img width="150"  alt="IMG_3635.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122719/8face6dc-34b2-8ec9-99c8-fd2c1c3162d4.jpeg">



##下線を表示させる
NSMutableAttributedStringを使うと部分的に文字の装飾などができます。
その中でNSUnderlineStyleを指定して表示させます。
ただそのまま使ってしまうと全てに下線が装飾されてしまうので表示エリアも指定します。

```swift
let underLineString = "(\(review))件"
let underLineString = "(\(review))件"
let attributeString = NSMutableAttributedString(
string: underLineString
)

attributeString.addAttributes([
//下線を表示
.underlineStyle: NSUnderlineStyle.single.rawValue],
//下線を表示する場所をattributeStringの二番目と後ろから三番目まで表示を指定
range: NSRange(location: 1, length: attributeString.length - 2)
)
```


##完成コード
```swift
//reviewは何かしらの件数の数
let underLineString = "(\(review))件"
let attributeString = NSMutableAttributedString(
string: underLineString
)

attributeString.addAttributes([
//文字の大きさ・フォントの指定
.font: UIFont.systemFont(ofSize: 13),
//文字の色
.foregroundColor: UIColor.red,
//下線を表示
.underlineStyle: NSUnderlineStyle.single.rawValue],
//下線を表示する場所をattributeStringの二番目と後ろから三番目まで表示を指定
range: NSRange(location: 1, length: attributeString.length - 2)
)
//ここでbuttonに装飾を反映
ReviewButton.setAttributedTitle(attributeString, for: UIControl.State())
```
D-OceanでSQL文を実行する

大学の授業でD-Oceanを利用しました。ログイン/登録ページは[こちら](https://www.docean.io/index.html)です。
D-Oceanは一般の人がアクセスできるデータベースのようなものらしいです。公開されている表形式のデータの他に、グループにjoinできれば利用できるデータもあります。今回はとある社員食堂の購買データを分析するべく、必要な分だけのデータを取り出し、ダウンロードしました。
まずデータを選択して現れるポップアップでSQLタグをクリックすると、そのデータを操作するためのSQL分を入力する欄が表示されます。

私が使用したコマンドは以下のようなものです。

```sql:sql_command
SELECT COLUMN_2,COLUMN_5 FROM `$group_name.data_file_name`where COLUMN_4="value1" and COLUMN_8="value2" LIMIT 1000
```

その欄でこのコマンドを実行することは、「`group_name`という名前のグループで共有されている`data_file_name`というファイルの格納された表形式のデータから、データ項目`COLUMN_4, COLUMN_8`がそれぞれ`value1,value2`であるデータのうち、`COLUMN_2`と`COLUMN_5`の値を取り出す」ことを意味しています。

このようにして必要な分だけを取り出したあと、クリックひとつでダウンロードできます。


記事は以上です、ありがとうございました。
---
[Amazon WorkSpaces]AmazonLinux2にVisual Studio Codeインストール

Amazon Linux release 2 (Karoo)

```
# Visual Studio Codeをインストールするための鍵とリポジトリを追加
$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
$ sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'

# Visual Studio Codeのインストール
$ sudo yum -y install code

# コンソールから起動する場合
$ code
```

**参考URL**

[Visual Studio Code on Linux](https://code.visualstudio.com/docs/setup/linux)
[CentOS 7にVSCode (Visual Studio Code)をインストールしてみた](https://www.karelie.net/install-vscode-centos-7/)
NHKらじるらじるをタイマー録音〜Googleドライブ転送

これまではRadikoを使ってNHKのラジオ講座をタイマー録音していたのですが、2019年4月より、ラジオ第二(JOAB)のRadioの配信が終了しまったので、らじるらじる単体でタイマー録音するようにしてみました。

タイマー録音はライズパイを使います。録音が終わったら自動的にGoogleドライブに転送して、出先からスマホを使っていつでもどこでも聞けるようにします。
機材やパッケージのインストールは[こちら](https://qiita.com/yuppejp/items/04a904ee183dc69dcb73)を参考にしてください。


# らじるらじる録音スクリプト
rec_radio.shを参考にm3u8urlで録音するしたスクリプトです。アルバム名などのメタデータも追加しています。録音完了後にGoogleドライブに転送して完了です。

```bash:rec_nhk.sh
#!/bin/bash

LANG=ja_JP.utf8

DATE=`date '+%Y-%m-%d-%H_%M'`
OUTDIR="."

if [ $# -le 1 ]; then
  echo "usage : $0 channel(NHK-FM | NHK-R1 | NHK-R2) duration(minuites) [outputdir] [prefix]"
  exit 1
fi
if [ $# -ge 1 ]; then
  CH=$1
  M3U8URL=""
  if [ ${CH} = "NHK-FM" ]; then
    # TOKYO NHK-FM
    M3U8URL="https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8"
  fi
  if [ ${CH} = "NHK-R1" ]; then
    # TOKYO R1
    M3U8URL="https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8"
  fi
  if [ ${CH} = "NHK-R2" ]; then
      # TOKYO R2
      M3U8URL="https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8"
  fi
  if [ -z ${M3U8URL} ]; then
    echo invalid channel name.
    exit 1
  fi
fi
if [ $# -ge 2 ]; then
  DURATION=`expr $2 \* 60`
fi
if [ $# -ge 3 ]; then
  OUTDIR=$3
fi
PREFIX=${CH}
if [ $# -ge 4 ]; then
  PREFIX=$4
fi

echo "channel:  "${CH} 
echo "duration: "${DURATION} 
echo "outdir:   "${OUTDIR} 
echo "prefix:   "${PREFIX} 

ffmpeg -i ${M3U8URL} -to ${DURATION} -metadata genre="Radio" -metadata artist="${CH}" -metadata album="${PREFIX}" -c copy "${OUTDIR}/${PREFIX}_${DATE}.m4a"

if [ $? = 0 ]; then
  /home/pi/gdrive upload "${OUTDIR}/${PREFIX}_${DATE}.m4a"
fi
```

# タイマー録音
録音スクリプトをcronに設定します。配信に遅延があるので、sleepで開始タイミングを調整しています。

```bash:crontab
30 8 * * 1-5 sleep 30; /home/pi/rec_nhk.sh NHK-R2 10 radio TimeTrial
55 12 * * 1-5 sleep 30; /home/pi/rec_nhk.sh NHK-R2 5 radio e-news
0 23 * * 2 sleep 30; /home/pi/rec_nhk.sh NHK-FM 50 radio MISIA-hoshizora
```

### 参考
- [らじる★らじる m3u8 を ffmpeg で録音する（８放送局）](https://riocampos-tech.hatenablog.com/entry/20170911/download_radiru_m3u8)
- [ラズパイでラジオをタイマー録音〜Google ドライブ転送](https://qiita.com/yuppejp/items/04a904ee183dc69dcb73)
nokogiriのインストールに失敗する問題

# nokogiriのインストールに失敗
railsでgemを追加してbundle installしたらnokogiriがインストールできないと下記のようなエラーが出ました。

```
--use-system-libraries
checking if the C compiler accepts  -I
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libxml2... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using system libraries.
ERROR: cannot discover where libxml2 is located on your system. please make sure `pkg-config` is installed.
```

ネットの情報だと昔からあるエラーらしくgemにpkg-config追加すると直るなど情報がありますが自分はこれだとなおりませんでした。
たぶんmacのOSをアップデートしたりXcodeのバージョンを変更したりなどなどシステム内部の変更で何か問題が起きてしまうのが原因のように思われます。
ということで一応自分のmacのバージョンも下記に記します。

```
mac os mojave
macOS 10.14.3 (18D109)
```
# 直し方
homebrewのリンクの問題なのかまず下記コマンドを入れます。

```
brew install --force libxml2
brew link libxml2
```
上記のlinkを入れた後に下記のwarningが出たので念の為pathを入れておく。

```
Warning: Refusing to link macOS-provided software: libxml2
If you need to have libxml2 first in your PATH run:
  echo 'export PATH="/usr/local/opt/libxml2/bin:$PATH"' >> ~/.zshrc

For compilers to find libxml2 you may need to set:
  export LDFLAGS="-L/usr/local/opt/libxml2/lib"
  export CPPFLAGS="-I/usr/local/opt/libxml2/include"

For pkg-config to find libxml2 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/libxml2/lib/pkgconfig"
```
上記のechoとexportしたのちにnokogiriを入れて見ました。

# nokogiriのインストール
```
gem install nokogiri -- --use-system-libraries
```
上記コマンドを入れたところ無事にインストールできました。

```
Building native extensions with: '--use-system-libraries'
This could take a while...
Successfully installed nokogiri-1.10.2
Parsing documentation for nokogiri-1.10.2
Installing ri documentation for nokogiri-1.10.2
Done installing documentation for nokogiri after 8 seconds
1 gem installed
```
プログラミング学習記録56〜動画とエディタを行き来するのが疲れるからデュアルディスプレイにしたい〜

##今日やったこと
- Javaに触れる
- 動画教材とエディタを行き来するのが精神的に疲れるので、デュアルディスプレイの導入を検討する

今日は講義でJavaに触れました。

実行環境は用意されているものを使いました。
Cloud9のような感じです。

Javaに触れた感想としては、今の所はまだ入門段階なので、他の言語と大差ないなという印象ですね。
ただ、Rubyと比べると記述量が多い気がします。

あと、以前から思っていたことなのですが、動画を見ながらエディタにコードを打ち込んでいく作業をするときは２画面でやったほうがいいですね。

１画面でやろうとすると、画面を半分半分にして小さい画面で頑張るか、別のウィンドウで開いて切り替えながらやることになります。

これが意外と面倒になってきたので、デュアルディスプレイ（２画面）で作業していきたいと思います。
最初はお金がかかっちゃいますけど、その後の作業効率考えたら導入した方がいいです。

調べてみたらMacBookの場合はiPadもサブディスプレイに使えるそうなので、まずはiPadで試していきます。

iPadで画面の大きさが足りないようであれば、別にディスプレイを用意したいと思います。

ということで、明日からもプログラミング学習頑張ります。

おわり
お友達が On Line かチェックするスクリプト (LSL)

###注意事項
確認相手にブロックされていてもオンラインの確認が取れてしまいます。
BIG6 を守っておたのしんでください！


``` [OnLineChecker.LSL]
/*
 UUID が On line か Off line か判定する
 
 Username は SIM の記録から消えている可能性があるので
 Username を Request して SIM 以外から取得する。
 （ここで名前が出ないようなら退会しているのかもしれない）
*/


string uuid = "";
string user_name;
key name_query;

float gap = 15.0;

integer listen_edit_handle;
integer dlg_edit_channel;

open_input_uuid_dlg(key user)
{
    if(listen_edit_handle != 0)
    {
        llListenRemove(listen_edit_handle);
        listen_edit_handle = 0;
    }
    listen_edit_handle = llListen(dlg_edit_channel, "", NULL_KEY, "");
    
    string msg = "\nInput Avator UUID.\n\n" +
        "if u wanna stop this program.\npls input \"STOP\".\n\n";
                
    llTextBox(user, msg, dlg_edit_channel);    
}

default
{
    state_entry()
    {
        dlg_edit_channel = (integer)("0x" + (string)llGetKey());
        listen_edit_handle = llListen(dlg_edit_channel, "", NULL_KEY, "");
        
        llSetText("",<1,1,1>,1);
    }
    
    touch_start(integer param)
    {
        if(llDetectedKey(0) == llGetOwner())
        {
            integer face = llDetectedTouchFace(0);
            
            if(uuid != "" && face == 4)
            {
                llOwnerSay("Script found : " + 
                        "secondlife:///app/agent/" + (string)uuid + "/inspect");
            }
            else
            {
                open_input_uuid_dlg(llGetOwner());
            }
        }
    }
    
    listen( integer channel, string name, key id, string message )
    {
        if(llGetOwnerKey(id) == llGetOwner() && channel == dlg_edit_channel)
        {
            if(message == "STOP")
            {
                llSetTimerEvent(0);
                llSetText("",<1,1,1>,1);
                uuid = "";
            }
            else
            {
                uuid = message;
                
                if(uuid != "")
                {
                    name_query = llRequestUsername(uuid);
                    llSetTimerEvent(gap);
                }
            }
        }
    }
    
    timer()
    {
        llRequestAgentData( uuid, DATA_ONLINE );
    }

    dataserver(key req, string data)
    {
        if( name_query == req )
        {
            user_name = data;
            
            if(user_name != "")
            {
                llOwnerSay("Script found : " + 
                    "secondlife:///app/agent/" + (string)uuid + "/inspect");
            }
            else
            {
                llOwnerSay("Not Found...");
                llSetTimerEvent(0);
                llSetText("",<1,1,1>,1);
                uuid = "";
            }
        }
        else
        {
            integer check = (integer) data;
            
            string msg;
            if( check == 1 )
            {
                msg = user_name + "\nis online";
                llSetText(msg,<0,1,0>,1.0);
                //llOwnerSay(msg);
            }
            else
            {
                msg = user_name + "\nis offline";
                llSetText(msg,<1,0,0>,1.0);
                //llOwnerSay(msg);
            }
        }
    }
}
```
bashで拡張子を除いたファイル名を取得する

# 方法

長いこと `sed` と組み合わせて対処してましたが
`basename` コマンドだけでできることを知りました。

```bash
basename {パス} {拡張子}
```

```bash:例
$ basename /path/to/somewhere/foo.txt .txt
foo
```

# basename コマンド

## 基本


```:基本構文
basename string [suffix]
```
- `string` の先頭から最後に出現した `/` までを取り除く
- その結果の文字列が `suffix` で終わっていればその部分を取り除く

つまり拡張子に限らず次のような使い方が可能。

```bash
$ basename /path/to/somewhere/foo20190101.txt 20190101.txt
foo
```

## その他

```:オプション
-a : string を複数受け取る
-s : -a オプションを付けた場合の suffix 指定
```

複数指定できる場合の実用的な例が思いつかないですが、
上記のオプションを使ってたとえば次のようなことも可能。

```bash
$ basename -s "円" -a 200円 150円 300円
200
150
300
```

# 確認環境

macOS, Linux(Ubuntu) 標準の `basename` コマンド。
#python の datetime で明日の 時・分をランダムに生成する例

```py
>>> import datetime

>>> now = datetime.datetime.now()
>>> now
# datetime.datetime(2019, 4, 13, 18, 44, 57, 269002)

>>> rand_datetime_today = now.replace(hour=random.randint(1,23), minute=random.randint(1,59), second=0, microsecond=0)
>>> rand_datetime_today
# datetime.datetime(2019, 4, 13, 3, 8)

>>> rand_datetime_tomorrow = rand_datetime_today + datetime.timedelta(days=1)
>>> rand_datetime_tomorrow
# datetime.datetime(2019, 4, 14, 3, 8)

```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Windows10で機械学習用に Jupyter Lab 環境を、docker-composeで立ち上げ

Windows10で機械学習用に Jupyter Lab 環境を、docker-composeを使って立ち上げた時のメモ
※ Docker Desktopは入っている前提にしています
※ Windows10と書いていますが Docker をインストールしていれば、volumesを少し修正するだけでLinuxやMac環境でも動くはずです。

[jupyter/datascience-notebook](https://jupyter-docker-stacks.readthedocs.io/en/latest/)

のDockerイメージにはPython、Julia、Rのライブラリが入っています

---
# 機械学習用にJupyter Labの立ち上げ

docker-compose.yml

    version: '3'
    services:
      jupyter:
        image: jupyter/datascience-notebook:latest
        container_name: jupyterlab
        environment:
          TZ: "Asia/Tokyo"
          JUPYTER_ENABLE_LAB: "yes"
        ports:
          - "8888:8888"
        volumes:
          - Z:\docker\jupyter\data/:/home/jovyan/

コマンドプロンプトを立ち上げ

    docker-compose up

を実行

ブラウザで
http://localhost:8888
にアクセスし、コマンドプロンプトのログに出ていたtoken=の文字列を

    Password or token:

欄に入力しLog inボタン押下

Jupyter Labが立ち上がります

# 参考
https://jupyter-docker-stacks.readthedocs.io/en/latest/