OmniAICreator/Qiita-1.07M huggingface dataset:
[Swift4入門]画面に表示したボタンを押すことで効果音が流れる

#[swift超入門] ボタンを押すことで効果音を流す

##Xcode上での画面作成にあたって
###用いたフレームワーク
1.UIKit（ファイル作成時に自動で導入されています）
2.AVFoundation(効果音を流すために使います)
###用いたオブジェクト
1.imageview(Assets.xcassetsでのナビゲータエリアで追加したimageに猫の画像を導入)
2.button(ビューコントローラに接続)
###その他注意点
画像ファイルをsound.swiftファイルの中に保存しています。



##今回用いたコード
コードは、[[Swift3]ボタンを押した時に効果音を鳴らす](https://picolica.com/2017/02/25/swift3-play-sound/)を参考にさせていただきました。

```swift:sound.swift
import UIKit
import AVFoundation

class ViewController: UIViewController {
    var audioPlayerInstance : AVAudioPlayer! = nil  // 再生するサウンドのインスタンス
        
        override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        // サウンドファイルのパスを生成(今回のファイルに導入した画像ファイル名を書きます)
        let soundFilePath = Bundle.main.path(forResource: "meow", ofType: "mp3")!
        let sound:URL = URL(fileURLWithPath: soundFilePath)
        // AVAudioPlayerのインスタンスを作成,ファイルの読み込み
        do {
            audioPlayerInstance = try AVAudioPlayer(contentsOf: sound, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成でエラー")
        }
        // 再生準備
        audioPlayerInstance.prepareToPlay()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func sound(_ sender: UIButton) {
        // 連打した時に連続して音がなるようにする
        audioPlayerInstance.currentTime = 0         // 再生箇所を頭に移す
        audioPlayerInstance.play()                  // 再生する
       
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

```

##実機画面
![スクリーンショット 2018-08-30 20.01.58.png](https://qiita-image-store.s3.amazonaws.com/0/285361/eed4f884-648e-9bf7-277a-7c6c599747f0.png)
ボタンを押すことで猫の鳴き声が確認できました。

##最後に
自分にとって初めての投稿となりました。ご意見、ご指摘の方お気軽によろしくお願いいたします。
特定のファイルをtar.gzから取り出す

まずtar.gzの中身を確認。

```shell
$ tar zft data.tar.gz
data/
data/dir01/
data/dir02/
data/dir03/ ←------------このディレクトリを取り出したい
data/file01
data/file02 ←------------このファイルも取り出したい
data/file03
```

tarのオプションを「zft」→「zfx」に変えて、取り出したい「data/dir03/」と「data/file02」を指定。

```shell
$ tar zfx data.tar.gz data/dir03/ data/file02
```
以下結果。
ディレクトリ構成を保ったまま取り出せます

```
$ find data
data
data/dir03
data/dir03/dddddddd
data/file02
```
Dockerでgulp（+gulp-compass）実行環境を構築

# 背景
### gulpの実行を他のPCでもできるようにせねば。

自分のローカル環境では適当に構築していたのだが、
いちいちインストールするのも面倒だし、諸々な差分が発生して面倒。
dockerコンテナにしてやれば構築・配布が容易だろう、と考えた。


# Dockerコンテナでやりたいこと
### dockerでgulpおよびgulp-compassの実行

gulp-compassは「sassのフレームワークCompassをgulpで動かすライブラリ」だと思われる


- gulp+watchが走ってる
- gulp-compassが実行できる
- コンパイル結果がローカル環境にも反映される

よくは知らないが、gulp-compassはrubyの力で動くので、rubyのインストールも必要だ。

# 今回使うディレクトリ構成

これあると、わかりやすいよね

```
root/
　├ docker/
　│　└ node/
　│　　　└ Dockerfile
　│
　├ public/
　│　└ resources/
　│
　├ scss/
　│
　├ docker-compose.yml
　└ gulefile.js

```

# Dockerの設定

```sh:Dockerfile
FROM node:6.10.1

RUN mkdir -p /workspace
WORKDIR /workspace

# ruby install prepare
RUN apt-get update && apt-get install -y \
    autoconf \
    bison \
    build-essential \
    libssl-dev \
    libyaml-dev \
    libreadline6-dev \
    zlib1g-dev \
    libncurses5-dev \
    libffi-dev \
    libgdbm3 \
    libgdbm-dev \
    git

# rbenv clone
RUN git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build

# rbnev setting
RUN echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile.d/rbenv.sh
RUN echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile.d/rbenv.sh
RUN echo 'eval "$(rbenv init --no-rehash -)"' >> /etc/profile.d/rbenv.sh

# ruby install
ENV ruby_version="2.3.3"
RUN . /etc/profile.d/rbenv.sh; rbenv install ${ruby_version}; rbenv global ${ruby_version};
RUN . /etc/profile.d/rbenv.sh; gem install -n /usr/local/bin compass --pre

# npm install
COPY package.json ./
RUN npm install -g gulp-cli
RUN npm install

CMD ["gulp"]

```

gulpだけだったらややこしくなかったんですが、ruby入れるのが大変。。
（今更ですが、ベースのimageをrubyよりに変えた方が良かったかも）

nodeやrubyのバージョンはローカル環境に合わせただけ。特に深く考えていない。

```docker-compose.yml
version: '3'
services:
  gulp:
    container_name: gulp
    build:
     context: ./
     dockerfile: ./docker/node/Dockerfile
    volumes:
      - ./public/resources/:/workspace/public/resources #コンパイル先
      - ./scss/:/workspace/scss #コンパイル元
      - ./gulpfile.js:/workspace/gulpfile.js #gulpfile
    tty: true
```

上のDockerfileを元に構築してくれる。

buildのcontext, dockerfileはDockerfileのある場所からresourcesを参照できないため設定した。

volumesにてコンパイル元とコンパイル先をローカル環境と同期させる。
gulpfileは特にリンクさせる必要がないけど、リンクしておくとgulpの動作をローカルで変更できるようになる



# 補足
落とし穴というか、詰まったところを解説

### Dockerfile
```
RUN . /etc/profile.d/rbenv.sh; rbenv install ${ruby_version}; rbenv global ${ruby_version};
```
rbenv: command not found　でまくったので、pathを読み込んで実行
`source`コマンドもnot foundになったのでピリオド(.)で読み込む

```
RUN . /etc/profile.d/rbenv.sh; gem install -n /usr/local/bin compass --pre
```
installもrbenv読み込みからやった。（やらないとgem not foundで怒られた）
nオプションでgemのインストール先をrubyと同じパスに置いてやり、--preで（たぶん）


あと、割とbuildに時間がかかります。特にInstalling rubyに。
iconvの使い方

iconvの使い方です。
sjis->utf8のみに限定してありますが、パラメータを変えれば他言語変換もできると思います。
BUFF_MAXは想定される最大サイズを設定して下さい。
この関数内ではmallocやstrdup等は使用できません。(異常終了します)
・man: [iconv_open](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/iconv_open.3.html), [iconv](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/iconv.3.html), [iconv_close](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/iconv_close.3.html)
※2018/11/16:MS-SJISの場合はCP932でないと一部の文字が化けることが判明したので修正しました。

```c:
#include <iconv.h>
#include <errno.h> // errno
#include <stdio.h> // fprintf
#include <string.h> // strncpy,strlen
#define pr_err(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
int my_sjis2utf8(const char *src, char *dst, size_t len)
{
	iconv_t conv; // conversion descriptor
	char buf[BUFF_MAX];
	char *src_buf = buf;
	char *dst_buf = dst;
	size_t src_len = strlen(src);
	size_t dst_len = len - 1;
	int ret = 0;
	strncpy(buf, src, sizeof(buf));
	if ((conv = iconv_open("UTF-8", "CP932")) == (iconv_t) - 1) {
		pr_err("error: %s: %s\n", __FUNCTION__, "iconv open");
		return -errno;
	}
	if (iconv(conv, &src_buf, &src_len, &dst_buf, &dst_len) == (size_t) - 1) {
		pr_err("error: %s: %s\n", __FUNCTION__, "iconv");
		ret = -errno;
	}
	*dst_buf = '\0';
	if (iconv_close(conv) == -1) {
		pr_err("error: %s: %s\n", __FUNCTION__, "iconv_close");
		ret = -errno;
	}
	return ret;
}
```
vs2010でmanaged directx その3

#概要
C#で、３Dやりたかった。
オブジェクトを、回す。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/966a1ebc-2c34-a41a-ac02-5add915180c1.png)

#サンプルコード

```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        private Device device = null;
        private VertexBuffer buffer = null;
        public Form1()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            PresentParameters presentParams = new PresentParameters();
            presentParams.Windowed = true;
            presentParams.SwapEffect = SwapEffect.Discard;
            device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
            buffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
		    CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[]) buffer.Lock(0, 0);
            verts[0].Position = new Vector3(0.0f, 1.0f, 1.0f);
            verts[0].Color = Color.BlueViolet.ToArgb();
            verts[1].Position = new Vector3(-1.0f, -1.0f, 1.0f);
            verts[1].Color = Color.GreenYellow.ToArgb();
            verts[2].Position = new Vector3(1.0f, -1.0f, 1.0f);
            verts[2].Color = Color.Red.ToArgb();
            buffer.Unlock();                
        }
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);
            int iTime = Environment.TickCount % 5000;
            float fAngle = iTime * (2.0f * (float) Math.PI) / 5000.0f;
            device.Transform.World = Matrix.RotationY(fAngle);
            device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 1.0f, 4.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
            device.Transform.Projection = Matrix.PerspectiveFovLH((float) Math.PI / 4, 1.0f, 1.0f, 100.0f);
            device.RenderState.CullMode = Cull.None;
            device.RenderState.Lighting = false;    
            device.BeginScene();
            device.VertexFormat = CustomVertex.PositionColored.Format;
            device.SetStreamSource(0, buffer, 0);
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
            device.EndScene();
            device.Present();
            this.Invalidate();
        }
    }
}

```


以上。
Pythonで配列（list）を結合

#Pythonでlistを結合したい
以下のような二つの配列(list1,list2)がある

    list1 = [1]
    list2 = [2,3]

この時，結合するメソッドは二つありappendとextendだ

    list1.append(list2)
    print(list1) # [1,[2,3]]
    
    list1.extend(list2)
    print(list1) # [1,2,3]

***この時注意することは初めにlist1やlist2のような配列を宣言しておく必要がある．***

そのため初めが空の配列を想定するなら

    list1 = []

といった配列を宣言すること
vs2010でmanaged directx その２

#概要
c#で、３Dしたかった。
cameraを、動かす。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/848c1d45-fdbc-3d6a-03f2-1ec5c836ffea.png)

