OmniAICreator/Qiita-1.07M huggingface dataset:
PHPのエラー処理ライブラリがついていなくとも、標準関数でエラーログを出力しよう。


# よくある例

```php
try {
	// いろいろ処理
} catch (Exception $e) {
	// エラーだったらとりあえずリダイレクトじゃい
	return $this->redirect(~);
}
```

上記のように、エラーをキャッチしてもログを出力せずに `TODO:エラーログを吐く` とか書かれてたりしますよね。  
解決するには、ちゃんとエラーログを吐け！って話なのですがどうやって吐くのかわからないからTODOで済ませてるのかなと感じます。

一番良いのはフレームワークに搭載されているLoggerを利用するというのが一番良いのですが、
Loggerがちゃんと整備されてないとなると難しいことになります。(monolog突っ込む？でも入れ方が・・・)

実は、PHPには標準でエラーログを吐く関数があるんです・・・！

# 標準関数error_logでログを吐かせよう

PHPのエラーログの関数はerror_logという名前の関数です。非常にわかりやすい。

```php
try {
	// いろいろ処理
} catch (Exception $e) {
	// エラーログを吐く
	error_log($e->getMessage());
	return $this->redirect(~);
}
```

まずはerror_log関数から始めて、monologに移行する準備をすると良いでしょう。
なお、error_log関数は文字列しか受け付けないのでちゃんと変換しておく必要があります。

## 余談(なぜ吐かせるべきか)

単純な話で言えば、デバッグしやすくするためです。これが一番いきるのは例外を内部で握りつぶしてfalseなどのbool値として返す時です。

Phalconでこれはありましたが、ORMを利用してリレーションも組んでいた状態でデータを取得してupdateメソッドを実行しました。(ここを探すのも苦労します)
データは取得できたのに、何故かupdateメソッドが失敗(false)します。

原因はリレーションをしているカラムが存在しなかったためエラーになってました。(Phalconが問題を握りつぶしてfalseを返してたのがそもそもの問題ですが)
updateメソッドの後に失敗した時にgetMessagesメソッドを利用してエラー内容をログに吐いていなかったため見つけることが難しい事態になっていました。

このような事態を起こさないためにもエラーログを出力する関数と、エラーメッセージを取得するメソッドを活用して記述をしましょう。
【第1回】Vuex公式ドキュメントを学んでみる〜Vuexとは？〜

# この記事のレベル感
・Vue.jsを使ったWeb開発やアプリを作ったことはあるけどは、Vuexのドキュメントを読んだり、実務で使っていない人

# Vuexとは？
Vue.jsのための状態管理ライブラリです。
一つの巨大なstateを元にビューを表示し、actionsを通じてstateに変更を加え、viewを更新します。
以上のような状態管理パターンを実装することが可能です。


## Vue.jsアプリの状態管理パターン+ライブラリ
Vue.jsでアプリ開発をする際に様々なコンポーネントを扱うかと思いますが、そのコンポーネントの状態を集中管理するのがVuexの**ストア**となります。
公式ドキュメントにも紹介されていますが、[Vue.js devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd)というChromeの拡張機能を導入することで、容易にデバッグやスナップショットを管理することができます。

## 状態管理パターンとは？
イメージしやすいように、例を挙げます。

### 例1:Vuexによる状態管理

```html
<div id="app"></div>
```

```js
new Vue({
	el: '#app',
  // state
  data () {
    return {
      count: 0
    }
  },
  // view
  template: `
    <div>
    	{{ count }}
    	<input type="submit" value="カウントアップ" @click="increment">
      <input type="reset" value="リセット" @click="reset">
    </div>
  `,
  // actions
  methods: {
    increment () {
      this.count++
    },
    reset () {
    	this.count = 0;
    }
  }
})
```

[例1:Vuexによる状態管理](https://jsfiddle.net/watsuyo_2/owt0qe49/)


上記の例では
* state(状態)
* view
* actions

と、3つの要素を含んでいます。

### state(状態)
アプリを構成するコンポーネントの状態を集中管理する源
### view
その名の通り、ビュー
状態を表現します

### actions
viewからの入力に対するリアクションをし、状態を変更します

これらをまとめて**単方向データフロー**といいます。

## Vuexは複数のコンポーネントの状態管理をする際に役立つ
Vue.jsでアプリ開発をしていると、一つのコンポーネントだけではなく複数のコンポーネントを持つようになります。
その際のデメリットは
* 同じstateに依存する事がある(propsの深い入れ子等)
→コンポーネントの共有情報を**グローバルに管理**し、どのコンポーネントからもアクセスしやすくなる

* 複数のViewからのアクションで同じstateを変更する必要がある
→状態管理の概念を定義、コンポーネントと分離することで保守性が上がる


# 感想
Vuexの概念だけでもかなりボリュームがある…

次回はVuexのstoreについて勉強します！

※フィードバックお待ちしております。
ksnctf 28 Lo-Tech Cipher 60pt

#問題

https://ksnctf.sweetduet.info/problem/28

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6c3ebf08-4709-2eae-7cc3-5a8b3c12c2f1.png)

#解いてみた

zipファイルをダウンロードします。
zipを解凍すると画像ファイルが2枚ありました。
どちらも似たようなものです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/9793d127-8494-6ef3-9d57-7b38c319b0d5.png)

砂嵐的な謎の画像が2枚。
重ねたら文字出てくるやつかな？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/24e23383-d156-be60-2433-3d0ffdd0a513.png)

若干見ずらいですが、出てきました。
しかし、flagではなく文字。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a749fb66-383a-9725-610d-bbec02e25123.png)

とのこと。
zipの中に削除データ入れたりできないし、どういうことなんでしょう。
とりあえずBZで見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/5110cfe5-9166-219d-ba2a-e7c06335816e.png)


なぜか、先頭がPKじゃない。ZIPは普通PKから始まるはず。
むしろPNGから始まってるから、このZIPファイル自体がPNGファイル？
いやでも解凍できたよ？

「PK」で検索してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/024a3504-932f-f765-eada-c16b9a731730.png)

