OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてのReactアプリ（1）

スキルアップのために、Reactを学ぶことがあったので、そのときのメモ

## 開発準備

PCでの環境をまとめていますが、Reactを学びたいのみだったらCodePenがよいかも

### CodePenの設定

New Penから新しいPenを作成し、settingのjavascriptに下記を追加

- JavaScript Preprocessorを「Babel」を設定
- Add External Scripts/PensのQuick-addから**React**と**ReactDOM**を追加


### Node.jsとnpm インストール

[Node.js](https://nodejs.org/ja/)
Node.jsをインストールすればnpmもインストールされている

```
node -v
v8.9.4

npm -v
5.6.0
```

### 必要なnpmパッケージをインストール

```
npm install react react-dom
npm install webpack webpack-dev-server
npm install babel-cli babel-preset-env babel-preset-react
npm install eslint eslint-loader eslint-plugin-react
npm install css-loader style-loader babel-loader
```

- Babel
 - ES6を現状のJavaScritpに変換するツール
- ESLint
 - JavaScritpt の文法チェックツール 
- Loader(css-loader style-loader)
 - CSSファイルをwebpackが作成するoutputファイルに組み込むツール

## Reactで表示してみた

### 各設定ファイル


.babelrc

```
{
  "presets": ["env", "react"]
}
```

.eslintrcjson

```
{
    "env": {
        "browser": true,
        "es6": true
    },
    "parserOptions": {
        "sourceType": "module",
        "ecmaFeatures": {
            "experimentalObjectRestSpread": true,
            "jsx": true
        }
    },
    "extends": ["eslint:recommended", "plugin:react/recommended"],
    "plugins": ["react"],
    "rules": {
        "no-console": "off"
    }
}
```

webpack.config.js

```
module.exports = {
  entry: {
    app: "./src/index.js"
  },
  output: {
    path: __dirname + '/public/js',
    filename: "[name].js"
  },
    devServer: {
    contentBase: __dirname + '/public',
    port: 3000,
    publicPath: '/js/'
  },
  devtool: "#inline-source-map",
  module: {
    rules: [{
      test: /\.js$/,
      enforce: "pre",
      exclude: /node_modules/,
      loader: "eslint-loader"
    }, {
      test: /\.css$/,
      loader: ["style-loader","css-loader"]
      }, {
      test: /\.scss$/,
      use: [{
        loader: "style-loader" // creates style nodes from JS strings
      }, {
        loader: "css-loader" // translates CSS into CommonJS
      }, {
        loader: "sass-loader" // compiles Sass to CSS
        }]
      }, {
      test: /\.js$/,
      exclude: /node_modules/,
      loader: 'babel-loader'
     }]
  }
};

```

public/index.html

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge, chrome=1" />
  <title>React App</title>
</head>
<body>
  <p>hello world</p>
  <script type="text/javascript" src="js/app.js" charset="utf-8"></script>
</body>
</html>
```

コマンドでnpmをstartし、ブラウザでhttp://localhost:3000/を入力するとhello worldが表示される
```
npm start
```
Laravelの開発環境をVagrantを使って構築する

[Homestead](https://github.com/laravel/homestead), [Laradock](https://github.com/laradock/laradock) は使用しません。
CentOS7.5 + PHP7.2 + MySQL8.0 の環境を構築します。
Laravel5が動作します！

## 準備

Git, Vagrant, Virtualboxは導入されている前提です。
導入手順は[wiki](https://github.com/ucan-lab/vagrant-laravel5/wiki/mac-vagrant-virtualbox-install)にまとめてたのでご参考ください。あとでQiitaに投稿する

## 環境構築

下記のコマンドをターミナルの任意の場所で実行する。
予め作業ディレクトリを作っておくと良き。

```
git clone https://github.com/ucan-lab/vagrant-laravel5
cd vagrant-laravel5
cp Vagrantfile.example Vagrantfile
vagrant up
```

http://192.168.33.99 => phpinfoが表示されたらok

初回はboxのダウンロードに時間かかります。
プロビジョニングは環境によりますが大体10〜15分程度です。

[provision/centos/7/bootstrap.sh](https://github.com/ucan-lab/vagrant-laravel5/blob/master/provision/centos/7/bootstrap.sh)
プロビジョニングはただシェルスクリプトを実行しているだけです。内容は別途Qiitaに投稿する。

## 設定値

項目 | 値
--- | ---
IP | 192.168.33.99
ドキュメントルート | /var/www/html
URL | http://192.168.33.99
マウント場所 | ./ <=> /var/www/html
MySQLユーザー | vagrant
MySQLパスワード | P@ssw0rd

## Sequel Pro 接続設定

![sequelpro.png](https://qiita-image-store.s3.amazonaws.com/0/52879/811409f7-df86-1c28-7572-8843ec53aecf.png)

## バージョン

項目 | 値
--- | ---
CentOS | 7.5.1804
PHP | 7.2.6
Composer | 1.6.5
MySQL | 8.0.11
Apache | 2.4.6
Node(npm) | 8.11.2(5.6.0)
yarn | 1.7.0
Git | 2.16.2
heroku-cli | 6.99.0

2018/5/26 に `vagrant up` した時のバージョンです。
マイナーバージョンはインストールのタイミングによって新しくなってるものもあるかと思います。

## Laravel5.5のインストール例

[wiki](https://github.com/ucan-lab/vagrant-laravel5/wiki/laravel5.5-install-example)にまとめてました。あとでQiitaに投稿するかもです。

## 元のbox

- https://app.vagrantup.com/centos/boxes/7

VagrantCloudに配布されているcentos7のboxを元に作成しております。

## あとがき

- https://github.com/ucan-lab/vagrant-laravel5

プロビジョニングコード等はGitにまとめています。
...dockerでサクサク環境作れるようになりたいなぁ...。
AndroidStudioでKotlinのprint()の文が表示されないとき

AndroidStudioでKotlinを使っているとき、print()でデバッグ文を出力しようとしたのですが、なぜか表示されないという現象が起きました。

# 環境
- AndoridStudio 3.1
- Kotlin 1.2

# まず、Kotlinでprint()は使えるのか
使えるようです。

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/print.html

# 他の環境で起きるのか
ブラウザ上でKotlinを使えるサイトでprint()を使ってみたところ、普通に表示されました。

https://try.kotlinlang.org/
https://paiza.io/ja

![スクリーンショット 2018-05-26 20.03.42.png](https://qiita-image-store.s3.amazonaws.com/0/154305/bc40b09b-c15f-07a1-2937-5dd5c1c2893f.png)


しかし、ターミナル上でprint()を使ったKotlinのコードをコンパイルして表示してみたところ、

![スクリーンショット 2018-05-26 19.44.21.png](https://qiita-image-store.s3.amazonaws.com/0/154305/0c9eefa8-759a-8c59-7889-25f2466814e7.png)


このような結果になりました。なぜか「%」が後ろにくっついています。

なぜKotlinのprint()を使うと後ろに「%」がくっつくのかは謎です。
AndroidStudioでKotlinのprint()が表示されない現象との因果関係は不明です。

# 解消方法
print()ではなく、println()を使うことで表示されます。
また、以下のように最後にprintln()を使うとprint()の文も正常に表示されます。

``` Kotlin
fun main(args: Array<String>){
	print("hoge")
	print("fuga")
	println("piyo")
}
```

![スクリーンショット 2018-05-26 19.56.49.png](https://qiita-image-store.s3.amazonaws.com/0/154305/00739f46-a1f6-7aff-5172-cb7ea66ce219.png)

print()を単独で使ったときにあった「%」がなくなってますね。
print()を使うと文に「%」がくっつき、AndroidStudioで表示されなくなってしまうということなのでしょうか。

# まとめ
- AndroidStudioではKotlinのprint()を使わない、使いたい場合は最後にprintln()を置く
- デバッグ文を出したいときはprintln()、またはLogを使う
SATySFiの"documentclass"を作ってみた

#はじめに
ここ最近話題となっている新しい組版言語である[SATySFi](https://github.com/gfngfn/SATySFi)は、LaTeXと同じような形式で''documentclassのようなもの''があります。

今回自分はSATySFiに標準である`stdja.satyh`や`stdjabook.satyh`を改造して作ってみました。

#使い方
`stjarticle.satyh`を`.saty`ファイルと同じフォルダに入れ、`.saty`ファイルの最初に`@import : stjarticle`と書きます。これで`stjarticle.satyh`が追加するコマンド等を使うことができるようになります。

詳しいコマンドの説明については配布場所のREADMEを読んでください。
コマンドの使い方に関しては`stjarticle-demo.saty`を見てください。
#配布
[GitHub](https://github.com/puripuri2100/stjarticle)においてあります。ご自由にダウンロードしてください。
#今後について
新しいコマンド等を追加していくかもしれません。楽しみに待っていてください（フラグ）。
春の目覚め作戦 SpringMVC その3

#SpringMVCさわってみました、第三弾
##削除機能の追加と画面遷移
削除機能を追加しました。現時点で画面遷移はこんな感じですわ。

1.ログイン画面
![ログイン画面_0526.png](https://qiita-image-store.s3.amazonaws.com/0/28873/cc716865-65da-bdf7-3829-9a92be50f41b.png)

2.新規ユーザー登録画面
![新規登録_0526.png](https://qiita-image-store.s3.amazonaws.com/0/28873/30863195-0705-ad8d-189a-2d581dad2ba7.png)

3.初期画面
![初期画面_0526.png](https://qiita-image-store.s3.amazonaws.com/0/28873/d6bbfc1e-07dc-4648-bf4d-36c00d7af414.png)

4.データ登録後
![登録後_複数_0526.png](https://qiita-image-store.s3.amazonaws.com/0/28873/949d9e93-3c9b-7ad3-d360-56e02e9e71e4.png)

5.完了ボタン押下後
![完了ボタン押下後.png](https://qiita-image-store.s3.amazonaws.com/0/28873/f67ed969-8ed9-0d44-8411-7ee7aa223fdb.png)

6-1.検索ボタン押下前
![検索前_0526.png](https://qiita-image-store.s3.amazonaws.com/0/28873/586a5879-3048-c2af-b637-c62acba47fd0.png)

6-2.検索ボタン押下後
![検索後_0526.png](https://qiita-image-store.s3.amazonaws.com/0/28873/492dfc60-e09d-4a5e-d0af-9550bdd148b9.png)

7.削除ボタン押下後
![削除ボタン押下後.png](https://qiita-image-store.s3.amazonaws.com/0/28873/efac1f6b-24b1-a586-6efb-605f32224b3a.png)

番外編.iPhone7Plus用(レスポンシブ対応)
![IMG_2804.jpg](https://qiita-image-store.s3.amazonaws.com/0/28873/8ae16c3f-39af-fd29-d5fc-90845a85f9fd.jpeg)


ざっとこんな感じですわ。
次はインターフェースを使用したValidate機能を追加予定です。

ソースはこちらです。
https://github.com/pugachev/TodoApp.git

一応動作確認用のサイトです。
http://ikefukurou.com/TodoApp/

ありがとうございましたm(_ _)m
Pythonのフォーマット文字列の桁数部を可変にする方法

Pythonのフォーマット文字列の桁数部を可変にする方法についてまとめます。

# 前提
1〜100までの数字を右揃えで表示したいとします。

```
  1
  2
...
 10
...
100
```

この場合、以下のように記述することで実現できます。

```py
# 数字を出力
for i in range(100):
    print('{:3d}'.format(i + 1))
```

# 本題
上の例で、表示する最大の数字を決め打ちできない場合に、フォーマット文字列を指定する方法としては、以下のようなものがあります。

## 方法1
```py
import sys

# 数字の最大値 (標準入力より取得)
max_number = int(sys.stdin.readline())

# 数字の表示幅（最大値の桁数に合わせる）
width_number = len(str(max_number))

# 数字を出力
for i in range(max_number):
    print('{number:{width}d}'.format(number=i + 1, width=width_number))
```

## 方法2 (Python 3.6以降)
```py
import sys

# 数字の最大値 (標準入力より取得)
max_number = int(sys.stdin.readline())

# 数字の表示幅（最大値の桁数に合わせる）
width_number = len(str(max_number))

# 数字を出力
for number in range(max_number):
    print(f'{number + 1:{width_number}d}')
```

# 参考文献
* [Python3.6 から追加された文法機能 - Qiita](https://qiita.com/shirakiya/items/2767b30fd4f9c05d930b)
今後読みたい強化学習関連のサーベイメモ

# サーベイ論文
- Deep Learning for Video Game Playing  
[https://arxiv.org/abs/1708.07902](https://arxiv.org/abs/1708.07902)
- A Brief Survey of Deep Reinforcement Learning  
[https://arxiv.org/abs/1708.05866](https://arxiv.org/abs/1708.05866)

# サーベイ記事
- 深層強化学習の動向 / survey of deep reinforcement learning  
[https://speakerdeck.com/takuseno/survey-of-deep-reinforcement-learning](https://speakerdeck.com/takuseno/survey-of-deep-reinforcement-learning)
- Deep Reinforcement Learning Doesn't Work Yet  
[https://www.alexirpan.com/2018/02/14/rl-hard.html](https://www.alexirpan.com/2018/02/14/rl-hard.html)
層圏トポス: 前層の2つの定義の同値性その3


位相空間 $X$ の上の前層を考えます。
竹内外史の「層・圏・トポス」では前層に二通りの定義が与えられましたが、

[その1](https://qiita.com/yoshihiro503/items/40a1113cbe46a0334c18) では、第一の定義から構成した第二の定義が確かに前層であること、
[その2](https://qiita.com/) では、その逆を確かめました。

この記事では確かにその二通りの定義が同値であることを確かめます。
つまり、2つの間の構成の一方が他方のちょうど逆になっていることを確かめます。
そのために、

1. 第一の定義の形の前層を第二の定義の形に構成しなおして、再び第一の形に戻した時に元の形と一致していること、
1. 第二の形からスタートして第一の形に構成しなおして、再び第二の形に戻すと元の形と一致するものが出来ることを見ます。

一箇所を除いてほぼ自明だと思います。

## 構成方法 (復習)

第一の定義の形の前層 (Def1) と第二のそれ (Def2) の一方から他方を構成する方法をメモしておきます。

### Def1 → Def2

- $F(U) = \\{a \in A ~|~ Ea=U\\} (\subseteq A)$
- $r_{UV} : F(V) \to F(U)$
    - $r_{UV}(a) = a \neg U$
    - ただし $U \subseteq V$

### Def2 → Def1

- $A = \bigcup_{U \in \mathfrak O(X)} F(U)$
- $Ea = U$
    - ただし $a \in F(U)$ のとき
- $a \neg U = r_{WV}(a)$
    - ただし $V=Ea, W=U\cap V$

## 1. Def1 → Def2 → Def1

```math
\langle A,E,\neg\rangle \to (F,r) \to \langle A',E',\neg'\rangle
```

第一の定義の形で与えられた前層 $\langle A,E,\neg\rangle$ から第二の形 $(F,r)$ を構成し、
それを再び第一の形 $\langle A',E',\neg'\rangle$ にしたとします。
$A'$ に対する $E,\neg$ は元の $A$ に対するそれと区別する意味で、$'$ を付けておきます。
$A',E',\neg'$ それぞれが、集合や関数の意味で $A,E,\neg$ と等しいことを確かめます。

```math
\begin{align*}
A' & = \bigcup_{U \in \mathfrak{O}(X)} F(U) \\
   & = \bigcup_{U \in \mathfrak{O}(X)} \{ a \in A ~|~ Ea=U \}
\end{align*}
```

$a \in A$ について、$F$ の構成より

```math
a \in F(Ea)
```

$Ea \in \mathfrak{O}(X)$ なので $a \in A'$ ($A'$ の構成より)。
従って $A \subseteq A'$。

$a' \in A'$ について、$A'$ の構成より

```math
\exists U \in \mathfrak{O}(X), a' \in F(U)
```

$F(U) \subseteq A$ なので $a' \in A$。
従って $A' \subseteq A$。

以上から $A = A'$。

$a \in A$ について、

```math
\begin{align*}
Ea = U
& \iff a \in F(U) ~~\cdots\text{$F$ の構成より} \\
& \iff E'(a) = U  ~~\cdots\text{$E'$ の定義より}
\end{align*}
```

従って $E = E'$ です。

最後に $\neg$ について。

```math
\begin{align*}
a \neg' U
& = r_{WV}(a)  ~~\cdots\text{ただしここで } a \in F(V), W = V \cap U \\
& = a \neg W   ~~\cdots\text{$r$ の定義より} \\
& = a \neg (V \cap U) \\
& = (a \neg V) \neg U \\
& = (a \neg Ea) \neg U \\
& = a \neg U
\end{align*}
```

従って $\neg = \neg'$。

以上から2つの前層 $\langle A,E,\neg\rangle$ と $\langle A',E',\neg'\rangle$ とは一致する。

## 2. Def2 → Def1 → Def2

```math
(F,r) \to \langle A,E,\neg\rangle \to (F',r')
```

```math
\begin{align*}
F'(U)
& = \{ a \in A ~|~ Ea = U \} \\
& = \{ a \in \bigcup_V F(V) ~|~ a \in F(U) \} \\
& = F(U)
\end{align*}
```

従って $F=F'$。

2つの開集合 $U \subset V$ と $a \in F'(V) (=F(V))$ について

```math
\begin{align*}
r'_{UV}(a)
& = a \neg U \\
& = r_{WV}(a) ~~\cdots\text{ただし $W = U \cap V$} \\
& = r_{UV}(a) ~~\cdots\text{$U \subset V$ より $W = U$}
\end{align*}
```

従って $r_{UV} = r'_{UV}$。従って $r=r'$。

となってやはり $(F,r)$ と $(F',r')$ も完全に一致する。

## めも

集合の波括弧について。
math ブロックを用いる場合、

```
\{ 0,1,2 \}
```

と書けば

```math
\{ 0,1,2 \}
```

と期待通り表示される。
インラインモードを用いる場合

```
$\{ 0,1,2 \}$
```

ではダメで

```
$\\{ 0,1,2 \\}$
```

と書くことで初めて $\\{ 0,1,2 \\}$ と表示される。
react-navigation + react-native-parallax-scroll-view でタブアイコンが押されたらParallaxScrollViewをScrollToTop

#react-navigator + react-native-parallax-scroll-view でタブアイコンが押されたらParallaxScrollViewをScrollToTop

ライブラリのソースに下記を追加

```./node_modules/react-native-parallax-scroll-view/src/index.js

	componentDidMount() {
	  this.props.navigation.setParams({
	    scrollToTop: ()=>{
				this._scrollView._component.scrollTo({ x: 0, y: 0, animated: true })
	    },
	  });
	}

