OmniAICreator/Qiita-1.07M huggingface dataset:
DataGridのカラムにバインドする

#やりたいこと
DataGridのカラムやヘッダーとViewModelをバインドする。

#実装
DataGridColumnのようにビジュアルツリーに含まれないUI要素は、DataContextを継承しないためViewModelとバインドできない。

そこで、プロキシを用意し、それを経由してViewModelとバインドする。

```c#:プロキシクラス
using System.Windows;

namespace Sample {
    //Freezableを継承する
    public class BindingProxy : Freezable {
        protected override Freezable CreateInstanceCore() 
            => new BindingProxy();

        //依存関係プロパティを定義する
        public static readonly DependencyProperty DataProperty 
            = DependencyProperty.Register(
                nameof(Data),
                typeof(object),
                typeof(BindingProxy),
                new PropertyMetadata(null));

        public object Data {
            get { return (object)GetValue(DataProperty); }
            set { SetValue(DataProperty, value); }
        }
    }
}

```

#使い方

```xml:XAML
<Window x:Class="Sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Sample"
        Title="MainView" Height="300" Width="300">
    <Window.Resources>
        <!--プロキシを準備-->
        <local:BindingProxy x:Key="Proxy" Data="{Binding}" />
    </Window.Resources>
    <Grid>
        <DataGrid>
            <DataGrid.Columns>
                <!--プロキシ経由で参照-->
                <DataGridTextColumn Header="{Binding Data.XXX, Source={StaticResource Proxy}}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
```

#補足

実はプロキシ用のクラスを用意しなくても、FrameworkElementで同じことができる。しかし、役割を明確にしたかったので、専用のクラスを用いた。
ボタンを中央揃えにする

##ボタンを中央揃えにする

キャンセルボタンと一括編集ボタンを中央揃えにしたかったのでメモ。

html側

```
<div class ="update_all">

<button class = "button-update-all"><%= link_to "キャンセル", aaa_path(@user, id: current_user.id), style:"width:300px", class: "btn btn-primary", data: { confirm: "保存しないでよろしいですか？" } %></button>

<button class = "button-update-all"><%= f.submit "編集を保存する", style:"width:300px", class: "btn btn-primary", data: { confirm: "更新してよろしいですか？"} %></botton>

</div>
```
css側

divクラス

```
.update_all {
 text-align: center;
}
```

buttonクラス

```
.button-update-all {
  border: none;
  background: none;
}
```

を指定すると出来ました。
業務メモ　BitLocker

# BitLockerの進捗具合を確認する

1. コマンドプロンプトを立ち上げる
2. 以下のコマンドを実施

```powershell
Manage-bde.exe -status
```

# BitLockerをOffにする。

1. コマンドプロンプトを立ち上げる
2. 以下のコマンドを実施

```powershell
manage-bde -unlock C:
```


# BitLockerが開始しない時実行を促す

1. レジストリから以下を変更する。

```
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\FVE\MDOPBitLockerManagement]
"ClientWakeupFrequency"=dword:00000005
```

2. 待つ
Gradle で SchemaSpy を使用して DB のドキュメントを生成

SchemaSpy を使用して DB のドキュメントを生成するための Gradle のタスクのサンプルです。
※ 以下は MySQL 使用時の例

```Kotlin:build.gradle.kts
//-----------------------------------------------------------------------------
//    Plugins
//-----------------------------------------------------------------------------
plugins {
    java
    id("de.undercouch.download") version "5.1.0"
}

//-----------------------------------------------------------------------------
//    Dependency Management
//-----------------------------------------------------------------------------
// コンフィギュレーションの設定
// JDBC ドライバのためのコンフィギュレーション
val jdbc by configurations.creating

// ライブラリ取得先リポジトリ
repositories {
    // Maven セントラルリポジトリ
    mavenCentral()
}

// 依存関係の設定
dependencies {
    // JDBC ドライバのライブラリ
    jdbc("org.mariadb.jdbc:mariadb-java-client:3.0.4")
}

//-----------------------------------------------------------------------------
//    Tasks
//-----------------------------------------------------------------------------
// SchemaSpy のタスク
val schemaSpy by tasks.registering(JavaExec::class) {
    dependsOn(schemaSpyDownload)

    description = "Generates database documents."
    group = name

    val outputDir by extra(layout.buildDirectory.dir(name).get())
    val driverFile = jdbc.files.first()

    classpath = layout.files(schemaSpyDownload.get().outputFiles)

    args("-t", "mariadb")
    args("-dp", driverFile)
    args("-host", "localhost")
    args("-port", "3306")
    args("-u", "user")
    args("-p", "password")
    args("-db", "sample")
    args("-s", "sample")
    args("-o", outputDir)

    doFirst {
        delete(outputDir)
    }
}

// SchemaSpy のヘルプを表示するタスク
val schemaSpyHelp by tasks.registering(JavaExec::class) {
    dependsOn(schemaSpyDownload)

    description = "Displays the help about SchemaSpy."
    group = schemaSpy.get().group

    classpath = layout.files(schemaSpyDownload.get().outputFiles)

    args("-h")
}

// SchemaSpy のデータベースに関するヘルプを表示するタスク
val schemaSpyDatabaseHelp by tasks.registering(JavaExec::class) {
    dependsOn(schemaSpyDownload)

    description = "Displays the help about databases of SchemaSpy."
    group = schemaSpy.get().group

    classpath = layout.files(schemaSpyDownload.get().outputFiles)

    args("-dbHelp")
}

// SchemaSpy のファイルをダウンロードするタスク
val schemaSpyDownload by tasks.registering(Download::class) {
    description = "Downloads SchemaSpy file."

    src(uri("https://github.com/schemaspy/schemaspy/releases/download/v6.1.0/schemaspy-6.1.0.jar").toURL())
    dest(layout.projectDirectory.dir("${downloadTaskDir}/${name}"))
    overwrite(false)
}
データサイエンティストのスキルレベル ～グルーピング～

データサイエンティストのスキルレベル ～グルーピング～

# はじめに

標題の通り、どんなスキルレベルがあるのか確認
https://www.datascientist.or.jp/common/docs/skillcheck.pdf

統計数理基礎；ac
https://qiita.com/iwasaki_kenichi/items/25d55bcd872121b1015c

予測；
https://qiita.com/iwasaki_kenichi/items/3c2755e0b29669c11fbe

検定/判断；
https://qiita.com/iwasaki_kenichi/items/4ec59977c09f77581b8b

# グルーピング
|No|スキルカテゴリ|スキルレベル|サブカテゴリ|データサイエンス力：チェック項目|必須スキル|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|1  |グルーピング| ★    | グルーピング| 教師あり分類と教師なし分類の違いを説明できる|◯|
|2  |グルーピング| ★    | グルーピング| 判別分析とクラスター分析の概要や使い方を説明できる| |
|3  |グルーピング| ★    | グルーピング| 階層クラスター分析と非階層クラスタ-分析の違いを理解している| |
|4  |グルーピング| ★    | グルーピング| クラスター分析のデンドログラムの見方が分かり、適切に解釈できる| |
|5  |グルーピング| ★★  | グルーピング| 非階層クラスター分析において、分析目的に合致したクラスター数を決定することができる| |
|6  |グルーピング| ★★  | グルーピング| 階層クラスター分析における代表的なクラスター間距離（群平均法、Ward法、最長一致法など）の概念を理解し、分析内容に応じて最適な手法を選択して、分析ができる| |
|7  |グルーピング| ★★  | グルーピング| 各種距離関数（ユークリッド距離、マンハッタン距離、cos類似度など）を理解し、分析内容に応じて、適切なものを選択し分析ができる| |
|8  |グルーピング| ★★  | グルーピング| 分析内容に応じて、線形か非線形を使い分けた判別分析ができる| |
|9  |グルーピング| ★★  | グルーピング| k-means法は局所最適解であるため初期値問題があることを理解し、適切な初期値を設定して分析を行える |◯|
|10 |グルーピング| ★★★| グルーピング| 距離の公理を知っており、距離の公理を満たさない場合（［1-cos類似度］など）のクラスター分析を適切に行える| |
|11 |グルーピング| ★★★| グルーピング| k-meansの派生手法（x-means、k-means++、ファジィk-meansなど）を理解し、分析内容に応じた適切な手法を選択して、分析ができる| |
|12 |グルーピング| ★★★| グルーピング| k-meansとカーネルk-means（非線形クラスタリング）、スペクトラルクラスタリングの違いを理解し、分析内容に応じて、適切な手法を選択して、分析ができる| |
|13 |グルーピング| ★★★| グルーピング| 自己組織化マップ（SOM）、Affinity Propagation、混合分布モデル、ディリクレ過程混合モデルを理解し、分析内容に応じて適切な手法を選択して、分析ができる| |


# おわりに
教師あり分類と教師なし分類の違いを説明できるが必須スキルなんですね。確かに、関係する書籍を読むと大体教師ありと教師なしについて説明しているイメージがあります。
クラスター分析のことを触れている初心者向けの本はあまり見たことがないかもしれません。（そんなに本を読んでいないのでアレですが）
クラスター分析や、各距離関数については、下記のslideshareや、Albertさんの解説がわかりやすそうです。

https://www.albert2005.co.jp/knowledge/data_mining/cluster/cluster_summary

上記slideshareの10ページ目にまとめっている。
![-10-728.jpg](https://qiita-image-store.s3.amazonaws.com/0/284911/bb6733ff-6d82-cc30-ccc8-4cc50eefb1ee.jpeg)


https://www.albert2005.co.jp/knowledge/data_mining/cluster/cluster_summary

分析に応じて、線形か非線形かを使い分けた判別分析ができる。という項目は気になりました。
解析する人たちはどのように使い分けるのでしょうか。勘やノウハウなのか、それとも決まっている法則のようなものがあるのか...。

k-means法は局所最適解であるため初期値問題があることを理解し、適切な初期値を設定して分析を行えるが、必須スキルとしているのは気になりました。
この項目を必須にするということは、k-means法は現場でよく使われるということでしょうか。よく使われるが、適切な初期値を設定して分析しないと痛い目を見ることがあるので、
必須としているのでしょうか。

k-meansに派生手法があるのですね。（x-means、k-means++、ファジィk-meansなど）初耳です。

さすがに★★★となると、聞いたことのある単語だな。というレベルでした。
まだまだ勉強しなければ。
php-master-changes 2019-01-17

今日は gd の imagefilledarc() のバグ修正、不要コードの削除があった！

# 2019-01-17
## cmb69: Fix [#73614](https://bugs.php.net/bug.php?id=73614): gdImageFilledArc() doesn't properly draw pies
- https://github.com/php/php-src/commit/61cfa34e1194b5a026548508f9f34d6f6a8774da
- [7.2~]
- ext/gd で、[imagefilledarc](http://php.net/manual/ja/function.imagefilledarc.php) が円グラフっぽいのを正常に描けない問題の修正
- [こう](https://www.dropbox.com/s/68l645wakutl3n0/Pie2.png?dl=0)したいのが[こう](https://www.dropbox.com/s/s1pby0zutsajbed/Pie1.png?dl=0)なってた
- [#43828](https://bugs.php.net/bug.php?id=43828) の修正の影響らしい

## dstogov: Removed useless Z_REFCOUNTED_P() checks.
- https://github.com/php/php-src/commit/0941f258117ec4f0a549b1d862f348204be69713
- 不要な Z_REFCOUNTED_P() のチェックを削除
R.Swiftでは文字リソースで「%@」を使うと、その部分を引数にとる関数を自動生成する

うまいタイトル思いつかなかった。
tipsです。

以下のように@リテラルで文中の動的な部分を定義しておくと、R.swiftでは **@リテラル部分を引数に取って該当部分に挿入した文字列を返してくれるstatic funcが自動生成されます。**

```swift:Strings.strings
"receivedDate" = "受け取り日時:%@";
```

```swift:R.generated.swift

