OmniAICreator/Qiita-1.07M huggingface dataset:
最も簡単に、OpenStackトライアル（１：インストールまで）

今更ながら、OpenStackの構築を体験してみたのでメモ程度に残します。

[次回：最も簡単に、OpenStackトライアル（２：イメージの登録・作成・起動）](http://qiita.com/kouta_hara/items/2440de8eda87fddbcb6d)

# OpenStack
"OpenStackとはなんぞや"という方のために何が出来るようになるか簡単に。
結論：AWSのEC2的な事が出来るようになります。
ググると"クラウド環境を構築する"などと書かれていますが、具体的には、サーバ上に仮想化された複数のマシン(インスタンス)をGUIから立ち上げて、あたかも普通にサーバやPCを操作しているかのように利用できます。
もちろん、仮想のネットワーク構成やストレージの設定も可能です。

# 前提
VirtualBoxにCentOS7の最新版(2017/06/14現在)をインストールし、その上にOpenStack及び各インスタンスを立ち上げていきたいと思います。
本来であればそれなりのサーバ複数台で構成するべき所ですが、より気軽に体験したかったので、このような構成になっています。
※.なので、（スペック的に）実用には耐えられません。

# 早速試してみる
## 環境について
【PC】
PC：Core i7 7500U
RAM:12GB
OS:Windows10 Pro 64bit

【VirtualBox設定】
OS:CentOS7
Red Hat(64bit)
RAM:8,192MB
プロセッサ: 2
VT-x/AMD-V, ネステッドページング, PAE/NX, KVM 準仮想化
ビデオメモリ:128M
SATA0: vdi 100GB
NIC1:NAT
NIC2:ホストオンリーアダプタ
お世辞にも「良い環境」とは言えませんが、動いてはくれました。

## 導入手順
CentOSをMinimalでインストール後、以下の手順で"とりあえず"動作しました。
下手に機能を追加選択すると、ネットワークの設定がややこしくなるのでおすすめしません。
【インストール時補足】
インストールを行う際、NIC1,NIC2はそれぞれ固定のIPアドレスを指定してください。
DHCPで万が一IPが変わってしまうと厄介です。

```
// SELinux無効化
$ sudo setenforce 0
$ sudo vi /etc/selinux/config

修正前: SELINUX=enforcing
修正後: SELINUX=disabled
```

```
// OpenSSLが入っていないと"Testing if puppet apply..."の後エラーになる。
$ sudo yum install -y openssl-devel
```

```
// 最新版のrpmをダウンロード
$ sudo yum install -y https://repos.fedorapeople.org/repos/openstack/openstack-ocata/rdo-release-ocata-3.noarch.rpm
$ sudo yum install -y openstack-packstack

// インストール(スペックによって、凄く時間がかかる。所要時間：15min～2h)
// Testing if puppet apply～でかなり待たされると思いますが、ちゃんと動いていますので待ちましょう。
$ packstack --allinone
```
もし、NetworkManager云々といった警告が出た場合には

```
$ sudo systemctl stop NetworkManager
$ sudo systemctl disable NetworkManager
$ sudo systemctl start network
$ sudo systemctl enable network
```
として、NetworkManagerを無効化してください。同時に
/etc/sysconfig/network-scripts/
以下のifcfg～ファイルを以下のように変更してください。

```
$ sudo cd /etc/sysconfig/network-scripts
$ sudo vi ifcfg<インタフェース名>
以下を追記
NM_CONTROLLED="no"

// ブリッジの作成
// 参考：http://qiita.com/mfujita/items/ee2da9d1e241926fc790
// 以下のように設定

$ sudo cp ifcfg-enp0s3 ifcfg-br-ex
$ sudo vi ifcfg-enp0s3
TYPE=OVSPort
NAME=enp0s3
DEVICE=enp0s3
ONBOOT=yes
DEVICETYPE=ovs
OVS_BRIDGE=br-ex

$ sudo vi ifcfg-br-ex
 TYPE=OVSBridge
 OVSBOOTPROTO=dhcp
 OVSDHCPINTERFACES=enp0s3
 NAME=br-ex
 DEVICE=br-ex
 DEVICETYPE=ovs

// 終わったら以下を実行。
$ sudo systemctl restart network
```

以上でインストール自体は完了していますので、以下のファイルを参照してログインに必要なID/PASSを確認してください。
【ログイン情報】
/root/keystonerc_admin

上記の設定が完了した段階で、OpenStackをセットアップした仮想PCへアクセスすると、以下の画面が表示されるはずです。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/131348/69212c53-bd69-4107-ae36-941c7249603c.png)
ここで、先ほど確認したID/PASSを入力して、ログイン出来れば成功です。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/131348/4e569386-4fc7-fd13-ee7a-04b2ed4863d5.png)
いろいろ見て頂くと、AWSとよく似た設定項目がちらほらあることがわかります。

以上、簡単に一瞬で終わりそうに見えますが、ここにたどり着くまでに何度もハマってしまいました・・。
ハマリポイントについては後の記事でまとめて記載します。

次回は、実際にイメージ・インスタンスの作成～起動までを書きたいと思います。
Macbook AirをHigh Sierraにしたら起動しなくなった→復活までの流れ

#起きたこと
ARKitをためそうと思いながらも仕事用のマシンを
いきなりBetaに上げるのは勇気がなく、私物のMacbook Airを上げてみた！
↓
終始フィンが「んほおおおおおおお」と喘ぎフリーズしてログインIDすら入力できない状態に！
↓
SMCリセットしてなんとかログインはできたもののまだ猛烈に思い(Load Average 50とかイッちゃう)
参照URL: https://support.apple.com/ja-jp/HT201295
↓
電源ボタン長押しで無理やりシャットダウン
↓
電源ボタン押す→起動音したら左のShiftボタン長押し→Appleロゴでたらはなしてセーフモードにする
↓
/var/log/system.logの中身を見て、エラーログ吐き出してるアプリを特定して消したりエラーはかないように直す
↓
大体軽くなったがたまに重くなったりする→地図アプリがバックグラウンドアップデートかかってたり
↓
２時間ぐらい放置してたら安定稼働
↓
ログインするときはなぜか初回入力できない不具合があったので、
キャンセルボタンを押下して画面真っ暗→Enterで復帰させると入力できる