#サンプルコード


```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        private Device device = null;
        private VertexBuffer buffer = null;
        public Form1()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            PresentParameters presentParams = new PresentParameters();
            presentParams.Windowed = true;
            presentParams.SwapEffect = SwapEffect.Discard;
            device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
            buffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
		    CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[]) buffer.Lock(0, 0);
            verts[0].Position = new Vector3(0.0f, 1.0f, 1.0f);
            verts[0].Color = Color.BlueViolet.ToArgb();
            verts[1].Position = new Vector3(-1.0f, -1.0f, 1.0f);
            verts[1].Color = Color.GreenYellow.ToArgb();
            verts[2].Position = new Vector3(1.0f, -1.0f, 1.0f);
            verts[2].Color = Color.Red.ToArgb();
            buffer.Unlock();                
        }
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);
            Matrix view,
                w;
            w = Matrix.RotationY(Environment.TickCount / 1000.0f);
            view = Matrix.Translation(0, 0, 5);
            view = w * view;
            device.SetTransform(TransformType.View, view);
            device.Transform.Projection = Matrix.PerspectiveFovLH((float) Math.PI / 4, 1.0f, 1.0f, 100.0f);
            device.RenderState.CullMode = Cull.None;
            device.RenderState.Lighting = false;    
            device.BeginScene();
            device.VertexFormat = CustomVertex.PositionColored.Format;
            device.SetStreamSource(0, buffer, 0);
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
            device.EndScene();
            device.Present();
            this.Invalidate();
        }
    }
}

```

以上。
たぶん Excel 2010 Later セルに数式や関数は全角で入力できる