/// Value: 受け取り日時:%@
static func receivedDate(_ value1: String) -> String {
    return String(format: NSLocalizedString("receivedDate", tableName: "Strings", bundle: R.hostingBundle, comment: ""), locale: R.applicationLocale, value1)
}
```

```swift:使う側.swift

Strings.receivedDate("\(date.year)/\(date.month)/\(date.day)")

```

わぁ便利！知らなかった！
ビジュアルツリーの子孫要素を列挙する

#やりたいこと
ビジュアルツリーから子孫要素をIEnumerableとして取得する。

#実装
VisualTreeHelperクラスを使えば、子孫要素の取得自体はできるのだが使いにくい。そこで子孫要素を列挙する拡張メソッドをDependencyObjectに作成する。

```c#:拡張メソッド
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Media;

namespace Sample {
    public static class DependencyObjectExtensions {
        public static IEnumerable<DependencyObject> Children(this DependencyObject obj) {
            if (obj == null)
                throw new ArgumentNullException(nameof(obj));

            return Enumerable.Range(0, VisualTreeHelper.GetChildrenCount(obj))
                .Select(i => VisualTreeHelper.GetChild(obj, i))
                .Where(x => x != null);
        }

        public static IEnumerable<DependencyObject> Descendants(this DependencyObject obj) {
            if (obj == null)
                throw new ArgumentNullException(nameof(obj));

            foreach (var child in obj.Children()) {
                yield return child;
                foreach (var grandChild in child.Descendants())
                    yield return grandChild;
            }
        }
        
        public static IEnumerable<T> Descendants<T>(this DependencyObject obj) where T : DependencyObject {
            if (obj == null)
                throw new ArgumentNullException(nameof(obj));

            return obj.Descendants().OfType<T>();
        }
    }
}
```

#使い方

```c#
var headers = grid.Descendants<DataGridColumnHeader>();
```
3分読書。戦略なきエンジニアは孫氏に学びたい。 Thanks @hiroshimatsuno on Twitter 傾聴のメンタルモデルは風林火山の「林」。名経営者のおすすめ本。 

戦略なきエンジニアは孫氏に学びたい。傾聴のメンタルモデルは風林火山の「林」。名経営者のおすすめ本。 Thanks @hiroshimatsuno on Twitter

# 「小さな会社こそが勝ち続ける 孫子の兵法経営戦略」 を一瞬だけ読む！ 

# エンジニアに必要なのは戦略性だ

[Amazon.co.jp: 小さな会社こそが勝ち続ける 孫子の兵法経営戦略 (Asuka business & language book): 長尾 一洋: 本](https://www.amazon.co.jp/dp/4756913903/)

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">営業の速きこと風の如く、傾聴すること林の如く、提案すること火の如く、値引かざること山の如し。<br><br>みたいに、頭に残りやすく社内で共有しやすいメッセージが多い良書です。<br><br>長尾先生の「孫子の兵法 経営戦略」<a href="https://t.co/Q7bQT64fZZ">https://t.co/Q7bQT64fZZ</a><a href="https://twitter.com/kaz_nagao?ref_src=twsrc%5Etfw">@kaz_nagao</a> <a href="https://twitter.com/hashtag/%E5%AD%AB%E5%AD%90?src=hash&amp;ref_src=twsrc%5Etfw">#孫子</a> <a href="https://twitter.com/hashtag/%E7%B5%8C%E5%96%B6?src=hash&amp;ref_src=twsrc%5Etfw">#経営</a></p>&mdash; 松野広志☁️ABCD-P.com (@hiroshimatsuno) <a href="https://twitter.com/hiroshimatsuno/status/1076047350487908353?ref_src=twsrc%5Etfw">December 21, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 傾聴のコツは「林」のイメージ

>営業の速きこと風の如く、傾聴すること林の如く、提案すること火の如く、値引かざること山の如し。

林のように静寂があって、少しざわめいていて、さらさらとする感じかもしれない。

ビジネススキルの一個ずつ全てに、なんらかの、僕らが慣れ親しんだメンタルモデルを作りたい。

# なぜ今孫氏なのか？戦略が必要な時代だから

戦略性がとにかく弱い僕としては、今こそ孫氏に学ぶべきなのかもしれない

![image](https://user-images.githubusercontent.com/13635059/51357170-fa9c2d80-1b00-11e9-8f79-61aa572f775a.png)

# 名経営者がおすすめしているから、きっと間違いない

逆にこの本を読んでふむふむうなずけるようなら、自分は名経営者に近づいてるのかもしれない。

リトマス試験紙？

>孫子、古来より名軍師、名経営者と呼ばれる方が
>口をそろえて「名著だ」とおっしゃっていて、

# 関係ないけどこんな記事も

就活に役立つらしいです‥笑

>尊敬する人物の質問では孫正義を語れ
>前述したように孫正義氏の口からはエンジニアとして深く心に刻むべき言葉がたくさん発せられています。
>エンジニア志望の就活生としては、自伝や関連書籍を読み漁って損はない人物です。

[【エンジニアになろう！】孫正義の言葉からエンジニア志望として必要な姿勢を学べ！ - 就活パレット｜モノづくり就活に特化した就活お悩み解決サイト](https://www.spalette.net/1498/)

---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
楽天RMS自動ログインスクリプト

<h1>はじめに</h1>
ノンプログラマーによる、Pythonを活用して自動化の仕組みを構築します。
楽天市場の店舗用管理画面rakuten RMS へのログインスクリプト。

<h2>環境まとめ</h2>
・python3.7.0
・selenium
・webdriver
・jupyter notebook

<h2>ターミナルから起動</h2>

```python:rakuten_rms.py
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://glogin.rms.rakuten.co.jp/?sp_id=1')
elem_id = browser.find_element_by_id('rlogin-username-ja')
elem_id.send_keys('RMSID')
elem_password = browser.find_element_by_id('rlogin-password-ja')
elem_password.send_keys('RMSpass')
elem_btn = browser.find_element_by_name('submit')
elem_btn.click()
email_elem = browser.find_element_by_name('user_id')
email_elem.send_keys('rakuten_user_ID')
password_elem = browser.find_element_by_name('user_passwd')
password_elem.send_keys('rakuten_user_pass')