```

※上記のソースはrefの部分を変更してます。元のままだったらこっち

```./node_modules/react-native-parallax-scroll-view/src/index.js

	componentDidMount() {
	  this.props.navigation.setParams({
	    scrollToTop: ()=>{
				this.refs[SCROLLVIEW_REF]._component.scrollTo({ x: 0, y: 0, animated: true })
	    },
	  });
	}

```

その後、下記のようにnavigationを渡したあげる

```component.js
<ParallaxScrollView
      navigation = { this.props.navigation }/*←ここ*/
      	ref={(ref)=>{ this._ParallaxScrollView=ref; }}
        backgroundColor="rgba(255,255,255,0.8)"
        contentBackgroundColor="#ddd"
        stickyHeaderHeight={40}
        renderStickyHeader={() => (
          /*code*/
        )}
        parallaxHeaderHeight={270}
        renderForeground={() => (
           /*code*/
        )}>
          /*code*/
      </ParallaxScrollView>
```

react-navigationの設定は下記

```navigation.js
const tabNav = TabNavigator({
	
	User:{
		screen: User,
		navigationOptions:({ navigation })=>({
			tabBarIcon: ({tintColor})=><Icon color={tintColor} name={"account"} size={35} />,
			 tabBarOnPress:(({previousScene, scene, jumpToIndex})=>{
			 	const { route, index, focused} = scene;
			 	if(focused){
			 		navigation.state.params.scrollToTop();
				}
				jumpToIndex(0)
			}),
		}),
	},

});
```
graphene-djangoでソートする

## 
`graphene-django`でクエリ投げる時にソート(order by)したい。

## 動作環境
* Python3
* django 2.0.1
* graphene-django 2.0.0
* django-filter 1.1.0

## コード
基本方針は `django_filters.FilterSet` を継承したカスタムフィルターを実装し、`order by`可能なフィールドを定義すること。 `order by`可能なフィールドの定義には、`django_filters.OrderingFilter`を使う。

```models.py
from django.db import models

