OmniAICreator/Qiita-1.07M huggingface dataset:
yhpg f10 ぐねぐねスクエアの解答例

Pythonでの解答例

当日の問題はこちらから
http://nabetani.sakura.ne.jp/hena/ordf10updown/

オフラインで敗北してきたけれど、
当日やろうとしていたやりかたで再挑戦

適当なサイズのマップを作って、あとはそこから引いていく。



```python:yhpg.py
#!env python3
# -*- coding:utf-8 -*-
# http://nabetani.sakura.ne.jp/hena/ordf10updown/
import math

#とりあえずこれだけあればテストデータには耐えられる
FIELD_SIZE = 100
NUMBER_MAX = 8000

def solve(data):

    ix, iy = getPos(int(data))
    result = ["-","-","-","-"]

    if iy != 0:
        result[0] = str(map[iy-1][ix])
    result[1] = str(map[iy+1][ix])
    if ix != 0:
        result[2] = str(map[iy][ix-1])
    result[3] = str(map[iy][ix+1])

    return ",".join(result)

def getPos(d):
    for i in range(1,d+1):
        if d == 1:
            return [0,0]
        lower = int(math.pow(i-1,2))
        maximum = int(math.pow(i,2))
        if( lower < d <=maximum):
            if (i % 2 == 0):
                return even(d, i, lower, maximum)
            else:
                return odd(d, i, lower, maximum)

def even(d, size, lower, maximum):
    x=0
    y=size-1
    for i in range(1,size+1):
        x=i-1
        if lower + i == d:
            return[x,y]

    for i in range(size):
        y = i
        if maximum - i == d:
            return[x,y]

def odd(d, size, lower, maximum):
    x=0
    y=size-1
    for i in range(1,size+1):
        x=i-1
        if maximum - i + 1 == d:
            return[x,y]

    for i in range(size):
        y = i
        if lower + i + 1 == d:
            return[x,y]


def test(data, expect):
    result = solve(data)
    if result == expect:
        print("成功: " + result + ":" + expect )
    else:
        print("失敗: " + result + ":" + expect )


map = [[0 for i in range(FIELD_SIZE)] for i in range(FIELD_SIZE)]
for i in range(1,NUMBER_MAX):
    x, y = getPos(i)
    map[y][x] = i

test( "10", "9,25,-,11" )
test( "1", "-,2,-,4" )
test( "2", "1,9,-,3" )
test( "4", "-,3,1,5" )
test( "26", "25,49,-,27" )
test( "72", "71,73,57,93" )
test( "82", "81,121,-,83" )
test( "100", "-,99,65,101" )
test( "122", "121,169,-,123" )
test( "141", "142,140,104,148" )
test( "145", "-,146,144,196" )
test( "320", "321,319,261,329" )
test( "504", "503,505,465,557" )
test( "563", "564,562,498,590" )
test( "906", "905,907,895,1019" )
test( "1047", "1046,1048,1002,1134" )
test( "1111", "1068,1204,1110,1112" )
test( "1338", "1257,1401,1339,1337" )
test( "1613", "1612,1614,1588,1752" )
test( "1845", "1686,1854,1846,1844" )
test( "1921", "1922,1920,1780,1952" )
test( "2517", "2516,2518,2484,2688" )
test( "2670", "2671,2669,2535,2739" )
test( "2798", "2613,2821,2799,2797" )
test( "2841", "2778,2994,2840,2842" )
test( "2896", "2897,2895,2725,2937" )
test( "3050", "3001,3225,3049,3051" )
test( "3354", "3355,3353,3147,3375" )
test( "3563", "3564,3562,3402,3638" )
test( "4454", "4261,4525,4455,4453" )
test( "5397", "5262,5558,5396,5398" )
test( "5592", "5363,5659,5593,5591" )
test( "6122", "6121,6123,6047,6363" )
test( "6772", "6771,6773,6677,7009" )

```
IBM Cloud で Natural Language Classifier (NLC) のサービスを作成して資格情報 (Credentials) を払い出す手順

# はじめに