# アンケートや利用規約に関してのボタン操作。
elem_btn = browser.find_element_by_name('submit')
elem_btn.click()
elem_btn = browser.find_element_by_name('submit')
elem_btn.click()
# 処理が重複しているので、なんとかできないか？

confirm_btn = browser.find_element_by_id('confirm')
confirm_btn.click()
# ここまででログイン完了
```

<h2>他のログインへの応用</h2>
reCAPTCHA を回避できない。
※AmazonCENTRALへの自動ログインから日々の売上データを取得したい。
※メルカリも同様。

<h2>要素の取得方法について</h2>
class_name以外の指定方法

https://kurozumi.github.io/selenium-python/locating-elements.html

>find_element_by_id
>find_element_by_name
>find_element_by_xpath
>find_element_by_link_text
>find_element_by_partial_link_text
>find_element_by_tag_name
>find_element_by_class_name
>find_element_by_css_selector
低レーヤーの技術って勉強すべきなの？フレームワークだけじゃだめなの？Binary Hacks ―ハッカー秘伝のテクニック100選を一瞬だけ読む！

低レーヤーの技術って勉強すべきなの？フレームワークだけじゃだめなの？Binary Hacks ―ハッカー秘伝のテクニック100選を一瞬だけ読む！

# Ya
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">為になることばっか。ハッカーの秘伝テクニック <a href="https://t.co/bVP2GO8PKk">pic.twitter.com/bVP2GO8PKk</a></p>&mdash; Ryuichi@駆け出しvimmer (@ryuichi_1208) <a href="https://twitter.com/ryuichi_1208/status/1085510535708209153?ref_src=twsrc%5Etfw">January 16, 2019</a></blockquote>


[Amazon.co.jp: Binary Hacks ―ハッカー秘伝のテクニック100選: 高林 哲, 鵜飼 文敏, 佐藤 祐介, 浜地 慎一郎, 首藤 一幸: 本](https://www.amazon.co.jp/Binary-Hacks-%E2%80%95%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E7%A7%98%E4%BC%9D%E3%81%AE%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF100%E9%81%B8-%E9%AB%98%E6%9E%97-%E5%93%B2/dp/4873112885)
# 低レイヤーは生

モンスターハンターの肉を思い浮かべた。

>本書のテーマは低レイヤのプログラミング技術です。低レイヤとは「生」のコンピュータに近いことを意味します。

# 低レイヤーは隠蔽されている

あらためて隠蔽という言葉で言われる納得感。

>ソフトウェアの世界は抽象化の積み重ねによって進歩してきました。抽象化は低レイヤの複雑な部分を隠蔽し、より生産性、安全性の高い方法でプログラミングする手段を開発者に提供します。

# 階段を一段下がる時

>ときおり発生する「謎のエラー」を解決したい、といった場面では低いレイヤに降りていく必要に迫られます。残念ながら、抽象化は万全ではないためです。


---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Proxy経由でWatson Assistantに接続する方法（Python）

#はじめに
PythonでProxy経由でWatson Assistantに接続する方法について記載します。

Watson AssistantはIBM Cloudのサービスですが、セキュリティが厳しい環境ではプログラムから直接外部のクラウドサービスへ接続することが許されない場合があります。
そこで、Proxyサーバーを経由してアクセスする方法について記載します。

#前提
Python 3.6.4　（諸事情により古いですがご了承ください）

#Watson AssistantのSDKを使った場合

まずは、SDKを使ってWatson Assistantへアクセスするためにこんな感じで書きます。

```test.py
# Watson Developer Cloud SDK
from watson_developer_cloud import AssistantV1
from watson_developer_cloud import WatsonApiException

assistant = AssistantV1(
    version = "2018-09-20",
    iam_apikey = "*********",
    url = "https://gateway.watsonplatform.net/assistant/api"
)
```

*`version`、`iam_apikey`、`url`は個別の環境に合わせて変えてくださいね。*

次にProxy情報（IPとポート番号）を設定して

```test.py
######### Proxy設定 #########
http_proxy="xxx.xxx.xxx.xx:yyyy"
https_proxy="xxx.xxx.xxx.xx:yyyy"

http_config={"proxies" :{
    "http" : http_proxy,
    "https" : https_proxy
    }}
```

assisantに設定する

```test.py
assistant.set_http_config(http_config)
```

後は、通常通り `assistant.get_workspace()`　などでワークスペースの情報を取得したりすればOK。

#SDKを使わない場合
SDKを使わず直接POSTする場合はこんな感じ。

```test.py
#Request設定
headers = {'Content-Type': 'application/json'}
params = (('version', "2018-09-20"))
requrl = "https://gateway.watsonplatform.net/assistant/api/v1/workspaces"
            
#Proxy設定
proxies = {
"http" : http_proxy,
"https" : https_proxy
}

#POST
requests.post(requrl, proxies=proxies, headers=headers, params=params, data=json_data, auth=(wa_usr, wa_pwd))

```
*`version`、`requrl`等は個別の環境に合わせて変えてください。*

以上です。

#参考資料
- Watson Assistant API Reference
    - https://cloud.ibm.com/apidocs/assistant#introduction



#
#####お断り
このサイトの掲載内容は私自身の見解であり、必ずしも所属会社の立場、戦略、意見を代表するものではありません。 記事は執筆時点の情報を元に書いているため、必ずしも最新情報であるとはかぎりません。 記事の内容の正確性には責任を負いません。自己責任で実行してください。
Twitter の全てのツイートのダウンロード機能を使ってみる。月単位でJsonファイルが吐き出され、HTMLとjsで読み込む、わりとモダンな作りだった。そのままHTMLとしての利用はしづらそう？


Download Twitter Arichive and download

# Request

https://twitter.com/settings/account

![image](https://user-images.githubusercontent.com/13635059/51356033-692abc80-1afc-11e9-9fe1-e18d8d708444.png)

# Email

![image](https://user-images.githubusercontent.com/13635059/51356041-75167e80-1afc-11e9-9d25-76a079216211.png)

# Download

![image](https://user-images.githubusercontent.com/13635059/51356049-7b0c5f80-1afc-11e9-99d5-4c2680cd046a.png)

![image](https://user-images.githubusercontent.com/13635059/51356057-852e5e00-1afc-11e9-97e9-ecc431308315.png)

# Unizip

![image](https://user-images.githubusercontent.com/13635059/51356076-9ecfa580-1afc-11e9-931c-ce6236e2ceb6.png)


# Open with Safari

why my chrome not work?

![image](https://user-images.githubusercontent.com/13635059/51356190-04bc2d00-1afd-11e9-9036-3fae506127d5.png)

# View

![image](https://user-images.githubusercontent.com/13635059/51356203-0f76c200-1afd-11e9-9569-aaca779faa85.png)

# All Tweets are in json per month

![image](https://user-images.githubusercontent.com/13635059/51356253-3fbe6080-1afd-11e9-95a8-d46404c7031e.png)


---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
nginxのproxy_passの挙動を整理しよう

# 方法

nginxを2つ起動します( nginx-01, nginx-02 )。
nginx-01へのアクセスをnginx-02に振り分けるようproxy_passを設定します。


## nginxコンテナを2つ起動する

```
$ sudo docker run --name nginx-01 -d -p 8081:80 nginx:latest
$ sudo docker run --name nginx-02 -d -p 8082:80 nginx:latest
```

## nginx-02のコンテナのIPアドレスを確認する

```
$ sudo docker inspect nginx-02 | grep IPAddress
            "IPAddress": "172.17.0.3",