#思ったこと
2011年製MBAだと流石に重いなーと感じるので素直にマイナーチェンジのMBA欲しくなった(ヽ´ω`)
Reactをjestでテストするとき、material-uiを利用しているComponentでmuiThemeが無いと怒られるのを回避する

タイトルのままですが、jest実行時に、親のComponentから`MuiThemeProvider`を設定しており、子のComponent内部でmaterial-uiのComponentを利用していると

```some_parent_component.jsx
  ...
  render(){
    return(
      <MuiThemeProvider muiTheme={getMuiTheme(lightBaseTheme)}>
        <Router>
          <BaseRouter />
        </Router>
      </MuiThemeProvider>
    )
  }
```

```

  ● Console

    console.error node_modules/fbjs/lib/warning.js:36
      Warning: Failed context type: The context `muiTheme` is marked as required in `CircularProgress`, but its value is `undefined`.
          in CircularProgress (created by Issue)
          in div (created by Issue)
          in withScriptjs(withGoogleMap(Component)) (created by Issue)
          in div (created by Issue)
          in Issue

  ● Issue component › renders component

    TypeError: Cannot read property 'prepareStyles' of undefined

      at CircularProgress.render (node_modules/material-ui/CircularProgress/CircularProgress.js:187:48)
      at node_modules/react-dom/lib/ReactCompositeComponent.js:796:21

```

こんな感じで`The context muiTheme is marked as required`とか`Cannot read property 'prepareStyles' of undefined`と怒られてしまいます。
ここは親のComponentから与えているので出来たらテストでは無視してもらいたい（でないと全てのComponentを`<MuiThemeProvider>`でwrapするハメになるので）のですが、そうなってません。

回避する方法としては、テスト内で

```some_component_test.js
    const wrapper = render(
      <SomeComponent />,
      {
        context: {
          muiTheme: getMuiTheme(),
        },
        childContextTypes: {
          muiTheme: PropTypes.object.isRequired,
        }
      }
    )
```

として、render（とかmount）時の引数にcontext等を設定してやればOKです。
テスト内の記述が増えるのでちょっと微妙な感じではあるので、ベターな回避方法があれば知りたい所です。
EclipseのPackageExplorerのフォントサイズを変更する


# 背景
Eclipseのパッケージエクスプローラのフォントサイズが大きすぎて、でかいプロジェクトだとクラスの一覧性がとても低い。
しかもこのフォントサイズはEclipseの設定からは変更ができない。

<img src="https://qiita-image-store.s3.amazonaws.com/0/162960/b4e397ae-8465-a5c4-1888-241c4807aaac.png" width=66% />


Eclipse起動時にシステムフォントを変更することで対応する。

環境：

- OSはubuntu 16.04
- GUI環境はubuntu-desktopを使用

# 対応
Linuxではアプリケーション呼び出しの際にシステムフォントを変更する機能があるので、
それを利用してEclipse呼び出しの際に任意のフォントを適用する方法でいく。

ホームディレクトリに`.gtkrc-eclipse`などの名前のファイルを作って以下を記述。
フォントファミリーとフォントサイズはお好みで。8でかなり小さくなる。

```yaml:.gtkrc-eclipse
style "eclipse" {
        font_name = "Sans Condensed 8"
}
class "GtkWidget" style "eclipse"
```

eclipseを起動するときに、環境変数GTK2_RC_FILESでシステムのデフォルトテーマと先ほど作成した`.gtkrc-eclipse`ファイルを指定する。
`$ env GTK2_RC_FILES=/usr/share/theme/Default/gtk-2.0/gtkrc:/~/.gtkrc-eclipse ./eclipse `

適用後はだいたいこんな感じの見た目になる。
だいぶマシにはなるけどさらに大きいプロジェクトだとやはり見づらいし表示方法をhierarchialにするしかないではある。

<img src="https://qiita-image-store.s3.amazonaws.com/0/162960/782e0d0f-05d5-2e09-26cb-899afd3821fd.png" width=66% />

この起動オプションはaliasにしておくと便利。
`$ alias 'eclipse=env GTK2_RC_FILES=/usr/share/theme/Default/gtk-2.0/gtkrc:/~/.gtkrc-eclipse eclipse'`

# 参考
以下を参考にしました。
https://stackoverflow.com/questions/3124629/how-can-i-configure-the-font-size-for-the-tree-item-in-the-package-explorer-in-e
Rails5のdefault localeをjaに設定する

以前までは `config/application.rb` にデフォルトの設定を書いていましたが、`initializers/locale.rb` に書くようになったみたいです。

ただ普通に`I18n.default_locale = :ja`と書くだけだと

```rb
I18n::InvalidLocale:
  :ja is not a valid locale
# ./config/initializers/locale.rb:2:in `<top (required)>'
# ./config/environment.rb:5:in `<top (required)>'
```

と怒られてしまうので

```config/initializers/locale.rb
I18n.config.available_locales = :ja
I18n.default_locale = :ja
```

として、利用可能なlocaleを明示する必要があります。
【CakePHP3】Shellでハッシュ化パスワードをファイル出力する方法

# 1.ファイル作成
src/Shellに作成
PasswordShell.php

# 2.ソースコード
```PasswordShell.php
<?php
namespace App\Shell;

use Cake\Console\Shell;
use Cake\ORM\TableRegistry;
use Cake\Auth\DefaultPasswordHasher;

class PasswordShell extends Shell {

    public function main() {
        try{
            $this->out('ファイル出力開始');
            //ファイル内容
            $fileContent = null;
            //Usersテーブルを使用
            $this->Users = TableRegistry::get('users');
            //UsersテーブルよりIDとPWを取得
            $users = $this->Users->find('all')
                                 ->select(['id', 'password']);
            //ユーザの数ループ
            foreach($users as $user){
                //ファイルの最終行に追記
                $fileContent .= "".$user['id'].
                                ":".$user['password'].
                                ":".(new DefaultPasswordHasher)->hash($user['password']);
                $fileContent .= "\r\n";
            }
            //ファイル出力
            $this->createFile('password.txt', $fileContent);
            $this->out('ファイル出力完了');
        }catch(Exception $e){
            $this->err('ファイル出力失敗');
            $this->err($e);
        }
    }
}
```
# 3.コマントの実行
ファイル名の"Shell.php"をトリムした名前がコマンドになる
```
bin/cake password
```
チェックインとチェックアウトの機能をはずす

![wfc20161109034.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/4a607213-0196-a071-fed3-52cd18fb4f7d.jpeg)

何をどうすればそうなるのか、私自身よくわからないのですが、SaaSForceには｢チェックイン｣と｢チェックアウト｣と言う、推測するに、編集などをしなくてもいいときにやってしまうようなミスを防ぐために、ロックする機能があるようです。

ただ、この機能は、すごく面倒なので、正直はずしておきたいのです。

ちなみに、その機能が働いていると画面項目定義の画面ではこのような表示が見受けられます。

![wfc20161109036.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/90a4789a-09ac-bcf3-7fa6-ab6e98080dc8.jpeg)

![wfc20161109035.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/9c3aecb0-f718-7d39-2b18-f521eaadf8f9.jpeg)

そしてトップの画像を見ていただいたとおり、この機能をはずすには全てのアプリの状態をチェックインにしなければならないようです。

その作業をするには、「画面レイアウト作成」の画面がやりやすいです。

別画面で画面デザインの画面が開かれるので、それをとりあえず全てあけて、「チェックアウト」を「チェックイン｣に変えていきます。

それから、｢システム」から「開発設定」を選んで「無効」を押します。

![wfc20161109038.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/13806b19-e8f6-a8e0-7bcf-b55e3177335b.jpeg)

なお、この画像は押す前なので、押すと｢無効｣が白くなります。

また、チェックインをはずすとは下のような状態ではいけません。

![wfc20161109039.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/410da5e3-8e36-f39c-4990-13c485a3b8b5.jpeg)

この表示がされている状態は｢チェックアウト｣の状態です。

どちらかと言うと、左横の文字を読んだほうが、その表示の意味がわかっていいですね。

また、「すべてのチェックアウトをチェックインにしてください｣といわれても、初心者はそれがいったいどこの何なのか分からないと思います。
pandas.DataFrame.plot.scatter() で x軸のラベルとメモリが消える

pandas のバグっぽい
https://github.com/pandas-dev/pandas/issues/10611

# 条件

- Jupyter notebook で `%matplotlib inline`
- `Pandas.plot.scatter()` で `c=` に値を指定する

# workaround

`sharex=False`を指定する

https://stackoverflow.com/questions/31220329/pandas-dataframe-hexbin-plot-has-no-xlabel-or-axis-values/31633381#31633381
つぶやき勉強会 スタイルガイド編 その1 スタイルガイドとはなんぞや

## スタイルガイドって知ってますか？

スタイルをガイドしてくれるやつです

---

こんなのを動的に生成してくれます

![スクリーンショット 2017-06-09 20.16.32.png](https://qiita-image-store.s3.amazonaws.com/0/7442/1c7f7e77-ad95-265d-5011-30a083f0a111.png)

---

SCSSファイルにコメントとしてこういうのを書きます
そして、コンパイルすることでさっきのようなHTMLを生成してくれます

```html
---
name: head通常
category:
 - typography
tag:
 - sp
---

通常ページ（/ryugaku, /working-holiday）以外の見出しデザインです

｀｀｀html
<div class="sp">
	<section class="standard">
		<h1>h1の見出しです coming soon</h1>
		<h2>h2の見出しです</h2>
		<h3>h3の見出しです</h3>
		<h4>h4の見出しです</h4>
	</section>
</div>
｀｀｀

```

---

こんなのも作れます

![スクリーンショット 2017-06-09 20.25.37.png](https://qiita-image-store.s3.amazonaws.com/0/7442/1712a4e1-6a4f-09ba-72b0-955dd7024abf.png)

---

## 何ができるのか

デザインを管理できるようになる
実際の見た目とHTMLのマークアップを一緒に見れる

---

##　何が嬉しいか

作業効率の向上と一貫したデザインの作成を狙う。
そして脱属人化。

- 類似パーツが量産される
- エレメント・パーシャルの量産
- 見た目は同じなのにHTML/CSS(実装)が違う
- フォント・色がページによってまちまち
- ページ作成依頼時に過去のデザインを参考にできない
など

---

# :earth_asia:

荒れ放題、好き放題、ワガママ`<body></body>`に一石を投じたい（希望）

---

## 副産物

- CSS（SCSS）にコメントを書くことになるので、単純に可読性UP
- CSSを小さく区切りたくなるので、取り回しがよくなる
- スタイルガイドを書く単位でpartialにしたり、粒度の目安にできる
- 開発依頼の時に、非エンジニアがデザインカタログ的な使い方

昨今のコンポーネント化ってやつと相性がいいんじゃないかな

---

## ただし

- 保守コスト 増
- 工数 増

性質的にはテストコードと近いものを感じます
だた、やっぱり属人化の排除には一役買ってくれるんじゃないかと思います

---

## スタイルガイドの紹介

- [aigis](http://pxgrid.github.io/aigis/)
  Node.jsで動く。ドキュメントをMarkdownで書ける。

- [hologram](http://trulia.github.io/hologram/)
  rubyで動く。最近の主流っぽい。Railsでも使えるっぽい。
In Ruby, inspect does not substitute to_s


In Python,

```py
class Foo:
  def __repr__(self):
    return 'bar'
foo=Foo()
str(foo) # 'bar'
```

str(foo) gives 'bar' (both in Py2/Py3). So, if \_\_repr\_\_ is defined and \_\_str\_\_ is not defined, \_\_repr\_\_ is called instead.

However, in Ruby,

```rb
class Foo
  def inspect
    'bar'
  end
end
foo=Foo.new
foo.to_s # #<Foo:0x0000....>
p foo # bar
puts foo # #<Foo:0x0000....>
```

foo.to_s does **not** give 'bar'. So, if you define inspect, you should also define to_s.

検索用：Rubyではinspectはto_sを代替しない
Mailman の保存書庫のディスク消費量が異常に増える

管理している Mailman サーバで、ディスクがあふれて配送が止まるトラブルがありました。調べてみると、/var/lib/mailman/archives/private/ 配下の保存書庫が異常にディスクを消費していました。

/var/lib/mailman/archives/private/ 以下には、基本的にはメーリングリスト1つに対して2つのディレクトリがあります。ひとつは mbox 形式で投稿されたメールを保存し、もうひとつは投稿されたメールから HTML で閲覧できるページを作って格納しています。

今回、問題になったのは後者の方でした。以下のように、mbox 形式書庫が2GB程度しかないのに、HTML 形式書庫は57GBものディスクを消費していました。

```shell-session
$ du -sm /var/lib/mailman/archives/private/LISTNAME*
57219316 /var/lib/mailman/archives/private/LISTNAME
2053     /var/lib/mailman/archives/private/LISTNAME.mbox
```

この問題の原因は、まだ分かっていません。とりあえずの対処療法としては、HTML 形式書庫を再作成すれば問題は解決します。

```shell-session
$ sudo -u list mmarch --wipe LISTNAME
```

--wipe オプションは、既存の書庫を掃除してから再作成する、という意味だそうですので、今回の場合は必ず必要です。

再作成すると、以下のようにごく自然なディスク消費量に修正されました。

```shell-session
$ du -sm /var/lib/mailman/archives/private/LISTNAME*
1929    /var/lib/mailman/archives/private/LISTNAME
2053    /var/lib/mailman/archives/private/LISTNAME.mbox
```

原因不明なので、とりあえず当面の間は、以下のようなスクリプトを cron で定期実行しておくことにしました。

```bash:/etc/cron.weekly/reconstruct-mailman-archives
#!/bin/sh

PATH=/usr/sbin:/sbin:/usr/bin:/bin

basedir=/var/lib/mailman
listdir=${basedir}/lists
archivedir=${basedir}/archives/private

ignorelimit=20480
ratio=4

for mboxdir in ${archivedir}/*.mbox; do
    listname=`basename "${mboxdir}" .mbox`
    htmldir="${archivedir}/${listname}"
    if [ -d "${listdir}/${listname}" -a -d ${htmldir} ]; then
        mboxsize=`du -s "${mboxdir}"|cut -f1`
        htmlsize=`du -s "${htmldir}"|cut -f1`
        if [ "${mboxsize}" -gt "${ignorelimit}" -a "${htmlsize}" -gt `expr "${mboxsize}" '*' "${ratio}"` ]; then
            echo "The HTML archive of ${listname} is reconstructed."
            sudo -u list mmarch --wipe --quiet "${listname}"
        fi
    fi
done
```

このスクリプトは、HTML 形式書庫のディスク使用量が、mbox 形式書庫のディスク使用量の4倍（ratio変数）を超えた場合に、HTML 形式書庫を再作成します。ただし、mbox 形式書庫のディスク使用量が20MB（ignorelimit変数）以下の場合には、ディスク使用量の比が正しく出ない[^1]ため、再作成は行いません。

[^1]: HTML 形式書庫は、メール本体以外に、スレッドを作成するための Message-Id などのデータベースファイルを含むため、mbox 形式書庫に比べてもともとディスク使用量が大きくなる傾向があります。
x86-64 assembly language アセンブリ

for (i = (length - 1) to 0) {
     swapped = false
     for (j = 0 to i - 1) 
         if (list(j) > list(j + 1)) {
         tmp = list(j)
         list(j) = list(j + 1)
         list(j + 1) = tmp
         swapped = true
}
     if (swapped = false) exit 
}

このバブルソートをx86-64で書ける方いませんか？
Does anyone can write this babblesort with x84-64 assembly language?
Concrete CMS のユーザー情報を Mautic に送るためのカスタムコード



# 前提条件

## Mautic 側で設定したカスタムフィールドのエイリアス

各カスタムフィールドの公開設定をオンにする必要あり。

エイリアス | 項目の説明
-----|------
email | メールアドレス (固定)
lastname | 姓
firstname | 名
company | 会社名

## Concrete CMS 側のユーザー属性サンプル

Concrete CMS 側で下記のようにユーザー属性を設定。必要に応じて変更。

属性ハンドル | 項目の説明
-----|------
メールアドレス | Concrete CMS のデフォルトのメールアドレスを取得する
last_name | 姓
first_name | 名
company | 会社名

## ユーザー情報を変更・追加するのであれば

`$attributeSettings` の部分を変更して下さい。連携したい属性があれば、行を増やして

```
[Mautic カスタムフィールドのエイリアス],[concrete5ユーザー属性のハンドル]
```
というフォーマットで追加して下さい。


# コード

このコードを concrete5 サイトの一番最後に実装して下さい。
https://gist.github.com/katzueno/8d61e2a9e30614f098a698b3f96e8311


※ Mautic 公式の Concrete CMS ブロックにプルリクエストを送って機能追加してもらおうかと模索中。
Mailman のまとめ読み(digest)機能をオフにしておく

Mailman のメール配送が遅いのが気になって、/var/log/mailman/error を確認したら、以下のようにメモリエラーが発生していました。

```
Jun 14 09:55:46 2017 (166) Traceback (most recent call last):
  File "/var/lib/mailman/Mailman/Handlers/ToDigest.py", line 99, in process
    send_digests(mlist, mboxfp)
  File "/var/lib/mailman/Mailman/Handlers/ToDigest.py", line 147, in send_digests
    send_i18n_digests(mlist, mboxfp)
  File "/var/lib/mailman/Mailman/Handlers/ToDigest.py", line 413, in send_i18n_digests
    isdigest=True)
  File "/var/lib/mailman/Mailman/Queue/Switchboard.py", line 110, in enqueue
    msgsave = cPickle.dumps(_msg, protocol)
MemoryError: out of memory
```

[Mailman のまとめ読み(digest)機能](https://www.gnu.org/software/mailman/mailman-admin/node19.html)とは、メーリングリストに投稿されたメールをそのまま配送するのではなく、1日に1回まとめて配送する機能です。が、ほとんど使わない機能ですし、上記のようにメモリエラーの原因にもなりますので、オフにしておく方が良いようです。

管理下のメーリングリストが少なければウェブインタフェースで対応可能ですが、管理下のメーリングリストが多数になる場合には、やはり withlist コマンドの出番になります。以下のような内容の、/usr/lib/mailman/bin/disable_digest.py を用意します。

```py:/usr/lib/mailman/bin/disable_digest.py
def disable_digest(mlist):
    mlist.Lock()
    if len(mlist.digest_members) == 0:
        mlist.digestable = False
        mlist.digest_is_default = False
        print("%s is not digestable" % mlist.real_name)
    mlist.Save()
```

次に、以下のように withlist コマンドを実行して、まとめ読み会員のいない全てのメーリングリストに対して、まとめ読み機能をオフにしておきます。

```shell-session
$ sudo -u list /usr/lib/mailman/bin/withlist -r disable_digest -a
```

この設定後に新規作成されるメーリングリストについても、まとめ読み機能を標準でオフにしておくため、/etc/mailman/mm_cfg.py に以下のような設定を書いておきます。

```py
DEFAULT_DIGESTABLE = No
DEFAULT_DIGEST_IS_DEFAULT = No
```
CSharp > Attribute > ValueConversion > ソースリーディング時に役立つ | IDEでの処理は未消化

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
```

[WPF データーバインディングを用いた表示について](http://qiita.com/hugo-sb/items/be3a8148d1397d7a6545)
を元に学習中。

```
[ValueConversion(typeof(Gender), typeof(string))]
public class Gender2StringConverter : IValueConverter
{
```

の`[ValueConversion...]`の部分が目を引いた。

この書き方はAttributeというものだった。
[csharp > Conditional attribute](http://qiita.com/7of9/items/041efca83ea82ac987d5)

ValueConversion Attributeを使う理由については、以下のH.B.のMSDNの引用が参考になる。
https://stackoverflow.com/questions/9628859/the-point-of-valueconversionattribute-class
その引用テキストは書き換えられて存在しないというコメントがついている。

Adarshaの回答で複数のConverterクラスを連続して使う事例が掲示されている。

ソースリーディング時に「どの型からどの型への変換か」が分かる。一方で、それがIDEにてどう処理されているのかは未消化。
Nginx で Mautic を使うための config


Nginx で Mautic を使うための Config 設定です。
location 内の設定のみですので、その他のチューニングはお願いします。

- Amazon Linux 2 & Nginx + PHP7.2 で動作確認をしました (2019年3月)
- パスは `/var/www/EXAMPLE.COM` を変えてください
- `server_name EXAMPLE.COM;` を適宜変えて下さい
- ログの保存先を適宜変えてください。
- 適宜 SSL 証明書の設定を追加して下さい。

``` /etc/nginx/conf.d/10_vhosts_example.com.conf
server {
    listen       80;
    listen       [::]:80;
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;

    server_name  EXAMPLE.COM;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

	charset      utf-8;
	client_max_body_size 32m;

    access_log   /var/log/nginx/EXAMPLE.COM-access.log main;
    error_log    /var/log/nginx/EXAMPLE.COM-error.log warn;

    root         /var/www/vhosts/EXAMPLE.COM;
    location /.well-known {
        # dont-send to php we need it open for lets encrypt
        # try if it exists, if not redirect back to index.php
        auth_basic off;
        try_files $uri / index.php;
    }

	gzip_vary on;
	gzip_disable msie6;
	gzip_static on;
	gzip_comp_level 9;
 	gzip_proxied any;
	gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    location / {
    	index  index.php;
        try_files $uri $uri/ /index.php?$query_string;
    }

	# Deny access to any files with a .php extension in the uploads directory
    location ~* /(?:uploads|files)/.*\.php$ {
            deny all;
    }

    # Solve email tracking pixel not found
    location ~ email/(.*).gif {
        try_files $uri /index.php?$args;
    }
    # Solve JS Loading 404 Error
    location ~ (.*).js {
        try_files $uri /index.php?$args;
    }

    location ~* \.(jpg|jpeg|gif|png|css|js|ico)$ {
        access_log        off;
        log_not_found     off;
        expires           8d;
    }

    # Don't output hidden files
    location ~ /\.git {
        return 404;
    }
    location ~ /\.ht {
        return 404;
    }

    location ~ \.php($|/) {

		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		fastcgi_pass  unix:/var/run/php-fpm/www.sock;
		fastcgi_index index.php;
		fastcgi_param URI $uri;
		fastcgi_param SERVER_NAME $host;
		fastcgi_param REQUEST_METHOD $request_method;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_read_timeout 300;
		fastcgi_ignore_headers Expires Cache-Control;
		
		fastcgi_cache_bypass 1;
		fastcgi_no_cache     1;
		fastcgi_cache        fastcgi_cache;
		fastcgi_cache_valid  any 1m;
    }
}
```

## 参考記事
https://gist.github.com/proffalken/ebfa9debc4eef929b0163d11a80af349
PHPの非同期処理ライブラリamphpでリバースプロキシを実装する

# PHPの非同期処理ライブラリamphpでリバースプロキシを実装する

## 背景

Node.jsやGoなどのリバースプロキシの実装に触発されて、PHPでもamphpを使ってやってみました！

## 前提

- CentOS 7.3
- PHP 7.0+（remiリポジトリ）

## パッケージのインストール


### PHP

```shell
# yum localinstall -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# yum install -y php70-php php70-php-intl php70-php-json php70-php-mbstring php70-php-opcache php70-php-xml php70-php-pecl-apcu php70-php-pecl-ev
```

### その他

```shell
# yum install -y unzip git

```

## PHPの設定

```shell
# cat <<'EOT'>/etc/opt/remi/php70/php.d/99-my.ini
[global]
expose_php = Off
memory_limit = 256M
short_open_tag = Off

[mbstring]
mbstring.language = Japanese

[Date]
date.timezone = Asia/Tokyo

[opcache]
opcache.enable_cli = 1
EOT
# cat <<'EOT'>/etc/profile.d/enablephp70.sh
#!/bin/bash
source /opt/remi/php70/enable
export X_SCLS="`scl enable php70 'echo $X_SCLS'`"
EOT
# source /etc/profile.d/enablephp70.sh
```

## composerのダウンロードと設定

適当な作業用ディレクトリで作業します。

```shell
# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
# php composer-setup.php
# php -r "unlink('composer-setup.php');"
# php composer.phar config -g repos.packagist composer https://packagist.jp
```

## composerでパッケージをインストール

当初は本家のamphp/aerys-reverseを利用するつもりだったのですが、若干問題があったのでforkしたsadapon2008/aerys-reverseを使います。

https://github.com/sadapon2008/aerys-reverse


```shell
# cat <<'EOT'>composer.json
{
    "repositories": [
     {
      "type":"package",
        "package": {
          "name": "sadapon2008/aerys-reverse",
          "version":"master",
          "source": {       
            "url": "https://github.com/sadapon2008/aerys-reverse.git",
            "type": "git",
            "reference":"fix_autoload_misc"
          },
          "require": {
            "amphp/amp": "^1",
            "amphp/aerys": "dev-master",
            "amphp/artax": "^2"
          },
          "autoload": {
            "classmap": [
              {"Aerys\\ReverseProxy": "ReverseProxy.php"}
            ]
          }
        }
      }
    ],
    "minimum-stability":"dev",
    "prefer-stable": true
}
EOT
# php composer.phar require sadapon2008/aerys-reverse

```


## 実装


8080/tcpからローカルホストの80/tcpへのリバースプロキシを設定します。以下の内容でconfig.phpを作成します。aerysの設定は正直まだまだ暫定です。

```php:config.php
<?php

const AERYS_OPTIONS = [
    'maxConnections' => 2000,
    'connectionsPerIP' => 2000,
    'disableKeepAlive' => true,
    'socketBacklogSize' => 1000,
];

$fallback = function(Aerys\Request $req, Aerys\Response $res) {
    $res->end('<html><body><h1>Fallback \o/</h1></body></html>');
};

(new Aerys\Host)->expose('*', 8080)->use(new Aerys\ReverseProxy('http://127.0.0.1/'))->use($fallback);

```

## サーバ起動

```shell
# php vendor/amphp/aerys/bin/aerys -c config.php
```

## 確認

```shell
# curl http://127.0.0.1:8080/
```

PHPのリバースプロキシがｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!
アプリにファイルを保存する

![wfc20161109026.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/88004348-5ffe-86a9-821c-8bb49be01b4d.jpeg)

SaaSForceは、アプリの中にファイルを格納することができます。

実は、これを使ってマニュアル関係を保存して使っています。

携帯電話などのマニュアルをダウンロードするとかなりメモリを必要とするのですが、無料で使える間は少なくともその負担がありません。

![wfc20161109027.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/85456963-b347-decb-46e0-2f47939d1941.jpeg)

今回は、PDFと画像、そして、普通のエクセルで作ったファイルをアプリに保存してみたいと思います。

テーブルの作り方は、「デフォルト表示形式｣で「９．ファイル･イメージ｣を選択するぐらいで、他は普通のテキストと同じ設定法です。

さて、テーブル項目定義の作業を終えたら、保存をして、次に画面項目定義まで終了してください。

今回は画面デザインを飛ばして、そのままテストサーバーで検証します。

![wfc20161109028.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/83dc3ed8-2848-32a7-140b-8fc12d693ec4.jpeg)

テストサーバーに入りなおしてアプリケーションを開くとこのような画面になります。

![wfc20161109029.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/02a23170-0a40-f7f5-c3c5-fc6d331d2397.jpeg)

ファイルのパーツを右クリックすると、このような項目が出てくるので、初めてアップロードするときは｢ファイルの変更｣を選びます。

![wfc20161109030.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/0645fde8-3454-dacb-58bc-60b107a80474.jpeg)

このような画面がポップアップされるので｢新しいファイルアップロード」を押します。

ファイルを選んだら、確定をします。

![wfc20161109031.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/6e1230e6-c0c8-23aa-8af3-bdb394685bf5.jpeg)

このように、各種ファイルを入れることができます。

なお、画像のファイルに関して、そのサイズは画面デザインで変えることが可能です。

![wfc20161109032.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/50168439-9ff5-e2f2-db18-6b4bae824cae.jpeg)

このような状態から、画像のパーツだけ大きくします。

![wfc20161109033.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/43266b37-c7a6-6f69-614c-ab4fb97be47c.jpeg)

このように、画像のサイズは大きくできるので、写真の保存にも使えます。
Genymotion で adb connect がエラーになる場合の対処法メモ

Genymotion (Version 2.9.0) でエミュレータを立ち上げたのに、 Android Studio からデバッグするときの選択肢に出てこないときなど。

結論から書くと、自分の場合、原因は Android SDK のパスでした。

# ログ調査
```
~/.Genymobile/Genymotion/deployed/端末名/genymotion-player.log
```
Genymotion の場合は、この辺りに落ちています。

```
6月 14 14:05:40 [Genymotion Player] [debug] Virtual device configured
6月 14 14:05:40 [Genymotion Player] [debug] Virtualization engine configured
6月 14 14:05:40 [Genymotion Player] [debug] Virtual Machine status: off
6月 14 14:05:40 [Genymotion Player] [debug] Start the device...
6月 14 14:05:41 [Genymotion Player] [debug] Virtual Machine started.
6月 14 14:05:41 [Genymotion Player] [debug] Waiting for an IP address...
6月 14 14:05:47 [Genymotion Player] [debug] Genymotion system started. Attributed IP address:  "192.168.59.101"

(中略)

6月 14 14:05:49 [Genymotion Player] [debug] [checkVersion] System version and software version are the same
6月 14 14:05:49 [Genymotion Player] [debug] Signaling clipboard modification
6月 14 14:05:49 [Genymotion Player] [critical] [AdbReconnect] [error] `adb connect` returns 1
```

この後は、最後の error 行が数秒置きにずっと並んでいました。


# Genymotion の設定を見る

ここが default 設定になってました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117087/c6a3fc30-37ec-bb06-25f2-3c2692d16767.png)

ここを custom で設定して、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117087/42c46895-99cc-8acf-f53e-5264ab952423.png)

こうなれば OK
アプリケーションにつけるリンクボタンは後付がいい

![wfc20161109021.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/f8f80503-0414-460c-a40f-65580eb2119b.jpeg)

前回はリンクの成功するやり方をお見せしました。

今回は、かつて一度やった失敗するやり方をお見せします。

リンクはなぜか知りませんが、テーブル項目定義の段階で行うと、失敗するのです。

まず、一週間の月曜から木曜日までのリンクボタンをテーブルの段階で作ります。

次に『画面項目定義』の作業を終了します。

![wfc20161109022.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/205b7dbd-7d0d-4181-986e-47007417fec5.jpeg)

蛇足ながら、この『画面項目定義』のとき、IDや名称に入力するのが面倒な場合、テーブルの名称をコピペすると手間が省けます。

![wfc20161109023.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/e8baaaa8-f161-af14-6829-33bbec8db27e.jpeg)

画面デザインの画面で、それぞれのボタンにリンクを「一応」張ります。

ここは省いていただいてもかまいません。

そして、重要な作業をします。

この画面デザインの画面で、金曜日から日曜日までのリンクボタンを作ります。

![wfc20161109024.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/84886347-25a2-55f2-9333-36cda9a9d581.jpeg)

ここまでできれば、一度画面を保存してからログアウトし、改めてテストサーバー用のIDとパスワードで入ります。

![wfc20161109025.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/0c8edd4e-e0c9-89d5-9586-4558ab5dda55.jpeg)

これが、テストサーバーで見たアプリケーションの状態です。

ボタンの文字をせっかく入れたのに、消えてなくなっています。

これは、結局何をやってもリカバリーはできなかったので、当然の帰結としてこのアプリケーションは廃棄処分です。

結論として、リンクボタンはテーブルで作ってはいけないということがわかりました。

ちなみに、リンクボタンの文字は表示されないのですが、リンク機能自体は働きます。

なお、水曜日と木曜日に左側に文字があるのは、この2つは手を抜いてリンクを設定しなかったからです。
phpenvでよく使うコマンド

phpenvでよく使うコマンドについて記載

```
#インストール可能なバージョン確認
phpenv install -l

#インストール
phpenv install {version} 

#インストールバージョン確認
phpenv versions

# 全ディレクトリで使うバージョンを指定
$ phpenv global {version} 

# カレントディレクトリのみで使うバージョンを指定
$ phpenv local {version} 

# hashの更新
$ phpenv rehash

# 現在のバージョン確認
$ php -v

```

以上
GitHub Pagesで自分の作ったサイトを公開する

せっかく勉強したし、自分で作ったものをwebページで公開してドヤ顔したい

でも

サーバー借りるのお金かかるし、めんどうやな（はなほじ

なにかちゃちゃっと簡単にアップできるのないのか

あった

＿人人人人人人人人＿
＞　GitHub pages　＜
￣Y^Y^Y^Y^Y^Y^Y￣

GitHub Pagesがあれば個人のポートフォリオサイトやプロジェクトごとにページを公開することができます

## GitHub Pagesに個人サイトを公開する方法は2つあります
　1.ユーザーアカウントのページ
　2.プロジェクトごとのページ

まずはユーザーページを作成するところから始めましょう✨

## 初手
- GitHubアカウントがないかたはまず作ってからどうぞ

## ユーザーページ作成
- ユーザーページは1アカウントにつき1つまで作成可能です

`[ユーザー名].github.io`というリポジトリをGitHubで作成します
<font color="DeepPink">ユーザーネーム以外は適用できないっぽいので気をつけてください</font>

次に作成したリポジトリをクローンします

```
$ cd 作業場所（Desktopなど）
$ git clone git@github.com:[ユーザー名]/[ユーザー名].github.io.git
```
このディレクトリに公開したいページを作成します
ここでは仮に`index.html`というファイルだけ公開します

```
$ cd [ユーザー名].github.io
$ echo "GitHub Pages" >> index.html
```

作業が完了したらリモートリポジトリにプッシュします👐

```
$ git add .
$ git commit -m "Initial commit"
$ git push origin master
```
プッシュした後は少しタイムラグがあるので反映されるまではお茶でもしばいてください🍵

`[ユーザー名].github.io/`で公開されました🎉

次はプロジェクト単位のページの作成方法です💪

## プロジェクトページ作成
自己紹介ページだけでなく、プロジェクト単位でページを作りたいですよね

こちらは普通にプロジェクト単位でリポジトリを作ります。
準備が整ったら、GitHubのリポジトリページの[Setting]→[GitHub Pages]→[Source]で、[master branch/docs folder]を指定します。
<font color="DeepPink">[master branch/docs folder]が選択できない場合があるかもしれません。その時は[master branch]を選択してください</font>

たったこれだけ

あとはリポジトリ名のURLにアクセスするだけです

` https://[ユーザー名].github.io/[リポジトリ名]/`


すごーい！ぎっとはぶさんはとってもかしこくてしんせつなフレンズなんだね🐯

## 所感
- 静的なページなら無料で簡単に公開できるのすごい
- たくさん公開して自分を表現できる( ･ㅂ･)و ̑̑ 
- 転職したい人はこういう場所にどんどん公開した方が良い結果が生まれそう
- 個人的には新しいフレームワークやプラグインの勉強で作ったものを公開することが多くなりそう
そのまま使えるAzure Log Analytics検索クエリサンプル

#概要
OMS、Azure Log Analyticsの1つの特徴はそのとても強力な検索機能です。非常な柔軟なクエリによって様々なものを抽出、可視化することができます。
一方で、柔軟に生成できるからこそクエリの記述が難しいと感じたり、具体的に何にどのように使っていいかわからないという印象を持つ方も少なからずいるようです。(実際にはそんなに難しくないのですが)

そこで、この記事では、現場ですぐに使えるサンプルクエリを集めてみました。

#クエリ入力方法
検索クエリを入力するにはAzure管理ポータルのLog Analytics、あるいはOMSワークスペースにて「ログ検索」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/3a0fd59f-3dff-8c5b-d721-faafefad86b2.png)

ログの検索画面になり検索クエリを入力することができるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/0471b1fe-5b04-46a9-4f94-fd5aef369b5d.png)

クエリを入力すると結果が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/08daa702-4c9d-19ce-7831-0e1dd655ac3b.png)

種類によってはグラフで表示することもできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/16c20047-a4fa-e7ce-1d03-5d82138faad1.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/4868fb32-f2be-1272-4470-6f0a6715d2f7.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/e15395b4-c038-53b7-b79e-e8ba3cac3d4c.png)

#OMS管理系
##コンピューターの最終データ報告日時
`ObjectName!="Advisor Metrics" ObjectName!=ManagedSpace | measure max(TimeGenerated) as LastReportTime by Computer | Sort Computer`

##種類別のレコード件数
`* | Measure count() by Type`

#サーバー管理系
##CPU使用率
`Type:Perf CounterName="% Processor Time" InstanceName="_Total" | measure avg(CounterValue) by Computer Interval 1HOUR`

##予期せぬシャットダウンが発生したコンピュータ
`Type=Event  EventID=6008 Source=EventLog`

##ディスク空き容量
`* Type=Perf CounterName="Free Megabytes"`

##過去1時間の平均CPU使用率 Top10
`* Type=Perf CounterName="% Processor Time" InstanceName="_Total" TimeGenerated>NOW-1HOUR | Measure avg(CounterValue) as AVGCPU by Computer | Sort AVGCPU desc | Top 10`

##過去24時間で最もDiskQueueLengthが高かったコンピューターTop10
`* Type=Perf ObjectName=LogicalDisk CounterName="Current Disk Queue Length" TimeGenerated>NOW-24HOUR| Measure Max(CounterValue) as MAXDiskQueue by Computer | Sort MAXDiskQueue desc | Top 10`

##SQL Server がIOを15秒以上待った管理対象
`EventID=833 EventLog=Application  Source=MSSQLSERVER | measure count() by Computer`

#セキュリティ関連
##重要な更新プログラムまたはセキュリティ更新プログラムがインストールされていないすべてのコンピューター
`Type=Update UpdateState=Needed Optional=false (Classification="Security Updates" OR Classification="Critical Updates")`

##ゲスト アカウントによるログオンがあったコンピューター
`Type=SecurityEvent EventID=4624 (LogonType=10 or LogonType=3) TargetUserName="Guest" | Measure count() by Computer`

##クリアテキストのパスワードによるログオン
`Type=SecurityEvent EventID=4624 (LogonType=10 or LogonType=3) TargetUserName="Guest" | Measure count() by Computer`

##アカウントのログオン失敗
`Type=SecurityEvent EventID=4625 | measure count() by TargetAccount`

##Windows Updateの自動更新が無効のコンピューターに対して適用されていない更新プログラム
`Type=Update UpdateState=Needed Optional=false Computer IN {Type=UpdateSummary WindowsUpdateSetting=Manual | measure count() by Computer} | measure count() by KBID`

##DOMAIN\userがログインしたコンピューターにログインしたその他のユーザー
`Type=SecurityEvent EventID=4624   Account!="DOMAIN\\user" Computer IN { Type=SecurityEvent EventID=4624   Account="DOMAIN\\user" | measure count() by Computer } | measure count() by Account`
SCSSで & （アンパサンド）を使ってアレを書きたい

いつも`&`まわりがややこしくて分からなくなるのでメモ。SCSSとCSSの対応関係。

```scss:SCSS入力
/* 合成のみ */
.element {
  &__inner {
    color: red;
  }
}

/* AND連結およびAND連結+合成 */
.element {
  &.element--attr {
    color: red;
  }
  &#{&}--attr {
    color: red;
  }
}

