OmniAICreator/Qiita-1.07M huggingface dataset:
どちゃくそ簡単なstyled-components入門

# 目的
styled-componentsって聞いたことあるけどまだちょっと触った事ない・・・
CSS in JSって何・・・？
**小難しい理論とかいいんでとりあえず動かしたい**

みたいな方向けにstyled-componentsめっちゃ簡単だよっていう記事です。
裏側まで100%理解しているわけではない初心者記事なので変なところがあったらツッコミいただけると嬉しいですm(_ _)m


# 前提
以下のような方向けです。
- React触ったことある
- スタイル付けは外部にCSSファイル作ってやってた

# 流れ
**STEP 0)** とりあえず、react環境が用意されているとします。（なければ、create-react-appでいいので作っちゃいましょう）
**STEP 1)** styled-componentsをインストールし、importします。
**STEP 2)** JSXのタグ部分を、任意の名前に置き換えます。
**STEP 3)** 上記の名前をconstで宣言し、スタイルをつけます。


### STEP 0
まずはこういう感じでコンポーネントがあるとします。

```react
// js/App.js
import React from 'react';

export class App extends React.Component {
  render() {
    return (
      <div>hello styled-component!</div>
    )
  }
}
```

### STEP 1
では早速styled-componentsを導入しましょう。

```terminal
npm install --save styled-components
```

ついでにbabel pluginも入れておきます。

```terminal
npm install --save-dev babel-plugin-styled-components
```

```js
// .babelrc
{
  "presets": ["@babel/preset-env", "@babel/preset-react"],
  "plugins": ["babel-plugin-styled-components"]
}
```

コンポーネントに戻って、styled-componentsをimportしましょう。
export defaultがstyledになっていますのでそのままimportします。

```react
// js/App.js
import React from 'react';
import styled from 'styled-components';

export class App extends React.Component {
  render() {
    return (
      <div>hello styled-component!</div>
    )
  }
}
```

### STEP 2
reactコンポーネントで返される仮想DOMを、divからTitleに変更します。
（名前はなんでも大丈夫ですが、定数として扱うので、他の定数名と被らないようにしましょう。）

```react
// js/App.js
import React from 'react';
import styled from 'styled-components';

export class App extends React.Component {
  render() {
    return (
      <Title>hello styled-component!</Title>
    )
  }
}
```

### STEP 3
下部分に、constで先ほど付けた名前を定義します。
styled.の後に好きなタグ名をつける事で、そのタグとしてHTMLが出力されるようになります。
あとは、``の中に通常のCSSと同じように記述するだけです。

```react
// js/App.js
import React from 'react';
import styled from 'styled-components';

export class App extends React.Component {
  render() {
    return (
      <Title>hello styled-component!</Title>
    )
  }
}

// styled-components
const Title = styled.h1`
  font-size: 34px;
`;
```

ね、簡単でしょ？

---

ちなみに、sass(scss)記法がそのまま使えます。

```react
// styled-components
const Title = styled.h1`
  font-size: 34px;
  strong {
    color: #f0f011; // Titleの中の<strong>タグで囲まれた部分だけ色が変わる
  }
`;
```