件名そのままです。人に案内するときに意外と面倒なので書きます。
資格情報（＝Credentials）は要するにAPIを叩くときのID/PWのことです。
コマンドでやりたい方はこちらをご覧ください (https://qiita.com/nmakino/items/d2c081104b21a0d73f17)

# 手順（サマリ）

(1)  IBM Cloudにログイン (https://console.bluemix.net) [^1]
(2) 上部メニューから「**カタログ**」をクリック
(3) 左メニュー下の「**Watson**」をクリック
(4) 右のタイルから「**Natural Language Classifier**」をクリック[^2]
(5) 適当なサービス名を入力する [^3]
(6) 下の「**作成**」をクリック
(7) 左のメニューから「**サービス資格情報**」をクリック
(8) 画面中央より少し右の「**新規資格情報**」をクリック
(9) ポップアップ画面の右下の「**追加**」をクリック[^4]
(10) 元の画面の下の「**資格情報を表示▼**」をクリック
(11) 表示された**JSONの内容**をメモるか、右の「**メモのアイコン**」をクリック[^5]

# 手順（画像付き）

(1)  IBM Cloudにログイン (https://console.bluemix.net) [^1]

![スライド1.PNG](https://qiita-image-store.s3.amazonaws.com/0/206544/9a587d0e-23a4-69ee-a882-75fa5f042eae.png)

(2) 上部メニューから「**カタログ**」をクリック

![スライド2.PNG](https://qiita-image-store.s3.amazonaws.com/0/206544/15e30361-efa1-cdbf-aa7a-c5dd62817829.png)

(3) 左メニュー下の「**Watson**」をクリック
(4) 右のタイルから「**Natural Language Classifier**」をクリック[^2]

![スライド3.PNG](https://qiita-image-store.s3.amazonaws.com/0/206544/9f9d15cf-a4a9-e436-1b89-a6e1d4b937d8.png)

(5) 適当なサービス名を入力する [^3]
(6) 右下の「**作成**」をクリック

![スライド4.PNG](https://qiita-image-store.s3.amazonaws.com/0/206544/3f43e502-34d7-8222-bfcb-163cce74f141.png)

(7) 左のメニューから「**サービス資格情報**」をクリック

![スライド5.PNG](https://qiita-image-store.s3.amazonaws.com/0/206544/6a6872e0-21f0-f122-4d29-56f2295ecb76.png)

(8) 画面中央より少し右の「**新規資格情報**」をクリック

![スライド6.PNG](https://qiita-image-store.s3.amazonaws.com/0/206544/0c7b4dbb-4132-3079-8400-d1d8665c5252.png)

(9) ポップアップ画面の右下の「**追加**」をクリック[^4]

![スライド7.PNG](https://qiita-image-store.s3.amazonaws.com/0/206544/60cd02ff-478c-9623-3342-6f5d3cccb21b.png)

(10) 元の画面の下の「**資格情報を表示▼**」をクリック

![スライド8.PNG](https://qiita-image-store.s3.amazonaws.com/0/206544/3243e4b4-6869-3ae7-bda0-d6f60fd3d6b7.png)

(11) 表示された**JSONの内容**をメモるか、右の「**メモのアイコン**」をクリック[^5]

![スライド9.PNG](https://qiita-image-store.s3.amazonaws.com/0/206544/2ec2596d-69d2-5210-4bec-fc70ca58cb2c.png)

これで資格情報が取得できました。メモ帳にでも保存しておきましょう。

[^1]: なぜ IBM Cloud でぐぐって一番にでてこないのか
[^2]: Natural Language Understanding と間違えやすいので注意
[^3]: IBM Cloud を多人数で使うときは、用途や作成者がわかる名前にしましょう。あとで困ります。
[^4]: IEで画面が小さいときにボタンがでないことがあります。2つある入力欄を順にクリックしているとなぜか表示されます。
[^5]: このurl、username、passwordが必要です。urlはリージョンによって異なるようなので注意。

# その他

- ~~気が向いたらスクリーンショットを追加します~~ (済)
- ~~気が向いたらcfコマンドでの作り方を追加します~~  (済) (https://qiita.com/nmakino/private/d2c081104b21a0d73f17)
【後編】CSS産アコーディオンの盛り合わせ ~Font Awesomeを添えて~

# 前回
[https://qiita.com/yamasyoooooo/items/f07c72001abfdf6bef49](https://qiita.com/yamasyoooooo/items/f07c72001abfdf6bef49)
前回はアコーディオンの動きまでを実装しました。

今回は、前回できなかった矢印の挙動を加えたいと思います。

# 実装

▷ 完成時の挙動
![Mar-11-2018 23-40-04.gif](https://qiita-image-store.s3.amazonaws.com/0/224934/b1e6ee77-dfea-65db-15de-42e64ccc5cd4.gif)

```css
　/*上むき矢印をCSSから指定し、表示する*/
 label:after {
  font-family: FontAwesome; 
  content: "\f106";
  float: right;
 }

 /*クリックされたチェックボックスの階層にあるlabelの後ろにあるアイコンを
   下向き矢印にする*/
 .hidden_checkbox:checked ~ label:after{
  content: "\f107";		 	
 }
```
その他にもdivで各項目を囲ったり、
矢印を```float: right```で右に寄せるなどして完成です！

コードはこちらに置いてます〜
[https://github.com/SyoheiYamaki/AccordionWithCss](https://github.com/SyoheiYamaki/AccordionWithCss)
LightningNetworkノードを立ち上げる方法（c-lightning編）

# はじめに
最近LightningNetworkが話題に出ることが多いですが、これはビットコインが抱えている以下3つの課題解決が出来るためです。

- 取引量が限られる（7件程度/秒）
- 送金手数料が高い。
- ブロックチェーンサイズが大きくなってきた。
- 取引の確定に時間がかかる。

実際にLightningNetworkのノードを立ち上げる手順を説明します。
接続先はtestnet(テスト環境)、OSはUbuntuを想定しています。


# 全体流れ
- Bitcoinフルノードの立ち上げ
- c-lightningのインストール
- configの設定
- その他の設定
- ノードの起動

# Bitcoinフルノードの立ち上げ
最初にBitcoinのフルノードを立ち上げる必要があるのでまだの場合は[お手軽にVPSでBitcoinフルノードを立ち上げる方法](https://qiita.com/9muta/items/d3b5cf003d18ab58d112)などを参考に立ち上げてください。

# c-lightningのインストール
LightningNetworkは複数社からリリースされてますが今回はBlockstream社のc-lightningを使用します。理由は私が見た範囲で情報が一番多いからです。

詳細は[GitHub](https://github.com/ElementsProject/lightning/blob/master/doc/INSTALL.md)で確認してください。

```
$ apt-get update
$ apt-get install -y \autoconf automake build-essential git libtool libgmp-dev \libsqlite3-dev python python3 net-tools zlib1g-dev
$ git clone https://github.com/ElementsProject/lightning.git
$ cd lightning
$ ./configure
$ make
```

# configの設定

```
$ mkdir ~/.lightning
$ cd .lightning
```
~/.lightning/configファイルを作成して以下を記述する。

```
alias=ノードのエイリアス名
rgb=008000
port=9735
network=testnet
```

# その他の設定
## portの設定
mainnetもtestnetも9735を使用するので使えるように設定します。
18333はbitcoindがtestnetの時に使用し、mainnetの場合は8333を使用します。

```
$ ufw enable
$ ufw allow 9735
$ ufw reload
$ ufw status
状態: アクティブ

To                         Action      From
--                         ------      ----
18333                      ALLOW       Anywhere
9735                       ALLOW       Anywhere
18333 (v6)                 ALLOW       Anywhere (v6)
9735 (v6)                  ALLOW       Anywhere (v6)
```

## PATHの設定
PATH設定してlightning-cliを使いやすくします。
~/.profile　に記述

```
PATH="$PATH:/root/bitcoin-core/bin:/root/lightning/lightningd:/root/lightning/cli"
```

PATHを有効にする。

```
$ source ~/.profile
```

# c-lightningの起動

LightningNetworkのノードを起動します。
必要に応じてdebug.logで状況を確認してください。

```
lightningd --log-level=debug >> .lightning/debug.log &
```

必要に応じてdebugログの確認をしてください。

```
$ tail -f ~/.lightning/debug.log
```

`lightning-cli getinfo`コマンドで状況が確認できます。

```
$ lightning-cli getinfo
{
  "id": "036a6d2352e476fbfd2152604e90c51949fb4ce36003a02198efef3390b5907126", 
  "port": 9735, 
  "address": [
  ], 
  "binding": [
    {
      "type": "ipv6", 
      "address": "::", 
      "port": 9735
    }
  ], 
  "version": "v0.6rc2", 
  "blockheight": 1326203, 
  "network": "testnet"
}
```
logbackで出力するログファイルに日付(e.g. yyyy-MM-dd)を入れる

logbackを使用してログをファイルに出力する際に・・・アクティブなログファイルにも日付入れられないかな〜と思って調べたら、普通にできることがわかりました！

# どうすればよいのか？

`RollingFileAppender`の`file`プロパティを省略し、`TimeBasedRollingPolicy`の`fileNamePattern`プロパティにローテーションしたい単位の日付形式を含めるだけです。

```xml
<appender name="APPLICATION_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--<file>${app.log.dir:-log}/application.log</file>--> <!-- これを省略！！ -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${app.log.dir:-log}/application-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>7</maxHistory>
    </rollingPolicy>
    <encoder>
        <charset>UTF-8</charset>
        <pattern><![CDATA[date:%d{yyyy-MM-dd HH:mm:ss}\tthread:%thread\tX-Track:%X{X-Track}\tlevel:%-5level\tlogger:%-48logger{48}\tmessage:%msg%n]]></pattern>
    </encoder>
</appender>
```

# これって正式な方法なの？

「[TimeBasedRollingPolicyのfileNamePatternプロパティ](https://logback.qos.ch/manual/appenders_ja.html#TimeBasedRollingPolicy
)」の説明欄にばっちり記載してありました！

# まとめ

まとめることは何もありませんが・・・
ドキュメントみるの面倒なんですが・・・ちゃんと書いてあると安心して使えますね！！ 特に・・・OSSとして多くの人に使ってもらうためには、ドキュメンテーション大事だよな〜。logbackは日本語訳があるのもGoodです!!（翻訳者に感謝）
ProgagteでPHPを学ぶ

#Progateとは
株式会社Progateが運営するプログラミング学習サイトです。
手を動かしながら問題を解くことで、自然とスキルが身につくよう
上手く問題が組まれているため、初心者にも優しい内容となっています。

#さっそくPHPを学んでみる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242992/4dc10a63-aa06-3e8e-1719-d85fa034dcbd.png)
PHP初心者編ではこのお問い合わせフォームの作成を最終形として進んでいくようです。

#所感
初級編が終わるまで進めてみましたが、非常に分かりやすいです。
中級編を1問解き終わったところでこの先は有料会員のみ利用可能と
会員になるよう促されましたが、このクオリティで月額980円は
凄いお得に感じました。
Vimで「パーミッションを超えて上書き」を無効にする

# この記事の内容
Vimで `:w!` ってやると、そのファイルが書き換え可能なパーミッションでなくても
無理矢理書き込むことができ（ることがあり）ますよね。
（上書きできてしまう条件についてはここでは省略）
もちろん、`!` をつけないように気をつけることは大事なんですが、
Vimでの保存、終了の際には `!` がある程度手癖になっている人もいると思います。
なので、設定で、`!`をつけても「パーミッションを超えて上書き」できないようにします。

# 方法
```vim
set cpoptions+=W
```
ちゃんとオプションが用意されていました！
さっそく `.vimrc`に書いておきましょう。

なお、どうしてもパーミッションのないファイルを上書きしたかったら、`set cpoptions-=W` すれば良い

# 解説
## 設定の意味
* `cpoptions` はviとの互換性を設定するパラメータ
* `W` は、「パーミッションを超えて上書き可能にするかどうか」という設定
* `+=` は設定の追加なので、つまり「`W`という設定をvi互換にする」という意味

ということは、この強制上書き機能はviにはなかった機能だったんですね。
その他詳しいことは[マニュアル](http://vim-jp.org/vimdoc-ja/options.html#'cpoptions')を見てください。

## 注意点
マニュアルには「読み込み専用ファイルを上書きしない」と書いてあるのですが、これは少し注意が必要です。
例えばVim起動時に `vim -R hoge.txt` とした場合、このファイルは読み取り専用として開かれますが、
実はこれは `set cpoptions+=W` していても、`:w!`で保存ができてしまいます。
（最初これに気づかずに、「効かないなぁ」と悩んでいた…）

詳しくは調べていませんが、パーミッションでの制限と`-R`での制限は別になっているようですので、
上記を設定していても、書き換えたくないファイルには `vim -m hoge.txt`（`nowrite`で開く） がオススメです。

# 余談
* 読み取り専用を上書きできてしまう、という設定がデフォルトなのはかなり疑問
    * 「書き換えたけど破棄して終了」が `:q!` なので、`!`をつけることはかなり多いのに…
    * 上記の設定をして、無理矢理上書きするときだけ設定する方が自然
* Web上にこの情報ほとんど載ってなかった
    * マニュアルを見たらちゃんと書いてあった
    * みんなやっぱりちゃんとマニュアル読んでるのかな…（不安）
JAX-RS の WebTarget.queryParam() の落とし穴

JAX-RS Client の WebTarget.queryParam() の仕様にハマったのでメモ。

# 問題点

WebTarget.queryParam() の仕様は[こちら](https://docs.oracle.com/javaee/7/api/javax/ws/rs/client/WebTarget.html#queryParam-java.lang.String-java.lang.Object...-)です。
WebTarget に対してクエリパラメータを設定するというメソッドです。

このメソッド、URIエンコードについて注意点があります。

* パラメータ名・値ともに URIテンプレートが使用できる。
* 仕様には明記されていないが、たいていの実装ではパラメータ名・値ともに URI エンコードしてくれる。
 
URIテンプレートは {} で囲んだ部分にパスパラメータを突っ込んでくれるという機能ですが、よく考えるとちょっと問題があります。
それはクエリパラメータ値に "{" や "}" 自体を含めることができない、という問題です。"{", "}" ともにパスパラメータとして解釈されるためですね。

これを避けるためには、"{" や "}" を URIエンコードしなければなりません。それぞれ %7b, %7d にすれば良いということです。

が、JerseyやRESTEasyなどの実装では本メソッドは上記の通り URI エンコードをする動作なので、そのままもう一度URIエンコードされると %257b, %257d に変換されてしまうはずです。つまり { や } が使えないのでは、、、？

# 回避方法
Jersey 実装ではこれを回避するために URI エンコードを二重に実施しないようになっています。具体的には % の後ろに16進文字(0-9a-fA-F)が２個連続している場合は % をエンコードしないというルールです。なので、{, } をそのままエンコードしても大丈夫です。

また逆に考えると、たまたま % の後ろに16進文字が２個連続していたら % は URL エンコードしてくれないということでもあります。

従って、**常に自分で URIエンコードしてから queryParam() を呼ぶ**ようにしたほうがよいということです。

他の実装がどうなっているかは知りません。RESTEasy のコードをちょっと見た感じでは % は一切エンコードしないようになっていたみたいです。

当然ですが、上記動作は JAX-RS の仕様からは読み取れないです(実装依存)。なので一応動作確認してから使いましょう。
Oracle Multitenant

とある企業が主催するハンズオンセミナーに行ってきました。
とても勉強になりましたので、概要とコマンドの一部をメモとして残します。

##マルチテナントとは
・今後のスタンダード
・12cの目玉として登場したオプション機能
・CDBではない従来型のデータベースは非推奨（12cR1）
・データベースの中に仮想的なデータベースを構築できる機能

##テナント構成の物理構造
・オンライン、REDOログ、アーカイブ・ログ、制御ファイルをPDBで共有

##プロビジョニングの仕組みの理解と活用イメージ
・Unplug/plug :カット＆ペーストの感覚でPDBを移動
・クローン：コピー＆ペーストの感覚でPDBを複製
・ホットクローン：ソースPDBを稼働させたままPDBを複製
　　　　　　　　　リフレッシュ（PDBを最新同期）
・PDB再配置：アプリケーションを止めずに別のCDBに移動

##リソース制御はCDB、PDBの順に検討する
・CDBに割り当てたリソースの中でPDBが動画
1、CDBで利用するCPU、メモリを設定
2、CDBに割り当てたリソースの中でPDBで利用するCPU、メモリを設定

##コマンド
マルチテナント接続先確認から起動・停止までの手順を記載します。
◇接続先を確認
CDBに接続していることがわかる
>$SQL>show con_name
CON_NAME
-----------
CDB$ROOT


◇PDBに接続
>sqlplus sys/PW @pdb1 as sysdba
$SQL>show con_name
>CON_NAME
-----------
PDB1

◇CDB$ROOTに移動する
>$SQL
alter session set container = CDB$ROOT;
セッションが変更されました。
$SQL>show con_name
>CON_NAME
-----------
CDB$ROOT


◇PDBの情報を表示
>$SQL>show pdbs
>CON_IN  CON_NAME  OPEN MODE  RESTERICTED
------  --------  ---------  -----------
2       PDB$SEED  READ ONLY  NO
3       PDB1      READ WRITE NO


◇マルチテナント起動・停止
データベース再起動前にPDBの状態を確認
>$SQL>show pdbs
>CON_IN  CON_NAME  OPEN MODE  RESTERICTED
------  --------  ---------  -----------
2       PDB$SEED  READ ONLY  NO
3       PDB1      READ WRITE NO


CDB停止
>shutdown immediate
>データベースがクローズされました。
>データベースがディスマウントされました。

CDB起動
>startup
>ORACLEインスタンスが起動しました。

>データベースがマウントされました。
>データベースがオープンされました。

PDBの状態確認
>$SQL>show pdbs
>CON_IN  CON_NAME  OPEN MODE  RESTERICTED
------  --------  ---------  -----------
2       PDB$SEED  READ ONLY  NO
3       PDB1      MOUNTED
『MOUNTED』なのでALTER文でOPENする必要があります。

>alter pluggable database pdb1 open;
>プラガブル・データベースが変更されました。

>$SQL>show pdbs
>CON_IN  CON_NAME  OPEN MODE  RESTERICTED
------  --------  ---------  -----------
2       PDB$SEED  READ ONLY  NO
3       PDB1      READ WRITE NO

##個人的な感想
マルチテナントは今後のスタンダードになるようです。
ハード部分が変わりますし、新しいV$表も増えるのですが
便利なショートカットもありますし、概念を理解できれば手軽に使いこなせそうだと感じました。

PDB毎に簡単に複製できたり、PDB毎にCPU・メモリ管理できるのはいいですね。
これをきっかけに12cの他の昨日も学んでいきたいと思います。
Python初心者の備忘録

# 同じclass内のメソッドを呼び出すことはできないっぽい

```python

class Query(graphene.ObjectType):

    @classmethod
    def q_all_employees(self):
        records = SQLAlchemyConnectionField(Employee)
        return records

    node = relay.Node.Field()
    all_employees = q_all_employees()
    all_departments = SQLAlchemyConnectionField(Department)

```

```
[root@localhost flask_sqlalchemy]# python app.py
Traceback (most recent call last):
  File "app.py", line 5, in <module>
    from schema import schema, Department
  File "/root/study2/flask_sqlalchemy/schema.py", line 24, in <module>
    class Query(graphene.ObjectType):
  File "/root/study2/flask_sqlalchemy/schema.py", line 33, in Query
    all_employees = q_all_employees()
TypeError: 'classmethod' object is not callable

```


参考：https://stackoverflow.com/questions/11058686/classmethod-object-is-not-callable


仕方がないのでclass外に切り出し

```python
def q_all_employees():
    records = SQLAlchemyConnectionField(Employee)
    return records

class Query(graphene.ObjectType):
    node = relay.Node.Field()
    all_employees = q_all_employees()
    all_departments = SQLAlchemyConnectionField(Department)
```

# 値の返し方
returnを使う

```python
def q_all_employees():
    records = SQLAlchemyConnectionField(Employee)
    return records
```

何も返したくない場合はreturnを記述しない。その場合、呼び出し元で戻り値を期待している場合はエラーになる。


* 本当に何も返す必要が無い（nullさえも返す必要が無い）場合はreturn記述無し
* 何かを返したい場合returnを使う
    * 要検証：nullを返したい場合はreturn Noneを使う 


# デバッグ色々
デバッグしたい箇所に` import pdb; pdb.set_trace()`を記述する。
これによって記述した箇所が処理された段階でconsoleにpdbとかいうのが立ち上がって色々操作できるようになる。

```
def q_all_employees():
    records = SQLAlchemyConnectionField(Employee)
    import pdb; pdb.set_trace()
    return records
```

以下pdbでの操作色々

## 変数の値を確認する
pもしくはppを使用する（ppはpretty printの略っぽい。整形されて見やすくなる）

```
-> import pdb; pdb.set_trace()
(Pdb) pp records
<graphene_sqlalchemy.fields.SQLAlchemyConnectionField object at 0x7f028a2f9ac8>
```


## オブジェクトのメソッド（attributes）一覧を取得する
`dir`メソッドを使用する

```
(Pdb) pp dir(records)
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_type',
 'args',
 'connection_resolver',
 'creation_counter',
 'default_value',
 'deprecation_reason',
 'description',
 'gen_counter',
 'get_query',
 'get_resolver',
 'model',
 'mounted',
 'name',
 'reset_counter',
 'resolve_connection',
 'resolver',
 'type']
```

## オブジェクトのclass名を取得する

`__class__`メソッドでclassを取得、classに対して`__name__`メソッドでclass名を取得

```
(Pdb) pp records.__class__
<class 'graphene_sqlalchemy.fields.SQLAlchemyConnectionField'>
(Pdb) pp records.__class__.__name__
'SQLAlchemyConnectionField'
```
c# 基礎　その5

###クラス###

|修飾子|概要  |
|---|---|
|public|すべてのクラスからアクセス可能|
|internal|同じアセンブリ内からのみアクセス可能|
|abstract|抽象メンバーを指定|
|static|静的メンバーを指定|
|sealed|他クラスから継承できない|

*アセンブリ*とは、ビルドによって出来上がった実行可能なファイルのこと(.exe, .dllなど)。Visual Studioでは、基本的に1プロジェクトが1アセンブリとなるため、同一のプロジェクトでアクセス可能とも言い換えることができる。

```C#
using System; // using宣言

namespace SelfCSharp // 名前空間
{
    public class Person // クラス定義 
    {
        public string firstName; // フィールド定義

        public Person() // コンストラクタ
        {

        }

        public string FirstName // プロパティ定義
        {
            
        }

        public void Show() // メソッド定義
        {
            
        }
    }
}
```

**フィールド**
classブロックの直下で宣言された変数。**メンバー変数**ともいう。

**メソッド**

**メソッドのオーバーライド**
メソッド名は同じで、引数の型や並びが異なるメソッドを複数定義することをメソッドの**オーバーロード**という。戻り値の型が違うだけではオーバーロードできない。

**コンストラクター**
インスタンス化したタイミングで呼び出されるメソッド。引数のないコンストラクターのことを**デフォルトコンストラクター**という。コンストラクターもオーバーロードできる。
別のコンストラクタから初期化したい場合、**コンストラクター初期化子**を使うことで呼び出せる。

```C#
public Person(string name)
{
  Console.WriteLine(name);
}

public Person() : this("もち太郎")
{
}
```

クラスを初期化する場合、**オブジェクト初期化子**を使うことでも初期化できる。(アクセス可能なメンバーのみ)

```C#
var p = new Person()
{
  name = "もち太郎",
  type = "身軽"
};
```

フィールドの初期化 → コンストラクタ → オブジェクト初期化子

**クラスフィールド・クラスメソッド**
インスタンスを生成しなくても直接呼び出せるフィールド・メソッドのこと。インスタンス化していないので this も使えない。

**クラス定数**
classブロックの直下で定義された定数。

```C#
class Test
{
  public static readonly string Name = "もち太郎";
  public const int Value = 10; // constだけでstatic扱いなのでstaticは不要
}
```

**静的コンストラクタ**
初めて呼び出された際に初期化される静的なコンストラクタ。

**静的クラス**
newできないクラス。

#引数
**ref修飾子**
refをつけると値ではなく参照を渡す。out修飾子とは違い、変数を初期化してから渡す必要がある。

**out修飾子**
refと似ているが、outは変数を初期化する必要がない。ただしメソッド内部で割り当てる必要がある。

```C#
    class MainClass
    {
        public static void Main(string[] args)
        {
            int x = 0;
            int y;
            MyClass.TestFunc(ref x, out y);

            Console.WriteLine(x);
            Console.WriteLine(y);

        }

    }

    class  MyClass
    {
        public static void TestFunc(ref int x, out int y)
        {
            y = 2;
        }
    }
```

**タプル**(C#7以降)
返り値を複数持てる。

```C#
        public static (int max, int min) TestFunc(int x, int y)
        {
            return (x > y) ? (x, y) : (y, x);
        }
```

**匿名型**

```C#
var test = new {Name = "もち太郎", Price = 1000};
```

**イテレーター**

```C#
        public IEnumerable<string> GetString()
        {
            yield return "もち太郎";
            yield return "ちまき";
        }
```
MySql.Data.EntityFrameworkの挙動覚書

MySql.Data.EntityFrameworkの挙動を詳しく知りたかったので、試してみた挙動をまとめました
## 前提知識
- MySql.Data.EntityFrameworkの基本
- MySQLに関する基本知識および用語
- 非同期処理の話

この辺りは知っているものとして取り扱いはしません。

## トランザクションの方法
DbContext db = new AuthenticationDbContext();
db.Database.BeginTransaction();
// この間にクエリを投げる
db.Database.Commit();

## MySql.Data.EntityFrameworkのコネクションの取り扱い
### DbContextのインスタンス
基本的にはDbContextインスタンスを用いて、データベースに対してアクセスを行うのですが、
少し知識のある方だとコネクションのプーリングがどうなっているのか気になるところだと思うので試してみました。

### 検証1:コネクションはプーリングされているのか？
```
// ここではコネクションは確保されていない
var db = new AuthenticationDbContext();

// ここでもコネクションは確保されていない
var db2 = new AuthenticationDbContext();

// ここで初めてひとつ確保される
var transaction = db.Database.BeginTransaction();

db.Users.Add(new Database.Authentication.Table.User { Id = Guid.NewGuid().ToString() });

db.SaveChanges();

// コミットが終わってもコネクションはひとつ確保されたまま
transaction.Commit();

// インスタンスは別だがコネクションはひとつのまま
var transaction2 = db2.Database.BeginTransaction();

db2.Users.Add(new Database.Authentication.Table.User { Id = Guid.NewGuid().ToString() });

db2.SaveChanges();

transaction2.Commit();
```
どうやらされている模様

### 検証2:二つのコネクションが必要そうなことをするとどうなるか？
```
// ここではコネクションは確保されていない
var db = new AuthenticationDbContext();

// ここでもコネクションは確保されていない
var db2 = new AuthenticationDbContext();

// ここで初めてひとつ確保される
var transaction = db.Database.BeginTransaction();

db.Users.Add(new Database.Authentication.Table.User { Id = Guid.NewGuid().ToString() });

// 一つ目のトランザクションが完了していないので二つ目が確保される
var transaction2 = db2.Database.BeginTransaction();

db2.Users.Add(new Database.Authentication.Table.User { Id = Guid.NewGuid().ToString() });

db.SaveChanges();

transaction.Commit();

db2.SaveChanges();

transaction2.Commit();
```

必要だったら確保するみたいですね。かしこい。

### 検証3:どこまでコネクション確保されるのか
検証結果は100個を超えるタイミングでスレッドがロックされたので上限があるみたい。（MySql側のMaxConnectionsに引っかかってるわけではなさそう）

とここまで調べてConnectionStringsに記述できることが分かった。当たり前か。
https://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.110).aspx
TypeScriptでInterfaceのプロパティへ動的アクセスしたいのにハマった時の解決方法

最近TypeScriptをやっています。

その際にInterfaceのプロパティにObject[propety]で動的アクセスしたかったけど、以下の様なエラーが出てハマったので解決方法を共有します。

```
src/index.ts(20,31): error TS7017: Element implicitly has an 'any' type 
because type 'MyInterface' has no index signature.
```

具体的に説明していきます。

## 問題点

以下の様なInterfaceを定義したとします。

```TypeScript
interface MyInterface{
  name: string;
  address: string;
  email: string;
}
```

このInterfaceの各プロパティにアクセスするfor文を回したいという状況です。

```TypeScript
const entity: MyInterface = {
  name: "rednes",
  address: "Japan",
  email: "hogehoge@example.com",
}

let result = '';

for (const property in entity){
  result += `${property}: ${entity[property]}`;
}

console.log(result);
```

これをコンパイルしようとすると以下の様なコンパイルエラーが発生します。

```
src/index.ts(20,31): error TS7017: Element implicitly has an 'any' type 
because type 'MyInterface' has no index signature.
```

どうやら動的にMyInterfaceのプロパティにアクセスしようとしているので、MyInterfaceがそのプロパティ名を本当にもっているかどうか分からんと怒られているようです。

良くある解決方法としてはコンパイラのオプションに「--suppressImplicitAnyIndexErrors」
を渡すという方法もあるようですが、一律インデクサアクセス時のエラーを抑制することはあまりやりたくありません。

別の解決方法を探しました。


## 解決方法

`keyof`と`User Defined Type Guards`を使います。

* `keyof`: 許可されるプロパティ名の列挙型を表します。`keyof MyInterface`は「'name' | 'address' | 'email'」
* `User Defined Type Guards`: データの型を確定する関数を自分で定義できます。

詳細はTypeScript handbookを参照してください。
https://www.typescriptlang.org/docs/handbook/advanced-types.html

User Defined Type Guardsを利用して、MyInterfaceのプロパティ名であることを保証する関数`isProperty`を定義します。

```TypeScript
function isProperty(value: string): value is (keyof MyInterface){
    return value === 'name' || value === 'address' || value === 'email';
}
```

この関数をかませて、コンパイラにMyInterfaceのプロパティであることを学習させることで、インターフェイスのプロパティに動的アクセスしても、コンパイルエラーが発生しなくなります。

```TypeScript
let result = '';

for (const property in entity){
  if (isProperty(property)) {
    result += `${property}: ${entity[property]}`;
  }
}

console.log(result);
```
Azure Storage と Application Insightsで403エラーが発生

# 概要
実稼働中のWebアプリケーション(Storage追加済み)に、Application Insights を追加したら403エラーが止まらなくなったお話です。

# 環境
* .Net Framework 4.6.1
* WindowsAzure.Storage 8.6.0
* Microsoft.ApplicationInsights 2.4.0

ちなみにStorageへのアクセスはPrimary keyを使ってます。

# 起こったこと
概要に書いている通りですが、Insights を追加したあたりから、

```csharp
var blobClient = GetClient();
var container = blobClient.GetContainerReference(containerName);
container.CreateIfNotExists(BlobContainerPublicAccessType.Blob);
```

というところまで実行したところで

> Microsoft.WindowsAzure.Storage.StorageException: The remote server returned an error: (403) Forbidden. ---> System.Net.WebException: The remote server returned an error: (403) Forbidden.

が出るようになってしまった。

# どうやって直したか
azure-sdk-for-netのIssues
[403 Forbidden when connecting to Azure Storage with Application Insights Web Tracking HTTP Module](https://github.com/Azure/azure-sdk-for-net/issues/3460)
を参考に、ApplicationInsights.configに以下を追加することで、無事解消しました。

```config
<TelemetryModules>
  <Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
    <ExcludeComponentCorrelationHttpHeadersOnDomains>
      <Add>core.windows.net</Add>
      <Add>core.chinacloudapi.cn</Add>
      <Add>core.cloudapi.de</Add>
      <Add>core.usgovcloudapi.net</Add>
      <Add>localhost</Add>
      <Add>127.0.0.1</Add>
    </ExcludeComponentCorrelationHttpHeadersOnDomains>
  </Add>
</TelemetryModules>
```
RustのWebアプリ(Rocket)をHerokuにデプロイする

Rustで書いたWebアプリをどこにデプロイしたらいいかわからなかったので色々調べたらそれっぽい記事があったので参考にしながら自分でもやってみたことをメモに残します。

RustのWebアプリケーションフレームワークは [Rocket](https://rocket.rs/) を使うものとします。

## (前提)

- Rustのnightlyがインストール済みである。
- Heroku CLIをインストール済みで `$ heroku login` も済んでいる。

## Rocketアプリを作るディレクトリではnightlyをデフォルトにする

このディレクトリ配下はstableではなくnightlyが標準で適用されます。

```
$ cd rust/rocket
$ rustup override set nightly
```

## Rocketアプリを作る

```
$ cargo new hello-rocket --bin
```

## HerokuのRust用buildpackを適用する

このbuildpackがビルドとデプロイをいい感じにやってくれます。

```
$ cd hello-rocket
$ heroku create --buildpack https://github.com/emk/heroku-buildpack-rust.git
```

## RustConfigを作る

プロジェクトのルートに`RustConfig`というファイルを作ります。
buildpackが標準ではstableを使ってビルドするようになっているので、それを上書きする設定です。

```txt:RustConfig
VERSION=nightly
```

## Cargo.tomlの依存関係にrocketとrocket_codegenを加える

```toml:Cargo.toml
(省略)

[dependencies]
rocket = "0.3.6"
rocket_codegen = "0.3.6"
```

## Rocket.tomlを作る

よくわからないけど公式のドキュメントを参考にしてこんな感じにしました。

```toml:Rocket.toml
[development]
address = "localhost"
port = 5000
log = "normal"

[staging]
address = "0.0.0.0"
port = 80
log = "normal"

[production]
address = "0.0.0.0"
port = 80
log = "critical"
```

## Procfileを作る

プロジェクトのルートに`Procfile`というファイルを作ります。
Herokuで使われる設定ファイル(?)です。

```txt:Procfile
web: ROCKET_PORT=$PORT ./target/release/hello-rocket
```

`hello-rocket`の部分は適宜変更します。

## Herokuに環境変数を追加する

Heroku上で`Rocket.toml`の`production`設定が使われるようにします。

```
$ heroku config:set ROCKET_ENV=production
```

## 環境構築これで終わり

お疲れ様でした。

## main.rsを編集する

https://rocket.rs/guide/getting-started/ を参考にして`main.rs`を書き換えました。

```rs:src/main.rs
#![feature(plugin)]
#![plugin(rocket_codegen)]

extern crate rocket;

#[get("/")]
fn index() -> &'static str {
    "Hello, world!"
}

fn main() {
    rocket::ignite().mount("/", routes![index]).launch();
}
```

## ローカルで動作確認

ローカルでRocketアプリを起動します。

```
$ cargo run
```

その後ブラウザで`http://localhost:5000/`を開いて`Hello, world!`と表示されていればOKです。

## Herokuにデプロイ

```
$ git add .
$ git commit -m "Initial commit"
$ git push heroku master
```

初回はちょっと時間がかかります。

## Heroku上で動作確認

https://fierce-plateau-19045.herokuapp.com/ を開くと`Hello, world!`と表示されることが確認できると思います。

以上です。

---

(ほとんどこの記事を参考にしました: http://www.duelinmarkers.com/2017/10/21/how-to-deploy-a-rocket-application-to-heroku.html )
HAIER Chromebook 11 を買ったので設定したこと

# Chromebookというものを買ってみた
中古で7800円だったので買ってみた。
Haier(ハイアール)という会社もHR-116Rというのも全く知らなかったけど、低価格Chromebookで少し有名だったっぽい。

### スペックは

 - 11.6インチ 1366x768
 - RockChip RK3288 1.8GHz
 - メモリ2GB
 - ストレージ16G(eMMC)

かなり非力だということはわかったけど、まぁOSがカバーしてくれるかなっと。
最悪Ubuntuでも入れておもちゃにするつもりで。

# 開発環境など構築してみる
先人の知恵からChromebookでの開発環境整えるのは検索すればすぐ出てくるはず。

- 開発者モードに切り替え
- chromebrewを入れる

ぐらいをやればいいかと思ってやってみたところwget出来なくて困った。。。
ちょっと調べたけど詰ってる人はいなさそう。
無理にwgetする必要もなさそうだったので、シェルをコピーして適当なローカルにコピペして実行すれば問題なかった。
開発者モードにしてsshさえできれば問題なかったのだが、一応ね。

# 情報が少なすぎる。。。

この端末は日本発売されてないようで日本語での情報が発売されるっていうニュース記事以外が少ない！
１日遊んだ感じだと結構サクサク動くし、Haierのロゴがダサい以外では問題ない。
Haierのロゴをなんとかする事考えつつしばらく遊んでみようと思う。
mruby-esp32 を使って ESP32 上で動くアプリケーションを Ruby 言語で書いてみる（入門編）

# はじめに

@GORO_Neko です。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

いつも通りではありますが、まずお断りをば一言。

以下は、ボクが所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

# ESP32 & mruby

[ESP-WROOM-32（以下 ESP32）](https://www.espressif.com/sites/default/files/documentation/esp-wroom-32_datasheet_en.pdf)は、Espressif 社製の、Arduino 互換マイコンボードです。

![DSC_0081.jpg](https://qiita-image-store.s3.amazonaws.com/0/89832/3d27af6e-6f99-7103-6efd-2a61ab2dfa8b.jpeg)

(上記の写真は ESP-32 を手軽に使えるように開発ボード化した [ESP32-DevKitC](http://akizukidenshi.com/catalog/g/gM-11819/) )

少し前に、[mruby-esp32](https://github.com/mruby-esp32/mruby-esp32) を使うことで、ESP32 上で、メインロジックを Ruby のコードで記述して、アプリケーションを動作させることが出来ることを紹介する[記事](https://qiita.com/GORO_Neko/items/12967d5c8f84975db221)を書きました。

前の記事では、どうすれば任意の機能のアプリケーションを、Ruby を使って書けるかまで、紹介しておりませんでした。

今回は、mruby-esp32 のどこをどうカスタマイズ（もちろん書くのは Ruby のコードだけ！）することで、任意の機能を持った、ESP32 用のプログラムが作れるのか、説明しようと思います。

# mruby-esp32 の構成

GitHub から clone 等して得られる mruby-esp32 プロジェクトの構成を、ものすごーく荒っぽく書くと以下のように言えると思います。

---

1. mruby-esp32 をビルドするためのスクリプト類
2. アプリケーションのエントリーポイントとなる C 言語で書かれたコード
3. mruby vm 構成コード
4. Ruby で書かれたユーザプログラムのコード

---

# mruby-esp32 ベースなアプリケーションの起動シーケンス

mruby-esp32 をビルドした結果出来上がったアプリケーションは、ESP32上で以下のようなステップを踏んで動作します。

---

1. C 言語製のエントリーポイント機能が起動
2. 自身に格納された mruby vm を起動
3. 自身に格納された、ruby 言語製のユーザアプリケーションコード（ mruby vm が実行可能なバイトコード形式に変換済みの物）を起動した mruby vm にロード
4. mruby vm が渡されたユーザアプリケーションコードを実行

---

# Ruby 言語を使って、アプリケーションを書く方法

Ruby 言語製のユーザアプリケーションコードは、任意の名前をつけたスクリプトファイルとして記述が可能です。

作成したスクリプトファイルは、必ずディレクトリ "mruby-esp32/main/examples" に格納する必要があります。

"mruby-esp32/main/examples" に格納されていて、ビルド時にパラメタ "MRUBY_EXAMPLE" の値としてファイル名を指定された Ruby スクリプトファイルの内容が、アプリケーションとして動作することになります。

以下の内容のファイルを "loop_test.rb" という名前で作成し  "mruby-esp32/main/examples" ディレクトリに格納したとします。

    loop do
      puts "test"
      ESP32::System.delay(10 * 1000)
    end

そして、開発用の PC と ESP32 を USB ケーブルで接続した後、"mruby-esp32" ディレクトリ直下で以下のコマンドを実行したとします。

    $ make MRUBY_EXAMPLE=loop_test.rb
    $ make MRUBY_EXAMPLE=loop_test.rb flash monitor

実行結果は以下の写真の通り。
![20180311.jpg](https://qiita-image-store.s3.amazonaws.com/0/89832/e59a70d9-c93e-9f9b-585d-2ec66b9a5000.jpeg)

10 秒おきに延々と "test" という文字列が表示されます。

と、言う訳で、最初の目論見通り、Ruby 言語でスクリプトを書くだけで、任意の動きをする、ESP32 用アプリケーションが作成できました。

ESP32 は、他の電子部品を接続可能なマイコンボードなので、次は何かセンサー類をくっつけて、そこから計測値等を取得できるようなアプリケーションを、Ruby スクリプトを書くだけで実現してみようと思います。

では、また。
CentOS7.2に最新のGitをインストールする

#CentOS7.2に最新のGitをインストールする
yumでインストールできるGitはバージョンが古くなっています。
インストールするならやっぱ最新がいいので手順をまとめます。

##Gitをインストールする前にyumで依存パッケージをインストール

```
sudo yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker autoconf
```

##最新のGitを取得し、解凍する
まず、Gitの最新バージョンを取得します。（執筆時の最新はv2.9.5でした）

```
cd /usr/local/src
sudo wget https://www.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
```
ダウンロードが完了したら解凍します。

```
sudo tar vfx git-2.9.5.tar.gz > /dev/null
```
`> /dev/null`はあってもなくても大丈夫です。（解凍状況を表示するかしないか）
tar.gzファイルを残しておくのが嫌な方は`sudo rm -f git-2.9.5.tar.gz`で削除しておきましょう。

##コンパイルしてインストール

```
cd git-2.9.5
sudo make configure
sudo ./configure --prefix=/usr/local
sudo make all
sudo make install
```
既にyumでGitをインストールしている場合、削除しておきましょう。
`sudo yum -y remove git`

##Gitコマンドを使えるようシンボリックリンクを作成

```
ln -s /usr/local/bin/git /bin/git
```
環境変数にパスを追加する方法もありだと思いますが、私はこちらが楽なのでいつもこの方法を使っています。

##使えるようになっていることを確認して、完了

```
git --version
git version 2.9.5
```
さくらVPSでNode.jsが動く環境を作ってみた

Node.jsで遊んでみたくなったので、
新規でVPSを契約して、サーバー上でNode.jsを動かせるようになるまでのメモ。

# 1. さくらインターネットでVPSを契約
年間1万円ちょっとで、何かあっても一瞬で初期化可能なLinux環境が手に入る。
色々遊べて学習にもなるしとってもお得だと感じました。
スペックはSSD30GB、メモリ1GB。

# 2. 基本環境はCentOS7を選択
スタートアップスクリプトは yum-update を選択

# 3. nginx インストール
インストール用ファイル作成
`vim /etc/yum.repos.d/nginx.repo`

```/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
```

インストール
`sudo yum install nginx`

nginx 起動
`sudo systemctl start nginx`

# 4. ポート開放
ポート80番開放
`firewall-cmd --add-service=http --zone=public --permanent`

状態確認
`firewall-cmd --list-services --zone=public --permanent`

リロード
`systemctl reload firewalld`

これでブラウザにVPSのIPアドレスを入力してアクセスすると
nginxのデフォルトページが表示された。


# 5. Node.js インストール
nodebrew インストール
`curl -L git.io/nodebrew | perl - setup`
`echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile`
`source ~/.bash_profile`

Node.js インストール
`nodebrew install-binary stable`

利用設定
`nodebrew use stable`

`node -v`と入力してバージョンが表示されていればOK。
macにGethを入れる方法(翻訳)

<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Ethereum_logo_2014.svg/471px-Ethereum_logo_2014.svg.png" width="100px">

本記事は [Installation Instructions for Mac](https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Mac) を翻訳・加筆したものです。





## Homebrewをインストールする

Homebrewを使えば、gethを最も簡単にインストールできるらしいので早速インストールします。

[MacにHomebrewをインストールする](https://qiita.com/_daisuke/items/d3b2477d15ed2611a058)
<br>
<br>



## gethをインストールする

Homebrewはbrew tapによって外部のリポジトリをフォーミュラとして追加することができます。
<br>

**1. 以下のコマンドから<code>tap</code>を追加してgethをインスール**

```brew tap ethereum/ethereum```
```brew install ethereum```

<br>
<br>



**2. <code>--devel</code> を使ってdevelop branchをインストール**

<code>brew install ethereum --devel</code>
<br>
<br>


**3. ノードにアカウントを作成する**


<code>geth account new</code>

<br>
<br>

gethのコードのオプションは<code>geth --help</code>または以下のページから参照できます。


[homebrew-ethereum](https://github.com/ethereum/homebrew-ethereum)

<br>


##ソースコードをビルドする

**1. まず、任意のディレクトリにリポジトリをクローンします。**
<code>git clone https://github.com/ethereum/go-ethereum</code>
<br>
<br>


**2. gethのビルドにはGo言語のコンパイラをインストールする必要があります。**
<code>brew install go</code>
<br>
<br>


**3. 以下のコマンドでgethが動くか確認してみましょう。**
<code>cd go-ethereum</code>
<code>make geth</code>
<br>
<br>






##エラーを吐く場合
Mac OS system library関係のエラーであればXcode Command Line Toolsが正しくインストールされているか確認しましょう。
<code>xcode-select --install</code>


<br>
↓こんな感じで表示される場合はちゃんとインストールされています。↓
<code>xcode-select: error: command line tools are already installed, use "Software Update" to install updates</code>
AWS CodeCommit からCloneができない

# 環境

- macOs High Sierra v10.13.2
- Git v2.15.1
- aws-cli v1.11.34
- Python v2.7.13
- Darwin v17.3.0
- botocore v1.4.91

# 問題

CodeStarで作成したCodeCommitのRepositoryをローカルにターミナルからクローンしようとしたら、
> Cloning into 'project_name'...
git: 'credential-aws' is not a git command. See 'git --help'.
Username for ...

と表示され、オフシャル手順通りにクローンできなかった。

# 経緯

CodeStarの「プロジェクトを作成」をしていく際に、

> コードの編集方法の選択

という項目で、「コマンドラインツール」を選択し、右下の「手順を表示」ボタンを押下し以下を表示

<img width="1155" alt="スクリーンショット 2018-03-11 21.29.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/120715/7f315319-f0c2-3eee-3b0f-92e4409d44cf.png">

手順書通りに行ったがクローンを

> Cloning into 'attendance'...
git: 'credential-aws' is not a git command. See 'git --help'.
Username for ...

が表示されうまくクローンできない。

# 対応

> git config --global credential.helper "!aws codecommit credential-helper $@"

手順書にある上記を行なったときに、

> git config --global credential.helper "aws --version codecommit credential-helper $@"

と表示されたので、`vi ~/.gitconfig`で設定を確認

> [credential]
        helper = "aws --version codecommit credential-helper "
        UseHttpPath = true

となっていたため、以下に書き換え

> [credential]
        helper = "!aws codecommit credential-helper $@"
        UseHttpPath = true

その後、クローンしたところうまくいった。

AWS側の手順書は以下
[Setup Steps for HTTPS Connections to AWS CodeCommit Repositories on Linux, macOS, or Unix with the AWS CLI Credential Helper](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-https-unixes.html#setting-up-https-unixes-account)

# まとめ

コマンド自体に詳しくないため、はっきりとは原因がわからなかったが、
設定ファイルを直接書き換えることにより、対応はできた。
もし、詳しい方がいれば、ご教示願いたい。
ぐねぐねスクエア


Fシリーズ最難かもしれない。

```rb:tyama_henaf10.rb
#!/usr/bin/env ruby
#https://qiita.com/Nabetani/items/dae474bc17827f9b1537
#http://nabetani.sakura.ne.jp/hena/ordf10updown/

# https://k2pc-easy.contest.atcoder.jp/tasks/k2pc001_e3
# と同じ問題かと思ったらあっちは四角数じゃなくて三角数だった。。

def decode(x,y)
	return nil if x<0||y<0
	return 0 if x==0&&y==0
	k=[x-1,y-1].max+1
	if k%2==0
		if x>=y
			#y==n-k*k
			y+k*k
		else
			#x==k*2-n+k*k
			-x+k*2+k*k
		end
	else
		if x<=y
			x+k*k
		else
			-y+k*2+k*k
		end
	end
end
def encode(n)
	k=Math.sqrt(n).to_i
	r=n-k*k
	if k%2==0
		if r<=k
			[k,r]
		else
			[k*2-r,k]
		end
	else
		if r<=k
			[r,k]
		else
			[k,k*2-r]
		end
	end
end

while gets
	x,y=encode($_.to_i-1)
	puts [[0,-1],[0,1],[-1,0],[1,0]].map{|dx,dy|
		n=decode(x+dx,y+dy)
		n ? n+1 : '-'
	}*','
	STDOUT.flush
end
```
ミニゲームを作ってUnityを学ぶ！  [ タンクウォーズ編 - イントロダクション ]

**Unity初心者の筆者。**
チュートリアルの[「玉転がし」](https://unity3d.com/jp/learn/tutorials/projects/hajiuni-jp)と[「シューティングゲーム」](https://unity3d.com/jp/learn/tutorials/projects/2d-shooting-game-jp)は完成した！
次はミニゲームを自作してUnityで出来ることを増やしていこう！

そんな経緯がありまして、後学のために開発したゲームっぽい何かの作り方を1から解説していきます。
＊使用言語はC#で解説内容は上記2点のチュートリアルが完了していることを前提としています。

# お題：タンクウォーズ（戦車の対戦ゲーム）
**どんなゲーム？**
3D見下ろし型。
プレイヤーとコンピューターが**上下にのみ移動できる**戦車をそれぞれ操作して弾を撃ちあい、先に相手戦車のHPを0にした方が勝利。

**スクリーンショット**
![tankwars_ss_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/239877/2d7d5c94-2096-419c-4bfc-7e6cc8d16459.jpeg)

**完成品をプレイ(PC専用 -- WebGL)**
[こちらから（少し読み込み時間があります）](http://yzroid.jp/unity/csg_tank_wars/app/index.html)
[W] 上移動
[S] 下移動
[マウス] 砲台の向き
[左クリック] 弾を発射
[Enter] プレイ開始
[Backspace] 最初から

#作り方

[**1. 地面と戦車を配置する**](https://qiita.com/YzRoid/items/25bb23d47936ce442f4a)

[**2. 戦車の移動**](https://qiita.com/YzRoid/items/3fdb9fc40a9db08be67a)

[**3. 戦車の砲台を制御する**](https://qiita.com/YzRoid/items/53032b93e5127f133ce7)

[**4. 弾の発射と管理**](https://qiita.com/YzRoid/items/60270e188e82bf614eaa)

[**5. HPの管理とステージの作り込み**](https://qiita.com/YzRoid/items/b2544cab6463d82506c5)

[**6. ゲーム全体の管理とシーンの制御**](https://qiita.com/YzRoid/items/a01cb3e7311577c41030)

[**7. シーンを作り込む（前）**](https://qiita.com/YzRoid/items/4654f7dde141a1f381ae)

[**8. シーンを作り込む（後）**](https://qiita.com/YzRoid/items/6d0124a5856d082eac6c)

[**9. 相手戦車にAIを実装する**](https://qiita.com/YzRoid/items/f06b773bbd3c3f4e3f66)



#スクリプト
[タンクウォーズのスクリプト（GitHub）](https://github.com/YzRoid/UnityTankWars)

上記リンクより今回のスクリプトをダウンロードすることができます。
記事内ではどうしてもコードが飛び飛びになってしまって全体像が掴みずらいため、解説がわかりにくい場合なんかはこちらを見たら解決するかもしれません。

尚、こちらのコードは今回の解説用に書き直したモノではなく実際のWebGLアプリに実装されているコードのため、コメントアウトされた未使用のメソッドがあったり、そもそものメソッド名・フィールド名が異なる場合があるかもしれません。
その場合は記事の内容を優先してください。

<Br><Br>
java Streamの基本的な処理の流れ

まだまだプログラミング初心者の自分がJava製造を行っている際に使用したり使えると思った記述を**備忘録的**に綴るシリーズを書いていこうと思います。
あくまで備忘録的なものなのでほぼ自分用になる予定です。
初投稿となる今回、まずは***ものすごく***基礎的な所から書いてみて超絶基本的な事をおぼえておこう、みたいな感じになります。

まずはよくあるFor文をStreamに置き換える記述
以下のような適当な数字を持たせたリストがあるとする。

```console
List<Integer> iList = Arrays.asList(1,4,5,7,14,15,77,98,100,103);
```

ココから偶数のみを出力させたい。
以下は偶数のみを出力させる何の変哲もない拡張For文でのコード。

```java
		for (Integer i : iList) {
			if (i % 2 == 0) {
				System.out.println(i);
			}
		}
```
出力結果

```console

4
14
98
100

```

上記をStreamに置き換えると…

```java
		iList.stream().filter(i -> i % 2 == 0).forEach(i -> System.out.println(i));
```
出力結果

```console

4
14
98
100

```



ここでStreamで何をしているのかざっくり書くと
はじめの

```java
iList.stream()
```

で、streamの取得をし

```java
.filter(i -> i % 2 == 0)
```

で中間操作と呼ばれる操作を行い

```java
.forEach(i -> System.out.println(i));
```

で終端操作と呼ばれる最終操作を行っている。

この「中間操作」⇒「終端操作」という流れがStreamの基本になるので、
これだけ覚えておけば細かい書き方を多少忘れてもググりやすい。

で、上記のFor文とStreamは御覧の通り処理結果が同じではあるが詳しく言うと実際にやっていることは違うみたい。

***お馴染みのFor文の場合***
iListの要素文だけiListをループさせ、もし2で割り切れる値を持っている要素なら出力するよ、そうでないなら出力せず次の要素にいくよ！といった処理。

***Streamの場合***
中間操作に使われている「filterメソッド」でフィルタリングする条件を指定し、
「forEachメソッド」でフィルタリングされた要素を一つずつ取り出して実行していく！(今回でいうなら出力)といった処理。

この中間操作と終端操作には色んな種類があり、その組み合わせによって様々な書きたい処理を行えるようになる。
よく使うのは中間操作の「mapメソッド」(変換)とか終端操作「Collect」(リスト生成)とか。

どんな操作メソッドをどんな時にどんな使い方をするかは次に書こうと思います。
AWS EC2上にElasticSearchをインストール

## 概要
ElasticSearchの検証のため、AWS EC2のt2.nano上にElasticSearchをインストールしたときの忘備録です
## yumのアップデート
EC2インスタンスを作った時のお決まり

~~~
$ sudo yum update
~~~
## Java8のインストール
~~~
$ sudo yum install java-1.8.0-openjdk.x86_64
~~~
すでにJava7が入っているため、デフォルト設定をJava8に変更します

~~~
$ sudo alternatives --config java

> There are 2 programs which provide 'java'.
>   Selection    Command
> -----------------------------------------------
> *+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
>    2           /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

Enter to keep the current selection[+], or type selection number:2 
~~~

## ElasticSearchのインストール
~~~
$ mkdir ~/src
$ cd ~/src
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.7.rpm
$ sha1sum elasticsearch-5.6.7.rpm
$ sudo rpm --install elasticsearch-5.6.7.rpm
~~~
t2.nanoのメモリが0.5GBしかないのにデフォルトで2GBに設定されているため、JVMの設定を256MBに設定します。
これをしないとElasticSearchの起動に失敗します。

~~~
$ sudo su
$ vim /etc/elasticsearch/jvm.options
~~~

~~~ /etc/elasticsearch/jvm.options
#-Xms2g
#-Xmx2g
-Xms256m
-Xmx256m
~~~

外部からのアクセスを受け付けるため、`elasticsearch.yml`に以下を追記

~~~
$ vim /etc/elasticsearch/elasticsearch.yml
~~~

~~~ /etc/elasticsearch/elasticsearch.yml
・・・
network.host: ec2-xxx-xxx-xxx-xxx.ap-northeast-x.compute.amazonaws.com
transport.host: localhost
~~~

自動起動設定を追加

~~~
$ sudo chkconfig --add elasticsearch
~~~

起動

~~~
$ sudo -i service elasticsearch start
~~~

確認
ElasticSearchのデフォルトポートは9200
ブラウザから以下にアクセス

~~~
http://ec2-XX-XXX-XX-XX.ap-northeast-1.compute.amazonaws.com:9200/
~~~

↓のようなJSONが返ってきたらセットアップ成功！

~~~
{
  "name" : "DznLRHS",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "WodF7ptTR-K7F6LRYBbAQw",
  "version" : {
    "number" : "5.5.0",
    "build_hash" : "260387d",
    "build_date" : "2017-06-30T23:16:05.735Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}
~~~
Switch文のインデントがきらいっ！＞＜

久々投稿ですが、小ネタです。

今回はNode.jsの話ですが、他の言語でもSwitch文を書いているとき

```javascript
switch (value) {
    case "patternA":
        someFunctionA();
        break;
    case "patternB":
        someFunctionB();
        break;
}
```

ってよくやると思うんですけど、

**ここ** きもくないですか？
```
        break;
}
```

**ここ**


何がきもいってインデントです。
この例だと4spacesなインデントですが、最後だけ8spacesになっちゃうじゃないですか。

ってわけで最近はこうしてます。

```javascript
switch (value) {
    case "patternA": {
        someFunctionA();
    }
    break;
    case "patternB": {
        someFunctionB();
    }
    break;
}
```

他の言語でも使えるかわかりませんが、スコープさえちゃんとしてればキモさからは解放されるので、僕みたいにどうしてもイヤな人はお試しあれ。
Deviseで別ユーザとしてログインする

## 概要
RailsとDeviseを使用し、管理ユーザなどで一度ログインした後に、別ユーザとしてログインする

## Devise Masqueradeを使用する
https://github.com/oivoodoo/devise_masquerade
https://gorails.com/episodes/devise-masquerade

## 手順

### Gemfileに設定を追加
```ruby:Gemfile
gem 'devise_masquerade', '~> 0.6.1'
```

### Modelに設定を追加
```ruby:user.rb
devise :masqueradable
```

### application_controller.rbに設定を追加
```ruby:application_controller.rb
before_action :masquerade_user!
```

### routes.rbに設定を追加
```ruby:routes.rb
devise_for :users, controllers: { masquerades: "user/masquerades" }
```

### user/masquerades_controller.rbを追加
```ruby:user/masquerades_controller.rb
class User::MasqueradesController < Devise::MasqueradesController
  protected

  def after_masquerade_path_for(resource)
    root_path
  end
end
```

### 設定ファイルを追加
```ruby:config/initializers/devise_masquerade.rb
Devise.masquerade_param = 'masquerade'
Devise.masquerade_expires_in = 10.seconds
Devise.masquerade_key_size = 16 # size of the generate by SecureRandom.urlsafe_base64
Devise.masquerade_bypass_warden_callback = false
Devise.masquerade_routes_back = false # if true, route back to the page the user was on via redirect_back

Devise.masqueraded_resource_name = :user
Devise.masquerading_resource_name = :admin_user
Devise.masqueraded_resource_class = User
Devise.masquerading_resource_class = AdminUser
```

### viewに以下のようなリンクを追加する
```erb:ログイン
<%= link_to 'このユーザでログイン', masquerade_path(user) %>

```

```erb:戻る
<% if user_masquerade? %>
  <%= link_to '戻る', back_masquerade_path(current_user) %>
<% end %>
```
Vue + TypeScript + Babel + Bulma + webpackで作るSPAでレスポンシブなフロント開発1(開発環境構築編)

# リンク
- [開発環境構築編](https://qiita.com/va034600/items/a62238666149bcd9e719)
- [開発ツール編](https://qiita.com/va034600/items/c968b9f524f5d3127b93)
- [JavaScript Framework編](https://qiita.com/va034600/items/f203ea7a423967d5023c)
- [CSS Framework編](https://qiita.com/va034600/items/8541a076a9d3d140162f)
- [ビルド編](https://qiita.com/va034600/items/919ce3fa330f87f2a277)

いざjQueryから脱出してモダンなフロント開発をしたいと思っても、どこから勉強すればいいのかわからないかと思います。
そんなときはgithubにあるプロジェクトをクローンしてサンプルを動作させて、なんとなく勉強することが理解しやすいのかと思ったので、今回はサンプルを動作させつつ広く浅く説明します。
これらを使って、SPA(Single Page Application)でレスポンシブなサイト構築を目指します。

ソースは[こちら](https://github.com/va034600/sample-html/tree/master/project-base3)
落としてみてください。

# 開発環境の構成と説明

とりあえず、以下の構成で説明します。

| ライブラリ | バージョン | 説明 | 
|:-----------|:------------|:------------|
| Vue | 2系 | view層のJSフレームワーク  |
| TypeScript | 2系 | 静的型付けのためのトランスパイラ |
| babel | 6系 | es2015を書くためのトランスパイラ |
| webpack | 2系 | モジュール管理　|
| sass | 6?系 | CSSプリプロセッサ |
| gulp | 3系 | タスクランナー。自動コンパイル。ビルド。|
| npm | 5.7系 | JS,CSSのパッケージマネージャ |
| Bulma | 0.6系 | CSSフレームワーク グリッドデザインでレスポンシブサイトを作れる |

# セットアップ
macで動作させるためのコマンドです。
windowsの場合はググってみてください。
セットアップはソースをダウンロードした後に一度だけコマンドラインで実行すればOKです。

```sh
$ brew install node
$ npm install -g gulp
$ npm install
```

# 起動方法

起動させたいたびにコマンドラインでgulpの実行が毎回必要となります。
今回のタスクはwebpack dev serverが起動します。
webpack dev serverは開発用のサーバで、本番ではnginx等を使うとは思いますが、開発時にはwebpack dev serverを使っていきます。

```sh
$ gulp
```

これでwebpack dev serverが立ち上がりました。ブラウザで以下のurlにアクセスしてみてください。

http://localhost:3000/

とりあえず、開発環境が構築されました。
ちょろちょろっと触ってみてください。

[github](https://github.com/va034600/sample-html/tree/master/project-base3)
Homebrewで入れたPythonでのlinkエラー問題

自分用メモ

## 対象者

`$ brew doctor`と打ち、下記のエラーが出た人

```
Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  python
```

`$ brew link python`と打ってもエラー 💩

エラー内容

```
Linking /usr/local/Cellar/python/3.6.4_4... Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks
```

ディレクトリを調べてみるとそもそも`/usr/local/Frameworks`なんていうディレクトリすらなかった。

## 解決法

ディレクトリ作って権限与えておしまい。

```shell
$ sudo mkdir /usr/local/Frameworks
$ sudo chown $(whoami):admin /usr/local/Frameworks
```

これで`brew link python`

終わり

確かEl Capitanにした時も同じような事やった気がする。
【WordPress】カスタム投稿タイプにも対応しているページネーション用関数

# コード

```php:functions.php

<?php
/**
* ページネーションHTML出力
*
* $limit	  ページあたりの表示上限数
* $post_typed 投稿タイプのスラッグ
*/
function pagenation($limit = NULL, $post_typed = 'posts') {
	global $wp_rewrite;
	global $paged;
	global $wp_query;

	// 検索条件
	$query = array();
	if ($limit != NULL) {
		$query['posts_per_page'] = $limit;
	}
	if (count($query) != 0) {
		$wp_query->query($query);
	}

	$wp_query->query(array(
		'post_type' => $post_typed,
	));
	$paginate_base = get_pagenum_link();

	if( strpos( $paginate_base, '?' ) || !$wp_rewrite->using_permalinks() ) {
		$paginate_format = '';
		$paginate_base = add_query_arg( 'paged', '%#%' );
	} else {
		$paginate_format = (substr( $paginate_base, -1, 1 ) == '/' ? '' : '/') . user_trailingslashit('page/%#%/','paged');
		$paginate_base .= '%_%';
	}


	if( $paged < 2 ) {
		$paged = 1;
	}
	$args = array(
		'base' => $paginate_base,
		'format' => $paginate_format,
		'total' => $wp_query->max_num_pages,
		'current' => $paged,
		'show_all' => false,
		'prev_next' => true,
		'prev_text' => '&laquo;',
		'next_text' => '&raquo;',
		'type' => 'array',
	);
	$pagenate_array = paginate_links($args);

	// 配列がある場合のみ
	if (is_array($pagenate_array) == TRUE) {
		$pagenate .= '<div class="wp-pagenavi">';
		foreach ($pagenate_array as $key => $value) {

			if (preg_match('/current/', $value) == TRUE) {
				$class = '';
			}
			else {
				$class = '';
			}

			// $value = "<span class=\"{$class}\">".$value.'</span>';
			// リンク追加
			$pagenate .= $value;
		}

		$pagenate .= '</div>';
		echo $pagenate;
	}
}
?>
```

ページネーションを使いたい場面で使おう。

- 「カスタム投稿タイプ```test```に対してページネーションを作りたい場合」

```php
<?php
pagenation($posts_per_page, 'test');
?>
```

- 通常の使い方

```php
<?php
pagenation($posts_per_page);
?>
```


## そもそも

ページネーションのことをよく分かってなかった自分は、
カスタム投稿タイプと、通常の投稿タイプ（post_typeが```post```）の両方に
同じ関数を使っていました。

投稿のペースがほぼ同じ場合には良いのですが、カスタム投稿タイプ用の設定無しだと、
当然post_typeが```post```の投稿数に応じたページネーションが作成されるので、
カスタム投稿タイプのみの投稿一覧にそれを使っちゃうとおかしなことになってしまいます。

## そこで

ページネーション用の関数に、

```php
$wp_query->query($query);
```

を加えることで、ページネーション生成のための検索条件を指定します。（```$query```の部分に検索条件が入ります。）

## 検索条件を追加してオリジナルなページネーションにしよう

- 指定したカテゴリーを検索条件に加えないようにする

```php:functions.php
function pagenation($limit = NULL, $post_typed = 'post', $not_in_category = NULL) {

// 省略

	// 不要なカテゴリの指定
	if ($not_in_category != NULL) {
		$wp_query->query(array(
			'category__not_in' => $not_in_category,
		));
	}

// 省略
```

ここでは、第三引数に```category__not_in```で指定できる値を入れることで、
それを検索条件に反映しています。

※```category__not_in```に関してはこちら等をご覧ください。
[query_posts（WP_Queryクラス）でカテゴリーを絞り込む – WordPress私的マニュアル](https://elearn.jp/wpman/column/c20110906_01.html)


## 最後に

色んなパターンにおけるページネーション実装に遭遇した際に
あたふたしないようにしたいです(　；∀；)