/* OR連結およびOR連結+合成 */
.element {
  @at-root {
    &,.element-another {
      color: red;
    }
    &,#{&}-another {
      color: red;
    }
  }  
  @at-root &,.element-another {
    color: red;
  }
  @at-root &,#{&}-another {
    color: red;
  }
}

/* ネストおよびネスト+合成 */
.element {
  .element__inner {
    color: red;
  }
  & &__inner {
    color: red;
  }
  #{&}__inner {
    color: red;
  }
}
```

```css:CSS出力
/* 合成のみ */
.element__inner {
  color: red;
}

/* AND連結およびAND連結+合成 */
.element.element--attr {
  color: red;
}
.element.element--attr {
  color: red;
}

/* OR連結およびOR連結+合成 */
.element, .element-another {
  color: red;
}
.element, .element-another {
  color: red;
}
.element, .element-another {
  color: red;
}
.element, .element-another {
  color: red;
}

/* ネストおよびネスト+合成 */
.element .element__inner {
  color: red;
}
.element .element__inner {
  color: red;
}
.element .element__inner {
  color: red;
}
```

これだけは覚えておきたい

- **セレクタ先頭に`&`があるときは「合成」，そうでないときは「ネスト」**
- `#{&}`は変数として展開するため，親と合成する特殊効果は持たない
- ORは`@at-root`が必須でちょっと面倒
複数のBEDGRAPHファイルをまとめたい

