OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Linux 2にLAMP環境インストール

2018年6月26日に正式版となったAmazon Linux 2にLAMP(Linux/Apache/MariaDB/PHP)環境のインストールを行った手順を以下に記します。
Amazon Linux Extrasリポジトリからlamp-mariadb10.2-php7.2をインストール，LAMP環境を構築し、WordPressが動作する状態とします。

# Amazon Linux 2 インスタンスの起動

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/7845bb4f-aa37-04c0-fbfe-331bd45e5433.png)

security group の設定では、My IP からのSSH, AnywhereからのHTTP/HTTPSアクセスを許可します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/103eeea4-4170-fdb7-aa38-f517594954a9.png)

# Amazon Linux 2 インスタンスへの接続

SSH private key を利用してEC2インスタンスへSSH接続します。

```
$ ssh -i amazon-linux2-lamp.pem ec2-user@54.92.xx.xx
Warning: Permanently added '54.92.xx.xx' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
```

# タイムゾーンの変更

```
sudo su - 
timedatectl set-timezone Asia/Tokyo
```

# Apache のインストール

```
yum -y install httpd
systemctl enable httpd
systemctl start httpd
```

webブラウザで IPv4 Public IP に記載されているグローバルIPアドレスにアクセスして Apache のテストページが表示されるか確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/2c1eab2e-4d85-4fee-613f-6b2ddbf024af.png)


# PHP 7.2 のインストール

```
amazon-linux-extras install -y \
 lamp-mariadb10.2-php7.2=10.2.10_7.2.0 \
 php7.2=7.2.0
```

# MariaDB 10.2 のインストール

```
yum install -y mariadb-server
systemctl enable mariadb
systemctl start mariadb
```

2019-05-29 時点では MariaDB 10.2.10 がインストールされました。

```
# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.2.10-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

# WordPress のインストール

## WordPress ダウンロード/展開

現時点での[WordPress最新版](https://ja.wordpress.org/download/)をダウンロードし、DocumentRoot配下に展開します。

```
cd /var/www/html
wget https://ja.wordpress.org/latest-ja.tar.gz
tar xvf latest-ja.tar.gz
chown -R apache:apache .
```

## WordPress 用データベース作成

文字コードUTF8でデータベース wordpress を作成します。

```
MariaDB [(none)]> create database wordpress default character set utf8;
```

## WordPress 用 MariaDB ユーザの作成

さきほど作成したデータベースのみ全権限を持つ wordpress ユーザを作成します(ユーザ名/パスワードは適宜変更してください)。

```
MariaDB [(none)]> grant all on wordpress.* to wordpress@localhost identified by 'password';
MariaDB [(none)]> flush privileges;
```

## WordPress 初期設定

webブラウザで 54.92.xx.xx/wordpress にアクセスし、WordPressの初期設定を行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/e2a57068-9ca9-de5a-9db6-273de5a97770.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/f44caded-dc3b-7ee1-199f-b4fab2d5ba9e.png)

正常にインストールが完了すると、指定したユーザ、パスワードでダッシュボードにログインできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/2bd8e84d-777e-e7ed-146a-f6b59ced9b88.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/23f6eadd-599d-3a39-8992-eefdf219db0d.png)
YouTube Data APIで動画を検索する

# 結論
まず、GCPでAPIキーを発行。
例えば、APIでHIKAKINの動画を検索したい場合、

```
https://www.googleapis.com/youtube/v3/search?type=video&part=snippet&q=HIKAKIN&key=API_KEY
```

上のURLを叩くと検索結果がJSONで得られる。

# 若干ハマった点

https://developers.google.com/youtube/v3/getting-started?hl=ja

最初ここを見ていて、必死に `https://www.googleapis.com/youtube/v3/videos` で検索を試みていたがそもそもエンドポイントが違った。

https://developers.google.com/youtube/v3/docs/search/list?hl=ja
http://kimizuka.hatenablog.com/entry/2015/06/01/000000_1

検索は `https://www.googleapis.com/youtube/v3/search` を叩く。
`q` パラメータに検索したい文字列を渡すことで検索できる。

# 参考
https://developers.google.com/youtube/v3/getting-started?hl=ja
https://developers.google.com/youtube/v3/docs/search/list?hl=ja
http://kimizuka.hatenablog.com/entry/2015/06/01/000000_1
Arch Linux のアップデートが"/usr/lib/libutf8proc.so.2 exists in filesystem" で失敗する

# 概要 

```console:terminal
# pacman -Syu
```

を実行してArch Linux のパッケージをアップデートしようとすると以下のようなエラーが出ました。

```text:terminal
error: failed to commit transaction (conflicting files)
libutf8proc: /usr/lib/libutf8proc.so.2 exists in filesystem
Errors occurred, no packages were upgraded.
```

```/usr/lib/libutf8proc.so.2``` が既に存在しているため、更新ができないということなのでpacman コマンドに```--overwrite usr/lib/libutf8proc.so.2``` (頭に"/"は不要)オプションをつけて実行し、上書きするようにしてください。

```text:terminal
# pacman -Syu --overwrite usr/lib/libutf8proc.so.2
```

この情報については、Arch Linux 公式でもアナウンスされているので、こういったよく使うコマンドでエラーが出た場合は公式も確認してみると良いかもしれない…と勉強した日でした。