## 対象のモデル. なんでも大丈夫
class Articles(models.Model):
    created_at = models.DateTimeField()
    title = models.CharField(max_length=128, blank=True, null=True)
    content = models.TextField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'articles'
```

```schema.py
from graphene import Schema, ObjectType, Node
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField

from django_filters import FilterSet, OrderingFilter

from . import models

## カスタムフィルター
class ArticleFilter(FilterSet):

    class Meta:
        model = models.Tags
        fields = {
            "title":["icontains"],
            "content":["icontains"],
            "created_at":["gte", "lte"], 
        }

    # order byの定義
    order_by = OrderingFilter(
        fields = (
            #1つ目のcreated_atはmodels.Tagで定義されたfield名
            #2つ目のcreated_atはクエリでorderby指定する時のパラメータ名
            #今回は同じ名前にする
            ("created_at", "created_at"),
        )
    )

class Article(DjangoObjectType):
    class Meta:
        model = models.Articles
        interfaces = (Node, )

class Query(ObjectType):
    article =  Node.Field(Article)
    # 上で定義したカスタムフィルターを指定する
    all_articles = DjangoFilterConnectionField(Article,
        filterset_class=ArticleFilter)

schema = Schema(query=Query)
```

## クエリ例
ソートに使うフィールドを`orderBy`で指定する。フィールド名の前に`-`を付けると、降順ソートとなる。
下記クエリで、作成日時(`created_at`)が新しいもの100件のリストが返される。

```
query {
  allArticles(first: 100, orderBy:"-created_at") {
    edges {
      node {
        title
        content
        created_at
      }
    }
  }
}
```
ERC20系カスタムトークンの採掘について

オリジナルに作成したERC20系カスタムトークンについて教えてください。
①カスタムトークンに「採掘」という概念はありますか
②あるとすればどのようにすれば採掘できますでしょうか

教えていただけますと幸いです。
UnityのARKit PluginのFaceTrackingで背景を自分好みの背景にする方法

UnityのFaceTrackingでキャラを動かしていても、
背景がカメラから見える映像では味気ないですよね。

そこを解決しました。

作業は簡単。
１：Camera Parent>Main Camera の UnityARVideoのスクリプトのチェックを外して無効にする。
２：好みの背景をカメラに映るように置く。または、MainCameraのClearFlagsを変える。
bashrcファイルについて

# **bashrc**ファイルについて

## **~/.bashrc**     
### `shell起動時に実行するもの（scriptやbashコマンドなど）を書いて保管しておけるWindowsで言う"スタートアップフォルダ"のような`**設定ファイル**`だよ。

---
**viエディタでファイルを開いてみる**　

vim ~/.bashrc  
*※ファイル内の一番最後の行にどんどん追加していく感じで問題ないよ*


---


- Ubuntu系のLinuxOSで、√ディレクトリの位置に存在するファイルだよ。  
- スタートアップ時に実行する内容が保存されているファイルだよ。 
- shell(bash)コマンドやscriptを書いて設定して置けるよ 
- bashが起動した瞬間に実行されるよ。

<dl>
<dt>例えばこんな風に使用するよ</dt>
<dd> コマンドのaliasを変更しても再起動時に、設定したaliasはリセットされてしまう。  
設定し直すのがめんどくさい。
しかし、
**bashrc**に書いておけば、起動時に設定したコマンドが実行されるので、再度設定する必要がなくなるよ。　　




---
Google Apps Scriptを触ってみました

#Googleの翻訳AIのページ作りのお手伝い
知り合いの方が、Googleの翻訳AIを使った多言語翻訳機のWebページを作られました。英語をはじめとした様々な言語に翻訳してくれてすごいのです。

ただ翻訳結果の表示があっさりとしたテキストのみ表示になってしまうということで、私も内容をチェックしてみることにしました。

#Google Apps Script
Webページのソースに書かれていたJavaScriptをチェックしてみたところGoogle Apps Scriptを使っているらしいことが分かりました。

Google Apps Scriptは以前から興味があり、良い機会なので触ってみることに。

#はじめてのGoogle Apps Script
Google Apps Scriptにアクセスしてみました。
https://script.google.com/home
Googleにログイン済みだったため、あっさりアクセスできました。

##手順
こちらの記事を参考にさせて頂きました。
「3 分で作る無料の翻訳 API with Google Apps Script」
https://qiita.com/tanabee/items/c79c5c28ba0537112922

##スクリプトの準備
記事に従って新規スクリプトとプロジェクトを作り、スクリプトをコピペ。
##HTMLファイルの準備
知人のHTMLファイルの内容や記事を参考に、Google Apps Scriptで「ウェブアプリケーションのURL」として出力されたものを埋め込んだHTMLファイルを作り、レンタルサーバにアップしました。
##結果
知人のサイトと同じ状況が再現できました！
#対策
変更前

```javascript

function doGet(e) {
  var p = e.parameter;
  var translatedText = LanguageApp.translate(p.text, p.source, p.target);
  return ContentService.createTextOutput(translatedText);
}

```

知人の希望が、翻訳結果の表示について文字の大きさや背景色を整えたいとのことでしたので、HTMLタグやbodyタグが書けるHTMLとして出力できるか変更してみました。

変更後

```javascript:

function doGet(e) {
  var p = e.parameter;
  var translatedText = LanguageApp.translate(p.text, p.source, p.target);

  return HtmlService.createHtmlOutput(translatedText);
}

```

これで翻訳結果がHTMLで書かれたページとして出力されるようになりました。

##課題１：ページに表示されるメッセージ
ページのトップに
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/635c52ac-0cc6-9a63-027b-8e090a3296b9.png)
上記のようなメッセージが表示されてしまいます。これは仕様なのかもしれません。

##課題２：背景色の制御ができない
HtmlService.createHtmlOutput(translatedText);
で生成されるオブジェクトによってWebページが表示されるのですが、背景色の設定方法などが分かりませんでした。

2018/05/27追記
###対策
背景色は変えられるようになりました。ひとまずHTMLで背景色の設定をしています。（~~CSSでもできそうですがテストは改めて。多分~~ できました）