###やりたいこと
BEDGRAPHという形式のファイルを1つにまとめる必要があって、
bedtools unionbedg を走らせたものの、エラー連発。
エラーメッセージは下記のサイトの通り。

https://github.com/arq5x/bedtools/issues/114
>bedtools: unionBedGraphs.cpp:99: CHRPOS UnionBedGraphs::ConsumeNextCoordinate(): Assertion `!queue.empty()' failed.

どういうエラーなのかさっぱり理解できませんが、
質問に対する回答の文章を読むと、どうやらソートできていないとエラーになる様子。

###BEDGRAPHファイルのソート
自分のファイルがソートされたファイルであるかを確認します。
チェックは回答のコマンドをそのまま走らせる。

```
sort -c -k 1,1 -k 2,2n a.bedg
```
`-c`はソート済みであるかの結果だけを返すオプションで、ソートは実行されません。
順序が不規則と出ました。なんでだろう…
とりあえず、ソートすれば解消できそうです。
実行するにあたり、上のコマンドをちょっと改変して、すでに存在する.bedgファイルを上書きしたいです。

```
sort -V -k 1,1 -k 2,2n -u a.bedg -o a.bedg
```
としてやれば良さげ。[link参照](https://orebibou.com/2015/09/sort%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B99%E5%80%8B/#11)
無事に並べ替えられたので、振り出しに戻ってunionbedgを実行します。
念のため、`sort -c`して確認。今度は大丈夫。

###複数のBEDGRAPHファイルを1つのファイルにする
いよいよファイルを統合します。
使用するサブコマンド`unionbedg`の説明は[こちら。](http://bedtools.readthedocs.io/en/latest/content/tools/unionbedg.html)

```
bedtools unionbedg -header -names -filler NA -i a.bedg b.bedg
```
`-filler`は値が存在しない時に代入する文字を指定できます。
出力結果にヘッダーを入れたい時は`-header`、
列ごとの名前を別途入れたい場合は`-names`というオプションもありますので、適宜選択ください。
<br>
####余談その1
bedtoolsにもsortするためのサブコマンドはありますから、好みで使われるのがいいと思います。
[sortBedの説明はこちら。](http://bedtools.readthedocs.io/en/latest/content/tools/sort.html)
ページの下部まで進むと、こんな記載があります。
>**Disclaimer**: it should be noted that **sortBed** is merely a convenience utility, as the UNIX sort utility will sort BED files more quickly while using less memory.

シェルコマンドの方がよさげですね。。
<br>
####余談その2
まとめたいBEDGRAPHファイルにヘッダーが入っていると、ソートされていないとみなされてエラーになりました。
また、入力するBEDGRAPHファイル1つにつき1つの`-names`しか対応しませんので、
一旦まとめたBEDGRAPHファイルをさらに統合する時は別の方法をとる必要がありそうです。
このパターンが多いと、bedtoolsは不向きかもしれません。。
【Xcode】警告ダイアログ The source control operation failed because no repository could be found.

#The source control operation failed because no repository could be found.

##直訳
レポジトリが見つからなかったので、ソース規制活動に失敗しました。

##つまり
レポジトリにこのソースがないよというエラーみたいですね

---

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
VMwareにCoreOSインストール(固定IP設定)

## 目的
CoreOSを固定IP、パスワード認証でvSphereにインストール
（vagrantで構築できなくて悲しい場合の手順メモ）

## 準備
以下URLからCoreOSのOVAをダウンロード
https://stable.release.core-os.net/amd64-usr/current/coreos_production_vmware_ova.ova

## 仮想マシンの作成
1. 仮想マシンの作成/登録 → OVFファイルまたはOVAファイルから仮想マシンをデプロイ
2. さっきダウンロードしたOVAファイルを選択する
3. 後はデフォルト値で設定を全て完了させる

## 各種設定
DHCP使ってるのであれば良いんだけど、固定IPだと最初の設定がちょっと面倒臭い

### 自動ログインとパスワード設定
デフォルトパスワードの設定がないため、コンソールログインできないので初回自動でログインできるようにする
1. 仮想マシンを起動した瞬間"e"をタイプして、GRUB設定を開く
2. 4行目くらいのlinux$sufの列の最後に" coreos.autologin"を追記（F10で設定反映）
3. 認証無しでログインできる
4. `sudo passwd core`コマンドでパスワードを設定する

### 固定IPの設定
1. `ifconfig`とか`ip addr show`で固定IPを設定するインタフェース名を確認 → 今回は"ens192"
2. /etc/systemd/network/static.networkファイル作成し、以下のように記載する（IPとかは環境に合わせて）

```
[Match]
Name=ens192