$
```

## nginx-01の設定にnginx-02へのproxy_passを追加する

{設定値}はnginx-02への様々なパスで試そう(後述)

```
    location /japan {
        proxy_pass {設定値}
    }
```

設定変更・反映コマンド

```
$ sudo docker cp nginx-01:/etc/nginx/conf.d/default.conf .
$ vim default.conf
$ sudo docker cp default.conf nginx-01:/etc/nginx/conf.d/defalt.conf
$ sudo docker restart nginx-01
```

# 結果

以下コマンドを叩いてnginx-01にアクセスした際のnginx-02のログを記載します。

- コマンド1 : `curl localhost:8081/japan`
- コマンド2 : `curl localhost:8081/japan/fukuoka`

nginx02ログ

項番 | proxy_pass 設定値 | コマンド1実行時 | コマンド2実行時 |
--- | --- | --- | ---
1 | http://172.17.0.3  |GET /japan | GET /japan/fukuoka
2 | http://172.17.0.3/ | GET / | GET //fukuoka
3 | http://172.17.0.3/japan         | GET /japan | GET /japan/fukuoka
4 | http://172.17.0.3/japan/fukuoka | GET /japan/fukuoka | GET /japan/fukuoka/fukuoka
5 | http://172.17.0.3/america       | GET /america | GET /america/fukuoka

１だけ特別で2〜5は同じ法則で動作しました。

- 1はproxy_passに`IP:PORT`のようにスラッシュ配下のパスを設定していません。
  - この場合、nginx-02の`IP:PORT`+全パスでアクセスされました。
- 2〜5はproxy_passに`IP:PORT/hoge`のようにスラッシュ配下のパスまで設定しています( 2はhogeは空文字ととらえる )。
  - この場合、nginx-02の`IP:PORT/hoge` + 部分パスでアクセスされました。

コマンド2の結果が項番2で`//fukuoka`になったり、項番4で`/japan/fukuoka/fukuoka`になったり、項番5で`/america/fukuoka`になったりする挙動の説明がつきました。

## まとめ

- proxy_passに`IP:PORT`のようにスラッシュ配下のパスを設定しない場合
  - `IP:PORT` + 全パスが付与される
- proxy_passに`IP:PORT/hoge`のようにスラッシュ配下のパスまで設定した場合
  - `IP:PORT/hoge` + 部分パスが付与される
ラテン文字辞書ファイルから、先頭の単語を取り出し、単純な辞書ファイルを作るコード。

一般の英和辞書ファイルなどから、単語列からなる単純な、基本の辞書ファイルを抜き出すコードextword.cppです。

一般の辞書ファイルは
・英辞郎のダウンロード可能の辞書、
・PDSの<a href="https://kujirahand.com/web-tools/EJDictFreeDL.php" >ejdic-hand-utf8.txt</a>、
・stardictの辞書から「stardict-editor」で、DeCompileしたTab File
・英単語で始まって、セパレータがアルファベット以外で、`\n`で行が終わるファイル。

などに対応しています。

sed、awk等で書きたかったのですが、sed,awkは、基本的に、英辞郎のバイナリファイルは扱えませんので。。。

`コンパイルの仕方:c++ extwords.cpp -o extwords`
`使い方:extwords sourcedicfile >dicfile`

【GitHub】
https://github.com/fygar256/extwords

```extwords.cpp
/*
  英和、英英辞書ファイルから、単語列を抽出するプログラム
*/
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<ctype.h>
#include	<iostream>
#include	<algorithm>
#include	<vector>
#include	<string>

using namespace std;

char *getword(FILE *fp,char *w) {
	int idx;
	int c;

  while(1) {
	idx=0;
	c=fgetc(fp);
  if (c==EOF) return(NULL);
	if (c==0x81) fgetc(fp);
		else ungetc(c,fp);

	while(1) {
		c=fgetc(fp);
    if (!isalpha(c)) {
        w[idx]='\0';
        while(fgetc(fp)!='\n'); 
        if (w[0]=='\0') break;
        return(w);
        }
    w[idx++]=c;
    }
  }
}

int	main(int argc,char *argv[])
{
	FILE	*fp;
	char	w[1000];
  vector<string> data;
	string	str;

	if (argc!=2) {
      fprintf(stderr,"Usage: words dicfile\n");
      exit(1);
      }

	fp=fopen(argv[1],"r");
	if (fp==NULL) exit(1);

	data.clear();
	while(1) {
      if (getword(fp,w)==NULL) break;
			str=w;
			for(auto & c:str) c=tolower(c);
			data.push_back(str); 
		}
	fclose(fp);

  sort(data.begin(), data.end());
  data.erase(unique(data.begin(), data.end()), data.end());

	for(auto i:data)
		cout << i <<endl;
	exit(0);
}
```

```出力例：ejdic-hand-utf8.txtより.
a
aa
aaa
aam
aardvark
aaron
ab
abaci
aback
abacus
abaft
abalone
abandon
abandoned
abandonment
abase
abasement
abash
...
zr
zucchetto
zucchini
zulu
zurich
zwieback
zzz
```
POCOPHONE f1のAndroid開発準備