```javascript:

function doGet(e) {
  var p = e.parameter;
  var translatedText = LanguageApp.translate(p.text, p.source, p.target);

  // 背景色を指定したひな形HTMLファイルを準備しました
  var html = HtmlService.createHtmlOutputFromFile("trans.html");

  // ひな型HTMLに、翻訳結果を追加
  var out = html.append(translatedText);  
  
  // 出力用にリターン
  return(out);

```

```html:trans.html

<!DOCTYPE html>
<html>

<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>test1</title>

</head>

<!-- 背景色の設定を指定 -->
<body bgcolor="#00cccc">

</body>
</html>

```

埋め込みCSSを使った場合

```html:trans.html

<!DOCTYPE html>
<html>

<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>sudo test1</title>

<style>
    body{
        background-color:#cccccc;
	}
</style>

</head>

<body>

</body>
</html>

```

---2018/05/27追記ここまで。

ひとまず現況の記録ということで。
Railsでページ読み込みしないとjsが効かないのを解決する方法

#今回陥った事象
aタグやlink_toメソッドでページ遷移するとjsが効いていない。ページをリロードするとjsが効いている。

##ググった結果
turbolinksの仕業（おかげ？）らしい。
####tubolinksの役割
>- TurbolinksはRails4.0からデフォルトで導入されたgem
- railsアプリケーションを 簡単に pjaxっぽくすることが出来る。
- ajaxとhistoryAPI(popState, pushState)を利用して画面遷移
- Turbolinksで遷移する場合は、titleとbodyとcsrfトークンを変更する
- csrfトークンは変更された場合のみ
- js, cssの読み込みを初回時に行い次回以降の読み込み処理を省略することで高速化する。

##解決方法
link_toにdata: {"turbolinks"=>false}を指定してあげるとturbolinkによるAjaxを無効にでき、jsが読み込まれるようになる。
```
link_to "HOME", root_path, data: {"turbolinks" => false}
```

## turbolinksを無効にしたくない方はこちらを参考に
https://qiita.com/saboyutaka/items/bcc0966313c6f7399a6e