[Network]
Address=192.168.0.15/24
Gateway=192.168.0.1
DNS=8.8.8.8
```
3. `sudo systemctl restart systemd-networkd`を実行
4. つながる！


## 参考
[CoreOS公式(vm)](https://coreos.com/os/docs/latest/booting-on-vmware.html)
[CoreOS公式(network)](https://coreos.com/os/docs/latest/network-config-with-networkd.html)
[CoreOSの固定IPアドレス設定](http://qiita.com/nobwak/items/02ff9b5929935ef9c074)
ReactNative のグローバルエラーハンドリング


一括でエラー処理はどうやるんだろう、と調べてみた。

## global.ErrorUtils.setGlobalHandler での処理

名前の通りのグローバルハンドラ。

- https://github.com/facebook/react-native/blob/23331df5a40ad8ddff58f561af24d7401b62e330/Libraries/Core/ErrorUtils.js

```
global.ErrorUtils.setGlobalHandler((error, isFatal) => {
});
```

で一括でハンドリングできる。なお `__DEV__` のとき赤いモーダルエラー画面がでるのはここでハンドリングしてるからなので、上書きしたらそのエラーは無くなってしまう。

## Promise での reject されたけど、だれもキャッチしないエラー処理

```
require('Promise'); // make sure the default rejection handler is installed
const rejectionTracking = require('promise/setimmediate/rejection-tracking');

