OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript : 配列とオブジェクトを再帰的に凍結する関数

JavaScriptでは、constで宣言しても配列やオブジェクトの要素は変更可能ですよね。
中味が変わらないといいなあと思ったことはありませんか?

中味も変更不可にした新しい配列、オブジェクトを返す関数deepFreezeを作ってみました。
元ネタは、 [こちら](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) の例にあるdeepFreeze。
再帰を今風に書くとこんなかな?というのと、使いやすいように新しいオブジェクトを返すようにしてみました。
対象は、配列、オブジェクトとプリミティブな値。関数もいけるかな? Map、Setはfreezeできないみたいです。

```js:
const mapForObj = f => a => 
  Object.keys(a).reduce( (acc, e)=>({ ...acc, [e]:f(a[e]) }), {})
const isObj = a => Object.prototype.toString.call(a)==="[object Object]"

const deepFreeze = a =>
  Array.isArray( a )?  Object.freeze( a.map( deepFreeze ) )
  : isObj( a )?  Object.freeze( mapForObj( deepFreeze )( a ) )
  : Object.freeze( a )

//使ってみる：
let func=x=>x

const obj = { a:1, b:[ { a:1 }, 2 ], c:func, d:{ x:[ 1, 2 ], y:2 } }

const frozen = deepFreeze(obj)
```

```js:
> frozen
=> { a: 1,
  b: [ { a: 1 }, 2 ],
  c: [Function: func],
  d: { x: [ 1, 2 ], y: 2 } }
> Object.isFrozen(frozen)
=> true
> Object.isFrozen(frozen.b)
=> true
> Object.isFrozen(frozen.b.a)
=> true
> Object.isFrozen(frozen.c)
=> true
> Object.isFrozen(frozen.d)
=> true
> Object.isFrozen(frozen.d.x)
=> true  // すべての階層で凍っている
> frozen.c=0  //関数frozen.cを変更してみるが...
=> 0
> frozen.c  
=> [Function: func] //変わらない。
> frozen.c(5)
=> 5      // x=>x 。変わらない
> frozen.c.a=0  //propertyを追加してみるが...
=> 0
> frozen.c.a
=> undefined  //追加できない
//ちなみにobjは凍っていない(当然ですが)：
> Object.isFrozen(obj)
=> false
> 
```
ちゃんと中味も凍っているようです。

[参照がループしてると無限ループに陥いる可能性とwindowとか凍らせて大変なことになる可能性があるそうな。](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) ご使用は自己責任で。

# 追記: 見た目をいじってみた。
JavaScriptは、オブジェクトの種類によってできることも方法も微妙に違っていたりするので、ちょっと複雑な感じになりましたが、やりたいことは単純です。

+ 深く凍結したものを返す関数は a を引数にとり、
+ a が配列かオブジェクトなら、aの要素を再帰的に深く凍結したものを新しく作り、それを破壊的操作で凍結して、それを返す。
+ そうでなければ、a を破壊的操作で凍結して、それを返す。

そう見えるようにコードにするとこんな感じでしょうか。

```js:
const pipe = (x, ...fs) => fs.reduce( (acc, f) => f(acc), x)

const isAryOrObj = a =>
  Array.isArray( a ) || Object.prototype.toString.call(a)==="[object Object]"
const map = f => a =>
  Array.isArray( a )? a.map( f )
  : Object.keys(a).reduce( (acc, e)=>({ ...acc, [e]:f(a[e]) }), {})
const freezeInPlace = a => Object.freeze( a )

const deepFreeze = a =>
  isAryOrObj( a )? 
    pipe( a, map(deepFreeze), freezeInPlace )
  : pipe( a, freezeInPlace )
```
関数の分割のしかたを変えて、それっぽい名前を付けてみました。同じように動きます。
パイプライン風またはメソッドチェーン風です。
前置きが長いですが、deepFreeze本体はかなりすっきりした感じです。
リモートリポジトリにgit pushしてもフォルダの中身がアップロードされない場合の対処法

#エラーが起きた状況
あるリモートリポジトリ（フォルダ名を'system'とする）をフォークして、ローカルにクローンした。
systemの中にディレクトリsystem/webappを作成し、そこでアプリケーションの開発作業を行なっていた。    

これが全ての元凶なのだが、system/webapp内でgitを作成してしまう。
作業終了後、リモートリポジトリにpushするが、当然うまく行かない・・・

```
cd system/webapp
git init
git add -A
git commit -m "..."
git push

To https://github.com/user/system
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/user/system'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

クローンしたフォルダごとローカルリポジトリを作成し、pushする必要があることに気づき、下記のように対応した。

```
cd system
git add -A