##参考
1. [Rails 5.0でlink_toでturbolinkを無効にする法](https://qiita.com/hodosan/items/ee84482d18d6dccd9488)
2. [【Ruby】【Rails】link_toで遷移した後、JavaScriptが動かない場合](http://fujiyasu.hatenablog.com/entry/2015/02/20/165311)
3. [Turbolinksをオフしないためにやった事](https://qiita.com/saboyutaka/items/bcc0966313c6f7399a6e)
graphene-djangoで一度に取得できる件数を制限する

## 背景
`graphene-django` は簡単に取得件数を制限(SQLでいう`limit`)できるようになっておらず、全件取得できてしまう。
そこで１回のクエリで取得できる件数の制限を行えるようにする。

## 動作環境
* Python3
* django 2.0.1
* graphene-django 2.0.0
* django-filter 1.1.0

## コード
基本方針は`DjangoFilterConnectionField`を継承した独自のFilterConnectionを実装し、検索件数を制限すること。今回は１回のアクセスで最大1000件までとする。

```models.py
from django.db import models

## 対象のモデル. なんでも大丈夫
class Tags(models.Model):
    name = models.CharField(max_length=128, blank=True, null=True)
    description = models.TextField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'tags'
```

```schema.py
from graphene import Schema, ObjectType, Node
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from . import models

# connection_resolverをオーバーライドし最大件数を指定する
class LimitedDjangoFilterConnectionField(DjangoFilterConnectionField):

    # 今回は一度に取得できる最大件数を1000とする
    MAX_LIMIT = 1000

    @classmethod
    def connection_resolver(cls,
        resolver,
        connection,
        default_manager,
        max_limit, #１回で取得できる最大件数
        enforce_first_or_last, #firstかlastが必要とするかどうか
        filterset_class,
        filtering_args,
        root,
        info,
        **args):

        return super(LimitedDjangoFilterConnectionField, cls).connection_resolver(
            resolver,
            connection,
            default_manager,
            MAX_LIMIT, #ここで１回に取得できる最大件数を指定
            True, #ここでfirstかlastを必要とするように指定
            filterset_class,
            filtering_args,
            root,
            info,
            **args)

class Tag(DjangoObjectType):
    class Meta:
        model = models.Tags
        interfaces = (Node, )
        filter_fields = {
            "name": ["icontains"],
            "description": ["icontains"]
        }

class Query(ObjectType):
    tag =  Node.Field(Tag)
    # 上で定義した独自クラスを使用
    all_tags =  LimitedDjangoFilterConnectionField(tag)

schema = Schema(query=Query)
```

## クエリ例
下記クエリを投げるとエラーが返される。

```
# 指定件数が多すぎる場合
query {
  allTags(first: 2000) {
    edges {
      node {
        name
      }
    }
  }
}
```

```
# 指定件数がない場合
query {
  allTags(name_Icontains: "Py") {
    edges {
      node {
        name
      }
    }
  }
}
```
オフラインリアルタイムどう書くE24の回答

参加してときました。
幅優先探索しています。

```ruby:e24.rb
def is_increase_number( s )
  s.chars.each_cons(2) { |l, r|
    return false if l >= r
  }
  return true
end

def add_array( b, s, a )
  (1...b).each { |n|
    ns = s + n.to_s(b)
    a << ns if is_increase_number(ns)
  }
end

def solve( input )
  b, m = input.split(',').map(&:to_i)
  m -= 1

  a = [ '', ]
  b.times {
    na = []
    a.each { |s|
      add_array( b, s, na )
    }
    return na.sort { |l, r| l.to_i(b) <=> r.to_i(b) }[m] if na.length > m
    m -= na.length
    a = na
  }
  return '-'
end

def test( no, input, expected )
  actual = solve( input )
  if expected != actual
    puts 'NG: %d, input = %s, expetected = %s, actual = %s' % [ no, input, expected, actual, ]
    exit 1
  else
    puts 'OK: %d' % [ no, ]
  end
end

$stdout.sync = true
test( 0, "16,333", "38e" );
test( 1, "2,100", "-" );
test( 2, "2,1", "1" );
test( 3, "2,2", "-" );
test( 4, "11,8", "8" );
test( 5, "14,9", "9" );
test( 6, "11,12", "13" );
test( 7, "7,16", "34" );
test( 8, "20,16", "g" );
test( 9, "2,17", "-" );
test( 10, "8,26", "56" );
test( 11, "16,51", "3c" );
test( 12, "3,77", "-" );
test( 13, "2,100", "-" );
test( 14, "9,110", "1347" );
test( 15, "22,127", "78" );
test( 16, "24,142", "79" );
test( 17, "30,158", "5s" );
test( 18, "20,213", "139" );
test( 19, "6,216", "-" );
test( 20, "9,244", "235678" );
test( 21, "13,253", "57c" );
test( 22, "19,265", "19c" );
test( 23, "24,314", "13k" );
test( 24, "16,333", "38e" );
test( 25, "32,353", "eo" );
test( 26, "25,490", "1dg" );
test( 27, "26,498", "1bd" );
test( 28, "10,500", "2456789" );
test( 29, "10,543", "-" );
test( 30, "3,897", "-" );
test( 31, "11,1000", "1345789a" );
test( 32, "9,1307", "-" );
test( 33, "9,1412", "-" );
test( 34, "26,1678", "79e" );
test( 35, "8,1942", "-" );
test( 36, "12,1950", "234589ab" );
test( 37, "2,2245", "-" );
test( 38, "18,2670", "5ace" );
test( 39, "5,3013", "-" );
test( 40, "5,3048", "-" );
test( 41, "14,3099", "157acd" );
test( 42, "27,3440", "13hm" );
test( 43, "13,3698", "235689ab" );
test( 44, "36,5592", "dqs" );
test( 45, "10,9505", "-" );
test( 46, "27,9833", "49ej" );
test( 47, "16,10000", "123467e" );
test( 48, "24,14090", "14bfk" );
test( 49, "29,15270", "5mnq" );
test( 50, "17,20000", "23458cg" );
test( 51, "36,20000", "37bc" );
test( 52, "25,24346", "256bk" );
test( 53, "21,27815", "146adi" );
test( 54, "25,28030", "2aflm" );
test( 55, "25,34448", "3cefi" );
test( 56, "36,44811", "abpu" );
```
Dockerを利用してjupyterにhaskellを構築した

PCスペック
・Mac os

ローカル環境にdocker,jupyter notebookをインストールし
下記のコマンドを実行


```golang
$docker pull gibiansky/ihaskell:latest
$docker run -it --volume $(pwd):/notebooks --publish 8888:8888 gibiansky/ihaskell:latest
```

```golang
$open http://`docker-machine ip default`:8888/
$docker run -it --volume `pwd`:/notebooks --publish 8888:8888 gibiansky/ihaskell:latest
```

http://localhost:8888/　　 へアクセスすると
jupyter notebook上で、haskell環境を構築できる。




[![https://gyazo.com/9913aa6be6d9c8176165d979a96d4b46](https://i.gyazo.com/9913aa6be6d9c8176165d979a96d4b46.png)](https://gyazo.com/9913aa6be6d9c8176165d979a96d4b46)
conohaで仮想デスクトップ(RDP)

プログラムの開発環境をクラウド化する計画を立ててみました。

とりあえず最低限デスクトップが動くところまでのメモです。

作業環境はconohaにしました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140718/dbc424d3-55ba-d3e9-b3bc-98801020727b.png)

conohaに乗せる前にAWSで実験してたので、AWSでも同じことができるのは確認済です。

# OSセットアップ
今回はFedoraイメージを使いました。最低限としてSSH(pubキー登録、PermitRootLogin no, PasswordAuthentication no)とセキュリティ設定(firewalld)だけしています。

# LXDEを入れる
XFCEとか試してみましたが、やはりLXDEが一番軽いですね。

LXDEのインストールはyumのグループインストールで一発で終わります。

```
sudo yum groupinstall "LXDE Desktop"
```

入れ終わったら、GUI起動するように設定してサーバを再起動します。

```
sudo systemctl set-default graphical.target
sudo reboot
```

ここまでで、conohaでコンソールを開くとGUIログインになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140718/1d236be1-e985-cd2b-6bd9-07b7458d182a.png)

# xrdpを入れる
今回の本丸ですね。

```
sudo yum install xrdp
sudo systemctl enable xrdp
sudo systemctl start xrdp
```

# firewallを開ける
Fedoraを使った場合はfirewalldが動いているはずですので、RDPの使うポートを開けておきます。AWSの場合はGUIでセキュリティグループを操作して開けてください。

RDPのデフォルトのポートは3389です。firewalldではms-wbtという名前のサービスとして登録されているようです。

```
sudo grep "3389" /usr/lib/firewalld/services/*.xml
```

これを使うのが一番手っ取り早そうですので、firewall-cmdで登録します。

```
sudo firewall-cmd --permanent --add-service=ms-wbt --zone=public
sudo firewall-cmd --reload
```
※実際に運用する時はrdpゾーンとか作ってIP制限いれたりしてください

# 動作確認
Windowsから繋いでみるのが一番確実です。クライアントとしては一番信頼がおけます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140718/c3347823-8278-9b1c-bc40-b0c14a22b29b.png)

動作確認できたら、Linuxの環境からrdesktopとか使って普通に繋いで使います。

# AWSの場合
ついでにAWSでの環境の作り方。

FedoraのコミュニティAMIでインスタンスを作成します(ログインがec2-userではなくてfedoraになることに注意。よく忘れるので……)

LXDEのインストールは一緒。

```
sudo yum groupinstall "LXDE Desktop"
sudo systemctl set-default graphical.target
sudo reboot
```

xrdpのインストールも一緒。

```
sudo yum install xrdp
sudo systemctl enable xrdp
sudo systemctl start xrdp
```

firewalldはAWSのファイアーウォールをちゃんと設定したら、落としてしまいます。

```
sudo systemctl stop firewalld
```

リモートデスクトップ用のユーザーを作ったらおしまい。

```
sudo useradd <ユーザー名>
sudo passwd <ユーザー名>
```
オブジェクト指向エクササイズの遵守度を確認する

## 概要

[Thought Worksアンソロジー](https://www.oreilly.co.jp/books/9784873113890/) という本でオブジェクト指向エクササイズが紹介されている．
ソフトウェアの設計を改善できる９つのルールが紹介されている．
このルールの良し悪しについては，様々なところで紹介されているので，そちらを参照されたい．

* [オブジェクト指向エクササイズのすすめ](http://lab.aratana.jp/entry/2016/12/13/103830)
* [おすすめオブジェクト指向練習方法](https://ameblo.jp/principia-ca/entry-11876117369.html)
* [【Jeff Bay】オブジェクト指向エクササイズがキツすぎて](http://n91.hatenablog.com/entry/2013/11/21/224127)
* [なるほど、やりたくなる！オブジェクト指向エクササイズ](https://hiroki.jp/2012/08/30/5447/)
* [オブジェクト指向エクササイズをやってみる](https://qiita.com/opengl-8080/items/6f0a458df9c34eccf76c)

これらを踏まえて，実際にオブジェクト指向エクササイズを実践するためには，１つ大きな問題がある．
どれくらい遵守できているかを確認する術がないのである．
もちろん，目視で確認はできるが，全てのプログラムを確認することは非常に困難であるし，メソッドの数や行数など，数えてられない．
逆に，ルール自体はしっかりと決まっていることから，プログラムで確認することは可能であるはずである．
探してみたところ，そのような確認ツールを見つけられなかった．
ということで，確認ツールを作ってみた，という宣伝である．
なお，その作成に当たり，オブジェクト指向エクササイズを実践してみた．

## 9rules

https://github.com/tamada/9rules にて公開しているツールである．
Java のソースコードを対象にし，オブジェクト指向エクササイズの９つのルールに違反している箇所を指摘するツールである．

### インストール & 使い方

```sh
$ git clone https://github.com/tamada/9rules.git
$ cd 9rules
$ mvn package
$ java -jar target/9rules-1.0-SNAPSHOT.jar -h
java -jar 9rules.jar [OPTIONS] <ARGUMENTS...>

OPTIONS:
    --strict:  Strictly level check (Default).
    --general: General level check.
    --rough:   Rough level check.
    --help:    Print this message and exit.

ARGUMENTS:
    Directories include Java source files, and Java source files.
$ java -jar target/9rules-1.0-SNAPSHOT.jar src/main/java
```

### 依存ライブラリ

* Runtime
    * [Eclipse JDT](https://www.eclipse.org/jdt/)
    * [CheckerFramework](https://checkerframework.org)
* Unit Test
    * [JUnit 4.12](https://junit.org/junit4/)
    * [Hamcrest-all](http://hamcrest.org)

### 特徴

#### できること

* 9つのルールを満たしていない箇所（ファイル名，行数，違反しているルール）を出力する．
* ルールを緩和して確認できる（Strict, General, Roughの３パターン．デフォルトは Strict）

#### できないこと

* `ルール5 名前を省略しないこと` は未実装．
    * [WordNet](https://wordnet.princeton.edu)を使えばできるとは思うが未対応．
* `ルール6 全てのエンティティを小さくすること`の１パッケージ10クラスまでも未実装．
    * 他のルールと調査方法が違うため．調査自体はそれほど難しくはないものの，他のルールとの調査方法とどうやって合わせようかなと考え中．

## オブジェクト指向エクササイズをやってみて

### 遵守のために必要なこと．

* Java 8 以降．
    * Stream API必須．
        * for文使うだけで遵守が非常に難しくなる．
* デザインパターン．
    * Strategy など必須．
    * 中でもVisitorパターンは必須．
        * 典型的には，toString などで，フィールドにあるオブジェクトの中身を取り出したいときに必須．

### 遵守が非常に難しいもの．

* 例外のキャッチが難しい．
    * ```ルール６　全てのエンティティを小さくすること``` のメソッドは３行以内を遵守することが非常に難しい．
        * try-catch はブレース（```{}```）を省略できない．
          そのために，try, catch, 閉じ括弧で3行を消費してしまい，try-catch間，catch節の中身を別の行で書けない．
* SonarやSpotBugsの警告も解決しようと思うと，コンフリクトが起こる場合がある．
    * １行に１つの内容のみにするよう警告が出されるため，try-catch でコンフリクトが起こる．
    * これはどうやって解決するか，今でもわからない．
【Laravel5.4】migration機能を用いたテーブルのカラム名変更方法

まずマイグレーションの生成を行う。
この時、Artisanコマンド「**make:migration**」を使って作ります。

例）生年月日のカラム名をbirthからbirthdateに変更する場合
オプション：--table [table name]

```
vagrant@vm:~/app$ php artisan make:migration rename_birth_to_birthdate_on_contacts_table --table=contacts
```

このコマンドを実行すると、database/migrations以下に生成日時がついたマイグレーションが作られます。
以下生成されたファイル内容

````.php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class RenameBirthToBirthdateOnContactsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('contacts', function (Blueprint $table) {
          //
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('contacts', function (Blueprint $table) {
          //
        });
    }
}
````

<br>
このファイルに対して、**upメソッドに変更する内容**、**downメソッドに変更した内容の打消し処理（ロールバック）**を記述します。

例）生年月日のカラム名をbirthからbirthdateに変更する場合

```.php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class RenameBirthToBirthdateOnContactsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('contacts', function (Blueprint $table) {
            $table->renameColumn('birth', 'birth_date');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('contacts', function (Blueprint $table) {
            $table->renameColumn('birth_date', 'birth');
        });
    }
}
```

処理を各メソッドに記述し終わったら、再度Artisanコマンドを叩いて実際にDBに対して処理を実行します。

```
vagrant@vm:~/app$ php artisan migrate
```

あとはDBの構造を確認し、変更が反映されていることを確認しておく。
**生成したマイグレーションはgitで管理しておく。
※その際に発生したDB起因の変更は修正してコミットする。**

以下Artisanコマンド「make:migration」のオプション一覧

```
vagrant@vm:~/app$ php artisan make:migration --help
Usage:
  make:migration [options] [--] <name>

Arguments:
  name                   The name of the migration.

Options:
      --create[=CREATE]  The table to be created.
      --table[=TABLE]    The table to migrate.
      --path[=PATH]      The location where the migration file should be created.
  -h, --help             Display this help message
  -q, --quiet            Do not output any message
  -V, --version          Display this application version
      --ansi             Force ANSI output
      --no-ansi          Disable ANSI output
  -n, --no-interaction   Do not ask any interactive question
      --env[=ENV]        The environment the command should run under
  -v|vv|vvv, --verbose   Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  Create a new migration file
```

# おわり
- 今更感がすごいんですが下書きにのこってたので投稿しますね

# 参考
- [データベース：マイグレーション 5.4 Laravel](https://readouble.com/laravel/5.4/ja/migrations.html)
S2Strutsのチュートリアルをやってみよう(#5_180526)

##本日までの成果
Antの習得
　https://www.javadrive.jp/ant/

　JavaDriveのAnt項を学習
　ただしTechScoreとか見るともう少し詳しいことが書いてあるようなので
　本当に基礎の基礎だなぁという感じ

##困った点
　特になし

##コメント
　業務が忙しくてこちらの対応ができなかった
　次はMavenの勉強・・・
詳細設計書にロジックの和訳を書くメリット

#前置き
全体として、SIerをイメージしてます。
個人の視野を元に書いてるので「ウチはSIerだが、そんなアレじゃないぞ！」という方もいらっしゃるかと。
その場合はアレじゃない環境を維持・発展させていっていただければ幸いです。

こんなタイトルにしといてなんですが、私は詳細設計書を書きたくない派です。
もっと言うと、ロジックの和訳も書かずに済むなら書きたくないです。
書くにしたってせめて、せめてExcelじゃなくてMarkdownにして欲しい……！

とまぁ、以下は**書きたくない人から見た「書くメリット」**の話になります。
#詳細設計書　とは
ここで言う**詳細設計書**は主に以下の要素で構成されたものを指すとします。
メソッドの仕様とかガッツリ書いてある**仕様書**は含みません。仕様書はロジックほとんど書いてないし。

- 表紙
- 改訂履歴
- どう動いてほしいかの願望(柔軟剤たっぷりふわっと仕立て)
- ロジックの和訳ほぼ全文

この詳細設計書ですが、詳細と謳う割に対象範囲が広いことが多いです。
というか、対象のModelクラスが単一責任の原則ブッチしてるものばかり見てきたため、
大量の機能がゴチャッとカクテルされたクラスのロジックべた書きだったり……
#そもそも詳細設計書って要るの？
職場によると思いますが、少なくとも私の知る限りでは必要です。
……ほら、成果物として定義されるからさ。拡張子.xls指定で。
そんでもって、この記事も一応は**役に立つ(場面もある)よ！**って立場なのでね？
#ロジックの和訳を書くメリット
早速ですが、そんなもんがあるのかと言うとですね、あるんです。2つほど。

1. プログラムが読めない人でも動作が理解できる
2. 日本語で書けるようなコードしか製造されなくなる

##1.プログラムが読めない人でも動作が理解できる
よく言われつつも、「プログラム読めないヤツが実装に関わってくる意味がない」とバッサリ切られるやつです。四天王最弱ポジです。ひねり出したはずなのに2名欠員してますが。

じゃあ、プログラム読めない人が理解できると何が嬉しいのか。
それは**ベテランに業務知識の観点でレビューしてもらえる**ことです。

プログラム読めない人は「プログラミング技能ALL0のプー太郎」だけではなくて、「Javaは全く読めないが、COBOLのスペシャリストでその現場のベテラン」みたいな人も居ます。自分が持ってる案件がJavaなら、後者のベテランもプログラム読めない人になってしまいます。
この時、プー太郎はともかくとしてベテランのレビューを受ける価値はあります。
というのも、ドキュメント化されていない**業務知識上の隠し仕様**がそのベテランの記憶に眠っている可能性が低くないからです。〇〇社相手の場合だけ計算時の端数処理が違うとか。

仕様書作ってそれで確認してもらうと言う手もありますが、伝統的にロジック和訳な現場では仕様で聞くよりロジックで聞いたほうが思い出す確率で有利です。
「このロジック、前にやらかして大炎上したぞ」という記憶は似たようなロジック見たときのほうが思い出しやすいものです。

そして、ここで隠し仕様をクリアしないとフラグが立ちます。**後々死にます**。最悪、本番障害発生まで気づけません。
なんせ仕様として表に出てきてないので。**テストもすんなり通過します。**
##2.日本語で書けるようなコードしか製造されなくなる
イテレータを使わずにカウンタでループ回したり、ポリモーフィズムが禁止されたりオーバーロードが禁止されたりするアレです。
**エンジニア視点ならただのデメリットです。**バリバリのプログラマ諸兄には最早苦痛かと思います。

ただ、担当者がプロジェクト移動などで変わった場合、新しくアサインされた次の担当者がバリバリのプログラマである保障がありません。
コード見てもわけわからんとなってキノウテイシしたりします。
一方、日本語で書けるようなコードは往々にして言語機能をろくに使わないので、まぁ大体読めます。読めればコピペ出来るのでとりあえずはしのげるのです。

現場でガッツリ言語知識を学んでいけるならこうはならないかもしれません。しかし、SIerでは言語知識は蔑ろにされやすい(業務知識が重いので。両立なんて簡単には言えない)ため、そもそも教えられる人員が居るか……
そんなわけで、**現場がどうにかメンテ出来るか**、という点では日本語書き下しコードの方が優位なのです。

他にも、設計だけ担当してコーディングは別の人に投げるパターンも。
ここまで来るとプログラマとは名ばかりのタイピストな気もしますが。オフショア使用率を上げるとかそういう政治的な理由でこうなることもあるので。
もし、投げ先が信用できるなら仕様書作ってそれだけ投げればいいと思います。
#ロジックの和訳を書くデメリット
google先生に聞いてください。いっぱいヒットします。
詳細設計書の時点でdisられっぷりが凄まじいです。詳細設計書に親を殺された人はいないと思いますが、余暇を殺された人は居るからね。シカタナイネ。
今回はメリット謳いましたが、デメリットはこの程度じゃ書ききれないのです。余白足りません。

とはいえ、丸投げはアレなので1つ挙げます。
詳細設計書にロジック書いてると、入出力などのパターンが考慮されず、ロジック内部にバラバラに書かれる形になっていきます。
こうなると、テストの際に必要なパターンが仕様から読み取れません。稀にロジックと別にパターン一覧が載っていたりしますが、保守フェーズに入るとメンテされないとかザラですし。
結果としてテストケース自体に漏れが発生しやすくなり、検知がどんどん遅くなります。

最悪、障害対応案件でこんにちはです。
#メリットは得つつ、書かない方法は？
残念ですが、一発で解決する方法は無いんじゃないですかね。少なくとも時間やお金のかからない方法は。

ただし、負荷を減らす方法ならあります。

まず、ベテランにレビューしてもらうための設計書はぶっちゃけコーディングには不要です。
ならば、**設計書は一旦置いておいてさっさとコード書いてしまえ**ば良いのです。
ユニットテストまで終わったら、その時点でコードを和訳して詳細設計書を作成。これをレビューしてもらえば完了です。
コードから設計書を自動生成するツールを作ってしまうのも手ですし。
レビューで隠し仕様が発覚しても、修正のインパクトは設計書先行の場合と変わらないでしょう。コード直して和訳すればOKです。

設計書だけ作って他人に投げるパターンでも、自分で先にコード書いちゃいましょう。
すごい無駄な気がしますし実際無駄ですが、答え合わせの気分でコードレビューできます。
あと、例外とかの細々したところは考える手間が省けるかもしれません。投げ先の技量次第ではありますが。

次に、少しずつ少しずつ、言語機能を周りに布教していきましょう。
コレをしないといつまでたっても日本語プログラミングから脱出できません。
**布教相手が便利だ**と感じないと成功しないので気をつけましょう。

布教失敗の例として、C#でオーバーロードを布教したらgrep出来なくて不便だと。HAHAHA……
アソシエーションの利用

##前提
アソシエーション→モデル間の関連を管理する機能

##利用方法
①モデル間でhas_many、belongs_toなどの関連付けを定義する
②定義後、データの呼び出しにアソシエーションを使用する

##メリット
データ呼び出しがシンプルにできる(どことどこが関連づけられてるかわかりやすい)

##躓いてたところ
comment、tweetモデル間でアソシエーションの定義付けをした
<img width="622" alt="スクリーンショット 2018-05-26 15.37.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/260056/6fe7a91b-47e3-0194-7162-cce613e57e4d.png">

###やってて勘違いしてた点
rediect_toがアソシエーション(関連づけするための定義表記)だと思ってた→❌

###正しくは
モデル間で関連付けしたあと、それ(アソシエーション)を使用してデータを双方で活用し、
その変数を用いてredirect_toメソッドを定義している

上ではアソシエーション(関連付け)をしたことで@commentと結びつくtweetのidを取得できる
(わかりやすく言うとある1つのツイートにコメントした時
そのコメントした先のツイートidを取得するということ)
オフラインリアルタイムどう書く E24 の問題

オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/73080 )を行っています。

問題は「単調増加数」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde24tancho/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あれば大丈夫と思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

＃問題がシンプルなので、どこかで既出かもしれませんが、調べてません。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
Rails5.1でactiverecord-mysql2spatial-adapterを使う

![map-2789052_1920.jpg](https://qiita-image-store.s3.amazonaws.com/0/6678/a39fe182-0dac-964e-6708-e7a43d971a81.jpeg)

activerecord-mysql2spatial-adapterはRails + MySQLで位置情報を扱う場合に使用される事があるGemです。

https://github.com/rgeo/activerecord-mysql2spatial-adapter は、ややメンテナンスされていない印象を受けます。

Rails 5.1.6にて、使用するとこんな感じ。

```bash
$ bin/rake db:migrate
rake aborted!
NoMethodError: undefined method `attribute_types_cached_by_default' for ActiveRecord::Base:Class
Did you mean?  attribute_type_decorations
```

[Active Record 5 · Issue #19 · rgeo/activerecord-mysql2spatial-adapter]
(https://github.com/rgeo/activerecord-mysql2spatial-adapter/issues/19) を参考に https://github.com/sebastianiorga/activerecord-mysql2spatial-adapter/tree/rails-5 を使わせて頂く。

```ruby
gem 'activerecord-mysql2spatial-adapter', github: 'sebastianiorga/activerecord-mysql2spatial-adapter', branch: 'rails-5'
```

するとこんな感じ

```bash
$ bin/rake db:migrate
rake aborted!
NameError: uninitialized constant RGeo::ActiveRecord::DEFAULT_SPATIAL_COLUMN_CONSTRUCTORS

Tasks: TOP => db:migrate
(See full trace by running task with --trace)
```

別のリポジトリのIssueですが https://github.com/stadia/activerecord-mysql2rgeo-adapter/issues/7 によると https://github.com/rgeo/rgeo-activerecord/commit/bc89717b48bfc64817cca75d1981706ed3c3af3d のように DEFAULT_SPATIAL_COLUMN_CONSTRUCTORS が削除されています。

とりあえず、動かすならばこのコードを補完してあげれば良さそうです。

```config/initializers/fix_activerecord_mysql2spatial_adapter.rb
# https://github.com/rgeo/rgeo-activerecord/commit/bc89717b48bfc64817cca75d1981706ed3c3af3d
module RGeo
  module ActiveRecord
    # Some default column constructors specifications for most spatial	+    # Return a feature type module given a string type.
    # databases. Individual adapters may add to or override this list.
    DEFAULT_SPATIAL_COLUMN_CONSTRUCTORS = {
      geometry_collection: {}.freeze,
      geometry:            {}.freeze,
      line_string:         {}.freeze,
      multi_line_string:   {}.freeze,
      multi_point:         {}.freeze,
      multi_polygon:       {}.freeze,
      point:               {}.freeze,
      polygon:             {}.freeze,
      spatial:             { type: "geometry" }.freeze,
    }.freeze
  end
end
```

これで`bin/rake db:migrate`が通るようになりました。

これは一時的な対策なので、ほかの方法を検討すべきかと考えています。
＜Java＞固定長（行）＊可変長（列）の二次元配列を作る場合

#始めに
とりあえずこの前気づいたことをメモ。
検索してもなかなか出てこなかったから・・・

可変長の列は、どれくらいになるかは定かではない前提。

##実装

```Sample.java
//定義 -- ５０行は固定
ArrayList[] list = new ArrayList[50]

for(int i = 0;i < 50;i++){
  list[i] = new ArrayList(); //ここで可変長の列を作る
}
```

```Sample.java
//行にアイテムを追加する（列の追加）  
list[3].add("apple"); //これで１列プラス

//指定した行から、任意の列の値を取得する。
list[3].get(4) //３行目の４列目のデータを取得
```
【PHP】var_dump()をこっそりHTMLのコメント部分に出力して値の確認を行う


# 画面上にvar_dump()出力したくない問題

先方がたまに見ているステージング環境とかで`$_POST`や`$_SESSION`の中身を調査したいときよくある。
普通に`var_dump()`すると大公開できるけど、タイミング悪かったら大後悔する可能性も無きにしも非ず。
→じゃあ先方にばれないようにすればいいんじゃない？と

# HTMLのコメント内に`var_dump`する

案外盲点で気がつかなかったんですがふつーにコメント内で出力されるんですね。
知らなかった

```php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>test</title>
    </head>
    <body>
        <!-- <?php var_dump($_SESSION); ?>-->
        <!-- <?php var_dump($_POST); ?>-->
    </body>
</html>
```

# おわり
・案外便利
・調査終了後は必ず削除しておきましょう
【Azure】仮想マシンのサイズ(スペック変更)変更の制約

## AzureVMのサイズ変更とは
AzureVMのサイズ変更を行うことで、VMのスケールアップが可能。
Azure PortalもしくはAzurePowershellで実施できる。

**AシリーズからDシリーズ、Av2からFシリーズ等、シリーズをまたがったサイズ変更ができないケースがある。**

## なぜできないのか
Azureの仕様によるもの。
例えば、Fシリーズの場合、仮想マシンを作成した時点でFシリーズが起動できるクラスターでVMをホストする必要がある。
作成後にクラスターを変更することはできない。

>また、VM をホストするサーバー群 (クラスター) のスペックによっては、サイズの変更が行えない場合があります。
>例えば A シリーズから D シリーズへのサイズ変更を実施したい場合でも、 A シリーズのみ動作可能なクラスターに配置されているVM はサイズ変更を行うことができません。これは、D シリーズの VM をホストするには、A シリーズをホストしていたサーバーよりも高スペックなサーバーが必要となるためです。

ちなみに、別シリーズへのサイズ変更には、次の制約があると書いてあるが、**実際は問題なくできた。**

>VM が起動している状態でサイズ変更を実施する場合、同シリーズ内での変更のみが可能です。

Azureは日々更新がかかっているので、このような細かい仕様変更があるのがやっかい。
何事も検証が大事。(お金かかるけど)

## サイズ変更するには(1台の場合)
変更できないシリーズに変更する場合、一度仮想マシンを削除し、
仮想マシンを削除し、元のディスクを利用して仮想マシンを再作成する。
クラシックポータルの画面ではあるが、technetブログで手順が紹介されている。
(参考サイト2参照)

## サイズ変更するには(可用性セットの場合)
**※詳細追記予定**
可用性セットの場合、1台だけ仮想マシンのスペックを変更すると、VMの起動に失敗する場合がある。すべて同一のスペックもしくは同じシリーズの仮想マシンにしておくのが無難。

## 参考サイト
参考サイト1
https://blogs.technet.microsoft.com/jpaztech/2016/04/15/vmresize/
参考サイト2
https://blogs.msdn.microsoft.com/dsazurejp/2015/09/29/d-1235/
S3で大量のリクエストを処理する場合はキー名に気をつける

S3を利用した場合どのくらいの処理能力を持つのだろうと疑問に思って調べてたら大量のリクエストを処理するためにはキー名に気をつける必要があるらしい。面白かったから紹介。

# 参考URL
- [リクエスト率およびリクエストパフォーマンスに関する留意事項 - Amazon Simple Storage Service](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/request-rate-perf-considerations.html)

# キー名は連続するパターンにしない
該当箇所を以下に引用していますが、簡単に説明します。
S3ではオブジェクトキー名のインデックスを作成しており、インデックス内の複数のパーティションに UTF-8 バイナリ順でオブジェクトキー名を格納しています。以下の例のようにキー名が連続している場合同じパーティションばかりに処理が発生するのでパフォーマンスが低下する原因になるそうです。なるほど。
だからキー名はMD5とかでランダムにすると良いよ〜とか対策についても書かれています。（対策については参照URL先で確認ください。）

>大量のオブジェクトをアップロードする場合、キー名の一部として連番や日付と時刻の値を使用することがあります。たとえば、日付と時刻を組み合わせたキー名を選択できます。次の例では、タイムスタンプがプレフィックスに含まれています。
>
>examplebucket/2013-26-05-15-00-00/cust1234234/photo1.jpg
>examplebucket/2013-26-05-15-00-00/cust3857422/photo2.jpg
>examplebucket/2013-26-05-15-00-00/cust1248473/photo2.jpg
>examplebucket/2013-26-05-15-00-00/cust8474937/photo2.jpg
>examplebucket/2013-26-05-15-00-00/cust1248473/photo3.jpg
>...
>examplebucket/2013-26-05-15-00-01/cust1248473/photo4.jpg
>examplebucket/2013-26-05-15-00-01/cust1248473/photo5.jpg
>examplebucket/2013-26-05-15-00-01/cust1248473/photo6.jpg
>examplebucket/2013-26-05-15-00-01/cust1248473/photo7.jpg
>...
>キー名を連続するパターンにすると、パフォーマンス上の問題が発生します。この問題を理解するため、キー名が Amazon S3 でどのように保存されるかを説明します。
>
>Amazon S3 では、各 AWS リージョンにオブジェクトキー名のインデックスを保持しています。オブジェクトキーは、インデックス内の複数のパーティションに UTF-8 バイナリ順で格納されます。キー名により、自動的にそのキーが格納されるパーティションが決まります。タイムスタンプやアルファベット順などの順次プレフィックスを使用すると、Amazon S3 が対象とする特定のパーティションに大量のキーが集中し、そのパーティションの I/O 容量がひっ迫する可能性が増大します。キー名のプレフィックスをランダムにすると、キー名、したがって I/O ロードは複数のパーティションに分散されます。
>
>ワークロードが 1 秒あたり 100 個のリクエストを常に超えることが予想される場合、連続するキー名は避けてください。キー名で連番や日付と時刻のパターンを使用する場合は、キー名にランダムなプレフィックスを追加します。プレフィックスがランダムであることで、キー名が複数のインデックスパーティションに均等に分散されます。

# 結局どのくらいの処理能力を実現できるの？
ちなみに処理能力の最大値は明示はされていないので検証が必要そう。以下のようには書かれているけど具体的にはどうなんでしょうね。
>Amazon S3 は非常に高いリクエストレートをサポートするように拡張されます。

ただガイドラインに従えばGET、PUT、DELETE、GET Bucketなど様々なリクエストなら毎秒100個、GETのみなら毎秒800個のリクエストに対応できるというような書き振りだったのでこの値は参考になりそう。ガイドラインではGETが多いならCloudFront利用するというのも紹介されているので、もっと詳しいことを知りたい方は確認してみてください。
Windows10 CUDA9.1の再インストール、あきらめないで！

メモ
相変わらずあいまいですみません。

CUDA9.2とOpenCVの3.4のツリーの先週くらいのものの組み合わせで問題なさそうだったので、本番ビルド環境でもCUDA9.2に移行しようと思い、インストールをしたのですが、間違えてパッチを先にインストールしてしまってBaseをインストールしてもエラーになってしまいました。
9.1もおかしくなってしまったようなので再インストールを試みましたがこちらもエラーになってしまいます。
5時間ぐらいかけて試行錯誤して、何とかCUDA9.1の再インストールができました。

ということで、具体的にどうやったかといいますと
https://devtalk.nvidia.com/default/topic/1033111/cuda-setup-and-installation/cuda-9-1-cannot-install-due-to-failed-visual-studio-integration/
ここで書かれている通りにやってみました。

具体的に言いますと
まず、ディスプレイドライバーをMicroSoftの汎用ドライバーに変更し、再起動します。
次に　https://www.revouninstaller.com/　からRevo Uninstaller　試用版をダウンロードしてインストールします。
アプリを立ち上げて、NVIDIAで検索して出てくるアプリをすべて削除します。ScanオプションはAdvancedを選ぶのが良いと思います。
これでアンインストールすると、アプリのアンインストールで削除しない、謎のファイルや、レジストリのエントリーも表示してくれます。
レジストリのエントリーや関係しているファイルもこのアプリから削除できます。
NVIDIAのものがすべて削除できましたら再起動します。
ただ、すべてのレジストリエントリーが表示されるわけではないようで、削除後にRegeditでNVIDIAで検索するといくつかエントリーは残ってしまっているようです。

再起動してProgram Files と　Program Files(x86)にあるNVIDIA関連のフォルダを削除します。削除できないときはタスクマネージャを立ち上げ、NVIDIAのアイコンが表示されるプロセスがないか確認します。NVIDIA Container　が残っている可能性があります。私の場合は残っていて最初はフォルダ削除できませんでした。プロセスが残っていたら終了させればフォルダは削除できるはずです。

この状態でCuda9.1をインストールを実行したところ、インストールすることができました。
インストールできない原因はドライバーが新しすぎるのと、バックグラウンドプロセスのせいではないかと思っています。

大変だったのでもう2度とやりたくない作業でした。


以上、よろしくお願いいたします。
【C言語】関数のプロトタイプ宣言を書く理由

C言語の勉強中に、「プロトタイプ宣言って必要なの？」と思ったのでメモ。

#プロトタイプ宣言とは
プログラミングでは、原則として**ソースは上から処理されます**。これはC言語でもPythonでもbashスクリプトでも同じです。

なので普通は関数は使う前に定義しておく必要があります。例えば「Hello world!」と表示する関数を使おうと思えば、次のようになります。

```c
#include<stdio.h>

void hw(void){
   puts("Hello world!");
}

int main(void){
   hw();
}
```
※実はこのコードはあまりよろしくないようです。コメントありがとうございます。（2018.05.31）
→修正しました（2019.09.16）

ところが、mainを最初に書いて後で関数の処理を定義したいこともあります。main関数を上に書いてその中に出てくる関数を下につらつらと書いた方が構造が分かりやすくなります。長いソースコードでmainを最後に書いていると、デバッグの際にいちいちスクロールしなければなりません。

それでも定義されていない関数は使えません。そこで**使う関数の名前だけを先に定義しておく**機能を使います。これがプロトタイプ宣言です。

```c
#include<stdio.h>

void hw();

int main(){
   hw();
}

void hw(){
   puts("Hello world!");
}
```

#GCCではプロトタイプ宣言無しでも通ってしまう
ではプロトタイプ宣言を書かないとどうなるのでしょうか。

```c
#include<stdio.h>

int main(){
   hw();
}

void hw(){
   puts("Hello world!");
}
```

clangでは、当然エラーが出てコンパイルできません。
https://wandbox.org/permlink/ZmeMBpjFL8OL3hPv

```
prog.c:5:5: warning: implicit declaration of function 'hw' is invalid in C99 [-Wimplicit-function-declaration]
    hw();
    ^
prog.c:8:6: error: conflicting types for 'hw'
void hw(){
     ^
prog.c:5:5: note: previous implicit declaration is here
    hw();
    ^
1 warning and 1 error generated.
```

ところが、gccでは**警告は出るもののコンパイルは通ってしまいます**。

```
test.c: In function ‘main’:
test.c:8:3: warning: implicit declaration of function ‘hw’ [-Wimplicit-function-declaration]
   hw();
   ^
test.c: At top level:
test.c:11:6: warning: conflicting types for ‘hw’
 void hw(){
      ^
test.c:8:3: note: previous implicit declaration of ‘hw’ was here
   hw();
```

とはいえ警告が出ることはよろしいことではないですし、処理系によってコンパイルが通らなくなるのは困るので、プロトタイプ宣言はきちんとしておいたほうがよさそうです。実際にはヘッダファイルに書いてincludeするのが多いみたいです。

#そもそもプロトタイプ宣言がいらない言語はあるのか
ここからは個人的な話ですが、僕はmainを先に書いて関数はあとで書く方が好きです。なんでそこで「プロトタイプ宣言しないといけないなんて、C言語は面倒だな」と思ったわけです。

なので「プロトタイプ宣言しなくても関数を後で定義される言語って何かあったっけ」となったわけです。ですが、冷静に考えてみれば、多くの言語ではソースは上から処理されるので、関数を後に書くことはできません。

たとえばPythonでは次のようになります。

```python
def hw():
   print("Hello world")

hw()
```
bashスクリプトでも同じです。少なくともスクリプト言語では関数はちゃんと順番通り定義しないといけません。では一体何の影響でmainを先に書くようになったんでしょう。

そこでやっと思い出しました。やつです。**fortran**です。

```fortran
program hello_world
   implicit none

   call hw()

contains

   subroutine hw()
      write(6,*) "Hello world!"
   end subroutine hw   

end program hello_world
```
モダンなfortranでは、メインとなるブロック以外の関数はすべてcontains文の下に書くのが普通で、むしろメインより前に書くことができません。fortran、恐るべし...。
WordPressのバージョン情報・プラグイン・テーマ名を非表示にさせる

WordPressにおけるセキュリテイー対策です。

####■ 起因
WordPressでサイトを構築した際のセキュリティー対策として、さまざまなバージョンやプラグイン、テーマ名などを表示させているとセキュリティー的に古いものだったりすると脆弱性があり攻撃される可能性があるので非表示にするのがおすすめです。


####■ 解決策

WordPressのテーマディレクトリに下記を記載していくだけです。

```bash:{WordPress_Dir}/DocumentRoot/wp-content/themes/{テーマ}/functions.php
// generator
remove_action( 'wp_head', 'wp_generator');

// rel="shortlink"
remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );

// WLW(Windows Live Writer) wlwmanifest.xml
remove_action( 'wp_head', 'wlwmanifest_link');

// RSD xmlrpc.php?rsd
remove_action( 'wp_head', 'rsd_link');

//JavaScriptやCSSに付加されるWordPressのバージョン番号(?ver=4.4.2など)を削除します。
function remove_src_wp_ver( $dep ) {
	$dep->default_version = '';
}
add_action( 'wp_default_scripts', 'remove_src_wp_ver' );
add_action( 'wp_default_styles', 'remove_src_wp_ver' );
```