rejectionTracking.enable({
  allRejections: true,
  onUnhandled: (id, error) => {
    console.log('promise error');
    console.error(error);
  },
});

```

で一括処理できる。ただ、これだとすべてのエラーをハンドリングしてしまうことになってしまう。ので whitelist にエラークラスを指定することで、特定の処理だけをハンドリングすることが出来る。

が、このハンドラーも一つしかセットできないので、エラーごとにハンドラーをセットは出来ず、whitelist にハンドリングするクラスを増やしていく感じになってしまうと思う。

```
import ExtendableError from 'es6-error';
class NetworkError extends ExtendableError {
  constructor(message = 'Network Error') {
    super(message);
  }
}

require('Promise'); // make sure the default rejection handler is installed
const rejectionTracking = require('promise/setimmediate/rejection-tracking');

rejectionTracking.enable({
  allRejections: false,
  whitelist: [NetworkError],
  onUnhandled: (id, error) => {
    console.log('Network Error');
    console.log(error);
  },
});

(async () => {
  throw new NetworkError();
})();
```

# 使いどころ

ここをハンドリングしてうまくアプリを作っていくのはなんか間違ってる感が強いので、エラーのロギング以外では使わない方が良い。
phpで文字コードEUCのpostgresのデータの文字化け

今時EUCでphp書いてるなんて人はまずいないだろうから、これからの人には何の役にも立たない情報だが。

まあ今後、古いソースを直さないといけないことがないとも限らない。

データベースがpostgresでデータはEUCで保存されている。

それをphpで読み込んで出力するHTMLは

content="text/html; charset=EUC-JP"

としてEUCで処理されている。

すると、髙木さんのはしご高が化ける。

ターミナルではちゃんと読めるのにねえ。

ということで以下のようにするとよい。

$username にDBから読み込んだ値を入れておいて、

```php
$username = mb_convert_encoding($username, "UTF-8", "eucjp-win");
$username = mb_convert_encoding($username, "CP51932", "UTF-8");
```

一旦UTF-8にしてからもう一回変換するということなんだが。。。。
HTMLで画像付きリンク

#やりたいこと
マウスオーバーでリンク文字の色と、画像を差し替える。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/72197/3e994b2b-ce94-588b-58ac-a7fa24a917ea.png)　→マウスカーソルを合わせる→　![image.png](https://qiita-image-store.s3.amazonaws.com/0/72197/54f2eb6d-9ba5-0f56-2474-932ab75127a8.png)
--
最初、画像を\<img>タグのsrc属性にセットしていたが、cssからsrcの値を変更できない(;´･ω･){CSS難しい……)

```ruby:index.html
<span class="test-link"><a href="http://qiita.com"><img src="sample.png">リンク</a></span>
```

→①\<img>タグを使わず、\<a>タグの背景画像を使うのかー。
→②::before疑似要素を使う（T_sa様よりコメント頂きました）

#実装①
```ruby:index.html
<span class="test-link"><a href="http://qiita.com">リンク</a></span>
```

```ruby:index.css
/* 通常時 */
span.test-link a {
  font-size: 30px;               /* 文字サイズ */
  text-decoration: none;         /* リンクの下線を消す */
  padding-left: 31px;            /* 画像とリンク文字の間隔（余白）を調整 */
  
  color: #AFAFAF;                /* 通常時のリンク文字色 */
  background: url('sample.png'); /* 通常時の画像 */
  background-size: contain;      /* 背景のサイズに収まる最大サイズ */
  background-repeat: no-repeat;  /* 背景画像の繰り返しをしない */
}