途中にある！
そかもその直前の「IENDｮB`」はPNGの最後に書かれるやつ。
ということはPNGファイルとZIPファイルをくっつけたファイルということでしょうか？
拡張子をPNGにしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/281aa657-e712-28b2-acbc-713430da9de2.png)

表示できました。
PNGファイルは終了処理のあとに何が書かれていても無視するということですかね。
ステガノグラフィ的な。

これも重ねます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/2029551f-1c5c-acb8-00cf-a7cdfea544c3.png)

できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e815ef2e-26df-9aca-f0e9-44168e890d89.png)
Netlify で Next.js のアプリケーションをデプロイする際の注意点

Reactのフレームワーク[Next.js](https://github.com/zeit/next.js/)で作成されたアプリケーションは、同じくZEITが提供している[Now](https://zeit.co/now)でデプロイすることが一般的なようです。
他方で、GitHub PagesやNetlifyのような、汎用的な静的サイトホスティングサービスを使ってデプロイしたい場合もあるでしょう。
これまで`create-react-app`コマンドによる雛形をもとにReactで書きNetlifyにホスティングしていた自分のウェブサイトを、今回Next.jsのフレームで書き直してみたのですが、Next.jsに関してはそもそも日本語の記事が少ないこともあり、気をつけた方がよいと感じた初歩的なポイントをメモしておこうと思いました。

## ビルドコマンドの指定は正しく

https://github.com/zeit/next.js/#usage にあるように、本番環境では

```
next build
next export
```

この2つのコマンドでデプロイします。これを一つのコマンドとして、 `npm run deploy` で実行できるように、`package.json`の`scripts`に

```json
"scripts": {
  "dev": "next",
  "build": "next build",
  "export": "next export",
  "deploy": "npm run build && npm run export"
}
```

という風にコマンドを追加しておきましょう。さらに、生成されるページの中身はデフォルトでは`out`というディレクトリの中に作成されることにも注意して、Netlifyの初期設定画面で、"Build command" を`npm run deploy`に、 "Publish directory" を`out`にしておきましょう。

以上と同様のことが https://www.sanity.io/blog/tutorial-host-your-sanity-based-next-js-project-on-netlify の1.と3.に、より詳しく記述されています。

## リダイレクト設定は netlify.toml に書ける

SPAサイトを netlify にデプロイする際は、

```:_redirects
/*   /index.html   200
```

を本番環境の直下に置くことで、ページの再読み込みで404になってしまうような現象を回避できます。（https://www.netlify.com/docs/redirects/ の "HISTORY PUSHSTATE AND SINGLE PAGE APPS" や https://crieit.net/posts/Netlify-404 などを参照）
ただ、`npm run deploy`で生成される`out`ディレクトリの中に`_redirects`は含まれず、あらかじめ用意しても上書きされてしまいます。そこで、元のディレクトリの直下（`package.json`などと同じ階層）に `netlify.toml` を用意して、

```toml:netlify.toml
[[redirects]]
  from = "/*"
  to = "/index.html"
  status = 200
```

などと記述しておけば、同じ効果が得られます。
`netlify.toml` には他にも様々な設定を含めることができるので、何か設定を行いたい場合はhttps://www.netlify.com/docs/netlify-toml-reference/ を見ておくと良さそうです。

## 現在のNext.jsの安定版（Next 7）では404ページのカスタマイズ設定で注意が必要

現在の Next 7 では、デフォルトでは、例えば `pages/hoge.js` を用意した場合には `/hoge/index.html` が生成されます。オリジナルの404エラー画面に関しても `pages/_error.js` を用意するのですが、これが `/404/index.html` という階層関係でhtmlを生成してしまいます。Netlify、あるいはGitHub Pagesでは、**本番環境直下に`404.html`を置かないと正しくオリジナルの404エラー画面を出せません。**
この問題は

[Export 404.html when running \`next export\` without \`exportPathMap\` #5035](https://github.com/zeit/next.js/issues/5035)

で指摘され、

[fix: update correct path to use when exporting 404 page #5470](https://github.com/zeit/next.js/pull/5470)

で解決したようなので、近い将来の Next 8 では問題にならなくなるでしょう。ただ現状では `npm install --save next@^8.0.0-canary.7` などと次期予定バージョンを指定してあげる必要があります。
あるいは（私は試せていませんが） https://github.com/zeit/next.js/#copying-custom-files にあるように、デフォルトの `defaultPathMap` を修正して、 `exportPathMap` を新たに定義させることで、現在の安定版でもうまく `404.html` を置けるかもしれません。
Ruby on Railsチュートリアル（３～４日目）

# 振り返り

前回は、実際にRails上でHello Worldまで出力してブラウザに表示するところまで行いました。
今回は主に**Heroku**について書きます。

### Herokuとは

様々な言語に対応したデプロイ環境をPaaS(Platform as a Service)で提供するサービスです。
自前でサーバとかOS設定とかしなくても、ネット経由で提供してくれます。

[公式サイト](https://jp.heroku.com/)

チュートリアルでは、HerokuのCLIをインストールし
コマンドを実行することで、Webアプリをデプロイするというわけです。

また、RailsはGemFileを使ってバージョン管理もしていますから
誰でも同じ環境が作れるわけです。（一つ一つオンプレでインスコしてた時代が懐かしい）

### インストール

様々なやり方があるみたいですが、とりあえずチュートリアルに沿って

```
source <(curl -sL https://cdn.learnenough.com/heroku_install)
```


### 使ってみる

ログインをしてみます

```
heroku login
```

<img width="600" alt="cavgfsbhj.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/341731/8dee7cb6-5598-e0fe-f0d7-972a01a5a63a.png">

あれ、キーを押したら、固まったぞ…

調べてみると、メッセージみると「--interactive」オプションつけてって書いてあるので

```
heroku login --interactive
```

<img width="600" alt="fcdafdafsda.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/341731/4c639b3c-efec-0157-c7d8-5446ad8df096.png">

無事ログイン画面が出ました。
IDとパスワードを入力して、ログインしたら、デプロイする場所を作ります

```
heroku create
```

<img width="600" alt="cghjhgfbdfsb.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/341731/40cef066-af27-affc-194d-eef596ca324e.png">

出力されたURLをクリックしてOPENを押すと…

<img width="641" alt="cqfrgagasgfsa.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/341731/9612acb1-a072-57a0-3036-73a082537d6c.png">

まだデプロイしてないのでデフォルトですが、デプロイする場所が表示されます。
デプロイしてもう一度URLを開くと。

<img width="368" alt="dasvasfdsa.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/341731/0c64c305-1431-1099-6aff-894dc199d15f.png">

無事表示されました！

### 終わりに

ゆっくりですが、1章終わりました。
Herokuはホント便利そうです。
次は2章に取り掛かります。設計まではやりたいですね。
AtCoderでアロー関数を利用したときは'use strict'を利用する

[A - はじめてのあっとこーだー（Welcome to AtCoder）](https://atcoder.jp/contests/practice/tasks/practice_1)で早速詰まったのでメモ。

## 失敗したコード

```javascript
let sum = array => {
  return parseInt(array[0]) + parseInt(array[1]);
};

function Main(input) {
  input = input.split('\n');
  const tmp = input[1].split(' ');
  const a = +input[0];
  const b = sum(tmp);
  const s = input[2];
  //出力
  console.log(`${a + b} ${s}`);
}
Main(require('fs').readFileSync('/dev/stdin', 'utf8'));
```

ある処理をアロー関数にまとめて、テスト実行したところ次のようなエラーになった。

```
/imojudge/Main.js:2
let sum = array => {
^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:387:25)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:148:18)
    at node.js:405:3
```

[【node.js】npmで SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode というエラーで怒られる](http://tweeeety.hateblo.jp/entry/2018/06/08/181307)を参考にしたところ、 

> githubのissueにあがってました
> 
> > Version 0.7.0 of source-map fails to load on Node < 6 due to let without 'use strict'. This causes the following error:
> > 
> > https://github.com/gulp-sourcemaps/gulp-sourcemaps/issues/343
> 
> node moduleのsource-map 0.7.0は
> 'use strict'を使用しないのでnodeのversion<6（6未満）にはロードできないらしい。
> そのせいでエラーが発生するとのこと。

なのでソースの先頭に'use strict'をつけてから実行したところ、成功した。

## 成功したコード

```javascript
'use strict'
let sum = array => {
  return parseInt(array[0]) + parseInt(array[1]);
};

function Main(input) {
  input = input.split('\n');
  const tmp = input[1].split(' ');
  const a = +input[0];
  const b = sum(tmp);
  const s = input[2];
  //出力
  console.log(`${a + b} ${s}`);
}
Main(require('fs').readFileSync('/dev/stdin', 'utf8'));
```

ES2015の学習がてらAtCoderをやろうとしていたので、せっかくなら今風の書き方を覚えておきたいところ。
faker.jsとjson-serverを組み合わせる（いちばん）シンプルな方法

[json-server](https://github.com/typicode/json-server) 便利ですよね。
よく知らないですがほぼexpressらしく、柔軟に色々設定もできるとか。

だからやり方はたくさんあるんでしょうけど、全く設定せずにダミーデータ入りのサーバを建てられたらそれはそれで便利じゃないですか。
json-server の [READMEにある方法](https://github.com/typicode/json-server#generate-random-data) に倣うのが一番シンプルだと思います。

## 準備

```bash
yarn init -y
yarn add faker json-server
```

寄り道ですが、ここで [db.json を作成](https://github.com/typicode/json-server#getting-started) すればサーバを立ち上げられます。

```json:db.json
{
  "posts": [
    { "id": 1, "title": "json-server", "author": "typicode" }
  ],
  "comments": [
    { "id": 1, "body": "some comment", "postId": 1 }
  ],
  "profile": { "name": "typicode" }
}
```

```bash
yarn json-server db.json
```

この時点で http://localhost:3000/ にアクセスすればいい感じに案内してくれます。
でも違いますよね。本当は faker 使いたいんですよね。

## json-server に js ファイルを指定する

js ファイルを json-server に読ませれば良いです。
一応繰り返しときますが、基本的には [公式 README のやり方](https://github.com/typicode/json-server#generate-random-data) に倣ってます。

以下ちょっと長くなっちゃいましたけど、 js オブジェクトを返す関数をエクスポートしてるだけです。
あと、 faker の API は [このリンク先参照](https://github.com/marak/Faker.js/#api-methods)。

```js:fakedb.js
const faker = require('faker');

// レコード数を決めておく
const NUM_OF_USERS = 10;
const NUM_OF_POSTS = 50;

module.exports = () => {
  const data = { users: [], posts: [] };

  // Create users
  for (let i = 0; i < NUM_OF_USERS; i++) {
    data.users.push({
      id: i,
      name: faker.name.findName()
    });
  }

  // Create posts
  for (let i = 0; i < NUM_OF_POSTS; i++) {
    data.posts.push({
      id: i,
      text: faker.lorem.text(),
      // userIdの書き方で指定すればuserと関連づけてくれる
      // 今回はユーザIDの範囲内 （0 .. (numOfUsers - 1)） でランダム
      userId: Math.floor(Math.random() * Math.floor(NUM_OF_USERS))
    });
  }

  return data;
};

```

あとは実行してやるだけ！

```bash
yarn json-server fakedb.js
```

http://localhost:3000
<img width="477" alt="スクリーンショット 2019-01-18 21.17.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/343171/3c5fe793-64f8-04ab-7a48-ad775d1186bc.png">

たくさんできました！（控えめ）
関連付けもできてます。
http://localhost:3000/users/2/posts

```json
[
  {
    "id": 20,
    "text": "Autem aperiam sed.",
    "userId": 2
  },
  {
    "id": 22,
    "text": "voluptatum",
    "userId": 2
  },
  {
    "id": 23,
    "text": "placeat quam temporibus",
    "userId": 2
  },
  {
    "id": 37,
    "text": "Ratione veritatis commodi et.\nSit voluptas quo harum minima atque dignissimos.\nCum voluptatum consequatur unde officia cupiditate.\nSoluta nulla expedita harum blanditiis.\nQuibusdam alias eveniet deserunt eum assumenda qui commodi dolor.",
    "userId": 2
  },
  {
    "id": 43,
    "text": "Non architecto ut.",
    "userId": 2
  }
]
```

## snapshotをとる

でも、json を DB にできた方が便利なこともありますよね。
大丈夫です！ サーバを立ち上げた時のメッセージを見てください！

```
Type s + enter at any time to create a snapshot of the database
```

そういうことです。

```bash:サーバが立ち上がってるコンソールで
s[enter押下]
# => Saved snapshot to db-1547814382537.json
```

現在のDBの内容が json ファイルとして保存されました。
今度はそのファイルを指定して json-server を起動できます。

わかりやすいファイル名に変更しても良いですが、今回はそのままコピー＆ペーストを活用して

```bash
yarn json-server db-1547814382537.json
```

これで POST も PATCH もこのファイルに反映されるようになりました。
ファイルを直接編集することもできます。
bundle install で pg 0.18.4 のinstallが上手くいかない時

別環境からgithub cloneをして

```terminal
$ bundle install
```

を実行した時以下のエラーが出た。

```terminal
Fetching pg 0.18.4
Installing pg 0.18.4 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
***省略***
An error occurred while installing pg (0.18.4), and Bundler cannot
continue.
Make sure that `gem install pg -v '0.18.4' --source 'https://rubygems.org/'`
succeeds before bundling.
```

調べたところpostgreをインストールすればいいらしい
なんでかはよくわかってないです。（すみません）
なので以下のコマンドを実行

```terminal
brew install postgresql
```

もう一度

```terminal
bundle install
```

でうまくいった。


## 追記
上記でもうまくいかなかった時以下ならできた。

```terminal
ARCHFLAGS="-arch x86_64" gem install pg -v '0.17.1' 
```
【対処法】vbguest実行時のError getting repository data for C7.6.1810-base, repository not found

最近Vagrantで新しい仮想環境を立てた際に遭遇したエラー。
どうやらvbguest(0.17.1)を使っている場合に発生することがあるっぽい？

# Error発生時の状況

- VirtualBox: 5.2.24
- Vagrant: 2.2.2 
- vbguest: 0.17.1
- CentOS: bento/centos-7.1

いつものように`vagrant init`後、共有フォルダ設定のために以下を実行（vagrantのvbguestプラグインで、VirtualBoxのバージョンとBoxのGuest Additionsのバージョンを合わせる）。

```
$ vagrant ssh
$ sudo yum install kernel-devel
$ sudo yum install gcc make
$ exit

$ vagrant plugin install vagrant-vbguest
$ vagrant vbguest
```

すると、何やらエラーが吐かれました。
（ログ取り忘れのため一部のみ・・・すいません＞＜）

```
Error getting repository data for C7.6.1810-base, repository not found
```

初めて遭遇するエラー・・・レポジトリが見つからないってことはわかりますが・・・。
ということでGoogle先生にお願いしました。

# 解決策
調べてみると、

[minidcos vagrant: Error getting repository data for C7.6.1810-base, repository not found](https://jira.mesosphere.com/browse/DCOS_OSS-4686)

> Comparing the vault mirror URLs, it doesn't look like 7.6.1810 is even released yet:
>http://vault.centos.org/7.5.1804/os/
>http://vault.centos.org/7.6.1810/os/

どうやらCentOS 7.6.1810はまだリリースされてないっていうことらしい。
そりゃレポジトリが見つからないわけだ・・・。

最終的に以下のページを参考にして解決することができました。

[Broken installation on CentOS 6.10](https://github.com/dotless-de/vagrant-vbguest/issues/320#issuecomment-454876740)

vbguestがGuest Additionsをビルドする際に用いるcentos.rbというソースを書き換えると上手くいくようです。

```
vi ~/.vagrant.d/gems/2.4.4/gems/vagrant-vbguest-0.17.1/lib/vagrant-vbguest/installers/centos.rb
```

```ruby:centos.rb
# - -> 消去する
# + ->　　書き加える
       def install_kernel_devel(opts=nil, &block)
         rel = release_version
-        cmd = "yum install -y kernel-devel-`uname -r` --enablerepo=C#{rel}-base --enablerepo=C#{rel}-updates"
+        # cmd = "yum install -y kernel-devel-`uname -r` --enablerepo=C#{rel}-base --enablerepo=C#{rel}-updates"
+        cmd = "yum install -y kernel-devel-`uname -r` --enablerepo=C*-base --enablerepo=C*-updates"
         communicate.sudo(cmd, opts, &block)
       end
```

`:wq`で保存後、一旦`$ vagrant exit`して再び`$ vagrant vbguest`を実行したら、今度は問題無くGuest Additionsがビルドされ、無事共有フォルダがマウントされました。
めでたしめでたし。
ReactNativeでAndroidのプッシュ通知アイコンを設定

[react-native-push-notification](https://github.com/zo0r/react-native-push-notification)を使ってリモートのプッシュ通知を実装しているのですが、Android側のプッシュ通知アイコンが`ic_notification.png`ではなく`ic_launcher.png`から読み込まれてしまい困っていました。

`ic_notification.png`は全て`drawable`ではなく`mipmap`配下にしているのに、、と調べていたところ、

[ここのやり方](https://github.com/zo0r/react-native-push-notification/issues/730#issuecomment-431786902)に従って、`AndroidManifest`に以下を追記することで解決しました。


```xml
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@mipmap/ic_notification" />
```
bundle install で nokogiri 1.8.2 のinstallが上手くいかない時

別環境からgithub cloneをして

```terminal
$ bundle install
```

を実行した時以下のエラーが出た。

```terminal
Fetching nokogiri 1.8.2
Installing nokogiri 1.8.2 with native extensions
Errno::EACCES: Permission denied @ dir_s_mkdir -
/Users/***/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/extensions/x86_64-darwin-17/2.4.0-static/nokogiri-1.8.2
An error occurred while installing nokogiri (1.8.2), and Bundler
cannot continue.
Make sure that `gem install nokogiri -v '1.8.2' --source
'https://rubygems.org/'` succeeds before bundling.
```

調べたところ
/Users/***/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/extensions/
以下ファイルの権限がrootでなくユーザー名にしなければいけないみたい。

なので以下のコマンドを実行(-Rは以下ファイルを再帰的に権限変更)

```terminal
sudo chown -R ***  /Users/***/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/extensions
```

もう一度

```terminal
bundle install
```

でうまくいった。
正規表現リテラル(又はオブジェクト)をRegExpのコンストラクタに渡す時のフラグの扱い

case insensitiveなvalidation check用に用意していた正規表現リテラルを使ってglobalなreplaceをしたくなることが稀によくあります。

```
const re = /hoge/i;
.
.
.
re.test(str);
・
・
・
str2.replace(new RegExp(re, "g"), "huga");
```

こちらの記事にあるように、かつてはRegExpのコンストラクタにRegExpを渡すとエラーになっていたので、そもそも再利用はできなかったようです。

https://qiita.com/YusukeHirao/items/87a3534258825e87b605

しかし、MDNにしれっと書かれてるように、ES6以降ではRegExpのコンストラクタは第一引数にRegExpを受け取ってくれるようです。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp

> ECMAScript 6 より、第 1 引数が RegExp で第 2 引数に flags を指定する場合 (new RegExp(/ab+c/, 'i')) に TypeError が発生しません。代わりに、引数を元に新たな RegExp を生成します。


で、この場合最初のリテラルで指定したフラグと、後のコンストラクタに渡したフラグが違う時はどうなんのよ？っていうのを調べてみました。

# 実験環境
- windows 10
- node v8.12.0

# 実験結果
```
>node
> const re = /hoge/i
undefined
> const re2 = new RegExp("hoge", "i");
undefined