# 発展
[propsに応じてスタイルを出し分ける](https://www.styled-components.com/docs/basics#adapting-based-on-props)
[syntax highlighting（自分の環境にあったモノを導入しましょう！）]
(https://www.styled-components.com/docs/tooling#syntax-highlighting)


# 余談
そもそもstyled-componentsを使うべきか否か、というのはケースバイケースかと思います。
個人的にはコンポーネント単位でファイルをまとめられるのでこの方が好きですが
実際どう実装すべきかはプロダクト・プロジェクトの設計によりけりでしょう。
[Ruby] ActiveSupport Timeのサンプル

自分の環境に`active_support`があるか確認

```
$ gem which active_support
```

もし無い場合

```
$ gem install activesupport

か

$ vim Gemfile
gem 'activesupport'     // 追記
$ bundle install
```

とてもシンプルなサンプルコード

```ruby
#!/usr/bin/ruby

require 'active_support/time'
# require 'active_support/all' でも可

### 現在日時取得(Timeオブジェクト)
now = Time.now
p now
# => 2018-10-12 17:23:43 +0900

### 分解
p now.strftime("%Y-%m-%d")
# => "2018-10-12"
p now.strftime("%H:%M:%S")
# => "17:23:43"
p now.strftime("%z")
# => "+0900"

### 加減算
p (now - 1.second).strftime("%Y-%m-%dT%H:%M:%S")
# => "2018-10-12T17:23:42"
p (now + 1.minute).strftime("%Y-%m-%dT%H:%M:%S")
# => "2018-10-12T17:24:43"
p (now - 1.hour).strftime("%Y-%m-%dT%H:%M:%S")
# => "2018-10-12T16:23:43"
p (now + 1.day).strftime("%Y-%m-%dT%H:%M:%S")
# => "2018-10-13T17:23:43"
```

おわり
Rxjs6.3.3の仕様についての自分用メモ

## 内容
このコード、helloが先に呼ばれます。
ofで初期streamを渡した場合、それらは同期的に宣言した所ですぐにsubscriberが実行されます。

```javascript
const {
    Observable,
    Subject,  // subscribeしてからの値しか流れないsubject
    BehaviorSubject,  // subscribeした瞬間から以前の値が流れてくるsubject
    of,
} = rxjs;

// 同期的に流れる
of(5, 1).subscribe(value => console.log('hello'));
console.log('world');
// 結果: hello world

const subject = new Subject();
subject.next(1);
subject.subscribe(v => console.log(v));
// consoleには何も出力されない
subject.next(1);
// 1

const behaviorSubject = new BehaviorSubject(500);
const subscriber = behaviorSubject.subscribe(v => console.log(`${v}だよ`));
behaviorSubject.next(1);
subscriber.unsubscribe();
behaviorSubject.subscribe(v => console.log(`${v}は最後の状態だよ`));
// 500だよ
// 1だよ
// 1は最後の状態だよ
```

## DEMO
https://jsfiddle.net/kahirokunn/z0qt3a9r/2/

## 最後に
前から気になってたのでスッキリ。
Flywayを途中から使いたい（コマンドライン版）

.sqlファイルベースで管理できるマイグレーションツール [Flyway](https://flywaydb.org/) を導入しようとしたときに、既に手動で適用してしまっているファイル達は無視するようにする方法です。

[sbt flywayを途中のバージョンから的な](https://qiita.com/katsut/items/d2b75e81b9e84df7ec97) のようにMavenやGradleでの設定方法はわかったのですがコマンドラインではわからなかったのでメモ。

# ファイル構成

既に以下のような構成だとした場合

```
/
┣flyway
┃　┣conf
┃　┃　┗flyway.conf
┃　┗（省略）
┗sql
　┣tables
　┃　┣company.sql
　┃　┗user.sql
　┗views
　　　┗company_user.sql
```

まずはFlywayに適合するように、ファイル名を変更します。

```
/
┣flyway
┃　┣conf
┃　┃　┗flyway.conf
┃　┗（省略）
┗sql
　┣tables
　┃　┣V1.0.0__company.sql
　┃　┗V1.0.1__user.sql
　┗views
　　　┗V1.0.2__company_user.sql
```


# flyway.conf

```conf
flyway.driver=org.postgresql.Driver
flyway.jarDirs=../drivers
flyway.url=jdbc:postgresql://127.0.0.1:5432/postgres
flyway.user=USER
flyway.password=PASSWORD
flyway.locations=filesystem:../sql
flyway.baselineVersion=1.0.2
```

キーポイントは `flyway.baselineVersion` です。ここで指定されているバージョンまでは、ベースラインとして変更管理の対象外になります。

# 実行

```bash
./flyway baseline
./flyway migrate
```
ダイジェスト認証用ファイルをPythonで書き換える

# ダイジェスト認証用ファイルの作成

ダイジェスト認証用ファイルは次のコマンドで作成できる。

```$ sudo htdigest -c [ファイル名] '[レルム名]' [ユーザ名]```

例えば
ファイル名：.htdigest
レルム名（AuthName）：RealmName
ユーザ名：Aoba
パスワード：zoizoizoi
とすると、次のようにすればダイジェスト認証用ファイルを作成できる。

```sh
$ sudo htdigest -c /var/www/html/.htdigest 'RealmName' Aoba
Adding password for Aoba in realm RealmName.
New password:zoizoizoi
Re-type new password:zoizoizoi
```

パスワードを変更したくなったときは上記のコマンドを再度行えばよいが、シェルスクリプトでやろうとするとパスワード入力がうまくできない。やろうと思えばやり方はあるらしいが、今回はPythonで書き換える。

# ダイジェスト認証用ファイルの構成

.htdigestファイルの中身は次のような構成になっている。

```python:.htdigest
# [ユーザ名]:[レルム名]:[MD5値]という構成になっている
Aoba:RealmName:ba31a07d0aa46ccc6c511602204e9c15
```

このうち[MD5値]は、文字列"[ユーザ名]:[レルム名]:[パスワード]"をMD5変換したものである。

# 新しいパスワードでダイジェスト認証用ファイルを再作成する

よって、新しいパスワードで.htdigestファイルを書き換えようと思ったら次のようにすればよい。

```Python
import hashlib

user = "Aoba"
realm = "RealmName"
password = "new_password"

# MD5値の算出
md5 = hashlib.md5("{}:{}:{}".format(user, realm, password).encode("utf-8")).hexdigest()

# .htdigestファイルに書き込む新しい文字列
htdigest = "{}:{}:{}\n".format(user, realm, md5)
```
SharePoint 2013ディスカッション掲示板のディスカッションにだけ連番をつける

##やったこと
今回はSharePoint2013のディスカッション掲示板で、「ディスカッションにだけ連番をつけたい」という要望に答えた際の備忘録です。

##はじめに
SharePoint Onlineでも健在のディスカッション掲示板ですが、ディスカッションの最初の投稿（ディスカッション）と、それに対する返信（メッセージ）という２つのコンテンツタイプから形成されています。
ディスカッション掲示板の場合、アイテムのIDは、ディスカッションとメッセージいずれにも割り振られるため、ディスカッション一覧でIDを表示しても飛び飛びになります。

そこで今回の要望では、IDと異なる連番を*ディスカッションにだけ*つけてほしいとなりました。

###コード
SharePoint2013での対応になります。必要なDllやonlineの場合の認証については[太田さんの記事](https://idea.tostring.jp/?p=914)を参照してください。


```discussion.ps1
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll";
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll";
$siteUrl = "<siteurl>";
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl);
$list = $ctx.get_web().get_lists().getByTitle('<ListTitle>');
$loopnum =<IDのMax>;
$counter=1;

for($i =1;$i -lt $loopnum;$i++){
$listItem = $list.GetItemById($i);
$ctx.Load($listItem);
$ctx.ExecuteQuery()
if($listItem.FieldValues.Title -ne $null){
$listItem = $list.GetItemById($i);
$listItem.set_item('fakeID','AAA-'+[string]$counter);
$listItem.update();
$ctx.Load($listItem);
$ctx.ExecuteQuery()
$counter = $counter+1;
}else{
}
Write-Output([string]$i+","+[string]$counter)
}
```

ポイントは、メッセージ（返信）ではタイトルが空になるということです。
通常ディスカッションはタイトルが必須になりますので、タイトルがnullかどうかで２つのアイテムを判別しました。
(ContentTypeIDでも判定できそうですが、うまく行かず。)
あとハマったのは、SharePointでの言語設定が日本語か英語かによってリスト名／列名が変わってしまうこと、列名に空白や記号が入ると、いずれの場合もリストがない、列がないエラーが出ました。
実際の実行時には英語にして、~~列名は一旦空白、記号をのぞいてから~~実行しています。

>【2018/10/17追記】
>列名は内部名を使えば問題なく解決できました。[ここ参照](https://social.msdn.microsoft.com/Forums/office/en-US/ea47e82b-273e-48bc-a6cb-c961e2c7c06a/how-to-set-and-get-item-if-the-sharepoint-column-name-has-space)
>内部名の探し方はやはり[太田さんの記事](https://idea.tostring.jp/?p=470)で。

あとは新規作成された場合の対応は、SharePoint Designerでワークフローを組んでいます。
[こちら](https://yarnthen.github.io/yarnthencohosking/tutorials/2017/08/01/unique-ticket-id-generator-in-sharepoint.html#disqus_thread)が非常に参考になりました。
第一世代(oci-c)_予約したIPアドレスを元にOracle Database Cloud Serviceを作成する方法

# 概要
　第一世代(oci-c)で予約したIPアドレスを元にOracle Database Cloud Serviceを作成する方法を纏めてみました。
　ちなみに、第二世代(oci)のOracle Cloud Infrastructure Databaseでは予約したIPアドレスを割り当てることはできないようです。(執筆当時：2018/10/12)

　※本手順は2018/10/12時点での手順です。
　※※画面イメージが現行と異なる場合があります。

# IP予約方法
　まずは、割り当てるIPを予約。

　１．Oracle Database Cloud Serviceコンソールを開く
　２．IP Reservationsのリンクを押下
　※IP Reservationsのリンクは表示されていない場合があります。私も表示されていなかったと記憶しています。その場合は、後述するインスタンス作成2のAdvanced SettingsのIP Reservationsを操作してみてください。これでIP Reservationsのリンクが表示されるはずです。
![手順1.jpg](https://qiita-image-store.s3.amazonaws.com/0/301468/a19fc655-48b9-5f29-2128-7eef5898e985.jpeg)

　３．IP Reservationsの画面が開いたら、Createボタンをクリック
![手順1.jpg](https://qiita-image-store.s3.amazonaws.com/0/301468/6eca6719-4dbb-0d68-7ff7-1e12332ef80f.jpeg)

　４．入力してOKボタンを押下
　　　今回は共有ネットワークでのみ使用するパターンで作成。
![手順1.jpg](https://qiita-image-store.s3.amazonaws.com/0/301468/ec58a596-0211-5fac-34e3-2c6088261809.jpeg)
　Name：任意の予約名を入力
　Region：地域を選択
　On IP Network：OFFの場合は、共有ネットワークでのみ使用可能。
　　　　　　　　  ONの場合は、IPネットワークでのみ使用可能。


上記操作後、10秒ぐらい待って画面更新すると以下のようにIPアドレスが作られます。
![手順1.jpg](https://qiita-image-store.s3.amazonaws.com/0/301468/5bf44891-c873-d2b5-70c6-2ddad597a252.jpeg)


# 予約したIPを元にOracle Database Cloud Serviceを作成
　１．サービス画面より、作成ボタンを押下。
![手順1.jpg](https://qiita-image-store.s3.amazonaws.com/0/301468/bfb02002-d84f-2e82-a631-05b9f135561f.jpeg)

　２．インスタンスの作成1
　※赤枠部分の入力は、予約したIPアドレスと同じ条件で入力してください。
　※※今回は共有ネットワークで作成するので、IP NetworkはNo Preferenceを選択。
　※※※License Typeは上のラジオボタンがBYOL（ライセンス持ち込み）となります。
![手順1.jpg](https://qiita-image-store.s3.amazonaws.com/0/301468/a9e64aef-9478-9eba-d254-af415f555090.jpeg)

　３．インスタンスの作成２
　本画面で予約したIPを指定。赤枠の部分が設定個所となります。
![手順1.jpg](https://qiita-image-store.s3.amazonaws.com/0/301468/7509570e-c9e1-af2c-f47e-a55c36bab7e9.jpeg)

　４．インスタンスの設定確認
　予約したIP名になっていれば、OK。他の項目にも問題なければ、作成ボタンを押下して30分程度待ちます。
　![手順1.jpg](https://qiita-image-store.s3.amazonaws.com/0/301468/dc3eaae5-9c6d-0922-5363-85478f880b8c.jpeg)

　５．作成したインスタンスの確認
　インスタンスが作成されると、Public IPが表示されます。
![手順1.jpg](https://qiita-image-store.s3.amazonaws.com/0/301468/0e09ff96-0f7b-a478-8a58-18c11971d0d7.jpeg)

# 作成したインスタンスの接続確認
　SSHで作成したインスタンスにアクセスできれば完了となります。

　これで、DBサーバを作り直しても同じPublic IPを割り当てることができます。
【Rails】renderとredirect_toの違いと使い分け


renderとredirect_toの挙動が似ていて、混同しがちだったので
調べたものをまとめておきます。
## renderとredirect_toの違い
・render　　　　　：　表示させるviewファイルを指定
・redirect_to　　　：　URL(HTTPリクエストメソッド）を指定

#### renderは（"フォルダ名/viewファイル名"）

```user_controller.rb
def
 render("user/edit")
end
```

#### redirect_toは（"/URL/〜/〜/”)

```user_controller.rb
def
 redirect_to("/app/posts/new")
end
```



## renderとredirect_toの動き方の違い
・render　　　　　：　controller　→　view
・redirect_to　　　：　controller　→　URL　→　route　→　controller　→　view

redirect_toの方がちょっと遠回りしてますね。

renderがviewファイルを指定して、それを表示させるだけの処理に対して
redirect_toはブラウザ上でHTTPリクエストを受けたのと同じ処理がされます。


## renderとredirect_toの使い分け

そのページに移る際に、
１．データの更新/削除、inputやformなど何かデータを送る処理
２．ログインなどの成否判断の処理
が行われているかで使い分けができます。

上のような処理が必要な場合には、
####HTTPリクエストがPOSTの可能性が高い＆適切なcontrollerの処理が要求される
為、`redirect_to`を使用します。

・render　　　　　：　ログインや入力形式に失敗した場合など　＝　ただエラーを表示させるだけ
・redirect_to　　　：　データ更新/削除が必要な場合　　　　　　＝　controllerの処理が必要

## 参考サイト
RailsGuide
https://railsguides.jp/layouts_and_rendering.html#redirect-to%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B
https://railsguides.jp/layouts_and_rendering.html#render%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B

render と redirect の違い
https://qiita.com/january108/items/54143581ab1f03deefa1

railsのrenderとredirect_toの違い
https://qiita.com/1ulce/items/282cccba1e44158489c8

【Rails】redirect_toとrenderの使い分け
https://qiita.com/jumpyoshim/items/ed10721c26963abdf121
UnityでUUIDを生成する方法と、iOSからみる端末固有IDの考察

## UnityでUUIDを生成する方法

```cs
string GetUUID()
{
    var guid = System.Guid.NewGuid();
    return guid.ToString();
}
```

## 端末固有IDの考察

### そもそもなぜ必要か

1. 複数のアプリ間で特定のユーザーを追跡したい場合 (広告などの用途)
2. アプリの再インストール時にユーザー情報を復元したい場合

### 端末固有IDに関するiOSの動向

端末固有IDはユーザーが自由に変更できるものでないため、現在は非推奨という形になっています。(バージョンによりますが、該当メソッドを呼び出しているとリジェクトされるか、後述する代替メソッドの結果が帰ってきます)

iOS6.0以降で代替メソッドとして以下の2つが実装されているようです。

- `identifierForVendor`
    - 開発者が同一であれば、同一の端末固有IDが返ってきます
- `AdvertisingIdentifier`
    - 開発者に関わらず、同一の端末固有IDが返ってきます
    - ユーザーが取得の可否を設定可能(恐らくデフォルトで不可)
    - ユーザーが任意のタイミングでリセット可能

![fasdfasdfasdf.png](https://qiita-image-store.s3.amazonaws.com/0/55365/fb3a481f-2df6-de03-48ed-1ee23c64bddc.png)

iOS 12では、設定アプリから[プライバシー]>[広告]と進んでいくと上記の画面になりました。

### Unityの`SystemInfo.deviceUniqueIdentifier`について

- ドキュメントにはデバイス固有のIDが返ってくると書いてある
    - iOSの場合、内部的には`identifierForVendor`を呼んでいる
- UnityのバージョンやiOSのバージョンによって結果が異なる場合がある
    - 詳しくはドキュメントを参照

### 考察

> 1.複数のアプリ間で特定のユーザーを追跡したい場合 (広告などの用途)

基本的に推奨されていない流れだが、`AdvertisingIdentifier`で追跡可能なユーザーのみ追跡するという選択肢はありそう。

>  2.アプリの再インストール時にユーザー情報を復元したい場合

`identifierForVendor`を使えば実現可能だが、Androidではそういった仕組みが恐らくないことに注意が必要。アカウントを用いたユーザーデータの復元が現実的かと思います。

## 参考

【Unity】Unity上でUUIDを作る - Matt02's Note
http://matt02.hatenablog.com/entry/2014/07/26/023635

Unity - Scripting API: SystemInfo.deviceUniqueIdentifier
https://docs.unity3d.com/ScriptReference/SystemInfo-deviceUniqueIdentifier.html

《必見》Unity任せの機種固有ID取得は危険！-Unityアプリの効果計測 | マーケティングを支援するDigital Cloud Platform
https://admage.jp/blog_008_unity-apprication.html

iOS/Androidで端末を識別するIDまとめ | 株式会社アイリッジ
https://iridge.jp/blog/201404/4836/
GCP(GCE)でプリエンプティブインスタンスが起動しない場合の対処法

#1　GCP(GCE)のプリエンプティブインスタンス

　格安でサーバが立てられるGoogleのプリエンプティブインスタンスだが、定期的に嫌がらせのようなエラーに見舞われる。エラー内容を検索しても解決法にたどり着けなかったので、同じように困っている人が対処出来るように内容をまとめたい。

##　プリエンプティブインスタンスに関する説明
　https://croud.jp/?p=150

#2　エラーと対処法

##　2.1　インスタンスを起動するためのリソースが足りない
###　　エラーメッセージ
‌The zone 'projects/project-id-xxx/zones/xxx' does not have enough resources available to fulfill the request. 
Try a different zone, or try again later.
###　　対処法
　このメッセージが出たリージョンは、プリエンプティブ用のリソースが枯渇し、インスタンスの起動が出来なくなっている。いつ復旧するかは神のみぞ知る状態。すぐにでも起動を行いたい場合は、プリエンプティブを外してインスタンスを作り直すか、別のリージョンへ引っ越すしか無い。ちなみにゾーンを変更しても無駄だ。私は東京リージョンで2018/8/1から丸二日、この症状を食らった。

##　2.2　グローバルな静的IPのアドレス変換機能が正常に動作しない
###　　エラーメッセージ
The global or regional natIP resource pool is exhausted
###　　対処法
　静的IPを設定する限り、そのリージョンではインスタンスが起動できない。いつ復旧するかは神のみぞ知る状態。すぐにでも起動を行いたい場合は、静的IPをインスタンスから外し、起動後に再び静的IPを割り振ることで対処可能。私は東京リージョンで2018/10/11からこの症状を食らった。2018/10/12においてこの記事を書いている現在、まだ状況は改善していない。


#3　今後に関して

　今後、別のエラーが出たら記事を追加していきたいと思う
each_sliceメソッドの使い方

この記事では、Rubyのeach_sliceメソッドを用いて、配列をある要素ごとに分割する方法を紹介します。

#配列を要素ごとに２分割する方法について

```posts_controller.rb

class PostsController < ApplicationController
  def index
    @posts = ["post1", "post2","post3","post4", ... ,"post10"]
  end
end
```


```index.html.erb
<% @post.each_slice(2) do |post1,post2| %>

    <hr>
     <%= post1.id %>
    <div class = "content">
     <%= post2.id %>
    </div>

<% end %>
```
上記のコードにより、下記のようになります。

![b724f33af51cdcc8bffb43acfc973ac3.png](https://qiita-image-store.s3.amazonaws.com/0/300592/5f2eaa15-2f79-bddb-9253-29ab2a036635.png)


#配列の要素ごとに３分割する方法について

```index.html.erb
<% @posts.each_slice(3) do |post1,post2,post3| %>
    <hr>
    <%= post1.id %>
    <%= post2.id %>
    <%= post3.id %>
<% end %>
```

しかし、上記のように実行すると、ブラウザには下の画像の通り、NoMethodエラーが起きてしまいます。

![c95c83f1dbe64d6128c9eb00ec2c8d40.png](https://qiita-image-store.s3.amazonaws.com/0/300592/e8f448a0-73f1-e8d5-e3d7-2f2ee5abbb63.png)

エラー画面の<%= post2.id %> のところにnilが入っていますと書かれています。
その原因として、each.slice(3)の場合、ブロック引数に示したpost1,post2,post3に@postから受け取った数字が1ループあたり3つずつ入ります。10は3では割り切れないため、最後のブロック引数の値の2つがnilとなってしまいます。

| 1,2,3 | 4,5,6 | 7,8,9 | 10,nil, nil | となり、引数にnilが含まれていたのでエラーが起きてしまいました。

そこで下記のコードのように、各要素に <% if post(x) != nil%>を付け加えます。
このようにすることで、引数にnilが入った場合は実行しないという動作を実現できます。

```index.html.erb
<% @posts.each_slice(3) do |post1,post2,post3| %>
    <hr>
    
    <% if post1 != nil%>
      <%= post1.id %>
    <% end %>
    
    <% if post2 != nil %>
      <%= post2.id %>
    <% end %>
    
    <% if post3 != nil%>
      <%= post3.id %>
    <% end %>
<% end %>
```

ブラウザでの動作は下の画像の通りになります。

![5a7e2623db86fac9f54727889b30e99f.png](https://qiita-image-store.s3.amazonaws.com/0/300592/835a5870-3c68-1880-1ff4-ebb2297d01e6.png)


#まとめ
この記事では、配列を要素ごとに分割するRubyの便利なメソッドについて紹介しました。
参考になれば、幸いです。
GR-Lycheeが残念なところ

ルネサスのがじぇるねから出ているGR-Lycheeが残念なところをいくつか書いていきます。

まず、値段
１万円と言う価格は、カメラ搭載でWiFi+Bluetooth搭載としてはRaspberryPiよりは高いけど
決して高くないと思います。

しかし、コアが、廉価版です。
GR-PeachにあったLAN端子が搭載されていない上に、コアのダウングレードなので残念です。

さらに、J-Tagは使わないでも良いですが、使いたい人には使い勝手が悪すぎます。
フレキも最短なので、もっと長くするほうが良いでしょう（ここは買った人がやればいい）

LCDをつけたいけど、つなげようとすると、固定穴が使えず、非常に勿体無い。
これはフレキだけでは解決できない問題なのが残念。

I2CのMotorShieldをつけたら、カメラ映像にノイズが乗ったり
ESP-32が落ちた?と思える状態になっていたり・・・
（100uF程度のキャパシタが見つからないのは、私の調査不足?）

という点でしょうか・・・
かなりまとまっていると思うのですが、所々抜け落ちており残念でなりません。
昨日のエクセルVBA学習-遺伝学学習編-

こんにちは！

昨日から長期的スパンで遺伝学の基本的な事を学べるようにと思って

遺伝学の基礎の本を元にしたエクセルVBA開発をしています。

めちゃめちゃシンプルな作りにしています。


以下、コードです。

Sub Oct11()
MsgBox ("これから遺伝学の勉強を始めます")
Worksheets("sheet1").Range("A1").Value = InputBox("メンデルの法則を作ったのはだれ？", "")
Worksheets("sheet1").Range("B1") = "=if(A1 = ""グレゴール・ヨハン・メンデル"",""正解"",""残念。"")"

Worksheets("sheet1").Range("A2").Value = InputBox("メンデルが修道院に属しながらおこなった交配実験は？", "")
Worksheets("sheet1").Range("B2") = "=if(A2 = ""エンドウ豆"",""正解"",""残念。"")"

Worksheets("sheet1").Range("A3").Value = InputBox("糖鎖の糖が構成されている分子を３つ答えなさい。", "")
Worksheets("sheet1").Range("B3") = "=if(A3 = ""炭素・水素・酸素"",""正解"",""残念。"")"

Worksheets("sheet1").Range("A4").Value = InputBox("O型ではガラクトースの次に来る糖は何か？", "")
Worksheets("sheet1").Range("B4") = "=if(A4 = ""フコース"",""正解"",""残念。"")"

Worksheets("sheet1").Range("A5").Value = InputBox("A型ではO型の糖鎖の途中のガラクトースにつく糖は何か？", "")
Worksheets("sheet1").Range("B5") = "=if(A5 = ""Nアセチルガラクトサミン"",""正解"",""残念。"")"

'Worksheets("sheet1").Range("A6").Value = InputBox("", "")
'Worksheets("sheet1").Range("B6") = "=if(A6 = """",""残念。"")"

'Worksheets("sheet1").Range("A7").Value = InputBox("", "")
'Worksheets("sheet1").Range("B7") = "=if(A7 = """",""正解"",""残念。"")"

'Worksheets("sheet1").Range("A8").Value = InputBox("", "")
'Worksheets("sheet1").Range("B8") = "=if(A8 = """",""正解"",""残念。"")"

'Worksheets("sheet1").Range("A9").Value = InputBox("", "")
'Worksheets("sheet1").Range("B9") = "=if(A9 = """",""正解"",""残念。"")"

'Worksheets("sheet1").Range("A3").Value = InputBox("", "")
'Worksheets("sheet1").Range("B3") = "=if(A3 = """",""正解"",""残念。"")"





End Sub

Sub Module()
Module1.Oct11
End Sub

まだまだ作り途中なのですけども、こんな風にしています。

そしてボタンモジュールを組み込んでいるのでボタンをクリックしたら

MsgBoxが出て、エンターを押すと問題をひたすら解いていく

というような形ですごくシンプルですが量がとてつもなく多いです。

例えば
G（グアニン）
C（シトシン）
A(アデニン)
T(チミン)
みたいな誰でも知っているような基本４塩基とアミノ酸２０種類を

覚えたりするのは容易な事ではないですしさらに

アリの染色体本数は2本ですけどもそのゲノムを書きなさい

みたいなことを問われたら、今の私では無理ですね。

また、病理学においてはTに変わる塩基でU(ウラシル)

というものがあるようですね。

それに関しても今後は遺伝学・病理学などの事を学んでいきながら

こういったものも作っていけたらなと考えています。

![2018-10-11 (2).png](https://qiita-image-store.s3.amazonaws.com/0/200171/92ec3aaa-274c-8592-16fb-cfad62fc43d3.png)

こんな風に、作っています。

キャプチャとコードを載せておきますので

こんな風に学習障害がありながらも、日々努力をしています。
FDR制御（BH法) を実装してみた

#BH法
FDR制御のためにBH法を実装してみたので自分用にメモ

与えるpvalueの配列にnanが入っていると事故るので注意。
最後にfor使ってるのがダサい気がするが、他にいい方法が見つからない。

参考にしたサイトは[こちら](https://stats.biopapyrus.jp/stats/multivariate-test/fdr-controlling-bh.html)


```python3:qvalue.py

import numpy as np

def adjust_bh(p_values):
    p_values=np.array(p_values)
    m=len(p_values) 
    sorted_idx=np.argsort(p_values) #後で元の順番に戻すのに使う
    sorted_p=p_values[sorted_idx]
    one_to_m=np.arange(1,m+1)
    q_prime=m*sorted_p/one_to_m
    q_values=np.zeros(m)
    q_values[m-1]=q_prime[m-1]
    for i in range(m-2,-1,-1):
        q_values[i]=np.min([q_prime[i],q_values[i+1]])

    return q_values[np.argsort(sorted_idx)] #元の順番に戻してから返す
```
reactプロジェクトでnpm startしたときにコンソールクリアしたくないときにやったこと

`create-react-app`で作ったプロジェクトは`npm start`をやるとコンソールを全部クリアしてからサーバーが起動する。
これをやると後でメモしたかったコマンドとかが全部消えちゃう。（コマンド自体は履歴残るけど、実行結果とか）
なんとかならんか、と思って調べたけどそういうコマンドオプションはないようなので、順を追って調べてみた。

まずは`package.json`を見る

```package.json
{
  "name": "react",
  .....
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}
```

これを見ると、`npm start`は`react-scripts start`を呼び出しているようだ。次

``` node-modules/react-scripts/bin/react-scripts.js
....
switch (script) {
  case 'build':
  case 'eject':
  case 'start':
  case 'test': {
    const result = spawn.sync(
      'node',
      nodeArgs
        .concat(require.resolve('../scripts/' + script))
        .concat(args.slice(scriptIndex + 1)),
      { stdio: 'inherit' }
    );
....
```

`../scripts/`にあるファイルを実行している様子、さらに次

``` node-modules/react-scripts/scripts/start.js
....
const clearConsole = require('react-dev-utils/clearConsole');
....
    const devServer = new WebpackDevServer(compiler, serverConfig);
    // Launch WebpackDevServer.
    devServer.listen(port, HOST, err => {
      if (err) {
        return console.log(err);
      }
      if (isInteractive) {
        clearConsole();
      }
      console.log(chalk.cyan('Starting the development server...\n'));
      openBrowser(urls.localUrlForBrowser);
    });
....
```

お、`clearConsole()`という関数が、これかな？

``` node-modules/react-dev-utils/clearConsole.js
function clearConsole() {
  process.stdout.write(process.platform === 'win32' ? '\x1B[2J\x1B[0f' : '\x1B[2J\x1B[3J\x1B[H');
}
```

どうやら、このエスケープシーケンス使ってコンソールをクリアしているみたい。
ここをコメントアウトすれば、無事にコンソールクリアはされなくなった。

本当はissueとか上げるべきなんだろうけど、あくまで暫定処置。
`npm start`の仕組みとかもわかったからひとまずこれでよし。
GETをPOSTにしてリダイレクト

## やりたいこと
GETパラメータをPOSTパラメータに変更してリダイレクトしたい。


## 実現方法
JavaScriptでsubmitする。
jQueryだけでも実現可能だが取り方が面倒なのでPHPでやる。

## ソースコード
```php:get2post.php
<!DOCTYPE html>
<head>
<meta charset='utf-8'>
</head>
<html>
<body onload='document.redirectForm.submit();'>
<form name='redirectForm' method='post' action='<?= htmlspecialchars($_GET["rd_url"]) ?>'>
<input type='hidden' name='param1' value='<?= htmlspecialchars($_GET["param1"]) ?>' />
<input type='hidden' name='param2' value='<?= htmlspecialchars($_GET["param2"]) ?>' />
</form>
</body>
</html>
```

例えばここにPOSTしたい場合
http://example.com/destination

以下のようにURLエンコードしてrd_urlに渡してやる
http://example.com/get2post.php?rd_url=http%3a%2f%2fexample%2ecom%2fdestination&param1=10&param2=200
[BITRISE][iOS] 環境ごとにアプリアイコンを変更する

サーバの向きや環境ごとにアプリをビルドしていると次第に同じアイコンだらけになって見分けがつきにくくなってくる。

Xcode上ではAppIcon.appiconsetを他の環境向けに増やして Build Settings > Asset Catalog App Icon Set Name で指定する方法があるけど、開発用のアイコンイメージとか正直アプリバンドルに含めたくないし、アプリアイコン変わったり環境増えたら作り直さないとならないしで面倒臭い。別にデザインにもこだわりなくていい部分だし。

CI上で完結できれば無駄なリソース管理も発生しないし、ビルド番号などのCI上のダイナミックな情報も入れることができる。
Bitrise上では **Stamp AppIcon with version number** というステップがあった。

# ステップ追加
アイコン変更したいWorkflowのXcode Archiveする前に **Stamp AppIcon with version number** ステップを適当な位置に追加する。

<img width="246" alt="steps.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/b4b00246-d10c-7670-cc2b-831a2ebce459.png">

# Input variables の設定
設定は至ってシンプル。
![step_detail.png](https://qiita-image-store.s3.amazonaws.com/0/156085/5f563476-8b79-ee31-0522-13bc11fb85a8.png)

## Path to icons of the project 
書き換え対象のアイコンが存在するディレクトリを指定する。プロジェクトからの相対パス。
例えば、xcassetsで管理している場合以下のようになる。
`アプリ名/Assets.xcassets/AppIcon.appiconset` 

## Version number or string 
number か stringが指定できる。
Staging環境なら `STG` Dev環境なら `DEV` という文字列を指定してみる。
1.0.0(18)みたいな形での使用を想定してるっぽいけど。

## Build number to stamp on the icon 
()内に表示する要素を指定する。
デフォルトのビルド番号 `$BITRISE_BUILD_NUMBER` のままにする。

# 結果
![result.png](https://qiita-image-store.s3.amazonaws.com/0/156085/1ed89e43-1f36-9458-b73e-91194915fbbc.png)

500回以上ビルドしてるのでカッコ内が少し厳ついが、文字列の長さに因ってちゃんと収まるように描かれる。
便利すぎる。

# bitrise.yml
```YAML
---
format_version: '4'
default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
project_type: ios
workflows:
  deploy_stg:

    省略

    - bitrise-step-stamp-appicon-with-version-number@1.0.0:
        inputs:
        - stamp_version: STG
        - stamp_path_to_icons: myapp/Assets.xcassets/AppIcon.appiconset

    省略
```
iPADのセンサーとMATLABを使って、バスと電車揺れの違いの分析もどきしてみた


# はじめに
バスと電車を比べると、バスでの乗り物酔いが圧倒的に多い。揺れが強いからとか振動周波数が違うからとか、巷で言われていることは本当なのか。非プログラマの私が齧った程度のMATLABでいい加減に調べてみた。Qiitaに載せていいのかかなり疑問、と思ったけど、まぁいい。

# iOS MATLAB
PC上のMATLABは使ったことがあったのだが。iOSでも使えるのは知っていたものの、使ったことがなかった。たまたま触ってみて、センサーデータのログを取れることが分かり、この企画を思い立った。使えるセンサーは、Acceleration, Magnetic Field, Orientation, Angular Velocity, Positionの５つ。100Hzまでのサンプリングが可能。データはクラウドに保管され、コンピュータ上でも解析が可能。

# サンプリング
ガジェットは大きめの方が揺れが少ないということで**人目を気にしつつ**iPADでデータ取り。Acceleration,Orientation, Angular Velocityを100Hzでサンプリング。バス、電車それぞれ数回の乗車。座席に座って、ガジェットをなるべく水平に保つ。

# 分析
というほど、大袈裟なことはしていない。色々データで遊んだところ、Accelerationのデータが分かりやすそうという感触を得たので、これを使うことにした。体軸に対して上下、左右、前後をそれぞれ、プロット。あとは、フーリエ変換してみて、周波数毎のスペクトラムを計算させたものをプロット。詳細は
https://www.mathworks.com/help/matlab/ref/fft.html

# 結果
バス、電車２例ずつを提示する。いずれのバスもセンサーを見ているだけで、かなり酔った。電車の方は乗り心地は違うものの、いずれもほぼ酔わず。図を提示する。左から、加速度、スペクトラム、スペクトラム２Hzまでの拡大図。黄色が上下、青が左右、赤が前後。
### バス１
![Bus1.jpg](https://qiita-image-store.s3.amazonaws.com/0/237763/f26bfb7e-23f0-ece2-89ca-8fdcae814fbf.jpeg)
### バス２
![Bus2.jpg](https://qiita-image-store.s3.amazonaws.com/0/237763/8a4ca058-271a-fb7f-dd2f-7eedeb35f382.jpeg)
### 電車１（乗り心地の良い方）
![Train1.jpg](https://qiita-image-store.s3.amazonaws.com/0/237763/da6afa8c-8555-610e-791e-bbe96f2613e4.jpeg)
### 電車２（乗り心地が残念な方）
![Train2.jpg](https://qiita-image-store.s3.amazonaws.com/0/237763/5253a5c1-321c-5f54-a6e5-db3593c8d49a.jpeg)

# 考察
1. 確かにAccelerationはバスで大きいけど、乗り心地の残念な電車も負けてはいない。
2. 一方、周波数スペクトラムを見ると、バスでは0.5Hz以下の成分が高め。一方、電車は乗り心地にかかわらず、それよりは低め。あちこちでデータ取りまくると有意差出るかどうかは不明だけど。
3. ネットに転がっていた　**A review on the effects of frequency of oscillation on motion sickness** www.dtic.mil/dtic/tr/fulltext/u2/a472991.pdf のAnnex Aによると、0.1〜0.5Hzの成分が酔いの原因とある。
4. 正直、２には最初行き着かなかったのだけど、なんとなくそのあたりかなと思って、適当に検索していたら３を見つけたのでこれかな,とした。ちょっと邪道は承知。
5. ガジェットのセンサー、結構使える。
学習障害（難読症・失読症）の人のためのプログラミング入門

今日は、いつもと違う形でのプログラミングに関する記事を書かせてください。

タイトルにもある通り、「学習障害（難読症・失読症）の人のためのプログラミング入門」

というタイトルの通りに発達障害の人がプログラミングをするにはどういう事から

入門していったらいいのか、ということを書かせていただきます。

私は最初、ウェブ系のHTMLやCSS・PHPから入りました。

例えば、PHP。

```php
<?php
for($i = 1; $i< 10; $i++;){
echo "Hello world!";
}

?>
```

というような書き方から入ったりしています。

私はWindows 10でxamppを使用して

PHPを使ったりしてます。

またLinuxに慣れ親しむためにも

VMware playerにCentOS7を入れて

PHPを動かしてみたりしています。

Googleカレンダーなどを利用して

今日はここからここまで勉強するぞ！

って決めたらそれに従って勉強していき

NoticeえらーやFatalエラーに対しての

理解なども深めていったりするといいでしょう。

私自身、ミドルウェアのApacheなどの理解

はまだまだ深まっておりませんが

今後その関連の事に関しても

記事にしていきたいと思います。

今後は、ExcelVBAとPHPに関する記事の２本立て

で書いていこうと思います。

まずはExcelVBAでオブジェクト指向の理解を

深めていこうと思います。
RGB ビット深度のうんちく (中編) 〜 実数型と整数型の変換

- RGB ビット深度のうんちく (前編) 〜 前提知識
  - https://qiita.com/yoya/items/41b00127b0b1fea8c4f1
- RGB ビット深度のうんちく (中編) 〜 実数型と整数型の変換
  - https://qiita.com/yoya/items/6ee02736f1db8bdd520e
- RGB ビット深度のうんちく (後編) 〜 整数型同士の変換
  - https://qiita.com/yoya/items/3509bbb54c0732865882

# はじめに

このエントリは、連続的なRGB値と不連続なRGB値の相互変換についての、うんちくです。
例えば、ガンマ補正は 0.0〜1.0 に対する式なので、RGB値が 0〜255 の場合は 0.0〜1.0 に一度変換する必要があります。

連続的な値のどの範囲を、どの不連続な値で代表させるかは色んなパターンが考えられるので、整理していきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/42c7faeb-4d92-5250-6f50-ba71d01a70ad.png)

### 最近傍方式

画像処理の世界で実際に使う輝度の量子化はこの方式が基本です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/534f894b-ec30-82a0-100f-5cf2244c2b9d.png)

全体として量子化誤差による輝度のバイアスが少ない傾向があります。つまり、元の画像の明るさを維持しやすいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/1fb5861d-58f4-43a7-abf9-aa57f3d6fab8.png)

水色の斜めの点線は連続量そのものを表し、緑色は量子化したデジタル値を表します。
このように一定範囲を不連続な値(0,1,2,3)に代表させる為、元の値からずれる分を**量子化誤差(Quantization Error)**と呼びます。

この方式だと量子化誤差の一番大きい場所も抑えられますし、全体としても増分と減分が相殺して良い感じです。

## 範囲の均等化

量子化の情報量としての考え方では、元のアナログ量をどれだけ均等にコード化出来るかが重要なポイントなので、両端だけ範囲が狭いのは符号化効率的に駄目という判断もあるかもしれません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/c8efd490-48d4-9139-db20-868515b8478e.png)

量子化誤差の増分と減分が相殺しているように見えますが、、最低輝度と最高輝度の誤差が大きくなります
ただし、中くらいの輝度が広がりそこだけコントラストが改善されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/24c1d815-0ff0-8f78-926e-8238014db65d.png)

実は、デジタルの整数値同士の深度変換だとビット処理の都合で、この方式を使う可能性があります。
それについては、。RGB ビット深度のうんちく (後編)で解説する予定です。

### 逆変換の逆数

筋の悪い方法ですが、一応把握しておく必要があります。
デジタルのビット深度2(0,1,2,3)からアナログに変換する時は、3で割れば良いので、その逆で 3 を掛ければ良いだろうと短絡的な処理を書く事も十分あり得る事です。(整数変換で小数点が落ちる事を忘れてとか。。)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/ce7d323f-3a00-2155-508b-16178f072c44.png)

このように暗くなる傾向があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/7754475f-de51-ca10-dbef-bd2aa7e59d75.png)

実際のところビット深度が多いほど量子化誤差を無視して良い状況が増えるので、処理**速度重視**でこの方式をあえて使う場面もあるでしょう。
こういう処理をされる可能性を頭に入れておくと、出所の分からない画像を解析する時に役に立つと思います。

また、量子化とは違うのですが、8, 16 しか対応してない画像フォーマットで 12ビットを格納したい時に、16ビットの上位12ビットを使う決まりにした場合、この方式で計算する事になります。PNG の sBIT チャンクまさにそれです。

- 参考) ImageMagick で PNG の形式を変換 #sBIT
   - https://blog.awm.jp/2016/01/26/png/#sbit

## デジタルからアナログへ (D/A 変換)

デジタルの値からアナログ相当の 0.0〜1.0 に変換するのは定数でただ割れば良い。
とも言い切れません。。

### 定数で割るだけ方式

まずは素直な方法。そのままスケールを変えるだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/d437a870-a1a1-f44d-028c-8690d2a5c1c8.png)

これはこれで正しいのですが、量子化誤差で消えた情報はそのまま忘れて良いのか気になりますよね。

### ランダムを入れる方式
[要出典]

もともと、デジタル値は、アナログ量の一定範囲を代表した値です。そこで、いっその事ランダムで戻して元々の範囲を全部使えるようにしよう。という方法もあります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/d7c2b8f1-5598-70ca-3a7e-09835aa46111.png)

# 最後に

ビット深度間の変換は後編にて。

- RGB ビット深度のうんちく (後編) 〜 整数型同士の変換
  - https://qiita.com/yoya/items/3509bbb54c0732865882
RGB ビット深度のうんちく (後編) 〜 整数型同士の変換

- RGB ビット深度のうんちく (前編) 〜 前提知識
  - https://qiita.com/yoya/items/41b00127b0b1fea8c4f1
- RGB ビット深度のうんちく (中編) 〜 実数型と整数型の変換
  - https://qiita.com/yoya/items/6ee02736f1db8bdd520e
- RGB ビット深度のうんちく (後編) 〜 整数型同士の変換
  - https://qiita.com/yoya/items/3509bbb54c0732865882

# はじめに

このエントリは、不連続なRGB値の相互変換についてのうんちくです。
デジタル画像同士のビット深度変換の話になります。概念的には中編の延長でもあるので、そちらを先に読んでもらえると助かります。

# デジタル同士のビット深度変換

要領は中編で解説したアナログ(or実数)<=>デジタル変換の図とほぼ同じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/42c7faeb-4d92-5250-6f50-ba71d01a70ad.png)
ただし、真ん中の均等化が使われる可能性が結構ありそう。という違いはあります。

## 4ビット<=>8ビット

画像サイズの節約だと、例えばテクスチャ画像などで4ビットがよく使われます。

|グレースケール |カラフル |
|---|---|
|2^4 = 16色|16^3 = 4,096色|
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/66e21e73-98a1-597c-cdce-0b51dff4547f.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/e5929a75-aa9d-fc61-d206-c8c14c0e8cfc.png) |

なお、以下が最低限のルールです。

- 最小輝度はどちらも 0x0 だという事
- 最大輝度の4ビット表現が 0xF、8ビット表現が 0xFF でこの２つは同じ明るさという事。
- 4ビットの 0x0〜0xF を均等に引き伸ばせば 8ビットの 0x0〜0xFF になる事

### 4ビット => 8ビット

0xF を 0xFF にすれば良いので、基本的には 0x11 を掛け算するだけです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/c630e8b4-7cb6-1f79-3d51-ef2aade5b07d.png)

### 8ビット => 4ビット  (最近傍)

基本はコレです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/0716dd9b-58e0-0328-4be4-7339b85f3db9.png)

なお、整数のままでも計算できます。

```
(x*0xF + 0x87) >> 8
```

### 8ビット => 4ビット  (均等化)

最近傍方式に比べて、量子化誤差が暴れる可能性が上がりますが、ビットを落とすだけの方が処理が速いメリットを考えれば、選択肢できるケースはあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/2fffe07c-a277-fb46-850b-84a04a291e9f.png)

### 8ビット => 4ビット  (逆数)

4ビット => 8ビットで 0x11 かけるだけなので、0x11 で割れば良いよね。という短絡的な処理です。ビットを落とす均等化方式はまだメリットとのバランスが取れますが、これは悪手です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/6d665c65-3048-4ce3-bd6e-319e79acefe0.png)

とはいえ、そういう処理系もありそうですので、把握はしておくべきです。

## 8ビット<=>16ビット

最近、輝度ダイナミックレンジを広げる為に 16ビットを使う機会が増えてきました。あと、画像処理エンジンは下位ビットに誤差を積もってもある程度耐えられるよう、内部的に16ビットで画像を処理したりします。

|グレースケール |カラフル |
|---|---|
|2^16 = 65,536色| 65,536^3 = 28,147,497,6710,656色(約281兆色) |
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/5fd454fe-4ae9-3908-d16b-cf74fb5a9b8e.png)  |![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/6d978dfd-be40-86b0-f188-673438c2585f.png)  |

最低限のルールは、4ビット<=>8ビットとビット数が違うだけで同じです。

- 最小輝度はどちらも 0x0 だという事
- 最大輝度の8ビット表現が 0xFFFF、16ビット表現が 0xFFFF でこの２つは同じ明るさという事。
- 8ビットの 0x00〜0xFF を均等に引き伸ばせば 16ビットの 0x0000〜0xFFFF になる事

### 8ビット => 16ビット

0xFF を 0FFFF にするので、0x101 を掛け算するだけです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/02580921-468a-acb1-e97a-7657f2508b18.png)

### 16ビット => 8ビット

4ビット<=>8ビットで既に３種類紹介したので、最近傍法だけ図にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/4192f6e0-6c13-a2e1-863b-2bcfe19a4e05.png)

整数演算はこちらです。

```
(x * 0xFF + 0x807F) >> 16
```

# 参考URL

- Fast and Accurate Color Depth Conversion
   - http://threadlocalmutex.com/?p=48
   - http://threadlocalmutex.com/?page_id=60 - Full Table

# 最後に

間違いあれば修正しますので、ご指摘下さい。
TwitterApi

最近入社した後輩くんが、APIを利用した開発をしていた際にエラーが出たと聞いてきたので調べたらコンシューマーキーとコンシューマーシークレットが古いものだったから使えるものに変更した。
だが、「Could not authenticate you.」といったエラーが出て、まだ何かあったっけ？って少し悩んだ際にうっかり忘れてたことだったので備忘録に。

#エラー内容について
「Could not authenticate you.」
「認証できないよー」って内容。ざっくりな理解だけど、Twitterにはコンシューマーキーとコンシューマーシークレット、アクセストークンとアクセストークンシークレットの4点セットが必要らしい。

コンシューマーキーとシークレットの2点じゃダメ？？って思うけど、じゃあアクセストークンとシークレットってなんぞってことでググる。

>[参考リンク:Twitter API Key を取得する方法](http://phiary.me/twitter-api-key-get-how-to/)

>アクセストークン　→ それぞれのユーザーがそのアプリ用に発行されるものです. これが紐付けられてるユーザーはアプリ側から操作(権限選択制)できます.
アクセストークンシークレット　→　アクセストークンのシークレットです。

そういえば、twitterのアプリ連携するときに取得するあれかなと思って先輩に聞くとビンゴっぽかったので少し嬉しい。

実際は参考リンク先みたいに発行して取得できるみたい。
わたしの開発環境だと、勝手にアクセストークンとシークレットを設定してくれる便利なものがあるので深くは意識したことがなかったので一般的な取得の仕方を知れてよかった。

土日に自分でやってみようかな
watson Notebook上でファイルを扱う

# 準備
watson studioからNotebookを選択し、起動する。


# ファイルをアップロードする
右上に表示されているファイルアップロードアイコンをクリックし、ファイルをアップロードする。

<img width="613" alt="test_-_IBM_Watson.png" src="https://qiita-image-store.s3.amazonaws.com/0/245263/a4b97f84-3f5f-6237-9f29-7810a9aa4987.png">

ICOS（Ibm Cloud Object Storage）にファイルが保存されているので、一度呼び出す処理を書く必要がある。   
アップロードされたファイルの下にある***insert to code***をクリックし、***insert Credentials***をクリックし、クレデンシャル情報がNoteBookにペーストされる。

※ この時「credentials_1」となるが、「_１」は削除する

使い方は以下の通り、今回はアップロードさせた画像を表示させてみた。

``` python:python
from IPython.display import Image, display_png
from ibm_botocore.client import Config
import ibm_boto3

# ペーストされる情報******************
# @hidden_cell
# The following code contains the credentials for a file in your IBM Cloud Object Storage.
# You might want to remove those credentials before you share your notebook.
credentials = {
#     ＊＊＊＊＊＊＊
}
# ペーストされる情報******************

cos = ibm_boto3.client(service_name='s3',
    ibm_api_key_id=credentials['IBM_API_KEY_ID'],
    ibm_service_instance_id=credentials['IAM_SERVICE_ID'],
    ibm_auth_endpoint=credentials['IBM_AUTH_ENDPOINT'],
    config=Config(signature_version='oauth'),
    endpoint_url=credentials['ENDPOINT'])

cos.download_file(Bucket=credentials['BUCKET'],Key=credentials['FILE'],Filename=credentials['FILE'])

display_png(Image(credentials['FILE']))
```
form_withで囲ったボタンが反応しなかった時のメモ

##発生

    <%= form_with(url: "/login") do |form| %>
      <%= form.submit "ログイン" , class: "btn btn-default" %>
    <% end %>

と書いたときに

<img width="445" alt="スクリーンショット 2018-10-12 15.02.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/195314/a118d51d-5346-cb2b-fa7b-366fa370b2dc.png">

とでてイベントの発火がされた感じがしない。

##対処
form_with内にlocal:trueを書く

      <%= form_with(url: "/login", local: true) do |form| %>

local:true にするとXML送信がオフになる
https://techracho.bpsinc.jp/hachi8833/2017_05_01/39502

turbolinksがAjaxを使ったライブラリなので、その通信をオフにすることで無効にした
https://qiita.com/morrr/items/54f4be21032a45fd4fe9

##原因

turbolinks　が原因でイベントの発火に問題が起きていた
度々リンクに問題が起きるようで、その場合は無効にすると良い

Railsだと古い書き方をした場合にエラーが起こる
http://kray.jp/blog/must-know-about-turbolinks/

初学者なので変なこと書いてたらコメントください。
GitのSSH鍵認証で毎回パスワードを要求される

## 環境情報

- Mac High Sierra

## 問題

git pullなどで毎回パスワードを要求されてしまう。

```
$ git pull
Enter passphrase for key '/Users/user_name/.ssh/id_rsa':
```


## 解決方法

鍵の場所などは適宜読み替えてください。:pray:

```
// SSH鍵をssh-agentに登録
$ ssh-add /Users/user_name/.ssh/id_rsa

// 上記パス（~/.ssh/id_rsa）の場合、下記でも登録可能
$ ssh-add -K

// 登録されていることを確認する
$ ssh-add -l
```
Pygame 画像を読み込み、Spriteクラスで使用する

### 目標:
- pygame で画像を読み込みSpriteクラスで使用する

#### プロジェクトストラクチャー

- project/ -- 全てを入れるフォルダ（ディレクトリ）
    - img/ -- 画像を保存するフォルダ（ディレクトリ）
		- player.png
    - app.py -- codeを書くファイル

***

インポートをしましょう


```python
import pygame
import os
```
* この`os`というモジュールは、自分が使っているコンピューターの情報を得るためのfunctionがたくさん入っているもの。今回はこのファイルへのパスを得るために使う。

***

```python
# フォルダへのパスを変数に格納しよう
game_dir = os.path.dirname(__file__)
img_dir = os.path.join(game_dir, "img")
```

`os.path.dirname`
= `os`モジュールの中の`path`モジュールの中の`dirname`というfunctionを呼び出す。

`__file__`というのは実行されているファイル名が格納されている。
この場合だったら、`app.py`。

これで`game_dir`という変数に実行されているファイル(`app.py`）が含まれているフォルダ(`dir`erctory`name`)が格納される
この場合：　`project`

その`game_dir`を早速使おう。
`img_dir = os.path.join(game_dir, "img")`
= `os`モジュールの中の`path`モジュールの中の`join`というfunctionを呼び出す
`join`functionは受けった引数を一つのパスへとつなげる
この場合：　`project/img/`

***


次に、画像ファイルをpygameに読み込もう

```python
player_img = pygame.image.load(
    os.path.join(img_folder, "player.png")).convert()
```



`pygame.image.load().convert()`
= 画像を読み込み(`load()`)、pygameが扱いやすいように変換する(`convert()`)。それを`player_img`変数に格納する。


***


次に、作った`player_img`を`Player`クラスで使用しよう

以下が`Player`クラス


```python
class Player(pygame.sprite.Sprite):
    # sprite for the Player
    def __init__(self):
        super().__init__()
        self.image = pygame.transform.scale(player_img, (50, 38))
        self.image.set_colorkey((0,0,0))
        self.rect = self.image.get_rect()
```

ここに注目は
`self.image = pygame.transform.scale(player_img, (50, 38))`
ここでは`transform`モジュールにある`scale()`functionを使用する
`scale([Surface], [サイズ])`の引数
1. どのSurfaceに書くのか
2. どの大きさにするのか（ピクセル）＊Tupleで渡す

`self.image.set_colorkey((0,0,0))`
= 画像の周囲にある無駄な外縁を消すためのfunction
ここでは周囲の黒を消す (0,0,0)

`self.rect = self.image.get_rect()`
= 新しく作った画像を格納した属性`self.image`の`Rect`を`get_rect()`functionを使って、別の属性`self.rect`属性に格納しておく。

***

次に、`Player`クラスのインスタンスを作ろう

```python
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
```

`all_sprites = pygame.sprite.Group()`
= `all_sprites`変数に`pygame.sprite.Group()`を格納
`Group()`では`Sprite`クラスのものをグループでまとめることができる。
これにより、全ての`Sprite`に`update`functionを実行したりできるので便利。

`player = Player()`
= `Player()`インスタンスを`player`に格納する

`all_sprites.add(player)`
`all_sprites`変数に新しく作った`player`インスタンスを入れる


***

ゲームループの中で`Player`クラスを描く

```python
all_sprites.draw(screen)
```
= `screen`サーフェス（ゲーム画面）に`all_sprites`に含まれる`Sprite` を`draw()`する
Visual Studio Code / goenv で Cannot find "go" binary. Update PATH or GOROOT appropriately.

# 環境
MacBookPro (macOS High Sierra v10.13.6) 
homebrew/goenv で管理
Visual Studio Code

# 現象
Visual Studio Code にて GoLang の拡張機能を入れようとすると、

```Cannot find "go" binary. Update PATH or GOROOT appropriately.```

と出てインストールできない問題。

# 対応
UserSettingsを開いて、

`"go.goroot"`の値をgoenv配下のパスに書き換える。

例：

```
    "go.goroot": "/Users/hogehoge/.goenv/versions/1.8.7",
```


# 備考

goenvでバージョン変えるときどうすんだこれ
毎回書き換えるのだるい

これでだめな人は、zshの設定をvscodeでやる必要あるかも
id呼び出し

jQuery 

自分用にメモします。
id 呼び出し name でも使える模様


```ruby:qiita.rb
$('#id_1')
```

複数呼び出し

```ruby:qiita.rb
$('#id_1,#id_2')
```

前方一致のIDまとめて呼び出し

```ruby:qiita.rb
$('[id^=id_???]')
```

後方一致のIDまとめて呼び出し

```ruby:qiita.rb
$('[id$=???_id]')
```
C言語の典型問題

#C言語の競プロ典型問題3選
#素数
/#include <stdio.h>
/#include <string.h>
/#include <stdlib.h>
//素数nまでを求め、それらの合計と掛け算を求めるプログラム
int main(void){
        int x[50];
        printf("input number:");
        scanf("%d",&x[0]);
        int yakusu,sum,mul=1;

        for(int i=0;i<x[0];i++){
                yakusu=0;
                for(int j=1;j<=i;j++){
                        if(i%j==0) yakusu++;
                }
                if(yakusu==2){
                        printf("%d",i);
                        sum+=i;
                        mul*=i;
                }

        }
          printf("\n");
          printf("sum:%d\n",sum);
          printf("mul:%d\n",mul);
          return 0;


#三角形
/#include <stdio.h>
/#include <stdlib.h>

int main(void){
    int x[6];
    float a, b, c;
    for(int i=0;i<6;++i) scanf("%d", &x[i]);
    
    a = (x[0]+x[2]+x[4])/3.;
    b = (x[1]+x[3]+x[5])/3.;
    
    x[2]-=x[0];
    x[3]-=x[1];
    x[4]-=x[0];
    x[5]-=x[1];
    
    c = abs(x[2]*x[5]-x[3]*x[4]) / 2.;
    printf("%f, %f\n", a, b);
    printf("%f\n", c);
}

#文字並び替え
'''c:str.c
\#include        <stdio.h>
\#include        <string.h>

int main(void)
{
        char str[256];
        printf("input:");
        fgets(str, 256, stdin);
        int alphabet[26]={0};
        int len = strlen(str);
        char abc[26];
        int words=0;
        for(char i = 0;i<26;++i) abc[i]='a'+i;

        for(int i=0;i<len;++i){
            if(str[i]=='.'||str[i]==',') continue;
            if(str[i]==' '){
                ++words;
                continue;
            }
            int x = tolower(str[i])-'a';
            alphabet[x]++;
        }
        

        for (int i = 0; i < 25; i++) {
            for (int j = 25; j > i; j--) {
                if (alphabet[j-1] < alphabet[j]) {
                    int temp = alphabet[j-1];
                    alphabet[j-1] = alphabet[j];
                    alphabet[j] = temp;
                    int temp_ = abc[j-1];
                    abc[j-1]=abc[j];
                    abc[j]=temp_;
                }
            }
        }

        for (int i=0;i<26;++i){
            if(alphabet[i]==0){
                break;
            }
            printf("%c:%d\n", abc[i], alphabet[i]);
        }
        printf("Word count:%d" ,words+1);
        return 0;
}
'''
Jupyter notebook 5.7.0 と `~/.jupyter/jupyter_notebook_config.py` で  Jupyter notebook が起動しないバグ

先日書いた [Jupytext](https://qiita.com/cfiken/items/8455383f32ee19dfbba3) をリモートインスタンスにも入れようとしたら Jupyter notebook が起動しなくなったのでメモ。

# 背景

Jupyter notebook のバージョンが 5.7.0 で、かつ `~/.jupyter/jupyter_notebook_config.py` に下記の設定が入っていると、 Jupyter notebook が起動しない。

```sh
$ jupyter notebook --version
5.7.0
```

```~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.ip = '*'
```

起動しようとすると、次のようなエラーになる。 (Traceback は最後以外消してます)

```sh
Traceback (most recent call last):
# 中略
KeyError: 'allow_remote_access'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
# 中略
ValueError: '' does not appear to be an IPv4 or IPv6 address

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
# 中略
socket.gaierror: [Errno -2] Name or service not known
```

# 解決策

## その1: バージョンを戻す

```sh
# pipenv
$ pipenv install notebook==5.6.0
# pip
$ pip install notebook 'notebook==5.6.0'
```

## その2: 設定を変える

```diff
+ c.NotebookApp.ip = '0.0.0.0'
- c.NotebookApp.ip = '*'
```

# 関連 (原因)

[ValueError: '' does not appear to be an IPv4 or IPv6 address](https://github.com/jupyter/notebook/issues/3946)

とりあえず困ってないのでバージョンを戻して運用。
そのうち直りそう。
A4のPDFをA3に2面付（2in1）する -- Python(PyPDF2)

A4のPDFを左右に並べてA3で書き出します。
2in1 とか 2UP とか言うんですかね？

```A4-2in1-Simple.py
import PyPDF2

a3_width = 1190.5511811024
a3_height = 841.8897637795

pdf_file = open('A4.pdf','rb')
pdf_reader = PyPDF2.PdfFileReader(pdf_file)
page_obj = pdf_reader.getPage(0)

# A3 の台紙を生成
base_page = PyPDF2.pdf.PageObject.createBlankPage(width=a3_width, height=a3_height)
# A3の左にPDFを配置
base_page.mergePage(page_obj)
# A3の右にPDFを配置
base_page.mergeRotatedScaledTranslatedPage(page_obj, 0, 1, a3_width / 2, 0, expand=False)

pdf_writer = PyPDF2.PdfFileWriter()
pdf_writer.addPage(base_page)

pdf_output_file = open('A3-2in1.pdf','wb')
pdf_writer.write(pdf_output_file)

pdf_output_file.close()
pdf_file.close()
```

Acrobat等のアプリケーションでも可能ですが、余白がついてしまい100%等倍で出力できません。
イラストレーターだと処理できますが、重いアプリ立ち上げたくないケースもありますよね？

ネットで検索しても、あまりヒットしなかったので、[「退屈なことはPythonにやらせよう」](https://www.oreilly.co.jp/books/9784873117782/)のサンプルコードと[PyPDF2のドキュメント] (https://pythonhosted.org/PyPDF2/PageObject.html#PyPDF2.pdf.PageObject.mergeRotatedScaledTranslatedPage)を参考にして書いてみました。

A3用紙の（ポイント）サイズは、イラストレーターで作成したA3のドキュメントのサイズをAppleScriptで取得した数値です。

```getDocSize.scpt
tell application "Adobe Illustrator"
	tell document 1
		{width, height}
	end tell
end tell
```
matplotlibで日本語を表示する（フォントを入れるところから）

# はじめに
matplotlibで日本語を表示しようというブログ記事がいっぱいあったのですが，フォントを入れるところで苦労したので備忘録としてまとめておきたいと思います．


# 実行環境
macOS Sierra 10.12.6

# ttfファイルを入れる
まずは入れたいフォントのttfファイルを用意しましょう．
> ※ttfとは？
> よくTrueTypeフォントのデータが入っているファイルに付く拡張子
> https://wa3.i-3-i.info/word14135.html

オススメフォントは
https://ipafont.ipa.go.jp/node26
https://ipafont.ipa.go.jp/old/ipafont/download.html
のIPAexGothicなどが色々な漢字に対応していて良い感じです．今回はこれを使います．


現在使っているpython環境において以下を実行

```python
import matplotlib as mpl
print(mpl.matplotlib_fname())
```

すると例えば次のようなアドレスが出てきます．
`/anaconda/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc`

この`matplotlibrc`があるフォルダに移動しましょう．今回の場合は

```
cd /anaconda/lib/python3.5/site-packages/matplotlib/mpl-data/`
```

を実行します．

次に以下を実行してttfのフォルダに移動します．

```
cd ./fonts/ttf
```

ここにttfファイルを入れます．


# キャッシュを削除
次にmatplotlibの設定ファイルがある場所に移動します．

```
cd ~/.matplotlib
```

`ls`でファイルを見てみると，以下のファイルがあるはずです．
`fontList.cache`	`fontList.json`
これを削除してください．

※Windowsの場合，`User/admin/.matplotlib`にあることが多いようです．

# あとは実行してみるのみ！
以下のようなpythonコードを実行してみましょう！

```python
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'IPAGothic'
plt.title('天網恢恢疎にして漏らさず')
plt.show()
```
するとあら不思議！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241529/d233f2e6-0dba-72d0-d5dc-d2c7e5e5ecba.png)

こんな難しい漢字も出せちゃいます！

# 最後に
> 天網(てんもう)恢恢(かいかい)疎(そ)にして漏(も)らさず
> 《「老子」73章から》天の張る網は、広くて一見目が粗いようであるが、悪人を網の目から漏らすことはない。悪事を行えば必ず捕らえられ、天罰をこうむるということ。
> [コトバンク](https://kotobank.jp/word/%E5%A4%A9%E7%B6%B2%E6%81%A2%E6%81%A2%E7%96%8E%E3%81%AB%E3%81%97%E3%81%A6%E6%BC%8F%E3%82%89%E3%81%95%E3%81%9A-579005)
IntとIntegerの引数でメソッドをオーバーロードする

  ・JDK1.5よりAutoBoxingが導入された.
    例えばintとIntegerを自動変換してくれる.
	メソッドの呼び出しにおいても同様である.
	intの引数のメソッドをIntegerを使って呼び出すことができる.逆も可能である.
    なかなか便利である.

  ・では課題.
    ・同じ名前のメソッドで引数をintとIntegerで定義したら、どのようになるか？
      ・コンパイルエラーにならないか？
      ・ならない場合に、どのように呼び分けられるか？

  ・得られた結論を書いておく
    ・同名のメソッドをそれぞれint、Integerの引数で定義できる
       ⇒ すなわちオーバーロードできる
    ・呼び出し側ではintまたはIntegerで呼び出すときちんと呼び分けられる
	・どちらかのメソッドを削除しても、呼び出すことができて、残った方のメソッドが呼び出される

```java:Tips0005.java
package jp.avaj.lib.algo;

import jp.avaj.lib.test.L;

public class Tips0005 {
  public static void main(String[] args) {

    // method0をintで呼出す
    method0(1);

    // method0をIntegerで呼び出す
    method0(new Integer(10));

    // method1をintで呼出す
    method1(1);

    // method1をIntegerで呼び出す
    method1(new Integer(10));

    // ここまでは、当たり前の結果..


    // method2をintで呼出す
    method2(1);

    // method2をIntegerで呼び出す
    method2(new Integer(10));

  }
  /** int引数のメソッド */
  private static void method0(int v) {
    L.p("intMethod0:"+v);
  }
  /** Integer引数のメソッド */
  private static void method1(Integer v) {
    L.p("integerMethod1:"+v);
  }

  /** int引数のメソッド */
  private static void method2(int v) {
    L.p("intMethod2:"+v);
  }
  /** Integer引数のメソッド */
  private static void method2(Integer v) {
    L.p("integerMethod2:"+v);
  }
```
  結果を見ればちゃんと呼び分けられている.
  当たり前と言えば当たり前だが、当たり前であることの確認.

  しかしむしろ、両方が定義できることが問題か？
  もしかすると両方を定義していることに気がつかずバグることもなきにしもあらず.

```java:実行結果
intMethod0:1
intMethod0:10
integerMethod1:1
integerMethod1:10
intMethod2:1
integerMethod2:10
```