#Excelでセルに数式を入力するときの基本(平成生まれまでの基本)
##Excelに計算式として認識させるには、
計算式の前に半角のイコール記号「＝」を入力しなければならない
また関数を入力するときには半角の「=」に半角の@を入れて関数名を入力する
##×(乗法)は*アスタリスク、÷(除法)はスラッシュ
[計算式を入力してみよう ～ 加・減・乗・除 ～](https://yamanjo.net/beginner/excel/excel_04.html)
加法の「＋」と減法の「－」は同じですが、乗法と除法が若干異なります。乗法は「×」ではなく「＊（アスタリスク）」、減法は「÷」ではなく「／（スラッシュ）」になります。

#Excel2007までは=@であった
[数式の入力【関数を手入力編】](https://www.becoolusers.com/excel/input-function2.html)[魚拓](https://megalodon.jp/2018-0830-1854-22/https://www.becoolusers.com:443/excel/input-function2.html)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/5b572d1e-ed87-1c07-5035-df525262f9db.png)
このBe Cool Usersサイトの記事では=@だった

#たぶんExcel2010から変わった
[Excel 2010　関数の入力方法](http://span.jp/office2010_manual/excel2010/function/function-input.html)
[Excel 2010　関数の入力方法](http://span.jp/office2013_manual/excel2013/function/function-input.htm)
##表向きの変更
###セルに関数を入力するときは@マークから
今は@マークから始めるとインテリセンスが作動し矢印とTabキーで選択できる。
[入力するとデータ内容が変わる値](https://www.forguncy.com/blog/20180129_formulachange)
> Excelではない一部の表計算ソフトの関数の入力方法は関数を「@」で始める数式で入力することになっており、Excelでもその入力ができるようにするために、このような仕様になっています。

Excel95あたりは違ったと思うけど、とにかく今はそうだ。あと時刻の入力などいろいろ参考になる。

###関数の入力(関数ウィザード)はShift+F3
DateDifのような隠し関数を除いて、ここからジャンルで選択できる
##=SUMと@を省略してもよくなった
Excel2010から

#だがじつはこんな進化があってじつは全角入力ができる
##すべて全角で＝４×３÷１でも数式に変換される
実はすべて全角でしかも÷や×も自動的に数式に変換されてしまう。
##全角の＋で初めてもよい
上記をすべて全角で＋４×３÷１としても数式に変換される
##全角の％１２は12パーセントに変換される１２％は12%になる
もうやりたい放題じゃないか。
ただし、％１２+０．１７のように後ろに続けるとそのまま文字列になる。
１２％+０．１７は文字列になる。
##全角のピリオドは小数点になる
これは%と同様に後ろに続けることはできない。
##全角の。１７も0.17になる
もう疲れてきた...
##全角の（１）はマイナス１になる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/03965a0c-a32b-594d-14d9-3a7d14be8e85.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/83fb9e18-fe66-8612-ead9-354c7dcb3979.png)
これも％と同じで後ろに続けることはできない。
でもこれはやりすぎなのでは
##（１）を文字にしたいときは’（１）
もちろんアポストロフは全角でよい
##関数も全角で＠ｓｕｍ（としてマウスで範囲を選んでも数式に変換される。
###もちろん＠すｍはだめだが
これは完全に別の意味なのでさすがに無理がある。しかし＠すｍでF9を押して、「あっ、全角の＠ＳＵＭ（になってしまった！！」でも大丈夫。入力のし直しは要らない。そのまま範囲を選択すると数式に変換される。
また関数名も補完されない。

#ざっくりいうと、大体全角でいれても数式に変換される
パーセントやピリオド以外は全部数式や関数になる。インテリセンス（補完）は効かないが、関数名を正確に打てるなら全角でかまわない。
Stylelintでファイルを除外する

# tl;dr

* 設定ファイルの`ignoreFiles`にGlobで書きまくればいい

# 状況

* PostCSS + SugarSS
* Webpack (4.8.1)

なぜか`.stylelintignore`が全く反映されなかったので、設定ファイルに除外先を指定することにしました。

https://github.com/stylelint/stylelint/blob/master/docs/user-guide/configuration.md#ignorefiles

以下のように`.stylelintrc.yml`などに書けば対象のファイルが除外されます。

```yml
---
extends: stylelint-config-sugarss-recommended
plugins:
  - stylelint-order
ignoreFiles:
  - node_modules/**/*.css
  - src/lib/**/*.css
rules:
  - order/properties-alphabetical-order: true
```
OSX でapt-getを使う為にfinkを導入する

OS X上ではデフォルトではapt-getが入っていないので、finkをインストールしてapt-getを使用できるようにする
**※インストールには時間がかかります**

# 環境
- OS X     : 10.13.4
- Shell Type：zsh

# 手順
finkをインストールする前にXCode用のコマンドラインツールをインストールしてない方は[こちらの記事](https://qiita.com/u4da3/items/4229702b4a8504290dd5)を参考にインストールを行ってください。
今回、私の環境では既にインストール済なので、XCode用のコマンドラインツールのインストール方法については割愛させて頂きます。

●ダウンロード
以下のサイトからOS Xのバージョンに対応したfinkパッケージ管理システムをダウンロードする。今回はfink-0.43.1.tar.gzをダウンロードした。
[finkパッケージ管理システムダウンロードページ](http://www.finkproject.org/download/srcdist.php)

●インストール
・ダウンロード後、fink-0.43.1.tar.gzがあるディレクトリに飛び、以下のコマンドを実行し展開を行う。

```zsh
fink-0.43.1.tar.gz
```
・展開後、展開したパッケージ管理システムに移動し次のコマンドを実行

```zsh
cd fink-0.43.1
./bootstrap
```
色々聞かれるが基本的にデフォルトで問題ないので、enterを叩きまくった。
この後、むちゃくちゃビルドにめっちゃ時間かかった。。。

# finkを使えるようにzprofileを設定する。
Bourne シェル系 (sh, bash, zsh など) を使っている場合、以下の行をホームディレクトリ内の .profile ファイルに追加する必要があるらしいです。
```vi ~/.zprofile```で.zprofileを開き、以下の行を追加

```
. /sw/bin/init.sh
```

その後先ほどのfink-0.43.1ディレクトリに飛び、以下のコマンドを実行する。

```zsh
/sw/bin/pathsetup.sh
source /sw/bin/init.sh
```
以上で基本的なfinkのインストールは完了です！

# 実際にapt-getを使ってみる
以下のコマンドを実行して牛を呼んでみる。

```zsh
apt-get moo   
```

```zsh                                                                                                                                   
         (__)
         (oo)
   /------\/
  / |    ||
 *  /\---/\
    ~~   ~~
...."Have you mooed today?"...
```
上のような牛さんが表示されたらインストール成功です！！
**モ〜🐮、、、インストールに疲れた**
サービスからダウンロードできる CSV ファイルを Excel で文字化けさせない

# Excel で CSV 内の日本語が文字化けする条件

現代日本において一般的かはわかりませんが、国内の少し古い Web サービスなどでは、 CSV ダウンロード機能を使うと文字コードが Shift_JIS の CSV ファイルがダウンロードされたりします。

それ自体に問題はありません。

日本語を含む CSV をダウンロードするようなユーザの多くは、そのファイルが Shift_JIS であることにあまり不満を覚えないでしょうし、多くの場合そのまま Excel で開いても文字化けしません。

ですが、 日本語を含む CSV を Excel で開いた時に文字化けすることがあります。

たとえば Mac OS X では、システム環境設定で英語が日本語より優先されている場合などに起きます。

<img width="653" alt="lang_png.png" src="https://qiita-image-store.s3.amazonaws.com/0/38056/8ab4fd80-5d81-13af-9eef-920375e5f3d4.png">

（上記画像の日本語、English の部分を入れ替えると再現できます）

# Excel で文字化けしない CSV ファイルを用意する

Excel は CSV ファイルを開く際、 OS の言語設定に合わせた文字コードとして解釈します（日本語なら Shift_JIS）。しかし、それとは別に文字コードが UTF-8 の CSV ファイルも扱うことができます。
（開くことも保存することもできる）

ただし、一般的な（通常の） UTF-8 ではなくバイトオーダーマークのついた UTF-8 である必要があります。

## バイトオーダーマークとは

Unicode 以前の各言語地域で発展してきた文字コードと区別するために、ファイルの先頭に埋め込む数バイトの識別データ。

UTF-8 の場合、ファイルの先頭に `0xEF 0xBB 0xBF` を入れることで バイトオーダーマークのついた UTF-8 になります。
テキストエディタ等では表示されませんが、バイナリエディタで見ると確認できます。

Excel は CSV ファイルを開く際、上記の（UTF-8 用の）バイトオーダーマークがあれば UTF-8 として、そうでなければ言語設定に合わせた文字コードとしてテキストを解釈します。

## バイトオーダーマーク付き UTF-8 の CSV ファイルは言語設定を問わない

先の例に示した OS X における「優先する言語」が日本語でも英語でも、バイトオーダーマークがついていれば Excel は UTF-8 として解釈してくれます。
そのため、バイトオーダーマークをつけて UTF-8 で　CSV ファイルを作成すれば、「ダウンロードした CSV が Excel で文字化けする」と言われることはなくなります。

# ダウンロードしたユーザが CSV の文字化けで困らないように

結論としては、バイトオーダーマーク付き UTF-8 で CSV ファイルを作れば良いわけですが、既に Shift_JIS で CSV ダウンロードを提供している場合には、文字コードを変更することで既存ユーザを混乱させてしまう可能性があります。

その場合、既存の CSV ダウンロードはそのままにして、 **文字化けが起きた向けに試していただく CSV** も提供するという手もあります。
SourceryのAPI使用例

「コードを書く量が多すぎる！1ヶ月に240時間も働いてしまった！半分にしたい！」
というわけでメタプロ入門しました。

利用するライブラリの候補としては、`SourceKitten` と `Sourcery` を検討しましたが、`SourceKitten` は構文解析用のライブラリで自作クラスをいっぱい作らなければいけなくて大変なので、メタプロ用には `Sourcery` の方を使いました。

しかし、APIが割と分かりにくいので、利用例を随時追加していきます。

Sourcery
https://github.com/krzysztofzablocki/Sourcery

Sourceryで使うメタプロ言語(stencil)
https://github.com/stencilproject/Stencil

http://stencil.fuller.li/en/latest/

# API使用例
## 入力ファイルの型を全て取得する
 `{{ types.all }}` 

### for文でクラス取得
`{% class type in types.classes %}`

### for文でプロトコル取得
`{% protocol type in protocols %}`

## 変数をfor文で取得する
`{%% for variable in type.variables %}`

`type` の部分には、取得したタイプを入れる。

## 変数名の一文字目を大文字にして、関数生成に使う
```swift:
{% for variable in type.variables %}
func setup{{ variable.name|upperFirstLetter }}() {
    // do something
}
{% endfor %}
```

(生成例)

```swift
func setupMyView() {
  // do something
}
```

## 変数のジェネリクスの中身を取得して、別の変数の生成に使う
元が `Binder<String>` みたいな場合も、中身の型だけ取れる。

```swift
{% for variable in type.variables %}
var {{ variable.name }}: Observable<{{ variable.typeName.generic.typeParameters.first.typeName }}> { 
        return Observable.just("hoge")
    }
```

(生成例)

```swift
var formTitle: Observable<String> {
    return Observable.just("hoge")
}
```

# テストコード生成
internalのメソッドを拾ってきて、 `testHoge~()` というテスト関数のガワを生成してくれるのでちょっと楽ができます。

```swift
{% for class in types.classes %}

//
//  {{ class.name }}Tests.swift
//  TestAppTests
//  created by code-generator.

import XCTest
@testable import TestApp

class {{ class.name }}Tests: XCTestCase {
    
    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }
    
    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    {% for method in class.methods %}
    {% if method.accessLevel == "internal" %}
    func test{{ method.name|upperFirstLetter }}() {
    
    }
    {% endif %}
    {% endfor %}
    
    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measure {
            // Put the code you want to measure the time of here.
        }
    }
    
}

{% endfor %}
```
vs2010でmanaged directx

#概要
c#で、３Dがやりたかった。


#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/ccd28744-a819-7506-16d7-8e530faa74ab.png)

#環境

windows vista
visualstudio 2010 pro
c# 4.0

#手順

新規プロジェクトでwindows formを指定。
app.configを追加

```
<startup useLegacyV2RuntimeActivationPolicy="true">
  </startup>
```

参照を追加

```
Microsoft.DirectX.dll
Microsoft.DirectX.direct3d.dll
Microsoft.DirectX.direct3dx.dll
```


#サンプルコード


```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using System.Threading;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private Device device = null;
        public Form1()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
                PresentParameters presentParams = new PresentParameters();
                presentParams.Windowed = true;
                presentParams.SwapEffect = SwapEffect.Discard;
                device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);        
        }
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);
            device.BeginScene();
            device.EndScene();
            device.Present();
        }
    }
}

```

以上。
Xamarinで作ったAndroidアプリをFirebase Test Labでテストする

#概要
Xamarin でビルドした Android アプリでも、自動UIテストを Firebase Test Lab でやりたい。
その方法を調査した。

#開発環境
テストコード作成は Android Studio 3.1.3 を使用。
Xamarin でビルドする側はバージョン関係なく大丈夫と思う。

#方法
まず、テストコードを書くためのプロジェクトを Android Studio で作る。
Build.gradle （app配下の方）に、以下を追記。

```
// apkをXamarinでビルドしたものに差し替える
import java.nio.file.Files
import java.nio.file.StandardCopyOption

gradle.projectsEvaluated {
    // build variantが確定してから処理するため、projectEvaluatedのタイミングで処理する。

    project.tasks.all { task ->
        // assembleXXXX タスクの doLast に処理を埋め込む

        if (task.getName().startsWith("assemble")) {
            // assemble以降がvariant名と一致するタスクが実際にビルドするタスク

            def variantName = task.getName().replace("assemble", "")
            def variant = android.applicationVariants.matching { variant -> (variant.getName().equalsIgnoreCase(variantName)) }[0]
            if (variant != null) {
                // build variantが存在する場合、出力先のパスを取得する
                def inputPath = project.projectDir.toPath().resolve("replace").resolve(variant.getName()).resolve("replace.apk")
                def outputFile = variant.outputs[0]?.outputFile
                if (outputFile != null) {
                    task.doLast {
                        if (Files.exists(inputPath)) {
                            logger.lifecycle("Replace apk from \"" + inputPath + "\", to \"" + outputFile + "\"")
                            Files.copy(inputPath, outputFile.toPath(), StandardCopyOption.REPLACE_EXISTING)
                        } else {
                            throw new GradleException("Tried replacing apk, but did not exist apk at \"" + inputPath + "\"")
                        }
                    }
                }
            }
        }
    }
}
```
gradle.projectsEvaluatedを使い、doLastでテストコードのビルド後にapkを置き換える。

あとは、Xamarin でビルドしたreplace.apkを、以下に配置しておけばよい。
```/app/replace/≪Build Variant≫```
例えば通常デバッグビルドの場合は、/app/replace/debug に置く。
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/277107/17c97b78-7de8-af6d-4869-79130da8de3c.png)
これでテストコードを実行すると、Xamarin 製Androidアプリを Firebase Test Lab の Instrumentation Test などでテストできる。

# 課題
テストコード側で R.java に R.id.xxxxx とかでアクセスできない問題が発生する。
以下のようにして対応する。

```
@IdRes
public static int getViewId(@NonNull String stringId) {
    Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
    String packageName = context.getPackageName();
    Resources resources = context.getResources();

    return resources.getIdentifier(stringId, "id", packageName);
}
```

# 補足
React Native や Flutter など他のクロスプラットフォーム手法で作成した apk もOKかどうかは試していませんが、ネイティブと同じUIレンダリングなら可能だろうと思います。
ただし、Xamarin と異なる課題が生じる可能性も高いです。
Laravel Dusk で入力フィールドに値がセットできない

Laravel Dusk を使って、ブラウザテストケースを作ろうとしたのですが、
入力フィールドに値がセットできなかったので、調べた内容です。 

## 動作環境

Laravel 5.5
MacOS High Sierra 10.13.2
Google Chrome 68.0

## 対処方法

以下のライブラリを導入しました。

・ staudenmeir/dusk-updater (v1.0.2)

``` 
$ composer require --dev staudenmeir/dusk-updater
```

AppServiceProvder.php の register() 内のDuskServiceProviderの下あたりに追記

        if ($this->app->environment('local', 'testing')) {
            $this->app->register(DuskServiceProvider::class);
        }
        if ($this->app->environment('local', 'testing')) {
            $this->app->register(\Staudenmeir\DuskUpdater\DuskServiceProvider::class);
        }

```
$ php artisan dusk:update
```
以下のメッセージが出たら、完了です。

ChromeDriver binaries successfully updated to version 2.41 (Chrome v67-69).


## 参考文献

https://stackoverflow.com/questions/51710137/laravel-dusk-unknown-error-call-function-result-missing-value
https://github.com/staudenmeir/dusk-updater
GEEETECH E180

GEEETECH E180を購入しました。
ホットベッドも、ガラステーブルもありません。
しかし、印刷が非常にしやすいんですよ。

テストプリントしたら、途中でアプリがハングしましたが
そこまでは非常に綺麗に出力できていました。

と思ったら、その後、どうしても色々トラブルが起きました。
１、EasyPrint3Dがエラーで動かない
２、印刷途中でエラーが出る
３、印刷位置がおかしい（高さや、繰り返し時など）

![39169610_1156734034464402_1374239064835751936_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/3bd18828-a493-a1a4-0c0a-ab5546dea1d0.jpeg)

理由は、PCとUSBで接続しているからでした。

と言う事で、回避策としてMicroSDカードから直接印刷をする事に。
この結果、エラーが全く無く、綺麗な出力を得ることができました。

ただし、MicroSDカードの位置がわかりにくい為に、非常に使いにくいんです。
と言う事をFacebookで書いたところ、MicroSDの延長ケーブルを教えて頂きました。

今回45cmを購入しましたがE180には25cmのタイプをお勧めします。
![40410459_1171006793037126_6827355970218229760_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/d3f3d513-b01b-3324-4c86-bb8f9cdbca4d.jpeg)

AliexpressにてTF Male To Micro SD Female Card Reader Extension等で検索ください。
https://ja.aliexpress.com/wholesale?catId=0&initiative_id=SB_20180830015350&SearchText=+TF+Male+To+Micro+SD+Female+Card+Reader+Extension+
2ドル程度で購入可能です。
タグでRDSやEC2インスタンスの起動、停止を自動化


# 概要

![Kobito.q1Pgs3.png](https://qiita-image-store.s3.amazonaws.com/0/181951/cd8665f5-a6d7-f5dd-cc51-9da0daaf307a.png "Kobito.q1Pgs3.png")

> CloudWatchからラムダを実行して、RDSとEC2インスタンスのタグ設定をチェックします。正しくタグを設定したら自動的に起動、停止ができます

# 設定

## ラムダを作成

+ **ランタイム**：Python2.7
+ **環境変数**：
	+ TZ: Asia/Tokyo

+ **ロールポリシ**：
	+ AmazonEC2ReadOnlyAccess
	+ AmazonRDSReadOnlyAccess
	+ Inline policy

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances",
                "rds:StopDBInstance",
                "rds:StartDBInstance"
            ],
            "Resource": "*"
        }
    ]
}
```

### RDS用のラムダ

ソースをコチラで参考ください
https://gist.github.com/hoangvx/a5769ef567e74541e54e27c91758c597

### EC2用のラムダ

ソースをコチラで参考ください
https://gist.github.com/hoangvx/d384c9e9a084fe4620aebadd7e960477

## CloudWatchの設定

![Kobito.BUSfSo.png](https://qiita-image-store.s3.amazonaws.com/0/181951/035ca87c-8478-4ceb-7869-ac9db5a24294.png "Kobito.BUSfSo.png")

## 参考

![Kobito.7P9eOj.png](https://qiita-image-store.s3.amazonaws.com/0/181951/37b19ca5-ecf3-21fb-85be-154b66298729.png "Kobito.7P9eOj.png")
> Ec2の設

![Kobito.aWEcDK.png](https://qiita-image-store.s3.amazonaws.com/0/181951/8ea9300b-a167-6325-a93b-9a691de460b3.png "Kobito.aWEcDK.png")
> RDSの設定

# 以上です
LaravelのPHPUnitでReflectionException: Class config does not existと怒られる


config以外にもcacheとか。ヘルパーやファサードを使っている場合です。

## アプリでも落ちる

キャッシュ系が原因かもしれません。

```bash:
$ composer dump-autoload
```

そのほか`php artisan cache:clear`、`php artisan config:clear`など

### それでも治らない

`.env`が原因かもしれません。

```bash:.env
APP_NAME=HOME PAGE
```

全角や半角スペースが入っているValueはありませんか？
ダブルクオーテーションで囲って解決です。

```bash:.env
APP_NAME="HOME PAGE"
```

`.env`をconfigで読んでることが多いので、`config:clear`しておきましょう。

```
$ php artisan config:clear
```


## setUpを実装している

関数の一番上に`parent::setUp()`を記述するのを忘れていませんか？

```php:
protected function setUp()
{
    parent::setUp();
	
	//前処理
}
```

前処理は`parent::setUp()`の後です。

## tearDownを実装している

こちらもparentを記述するのを忘れていませんか？


```php:
public function tearDown()
{
	//終了処理

    parent::tearDown();
}
```
また、`parent::tearDown()`の後にlaravelのconfigなどを呼ぶとそんなクラスないと怒られます。
私はこれでハマりました。
GCPのファイアーウォール ルールへ複数IPを設定するシェルを作った

ブログの転載です。


ちょっと前に書いた記事でファイアーウォールルールを20個弱作成しました。
http://smot93516.hatenablog.jp/entry/2018/08/06/150052

確認しながらだったので1時間弱の工数。

これをプロジェクト毎に同じ量作成していくって考えるとおぞましい。まじで。

本来なら別プロジェクトでもファイアーウォールルールを共有できたらと思っていろいろ調べてたのですが、見つからなかったので今回の方法に落ち着きました。

## 経緯

GCPへ移行させたとある会社のサーバーへ、１分間に３、 ４通の頻度で大量の迷惑メールが届いているとの報告をうけました。

![2018-08-23 13.55.32 からのスクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/145671/a94c93c6-9b46-2a59-1fc0-9e1836448d3c.png)


ドメインは`qq.com`です。中国？のメールらしい。

Sendgridの管理画面を見てみると`ランダムな数字@qq.com`のメールが頻繁にきてました。

アクセスログを見てIPを検索した結果、ほぼすべてがフィリピンからの攻撃。

いままで、中国から攻撃が来てたのでその対策はしてたのですが、盲点でした。

思い込みって怖いですね。

今後もファイアーウォールルールを作るって考えると本当に鬱になりそうだったので、だれでもシェルを叩いて作成でき、<a href="https://github.com/motty93/gce-firewalls.git">GitHub</a>に公開して共有すればみんな幸せになるんじゃなかろうか、ということで作成しました。

## 準備

ローカルでgloudコマンドが使える環境を作っておいてください。

インストール方法は上の記事に載ってます。

GitHub貼っておくのでcloneしてください。
https://github.com/motty93/GceFirewalls.git

README.mdに拙い英語でやり方書いてるので、文章間違えあればプルリクおねがいします。

## 中国、韓国、北朝鮮、フィリピンのIPを制限

`cn-kr-kp-firewall.sh`が中国、韓国、北朝鮮のIPを制限するシェルです。

`philippines-firewall.sh`がフィリピンのIPを制限するシェル。

また攻撃先があれば随時シェルを追加していきます。

## IPを羅列したテキストを元にシェルを実行

```all-firewall.sh
#!/bin/bash

count=0
BASE_PATH=$(cd $(dirname $0); pwd)
DIR_PARH=$(dirname ${BASE_PATH})

while read line
do
  if [ -s $DIR_PATH/iptext/all-ip-addresses.txt ]; then
    count=$(( count + 1 ))
    if [ "$(uname)" == 'Linux' ]; then
      ADDRESSES=`head -n 255 $DIR_PATH/iptext/all-ip-addresses.txt | sed -e ':loop; N; $!b loop; s/[\r\n]\+/,/g'`
    elif [ "$(uname)" == 'Darwin' ]; then
      ADDRESSES=`head -n 255 $DIR_PATH/iptext/all-ip-addresses.txt | sed "" -e ':loop; N; $!b loop; s/[\r\n]\+/,/g'`
    else
      ADDRESSES=""
    fi
    sed -i -e 1,255d $DIR_PATH/iptext/all-ip-addresses.txt
    if [ $count -lt 10 ]; then
      gcloud compute firewall-rules create ip-reject-0$count \
              --priority 10 \
              --action deny \
              --direction ingress \
              --rules all \
              --source-ranges $ADDRESSES
    else
      gcloud compute firewall-rules create ip-reject-$count \
              --priority 10 \
              --action deny \
              --direction ingress \
              --rules all \
              --source-ranges $ADDRESSES
    fi
  fi
done < $DIR_PATH/iptext/all-ip-addresses.txt

cd $DIR_PATH
git checkout iptext/all-ip-addresses.txt
```

`GceFirewalls/iptext/all-ip-addresses.txt`に中国、韓国、北朝鮮、フィリピンのIP全てが入ってます。

シェル(`GceFirewalls/sh/all-firewall.sh`)を実行すれば、このテキストファイルを元にgcloudコマンドを実行してファイアーウォールルールを作成できます。

もしかしたらOSによってはシェルが上手く動かないかもしれないです。

そんときはプルリク上げてもらえると喜びます。

## 終わりに

ファイアーウォールルールをプロジェクト毎に共有する方法をご存知の方がいらっしゃれば教えていただきたいですm(_ _)m
[Android] ネットワーク状態を確認しよう。


こんにちは！
今日はネットワーク状態を確認する方法を書いてみたいと思います。

# 理由は？

ネットワーク確認はアンドロイドスマホを開発すると必要な部分だと思ってます。
なぜなら、一つ目、HTTP通信をしてサーバーとCommunicationする時、
シムフリーでシムなしで、開発するとWi-Fiでネットワーク利用します。
外に出ると、Wi-Fiない状態になるかもしれません。
二つ目、大量のデータをサーバーからダウンロード必要な時にWi-Fiかモバイルか確認して、
使用人にWi-Fi利用を勧誘する、必要があるかもしれません。

その他の理由もあるかもしれません。

# 方法

##　Permission取得。

```xml:manifest.xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

```

##　System Service 取得。

```java

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkinfo = cm.getActiveNetworkInfo();

if(networkinfo  != null){
    if(networkinfo.getType() == ConnectivityManager.TYPE_WIFI){
        //YOUR CODE 
    }else if(networkinfo.getType() == ConnectivityManager.TYPE_MOBILE){
        //YOUR CODE
    }
}else{
    // ネットワークなし。
}
```

#終わりに

後、IntentFilter を使う方法もあります。
時間あれば、書いてみます。
Spekの2系を使ってみる

# 概要

KotlinのテスティングフレームワークのSpekを試してみたメモ

[Kotlin Fest 2018](https://kotlin.connpass.com/event/91666/) のセッションの [How to Test Server-side Kotlin](https://speakerdeck.com/maeharin/how-to-test-server-side-kotlin-number-kotlinfest) で、2系を待って使ったほうが良いとあったので、現時点でalphaの２系で試してみる

# セットアップ

spek公式の　[setup-jvm](https://spekframework.org/setup-jvm/) のページ通りにgraldeを設定する

## 注意点

* intelliJプラグインのセットアップも忘れずに
    * https://spekframework.org/setup-jvm/#intellij-plugin
    * インストール後にIntelliJでテストクラスを開くと、テスト実行ボタンが表示されるようになる
* [Migrating to 2.x](https://spekframework.org/migration/) のサンプルコード のアサーションは `org.jetbrains.kotlin:kotlin-test'`を使っていると思われる
    * gradleの依存に `testImplementation 'org.jetbrains.kotlin:kotlin-test'`を追加する

# テストの書き方

下記のような三角形クラスのverifyメソッドのテストコード

```kotlin:三角形クラス
class Triangle(private val x: Int, private val y: Int, private val z: Int) {

    enum class Type {
        // 正三角形
        EQUILATERAL,
        // 二等辺三角形
        ISOSCELES,
        // 通常三角形（不等辺三角形）
        NORMAL
    }

    fun verify() = when {
        (x == y && y == z && z == x) -> Type.EQUILATERAL
        (x == y || y == z || z == x) -> Type.ISOSCELES
        else -> Type.NORMAL
    }
}
```

## describe - context - it

* describe
    * 大項目
    * 直下に複数定義することができる
* context
    * 中項目
    * 直下には書けない
    * describeの中に複数定義することができる
    * 省略可能
* it
    * ここで assert をする
    * describeかcontextの中に複数定義することができる

```kotlin
object TriangleTest : Spek({
   describe("三角形の種類を判定") {
        context("3辺がすべて等しい") {
            it("verifyは正三角形を返す") {
                assertEquals(Triangle.Type.EQUILATERAL, Triangle(1, 1, 1).verify())
            }
        }
    }
})
```

## Feature - Scenario - When - Given - Then

1系にあった`given,on,it`は使えなくなり、代わりに`Gherkin`のような形式が使える

Gerkinについては、[リファレンス](https://docs.cucumber.io/gherkin/reference/)を参照

```kotlin
    Feature("三角形の種類を判定") {

        lateinit var triangle: Triangle

        Scenario("正三角形判定") {
            Given("3辺がすべて等しい三角形") {
                triangle = Triangle(1, 1, 1)
            }

            lateinit var result: Triangle.Type

            When("verifyを実行") {
                result = triangle.verify()
            }
            Then("結果は正三角形") {
                assertEquals(Triangle.Type.EQUILATERAL, result)
            }
        }
    }
```

# 所感

どちらの形式でもテストコードを書いたことがなかったので、分類分けしやすそうな`describe - context - it`のほうが自分には使いやすそう

`Feature - Scenario - When - Given - Then` も、文字通り機能ごとのシナリオを考えてテストコードを書いていけば、仕様書のようなテストコードが書けそう。ただ、TDDみたいに開発しながら書くのには向いてなさそう。
準仮想化(PV)タイプの時刻同期

## 時刻同期ができないんだけど
仮想化タイプが準仮想化(PV)の EC2 場合、下記の設定をしないと ntpdate 等での時刻同期は一切できない。

```bash
sed -i -e '$ a xen.independent_wallclock = 1' /etc/sysctl.conf
sysctl -p
echo 1 > /proc/sys/xen/independent_wallclock
```

いつまでも古いインスタンスタイプを使うんじゃなくて、新しいのに置き換えないと。。。

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
C＃でWordをXMLに変換する方法

C＃でWordをXMLに変換する方法
手順1：プロジェクトを作成する
Spire.Docをダウンロードし、システムにインストールしてください。 Visual Studioを使用してプロジェクトを作成し、参照としてSpire.Doc DLLを追加します。
注意：Spire.DocとVisual Studioがシステムに正しくインストールされていることを確認してください。
手順2：Word文書をロードする
Office OpenXML形式に変換する必要があるWord文書ファイルをロードすると、コードは次のようになります。
Document doc = new Document();
doc.LoadFromFile("サンプル.docx");
手順3：Word文書をOpenXML形式に変換すると、コードは次のようになります。
doc.SaveToFile("結果.xml", FileFormat.Xml);
手順4：結果のドキュメントをデフォルトのオープンメソッド（ブラウザなど）で開きます。
System.Diagnostics.Process.Start("結果.xml");
【C#】

```ruby:Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Spire.Doc;
namespace Word_to_XML
{
    class Program
    {
        static void Main(string[] args)
        {
            Document doc = new Document();
            doc.LoadFromFile("サンプル.docx");
            doc.SaveToFile("結果.xml", FileFormat.Xml);
           System.Diagnostics.Process.Start("結果.xml");
        }
    }
}
```

コードを実行した後、以下に示すように、デフォルトのオープンメソッド（ブラウザ）で結果のドキュメントを開きます。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/278784/60e9deb5-42e2-eae8-beeb-6b74aeb6b599.jpeg)
PHP における XML の扱いを学ぶリンク集

適宜追加または更新。
## DOM と SimpleXML

- [PHP 開発者のための XML: 第 1 回 PHP での XML を 15 分で学ぶ](https://www.ibm.com/developerworks/jp/xml/library/x-xmlphp1.html)
- [PHP: DOM - Manual](http://php.net/manual/ja/book.dom.php)
- [PHP: SimpleXML - Manual](http://php.net/manual/ja/book.simplexml.php)

## DOM と XPath

- [PHP 開発者のための XML: 第 2 回 高度な XML 構文解析方法](https://www.ibm.com/developerworks/jp/xml/library/x-xmlphp2.html)

## SimpleXML と XMLReader

- [PHP 開発者のための XML: 第 2 回 高度な XML 構文解析方法](https://www.ibm.com/developerworks/jp/xml/library/x-xmlphp2.html)

## XMLReader

- [PHP 開発者のための XML: 第 2 回 高度な XML 構文解析方法](https://www.ibm.com/developerworks/jp/xml/library/x-xmlphp2.html)

## SAX

- [PHP SAX Parser Example](https://www.tutorialspoint.com/php/php_sax_parser_example.htm)
- [PHP: XML パーサ - Manual](http://php.net/manual/ja/book.xml.php)
- [PHP 開発者のための XML: 第 2 回 高度な XML 構文解析方法](https://www.ibm.com/developerworks/jp/xml/library/x-xmlphp2.html)

## XML-RPC と XMLReader

- [PHP で XML をプル型構文解析する](https://www.ibm.com/developerworks/jp/xml/library/x-pullparsingphp.html)

## XSL

- [PHP 開発者のための XML: 第 3 回 XML を読み取り、操作し、作成する高度な方法](https://www.ibm.com/developerworks/jp/xml/library/x-xmlphp3.html)

## XML それ自体

- [XML徹底入門【わかりやすい図解解説】](http://xml.prognavi.com/)

## XSL それ自体

- [XSLTスタイルシートプログラミング(宣言) | XML徹底入門【わかりやすい図解解説】](http://xml.prognavi.com/?p=66)
GR-LYCHEEを使ってみよう・・・

https://japan.renesasrulz.com/gr_user_forum_japanese/b/weblog2/posts/gr-lychee-gr-web-l-sd-usb

まずは、GR-LycheeをUSB端子に接続しましょう。
USBケーブルは、MicroB用です。

USB端子は、真ん中（Serial）であり、端のUSB端子ではありません。
http://gadget.renesas.com/ja/product/images/pc/pin_map_lychee.png

コンパイラーは、Arduinoライクな以下
http://gadget.renesas.com/ja/reference/lychee/

mbed
https://developer.mbed.org/platforms/Renesas-GR-LYCHEE/
などがあります。

mbedについては、こちらにサンプルがあります。
https://os.mbed.com/users/dkato/

以下サンプルはエラーが出ます。
https://os.mbed.com/users/dkato/code/ESP32_AtBleSample/

こちらであれば、ハングしないで動作しました。
http://gadget.renesas.com/ja/product/lychee_sp/5.html

ESP-32とつながるUSB0はドライバーが必要です。
https://os.mbed.com/media/uploads/samux/serial.zip
[(https://github.com/d-kato/GR-Boards_ESP32_Serial_Bridge/blob/master/README_JPN.md)](https://github.com/d-kato/GR-Boards_ESP32_Serial_Bridge/blob/master/README_JPN.md)
を使用するようです。
jQuery の parents() を JavaScript オンリーでやる

jQuery の parents() は、指定の要素からの親が全部取得できるので便利です。
JavaScript オンリーで書くと以下のような感じですかね。

上の関数が jQuery 、下の関数が JavaScript オンリーです。

```javascript:main.js
(function () {
    // jQuery の parents()
    const jqueryParents = function () {
        console.log($('#hoge').parents());
    };

    // JavaScript で 親→祖先を再帰で取得
    const javascriptParents = function () {
        const parents = [];
        const parentElem = function (elem) {
            if (elem.parentNode) {
                parents.push(elem.parentNode);
                parentElem(elem.parentNode);
            }
        };
        const baseElem = document.getElementById('hoge');
        parents['prevObject'] = baseElem;
        parentElem(baseElem);

        console.log(parents);
    };
    
    // 実行
    jqueryParents();
    javascriptParents();
})();
```

以下のHTMLで `id="hoge"` に対して実行してみます。

```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<form method="POST">
    <input type="hidden" name="hiddenValue" value="12345678901234567890">
    <table>
        <tbody>            
            <tr>
                <th>
                    <label for="">名前</label>
                </th>
                <td>
                    <p>名前を入力してください。</p>
                    <div>
                        <table>
                            <tr>
                                <th>
                                    <label>氏名</label>
                                </th>
                            </tr>
                            <tr>
                                <td>
                                    <input type="text" id="username" value="" placeholder="山田 太郎" maxlength="50">
                                </td>
                            </tr>
                        </table>
                    </div>
                </td>
            </tr>
            <tr>
                <th>
                    <label for="">内容</label>
                </th>
                <td>
                    <p>内容を入力してください。</p>
                    <div>
                        <input type="text" id="hoge" value="" maxlength="100">
                    </div>
                    <p>１００文字以内で入力してください。</p>
                </td>
            </tr>
        </tbody>
    </table>
</form>
<script src="main.js"></script>
</body>
</html>
```

結果はこんな感じです。

![スクリーンショット 2018-08-29 17.21.45.png](https://qiita-image-store.s3.amazonaws.com/0/92538/da0f7d5f-f1f1-348a-8648-fb5917d2e342.png)

なんかちょっと違うけど、だいたい同じになりました。
ラズパイでLチカ(下書き)

##参考

[Raspberry Pi 3でpythonを使いLEDを光らせる（Hello World） - Qiita](https://qiita.com/RyosukeKamei/items/79ee090f1b68014241ab)

[GPIOでLEDの点滅(Python) | Make.](http://make.bcde.jp/raspberry-pi/gpio%E3%81%A7led%E3%81%AE%E7%82%B9%E6%BB%85python/)

[Raspberry PiでLチカ！Scratchのネコちゃんと遊ぼう！ | Device Plus - デバプラ](https://deviceplus.jp/hobby/raspberrypi_entry_010/)
execute many test by smart phone devices at same time 

# 趣旨
1つのサーバー（Mac）で複数のデバイスのテストを実行する環境構築を行う
android , iphone をappiumで実行する環境に関しては、それぞれの記事を参照のこと。

- [setup appium in Mac for iOS](https://qiita.com/emurin/items/a9ef9674308dd5cfcbac)
- [setup appium in Mac for Android](https://qiita.com/emurin/items/5cb9632514a74b056217)


# 試してみてわかったこと
### appium で複数デバイスを紐付けると不安定
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/33e835c8-d70c-48f8-a28f-94b764b01a42.png" Width=60%>
最初、test環境で1つのappiumを立ち上げ、そこに複数のデバイスを接続していた。
client側からは、固定のappium server (IP address, port) と使いたい端末情報(capability)を指定して
テスト実行を行っていた。
この場合、端末Aでテスト実行後、端末Bでテストを行うと、appiumが不安定になり、テストが正しく実行されなかった。

### appiumをずっと走らせていると不安定
appiumを常駐後、繰り返しテスト（失敗を含む）をするといつのまにかappiumが不安定になる


# 構築方針
- デバイス１に対してapium１を用意
- appiumを定期的に再起動

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/f0c940c0-6f00-4f67-6144-e1354be42157.png" Width=60%>

このため、clientはappiumのportとdeviceのcapabilityのセットで指定する必要が出てくる

まあ、こんな構築なので運用面では結構煩雑になってしまっている。
解決したいなぁ～
AWS上のWindowsServer2016でWin32_PhysicalMemoryが取得できない

インスタンスタイプによって、Win32_PhysicalMemoryが取得できたりできなかったりという事象に遭遇しました。

# 取得NGのインスタンスタイプ
m5.large/t3.large/c5.large

![PhysicalMemory_NG.png](https://qiita-image-store.s3.amazonaws.com/0/63464/51e4f30d-e699-19b5-9bc9-c16205f87741.png)

# 取得OKのインスタンスタイプ
m4.large/t2.large/c4.large

![PhysicalMemory_OK.png](https://qiita-image-store.s3.amazonaws.com/0/63464/f01db567-092f-81ca-e6ff-1f10ce2e03b3.png)

ちょっと試行数が少ないですが、最新世代は表示されない状況になっています。
どこかに情報転がっていないだろうか…
JSの数値計算ライブラリ比較まとめ

# モチベーション
とあるwebサービスの新機能で、
　1. 任意精度の小数も含む計算
　2. 浮動小数点誤差の除去
をしたかったので、

　a. min.jsがあるかどうか（ファイルサイズが小さくなったもの）
　b. 型定義ファイルがあるかどうか

を検討項目に入れ、既存のライブラリを比較しました。

# 前提

JSのプリミティブNumber型は、倍精度浮動小数点数なので、特有の[誤差](http://www.allisone.co.jp/html/Notes/Mathematics/Numerical_Analysis/Quantization/Float_round_error.html)を生じます。
もし任意精度での計算をしたいとなると、その実装はとてもめんどくさいです。

実は、**BigInt**という新たな数値型が任意精度計算をサポートしますが、
まだプロポーザルの状態です。


> * [TC39](https://tc39.github.io/proposal-bigint/)でプロポーザルに挙がっている**新しい数値型**
>     * 現在はStage3
>     * 採用確定ではない（Stage4になるまでは却下される可能性あり）
> * **任意精度**の整数
>     * ハードウェアがサポートしているのではなく、各処理系がソフトウェア的に実装する


[JavaScriptの任意精度整数: BigInt vs big-integer - Qiita](https://qiita.com/shimataro999/items/ec6fb9e2601cb6e97b82)
[JavaScriptのBigIntで任意精度の整数値を扱う
](https://sbfl.net/blog/2018/06/18/javascript-bigint/)

また、BigIntは整数だけなので、小数点をサポートしません。


# 数値計算ライブラリ比較表

|ライブラリ|機能|最終更新|minサイズ|型定義|備考|GitHub|
|---|---|---|---|---|---|---|
|[bigNumber.js](http://mikemcl.github.io/bignumber.js/)|任意精度|2018年|8 kB|あり|APIが読みやすい|[MikeMcl/bignumber.js](https://github.com/MikeMcl/bignumber.js/)|
|[numeral.js](http://numeraljs.com/)|メインは表示制御|2017年|11 kB|あり|公式ページがイケてる|[adamwdraper/Numeral-js](https://github.com/adamwdraper/Numeral-js)|
|[BigInteger](https://www.npmjs.com/package/big-integer)|任意精度整数|2018年|27 kB|あり|活発に開発されている|[peterolson/BigInteger.js](https://github.com/peterolson/BigInteger.js)|
|[math.js](http://mathjs.org/)|高機能<br>（複素・行列など）|2018年|135 kB|あり|内部でBigNumber.jsを使っているらしい|[josdejong/mathjs](https://github.com/josdejong/mathjs/)|
|[BigInt](https://tc39.github.io/proposal-bigint/)|任意精度整数|-|-|-|Chromeのみ対応<br>(2018/8現在)|-|
|[decimal.js](https://www.npmjs.com/package/decimal)|最低限の計算機能のみ|2011年|なし|なし||[shinuza/decimal-js](https://github.com/shinuza/decimal-js)|
|[jsdecimal](https://www.npmjs.com/package/jsdecimal)|4倍精度（28桁まで）|2015年|なし|なし|日本人の誰かが書いたやつ|[hiroshi-manabe/JSDecimal](https://github.com/hiroshi-manabe/JSDecimal)|
|bigDecimal.js|情報が少ない|2012年|なし|なし|古い|[iriscouch/bigdecimal.js](https://github.com/iriscouch/bigdecimal.js)|

# 結局どれ？
僕は、任意精度・小数が使える中で、もっともminの小さいBigNumber.jsを選びました。

今後BigIntが正式採用されれば、BigNumberも採用される流れになるかもしれませんが、
当面はブラウザのサポートをあてにはできないでしょう。

IEやEdgeを捨てられないサービスでは特にね、、、、
SwiftのOptionalに関する考察

### Optionalとは何なのか

SwiftのOptionalとは何なのか、どうしても覚えることができない。
Swiftの勉強をしよう！と思い立つたび、Optionalに関する情報を集め、
理解したような気になり、数週間も経つと忘れてしまう。
結局のところ、良くわからない。Optionalって何なんだ。

Optionalとは~だ。のような文章を読んでも、Optionalについて本当のところを
理解できていない。のですぐ忘れる。
今度こそ、Optionalをマスターしたい。半年後も一年後もOptionalについて
説明できて、Optionalを駆使したソースコードを書けるようになりたい。
SwiftのOptionalについて、自分の頭で考えてみよう。
技術的に正しい事よりも、理解する事を重視したい。

# Swiftの変数

自分がSwiftの変数だったとして、自分にnilを代入した状態で何らかの処理を
されると、大切なもの、すなわちアプリケーションが壊れてしまうとしたら、
「私にnilを代入しないで!」となる。これがSwiftの普通の変数。
Swiftの変数には値を設定しないといけない。

```swift

var param:String = nil // エラーになる。
```

# オプショナル
基本的に自分にnilを代入してほしくない。だけど、どうしてもっていうなら、
せめて私にnilが代入されているかどうか、調べてから使ってほしい。
その時には、あらかじめ自分が普通の変数とは違うという事を明示しておくから。
これが**オプショナル**。

```swift

var param:String? = nil // オプショナル

param = "hoge"

if param != nil { // nilが代入されているかどうか調べてから使って
    print("not nil")
} else {
    print("nil")
}
```
# アンラップ
実のところ、私がオプショナルである時、値は袋にいれてある。
袋に入れてあれば、それがnilかどうかなんて分からないから、処理されたところでクラッシュしない。
だから、値が必要な時には袋から出さないといけない。これが**アンラップ**。

```swift

var param:String? = nil // オプショナル

param = "hoge"

if param != nil { // nilが代入されているかどうか調べてから使って
    print(param!) // 使う時にはアンラップして
} else {
    print("nil")
}
```

# オプショナル・バインディング
普通の変数はnilを受け取ることができない。
だから、私が持っているものを変数に渡すことができたら、
それはnilじゃないって事になるし、変数の持ち物は袋から出す必要もない。
これが**オプショナル・バインディング**。

```swift

var param:String? = nil // オプショナル

param = "hoge"

if let a = param { // 変数aに渡せるということはnilじゃない
    print(a) // aは普通の変数なので、アンラップする必要もない
} else {
    print("nil")
}
```

# オプショナル・チェーンニング
だけど、物事がそんなに単純じゃなくて、私が実はクラスという存在で、持っているものが単なる値ではなく変数やら関数だったら、そのたびにifなんちゃらを書くのは手間だよね。
それなら、必要なものにアクセスする途中経過は簡略化して?を書くだけでいいよ。
ただし、一度も袋から出してないんだから、最後に取得した物は、
袋に入ったままっていう事を忘れないで。
使う時にはちゃんと袋から出して。
袋から出そうとしたら何も入っていなかったって事もありうる。だからnilチェックして。

これが**オプショナル・チェーンニング**。

```swift

class MyClass {
    var str = "summer"
    func yeah() {
        print("yeah")
    }
}
var param:MyClass? = MyClass()

print(param?.str) // Optional("summer")
if let value = param?.str {
    print(value) // summer
}
param?.yeah() // yeah
```

# 強制アンラップ
しかし、まあ、最初はnilが入るけど、すぐに値が設定されるから、
使われる時には、チェックなんかしなくても、実は大丈夫な時もあるんだよね。
そういう時は、しのごの言わずに取りだしてもいいかも。
これが**強制アンラップ**。

```swift

var param:String?
param = "hoho"
print(param!) // 強制アンラップ
```

# 有値オプショナル
後で強制アンラップされるって分かってるんだったら、最初から
「取り出される時には値が設定されてます」って事を明示しておけば良いんじゃない。
そしたら、袋に入れておく必要もない。のでアンラップする必要もない。
これが、**有値オプショナル**。

```swift

var param:String!
param = "hohog"
print(param) // アンラップしなくて良い
```