#re, re2ともにcase insensitiveな"hoge"にマッチするので"HOGE"が"huga"に置換される
> "HOGE hoge".replace(re, "huga");
'huga hoge'
> "HOGE hoge".replace(re2, "huga");
'huga hoge'

#"g"をつけて全体をreplaceしようとしても、"HOGE"は無視されて"hoge"だけ置換される
> "HOGE hoge".replace(new RegExp(re,"g"), "huga");
'HOGE huga'
> "HOGE hoge".replace(new RegExp(re2,"g"), "huga");
'HOGE huga'

#"gi"にすれば両方置換される
> "HOGE hoge".replace(new RegExp(re2,"gi"), "huga");
'huga huga'
> "HOGE hoge".replace(new RegExp(re,"gi"), "huga");
'huga huga'
```

# まとめ
たまたま手元にあった環境で調べただけですが、リテラルだろうが正規表現オブジェクトだろうが、コンストラクタの第一引数に渡すと指定していたフラグは無かったことになるようなので、再指定が必要なようです。

おそらく、sourceプロパティの値を使ってるんでしょうね。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source
vue-cliでLodashのdebounceを使う方法

# やりたかったこと
![debounce_2.gif](https://qiita-image-store.s3.amazonaws.com/0/310998/f71786fa-907a-4852-61a1-717846d59f50.gif)


vue.js (vue-cli) で作っているSPAで、textareaが編集されたら最後の編集から数秒後に保存の処理を実行する。

---

『基礎から学ぶVue.js (通称「猫本」)』を見てみると、Lodashのdebounceを使うと実現できるとのこと。
[>基礎から学ぶVue.js - サポートページ](https://cr-vue.mio3io.com/guide/chapter4.html#%E5%AE%9F%E8%A1%8C%E9%A0%BB%E5%BA%A6%E3%81%AE%E5%88%B6%E5%BE%A1)

こちらを参考にvue-cliで実現した方法をまとめます。

## Lodashをnpmでインストールする

[Lodash公式ページ](https://lodash.com/)に書いてあるコマンドを実行します。

```
$ npm i --save lodash
```

## Lodashをインポートする

```vue:vue
<script>
import _ from 'lodash'