![ArchLinux_ErrorUpdateDueToLibutf8proc0000.png](https://qiita-image-store.s3.amazonaws.com/0/70152/b929e7a6-9fd3-efcf-7749-33b6f1168e18.png)

# 参考 
- FIX FOR LIBUTF8PROC.SO.2 EXISTS IN FILESYSTEM
    - https://arcolinux.com/fix-for-libutf8proc-so-2-exists-in-filesystem/

- Arch Linux
    - https://www.archlinux.org/
デザイン自動化メモ（スクリプト実行中のOSを判定する）

# スクリプト実行中のOSを文字列変数に格納する方法

スクリプトをmacとWindowsの両方で使うとき、os毎に処理を書き換えるところがあります。
そのときに使うおまじないです。

```js
function isMac() {
      
   if ($.os.toLowerCase().indexOf('mac') >= 0 ) {
       return true;
   }

   return false;
}

function isWindows() {
      
   if ($.os.toLowerCase().indexOf('mac') < 0 ) {
       return true;
   }

   return false;
}

function main() {
     
      if (isMac() == true) {

          // macの時の処理を入れる

          alert("Macです");
      }
  
      if (isWindows() == true) {

          // windowsの時の処理を入れる
          alert("Windowsです");
      }
 }

main();
```
かわいいプロンプトを作ってみた

#はじめに#
テンション上げたいと思ってプロンプトを変えてみました。


#完成#

![image.png](https://qiita-image-store.s3.amazonaws.com/0/274016/d26e3a41-4b32-d63d-0944-e1dc21776684.png)

#変更手順#
「bash_profile」という設定ファイルを任意のエディタで開きます。（今回は「nano」を使用）

```
nano ~/.bash_profile

```
bash_profileを開いたら２行目に追記します。

```
export PS1=">>"
```

このように追記するとプロンプトが　>>　に変わります。
こちらを変えてかわいいプロンプトにしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/274016/2bdba0ae-ae56-d08e-ac9c-8004e30589d7.png)


まず\u\wでユーザー名とホスト名を表示します。
２行目と３行目でキャラクターを作りました。
７mでWhite,3mでRedを指定しています。
#最後に#
プロンプトを変えるとテンション上がりました。
XBRL Parser Terms

Summary of Terminology used in XBRL Parser https://github.com/sawadyrr5/UfoDataReader
Useful resource: https://qiita.com/maru3/items/a796655ee6a3ed04d80b

- netsales 
    - 売上高
    - NetSalesSummaryOfBusinessResults
- profit_loss
    - 親会社株主に帰属する当期純利益又は親会社株主に帰属する当期純損失（△）
    - ProfitLossAttributableToOwnersOfParentSummaryOfBusinessResults
- ordinary_income_loss
    - 経常利益又は経常損失（△）
    - OrdinaryIncomeLossSummaryOfBusinessResults
- comprehensive_income
    - 包括利益
    - ComprehensiveIncomeSummaryOfBusinessResults
- net_assets
    - 純資産額
    - NetAssetsSummaryOfBusinessResults
- total_assets
    - 総資産額
    - TotalAssetsSummaryOfBusinessResults
- bps
    - １株当たり純資産額
    - NetAssetsPerShareSummaryOfBusinessResults
- dps
    - １株当たり配当額
    - DividendPaidPerShareSummaryOfBusinessResults
- basic_eps
    - １株当たり当期純利益又は当期純損失（△）
    - BasicEarningsLossPerShareSummaryOfBusinessResults
- dipluted_eps
    - 潜在株式調整後1株当たり当期純利益
    - DilutedEarningsPerShareSummaryOfBusinessResults
- equity_to_asset_ratio
    - 自己資本比率
    - EquityToAssetRatioSummaryOfBusinessResults
- roe
    - 自己資本利益率
    - RateOfReturnOnEquitySummaryOfBusinessResults
- per
    - 株価収益率
    - PriceEarningsRatioSummaryOfBusinessResults
- cf_from_operating
    - 営業活動によるキャッシュ・フロー
    - NetCashProvidedByUsedInOperatingActivitiesSummaryOfBusinessResults
- cf_from_investing
    - 投資活動によるキャッシュ・フロー
    - NetCashProvidedByUsedInInvestingActivitiesSummaryOfBusinessResults
- cf_from_financing
    - 財務活動によるキャッシュ・フロー
    - NetCashProvidedByUsedInFinancingActivitiesSummaryOfBusinessResults
- shares_outstanding
    - 発行済株式総数
    - TotalNumberOfIssuedSharesSummaryOfBusinessResults
- assets
    - 資産
    - Assets
- current_assets
    - 流動資産
    - CurrentAssets
- non_current_assets
    - 固定資産
    - NonCurrentAssets
- liabilities
    - 負債
    - Liabilities
- current_liabilities
    - 流動負債
    - CurrentLiabilities
- non_current_liabilities
    - 固定負債
    - NonCurrentLiabilities
X68000 XVI > 電源基板 > 回路図と現物の違い

```txt:動作環境
X68000 XVI
```


### 資料

- SHARP サービスマニュアル X68000 パーソナルコンピュータ CZ-634C-TN, CN-644C-TN
    - COCORO Booksにて閲覧可能

@ サービスマニュアル
p97 22. 電源基板基本配線図
p99 23. 電源基板

「電源基板基本配線図」の方は回路図のようだ。
「電源基板」の方では、基板の実装パターンが閲覧可能。

### 関連

- [X68000 XVI > 電源基板 > R24 > 回路図には記載はあるが未実装 > 回路図が古い?](https://qiita.com/7of9/items/877258388bc6db7317fe)

## 回路図と現物の違い

### C27 > 容量の違い

C27を基板から取除いた時の自分のメモ

>  C27 25V 120uF

サービスマニュアル p97の回路図では「C27 25V 220uF」となっている。

Makoto Kamadaさんの下記のツイートを見つけました。

https://twitter.com/kamadox/status/872427211273273344

情報感謝です。

~~回路図の「C27 25V 220uF」は間違いのようです。~~

さらに、yuno様の[X680x0電源修理パーツセットについて](http://ixsvr.dyndns.org/pow_parts)の「X68000 電源パーツリスト」のPDFに以下の記載を見つけました。

> C27 ... 製造時期によっては120uFの場合がある。

情報感謝です。

回路図が間違っているのではなく、２種類の実装の可能性もあるようです。


### C27, C28, C31 > 極性の違い

Makoto Kamadaさんの下記のツイートを見つけました。

https://twitter.com/kamadox/status/872624415367876608

情報感謝です、Kamada様、_MAT様。
ゼロからのkaggleチャレンジ #1

# kaggleとは
[kaggle](https://www.kaggle.com)とは、企業やユーザが提供するデータを元に、予測モデルや分析を行うコンペティションを提供するプラットフォームです。

# kaggleの始め方
1. アカウント作成
kaggleを始めるにはアカウントを作成する必要があります。  
アカウントを作成するにはメールアドレスを登録するか、
Facebook、Google、Yahooのアカウントと連携させることが可能ですのでお好きな方法を選択ください。  
ちなみに筆者はFacebookアカウントと連携させています。

# まず何をすればいいの？
1. 挑戦するCompetitionを選ぶ 
　アカウントを作成したら早速挑戦するCompetitionを選びましょう。 
　初めは[Titanic: Machine Learning from Disaster](https://www.kaggle.com/c/titanic)や、[House Prices: Advanced Regression Techniques](https://www.kaggle.com/c/house-prices-advanced-regression-techniques)がおすすめです。 
チュートリアル用に用意されているコンペティションで多くの方が挑戦されています。ネットに多くの体験談や実践手法が載っていますし、kaggleのkernelにも挑戦者のコードが解説付きで載っています。

2. Competitionに挑戦するには：環境構築
Competitionに参加するには予測モデルを作成する環境を用意する必要があります。 
環境はご自身で用意されてもいいですし、kaggleが用意しているkernelも活用できます。 
kaggleのkernelを活用すれば面倒な環境を自身で構築することなくすぐに予測モデルの構築を開始でき非常に便利です。kernelの対応言語はPythonおよびRのようです。  
  
3. Competitionに挑戦
 環境が用意できたらCompetitionに挑戦していきましょう。Competitionに挑戦するときの基本的な流れは
「Competitionの目的を確認」→「データを確認」→「データの前処理」→「モデル構築・改善」→「予測」→「予測結果の提出」
の様になります。　
4. 行き詰まったら
　kaggleでは先人のデータサイエンティストの方が自身の分析モデルを解説付きで公開してくれています。
　特に上で紹介したチュートリアル用のCompetitionでは非常に参考になるkernelが公開されていますので、
　参考にすることでデータサイエンスのノウハウを習得できると思います。

# 終わりに
kagglerとしてデータサイエンス業界を盛り上げていく人が増えれば幸いです。
質問や補足の要望などありましたらコメントください。

### 追伸
[kaggleのDigit Recognitionに挑戦した結果を投稿しています。](https://qiita.com/landmark-b/items/f245f8c29ca3e8620314)
Changes that I made for UFO catcher parser class

I needed to make change to the following package in order to make it work with the current version of pandas.
https://github.com/sawadyrr5/UfoDataReader

`vim /anaconda3/envs/gf/lib/python3.6/site-packages/pandas_datareader/fred.py`

Added following 

```py
import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
#from pandas.core.common import is_list_like
```
僕が使うワンライナーレシピ

すろっくさんだよ。

さすがに平成も終わりに差し掛かるのでperlでWebアプリケーション作ろうとは思わないんですけど、ワンライナーはたまにやります。Perlだけだとフフッってなるのでシェルもいれますね。

## Perl編

オプションです。

- w 警告
- e 一行で書くぜ宣言
- n 読み込みループ（出力なし）
- p 読み込みループ（出力あり）
- l 行末処理
- M モジュールをロード

適当につかってるやつです。。

ファイル名を指定してファイルの中の文字列1を文字列2に置換します。

``` perl
perl -pi -e "s/文字列1/文字列2/g" [ファイル名]
```

Linuxコマンドのcatと同じ挙動です。ファイル名をただ標準出力に出します。

``` perl
perl -wpl -e "” [ファイル名]
```

catして一部を置換します。最初のと挙動は同じかな。

``` perl
perl -wnl -e “s/<元ワード>/置換ワード/g; print;” <filename>
```

こっちも同じ挙動ですね

``` perl
perl -wpl -e “s/<元ワード>/置換ワード/g;” <filename>
```

nは出力なしなので、標準出力させたければwplと書く方がいいです。nでやったあと出力しようとすると最後にprintって書くので面倒です。
改行を全ての出力につけます。改行があればなにもしません。

``` perl
perl -wnl -e "print $.;” ＜ファイル名＞
```

$なんとかの扱いは以下ですね。

- $   変数
- $.  レコード番号]
- $_ 読み込んだ内容全部

ファイルを行番号つきで標準出力します。

``` perl
perl -wnl -e 'printf "$.: ";print;’ <ファイル名>
```

grepがわり。

``` perl
perl -wnl -e “/[検索したいワード]/ and print;” <filename>
```

## シェル編

ディレクトリの下のファイルを一括して取り出して何日以上前のをなんか処理します。
mtimeで日にちを指定してください。

```shell
find /var/log/ -mtime +14  -exec rm -f {} \;
```

対象プロセスを全殺しします。
pidファイルを無くしちゃって、でもプロセスが大量に動いてて一個一個kill -9するのまじめんどくセーみたいなときに使います。

```shell
pgrep -f "プロセス名の一部" | xargs kill
``` 

こっちでもいけます。

```shell
ps aux | grep "プロセス名の一部" | awk '{print $2;}' | xargs kill
```

思い出したら追記します。
vagrant up時にansibleで開発環境を作る

すろっくさんだよ。

時代はDockerですね。

僕はVagrantつかったりします。そこは好き好きですね。チームのリーダーには「なんでDockerじゃねえんだ」って怒られるかもしれないので、家でなにも考えなくてよいときにこのドキュメントみてください。

## 何をしたいの

とりあえずvagrant upしたらそれっぽい開発環境をつくりたいです。

## やりかた

僕Rails好きなんでRails参考に。

なんかプロジェクトつくります。

```shell
$ rails new sampleproject
```

vagrantの設定ファイルを作ります。

```shell
$ ce sampleproject
$ vagrant init
```

vagrant開きます。

```shell 
$ vi Vagrantfile
```

最後くらいにこんなのつけたしてください。

```ruby
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "provision/vagrant.yml"
  end
```

軽く解説すると、vmの構築時にansibleを走らせて、指定されたplaybookを実行する、というものです。
ここだとprovision/vagrant.ymlを指定してます。

playbookのパスとかどうでもいいんですけど、僕はRailsのプロジェクトの中に含めてます。使いまわしてもいいんですけど、自分以外の誰かが開発することを考えると他のところにおくのは好きじゃないです。

playbookのファイルをおきます。

```shell 
$ mkdir provision
$ vi vagrant.yml
```

playbookを適当に書きます。

```yml

- name: provisioning
  hosts: all
  become: yes
  gather_facts: False
  max_fail_percentage: 0
  vars:
    app_path: /vagrant
    home: /home/vagrant
    ruby_version: 2.5.1
  tasks:
    - name: set timezone to Asia/Tokyo
      timezone:
        name: Asia/Tokyo
    - name: add epel
      yum:
        name: epel-release
        state: latest
    - name: add mysql repo
      yum:
        name: http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
        state: present
    - name: add nodejs repo
      yum:
        name: https://rpm.nodesource.com/setup_8.x
        state: present
    - name: yum update
      yum:
        disablerepo: mysql57-community
        name: "*"
        state: latest
```

あとはvagrant起動して終わりです。

```
$ vagrant up
```

ansibleの勉強がてらとかやってみてもいいかもしれません。
Railsでgenerate機能つかったときに「Could not find a JavaScript runtime」とか怒られたら

rails newしてからなにかをrails gしたりgemの設定ファイルをinstallしようとするんだけど、何も考えずにRubyをいれてRailsいれただけだとこんなエラーがでる。

```Shell
[vagrant@localhost vagrant]$ rails g annotate:install
/home/vagrant/local/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/bundler-1.16.3/lib/bundler/runtime.rb:84:in `rescue in block (2 levels) in require': There was an error while trying to load the gem 'uglifier'.
Gem Load Error is: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.
```

JavaScriptの実行エンジンがないって怒られている

## 解決方法その1

nodejsいれる。

LTS

```shell
$ curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
``` 

Alternatively

```shell
curl --silent --location https://rpm.nodesource.com/setup_10.x | sudo bash -
```

install 

```shell 
$ sudo yum install nodejs
```

## 解決方法その2 
mini_racerを使う

むかしむかし、僕がRails使い始めた頃はtherubyracerなんていうgemがあって、それをいれればJavaScript実行環境はOKだった。でもこれlibv8っていうのに依存してて、それが古かったり新しかったりで正直つらいところがあった。

でもmini racerなるものが今はあるらしい。便利。
僕はnodeしか使わないので、試してみたい人はそちらを試してみてもいいかも。
Swift で作成された Cordova プラグインのビルドについて

Monaca では、`Cordova 6.5` 以降のプロジェクトで `Swift` で作成された Cordova プラグインをビルドして利用することができます。

Cordova 6.5 プロジェクトでは `Swift 3`、Cordova 7.1 プロジェクトでは `Swift 4` をサポートしています。


# はじめに

Swift で作成された Cordova プラグインは、Monaca プロジェクトに組み込んだだけでは、下記のようなエラーでビルドが失敗します。

```
The “Swift Language Version” (SWIFT_VERSION) build setting must be set to a supported value for targets which use Swift. This setting can be set in the build settings editor.
```

Swift で作成された Cordova プラグインをビルドする場合は、対象の Swift バージョンを指定する必要があります。


# Swift バージョンの指定方法

Monaca プロジェクトでビルド時に Swift バージョンを指定する場合は、`Custom Config` プラグインを利用して `config.xml` に設定を行います。

config.xml への設定例は、以下のようになります。

```xml:config.xmlの設定例
<platform name="ios">
  <preference name="ios-XCBuildConfiguration-SWIFT_VERSION" value="4"/>
</platform>
```


# cordova-plugin-add-swift-support プラグインを使用する

Swift で作成された Cordova プラグインをビルドする場合、`Custom Config` プラグインを使用することで対応することは可能なのですが、[cordova-plugin-add-swift-support](https://github.com/akofman/cordova-plugin-add-swift-support) プラグインを利用することでも対応可能です。

cordova-plugin-add-swift-support プラグインの利用方法は、[README](https://github.com/akofman/cordova-plugin-add-swift-support/blob/master/README.md) を参照してください。

cordova-plugin-add-swift-support プラグイン v1.7.2 の使用例は、以下のようになります。

```xml:v1.7.2の設定例
<platform name="ios">
  <preference name="UseSwiftLanguageVersion" value="4"/>
</platform>
```

# おわりに
Swift で作成された Cordova プラグインをビルドした際に、Swift のバージョンに関するエラーが表示された場合は、一度、Swift バージョン設定を確認してみてください。
Use different kernels in Jupyter notebook 

#Problem 
After switching into different environment through anaconda by `source activate myenv`, then install new package by `pip install package`. However, this new package could not be imported through jupyter notebook. Also, when creating new notebook, I could not select kernel for the myenv kernel. 

# Solution
https://github.com/Anaconda-Platform/nb_conda_kernels/issues/57
Install Ipykernel in the conda virtual env.
`conda install ipykernel`

Then add the kernel to jupyter noteobok by

```
source activate myenv
python -m ipykernel install --user --name myenv --display-name "Python (myenv)"
```

Also you can switch between kernels using the following method.
https://qiita.com/yoppe/items/38005f415a5b8b884c7d
さくらのVPSにubuntuをインストール後SSH接続できないときは

#概要

さくらのVPSでubuntuを標準インストールした後、SSH接続できないときに確認してみてほしいポイントです。

# ① User IDが違う

ubuntuの場合、初期設定される管理ユーザ名は「**ubuntu**」です。**root**ではありません。

さくらのVPSでは標準でCentOSがインストールされるようになっています。そのため、公式の入門ガイドやセキュリティリファレンスは、CentOSのインストールを前提とした解説になっています。

ガイドに従い、初期設定のためにroot権限でSSH接続するには

```
ssh root@ IPアドレス
```

を入力しましょうと書かれていますが、これは管理ユーザ名がrootの場合です。
ubuntuでインストールした場合は

```
ssh ubuntu@ IPアドレス
```

にしないとログインできません。


#② CapslookかNumlookが有効になっている

そんなはずはないと思っていても、深呼吸して一度キーボードを確認してみてください。

#反省
「ssh root＠」までは呪文だと思い信じて疑わなかった私は①で数時間ハマってしまいました。。
コマンドの意味はよく考えないといけませんね。

# 参考サイト
[さくらのサポート情報　OSセットアップ情報（Ubuntu16.04 LTS)](https://help.sakura.ad.jp/hc/ja/articles/115000045522-OSセットアップ情報-Ubuntu16-04-LTS-)

以上です！
TensorFlow, Python初心者がMNISTコードを理解していく(1)

MNISTコードはTensorFlowのチュートリアルの１つです。
原文コードはこちら
https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/examples/tutorials/mnist/mnist_softmax.py

```py
def main(_):
```
defはpythonの関数定義らしい。mainと名前が付いているがエントリポイントではなさげ。
関数は{}中かっこで開始と終了を表すのではなく、インデントで表現してるっぽい。
他の言語以上にインデントが重要ですね。引数の「_」はなんでしょうね…
引数なし関数っぽいのですが、調べてもうまく出てこなかったorz まぁいいや。

```py
# Import data
mnist = input_data.read_data_sets(FLAGS.data_dir)
```
最初にデータを読み込んでいる。
中身は28×28のグレースケール画像で、28×28=784次元ベクトルとして扱う様子

```py
  # Create the model
  x = tf.placeholder(tf.float32, [None, 784])
  W = tf.Variable(tf.zeros([784, 10]))
  b = tf.Variable(tf.zeros([10]))
  y = tf.matmul(x, W) + b

  # Define loss and optimizer
  y_ = tf.placeholder(tf.int64, [None])
```
はい、ここですね。一瞬わからんくなりましたが。
[None, 784]
　↑列　↑行です。行と列を逆に思い込んでしまったので混乱しました。
[784, 10]
↑列　↑行です。　
[10]
↑列です。
分かれば、大したことないですね。

xには最初のmnist画像が放り込まれます。
Noneは画像の個数で、最初には未定義でいいらしい。便利
tf.placeholderは実行時に値を渡せばいいらしいですが、tf.Variableでも行けそうな
気配はしてます。あかんのかな。(知識不足)

最終的に欲しいのは10次元の列ベクトルなので、この式になります。
[784行,x列] × [10行,784列] + [10列] = 出力は10次元の列ベクトル

```py
y = tf.matmul(x, W) + b
```

y = ax + bの直線の方程式を求めるのと似てますね。
xとyが決まっていて、aとbを学習によって求めようというアプローチです。(たぶん)

x = 画像
y = 0〜9の数値を表す結果
a(W) = 画素ごとの重み(特徴量)
b = バイアス

続きはまた！
GoogleAppEngineで複数のサービスにわかれたシステムを構築してみる

GoogleAppEngine便利ですよね。
だいたいのサービスはGAEがあれば、コストを極限まで抑えた上で、
インフラも運用のことも考えずに実装できるのでよく使用しています。

なんですが、ここの処理だけ別の言語で書きたいな〜……とか、
Admin向けのAPIサーバとSPAと、ユーザ向けのAPIサーバと、これまたAPIサーバを参照するSPA、、、
複数サービスを一個のプロジェクトで管理したいな〜……とか、それなりにあったりするので。

https://cloud.google.com/appengine/docs/standard/python/config/dispatchref

上のリンクに書いてある内容でだいたい実現可能なんですが、その時の対応方法を備忘録も兼ねて。

## 実装例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/f72eb4b2-d0ad-5515-2c0b-ab9aa7a00b73.png)

https://github.com/nekokari/neko-gae-multi-service

https://neko-gae-multi-service.appspot.com/
https://neko-gae-multi-service.appspot.com/php

簡単な構成図ですが、一旦こんな感じで組んでみました。
キモはdispatch.yamlになります。

```yaml
dispatch:
  - url: "*neko-gae-multi-service.appspot.com/php"
    service: php-service
```

このファイルを合わせてgaeにdeployすることで、
指定のURLに応じてリクエストを返すサービスを変更することができます。
どれにも一致しなければdefaultのサービスでレスポンスが返却されます。

今回は指定のパスで切り替えるという設定にしましたが、ドメイン単位での振り分けも可能なので、
実際に使用する場合はサービスの仕様に応じて柔軟に変更する感じになります！


## 最後に
[株式会社ネコカリ](https://www.nekokari.co.jp/)では猫の手も借りたい🔥炎上中🔥なお仕事を募集しています！
一緒に働くメンバーも募集していますので、よかったら是非！
CloudArmor使ってみたよ

割と最近熱かった案件で

- 既存のWebサイトに特設キャンペーンサイトを追加で作りたい！　※要件1
- CM打ったりしてすげーアクセス来るからサーバ別がいいな　※要件2
- 開発環境じゃなくて本番でチェックしたい！でも時間になるまで開けちゃダメよ　※要件3

みたいな点をクリアするのに、サーバ毎にIP許可を入れるっていうんじゃない方法で対応したのでそのメモ

# CloudArmor ってザックリ言うとなに？
- GCPのロードバランサにくっついてるセキュリティ機能

**ザックリすぎるよ**

まあ細かい話は置いといて今回は、LBを通す通信にはIP制限を入れられない。という困ったGCP LBの問題点をクリアするために使いました。
AWSのELBであれば

- ホワイトリスト形式での許可
- ACLでのブラックリスト設定

などなど設定できるのに対してGCPのFWはインスタンスに対してのアクセス制限しかできず、Apacheやnginx側で上手いこと処理する必要がありました。
それがCloudArmorを使うことによってロードバランサ内で弾くことができるようになり、DoS攻撃も許可されてないアクセスもWebサーバに負荷をかけなくなりました！
※ StackDriverLoggingで、ロードバランサのログを覗けば弾いたログは見えます

#####文字でダラダラ書いても解りづらいので図解！

![CloudArmor-common.png](https://qiita-image-store.s3.amazonaws.com/0/154680/3772691f-cfe5-2996-85ef-a8bfade9b100.png)

え？もっと解りづらい？
そんなぁ・・・

#####一応解説！

- まず要件1を満たすために同じドメインである必要があるので、既存LBのFrondendはいじりません。
- 要件2を満たすため、HTTPSロードバランサのHost and path rulesを使い、キャンペーンサイトだけ別のBackendServiceへ逃がします。
   - このBackendServiceにぶら下がる各InstanceGroupには、既存メインもキャンペーンも同一のWebサーバが入ります。容量は多少無駄になりますがデプロイを分ける必要がなくなります。
- そして最後！要件3を満たすためにチェックするオフィスから以外のアクセスを弾きます。
    - この弾く場合の挙動、403とか404とか好きに表示できるのでお好みで。
    - ポイントとして、CloudArmorのポリシーは、BackendServiceに対して効きます。

余談：初めて見たときPriority 2と147と483と647 ってなんでデフォルト挙動に沢山割り振られてるんだ・・・？って10秒考えて21億ちょいでintの限界って気づいた。どんだけ設定させるつもりだよ

### 大体以上！
あとは時間に合わせてCloudArmorのPoliciesを消してしまえばオープンとなります。
一回この構成を作ってしまえば、広告期間終わって流入が落ち着いてもHost and path rulesを消すとMainBackendにトラフィックは流れます。
あるいは第二弾キャンペーンも分けたいな！ってなったらルールを追加してcampaign0002を作ったり、CloudArmorのPoliciesを足したり対応可能。
夏休みに始めるAndroidアプリ開発


#自己紹介
こんにちは。大学でコンピューターサイエンスを専攻している学生です。夏休みになり、手を出したことのなかったAndroidアプリ開発の勉強をはじめたのでその記録です。

大学では、Python、Java、C++、Assembly、MySQLなどを学んでいます。

こちらの記事（<a href="https://qiita.com/oinori_man/items/29bdcc16acf186aa96a6" target "_blank">大学を合格してから始めるwindowsでプログラミング 1日目</a>）
を懐かしく思いながら読んでいたのですが、3日目で更新が途切れてしまったので、参考にしながら自分で書いてみようと思いました。

#開発環境
Windows 10 に Android Studio 3.1.3 をインストール。
当面は dotinstall の[Androidアプリ開発入門](https://dotinstall.com/lessons/basic_android_v3)を見ながら進めていきます。

#プロジェクトの作成
File->New->New Project から、プロジェクト名を MyFirstApp としました。さらに Include Kotlin Support にチェック。これでjavaでなくKotlinで開発することができます。

Kotlin（ことりん）とは、Android開発をターゲットとしたJavaVM上で動く言語のようです。クラスなしで関数を宣言できたり、プリミティブ型がなかったりと、Javaより書きやすそう。

APIは適当にAPI21を選び、Empty ProjectでFinish。APIはTools->SDK Managerから別のバージョンもインストールできるようです。

##レイアウトエディターを使う
app->res->activity_main.xmlをダブルクリックするとレイアウトエディターが開けるのですが、ここでエラー。中央にHello Worldと表示されるはずが、何も表示されません。右上の！アイコンをクリックすると、failed to load appCompat ActionBarとでています。![Screenshot (9).png](https://qiita-image-store.s3.amazonaws.com/0/153141/7e3eae33-c68b-ed33-25af-5bfd94a70cca.png)


調べてみると、app->res->values->styles.xmlの

```XML:styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
```

を

```XML:styles.xml
<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
```

に変えると直るようです。

レイアウトエディターでは、上のタブから画面サイズやAPIを変更したり、左のタブからドラッグ＆ドロップでテキストやボタンを配置できるようです。GUIでできるのは簡単！

##仮想デバイスでアプリを実行する
作ったアプリはPC上で仮想のAndroidデバイスを動かし、テストします。右上のデバイスアイコンをクリックし、Create Virtual Deviceをクリック。
![Screenshot (12)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/153141/88f38330-270d-1c75-94b4-5c3308b43e44.jpeg)
今回はNexus6Pを選択し、Next。Enable Device Frameのチェックを外し、Finishします。

緑の再生ボタンで仮想デバイスが起動される…はず……が、またしてもエラー。
![Screenshot (14).png](https://qiita-image-store.s3.amazonaws.com/0/153141/ff311305-5c64-fc8e-f7dd-7576e9738283.png)


メモリが足りないのかと思い、Android Studioに割り当てるメモリの最大値を変更することに。インストール時に推奨値の２Gにしていましたが、Help->Edit VM Custom Options に以下の分を追加して４Gに。

```XML:studio64.exe.vmoptions
# custom Android Studio VM options, see https://developer.android.com/studio/intro/studio-config.html
-Xmx4g
```

これで無事動きました。仮想デバイス上でネット検索やデバイスの設定までできるのはびっくり！
右上の再生ボタンから、Hello Worldアプリを起動することができました。

![Screenshot (16).png](https://qiita-image-store.s3.amazonaws.com/0/153141/210caa61-5e2f-1418-dc86-f8ae180745ae.png)

今回はここまで。~~次回はdotinstallのつづきからやっていきたいと思います。~~
dotinstallは記事にせずさっさと終わらせてしまいました。

次の記事はこちら -->[Android Studioで電卓アプリを作る](https://qiita.com/yanasep/items/503b378c439752f70880)

##コメント
勉強を進めるより記事を書くのに時間がかかってしまいました笑。パソコンはほどほどにして、目を労りましょう。
WordPressでIXR_Libraryを使って投稿する際、マルチサイトで投稿できない場合

完全に備忘のために書いておきます。

```wp-includes/class-wp-xmlrpc-server.php
public function wp_newPost( $args ) {
    if ( ! $this->minimum_args( $args, 4 ) )
        return $this->error;
	
        switch_to_blog($args[0]); // add

        $this->escape( $args );

        $username = $args[1];
//略
```

`IXR_Library.php`を使う際に`$client->query("wp.newPost",～)`で投稿処理を呼び出しますが、blogIDを指定してもブログが切り替わって投稿されなかったため、中身の`wp_newPost($args)`に`switch_to_blog($args[0])`を追加して、切り替えを行って投稿されるようにしたところ上手く動きました。

誰かの何かの参考になれば幸いです。
styled-components + TypeScript + Material-UI

`strict` モードではエラーになる。

```typescript
const InlineInput = styled(TextField)`
  && {
    margin-top: 36px;
  }
`
```

`React.SFC` に、型をキャストしてあげれば良い

```typescript
const InlineInput = styled(TextField as React.SFC)`
  && {
    margin-top: 36px;
  }
`
```


ref: https://github.com/mui-org/material-ui/issues/9756


追記

この書き方だと、Prop を渡したい時に困る・・・

```tsx
interface Props {
  value: string
  onChange: () => void
  label?: string
}

const InlineInput = styled(TextField as React.SFC<Props>)`
  && {
    margin-top: 36px;
  }
```

などとしなければいけなくなる・・・

Material UI のPropsを取ってくれば良いかもしれない。
ブルーライトカットのすすめ

Q. これプログラミングの記事ですか？
A. いいえ、プログラマ向けの記事です。

# TL; DR
* いわゆる「ブルーライトカット」レンズはなんだかんだ有効だよ (※そういう思い込みな可能性を否定するものではない) 
* 度なしも売ってるよ
* 目は大切にしようね！

# 個人的背景
全く自慢にもなんにもならないのですが、3歳かそこらから眼鏡を掛けています。
そこまで極端に目が悪いわけではないのですが、遠視+乱視と近視+乱視というわけのわからん崩れ方をしている上、微妙に虹彩が弱いらしく強い光が苦手という困ったちゃんな目玉を持っています。
そんなわけで、だいたい大学の頃から眼鏡に極弱いカラーレンズを使っていました。
(この頃は特に何の理由もなくブルーグレーを入れていた覚えがあります)

ブルーライト・カットを入れだしたのは割と最近のことで、確か3年ほど前のことだったはずです。
職業プログラマとなったからにはまあ当然なのですが、日がな一日ディスプレイと睨めっこすることも珍しくありません。
当然目薬と蒸しタオルがお友達になるわけですが、一年ほどしてじりじりと視力が悪化。幼少からの眼鏡ユーザーなら恐らく馴染み深いであろう "眼鏡頭痛" の症状が現れだし、フレームもガタが来ていたので素直に作り直すことにしました。
この時勧められたのが、いわゆる "ブルーライトカット" レンズでした。

# 利点
## 目の疲れ方がマシになる
はじめに断っておきますしあとにも書きますが、**疲れなくなるわけではありません**。こんだけガンガン酷使する職業なんだから諦めろって話ですよ。
ただ、非常に楽になります。椅子を買い替えたら腰が楽になった、みたいな話です。

プログラマは黒背景を好む、なんてよく言われますが、白色光は3原色全てを混合したものなわけで、それだけ青、つまりブルーライトもたっぷり使われているという……
ともあれ、見た目の変化を押さえ込みつつそれなりにエネルギー量を落としてくれる、というのは「目の疲れ方」にじわじわと効いてきます。具体的にはそう、*プロジェクトが燃え燃えしちゃったときの残業中とかに*。

## 不眠が改善される！？
念の為: **これはあくまで私個人の体験です**。
といってもそこまですごい話ではありません。寝付きがマシになった、程度の話ですね。
よく「*ブルーライトは不眠を引き起こす*」なんて言います。私は「はいはいワロスワロス」な感じでした。
いやまあ、**気づいていない不眠があっただけのことなんですけど**。要するに寝付きがエラい悪くて (1時間ぐらいかかる) 、コンピュータ歴が変に長いもんだからそれしか知らなかったのが問題でした。

もしあなたが今「なーんか仕事始めてから寝付き悪くなったよなー」なんて状態なら、だいぶよくなるかもしれませんよ？
……あ、**寝る前にスマホいじらないならの話ですが**。

# 欠点
## おかね
**レンズ代がだいたい+3000円～+5000円**とかそこらへんでしょうか。JINSとかは5000円持ってくので微妙に悲しみ感あります。私は~~「今回は敢えて高いところに行ってみるか！」とかわけのわからんこと言いながらフレームが逝った眼鏡抱えて~~和真に駆け込んだら3000円でつけてくれて驚いたクチです。~~しかも滅茶苦茶細かく診てくれたのでめっちゃ得した~~

もっとも、**そもそも今眼鏡をかけていないなら** (あるいは伊達なら) **、度なしのブルーライトカット眼鏡がJINSやそこらで安く売っています**。というか**質を問わないならダイソーにあります**。

## 即座に劇的な効果があるわけではない
先程も述べましたが**長期的に見てじわじわ効いてくるタイプ**だということです。
少なくとも、ブルーライトカットを入れたから「*あ゛ー*」と唸りながら目頭を揉むことが減るわけではありません (中長期的にはかなりマシになるんですけどね) 。そこらへんは度数調整しましょう。

ここからは現在度入り運用組向けですが、*何も言わずに作ってもらった眼鏡は概ね視力検査の距離を主眼とした調整になるものです*。そりゃまあ、視力検査しながらレンズ入れ替えてくのが眼鏡の度数割り出しですからね……
ぶっちゃけ一度よさげな眼科、あるいはお高めの眼鏡屋の専門家に目的を伝えて、有用な調整を出してもらうほうがよっぽど重要です。**ブルーライトカットは所詮オプションであり、万能薬ではありません**。
もっとも、特化品を作るとそれはそれで普段使いと切り替える時に混乱します。遠近両用は慣れるまでキツイらしいですね。

## 職務内容によっては使いようがない
最大の問題かもしれません。ブルーライトカットは語弊を承知で言うなら「青系の光 (の一部) を遮断する」というものです。
ということはつまり、**世の中がほんのり黄色っぽくなってしまう**んです。
本当に気にならないぐらいほんのりなんですが、「あーちょっと違うねえ」とわかるぐらいには差が出ます。**差が出ちゃまずい職業では使えません**。

……プログラマなら平気だろうって？ いやいや、**画像加工系のソフトとかやってる人は大変でしょう**。
こればっかしは諦めるか、うまいこと付き合うしかありません。
いっそ普段からかけ続けて「そういうもの」にしてしまう、というのも手ですけどね。

# ところで
世の中には~~アホな~~様々なものがあふれるもので、「ブルーライトカット」を謳う**ソフトウェア**が存在します。あれです、画面にフィルタ掛けるやつ。
極論、あれでもまあそれなりに効果はあるんじゃないかな？ とは思いますよ。タダで使えるのもそこらに転がってますし、家で試す分にはいいかもしれませんね。
最近ではWindows 10が「夜間モード」として取り入れたりしているので、そのうちスマホでも標準装備みたいになっていくんでしょうかねえ……
MacでDockが 上下に配置している サブディスプレイに移動してしまった時の対処法


どう調べても「ディスプレイの下にカーソルを持ってくる」と書いており、意味がわからなかった。

例：[Mac PC で Dock がサブディスプレイに移動してしまった時の対処法](https://qiita.com/Yinaura/items/a8f42f4c671459acc349)

その原因が、水平に配置したディスプレイのことを言っているからだと気付くのに小一時間。

・
・
・

解決したのはこの方法。

[垂直に配置されたディスプレイ間でDockを移動する方法（英語）](https://apple.stackexchange.com/questions/141493/moving-dock-between-vertically-arranged-displays-in-os-x-mavericks-and-later)

![mz0jZ.png](https://qiita-image-store.s3.amazonaws.com/0/82372/e79f2170-f24e-33b7-aa3e-2134594a6fac.png "mz0jZ.png")

オレンジのエリアで解決。

上が下より小さいと万事休すなのでしょうね。
CoinCheckを騙ったやつから不正ログインされた話

#まとめ
・CoinCheckを騙ったやつに二段階認証コードを聞かれて、教えてしまう。
・不正ログインのメールがくる。
・すぐさま、パスワード変更/CoinCheckサポートへアカウント凍結依頼

ばかですね。はい。

#一連の流れ
2018/7月某日 19時頃、CoinCheckを名乗る男性(03-6667-5156)から電話がかかってきました。

CoinCheck「〇〇（本名）さん、あなたのアカウントが台湾のIPアドレスから大量にアクセスが来ています。
こちらで、ブロックするので本人確認をしてもよいでしょうか？」

私は呑気にCoinCheckも気合はいってんなーと思って「どうぞどうぞ」と答えました。

CoinCheck「本人確認をするために、こちらからSMSを発信しますので、ダイヤル入力をお願いします。」

※SMSの発信元は050-3131-8909
　CoinCheckの本物と同じ発信元。
　たぶんこれはブラフというか信用させるための工夫です。

私は言われたとおり入力。

CoinCheck「本人確認をするために、二段階認証のコード入力をお願いします。」

CoinCheck側が二段階認証のコードが必要になることないだろうと思い、怪しいと疑いながらも、入力。

その後、すぐにログイン通知メールが届きました。不正ログインです。

怪しいとわかっていながら、話に乗ってしまいました。浅はかでした。
CoinCheckには、資産は入っていなかったので意識が緩んでいました。

すぐにパスワードを変更し、CoinCheckへアカウント凍結依頼しています。

# 各社対応(2018/07/21現在)
##CoinCheck
公式Twitter/公式サイトに情報なし。

##Zaif
~~公式Twitter/公式サイトに情報なし。~~
公式Twitterにて、他社で詐欺が確認されたことを報告、また注意喚起している(2018/07/22)
https://twitter.com/zaifdotjp/status/1021249178972884993

ryoheiさん、対応ありがとうございました。

##bitFlyer
公式Twitterにて同様の詐欺が確認されたことを報告、また注意喚起している(2018/07/20)

https://twitter.com/bitFlyer/status/1020268611443646464

# あとがき
まだ発生して間もない詐欺であり、情報があまりないため、
情報共有を目的として、この内容を寄稿しました。

同じ電話番号から着信のあった人が、Google検索でこのページに辿りつけることを願います。
TIC-80 初心者講座: マップ・スプライト画像を画像ソフトで描いて取り込もう

# TIC-80 とは？

TIC-80 は、無料でオープンソースな架空のレトロゲーム機です。Windows,Mac,Linux,Android,ラズパイなどで動作します。詳細は [まとめページ](https://qiita.com/yamachan360/items/3544a96f0dbea31224be) から。

# 今回のネタ

TIC-80 には標準のスプライト・エディタがありますが、残念ながらあまり使い勝手が良くありません。そこで画像ソフトを用いてスプライト画像を作成し、それをTIC-80に取り込む方法を説明します。

画像ソフトは今回、Windows用のフリーで使いやすい [Edge](http://takabosoft.com/edge) を使用します。16色パレットのGIF画像が扱えるソフトであれば何でも良いので、お好みのツールを使用してください。

# 実際の手順

## TIC-80 から書き出す

まず TIC-80 を起動し、必要であれば何かのカートリッジを読み込んでおいてください。

そして、コンソールで以下のコマンドを実行します。

```
export sprites
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/dc30d328-60d2-cb64-d7ec-0a91674de529.png)

ファイルの保存画面になりますので、適当なファイル名で保存してください。今回の説明では **sprites.gif** のまま変えずに保存します。

## 画像ツールで修正する

保存した画像を画像ソフト(ここではEdge)で開きましょう。以下のように TIC-80 のスプライト・エディタと同じ内容が表示されるはずです。

※ 以下は起動直後の状態なので、何かのカートリッジを読み込んでいたら違う表示になります

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/bdbfeadd-7d55-f9c0-394d-e0af32e445aa.png)

さて、あとは自由に画像を追加していきましょう。今回は、とある光のヒーローに似た感じの 16x32 ドットのキャラクタ画像を3つ、描いてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/8f132abc-18e7-ab06-6e9c-083e166094ff.png)

## GIF形式で保存する

さて、ここが重要です。**ファイル** の **エクスポート** メニューから **GIF形式で保存** を選択し、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/1b865f6c-0286-11cf-e48f-17f1bf1c914c.png)

各種設定画面で、以下のように選択して **保存** ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/c4945348-f003-c572-c1f4-38423b69516a.png)

出力ファイル名の指定になりますので、さきほどと同じファイル名 (sprites.gif) で上書き保存しましょう。

## TIC-80 に読み込む

さて、保存した画像を TIC-80 で読み込みましょう。コンソールで以下のコマンドを実行します。

```
import sprites
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/757189f2-b140-d101-8d04-2eeddc72fb41.png)

読み込むファイル名の選択画面になりますので、さきほどと同じファイル (sprites.gif) を指定しましょう。

読み込みを実施したら、スプライト・エディタで確認します。例のヒーローが追加されているのがわかりますね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/d87cf16e-262f-343e-fcf6-6eed509ce34a.png)

# 補足情報

## Fantasy Console

Fantasy Console (架空のレトロゲーム機) としては [PICO-8](https://www.lexaloffle.com/pico-8.php) が有名です。有料ソフトですが、日本製で日本語資料も多いので、最初にさわるのはこちらが良いかもしれませんね。私も大好きです。

## Edge 画像ソフトについて

* グリッド表示を 16x16 に設定しておくと使いやすいです
* パレットの最初の色を背景色と決めてしまい、描く対象にない色に変えておくとわかりやすいです

## sprites.gif 画像について

* サイズは横128ドット、縦256ドットです
* 上半分がBG(バックグラウンド)用で、スプライトIDは0~255です
* 下半分がFG(フォアグラウンド)用で、スプライトIDは256~511です

## TIC-80 の標準パレット

ちょっと画像を追加したい時、TIC-80 の標準色 (標準パレット) に変換しておくと、うまくマージできます。画像ツール GIMP 用のパレットを置いておくので、よかったら使用してください。

以下の内容を適当なテキストエディタで、`TIC-80.gpl` というファイル名で、GIMP のパレット用のフォルダ (Windows の場合は ユーザーフォルダにある .gimp-2.8/palettes フォルダとか) に保存してください。

```:TIC-80.gpl
GIMP Palette
Name: TIC-80
Columns: 16
#
 20  12  28	#0
 68  36  52	#1
 48  52 109	#2
 78  74  78	#3
133  76  48	#4
 52 101  36	#5
208  70  72	#6
117 113  97	#7
 89 125 206	#8
210 125  44	#9
133 149 161	#10
109 170  44	#11
210 170 153	#12
109 194 202	#13
218 212  94	#14
222 238 214	#15
```

# TIC-80 に興味をもったら

[無料でオープンソースな架空のレトロゲーム機「TIC-80」に関するまとめ](https://qiita.com/yamachan360/items/3544a96f0dbea31224be) ページを参考にしてみてください。

ではでは。
git 更新が不要なファイルをpushしてしまった時の対応

### git管理対象だけど、間違って更新してしまった時は・・・・
##### PRを出してレビューを受けている際に、「不要なファイル・改修がpushされてます。」みたいな感じで気がつくあるあるネタ。手元でデバッグ用にコードを少し修正してたのを忘れてそのまま```git add .```してたりするときに発生。git管理が不要なファイルをpushしてしまった時は`git rm`コマンドを利用すればいいが、git管理対象だけど、間違って更新してしまった時は・・・・

#やらかしやすい例

```ruby:try.rb
# このファイルだけ修正してpushしたい
class Try
  def index
    Test.new.calc(5)
  end
end
```

```ruby:test.rb
# 修正ファイルから呼ばれる関数の中身を知りたくて標準出力を入れた。
 class Test
   def calc(y)
     x = y + 1
p "x" # こんな感じでデバッグ用に値を標準出力するようにしてたとする
   end
 end
```

```terminal:terminal
git add .  
# ↑まとめてaddしているため try.rb　と test.rb の2ファイルがaddされてしまう
git commit
git push
```

test.rbのpushをなかったことにしたい・・・  そんな時は・・
誤って更新したファイルを、戻したいコミットの状態にして再度pushすればOK

```terminal:terminal
# まずはコミットログを確認
git log

# git checkout [戻したいコミットid] [対象ファイル名]
git checkout xxxxxx test.rb

# git add [対象ファイル名]
git add test.rb
git commit
git push origin [ブランチ名]
```
もちろん、普通に不要な改修を手で修正して元に戻すこともできますが、
コミットで戻してあげた方が安心です。
また、これ系でやらかしてしまう場合は、```git add .```する前に```git status```で変更を確認して、ファイル単位でaddかまとめてaddして問題ないのかを確認すると良い。
第23話 ラマヌジャンの式

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第23話です。

```math
\sqrt{x-2\sqrt{x+2\sqrt{x+2\sqrt{x-\cdots}}}}=1+4\sqrt{3}\sin20^\circ , x=23
```

ラマヌジャンが残した式にこんなのがあります。

```math
\sqrt{23-2\sqrt{23+2\sqrt{23+2\sqrt{23-\cdots}}}}=1+4\sqrt{3}\sin20^\circ
```

この式はsin20°という珍しい値を使っています。
この値を求めるには、sin60°と三倍角の公式を使って求めます。

```math
4 \sin20^\circ-3 \sin^3⁡ 20^\circ =\sin 60^\circ=\frac{\sqrt{3}}{2}
```

sin20°をxとおいて、三次方程式を解くとsin20°の値が得られます。
結果はこうなります。

```math
\sin20^\circ=\sqrt[3]{\frac{-\sqrt{3}+i}{16}}+\sqrt[3]{\frac{-\sqrt{3}-i}{16}}
```

よくある三次方程式の解ではあるのですが、
初めて見る人にはちょっとわけわからない、が直感的な感想ではないでしょうか。

さて、問題は虚数が出てきていることです。
sin⁡20°は実数ですから虚数は計算すれば消えるはずです。

複素数の平方根や立方根を求めるにはどうするか…。
例えば、$\sqrt{i}$を求めるにはこうします。

```math
(a+bi)^2=i\\
a^2-b^2+2abi=i\\
a^2-b^2=0, 2ab = 1
```

つまり、一度二次方程式を作ってその解を求める必要があります。
立方根なら三次方程式を使います。

sin⁡20°を求めるときに三次方程式を使ったわけですが…。
それと同じことをするわけですね。

予想がつくかもしれませんが、答えに複素数の立方根を含みます。
複素数の立方根の値を求めるために三次方程式をまた作り、
その答えにも複素数の立方根を含むので…というループが発生します。

つまり、sin20° は実数の値でありながら、複素数の立方根を使ってしか表すことができません。
なので、そんな値を冒頭の式は、結構すごい式だったりします…。
ReactなどのSPAアプリから外部APIを叩く際の「Error: Network Error」（CORSの暫定対策）

React.jsでSPAアプリを開発する際、アプリから外部APIを叩いて、うまくいかず、以下のようなエラーが表示され、丸２日ほど、時間を潰してしまったので、メモがてらQiitaに記載

```a
Error: Network Error
```

上記のエラーが表示されて、APIのリクエストに失敗する場合、API側に、CORS対策が行われていないことが理由の可能性が高いです。
自分の管理しているAPIでなければ、対策のしようがないですが、自分の管理している開発サーバーや、ローカルで立てているサーバーの場合の簡易的な回避方法です。（あくまで暫定対応なので、本番サーバーには、適用しないように）

開発サーバーやローカルのサーバーで、以下のように、設定する

Access-Control-Allow-Origin ヘッダを使用し、許可するクライアント側の生成元（オリジン）を指定

　
htaccessに、特定のサイトのみ許可

```shell:.htaccess
Access-Control-Allow-Origin: "http://hogehoge.com:8080"
```
複数指定したい場合、空白で区切る

```shell:.htaccess
Access-Control-Allow-Origin: "http://hogehoge_a.com http://hogehoge_b.com"
```

すべてのオリジンを許可したい場合、『 * 』を指定します。

```shell:.htaccess
Access-Control-Allow-Origin: *
```
0からRails入門！！MVCのモデルについて

こんにちは。
fumimi（[@fumimi](https://twitter.com/fumimi_jp)）です。

MVCの理解は初心者の方が苦戦する項目の1つだといえます。

# 対象読者

* **MVCってなに？？**
* **モデルってなに？？**
* **モデルに比べてコントローラーの量が大きくなっているけど大丈夫？？**

という方を対象にモデルの役割にMVCの理解と合わせて解説していきます。

# 環境
macOS High Sierra
Ruby 2.5.1
Rails 4.1.0

[](
# MVCとはなにか？？
)


# メソッドはコントローラーとモデルのどちらに実装する？？

メソッドは基本的にはコントローラーかモデルに書きます。

モデルはデータとビジネスロジックを表します。
コントローラーはビューとモデルを制御します。

コントローラーのメソッドはクライアントからリクエストがあったときに実行されます。
クライアントとは例えばWebサービスの場合、google chromeなどのブラウザのことです。
リクエストとは

[](
くわしくはWebの仕組みをご確認ください。
ここにはhttpメソッドとURIパターンについて記述する。
)

# ビジネスロジックはモデルに実装

MVCの書き方をしているとコントローラーに実装が集中するということはよくあります。

その理由としては、コントローラーがデータを加工するからなんですね。

MVCもM（モデル）はドメイン層でビジネスロジックを書きます。
コントローラーに実装が集中するのはこのビジネスロジックがコントローラーにも記載されることが原因のことがあります。
しっかりわけることが大切です。

# ビジネスロジックとは？？

## 定義

[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF "Wikipedia")の解説を読みます。

> ビジネスロジック（英: business logic）は、データベース上のデータに対する処理手順といったようなものを指す、ソフトウェア工学的な用語である。

[](
# なぜビジネスロジックをモデルに書かなくてはいけないのか？？

それではなぜビジネスロジックはモデルに書かなくてはいけないのか？？
理由を説明。

# モデルがでかくなるだけではないの？？
)

# まとめ

いかがでしたでしょうか？？

また、Railsに関連した記事はこちらもご覧ください。

[0からDB入門！！RailsのDBをMySQLに変更する方法](https://qiita.com/fumimi/items/4e4b030c1d9687cb2561)

また、内容に誤りがある場合はご連絡ください。
以上、最後までお読みいただきありがとうございました！！
【HTML/CSS】日付の入力欄<input type="date">の▼部分（カレンダー表示ボタン）のクリック範囲を大きくする



特に使うときないと思うけど`<input type="date">`の▼部分のクリック範囲をでかくする


# コード

```html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style>
        input[type=date]::-webkit-calendar-picker-indicator {
            /* 好きなだけpx調整 */
            padding: 20px;
        }
    </style>
</head>

<body>
    <input type="date">
</body>

</html>
```

# CodePen
<p data-height="265" data-theme-id="0" data-slug-hash="BPpxOY" data-default-tab="css,result" data-user="sola-msr" data-embed-version="2" data-pen-title="input type date css" class="codepen">See the Pen <a href="https://codepen.io/sola-msr/pen/BPpxOY/">input type date css</a> by sola (<a href="https://codepen.io/sola-msr">@sola-msr</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# おわり

- CSS素人だから変なこと書いてたらごめんね

- もうあきらめてJqueryの拡張プラグインとか[flatpickr](https://github.com/flatpickr/flatpickr)使おう（使おう）



# 参考
- [\<input type="date">をcssとfontAwsomeで使いやすくする - Qiita](https://qiita.com/MssKnd/items/1e55264b5e3acc609e1f)
- [\<input type="date"> - HTML: HyperText Markup Language | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/Input/date)
iOSのスクリーンショットを簡単に作る方法  LaunchKit w/docker

# LaunchKitを使う

iOSのアプリが作り終わり、さあ申請しよう！となるとネックになるのが、ストアに並べるスクリーンショット。デザイナさんと一緒にやっている場合は、よしなにやってくれたりするが、エンジニアが個人で趣味で作っているアプリだと特にどうしよう、となる。イラレとか使うと確実だが、OSSの[LaunchKit](https://github.com/LaunchKit/LaunchKit)を使うと特別なツールを使わず簡単にいい感じに作成できる。

<img width="1072" alt="Screen Shot 2018-07-21 at 22.42.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/122365/2d897c02-7cbd-5a1f-9dc1-30e9437c2153.png">

[Googleに買収されオープンソース化されたLaunchKitをMacにインストールする](https://qiita.com/ryohorie/items/6c324e87cf46bb05c092)という記事で紹介されていたが、dockerでもっと簡単に利用できる。

2018年7月21日現在では、[docker化のPR](https://github.com/LaunchKit/LaunchKit/pull/45)がまだOpenだが、これを利用するとdockerさえインストールしてあれば簡単に利用可能だった。まだ本家のリポジトリではマージされていないので[@victorkifer](https://github.com/victorkifer)さんのリポジトリからクローンする。

```bash
$ git clone https://github.com/victorkifer/LaunchKit
$ cd LaunchKit
$ docker-compose up -d
```

これで http://localhost:9100/ にアクセスすると上の画像のページにアクセスできる。最初はサインアップが必要だが、スクリーンショットを簡単に作成できる。難点があるとすると、iPadに対応したスクリーンショットが作成できないこと。iPadに対応したものを作るには、[DaVinci Apps](https://www.davinciapps.com/)といったものを利用するのが良いかもしれない。

作業を終了する時は以下のように実行するだけで良い。

```bash
$ docker-compose down
```

より良いアプリ開発ライフを！！
Raspberry Pi と Node.js で Amazon Dash Button を利用する方法

# 1. はじめに
記事作成時点（2018/07/21）で、すでにたくさんの方が挑戦済みの、Raspberry Pi で Amazon Dash Button の利用をしたところ、思いのほかつまづいたので、自分自身への備忘録をかねて、チャレンジした内容をお伝えしたいと思います。

今回は、ほんとに備忘録てきな簡単記事にしようとおもっていますので、間違いがあれば、ご指摘をコメント欄にご投稿、よろしくおねがいいたします。

## 1-1. この記事を読んでできること
- Raspberry Pi と Node.js で Amazon Dash Button を利用できるようになる。

## 1-2. 事前注意
- つまづきポイントの1つ目になりますが、Windows上の Windows Subsystem for Linux（Bash on Windows）では、うまく動かすことができませんでした。動作確認済みの環境としては、Raspberry Pi と Ubuntu Budgie 18.04 となります。ご自身の実行環境のご確認をおすすめいたします。

# 2. 必要なもの
## 2-1. 環境編
- 環境（Raspberry Pi3）
- OS（Ubuntu Budgie 18.04 でもOKでした。）

## 2-2. ソフトウェア編
- node
- npm

# 3. セットアップ手順
## 3-1. セットアップ
必要なライブラリ等をインストールします。

```plaintext:セットアップコマンド
必要ライブラリのインストール
$ sudo apt-get install libpcap-dev

作業ディレクトリの作成
$ mkdir DashButton

作業ディレクトリへ移動
$ cd DashButton

package.jsonの作成（リターンキー連続押下でOKです。）
$ npm init

必要モジュールのインストール
$ npm install --save dash-button
$ npm install --save child_process
```

## 3-2. package.jsonの修正
スクリプトが実行できるようにするために、package.jsonを修正します。修正ポイントは、scriptsに"scan": "dash-button scan",を追記します。

```plaintext:package.json
{
  "name": "dashbutton",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "scan": "dash-button scan",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "child_process": "^1.0.2",
    "dash-button": "^3.2.0"
  }
}
```

## 3-3. MACアドレスのスキャン
スクリプトを実行して、Amazon Dash Button のMACアドレスを調べます。スクリプト実行待機中に、Amazon Dash Button のボタンをクリックすることで、MACアドレスが確認できます。（ボタンの認識間隔は、1分程度あるので、連続クリックはしないようにしましょう。）
※00:00:00:00:00:00 のMACアドレス部分は、後で使いますのでメモしておきましょう。

```plaintext:スキャンコマンド
$ sudo npm run scan

> dashbutton@1.0.0 scan /home/pi/Documents/Node/DashButton
> dash-button scan

Scanning for DHCP requests and ARP probes on eth0...
Detected a DHCP request or ARP probe from 00:00:00:00:00:00
```

## 3-4. サンプルプログラム
サンプルプログラム（app.js）を作成します。
"00:00:00:00:00:00" の部分は、各自のMACアドレスに書き替えてください。

```plaintext:app.js
const DashButton = require('dash-button');
const {exec} = require('child_process');
const button = new DashButton("00:00:00:00:00:00");

button.addListener(() => exec('echo "ボタンおしましたね。"', (err, stdout, stderr) => {
  if (err) {
    console.log(err);
  }
  console.log(stdout);
}));
```

## 3-5. 実行
プログラムを実行し、その後にAmazon Dash Button をクリックしましょう。コンソール上に文字列が出力されれば成功です。私の環境では、sudo をつけて実行する必要がありました。

```plaintext:スキャンコマンド
実行！！
$ sudo node app.js
ボタンおしましたね。

うまくいけば、Amazon Dash Button をクリックすると、コンソールに文字列が出力されます。
```

# 4. 参考サイト

- [参考：Amazon Dash Button でおうちハックしようその1 セットアップ編](https://qiita.com/tokio-takeda/items/02bae474f8f20f35a02c)

- [参考：Amazon Dash Buttonを(正しくない方向で)使ってみた](https://qiita.com/takustaqu/items/8539b33780c9675c8657)

- [参考：Amazon Dash Buttonで何も考えずにいろいろ遊ぶ](https://qiita.com/trkbt10/items/6ec407cf6b72e9d6149a)

# 5. さいごに
みなさん、Raspberry Pi で Amazon Dash Button を利用する方法はいかがでしたか？みなさんの環境でも、うまくセットアップできていれば幸いです。（私はなんだかんだ1時間くらいはまりました。。。）うまくいけば、30分もあれば動くはずです。

2018/07/21 TAKAHIRO NISHIZONO
UINavigationBar に下線を入れる

## 最初に1x1pxの画像を生成するメソッドを作成
色を指定して幅1px高さ1pxの画像を生成

```swift
extension UIColor {
    func make1ptImage() -> UIImage {
        UIGraphicsBeginImageContext(CGSize(width:1, height:1))
        let ctx = UIGraphicsGetCurrentContext()
        self.setFill()
        ctx!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image!
    }
}
```

## 作った画像でshadowImageを埋める

```swift
self.navigationController?.navigationBar.shadowImage = 
    UIColor.black.make1ptImage()
```
ABC103-C Modulo Summation

[問題URL](https://beta.atcoder.jp/contests/abc103/tasks/abc103_c)
$m\mod a_i$ の上界は $a_i - 1$
$m = a_1 \times a_2$ $\times ... \times$ $a_n - 1$ とすればこの値は $m\mod a_i$ の上界と一致する
よって、答えは $a_1 + a_2$ $+ ... +$ $a_N - N$ となる
kotlinでandroid入門 内部ストレージ

### 内部ストレージ

端末のアプリ専用のフォルダーにアクセス
ファイルとして扱えるんですが、他からアクセスできないのでなんか使いづらいかと。


#### 1. 補足

アプリ専用のストレージ
他からアクセス出来ない
  
#### 2. 書き込み 

例はテキストファイル
localFileName=ファイル名


```
    val saveData : String = "ABCDEFG"
    try {
        // 追記書き込みでオープン (=Context.MODE_APPEND)
        val outputstream: FileOutputStream = openFileOutput(localFileName, Context.MODE_APPEND)
        outputstream.write(saveData.toByteArray())
        outputstream.write("\n".toByteArray())
        outputstream.close()
    } catch (e: IOException) {
        e.printStackTrace();
    }
```

#### 3.  読込

```
    val dataList : ArrayList<String> = ArrayList<String>()
    try {
        val fis = openFileInput(localFileName)
        val reader = fis.bufferedReader()
        for (lineBuffer in reader.readLines()) {
            dataList.add(lineBuffer)
        }
        reader.close()
        fis.close()
    } catch (e: IOException) {
        e.printStackTrace()
    }
```

#### 4. 削除

```
    try {
        deleteFile(localFileName)
    } catch ( e : IOException) {
        e.printStackTrace();
    }
```

これで一応アクセスできます
Python開発環境構築のための自分用メモ

# はじめに
pythonの各バージョンや依存パッケージごとに仮想環境を作る方法．
調べれば見つかるが，毎回調べているので自分用にメモします．
なおmac osxを前提としています．

- 公式
 - https://github.com/pyenv/pyenv-virtualenv

# インストール
### pipのインストール

```sh
wget https://bootstrap.pypa.io/get-pip.py
sudo python ./get-pip.py
```

### pyenvのインストール

```sh
brew install pyenv pyenv-virtualenv
```

.bashrcや.zshrcといったシェル設定ファイルに以下を追記する．

```sh
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

# 環境構築

##### インストール済みのバージョンの確認

```sh
pyenv versions
* system
```

##### インストールできるバージョンを確認

```shell
pyenv install --list
```

##### バージョンをインストール

```shell
pyenv install 3.7.0
```

```shell
pyenv versions
```

##### コンテナを構築
(便宜上，コンテナと呼びますが正しいかどうかは不明)

```shell
# pyenv virtualenv バージョン 任意の名前
pyenv virtualenv 3.7.0 my_service1
```

##### コンテナに入る

```shell

pyenv activate my_service1
```

```shell

python --version
3.7.0
```

##### コンテナから出る

```shell

python deactivate
```

# 依存ライブラリの保存と展開

##### 保存
いろいろインストール

```sh
pip install boto3
```

依存ライブラリを保存

```sh
pip freeze > requirements.txt
```

##### 展開

```sh
pip install -r requirements.txt
```

# つまり
### 初回の開発環境構築
1. コンテナを作って入る．
2. 依存ライブラリのインストール
3. requirements.txtに依存ライブラリを保存
4. requirements.txtをgitでバージョン管理

### 2回目以降の環境構築
1. コンテナを作って入る
2. requiremets.txtから環境を構築 (``pip install -r requirements.txt``)
pythonでUA偽装してseleniumでブラウジング

# UA偽装できました！
金曜日に上の人と話し、「自動化するとしたらUA偽装できないと実用価値ないね」という事になり、pythonで偽装できる方法を探したところ、案外あっさり出来ました。

```python
import os
from selenium import webdriver

options = webdriver.ChromeOptions()

#ここにUAを書きます。今回はiPhoneでsafari
options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Mobile/14C92 Safari/602.1')

# いつもどおりchromedriverの場所を指定します
chromedriver = "/hogehoge/hoge/"

#chromeoptionとして先程設定したoptionsを設定します
driver = webdriver.Chrome(chrome_options=options,executable_path=chromedriver)

#以下はテストで行いたい処理を書きます。今回は開くだけ
driver.get('https://www.google.co.jp/')
```

開いたブラウザがUA偽装出来ていることをタブで[確認くん](https://www.ugtop.com/spill.shtml) を開いて確認します。
「現在のブラウザー」に指定したものと同じものが表示されていることを確認し、あっていればオッケイです。

UAの一覧は[こちら](https://developers.whatismybrowser.com/useragents/explore/)から確認できそうです。（言われなくれもリスト持ってるわ！と言われそう）

ついでですが、ただ偽装して開いただけだと、サイズが微妙で毎回変更しないといけないので、それっぽい画面が開くように設定しましょう。

```
driver.set_window_size(600,1000)
```
これを処理の最初に書いておけば、指定したサイズでウィンドウが開き、その画面で処理が走ります。

さ、細かいの書いていきましょう。
React（メモ）

# お作法
## React.createClass と Class
```
// bad
const sample = React.createClass({
  render() {
    return();
  }
});

// good
class sample extends React.PureComponent {
  render() {
    return();
  }
}
```


# メソッド
## setState()
- stateを更新するのに使用する
- 前のstateと更新後のstateを元にstateを更新したい

```jsx
this.setState((prevState, props) => {
  count: prevState.count + props.count
}));
```

# テクニック
## 条件付きレンダリング
- 条件付き演算子を使用したインラインIf-Else

```jsx
render() {
  const isLoggedIn = this.state.isLoggedIn.
  return(
    <div>
      The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> logged in.
    </div>
  );
}
```

# その他
## key
- どのアイテムが変更されたのか、追加されたのか、削除されたかを識別する
- listコンポーネントとかに使用する
- random()数をkeyに使用するとrender()時に毎回呼ばれてしまうので、idとかを使用する

## Fragments
- 今まではコンポーネントから複数のchildrenを返す場合`div`などでラップする必要がありました。だが、Fragmentsを使用することでその必要がなくなりました

```jsx
import React, { Fragment } from 'react';

function Glossary(props) {
  return (
    <dl>
      {props.items.map(item => (
        // Without the `key`, React will fire a key warning
        <Fragment key={item.id}>
          <dt>{item.term}</dt>
          <dd>{item.description}</dd>
        </Fragment>
      ))}
    </dl>
  );
}
```

## jsx
### htmlFor
- htmlタグの属性forのこと
- labelに付与することで、同じ内容のid属性を持つ要素と関連付けられる

```jsx
<label htmlFor="namedInput">Name:</label>
<input id="namedInput" type="text" name="name"/>
```

## React Loadable
- ロード状態、エラー状態、タイムアウト、プリロードなどを作成するのに役立つ  
ロード状態：https://github.com/jamiebuilds/react-loadable#creating-a-great-loading-component  
エラー状態：https://github.com/jamiebuilds/react-loadable#loading-error-states  
タイムアウト：https://github.com/jamiebuilds/react-loadable#timing-out-when-the-loader-is-taking-too-long  
プリロード：https://github.com/jamiebuilds/react-loadable#preloading

## Error Boundary
http://dackdive.hateblo.jp/entry/2017/07/29/100000

## reactとreact-domの違い
### react
- 下記はReactが元からもっている機能でdivコンポーネントを生成しているだけ

```
const sample = React.createElement('div');
```

### react-dom
- Reactに実際のDOMノードへ描画を指定できる

```
const sample = document.getElementId('content');
React.DOM.render(Reactのコンポーネント, sample);
```

### DOM
- DOMとは？

> Document Object Model (DOM) は、HTML および XML ドキュメントのための API です。これはドキュメントの構造的な表現を提供し、内容や表示形態の変更を可能にします。
(MDNより)

- ノードとは？

ノードとは各要素(HTMLではエレメントやタグという)自体のことを表す

# 参考/引用元
https://qiita.com/KDE_SPACE/items/e21bb31dd4d9c162c4a6#%E3%83%8E%E3%83%BC%E3%83%89