OmniAICreator/Qiita-1.07M huggingface dataset:
gradle(AndroidStudio)備忘録

# 背景
年末、GoogleからこれからはtargetSdkVersionは最新のAPIレベルで開発してねー的なことが来た。
https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html

2018年8月：新規アプリで、targetSdkVersionが26(Android Oreo)以降必須
2018年11月：既存アプリのアップデートで、targetSdkVersionが26(Android Oreo)以降必須
2019年以降: Android OSバージョンアップの後、1年以内に、新しいアプリとアプリのアップデートは、対応するAPIレベル以降にターゲットを指定することが義務づけられます。

ってことで早めにGradle 3.0に対応しないといけない

# Gradle3.0移行
## SDK BuildTool

```xml:app/build.gradle
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.3" 

    defaultConfig {
        targetSdkVersion 26
    }
    ・・・
}
```
## Android Plugin for Gradle
```xml:build.gradle
buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
    }
}
```
## Gradle
```xml:gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
```
## Product Flavor
Product Flavorの設定をする必要がある場合、Flavor Dimensionsの設定が必須となる。

## Dependency
次期メジャーリリースで、`compile`、`provided`、`apk`は削除される

|移行後|用途|
|:--|:--|
|implementation|依存関係をモジュール内部でのみ使用し、外部に公開しない場合|
|api|依存関係を外部に公開する場合|
|compileOnly|providedの代わり|
|runtimeOnly|apkの代わり|

※ サードパーティ製のライブラリの場合、公式に移行について書いているものもあるため、要チェック

## apkファイル命名
* gradle 3.0からVariant API を使用してバリアント出力を操作できなくなった
* ビルド中の簡単なファイル命名はできる

# 参考
https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html?hl=ja
https://qiita.com/taki4227/items/e9473441a7b2fe00e1f3
Node.jsでStreamのデータを必ずBufferで受け取る

# ShiftJISお前は絶対許さん

Node.jsで例えばhttpモジュールのrequest等を使う時、どうしてもBufferのchunkを受け取りたいときがあります。（例えば文字コードがShift-JISのテキストファイルのダウンロードとか。）

この時いろいろな指定があるものの全く効かないときに、必ずBufferで受け取る方法を書いておきます。

# Streamで絶対にBufferで受け取る

```
const stream   = require( 'stream' );
const buftrans = new stream.Transform( { transform( chunk, encoding, callback ) { callback( null, chunk ); } } );
```

`stream.Transform`はデータを変換するStreamで、ここで何もしないと必ずBufferを受け取れます。
つまり受け取ったデータをそのまま返せば、Bufferを返せます。

## 使用例

### `Promise<Buffer>`で返すGet。

例えばShiftJISのテキストファイルを取得して、iconvにかける時に、Bufferだと扱いやすいです。

```
var stream   = require( 'stream' );
var http     = require( 'http' );
function Get( url: string )
{
	const buftrans = new stream.Transform( { transform( chunk, encoding, callback ) { callback( null, chunk ); } } );

	return new Promise( ( resolve, reject ) =>
	{
		const bufs: Buffer[] = [];
		http.get( url, ( response ) => { response.pipe( buftrans ); } );
		buftrans.on( 'data', ( chunk ) => { bufs.push( chunk ); } );
		buftrans.on( 'end', () => { resolve( Buffer.concat( bufs ) ); } );
		buftrans.on( 'error', ( error ) => { reject( error ); } );
	} );
}
```

### http.createServerで新規でリクエストしたデータを文字列処理せずレスポンスとして返す

例えばプロキシサーバーを作っているとき、ShiftJISのサイトを開いても、そのままブラウザに文字列処理せず渡すので、ブラウザが頑張ってくれます。

```
var stream   = require( 'stream' );
var http     = require( 'http' );

function ProxyServerStart( settings )
{
	var server = http.createServer();
	server.on( 'request', function ( request, response )
	{
		http.request( 'NEW URL', ( res ) =>
		{
			const buftrans = new stream.Transform( { transform( chunk, encoding, callback ) { callback( null, chunk ); } } );

			res.pipe( buftrans );
			buftrans.on( 'data', ( chunk ) => { response.write( chunk ); } );
			buftrans.on( 'end', () => { response.end(); } );
			buftrans.on( 'error', ( error ) => { response.end(); } );
			Object.keys( res.headers ).forEach( ( key ) =>
			{
				response.setHeader( key, res.headers[ key ] );
			} );
		} );
		request.on( 'data', ( data ) => { hreq.write( data ); } );
		request.on( 'end', () => { hreq.end(); } );
	} );
	server.listen( settings.port, settings.host );
}

ProxyServerStart({ host: 'localhost', port: 8080 });
```

# まとめ

ShiftJIS滅びろ
モナド計算チートシート

# モナドって何？
値を入れるための箱、くらいの認識でも使える。本稿ではモナドとして`Task`と`Maybe`を使うが詳細を知らなくていい。JavaScriptでモナド（など）を実現するための仕様としてfantasy-landというものがあり、それを参考に実装されたramdaとfolktaleというライブラリを使う。

```js
const R = require('ramda');
const Maybe = require('folktale/maybe');
const Task = require('folktale/concurrency/task');
```

MaybeとTaskに入った値の確認方法を書いておく。以下の章で特に説明なく使う。

```js
Maybe.of(20).map(console.log); // 20 がプリントされる
Task.of(10).run().promise().then(console.log); // 10 がプリントされる
```

環境によっては`console.log`を`console.log.bind(console)`にしなければいけないかも。

# map: 保持する値を処理
具体例: 10を2回インクリメントすると12になる。（モナドの保持する）値を変更する関数を`map`に渡すと、モナドの値を変更してくれる。返り値はモナドになるので、メソッドチェーンで処理をつなげることができる。

```js
{
  const ten = Maybe.of(10);
  const incr = val => val + 1;
  ten.map(incr).map(incr).map(console.log);
  // pointfree version
  const app = R.map(R.compose(console.log, incr, incr));
  app(ten);
}
```

# chain: 保持する値を処理~その２~
具体例: 6を2回インクリメントすると8になる。mapの場合、渡す関数は`val => val + 1` のように関数自体はモナドを意識しない。モナドが自動的に`map`の返り値をモナドにしてくれているわけだ。一方、渡す関数自体がモナドを意識した実装にすることがある。たとえば、`val => Maybe.of(val +1)`。この関数を`map`に渡してしまうと、モナドのモナドが帰ってしまう。それを避けるために、`chain`を使う。`chain`を使うと、モナドは返り値をモナドにしない。

```js
// chain/flatMap
{
  const six = Maybe.of(6);
  const mIncr = val => (val ? Maybe.of(val + 1) : Maybe.Nothing());
  six.chain(mIncr).chain(mIncr).map(console.log);
  // pointfree version
  const app = R.compose(R.map(console.log), R.chain(mIncr), R.chain(mIncr));
  app(six);
}
```

# ap, lift: モナドとモナドの処理
具体例: 2 + 3 = 5。二つのモナドの値同士を合わせて何かの処理をしたい場合、`map`と`chain`を組み合わせてパズルのように計算することもできるが、より簡単な方法がある。liftingという技術を使う。`(a, b) => a + b`のようなモナドを意識しない関数であっても、これをliftしてあげると、引数をモナドにしたときに動くようになる。また、関数自体をモナドにして、`ap`でモナドを渡していく、という技術もある。

```js
// ap and lift
{
  const two = Maybe.of(2);
  const three = Maybe.of(3);
  three.map(two.chain(R.add)).map(console.log);
  R.lift(R.add)(two, three).map(console.log);
  Maybe.of(R.add).ap(two).ap(three).map(console.log);
  // pointfree version
  const app = R.curry(R.compose(R.map(console.log), R.lift(R.add)));
  app(two)(three);
}
```

# sequence/traverse: リストのモナド

具体例: `[Task.of(20), Task.of(40)] -> Task.of([20, 40])` モナドのリストよりもリストのモナドの方が扱いやすいことがある。その場合は`sequence` を使う。モナド同士が独立なので演算をしないけど一つのモナドにしたい、とかのユースケース。

```js
// sequence
R.sequence(Task.of)([Task.of(20), Task.of(40)])
   .run().promise().then(console.log); // -> [20, 40]
```

リストのモナドを、`traverse`を使って直接作ることもできる。リストに`map`をしてもリストのモナドのままであるが、リストに`traverse`をすると、モナドのリストになる。

```js
const twice = val => Task.of(2 * val);
R.traverse(Task.of)(twice)([10, 20])
   .run().promise().then(console.log); // -> [20 ,40]
```
crowi で書いたメモをpdf出力用表示にさせる

初投稿。

