OmniAICreator/Qiita-1.07M huggingface dataset:
構造体のサンプル


構造体： __複数の異なる型をまとめる方法__

以下、生徒のデータを構造体で管理するサンプル

```c
#include <stdio.h>
#include <string.h>

// 構造体タグ（省略可）を元に新しい型をつくる方法
typedef struct {
    // 項目 = メンバ
    char name[64]; // 名前
    int year;      // 学年
    int clas;      // クラス
} student;

void input_student(student *data); // student型のポインタ変数の宣言
void show_student(student data);

int main(void){
    const int SIZE = 3;
    // 初期化
    student data[SIZE]; // 構造体名 実体名;

    for(int i = 0; i < SIZE; i++){
        input_student(&data[i]);
    }
    printf("==============\n");
    for(int i = 0; i < SIZE; i++){
        show_student(data[i]);
    }

    return 0;
}

void input_student(student *data){
    // ポインタとアロー演算子によるアクセス
    // 構造体の実態のポインタ変数名->メンバ名
    printf("名前は？\n-> ");
    scanf("%s", data->name);
    printf("学年は？\n-> ");
    scanf("%d", &data->year);
    printf("クラスは？\n-> ");
    scanf("%d", &data->clas);
    printf("---\n");
}

void show_student(student data) {
    printf("入力された名前: %s\n", data.name);
    printf("入力された学年: %d\n", data.year);
    printf("入力されたクラス: %d\n", data.clas);
    printf("---\n");
}
```


```bash:入出力
名前は？
-> 佐藤
学年は？
-> 3
クラスは？
-> 1
---
名前は？
-> 鈴木
学年は？
-> 2
クラスは？
-> 2
---
名前は？
-> 木村
学年は？
-> 1
クラスは？
-> 3
---
==============
入力された名前: 佐藤
入力された学年: 3
入力されたクラス: 1
---
入力された名前: 鈴木
入力された学年: 2
入力されたクラス: 2
---
入力された名前: 木村
入力された学年: 1
入力されたクラス: 3
---
```