/* マウスオーバー時 */
span.test-link a:hover {
  font-size: 30px;               /* 文字サイズ */
  text-decoration: none;         /* リンクの下線を消す */
  padding-left: 31px;            /* 画像とリンク文字の間隔（余白）を調整 */

  color: #000000;                /* hover時のリンク文字色 */
  background: url('hover.png');  /* hover時の画像 */
  background-size: contain;      /* 背景のサイズに収まる最大サイズ */
  background-repeat: no-repeat;  /* 背景画像の繰り返しをしない */
}
```

#実装②

```ruby:index.html
<a href="http://qiita.com">リンク</a>
```
```ruby:index.css
  /* 通常時 */
  a {
    font-size: 30px;
    text-decoration: none;
    padding-left: 31px;
    color: #AFAFAF;
  }
  a::before { /* 通常時の画像を指定 */
    content: "";
    display: inline-block;
    width: 31px;
    height: 31px;
    background: url('sample.png');
    background-size: contain;
    background-repeat: no-repeat;
    position: relative;
    top: 5px;
  }

  /* マウスオーバー時 */
  a:hover {
    font-size: 30px;
    text-decoration: none;
    padding-left: 31px;
    color: #000000;
  }
  a:hover:before { /* マウスオーバー時の画像を指定 */
    content: "";
    display: inline-block;
    width: 31px;
    height: 31px;
    background: url('hover.png');
    background-size: contain;
    background-repeat: no-repeat;
    position: relative;
    top: 5px;
  }
  