[crowi](http://site.crowi.wiki/)には、プレゼンテーションモードはあるけど、pdf出力する機能はない。
プレゼンテーションモードには[reveal.js](https://github.com/hakimel/reveal.js)を利用しているみたいですが、URLの末尾に`?print-pdf`を付けても印刷用表示にならなかったため、それの対処法。

## 原因
[reveal.jsのreadmeにも書いてありますが](https://github.com/hakimel/reveal.js/#print-stylesheet)、以下のscript文が書かれていないため、印刷用表示にならない。

```javascript
<script>
	var link = document.createElement( 'link' );
	link.rel = 'stylesheet';
	link.type = 'text/css';
	link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
	document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
```

また、`print-pdf`指定時の読み込みCSSの場所も変更しておかなければならないため、最終的には以下の行をプレゼンテーションモードのviewページ(/lib/views/page_presentation.html)に追記してあげる必要がある。

```javascript
<script>
	var link = document.createElement( 'link' );
	link.rel = 'stylesheet';
	link.type = 'text/css';
	link.href = window.location.search.match( /print-pdf/gi ) ? '/js/reveal/css/print/pdf.css' : '/js/reveal/css/print/paper.css';
	document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
```


自分の環境では、docker-hubにあったcrowiのイメージをそのまま建てただけなので、viコマンドやボリュームをホストとマウントしていなかったため、しぶしぶsedコマンドで対応した。

```bash
# cp lib/views/page_presentation.html lib/views/.page_presentation.html.backup
# cat lib/views/page_presentation.html | sed "14 i <script>\nvar link = document.createElement( 'link' );\nlink.rel = 'stylesheet';\nlink.type = 'text/css';\nlink.href = window.location.search.match( /print-pdf/gi ) ? '/js/reveal/css/print/pdf.css' : '/js/reveal/css/print/paper.css';\ndocument.getElementsByTagName( 'head' )[0].appendChild( link );\n</script>\n" > lib/views/page_presentation.html
```
一応、元のファイルを`cp`コマンドで.page_presentaition.html.backupで退避しています。

別にこんなまどろっこしい事しなくてもpage_presentation.htmlの`<title>`の上辺りに書けば多分動きます。
Immutable.js: オブジェクトのArrayからMapへの変換

前に書いた [Immutable.js: オブジェクトのListからMapへの変換](https://qiita.com/IzumiSy/items/a662d29963edfe821302) よりもスマートなやり方を思いついたので書き残しておく。

以下のようなidでユニークなオブジェクトの入ったArrayからImmutable.jsのMapへ変換をするには、`Array#reduce`の第二引数に初期値が取れるというのを利用する。

```js
class Person {
  constructor(id, name) {
    this.id = id;
    this.name = name;
  }
}

const people = [
  new Person(1, 'jessy'),
  new Person(2, 'bob'),
  new Person(3, 'justine'),
];

const peopleMap = people.reduce(
  (map, person) => map.set(person.id, person), 
  I.OrderedMap()
);
```
ちなみに`Immutable#List`のreduceも同様に第二引数に初期値を取れるので、このやりかたでListからMapへの変換も容易にできる。
NewRelicのAlerts設定まとめ

New RelicのAlertsは最低限このくらいは設定しといたら? と思うAlert conditionsをざっとまとめます.
たぶんそのうち追加したりします.

# APM APPLICATION METRIC
## Apdex(Low)
:x: Apdex < 0.85 for at least 5mins
:warning: Apdex < 0.90 for at least 5mins

### 補足
Apdexのスコアは平常時で0.95になるようにTを調整する運用をしているのでこういう塩梅の設定にしています.

「平常時で0.95になるようにTを調整する運用」についてはこちらの記事で紹介しています.
[New Relicで複数のWebサービスの速度品質を比較したりKPI化したりする試み](https://qiita.com/Takuan_Oishii/items/2cabf29dc1f5b49ec4c4)

## Error percentage (High)
:x: Error percentage > 5% for at least 5 mins
:warning: Error percentage > 3% for at least 5 mins

## Response time (web) (High)
:x: Response time(web) > 0.5 secs for at least 5mins
:warning: Response time(web) > 0.3 secs for at least 5mins

# SYNTHETICS MONITOR FAILURE
## Check Failure
:x: Monitor check failure

### 補足
SYNTHETICSの設定画面にある
**Advanced Options → Redirect is Failure**
の項目は大抵の場合チェックを付けておいたほうが良いと思います. たぶん.

# INFRASTRUCTURE METRIC
INFRASTRUCTUREの設定についてはAlertsのコンソールからでなくINFRASTRUCTUREのコンソールから設定していきます.

## cpu
:x: cpuPercent > 80 for at least 5mins
:warning: cpuPercent > 60 for at least 5mins

## disk used
:x: diskUsedPercent > 80 for at least 5mins
:warning: diskUsedPercent > 60 for at least 5mins

## disk utilization
:x: diskUtilizationPercent > 80 for at least 5mins
:warning: diskUtilizationPercent > 60 for at least 5mins

## memory
:x: memoryUsedBytes/memoryTotalBytes*100 > 80 for at least 5mins
:warning: memoryUsedBytes/memoryTotalBytes*100 > 60 for at least 5mins
Pythonについての雑記＜追加中＞

#作りたいものを見つけたり、Pythonでできることを知るきっかけに。
[python ボイスチェンジャー]
(https://www.google.co.jp/search?ei=Vu-5Wtq9Bcik8AX4gZHoDA&q=python+%E3%83%9C%E3%82%A4%E3%82%B9%E3%83%81%E3%82%A7%E3%83%B3%E3%82%B8%E3%83%A3%E3%83%BC&oq=python+%E3%83%9C%E3%82%A4%E3%82%B9&gs_l=psy-ab.1.0.35i39k1.17687.21099.0.22945.8.8.0.0.0.0.110.727.7j1.8.0....0...1.1j4.64.psy-ab..0.8.726...0j0i203k1j0i8i30k1j0i67k1j0i131k1j0i4k1.0.AWhFSp2q4tU)

[python blender]
(https://www.google.co.jp/search?biw=1242&bih=602&ei=kvG5WpCKFcvR0ATG75zACQ&q=python+blender&oq=python+b&gs_l=psy-ab.1.0.35i39k1l2j0j0i4k1l2j0j0i4k1l2.132352.142573.0.144961.10.10.0.0.0.0.161.961.6j3.9.0....0...1.1.64.psy-ab..1.9.959...0i203k1j0i131k1j0i67k1.0.IxR9M3YqOcY)

[python スクレイピング]
(https://www.google.co.jp/search?biw=1242&bih=602&ei=O_K5WvmdGoPC0gTFvoqwAw&q=python+%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0&oq=python+sukureipingu&gs_l=psy-ab.1.0.0i4k1l8.57366.65053.0.66717.19.19.0.0.0.0.205.1910.13j5j1.19.0....0...1.1.64.psy-ab..0.19.1907...0j35i39k1j0i203k1j0i131k1j0i67k1.0.Aea730OfatY)

[python bot]
(https://www.google.co.jp/search?biw=1242&bih=602&ei=fvK5WtfmMoTJ0AS85o54&q=python+bot&oq=python+bot&gs_l=psy-ab.1.2.35i39k1l2j0j0i4k1j0l2j0i4k1j0.426226.432731.0.434746.17.16.1.0.0.0.171.1453.12j3.15.0....0...1.1j4.64.psy-ab..1.16.1454...0i131i67k1j0i67k1j0i203k1.0.Iy-XGH2wlaI)

[python 画像処理]
(https://www.google.co.jp/search?biw=1242&bih=602&ei=MvS5WvHtF4uS8wWq3LmICA&q=python+%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86&oq=python+gazousyori&gs_l=psy-ab.1.0.0i4k1l8.66364.71911.0.74060.13.13.0.0.0.0.94.1127.13.13.0....0...1.1.64.psy-ab..0.13.1124...0j35i39k1j0i67k1j0i131k1.0.XS8u1qPf9F0)

[Pythonを使っている製品あるいはソフトウェアの一覧]
(https://ja.wikipedia.org/wiki/Python%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E8%A3%BD%E5%93%81%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E4%B8%80%E8%A6%A7)

[]
()

[]
()

[]
()

[]
()

[]
()

[]
()

[]
()

[]
()

[]
()

[]
()
JavaScript:コイン分配問題

ええ本当に!?と疑問に思ったので、練習も兼ねてやってみました。
[コイン分配問題　JavaScriptでやってみた](https://qiita.com/Beramines/items/7a7c795ce3daf9eab4dc)
[コイン分配問題](https://scrapbox.io/prog-exercises/コイン分配問題)
[「有名な統計力学ゲーム」を実際に試してみる](http://ledsun.hatenablog.com/entry/2018/01/19/173113)
[「有名な統計力学ゲーム」をレーダーチャートで表示してみる](http://ledsun.hatenablog.com/entry/2018/01/23/121601)
[「有名な統計力学ゲーム」をcanvasで表示してみる](http://ledsun.hatenablog.com/entry/2018/01/26/201915)

100000回試行し、プレイヤー毎の平均を表示してみます。

```JavaScript:
//関数fをかけ続けるジェネレーター
const nestG = f => function*( x ){
    while( true ) {
      yield x
      x = f( x )
    }
  }
//ジェネレーターgの値をn個とりだすジェネレーター
const passTimesG = n => function*( g ){
    let x
    for(let i = 0; i<n; i++){
      x = g.next();
      if( x.done ) return;
      yield x.value;
    }
  }
// xを初期値にジェネレーターを順次適用した結果をならべて配列にする
const pipeG = x => (...f) =>{
  const spreadG = xs => [...xs]
  const fs =[...f, spreadG]
  return fs.reduce( (acc, e) => e(acc), x )
}
//配列の要素同士を足し合わせて新しい配列を返す
const zipAdd = xs => ys => 
	xs.length < ys.length ? xs.map((e,i)=>e+ys[i]) : ys.map((e,i)=>xs[i]+e)

//一回分の試行。
const deal = state => {
  const moveCoinOrNot = x => y => x > 0 ? [x-1, y+1] : [x, y] 
  const diceGen = () => Math.floor( Math.random() * 6 ) 
  
  const loser = diceGen()
  const winner = diceGen()
  const newState = [...state];
  if(loser === winner) return newState;
  [ newState[loser], newState[winner] ] = moveCoinOrNot( state[loser] )( state[winner] )
  return newState
}
//初期値
const state = [5,5,5,5,5,5]
const times =100000;
//試行を繰り返し、プレイヤー毎の平均を表示
pipeG(state)( nestG(deal), passTimesG(times) )
  .reduce( (acc,e) => zipAdd( acc )( e ), [0,0,0,0,0,0] )
  .map( e => e / ( times ) )
  .forEach( e => console.log( e ) )
```
## 結果
試行回数をいろいろ変えてやってみました。

```Javascript:
//試行の例
//10回：
7
4.8
4.1
5
4.7
4.4
// 100回：
2.93
3.94
5.85
5.09
11.06
1.13
//1000回：
3.628
4.426
4.927
10.415
1.876
4.728
//10000回：
3.5934
6.5859
6.1402
4.6628
4.1216
4.8961
//100000回；
5.60544
4.76653
5.30907
5.27514
4.44783
4.59599
```
100~1000回くらいまでは確かにけっこう差がでてくるようです。
10000回くらいになると差がなくなってきて、もっと多くなると有意な差は次第になくなってくるようです。
iframeに関するTips（広告屋さん向け）

FriendlyIFrameとかSafeframeとか。
自分で使ってるやつを置いておく。SF系はこれから拡充する。

###　scriptを囲んでいるFriendlyIFrameを取得したい
```js
var fif = window.frameElement;
```

###　scriptがiframe(FriendlyIFrameやSafeframe)に囲われているかどうかの判定をしたい
```js
if(window !== parent) {
  // iframe
  if(window.$sf) {
    // safeframe
  } else if(window.frameElement) {
    // friendly-iframe
  } else {
    // other-iframe
  }
} else {
  // not iframe
}
```
`inDapIF` は判定に使っていない。稀に設定してない人がいるので……

###　リファラーを取得したい
```js
var url;
if (window.$sf) {
  // safeframe
  url = document.referrer;
} else if(window.frameElement){
  // friendly-iframe
  url = window.top.location.href;
} else {
  // other
  url = window.location.href;
}
```

###　複数のFriendlyIFrameに囲われている時に、最も親のFriendlyIFrameにアクセスしたい
```js
var w = window.window;
while(w.parent.frameElement) {
  w = w.parent.window;
}
var fif = w.frameElement;
```
最近それっぽく作ったやつ。
期限が切れて起動できなくなったjnlpをJava Web Startを使わずに起動する

どんどんJavaのセキュリティが厳しくなってますね。
Ora*leからJavaは辞めようって言われてるような気がしてきました。

証明書の期限が切れそうになっていたため電子証明書を発行してもらったところ、WinPCでしか認識できないUSBが送られてきました。
でも手元にWinPCはない。
テスト環境はあるけど、署名ができないからjnlpから起動できない。

ということで、Java Web Startを使わずにアプリを立ち上げようと思います。
**注意：あくまでテスト用です。推奨はしません。**

## 結論

こんな感じのjnlpファイルがあるとします。

```xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jnlp codebase="http://127.0.0.1/application/">
  <information>
    <title>test_project</title>
    <vendor>Kai Shoya</vendor>
    <description/>
  </information>
  <resources>
    <jar href="main.jar"/>
    <jar href="library.jar"/>
    <j2se version="1.7+" initial-heap-size="512m" max-heap-size="1024m"/>
  </resources>
  <application-desc main-class="com.example.test.Main"/>
  <security>
    <all-permissions/>
  </security>
</jnlp>
```

それをこうします。（語彙力。。。

```bash
#!/bin/bash
URL="http://127.0.0.1/application"
SCRIPT_PATH="$(cd $(dirname $0); pwd)"
LIB_PATH="$SCRIPT_PATH/lib"

mkdir -p $LIB_PATH
cd $LIB_PATH

curl -O "$URL/main.jar"
curl -O "$URL/library.jar"

java -cp "$LIB_PATH/*" com.example.test.Main
```

ポイントは3つです。

1. `<jnlp codebase="http:/127.0.0.1/application">`と`<jar href="main.jar"/>`を組み合わせてcurlで取ってくる

2. `java -cp`でダウンロードしたファイルのパスを通す
-cpと-jarを組み合わせるとパスがうまく通りません

3. `<application-desc main-class="com.example.test.Main"/>`がメインクラス名


jnlpをこう書き換えてもセキュリティエラーになるのでお気をつけ下さい。
これ解決するまでに何時間もかかってしまった。。。

```xml
<jnlp codebase="./lib/">
```
Expo.ioを使ってReact Nativeの開発の準備をする

## はじめに
この記事はWindowsユーザ向けの記事です。
Expoのアカウントを持っていない場合はまず[ここ](https://expo.io/signup)からExpoのアカウントを作成してください。

## React Native&expo.ioについて

### React Native
そもそも[React Native](https://facebook.github.io/react-native/)ってなに？っていう人向けに簡単に説明します。
React Nativeとは、ReactというFacebookが開発したJavaScriptのフレームワークをモバイルでも使えるようにしたものです。
また、React NativeはJavaScripで書いたコードがネイティブのレンダリングAPIを呼び出すため、Web開発をしていた人にとっては触りやすいです。さらにiOSとAndroidの両プラットホームで動くアプリを一つのコードで作れます。

### Expo.io
Expo.ioは簡単に言うとReact Nativeでの開発を支援するサービスです。
Expo.ioを使うメリットに以下のようなものが上げられます。

* ネットワークを通して実機の動作確認ができる(ケーブルでの接続が不要)
* コードの変更がリアルタイムに反映される
* 開発版アプリの配布がすぐにできる


## create-react-native-appのインストール
それでは環境構築をしていきましょう。
まずは、create-react-native-appをインストールする前にnode.jsがインストールされているかの確認をします。
PowerShell等で

```
node -v
```

と入力して`v8.9.4`等と表示されればOKです。※バージョンは念のため最新の安定版をおすすめします。
もしnode.jsが入っていない場合やバージョンが極端に古い場合などは[こちらを参考に](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)node.jsを先に導入してください。
nodeの確認がとれたら、


```bash
npm i -g create-react-native-app
```

とコマンドから打ち、create-react-native-appをインストールします。


## Expo XDEのインストール&プロジェクト作成

[Expo XDE](https://github.com/expo/xde/releases)からxde-Setup-2.23.1.exe(最新版があればそっち)をダウンロードし、インストールしてください。
インストールが完了したら先ほど作ったアカウントでログインをし、テスト用のプロジェクトを作成します。
New Projectから新しいプロジェクトを作りましょう。
![expo-xde.png](https://qiita-image-store.s3.amazonaws.com/0/239790/f0712e43-2724-de30-712b-f5d635c7abd8.png)

<br>

テストなのでプロジェクト名はデフォルトで。プロジェクトのフォルダは任意の場所で大丈夫です。
![new_project.png](https://qiita-image-store.s3.amazonaws.com/0/239790/5d31ae09-535d-ec87-304b-e8ba3d7741bf.png)

Create実行後、しばらく時間がかかるのでその間に次の作業をしましょう。


## clientアプリをダウンロードする

下記のURLからスマホアプリをダウンロードする。

Android版 : https://play.google.com/store/apps/details?id=host.exp.exponent
iphone版 : https://itunes.apple.com/app/apple-store/id982107779

ダウンロードが終わったら起動し、先ほど作ったアカウントでログインする。
![expo-スマホ.png](https://qiita-image-store.s3.amazonaws.com/0/239790/b37adb72-f449-a0b2-7b65-41f590878f13.png)
画像のようになっていればOKです。

## アプリの確認をする

そろそろプロジェクトの作成ができていると思うのでPCに戻りましょう。
画面がこのようになっていると思います。
![share.png](https://qiita-image-store.s3.amazonaws.com/0/239790/7ff8f461-6054-0b77-52ed-5505193b0b53.png)
右上のShareボタンを押すとQRコードが出てくるのでそれをスマホアプリの"Expo内のScan QR Code"から撮影します。
ここでビルド時間があるのでしばらく待ちます。

ビルドが終わるとテンプレートアプリが起動します。画像のような画面になっていれば成功です。
![テンプレートアプリ.jpg](https://qiita-image-store.s3.amazonaws.com/0/239790/efda5c69-f905-6468-7063-adefd414d78f.jpeg)

デフォルトの設定のままであれば、ここで画面を振ることでメニュー画面を出せます。

## エラーになってしまう場合
当たり前ですがネットワーク越しに接続する場合は同じネットワーク内でないとエラーになります。なにもしていない場合に192.168.1.1/24と192.168.2.1/24で通信ができないようなものです。同じネットワーク内にいるのにそれでもエラーが出てしまってかつVirtuaBoxかVMWareがインストールされている人はそれらのネットワークアダプタを無効化してもう一度やってみると接続できるかもしれません。(自分はこれで一日溶かしました)

## 参考

* Node.js / npmをインストールする（for Windows）https://qiita.com/taiponrock/items/9001ae194571feb63a5e
* expo.ioを使ってリアルタイムにReact Nativeアプリを開発する https://qiita.com/taiponrock/items/9001ae194571feb63a5e
* expo.io tools https://expo.io/tools
* Expo XDEでReact Native入門 https://qiita.com/ykubot/items/963df6499af5ffc3a0b2
ムームードメインからお名前.comへドメインを移管してみる。

実際にドメインを移すために行ったことをメモとして時系列に書いていきます。

以前は全てを[ムームードメイン](https://muumuu-domain.com/)で管理していたが、お名前comで一括管理しようと思いDNS管理を移管することにした。

まず、お名前comでドメインの管理を移すためにドメイン名を入れる事ができる[ページ](https://www.onamae.com/service/d-transfer/)を見つけたため、ここに移したいドメインを入力してみる。
しかし"ドメインのステータスがトランスファー可能なステータスではありません。"と言われてしまい。どうもできそうには無い。

注意事項を読むと、ドメインのトランスファー(ドメイン移管)の手続きが書いてある。
必要であれば現レジストラ(ドメイン登録・管理を行う組織)即ちムームードメインで何か準備事項があるようだ。

検索すると下記のようなページを発見した。
[ドメインを他社へ移管したい。(『.jp』以外)](https://muumuu-domain.com/?mode=faq&state=answer&id=000621)
これである。

【 Whois情報変更 】にて、設定されている以下の情報の全てを、「 お客様ご本人の個人情報 」へ変更する。
　・ 登録者情報 （Registrant）
　・ 管理者情報 （Admin）
　・ 技術者情報 （Technical）
　・ 請求先情報 （Billing）
なるほど、良く分からん。

が、Whois情報の変更に行ってみる事にする。取りあえず個人情報はバレバレになったようだが、ボタン一つで変更する事が出来た。ムームードメインに登録されている場所からメールが届くのでVerifyしてやる必要もある。

これを行えばどうやら先ほどの[ページ](https://www.onamae.com/service/d-transfer/)で移管処理ができるようである。次の処理はどうも認証コードを確認する。だとか、一体何を認証するのだろうか？

調べてみると、不正なドメイン移管を防止するための本人確認目的でこの認証コードが必要だそう。そしてそれはムームードメイン側が持っているとの事。

[ムームードメインのドメインリスト](https://muumuu-domain.com/?mode=conpane&state=domain_list_all)からドメイン詳細ページへ飛ぶと確認できた。どうやらアルファベット、数字、特殊文字を合わせた12桁のコードのようである。これをお名前.comの認証コード入力欄に入れる。

あとはお金をクレジットカードで払えばOK。

支払い後

上記ドメイン名の自動更新申請を保留にて受付いたしました。
処理結果、または必要なお知らせを改めてメールにて通知いたしますので今しばらくお待ちください。

とメールが来た。1日なのだろうか？1か月なのだろうか？ここのところがはっきりしなくてつらい。
[お名前comのQ&A](https://help.onamae.com/app/answers/detail/a_id/8593)によるとどうも1,2週間かかることもあるとのこと。ということは通常は1週間以内でやってもらえるのかな。ひとまず1週間と見積もっておこう。

ちゃんとできているかが楽しみである。=>その日のうちに移管承認を促すメールが来た。このメールに承認したら5日以内に担当者が移管手続きをしてくれるみたいである。
Seleniumでchromeブラウザをスクロールする

## 概要
Seleniumのテストでブラウザをスクロールする場合に調べた内容をメモしておく。

## 要素指定
要素を指定して移動する。
※ 位置の微調整のために、offset引数を用意しています
※ スクロールについてくるナビゲーションなどがあった場合、位置の微調整が必要

### メソッド定義
```python
class Browser:
    def scrollByElemAndOffset(self, element, offset = 0):

        self.driver.execute_script("arguments[0].scrollIntoView();", element)

        if (offset != 0):
            script = "window.scrollTo(0, window.pageYOffset + " + str(offset) + ");"
            self.driver.execute_script(script)
```

### 使用例
```python
browser = Browser()
element = browser.driver.find_element_by_id('some_id')
browser.scrollByElemAndOffset(element, -10)
```

## 高さ指定
高さを指定して移動する。

### メソッド定義
```python
class Browser:
    def scrollByY(self, height):
        self.driver.execute_script("window.scrollTo(0, " + str(height) + ");")
```

### 使用例
```python
browser = Browser()
element = browser.driver.find_element_by_id('some_id')
browser.scrollByY(element.location_once_scrolled_into_view['y'])
```

## まとめ
高さ指定の場合、広告など遅れて後から表示されるものがあった場合、位置がズレたりするみたい。
要素指定で微調整した方が、あまりズレなくて良さそう・・・


## 参考サイト
- [Scrolling to element using webdriver?](https://stackoverflow.com/questions/41744368/scrolling-to-element-using-webdriver/41744591)
- [7. WebDriver API](https://kurozumi.github.io/selenium-python/api.html)
- [【Python】click_and_hold/move_to_element/perform](http://www.seleniumqref.com/api/python/actions/Python_click_and_hold_move_to_element.html)
- [【Python】Seleniumでページの下部へスクロールさせる方法](https://a-zumi.net/python-selenium-scroll-to-bottom/)
非エンジニアでも作れるスマート受付(IoT縛りの勉強会! IoTLT vol.37 @ Innovation Space DEJIMA)

![非エンジニアでも作れるスマート受付.001.png](https://qiita-image-store.s3.amazonaws.com/0/222672/ef814e31-6a73-8f09-e6cf-dd6993a7363e.png)
![非エンジニアでも作れるスマート受付.002.png](https://qiita-image-store.s3.amazonaws.com/0/222672/15c3475c-997a-efbf-2266-ed25e9c4bfeb.png)
![非エンジニアでも作れるスマート受付.003.png](https://qiita-image-store.s3.amazonaws.com/0/222672/021d9e9a-79ee-e7fa-1fff-a58c22e389c8.png)
![非エンジニアでも作れるスマート受付.004.png](https://qiita-image-store.s3.amazonaws.com/0/222672/1db80faa-0012-c7e7-e7c8-82d87d936579.png)
![非エンジニアでも作れるスマート受付.005.png](https://qiita-image-store.s3.amazonaws.com/0/222672/ccaba0d9-df9b-4695-bfa3-bbe043c2bf4b.png)
![非エンジニアでも作れるスマート受付.006.png](https://qiita-image-store.s3.amazonaws.com/0/222672/fcec9b5c-2783-0fca-10d7-2226bfda9a39.png)
![非エンジニアでも作れるスマート受付.007.png](https://qiita-image-store.s3.amazonaws.com/0/222672/fc014058-5698-a6fa-6be0-fa96c7b4b393.png)
![非エンジニアでも作れるスマート受付.008.png](https://qiita-image-store.s3.amazonaws.com/0/222672/bcc4bf6d-20a9-f8d5-4346-8c1b0739a889.png)
![非エンジニアでも作れるスマート受付.009.png](https://qiita-image-store.s3.amazonaws.com/0/222672/a96b5919-ea9b-c5f8-e596-a594d8a2e36f.png)
![非エンジニアでも作れるスマート受付.010.png](https://qiita-image-store.s3.amazonaws.com/0/222672/4838fa90-5702-672b-70b5-1b9f6bad7369.png)
![非エンジニアでも作れるスマート受付.011.png](https://qiita-image-store.s3.amazonaws.com/0/222672/e1e900fa-e42e-6734-eca1-abb0a19cda0b.png)
![非エンジニアでも作れるスマート受付.012.png](https://qiita-image-store.s3.amazonaws.com/0/222672/f2e3c397-fa37-deac-fe9f-eba58016ccbf.png)
![非エンジニアでも作れるスマート受付.013.png](https://qiita-image-store.s3.amazonaws.com/0/222672/8eebc2a1-b801-c019-690c-c72fce2e5d7f.png)
![非エンジニアでも作れるスマート受付.014.png](https://qiita-image-store.s3.amazonaws.com/0/222672/7204a4b5-a1bb-7145-9013-d5fcb91c0a37.png)
![非エンジニアでも作れるスマート受付.015.png](https://qiita-image-store.s3.amazonaws.com/0/222672/3c6e0b5e-534e-5747-b967-4449c4c5f25b.png)
![非エンジニアでも作れるスマート受付.016.png](https://qiita-image-store.s3.amazonaws.com/0/222672/a4c2200f-47a7-2bd1-6e38-c9b325a70edd.png)
![非エンジニアでも作れるスマート受付.017.png](https://qiita-image-store.s3.amazonaws.com/0/222672/7ca6e276-5cc0-7495-a6c1-04d676059016.png)
![非エンジニアでも作れるスマート受付.018.png](https://qiita-image-store.s3.amazonaws.com/0/222672/5e6cb2e2-fddc-3a3e-dfdb-8a47c2dabf8e.png)
![非エンジニアでも作れるスマート受付.019.png](https://qiita-image-store.s3.amazonaws.com/0/222672/df218476-a3ca-29a7-25fb-06a308ea941b.png)
![非エンジニアでも作れるスマート受付.020.png](https://qiita-image-store.s3.amazonaws.com/0/222672/5a734439-7617-d438-e0a2-dde06e7cd871.png)
![非エンジニアでも作れるスマート受付.021.png](https://qiita-image-store.s3.amazonaws.com/0/222672/c0732351-8d90-f8a7-acc1-2e93012d33be.png)
![非エンジニアでも作れるスマート受付.022.png](https://qiita-image-store.s3.amazonaws.com/0/222672/6821422b-f719-c842-a397-719cd06afc6f.png)
![非エンジニアでも作れるスマート受付.023.png](https://qiita-image-store.s3.amazonaws.com/0/222672/57918f3c-fa79-c79e-5819-602518296898.png)
![非エンジニアでも作れるスマート受付.024.png](https://qiita-image-store.s3.amazonaws.com/0/222672/58b68b35-7186-9435-7526-dc409a970c9b.png)
![非エンジニアでも作れるスマート受付.025.png](https://qiita-image-store.s3.amazonaws.com/0/222672/0f88cca4-49d2-c1b2-7c84-55c25ba06ccf.png)
Project Euler 62「立方数置換」

このくらいの難易度が解いてて気持ちいいですね。

# Problem 62 「立方数置換」
立方数 41063625 (345^3) は, 桁の順番を入れ替えると2つの立方数になる: 56623104 (384^3) と 66430125 (405^3) である. 41063625は, 立方数になるような桁の置換をちょうど3つもつ最小の立方数である.
立方数になるような桁の置換をちょうど5つもつ最小の立方数を求めよ.

```python
def hoge(num):
    n, m, d = 1, 0, {}
    while 1:
        n3 = n**3
        if m != 0 and len(str(m)) < len(str(n3)):
            return m
        s = ''.join(sorted(str(n3)))
        d[s] = d.get(s, []) + [n3]
        if len(d[s]) == num:
            #print(d[s])
            m = d[s][0] if m == 0 else min(m, d[s][0])
        n += 1

print(hoge(5))
```
IISでHTTP Dlete, Putに失敗する時の回避策



## 405エラー

WebAPIでHTTP Deleteを呼びだしたときに
405 errorで弾かれました。


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/6d6ad45b-790d-4d6f-23e2-5eb57dfed8e2.png)


Fiddlerで見たところ応答は以下のような感じです。

```
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE
Content-Type: text/html
Server: Microsoft-IIS/8.5
Persistent-Auth: true
X-Powered-By: ASP.NET
Content-Length: 1306
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis"/>
<title>405 - このページにアクセスするために使用された HTTP 動詞は許可されていません。</title>
```


## 解決

Stack Overflowにも同様の質問が出ていました。

[Asp.NET Web API - 405 - HTTP verb used to access this page is not allowed - how to set handler mappings - Stack Overflow](https://stackoverflow.com/questions/9854602/asp-net-web-api-405-http-verb-used-to-access-this-page-is-not-allowed-how?lq=1)


結果的には以下をWeb.configに追加すればOKでした
```
<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>
```
Edge のユーザーエージェントがいろいろとひどい

※以下の内容は 2018年3月 ぐらいの内容です。

2018年吉日、Microsoft Edge がスマートフォン用にも公開されました。
使ってる人は少ないと思いますが、今回 Ban 対象となりましたのでユーザーエージェントを拾おうとした時のことを残します。

## 判別不能

Windows 版は問題なく判別できました。
同様の分岐をモバイル版にもこさえたのですが、何度やっても Chrome と判定されてしまいます。
んーなんでだろうと、全文を改めて確認し、驚愕で顎がガクガクしました。

## Edge じゃなかった

Android ではなんと

```
Mozilla/5.0 (Linux; Android 7.0; SCV32 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36 EdgA/41.0.0.1662
```

__EdgA ？？？__

EdgAってなんだろう、といろいろ考えましたが、iOS も確認して納得しました（していない）。

```
Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0 EdgiOS/41.13.0.0 Mobile/15D100 Safari/604.5.6
```

__EdgiOS__

なるほど OS名 が Edg の後ろにつくのね。

なお、Windows は

```
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063
```
じゃぁ EdgW とか EdgWin にしてほしかったな。

## まとめ

~~もしスマートフォンで切り分ける必要がある場合は、Edg で検索してください。~~
Chromium に転生して事情が変わるようです。
現場優先主義でいきましょう。
今回は OS毎 にそのものズバリの文字列でいきました。
いろいろとひどいですね。
競プロ用にvim-quickrunにクリップボードの中身を渡せるようにした

## はじめに  
競プロでvim-quickrunするときクリップボードの内容を渡せれば便利だと思ったので。

## 自分の環境
ubuntu 18.04
neovim 0.3.1

## 方法
クリップボードの内容が+レジスタに共有されている場合（大抵そうだと思う。），以下のコマンドで動きます。
自分は\<Leader>rに上書きしていますが，自己責任で。

```
:QuickRun -input =@+
```

## 説明
-inputオプションでファイルの内容を渡すことができ，=から始めることで文字列を直接渡すことができます。
そこに+レジスタの内容を渡しています。

## さいごに
vim-quickrunの作者であるthincaさんのはてブを参考にしました。
https://thinca.hatenablog.com/entry/20151003/1443853833
Git で管理する

環境 : Gamemaker Studio 2
結論 : .gitignoreするファイルは特になさそうです。


こんばんは。Aki [@aki_0o0_](https://twitter.com/aki_0o0_)です。Gitで管理しようと思ったので、除外するファイルなどを調べました。

## Source Controlっていうメニューを表示させる方法

### 2.0の記事は見当たらないので、1.4を参考にする（けど設定の場所が少し違う・・）
https://help.yoyogames.com/hc/en-us/articles/216754958-SCM-Part-6a-Configurations-for-GIT

File  - >  Preferences  - >  Source Control

が無い。

GameMakerStudio2  - >  Preferences  - >  Plugins  - >  Source Control (Git)

と、Plugin以下にあったよ！

- その設定の下の方の、Automatically enable source control のチェックオンにする
- (後、名前とメアドも設定する)
- Helpの隣にSource Controlっていうメニューが増えた。

で、そのメニューの、Create Project Repository で作れたよおおローカルレポジトリーーーー。わーい。できたー。

SourceThreeにインポートしてみる。

そもそも、.gitignoreを調べてたんだけど、ignoreするファイルは見つけられなかったので、特に無いってことで全部コミットしてます！

プロジェクト丸々全部をコピーして日付の名前つけてバックアップしてる人がいたら、gitをおぼえることをおすすめしたい。とてもとても。
tibbleの表示にお悩みの方へ

tidyverseユーザーにとって今やなくてはならない存在がtibbleかもしれませんが、近頃、こいつのprint結果は非難囂囂です。
例えば、以下のように数字を有効(？)数字で自動に丸め、重要な(？)部分とやらに下線を引きます。

```r
library(tibble)
x <- tibble::tibble(x = (8 ^ c(-5:5)))
x
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/366bb147-7929-d476-577d-c6b5a8fbca1f.png)

バージョンによっては下線部をとそれ以外の文字色を変えていた模様。
見易いという人もいるかもしれませんが、見易さは自分で適宜調整するから生ものを返せという人もいるでしょう、

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

Rでは結果の出力に暗黙に`print`が呼ばれていることを利用します。

tibbleオブジェクトはtbl_df, tbl, data.frameのクラスから成るので、tbl_df用のprintを定義し、printする時だけ、data.frameに戻してやりましょう。

```r
print.tbl_df <- function(x, ...) print(as.data.frame(x))
```

するとtibbleオブジェクトがdata.frameとしてプリントされるようになり、幸せになれます。

```r
x
#               x
# 1  3.051758e-05
# 2  2.441406e-04
# 3  1.953125e-03
# 4  1.562500e-02
# 5  1.250000e-01
# 6  1.000000e+00
# 7  8.000000e+00
# 8  6.400000e+01
# 9  5.120000e+02
# 10 4.096000e+03
# 11 3.276800e+04
```


下記を毎回入力するのは面倒なので、.Rprofileにでも追記しておくと都合がいいのではないかと思います。

```r
print.tbl_df <- function(x, ...) print(as.data.frame(x))
```


Enjoy!!


2018/03/27 15:50追記

単にprint.tbl_dfをprint.data.frameと同じものにするという手もあるようです。

```r
print.tbl_df <- print.data.frame
```
正規表現を勉強しよう!! 文系学生がやってみた!!

##はじめに
インターン先でプログラミングを勉強中の文系学生。

「正規表現ってわかる?」
「わからないです」
「じゃあ、勉強しようか。」
「ウィッス」

##正規表現とは
まず正規表現って何ぞや。
色々なサイトを見ていると、文字列を効率良く操作するための言語なのかな?
使い方まではわからないけど、言語の壁を越えて検索ができるみたい。
まぁ、とりあえずは勉強していくか。

##Regex
社員さんからおすすめのサイトとして、[RegexOne](https://regexone.com/)を紹介してもらった。
それじゃあチュートリアルをやっていくか!!

###/d
メタ文字。0~9の数字に対応している。

###.(ドット)
メタ文字。あらゆる1文字に対応。ドットに対応させる場合は、`\.`とする。

###[]
[]の中に書いた特定の文字を一致させる。
`^`でかっこの中にある文字以外の一文字に一致させる。
`―(ダッシュ)`を用いることで文字の範囲を示す。
`[0―5]`なら0から5までの一文字に一致。

###\w
メタ文字。`[A―Za―z0―9_]`を意味する。

###{}
一致させたい文字の繰り返しを意味する。`a{3}`なら3つのaと一致させる。

###量子文字
`a+`は1つ以上のa。
`[abc]+`はa,b,cの1つ文字。
`a*`であらゆる文字の一致。
`a?bc`では`abc`か`ac`に一致。`?`を検索したいときは、`\?`。

###スペース
`\t`はタブ、`\n`で改行を意味する。
`\s`は特定の空白と一致する。

###テキスト
`^dog`でdogから始まる行だけを照合できる。
`dog$`でdogで終わる行を照合できる。

###ファイルの取得
完全なファイルの取得は`^(IMG\d+\.png)`
拡張子なしのファイル名の取得は`^(IMG\d+)`
ファイル名のみは`\.png$`

###大文字
`\D`は非数字文字。
`\S`は非空白文字。
`\W`は英数字以外の文字。

##まとめ
今回は正規表現の勉強をしました!!
なるほど。正規表現は文字列の検索を行う際に使われるのか。
しっかりと覚えて、どんどん頑張っていこう!!

##参考資料
[初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」](https://qiita.com/jnchito/items/893c887fbf19e17d3ff9)-https://qiita.com/jnchito/items/893c887fbf19e17d3ff9
[RegexOne](https://regexone.com/)-https://regexone.com/
コンストラクタについて

#コンストラクタとは
インスタンスのプロパティ初期化のために使用する。

```php
//クラスの宣言
class Printer
{
    public $numberOfSheets;

    public function __construct($numberOfSheets)
    {
        $this->numberOfSheets = $numberOfSheets;
    }
}
```


```php
//コンストラクタの使用
$printer = new Printer(3);
```

3が引数としてセットされている。
クラスの宣言を見るとコンストラクタの引数に「numberOfSheets」とある。
つまり、numberOfSheetsに３がセットされる。

このように、コンストラクタを使って、プロパティに値をセットする。

#コンストラクタを定義しない場合
コンストラクタの定義は必須ではない。
定義しなかった場合は引数なしで、何も処理しないという実装になる。
ギフトの方のライセンスを買った時に自分で受け取る方法

環境 : Gamemaker Studio 2
結論 : ダッシュボードのRedeemってところに入力しましょう


こんばんは。Aki [@aki_0o0_](https://twitter.com/aki_0o0_)です。ライセンスは買ったはずなのに、トライアルのまま制限されて居て困ったので、原因を調べました。

- 原因は、間違ってギフトのライセンスを買っていました。
- ギフトは、決済する人とライセンスを使う人が別の時には、便利な仕組みですね。
- ギフトコードをダッシュボードのRedeemってところに入力しましょう。

## 購入済みのはずなのに、Trialだって言われる？

### Trialのままだと出来ないこと
https://help.yoyogames.com/hc/en-us/articles/230407528-GameMaker-Studio-2-Trial-Limitations

オブジェクトやスプライトの生成できる数に制限があるようです。


### 購入レシートに   (Gift)　って書いてあるね、うん

Item
GameMaker Studio 2 Web    (Gift)



## 間違ってギフトの方を買った時に自分で受け取る方法

### ギフトコードはどこに入力するの？
#### ダッシュボードのRedeem
https://help.yoyogames.com/hc/en-us/articles/115002564292-Redeeming-A-GameMaker-Studio-2-Gift-Licence

### 確認する
#### ダッシュボードのProducts
ライセンスが追加されたことを確認する


#### ダッシュボードのDownloads
GameMaker Studio 2を再ダウンロードする必要があるみたいなので、DLしなおす。

以上で、
Trialだって言われずにちゃんと使えるようになった！


### その他
#### ギフトの買い方
https://help.yoyogames.com/hc/en-us/articles/115002548451-Gifting-A-GameMaker-Studio-2-Licence
artisanコマンドを使わずにクラスを作成した際にnot foundになった話

# artisanコマンドを使わずにクラスを作成した際にnot foundになった話

## 背景
  Seederクラス内で共通して定義したい事があったので、`AbstractSeeder`を作成。
  これを`UsersTableSeeder`にextendsでくっつけました。

  ```php:UsersTableSeeder.php
  use App\Database\Seeds\AbstractSeeder;
  class UsersTableSeeder extends AbstractSeeder {
    ・・・処理・・・
  }
  ```

## 事象
  シーディングを実行すると、not found。ふむ。

  ```terminal
  $ php artisan db:seed
  Seeding: UsersTableSeeder
  PHP Fatal error:  Class 'App\Database\Seeds\AbstractSeeder' not found in /hoge/database/seeds/UsersTableSeeder.php on line 5
  Symfony\Component\Debug\Exception\FatalErrorException  : Class 'App\Database\Seeds\AbstractSeeder' not found
  ```

## 解決
  Composerのオートロード機能使ってあげましょう。
  
  ```terminal
  $ composer dump-autoload
  ```

  おしまい。よかったよかった。
ngrokを利用して開発環境をグローバルに公開する

https://www.328.moe/post/ngrok/ のコピーです。

1年前くらいから利用してたんですが、最近また調べてたので
メモ書きとして残す。

ngrokはNATやFW以下にあるローカル環境を、
インターネット越しアクセスが可能にできるサービスです。

開発環境で作成したWebアプリケーションを、
ちょっとだけインターネット越しに誰かに見せたい時とか、
APIの検証でどうしてもグローバルに出さないといけない場合
(例えばTwilioでローカル環境のTwimlを読ませたい時とか)があって
ちょっと見せたいだけなのに、
AWSにインスタンス立て公開するのも少し面倒なので
どうやろうか悩んでいた時にngrokを見つけました。

ngrokはbrewで入れたりできるので導入はすごく簡単です。
v1のときは無料でsubdomainを固定化できたんですが、
v2から有料オプションになっちゃったようで少し残念です。

あとは、扱えるセッション数が限られているので、
2人で同時アクセスしたりすると片方弾かれたりします。
それだけ聞くと不便な感じもしますが、
特定の人にちょっとだけ閲覧できるURLを作成して公開する分にはとても便利です。

インストール方法とか、扱い方とかはいろんなサイトで紹介されてるし
[公式サイトのDocs](https://ngrok.com/docs)にも載ってるので割愛しますが、
ngrokコマンド実行時にregionの指定だけやっておいたほうがいいです。
それか、`~/.ngrok2/ngrok.yml` に記述しておく。

```
$ ngrok http 2280 --region=ap
```
ドキュメントにも書いてあるんだけど、デフォルトはusになっています。
なので、全ての通信がus経由になってしまうため
ngrokから発行されたURLからアクセスするともっさり感すごいです。

ちなみに今は、us, eu, ap, auの4リージョン選べるようです。

あとは、企業ネットワークから使う場合は
ちゃんとセキュリティポリシーの確認をしましょう。
あとでセキュリティチームに怒られる可能性もあります。

あとは、開発環境のデバッガーをうっかり
上げたまま公開するのも注意が必要です。
過去にCakePHPでDebugKitを有効にしたまま公開しちゃって
環境変数に埋め込んだキーを取っ替える作業が
発生したりしたこともあったので気をつけたいところです。
HULFTのデーモン達を起動するスクリプト

```bash
#!/bin/bash

set -eu

PATH=/usr/local/HULFT/bin:$PATH
HULEXEP=/usr/local/HULFT/bin
HULPATH=/usr/local/HULFT/etc
PATH=/usr/local/HULFT/bin:$PATH
TERM=vt100
LANG=ja_JP.eucJP
export HULEXEP
export HULPATH
export PATH
export TERM
export LANG

pgrep hulsndd || hulsndd
pgrep hulrcvd || hulrcvd
pgrep hulobsd || hulobsd
```
Jenkinsのジョブ(プロジェクト)の名前付け規則の提案


# Jenkinsのジョブ(プロジェクト)の名前付け規則の提案

Jenkinsのジョブの名前は大事です。
どれくらい大事かというと、多分プログラムのpublicメソッド名より大事です。

なんでかというと、

* Jenkinsってプログラマ以外も使ったりするから名前で意味が分かってほしい
* っていうか手動でも動かしたりもするんだからわからないと困る
* 名前がJenkinsのUIに直接表示され影響を与える

からです。

で、Jenkinsの名前をどう付けるかはなかなか迷いどころで全然うまくいかないです。
が、ある程度こうするればそこそこよくなるよ…というのはわかってきたのでチョットだけTips的なものを書きます。

主にUIとしての見易さを重視した提案です。

ちなみに、Jenkinsにはフォルダとビューがあるのでちゃんと使いましょう。

# 固めたいジョブは先頭の単語を同じにする

Jenkinsのジョブは並び方がcase insensitiveのabc順になります。
なので固めたいジョブは先頭の単語が一致していれば固まっていくことになります。

ですから例えば

* BuildServer-develop
* BuildServer-staging

にするか

* ServerBuild-develop
* ServerBuild-staging

にするか悩んだときは
Serverなジョブで固めたいかBuildなジョブで固めたいかで決めるといいと思います。
勿論developで固めたいならdevelopが先ですね。

# _より-の方がいい

これ単純にchromeのアドレスバーで-区切りだとそこで一単語になるのに、_だとそうならないからですね。
なのでurlを直接打ち込むようになると少し楽になります。

# 日本語を使うかどうか

手動でビルドする部分については特に非プログラマが使う部分に関しては使ってもいいかも

# フォルダとビューを使え

命名規則でもないんですけれど、**超重要**だと思うので書きます。

フォルダはJenkins2.0からプリセットに入ったジョブのフォルダです。（そのままだけど！）
ジョブとして作成します。
サーバー関連ジョブなんかでまとめたり

* サーバー関連
    * ビルド
    * ドキュメント

のような形でまとめると多分幸せになります。

ちなみにフォルダの名前を変えるとworkspaceも変わるので注意

ビューはそこまでするまででもないジョブをまとめるのが多分いいですかね？
ビューにはいくつかプラグインもあります。

プロジェクトの規模にもよりますがかなり細かくフォルダ分けしちゃってもいいかも？
Heroku 接続先URLを変更する

まずは現状のリモートURLを確認してみる。

```
$ git remote -v 
```

今回はこのリモートURLを変更したいので

```
git remote set-url heroku https://git.heroku.com/〇〇.git
```
〇〇のところが変わってくる。

これが完了したらあとはいつも通りpushできるようになる。
あなたはSQLをどこまで理解している? 文系学生がWhite Christmasに挑戦してみた!!

##はじめ
インターン先でプログラミングを勉強中の文系学生。

「俺ってどれくらいSQLを理解しているんだろう…？」という不安に襲われたため、問題に挑戦してみる。

##SQLとは
###SQLについて
まずはSQLという言葉の確認。
**SQL**とは、**Structured Query Language**のこと。
誰でもリレーショナルデータベースからデータの照会や操作ができるようにするための言語。
リレーショナルデータベースとは、関連のある2次元の票の集合。
Excelの表をイメージすのがわかりやすいか。

###操作
SQLの操作は[SQLBolt](https://sqlbolt.com/)で学ぶのが一番良いと思う。
実際に動かせるのは楽しいし、覚えやすい。
基礎知識をまとめておこう。

``` 
SELECT カラム
FROM データベース名
   INNER JOIN (照会する表の名前)
  ON (今の表名).(カラム)  = (照会する表の名前).(カラム)
　WHERE 条件(=,BETWEEN ~ AND ~,NOT BETWEEN ~ AND ~,
IN ,NOT IN)
　ORDER BY (並び替える基準) ASC/DESC
  LIMIT (表示する数) OFFSET (LIMITの対象外)
```

挿入

```
INSERT INTO テーブル名(カラム)　
VALUES (カラムに対応する値)
```

更新

```
UPDATE  テーブル名(カラム)　
SET (カラム) = (更新する値)
WHERE (更新元)
```

削除

```
DELETE FROM (表の名前)
```

表の作成

```
CREATE TABLE (テーブル名) (
コラム (値の形式)
)
```

表の削除

```
DROP TABLE IF EXISTS (表名)
```

##White Christmas
社員さんからSQLの良い勉強ができるサイトを教えてもらった。
[White Christamas](https://sqlzoo.net/wiki/White_Christmas)というらしい。
たしかに、これは良さそうだ!!

###Days, Months and Years
これは簡単にできた。
`yr`と`dy`が何を示すかさえわかればすぐ解ける。

###preteen Dickens
これもそこまで難しくないね。
年齢に対応する気温を載せれば終わり。

###Minimum Temperature Before Christmas、White Cristmas Count、Climate Change
やることは違うけれど、平均が必要。
でも、何を平均するかさえわかれば、そんなに時間はかからないと思う。
それぞに合った方法で平均のやり方を見つけよう!!

##まとめ
今回はSQLの勉強をしました!!
まぁ、思っていたほど難しくはなかったかな。
SQLはDBを扱うのに欠かせないし、これからも勉強していこう!

##参考資料
[SQLBolt](https://sqlbolt.com/)-https://sqlbolt.com/
[White Christamas](https://sqlzoo.net/wiki/White_Christmas)-https://sqlzoo.net/wiki/White_Christmas
Selenium のサンプル  予約フォーム (python3)

Selenium のサンプルです。

次のページをテストに使いました。
[予約フォーム](http://example.selenium.jp/reserveApp/)

```py:reserve_form.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	reserve_form.py
#
#					Sep/21/2018
#
# ------------------------------------------------------------------
import sys
from selenium.webdriver import Firefox

# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

url = 'http://example.selenium.jp/reserveApp/'

browser = Firefox()
browser.get(url)
#
browser.find_element_by_id('reserve_month').clear()
browser.find_element_by_id('reserve_month').send_keys("10")
browser.find_element_by_id('reserve_day').clear()
browser.find_element_by_id('reserve_day').send_keys("10")
browser.find_element_by_id('reserve_term').clear()
browser.find_element_by_id('reserve_term').send_keys("3")
browser.find_element_by_id('headcount').clear()
browser.find_element_by_id('headcount').send_keys("2")
#
str_select = "input[type='radio'][name='bf'][value='off']"
item=browser.find_elements_by_css_selector(str_select)[0]
item.click()
#
str_select = "input[type='checkbox'][id='plan_b']"
item=browser.find_elements_by_css_selector(str_select)[0]
item.click()
#
browser.find_element_by_id('guestname').clear()
browser.find_element_by_id('guestname').send_keys("明智小五郎")
#
browser.find_element_by_id('goto_next').click()
#
sys.stderr.write("*** 終了 ***\n")
#
# ------------------------------------------------------------------
```

実行方法

```bash
./reserve_form.py
```
contenteditable within progress 

```html
<div class="f rel">
 <div class="rel" contenteditable="plaintext-only"></div>
 <progress class="abs rt" value="1" max="10"></progress>  
</div>
```
```scss
.rel{position:relative}
.abs{position:absolute}
.f{background-color:aliceblue;width:44rem;min-height:6rem}
.f>*{width:100%}
.f>progress{top:0;height:3px;}
.f>[contenteditable]{outline:none;padding:0.4rem;height:auto}
/*prefix chrome only*/
@mixin progress(){
 progress{-webkit-appearance: none;appearance: none;}
 progress::-webkit-progress-bar{background:#0a2133;}
 progress[value]::-webkit-progress-value {background:#961241;transition:all 0.2s linear}
 progress{width:100%;height:3px;}
 progress:after{content:attr(value)'/'attr(max);position:absolute;}
;
}@include progress()
;
/*local*/
progress.rt:after{top:0;right:0;} 
```
```js
let fn={}
fn.q=(d=>document.querySelector(d))
;
fn.q('[contenteditable]').oninput =function(ev){
 fn.q('.f>progress').value=this.innerHTML.split('\n').length||1
}
;
```
ALBで開閉局

#AWSでオンプレで時間で実行していたWEBの開閉局をしたい
オンプレでは負荷分散装置にコマンド実行して開閉局していた（例：8：00開局　22：00閉局、閉局以降はSorryサーバへ）
同じことをAWSでやってみたい。
→ALBならできそう

-ALBのターゲットグループを2つつくる

-ルールでターゲットグループ2つを同じパスで設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245869/55585342-52f2-72c5-2500-67d83b4d1cdc.png)


-コマンドでルールのPriorityを切り替える

上げる

```
aws elbv2 set-rule-priorities ----rule-priorities RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxxx:listener-rule/app/test-alb/4f5a94a89exxxxxx/9244436cecxxxxxx/2aff9175ddxxxxxx,Priority=1
```
下げる

```
aws elbv2 set-rule-priorities ----rule-priorities RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxxx:listener-rule/app/test-alb/4f5a94a89exxxxxx/9244436cecxxxxxx/2aff9175ddxxxxxx,Priority=５
```

でできたみたいに見える
priorityの設定は適当に大きい数字を設定すると空いている次の値になった（下げるときに５としているが実際は２になった)
nginx+uwsgi+Djangoでアップロードしたファイルを閲覧しようとした時に403 Forbiddenとなった話

# 現象
稼働中のシステムでDjangoのバージョンを上げたとたんに標題の現象が発生。具体的には、Djangoで構築したシステムからファイルをアップロードした後、システムからそのファイルを閲覧しようとした際に「403 Forbidden」が表示されてファイルが閲覧できない事象が発生した。


# 環境
* Ubuntu 16.04
* nginx
* uwsgi
* python 3.5
* Django 1.11.11

# 動作条件
* nginx workerプロセスはwww-data:www-data
* uwsgiプロセスはroot:root
* それぞれのプロセスはdockerコンテナ上で動作

# 経緯とかどうでもいいから結論を教えて！
Djangoのsettingsに下記の設定を追加しましょう。
```FILE_UPLOAD_PERMISSIONS = 0o644```

# 現象の調査

アップロードされたファイルの権限を確認してみると次のことがわかりました。

* 今まではアップロードされたファイルのowner:groupはwww-data:www-dataであったがDjangoのバージョンを上げるとroot:rootでアップロードされるようになった。
* ファイルサイズが小さい場合はファイルの権限が0644でアップロードされるが、サイズが大きい（数MB）場合にはファイル権限が0600でアップロードされてしまう。

つまり、サイズが大きいファイルだと権限がroot:rootの0600で保存されるので、当該ファイルにnginxからアクセスしようとするとwww-data権限でアクセスを試みて「403 Forbidden」となってしまうということでした。

# 対応策の調査

https://stackoverflow.com/questions/44770938/403-error-with-large-media-files-on-django-server-running-nginx

調べてみるとDjangoの設定でなんとかなりそうなことが分かりました。

https://docs.djangoproject.com/en/1.11/ref/settings/#file-upload-max-memory-size

DjangoのドキュメントによるとFILE_UPLOAD_MAX_MEMORY_SIZEのデフォルト値2.5MBを超えるファイルがアップロードされると、アップロード処理中はFILE_UPLOAD_TEMP_DIRで設定されたディレクトリ（私の環境の場合は/tmp/）へ一時的にファイルが保存される。この時にファイルの権限が0600(ここの振る舞いはOS依存)になってしまうとのことでした。つまり勝手に0600にならないようにアップロードファイルの権限をDjango側で指定すればよいということですね。

# 結論

ということで結論です。

Djangoのsettingsに下記の設定を追加しましょう。
```FILE_UPLOAD_PERMISSIONS = 0o644```

これでアップロードされたファイルにowner以外へのRead権限が与えられるのでファイル閲覧時に「403 Forbidden」とはなりません。


# 残る疑問

アップロードされるファイルのowner:groupがwww-data:www-dataからroot:rootに変わった原因は未だ不明です。
C++ Builder 10.2 Tokyo > インストール > 機能を追加

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1709
RAD Studio 10.2 Tokyo Update 3
```

RAD Studio 10.2 Tokyo Update 3のインストール時にTeeChart Standardをインストールしていなかった。

インストール済の状態から追加でインストールするにはどうするか。

[機能インストーラ @ http://docwiki.embarcadero.com](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E6%A9%9F%E8%83%BD%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9)

> 機能インストーラをうっかり閉じてしまった場合には、RAD Studio を開き、ツール > プラットフォームの管理を選択して、もう一度、機能インストーラを開いてください。

表示される機能インストーラから追加できる。
SVNがわかるけどGitがわからないし長い文章は読みたくない人が、Gitの初歩を一発で理解するポイント

# 困っていたこと
過去にSubversionを使用していたが、
Gitの意味がよくわからなかった。

しかし、思想がつかめれば理解するのは一瞬だった。そしてGitの仕組みに感動。興味さえ湧けば、後は適宜調べるだけ。

このキジはSVNがなんとなくわかる人向けのGitの初歩。

## まずは図で理解
### 分散管理です。

Gitは他のソース管理（通常は集中管理）と違い、分散管理を採用しています。それで大事なことは「サーバーが壊れても、ローカルに全履歴がコピーされている。」ということ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235255/cba40f16-0d4d-c5f1-2ec1-1ca0f2418d11.png)
画像をお借りした元の場所:[git 分散バージョン管理システム](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6)

つまり・・・

- サーバーが逝っても、誰かのPCが生きてりゃOK！
- 誰かが自分のPCとサーバーのソース消しても、他に誰か居ればOK！
- ネットワークが使えなくても、自分のPC上でコミットできる！


## コマンドを理解するための対訳表

色々コマンドがあるが、初歩に必要なコマンドでさえ、ピンとこなかった。
でも、人間語に翻訳してみたら、理解できた

### リポジトリを作成する

```bash
$ git init
```
ギット exeに命令 カレントディレクトリをgitのリポジトリにするよ！

- このリポジトリは、.gitフォルダが作成され、親ディレクトリごと移動しても、特に問題ない。
- このディレクトリがいわゆるプロジェクトフォルダとなる。

### ファイルを管理対象にする

```bash
$ git add [filename]
```
ギット exeに命令 追加するよ ファイル名はこれ！

- ディレクトリ内部にファイルが作成されただけだと、ただそこにあるだけで対象とならない。
- そのファイルをGitの管理対象にする。
- 管理対象にすると、変更を検知する。
- 管理対象にすることを、インデックスに追加すると云ふのかと思ったら、違うらしい

### コミットする。

```bash
git commit -m “[comment]”
```
ギット exeに命令 確定するよ 変更内容はこう！

- 管理対象のファイルに行われた変更を確定し、自分のローカルリポジトリ内にスナップショットを保存する。
- なるべく細かくコミットすると、後で戻りやすいし、変更が理解（思い出し）しやすい。

### リモートリポジトリを追加する。

```bash
> git remote add origin hogehoge.com/git/hogehoge.git
```

ギット exeに命令 リモート を追加 originと呼ぶ 場所はここだよ

- 自分のローカルリポジトリを変更したり、コミットしただけでは、特にリモートリポジトリには影響がない。
- 通常はリモートリポジトリにoriginと言う名前を付ける。（慣習）

## 覚えておく用語

### リポジトリ
repository = 倉庫

- リモート（通常ベア）とローカル（通常ノンベア）で2種類ある。

### ワークツリー
work tree = 作業する木

- ソースコードなどの実際に作業するファイルが置いてある場所

### ブランチについて
branch = 枝

- 枝分かれさせる場合はブランチ（＝枝）を作り、任意の名前を決められる。
- 本流のブランチ名はmasterと言う名前。（デフォルト）


### プッシュ
push = 押す、押し込む、押し付ける

- ローカルの変更を、リモートに反映（押しつける）

### フェッチ
fetch = 取ってくる、呼んでくる、引き出す

- リモートの変更を、ローカルに取得（引き出す）


### マージ
merge = 併合する、溶け合わせる、合併する

- 異なるブランチを合体する。

### クローン
clone = クローン、分枝系

- リモートリポジトリをコピってローカルリポジトリを作る
- OSSをもらってきたり、プロジェクトに途中から参加する場合は、最初にやる


## 参考
[Git日本語公式マニュアル](https://git-scm.com/book/ja/v2)
[Git 基本の用語集](https://qiita.com/toshi_um/items/72c9d929a600323b2e77)