warning: adding embedded git repository: /webapp
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint: 
hint: 	git submodule add <url> /webapp
hint: 
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint: 
hint: 	git rm --cached /webapp
hint: 
hint: See "git help submodule" for more information.
```

addしたら警告が表示されたが・・・push!

```
git commit -m "..."
git push
```

リモートリポジトリを確認すると、webappフォルダはアップロードされているが、フォルダ以下のファイルが無い・・・
さて、どうしよう。

#解決策
下記サイトを参考にして対処しました。行なったことは次の２点。  
##1.system/webapp内のローカルリポジトリを削除し、pushする

```
rm -rf webapp/.git
git add webapp/*

fatal: Pathspec 'webapp/hoge' is in submodule 'webapp'
```

webappがサブモジュールとして登録されてしまっており、webapp/.gitを削除しても、webapp以下のファイルをアップロードできないようだ。   

##2.webappディレクトリをgitの管理対象から一度削除する
```
git rm --cached webapp
git add -A
git commit -m "..."
git push
```
webapp以下のファイルがついにローカルリポジトリ、リモートリポジトリに反映され、無事解決！

#参考
[Githubでディレクトリの中身がアップロードされない｜teratail](https://teratail.com/questions/128129)
Spresenseの100ピンBtoBコネクタを拡張するボード

#Spresenseとは
[Spresense](https://www.sony-semicon.co.jp/products_ja/spresense/)はソニーセミコンダクタソリューションズ株式会社が発売した高性能コンピュータが入った小型ボードです。ハードウェア詳細は[Spresenseについて](https://developer.sony.com/ja/develop/spresense/developer-tools/introduction)を参照してください。[Sony Neural Network Console](https://dl.sony.com/ja/)の学習済みモデルを動かすことができるなど、できることの幅の広いボードです。

#SpresenseのBtoBコネクタとは
Spresenseには[拡張ボード](https://developer.sony.com/ja/develop/spresense/specifications)に接続するためのBtoBコネクタが実装されています。
![IMG_20190310_150154.png](https://qiita-image-store.s3.amazonaws.com/0/354086/21f03957-a42e-e9df-7f5e-62e0e4e8b1a8.png)
拡張用基板と同じDF40HC(3.0)-100DS-0.4Vを用いることにより、Spresenseの全I/Fの直接アクセスできます。
![spresenseB2B.png](https://qiita-image-store.s3.amazonaws.com/0/354086/9f7ae764-20eb-d76f-32e8-f12324a59113.png)
[Spresense拡張ボード図](https://github.com/sonydevworld/spresense-hw-design-files/blob/master/CXD5602PWBEXT1/schematics/CXD5602PWBEXT1_schematics.pdf)から抜粋

#作成した拡張用ボード
出来上がり品にSpresenseを接続した状態が下記。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354086/b937414b-0ae0-efc7-16de-94eacd6076a1.png)

下記にKICADで作ったガーバーデータをアップしておきました。
https://github.com/MypaceEngine/Spresense_B2B_Board

#動作確認
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Spresenseの100ピンBtoBコネクタをDIP化するボードのLチカ(LCDチカ)成功! <a href="https://twitter.com/hashtag/L%E3%83%81%E3%82%AB?src=hash&amp;ref_src=twsrc%5Etfw">#Lチカ</a> <a href="https://twitter.com/hashtag/spresense?src=hash&amp;ref_src=twsrc%5Etfw">#spresense</a> <a href="https://t.co/Zqz7XI2Onk">pic.twitter.com/Zqz7XI2Onk</a></p>&mdash; 覚醒しつつあるMypaceEngine (@MypaceEngine) <a href="https://twitter.com/MypaceEngine/status/1104582203642544128?ref_src=twsrc%5Etfw">2019年3月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
TextInputLayout - password visibility toggleのデザイン変更

# :lock: はじめに

Androidのマテリアルデザインに沿った入力フィールドを作成するのに、Android Design Support Libraryの `TextInputLayout` を使うことが多いかと思います。これにはパスワードの表示/非表示を切り替える機能( **password visibility toggle** )が備わっているのですが、デザインを変更する際に少しハマったのでメモします。

# :lock: 実装

## 変更箇所

パスワードの表示/非表示を切り替えるボタン( **password visibility toggle button** )のアイコンと色をそれぞれ切り替えます。

## 失敗例

```xml:ic_password_toggle.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="false">
        <bitmap android:src="@drawable/ic_lock" android:tint="#9e9e9e" />
    </item>
    <item android:state_checked="true">
        <bitmap android:src="@drawable/ic_lock_open" android:tint="@color/colorAccent" />
    </item>
</selector>
```

```xml:activity_main.xml
<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:hintAnimationEnabled="true"
    app:hintEnabled="true"
    app:passwordToggleDrawable="@drawable/ic_password_toggle"
    app:passwordToggleEnabled="true">

    <android.support.design.widget.TextInputEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint_password"
        android:inputType="textPassword" />

</android.support.design.widget.TextInputLayout>
```

パッと見これで問題なさそうですが、 `passwordToggleTint` を指定していないので、デフォルトで塗りつぶされてしまい、色が切り替わりません。

## 成功例

```xml:ic_password_toggle.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_lock" android:state_checked="false" />
    <item android:drawable="@drawable/ic_lock_open" android:state_checked="true" />
</selector>
```

```xml:tint_password_toggle.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#9e9e9e" android:state_checked="false" />
    <item android:color="@color/colorAccent" android:state_checked="true" />
</selector>
```

```xml:activity_main.xml
<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:hintAnimationEnabled="true"
    app:hintEnabled="true"
    app:passwordToggleDrawable="@drawable/ic_password_toggle"
    app:passwordToggleEnabled="true"
    app:passwordToggleTint="@color/tint_password_toggle">

    <android.support.design.widget.TextInputEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint_password"
        android:inputType="textPassword" />

</android.support.design.widget.TextInputLayout>
```

`passwordToggleDrawable` と `passwordToggleTint` に分けてそれぞれ設定するのがミソです。

![screen.gif](https://qiita-image-store.s3.amazonaws.com/0/302356/eebac0a7-f043-9267-3b61-ea356efaa972.gif)

# :lock: まとめ

公式のリファレンスはちゃんとに読みましょう(戒め)。一応 [GitHub](https://github.com/toranoko0518/demo-password) にサンプルをアップしておきます。

# :lock: 参考文献

* Android Developers: https://developer.android.com/reference/android/support/design/widget/TextInputLayout
Macで両面に小冊子/中綴じ印刷をする方法 (追加ソフト不要)

A4のPDFファイル2ページを、A3の紙1ページに印刷して折ることで、簡単な冊子を作る際などに便利です。
Mac標準の印刷ダイアログを使用するため、追加ソフトは必要ありません。
:warning: プリンターが両面印刷に対応している必要があります。

# 方法
1. 印刷画面を表示（Chrome を使用する場合：`システムダイアログを使用して印刷` をクリック）
2. `レイアウト` を選択（表示されない場合は左下の `詳細を表示` をクリック）
 
<img width="741" src="https://qiita-image-store.s3.amazonaws.com/0/155587/e50c192a-0f10-4dfb-dc90-2b7e355c197d.png">
3.  `両面` → `ブックレット` を選択
<img width="427" alt="SS_2019-03-10_14_49_14.png" src="https://qiita-image-store.s3.amazonaws.com/0/155587/44eb67b6-8dd6-8f68-42ce-75248edf074f.png">
4. 印刷 :tada:
Qiita API を Restlet Client で 叩いて 情報を取得する

[Qiita API](https://qiita.com/api/v2/docs) を [Restlet Client](https://restlet.com/) を使ってAPIを叩いて情報取得を試してみたメモです。

# Restlet Client 画面
<img width="1251" alt="スクリーンショット 2019-03-10 14.04.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/72419e20-b5a3-e195-f648-298243455d83.png">

# Qiita API Schema の取得
Qiita API の API スキーマの一覧を取得してみます。
メソッドはGET、リクエストには https://qiita.com/api/v2/schema?locale=ja
を指定して　Sendボタンを押下します。
結果はレスポンスのBodyに返って来ます。
<img width="1257" alt="スクリーンショット 2019-03-10 14.09.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/66ada408-e02b-bd81-0a73-9f9ed18eea77.png">

# Qiita API GET
リクエストの発行には、[アクセストークン](https://qiita.com/api/v2/docs#%E8%AA%8D%E8%A8%BC%E8%AA%8D%E5%8F%AF)を使っても良いのですが、GETリクエストだけなら[利用制限](https://qiita.com/api/v2/docs#%E5%88%A9%E7%94%A8%E5%88%B6%E9%99%90)はありますが、URLにリクエストにパラメータを付与するだけで試すことができます。
以下、いくつか試してみました。

## [GET /api/v2/tags/:tag_id/items](https://qiita.com/api/v2/docs#get-apiv2tagstag_iditems)
指定されたタグが付けられた記事一覧を、タグを付けた日時の降順で返します。

例："kintone"がタグ付けされた記事の一覧を取得します。
GET https://qiita.com/api/v2/tags/kintone/items

## [GET /api/v2/users/:user_id](https://qiita.com/api/v2/docs#get-apiv2usersuser_id)
指定したユーザの情報を取得します。

例：ユーザID：sy250fのユーザ情報を取得します。
GET https://qiita.com/api/v2/users/sy250f

## [GET /api/v2/users/:user_id/items](https://qiita.com/api/v2/docs#get-apiv2usersuser_iditems)
指定されたユーザの記事一覧を、作成日時の降順で返します。

例：ユーザID：sy250fの記事一覧を取得します。
GET https://qiita.com/api/v2/users/sy250f/items

# まとめ
Qiita API で 自分の記事を自動で集計したいと思って試してみましたが、少しつまづいたので記事にしてみました。
自分のこうしたいと思うことと、Qiita API の目次があってなかったので、整理が出来て良かったです。

# 参考リンク
下記リンクを参考にさせて頂きました。ありがとうございます。

- https://qiita.com/riekure
Swift MediaPlayer ミュージックAlbum一覧取得

# 概要
ミュージックのAlbum一覧取得。
Apple Musicで追加したAlbumも対象にしたい。
# ソース
## example
曲数5曲より大きいAlbumを表示。

```swift
import UIKit
import MediaPlayer
 
class ViewController: UIViewController {
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        let mPMediaQuery = MPMediaQuery.albums()
        if let collections = mPMediaQuery.collections {
            print(collections.count)
            for collection in collections {
                if collection.count > 5 {
                    print("\(collection.items[0].albumTitle!) : \(collection.count)")
                }
            }
        }
    }
 
}
```

## 注意
Info.plistに「Privacy – Media Library Usage Description」追加が必要。
追加しない場合、実行時エラーになります。
「[access] This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSAppleMusicUsageDescription key with a string value explaining to the user how the app uses this data.」
CentOS 7 installer で dracut initqueue timeout が出る

## 症状

iso イメージを, Windows 10 Rufus で USB に焼き込んで起動させたところ, boot 時に dracut initqueue timeout warning が出てしまう.

`/dev/root` が見つからないエラーが表示される.

## 原因

https://www.techbrown.com/fix-installation-failed-boot-dev-root-not-exist-centos-7/

USB writer ツールあたりに問題がある模様.

Rufus v1.2.0.183 ではうまくいきませんでした.
Rufus v3.4 + dd モードでうまくいきました(Rufus 最新なら ISO モードでもいけるかも?)
Windows Formでの高DPI対応でハマったところ

## マニフェストファイルの設定

基本的には下記ページの通りに設定すれば、文字がボヤける現象をほぼ自動的に回避できるはずです。
[Windows フォーム アプリの DPI Aware への変更](https://code.msdn.microsoft.com/windows-dpi-aware-e758cbbb)

自分のプロジェクトでは、単体の実行ファイルのみで動作させたときに適用されませんでした。
(マニフェストファイルが同一ディレクトリにある場合はそのファイルが読み込まれて回避設定が適用されます)

## .csprojの設定 
そこで、csprojのGenerateManifestsを次のようにfalseに変更しました。
これで単体でも回避できるようになりました。
プロジェクト設定画面のどこかに設定項目があるのかもしれないのですが、見当たりませんでした…。

```xml:project.csproj
  <PropertyGroup>
    <GenerateManifests>false</GenerateManifests>
  </PropertyGroup>
```
Gmail API「Users.messages:list」と「Users.history:list」の違い

[@koshi_life](https://twitter.com/koshi_life) です。

Gmail APIを使って、一定期間の過去メールを取得する機会があり、
最初、[messages:list](https://developers.google.com/gmail/api/v1/reference/users/messages/list) API と[history:list](https://developers.google.com/gmail/api/v1/reference/users/history/list) API の違いがわからなかったので、調べた内容を備忘します。

## TL;DR / 比較表

|API|[messages:list](https://developers.google.com/gmail/api/v1/reference/users/messages/list)|[history:list](https://developers.google.com/gmail/api/v1/reference/users/history/list)|
|:----|:---|:---|
|公式Doc説明|>Lists the messages in the user's mailbox.|>Lists the history of all changes to the given mailbox. History results are returned in chronological order (increasing historyId).|
|意訳および使い方|メールボックスに対し検索した結果をメールID/スレッドID一覧を返却するAPI。<br>検索は`q`パラムに[Gmail QueryFormat](https://support.google.com/mail/answer/7190?hl=ja)のフォーマットで指定可能。|メールボックスに対する状態ID `historyId` を指定し、それ以降の変更されたイベントを取得するAPI。<br>イベント種別`historyTypes`は４種`labelAdded`,`labelRemoved`,`messageAdded`,`messageDeleted`。|
|備考||ユーザの現在の historyId は [getProfile](https://developers.google.com/gmail/api/v1/reference/users/getProfile) API で把握可能。[参考]( https://stackoverflow.com/questions/26267357/getting-a-users-mailbox-current-history-id)<br>変更情報を取得する[Push Notifications](https://developers.google.com/gmail/api/guides/push) で受け取れるのはこのhistoryIdが連携されます。[参考](https://qiita.com/asamas/items/c0cc2c44a80a52c788be)|

## サンプルレスポンス

Google API Documentの右側の「Try this API」で
試したサンプルレスポンスを参考までに貼っておきます。

### messages:list

```messages-list.json
{
 "messages": [
  {
   "id": "xxx1",
   "threadId": "xxx1"
  },
  {
   "id": "xxx2",
   "threadId": "xxx2"
  }
 ],
 "nextPageToken": "xxx",
 "resultSizeEstimate": 11
}
```

### history:list

```history-list.json
{ "history": [
  {
   "id": "xxx455",
   "messages": [
    {
     "id": "xxx1",
     "threadId": "xxx1"
    }
   ],
   "messagesAdded": [
    {
     "message": {
      "id": "xxx1",
      "threadId": "xxx1",
      "labelIds": [
       "UNREAD",
       "CATEGORY_UPDATES",
       "INBOX"
      ]
     }
    }
   ]
  },
  {
   "id": "xxx600",
   "messages": [
    {
     "id": "xxx2",
     "threadId": "xxx2"
    }
   ],
   "messagesAdded": [
    {
     "message": {
      "id": "xxx2",
      "threadId": "xxx2",
      "labelIds": [
       "UNREAD",
       "IMPORTANT",
       "CATEGORY_UPDATES",
       "INBOX"
      ]
     }
    }
   ]
  }
 ],
 "nextPageToken": "xxx",
 "historyId": "xxx"
}
```

簡単ですが以上です。
Amazon SageMakerのチュートリアルを触ってみた

# はじめに
Amazon SageMakerを触ってみようと思い、AWSのチュートリアルを触ってみた。
そのときに詰まったポイントなどを簡単にまとめています。

# チュートリアル
チュートリアルはこちら。
https://aws.amazon.com/jp/getting-started/tutorials/build-train-deploy-machine-learning-model-sagemaker/#
コードをコピペするだけなので、よく分からないうちにものが完成します。笑
10分程度で終わりますし、とりあえず雰囲気は掴めますが、詳細はあまり期待しない方で良さそうです。

# 詰まったポイント①　リージョン
チュートリアルの3c.に書かれている以下のプログラム、
「東京」リージョンで実行するとエラーになりました。
リージョンを「オレゴン」に変えて実施したところ、エラーになりませんでした。
なんでだろう？

```
# import libraries
import boto3, re, sys, math, json, os, sagemaker, urllib.request
from sagemaker import get_execution_role
import numpy as np                                
import pandas as pd                               
import matplotlib.pyplot as plt                   
from IPython.display import Image                 
from IPython.display import display               
from time import gmtime, strftime                 
from sagemaker.predictor import csv_serializer   

# Define IAM role
role = get_execution_role()
prefix = 'sagemaker/DEMO-xgboost-dm'
containers = {'us-west-2': '433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest',
              'us-east-1': '811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest',
              'us-east-2': '825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest',
              'eu-west-1': '685385470294.dkr.ecr.eu-west-1.amazonaws.com/xgboost:latest'} # each region has its XGBoost container
my_region = boto3.session.Session().region_name # set the region of the instance
print("Success - the MySageMakerInstance is in the " + my_region + " region. You will use the " + containers[my_region] + " container for your SageMaker endpoint.")
```


#詰まったポイント②　バケット名

3d.に書かれているコード。

```
bucket_name = 'your_s3_bucket_name' # <--- change this variable to a unique name for your bucket
```

上記のバケット名を修正する必要があったので、

```
bucket_name = 'SageMakerXXXX' # <--- change this variable to a unique name for your bucket
```

としたら、エラーになりました↓

```
S3 error:  An error occurred (InvalidBucketName) when calling the CreateBucket operation: The specified bucket is not valid.
```

原因は、S3バケットの命名規則。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/BucketRestrictions.html

- 大文字またはアンダースコアをバケット名に含めることはできません。
- 2018 年 3 月 1 日、世界中のすべての AWS リージョンで使用されている命名規則と一致するように、米国東部（バージニア北部） リージョンの S3 バケットの命名規則を更新しました。現在 Amazon S3 では、大文字やアンダースコアを含むバケット名の作成がサポートされていません。

バケット名を `SageMakerXXXX` → `sagemakerXXX` に修正したところ、
`S3 bucket created successfully` となりました。
Rubyでインターフェースクラスを実現する

## はじめに

[こちらの記事](https://qiita.com/developer-kikikaikai/items/ddb674df4d1c24ebce8f)でRubyのインターフェースクラスについて触れていたところ、@yuukive さんよりアドバイスいただいたので記事化。
ありがとうございます！

## インターフェースクラスを実現する

### 定義
例えば`encode`というメソッドを持つインターフェースクラス`EncoderIF`を実現したいとします。
ここで使えるのが[NotImplementedError](https://docs.ruby-lang.org/ja/latest/class/NotImplementedError.html)というクラス。こんな感じで定義してあげます。

```ruby:EncoderIF.rb
class EncoderIF
  def encode
    raise NotImplementedError.new("#{self.class}##{__method__} が実装されていません")
    #FFmpeg等、エンコーダーに合わせた処理を実装する。
  end
end
```

### 継承先の実装

後は普通に継承してメソッドを実装すればOKです。ここで、うっかりencodeの実装を忘れたりすると、

```ruby:EncoderIFFailed.rb
$LOAD_PATH.push("./")
require 'EncoderIF'
class EncoderIFFailed < EncoderIF
end
```

実行時にエラーを返してくれます。

```console:
$ ruby Main.rb
Traceback (most recent call last):
        1: from Main.rb:5:in `<main>'
/home/XXX/EncoderIF.rb:3:in `encode': EncoderIFFailed#encode が実装されていません (NotImplementedError)
```

もちろんencodeメソッドを実装すれば正しく動作するようになります。

```ruby:EncoderIFSuccess.rb
$LOAD_PATH.push("./")
require 'EncoderIF'
class EncoderIFSuccess < EncoderIF
  def encode()
    puts("実装しました")
  end
end
```


```console:
$ ruby Main.rb
実装しました
```

### 更にもういっちょ

@tommy_aka_jps さんよりいただいたコメントの反映です。
Rubyの継承だと多重継承が厳しいので、moduleのincludeで代用する方法の提案です。

```ruby:EncoderIF.rb
# module
module EncoderIF
  def encode
    raise NotImplementedError.new("#{self.class}##{__method__} が実装されていません")
  end
end

# class
class EncoderIFSuccess
  include EncoderIF

  def encode
    p '実装しますた'
  end
end

# main
EncoderIFSuccess.new.encode
```

多重継承がOKならインターフェースの切りやすさがますのがいいですね！

## 最後に
インターフェースクラスっていいよね！
ECS service discovery によって作られた Route53 zone を削除する



```
aws --profile project-pacify --region ap-northeast-1 servicediscovery list-namespaces
{
    "Services": [
        {
            "Id": "srv-szht3ggfxhxgu2if",
            "Arn": "arn:aws:servicediscovery:ap-northeast-1:845095852924:service/srv-szht3ggfxhxgu2if",
            "Name": "pacify-service"
        }
    ]
}

aws --profile project-pacify --region ap-northeast-1 servicediscovery delete-service --id=srv-szht3ggfxhxgu2if


aws --profile project-pacify --region ap-northeast-1 servicediscovery list-namespaces
{
    "Namespaces": [
        {
            "Id": "ns-t3u6vsx72jozucai",
            "Arn": "arn:aws:servicediscovery:ap-northeast-1:845095852924:namespace/ns-t3u6vsx72jozucai",
            "Name": "local",
            "Type": "DNS_PRIVATE"
        }
    ]
}
aws --profile project-pacify --region ap-northeast-1 servicediscovery delete-namespace --id=ns-t3u6vsx72jozucai
{
    "OperationId": "pckrnx3xdd5jziyqvanrx6ll3uud3gwa-jt2ga4j5"
}
```

参考
-----
- https://kawabatas.hatenablog.com/entry/2019/03/04/115548
- https://linuxacademy.com/community/posts/show/topic/27703-delete-route53-zone-created-by-ecs-service-discovery
powershell起動時に読み込む設定


こちらの内容そのままですが、何度も見返すことになりそうなので。
http://yaimairi.hateblo.jp/entry/2016/09/09/225733


- powershellを[管理者として実行]で起動する
- notepad $PROFILE.AllUsersAllHosts　を実行する
- 新しく作成しますか？と聞かれるのではいを選ぶ
- 以下を書いて保存する（これは自分用に作っていきたい）

```
Set-PSReadlineOption -BellStyle None
Set-Alias tf terraform
Set-Alias dc docker-compose
```
- 設定した内容    
 powershellでBSキー押したときBeep音がならないようにする    
 長いコマンドのエイリアスを設定する（terraform -> tf）
使用回数制限があるAPIを無料枠でなんとかしのいだ話

# はじめに
以前、[LCNEM](https://lcnem.cc/)で、日本円、ドルレートで仮想通貨の価格を表示したいという要件がありましたので、その時の開発過程をご説明します

# 要件
* 日本円、ドルレートで、仮想通貨の価格を表示したい
* [仮想通貨の価格のAPI](https://coinmarketcap.com/api/documentation/v1/#operation/getV1CryptocurrencyListingsLatest) には、一日の単位の使用回数制限あり


# 解決方法
**定期実行によって叩くAPIの回数を制限すればいい**ということになりましたので、

* 定期実行
* frontからそれを取得するためのAPIを作る

ということになりました。

# 実装方法
* 定期実行: [GoogleAppEngine Cloud Schedular](https://www.google.com/search?q=google+scheduler&oq=google+schedula&aqs=chrome.1.69i57j0l2j69i64l3.4481j0j7&sourceid=chrome&ie=UTF-8)
* 発火API: [Firebase Cloud Functions](https://cloud.google.com/functions/docs/?hl=ja)
* DB: [Firebase Cloud Firestore](https://firebase.google.com/docs/firestore/?hl=ja)

# CloudSchedular
##使ってみた感想
とにかく定期実行の設定がGUIでできて、とても簡単でした。所感、設定時間は1min30secくらいでした。

## 設定例
<img width="505" alt="スクリーンショット 2019-03-10 13.28.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/220683/33e17b71-69c5-07b8-526c-0e3cb286f315.png">

# Cloud Functions
## 使ってみた感想
基本的にjsを知っていれば、cloud functionsはすぐに書けるので、ここも難なくかなと思います。
（ただ、私自身開発した時はasync awaitの使い方もままならなかったので、少し苦労しました。)

# Cloud FireStore
## 使ってみた感想
NoSQLなので、少し覚えることはありますが、NoSQLの中でもRDSに寄せてる部類の方なので比較的使い慣れやすかったです。また、GUIで設定できるのも良かったです。

## Rulesの実装

```
match /rates/rate {
      allow read;
    }
```
<img width="753" alt="スクリーンショット 2019-03-10 13.36.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/220683/821da112-4a8b-bfcb-ca53-de7fa7a82d9b.png">

## DataTypeの実装
```
rates/ {
        BTC: number
        USD: number
        JPY: number
        ETH: number
        XEM:numbr

```
<img width="783" alt="スクリーンショット 2019-03-10 13.36.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/220683/59753518-d7be-aabf-e982-778a668d28c6.png">
デバッグについて自分なりに整理してみた

## はじめに

最近、デバッグに向き合うことが多いです。課題に取り組むたび、どのようにすればスムーズに原因特定できるのか、トライアンドエラーを続けています。

ここでは、今までの経験を踏まえて、デバッグするときに心がけたいことを言語化しておこうと思い、内容をまとめてみました。

## そもそもデバッグとは

[デバッグとは - IT用語辞典 e-Words](http://e-words.jp/w/%E3%83%87%E3%83%90%E3%83%83%E3%82%B0.html) から引用します。

> デバッグとは、コンピュータプログラムに潜む欠陥を探し出して取り除くこと。
>
> プログラムが仕様や開発者の意図に照らして誤った動作をする際に、そのような動作を引き起こすプログラム上の欠陥、誤りをバグ（bug：虫）という。
>
> テストなどによって発見された誤作動・不具合について、その原因やプログラム上での位置を探索・特定し、意図したとおり動作するように修正する作業のことをデバッグという。

なんとなくプログラム上の不具合を探し出す作業という認識でしたが、不具合を探し出して修正するまでをデバッグと言うようです。

## デバッグを始めるタイミング

思いつく限り列挙してみました。大まかに言うと、プログラムが想定通りに動かないという状況に直面したときが、デバッグを始めるタイミングと言えるのでは無いでしょうか。

* 開発中、プログラム想定通りに動作しない
* プログラムを利用するユーザーから、想定通りに動作していないと連絡を受ける
* 自分自身で、プログラムが想定どおりに動作していないことを発見する

## デバッグの手順

以下、プログラムが想定どおりに動かない不具合 = バグ という用語を使います。

### バグによる問題発生を再現する

まず、他の人から連絡を受けたり、自分で発見したバグによる問題が、どんな入力値、どんなデータのインプットで発生するかを再現します。

バグによる問題発生を再現する中で、バグの原因特定のための最低限の情報を収集します。

### バグの位置を特定する

問題発生の再現ができたら、プログラムのどの部分でバグが発生しているかを特定します。

#### 二分探索法で探す範囲を絞り込む

どこにバグがあるか全くわからない状態からバグの位置を特定するための方法として、二分探索を利用するのが常套手段です。

[二分探索とは - IT用語辞典 e-Words](http://e-words.jp/w/%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2.html)

> 二分探索とは、データ検索アルゴリズムの一つで、ソート（整列）済みのデータ群の探索範囲を半分に絞り込むを操作を繰り返すことで高速に探索を行う手法。

単純に最初から処理を追って探すという方法よりも、高速に原因にたどり着くことができます。

#### プログラムの処理を見える化する

二分探索でバグの位置を特定するにあたり、重要になるのがプログラムの処理を見える化することです。

プログラムの処理を見える化できないと、当てずっぽうでバグを探す方法しか取れなくなります。

例えばお医者さんが患者さんの腫瘍の位置を特定するとき、当てずっぽうでメスを入れるということはしないでしょう。その前にレントゲンや MRI といった、腫瘍の位置を見える化する装置を使うと思います。

それと同じように、プログラムの処理を見える化することで、バグの位置を特定しやすくなります。
具体的には、以下の手段が有効です。

##### print デバッグを使う

JavaScript でいうと `console.log` といった、標準出力にログを出力できるようなメソッドを、怪しい処理の前後に置いてみるのはいい方法です。

ログ出力が難しい場合は、これも JavaScript の例ですが `document.getElementById('#test').innerHTML = 'xxx'` といった処理を使い、画面上に表示させるのもいいかもしれません。

##### デバッガーを使う

デバッガーを使うのも有効です。

プログラムにブレークポイントをおいて、その時点から処理をステップ実行したり、その時点での変数の状態を確認するのも、手がかりを掴むのに役立つと思います。

### バグの原因を特定する

バグの位置を特定できたら、その次はなぜバグが発生するのか、原因を特定します。ここでは今まで得た情報を踏まえ、仮説と検証を繰り返して原因を探ります。

原因特定のプロセスは状況によって違うと思うので、以下では個人的に役立ったと思うアクションを書いておきます。

#### 正常に動作する似た環境と比較して仮説立案の参考にする

検証するために必要な仮説を考える際に、正常に動作する類似の環境を準備し、それと比較するという方法が有効だなと思っています。

処理中のデータが見える化できるようになっても、それが問題の原因につながっているかどうか判断するのが難しい場合があります。

その時は、正常に動作する類似の環境を準備し、その処理と比較して原因特定の仮説を考える参考にしてみましょう。

#### 愚直に仮説と検証を繰り返して事実となる情報を集める

仮説と検証を繰り返しても、なかなか原因が見つからないこともあります。しかし原因特定のための情報は仮説と検証を繰り返すことで徐々に集まってきます。

ときには当てずっぽうな仮説で検証することがあっても、得た事実は次の仮説を考える上での貴重な材料になるので、整理しておくといいかもしれません。

#### 他の人に調査状況を話す

原因特定のための調査を繰り返していると、「あれ、今自分は何を調査していたんだっけ？」と露頭に迷うこともあるかもしれません。

そんなときは、他の人に調査の状況を口頭で話してみるのも有効です。他人に状況を話す中で、そもそも何を調査していたのかを再確認できますし、仮説検証で得た情報を整理することもできます。また、見落としていたポイントに気づくかもしれません。

### バグを修正する

バグの原因を特定できれば、あとは原因を解消できるような修正をいれ、問題なく動作することぉを確認します。

## おわりに

現時点でデバッグについて考えていたことを言語化してみました。今後もデバッグ経験を積むにつれ、考え方や手段をアップデートできたらなと思います。

他にも良いアイデアや方法あれば教えて下さい！

## 参考

* [デバッグ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%90%E3%83%83%E3%82%B0)
12 Factor App (Twelve-Factor App) ～SaaS開発の方法論～

**The Twelve-Factor Appとは**
Herokuのエンジニアが書いたアプリ開発の方法論。
この方法論はどのようなプログラムでも適用でき、バックエンドサービスの形態も選ばない。
そのため、サービスを開発しているすべてのエンジニアが読んでおくでき内容である。

[The Twelve-Factor App](https://12factor.net/)[（日本語訳）](https://12factor.net/ja/)

#I. コードベース
>コードベースとアプリケーションの間には、常に1対1の関係がある。

複数コードベースによって構成されるアプリは分散システムである。
同じコードを複数アプリで共有する場合は、ライブラリ化して組み込む。

>アプリケーションごとにただ1つのコードベースが存在するが、アプリケーションのデプロイは複数存在する。

開発環境、ステージング、本番で異なるバージョンがデプロイされることがあるがコードベースは同一であるということ。

![12app_1.png](https://qiita-image-store.s3.amazonaws.com/0/31363/a2a3845d-8db1-f4ed-d0c3-62a3e16a3070.png)


#II. 依存関係
>システム全体にインストールされるパッケージが暗黙的に存在することに決して依存しない。

依存関係は依存関係宣言マニュフェストで宣言すること。
Javaであればpom.xmlで定義し、MavenやGradleを使用することで暗黙的な依存関係を作らないようにする。

#III. 設定
>アプリケーションの 設定 は、デプロイ（ステージング、本番、開発環境など）の間で異なり得る唯一のものである。

・データベース、バックエンドサービス
・外部サービスの認証情報
・デプロイ毎の設定値

設定値が正しく分離できているかは、コードベースをオープンソースにすることができるか。オープンソースにできない場合、コードベースに認証情報や機密情報が書かれていると思われる。

>設定を 環境変数 に格納する。 

環境変数はコードを変更しなくてもデプロイ毎に簡単に変更でき、言語やOSに依存しない。

#IV. バックエンドサービス
>ローカルサービスとサードパーティサービスを区別しない。

バックエンドサービスへのアクセスは設定に格納されたURLを利用することでコードベースに変更なく切り替えることができるようにしておく。

![12app_2.png](https://qiita-image-store.s3.amazonaws.com/0/31363/182384cc-d1d5-feb6-a2d7-12a2242bb0ba.png)


#V. ビルド、リリース、実行
>ビルド、リリース、実行の3つのステージを厳密に分離する。

・ビルド：コードを実行可能な物に変えること
・リリース：ビルドでできたものと設定を統合し、実行環境で実行することができる状態
・実行：アプリケーションを実行環境で実行する

![12app_3.png](https://qiita-image-store.s3.amazonaws.com/0/31363/5c479eea-ba23-71bf-6014-567be80a6aa8.png)


#VI. プロセス
>プロセスはステートレスかつシェアードナッシング
永続化するデータはデータベースに保存すること。
メモリやディスクにキャッシュさせたものはプロセスの再起動時に消えてしまい、不整合を生み出す

ステータスをファイルやインスタンスに持たせるとスケールアウト/スケールイン/再起動のときに不整合が発生する可能性があるので持たせるのであればDBにしましょうということ。
※スティッキーセッションは使用してはダメ

#VII. ポートバインディング
>ポートにバインドすることでHTTPをサービスとして公開し、 そのポートにリクエストが来るのを待つ。

ローカル環境では`http://localhost:5000/`のようなURLにアクセスするしていたものを、本番環境ではリクエストが来たらルーティングして他のポートにバインドされているアプリケーションに振り分ける？
あまり理解できていないところです。

#VIII. 並行性
![12app_4.png](https://qiita-image-store.s3.amazonaws.com/0/31363/b064e2ee-709f-6a74-4869-22ea1a5a0306.png)

#IX. 廃棄容易性
>即座に起動・終了することができる。

起動コマンドから数秒でリクエストを受け付けるようになるべき。起動が早いことでリリース作業やスケールアップが容易になる。

>グレースフルにシャットダウンする。

リクエストを遮断し、受信処理中のリクエストが終了してからシャットダウンすること。

#X. 開発/本番一致
>継続的デプロイしやすいよう開発環境と本番環境のギャップを小さく保つ。

・時間：数時間でデプロイ
・人材：コードを書く人とデプロイする人は同じ
・ツール：開発環境と本番環境をできるだけ一致

#XI. ログ
>アプリケーションの出力ストリームの送り先やストレージについて一切関知しない。

アプリケーションのログはバッファリングせずに標準出力に書きだす。ログをどのように出力し、どのくらい貯めておくかなどはアプリケーションでは判断せず、あくまでアプリはアプリケーションに集中する。標準出力ならOS環境や本番/開発環境などの環境が変わっても影響がないので問題なし。

#XII. 管理プロセス
手動で実施するとオペミスを発生させる可能性があるため、管理はできるだけ自動化しましょう。

#以上
オブジェクト指向の用語

知識を整理するためにオブジェクト指向の用語を載せている。ただし網羅的なものではない。随時更新する。

## オブジェクト指向(object oriented)

* オブジェクトを主軸に添えた設計手法やプログラミング手法のこと。

## オブジェクト(object)

* 次の4つを持つもの
    * 属性(attribute): 山田さんは、出社中かを表す属性を持つ。
    * 操作(operation): 山田さんは、出社する。出社すると、出社中属性に影響を与える。
    * 関連(relation): 山田さんは、会社と関連している。
    * アイデンティティ(identity): 山田さんは、田中さんと区別されなければならない。

## 抽象データ型(abstract data type, ADT)

* 抽象データ型 = 集合 & 集合の名前 & 集合の要素で成り立つ公理
* ユーザが定義した型。
    * 定義するということは名付けること。
* 抽象データ型は値の集合である。(値の配列やコレクションオブジェクトではなく、あくまで概念的なもの)
    * 普通のデータ型の例
        * uint型 = データ型
        * uint型は、非負の整数値の集合: {0, 1, 2, 3, ..., n}
    * 抽象データ型の例
        * 年月日の月 = 抽象データ型
        * 月 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
            * つまり、int型の1から12
* 抽象データ型は、集合の要素に対しての公理を持つ。
    * 月が持つ公理: 次の月はn + 1である。もしも、nが12なら、次の月は1である。
    * 公理は、オブジェクト指向**プログラミング**では、methodで表現されることがある。
* 抽象データ型があるおかげで、「一月と二月と三月と…」とすべて列挙する必要がなく、「月」と呼べば済む。
* 抽象データ型はオブジェクト指向の文脈に限らなければ「値の集合」と言えるが、オブジェクト指向では「オブジェクトの集合」を指すことが多い。

## クラス(class)

* クラス = 抽象データ型 + 継承 + 多態性
    * クラスは、抽象データ型に継承と多態性を加えたもの
* オブジェクトのひな形と俗称されるが、本質は抽象データ型であり、要するに、クラスはオブジェクトの集合を指す。

## オブジェクトベース(object-based)

* オブジェクトを使うが、カプセル化のみを扱うプログラミング。
* オブジェクトベースでは、継承と多態性のどちらか、または、両方ともサポートされない。
    * オブジェクト指向プログラミング言語は、継承と多態性どちらもサポートしている。
    * 広い意味で言えば、オブジェクト指向もオブジェクトベースの一部と言える。
* プロトタイプベース(prototype-based)のことを指すこともあるが、プロトタイプベースは真のオブジェクト指向言語なので厳密には異なる。
* [Object-based language - Wikipedia](https://en.wikipedia.org/wiki/Object-based_language)

## クラスベース(class-based)

## プロトタイプベース(prototype-based)

* オブジェクト指向プログラミングのひとつのスタイル。
* 振る舞いを再利用する方法が継承によるものではなく、既存のオブジェクトを複製して新しいオブジェクトを作る形でふるまいの再利用を実現する。元になるオブジェクトはプロトタイプと呼ばれ、新しいオブジェクトにない振る舞いは元となったプロトタイプに移譲される。

## インスタンス(instance)

* クラスをから作られたオブジェクト。

## オブジェクト指向オントロジー(Object-oriented ontology, OOO, triple-O)

[Object-oriented ontology - Wikipedia](https://en.wikipedia.org/wiki/Object-oriented_ontology)
linuxでメモリ解放の話〜分かり易いイメージで〜

# はじめに

linux環境で、なんか動作がもっさりしてきたな〜って時にめもりが原因だった場合の対処法。

# その前に

まずメモリの話から。と言っても当方そっちの専門家じゃないので、詳しい人に聞いた感じ。

## そもそもメモリって

PCにおいて主な計算はCPUによって行われています。しかし、CPUはHDDやSSDなどの記録媒体から直接データを読み込んだり計算したりはできないのです。そこでメモリは、一時的に記憶媒体などからデータを読取り、CPUが計算できる様にする役割があります。
もっとわかりやすく、イメージしてもらうために、ここで一つ個人的にわかりやすかった例え話を。

皆さん、小学校で使われている机をイメージしてみいてください。天盤の下に教科書とかが入れられるタイプのアレです。そして、そこで作業をしようとする自分を思い浮かべてください。
そうすると、

机の中・・・HDDなどの記憶媒体
机の上・・・メモリ
自分・・・CPU

という感じで対応ができます。
まずあなたが作業しようとした時、机の中にある道具やら何やらをそのまま机の中で作業するのは難しいかと思います。なので、机の上に色々出して作業するかと思います。これと同じ様なことがPCでも起こっております。この時、作業するために机の上に出したあれこれを、作業が終わった後に机の中に戻すはずなのですが、「また後でつかうかも？」と思うと、一旦そのままにしてしまうことがあるかと思います。そしてそれを多用すると、机の上にあれこれが沢山残っている状態ができてしまうのです。この状態が所謂「キャッシュが溜まっている」ってやつです。

よくこのキャッシュが有ると「重くなる」と思っている人が多いかと思いますが、それは思い違いであることが多いです。考えてみてください、机の上にあるモノを参照するのと、机の中にあるモノを参照するの、どちらが早いか。明らかに机の上にあるモノを参照した方が速いことがわかると思います。
ではなぜキャッシュが多くなると「重くなる」とおもわれるのでしょうか？それは机の上のモノがたくさんある状態で、机の中のモノを出さないといけない場合を考えてみてください。その場合、机の上にある当分使いそうに無い、又は使っていなかったモノを一旦捨てるか机の中に戻す作業を挟まなければなりません。この動作が頻繁に起こると「重くなる」という現象が起こります。

# ここからが本題

溜まったキャッシュは基本的に自動的で管理されるのですが、それを強制的に消去する方法をいくつか紹介します。が、強制的にキャッシュを消去すると、キャッシュを参照して動作しているアプリが誤作動する可能性があり、最悪データが破損しかねません。なので、危険性の少ない方から順に紹介していきます。というかぶっちゃけ再起動するのがいいんだけど、それができない環境での措置ってことで。

当方の環境はこんな感じ。

OS: Cent OS 7

***方法其ノ壱***

```Bash
$   sync
```
スタンダードな、よくある方法。

***方法其ノ弐***

```Bash
$   echo 1 > /proc/sys/vm/drop_caches
```
キャッシュの中でも、消しても大丈夫そうなのを消去。

***方法其ノ参(非推奨)***

```Bash
$   echo 3 > /proc/sys/vm/drop_caches
```
取り敢えず全部のキャッシュを消去。

***方法其ノ肆(めっちゃ非推奨)***

```Bash
$   du -s /;\
    sync && sync && sync;\
    echo 3 > /proc/sys/vm/drop_caches
```
duコマンドでキャッシュを整理。
syncコマンドで少し解放。三回やってるのは念の為。
drop_cachesで全てのキャッシュを解放。

#最後に

*実行は自己責任にてお願いします。*
取り敢えず、書いてみた感がすごいけど、メモリの解放はあまりオススメはできませんので悪しからず。
schedule, emailを使ってheroku上から定期的にgmailを飛ばす

ほんとうに頭が悪く、短期記憶が4ミリ秒しかありません。
汎用性のない記事を石版に彫ります。
スケジューラはscheduleを使います。

herokuユーザ登録、heroku toolbeltのインストールは省略。
scheduleライブラリ入れよ。

```
$ pip install schedule
```


>Googleアカウントのパスワードでログインしようとすると弾かれます。
怪しい自作アプリでもsmtpサーバを使わせてもらうため、Googleアカウントの設定からアプリパスワードというものを取得してきて下さい。
`FROM_ADDRESS`には自分のアドレスを、`MY_PASSWORD`にはアプリパスワードを設定します。


```python:main.py
import smtplib
import schedule
import time
from email.mime.text import MIMEText
from email.utils import formatdate

    # ================================================================
    FROM_ADDRESS = 'MAIL'
    MY_PASSWORD = 'PWD'
    TO_ADDRESS = 'TO'
    BCC = 'BCC'
    SUBJECT = '件名'
    BODY = '本文'
    # ================================================================


def create_message(from_addr, to_addr, bcc_addrs, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Bcc'] = bcc_addrs
    msg['Date'] = formatdate()
    return msg


def send(from_addr, to_addrs, my_pwd, msg):
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587) # gmail
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    smtpobj.login(from_addr, my_pwd)
    smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
    smtpobj.close()


def job(): # 実行したい処理。
    msg = create_message(FROM_ADDRESS, TO_ADDRESS, BCC, SUBJECT, BODY)
    send(FROM_ADDRESS, TO_ADDRESS, MY_PASSWORD, msg)
    print('SENT=========>')


# コンフィグ。お昼の12時に一日一回送信。
# cronより覚えやすい。clockworkみたいだね。
schedule.every().day.at('12:00').do(job)

# 本体。コンフィグを読み出して実行してくださる。
while True: 
    schedule.run_pending()
    time.sleep(1)

```



> `git init` は `heroku create`より先に打っておくと自動でherokuがリモートリポジトリに登録される。

```
$ cd <APP_CURRENT_DIRECTORY>
git init
heroku login
heroku create
```

herokuに必要なファイルをいくつか作っておく。

```
$ pip freeze > requirements.txt
copy nul Procfile
copy nul runtime.txt
```
>Procfileのtypeはworkerになる。
djangoみたいにwebだと起動しないね。~~調べないと。~~調べた。

```
web dyno
HTTPのリクエスト・レスポンスの処理。ユーザーからのリクエストは全部webが行うそう。

worker dyno
バックグラウンド処理。web dyno以外、APIsからのデータ取得やRSSフィード利用だそう。
```

そのあとは起動コマンド。



```:Procfile
worker: python main.py
```

```txt:runtime.txt
python-3.7.2
```

デプロイします。

```
$ git add --all
git status
git commit -m "Firstslap"
git status
git push heroku master
```

とりあえずこれで動くかな。エラったらすいません。
定期的に起こさないと寝ちゃうかも。止まってますね。何か対策しないと。
Ngrxを学習する上で必要なTypescriptの学習

# はじめに
NgRxはAngularの状態管理ライブラリです。普段では見えてないtypescriptの使い方があったので、解説しようと思います・

# Reducer, Selector, Entity

定義したインターフェースに、値をオブジェクトリテラルのまま代入することができます

参考
https://github.com/typescript-exercise/typescript-exercise.github.io/wiki/%E6%96%87%E6%B3%95%EF%BC%93%E3%80%80%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%9E%8B%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB
### 簡単な例
```typescript
{
    str : string;
    num : number;
} = {
    str: 'text',
    num: 10,
    bool: true // 余分なプロパティはエラーにならない
};
```

### 使用例
entityの特有のインターフェースをもったadpterのgetSelectorsメソッドによって、EntitiySelectorsを返します。

```typescript
getSelectors(): EntitySelectors<T, EntityState<T>>;
```

```typescript
export interface EntitySelectors<T, V> {
    selectIds: (state: V) => string[] | number[];
    selectEntities: (state: V) => Dictionary<T>;
    selectAll: (state: V) => T[];
    selectTotal: (state: V) => number;
}
```

特有のインターフェースを持った、 `selectIds`, `selectEntities`, `selectAll`, `selectTotal` を作ります。

```typescript
export const {
  selectIds,
  selectEntities,
  selectAll,
  selectTotal,
} = adapter.getSelectors();
```


# Selector
Selectorでは、ファクトリ関数(1つのオブジェクトを返す関数)を使います。

参考
https://www.webprofessional.jp/factory-functions-javascript/

### 簡単な例
creJelly()によって、オブジェクトを返しています。

```typescript
function creJelly() {
  return {
    type: 'jelly',
    colour: 'red'
    scoops: 3
  };
}
```

### 使用例
```typescript
export const getProjects = createSelector(
    getProjectState,
    fromProject.selectAll
);
```
[基本情報技術者(FE)]2進数にすると無限小数になるもの

#はじめに
このページは、初心者エンジニアの僕が、基礎知識を養うために勉強したことを、共有する場です。
とりあえず、基本情報基礎の過去問を解きながら、勉強したことを解説していきます。
間違いや、ニュアンスが微妙なところもあるかもしれませんが、お気軽にご指摘を頂けると幸いです。

#今日の問題
```text:13年春FE問1
次の10進小数のうち、2進数で表すと無限小数になるものはどれか。
1. 0.05
2. 0.125
3. 0.375
4. 0.5
```

```text:正解
1. 0.05
```
[引用サイト](http://jibun.atmarkit.co.jp/scenter/ittrain/105_exam_4_a1.html)
#解説
##無限小数と有限小数
###有限小数
有限小数とは終わりのある少数のこと。

 - 1.2
 - 10.3
など。

###無限小数
無限小数は、有限小数に対して、終わりのない少数のこと。

 - 円周率3.1415...
 - ( 1 / 3 = )0.3333...

など。上のような、循環少数も含まれる。

[参考サイト](http://manapedia.jp/text/989)

##小数を2進数で表すには
[こちら](https://mathwords.net/syosuu2sin)のサイトが分かりやすかったです。それぞれを計算すると、
1. の0.05は、0.00001100...(1100の循環小数)
2. の0.125は0.001
3. の0.375は0.011
4. の0.5は0.1
となります。
ここで、答えが出ました！
1.の0.05は、2進数にすると無限小数となります。

##2進数にすると無限少数になってしまうもの
2^－n （n：自然数）の組合せで表せない数値は、2進数で表すと無限小数となる...らしい。
でも、10進数と2進数の変換は、他の問題でも出てくる可能性があるから、[こっち](##10進数少数を2進数で表すには)で覚えとくと良いかも。
[参考サイト](http://http://jibun.atmarkit.co.jp/scenter/ittrain/fe2009/105-004/105-004a.html)

##その他　この問題から学べること
 - 10進小数を2進小数に変換するには、整数と小数を別々に分けて計算する。
 - 整数部分は、2で割りながら計算を進めて、下から数える。[こちら要参照](https://mathwords.net/syosuu2sin)
 - 小数部分は、2をかけながら計算を進めて、上から数える。[こちら要参照](https://mathwords.net/syosuu2sin)

#最後に
引き続き、IT知識の基礎固めで学んだことを共有しています！
よろしくお願いします。
Firebase Hosting でCloud Functions for Firebase を使用するとCookieが使用できない件の対応



**2019/03/14追記**

どうもローカルのサーバならOKなんですが、デプロイした後やってみるとやっぱりダメみたいです。addCookie側はOKなんですが、

```
$ curl http://[hostingサーバ名]/getCookie -H 'Cookie: state=6; state1=7'
$
```

うーん、詰みましたorz。登り電文にcookieは乗るのですが、サーバ側関数では取得できず。。。

``firebase serve`` ってローカルでやったときだけうまくいくようでした。ごめんなさい。。
**2019/03/14追記 ここまで**





[Cloud Functions for Firebase をFirebase Hosting 経由で使っていて](https://qiita.com/masatomix/items/bd1c3a6b31e8d2cb7aef#functions%E3%81%AE%E9%96%A2%E6%95%B0%E9%81%94%E3%82%92-hosting-%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E7%B5%8C%E7%94%B1%E3%81%A7%E5%87%A6%E7%90%86%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B) Cookieをつかおうとしたら、[Cloud Functions による動的コンテンツの配信 ](https://firebase.google.com/docs/hosting/functions?hl=ja#using_cookies) この制約に引っかかるようで、Cookieを下ろしてくれないみたい。

うーん、とりあえず下記のとおり``response.setHeader('Cache-Control', 'private') ``で解決できるぽいので、備忘メモ。

```typescript:index.ts
import * as functions from 'firebase-functions'
import * as cookie from 'cookie'

export const addCookie = functions.https.onRequest((request, response) => {
  response.setHeader('Cache-Control', 'private') // Hosting経由だと、これがないとset cookieが削除される
  _addCookie(response, 'key', 'value')
  response.send('Hello from Firebase!')
})

export const getCookie = functions.https.onRequest((request, response) => {
  //   response.setHeader('Cache-Control', 'private')
  const cookies = cookie.parse(request.headers.cookie || '')
  const sessionState = cookies.state
  response.send(sessionState)
})

function _addCookie (res, key, value) {
  const expiresIn = 60 * 60 * 24
  const options = { maxAge: expiresIn, httpOnly: true }
  // const options = { maxAge: expiresIn, httpOnly: true, secure: true }
  res.setHeader('Set-Cookie', cookie.serialize(key, value, options))
}
```


```bash
$ curl http://localhost:5000/addCookie -i
HTTP/1.1 200 OK
x-powered-by: Express
cache-control: private
pragma: no-cache
expires: 0
set-cookie: key=value; Max-Age=86400; HttpOnly ← ちゃんとおろしてる
content-type: text/html; charset=utf-8
content-length: 20
etag: W/"14-z3iZXchEt5DVWZKsMncy8Wl4KSQ"
date: Sun, 10 Mar 2019 02:18:40 GMT
connection: close
vary: Accept-Encoding, Authorization, Cookie

Hello from Firebase!

$ curl http://localhost:5000/getCookie -H 'Cookie: state=6; state1=7'
6  // サーバ上での取得も問題なし
$
```
サーバからのCookieの受領も、サーバへのCookieのアップも問題なさそうですね。

この事象と「ブラウザはアクセスURLが localhost だと、下ろしてくる set-cookieを無視する？」事象が合わさって、ずいぶんトラブルシューティングに時間がかかりましたorz。localhost問題の方は結局 /etc/hosts で client.example.com などホスト名をつけて対応。

```bash
$ cat /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost 
127.0.0.1 client.example.com
$
```


おつかれさまでした。
TensorboardのEmbeddingによる高次元データの可視化

# Tensorboard: Embedding
TensorbordのEmbeddingを利用することで高次元データを2/3次元での可視化が可能です。
![embedding.png](https://qiita-image-store.s3.amazonaws.com/0/163274/4285ad6f-3694-f9f8-55eb-4748ab9e7df9.png)
公式ドキュメント等詳しく書かれていますが、備忘録を兼ねてコードを紹介したいと思います。

TensorFlow Embedding: https://www.tensorflow.org/guide/embedding
Embedding デモ: https://projector.tensorflow.org/

# 次元削減
次元の圧縮方法としては`PCA`または`t-SNE`が利用可能です。Tensorboard実行時にはPCAによる削減がデフォルトで行われます。
注意点として、t-SNEによる次元削減では入力が50次元を超える場合、50次元まで落とした後にt-SNEによる削減を行っている(githubのissueで見かけたがリンクを忘れてしまった)。このため、sklearn等によるt-SNEの結果と一致しないようです。

# Python用コード
手順としては
1. projectorの設定ファイルを書き出す
2. checkpointファイルを書き出す
これだけです。

## 環境
* Python: 3.6
* tensorflow: 1.10.0
* pandas: 0.24.1

## コード
```python:embedding.py
import tensorflow as tf
from tensorflow.contrib.tensorboard.plugins import projector
from pathlib import Path
import pandas as pd

def embedding(vectors, save_dir, labels=None):
    with tf.Session() as sess:
        save_dir = Path(save_dir)
        if not save_dir.exists():
            save_dir.mkdir(parents=True)

        vectors_tensor = tf.Variable(vectors)
        sess.run(tf.global_variables_initializer())

        save = tf.train.Saver()
        save.save(sess, save_dir.joinpath('embedding.ckpt').as_posix())

        config = projector.ProjectorConfig()

        embedding = config.embeddings.add()
        embedding.tensor_name = vectors_tensor.name
        if labels is not None:
            embedding.metadata_path = 'label.tsv'
            label_df = pd.DataFrame({'Label': labels})
            label_df.to_csv(save_dir.joinpath('label.tsv'), sep='\t', index=False, header=False)

        summary_writer = tf.summary.FileWriter(save_dir.as_posix())
        projector.visualize_embeddings(summary_writer, config)
```
可視化したいサイズ`(データ数, 次元数)`のベクトルデータと保存先を与えることで指定ディレクトリにcheckpointファイルを書き出してくれる。データ数に一致するラベルを与えることでデータにラベルを付加することも可能です。
なお、10,000点を超えるデータは実行時に10,000点がランダムに選択されて可視化されます。


# 実行
実行はいつも通り`tensorboard`を実行後、ブラウザでアクセスするだけです。

```bash
$ tensorboard --logdir path/to/logdir
```
osmdroid を使ってAndroid に国土地理院の地図画像を表示する

[osmdroid を使って OpenStreetMap の地図を Android に表示する](https://qiita.com/ohwada/items/c3741fb14a5142035314)
の続きです


###  国土地理院の地図画像

国土地理院は、測量及び地理情報を扱う行政機関です。

以前は、5万分の1地形図のような紙媒体で公開していた。
最近は、電子データ化を推進している。

地理院タイルという名称で地図画像をXYZ方式で配信している。

地理院タイル一覧
https://maps.gsi.go.jp/development/ichiran.html

利用条件
国土地理院のサーバ上にある地理院タイルを、リアルタイムで読み込み表示するウェブサイトやソフトウェア、アプリケーションを製作する場合、地理院タイルは出典の明示のみで申請不要でご利用いただけます。

ということなので、ありがたく利用されて頂く。

# osmdroidのXYTileSource

XYZ方式で提供されているタイルを使用するためのクラス

前回の記事で、OSM日本のサーバーを指定しいたところを、
地理院タイルのサーバーを指定する

```
       // OSM日本
        final ITileSource tileSource = new XYTileSource("FietsRegionaal",  3, 18, 256, ".png",
                new String[] { "http://tile.openstreetmap.jp/" });

       // 地理院タイル
        final ITileSource tileSource = new XYTileSource("GSI",  3, 18, 256, ".png",
                new String[] { "https://cyberjapandata.gsi.go.jp/xyz/std/" });
```
### スクリーンショット

左はOSM地図、右は地理院タイル
![10_yokohama_osm.png](https://qiita-image-store.s3.amazonaws.com/0/64075/1225c142-d27a-b957-26d2-9bc7be06dc79.png) ![10_yokohama_gsi.png](https://qiita-image-store.s3.amazonaws.com/0/64075/1bf75a12-1f3b-a508-32ff-2409bdf1eda8.png)

空中写真
![10_kannai_osm.png](https://qiita-image-store.s3.amazonaws.com/0/64075/26cd1b04-b3e8-1027-8819-4d79f02bbd86.png) ![10_kanai_photo.png](https://qiita-image-store.s3.amazonaws.com/0/64075/42def2cc-00f2-a862-3d61-e431e99a528a.png)

github にサンプルコードを公開した

https://github.com/ohwada/Android_Samples/tree/master/Osmdroid10
【Ruby】N桁のランダムな数字を生成するワンライナー

N桁のランダムな数字の文字列を生成するワンライナー

```random_gen.rb

def random_number_generator(n)
  ''.tap { |s| n.times { s << rand(0..9).to_s } }
end

random_number_generator(4) # "3416"
random_number_generator(10) # "1890841679"
```
sampleを使うパターンはこちらの記事に記載されています。
https://qiita.com/shu_0115/items/fcdacebba263a7e8922d
Basic認証付きマイRequestBinをherokuなどで

WebHookの開発とかで、たまに[RequestBin](https://github.com/Runscope/requestbin)したくなります。

今上がってるやつをそのまま使うのはなんだかなーというので、ざっくりとbasic認証だけ追加してherokuにpushして使ったのでメモ。

変更済みのフォークはこちら。 https://github.com/sawanoboly/requestbin/tree/local/heroku/basicauth

ユーザ名とパスワードを環境変数から取るようにして、全部のリクエストの前に差し込むHookで認証を必須にしたつもり。

```diff:git_diff_master..local/heroku/basicauth
diff --git a/requestbin/__init__.py b/requestbin/__init__.py
index b7e978a..f6af00e 100644
--- a/requestbin/__init__.py
+++ b/requestbin/__init__.py
@@ -4,7 +4,7 @@ from cStringIO import StringIO
 
 from flask import Flask
 from flask_cors import CORS
-
+from flask_httpauth import HTTPBasicAuth
 
 class WSGIRawBody(object):
     def __init__(self, application):
@@ -35,6 +35,22 @@ class WSGIRawBody(object):
 
 
 app = Flask(__name__)
+auth = HTTPBasicAuth()
+
+users = {
+    os.environ.get('USER'):os.environ.get('PASS')
+}
+
+@auth.get_password
+def get_pw(username):
+    if username in users:
+        return users.get(username)
+    return None
+
+@app.before_request
+@auth.login_required
+def before_request():
+    pass
 
 if os.environ.get('ENABLE_CORS', config.ENABLE_CORS):
     cors = CORS(app, resources={r"*": {"origins": os.environ.get('CORS_ORIGINS', config.CORS_ORIGINS)}})
diff --git a/requirements.txt b/requirements.txt
index 38f400f..8f74bb8 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -14,3 +14,4 @@ python-dateutil==2.1
 gunicorn
 bugsnag
 blinker
+flask-httpauth
diff --git a/runtime.txt b/runtime.txt
index 4b38fc9..f27f1cc 100644
--- a/runtime.txt
+++ b/runtime.txt
@@ -1 +1 @@
-python-2.7.13
+python-2.7.15
```

これを公式のガイド[Deploy your own instance using Heroku](https://github.com/Runscope/requestbin#deploy-your-own-instance-using-heroku)でherokuにpushします。

あとは環境変数`USER`,`PASS`に値を入れておしまい。

```
$ heroku config:set set USER=foo PASS=bar
```

まあ、アプリケーション名ランダムで十分長くしておく、とかでも構わんのですが。最後に用事が済んだら`heroku redis:cli`からDBをFLUSHALLしとくとなんか安心。

補足

SaaSが良ければ requestbin alternative で検索すれば色々出てきてフリープラン付きもあるのでそれを使えばよいでしょう。だいたい自分がRequestBinしか名前を覚えてないのでこんなことに。
ほか、ngrokでローカルになんか立てるのも良いですね。
【C#】画像生成の基本（Bitmap）

# はじめに

[【Java】簡単な模様を描く](https://qiita.com/nkojima/items/9fc539630584ffdcd39c)のコードを転用して、「簡単な模様の画像」をC#で生成してみました。

# コード

* 以下の2つのライブラリを使うと、ラスター形式の画像（BMP,JPG,PNGなど）を操作することができます。
 * System.Drawing;
 * using System.Drawing.Imaging;
* 所望の座標のピクセルに対する色付けは、SetPixelメソッドを使います。
 * `{Bitmapオブジェクト}.SetPixcel(x座標,y座標,色)`
* 生成した画像の保存は、Saveメソッドを使います。
 * `{Bitmapオブジェクト}.Save({保存先のパス}, {画像の形式})`
* 余談ですが、System.Drawingは「[GDI+](https://ja.wikipedia.org/wiki/Graphics_Device_Interface#GDI+)」というグラフィックサブシステムを利用しているそうです。
 * [System.DrawingのAPI](https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing?view=netframework-4.7.2)を見ると、「GDI+の基本的なグラフィックス機能を使用できるようにします」と書かれています。

```c#:ImageCreator.cs
public class ImageCreator
{
    /// <summary>
    /// バツ印の画像を生成する。
    /// </summary>
    /// <param name="size">画像の縦・横のサイズ。px数を指定する。</param>
    public static void CreateCrossMark(int size)
    {
        Bitmap bmp = new Bitmap(size, size);

        // 全ピクセルに色付け
        for (int row = 0; row < size; row++)
        {
            for (int col = 0; col < size; col++)
            {
                if (row == col || row + col == size - 1)
                {
                    bmp.SetPixel(col, row, Color.White);
                }
                else
                {
                    bmp.SetPixel(col, row, Color.Black);
                }
            }
        }

        bmp.Save(@"C:\image\cross_mark.png", ImageFormat.Png);
    }
}
```

# 生成された画像

* 以下のように「黒地に白のバツ印」の画像を生成できました。
 * CreateCrossMarkメソッドの引数の値を変えることで、大小様々なサイズの画像を生成できました。

![cross_mark.png](https://qiita-image-store.s3.amazonaws.com/0/312166/1b3402df-820e-b3d3-0377-415428ca2c73.png)

# まとめ

* 単純な画像を生成するだけであれば、Bitmapクラスを使うことで比較的簡単に実装できます。
* ただし、Bitmapオブジェクトに対する操作は低速なので、Bitmapオブジェクトに対する操作の回数を極力減らすのが高速化のポイントになります。
* また、画像のリソースの解放処理をきちんとしておかないと、実用に耐えうるコードにはならないようです。
 * [.NETでBitmap、BitmapDataを扱う場合の例外処理について](https://qiita.com/Nuits/items/2c1dfa00db3aef39d3ae)
 * [Windowsフォームアプリケーションでリソースリークしないために（1）](http://atsukanrock.hatenablog.com/entry/20110421/1303381271)
 * [UWPメモ その5 UWP/WPFで画像オブジェクトに対する解放処理は不要なのか](https://taktak.jp/2016/04/12/1028)
macOSでi386-elf向けのGCCをインストールする

以前は[手間をかけてインストールしていた](https://qiita.com/tatsumack/items/9f1ae8dee4dbb33b7406)けど、いつの間にかHomebrewでサクッとインストールできるようになっていた。

```bash
$ brew install i386-elf-gcc
```