#はじめに
Androidで何か開発してみたい。ARcoreおもしろそう。
で、買ってみたPOCOPHONE f1。 3万円なのに超ハイスペック。　(スペックは[ここ](https://telektlist.com/smartphone_info/xiaomi-pocophone-f1/)に説明があります。)
ネットを探しても日本語の記事は少なさそうに思えたので書いてみます。

##開発者モード
POCOPHONE f1は同じXiaomiから出ているスマホと同じ方法で開発者モードに移行できました。
以下、手順です。
1.設定→デバイス情報→MIUIバージョン(For POCO)を5～8回タップする。
![S__2367927.jpg](https://qiita-image-store.s3.amazonaws.com/0/339954/4bfd082b-8e19-317d-00f9-9085b073142f.jpeg)

2.設定→その他の設定の中に”開発者向けオプション”が出ていれば完了です。
![S__2367926.jpg](https://qiita-image-store.s3.amazonaws.com/0/339954/dbedf646-662a-d1e6-29d4-dd39d23ba2c2.jpeg)



簡単ですね。

##USBドライバのインストール
####Windows10の場合
1.デバイスマネージャを開き、ポータブルデバイスの中のPOCOPHONE F1を右クリックして、ドライバーの更新を選択する。
![無題_0.png](https://qiita-image-store.s3.amazonaws.com/0/339954/9192d75d-e3d2-ce04-e11d-031f8e070966.png)

2.コンピュータを参照してドライバーソフトウェアを検索を選択する。

3．あとは流れでインストールできます。

####macOSの場合
Windowsでしかやっていないので正確ではないかもですが、
"POCOPHONE f1 adb"で検索すると、ドライバがでてきます。(Xiaomi用のを選ぶ必要あり)
その中で、macOS用のドライバがあるので選択してインストールするといけるかも。。。？
(自分はこっちでインストールしました。自己責任で。)


ドライバのインストールができると、端末にUSBデバッグを許可するかのダイアログが出るので許可してください。

##開発者向けオプションでの設定
開発者向けオプションの中の ”USBデバッグ” と "USB経由でインストールする" をtrueにしてください。
ここで、"USB経由でインストールする" をtrueにするためには、SIMカードが必要となります。
POCOはauの回線を拾わないとのことでしたが、刺さっていれば何でもいいみたいです。
SIMがないと現状ではtrueにできないみたいです。
(androidのバージョンを落とすとワンチャンあり？みたいなのは見かけた)

これでおそらく開発に必要な設定はおわりなはずです。(Android Studio等は別)

#おわりに
サンプルコードでですが、hello_ar_javaをビルドして触ってみました。
JavaだけでAndroid触るつもりだったけどARcoreならUnityもなのかなぁ…
![86.jpg](https://qiita-image-store.s3.amazonaws.com/0/339954/f7ee87f5-781b-7eaa-68ea-4ae7df41c053.jpeg)
phpのcurlでhttpsのステータスコードを取得する方法

```
function get_status($url) {
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_HEADER, true);    // we want headers
	curl_setopt($ch, CURLOPT_NOBODY, true);    // we don't need body
	curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
	curl_setopt($ch, CURLOPT_TIMEOUT,2);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	$output = curl_exec($ch);
	$httpcode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
	curl_close($ch);

	//echo 'HTTP code: ' . $httpcode;
	return $httpcode;
}
```
xcode10のImage Literalでメディアライブラリが出ない

Main.storyboardで作ってる人は
「は？」って思ったかもしれないです。そうです、関係ないです。笑

SwiftコードでUIImageViewを設置してる人向けです。

![スクリーンショット 2019-02-01 14.34.07.png](https://qiita-image-store.s3.amazonaws.com/0/325154/38224b39-8861-ddcd-31fe-8c858eeaec0f.png)

image Literalを選択した状態でエンター

![スクリーンショット 2019-02-01 14.34.15.png](https://qiita-image-store.s3.amazonaws.com/0/325154/6a2c6ef4-8121-36ba-80bf-11b6a44d74e3.png)
青いアイコンをダブルクリック

![スクリーンショット 2019-02-01 14.34.22.png](https://qiita-image-store.s3.amazonaws.com/0/325154/906599cf-803e-673f-3cde-dcf490f1d99b.png)
画像をクリック

今まで
Shift command M を使ってたけど
![スクリーンショット 2019-02-01 14.42.30.png](https://qiita-image-store.s3.amazonaws.com/0/325154/ecedd159-7dbd-76d0-bc34-fac8cc913d30.png)



```
2019-02-01 14:41:44.866810+0900 practice[18598:297462] Unknown class _TtC8practice14ViewController in Interface Builder file.
(lldb) 
```

こんなエラーが出て、ググるハメに。。。
常識的なことなのか、青いアイコンをクリックという情報に辿り着くまで、中国語サイトまで行った。マジ大変だった〜。
Ruby2.6のInfiniteRangeをActiveRecordで利用した時の挙動を各RDBMSに対して調査した

## TL;DR


<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">User.where(id: 1..).to_sql<br>#=&gt; &quot;SELECT \&quot;users\&quot;.* FROM \&quot;users\&quot; WHERE \&quot;users\&quot;.\&quot;id\&quot; BETWEEN 1 AND NULL&quot;</p>&mdash; . (@y_yagi) <a href="https://twitter.com/y_yagi/status/1077884294574395392?ref_src=twsrc%5Etfw">2018年12月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">NULLが全ての有理数より大きく振舞うか小さく振舞うかがRDBMS依存なので不定な振舞いのSQLとも言える</p>&mdash; Ryuta Kamizono (@kamipo) <a href="https://twitter.com/kamipo/status/1077972360639131648?ref_src=twsrc%5Etfw">2018年12月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


こちらのtweetで言及されているNULLの挙動について軽く調べました。
調査対象はMySQL, PostgreSQL, SQLite3, Oracleの4つです。
今回調査したRDBMSでは結果は同一で、BETWEENにおいてどちらかにNULLを利用すると、結果はNULLとなるようです。


## 詳細

ruby2.6で追加されたInfinite RangeをActiveRecordで利用した時の挙動について調べました。

Infinite RangeをActiveRecordのin句で下記のように利用すると


`User.where(id: (0..)).to_sql`


このようなSQLが作成されます。

``"SELECT `users`.* FROM `users` WHERE `users`.`id` BETWEEN 0 AND NULL"``

RDBMSによって細かい箇所が微妙に異なりますがそこは各自補完してください。
このSQLの結果がどの方になるかを各RDBMSに対して調査しました。


今回調べたのはMySQL, PostgreSQL, SQLite3, Oracleの4種類です。

結論から言うと、この4種類のRDBMSでの上記SQLの結果は同じものとなりました。

empty setが返ってきます。

## 実行例

### PostreSQL

```sql:postgresql
posgre_development=# SELECT * FROM users WHERE users.id BETWEEN 0 AND NULL;
 id | created_at | updated_at 
----+------------+------------
(0 rows)
```

### MySQL
```sql:mysql
mysql> SELECT `users`.* FROM `users` WHERE `users`.`id` BETWEEN 0 AND NULL;
Empty set (0.00 sec)
```

### SQLite

```sql:sqlite
sqlite> SELECT * FROM users WHERE users.id BETWEEN 0 AND 1;
1|2019-01-09 16:19:13.215559|2019-01-09 16:19:13.215559
sqlite> SELECT * FROM users WHERE users.id BETWEEN 0 AND NULL;
sqlite> 
```
(sqliteは結果がemptyの場合結果を何も表示しないようです。)


### Oracle

```sql
SELECT * FROM CUSTOMERS WHERE CUSTOMERS.ID BETWEEN 1 AND NULL;

no rows selected
```

## クエリを逆にした場合

ちなみに、BETWEEN句を逆にした下記のようなクエリについても調べました。

``"SELECT `users`.* FROM `users` WHERE `users`.`id` BETWEEN NULL AND 10"``

これは、記事冒頭のtweetで言及されているNULLの振る舞いについて調べるためです。

結論から書くと、こちらも同様の結果となり、結果はempty setでした。

### PostreSQL
```sql
posgre_development=# SELECT * FROM users WHERE users.id BETWEEN NULL AND 129;
 id | created_at | updated_at 
----+------------+------------
(0 rows)
```

### MySQL
```sql:mysql
mysql> SELECT `users`.* FROM `users` WHERE `users`.`id` BETWEEN NULL AND 10;
Empty set (0.00 sec)
```

### SQLite
```sql:sqlite
sqlite> SELECT * FROM users WHERE users.id BETWEEN NULL AND 10;
sqlite> 
```

### Oracle
```sql
SQL> SELECT * FROM CUSTOMERS WHERE (CUSTOMERS.ID NOT IN (SELECT CUSTOMER_WITHDRAWALS.CUSTOMER_ID FROM CUSTOMER_WITHDRAWALS)) AND (CUSTOMERS.ID BETWEEN NULL AND 10);

no rows selected
```


## まとめ
NULLと絡んだSQLクエリの結果は不定となり、NULLとなるようです。
他のRDBMSについてはまた余裕があれば調べようかと思います。

調査に際して、下記のリポジトリを利用しました。
https://github.com/colorbox/2.6-rails-range-research
【Rails】足跡機能の作り方

マッチングアプリを練習で作っているのですが、
足跡機能の作り方がわからず、困っていたけど、　出来たので、投稿します！

目的
===
足跡機能の実装

準備
===
User model作成
Footprint model作成

```ruby:footprint.db
class CreateFootprints < ActiveRecord::Migration[5.2]
  def change
    create_table :footprints do |t|
      t.string :visiter_id
      t.string :visited_id
      t.timestamps
    end
    add_index :footprints, :visiter_id
    add_index :footprints, :visited_id
    add_index :footprints, [:visiter_id, :visited_id], unique: true
  end
end
```
```ruby:routes
  resources :users do
    resources :footprints, only: [:index, :create]
    member do
      get :profile
      get :follower
      get :following
    end
  end
```
```ruby:user.rb
class User < ApplicationRecord
  has_many :footprints
```
```ruby:footprint.rb
class Footprint < ApplicationRecord
  belongs_to :user, optional: true
end
```
view,controller作成
===
viewについては、userのprofileを見たら、footprintがcreateされるようにする。
form_withを使って、profileページが開いたら、submitするようにセットする。

```ruby:profile.html.haml
class Footprint < ApplicationRecord

:javascript
  $("#footprint_js").trigger('click')

.body-white
  .profile
    = form_with model: @footprint, url: user_footprints_path(current_user) do |f|
      = f.hidden_field :visited_id, value: @user.id
      = f.hidden_field :visiter_id, value: current_user.id
      = f.submit "", style: 'display:none', id: "footprint_js"
    .profile-tittle
      %h1 プロファールの設定
他省略、、
```
jsでクリックされる。
formは見えないようにdisplay:noneにする。


controllerは受け取るのみ

```ruby:footprint.controller
  def create
    Footprint.create(footprint_params)
  end

  private

  def footprint_params
    params.require(:footprint).permit(:visiter_id, :visited_id)
  end
```
　footprint.rbでoptional: trueとしておかないと、createされないので、注意が必要。

以上、足跡機能でした。
astropy や pyfits の writeto 関数でfitsの行列データが書き出せないバグのチェック方法

# astropy/pyfits のバグチェックの方法

fitsファイルが行列データを含む場合、`astropy`や`pyfits`の`writeto`関数では書き出せないバグが存在する。bug は fix されているので新しいバージョンを使えば解決できる。古いバージョンを使っていて bug に出会った人はご一読ください。

# 対処方法

## `pyfits` の bug が含まれるバージョン

- pyfits 2.2.2 バグなし
- pyfits 2.3.1 バグあり
- pyfits 2.4.0 以降は bug が fix されている

pyfits は version 2.4.0 以降を使えば良い。


## `astropy` の bug が含まれるバージョン

- astropy 1.1.2 バグあり
- astropy 2.0.11 バグなし 

`astropy` は version 2.0.11 以降を使えばよい(はず)。

# 確認方法

### 中身の説明

「すざく」衛星の姿勢ファイルを開いて、オイラー角度を[0,0,0]に変更して保存し、その通りに変更されたかを確認するだけのもの。

必要なスクリプトとファイル
- [ae905005010_short.att](http://www-x.phys.se.tmu.ac.jp/~syamada/ana/suzaku/XISPileupDoc_20120221/checktool/ae905005010_short.att)
- [check_att.py](http://www-x.phys.se.tmu.ac.jp/~syamada/ana/suzaku/XISPileupDoc_20120221/checktool/check_att.py)

``` python:check_att.py
import numpy as np
import astropy
from astropy.io import fits

print "astropy version = ", astropy.__version__
print "open ae905005010_short.att"
f1 = fits.open("ae905005010_short.att")
print f1[1].data.field("EULER")[0]
f1[1].data.field("EULER")[0] = [0,0,0]
print f1[1].data.field("EULER")[0]

print "write attgen1.fits"
f1.writeto("attgen1.fits",clobber=True)

print "open attgen1.fits"
g1 = fits.open("attgen1.fits")
print g1[1].data.field("EULER")[0]
```

### ダメな例

``` sh:
> python check_att.py
astropy version =  1.1.2
open ae905005010_short.att
[ 262.67212651  111.49207819  177.54302463]
[ 0.  0.  0.]
write attgen1.fits
open attgen1.fits
[ 262.67212651  111.49207819  177.54302463] <== 変更箇所が反映されてない。
```

### 成功例

``` sh:
>python check_att.py
astropy version =  2.0.11
open ae905005010_short.att
[ 262.67212651  111.49207819  177.54302463]
[ 0.  0.  0.]
write attgen1.fits
open attgen1.fits
[ 0.  0.  0.] <== 正しく変更箇所が保存されている
```

## 最後に

2011年にpyfitsのこのバグで結構ハマった。2019年になって、同じバグで astropy でハマった。fitsのライブラリは枯れてると思いがちだが気をつけよう。。
Pythonで関数名から実装内容を出力する

# TL;DR

- `inspect`を使う
- Jupyter Notebookでは、`??func_name` or `func_name??`で同様の結果を得られる。【情報提供元： @na90ya 様】

# 目的

「サンプルコードでしれっと使われてる関数の実装を知りたい」「でも元ソースを追うのはつらい」といったときがありました。

どうせなら、REPL上で簡単に確認できないものかと常々思ってました。

例えば、こんなソース

```python:github.com/tensorflow/models/research/slim/mobilenet/mobilenet_v2.py
...
import tensorflow as tf

from nets.mobilenet import conv_blocks as ops
from nets.mobilenet import mobilenet as lib

slim = tf.contrib.slim
op = lib.op

expand_input = ops.expand_input_by_factor

# pyformat: disable
# Architecture: https://arxiv.org/abs/1801.04381
V2_DEF = dict(
    defaults={
        # Note: these parameters of batch norm affect the architecture
        # that's why they are here and not in training_scope.
        (slim.batch_norm,): {'center': True, 'scale': True},
        (slim.conv2d, slim.fully_connected, slim.separable_conv2d): {
            'normalizer_fn': slim.batch_norm, 'activation_fn': tf.nn.relu6
...
```

ここの`tf.nn.relu6`というメソッドが一体何をしているのか知りたい。大方予想はつくが、予想と違うと後々困る。

# やり方

調べたら普通にありました。

ソース：https://stackoverflow.com/questions/427453/how-can-i-get-the-source-code-of-a-python-function

ここによると、`inspect`モジュールに、今回の用途を満たしてくれる機能が詰まってるようです。

今回は、単純に実装だけわかればいいので、`inspect`モジュールの中の、`getsource`という関数を使用します。
これは、関数名を引数として与えることにより、実装内容を返してくれる関数のようです。

以下のような感じで使用することができます。

```sh
[musaprg@sylveon ~]$ python 
Python 3.6.8 |Anaconda custom (64-bit)| (default, Dec 30 2018, 01:22:34)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" o
>>> import tensorflow as tf
>>> lines = inspect.getsource(tf.nn.relu6)
>>> print(lines)
@tf_export("nn.relu6")
def relu6(features, name=None):
  """Computes Rectified Linear 6: `min(max(features, 0), 6)`.

  Source: [Convolutional Deep Belief Networks on CIFAR-10. A.
  Krizhevsky](http://www.cs.utoronto.ca/~kriz/conv-cifar10-aug2010.pdf)

  Args:
    features: A `Tensor` with type `float`, `double`, `int32`, `int64`, `uint8`,
      `int16`, or `int8`.
    name: A name for the operation (optional).

  Returns:
    A `Tensor` with the same type as `features`.
  """
  with ops.name_scope(name, "Relu6", [features]) as name:
    features = ops.convert_to_tensor(features, name="features")
    return gen_nn_ops.relu6(

```

もっと色々できるみたいですね。詳しくは公式docへ。

https://docs.python.jp/3/library/inspect.html

# Jupyter Notebookの場合

Jupyter Notebookを使っている場合は、IPython自体に`inspect`モジュールと同様の出力を得られる構文が存在しました。

情報提供してくださった @na90ya 様、ありがとうございます！

## やり方

調べたい関数名を`func_name`とすると、以下のように記述することで、`inspect.getsource`と同様の出力を得ることができます。

```python
??func_name
```

```python
func_name??
```

`??`は、目的の関数の前後どちらにつけても動作するみたいです。
Stylus calc計算で複数変数を用いる場合の書き方


例が思いつかなくて、変なコードですが
下記みたいに書けばOKでした。


```.scss
image_width = 100px;
image_height = 120px;

.mainImage {
  left "calc(%s + %s)" % (image_width image_height);
}


```
goroutineあれこれ4

# お題
気まぐれでgoroutineと戯れる。。。

# 関連記事Index
- [goroutineあれこれ3](https://qiita.com/sky0621/items/5089d3c265b02763e600)
- [goroutineあれこれ2](https://qiita.com/sky0621/items/7a5fe811bd807647353c)
- [goroutineあれこれ](https://qiita.com/sky0621/items/601deaa2007c28ed16d6)

# 開発環境
### # OS
```
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
```

### # 言語
```
$ go version
go version go1.11.4 linux/amd64
```

# 実践

## OSシグナルを受け付けて複数goroutineを停止

複数のgoroutineを生成実行し、メインgoroutineはOSシグナルを待ち受ける。
OSシグナルから受信があると、実行中の複数goroutineすべてに停止通知を行う。

### ■OSシグナルの受け手

OSシグナルを受信したら、あらかじめ受け取っておいたgoroutine停止用のキャンセル通知関数`notifyToStop`を実行する。
これにより、事前に実行していた複数goroutineに”停止”を通知する。
受け取るOSシグナルは`SIGINT`だけ。（とりあえずCtrl+Cでキーボード割り込みした事例で良いので）

```go:[signal_receiver.go]
type signalReceiver struct {
	ch           chan os.Signal // OSからのシグナル受信用チャネル
	notifyToStop func()         // OSからのシグナル受信時の他チャネルへの停止通知関数
}

func newSignalReceiver(notifyToStop func()) *signalReceiver {
	ch := make(chan os.Signal, 1)
	signal.Notify(ch, syscall.SIGINT)
	return &signalReceiver{
		ch:           ch,
		notifyToStop: notifyToStop,
	}
}

func (r *signalReceiver) wait() {
	<-r.ch
	fmt.Println("received signal !!!!!")
	r.notifyToStop()
}
```

### ■goroutine実行対象の関数

受け取った`name`を１秒おきに出力し続けるだけの関数。
コンテキストから終了通知を受け取ったら、処理終了。

```go:[main.go]
// １秒おきにnameを出力
func echoLangName(ctx context.Context, name string) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("***** stop echo " + strings.TrimSpace(name) + " *****")
			return
		default:
			fmt.Println(name)
			time.Sleep(1 * time.Second)
			continue
		}
	}
}
```

### ■main関数

５言語（選択は適当）分のgoroutineを生成したら、あとはメインgoroutineでOSシグナル受信待ち。

```go:[main.go]
func main() {
	// エコー対象の言語は５つ
	langs := []string{
		"Go",
		"    Java",
		"         C++",
		"              PHP",
		"                  Ruby"}

	ctx, cancelFunc := context.WithCancel(context.Background())

	for _, lang := range langs {
		go echoLangName(ctx, lang)
	}

	rec := newSignalReceiver(cancelFunc)
	rec.wait()

	time.Sleep(3 * time.Second) // 本来はWaitGroup使う
}
```

### 実行

開始から２秒くらい経ったところで `Ctrl+C` で割り込み。
すると、OSシグナルからの割り込みを待っていた `wait()` 関数にて「`received signal !!!!!`」を出力。
その後、あらかじめ用意しておいたキャンセル通知関数の実行により、main以外の各goroutineが停止。

![output.gif](https://qiita-image-store.s3.amazonaws.com/0/180599/1b2c3f6c-411e-f07d-f262-1c0f4b3c899d.gif)

# 参考
今回載せた動画GIFは↓を参考に作ってみました。使い勝手もいいし、できたGIFも軽い。
https://qiita.com/syohex/items/d7076828c54114eb7657
AWS ubuntu16.04環境にnginx、PHP7.2環境を構築、ドキュメントルートの変更

#目的
LPICレベル1を取ったばかりのLinux初心者がAWSにWebサーバを構築する練習をしようと思い、実行してみた。
特にnginxの設定ファイルがうまくいかず苦戦したため備忘録を兼ねて内容をまとめた。
後々wordpressを入れたいので、nginxのドキュメントルートの変更の仕方もまとめる。

#サーバOS

```:/etc/lsd-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
```

#PHP7.2のインストール
PHP7.2とPHP-FPMをインストールする。PHP-FPMはnginxとPHPを連携させるために必要みたい。

```
# add-apt-repository ppa:ondrej/php
# apt-get update
# apt-get install php7.2 php7.2-fpm php7.2-mysql php7.2-mbstring php7.2-zip
```

#nginxのインストール
ubuntu1の初期リポジトリからでもインストールできるがバージョンが古くなってしまうらしい。

```
$ curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
$ VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo \"deb http://nginx.org/packages/ubuntu/ $VCNAME nginx\" >> /etc/apt/sources.list"
$ VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo \"deb-src http://nginx.org/packages/ubuntu/ $VCNAME nginx\" >> /etc/apt/sources.list"
$ sudo apt-get update
$ sudo apt-get install nginx
```

#nginxとPHP-FPMを自動起動するようにする
OSを起動した時に自動的にnginxとPHP-FPMを起動できるようにする。

```
# systemctl enable nginx.service
Synchronizing state of nginx.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable nginx
# systemctl enable php7.2-fpm.service
Synchronizing state of php7.2-fpm.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable php7.2-fpm
```

#nginxのドキュメントルートの変更とPHP-FPMの連携

##1.nginxの設定
nginxの設定ファイル(/etc/nginx/conf.d/default.conf)を変更することでドキュメントルートの変更とPHP-FPMの連携ができる(自分はdefault.confファイルが無かったため作成した)。

```nginx:/etc/nginx/conf.d/default.conf
server {

  location / {
    root /var/www/html;
    index index.html index.htm index.php;
  }

  location ~ \.php$ {
    root /var/www/html;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }

}
```

rootで任意のドキュメントルートに変更できる。ちなみにデフォルトのドキュメントルートは/usr/share/nginx/html
fastcgi_passはPHP-FPMのバージョンによって違うので注意。
また、/etc/nginx/nginx.confファイルの
include /etc/nginx/sites-enable/*;
の行をコメントアウトしないとうまく動かなかった。(sites-enableディレクトリの設定が上書きされるのかしら？)
最初は/etc/nginx/nginx.confファイルに直接default.confの内容を追記したが、設定の変更のしやすさ等の観点からdefault.confを作成した。
　
設定ファイルを変更したら、nginxを再起動して設定を反映させる。

```
nginx -s reload
```

##2.PHP-FPMの設定

設定ファイルのuser、grupのwww-dataをnginxに変更する。

```:/etc/php/7.2/fpm/pool.d/www.conf
user = nginx
group = nginx

listen.owner = nginx
listen.group = nginx
```

設定ファイルを変更したらPHP-FPMを再起動して設定を反映させる。

```
# systemctl restart php7.2-fpm.service
```

#環境が正しく構築されているか確認する
ドキュメントルートのディレクトリにindex.phpを作成し、以下を記入し、ブラウザでphpinfoが確認できたら成功！

```php
<?php
phpinfo()
```

以上

#参考サイト
[Ubuntu 16.04 インストール後、nginx + PHP7.2 環境を構築するまでの流れ](https://qiita.com/renny1398/items/a6aa309d05245f0aae60)
[CentOSにてnginxでPHPを動かす](https://qiita.com/utano320/items/36b6eac2bbd5bb5657f6)
[[備忘録]nginxのドキュメントルート](https://qiita.com/mitsuhiro_K/items/ec1bbb5bf035d39edf93)
Markdownの見出しに番号を入れてみる

# Markdownの見出しに番号を入れてみる

普段 Markdown を書くのに Visual Studio Code + Markdown Preview Enhanced を使ってとても捗ってます。

しかし、見出しに番号を自動挿入する方法がわからず、とりあえず次のように見出しに番号を振ってみました。

```sample0.md
# 1. HELLO
## 1.1. WORLD
# 2. FOO
## 2.1. BAR
```

短いドキュメントならこれでも良いと思う。

## CSS will help me

見出しは h1, h2 なので、style を書けばいけるはず！

```sample1.md
# PREFACE
#
## (NO TITLE)
##
# TITLE
## SUBTITLE
# A1. APPENDIX
## A1.1. omake-1
## A1.2. omake-2
# A2. APPENDIX

<style>
body {
    counter-reset: h1;
}
h1 {
    counter-reset: h2;
}
h1:before {
    counter-increment: h1;
    content: counter(h1) ". ";
}
h2:before {
    counter-increment: h2;
    content: counter(h1) "." counter(h2) ". ";
}
</style>
```

↓ (HTML にするとこんな感じになるはず; Chrome で確認; 4つめの ## が h1 になって 3. になるのは見なかった事にする)

```
1. PREFACE
2.
2.1. (NO TITLE)
3.
4. TITLE
4.1. SUBTITLE
5. A1. APPENDIX
5.1. A1.1. omake-1
5.2. A1.2. omake-2
6. A2. APPENDIX
```

これだと APPENDIX にも番号が振られてしまう。PREFACE も番号振りたくないかも。

しかも、1. とか 2. とかは before であるからか、マウスで選択(コピペ)できないっぽい。(Chrome で確認)

## JavaScript will help me

CSS の隣接セレクタを駆使してみたりしたけど、script 書くのが好きだなぁと自己納得しました。

```sample2.md
# PREFACE
# {#}.
## {#}. (NO TITLE)
## {#}.
# {#}. TITLE
## {#}. SUBTITLE

<hr class="md-reset-numbering">

# A{#}. APPENDIX
## A{#}. omake-1
## A{#}. omake-2
# A{#}. APPENDIX

<style>
hr.md-reset-numbering {
    display: none;
}
</style>
<script>
var h1Count = 0
var h2Count = 0
for (let hx of document.querySelectorAll('h1,h2,hr.md-reset-numbering')) {
    const f = {
        "h1": () => {
            if (hx.innerText.match(/{#}/)) {
                ++h1Count
                h2Count = 0
                hx.innerText = hx.innerText.replace(/{#}/, `${h1Count}`)
            }
        },
        "h2": () => {
            if (hx.innerText.match(/{#}/)) {
                ++h2Count
                hx.innerText = hx.innerText.replace(/{#}/, `${h1Count}.${h2Count}`)
            }
        },
        "hr": () => {
            h1Count = 0
        }
    }
    f[hx.tagName.toLowerCase()]()
}
</script>
```

↓ (HTML にするとこんな感じになるはず; Chrome で確認)

```
PREFACE
1.
1.1. (NO TITLE)
1.2.
2. TITLE
2.1. SUBTITLE
A1. APPENDIX
A1.1. omake-1
A1.2. omake-2
A2. APPENDIX
```

ただし、Visual Studio Code + Markdown Preview Enhanced の MPE Preview では script が実行されないので

```
PREFACE
{#}.
{#}. (NO TITLE)

{#}.

{#}. TITLE
{#}. SUBTITLE

A{#}. APPENDIX
A{#}. omake-1

A{#}. omake-2

A{#}. APPENDIX
```

のように見えてしまうのが残念です。

## まとめ

JavaScript パターンが良さそうに感じましたが、MPE Preview では script で振った番号が表示されないのでちょっと不安になります。

ある程度の規模のドキュメントになると、手で番号を振るのは肉体的にもつらいところです。

ある程度の規模のドキュメントは Word で書くのが良いのかも知れませんね。
SoXをWindows10で使い始めるまでの手順(メモ)

## SoXを使ってみたい
音声の認識や加工をターミナル上で出来るSoX(Sound eXchange)というものがあるらしい。
普段はWSL(Windows Subsystem for Linux)上でプログラムを書いているのでLinuxにインストールする手順を追っていったのだが...

**WSLでPCのマイクを使うことができない！！！**

という問題に直面した。使えるようにする方法もあるのだろうが少し調べてみても出てこないし、今回はSoXを試しに使ってみたいだけなのでWindowsのコマンドライン上で行うことにした。

しかしこのSoXというもの、実際に使えるようになるまでちょくちょく躓いたので自分用に手順をメモとして残しておく。

## 実行環境
Windows 10 Home 64bit

## SoXのインストール
まずこの[公式サイト](https://sourceforge.net/projects/sox/)に行く。
緑色のダウンロードボタンをクリックするとダウンロードが始まる。
ダウンロードが終わったらファイルを解凍する。何も考えず進んできていれば
`C:\Program Files (x86)\sox-14-4-2\sox.exe`
となっているはずなのでコマンドライン上でこの通りに実行する。
そうするとコマンドライン上で`sox`と打てばバージョンや使い方がバーッと出てくるのでこれでインストールは終了。

## 実際に使うには
このままSoXをコマンドライン上で使えれば良いのだがなかなかそうは行かない。

まず音声ファイルを保存するフォルダに移動し、次のようにパスを通す。
`path %PATH%;C:\Program Files (x86)\sox-14-4-2`
これでこのフォルダでは`sox`と打つだけでSoXが使えるようになる。

次に、出力・入力先デバイスをコマンドラインに教えてあげる必要がある。
今のまま`sox test.wav -d`といったコマンドを打つと次のエラーが出る。
`sox FAIL sox: Sorry, there is no default audio device configured`
つまり、soxを使いたいけど入出力デバイスが設定されてないから使えないといった意味。
この問題は
`set AUDIODRIVER=waveaudio`
と打てば解決する。デフォルトのデバイスを固定する必要があるということ。
この「waveaudio」は`sox -h`と打つと`AUDIO DEVICE DRIVERS: waveaudio`というように出てくるので確認してからsetする。
## 音声を録音・再生してみる
ここまできたらようやく音声の録音・再生ができる。
ちなみにLinuxだと
録音は`rec [録音ファイル名]`
再生は`play [再生ファイル名]`
で出来るのだがWindowsだと
録音は`sox -d [録音ファイル名]`
再生は`sox [再生ファイル名] -d`
となり少しわかりづらい。
これはsox-14-4-2内のsox.exeをコピーし、「rec.exe」と「play.exe」という名前でそれぞれ保存することでWindowsのコマンドライン上でもLinuxと同様に使えるようになる(検証済み)。
これで晴れてコマンドライン上から音声の録音・再生ができるようになった。

## まとめ
長々と書いてきましたがほとんど[こちらのサイト](https://p--q.blogspot.com/2015/03/soxsound-exchange1.html)の内容を転記したものです(このサイトの作成者様には感謝でいっぱいです)。
ただ、こちらのサイト上ではWindows7での解説だったので、Windows10でも同じように使えるよ、ということが伝えたかったわけです。
Qiita初心者なので何か規約に触れてたりしたら教えていただけると幸いです。
しかしこのSoXというもの、可能性が無限大過ぎて夢が広がります。
今後おもしろい使い方を思いつけばまた記事にしたいと思います。

## 参考にしたサイト
https://p--q.blogspot.com/2015/03/soxsound-exchange1.html
sshとsftpとIPv6

# いつも混乱
組み込み開発でIPv6LLを使うことが多いが、忘れそうなのでメモ。
間違っていたらすいません。
確認環境: macOS 10.13.6, OpenSSH_7.8p1

# ssh
## いけるやつ
- `ssh -p 22 user@example.com`
- `ssh -oPort=22 user@example.com`
- `ssh ssh://user@example.com:22`
- `ssh -p 22 user@2001:db8::1%eth0`
- `ssh -oPort=22 -oUser=user 2001:db8::1%eth0`

## いけないやつ
- `ssh user@example.com:22`
- `ssh -p 22 user@[2001:db8::1%eth0]`
- `ssh ssh://user@[2001:db8::1%eth0]:22`
- `ssh -p 22 ssh://user@2001:db8::1%eth0`
- `ssh -oPort=22 -oUser=user [2001:db8::1%eth0]`

# sftp
## いけるやつ
- `sftp -P 22 user@example.com`
- `sftp sftp://user@example.com:22`
- `sftp -P 22 user@[2001:db8::1%eth0]:.`
- `sftp -P 22 -oUser=user [2001:db8::1%eth0]`
- `sftp -oPort=22 -oUser=user [2001:db8::1%eth0]`

## いけないやつ
- `sftp user@example.com:22`
- `sftp user@[2001:db8::1%eth0]:22`
 - 22というディレクトリに移るという意味でならいける
- `sftp -P 22 user@2001:db8::1%eth0`
- `sftp -P 22 user@[2001:db8::1%eth0]`
- `sftp sftp://user@[2001:db8::1%eth0]:22`

# 宿題
- scp
- パス指定の`:`
z-indexの重なり順

z-indexは、ページに表示するコンテンツのZ軸方向の順序を決定できるので、何かとお世話になります。

z-indexを使用する際に頭に入れておいた方が良い事をまとめておきたいと思います。
ある案件で、z-indexへの考慮が足らなかった為、それへの対応に調べた内容になります。

#そもそもz-indexとは
 Z 軸方向の順序を設定します。
これにより、大きいz-indexの値を持つ要素は、自身より小さな値を持つ要素に重なります。（3次元的には上になります）

##プロパティ
設定できる値の内容は`auto` `数値`です。
マイナスも設定できます。
（https://developer.mozilla.org/ja/docs/Web/CSS/z-index）

#注意する事
**表示の順序が決まる過程** が大事だと思います。

##z-indexの指定がない場合はどうなる？
以下の順序で、Z軸方向に重なります。

> 1.ルート要素の背景と境界
> 2.位置指定なしのブロックの子孫、 HTML 内での出現順
> 3.位置指定要素、 HTML 内での出現順
>（引用元：https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Positioning/Understanding_z_index/Stacking_without_z-index）

記述の順番と、位置指定要素（`position: static`以外の`position`）で順番が決まります。

## z-indexの指定がある場合
z-indexの値と、前述の順序で決まります。

また、同じz-indexの値の場合は、前述の順序が密接にかかわります。
例えば下記の場合、「DIV class01」と「DIV class02」は、class02が上部になります。

```HTML
<div class="class01">
  DIV class01
</div>
<div class="class02">
  DIV class02
</div>
```
```CSS
div {
  padding: 10px;
  opacity: 0.7;
  text-align: center;
}
.class01 {
  z-index: 5;
  position: absolute;
  width: 150px;
  height: 350px;
  top: 10px;
  left: 10px;
  border: 1px dashed #900;
  background-color: #fdd;
}
.class02 {
  z-index: 5;
  position: absolute;
  width: 150px;
  height: 350px;
  top: 50px;
  left: 50px;
  border: 1px dashed #696;
  background-color: #cfc;
}
```

さらに、子要素にz-indexが設定してる場合、子要素間の順序と親要素間の順序が関わってくるため、整理しておかないと混乱の原因になるかと思います。
どのような順番になるのかを頭に入れておくことで、手戻りを無くせると思います。

#その他
調べていて分かったのですが、重ね合わせは、実はさらに多くの要素が関係します。
https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context#The_stacking_context


#参考
z-index：
https://developer.mozilla.org/ja/docs/Web/CSS/z-index
z-index の利用：
https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Positioning/Understanding_z_index/Adding_z-index
z-index なしの重ね合わせ：
https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Positioning/Understanding_z_index/Stacking_without_z-index
重ね合わせコンテキスト：
https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context