OmniAICreator/Qiita-1.07M huggingface dataset:
VALGOL II マシーンを作る

META II の論文から VALGOL II コンパイラと行列式を求めるサンプルプログラムを打ち込んでコンパイルまで行った。

---
# でも…
VALGOL II 仮想マシンの仕様が想定外だったり、読んでもよくわからなかったりで完成しなかった。

「スタックの上から二番目のアドレス」っていうのはそこに入っているアドレス値のことなのか、スタックのその場所のアドレスのことなのか…。

---
# 余談

VALGOL I は放物線を描くプログラムなのだけど、

```
148： リスナーさん ：2018/12/21(金) 21:03:18
    rubyで円を描くのは
    簡単ですか？
```
---
##ってことで僕が書いたのがこれ。

```
y = -1.0

while y <= 1.0
  t = Math.asin(y)
  x = Math.cos(t)
  print_area = ' '*60
  [20 + (x*20).round, 20 - (x*20).round].each do |col|
    print_area[col] = '*'
  end↲
  puts print_area
  y += 0.1
end
```
---

出力

```
                    *
           *                 *
        *                       *
      *                           *
    *                               *
   *                                 *
  *                                   *
 *                                     *
*                                       *
*                                       *
*                                       *
*                                       *
*                                       *
 *                                     *
  *                                   *
   *                                 *
    *                               *
      *                           *
        *                       *
           *                 *
                    *
```

上と下にスキマが空いちゃってるね。

---
リスナーさんが書いたのがこれ↓

```
def print_circle(r)
  (-r..r).to_a.each do |x|
    (-r..r).to_a.each do |y|
      if x ** 2 + y ** 2 <= r ** 2
        print '()'
      else
        print '　'
      end
    end
    print "\n"
  end
end

print_circle(10)
```
---
出力↓

```
　　　　　　　　　　()　　　　　　　　　　
　　　　　　()()()()()()()()()　　　　　　
　　　　()()()()()()()()()()()()()　　　　
　　　()()()()()()()()()()()()()()()　　　
　　()()()()()()()()()()()()()()()()()　　
　　()()()()()()()()()()()()()()()()()　　
　()()()()()()()()()()()()()()()()()()()　
　()()()()()()()()()()()()()()()()()()()　
　()()()()()()()()()()()()()()()()()()()　
　()()()()()()()()()()()()()()()()()()()　
()()()()()()()()()()()()()()()()()()()()()
　()()()()()()()()()()()()()()()()()()()　
　()()()()()()()()()()()()()()()()()()()　
　()()()()()()()()()()()()()()()()()()()　
　()()()()()()()()()()()()()()()()()()()　
　　()()()()()()()()()()()()()()()()()　　
　　()()()()()()()()()()()()()()()()()　　
　　　()()()()()()()()()()()()()()()　　　
　　　　()()()()()()()()()()()()()　　　　
　　　　　　()()()()()()()()()　　　　　　
　　　　　　　　　　()
```
Packer で同じ名前のイメージを作るには

# Packer で同じ名前のイメージを作るには

今日は今までで一番最短記事です。。。
イメージ名を同じ名前にしたいことってありますよね？よね？
オートスケールとかで使う時とか、とか。

## やってみる

たった、これだけです。
※`sample.json` は適宜変更してください。

```
> ./packer build --force sample.json
～～～
==> googlecompute: Deleting previous image...
==> googlecompute: Creating image...
～～～
```

こんな感じで、前のイメージが削除された後に、新しいイメージが作成されます。
便利ですね。

## まとめ

以上です（短
Python で FPGA/Zybo Linux を立ち上げる

# Zybo Linux を立ち上げる
Zybo での Linux 環境は先人が作ってくれたうえで公開してくれてます。ありがとう。

https://github.com/ikwzm/FPGA-SoC-Linux

## なんとなく Linux をインストール
この辺を見ながら Linux をインストール
https://github.com/ikwzm/FPGA-SoC-Linux/blob/master/doc/install/zynq-zybo.md

## とりあえずそのまま立ち上げる
すると、もともとあった design_1_wrapper.bit が立ち上がります。4つの LED が点滅します。

## design_1_wrapper.bit を入れ替え
するとうまく LED0 だけが点滅します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/1e4f8211-286b-8455-b641-4000f29c06ff.png)

## あれ～～ Linux が立ち上がらない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/6a199209-a8ea-c6c7-925f-a25d998463e2.png)

う～ん。たぶん、期待している dts と違っているのでしょうか？ただ dts をみても特別に違うような感じはしませんでした。bitfile を元に戻すとうまくいきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/88d134c5-7655-7258-6ecb-47f3da6632a5.png)

単純にはうまくいきませんでした。

### これはどうやら UART の設定 (2019.3.29 追記)
これはどうやら UART の設定のようです。dts に 2つ UART を動作するように書いたのですが、これにより UART のデバイス番号がずれて、ちゃんと立ち上がっているのにも拘わらず、TeraTerm からは見れないという現象のようです。これを回避するには単純で dts の UART 順番を変えます。簡単!!

## Zynq の IP コアを追加
全く何もしない Zynq 用の processing_system7_0 を追加することにしました。よく見ると（見なくても）DDR とか FIXED_IO とかありますね。いままで気にも留めなかったのですが。でも Linux 動作時に fpga の入れ替えもできるので、なぜ、本質的にこれが必要かわかりません。そういえば、64bit の Zynq では PL の電源を off にすることができますから、本質的には PS と PL は切れているはず。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/bc58f266-750f-3146-3d56-8ad2ccbd3050.png)


## Linux たちあがる
ということで、Linux も立ち上がり、ほぼ、ARM 側と関係のない IP コアの世界を構築することが出来ました（意味あるかどうかは不明）。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/44635d08-5d65-faab-19b7-fbaeff7d2aeb.png)
PHP復習　(if else switch)

<h4>if文</h4>
条件が成り立つ場合、{}内の処理が実行されます。

```
$x=20;
if($x>10){
echo'$xは10より大きい';
}
//結果　$xは10より大きい
```

<h4>else文</h4>
ifと組み合わせてelseを使うと「もしも‥だったら、そうでなければ‥」と言った条件分岐ができます。
if文の条件が「false」であった場合、elseの中の処理が実行されます。

```
$x=20;
if($x==30){　　　　　　　　　⇨$x==30($xは30ではない)
echo'$xは30です';　　　　　　⇨処理は実行されない
}else{
echo"$xは30ではありません”;　⇨処理は実行される
//結果　$xは30ではありません
```

<h4>switch文</h4>
ifやelseによる分岐が多く複雑な場合、switch文で書き換えるとシンプルで読みやすいコードがかけます。
switch(式)の(式)がcaseと一致した時、そのブロックが実行されます。
caseのどれにも一致しなかった時、defaultのブロックが実行されます。(この文の入力忘れずに！)

switch文条件分岐

```
switch($coin){
case0:
echo"表”
break;
case1:
echo"裏”;
break;
default:
echo"エラー”
break;
}
```

caseブロックの最後にはbreak命令を指定する必要があります。
それがない場合、後ろに続くcaseブロックが実行されるため注意が必要です。
Python で FPGA/Lチカ(Zybo 編)

# Lチカ(Zybo編)
ネタがなくなってきたので Zybo でも Lチカをこころみることにします。

## Lチカ アゲイン(Python での記述)
Python のソースを掲げます。

```python:blink.py
from polyphony import testbench, module, is_worker_running
from polyphony.io import Port
from polyphony.timing import wait_value
from polyphony.typing import bit

@module
class Blink:
    def __init__(self, interval):
        self.led = Port(bit, 'out')
        self.interval = interval
        self.append_worker(self.main)

    def main(self):
        led_bit:bit = 1
        while is_worker_running():
            self.led(led_bit)
            led_bit = 1 - led_bit
            self._wait()

    def _wait(self):
        for i in range(self.interval // 2):
            pass


@testbench
def test(dut):
    v = 0
    for i in range(4):
        print("loop:", i)
        wait_value(1, dut.led)
        wait_value(0, dut.led)
    print("finished")

blink = Blink(125 * 1000 * 1000)
test(blink)
```

### Python でシミュレーション
Python で実行します。

```text:Pythonで実行
> python3 blink.py
loop: 0
loop: 1
loop: 2
loop: 3
finished
```
### Polyphony でコンパイル
コンパイルすると Blink_blink.v が出来ます。

```text:Polyphonyでコンパイル
> polyphony blink.py
> ls Blink_blink.v
Blink_blink.v
```

## Vivado で合成・実行
Zybo 用ですが ARM の部分は使いませんので簡単に作れます。
作業の詳細はこちらも参考にしてください。ほぼ同じです。
https://qiita.com/ryos36/items/0f757c674ef90a33ddf2

### Vivado のプロジェクト作成
XC7z010clg400-1 を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/25a6fb3a-459e-651a-b3f8-a8f6b43da1c5.png)

### デザインを追加してソースも追加
1. 空の design を作り
2. wrapper も設定し
3. Blink_blink.v も追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/a3055d5e-3434-3aab-191e-1b0beab5c3d7.png)

### Block_block.v を追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/3c42b74c-5906-c2ae-8f5e-b79a54832155.png)

make external でピンを生成します。名称は変えました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/26b50a07-ecf3-bd48-1d5b-2c9deaccc578.png)

### ピン情報を追加(xdc の追加)
ピン情報を追加します。

```tcl:zynq.xdc
## PL System Clock                                                                 
set_property -dict { PACKAGE_PIN L16   IOSTANDARD LVCMOS33 } [get_ports { clk }];  
create_clock -add -name sys_clk_pin -period 8.00 -waveform {0 4} [get_ports { clk }
                                                                                   
## LED                                                                             
set_property -dict { PACKAGE_PIN M14  IOSTANDARD LVCMOS33 } [get_ports { led0 }];  
                                                                                   
## Buttons                                                                         
set_property -dict { PACKAGE_PIN R18   IOSTANDARD LVCMOS33 } [get_ports { btn0 }]; 
```
これは回路図の赤で囲った部分から作ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/db6fea24-8866-a64a-73e7-f19701ed94f1.png)