```
elastic4sで_analyzeを試す

elasticsearchのembeddedでkuromoji使えるようになったので_analyzeで解析結果を確認したかったのですがAPIが見つからず。。

[stackoverflow](https://stackoverflow.com/questions/31169687/elasticsearch-java-api)で調べたらjavaで実現する方法を見つけました

例によってAPI一部変わってましたが実現できました

```
      createIndex("bands").mappings(
        mapping("artist") as (
          textField("name"),
          textField("description") analyzer "my_analyzer"
        )
      )
        .analysis(
          CustomAnalyzerDefinition(
            "my_analyzer",
            KuromojiTokenizer,
            KuromojiBaseformFilter
          )
        )
    }.await
```

こんな感じでschemaを定義してみます。

```
    val response: AnalyzeResponse = client.java.admin().indices().analyze(new AnalyzeRequest("bands").analyzer("my_analyzer").text("飲み放題")).actionGet()
    response.forEach { token =>
      {
        println(s"""
        |token: ${token.getTerm()}
        |start_offset: ${token.getStartOffset()}
        |end_offset: ${token.getEndOffset()}
        |type: ${token.getType}
        |position: ${token.getPosition}
        """.stripMargin)
      }

```

出力結果

```
token: 飲む
start_offset: 0
end_offset: 2
type: word
position: 0


token: 放題
start_offset: 2
end_offset: 4
type: word
position: 1
```

Kuromoji_baseformのおかげで「飲み」が「飲む」に変換されているのがわかります

コードは[こちら](https://github.com/tky/elasticsearch-experiments)
valignq

# はじめに

コンパイラが`valignq`という見慣れない命令を吐いたのでその機能について覚書。

# 使い方

`valignq`は、二つの512bitレジスタと整数を引数にとって、二つのレジスタをくっつけて、その「間」を取ってくるような働きをします。AVX-512Fに属しているので、AVX-512に対応している石全てで使えます。

組み込み関数としてはこんな感じの使い方になります。

```c
__m512i c = _mm512_alignr_epi64(a, b, count);
```

図解するとこんな感じです。

![valignq.png](https://qiita-image-store.s3.amazonaws.com/0/79744/f6410857-bc8a-e400-e111-f1f08309c4b8.png)

つまり、第一引数`a`を上位512bit、第二引数`b`を下位512bitとする1024bitのデータを考え、その下位の`count*64`bitから512bitのデータを取ってくる命令です。

ただし、`count`は即値である必要があります。

# サンプルコード

以下がサンプルです。

```cpp
#include <immintrin.h>
#include <stdio.h>
#include <stdint.h>

void
put8(__m512i a){
  int64_t *v = (int64_t*)(&a);
  for(int i=0;i<8;i++){
    printf("%ld ",v[7-i]);
  }
  printf("\n");
}

int
main(void){
  __m512i a = _mm512_set_epi64(15,14,13,12,11,10,9,8);
  __m512i b = _mm512_set_epi64(7,6,5,4,3,2,1,0);
  printf("a = ");
  put8(a);
  printf("b = ");
  put8(b);
  printf("c = ");
  __m512i c = _mm512_alignr_epi64(a, b, 3);
  put8(c);
}
```

実行結果はこうなります。

```shell-session
$ ./a.out
a = 15 14 13 12 11 10 9 8 
b = 7 6 5 4 3 2 1 0 
c = 10 9 8 7 6 5 4 3 
```

マスク版(`_mm512_mask_alignr_epi64`や`_mm512_maskz_alignr_epi64`)もありますが、その動作はすぐにわかると思うので省略します。

# まとめ

コンパイラが吐いたんだから使える命令なんだと思いますが、いまいち使いみちが思いつきません。特にシフトする数が即値じゃないといけない、ということが使いみちを狭めている気がします。この命令を使うときれいに書けるような処理があったら是非教えてください。
rails controllerから、ffmpeg使って動画のサムネイルをbase64で取得

## やりたかったこと

動画の初めの画像をthumbnailとして作成したかった。

thumbnail画像のuploaderは、[carrierwave-base64](https://github.com/lebedev-yury/carrierwave-base64)を使って作成している。

画像・動画共に作成したthumbnailの保存はcarrierwave-base64にまとめてしまいたかったので、carrierwave-base64にbase64エンコードされた画像を渡したい。

メディアファイルは、api経由で、movie, imageに格納されて送られてくる。


以下のやり方でbase64エンコードした画像を受け取って、あげればよい。

```thumbnail_controller.rb


def get_base64_video_thumbnail
    i_path = @poster.movie.path
    o_path = "./public/uploads/tmp/#{SecureRandom.hex(10)}.jpeg"
    begin
      system "ffmpeg -itsoffset -1 -i #{i_path} -s 300x300 -y -vframes 1 -f image2 -an #{o_path}"
      ret_base64_img = "data:image/jpeg;base64," + Base64.encode64(File.new(o_path).read)
      File.delete(o_path)
      return ret_base64_img
    rescue => e
      render json: {
        message: I18n.t("controllers.posters.fail_create_thumbnail")
      }, :status => :unprocessable_entity and return
    end
end

```
Treasure Dataのtdコマンドの始め方

インストール
=

https://toolbelt.treasuredata.com/

アカウント設定
=

以下、Windowsでの例

```
C:\Users\XXX>td account
Enter your Treasure Data credentials. For Google SSO user, please see https://docs.treasuredata.com/articles/command-line#google-sso-users
Email: XXX
Password (typing will be hidden):
Authenticated successfully.
Use 'td db:create <db_name>' to create a database.

C:\Users\XXX>type .td\td.conf
[account]
  user = XXX
  apikey = XXX
```

エンドポイントを指定したい(本家Treasure Dataでない)場合

```
C:\Users\XXX>td -e https://XXX account
～略～

C:\Users\XXX>type .td\td.conf
[account]
  user = XXX
  apikey = XXX
  endpoint = https://XXX
```

末尾に空行があると`TreasureData account is not configured yet.`になる
Visual Studio / WPF | CSharp >  public static string DisplayName(this Gender gender)という書き方 > 拡張メソッド

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
```

WPF データーバインディングを用いた表示について
http://qiita.com/hugo-sb/items/be3a8148d1397d7a6545
を元に学習をしていて、以下の文法が分からなかった。

```
public static string DisplayName(this Gender gender)
```

第一引数のthisは何を意味するのか。
(追記: コメントに「// Genderへの拡張メソッドの定義」とありました）。

++C++; // 未確認飛行 Cさん
[TOP   C# によるプログラミング入門   [関数指向] 拡張メソッド](http://ufcpp.net/study/csharp/sp3_extension.html)
によると拡張メソッドの書き方のようだ。

> 拡張メソッドは、静的メソッドをインスタンスメソッドと同じ形式で呼び出せるようにできるものです。

元記事では以下のようにインスタントメソッドと同じ形式で使用している。

```
public string Gender
{
    get { return Person.Gender.DisplayName(); }
}
```

拡張メソッドを使う利点や注意点についてはリンク2つ目(++C++; // 未確認飛行 Cさん)に詳しい。


###関連記事

[[C#]ちょっとしたストレスを解消してくれるExtensions](http://qiita.com/shinoyu/items/7dec4bbd0282ae6755e6)