export default {
// ~ 中略 ~
}
</script>
```
Lodashを使用するvueファイルのscriptの先頭でインポートします。

CDNを利用してLodashにアクセスする時は _ (アンダースコア) を使うので、それに倣ってimport名も _ にしました。jQueryで $ を使うような感じみたいです。

このインポートのやり方がググっても中々出てこなくて苦労しました。。

## debounceを使う

```vue:vue
<script>
import _ from 'lodash'

export default {
// ~ 中略 ~
  data() {
    return {
      memos: [
        {
          markdown: ""
        }
      ]
  },
  watch: {
    memos: {
      handler: _.debounce(function() {
        this.saveMemos(); // 実行したい処理
      }, 2000), // memosのデータの更新が終わった2秒後に実行される
      deep: true
    }
  },
// ~ 中略 ~
};
</script>
```

watchオプション内のコードは猫本のサポートページに書いてあるのとほとんど同じです。

それに加えて、ネストされたオブジェクトも監視するオプション「deep」と、handlerプロパティを使っています。textareaのデータをmemos内のmarkdownに保存しているためです。

これでやりたいことができました…！

## 参考文献

### Lodashとは？

[・Lodashで配列処理](https://www.evoworx.co.jp/blog/lodash_basic/)

[・細かすぎるけど伝わって欲しいlodash.jsの話 (KAYAC engineer's blog)](https://techblog.kayac.com/2017-12-2_lodash)

### debounceとは？
[・debounce とは (slideship)](https://slideship.com/users/@iktakahiro/presentations/2017/12/MArWbm3VYEKCqB2ZNd5dts/)

[・lodash の debounce や throttle で簡単に負荷対策 (Qiita)](https://qiita.com/waterada/items/986660d31bc107dbd91c)
遠隔でDVDドライブのトレイをパカパカさせる

Windowsで作業していたら遠隔でCD-ROMを取り出したくなりますよね。
ならないとしたら、今すぐこの記事を読むのをやめて病院に行って下さい。

今回はVBScriptとPsExecを駆使してローカルネットワーク内のパソコンのDVDドライブをパカパカさせてみます。


#DVDドライブをパカパカさせるexeを作る

まず、メモ帳などに以下のソースをコピーしてください。[参考](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1096599240)


```
Dim wmp
Set wmp = CreateObject("WMPlayer.OCX")
wmp.cdromcollection.item(0).eject()
wmp.cdromcollection.item(0).eject()
```

これを任意の場所に.vbs形式で保存しましょう。自分は`cdpk.vbs`としました。
保存したものを実行すると上のスクリプトが実行され、自分のパソコンのDVDドライブが開いて閉じます。

なお、`wmp.cdromcollection.item(0).eject()`を1行にすると開くだけになります。

このままでも十分遊べます。
しばらく自分のPCをパカパカして、飽きたら、.exeに変換します。

私はフリーソフトを使わせてもらいました。
[MakeExe](http://www.vector.co.jp/soft/winnt/prog/se389017.html)
ダウンロードしてzipを解凍したら、makewin.exeに先ほどの.vbsをドラッグ&ドロップします。
変換された`cdpk.exe`ダブルクリックすると同様に自分のパソコンのDVDドライブが開いて閉じます。
しばらく自分のPCをパカパカして、飽きたら次に行きます。

#操作されるパソコン（リモートPC）の下準備

操作されるパソコンが64bitのクライアント系OSの場合はPsExecから「アクセスが拒否されました。」とエラーが出ることがあるようです。
この場合、リモートアクセスを許可するために、リモートPCで次のコマンドを管理者権限で実行します。[参考](https://orebibou.com/2014/05/%E3%82%B5%E3%83%BC%E3%83%90%E5%A4%A7%E9%87%8F%E6%A7%8B%E7%AF%89%E6%99%82%E3%81%AE%E3%82%AD%E3%83%A2-%EF%BD%9Epsexec%E3%81%AB%E3%82%88%E3%82%8Bwindows-os%E3%81%AE%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88/)

※悪用されることが考えられるのでセキュリティー面は十分に配慮してください。

```
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v "LocalAccountTokenFilterPolicy" /t REG_DWORD /d 1
```

#PsExecの入手

PsToolsを以下よりダウンロード→解凍して、コマンドプロンプトから使えるようにしましょう。
[PsTools](https://technet.microsoft.com/ja-jp/sysinternals/bb896649.aspx)
もちろんコマンドプロンプトでPsExec.exeのあるディレクトリに移動してもOKです。

以下のコマンドを実行すれば操作されるパソコンのコマンドプロンプトを起動できます。
（できない場合はPsExecの使い方を説明してくださってる方がたくさんいるので調べてみてください。）

```
PsExec -s \\[リモートPCのIPアドレス等] -u [ユーザー名] -p [パスワード] cmd
```

#実行

では、先ほど作成した`cdpk.exe`を今居るディレクトリにコピーして次を実行しましょう！

```
PsExec -s \\[リモートPCのIPアドレス等] -u [ユーザー名] -p [パスワード] -c cdpk
```

-cはローカルにある実行ファイルを一時的にコピーしてリモートPCで実行するオプションです。
-dのオプションを追加すれば終了を待たずにコマンドが終わります。

頻繁にDVDドライブをパカパカさせたい健全な男子は以上のコマンドを.batファイルにしておくと便利です。
しばらく遠隔でパカパカして、飽きたら、日常生活に戻ってください。
【Rails5】 特定のページにだけボタン等を表示する方法

##やりたいこと
以下の画像のようにページによって表示するものを変える。
今回は左上にあるボタンについてやってみる。

_※開発中画面のためお見苦しいものをお見せしますがご了承ください。。。_

####User詳細ページ↓
<img width="500" alt="Screen Shot 2019-01-18 at 20.37.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/312088/530dade6-2504-b38a-72bf-3bb2ad49063c.png">


####User一覧ページ↓
<img width="500" alt="Screen Shot 2019-01-18 at 20.37.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/312088/64cf8535-0f03-3535-1a26-d27f639e60bd.png">


##手順
###①適用させたい場所を決める
今回は`Profile Card`というボタンなので以下を編集する。

```html:_navbar.html.erb
<div id="content">
  <nav class="navbar navbar-expand-lg navbar-light bg-light">
    <div class="container-fluid">
	<button type="button" id="sidebarCollapse" class="btn btn-info">
	  <i class="fas fa-align-left"></i>
	  <span>Proflie Card</span>
	</button>
    </div>
  </nav>
</div>
```

###②`current_page?`を使って場合分けする。
`current_page?`は指定したURLが表示されていれば`true`になる。
今回は表示させたいページが`indexページ`と`Users一覧ページ`のみ。
よって「今のページがindexページ」もしくは「Users一覧ページ」かということで以下のように記述する。

`<% if current_page?(root_path) || @user && current_page?(user_path(@user)) %>`


```html:_navbar.html.erb
<% if current_page?(root_path) || @user && current_page?(user_path(@user)) %>
  <div id="content">
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
      <div class="container-fluid">
  	<button type="button" id="sidebarCollapse" class="btn btn-info">
  	  <i class="fas fa-align-left"></i>
	  <span>Proflie Card</span>
	</button>
      </div>
    </nav>
  </div>
<% end %>
```

##結論
上記コードで特定ページにだけボタンを表示させることができた。
他にも`current_page?`を使う記述方法があったが自分にはこれが一番分かり易かった。
何かこれより良い記述方法があれば教えてください。。

##参考サイト
https://stackoverflow.com/questions/39638130/rails-current-pageuser-path-giving-an-error
pipenvでハッシュが一致しない時のワークアラウンド



# 問題

pipenvで`google-auth-httplib2`を導入しようとしたところ、次のようなエラーが出ました。

```
[pipenv.exceptions.InstallError]: ['Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple, https://www.piwheels.org/simole', 'Collecting httplib2==0.12.0 (from -r /tmp/pipenv-jepk7o2l-requirements/pipenv-jnmz66u5-requirement.txt (line 1))', '  Using cached https://www.piwheels.org/simple/httplib2/httplib2-0.12.0-py3-none-any.whl']
[pipenv.exceptions.InstallError]: ['THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may have tampered with them.', '    httplib2==0.12.0 from https://www.piwheels.org/simple/httplib2/httplib2-0.12.0-py3-none-any.whl#sha256=c3232dbdda3c30966b97bed348d7847fcd5c35d095580a46c8b2e3a62b67d7fb (from -r /tmp/pipenv-jepk7o2l-requirements/pipenv-jnmz66u5-requirement.txt (line 1)):', '        Expected sha256 f61fb838a94ce3b349aa32c92fd8430f7e3511afdb18bf9640d647e30c90a6d6', '             Got        c3232dbdda3c30966b97bed348d7847fcd5c35d095580a46c8b2e3a62b67d7fb']
```
`httplib2`パッケージのハッシュが一致しないとのことですが、調べてみると`c3232...`の方はhttps://www.piwheels.org/simple/httplib2/ からのもので、`f61f...`の方はhttps://pypi.org/simple/httplib2/ からのものでした。

Pipfile.lockに書かれているのは`f61f...`でしたが、実際にはpiwheelからパッケージをダウンロードしてしまっているようです。

# 解決策
[Hashes generated during locking do not match install · Issue #2540 · pypa/pipenv](https://github.com/pypa/pipenv/issues/2540)を参考にして、Pipfileにソースとパッケージを新たに追加しました。

```toml
[[source]]
url = "https://www.piwheels.org/simple"
name = "piwheels"
verify_ssl = true

[[packages]]
<略>
httplib2 = { version = "*", index = "piwheels" }
```
これで無事`pipenv install`が通るようになりました。
Django で生成されるページを iFrame で表示させる

Django で生成されるページは、ディフォールトで、iFrame での表示ができません。

それを、表示できるようにするには、アプリの　view.py に次を加えます。

```py:view.py
（省略）
from django.views.decorators.clickjacking import xframe_options_exempt

@xframe_options_exempt
def index(request):
（省略）
```

参考ページ
[クリックジャッキング対策](https://docs.djangoproject.com/ja/2.1/ref/clickjacking/)
PHAssetから、UIImageを生成する

# 背景

弊社製アプリケーションに、ライブラリからの写真選択機能を搭載しようとしたら、四苦八苦したという・・・

# TL;DR (ソースコード載せとくね)

PHAssetからUIImageを生成する方法をまとめておきます。

```swift
let requestOption = PHContentEditingInputRequestOptions()
requestOption.isNetworkAccessAllowed = true

asset.requestContentEditingInput(with: requestOption) { (contentEditingInput: PHContentEditingInput?, _) -> Void in
    let ciImage = CIImage(contentsOf: contentEditingInput!.fullSizeImageURL!)!
    let exifDictionary = ciImage.properties
    let image = UIImage(ciImage: ciImage.oriented(forExifOrientation: contentEditingInput!.fullSizeImageOrientation))
    // anything you can what ever do you want.
}
```

# 注意点

クロージャ内部で受け取るcontentEditingInputは

```swift
open var fullSizeImageOrientation: Int32 { get } // EXIF value
```

を持ちます。

UIKitに慣れ親しんだ私はこれをUIImage.OrientationのValueだと勘違いして3日潰しましたが、この値は、

```swift
open func oriented(forExifOrientation orientation: Int32) -> CIImage
```

下記メソッドに投げるためのOrientationなので、めっっっっっっっっっっっっっっちゃ注意しようね！
(なんでコメントでEXIF Valueと書いてあるのか考えるべきだった)
putty note

# proxy command
## putty via GUI
1. create a session to bastion.
2. create new session to server over bastion.
3. Connection/Proxy set
Proxy type: Local
Telnet command or :  
`plink.exe -load <bastion's session name> -l <bastion's username> -nc %host:%port`

## plink
`plink` can use `putty` session, too.
`plink.exe -load <bastion over server's session name> -l <username`

# svn+ssh via plink
Edit `%UserProfile%/AppData/Roaming/Subversion/config`  

```
[tunnels]
ssh = plink -l <linux-username> -load
```

We can found `<command> <hostname> svnserve -t` in config file. It means `<command>` is follow of `ssh = ` expresison. openssh has that expression like <user@host>, so we can set both user and host in <hostname>. But plink can't set like <user@host> we must set `-l user`. So, we must set `-l` option before `-load` option .

use svn+ssh schema
`svn ls svn+ssh://<server's session name>/<full-path to repo>/xxx`
PythonのIDEとしてSunblime Textを使いたい

- 環境
    - macOS Mojave version 10.14.2
    - Sublime Text3
    - Python 3.6.5

# エディタの設定
手頃な.pyファイルを開く > [Preference] > [Settings - Syntac Specific]

```json:Python-sublime-settings
// These settings override both User and Default settings for the Python syntax
{
    // タブサイズ
    "tab_size": 4,
    // タブでスペース挿入
    "translate_tabs_to_spaces": true
}
```

# プラグイン
- [PEP8というPythonのコーディング規約に沿っているかチェックをしてくれるPython Flake8 Lint](https://github.com/dreadatour/Flake8Lint/blob/master/README.md)
- [PEP258に沿っているかチェックをしてくれるSublimeLinter-pydocstyle](https://packagecontrol.io/packages/SublimeLinter-pydocstyle)
- [SublimeText上で実行できるSublimeREPL for SublimeText](https://github.com/wuub/SublimeREPL/blob/master/README.md)
    - ビルドシステムの設定 : [Tools] > [Build System] > [New Build System...]

```json:Python36.sublime-build(違う名前でもOK)pythonのパスは環境に合わせる
{
    "cmd": ["/Library/Frameworks/Python.framework/Versions/3.6/bin/python3", "-u", "$file"],
    "selector": "source.python",
    "file_regex": "file \"(...*?)\", line ([0-9]+)",
    "env": {"LANG": "ja_JP.UTF-8"},
}
```
最大元、最小元、上界、下界、上限、下限

# はじめに
この記事は、
- 最大元(greatest element)、最小元(smallest element)
- 上界(upper bound)、下界(lower bound)
- 上限(supremum)、下限(infimum)
の定義を自分なりにまとめたものです。

#お願い
**間違ってる部分やわかりにくい部分がある場合は、コメントで知らせていただくとありがたいです。**

#最大元(greatest element)
ある半順序集合を$A$とし、$A$の部分集合を$B$とします。
このとき、
「ある$a \in B$が存在して、任意の$x \in B$について$x \leq a$」
という命題が真となる、$a$を$B$のgreatest elementとよびます。それを$\max B$と表すこともあります。
その命題を記号で表すと以下のようになります。
$$
{}^\exists a \in B, {}^\forall x \in B \left[ x \leq a\right]
$$

#最小元(smallest element)
ある半順序集合を$A$とし、$A$の部分集合を$B$とします。
このとき、
「ある$a \in B$が存在して、任意の$x \in B$について$x \geq a$」
という命題が真となる、$a$を$B$のsmallest elementとよびます。それを$\min B$と表すこともあります。
その命題を記号で表すと以下のようになります。
$$
{}^\exists a \in B, {}^\forall x \in B \left[ x \geq a\right]
$$

#上界(upper bound)
ある半順序集合を$A$とし、$A$の部分集合を$B$とします。
このとき、
「ある$a \in A$が存在して、任意の$x \in B$について$x \leq a$」
という命題が真となる、$a$を$B$のupper boundと呼びます。その命題を記号で表すと以下のようになります。
$$
{}^\exists a \in A, {}^\forall x \in B \left[ x \leq a \right]
$$

#下界(lower bound)
ある半順序集合を$A$とし、$A$の部分集合を$B$とします。
このとき、
「ある$a \in A$が存在して、任意の$x \in B$について$x \geq a$」
という命題が真となる、$a$を$B$のlower boundと呼びます。その命題を記号で表すと以下のようになります。
$$
{}^\exists a \in A, {}^\forall x \in B \left[ x \geq a \right]
$$

#上限(supremum)
ある半順序集合を$A$とし、$A$の部分集合を$B$とし、$B$のupper boundの集合を
$$
\bar{B}=\left\\{ a \in A \mid {}^\forall x \in B\left[ x \leq a\right] \right\\} 
$$とします。このとき、$\bar{B}$の最小元$\min \bar{B}$を$B$のsupremumと呼び、$\sup B$と書きます。

#下限(infimum)
ある半順序集合を$A$とし、$A$の部分集合を$B$とし、$B$のlower boundの集合を
$$
\bar{B}=\left\\{ a \in A \mid {}^\forall x \in B\left[ x \geq a\right] \right\\} 
$$とします。このとき、$\bar{B}$の最大元$\max \bar{B}$を$B$のinfimumと呼び、$\inf B$と書きます。

#まとめ
- 最大元(greatest element)、最小元(smallest element)
- 上界(upper bound)、下界(lower bound)
- 上限(supremum)、下限(infimum)
の定義を書いてみました。
定義の写経をすると、その定義と親密になれた気持ちになります。
某翼くんよろしく、定義と友達になれたら最高ですね。
findコマンドを使ったらfind: paths must precede expressionとなったときの対応方法

# 事象 : GNUのfindコマンドでファイル名を `*3*` で検索したら怒られた
- 環境
    - Windows7 64bit
    - GitBash

```bash
$ find --version
find (GNU findutils) 4.6.0
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
​
Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)

$ find . -type f -iname *3*
find: paths must precede expression: 30_hoge.sql
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
```

## 理由 : `"`で囲んでいないから

## 対応方法 : `"`で囲む
```bash
$ find . -type f -iname "*3*"
30_hoge.sql
31_fuga.sql
```
CarrierwaveをHerokuでデプロイしたとき、画像を反映させる方法

##前提
Cloud9で作ったRailsの画像投稿サービスをHerokuでデプロイする

##目標
Herokuでデプロイした時に画像がちゃんと反映されるようにする。

##手順
###① Cloudinaryをインストールする
HerokuはGit管理外のリソース（ユーザ操作による画像アップロード）を保証しないため、herokuにそのままデプロイしても画像が保存されない。
そのため、画像をクラウドで管理する[Cloudinary](https://cloudinary.com/)を使う。

###② コマンド実行
Cloud9のターミナルでrailsプロジェクトのディレクトリに移動し、以下コマンドを実行

```terminal
heroku addons:create cloudinary:starter
```

###③ Gemfileにgemを追加
Gemfileに下記のgemを追加する

```ruby:Gemfile
gem 'cloudinary'
```
その後、`bundle install`実行

###④ Cloud9とHerokuで場合分け
`uploader`ファイル内を書き換える。

#####現状:

```ruby:image_uploader.rb
strage :file 
```

#####書き換え後：

```ruby:image_uploader.rb
if Rails.env.production?
  include Cloudinary::CarrierWave
else
  storage :file 
end
```

##結論
上記を実行することで、Herokuでデプロイした時に正常に画像が反映された。

##終わりに
何か気になる点・間違っていることがあればコメントくださいm(_ _)m
Computer Chess/Shogi links

![ぽんぽこ・ShogiUI/Ubuntu](https://pbs.twimg.com/media/DxFTv3jU0AEr6Rk.jpg:large)

## Howto

- [将棋ソフト「elmo」をLinuxにインストールする方法](https://linuxfan.info/elmo-sdt5-on-linux) (Linux Fan)
- [将棋ソフト「やねうら王」をLinuxで動かす方法](https://linuxfan.info/yaneuraou-on-linux) (Linux Fan)
- [「平成将棋合戦ぽんぽこ」をLinuxにインストールする方法](https://linuxfan.info/tanuki-sdt5-on-linux)　(Linux Fan)
- [将棋プログラムの作り方](http://usapyon.game.coocan.jp/usapyon/HowToMakeShogiProgram.html) (usapyon)
- [NNUE評価関数の学習方法について](http://yaneuraou.yaneu.com/2018/12/30/nnue%E8%A9%95%E4%BE%A1%E9%96%A2%E6%95%B0%E3%81%AE%E5%AD%A6%E7%BF%92%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/) (yaneuraou)

## Engines

- [YaneuraOu mini](https://github.com/yaneurao/YaneuraOu) is a shogi engine(AI player), stronger than Bonanza6 , educational and tiny code(about 2500 lines) , USI compliant engine , capable of being compiled by VC++2017
- [gunyarakun/python-shogi](https://github.com/gunyarakun/python-shogi/blob/master/scripts/random_csa_tcp_match) A pure Python shogi library with move generation and validation and handling of common formats.
- [niklasf/python-chess](https://github.com/niklasf/python-chess) A pure Python chess library with move generation and validation, PGN parsing and writing, Polyglot opening book reading, Gaviota tablebase probing, Syzygy tablebase probing and UCI/XBoard engine communication

## 評価関数

- [YaneuraOu フロッピーディスクに収まる評価関数バイナリ公開](http://yaneuraou.yaneu.com/2019/01/15/%E3%83%95%E3%83%AD%E3%83%83%E3%83%94%E3%83%BC%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%81%AB%E5%8F%8E%E3%81%BE%E3%82%8B%E8%A9%95%E4%BE%A1%E9%96%A2%E6%95%B0%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E5%85%AC/)

## GUI

- [ShogiGUI](http://shogigui.siganus.com/)
- [将棋所](http://shogidokoro.starfree.jp/)

## 商品

- [マイナビ 将棋神 やねうら王](https://www.amazon.co.jp/exec/obidos/ASIN/B07DL34R4W/aaaaab0c-22/ref=nosim/)
- [マイナビ 将棋レボリューション 激指14](https://www.amazon.co.jp/%E3%83%9E%E3%82%A4%E3%83%8A%E3%83%93%E5%87%BA%E7%89%88-%E3%83%9E%E3%82%A4%E3%83%8A%E3%83%93-%E5%B0%86%E6%A3%8B%E3%83%AC%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E6%BF%80%E6%8C%8714/dp/B017E0YOEG/ref=pd_sbs_65_2?_encoding=UTF8&pd_rd_i=B017E0YOEG&pd_rd_r=ed320813-1b0b-11e9-a286-1d00e8649e5f&pd_rd_w=osP7L&pd_rd_wg=tU31c&pf_rd_p=cda7018a-662b-401f-9c16-bd4ec317039e&pf_rd_r=TH4XXMG3PHXTVHE76KXX&psc=1&refRID=TH4XXMG3PHXTVHE76KXX)

## Protocols

- [CSA通信プロトコル](http://www.computer-shogi.org/protocol/tcp_ip_server_112.html): 第17回世界コンピュータ将棋選手権からこのプロトコルが必須。審判サーバを使用するサーバプロトコルと、審判サーバが利用できない場合の1対1プロトコルがあります。
- [USIプロトコル](http://hgm.nubati.net/usi.html): 将棋GUIと将棋エンジンを繋げて、棋譜解析、対局を行う｡

## Associations

- [コンピュータ 将棋協会 (CSA)](http://www.computer-shogi.org/)
- [コンピュータ将棋連続対局場所 (floodgate)](http://wdoor.c.u-tokyo.ac.jp/shogi/floodgate.html)

## Lectures

- [将棋で磨く知性と感性](http://shogi.c.u-tokyo.ac.jp/news/) (東京大学教養学部前期課程全学体験ゼミ）
link > ideone > Python > 実行時引数付のコードを実行する

```txt:動作環境
ideone Python
```

偶然見つけた、ideoneにてPythonの実行時引数を指定する方法
（ヒアドキュメントを使う）

Does Ideone support Python command line parameters?
https://stackoverflow.com/questions/9215627/does-ideone-support-python-command-line-parameters

> answered Feb 9 '12 at 18:06
> interjay

試してみた
https://ideone.com/xgjMQ5

確かに実行時引数を渡すことができる。

このPythonは3なのだろうか?


### 検索用キーワード

- heredoc
LaravelでSessionのお話し。

今更なに言ってるんだよ的なSessionのお話。

#事象
ある画面で作成したSessionの値が2画面先で参照できない。
よーは、特定のKeyがSessionから欠落します。
画面は
login→index→confirm
の3画面

Session作成：login画面でログインする（Sessionにa,bの値を設定している）
　↓
Session更新：index画面に遷移してくるので、送信ボタンを押下する（Sessinのa,bを更新している）　←ここまでは存在する
　↓
Session参照：confirm画面が表示される（Sessionのa,bの値を参照したいが存在しない）

**Sessionの中にa,bがKeyごとないよ＼(^o^)／**

- Login→indexはOK
- index→confirmはNG

こんな状態

#原因
Login画面で設定した値（正確にはKey）が、次の画面までしか引き継がれない「old」の中に存在しているため、index画面からconfirm画面へ遷移した際に削除される。

（session()->all()の中身をddで出力）「old」ってやつにあるKeyが対象のようだ。

```php
array:3 [▼
  "_previous" => array:1 [▶]
  "_flash" => array:2 [▼
    "old" => array:2 [▼
      0 => "a"
      1 => "b"
    ]
    "new" => []
  ]
  "_token" => "xxxxxxxxxxxxx"
]
```

oldは元々、画面のFormで入力された内容がバリデーションチェックなどで引っかかり、画面に戻った際に以前に入力された内容を表示するためのものなので、持続しないわけですね。
多分、一定期間後にoldが消えるのでそれ以降であればなんら問題なくputされるのではないかなぁと推測。

#oldに入っているkeyと同じkeyの値を更新したい場合の解決策
- putの前にforgetで消して入れ直す場合
 
```php
session()->forget('a');
```

- putした後にSessionの内容をまるまる入れ替える場合

```php
session()->replace(session()->all());
```

- reflashする場合

```php
$request->session()->reflash();
```


とりま3パターンあります。こんな感じで。


##追記
そもそもLaravelのSessionは、画面間で引き回すことを想定した作りじゃないんじゃないかと推測。
バリデートで引っかかった時に元の値を表示するためのものなのに画面間で引き継いでるのがおかしいんじゃないかと思いました。
でもKVS使うほどでもなく、なんだかなぁ。
大学生が Unity で作った有料スマホゲーム、iPhone の pertica  で3分遊んでみた感想

大学生が Unity で作った有料スマホゲーム、iPhone の pertica  で3分遊んでみた感想

[大学生が有料スマホゲームを作った全てを公開するよ（１）イントロダクション - Qiita](https://qiita.com/shoi_ito/items/2234414af441e448a85e)

# 言葉がない世界

ゲームを作るには、いったん言語を捨ててみるのがすごく勉強になるかも

だらだらと説明の長いゲームを作ってもインターフェイスが磨けない


![image](https://user-images.githubusercontent.com/13635059/51380374-f6016480-1b54-11e9-8acc-9dd6bcca72d1.png)

# ユーザーのゲームの理解

もう少しで投げ出しそうだったのでギリギリ感はあったけど、なんとか触っているうちに理解できた

写真にはないが、レーザーを出すというアクションと、自分がポイントを縄のように伝っていくことが、直感的に把握できなかった

レーザーというと多くのゲームでは攻撃を表す

![image](https://user-images.githubusercontent.com/13635059/51380425-17fae700-1b55-11e9-80c4-40ac5aa19bb6.png)


# ギミックが増えていく

いったんゲームを理解してしまえば、あとは自力で進んでいけそうだった

![image](https://user-images.githubusercontent.com/13635059/51380521-424ca480-1b55-11e9-9b36-8e577345ab00.png)

# 感想

「これは、どんなゲームか」を伝えるために、最初の30秒や1分ぐらいは大きいかもしれない

画面を触る前から、動かさなくても何ができるゲームか分かるのが最高かもしれない

静止画のスクリーンショットでもどんなゲームか分かるのがベストかもしれない

# 最強のゲームデザインはマリオの1面

右を向いているから、右に進めば良いことが分かる
敵が迫ってくるのでジャンプせざるをえず、ジャンプアクションをプレイヤーは覚える
はてなのブロックを叩きたくなる

有名な話

![image](https://user-images.githubusercontent.com/13635059/51380810-e898aa00-1b55-11e9-9773-d9e0c710f9c2.png)

# イメージ

自分の位置を交換して進んでいくのであれば、動物と縄のようなオブジェが良いかもしれない

だがしかし、制作や描画自体が複雑化しそうなので、シンプルで、なにかゲームイメージを表現できるオブジェクトといえば？

最良のゲームイメージを考えること自体に割と大きなコストがかかりそうなので、これはこれで良いのかもしれない

レーザーの先に輪っかをつけるだけでも、何か「ひっかけて、たぐりよせる」イメージが生まれるかもしれない


---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
先輩「まだjupyter notebookなんて長いコマンドを打ってるの？」

# jupyter notebookって・・・長くない・・・？
jupyterは、pythonのコードをインタプリタ式で確認しながら書ける、素晴らしいツールです。
ただ、点けたり消したりする時にこのコマンド名は少し長いですよね…。
さらに私はAnaconda環境を使っているため、こうなります。  

```
conda activate python36
jupyter notebook
```
**これが毎回打つと地獄。**  
しかし、エイリアスを貼り直すとなんと、

```
$ jn 
```

だけでjupyterを起動することができます。  

# コマンドを短くする、というライフハック

仕事で毎回使うことの手間を減らすというのはとても効果的に時間を削れます。
コマンドを短くするだけで仕事の効率がここまで上がるよ！というのを伝えるため、
今回は、**コマンドの省略の仕方**をまとめていきます。

# エイリアスの貼り方
まず、自分のホームディレクトリにターミナルで移動し、
「.bashrc」というファイルを開きます。

```
$ cd $HOME
$ vim .bashrc
```

vimの画面になったら、
`alias エイリアス名='コマンド'` の形式で書きます。

```
# コマンドjupyter notebookにエイリアス名をjnとして設定
alias jn='jupyter notebook'

# aconda activateで環境を切り替えている人におすすめ
alias ca='conda activate'
```
エイリアスをかけたらvimを閉じます。
その時は忘れず、コマンドモードで「`:wq`」と入れて保存して閉じましょう。

# 反映を忘れずに！
ただし、この直後に`$jn`を打っても

```
$ jn
bash: j: command not found <= コマンドエラー
```

コマンドが見つからないと出てしまいます。
せっかくエイリアスまで貼ったのに…。

ただ、それは、エイリアスの変更がまだ反映されていないからなんですね。
せっかく設定したエイリアスをすぐ確認するためには、下記のコマンドを実行する必要があります。

```
# .bashrcの変更を反映させる  
$ source ~/.bashrc  
```

sourceコマンドは、ファイルに書かれたコマンドを現在のシェルで実行するコマンドです。
主にシェルの設定ファイルを反映させる際に使用します。

これで定義したエイリアスを使用できるようになりました。
なお、直後に使わない場合は、再ログインでも反映されます。

#bash_profileにも書かなくていいの？
余談です。  
今回は.bashrcにエイリアスを設定しました。
ですが、.bashrcをいじったことがあると、.bash_profileとの書き分けなどを聞いたことがあると思います。
ただ、私はこちらの[dark-spaceさんの記事](https://qiita.com/dark-space/items/cf25001f89c41341a9fd)を参考に、.bashrcだけに書くようにしています。  

[追記]
bash_profileには以下を追加して、中に書いてあるPATHはコメントアウトするか消してください。そうするとbashエラーが出なくなります。

```
source ~/.bashrc
```

[参照:terminal起動時に毎回bashエラーが表示される](https://qiita.com/weedslayer/items/8a22001238d13feb72cd)

# 普段よく使うコマンドを短くして、仕事を効率化しよう！
仕事を効率よくこなしていくためには、まず身近なコマンドから。
これは.bashrcだけに書くことにも通じます。
実業務以外の作業はできる限り減らしたい。
そのためには、毎回やっている無駄な手間を省いて、日々の無駄な積み重ねはなくしてしまいましょう！
ゲーム制作にはインゲーム・アウトゲームという制作の分類があるらしい。「大学生が有料スマホゲームを作った全てを公開するよ」を三分でまとめる！

ゲーム制作にはインゲーム・アウトゲームという制作の分類があるらしい。「大学生が有料スマホゲームを作った全てを公開するよ」を三分でまとめる！

[大学生が有料スマホゲームを作った全てを公開するよ（１）イントロダクション - Qiita](https://qiita.com/shoi_ito/items/2234414af441e448a85e)

# インゲーム アウトゲームという分類がある

>大体の役割は、ボクがインゲームで、先輩がアウトゲームだった。
>インゲームっていうのは、実際にプレイする部分でゲームのメインになるところ。
>アウトゲームは、開発する段階で必要なツールを作ったり、メニュー画面を作ったりする。

# アウトゲームとは

ゲームを作るためのツールとか

Unitiyとか汎用制作ツールを使っているならまだしも、ドメイン特化的に手の混んだゲームを作ろうと思ったら、ゲームを作るためのツールも必要なのかも？

アウトゲーム自体をUnityで作る例も聞いたことがある気がするな

>メイン部分をボクが作って、先輩は主に「ステージを作るツール」を作った。


---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
git push heroku masterでerror: failed to push some refs toが出たら

毎回、このエラーが出るので、自分用のメモです。
原因がわかる人がいたら、教えて欲しいです。

 ```
エラーコード
remote:  !     You must use Bundler 2 or greater with this lockfile.
```
を参考にググると

```
heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2
```
これでいいそうです。
【Devise】form_for内の「url: session_path」「url: registration_path」ってなんだよ？！

でたぞ不明点。
<br />

```ruby:devise/registration/edit.html.erb
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
  <%= render "devise/shared/error_messages", resource: resource %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
 
 （中略）

    <%= f.submit "Update" %>
  </div>
<% end %>

<p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %></p>

<%= link_to "Back", :back %>
```
<br />

deviseのregistration、session等のnewやeditにはform_forが入っていて、
そのurlオプションにprefixパスが使われているが（上記コードだと上から1行目と下から3行目）、
`rails routes`をしてもこのprefixが見つからない。


てなわけで調べたら、案外あっさり~~のお味噌汁~~だた。


参考：Devise's registration_path, how it's generated?
https://stackoverflow.com/questions/19645698/devises-registration-path-how-its-generated



<b>Devise::Controllers::UrlHelpers</b>にて、self.generate_helpers!というメソッドで規定しているらしい。
コードも見たけど、prefixパスは`method = "#{action}#{module_name}_#{path_or_url}"`部分で作ってるんだろな。


<br />

てなわけで終了。
1R 2分3秒（メイウェザー VS 那須川より16秒早い）
Rubyのyieldとブロック

#yieldについて
メソッドに渡されたブロックを実行します。

##そもそもブロックって
ブロックとは { ~ } で囲まれた処理や、do ~ endで囲まれた処理のことを指すそうです。
余談ですが、callメソッドで自身の処理を呼び出せます。

```ruby
proc_obj1 = Proc.new { |arg| p arg }
proc_obj2 = Proc.new do |arg|
  p arg
end
proc_obj1.call('hoge') # hoge
proc_obj2.call('hoge') # hoge 
```
##yieldは引数で渡されたブロックを実行する
```ruby
def yield_test
  yield( 10, 20 )
end

puts yield_test { |x, y| x + y } # 30
puts yield_test { |x, y| x * y } # 200

```

```puts yield_test { |x, y| x + y } # 30```の、```{ |x, y| x + y } ```部分がブロックで、yield_testではそのブロックに```(10,20)```という引数をわたして実行しています。
６５歳からのプログラミング入門を5分で読む！

[６５歳からのプログラミング入門 - Qiita](https://qiita.com/kaizen_nagoya/items/1561f910c275b22d7c9f) を 3分で読む！

# どんな記事？

65歳からもしプログラミングを始めるにしても、お金をかけずに何でもできる。

# ネットに頼る（生身の人に頼らない）

理由は特に書かれていないような。

これを原則に勉強したということ。

# エラーが出たら、ネットに記録する。

絶対に忘れないようなくならないように。

# 動かすのが一番近道。

本を読むより手を動かせ。プログラミングは手足のスポーツ。


# ＜この記事は書きかけです。自分が６５歳になる頃（今から半年後）に書き終わります。＞

記事を1個ずつ作るのではなく、ひたすら編集していくスタイルらしい。巨大なメモとしてQiitaを利用？

65歳ではなかったらしい。

---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
画像投稿機能

#画像投稿機能

多くの人が画像投稿機能に関する記事を書いているが自分もアウトプットがてら記事書いていこうと思う。



##1.DBのカラムを調べる。
初めに画像を投稿してDBに保存するには保存できるカラムが必要。
なのでそのカラムの有無を調べよう。
db/schema.rbを開く。

```ruby:db/schema.rb
create_table "posts", force: :cascade do |t|
    t.string "title"
    t.text "text"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "img"
    t.integer "user_id"
  end
```

私の場合はimgカラムがあるので大丈夫。カラムがない人はimgカラムあるいはimageカラムを追加しよう。

##2.カラムの追加
画像を保存するためのimgカラムを追加。

```ruby:ターミナル
$ rails g migration AddImgToPosts img:string
```

するとPostsテーブルにimgというカラムが追加される。続けて、

```ruby:ターミナル
$ rails db:migrate
```
をして保存する。


##3.Carrierwaveのインストール
Gemfileを開きcarrierwaveをインストール

```ruby:Gemfile
gem 'carrierwave', '~> 1.3', '>= 1.3.1'
```

```
$ bundle 
```
を実行して完了。

##4.mount_uploaderを準備する

```ruby:ターミナル
$ rails g uploader img
```

ターミナルでこれを実行するとuploadersディレクトリとimg_uploader.rbファイルが生成される。
※imgと書いているところは追加したカラムと合わせてください。

例えばimageカラムを追加したのであれば

```
$ rails g uploader image
```
です。

app/models/post.rbに移動。

```ruby:app/models/post.rb
class Post < ApplicationRecord
 mount_uploader :img, ImgUploader
end
```
と記述する。

##5.コントローラを変更する

```ruby:app/controllers/posts_controller.rb
class PostsController < ApplicationController
: 
private
 def post_params
  params.require(:post).permit(:title, :text, :img)
 end
end
```


##6.ビューを変更

フォームのパーシャルファイルを変更し、imgの欄を追加する。
画像をアップロードするにはfile_fieldというものを使う。

```ruby:app/views/posts/_form.html.erb
<%= form_for (@post) do |f| %>
 :
 :
 <%= f.label :画像 %><br />
 <%= f.file_field :img, class: "image" %>
 :
 <%= f.submit %>

<% end %>
```

```ruby:app/views/posts/show.html.erb
<p>
  <strong>Text:</strong>
  <%= @post.text %>
</p>
<p>
  <strong>Image:</strong>
  <%= image_tag @post.img.url%>
</p>

```
※インスタのように絶対に画像をアップロードするアプリだと上の<%= image_tag %>でいいが画像をアップしたりしなかったりだとこのままではエラーになるので以下のように
if @post.img?
を付け加えよう。

```ruby:app/views/posts/show.html.erb
<p>
  <strong>Text:</strong>
  <%= @post.text %>
</p>
<p>
  <strong>Image:</strong>
  <%= image_tag @post.img.url　if @post.img? %>
</p>

```

##7.画像の削除

```ruby:app/views/posts/_form.html.erb
 <%= f.label :画像 %><br />
 <%= f.file_field :img, class: "image" %>
に続いて、
 <p><%= f.check_box :remove_img %>画像を削除する</p>

を加える。

```

最後にremove_imgを追加。

```ruby:app/controllers/posts_controller.rb
class PostsController < ApplicationController
: 
private
 def post_params
  params.require(:post).permit(:title, :text, :img, :remove_img)
 end
end
```