### 合成して実行
合成した上で Zybo を JTAG で立ち上げて実行します。Lチカの完成です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/1e4f8211-286b-8455-b641-4000f29c06ff.png)
Arduinoで3Dプリンタや自作CNCで使われているステッピングモーター（TB6600 Stepper Motor Driver 使用）を動かしてみた

#【目的】3DプリンタやCNC自作キットでステッピングモーターによる１軸制御を行う
　3Dプリンタ・自作CNC用に安価なステッピングモーターによる１軸制御(ロボシリンダとか短軸ロボ）をArduinoで制御してみたい

#購入品
##ボールねじ　リニアCNCスライドストローク　100mmロングステージアクチュエーターステッパーモーター
https://www.amazon.co.jp/gp/product/B078S47HGK/ref=oh_aui_detailpage_o07_s00?ie=UTF8&psc=1&fbclid=IwAR0edN91hdomvQHZuwBX-p1VqNVQ-DvI9wpSIJjILyVF1jZE9YuPi2eZuMw
![ダウンロード.jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/8fb1f308-3d8c-b295-77dd-aa79339b6674.jpeg)
結構大きい。指挟んだら間違い無く怪我する

##Quimat 4A ステッピング モーター ドライバー コントローラー 9V-40V CNC単軸 2位相4位相(4/6/8線) QD07
https://www.amazon.co.jp/gp/product/B077VNWBQX/ref=oh_aui_detailpage_o04_s00?ie=UTF8&psc=1&fbclid=IwAR0f25dWO2wVuyJ1Sd5_10MRQ77kM5qHacdyHpOCp8LJJfP1KnKSBsyzoZc
ステッピングモーターを動かすためのドライバー

![ダウンロード (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/9d0f9483-cebb-4feb-4fb3-c86f5194a35b.jpeg)

あとは手持ちのArduino unoと9～40Vまでの外部電源(DCコンバーター）

![ダウンロード (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/3735132e-94c1-e67d-a6eb-a8e843460f05.jpeg)
![61j6nOzHSkL._SL1200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/9c66fda8-9c7a-d952-da32-8f1086140416.jpeg)



#配線とプログラム

以下を参照しました。

https://www.dfrobot.com/wiki/index.php/TB6600_Stepper_Motor_Driver_SKU:_DRI0043?fbclid=IwAR3Cv9nZvCh9VQTgtCymWM_IMSKoCboDplFvofytSut0wMGn5rzab3tUSm4
【配線】
![800px-DRI0043_Connection.png](https://qiita-image-store.s3.amazonaws.com/0/10836/d7b5b5b2-7029-c11b-09a1-57b3703b9601.png)


MicrosｐDriverのPUL+,DIR+,ENA+には全てArduinoの5Vを繋ぎます。
DIR-に0V,5Vのどっちを入れるかで、ステッピングモーターの回転の向きが変わります。
ENA-に5Vを与えれば、ステッピングモーターが動き、0Vを与えれば動きません。

PUL-に0V,5Vと一定間隔でポートをON/OFFしてパルスを入れることでステッピングモーターが動きます。


Microstep Driverの「High voltage」と書かれた端子はステッピングモーター駆動用です。
GNDとVCCにはステッピングモーターを駆動するためのAudinoとは別電源をつないでください。
GND(－：グランド)には0V,VCC(＋：コレクタ電圧)にはDC(直流)9-40Vまで接続可能です。
使用するステッピングモーターの仕様に合わせてください。
※GNDはArduinoのGNDとつながない方が吉です。デジタル系の電源とリレー・モーター駆動系の電源を完全に切り離す（アイソレーションする）のはノイズ対策の初歩です。
【プログラム】

```c:sample.c

int PUL=7; //define Pulse pin
int DIR=6; //define Direction pin
int ENA=5; //define Enable Pin
void setup() {
  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (ENA, OUTPUT);

}

void loop() {
  for (int i=0; i<6400; i++)    //Forward 5000 steps
  {
    digitalWrite(DIR,LOW);
    digitalWrite(ENA,HIGH);
    digitalWrite(PUL,HIGH);
    delayMicroseconds(50);
    digitalWrite(PUL,LOW);
    delayMicroseconds(50);
  }
  for (int i=0; i<6400; i++)   //Backward 5000 steps
  {
    digitalWrite(DIR,HIGH);
    digitalWrite(ENA,HIGH);
    digitalWrite(PUL,HIGH);
    delayMicroseconds(50);
    digitalWrite(PUL,LOW);
    delayMicroseconds(50);
  }
}

```


「Microstep Driver」のDip SWをS1=S2=S3=OFF,S4=S5=S6=ONにしたら動きました。使ってる電源がありあわせの物で電流を供給しきれなかったのかも知れません。



「TB6600 Stepper Motor Driver 」を動かすための資料が日本語だとあまり見つからなかったので、Qiitaに書いてみました。
[Node-RED]非同期で流れてきた別々のJSONを１つにまとめる

Node-RED Advent Calendar 2018の22日目の記事です。

非同期でやってきたJSONを１つにまとめる話をします。
「そんなの当たり前だろ」というツッコミが聞こえてきそうですが、個人的に地味に悩み、かつ、かなりシンプルに解決できたので記事にしました。誰かの何かの役に立てば幸いです。

#動機：別々のAPIの結果を集約したかった(Wio Node)
Wio NodeというGrove（刺すだけで使えるセンサ）を刺すだけで簡単にAPIを立てられるモジュールがあり、スイッチサイエンスにて買ってみました。
Wio Nodeについてはこちらの記事がとても参考になります。
[「Wio Node」で半田付けなしの電子工作！温度計作りでIoTはじめの一歩](https://dotstud.io/blog/seeed-wionode-hands-on/)
Wio Nodeがあれば半田付けは勿論、RaspberryPiもブレッドボードも不要です。おうちのルーターとスマホがあればスマホアプリで設定するだけでAPIが立てられてしまいます！

そこでWio Nodeに温湿度気圧センサとダストセンサをそれぞれ繋げて部屋の快適さを取得できるAPIを作ることにしました。(左に温湿度センサ、右にダストセンサを繋げました。）

これで家から遠隔でエアコンのスイッチを入れた時、今これでどれぐらい部屋があったまっているかを即座に確認できます。またDBに蓄積し未来予測をすれば季節の変わり目にひいてしまいがちな風邪も事前に予防できるかもしれません。
![106250.jpg](https://qiita-image-store.s3.amazonaws.com/0/149986/c11e09b1-c8e8-46ec-6099-703a3fde6c99.jpeg)


しかしながら、WioNodeにて全てのセンサ情報を取得するためには温度、湿度、気圧、高度、ダストそれぞれ別のAPI発行しなければなりません。
これを全部集めてきて１個のJSONにして返してくれないかな、と思ったのが発端です。

実際に集約しようとしたフローが以下です。
![1545410341712.jpg](https://qiita-image-store.s3.amazonaws.com/0/149986/1986c418-7770-b561-6b7a-9e240795d12b.jpeg)
JSONがバラバラに返ってくる…

#結論JOINノードでJSONを結合できた
「functionノードで待ち合わせてタイマーを作って…グローバル変数に書きながら溜まったらまとめて…など工夫しなければ…！！」と色々悩んでいたのですが、JOINノードの設定だけでシンプルに解決しました。
JOINノードは、配列などをSPLITノードで分割し、加工した上でJOINノードで戻す、といったことでよく用いられています。このJOINノードの設定を少し変えるだけでJSONの集約が簡単にできました。
![aaajoin.jpg](https://qiita-image-store.s3.amazonaws.com/0/149986/2daffdc6-2ca2-7a4f-0356-e90dd321d3ea.jpeg)
バラバラだったJSONが１つにまとまった

#設定画面
これがそのJOINノードの設定画面です。
![joinnode.jpg](https://qiita-image-store.s3.amazonaws.com/0/149986/74077395-7f5c-c148-7522-63fa7940e6b1.jpeg)
「Mode」がデフォルトでは「Automatic」になっています。SPLITノードと組み合わせる時はそのままで良いのですが、今回は「manual」に変更します。
また、「to Create」がデフォルトでは「a String」になっていますが、これを「a merged Object」に変更します。
「After a number of message parts」は組み合わせたいJSONの数（今回は５つのセンサ）、
「After a timeout following a first message」はJOINを諦める時間を設定します。（Wio Nodeではそんなに待たされることはないですが念のため5秒ぐらいにしておきました。）

これにより、ひとつのJSONにまとめられたので、例えば不快指数（温度と湿度から求められる数値）などセンサ同士の計算もうしろのノードで即座にできました。また、このJSONをDBに入れれば検索取出しも楽になります。

今回の例はWioNodeのサーバから取った複数センサの集約でしたが、BLEやGPIO側で取ったセンサ値の集約や、気象情報など異なる外部のAPIの集約にも使えそうです。
【プログラマのためのSQL 4章】ロケータと特別な数

# はじめに
ロケータとは、そのデータが物理ストレージ上のどこにあるのかを示す機能、値のこと。
各DB製品ごとに独自仕様のロケータを持っている。

SQLではキーを利用するが論理的なものなので、本来は物理的ストレージとは無縁のものである。
物理的なロケータをキーやサロゲートキーのように扱うことは、RDBの思想から外れる。


# ROWID
OracleDB等に存在するロケータ。
HDDなどのディスクにおける行の物理アドレスを示す。
HDDヘッドはダイレクトに物理アドレスにアクセスできるので、
RoWIDを指定する検索は、アクセスパスとしては最速である。

しかし、これを扱うということは、行がストレージ上に物理的に並ぶことを前提にしているので、
ハッシュや分散データベースのような技術との相性は悪い。


# IDENTITY
データが追加される度に一意となる値を自動生成する。
その性質上、主キー制約やユニーク制約をつける。

IDENTITY列やシーケンスなどの自動インクリメントの機能は、
物理的なロケータをユーザに意識させるため、RDBの方針に反している。

※リレーショナルデータベースが満たすべき12の法則(コッドの12の法則)から抜粋
>データベースを扱うアプリケーションは、データの物理的レベルにおける表現形式に依存せず、物理的変更があってもアプリケーションは影響を受けない

### IDENTITY列の問題

その値が妥当かどうかを確認する手段がない。

SQLServerなどではIDENTITY列は1テーブルに1つしか作れない。

IDENTITYを持つテーブルに対して、同じINSERT文を複数回実行すると結果が毎回異なる。(RDBMSとしては、全ての行について全ての属性が同じ値なら結果は同じになるはず)


# 一意を示す識別子
データベース全体で一意となる識別子を生成する方法もいくつかある。

### GUID
- Microsoftが提唱している
- 物理ロケータやUTC時間、ネットワークアドレスなどを組み合わせて生成する
- ソートできる順序性をもたない
- 集計関数を含むクエリに使えない
- 製品依存のものが多いので、移行が難しい


### UUID
- オープンソースコミュニティが提唱している
- 分散システムでも一意に識別するために生まれた
- いくつもバージョンがある
- 第5世代のUUIDはURL,FQDN,オブジェクト識別子などからSHA-1ハッシュ関数によって生成される


# その他
### 重複行について
関係データベースの生みの親、エドガー・F・コッドとしては、
関係データベースにおいて重複行は許さない方針だったようです。
集合論的な考えに基づくと重複行は発生し得ないですね。

しかし、標準SQLとしては重複行を許しています。
「テーブルはエンティティ、クラス、エンティティの関係を表すこともできる」というオブジェクト指向なデータの見方をしているからで、非正規化されたデータをデータベースで扱えるようにするために許容しているようです。


### シーケンス生成関数
後半は、どのように一意な値を生成するかという話でした。
数列、素数、乱数を使って値を生成するよ、という話が載っています。(割愛)

小難しい話だったので読み飛ばしました。

# 最後に
この章のポイントは
「物理ロケータはリレーショナルデータベース本来の方針に反するものなので、安易に採用するべきではない」
ということに尽きると思います。

メリットとデメリットを押さえた上で使いたいところですね。
Amazon Linux WorkSpaces で Snappy をセットアップする

Amazon WorkSpaces (Amazon Linux 2) で Snappy を使いたかったのでセットアップしてみました。備忘録を残しておきます。

## ビルドとインストール

手頃なビルド済みのパッケージが見つかりませんでした:frowning2:

が、幸いソースコードレベルで Amazon Linux 2 用のパッケージングがサポートされていたので、自分でビルドしました。

ビルドの説明はややこしいのでインストールの手順だけ書いておきます。ご自分でビルドしたい方は参考までに[こちらのリポジトリ](https://github.com/albuild/snap)をどうぞ。

1. 次のパッケージをダウンロード

    \* [snap-confine](https://github.com/albuild/snap/releases/download/v0.1.0/snap-confine-2.36.3-0.amzn2.x86_64.rpm)
    \* [snapd](https://github.com/albuild/snap/releases/download/v0.1.0/snapd-2.36.3-0.amzn2.x86_64.rpm)

1. パッケージをインストール

    ```
    sudo yum install -y snap-confine-2.36.3-0.amzn2.x86_64.rpm snapd-2.36.3-0.amzn2.x86_64.rpm
    ```

1. snapd.socket を有効化

    ```
    sudo systemctl enable --now snapd.socket
    ```

1. ログイン & ログアウト

## テスト

試しに Slack をインストールしてみます。

```
snap install slack --classic
```

出力:

```
slack 3.3.3 from Slack✓ installed
```

できました:tada:

## セキュリティについて

Snappy の実装は LSM (Linux Secure Modules) として AppArmor が前提になっているので、Amazon Linux のような LSM が 非 AppArmor のディストリビューションではサンドボックスが無効になるようです。
2018年Clova躍進その軌跡

## はじめに
こんにちは。
この投稿は [LINEBot&Clova Advent Calendar 2018](https://qiita.com/advent-calendar/2018/linebot)の22日目の投稿です。

最近気になるデータを拝見することがあり、そこから本記事を書くに至っています。
その気になるデータとは下記。。

[![気になるデータ](https://qiita-image-store.s3.amazonaws.com/0/121860/8d617b99-c203-f8c2-a11b-ef752039890c.png)](https://robotstart.info/2018/12/12/deloitte-tohmatsu-consulting-global-mobile-consumer-survey-2018.html)

https://robotstart.info/2018/12/12/deloitte-tohmatsu-consulting-global-mobile-consumer-survey-2018.html

ご覧いただけましたでしょうか。こちらの結果ではClovaが国内市場で１位の座に輝いています。
正直、最初見た時は意外な結果と思ってしまいました。
ですが、今年の経緯を考えると納得のいく結果と言えるのではないかと考え直した次第です。
ということで今年を少し振り返ってみましょう。

## 2018年前半の状況
GoogleHomeやAmazonEchoが日本でも手に入るようになり、TVでもこの２社のスマートスピーカーのCMがガンガン流れていた時期です。
正直、この時点ではClovaの存在感は上記のデバイスと比べると薄かったのではないかと思います。
また、自分自身もこの時期はClova系のデバイスを１つも所持していませんでした。
この状況が2018年後半になると一変していきます。

## 2018年後半の状況
おおよそですが、2018年の後半あたりから一気にClovaが盛り返した印象です。
要因はたくさんあると思いますが、下記あたりがインパクトが大きかったのではないかと思っています。（個人の意見です）

* 乃木坂46とのコラボ
    * https://linecorp.com/ja/pr/news/ja/2018/2273
* Clovaスキルストアオープン
    * http://clova-blog.line.me/ja/archives/10982355.html
* LINE BOOT AWARD 2018
    * https://www.line-community.me/awards/

様々なキャンペーンが打たれていたのも記憶に新しいです。

また、特に「LINE BOOT AWARD 2018」に向けたイベントの数が
![image.png](https://qiita-image-store.s3.amazonaws.com/0/121860/c1db45bc-5bc6-622e-c155-446802a51cff.png)
**100超え!？** 桁違いのイベント数です。
そういえば、ほぼ毎日、全国各地でイベントが開催されていました。中々できることではありません。
今思い返えすと熱量が圧倒的でしたね。こういった日々の積み重ねが強豪２社にシェア率で勝さった要因ではないでしょうか。

## まとめ
いかがでしたでしょうか？ 振り返ってみるとClova躍進、納得のいく結果になっているのではないでしょうか。
また、その裏には数多くの関係者の尽力があったことが伺いしれますね。
こういった方々の熱量が最終的なClovaのシェア率の高さにつながったのだと思います。
来年もClova周辺は様々なドラマが待ち受けていそうです。そんな未来が今から楽しみですね。
（ちなみにClovaTシャツも良かったですが、Clova法被とかちょっと欲しいかもしれません (/ω・＼)ﾁﾗｯ）
居眠りしたいときに使えるワンライナー

##はじめに
[今すぐalias登録すべきワンライナー by ゆめみ①-2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/yumemi01_one-liner02) の21日目の記事です

みなさんも、仕事中どうしても居眠りしたくなることってありますよね。
そんなときに使ってください。
※これはネタです。

##これを考えた経緯
・居眠りしてても、どうにか仕事してるようにみせたい

##作ったワンライナー
まるで入力しているかのようにコマンドの結果を表示するワンライナー

```
for i in $(seq 1 $(ifconfig -a | wc -c)) ; do clear ; ifconfig -a | head -c $i ; sleep 0.05 ; done
```
![inemuri.gif](https://qiita-image-store.s3.amazonaws.com/0/257686/79cf169a-01a8-9bca-43bb-1713f277e827.gif)

##試行錯誤したこと
より作業している感を出すことを考えました。
`ls`や`man`、`help`を試していく中で、`ifconfig`にたどり着きました。
MacだけでなくLinuxでも使える汎用性の高さ、さらに絶妙なインデントが仕事してる感が増します。

##おまけ
より簡潔に書くためにOSコマンドのみでやっていたが、実際のコードを`cat`するとさらによくなります。

以下のようなファイルを所定の場所に配置。

```inemuri.html
<!DOCTYPE html>
<html lang="ja">
	<head>
		<title>inemuri</title>
	</head>
	<body>
		<p>Hello World!</p>
	</body>
</html>
```
#
###ワンライナー
```
for i in $(seq 1 $(cat inemuri.html | wc -c)) ; do clear ; cat inemuri.html | head -c $i ; sleep 0.05 ; done
```

##おわりに
でもやっぱり仕事中は居眠りしないのが一番ですね。

それにしても、実行中ターミナルがすごいチカチカしたから新しいMacが欲しいなと思った今日この頃。
Jshellでゆるーく遊んでみた

## 概要
- この記事ではJshellの使い方を簡単に説明していきます

## 背景
- 先日のJJUG　CCCに参加したこと
- そこできしださん（@nowokay さん）がJshellでJava11の話をしてたこと

##対象
- Jshell初心者の方
- Java使ってるめんどくさがりな方

## 用意したもの
- macのターミナルだけ
- dockerが入ってる前提です

## 環境構築

- 下記コマンドを叩くだけ

```terminal
docker run -it openjdk:11 jshell
```

そうすると・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245191/46f1d464-0d2b-ba5d-a616-e73a3ae7e0b2.png)

こんな感じでもう使えます

## とりあえず遊んでみる

```
jshell> String hoge = "hoge"
hoge ==> "hoge"
```

## /varsを叩く

- 自分が作った変数を教えてくれます

```
jshell> /vars
|    String hoge = "hoge"
|    List<String> list = []
|    String test = "test"
```

## /importsを叩く

- いまimportされてるやつを教えてくれます

```
jshell> /imports
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.nio.file.*
|    import java.util.*
|    import java.util.concurrent.*
|    import java.util.function.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.util.stream.*
```

## 新たにimportしたい時

- 直でimportを叩く

```
jshell> import java.util.Scanner
```
さすがにこれはイケてないので、、、

- 使うタイミングでShift + tabを同時押しして離した直後に i を押す

```
jshell> ZonedDateTime
0: Do nothing
1: import: java.time.ZonedDateTime
Choice:
Imported: java.time.ZonedDateTime
```
そうするとこんな感じでimportしてくれます

```
jshell> ZonedDateTime now = ZonedDateTime.now()
now ==> 2018-12-21T16:14:20.037591Z[Etc/UTC]
```

## 補完

- これはターミナルと同じでtabキー押せばよしなに補完を出してくれます

```
jshell> var lsit = List.
class     copyOf(   of(
```
こんな感じでIDEで補完してもらうタイミングと同じようなタイミング（ようするに.打った後）にtab押せば使えます

## 改行

- こんなリストを作ったとして、

```
jshell> var list = List.of("hoge","fuga","piyo")
list ==> [hoge, fuga, piyo]
```
- こいつに対して、なんか処理をつらつら書いていて改行しようと思って適当なところで改行すると実行されてしまいます。

```
jshell> var result = list.stream().filter(word -> word.startsWith("h"))
result ==> java.util.stream.ReferencePipeline$2@31610302
```

- それはさすがに悲しいので、、、

```
jshell> var result = list.stream().filter(word -> word.startsWith("h")
   ...>  ).collect(Collectors.toList())
result ==> [hoge]

```
こんな感じで（）を開いた状態、もしくは.を前の行においたままreturnすると改行できます

## /exit

- 意外と知られてないかもですが、これで抜けられます

```
jshell> /exit
|  Goodbye
```

## /help

- あと困ったらhelpを参考にしてみてください

## 感想

- Jshell結構楽しい
- IDEの補完に頼ってる部分が多くてimportのクラスとか気にすることが少なかったのでいいきっかけになりそう
- お気づきかもしれないですが、途中でJava11のコードをぶち込んでたのですが、ご覧の通りわざわざOracleからJDKをインストールしなくても、気軽にターミナル上でJava11を試せるのでとても良い
- Sampleプロジェクトを作るまでもないような確認したいこと（時間の変換とか）を試す場としてはJshellでという選択肢はかなりありなのかなと思いました

## まとめ

- とりあえず１時間くらいで遊んでみただけなので満喫できてはないので、オススメの利用シーンとか利用コマンドがあったらおしえていただきたいです

## 参考

きしださんのQiitaの記事を参考にさせていただきました。
[Learn JDK11 with JShell (2018/12/15 JJUG CCC 2018 Fall)](https://qiita.com/nowokay/items/80e8ccd50f6749846dd6)
サマーにウォーズをするための一歩を踏み出す

## はじめに
この記事は[Life is Tech! Tokai Mentors Advent Calendar 2018](https://qiita.com/advent-calendar/2018/lit-tokai-mentors)の22日目の記事です。

クリスマスまであと残すところ3日となりましたね。みなさんクリスマスの予定はありますか？

今回は、**目先のクリスマスに囚われるのではなく、来年の夏をエンジョイするための技術を手に入れるための記事**です。
(アドベントカレンダーの趣旨をガン無視しているようですがご容赦ください...)

## 夏をエンジョイするには？
夏といえば**恋と絆とプログラミング**ですよね！！

そんな魅力がすべて詰まった神映画が、みなさんご存知スタジオ地図による**[サマーウォーズ](http://s-wars.jp/)**です！

![summer.jpg](https://qiita-image-store.s3.amazonaws.com/0/163599/5b21d9ac-f632-9454-2064-e4e78e5b444e.jpeg)

サマーウォーズは、

>ある日、佐久間と共にOZの保守点検のバイトをしていた高校2年生の健二は、憧れの先輩である夏希から、一緒に夏希の実家に行くという「バイト」に誘われる。実家には夏希の曽祖母である栄おばあちゃんの90歳の誕生日を祝うために、26人の親族が一堂に集まり、健二はひょんなことから栄のために「夏希の婚約者のふり」をすることになった。(Wikipedia-サマーウォーズ)

というところから物語が始まっていきます。

サマーウォーズのように夏休みに田舎に行って大家族の絆を感じたり、天才プログラマーの侘助に会ったり、**夏希先輩と恋がしたかった**と思っている読者の皆様はきっと多いはず。

そのためにまず第一段階として健二のような数学力を身に着ける...と言いたいところですが流石に数学オリンピックレベルまで登りつめるのは容易ではないでしょう。

幸いにも我々はプログラミングという別の力を持っていますので、存分にその力を発揮しましょう。

今回は健二が冒頭で **夏希先輩の誕生日から曜日を計算して見せたシーン**を再現することでホットな夏を過ごすための第一歩を踏み出したいと思います。

## 日付から何曜日かを計算する
### datetimeを使う方法
python3にはdatetimeというモジュールがあるので、それを使ってやれば一発で曜日を求めることができます。

```.py
# coding:utf-8
import sys
from datetime import *
from time import *


def main():
    print('先輩の誕生日いつですか?')
    year = input('年:')
    month = input('月:')
    day = input('日:')

    week = ['月','火','水','木','金','土','日']

    input_date = year + '/' + month + '/' + day
    date = datetime.strptime(input_date,'%Y/%m/%d')
    print(week[date.weekday()]+'曜日です。')
    print(str(year) +'年'+str(month) + '月'+ str(day) +'日は'+ str(week[date.weekday()])+'曜日でした。')


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

実行結果は次のようになり、映画のあのシーンも再現できてしまいます。

とはいいつつも本当に会っているのかが分かりにくいので今日の日付もテストしておきました。
<img width="255" alt="スクリーンショット 2018-12-22 0.59.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/163599/5eaef10d-70d5-0ab1-129a-d69d569d422c.png">

### モジュロ計算を行う方法（ツェラーの公式）
モジュールを使えば簡単に曜日が求められるのは分かりましたが、あまりにも簡単すぎてなんだか味気ないですね。

ということで入力された日付から曜日を計算で求めるための**[ツェラーの公式](https://ja.wikipedia.org/wiki/ツェラーの公式)**を使ってみます。

作中で健二が使ったのもおそらくこの方法です。

公式の内容が気になる方は上記リンクから確認してください。

```.py
# coding:utf-8
from decimal import *

if __name__ == '__main__':
    print('先輩の誕生日いつですか?')
    year = int(input('年:'))
    month = int(input('月:'))
    day = int(input('日:'))

    if month <= 2:
        month = month + 12
    
    year = str(year - 1)
    C = Decimal(int(year[0:2]))
    Y = Decimal(int(year)%100)
    F = day + (26*(month+1)/10) + int(Y) + (int(Y)/4) - 2*int(C) + (int(C)/4)
    X = (F % 7)
    week = ['土','日','月','火','水','木','金']
    print(week[int(X)]+'曜日です')
    print(str(year) +'年'+str(month) + '月'+ str(day) +'日は'+ str(week[int(X)])+'曜日でした。')
```

<img width="263" alt="スクリーンショット 2018-12-22 1.19.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/163599/d1de1838-226a-a9d6-22d5-1d2c401adddc.png">
こちらも結果は合っているようです。

結果は同じですがコードを見るとツェラーの公式を使った方がなんとなくいい感じですね。

## まとめ
僕も高校生の時に夏希先輩と知り合いたかったなぁ...。

**というか今すぐ侘助になりたいです。いろんな意味で。**

##最後まで読んでくださったそこのあなた
いいねを

**「よろしくお願いしまぁぁぁぁぁぁぁぁぁぁぁぁぁす！！！！！！」**
![yorosiku.jpg](https://qiita-image-store.s3.amazonaws.com/0/163599/cb51909e-e031-ec05-d4f2-3082eb92e6f9.jpeg)
TwitterのAPI申請が3日間で簡単に通ったコツ

#はじめに
ここに書くのはAPIを取るコツです。
このあと出てくるAPIの取得方法についてのQiitaと併用して使うことで効果が期待できるものです。
あと最近APIをとるのが趣味になりつつあります。
#背景
地震の時にamazon echoに緊急地震速報をしてほしい
↓
Twitterのbotから情報を取得しよう
↓
じゃあAPI取得しとくか
#TwitterのAPIをとる手順
僕はここのサイトを参考にしました
https://qiita.com/kngsym2018/items/2524d21455aac111cdee
#つまずくポイント
##①300ワード英作文
みんなここでつまづきます。まずここでAPIを使って何をするかなどを書くのですが、だいたいこのあとメールで「もっと詳しく教えて！教えなきゃAPIダメだよ！」って来るので割と今回は適当でも大丈夫です。<img width="814" alt="スクリーンショット 2018-12-22 0.55.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/263501/3f520201-5dab-3b0d-05ed-4074689c6eea.png">
##②ダメだよメール
Twitterからこんなメールが届きます。
<img width="835" alt="スクリーンショット 2018-12-22 0.59.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/263501/2123686d-c004-5e48-1c4a-fc0b777ed10e.png">
ざっくり言うと先ほど言った通り「もっと詳しいこと教えて！」って書いてあります。
メールの内容はちゃんと読むと
①メインの目的
②分析の方法
③コンテンツの共有
④製品やサービスの公開
を教えてくれって書いてあります（英訳がテキトーなのは許して
#返信する
ここで返信する**コツは長く書かない**ことです
これが僕の返信の概要です
質問別に書いていくと
①スマートホームが作りたい
②分析はしない
③共有(involve)しない
④製品にはしない
読めば分かる通りほとんど「しない(I won't do it.)」です
実際の返信がこちら
<img width="851" alt="スクリーンショット 2018-12-22 1.04.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/263501/8b402abe-ce31-4d23-83b6-6491e6a49b22.png">
まあご覧の通り中学生以下のガバガバEnglishです
#かかった時間
2018/12/12に申請
同日にTwitterから返信
同日に僕が返信
12/1４にAPI取得
<img width="887" alt="スクリーンショット 2018-12-22 1.17.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/263501/d6d31df2-88cc-f250-c3d6-98749038f662.png">
#最後に
ネットでTwitterのAPIについて調べると「APIとれないー！」書いてあってビックリしました。
多分みなさん結構長文書いてるんだと思うんですが、取得するだけなら割とシンプルな目的とかにするといいと思います。あれこれ書くとやりとり長くなっちゃうんで。
あと今回僕はTwitterからの返信が非常に早くて助かりました。時期ですかね。
あと英訳や英文が間違ってたりしてすいません...何卒温かい目で見ていただけると幸いです...
#追記
このあともう一個のアカウントでこの戦法でAPI申請してみたら1日で通りました↓
<img width="304" alt="スクリーンショット 2018-12-23 0.19.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/263501/95e14e6c-9c9b-a04b-52a0-0c2cac151652.png">

あと文化祭の企画のアカウントの返信の自動化をするためにtwitter @tofu_talkのAPIも申請しました。()
2019/7/14)
このときも同様に最初に応募フォームから書いたものはリジェクトされてメールでの返信に答えて通しました。
ただこの時はメールに返信してから5分ほどでメールが帰ってきてAPIが取得できました。最近APIの申請フォームも少し変わって審査の時間もめちゃくちゃ早くなりました。まあそれでも基本は応募フォームはほどほどにちゃんと書いてメールの返信時にしっかり書くという感じが最善手ではないでしょうか。
日本語のmanページをプレビューする

<img width="483" alt="スクリーンショット 2018-12-22 1.11.47.b.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/0b57d2b1-5e4d-a4d9-e665-ae23fb34c45d.png">
[OpenSSH 日本語マニュアルページ](https://euske.github.io/openssh-jman/)を読んでいたら、HTMLでの表示で一部改行がおかしかったので、ローカルでgroffで整形した状態のものを確認したくなりました。
manコマンドで見ようと思うと、適切な場所に配置しないと`JNROFF`が呼ばれないみたいなので、直接`groff`を起動してみることにしました。

# groffのインストール

- macOSにはいっているgroffはめちゃくちゃ古いのでhomebrewでgroffをいれます

```shell-session
$ brew install groff
```

# 整形して表示する

```shell-session
$ git clone git@github.com:euske/openssh-jman.git
$ cd openssh-jman
$ cat ssh.1 | /usr/local/bin/groff -Dutf8 -Tutf8 -mandoc -mja -E |less -isr
```

<img width="470" alt="スクリーンショット 2018-12-22 1.08.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/8fa1b4bd-5b8d-82f4-d434-b11d376accf0.png">

ちゃんと改行されてるので、roff自体には問題がないようです。（roffを書いたことがないので本当に問題がないのかはよくわからない）

# 参考

- https://qiita.com/yu-ichiro/items/ea9c672e2d7488416db9
- https://qiita.com/fuwamaki/items/fbe7483444261e2425fe
Railsチュートリアル・第3章のまとめ

- 新しいRailsアプリケーションをゼロから作成したのはこれで3度目。今回も必要なgemのインストール、リモートリポジトリへのプッシュ、production環境まで行った
- コントローラを新規作成するためのrailsコマンドは `rails generate controller ControllerName アクション名 (省略可)` 。
- 新しいルーティングは `config/routes.rb` ファイルで定義する
- Railsのビューでは、静的HTMLの他にERB (埋め込みRuby: Embedded RuBy) が使える
- **常に自動化テストを使って新機能開発を進める**ことで、自信を持ってリファクタリングできるようになり、回帰バグも素早くキャッチできるようになる
- テスト駆動開発では**「red ・ green ・REFACTOR」**サイクルを繰り返す
- **Railsのレイアウトでは、アプリケーションのページの共通部分をテンプレートに置くことでコードの重複を解決することができる**
キャンディちゃんに叱られる！～どうして投票ディスクは奇数個がいいの？～

このエントリは [Oracle Database or GoldenGate Advent Calendar 2018 ](https://adventar.org/calendars/3525#list-2018-12-22)の Day 22 の記事です:relaxed:
お手柔らかに。

ねー、ねー、岡村ぁ、どうして投票ディスクは奇数個がいいの？
<img width="175" alt="キャプチャ003_.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/261711/b6353ab0-2815-e656-0995-7b7c5d90517d.png">

<img width="301" alt="キャプチャ002_.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/261711/6874fc4b-883c-a8a4-4eae-1497be649ab0.png">


※過半数以上の Voting Disk で障害が発生すると、スプリット・ブレイン時に正常な生存ノードの選別ができないため、
すべてのノードがダウンします。そのため、想定しているディスク障害に耐えうる Voting Disk の配置や冗長性を選択。




> ＊今年を代表するテレビ番組に[チコちゃんに叱られる!](http://www4.nhk.or.jp/chikochan/)がありますね。
そんな流れでボーっと生きてたら、見落としがちなOracle Database に関する知識をまとめてみました
＊キャンディちゃんは、こちらも今年ブレイクした[自分ツッコミくま](https://www.instagram.com/ngntrtr11/?hl=ja)をもとにキャラデザインしてみました。自分ツッコミくまが好きすぎてつらい
メモ：「３０日でできる！OS自作入門 」6日目

## 分割コンパイルと割り込み処理

1) ソース・ファイルの分割 bootpack.c を graphic.c, dsctbl.c (IDTとか), bootpack.c に分ける。
- Makefile の修正が大変ｗ
- Headerファイル未導入なのでコードの量は減てない

2) Makefileのワイルドカード利用方法

```
%.gas : %.c Makefile
	$(CC1) -o $*.gas $*.c
```

3) やっとヘッダファイルが入る
アセンブリの宣言もCの宣言も同じ .h ファイルに出来るのはいいなぁ

4) GDT/IDTの詳細
- セグメントディスクリプタは ８ バイトの構造体
- セグメントの大きさ、番地と属性がある
- セグメントの番地の話
    - base は ４バイト、 lower 2 バイト、mid 1 バイト、high 1バイトで分断されている。なぜかは歴史的な 80286, 80386の互換性
- リミットは 20bit のみ(1M)、Gbit(Granularity 粒度)をセットすることによってバイト単位ではなくページ単位になる、１ページ４KB
    - limit_low に 16 bit、limit_highに 4bit と 属性 4bit が混ざってる
- 属性は 12 bit
    - xxxx0000xxxxxxxx, 0000 は limit_high の一部, 最初の xxxx は　GD00, GbitとDは３２bitか16かのモード(32bit は 1)
    - 下の８bitの属性、0: 未使用、 0x92: システムRW、0x9a: システムRX, 0xf2: アプリケーションRW, 0xfa: アプリケーションRX
- ring0（システム）, ring3（アプリケーション） の話

めちゃ、勉強になった

5) マウスの割り込みのため、PIC初期化 (Programmable Interrupt controller)
- PIC Master と PIC Slave IRQ 8 個ずつもっていて、SlaveはMasterのIRQ 2経由
- PIC は 8bit のレジスタ
- IMR Interrupt Mask Register
- ICW Initial Control Word、１から４まである。４バイト
    - ICW3がMaster/Slave設定、Masterの方は 8bit で設定する 00000100,Slaveの場合はMasterの何番目かを設定する、つまり ２
- 0 から 0x1f は IRQ に使えない　(別の用途、OSに通報するために使われてる）
    - 使うのは 0x20 ~ 0x2f になる

PIC初期化のコードで問題なく動くことを確認

6) 割り込みハンドラ
- マルスは　IRQ 12,Keyboardは　１, INT 0x2c と INT 0x21
- 割り込みハンドラは IRETD を利用していて、C 言語にないのでアセンブリで書くこと
- FIFO, FILOの話
- PUSH EAX は　ADD ESP, -4　と MOV [SS:ESP], EAX
- POP EAX は MOV EAX, [SS:ESP] と ADD ESP, 4
- PUSHAD は 8 レジスタ相当 (EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI)を PUSH する
- 書いた関数を idt + 0x21 と　０ｘ２ｃ にそれぞれセット、セグメント番号の下位 3 bit は別の意味があるから 2 << 3 して使う
- STI をセット、CPUが割り込みを受けるようになる

なんと、ここで `can't link _inthandler21` のエラーを自力でMakefile修正でできなかったので sandai/30nichideosjisaku さんの Makefile 使うようにした。超楽ｗ

成果としては、キーボード押すと、反応して文字列が表示される、マウスはまだ

![スクリーンショット 2018-12-22 1.02.44.png](https://qiita-image-store.s3.amazonaws.com/0/109145/83645de2-f3a0-412e-fd44-d1f59ee2792a.png)

以上、３連休にもっとやっていきたい！
shell scriptとpythonで特定のファイル名を一括でリネームする方法

# 目的
ある特定の拡張子をもつファイルを一括でリネームしたい。
特にファイル名に「(」や「 」や「-」が入っているものを扱うときにエスケープせずに行いたい


# ShellScript
ディレクトリ以下にあるファイル一覧を```find -name```で抽出してそれをパイプしてreadで出力をfile読ませてwhileで終わるまでループさせる  
リネーム処理の際は、ファイルパスからファイル名とディレクトリ名を分離してファイル名のみ変更する
ディレクトリ名を抽出するにはパターンマッチを用いて、「/」より後ろの部分を削除する```{f%/*}```を用いる。ファイル名は```basename```を使って抽出してみた。


```sh  

find ~/Documents/target -name "*.foo" | while read file
do
    echo ${file}
    dir_name="${file%/*}"
    file_name=$(basename ${file})
    echo ${dir_name}
    echo ${file_name}
done

``` 
## その他のパターンマッチ
https://qiita.com/mriho/items/b30b3a33e8d2e25e94a8
さんを参照しました。　

|   スクリプト    |動作 　               　  |
|:-------------------|--------------------------------------------------------------------:|
| ${変数名#パターン}  | 前方一致での削除(パターンにマッチした最初より前の部分を削除する)               |
| ${変数名##パターン} | 前方一致での削除(パターンにマッチした最後より前の部分を削除する)               |
| ${変数名%パターン}  | 後方一致での削除(パターンにマッチした最初より後ろの部分を削除する)    |
| ${変数名%%パターン} | 後方一致での削除(パターンにマッチした最後より後ろの部分を削除する)    |
| ${変数名/置換前文字列/置換後文字列} |   文字列置換(最初に一致したもののみ)  |
| ${変数名//置換前文字列/置換後文字列} |  文字列置換(一致したものすべて)      |

# Python  
globを用いてファイルのリストを取得してリネームする
Python3.5以降

```py
import os 
import glob

list=glob.glob("/User/myname/Documents/target/**.foo", recursive=True)
for path in list
    before_name=os.path.basename(path)
    dir_name=os.path.dirname(path)
    after_name=before_name.replace(" ",r"¥ ")
    os.rename("{0}/{1}".format(dir_name,before_name),"{0}/{1}".format(dir_name,after_name))
```
subprocessを使ってリネームする方法もあるがShellScriptをpython内に記述することになるので割愛する
ScalaからJavaに戻って恋しくなった機能6選

# はじめに
2年ほどScalaをメインに仕事をしていたのですが、色々な諸事情により数年ぶりにJavaで開発中なのですが、その中でScalaが恋しくなった機能をまとめていきたいと思います。

Scalaは `Scala 2.12.x` 、Javaは `Java 8` を使って開発しています。
では早速いきます。(思いついた順なので、順番に特に意味はありません)

# 型推論
Scalaを書いていた時は外部に公開しない変数やメソッドの型は省略していましたが、Javaさんは絶対に許してくれません。
最初は書くリズムが全然つかめませんでした。
Java 10からは一定のルール(?)の中では省略できるようになっているんですね。
JavaはJava 7から時が止まっていたので全然知りませんでした。

# ifなどで値を返す
Javaに戻ってとってもありがたみを感じました。
Javaには3項演算子がありますが、私が携わっていたプロジェクトではだいたい規約で禁止されていました。

Scalaだとこんな感じで書いてたんですが

```scala
val mode = if ( 条件式 ) "xxx" else "yyy"
```

Javaだと値を返せないので

```java
String mode;
if ( 条件式 ) {
  mode = "xxx";
} else {
  mode = "yyy";
}
```

こんな感じでしょうか？
昔は全然気になっていませんでしたが、再代入の文化を離れているととっても気持ち悪かったです。

# 色々省略できる
Scalaは色んなものが省略できますが、久々にJavaを書いてて一番書き忘れたのは以下の3つです。
各行の `;`
メソッドの最後の `return`
引数なし、副作用のないメソッドの `()`

# 型のエイリアス
Javaはimport時に名前を変えられません。
なので別パッケージにある同じクラスを使う時は残念な感じです。
クラス名が何か気持ち悪いなと思ったら、名前が変えられないので苦肉の策だったのかなと思って読むことにしました。

# 文字列に変数を埋め込むアレ
こういうやつです。(補間子 (interpolator)って言うんですね)

```scala
val name = "James"
println(s"Hello, $name")
```

文字列連結しまくってformatterで折り返されて結局どんな文字列が生成されるかよくわからんとか、format使ってるけど1個引数足りなくない？とか多くない？とか書式忘れたとか色々困りました。

# 文字列のエスケープが要らなくなるアレ
raw string literalと言って、補間子の1種類なんですね。
仕事柄、Jsonをよく扱うのですがScalaだとこう書けます。

```scala
val json = """
{
  "id": "12345",
  "name": "James"
}
"""
```

Javaだと、、、

```java
String json = "{\n"
        + "  \"id\": \"12345\",\n"
        + "  \"name\": \"James\"\n"
        + "}";
```
ツラいです。。。
エディタでJson書いて、Intellijに貼り付けるしかありません。
(ダメ元で貼り付けたら自動でエスケープしてくれて助かりました)

# 最後に
この他にも色々ありましたが、副作用との戦いがありすぎて忘れました。
これからもScalaだったらこう書けるのにって思いながら、Javaに付き合っていこうと思います。
ALEXAビルトインライブラリAMAZON.DATE使用上の注意

dateスロットにALEXAビルトインライブラリAMAZON.DATEをセットして、日付情報(仮にstrと定義)を受けとり、それをDate関数に代入する場合、いくつかの注意点があるので、まとめておく。

# AMAZON.DATE の特徴
**① 2019年1月1日**というと、**文字列”2019-01-01”を返す**。ただ、
**② 2019年1月**というと、**文字列"2019-01-00"を返す**ので注意が必要。また、
**③ 2019年**というと、**何も返さない**という特徴がある。

### ① ”2019-01-01”の場合
日付を指定された場合、そのまま以下でDate関数に代入できる。

        let str = slots.date.value;
        let year = Number(str.substr(0,4));
        let month = Number(str.substr(5,2))-1;
        let day = Number(str.substr(8,2));
        let date = new Date(year, month, day);

### ② "2019-01-00"の場合
月だけを指定された場合、day=0になってしまう。月の初日（〇月1日）を表現するためには、強制的にday=1とする必要がある。

        if (day === 0){
        day = 1;
        }

### ③ 何も返さない場合
年だけを指定された場合、AMAZON.DATEでは受け取れないので、代わりに、yearスロットにALEXAビルトインライブラリAMAZON.FOUR_DIGIT_NUMBERをセットして、年情報を受け取る。元日（1月1日）を表現するためには、以下の処理を行う。

        let str = slots.year.value;
        let year = Number(str.substr(0,4));
        let date = new Date(year, 0, 1);

## Date関数の値の差を日、時間、分、秒で表現する

        let date1 = new Date(year1, month1, day1);
        let date2 = new Date(year2, month2, day2);
        let dif = date2-date1;
        
        let difday = Math.floor(dif/1000/60/60/24);
        let difhour = Math.floor(dif/1000/60/60)%24;
        let difmin = Math.floor(dif/1000/60)%60;  
        let difsec = Math.floor(dif/1000)%60;
PythonのDataFrameでSettingWithCopyWarningへの対処

# 状況
pandasモジュールでDataFrameをいじっていたとき、突然以下のような警告が発生した。

```python
 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame
```
状況のサンプルコードは以下のような感じ

```python
import pandas as pd
df = pd.DataFrame({'name':['a','b','c'],'age':[10,20,30]},index=['01','02','03'])
df['age']['01'] = 1
```

# 原因は何か？
このような警告がでる前に、データフレームに値を代入する際の挙動について確認する。
まず`df['age']['01']`という箇所では、いきなり`df['age']['01']`が呼び出されるのではなく、まず`df['age']`という列のデータフレームが呼び出されることから始まる。
次に、そのデータフレームから`df['age']['01']`という行が選択される。
つまり二段階に分けて呼び出されることから、メモリの確保とコピーの時間が必要になるのだ。

# 対処法
`loc`や`iloc`を使う。

```python
df.loc['01','age'] = 1
```


# 参考
[Pythonの覚え書き（DataFrameのSettingWithCopyWarningの対処方法）](http://hirotaka-hachiya.hatenablog.com/entry/2016/01/04/171349)
平成30年度春期　データベーススペシャリスト試験（DB）午後Ⅰ　問１　設問１（1）の解説

##書き方・・・
「」、””、（）で属性、関係名、引用を囲んでいるが、特にルールなく書いているのでゆるして。

#設問１（1）
未完成の関係スキーマの穴埋め問題。
問題文から仕様をピックアップしていけばミスなく点がとれる。
この問題が正解しないと（2）が連鎖的に間違えるのでしっかりやること。
[業務の概要]からピックアップする。

##空欄a
関係「組織」の属性をピックアップする。
問題文の「3.組織」から（組織コード、組織区分）がピックアップできる。他にピックアップできそうな属性名もない。
未完成の関係スキーマには組織（組織コード、組織名、「空欄a」）とある。このことから「組織区分」が足りない。

空欄aは"組織区分"が入る。この属性は外部キーではないので破線の下線、実線の下線は不要になる。

##空欄b
関係「地域」の属性をピックアップする。
問題文の「1.地域」からは（地域コード）しかピックアップできない。
「3.組織」に「地域ごとに担当SCを決めている」とあるので地域と組織には関連があると分かる。
未完成の関係スキーマの関係「サービスセンター」には"SC組織コード"がある。これで関係させればよい。

空欄bは"SC組織コード"が入る。この属性は組織に関連する外部キーなので破線の下線を引く

※地域側になぜSCを入れるか？想像だけど、地域コードは県、市レベルではなく結構細かい地域で管理されていると思う。その小ささでSCを作るとは考えられないので、一つのSCで複数の地域を担当するのではないかと考える。もし逆の一つの地域が複数のSCで担当することになった場合、イベント（たとえば受注とか？）毎に「複数のSC」から「一つのSC」を決める必要があり効率が悪い。

##空欄c
関係「営業担当者」の属性をピックアップする。
問題文の「4.営業担当者」からは（社員番号）がとりあえずピックアップできる。
「いずれか一つの営業所に所属する」とあるので、営業所と関連させればよい。
空欄cは"営業所組織コード"が入る。この属性は営業所に関連する外部キーなので破線の下線を引く

##空欄d
関係「顧客」の属性をピックアップする。
問題文の「3.組織（３）」から「顧客ごとに担当営業所を決めている」とあるので、
空欄dは"営業所組織コード"が入る。
この属性は営業所に関連する外部キーなので破線の下線を引く。


##空欄e、空欄f
関係「設置事業所」の属性をピックアップする。
問題文の「2.顧客（２）」から「顧客コードと設置事業所コードで識別し、名称、住所、その住所を基にした地域コードを登録する」とある。
未完成の関係スキーマで足りないのは「顧客コード、地域コード」になる
空欄e、ｆは、
”顧客コード”が入る。この属性は顧客に関連する主キーなので実線の下線を引く。
”地域コード”が入る。この属性は地域に関連する外部キーなので破線の下線を引く。
逆でも正解


##空欄g、空欄h、空欄i
関係「見積」の属性をピックアップする。
問題文の「6.見積り（２）」から「見積番号で識別し、案件名、顧客コード、担当営業所の組織コード、営業担当者の社員番号、見積年月日、納期年月日、見積有効期限年月日、商品コード、商品コードごとの数量、見積単価を登録する」とある。
未完成の関係スキーマで足りないのは「顧客コード、営業所組織コード、社員番号」になる
「商品コード、商品コードごとの数量、見積単価」は見積の明細と理解でき、未完成の関係スキーマもそれを表している。

空欄g,h,iは
”顧客コード”が入る。この属性は顧客に関連する外部キーなので実線の下線を引く。
”営業所組織コード”が入る。この属性は営業所に関連する外部キーなので破線の下線を引く。
”社員番号”が入る。この属性は営業担当者に関連する外部キーなので破線の下線を引く。
順不同


##空欄j
関係「受注」の属性をピックアップする。
問題文の「7.受注（２）」から「見積番号、受注年月日を登録する」とある。
空欄jは
”見積番号”が入る。この属性は営業所に関連する外部キーなので破線の下線を引く。


##空欄k
関係「受注明細」の属性をピックアップする。
問題文の「7.受注（３）」から「～～設置事業所～～を登録する」とある。
未完成の関係スキーマで足りないのは「設置事業所」なので、主キーの一部「顧客コード」になる
（問題文の図１にもヒントが隠されている）

空欄kは
”顧客コード”が入る。この属性は営業所に関連する外部キーなので破線の下線を引く。

#問題文で注目する場所にマーキング
マーキングしたので上記説明文の参考にしてほしい。

![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/185049/04a65566-4bcf-4808-da00-8847dc82fceb.png)
![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/185049/17658fae-65cc-8cdc-aea4-301921358008.png)

#出典
平成30年度春期　データベーススペシャリスト試験（DB）午後Ⅰ　問１


#おわり
まちがったりしてたら指摘ください

平成30年度春期　データベーススペシャリスト試験（DB）午後Ⅰ　問１　設問1（2）の解説は・・
https://qiita.com/mokoenator/items/19e865723e3a0ca7a75f
PHP-Git2 を CentOS7 上の php7 で使えるようにインストールする

記念すべき初投稿、
いろいろググっても見つからなくて、
だいぶ自力でやってインストール自体は成功したものの、
肝心な使い方がよくわからんというか
これ以上無理しなくていいか、と諦めたので、
腹いせがてら作業メモとして残しておくことに。

# PHP-Git2 とは
なんと php からダイレクトに( exec や system ではなく)、
Git コマンドが実行できるらしいPECL拡張モジュール。
その中身は libgit2 というライブラリらしい。

諸事情あって必要になったので入れようと思ったのだが、
参考にした以下の情報の通りに作業してもなんかエラーで止まったり、
無事に入ったはずなのに phpinfo() で見てもロードしてない?!てなったり。

[PHP で git を使うライブラリ "PHP-Git2" を CentOS 環境にインストールしてみた](http://kikuchy.hatenablog.com/entry/2013/09/04/PHP_%E3%81%A7_git_%E3%82%92%E4%BD%BF%E3%81%86%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA_%22PHP-Git2%22_%E3%82%92_CentOS_%E7%92%B0%E5%A2%83%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC)
[PHP bindings for libgit2](http://libgit2.github.com)

はて、なんでやと思ったら、入れようとしてる環境が php7 だからだったんじゃないかと。
んで試行錯誤してるうちにようやく「インストールは」無事にできた。

# php7 で使える(っぽい?) PHP-Git2 を入れる

順番に作業をメモ。

上記のGitHubリポジトリではなく、別の人がつくったphp7用のソースをダウンロードする。
[New libgit2 bindings for PHP](https://github.com/MagicalTux/php-git2)

```
[root@host ~] git clone https://github.com/MagicalTux/php-git2
[root@host ~] cd php-git2
[root@host php-git2] ./libgit2_build.h
[root@host php-git2] phpize
[root@host php-git2] ./configure
[root@host php-git2] make
[root@host php-git2] make install
```

しかし、自分の環境では make の段階でエラーが出て失敗。

```
/bin/ld: cannot find -lhttp_parser
/bin/ld: cannot find -lcurl
collect2: error: ld returned 1 exit status
```
えー、http_parser とか curl なんて普通に入ってるしなんで・・・?
とここでしばらく格闘し、どうやらそれぞれの追加パッケージを入れれば
いけそうな予感がしたので入れる。

```
[root@host ~] yum -y install http-parser-devel.x86_64 libcurl-devel.x86_64
```
そして改めて make すると、

```
Build complete.
Don't forget to run 'make test'.
```
いけた！
いざ make install!
そして .ini を書く!

```bash:/etc/php.d/git2.ini
extension=git2.so
```
そして php-fpm を reload して phpinfo() で確認!

・・・で、一般的にはロードできてるはず。
自分の環境ではそれでもロードされていなかった。

# php 複数バージョン同居環境の対応

なぜかというと、
CentOS7 ではあるものの、KUSANAGI の AMI によるインスタンスだったので、
php7 のための仕込みが必要なのであった。
KUSANAGI や複数バージョンの php を同居させてる場合、

```
[root@host ~] git clone https://github.com/MagicalTux/php-git2
[root@host ~] cd php-git2
[root@host php-git2] ./libgit2_build.h
[root@host php-git2] /usr/local/php7/bin/phpize
[root@host php-git2] ./configure --with-php-config=/usr/local/php7/bin/php-config
[root@host php-git2] make
[root@host php-git2] make install
```
といった具合に phpize や php-config の場所を指定してあげる必要がある。
同じく .ini ファイルも、
> /etc/php.d/git2.ini

ではなく
> /etc/php7.d/extensions/git2.ini

等の、php7 用ディレクトリに置かないといけないケースもある。
というか KUSANAGI はそうだった。

これにより、自分の環境でも無事「git2.so のインストールとロード」は完了した。

んで、実際にこれを使ったスクリプトを書こうとまたもや試行錯誤したものの、
ドキュメント類があまりない上に PHP-Git2 も libgit2 も C で書かれてて
いまいち追いかけきれぬので、
結局お蔵入りになりましたとさ。。。

ただ、C がもりもり書ける人だったら、
大した量でもないし全部読めば使い方は把握できると思う。
DevTools tips — day 5: console.logの奇妙な振る舞い

この記事は[Tomek Sułkowski](https://medium.com/@tomsu)さんによる
フロントエンドエンジニア向けアドベントカレンダーの翻訳記事です。
とても勉強になったので許可を得て翻訳させていただきました。元記事は[こちら](https://medium.com/@tomsu/devtools-tips-day-5-the-curious-case-of-console-log-36bc7e27a97f)。
 
---

*休暇まであと24日です。私はこれからDevToolをより効果的に、そしてもっと楽しく使うためのコツを紹介する短い記事を書いていきたいと思います。[昨日](https://qiita.com/rena_m/items/645cb2de9f79531aba48)までで15個になりました。今日は1つだけですが、驚きの内容ですよ。*

# 16. ログに表示されたobjectは私たちが想像しているものではない
これは本当に驚くべき内容で、`console.log`を使ったデバッグに少なくとも困惑するようになるでしょうし、最悪の場合は失敗してしまうかもしれません。

consoleにlogしたobjectは中身が表示されるまで参照で保存されます。
例えばobjectをlogして、変化させてもう一度logしてからコンソールを見ると、変更を加える前の最初のlogが...なんと2回目のものと同じ値を持っているのです！

もしこの説明でまだ理解出来なくても大丈夫です。流れをこの動画で確認すればよりすっきりと理解出来るはずです。

![17.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/3c85bf29-5bfd-6f23-1c94-f46308befe15.gif)

この現象がobjectがいつ変化したか確認しようとしているときに起きたら、と想像してみてください🤯

どう対処したらよいでしょうか？objectのコピー(参照を新しくする)をlogするか...真剣にデバッグする時はブレークポイントとSourceタブを代わりに使うかですね！安心してください、この点についてはアドベントカレンダー中に別の機会でお話します。

---

今日はここまで！いつも通り、**なにか新しいことを学べたらぜひ**
→ もっと多くの人の目に止まるように**拍手👏ボタンをお願いします！**
→ 他の投稿も見逃さないように**[Twitter (@sulco)をフォロー](https://twitter.com/sulco)**してください！
デザインの進めかた - まずは前提条件を決めよう編

## はじめに
こんにちは！しずかおすと申します。
HAL東京のWeb開発学科を(なんとか１５万円払わずに)卒業し、なんやかんやあり渋谷のどっかで働く社会人1年目の人間です。
職種はデザイナーです。よろしくお願いします。

これは[HAL Advent Calendar 2018]("https://qiita.com/advent-calendar/2018/hal")の17日目の投稿です。
今回は、デザインを決める際のプロセスで最も大事と言っても過言ではない、**前提条件を決めること**について書きます。

## 概要
何かを作るときに、「あれもこれも詰め込みすぎて、結局予定通りに進まなかった…」とか、「この機能をつけた方が便利になりそうだけど…いやつけなくてもいいかも？どっちだろう？」といった気持ちになったことはありませんか？私はあります。
なぜそのようなことが起きるのか。それは**前提条件をきちんと決められていないことにあるかも**しれません。仕事の話を交えつつ、こうすると進めやすいかも、ということを書きたいと思います。

## 前提条件は何のために決めるのか
**限られた時間の中でより良いものを作るため**に決めるのです！
これを決めることは何かを完成させるためには必須だと思っています。個人の制作ならどれだけ時間をかけても良いと思いますが、課題や仕事となると必ず納期がやってきます。時間はいくら頑張っても増えないし、納期はいくら頑張っても延びません。(例外はあると思いますが)

## 決めること
- やること
- やらないこと
- なにをもって完成とするのか
- 意思決定するのは誰か

だいたいこれを決めておけばうまく進むと思います。
「ターゲット」と「目的や課題に対して今どんな状況なのか」と「かけられるコスト」を考え、やる・やらないを最初から定義すれば、制作で達成しなければならないものが明確になります。

## 例えば
人材紹介を例に挙げると、
ターゲット：20代前半・第二新卒
目的：主力となる事業を増やしたい・第二新卒や若い人が自由にキャリアを選べる世界を実現したい
今の状況：市場は大きいけど競合はあまりうまくいっていない, 参入できそう, 今の企業に満足していない20代前半の人はおよそ6割…など
コスト：エンジニア２人(1日4時間くらいかけられそう), デザイナー1人(定時内がっつり入れそう), マーケ…のように、誰がどれくらい時間をかけられるのかを出す

この後ユーザーヒアリングなどで本当のニーズを見つけ出し(今の状況として考えていることが正しいのか確認し)、ブレストをしてアイデアを発散させます。そして、目的やコストを考えインパクトが大きそうかつ実現可能なものを選び、「やること」とします。

これらを定義しておけば議論の中でたくさんアイデアが出てきても、今すべきなのか・リリース後の実装の方が適しているのか・実装しないのかを判断するのが容易になりますね。

制作における目的を明確にしたら、「目的を達成するためにはどんな設計が必要なのか」を決めましょう。この時点で意思決定者が決まっていると良いです。世の中にはやってみないとわからないことが沢山あると思うのですが、その中でも「これでいこう！」と引っ張れる人がいるだけで進み方が全然違います。

## 終わりに
ここまでお読みいただきありがとうございます。私は2018年度の4月に新卒入社し、新規事業に関わるチームに配属されました。そのチームでは「誰がなにをやるのかわからない」「意思決定者がいない」という状態だということに気づき、ひとりで悩んでみたり、同期や先輩に相談したりして出したひとつの答えがこの記事です。こんなにうまくいかないことばかりだと思いますが、何かの参考になれば嬉しいです。ありがとうございました。
unityでのatlas texture2018最新状況

#はじめに
こんにちは、amazing programmerです
突然ですがatlas texture使ってますか？
NGUIのころはtexture packerやshoe boxで手動で作ってたなぁていう人多いんじゃないでしょうか
あれから早幾年月
unityも標準でatlas textureに対応してくれました
http://kan-kikuchi.hatenablog.com/entry/SpritePostprocessor
http://kan-kikuchi.hatenablog.com/entry/SpriteAtlas
あれ？２種類ありますね？？？
http://tsubakit1.hateblo.jp/entry/2018/12/14/221116
あれれ？？2018.3でugui対応？？？？
混乱してきました、
整理しましょう
#unityでatlas texture使う方法
###SpriteAtlas
https://docs.unity3d.com/ja/2018.1/Manual/SpriteAtlas.html
一番新しい機能です、直感的で使いやすいです
弱点は後述しますがassetbundleと組み合わせるとトラブりやすいです
###sprite packer
https://docs.unity3d.com/ja/2018.1/Manual/SpritePacker.html
unity5時代のものでしょうか
inspectorで各spriteにタグをつけるとタグごとにatlas textureが内部的に生成される感じです
atlas textureが目に見えなくて管理しにくいです
1つのspriteを複数のatlasで使うといったこともできません
Resources以下のspriteには未対応というのも致命的で最近は全く使ってないです
###TexturePackerなどの外部ツール
https://qiita.com/takesuke/items/b8f06d46943d3b22d4db
だいたいデザイナさんにお願いして作ってもらったり
ルール決めて自動化したりするんじゃないでしょうか
リンク先あるとspriteが見えてるんでuguiとも組み合わせられそうです（確か以前仕事でもそんなフローにしてたような
#おすすめAtlasTexture
それで結局どれが一番いいんですかーっていうわけなんですが
ちょっと場合分けして考えていきましょうか
###AssetBundleを使わない場合
https://docs.unity3d.com/ja/2018.1/Manual/SpriteAtlas.html
SpriteAtlas一択で
その際Include in buildにチェックを忘れずに
###AssetBundleを使う場合
ほとんどの場合SpriteAtlas==1assetbundleとして運用すると思います
~~その際**Include in buildのチェックを外さないとダメです**~~
~~そうしないとatlas spriteの参照を持った全て（buildだったり、別assetbundleだったり）にSpriteAtlas textureが含まれてしまいます！！！~~
~~そんな馬鹿なと思うかもしれませんがマジです。assetbundle dependencyとは何だったのか~~
~~そしてチェックを外した場合~~
https://docs.unity3d.com/ja/current/ScriptReference/U2D.SpriteAtlasManager-atlasRequested.html
~~この謎のunity イベント経由でSpriteAtlasインスタンスを渡してあげないとダメなのです！！！！！~~

SpriteAtlasと元となるSpriteを同じAssetBundleに格納することでdependencyがつきました
dependencyがつくのでInclude in buildのチェックはつけたままでOKです
atlas textureとsprite textureが全部AssetBUndleに含まれるんじゃないかと不安になりましたが検証したらそんなことはなかったです
####Unity2018.3以上
http://tsubakit1.hateblo.jp/entry/2018/12/14/221116
おめでとうございます、spriteAtlas遅延バインディングがuguiに対応しました
安心してSpriteAtlas使ってください
####それ以外の古いunity（2017.4LTS含む
https://feedback.unity3d.com/suggestions/unity-2017-sprite-atlas-ugui-bindings
残念ながらspriteAtlas遅延バインディングはSpriteRendererにしか対応してません…ugui非対応です…
FeedBackの悲痛な叫びは届いたけど反映はされませんでした…（まぁLTSはバグフィックスだけですからね
ということはsprite packerか外部ツールを…
#####2017.4で試しにuguiでも試したらatlasRequested呼ばれてるぞ…？？
そのまま同期的にSpriteAtlas返したら表示されました
非同期的にSpriteAtlas返したら白い□になりました（表示失敗
公式ではサポートされてないのでマイナーバージョンアップしたら死ぬかもしれないけど…ありじゃね？
実装としては必要になる前にアセットバンドルをメモリに読んでおいて、同期的にLoadAssetするとか、そもそも事前にSpriteAsset取り出してメンバ変数に保持しておけばよしよしな気がします
#まとめ
SpriteAtlasでいいんじゃない？
UEFI環境でのBitVisor開発に便利なTFTP

UEFI環境でのBitVisor開発ではTFTPが便利です。TFTPといえばPXEブートで、これはすでに紹介記事があります:

https://qiita.com/n_kane/items/0f55218371f2b1b6bb9f
https://qiita.com/nvsofts/items/62f96dff5340b9d7c851

しかし、PXEブートにはDHCPサーバーの準備が必要で面倒くさいです。DHCPは使っていても、単にアドレスを配る目的であって、PXEブートの設定を入れられないという環境も多いことでしょう。PXEブートでなくても、オペレーティングシステムの起動前に単にファイル転送ができるだけでもだいぶ便利になります。

# UEFI Shell

EDK IIに含まれるUEFI Shellには、tftpコマンドが実装されているようです。残念ながらバイナリのほうには含まれていないみたいですが、ビルドしてできあがったShell.efiを使うとtftpコマンドが使えるようです。以下のように簡単にファイルを持ってくることができます。

```
Shell> fs0:
FS0:\> ifconfig -s eth0 dhcp
FS0:\> tftp 192.168.0.21 test
Downloading the file 'test'
[=======================================>]       0 Kb
FS0:\> type test
test

FS0:\> 
```

しかし、某A社製のコンピューターでは簡単には使用することができません。UEFI ShellのifconfigコマンドはEFI IPv4 Configuration II Protocolを要求しますが、2006年からEFIファームウェアを採用し続けてきた某A社製のコンピューターは、同プロトコルをサポートしていないようです。対策として、もともとロードされているIp4Dxeドライバーをunloadし、EDK IIをビルドしてできあがったIp4Dxe.efiをloadすることで使えるようになりますが、非常に手間です。

なお、某A社製のちょっと古いコンピューターでは、新しいUEFI Shellは起動すらせずハングアップする、なんてこともあるみたいです。古いShellが欲しい場合はrEFItから入手するのが簡単です。逆に某L社製PCでは古いShellが動かない、なんてこともあった気がします。

# Mtftpc

というわけで、EFI IPv4 Configuration II Protocolを使わない簡単なTFTPクライアントを適当に作ってみました:

https://bitbucket.org/hdk_2/mtftpc

UEFI Shellからこのmtftpc getコマンドを叩けば、DHCPでクライアントのIPアドレスを取得した上で、指定されたIPアドレスにTFTPで接続してファイルを持ってきます。(保存先はmtftpc.efiがあるのと同じファイルシステムのルートディレクトリからのパスになります。)

```
Shell> fs0:
FS0:\> mtftpc 
Usage:
  mtftpc.efi get <IPv4 address> <remote filename> [<local filename>]
  mtftpc.efi put <IPv4 address> <local filename> [<remote filename>]
  mtftpc.efi exec <IPv4 address> <remote filename> [<arguments>]
  mtftpc.efi load <IPv4 address> <remote filename>
FS0:\> mtftpc get 192.168.0.21 test
Download 5
FS0:\> type test
test

FS0:\> 
```

コマンドにexecというのがありますが、残念ながらloadvmm.efiをこれで実行してもBitVisorは起動できませんので、今のところファイルをget(ダウンロード)してから実行する必要があります。試していませんが、Linuxを起動しようとする場合もinitrdの読み込みができないのではないかと思います。

おまけでput(アップロード)機能も付けてあります。UEFI Shell上でdmemコマンドなどを実行した結果を、リダイレクトでファイルに保存して、TFTPでアップロードすれば、他のコンピューターで簡単にチェックできて便利かと思います。

某A社製のコンピューターでは無線LANのドライバーも組み込まれており、接続されていない場合はDHCPに失敗してエラーが出ることがありますが、有線LANが使用可能であれば自動的に見つけ出すようになっているので気にしないでください。複数のネットワークデバイスでDHCPが使用可能な環境のことは想定していません。