OmniAICreator/Qiita-1.07M huggingface dataset:
Jenkinsにsudoを許可してデプロイ

### 前提条件
自分用メモ:thought_balloon:
ubuntu 16.04

### 本文
JenkinsにGithubなどから例えば`hoge`というリポジトリをpullしてきて、ビルドしたものは以下のような場所に収納されます。
`/var/lib/jenkins/workspace/hoge`

ここから好きな場所に`rsync`してあげたいところですが、`Operation not permitted`と言われてうまく出来なかったりします。

そこでJenkinsに`sudo`をさせてあげたいわけですが、[シェルの実行]のところに

```shell
sudo sh /path/to/deploy.sh
```

と書いて実行しても`sudo: no tty present and no askpass program specified.`と言われて実行できません。

なのでむりやり許可をしてあげます！:punch:

```shell
$ sudo visudo
```

からの

```shell
Defaults visiblepw
jenkins ALL=(ALL) NOPASSWD:ALL
```

を追加でパスワードなしで`sudo`が実行できます。
この時なにやら見慣れないエディターがでてきますが、これは[nano](https://ja.wikipedia.org/wiki/Nano_(%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF))という子（名前は日常にでてきそうでかわいい...）で、使い方は[このサイト](http://www.obenri.com/_nano/close_nano.html)を参考にすると良いと思われます。

ちなみにこのファイル自体は`/etc/sudoers`にあるのですが、少しでもシンタックスエラーになると`sudo`自体が使えなくなってしまうのでご注意ください...間違ってもvimとかで編集しようと思わないように...[もしもの対処法はこちら](http://te2u.hatenablog.jp/entry/2012/07/24/143912):star:

### おまけ

Jenkinsが実行したファイルは[先日](https://qiita.com/kokoyoshi/items/9349f8bfd3688a3cab43)オススメしたnpmのデーモン装置[forever](https://github.com/foreverjs/forever)で普通に

```shell:deploy.sh
- 略 -
forever start path/to/app.js
```

と書いても

```
Forever cannot find process with id: /path/to/app.js
```

とか言いやがってなぜか見つけてくれません。。。
で対処法は、

```shell:deploy.sh
- 略 -
forever start app.js --sourceDir="/path/to/dir/"
```

としてやると良いようです:sparkles:

さらに厄介なことに、Jenkinsでforeverしてしまうと今度は他のユーザーから`forever list`としてやっても

```shell
info:    No forever processes running
```

と言われてしまいます。。。。とりあえず:point_down:こんな感じで止めたいときは一気に殺すしか今の所僕には打つ手なしです:innocent:

```shell
$ sudo pkill -f 'app.js'
```

何方か良い方法を知ってらしたら、ご教授ください:bow:
メモ: 大文字の月名をpd.to_datetime()などに認識させる

# なぜそんなことをするのか
01-JAN-2008のようなフォーマットのデータを拾ったため。%b,%BはそれぞれJan,Januaryのような文字列しか拾ってくれない

# 結論
`"01-JAN-2008".title()`としてから認識させれば良い。title関数は、文字列の先頭だけを大文字にし、残りを小文字にしてくれるので%bフォーマットに適合するようになる。titleという関数を知らなかっただけというお話でした。

# 補記
カスタムデータフォーマットとかないんですかね？ということを思ったので誰かが指摘してくれることを祈りつつ投稿します
文字列を回転させる

# 文字列回転

こういう文字列が欲しい時があるかもしれません

- 1234なら
    - 1234, 2341, 3412, 4123

- helloなら
    - hello,elloh,llohe,lohel,ohell

こんな感じで書いてみた

```ruby
def rolling(str)
  arr = str.to_s.split("")
  ans = []
  for i in 0...arr.length
    ans << arr[i...arr.length].concat(arr[0...i]).flatten
  end
  ans
end

def rolling_str(s)
  rolling(s).map{|arr| arr.join.to_s}
end

def rolling_num(n)
  rolling(n).map{|arr| arr.join.to_i}
end
```

テスト

```ruby
p rolling_num(1234)
[1234, 2341, 3412, 4123]
```

```ruby
p rolling_str("hello")

["hello", "elloh", "llohe", "lohel", "ohell"]
```

**EDIT**

@jnchito さんからコメントがありました。[Array自体に#rotateというメソッドが生えている](https://ref.xaio.jp/ruby/classes/array/rotate)ので、それを使ったほうが良さそうです。コメント欄参照。
【Python】ファイルの読み込み

##やりたいこと
以下のファイルを読み込みたい

```ruby:test_data.txt
1
2
3
4
5
6
7
8
9
10
```

## 一行ずつ読み込んでは表示する方法

```ruby:main.py
# ファイルをオープンする
test_data = open("test_data", "r")

# 一行ずつ読み込んでは表示する
for line in test_data:
  print line

# ファイルをクローズする
test_data.close()
```

## すべての行を読み込んでリストにし、一行ずつ表示する方法

```ruby:main.py
# ファイルをオープンする
test_data = open("test_data", "r")

# 行ごとにすべて読み込んでリストデータにする
lines = test_data.readlines()

# 一行ずつ表示する
for line in lines:
  print line

# ファイルをクローズする
test_data.close()
```

## すべての内容を読み込んで一度に表示する方法

```ruby:main.py
# ファイルをオープンする
test_data = open("test_data", "r")

# すべての内容を読み込む
contents = test_data.read()

# すべての内容を表示する
print contents

# ファイルをクローズする
test_data.close()
```

## open関数の説明

形式: `open(ファイル名, モード)`

第二引数の「モード」オプション説明

| モード     　  |       説明 |    
|:-----------------|:------------------|
| 省略              |            読み込み用|
| 'r'                |            読み込み用|
| 'w'          |            書き込み用 |
| 'a'             |              追加書き込み |
| 'r+'               |                上書き編集 |
| 'w+'             |              クリアにした上で編集|
| 'a+'          |           追記の編集 |
ASP.NET Core MVC で HttpResponseMessage をそのまま HTTP レスポンスとして使う

# **やりたいこと**

ASP.NET Web API では `HttpResponseMessage` インスタンスを HTTP レスポンスとして扱ってくれるのに、ASP.NET MVC 6 以降は `HttpResponseMessage` インスタンスそのものを JSON に変換してしまう。そんな動作は誰も望んでいない・・・。

新しい ASP.NET Core MVC を使いながらも **`HttpResponseMessage` をそのまま HTTP レスポンスとして扱ってもらいたい。**


# **WebApiCompatShim**

既存の ASP.NET Web API による実装を ASP.NET Core MVC へ移行する作業を簡単にするため、**[WebApiCompatShim](https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.WebApiCompatShim/)** なるものが用意されている。[NuGet](https://www.nuget.org/) Gallery で `Microsoft.AspNetCore.Mvc.WebApiCompatShim` を検索してプロジェクトに追加する。


# **AddWebApiConventions()**

WebApiCompatShim を追加すると、`IMvcBuilder` に **`AddWebApiConventions()`** というメソッドが追加されるので、このメソッドを呼ぶ。

```csharp
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().AddWebApiConventions();
    }

    ......
```


# **Web API の実装**

これで、Web API の実装から返す `HttpResponseMessage` インスタンスを HTTP レスポンスとして使ってもらえる。

```csharp
[Route("api/[controller]")]
public class ValuesController : Controller
{
    [HttpGet]
    public HttpResponseMessage Get()
    {
        ......
    }
```

`async` / `await` と一緒に使っても動くことは簡単な例で確認済み。

```csharp
    [HttpGet]
    public async Task<HttpResponseMessage> Get()
    {
        return await ......
    }
```


# **感想**

ASP.NET で Web API 開発の情報を探そうとして検索すると、`IHttpActionResult` 云々の記事が多く出てくるが、これは ASP.NET Web API でのやり方なので、今となっては古い。ASP.NET Core MVC では代わりに `IActionResult` を使う。検索して古い情報がたくさん出てくるのは残念。

それにしても、ほぼマイクロソフト陣営単体でやっているだろうに、何故こうも .NET は API の分岐・統廃合・再設計を繰り返すのだろうか。 _"[ASP.NET 5 is dead – Introducing ASP.NET Core 1.0 and .NET Core 1.0](https://blogs.msdn.microsoft.com/webdev/2016/01/19/asp-net-5-is-dead-introducing-asp-net-core-1-0-and-net-core-1-0/)" (January 19, 2016)_ や _"[.NET Standard Versions](https://github.com/dotnet/standard/blob/master/docs/versions.md)"_ といった状況は、マイクロソフトの技術に不慣れな技術者にとっては辛い。

ついでにいうと、[C# のバージョン](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-version-history)は現時点でバージョン 7.0 まで達しているが、言語仕様はアグレッシブに進化を続けているというのに、大きな本屋に行っても解説書がほとんどなく、とても残念。
fishshellのkey binding modeの切り替え

# はじめに

fish shell自動補完などが強力ということで、terminal環境を少しでも良くするために試しに使ってみているところです。

fishの環境構築記事[こちら](https://dev.classmethod.jp/etc/fish-shell-life/)などを参考に環境を整えていました。

## 詰まったところ

まず、細かいカスタマイズのことはわからないので、
記事の通りにいたのですが、全く書いてある通りに動きません。

`CTRL+R`で`peco_select_history`が起動するはずなのに起動しない。
直接`peco_select_history`関数を起動すると、目的の動作をしました。

ということで、key bindingsが一部設定されていないのが原因では？ということで調べてみたら解決しました。

## 原因と対処
key bindingsが何故かvi modeになっていたせいでした。

fish(2.3以降)には最初からkey bindingsを切り替える機能があり、default(Emacs) modeとvi modeがあります。

以下のコマンドで、default modeに戻せます。

```sh
set -U fish_key_bindings fish_default_key_bindings
```

vi modeにしたい場合は逆に、次のコマンドです。

```sh
set -U fish_key_bindings fish_vi_key_bindings
```
【Android】NotificationListenerServiceのonNotificationPosted()で2回同じものが来るときの対処法

NotificationListenerServiceのonNotificationPosted()で2回同じものが来るときの対処法メモです。

## 環境
- Android: 8.1.0
- kotlin: 1.2.10

## サンプルコード
```kotlin
class NLService : NotificationListenerService() {
    private var mPreviousKey = ""

    override fun onNotificationPosted(sbn: StatusBarNotification) {
        val key = "${sbn.id} ${sbn.packageName}"
        if (mPreviousKey == key) return
        mPreviousKey = key

        // do something
    }
}
```

## 補足
StatusBarNotificationの`id`と`packageName`が前回来たものと一致してたら`return`してます。
`tag`も一致してるか確認してもいいかもしれません。

## 参考
Android NotificationListenerService onNotificationPosted fire twice - Stack Overflow
https://stackoverflow.com/questions/33412124/android-notificationlistenerservice-onnotificationposted-fire-twice
Angular5でのjsonpの取扱

Angular2の時代に少しかじった程度なので、Angular5をいきなり使おうとしたら色々変わっていて困った。

## HttpClientModuleとHttpClientJsonpModule
Angular4.3から追加されたモジュールらしい？
参考: [Angular 4.3で追加されたHttpClientModuleについてのメモ](https://qiita.com/ponday/items/1ec0e500cd801286845e)

HttpClientJsonpModuleはHttpClientモジュールでjsonpをサポートするためにimportする必要があるモジュール
勉強不足のためどのような実装になっているかは分からない

基本的には下記の通りにNgModuleデコレータ無いで上記２モジュールをimportする必要がある。

```typescript
import { NgModule } from '@angular/core';
import {HttpClientModule, HttpClientJsonpModule} from '@angular/common/http';

@NgModule(
{...
imports: [...
HttpClientModule,
HttpClientJsonpModule,
...]
...
})
export class AppModule{ }

```

## jsonpの受け取り方

DIされたHttpClientからjsonp関数を呼ぶことでjsonpオブジェクトを受け取る。
参考: [Angular.io HttpClient#jsonp](https://angular.io/api/common/http/HttpClient#jsonp)

例

```typescript

import { Injectable } from '@angular/core';
import {HttpClient, HttpParams} from '@angular/common/http';
import {tap} from 'rxjs/operators';

@Injectable()
export class HttpService {
  APIURL: string;
  constructor(private http: HttpClient) {}
  logData(param: HttpParams): void{
    this.http.jsonp<Object[]>(`$(this.APIURL)?${param.toString()}`, 'callback')
      .pipe(tap(console.log))
  } 

}
```

昔使ったことあるから楽だと思ってAngularを使ってみたが、以外と手間がかかった。
記事も少ないしReact使ったほうがいいのかな、分かりません
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十五章 蒸留2 コアドメインのHowとWho

# 前回までの第十五章

[コアドメイン](https://qiita.com/YasuhiroKimesawa/items/899d1b3fd58ca91f525a)

# コアドメインをどのように蒸留するか

１つは、設計の一部を競合との優位性を保つため、秘密にする必要があるとき、そこがコアドメインになる。というところは単純に選択できるところでしょう。

もう一つは、**視点**によって決まる。
例えば、汎用的な金銭に関するモデルは多くのアプリで必要になるかと思いますが、こちらはサブドメイン。一方為替に関するアプリなどでは、もっと複雑な金銭に関するモデルが必要になり、こちらはコアドメインになるでしょう。汎用的な金銭モデルと特化したドメインを分離してコアドメインを構成することになるでしょう。

このようにアプリが解決するビジネスのコンテキストによって選択するコアドメインは異なりますし、すぐにわからないかもしれません。
途中で、コアドメインだと思って実装していたモデルが実はそうではなかったということも。

コアドメインの識別はイテレーションを通じて進化させる必要があるということですね。

# だれがコアドメインを実装するか

いうまでもなく、最も優秀なメンバーがコアドメインに当たるべき。
ただ、技術的に卓越したメンバーは大体技術的に大変なところに当たりたがるのが世の常。たとえば、インフラストラクチャ層の新しい技術とか。。。また、最も優秀なメンバーがドメインについての多くの知識がない場合、さらにコアドメインから離れていき、悪循環になりがち。

この悪循環を断ち切ることが大事です。
ドメインに関心がある優秀な技術者を集め、ドメインエキスパートが参加するチームを収集すること。

また、外部の専門家は当然呼ばない。ビジネス上最重要な箇所だからですね。
さらに同じ理由で、コアドメインを購入したり、制約のあるフレームワークを使うというのもなしですね。

今後さらに、蒸留のテクニックを読んでいきます。ドメインビジョン声明文、強調されたコア、凝集されたメカニズムなどなど。。。
CmakeでQtプロジェクトをビルドする際のCMakeListsの設定

基本的な設定は下記の通り

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(test)

set(CMAKE_CXX_STANDARD 14)

# curdirをinclude file探索対象にする
# mocで生成されたファイルをincludeするはずなので、有効にしとくが吉
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# mocコマンドを自動実行する
set(CMAKE_AUTOMOC ON)

# Qt5のインストール先フォルダをcmake_prefix_pathに追加(find_packageの探索先)
# cmakeのmodule配下にqtがインストールされてる場合は必要なし
set(Qt5_DIR /usr/local/opt/qt5)
list(APPEND CMAKE_PREFIX_PATH ${Qt5_DIR})

# 適当に使うモジュールを選択
# Qt5<module name>
find_package(Qt5Core REQUIRED)
find_package(Qt5Widgets REQUIRED)

set(SOURCE_FILES main.cpp MainWindow.cpp MainWindow.h)
add_executable(test_bin ${SOURCE_FILES})

# Qt5::<module name>でリンクするモジュールを指定
target_link_libraries(test_bin Qt5::Core Qt5::Widgets)

```

## 注意
cmakeとは関係ないけど、mocコマンドで生成されたmocファイルを必要とするファイルではmocファイルをinclude忘れないように。
Q_OBJECT句とかで生成されるやつ
【Python】シグモイド関数を調べてみる / 微分

##やりたいこと
- シグモイド関数の傾きを調べて、どんな動きをしているのかを知る
- Pythonのlabelを使ってみる

##シグモイド関数の傾きを調べて、どんな動きをしているのかを知る
以下のコードで傾きをグラフ化

```ruby:math_training.py
# coding=utf-8

import matplotlib.pyplot as plt
import numpy as np
import math

def sigmoid(a):
    s = 1 / (1 + e**-a)
    return s

dx = 0.1
x = np.arange(-10, 10, dx)
e = math.e

y = sigmoid(x)

# 微小の量を移動した時の傾き
y_delta = (sigmoid(x+dx) - sigmoid(x)) / dx

plt.plot(x, y, label="sigmoid")
plt.plot(x, y_delta, label="sigmoid_delta")

# labelを有効にする
plt.legend()
plt.show()
```
- 日本語のコメントアウトをするためには、# coding=utf-8を挿入する。
- labelを有効にするためにはplt.legend()を呼び出す。

グラフはこんな感じ
<img width="581" alt="スクリーンショット 2018-01-03 1.31.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/174991/f1790a90-2d6e-8246-0d41-e20cbd5ea28f.png">

ここから読み取れるのは、

・x=0の時に傾きが最大値をとる
・xが無限大に近づくと、傾きは0に収束する。逆も然り。

よって、機械学習におけるシグモイド関数は、学習を重ねることで傾き(判断を下すスピード)が0に収束する→より早く正確な判断ができるようになる。という事だと思う。
crontabに命令文を追加するスクリプト

grepとsedで重複なく、crontabに命令文を追加する

```shell-session
function edit_file () {
    local keyword=$1
    local statement='$a\'"$2"
    local file_path=$3

    local set_flag=`grep "$keyword" "$file_path" | wc -l`

    if [ $set_flag -eq 0 ]; then
        sed -i "$statement" "$file_path"
    fi
}
```
iptablesのついてまとめ

# ■ iptablesとは

多くのLinuxにインストールされているパケットフィルタを行うファイアウォール。


# ■ 使い方

```
iptables [-t テーブル] [オプション -チェイン] [マッチ] [ターゲット/ジャンプ]
```

## ● テーブル

遮断する、許可する、パケットの送信先を書き換えるなどパケットの取り扱いをまとめたもの。
4つのテーブルが用意されている。

|テーブル|内容|
|:-:|:-:|
|filter|遮断、許可などのパケットフィルタをする際に利用|
|nat|NAT（ネットワークアドレス変換機能）の機能をを担当する。送信先などのパケットの中身を書き換える場合に使用|
|mangle|パケット処理の優先度付けをするときに使用|
|raw|特定の通信をファイアウォールで処理せずに他の機材へ通したりといった経路制御する場合に利用|

## ● チェイン

フィルタリングを実施するタイミングを定めたもの

|チェイン|内容|
|:-:|:-:|
|INPUT|入力（受信）時に実施|
|OUTPUT|出力（送信）に実施|
|FORWARD|フォアード（転送）に実施|
|PREROUTING|受信時に宛先アドレスを変換する。タイミングとしてはfilterで適用されるルールより手前|
|POSTROUTING|送信時に送信元アドレスを変換する。これもfilterの後でパケットが送信される直前|


# ■ 参考サイト

* http://oxynotes.com/?p=6361
* [カーネルコンフィギュレーション](http://armadillo.atmark-techno.com/howto/pppd-a)
Docker for mac のデータファイルを縮小させたかった話

## やりたかったこと
1年半使ってきた Docker for mac のデータファイルが肥大化してきたので、開放できる領域を解放してデータファイルを縮小させます。但し、事前に コンテナイメージ と ボリュームを整理して、削除しておかないと効果がありません。

データファイルの場所は、Docker for Macの `Preferences` の `Advanced` タブにある ` Disk Image Location` に記載されています。
<img width="191" alt="Docker for Mac の Advanced画面" src="https://qiita-image-store.s3.amazonaws.com/0/145742/7eb6f446-1739-c8ce-773b-93c36a7e001c.png">

`Open in Finder` をクリックすると、Finderで該当ディレクトリが表示され、ファイルサイズを見ると50GByteでした。このファイルを小さくします。

## 進め方
必要なものをバックアップした後に、 `Remove all Data` で全てのデータを削除した後に復元します。バックアップを行うのは下の二つです。

* コンテナイメージ ( `docker images` で表示されるもの)
* ローカルボリューム( `docker volume ls` で表示されるもの)

docker-compose でコンテナを作るので、(`docker ps -a` で表示される) コンテナはバックアップしません。

## バックアップ
### コンテナイメージをバックアップ

[`docker save`](http://docs.docker.jp/engine/reference/commandline/save.html) で丸っとバックアップします。 引数にコンテナ名を列挙することで複数のコンテナをファイルに書き出すことができます。

```bash
$ docker save -o all-images.tar $(docker images |awk '2<=NR{printf "%s:%s ",$1,$2}')
```


### ローカルボリュームをバックアップ

`docker volume` にはバックアップのコマンドがないので、任意のコンテナにマウントする必要があります。
[dockerのデータボリュームとそのバックアップ方法](https://qiita.com/74th/items/41393f506d223850f2c3) を参考にバックアップします。

```bash:volume-backup.sh
#!/bin/bash

export now=`date '+%Y%m%d%H%M%S'`
for vol in $(docker volume ls | awk '2<=NR{print $2}'|grep -v  '^[a-z0-9]\{64\}$')
do
    backup_to="${vol}-${now}.tgz"
    echo "backup volume ${vol} to ${backup_to}"
    docker run --rm -v ${vol}:/volume -v `pwd`:/media busybox tar cfz /media/${backup_to} . -C /volume
done
```

ボリューム名にハッシュ値が使われているものは、除外します。


## Remove all Data

<img width="191" alt="Docker for Mac の Reset画面" src="https://qiita-image-store.s3.amazonaws.com/0/145742/b41a6014-e920-afe9-289f-6424355dc8c0.png">

Reset タブの `Remove all Data`を実行すると、Dockerが停止し、データファイルが作り直されます。データファイルが作り直されることで、データの削除が行われます。


## リストア

### コンテナをリストア

[`docker load`](http://docs.docker.jp/engine/reference/commandline/load.html) でリストアします。

```bash
$ docker load -i all-images.tar
```

バックアップで作成した all-images.tar に入っている複数のイメージをリストアします。

### データボリュームをリストア

ボリュームのバックアップしたファイル名には、ボリューム名とバックアップ日時が付与されているので、ボリューム名を取り出してリストアします。

```bash:volume-restore.sh
#!/bin/bash

for f in $(ls *.tar.gz)
do
    [[ ${f} =~ ^(.*)-([0-9]{14}).tar.gz$ ]]
    volume_name=${BASH_REMATCH[1]}
    echo restore image ${volume_name} from ${f}
    docker volume create ${volume_name}
    docker run --rm -v ${volume_name}:/volume -v `pwd`:/media busybox tar xvfz /media/${f} -C /media
done
```


## 参考
* https://qiita.com/74th/items/41393f506d223850f2c3
【Python】シグモイド関数 / 複雑な関数定義

##やりたいこと
- シグモイド関数がどのように機械学習に利用されているのかを知る
- シグモイド関数のように複雑な関数の定義をして簡単に呼び出せるようにする

##シグモイド関数とは
以下の数式をシグモイド関数と呼ぶ。生物の神経細胞の仕組みを表しています。ニューラルネットワークの概念をこの数式で操作しているようです。

```math
f(x) = \frac{1}{1+e^{-ax}} \ \ (a>0)
```
グラフで表すと、

<img width="544" alt="スクリーンショット 2018-01-03 1.05.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/174991/d528c197-64d9-d55e-062c-de4236391f66.png">

ここから言える意味は、x=0, x=1,...と増やして行くと、ゆっくりと正確な結果(確率1 = 100%)に近ずいて行くということです。逆も然りですね。
学習して正確な値だったかを学習し、それを繰り返すことで人間のように正確な判断をしているのだと思います。
よって、このxに入る値が学習内容そのものであって、yが結果の整合性を示していると考えられます。
(機械学習めっちゃやっている人いたら、ここら辺突っ込んでください)

##グラフ出力をするためのコード

```math_training.py
import matplotlib.pyplot as plt
import numpy as np
import math

x = np.arange(-10, 10, 0.1)
e = math.e

y = 1 / (1 + e**-x)

plt.plot(x, y)
plt.show()
```
aは定数なので一旦抜いておきます。

##いちいち複雑な関数を書くのは面倒なので定義しちゃう
```math_training.py
import matplotlib.pyplot as plt
import numpy as np
import math

def sigmoid(a):
    s = 1 / (1 + e**-a)
    return s

x = np.arange(-10, 10, 0.1)
e = math.e

y = sigmoid(x)

plt.plot(x, y)
plt.show()
```
pythonはphpなどの言語と比べてセミコロンがないので楽ですね。変な癖をつけないように切り替え大事ですね。
【Python】ネイピア数をグラフにプロットする

##やりたいこと
指数関数をグラフにプロットする

※準備するものは以下のURLを参照してください。
https://qiita.com/Cesaroshun/items/69c9fad0cd24322559b2

##ネイピア数とは
高校数学に出てくる自然対数の底ですね。
具体的には以下のような数字を示します。

`e = 2.71828 18284 59045 23536 02874 71352 …`

ちなみに僕の大学の研究室の暗証番号がこのネイピア数から、2718でした。数学科は気持ち悪いですね！！

##Pythonにおけるネイピア数の使い方
ネイピア数を用いて以下の数式を表現することができます。

```math
\lim_{n \to \infty} (1 - \frac{1}{n})^n = \frac{1}{e} ≒0.367879⋯
```

確率的に考えると、当たる確率が1/nの宝くじを引くとします。
また、引いたくじは戻すというルールです。
上の式はn回くじを引いて、外れる確率を表しています。
それで行くと、1回で外れる確率はもちろん0%

```math
(1 - 1)^1 = 0
```

nを限りなく大きくして行くと、外れる確率は期待値に反して少しずつ高まっていき、0.367879⋯に収束して行くことがわかっています。これを以下のように考えようというのがネイピア数の一部の考え方です。

```math
\frac{1}{e} ≒0.367879⋯
```
よって、1/nの確率で当たるくじも、無限に引いていったら外れる確率はおよそ37%です。
こんな感じで、機械学習に応用していると思います。（まだ機械学習の実装はしたことない）

##手順
- ネイピア数を使うために、mathパッケージをインストール
- ネイピア数を定義
- グラフプロット実行

##まとめて結論
以下の記述を行う。

```ruby:math_training.py
import matplotlib.pyplot as plt
import numpy as np
import math

x = np.arange(0, 10, 0.1)

/*mathパッケージでe(ネイピア数)を定義*/
e = math.e

y = e**x

plt.plot(x, y)
plt.show()
```
以下のグラフが出力される
<img width="637" alt="スクリーンショット 2018-01-03 0.44.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/174991/bb2ed8c3-68a3-67ee-e1e1-b68e43d10c60.png">

x=0でy=1が確認できました。
rex0220 更新確認プラグイン

kintone アプリの更新された項目を確認出来るプラグインです。

メンバが更新した内容をリーダが確認する業務に有効です。

- 更新確認対象項目を指定（テーブル内項目は対象外）
- 詳細画面表示で、更新項目の値を赤表示
- 一覧画面で、更新項目の値を赤表示
- 更新確認対象グループ指定

※動作環境は、PCです。

[rex0220 stores](https://rex0220.stores.jp)で、販売中です。

※Ver.6 変更点
・モバイル対応
・プラグイン設定のダウンロード＆アップロードで、IE チェックを削除
・プラグイン設定の圧縮方法を変更
・プラグイン設定のグリッドライブラリ変更
・グリッド表示 Ver.21 以降と連携

# 詳細画面表示例

- 更新項目の値を赤表示

<img width="1128" alt="2018-01-02_22h09_13.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/ae9aeb97-3a21-45f5-e9fe-4b67f8aecf41.png">

- 更新確認ボタンクリックで、更新確認情報をリセット

<img width="1128" alt="2018-01-02_23h46_48.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/43fad5a2-9609-f3f2-a1da-fed090dd2b72.png">


# 一覧画面表示例

- 更新レコードのアイコン背景色が指定色で表示および更新項目の値を赤表示

<img width="1128" alt="2018-01-02_23h38_28.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/17831cf8-ee9a-d3e8-2800-2c2c875cc3a9.png">

- 更新確認ボタンクリックで、一覧表示レコードの更新確認情報をリセット

<img width="1128" alt="2018-01-02_23h51_13.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/f0f61199-99d7-2e3b-adba-a5dc2f838080.png">



# プラグイン設定手順

## ユーザー管理画面で、確認グループを追加

確認グループと所属ユーザーを追加します。

<img width="1128" alt="2018-01-03_00h08_52.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/c71486e4-aa9c-8a85-dde8-8ad87b44ebbf.png">



## アプリに更新確認プラグインの制御用項目を追加

更新確認プラグインの制御用項目として、「文字列（１行）」を追加します。

<img width="1128" alt="2018-01-02_23h57_29.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/499de491-b443-ee34-bad0-66faf9ed83f1.png">

## プラグインの追加

- 「kintone システム管理 > プラグイン」で追加します。
- 「アプリの設定 > プラグイン」で、アプリに追加します。


<img width="993" alt="2018-01-03_00h01_07.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/62e4da18-6beb-c59a-f2bd-8e9bd2b5f9e8.png">

## プラグインの設定

- 基本設定
    - プラグイン制御用項目<br>
    プラグインの制御用項目を選択します。<br>
    制御用項目は、詳細画面・編集画面で非表示になります。
    - 一覧更新確認背景色<br>
    詳細リンクアイコン背景色を選択します。
    - 更新確認権限グループ<br>
    確認用グループを指定します。

<img width="871" alt="2018-01-03_00h03_27.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/d0c9d1c1-4d28-3640-c832-6e9dc493bc44.png">

- 対象一覧

更新確認対象の一覧画面を選択します。

<img width="868" alt="2018-01-03_00h04_52.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/a410204a-ea32-2759-551a-42fac3b6f66c.png">

- 更新確認項目

更新確認対象の項目を選択します。

<img width="867" alt="2018-01-03_00h05_09.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/dfd3b21d-e8a1-ee9c-8632-dcee9b78b079.png">


# プラグイン設定のダウンロード

- プラグイン設定をダウンロードできます。
- 設定を変更している場合は、変更後の設定が対象です。
- ブラウザ IE については、プラグイン設定のダウンロードの動作対象外です。

<img width="887" alt="2018-01-03_00h21_12.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/a2fe527d-3f77-8613-f98b-917c340e61e9.png">

# プラグイン設定のアップロード

- プラグイン設定をアップロードできます。
- ViewIDをキーにして、設定ファイルから対象一覧設定します。
- フィールドコードをキーにして、設定ファイルから更新確認項目を設定します。
- ブラウザ IE については、プラグイン設定のアップロードの動作対象外です。

<img width="886" alt="2018-01-03_00h24_36.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/9fd477c6-b916-3a30-e96b-6756776d0ef7.png">

#注意事項
- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
as_strided method in numpy.lib

```python
from numpy.lib import stride_tricks

def rolling(a, window):
    print(a)
    shape = (a.size - window + 1, window)
    print(shape)
    strides = (a.itemsize, a.itemsize)
    print(strides)
    return stride_tricks.as_strided(a, shape=shape, strides=strides)
Z = rolling(np.arange(10), 3)
print(Z)
```
```
[0 1 2 3 4 5 6 7 8 9]
(8, 3)
(8, 8)
[[0 1 2]
 [1 2 3]
 [2 3 4]
 [3 4 5]
 [4 5 6]
 [5 6 7]
 [6 7 8]
 [7 8 9]]
```
# Refs.
* [itemsize](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.itemsize.html)
* [numpyのas_stridedはどのように使うのか](https://qiita.com/daimonji-bucket/items/7d04a9687e7714d6216b)  
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.lib.stride_tricks.as_strided.html
Calculating moving average using a sliding window

```python
def moving_average(a, n=3) :
    ret = np.cumsum(a, dtype=float)
    print(ret)
    print(ret[n:])
    print(ret[:-n])

    ret[n:] = ret[n:] - ret[:-n]
    print(ret)
    return ret[n - 1:] / n
Z = np.arange(20)
print(Z)
print(moving_average(Z, n=3))
```
```
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
[   0.    1.    3.    6.   10.   15.   21.   28.   36.   45.   55.   66.
   78.   91.  105.  120.  136.  153.  171.  190.]
[   6.   10.   15.   21.   28.   36.   45.   55.   66.   78.   91.  105.
  120.  136.  153.  171.  190.]
[   0.    1.    3.    6.   10.   15.   21.   28.   36.   45.   55.   66.
   78.   91.  105.  120.  136.]
[  0.   1.   3.   6.   9.  12.  15.  18.  21.  24.  27.  30.  33.  36.  39.
  42.  45.  48.  51.  54.]
[  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.  11.  12.  13.  14.  15.
  16.  17.  18.]
```
# Refs.
* [numpy.cumsum](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.cumsum.html)  
cumulative:累積的な
* [定番のConvolutional Neural Networkをゼロから理解する](https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)
* [移動平均](https://ja.wikipedia.org/wiki/%E7%A7%BB%E5%8B%95%E5%B9%B3%E5%9D%87)
ゲームプログラマになる前に覚えておきたいVisual C++のこと1 - プロジェクト立ち上げ編

ゲームプログラマになると，サーバーサイドやブラウザのみのゲーム，iOSのみが対象，
ということが無ければ，Visual Studioを使うと思います．
そして，研修などでプロジェクトの立ち上げから経験する機会や
プロジェクトの設定を変更する機会もあるかと思います．

そこで，プロジェクト立ち上げ時などに気にしておいた方が良いポイントをまとめてみました．
なお，ここではVisual Studio 2012以降を想定しています．

# ライセンス
最近のVisual Studioには，Community，Pro，Enterpriseの3つのライセンスがあります．
個人や教育で使う分にはCommunityで十分なのですが，多くの企業ではライセンスの関係上，利用できません．
これは下請けであってもダメなのです．
([Visual StudioとMSDNのライセンスホワイトペーパー参照](https://www.microsoft.com/ja-jp/download/details.aspx?id=13350 "Visual StudioとMSDNのライセンスホワイトペーパー参照"))

最近はUnityなどのゲームエンジンと同時にCommunityエディションのVisual Studioが入ってしまう場合が
ありますが，会社として使っていけない場合，上司と相談の上，速やかに削除するようにしましょう．

Visual Studio以外のソフトウェアやオープンソースを利用する場合にも，
プログラマはライセンスを意識しておく必要があります．

2018/1/03 追記
無償で商用利用可能なExpressも残っているようですが，拡張機能が使えないので，
家庭用ゲーム機向けの開発などでは使えない場合もあるでしょう．
また，なるべくダウンロードできないようにしていたり，それでもExpressを使いますか，
と聞いてくるようにMicrosoftとしても使って欲しくない感じがあります．
CommunityまたはProに移行するなどを検討しておいた方が良いでしょう．

# バージョン管理に含めるファイル，含めないファイル
仕事として開発をする場合，複数人で開発することがほとんどでしょう．
その場合，バージョン管理は必須になります．
Visual Studioで開発をする場合，自動生成されるファイルのうち，
バージョン管理に含めないといけないファイルと，
含めるとコンフリクトが多発して困ってしまうファイルがあります．
通常は，開発に参加した時点で無視リストに入ったりしていると思いますが，
研修などで立ち上げから体験する場合，自分で無視リストを構築する必要があるので，
どのファイルはバージョン管理に含めた方が良くて，
どのファイルは含めない方が良いのか知っておいた方が良いです．

Visual Studioには，*.vcxprojというファイルがあります．
これは，プロジェクトのプロパティで設定できる項目をまとめたXMLファイルで，
バージョン管理に含める必要があります．

ユーザ別のプロジェクト設定は，*.vcxproj.userというファイルにまとめられています．
このファイルは，バージョン管理に含めるとコンフリクトを起こす可能性があるので，
含めてしまわないよう無視リストにいれておくなど注意しましょう．

ソリューションエクスプローラに表示されるツリー構造は，*.vcxproj.filterという
ファイルにまとめられています．このファイルは，当然バージョン管理に含める必要があります．

Visual Studioのプロジェクトは，ソリューションという形でまとめられて管理されています．
ソリューションは，プロジェクトが1つしかなくても存在します．このソリューションについての情報は，
*.slnというファイルにまとめられています．このファイルは，バージョン管理に含める必要があります．

ソリューションに関するファイルがもう一つあり，*.suoというものです．
これは，ユーザ別の設定をまとめたものなので，バージョン管理には含めません．

他には，インテリセンスなどに利用される*.sdfはバージョン管理に含めない方が良いでしょう．
たまに壊れたりすることもあるので，インテリセンスがおかしいな，と思ったら削除するのも手です．

また，プリコンパイル済みヘッダを利用している場合，ipchというフォルダに保存されますが，
こちらも手元のちょっとした変更などが反映されてしまうかもしれないので，
バージョン管理に含めないほうが良いでしょう．

まとめると，以下のようになります．

- バージョン管理に含めるファイル
    - *.sln
    - *.vcxproj
    - *.vcxproj.filter
- バージョン管理に含めないファイル
    - *.suo
    - *.vcxproj.user
    - *.sdf
    - ipch

# その他ちょっとしたTips
メニューからツール(T)を選び，カスタマイズを選択すると，ツールバーやメニューバーを編集できます．
コマンドタブでツールバーから標準を選択し，ソリューション構成などを選び，
選択したボタンの編集を押すと，幅などが変更できます．
通常のDebugやReleaseのみなら問題ないのですが，
例えば，東京ゲームショー向けの設定でビルドをする場合や，体験版の設定でビルドする場合など，
独自のソリューション構成やプラットフォームが用意されている場合，
ここの幅を大きくしておかないと入りきらないことがあるので，
設定間違いを防ぐためにも大きめに設定しておくと良いです．
【Python】指数関数をグラフにプロットする

##やりたいこと
指数関数をグラフにプロットする

※準備するものは以下のURLを参照してください。
https://qiita.com/Cesaroshun/items/69c9fad0cd24322559b2

##手順
- 指数関数を定義
- グラフプロット実行

##まとめて結論
以下の記述を行う。

```ruby:math_training.py
import matplotlib.pyplot as plt
import numpy as np
import math

x = np.arange(0, 10, 0.1)

y = 2**x

plt.plot(x, y)
plt.show()
```
以下のグラフが出力される
<img width="641" alt="スクリーンショット 2018-01-03 0.00.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/174991/1734e0d2-28b9-ee18-270a-d558411797da.png">
bincount and repeat method in numpy

```python
C = np.bincount([1,1,2,3,4,4,6])
print(C)
l = len(C)
print("l:"+str(l))
A = np.arange(len(C))
print(A)
A = np.repeat(A, C)
print(A)
```
```
[0 2 1 1 2 0 1]
l:7
[0 1 2 3 4 5 6]
[1 1 2 3 4 4 6]
```
【Python】2次関数をグラフにプロットする

##やりたいこと
2次関数をグラフにプロットする。

※準備するものは以下のURLを参照してください。
https://qiita.com/Cesaroshun/items/69c9fad0cd24322559b2

##手順
- 2次関数を取得する
- 2次関数をグラフにプロット実行

##まとめて結論
以下のように記述する。

```ruby:math_traning.py
import matplotlib.pyplot as plt
import numpy as np

/* -10 < x < 10 */
x = np.arange(-10, 10, 0.1)

/* y = x^2 + 10x + 1*/
y = x**2 + 10*x + 1

/*グラフへのプロット実行*/
plt.plot(x, y)
plt.show()
```
実行すると、以下のグラフが出力される。
<img width="638" alt="スクリーンショット 2018-01-02 23.49.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/174991/81ed2cdb-34db-fd5b-e122-a0a497ebdeee.png">
【Python】1次関数のグラフをプロットする

##やりたいこと
1次関数のグラフをプロットする

##手順
- 必要なpackageをインストール
- xの値を取得
- yの値を取得
- プロット実行

##必要なpackageをインストール
必要なpackageは以下

- pip
    - packageを管理するためのpackage
- matplotlib
    - 様々な数式の描画を行うことができるpackage(これでグラフをplotする)
- numpy
    - 様々なデータを効率よく扱うことのできるpackage

##インストール方法

- 新しくファイルを作成
- 画面上部のPyCharm Community Editionをクリックし、Preferenceをクリック
- サイドバーの自分のプロジェクトをクリック
- Project Inspectorをクリック
- 右画面の[+]をクリック
- 検索窓にて先ほどの3のpackageを検索し、インストール実行

##x,yの範囲を取得
```ruby:math_traning.py
/*インストールしたpackageをimport*/
import matplotlib.pyplot as plt
import numpy as np

/*numpy内のarangeメソッドを用いて値の変域と刻みを設定*/
/* 0 < x < 10 */
x = np.arange(0, 10, 0.1)

/* 0 < y < 20 */
y = x * 2
```

##プロット実行
```ruby:math_traning.py
/*インストールしたpackageをimport*/
import matplotlib.pyplot as plt
import numpy as np

/*numpy内のarangeメソッドを用いて値の変域と刻みを設定*/
/*0 < x < 10*/
x = np.arange(0, 10, 0.1)

/*0 < y < 20*/
y = x * 2

/* y = x をグラフにplot*/
plt.plot(x, y)

/*実際にグラフに出力*/
plt.show()
```
すると以下のようにグラフが出力される。

<img width="640" alt="スクリーンショット 2018-01-02 23.38.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/174991/ee87c941-4bd7-a471-6ebd-0d12373286ae.png">
さくらのブログをマークダウンで書きたい⇒エディタでHTMLを吐出してペースト。

# 概要

## 解決したいこと
「さくらのブログ」でもマークダウンで書きたい！⇒別途マークダウンで作成して、HTMLに吐出して貼り付けすればいいじゃないか。では、どんなマークダウンエディタが手軽？

## 対象者

- 新規のマークダウンエディタを導入するのは、出来れば避けたい。
- Visual Studio Code （以降VS Code、と略）を既に使っている。
- Node.jsの動作環境が既にある。
- Windows環境(に限らないが、当方はWindows環境で動作確認)。

# 解決方法

マークダウンエディタで書いて、HTMLソースを吐出してペーストすればよい。VS Codeがマークダウンエディタの機能を持っているので、**マークダウンエディタにはVS Code**を使えばよい。変換はNode.jsのライブラリを使う（コマンド一行で変換できる）。

# 操作の流れ

具体的には以下のようにする。

1. Node.jsのライブラリ「markdown-it」を導入する。
    - これは**初回だけ**。
    - グローバルインストールしても良いが、任意の「下書き用フォルダ」を作成して、そこへローカルインストールするのが個人的なお勧め。
    - あとあとの管理を考慮して、適当に「`npm init`」コマンドをたたいて`package.json`を生成しておく（入力値は全部デフォルトでも構わない）。
    - 続いて「`npm install markdown-it --save`」でインストール（`npm init`しない場合は、`npm install markdown-it`でOK）。
    - このmarkdown-itモジュールは1MB程度。
2. `*.md`というファイル名で、下書き記事のファイルを作成する。
    - この拡張子のファイルを「マークダウンファイル」と認識してくれるみたい。
        - 以下の事例では「article.md」としている。
    - プレビューも出来るし、プレビュー画面は編集操作に応じてリアルタイムで更新される（後述）。
    - 文字コードはUTF-8推奨（Shift-JISでの動作は不明。試してない）。
3. mdファイルからHTMLファイルへの変換は、コマンドラインから「`node_modules\.bin\markdown-it.cmd   article.md   -o article.html`」を実行する。
    - `article.md`が変換元のマークダウンファイル。下書きファイル。
    - `article.html`が変換したHTMLソースの出力ファイル名。
    - `markdown-it`インストール時に「グローバルインストール」した人は、「`markdown-it.cmd   article.md   -o article.html`」でもOKのハズ。
4. htelファイルを開いて、生成されたタグごと「さくらのブログ」へ貼り付ければ完了。

## 操作の様子（スクリーンショット）

*.mdの拡張子で作成したファイルは、マークダウンファイルとして扱ってくれる。
![1.こんな感じでマークダウンで書く.png](https://qiita-image-store.s3.amazonaws.com/0/125588/12e4822e-aa69-cc75-6cfc-8416f3dab1d8.png)

編集中に「Ctrl + K」押して続けて「V」を押すと、画面が2分割されてプレビュー出る。このプレビュー画面は、編集操作がリアルタイムで反映される。

※最新版だと仕様が変わった？「Ctrl＋Shift＋V」で新しいタブでプレビューを開けた。(2018/1/19)


![2.プレビュー出来る。リアルタイムで反映される.png](https://qiita-image-store.s3.amazonaws.com/0/125588/5e8977c8-db7a-3e71-7270-f68592ffce12.png)

変換後のHTMLファイルはこんな感じになる。
![3.吐出されたHTMLファイル.png](https://qiita-image-store.s3.amazonaws.com/0/125588/bd3cceab-c48e-1f35-c4df-3a6800647dce.png)

このHTMLソースをコピーして、「さくらのブログ」の編集画面に張り付ければOK。なお、「詳細設定」にある「改行HTMLタグ変換」は**「改行を<br/>タグに変換しない」を選択**しておくことをお勧めする。

上記を実際に張り付けたブログ記事の例はこちら。
⇒「Intel CPUの変遷を、主にモバイル観点でまとめてみる」http://fluorite2.sblo.jp/article/181999776.html


# 参考サイト

- Markdown and VS Code https://code.visualstudio.com/Docs/languages/markdown
ApacheのGraceful StopがSIGWINCHなのは何故か

# 背景
httpd.serviceの中を覗いたとき、execstopが`kill -WINCH`を呼んでいるのを見つけた。
一体なぜ `SIGSTOP`ではなく`SIGWINCH`なのか気になった。
![httpd-service.PNG](https://qiita-image-store.s3.amazonaws.com/0/82224/e3e3f8f8-94d3-b9bd-8672-b394ca80b06b.png)

# 結論
仕様
だけど、なぜそういう仕様なのかは分からない。

### 環境
- CentOS7.1.503
- 3.10.0-229.el7.x86_64
- vmware player

### signalの調査
まずは、`man 7 signal`でSIGSTOPとSIGWINCHを見てみる。
![sigstop.PNG](https://qiita-image-store.s3.amazonaws.com/0/82224/2228bcfc-4397-4471-c1dd-3fae85ac448a.png)
![sigwinch.PNG](https://qiita-image-store.s3.amazonaws.com/0/82224/696cd8a7-6676-f9e0-9774-157afffa4a88.png)

* `SIGWINCH`はウィンドウリサイズを通知するシグナル
* `SIGWINCH`はデフォルト動作が無視される。
* `SIGSTOP`はデフォルト動作が停止。

他のプロセスウィンドウリサイズを通知すると止まるのか。(止まらないはずだけど念のため)
![test2.gif](https://qiita-image-store.s3.amazonaws.com/0/82224/56ee5ff6-259f-01a1-ae9b-e8736d3ee556.gif)

## apache側の説明
> The WINCH or graceful-stop signal causes the parent process to advise the children to exit after their current request (or to exit immediately if they're not serving anything).

残念ながら、なぜWINCHなのかの説明はなさそう。
Apach Doc: https://httpd.apache.org/docs/2.4/en/stopping.html

### stack over flow
[SOF先生](http://stackoverflow.com/questions/780853/what-is-in-apache-2-a-caught-sigwinch-error)に聞いてみるとこんな回答があった。

> uh? if I remember correctly, SIGWINCH is a signal that get sent to a terminal application when the size of the terminal window changes (so that the application can resize itself). Typically used by ncurses applications.

なるほど`ncurses`というアプリケーションの場合はそう言った挙動らしい。

### apacheの処理をみる
[gihubにあるhttpdの76行目と78行目](https://github.com/apache/httpd/blob/f6e8b1feaa2a24ffad9814f8ba83d208af95d737/include/mpm_common.h#L76)で指定している。
commitを追ってみると[このcommitの修正](https://github.com/apache/httpd/commit/5741b3ef26c70cafff67ce41634b7505bce5ead0#diff-77e4610f709fe988964c8770c88f1d4eR518)でSIGWINCHをrestartに割り当てている。(修正前はSIG_IGNなので無視されるようになっている。実装前だったから？)
[その下の](https://github.com/apache/httpd/commit/5741b3ef26c70cafff67ce41634b7505bce5ead0#diff-77e4610f709fe988964c8770c88f1d4eR896)子プロセスが受け取った場合は何もしないけど親プロセスにgraceful restartする旨を伝えると書いてあります。

ncursesは関係ないみたいです。

### SOF2
> This as designed, see bz.apache.org/bugzilla/show_bug.cgi?id=50669

[リンク先](https://bz.apache.org/bugzilla/show_bug.cgi?id=50669)をみるとこう解説されています。

> httpd normally runs detached from a terminal the SIGWINCH signal was chosen to instruct httpd to do a graceful shutdown. So this works as designed.

**仕様!!**　らしいです。
仕様なら仕方ない...
なぜそういう仕様になったのかは分かりませんでした。ご存知の方がいらしたらご教授いただきたいです。

補足?
[以前SIGWINCHを直接読んでたみたいですが、AP_SIG_GRACEFULに置き換わったみたいです](https://svn.apache.org/viewvc?view=revision&revision=91076)
配列の値をWEBページに表示する方法


## 機能
配列の値をランダムに表示する

## サンプルコード
```index.php
<?php
function h($s) 
  return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}

$QuizSet = [];
$QuizSet = [
  'q' => 'What is a ?',
  'a' => ['a1', 'a2', 'a3', 'a4']
];

shuffle($QuizSet['a']);
?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Quiz</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  </ul>
    <?= $QuizSet['q'] ?>
    <?php foreach ($QuizSet['a'] as $a) : ?>
      <li><?= h($a) ?></li>
    <?php endforeach; ?>
  </ul>
</body>
</html>
```
Ruby学習者のためのリポジトリ「CodeYourRuby」をもっともっと広めたい

## CodeYourRubyとは

* Ruby学習者が書いたコードを、Ruby上級者にレビューしてもらえるリポジトリ
* リポジトリにお題がコミットされているので、それを満たすコードを書いてプルリクを送るとレビューしてもらえる。
* __「一通りRuby本読んだけど、これで仕事できるレベルなのかよくわからないなあ。不安だなあ。」__という人向け
* リポジトリはコチラ
    * [code-your-ruby | GitHub](https://github.com/chooyan-eng/code-your-ruby)
    
---

## CodeYourRubyを作ったきっかけ

* プログラミング歴 ＝ Java歴の僕がRubyを勉強してみた
    * [プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7) ← とても良いRuby本！
* 一通り読み終わったところで、ふと思った
    * 「これで実際にRubyで仕事できるんだろうか、、、？」
    * 「実際Rubyで仕事している人のコードや考え方も見てみたいなあ」
    * 「でもそういうのって実際仕事してみるまで分からないよなあ、、、」
    * 「OSSのコード読んでも意図が分からないしなあ、、、」

---

### そうだ！コードレビューだ！

* 仕事にするには「議論」が必要！
    * ひとつの具体的なコードを見ながら議論することで、何をどう考えてプログラムを書くとより良くなるのかを知ることができ、次の自分のコードに活かせる。
    * コードレビューは、自分が最も知っているコードを利用するので、学習者の土俵で議論ができる。
  
---

### よし、作ろう

---

## 作りました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134943/d59a687d-6baf-7d65-d867-84dc2c76fe04.png)

---

## CodeYourRubyの課題

* レビュワーもレビュイーも任意参加
    * __人が集まらないと始まらない！__

---

## 【案】CodeYourRubyを採用活動に利用する

* レビューは実際に仕事する上で大事な様々な能力が見られる
    * 仕様の理解 => 仕様書の内容を誤解して指摘をしていないか？曖昧な部分は確認できているか？
    * 開発経験 => 「実際の現場では」の視点でコメントできているか
    * コミュニケーション能力 => オープンな場で、初心者のレビュイーに配慮した言葉選びができているか

* 応募者のレビューの内容を採用担当が見ることで、応募者の適正を判断する

---

## 【案】CodeYourRubyを採用活動に利用する

### つまり、、、

初心者は真剣にレビューしてもらえて、レビュワーは自分のスキルを示すことができ、採用担当は応募者のスキルを見られてWin-Win-Win

詳細はコチラ！
[ペライチ主催のイベント「クラフトビールを飲みながらエンジニアと交流しよう 」でLTしてきました](https://chooyan-eng.hatenablog.com/entry/2018/02/14/182459)

---

### というわけで

---

### CodeYourRubyをもっと使ってもらいたい！

---

## CodeYourRubyの良いトコロ

* 実際の開発でありそうな雰囲気の要件に沿ってコードを書けます。
* 実際にRubyで仕事している人とコミュニケーションが取れます。
* 「一般的なレビュー」を体験できます。ローカルルールフリー！
* オープンな場でのプルリクの練習ができる。オープンソースへのコントリビュートの前の練習に。

---

## 最初のプルリクの様子

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134943/a626c5f5-f661-d20c-2ce1-92d0ceb54466.png)

---

## 最初のプルリクの様子

* https://github.com/chooyan-eng/code-your-ruby/pull/1
* 例題として用意したFizzBuzzで予想外に盛り上がりました。
* プルリク出してくれた @ryo2132 さん、レビューしてくれたみなさま、ありがとうございます！

---

### というわけで

---

### CodeYourRubyをもっと使ってもらいたい！（再掲）

---

## リンク集

* CodeYourRubyリポジトリ
    * https://github.com/chooyan-eng/code-your-ruby
* CodeYourRuby紹介記事
    * [これからRubyで仕事したい人のためのリポジトリ「Code Your Ruby」を作りました| Qiita](https://qiita.com/chooyan_eng/items/46f5724202f90ab4004d)
ババァ！ノックしろよッ！ってならないためのlinuxパーミッション入門

# 思春期あるある

![9b73bf62b9b5c5d2c59dd69c7127a6c6.jpg](https://qiita-image-store.s3.amazonaws.com/0/74851/18a17110-2c11-d1ed-412a-7b42e844cf13.jpeg)

> ※ 進撃の巨人 予告より

思春期を超えたことがあるみなさんなら

共感していただけると思うのですが、

突然親が部屋に来訪してくるとビビりますよね。

やましいことがあってもなくてもビビりますよね。


今回は、

```
linuxなら、
親が勝手に部屋に入ってこれなくなるので、
安全だよ
```

という話をしようと思います。


# 環境を用意する

今回はCentOS7を環境として用意しました。

軽く試したい時、dockerさんにはとてもお世話になっております。。。

```bash
$ docker run -it centos:centos7
```


## 母ユーザと俺ユーザを作成し、それぞれの部屋を作成
```bash
$ useradd haha
$ useradd ore
```

なお、ここで

```bash
$ cat /etc/passwd
```

とすると、以下のようにユーザが追加されていることがわかります。

```bash
ore:x:1000:1000::/home/ore:/bin/bash
haha:x:1001:1001::/home/haha:/bin/bash
```

また、

```bash
$ ls /home
haha  ore
```

となっており、homeディレクトリにhahaとoreディレクトリが追加されています。

userを追加すると、それぞれのユーザが使える部屋も同時に追加される感じですね。


# 俺の部屋で怪しい本を生成

```bash
$ su ore
$ cd /home/ore
$ touch ayashii_book
```

俺の部屋に怪しい本をおきます。


# 母親が俺の部屋に入ろうとすると、、、
```bash
$ su haha
```
ユーザを母親に切り替えます。

```bash
$ cd /home/ore
bash: cd: ore: Permission denied
```

<span style="color: #ff5252"><span style="font-size: 150%">母親は、俺の部屋に入れない！
</span></span>


# なぜ部屋に入れないのか

ここでoreディレクトリの

パーミッションを確認してみましょう。

```bash
$ ls -la
drwx------. 2 ore  ore  4096 Dec 22 15:48 ore
```

このパーミッションを図にすると、

以下のようになります。

![Untitled (18).png](https://qiita-image-store.s3.amazonaws.com/0/74851/705b42ae-34fb-46d0-b2ae-f0a079275e1c.png)

つまり、

* oreディレクトリは、oreユーザに対して、読み、書き、実行を許している

* 他のユーザに対しては何も許していない

ということになります。

だから、hahaユーザは入ることもできないのです。

やったね！

（ディレクトリの場合、

　実行権＝そのディレクトリに入れる権利

　であることは覚えておきましょう）

[http://dqn.sakusakutto.jp/2011/11/linuxx.html]



# どうしたら母が入れるようになるのか

ディレクトリに入れるようにするためには、

このディレクトリに対して、

othersが実行権を持てばよいです。

![Untitled (20).png](https://qiita-image-store.s3.amazonaws.com/0/74851/8437e1da-40c8-878a-dafd-038cecf363e8.png)


実際にやってみましょう。

```bash
$ su ore
$ chmod 701 ore
$ drwx-----x. 2 ore  ore  4096 Dec 22 15:48 ore
```

この701とは何か、ということですが、

これはrwxのパーミッションを数字で表したものになります。

末尾の１が、実行権を表してます。

（こちらについてはまた解説いたします）

```bash
$ su haha
$ cd ore
```

<span style="color: #ff0000"><span style="font-size: 150%">入れました！
</span></span>


## しかし、部屋の中に何があるかはみれない

俺の部屋でlsをしてみます。

```bash
$ ls
ls: cannot open directory .: Permission denied
```

なるほど。部屋には入れるけど

中はみれないのか。


# 今度はothersに読み取り権限を与える

今度は、以下の図のようにします。

![Untitled (19).png](https://qiita-image-store.s3.amazonaws.com/0/74851/83f2507f-5031-23d0-18c6-aaf5a4b5108e.png)

今度はothersに読み取り権限を与えてみましょう。

```bash
$ su ore
$ cd /home
$ chmod 705 ore
```

# 母親、再来

```bash
$ su haha
$ cd /home/ore
```

![b0061947_23331098.jpg](https://qiita-image-store.s3.amazonaws.com/0/74851/e7332a0e-0501-acdd-41bf-b1bb00cae482.jpeg)


```bash
$ ls
ayashii_book
```

<span style="font-size: 150%"><span style="color: #ff5252">見つかったッ！
</span></span>

※　くだらなくて申し訳ありません


# まとめ

このように、

思春期はlinuxでuseraddすれば、

母親が入れない部屋（ホームディレクトリ）が生成されるので

健やかな日々を送れると思います。


みなさんも、

パーミッションをうまく利用して快適ライフを送りましょう。

# 参考
https://eng-entrance.com/linux-permission-basic
Samples using numpy.repeat, roll, len, sort and unique method in multi dimensional matrix

```python
faces = np.random.randint(0,100,(10,3))
print("l:"+str(len(faces)))
print(faces)
X = faces.repeat(2,axis=1)
print(X)
F = np.roll(X,-1,axis=1)
print(F)
l = len(F)*3
print("l:"+str(l))
F = F.reshape(l,2)
print(F)
F = np.sort(F,axis=1)
print(F)
print("====G====")
G = F.view( dtype=[('p0',F.dtype),('p1',F.dtype)] )
print(G)
G = np.unique(G)
print(G)
```
* e.g.

```
l:10
[[69 31 69]
 [44  2 85]
 [ 2 98 98]
 [69  1 43]
 [15  7 92]
 [68 78 69]
 [70 43 72]
 [81 85 36]
 [75 60 28]
 [48 92  5]]
[[69 69 31 31 69 69]
 [44 44  2  2 85 85]
 [ 2  2 98 98 98 98]
 [69 69  1  1 43 43]
 [15 15  7  7 92 92]
 [68 68 78 78 69 69]
 [70 70 43 43 72 72]
 [81 81 85 85 36 36]
 [75 75 60 60 28 28]
 [48 48 92 92  5  5]]
[[69 31 31 69 69 69]
 [44  2  2 85 85 44]
 [ 2 98 98 98 98  2]
 [69  1  1 43 43 69]
 [15  7  7 92 92 15]
 [68 78 78 69 69 68]
 [70 43 43 72 72 70]
 [81 85 85 36 36 81]
 [75 60 60 28 28 75]
 [48 92 92  5  5 48]]
l:30
[[69 31]
 [31 69]
 [69 69]
 [44  2]
 [ 2 85]
 [85 44]
 [ 2 98]
 [98 98]
 [98  2]
 [69  1]
 [ 1 43]
 [43 69]
 [15  7]
 [ 7 92]
 [92 15]
 [68 78]
 [78 69]
 [69 68]
 [70 43]
 [43 72]
 [72 70]
 [81 85]
 [85 36]
 [36 81]
 [75 60]
 [60 28]
 [28 75]
 [48 92]
 [92  5]
 [ 5 48]]
[[31 69]
 [31 69]
 [69 69]
 [ 2 44]
 [ 2 85]
 [44 85]
 [ 2 98]
 [98 98]
 [ 2 98]
 [ 1 69]
 [ 1 43]
 [43 69]
 [ 7 15]
 [ 7 92]
 [15 92]
 [68 78]
 [69 78]
 [68 69]
 [43 70]
 [43 72]
 [70 72]
 [81 85]
 [36 85]
 [36 81]
 [60 75]
 [28 60]
 [28 75]
 [48 92]
 [ 5 92]
 [ 5 48]]
====G====
[[(31, 69)]
 [(31, 69)]
 [(69, 69)]
 [( 2, 44)]
 [( 2, 85)]
 [(44, 85)]
 [( 2, 98)]
 [(98, 98)]
 [( 2, 98)]
 [( 1, 69)]
 [( 1, 43)]
 [(43, 69)]
 [( 7, 15)]
 [( 7, 92)]
 [(15, 92)]
 [(68, 78)]
 [(69, 78)]
 [(68, 69)]
 [(43, 70)]
 [(43, 72)]
 [(70, 72)]
 [(81, 85)]
 [(36, 85)]
 [(36, 81)]
 [(60, 75)]
 [(28, 60)]
 [(28, 75)]
 [(48, 92)]
 [( 5, 92)]
 [( 5, 48)]]
[( 1, 43) ( 1, 69) ( 2, 44) ( 2, 85) ( 2, 98) ( 5, 48) ( 5, 92) ( 7, 15)
 ( 7, 92) (15, 92) (28, 60) (28, 75) (31, 69) (36, 81) (36, 85) (43, 69)
 (43, 70) (43, 72) (44, 85) (48, 92) (60, 75) (68, 69) (68, 78) (69, 69)
 (69, 78) (70, 72) (81, 85) (98, 98)]
```
# Refs.
* [len](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1071330010)
* [roll](https://qiita.com/supersaiakujin/items/c580f2aae90818150b35#roll)
Renderman R50009 License location is not set in renderman.ini

Metasequoia のレンダリングで RenderMan （スター・ウォーズ等、多くの映画で使用されているレンダリング用ソフト）を連携させて使えるということなのでインストールして試してみたのだが、以下のエラーが出てうまくいかない。

```
Renderman R50009 License location is not set in renderman.ini
```

どうも Renderman Installer と RenderMan Pro Server が同じドライブにインストールされていないと上記のエラーが出るらしい。前者をDドライブにインストールしても、後者インストール時にはインストール先を指定することがなぜかできない。Renderman Installer はデフォルトのパスでインストールしたほうが良さそう。

とりあえず Windows のコントロールパネルから両者を一度アンインストールして、再度 Installer を入れ直すことで解決。

そもそもなぜ Installer をわざわざインストールしないといけないのかよくわからないのだが……バージョンアップ用？

環境: Windows 10 64bit
Renderman 21.6.0
Metasequoia 4.6.4
root directory で fsck (おまけ: whoopsieの削除)

# Overview

Raspberry Pi3 で　サーバー運用していますが、たまに、 ```/``` (root directory) の partitionがfullになったりしますよね。 ```rsyslog rotate``` とかも設定してあるのに・・・。

で、そのときに、破損してしまっていて、 ```fsck``` を走らせなければいけない。

そんなときは、

```
$ sudo mount -o ro,remount /
```

して、read onlyでremountして、 

```
$ sudo fsck
```

すればOkです。。。

# おまけ

そういうときは、whoopsieで、crash dumpなどが圧迫していることも１つの要因かと思いますので、
消してしまうのも手です。

```
$ sudo apt-get remove --auto-remove whoopsie
```
How to multiply with the different dimension matrixes

```python
A = np.ones((5,5,3))
B = 2*np.ones((5,5))
C = A * B[:,:,None]
print(C)
C[1,2,0] = 99
print(C)
#D = A * B[:,:,:] # invalid: IndexError: too many indices for array
#print(D)
#print(A * B[:,:]) # invalid: ValueError: operands could not be broadcast together with shapes (5,5,3) (5,5) 
```
```
[[[ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]]

 [[ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]]

 [[ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]]

 [[ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]]

 [[ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]
  [ 2.  2.  2.]]]
[[[  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]]

 [[  2.   2.   2.]
  [  2.   2.   2.]
  [ 99.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]]

 [[  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]]

 [[  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]]

 [[  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]
  [  2.   2.   2.]]]
```
バイナリ形式のpcd形式のファイルを出力する

仕事でポイントクラウドのデータを扱う必要が出てきて、PCLライブラリを入れたのですが、boostやvtkなどの謎のライブラリを大量に入れる必要があったり、コンパイルが重いので困りました。今のところ簡単な処理を行うだけなので、点群を処理して結果をpcd形式(point cloud dataフォーマット)に出力して、pcdビューワ(CloudCompare; http://www.danielgm.net/cc/) で見ることにしました。

pcdのフォーマット：
http://pointclouds.org/documentation/tutorials/pcd_file_format.php

これを見ると単純な形式だったので、PCL使わずにpcdを出力できそうです。ただし、アスキー形式だと読み込みが遅かったのでバイナリ形式で出力します。とはいっても、ヘッダはアスキー形式と同じで、データの部分からバイナリになっているだけです。

以下、適当に点群を作ってpcdファイルに出力するコードです。

```c++-main.cpp
#include <stdio.h>
#include <vector>

struct pt_t {
	float x, y, z;
	pt_t() { ; }
	pt_t(float _x, float _y, float _z) {
		x = _x;
		y = _y;
		z = _z;
	}
};

#define RGB(r, g, b) ((int(r) << 16) + (int(g) << 8) + int(b) )


void main(){

	//***********************************************************
	// 適当な点群リストを作成
	std::vector<pt_t> pts;

	pt_t pt(7,23,35);
	float s = 10, b = 1.8, r = 20, dt = 0.0001;

	for (int i = 0; i < 500000; i++) {
		pt = pt_t(
			pt.x - dt * s*(pt.x - pt.y),
			pt.y + dt*(-pt.x*pt.z + r*pt.x - pt.y),
			pt.z + dt*(pt.x*pt.y - b*pt.z)
		);
		pts.push_back(pt);
	}
	//***********************************************************
	// pcdファイル（バイナリ形式）に出力
	FILE *fp = fopen("test.pcd", "wb");
	// ヘッダ
	fprintf(fp, "# .PCD v.7 - Point Cloud Data file format\n");
	fprintf(fp, "VERSION .7\nFIELDS x y z rgb\nSIZE 4 4 4 4\nTYPE F F F U\nCOUNT 1 1 1 1\n");
	fprintf(fp, "WIDTH %d\nHEIGHT 1\nVIEWPOINT 0 0 0 1 0 0 0\nPOINTS %d\nDATA binary\n", pts.size(), pts.size());
	// 中身をバイナリで書き込み
	for (int i = 0; i < pts.size(); i++) {
		// 適当に色を付ける
		unsigned int col = RGB(pts[i].z * 5, 128 + 3*pts[i].x, 128 + 3 * pts[i].y);
		float xyz[3] = { pts[i].x, pts[i].y, pts[i].z};
		fwrite( xyz, sizeof(float), 3, fp);
		fwrite(&col, sizeof(unsigned int), 1, fp);
	}
	fclose(fp);

}
	
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217237/35477133-6a8f-d5af-a78d-96870c806db3.png)

500000点ありますが、サクサク動きます。

点群の曲線式は以下を参考にしました。
https://sites.google.com/site/cinderellajapan/shindererarekucha-1/ka-osu
[SEO][Rails][kaminari]ページネーション対策（rel=”next” rel=”prev”）

## やりたいこと
- [kaminari](https://github.com/kaminari/kaminari)を使ったページネーションのある画面でページネーションに関するSEO対策（link rel="next, prev"タグ)を実装する
(タグの正しい呼称がわかりません。。。）

## やったこと
- kaminariのhelper method([rel_next_prev_link_tags](https://github.com/kaminari/kaminari#the-rel_next_prev_link_tags-helper-method))が用意されてました。

### 例
`<head>`タグ内で下記helper methodを呼びましょう。

```
<%= rel_next_prev_link_tags @users %>
```

下記の感じでHTMLのhead内に展開されます。

```
<link rel="prev" href="/sample/contents?page=2">
<link rel="next" href="/sample/contents?page=4">
```

気づかずに自前で実装しかけていたので、同様にページネーションにkaminariを使っている場合はぜひお使いください。

## おまけ
ちなみにkaminariには紹介した上記タグのmethod以外のSEO向け機能としてroutingのカスタマイズも用意されているようです。
`/my_resources?page=33` -> `/my_resources/page/33` のようなpaginateのroutingに変更したいなどお考えの方は公式ドキュメントよりご確認ください。
[Creating Friendly URLs and Caching](https://github.com/kaminari/kaminari#creating-friendly-urls-and-caching)
【Windows版gedit】Fortranでcから始まる行がコメントになる問題を解決

##問題の概要
Windows版geditでFortran95を強調表示にしている時、
cから始める行はコメントとして認識され、青色表示にされてしまう。
<img width="328" alt="before.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/227921/99459c45-b2eb-4249-ec49-d3c0adb64760.jpeg">

固定方式の時代にcから始める行はコメントであったのだが、
なぜかWindows版geditにおいてはf95にもその使用が適用されているようだ。

このままでは、call文を使う時など、ちょっと不便。

##解決方法
```
(geditのフォルダ)\share\gtksourceview-2.0\language-specs\fortran.lang
```

を編集。

```fortran.lang/47行目/修正前
<start>!|(^[Cc](\b|[^Oo]))</start>
```

47行目の```|(^[Cc](\b|[^Oo]))```を削除。

```fortran.lang/47行目/修正後
<start>!</start>
```

geditを再起動すれば、完了。
<img width="329" alt="after.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/227921/b21e92a2-708f-f3d2-cc9b-74299791ea24.jpeg">
How to use numpy slicing step feature

```python
def pZ(Z):
 print(Z)
 Z0 = Z1

Z = np.array([1,2,3,4,5])
nz = 3
Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz))
Z1 = Z0
print(Z0)
#Z0[nz+1]=Z # invalid
#Z0[:nz+1]=Z # invalid: could not broadcast input array from shape (5) into shape (4)
Z0[::nz+1]=Z
#Z0[:::nz+1]=Z # invalid
pZ(Z0)
```
```
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 1.  0.  0.  0.  2.  0.  0.  0.  3.  0.  0.  0.  4.  0.  0.  0.  5.]
```
# Refs.
* [ブロードキャスティング](http://hamukazu.com/2013/12/24/broadcasting-in-numpy/)
* [python create slice object from string](https://stackoverflow.com/questions/680826/python-create-slice-object-from-string)
* [スライシング](https://deepage.net/features/numpy-slicing.html)
Docker内で segmentation fault するプロセスのcoreを取って調べる方法

自分用にメモ

## coreを吐くように設定する

起動スクリプトなどで以下のコマンドを実行させる

```sh
echo '/tmp/core.%h.%e.%t' > /proc/sys/kernel/core_pattern
ulimit -c unlimited
```

- `/proc/sys/kernel/core_pattern` は初期値でプロセスに渡されている場合もあるので，明示的に指定する
- `ulimit` でコアファイルのサイズを無制限に設定する

## バイナリ側の準備

- 自分でコンパイルしているバイナリならデバッグオプションを有効化する．パッケージならデバッグシンボルを入れておく
- docker build する時にソースコードは消さずないようにDockefileを修正する

## 実行

- `/proc/sys/kernel/core_pattern` へ書き込みができるように docker run時に
 `--privileged` オプションをつける
- あとは通常通りに docker run する

## Segmentation faultした後

- `docker ps -a` で落ちたコンテナのcontainer IDを調べる
- `docker commit` コマンドを使ってコンテナからイメージを作成する
    - 例) `docker commit -m "coredump" 92b8935a7cd7` (92b8935a7cd7は container ID）
- `docker run -it <作成したimage ID> sh` などとしてsegmentation faultした直後の状態のコンテナを起動する

## 起動後

- gdbをインストールする（すでに入っているなら不要）
- `gdb /path/to/binary /path/to/corefile` で起動する
- 後はよしなに