> 参考
[苦しんで覚えるＣ言語 複数の型をまとめる](https://9cguide.appspot.com/16-01.html)
[【C言語入門】構造体の使い方(struct、ポインタ、アロー演算子)](https://www.sejuku.net/blog/24473)
ロバストネス分析の目的

# ロバストネス分析の目的

ロバストネス分析は、詳細設計の前に実施する予備設計です。予備設計をすることによってシーケンス図やクラス図を作成するときに仕様の詳細について調べたり考えたりする時間を省略することができます。ロバストネス図作成時に、ユースケース記述上の足りない観点や疑問点を洗い出し、完全なユースケース記述に近づけます。

1. ユースケース記述の不足を発見する
1. 仕様の抜け漏れを発見する
1. 代替コースの処理が考えられているか確認する
2. ユースケース記述にフィードバックし記述を完全なものにする

## ロバストネス図が影響を与える詳細設計

ロバストネス図で表現されている、バウンダリとエンティティはクラス図のクラス、シーケンス図のオブジェクトとなり、コントロールはクラスのメソッド(振舞い)になる。

## ロバストネス図のルール

* バウンダリー 名詞
* コントロール 動詞
* エンティティ 名詞

`名詞 → 動詞 → 名詞`という繋りにする。`名詞 → 名詞` はNG。

* 名詞は名詞と繋ぐことはできない
* 動詞は他の動詞と繋ぐことができる
* 名詞は動詞と繋ぐことができる

## 図の例

![ロバストネス分析サンプル.png](https://qiita-image-store.s3.amazonaws.com/0/7565/ee74cbdb-adb8-2a25-8713-135f37527ae9.png)

## アンチパターン

* ユースケース記述を単純に図に変換する
dockerでdjangoの開発環境を作る際のメモ

Dockerの勉強をしつつdjangoも触ってみたいなということで
djangoの開発環境をコンテナ化してみました。

自分用に手順をまとめておきます
（内容は随時追記しようと思います）

#djangoをdockerコンテナで動かすまで

@amazipanguさんの記事を参考にさせていただきました
https://qiita.com/amazipangu/items/bce228f506f894cd825d

#コンテナを作成してからアプリのひな型作成まで
https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/
django girls tutorialを参考にしました（読んでも何がgirlsなのかわからない）

管理画面にテーブルを追加するところがありますが、（下記URL）
https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/django_admin/
dockerの場合はコンテナを再起動しないと反映されないみたいです。
springでbeanをJSONとしてファイル出力


## pom.xml
```xml:pom.xml
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.1.RELEASE</version>
	</parent>
	<dependencies>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
	</dependencies>
```

## ObjectWriterを使用してファイル出力

```java
package kagamihoge.tojsonfile;

import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;

import lombok.AllArgsConstructor;
import lombok.Data;

@SpringBootApplication
public class BeanToJsonFileApplication implements CommandLineRunner {
	public static void main(String[] args) throws InterruptedException {
		SpringApplication.run(BeanToJsonFileApplication.class, args).close();
	}

	@Bean
	public ObjectWriter writer() {
		ObjectMapper mapper = new ObjectMapper();
		ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());
		return writer;
	}

	@Autowired
	ObjectWriter writer;

	@Override
	public void run(String... args) throws Exception {
		List<Sub> subList = Arrays.asList(new Sub(1, true), new Sub(2, true));
		Top top = new Top("hogeId", null, subList);

		writer.writeValue(Paths.get("json.txt").toFile(), top);
	}

	@Data
	@AllArgsConstructor
	static class Top {
		private String hogeId;
		private String nullValue;
		private List<Sub> subList;
	}

	@Data
	@AllArgsConstructor
	static class Sub {
		private int subId;
		private boolean bool;
	}
}
```

## 出力例
```
{
  "hogeId" : "hogeId",
  "nullValue" : null,
  "subList" : [ {
    "subId" : 1,
    "bool" : true
  }, {
    "subId" : 2,
    "bool" : true
  } ]
}
```

## 他の制御項目
基本的にはjacksonなので、他にやりたいことがあれば大抵はぐぐれば出てくる。

以下はその一例。

### キーをキャメルケースからスネークケースに変換
```java
import com.fasterxml.jackson.databind.PropertyNamingStrategy;

mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
```

出力例。

```
{
  "hoge_id" : "hogeId",
  "null_value" : null,
  "sub_list" : [ {
    "sub_id" : 1,
    "bool" : true
  }, {
    "sub_id" : 2,
    "bool" : true
  } ]
}
```

### キーを任意の値に変更
```java

@JsonProperty("alternateId")
private String hogeId;
```

### Stringとして出力
```java
System.out.println(writer.writeValueAsString(top));
```

### JSONの整形が不要な場合
```java
import com.fasterxml.jackson.core.util.MinimalPrettyPrinter;

ObjectWriter writer = mapper.writer(new MinimalPrettyPrinter());
```

出力例。

```
{"null_value":null,"sub_list":[{"sub_id":1,"bool":true},{"sub_id":2,"bool":true}],"alternateId":"hogeId"}
```
【Rails】一定数以上の文字列を省略して...みたいに表記する方法

よくネット記事とかでみるやつです。

タイトルがあって、文字列の端っこが...で表記されるやつ。

んで、クリックすると続きが読めると。

Railsではこの...を作ってくれるメソッドが用意されてます。
それがtruncateメソッド。

さっそく使ってみます。

例えば、文字列が10文字多くなったら...がでてくるようにするとしましょう。

```pry
[10] pry(main)> hoge = '123456789abcdef'
=> "123456789abcdef"
[11] pry(main)> hoge.length
=> 15
```


いま変数hogeに文字数15の文字列を代入しました。
このhogeをtruncateしてみます。

```pry
[12] pry(main)> hoge.truncate(10)
=> "1234567..."
[13] pry(main)> hoge.truncate(10).length
=> 10
```

truncateのオプションには何文字までか？を入れます。
今回は、10と入れたので10文字ですね。
...が3文字としてカウントされてるので、7文字以降が...と表記されてます。

じゃあ、hogeが10文字以下でtruncateをするとどうなるか？

```pry
[14] pry(main)> hoge = '12345'
=> "12345"
[15] pry(main)> hoge.truncate(10)
=> "12345"
```

なにも変化しない！

nilはどうか。

```pry
[18] pry(main)> hoge.truncate(10)
NoMethodError: undefined method `truncate' for nil:NilClass
from (pry):18:in `<main>'
```

怒られました。


空の文字列にはどうでしょうか。

```pry
[20] pry(main)> hoge.truncate(10)
=> ""
```

ちなみに、truncateにオプションを何も渡さないと20文字がデフォルトだそうです。
AfterEffects シェイプレイヤーのコンテンツ内プロパティのインデックスを活用する。

#やりたかった事
１つのシェイプレイヤーで作成した複数のオブジェクト（長方形）をインデックスを参照させて、ポジションにエクスプレッションで整列出来るようにする。


最終的な完成品は下記の画像
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/178061/58a1aa04-89dd-9204-c23a-59e30431ffee.jpeg)

#具体的に
複数のオブジェクトを整列させる為には、シェイプレイヤー内の一つ上の長方形オブジェクトのサイズをエクスプレッションで受け取って、ポジションを自動で配置させる。
リピーターも使わず、レイヤーインデックスでも無い方法で考えてみた。

##さっそく作業
まず、プロパティにはグループのインデックスしか無いみたいです。（自分で調べた限りでは）
つまり
長方形パス１のインデックスは存在していて、その中のプロパティには存在してないようです。
長方形パス２はインデックス２
長方形パス３はインデックス３
と存在しています。
下記画像

![000.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/ce1cdf8e-6d95-bee2-0ba1-90b03ea56d45.jpeg)

レイヤーインデックス（thisLayer,+1）の様に簡単に出来たらいいですけどね・・・

##そこでグループのインデックスを活用すればいい事に気が付いた。
インデックスの参照はこれ

```js
thisProperty.propertyGroup(1).propertyIndex
```

これを長方形のポジションに活用していく。

##最終的なエクスプレッションはこれです。

```js
Num=thisProperty.propertyGroup(1).propertyIndex-1;
x=content("長方形パス "+Num).size[0]*Num+(effect("margin")("スライダー")*Num);
y=value[1];
[x,y]
```

![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/178061/591be08e-46ec-175a-67c4-ce5f807524a4.jpeg)

#解説
長方形パス１はベースとなる為ポジションはvalueのまま
長方形パス２のポジションにエクスプレッションを追加する。
まず

```js
Num=thisProperty.propertyGroup(1).propertyIndex-1;
```
この文で、長方形パス２のインデックスを取得し、マイナス１をする。
この状態でNumは１を持っている状態です。
この文で一つ上のインデックスを拾ってくれる状態です。

あとは計算して複製すれば自動になるように下記のコードを記述（オブジェクト間のマージン用にエクスプレッション制御のスライダーが追加してあります。）

```js
x=content("長方形パス "+Num).size[0]*Num+(effect("margin")("スライダー")*Num);
```

これで完成です！
長方形パスを複製すればどんどん綺麗に横に並んで行ってくれます。

![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/178061/26d1b546-3235-02f3-12dc-e39e87a02228.jpeg)


#あとがき
何気に何度もトライしていたんですが、ようやく閃きました。
半年ぐらいは悩んでたかも。。。
パッとすぐ思いつけるぐらいなれたらなぁ～。


#2018/06/14追記

##プロパティのインデックスについてもう少しわかりやすく

```jsx
//myNum = thisProperty.propertyIndex;
result = 2
//myNum = thisProperty.propertyGroup(1).propertyIndex; 
result = 3
//myNum = thisProperty.propertyGroup(1).propertyGroup(1).propertyIndex;
result = 1
[myNum ,myNum ]
```
![bandicam-2018-06-14-13-17-16-437_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/62e3bd9b-d8a6-fbcf-19a5-7b05827d2900.jpeg)
ruby on railsでカラムを追加する

こんにちは。m.saekiです。
rails初心者です。忘備録を兼ねて投稿します。

modelをgenerateしたけどcolumn追加する必要があるって時もこれで大丈夫です！
環境構築とかはできている前提で書いていますのでmm

## 環境
rails : 5.2.0
ruby  : 2.4.1
sqlite3 : 3.16.0

## Generate model
```
$ rails g model [Model名] [カラム名:型]
$ rails g model user name:string
```
<strong>users

|  id  |  name  |
| ---- | ---- |
|  1  |  m.saeki  |

## Add column
```
$ rails g migration Add[カラム名]To[Modelのclass名][カラム名:型]
$ rails g migration AddProfileImageToUsers profile_image:string
```
<strong>users

|  id  |  name  |  profile_image  |
| ---- | ---- |  ----  |
|  1  |  m.saeki  |  https://qiita-image-store.s3.amazonaws.com/0/237545/profile-images/1518189253  |

## Remove column
```
$ rails g migration Remove[カラム名]To[Modelのclass名][カラム名:型]class
$ rails g migration RemoveProfileImageToUsers profile_image:string
```
<strong>users

|  id  |  name  |
| ---- | ---- |
|  1  |  m.saeki  |

## 終わりに
コマンド一発でFrameworkがいい感じにやってくれるのは便利ですね！
アレクサのスキル作成に手を出したが、撃沈した。

# 概要

アレクサのスキルに手を出したが、撃沈したのでメモ。
こんなところにひっかかりやすいんだな〜とおもってもらえるとよい。
また、うまくいったらなにかしら投稿予定。


# 1. そもそもうごかない理由がわからない

スキルを作成する際にテスト用のページがあるため、テストをしてみたが、JSONが帰ってくるにもかかわらず、「スキルの応答がうまくいきません」的なメッセージが出てくる。
それ以外の情報がないため、先に進まない。つまりそれは、エラーを握り潰してるってことj(ry
先人の先輩に聞いたところ、やっているうちにこの辺だな・・・がわかってくるらしい。ナンテコッタ。


# 2. そもそも用語がわからない

Amazon系のサービス全般に言えることだが、ちゃんと用語を押さえておかないとそもそも説明がわからず、進まない。マジで進まないため、先に動画などで用語を押さえておくことをオススメする。

# 3. lambdaについて理解する

lambdaについての理解が足りないとそもそも作るときに何をしたら良いのかわからなくなりやすい。
lambdaに書いたコードとスキルのIntentの対応も押さえておくと、さらに理解が進みそう。

# まとめ

ひとまずいきなり手を出す前に基本を固めておくのが良いかと。
何かこのようにした方が良いなどありましたら意見ください。
jsでrange関数（min, max, step）

[jsでrange関数をつくる - Qiita](https://qiita.com/akameco/items/a2b698dd4a067754997b)

これにmin引数とstep引数が欲しくなった。こういうやつである。

```javascript
range(0, 10, 2);
// [0, 2, 4, 6, 8]
```

コメントで教えていただいた。これで実現できる。

```javascript
const range = (min, max, step=1) =>
    Array.from({length: (max - min + step) / step}, (v, k) => min + k*step)
```

firefox59で動作確認した。
「codesignは、キーチェーンに含まれるキー"privateKey"を使用して署名しようとしています。」ポップアップを表示しないようにする

# :one: 環境

* OS: macOS High Sierra 10.13.4
* Xcode: 9.3 Build version 9E145
* Node.js: v8.9.3
* npm: v5.6.0
* cordova: v7.1.0
* Ionic: 3.20.0
* cordova-ios: 4.5.4

<!---------------------------------------------------------------------------->

# :two: 内容

Ionic(Cordova)で`ionic cordova build ios --prod --release --device`コマンドでビルドしようとすると、以下のようなポップアップが表示される。

![codesignダイアログ.png](https://qiita-image-store.s3.amazonaws.com/0/67192/7e256508-c1d2-4dda-8364-5ef2a2784e82.png)

今後CI化を視野に入れているためCUIで完結したいのにGUIが表示されるのは困るため対応を検討した。

<!---------------------------------------------------------------------------->

# :three: 対応

キーチェーンで対象の証明書を「ログイン」から「システム」に移動したところGUIによる確認表示は無くなった。(\*'ω'*)

### **参考情報**

以下のURLを参考に`security unlock-keychain`と`security import`を使う方法を試したが動作せず。
https://qiita.com/ginrou@github/items/6b81f7a48d47872e5a1e
usbipの使い方


ウェブサイトによって情報が錯綜しているので時系列でまとめてみた。

## 80e4b9432c7d84f70686e69bb7469d89d58e5d87 (130404) 以降
<https://github.com/torvalds/linux/commit/80e4b9432c7d84f70686e69bb7469d89d58e5d87>

### host
- sudo modprobe usbip-host
- sudo usbipd -D
- sudo usbip list --local
- sudo usbip bind --busid [busid]

### remote
- sudo modprobe usbip-core
- sudo modprobe vhci-hcd
- sudo usbip attach --remote [host] --busid [busid]

## e9837bbb3e694eef4c55c934ebf1f8a0399b142c (110526) 以降
<https://github.com/torvalds/linux/commit/e9837bbb3e694eef4c55c934ebf1f8a0399b142c>

### host
- (同上)

### remote
- sudo modprobe usbip-core
- sudo modprobe vhci-hcd
- sudo usbip attach --host [host] --busid [busid]

## 7e485ee7f530bb8f5c02c2ae68d73ce7ee3dfad5 (110526) 以前
<https://github.com/torvalds/linux/commit/7e485ee7f530bb8f5c02c2ae68d73ce7ee3dfad5>

### host
- sudo modprobe usbip-host
  - より古い環境では sudo insmod usbip_common_mod.ko; sudo insmod usbip.ko
- sudo usbipd -D
- sudo bind_driver --list
- sudo bind_driver --usbip [busid]

### remote
- sudo modprobe usbip-core;sudo modprobe vhci-hcd
  - より古い環境では sudo insmod usbip_common_mod.ko; sudo insmod vhci-hcd.ko
- sudo usbip -a [host] [busid]

## 結論

正式版 <https://github.com/torvalds/linux/commit/588b48caf65c4a92af567948ec0025065e749ddf> (140820)になってからのバージョンは全て一番上の使い方です。よかった。
誤ってlistやmaxなどを変数名にしてあとで困った時に del 文 が便利

Jupyter Notebookを使っていて実際にあったこと。
何も考えずに

```python
list = [1, 2, 3, 4, 5]
```

みたいなリストを既に作っていた。で、それとは別に

```python
hoge = [1, 1, 1, 2, 2, 3]
```

みたいなリストの要素を重複がないようにして取り出したくなった。しかも、インデックスで要素を参照したい。
そういう時には一度set型にしてからlist型にまた戻せば良いのだろうということで

```python
list(set(hoge))
```

を打ったら

```bash
TypeError: 'list' object is not callable
```

となる。listを変数名にしたのが悪いらしい。もちろん最初からやり直して変数名をlistではないようにすればいいのだが、既に重い計算をしていたのでJupyter NotebookをRestartしたくない。そういう時は

```python
del list
```

すればよい。こうするとlistというリストは消えてくれるので、

```python
list(set(hoge))
```

すれば、ちゃんと

```python
[1, 2, 3]
```

が返ってくる。めでたしめでたし。
ちょっと考えてみると、他にも

```python
max = 5
```
みたいな変数名にしてしまうと、

```python
max(2, 4)
```
```bash
TypeError: 'int' object is not callable
```

となる。こういう時にも

```python
del max
```

すればよいのである。

## まとめると・・・


```len()``` や ```max()```のような組み込み関数（[公式ドキュメント](https://docs.python.jp/3/library/functions.html)参照）と同じ名称の変数を設定してしまうと、その変数は呼び出しができない（not callable）オブジェクトなのでエラーになる。そういう時は ```del``` 文を使って変数をなかったことにすればよい。

まあ、そもそも組み込み関数と同じ名称の変数なんて作らないのがベストである。


## ちなみに・・・

これは完全に余興だが、組み込み関数と同じ名称の呼び出し可能なオブジェクトを設定してもエラーにならないようである。例えば ```abs()``` は引数の絶対値を返す関数だが、同じ名称の


```python
def abs(n):
    return n * 5
```

という関数を設定すると、関数は呼び出し可能なのでエラーにはならず、```abs(-1) = -5```となってしまう。また、本当はクラス名を小文字から始めるのはルール違反だが、

```python
class abs:
    def __init__(self, n):
        self.n = n
    def speak(self):
        print(str(self.n) + "の絶対値はよくわかりません。")
```

とすると、クラスも同様に呼び出し可能なのでエラーにはならず、

```python
abs(-1).speak()
```

```bash:
-1の絶対値はよくわかりません。
```

ということが出来てしまう。
tmux 2.7でエスケープシーケンスによるウィンドウ名の変更を有効にする

tmux 2.7では`allow-rename`オプションがデフォルトで`off`に変更になりました[^1]。
このオプションはエスケープシーケンスによるウィンドウ名の変更[^2]を許可するものです。

[oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)などは`precmd_functions`や`preexec_functions`を利用して、自動的にウィンドウ名をカレントパスや実行プログラム名などに変更していて[^3]、ウィンドウ名をステータスラインに表示させておくと非常に便利です。
tmux 2.7に更新したところ、ウインドウ名の変更がうまく動いていなかったのですが、`allow-rename`がデフォルトで`off`になっていたのが原因でした。

設定ファイルで`allow-rename`を`on`にすることで解決しました。

```tmux.conf
setw -g allow-rename on
```

[^1]: https://github.com/tmux/tmux/blob/0e1b339c1000eb8ca6d2bf7df5fb89fd95654e57/CHANGES#L61
[^2]: `$ printf '\ekWINDOW_NAME\e\\'`と実行すると、ウィンドウ名が`WINDOW_NAME`になるなど
[^3]: https://github.com/robbyrussell/oh-my-zsh/blob/master/lib/termsupport.zsh
Spring Boot の Fully Executable Jar でログを出力させない方法

# はじめに
Spring BootのExecutable Jarを使ってプロジェクトを起動する場合、もともとのプロジェクト内でLogback等を使ってログを出力していると、LogbackとExecutable Jar の２つのログが出力されてしまう。
Spring BootのExecutable Jarの設定ファイルにはログの出力先、ログ名を設定する項目はあるが、ログの出力を制御する項目は無いらしい。
Spring BootのExecutable Jarのログを出さないようにするにはどうすればいいのだろうか・・・

# 解決方法
ずばり、「/dev/null」を使う
## /dev/null とは？
/dev/null（nullデバイスとも呼ばれる）は、UNIXやUnix系OSにおけるスペシャルファイルの1つで、そこに書き込まれたデータを全て捨て、読み出してもどんなプロセスに対してもデータを返さない（EOFを返す）

## 設定方法

つまり、Spring Boot の Fully Executable Jarのログの出力先を「/dev/null」にすればいい

- Spring BootのExecutable Jarの設定ファイル(/usr/local/xxx/xxx.conf)に以下を追加

```conf:xxx.conf
export LOG_FOLDER=/dev      #ログファイルの出力先フォルダ
export LOG_FILENAME=null    #ログファイル名

```
m5stackでLチカ

m5stackをさわる機会があったので、ディスプレイあるけど、よくあるLチカをやってみました。
ArduinoIDEのセットアップや開発できるようにするのは別の方の記事をご参考にしてください。

使ったLEDはこれ
http://akizukidenshi.com/catalog/g/gI-01322/

ここで抵抗を計算して、80Ωを用意。
http://akizukidenshi.com/download/led-r-calc.pdf

で、さっそくやってみます。

こんな感じでGroundと22pinに挿します。
![m5stack.png](https://qiita-image-store.s3.amazonaws.com/0/809/3e385b8d-b60c-2c6a-a324-036e59e5d892.png)


で、ブレッドボードにつなげます。
つなげ方は「Arduino Lチカ」とか検索すると丁寧に解説してるサイトがあるのでそちらをご参照ください。

![ledoff.jpg](https://qiita-image-store.s3.amazonaws.com/0/809/af709cc7-36f0-4b02-a8e6-4cdd6d4457be.jpeg)


あとは、ソース書くだけです。



~~~
#include <M5Stack.h>

int ledPin = 22;     // 今回は22のpinに挿したので。
int ledState = LOW;

// the setup routine runs once when M5Stack starts up
void setup(){

  // Initialize the M5Stack object
  M5.begin();

  // 一応、hello worldも。　
  M5.Lcd.printf("hello world");

  pinMode(ledPin, OUTPUT);  
}

// the loop routine runs over and over again forever
void loop() {

  // BtnAを押したらLEDをオン
  if (M5.BtnA.wasPressed()) {
    ledState = HIGH;
    digitalWrite(ledPin, ledState);
  }

  // BtnBを押したらLEDをオフ
  if (M5.BtnB.wasPressed()) {
    ledState = LOW;
    digitalWrite(ledPin, ledState);
  }  
  
  m5.update();
}

~~~

このソースを書き込めば、
画面にはhello worldが表示されて、A、BボタンでLEDのオンオフができます。

![ledon.png](https://qiita-image-store.s3.amazonaws.com/0/809/f5c93096-cd0e-e25b-19cb-72ca02bffee2.png)
VB.NET のヒアドキュメント VS 2015版

## ヒアドキュメントを記述したい

SQL などが多いと思いますが、プログラムの中に他のプログラムを記述することはしばしばあります。その際に便利なのがヒアドキュメントなどと呼ばれている記法です。「ヒアドキュメント」という呼称は言語によって異なり、Visual Basic では「複数行の文字列リテラル」と呼称しています。ですが、概ね「ヒアドキュメント」で検索すれば見つけられるでしょう。

## ３つの選択肢

VB.NET でヒアドキュメントを使いたい場合、VS 2015 では３つの記法を使えます。

参考：
https://qiita.com/alg/items/f0f94902f0d97adcf15d
https://msdn.microsoft.com/ja-jp/magazine/dn890368.aspx

### 1. System.Xml.Linq.XElement を使う方法（Visual Basic 9 以降）

XML リテラルをインラインで記述できる方法を利用し、ヒアドキュメントのように使う裏技的な記法です。

```vb:System.Xml.Linq.XElementによるヒアドキュメント
Dim sql As String = <Query><![CDATA[
    SELECT
        *
    FROM theTable
    WHERE 1=1
        AND id = ?
]]></Query>.Value
```

この書き方を採用する場合、デフォルトの文字色がかなり薄い灰色なのでとても見づらいことになります。設定を変更したくなるでしょう。「ツール > オプション > 環境 > フォントおよび色 > 表示項目 > "VB XML リテラル - CData セクション"」が該当のものになります。好みの色に変更することで見やすく出来ます。

### 2. 複数行の文字列リテラル（Visual Basic 14 以降）

二重引用符の中で改行ができるようになりました。直感的です。

```vb:複数行の文字列リテラルによるヒアドキュメント
Dim sql As String = "
    SELECT * 
    FROM theTable
"
```

### 3. 文字列補完を含む複数行の文字列リテラル（Visual Basic 14 以降）

二重引用符のアタマに `$` 記号を付けます。これは `String.Format` の代替構文です。

```vb:文字列埋め込みありの書き方
Dim sql As String = $"
    SELECT
        *
    FROM person
    WHERE 1=1
        AND section = '{KEIRI}'
        AND status  = '{ENABLE}'
"
```

サンプルのように定数を埋め込みたい場合に便利です。検索引数として、ユーザーに入力してもらうものの他に固定値を使いたいことはあるものです。マジックナンバーを用いるのではなく、記号定数を定義してそれを利用するのは良い選択です。

[変数を埋め込むのはダメ](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cad=rja&uact=8&ved=0ahUKEwixgd6I_sXaAhXLgbwKHRZrD2YQFgg4MAM&url=https%3A%2F%2Fja.wikipedia.org%2Fwiki%2FSQL%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%25B3&usg=AOvVaw3eKA2mU5cHPL5NQwPJt9dD) ですよ。

## 結局どれを採用したか

「1」をずっと使ってきて「2」「3」のような王道的な記法が出てきたので、そちらに移行しようかと思いました。しかしながら、次にあげる理由で「1」の記法を使っています。

### 定数の埋め込みをやめた

SQL をヒアドキュメントに書くことのアドバンテージは「手軽に SQL 単独での検証ができること」にあると思うので、その際の編集箇所は少ない方が好ましく、定数よりむしろマジックナンバーのほうが良い。

```sql
SELECT
    *
FROM person
WHERE 1=1
    -- 5=KEIRI
    AND section = '5'
    -- 1=ENABLE
    AND status = '1'
```

現在はこのように書いています。コメントが含まれるとエラーになるのでコードで SQL を実行する直前にコメントを取り除く処理を経由します。

コード値が変更されたら修正箇所が多くなりますが、こうした値はめったに変更されるものではありません（普通は...）。可読性は落ちますが検証やデータ確認時の利便性から、あえてマジックナンバーを使用しています。

### コードの折り畳みができる

処理の流れを読みたいときに邪魔になるので、折りたたんで隠しておきたいことがしばしばあります。「1」の記法ではそれができます。Visual Studio 2015 で確認していますが、より新しいバージョンでは他の記法でも折りたたみが出来るようになっているかもしれません。いまのところは Visual Studio 2015 を中心に使用しているため、しばらくは「1」の記法を使用していくでしょう。
iPhoneXのタブバーの高さ

久しぶりの投稿です。

モーダルビューを実装しようとして、ナビゲーションバーとタブバーの部分のみ透過して再現しようとしたところ、何故かiphoneXだとタブバーとの間に妙な余白ができていました。

https://qiita.com/risuke/items/bb5735f0e8f3bc8306db

上の記事によるとiphoneXだとナビゲーションバーは位置の調整のみのようですが、タブバーは大きさ自体が変更されているようです。
xcodeもiphoneX対応してタブバーを大きく表示してくれているのかと思いましたがそんなことはなく、通常通り49.0ptで表示されており、拡大分34.0ptの余白が空いてしまっているようでした。

なので、デバイスのチェックを追加して、余剰分を引いてやることにしました。


```ruby:呼び出される側
func checkDevice() -> Bool {
        if UIDevice().userInterfaceIdiom == .phone {
            if UIScreen.main.nativeBounds.height == 2436 {
                return true
            }
        }
        return false
    }
```

```ruby:呼び出し元
if self.checkDevice() {
            self.bottomMarginConstraint.constant = self.bottom - 34
        } else {
            self.bottomMarginConstraint.constant = self.bottom
        }
    }
```

汎用性が低いので、他にいいやり方を知っている方がいらしたら、ご教授願えると嬉しいです。
blockcypher api メモ

#環境
言語:php

#BlockcypherAPIを通じて、HDウォレットでアドレス発行をするまで

##(1)BlockcypherライブラリをComposerダウンロード

```
$composer require "blockcypher/php-client:*"
```

##(2)（後々のことも考え）BlockCypherクラスを作る

```php

//ライブラリの場所を指定
use blockcypher 

class BlockCypher{
  
  private $token = BLOCKCYPHER_TOKEN;
  private $apiContext;

  function __construct($network,$coin){

    $this->apiContext = new \BlockCypher\Rest\ApiContext(
                        new \BlockCypher\Auth\SimpleTokenCredential($this->token),
                        $network,
                        $coin
                      );

   $this->apiContext->setConfig(
                          array(
                            'mode' => 'sandbox',
                          　'log.LogEnabled' => true,
                          　'log.FileName' => 'BlockCypher.log',
                          　'log.LogLevel' => 'DEBUG'
                        )
                      );
  }
}
```

##(3)HDWalletを登録するメソッドを作成

```php

public function createHDWallet($name,$xPub,$subChainIndex=array()){

　$wallet = new \BlockCypher\Api\HDWallet();
　$wallet -> setName($name);
　$wallet -> setExtendedPublicKey($xPub);

  if(!empty($subChainIndex)){
  　$wallet -> setSubchainIndexes($subChainIndex);
  }

  $walletClient = new \BlockCypher\Client\HDWalletClient($this->apiContext);
  $createWallet = $walletClient -> create($wallet);

  return $createWallet;
}
```

##(4)拡張公開鍵の取得

Electrum,TREZOR、Copay、bcwalletなどで拡張公開鍵を取得。
ちなみにBIP39に従ったHDウォレットを用意すること。

大抵のHDウォレット階層は、
m/44'/1'/0 になっている。

##(5)登録する

```php
$network = 'test3'; //　メインネット: 'main' , テストネット: 'test3'
$coin    = 'btc' ;
$blockcypher = new BlockCypher($network,$coin);

//(5)で取得した拡張公開鍵
$xpub = 'tpub123456789....';

//HDウォレットの階層を示すindex
$subchainIndex = array(0,0);　// m/44'/1'/0'の場合

echo $blockcypher->createHDWallet('walletName',$xpub,$subchainIndex);
```

##(6)アドレスを発行するメソッドを作る

```php
public function generateAddress(){

 $addressClient = new \BlockCypher\Client\AddressClient($this->apiContext);

 try {
  $addressKeyChain = $addressClient->generateAddress();
 } catch (Exception $ex) {
  throw new InternalErrorException();
 }
 return $addressKeyChain;
}
```

##(7)アドレスを発行する

```php
$newAddrInfo = [];
$new = json_decode($blockcypher-> deriveHDAddress(BLOCKCYPHER_WALLET))->chains[0];

$chain_address = $new->chain_addresses[0];
$newAddrInfo["btc_addr"] = $chain_address->address;
$newAddrInfo["pubkey"] = $chain_address->public;
$newAddrInfo["path"] = $chain_address->path;

var_dump($newAddrInfo); 
//array(3) { ["btc_addr"]=> string(34) "n1JAkBPeVdnZsj5QAMU2Zh4BMmNALZTQKb" ["pubkey"]=> string(66) "03a5e87c89c43e154083ca9e438db6d5bcb1b160bb4103ed043f67db5e1b3886de" ["path"]=> string(5) "m/0/0" } 

```

最後の表示されるアドレスが、(4)で用意したウォレットの受信アドレスと同一のものであればOK。
No qualifying bean of typeのエラー対処法

No qualifying bean of typeのエラーが出た時の対処法です。

@Componentなどはしっかりついていることは確認済み

ここで調べるべきはファイルの構成。
Spring bootでは@ComponentScanもしくは@SpringBootApplicationアノテーションがついたクラスからその配下のクラスを読んでいく。

つまり@ComponentScanもしくは@SpringBootApplicationアノテーションがついたクラスと同じパッケージ内に@Componentアノテーションのついたクラスを配置しなければならない。

そうなのか〜

###参考
ありがとうございました
[Spring BootでNo qualifying bean of typeが出た時の原因と対応](https://qiita.com/NagaokaKenichi/items/058a7243bd2948de7553)
modprobe: FATAL: Module snd-pcm-oss not found in directory

# モジュールのロードができない
raspiでjuliusを用いて音声認識を行おうとした時に、必要なモジュールをロードするために以下のコマンドを実行する

```
sudo modprobe snd-pcm-oss
```
しかし、以下のようなエラーが出る

```
modprobe: FATAL: Module snd-pcm-oss not found in directory /lib/modules/4.14.~~~
```

# 原因
raspbian stretchでは、`snd-pcm-oss`等のモジュールが標準で含まれていない。
自分でコンパイルする必要があるとのこと。

# 解決法
## コンパイル
いや、流石にめんどくさい。あと、やり方分からない笑

## ファームウェアのダウングレード
ファームウェアをダウングレードすれば`snd-pcm-oss`等のモジュールが復活する。

```
# sudo rpi-update [対象バージョンのハッシュ値]
 sudo rpi-update a6b3e852ca70f2a12850b4542438583cc3b29788 # このハッシュ値は4.5.59
```

各バージョンのハッシュ値はここから
https://github.com/Hexxeh/rpi-firmware/commits/master
`kernel: Bump to 4.14.32`とかかいてるところのコピーマークをクリック。

# おまけ
自分で書いた記事ですが、raspiと音声認識ソフトjuliusを使った記事を二つほど。
https://qiita.com/mr_04v/items/6a16663ce9a80b2e2b92
https://qiita.com/mr_04v/items/c767dbb6cb66ca229a62
HighChartsのY軸を動的に変える方法

#経緯
HighChartsで積み上げ棒グラフを作るとき、構成比率の推移を見たいときと、値の大きさの変化をみたいときがあるかと思います。

そんなとき2種類のグラフを作るのは面倒です。
なので、ボタン一つで、Y軸を値と比率に変えられないかと思いました。

#サンプルコード
```html
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-type" content="text/css" />
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<script src="http://code.highcharts.com/highcharts.js"></script>
<script type="text/javascript">
$(function () {
	var sample = Highcharts.chart('sample', {
		chart: {type: 'column',zoomType: 'xy'},
		time: {timezone: 'Asia/Tokyo'},
		xAxis: {type: 'datetime',dateTimeLabelFormats: {month:'%Y'}},
		yAxis: {title: {enabled: false}},
		legend: {align: 'left',verticalAlign: 'top',},
		plotOptions: {column: {stacking: 'normal'}},
		title: {useHTML: true,text: 'サンプル',style: {fontWeight: 'bold',color :'black',fontSize: 12}},
		series: [
			{ name: '男性',
			  color: 'rgba(0, 0, 255, 0.5)',
			  data: [[Date.parse('2017-01-01'),400],[Date.parse('2018-01-01'),500]]
			  },
	  		{ name: '女性',
			  color: 'rgba(255, 0, 0, 0.5)',
			  data: [[Date.parse('2017-01-01'),500],[Date.parse('2018-01-01'),700]]
			}
		]
	});
	$('#sample_cum').click(function () {
		sample.update({plotOptions: {column: {stacking: 'normal'}}});
	});
	$('#sample_pct').click(function () {
		sample.update({plotOptions: {column: {stacking: 'percent'}}});
	});
});
</script>
</head>	
<body>
<div>
	<div id='sample'></div><button id="sample_cum">積み上げ</button>&nbsp;<button id="sample_pct">比率</button>
</div>
</body>
</html>
```
動的にY軸を変えているのはこちらの部分となります。

```javascript
$('#sample_cum').click(function () {
	sample.update({plotOptions: {column: {stacking: 'normal'}}});
});
$('#sample_pct').click(function () {
	sample.update({plotOptions: {column: {stacking: 'percent'}}});
});
```

グラフ要素に対する「update」という命令で、構成要素の内容を変える、という設定を書いておきます。

#余談:他の要素もupdateできそうですね。
グラフエリアに対して「update」をかけられるので、ここで指定したplotOptions以外にも、さまざまな要素がupdateできそうです。
おいおい試してみます。
DynamoDBにboto3を使ってデータインポートする

DynamoDBにデータをインポートするにはS3にインポート用のファイルを置いて、pipelineを使う、という方法があるけど、boto3を使ってやってみた

インポート用のファイルはこんな感じ
pipeline使う時とはファイルのフォーマットが異なるので要注意

```import_dynamo.txt
{"foo":2541657,"bar":1523767752,"hoge":90192}
{"foo":2720851,"bar":1523768049,"hoge":148858}
{"foo":1260648,"bar":1523768077,"hoge":342488}
{"foo":2149901,"bar":1523767818,"hoge":277628}
{"foo":453283,"bar":1523768020,"hoge":365116}
{"foo":516232,"bar":1523767766,"hoge":109706}
{"foo":596116,"bar":1523767872,"hoge":47268}
```

Pythonのコードはざっとこんな感じ
自分がやった場合はインポートのファイルがtxtで改行コードが入ってたので、`line.strip()`を使って改行コードを省いています
`print(datetime.datetime.now())` は実行時間を計測したかったので、入れてるけど、なくてもおk

```python:put_item.py
import boto3
import json
import datetime

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('hogehoge_table')

with open("import_dynamo.txt", 'r') as f:
    line = f.readline()
    print(datetime.datetime.now())
    while line:
        table.put_item(Item=json.loads(line.strip()))
        line = f.readline()

    print(datetime.datetime.now())
```

260万件の処理でだいたい12時間程度かかったので、速度的にはpipeline使った方が速いと思う
IE11でfontawesome5(SVG with JavaScript)を使うとタブキーでフォーカスが移動してしまう現象の回避策

# 動作環境
- Windows 10 pro 64bit
    - IE11
- jQuery JavaScript Library v3.3.1
    - jquery-3.3.1.js
- Bootstrap v4.1.0
    - bootstrap.css
    - bootstrap.bundle.js
- Font Awesome Free 5.0.8
    - fontawesome-all.js

# 今回の現象

本家サイトの How to Use にも記載の通り、\<i>タグを使って WEB ページにアイコンを埋め込みます。
HTML 内に input 系のタグと交互に入れておくとわかりやすいです。
そして IE11 で表示して、タブキーを押します。
すると、\<i>タグの数だけ、フォーカスがどこかに消えてしまいます。
Chrome ではこの現象はおきませんでした。

## 普通の書き方
`<i class="far fa-envelope"></i>`
この書き方をするとフォーカスを持ってしまいます。

## やってみたけどダメだった例
`<i class="far fa-envelope" tabindex="-1"></i>`
tabindex を指定してもフォーカスをスキップしてくれませんでした。

## 回避策
`<i class="far fa-envelope" focusable="false"></i>`
focusable を指定することで、SVGに展開後もフォーカスを制御できるようです。
false にすることでフォーカスを持たなくなります。
これで IE でも安心してフォームの中で SVG が使えます。
<textarea>のplaceholderで改行させる

brタグを使わず特殊文字(`&#13;&#10;`)を使うと改行できる

```ruby
= text_area :hoge, :huga, placeholder: '1行目&#13;&#10;2行目&#13;&#10;3行目'.html_safe 
```

![スクリーンショット 2018-04-20 17.28.36.png](https://qiita-image-store.s3.amazonaws.com/0/239829/a0240b1b-5613-a545-b741-e0745bc08ba1.png)

※OSによって適用されない場合もあるようです。

|        | Chrome | Firefox | Safari| 　IE　 |
|:-:     |:-:     |:-:      |:-:     |:-: |
| Mac    | ◯      |  ×      | ×      |-   |
| Windows| ◯      |  ◯      | -      |◯   |
全Officeソフトがファイルを開いた瞬間に落ちる

#事象
ある日突然、PowerPoint,Excel,Wordのどれでもファイルを開いた瞬間に強制終了で落ちる事象が発生した。
Word,Excelはソフトウェア起動までは行くのだが、ファイルを指定して開いた瞬間に落ちる。新規作成でも落ちる。問答無用で落ちる。
イベントビューアで確認できたエラー内容は以下の通り。

- イベントビューア->Windowsログ->Application->エラー
<pre>
障害が発生しているアプリケーション名: WINWORD.EXE、バージョン: 16.0.9126.2152、タイム スタンプ: 0x5ac71a00
障害が発生しているモジュール名: mso20win32client.dll、バージョン: 0.0.0.0、タイム スタンプ: 0x5ac715f5
例外コード: 0x010e150b
障害オフセット: 0x001546eb
障害が発生しているプロセス ID: 0x4fec
障害が発生しているアプリケーションの開始時刻: 0x01d3d84d2e565a84
障害が発生しているアプリケーション パス: C:\Program Files (x86)\Microsoft Office\root\Office16\WINWORD.EXE
障害が発生しているモジュール パス: C:\Program Files (x86)\Common Files\Microsoft Shared\Office16\mso20win32client.dll
レポート ID: 7bd5c21b-69c9-4fde-bb30-755f13ebbb39
障害が発生しているパッケージの完全な名前: 
障害が発生しているパッケージに関連するアプリケーション ID: 
</pre>

#対応
未適用のWindowsアップデートが残っていたので、適用した。
<pre>
Windowsの設定(Winキー+i)->更新とセキュリティ->Windows Update->更新プログラムのチェック
</pre>
ここからアップデート実行して再起動したらなおった。

#詳細
エラーとの関係は不明だが、KBは以下。
<https://support.microsoft.com/ja-jp/help/4093112/windows-10-update-kb4093112>
オフラインリアルタイムどう書く E20 の実装例

E20の実装( https://qiita.com/Nabetani/items/a68bfd726c59bfc860f7 )を go に移植してみた。
まだ手に馴染んでいない。

```go:実装
package e20

import (
	"strconv"
	"strings"
)

const field = "/01/2345/" +
	"6/789a/b/" +
	"cd/e/fg/h/" +
	"i/jklm/n/" +
	"o/pqr/st/" +
	"uvw/x/yz/" +
	"06cio/u/" +
	"17/d/jpv/" +
	"2/8/ek/q/w/" +
	"39f/l/rx/" +
	"4/a/gmsy/" +
	"5b/hnt/z/"

type vis struct {
	name byte
	d    int
}

func neibours(cur byte) []byte {
	r := []byte{}
	for pos := 1; pos < len(field)-1; pos++ {
		if field[pos] != cur {
			continue
		}
		prev := field[pos-1]
		if prev != '/' {
			r = append(r, prev)
		}
		next := field[pos+1]
		if next != '/' {
			r = append(r, next)
		}
	}
	return r
}

func distance(from, to byte) int {
	visited := make(map[byte]bool)
	q := []vis{{from, 0}}
	for 0 < len(q) {
		cur := q[0].name
		d := q[0].d
		q = q[1:]
		if visited[cur] {
			continue
		}
		visited[cur] = true
		for _, nei := range neibours(cur) {
			if visited[nei] {
				continue
			}
			if nei == to {
				return d + 1
			}
			q = append(q, vis{nei, d + 1})
		}
	}
	return 0
}

func solve(src string) string {
	from := strings.ToLower(src)[0]
	to := strings.ToLower(src)[1]
	d := distance(from, to)
	return strconv.Itoa(d)
}
```

```go:テスト
package e20

import (
	"testing"
)

func TestE22(t *testing.T) {
	var tests = []struct {
		name  string
		input string
		want  string
	}{
		{"0", "DE", "13"},
		{"1", "EK", "1"},
		{"2", "01", "1"},
		// 中略
		{"49", "OX", "18"},
	}
	for _, test := range tests {
		got := solve(test.input)
		if got != test.want {
			t.Errorf("%v: solve(%q)=%q, want %q\n", test.name, test.input, got, test.want)
		}
	}
}
```

`neibours` をきれいに書けていないのが気になっている。（計算に無駄があるのは気になっていない。)

python では無名のタプルで済ましていたところを、go にはタプルがないので（ないよね？）、`vis` とかいうやる気のない名前をつけてみた。

深さ優先探索の部分は順当に書けているのではないかと思っている。

最初 `field` という定数に `map` という予約語の名前をつけようとして負けてしまった。まだ初心者である。
ntpdを使わずにPHPで日付日時を合わせる

むか～し、某システムでfwの関係上、内側から外向きのNTPポートも閉じられてたときに作ったものです。
厳密な時刻が必要なシステムの場合は無理ですが、数msのズレでもいいなら使えなくはないと思います。

端的に言えば情報通信研究機構が提供している公開NTPのjsonを
file_get_contentsで取得して、
時刻部分を力技で切り出してdateコマンドに流し込んでいるという・・
恐ろしや・・

```php
/bin/echo '<?php date_default_timezone_set("Asia/Tokyo");
$r=file_get_contents("http://ntp-a1.nict.go.jp/cgi-bin/jsont?".time());
$startpos=strpos($r,"st");$startpos=strpos($r," ",$startpos)+1;$endpos=strpos($r,",",$startpos);
$mt=substr($r,$startpos,$endpos-$startpos);
$cmd="/bin/date -s \"".date("m/d H:i:s Y",$mt)." JST\"";
if(date("Y",$mt)>=2012){exec($cmd);}else{echo "set error\n";}
echo "dateset ".$cmd."\n";?>' | /usr/bin/php
```

見た目上、改行入れてますが、全ての改行を外せばワンライナーでいけますので
ntpd設定するのメンドクセってときにはcrontabに仕込んでおけばよいかとｗ


(※ json_decode使わなかったのは、その時のサーバに何故か入っていなかったからw)
(※ ソース内には2012なんて文字があるのでたぶんその頃に作ったんだろなーー)
RHEL7にAnacondaを入れる

## やりたいこと
Anacondaをインストールしたい

## 環境
RHEL7
標準でpython2.7.xが入ってた。

## 手順
### 手順1:pythonのバージョンを最新にする
yumパッケージを探す。最新版はpython3.6だったので以下のようにする。
`$ yum search python36`

rh-python36が最新pythonのパッケージっぽいのでインストールする。
`$ yum -y install rh-python36`

pythonのバージョンを確認する
`$ python -V`

パスを確認する
`$ which python`

パスを通す
`vi etc/profile.d/python36.sh`

### 手順2:Anacondaをインストールする
Anacondaをダウンロード
※参考[ダウンロードサイト](https://www.anaconda.com/download/#linux)
`$ wget https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86_64.sh`

インストールする
`$bash Anaconda3-5.1.0-Linux-x86_64.sh`

ここで、規約の同意やインストールの場所が聞かれるのでこだわりがなければyesにしておく。

PATHを通す
`$ vi ~/.bashrc`
下記を追記する
`export PATH=/path/to/anaconda3/bin:$PATH`

### 手順3:確認する
ちゃんとインストールできているか確認する。
Anacondaがインストールできていれば下記のようになる。

```
$ python
Python 3.6.0 |Anaconda 4.3.0 (64-bit)| (default, Dec 23 2016, 12:22:00) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
```

Anacondaがインストールできていれば下記のコマンドでnumpyもインポートできるはず。

```
>>> import numpy
>>> numpy.__file__
'/path/to/anaconda3/lib/python3.6/site-packages/numpy/__init__.py'
```

### 注意点
- python2.7.Xとか、バージョンが古いものが標準で入っていた場合は先にバージョンアップする。
- 古いバージョンのpythonが邪魔だからと言って`yum remove python`はしてはいけない。  ※参考[CentOS で yum remove pythonをしたら詰みました。](https://qiita.com/pugiemonn/items/6b20b2e4b15ca34e8c3e)

### 参考サイト

- https://qiita.com/t2y/items/2a3eb58103e85d8064b6
- https://www.server-world.info/query?os=CentOS_7&p=python36
Error 0x80010135: ファイル・パスが長すぎます (File path too long)

### 概要
- zip解凍時（android studio）
- `Error 0x80010135: ファイル・パスが長すぎます (File path too long)`が発生した
- 解凍できない
- 環境：Windows7

### 対処法
1. root ディレクトリーまたは c:/temp ディレクトリーに解凍
2. 解凍フォルダ名を短くする
    - `android-studio-ide-173.4697961-windows32`を`a-studio-win32`とか

自分は1と2を組み合わせて解消。1だけではダメなときも多々。

### 原因
文字数限界を超えたらしい

### 参考文献
- [インストール・ファイルの解凍時における「ファイル・パスが長すぎます (File path too long)」などのエラー](https://www.ibm.com/support/knowledgecenter/ja/SSFUEU_7.1.0/com.ibm.swg.ba.cognos.op_installation_guide.7.1.0.doc/c_in_trbls_uncompress_camphor.html)
- [eclipseを解凍しようとした時にファイルやパスが長すぎてエラーになった時の対処。](https://miyaware.com/blog/2014/11/eclipse.html)
WordPress-dockerをRaspberry Pi3で動かす

WordPressをラズパイ上のdockerで動かしてみます。

と言っても__OFFICIAL REPOSITORY__ [wordpress](https://hub.docker.com/_/wordpress/)として、既に WordPressが用意されていますので、DBをどうしようかということだけで動かすことができちゃいます。

そこで、[Owncloud-dockerをRaspberry Pi3で動かす](https://qiita.com/tkyonezu/items/a8620da0e49be425ce3d)で作成した`webhippie/mariadb`コンテナーをDBとして使うことにします。

注：`webhippie/mariadb`コンテナーをラズパイ用に事前に作成していないと、`docker pull`しようとするコンテナーが恐らくラズパイ用でないことに注意してください。

# 1. docker-compose.ymlファイルの作成

```
version: '3.1'

services:

  wordpress:
    image: arm32v7/wordpress
    restart: always
    ports:
      - 80:80
    environment:
      WORDPRESS_DB_PASSWORD: <パスワード>
    volumes:
      - /mnt/var/www/html:/var/www/html
    depends_on:
      - mysql

  mysql:
    image: webhippie/mariadb
    restart: always
    environment:
      MARIADB_ROOT_PASSWORD: <パスワード>
    volumes:
      - /mnt/var/lib/mysql:/var/lib/mysql
      - /mnt/var/lib/backup:/var/lib/backup
```

上記のように`docker-compose.yml`を作成します。WordPressとしては公式の`arm32v7/wordpress`を使って、DBとしては事前に作成した`webhippie/mariadb`を使用しています。ここで、[事前に作成](https://qiita.com/tkyonezu/items/a8620da0e49be425ce3d)したラズパイ用の`webhippie/mariadb`がドッカーイメージとして登録済みでなければなりません。

また、DBのパスワードとマウントするボリュームを任意に設定しておきます。

# 2. WordPress の起動
以下のように`docker-compose`で起動します。

```
docker-compose up -d
```

恐らく、`WordPress`の更新が要求されますので最新版に更新しておきましょう。
PythonでS3 Selectを試しました。2018-04-20

# 概要
S3 Selectをシンプルなコードで試しました
https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectSELECTContent.html

2018-04-20
Node.jsで動かそうと思ったけど、SDKが対応してなさそうなので、Pythonにします

# 準備
てきとうなバケットを作って、JSONを置いておきます。

```name.json
{"id": "16509", "name": "hoge"}
{"id": "6217", "name": "fuga"}
{"id": "1398", "name": "piyo"}
```

# コード
```
# boto3をインストール
% pip install boto3
```

```s3select.py
# -*- coding: utf-8 -*-

import boto3
s3 = boto3.client('s3')

response = s3.select_object_content(
    Bucket='<BUCKET_NAME>',
    Key='name.json',
    ExpressionType='SQL',
    Expression='select s.id, s.name from S3Object s',
    InputSerialization={
        'CompressionType': 'NONE',
        'JSON': {
            'Type':'LINES'
        }
    },
    OutputSerialization={
        'JSON': {
            'RecordDelimiter': '\n',
        }
    }
)

for event in response['Payload']:
    if 'Records' in event:
        print(event['Records']['Payload'].decode('utf-8'))

```

```
% python s3select.py
{"id":"16509","name":"hoge"}
{"id":"6217","name":"fuga"}
{"id":"1398","name":"piyo"}

```

# `Expression` のSQLだけ変えてもう少し試します
## 一部の列だけ持ってくる
```python
Expression='select s.name from S3Object s',
```

```
% python ./s3select.py
{"name":"hoge"}
{"name":"fuga"}
{"name":"piyo"}
```

## group byはできないけど、
```python
Expression='select s.name, sum(cast(s.id as int)), count(s.id) from S3Object s group by s.name',
```

```
% python s3select.py
Traceback (most recent call last):
  File "s3select.py", line 19, in <module>
    'RecordDelimiter': '\n',
  File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 314, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 612, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (UnsupportedSqlOperation) when calling the SelectObjectContent operation: Unsupported SQL operation GROUP BY. Please check the service documentation for supported operations.
```

## ちょっとした集計くらいはできる
（`id` を `sum` するというよくわからないことをしているところには目をつむる）

```python
Expression='select sum(cast(s.id as int)), count(s.id) from S3Object s',
```

```
% python s3select.py
{"_1":24124,"_2":3}
```

# まとめ
S3 Selectを使うと、selectできて便利っぽいです
Ericsson F5521gw をWindows10環境で使えるようにする

# Ericsson F5521gw をWindows10環境で使えるようにする

Ericsson F5521gwはWindows7まででサポートが打ち切られた3G通信カードである。
今回はThinkPad X220にEricsson F5521gwをインストールし、Windows10環境で利用できるようにする。

## 事前準備

対象のマシンにEricsson F5521gwをインストールしておく。
Windows10もインストールし、SIMカードも挿入しておく。

## ドライバのインストール

### ドライバをダウンロードする

X220の場合は[Lenovoのサポートサイトのドライバーとソフトウェア](https://pcsupport.lenovo.com/ec/ja/products/laptops-and-netbooks/thinkpad-x-series-laptops/thinkpad-x220/downloads)からダウンロードする。

ダウンロードするのはネットワーキング：ワイヤレスWANの項目の中にある[Ericsson F5521gw ワイヤレスWAN ドライバー (Windows 7/ Vista/ XP)](https://download.lenovo.com/mobilesjp/83wo14wj.exe)

### ドライバを展開する

インストーラーは2段階で動作する。まず83wo14wj.exeを実行するとドライバのディレクトリにsetup.exeが展開され、続けてsetup.exeが実行される。

ダウンロードした83wo14wj.exeをダブルクリックするとファイルのインストールが行われるので指示に従って進んでいく。
最後にドライバーをインストールするステップに進むか聞かれるので、チェックを外してインストールを終了する。
(もしsetup.exeが起動してしまった場合は終了する。)


### ドライバをインストールする

エクスプローラーで C:\DRIVERS\WIN\WWANER\Driver を開く。
setup.exeがひとつだけあると思うのでsetup.exeを右クリックしてプロパティを開く
互換性タブを開き、互換モードの ☑ 互換モードでこのプログラムを実施する にチェックを入れて Windows7 を選択する。
一度OKを押して設定を反映する。
再度setup.exeを右クリックし、 管理者として実行(A) を選択する。

インストールが終わったら再起動する。

### デバイスマネージャー

ドライバのインストールに成功していればデバイスマネージャーは以下のようになる。

- スマートカード読み取り装置
    - F5521gw Mobile BroadbandUSIM Port
- ネットワークアダプタ
    - F5521gw Mobile Broadband Driver
- ポート(COMとLPT)
    - F5521gw Mobile Broadband Deice Management (COM5)
    - F5521gw Mobile Broadband GPS Port (COM6)
- モデム
    - F5521gw Mobile BroadbandModem Port
- ユニバーサル シリアル バス コントローラー
    - F5521gw Mobile Broadband Device

## ありがちなエラー

### 設定に携帯電話の項目が出ない

- デバイスマネージャーでは問題が無いのに設定に携帯電話の項目が無い
- イーサネットの項目に見たことのないネットワークが存在している

上記の症状が出ている場合、デバイスドライバーのインストールに失敗している可能性が高い。
C:\DRIVERS\WIN\WWANER\Driverにあるsetup.exeを実行してドライバーをアンインストールした後、再度Windows7互換モード/管理者権限でインストールしなおすとなおる場合がある。
【初心者】1年間の日にちを返すshll script

　
2017年の1月1日から3月31までの日にち文字列（ex:20170401）を
順番に返すshell scriptです。
昔作ったものですが、何かの役に経てば幸いです。

#shell script
`test.sh` を作成します



```ruby:test.sh
#!/bin/sh

day=1
month=1

while [ ${month} -le 12 ]
do
	case ${month} in
		1) END=31 ;;
		2) END=28 ;;
		3) END=31 ;;
		4) END=30 ;;
		5) END=31 ;;
		6) END=30 ;;
		7) END=31 ;;
		8) END=31 ;;
		9) END=30 ;;
		10) END=31 ;;
		11) END=30 ;;
		12) END=31 ;;	
	esac

	while [ ${day} -le ${END} ]
	do

		if [ ${day} -le 9 ]
		then
			DAY=0${day}
		else
			DAY=${day}
		fi

		if [ ${month} -le 9 ]
		then
			MONTH=0${month}
		else
			MONTH=${month}
		fi

		DATE=2017${MONTH}${DAY}
		echo ${DATE}  ###DATEを表示
		day=`expr ${day} + 1`  ###dayに１を加算
	done

day=1
month=`expr ${month} + 1`  ###monthに1を加算
done
```

上記では、日にち文字列となる変数DATEを表示（`echo ${DATE}`）するだけの処理ですが、
少し改造すれば「一年分のlogファイルに対して同じ処理を行う」時に効率性が上がります。
※logファイル名に日にちの文字列が含まれている必要はあります。

例えば、logファイル命名規則が`sample_2017MMDD.txt`であった場合、
`echo ${DATE}`の行を

```
cat sample_${DATE}.txt|grep "versions" > versions_${DATE}.txt
```

に置き換えると、文字列`"versions"`でgrepしたファイルを日毎１年分作成することができます。

　
他にも、1列目が日にち、2列目が各日のlogファイルの行数を表すcsvファイルを作成したい場合、

```
echo ${DATE},`cat sample_${DATE}.txt|wc -l`  >> sample.csv
```

sample.csvをエクセル等で開き、グラフ化すれば一年分のlogの吐き出し量の傾向がサクッと見られます。

#終わりに
作成したscriptですが、もっと楽な（スマートな）書き方もある気がしますね。

ちなみに、`DATE=2017/${MONTH}/${DAY}`とすれば、2017/04/01みたいな表記になります。
Feed RinseでRSSをフィルタリングして取得

# RSSをフィルタリングして取得する
RSSでニュースなどを取得したいが、特定の内容だけをフィルタリングして取得したい場合のやり方。

## 初期設定
http://www.feedrinse.com/ にアクセス

"Continue to Old Site"をクリック

"Sign up now"をクリック

アカウント作成

トップページ（ http://www.feedrinse.com/account/ )
の左上のボタン"Add feeds"をクリック

"Enter your subscription url(s) here:"に取得したRSSアドレスを入力して"import"をクリック

文字化けするけど気にしない

"Modify filter"をクリック

## 指定した項目だけ取得する場合
"allow the post▼" "if any▼"of the following conditions are met:
"post▼" "contains▼" "任意のフレーズ"

"Save changes"をクリック

## フィルタリングされたRSSの登録
上記の設定をしたあと、○○○.comの頭にあるRSSボタンをクリック
プルダウンから"Other"を選択
別タグで開いたURLをコピー
このURLがフィルタリングされたRSSフィードになるので、この文字列でFeedlyなり好きなサービスに登録する！
Django Girls Tutorial（Tutorial完遂後の備忘録）

#Django Girls Tutorial備忘録
pythonを興味本位で独学。djangoに興味がわき、Django Girls Tutorialに挑戦。
css?、html?、heroku?など一切知らない。
本記事は、python以外の予備知識がない私が、躓いたとこを備忘録として書いていきます。技術面の解説は一切ありません。

# 開発環境
python-3.6.4 -anaconda3
Django-2.0.4
windows10　64bit
Atom 

## Tutorial始める前に仮想環境を新規でつくりましょう
仮想環境をつくらないと困ることになります。私自身。環境が変になって再インストールすることになりました。コマンドなどは、他の方が詳しく書いてますので、そちらを参照してほしい。

参考１．機械学習などでpipインストールしまくった環境をまるごとコピーして仮想環境を作ると、後々のデプロイ失敗の原因になる。最低限の環境だけインストールすること。

参考２．windows Power Shellを使いたい人は、デフォルトだとスクリプトが動かないので注意。管理者でコンソールに入ってポリシー変えるなど対策はある。

## pipを新しくしましょう
仮想環境をつくったらpipを新しくしましょう。これをやらないと、whitenoise,dj-database-url,gunicornなどを入れる時に非常に困ることになります。

##Django Girls Tutorialを上から順番にやっていって躓いたとこ
基本的に上から順番にやっていって何も問題はないです。（仮想環境をつくるところはやってない）

###1--Procfile、.gitignoreは拡張子ないファイル。windowsはエディタで作成することが出来ない。
開発環境によるが、atom側で拡張子を指定せずにファイルを作ったらできた。

###2--デプロイできない。
whitenoise,dj-database-url,gunicornのインストールに加えて、psycopg2をpipでインストールした。チュートリアルには、psycopg2==2.5.4を最終行に加えるとあるが、インストールすれば加える必要はない。インストールしてから`pip freeze > requirements.txt`してください。

###3--それでもデプロイできない。
エラーをよく見ましょう。仮想環境をつくった時に余計な物が入ってるとエラーがでる確率があがる（経験談）

###4--〇〇が動作しない。
最初にまずファイルが正しい位置に置かれてるかチェック。次にソースのチェック。コピペした時に小さなミスをすることが意外と多い。後、import文を追加しなきゃいけないのに忘れてる。

全ソース、私が今回の環境（python3.6.4、django2.0.4）でもコピペで動作することを確認してます。
それでも動かないとなると、pythonのインデントを直すの忘れているとかかな？

###5--Django フォームでのつまづき
管理者で入ってないとフォームは機能しない(ソースの記述がそうなってる)
管理画面にログインして、管理画面の右上に「サイト表示」のリンクがある。ここから飛んでから、チュートリアルに書いてあるフォームの確認の動作をしましょう。

##感想とか
一番躓いたのはデプロイ関連。
デプロイは様々なエラーの原因があるらしい。上手くいかないならば、一つ一つ調べていくしかない。最初からやりなおすのも考えたほうがいい。pushしてしまったものは、herokuのサイトにログインしてheroku側から消せたりする。困ったら調べて活用してほしい。

次点はdjangoフォーム関連。
チュートリアルをよく読むと「ここでは現在、Djangoの管理画面と同様に、ログイン状態で操作しています……」と書いてある。今回のソースの記述は、ログイン状態で操作しないと駄目だよってことらしい。

この「ログイン状態」というのが謎で大きく躓いた。管理画面の右上の「サイト表示」から入ればいいのか……ということに気付くのにもの凄く時間がかかった。

##最後に
何も経験がない私にとって、Django Girls Tutorialは良い勉強になりました。
今回は、私がつまづいたところを書きました。問題解決の参考になれば幸いです。
Ionic3でiOSビルド時に「Error: Command failed: xcrun simctl list --json」エラーが発生した時の対処方法

# :one: 環境

* OS: macOS High Sierra 10.13.4
* Xcode: 9.3 Build version 9E145
* Node.js: v8.9.3
* npm: v5.6.0
* cordova: v7.1.0
* Ionic: 3.20.0
* cordova-ios: 4.5.4

<!---------------------------------------------------------------------------->

# :two: エラー内容

`ionic cordova build ios --prod --release`コマンドを実行すると以下のエラー内容が表示された。

```bash:エラー内容
Error: Command failed: xcrun simctl list --json
dyld: Symbol not found: _SimDeviceBootKeyDisabledJobs
  Referenced from: /Applications/Xcode.app/Contents/Developer/usr/bin/simctl
  Expected in: /Library/Developer/PrivateFrameworks/CoreSimulator.framework/Versions/A/CoreSimulator
 in /Applications/Xcode.app/Contents/Developer/usr/bin/simctl
```

<!---------------------------------------------------------------------------->

# :three: 原因

正確な原因は不明。

エラー内容にある`xcrun simctl`はシミュレータ関連のコマンドらしく、「Xcodeを起動して最新状態にするとイイよ！」って記事は見つけたのでsimctlコマンドが古いことで発生したと思われる。
https://forum.ionicframework.com/t/ios-build-error-error-command-failed-xcrun-simctl-list-json/108031

ただ、元々エミュレータ用にビルドするつもりは無く、デバイス用にビルドしたかったため `ionic cordova build` コマンドの公式リファレンスを調べたところ、**デバイス用にビルドするコマンドオプションとして`--device`が必要**なことが分かった。

<!---------------------------------------------------------------------------->

# :four: 対応

### **4.1 エミュレータ用ビルドで発生していたエラーの対応**
エミュレータ用ビルドで発生していたエラーは、**Xcodeを起動することで最新の状態にして** `ionic cordova build ios --prod --release` コマンドを実行してエラー無く完了することを確認した。

### **4.2 デバイス用にビルドする方法**
元々エミュレータ用ビルドではなく、デバイス用にビルドしたかったため以下のようにコマンドを変更した。

```bash:変更前のコマンド・・・エミュレータ用にビルド
ionic cordova build ios --prod --release
```

```bash:変更後のコマンド・・・デバイス用にビルド
ionic cordova build ios --prod --release --device
```
デザイナー・フロントエンジニア向け。初心者がRuby on RailsにBootstrapを導入してデザインを始める方法

ずっとPHP、Dreamweaver、Wordpress、Bootstrapをいじっていたフロントエンジニア、デザイナーのあなたに
RailsでもBootstrapを簡単に導入する方法を自分のメモ代わりにご紹介。

デザイナーで急にRuby on railsを使いたくなった！使わなければいけなくなった！
そんな時に役立つかと思います。

```
環境は
ruby 2.5.1
rails 5.0.7
gem 2.7.6
```

#まずはrails new でアプリ作成

```sh
rails new myblog
cd myblog
```

まずは、いつものファイルを用意します。

##さっそくBootstrapを導入の前に

ここで私は何回も失敗しました。

原因の一つに
・アプリ名をbootstrap にしていた
・テスト用でさんざん弄ったアプリに入れようとした

こんなところでした。
海外のサイトで調べたとき、「名前にbootstrapを使うなんてとんでもない！すぐにアプリを閉じて」なんてものを見つけたので
早速作り直してファイル名変更。
これでうまくいきました。

#さっそくBootstrapを導入
gemfile を開きます。

```rb
gem 'bootstrap', '~> 4.1.0'
gem 'jquery-rails'
```

この２つを追加します。

##次にbundle installします。
次にコマンド画面で

```sh
bundle install
```
をします。


##次にcssをscssへ変更
コマンドから

```sh
mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
```

application.css → application.scss にファイル名を変更します。
今までCSSしか使って来なかった場合はここでつまずくかも知れません。


##application.scss　に追加
app/assets/stylesheets/application.scss
application.scssの中身を全部消して良いです。

```scss
@import "bootstrap";
```

上記を追加してください。

##次にapplication.jsへ追記

app/assets/javascripts/application.jsに追記します。

```js
//= require jquery3
//= require popper
//= require bootstrap-sprockets
```

これでBootstrapの導入は完了になります。

#最後に動作確認

テストで動作確認する為にコマンドから

```sh
rails g controllor tweets index show new
```

このコマンドでview,controller内にファイルが作成されますので
view/index.html.erb のファイル内にBootstrapのclassを使ってください。

```html
<div class="container">
  <div class="row">
    <div class="col-sm-8">
      本文的な
    </div>
    <div class="col-sm-4">
      サイドバー的な
    </div>
  </div>
</div>
```

うまく表示できましたか？
とにかく動作確認までしたい時は役に立つかと思います。
Dreamweaver 使ってるなら有料ですが RubyMine 良いですよ。
[メモ] AWS EC2のサーバにssh接続で入る

## 手順
1. 踏み台サーバに入る
2. 踏み台経由で入りたいサーバ（アプリケーションのサーバーなど）に入る

ところで、踏み台は英語でbastionというらしい。

## コマンド
1. 踏み台サーバにSSH接続する

```bash
ssh -i {鍵までのパス} ec2-user@踏み台のIP
```
2. 踏み台サーバのホームディレクトリから、サーバ（アプリケーションのサーバーなど）にSSH接続する

```bash
ssh -i {鍵までのパス} ec2-user@入りたいサーバのIP
```

## 参考
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html