OmniAICreator/Qiita-1.07M huggingface dataset:
構造体(aggregate) に 比較関数を極力自動で生やす

# よくある問題
C++の構造体には operator==とか生えていない。[^1]
そのため、std::setやuniqを利用するには自分でoperator<などを定義する必要がある。
しかし困ったことにめんどい。今回はこれを何とかしたい

[^1]: C++20では生えてくるといわれているが、人生と締め切りは短いので2020年とか待てない

# 解決案

解決するには以下の二つのものを組み合わせればよい

- 構造体を比較する方法
- 関数を構造体に結び付ける方法(極力低コストに)

## 構造体を比較する

1. [ココ]( https://www.reddit.com/r/cpp/comments/4yp7fv/c17_structured_bindings_convert_struct_to_a_tuple/ ) などを参考に構造体をtupleに変換する関数を作る
2. 1で構造体をtupleに変換して 比較する関数を作る


## 関数を構造体に結び付ける

やり方は２つある
1. 構造体をwrapするhelperを作る
2. 構造体をADLの呼び出し対象にするclassをつくる

### 構造体をwrapする
構造体をwrapするhelperをつかう
https://wandbox.org/permlink/GsnOppgzrVCjIwXk

```c++:lib.hpp

template<class S>
struct Wrap:S{
    friend bool operator<(Wrap const &lhs, Wrap const &rhs){
        return to_tie(lhs) < to_tie(rhs);
    }
};
```

```c++:main.cpp
struct StructImpl{
    int x;
    std::string y;
};
using Struct=Wrap<StructImpl>;

int main(){
    Struct a={1,""}, b={1,"b"};
    assert(std::is_aggregate<Struct>());
    assert(a<b);
}

```

### 構造体をADLの呼び出し対象にする

構造体をtemplateで作り、helper classを指定。ADL呼び出しの対象にする
https://wandbox.org/permlink/9xNFtLBkI01cx9M7


```c++:lib.hpp
struct Hook{
    template<class T>
    friend bool operator<(T const &lhs, T const &rhs){
        return to_tie(lhs) < to_tie(rhs);
    }
};
```

```c++:main.cpp
template<class>
struct StructImpl{
    int x;
    std::string y;
};

using Struct = StructImpl<Hook>;

int main(){
    Struct a={1,""}, b={1,"b"};
    assert(std::is_aggregate<Struct>());
    assert(a<b);
}
```
GraphQLので階層構造のモデルを作る

簡単ですよ。

[1対N](https://qiita.com/Hiroyuki_OSAKI/items/afd620aba2a48e22b2a4)の場合、こちら。

`@relation`アノテーションで２つのFieldが紐づけられております。

このとき、片方が`Test`(単体)、片方が`[Locations!]!`(複数)であることが大事です。

今回使ったPrismaは、**片方が複数、ということが理解できないと「1対N」と理解できません**。

---

```
type Location {
  address: String!
  country: String!
  test: Test @relation(name: "TestOnLocation")
}

type Test {
  id: ID! @unique
  test: String! @unique
  locations: [Location!]! @relation(name: "TestOnLocation")
}
```

そして階層構造を一括操作するクエリは、Prismaの場合[こちら](https://qiita.com/Hiroyuki_OSAKI/items/afd620aba2a48e22b2a4)。
ApsaraDB for Memcacheをバックアップから復旧（リストア）してみる

# はじめに
今回はタイトルの通り、ApsaraDB for Memcacheを復旧手順をやろうと思います。

# 復旧（リストア）してみます

![83035c90.png](https://qiita-image-store.s3.amazonaws.com/0/241104/8f175253-4d8a-228f-4a52-4f94c57164a4.png)

![90bd4756.png](https://qiita-image-store.s3.amazonaws.com/0/241104/ab0fee24-f03a-9e53-90b2-28bc4e898dc0.png)

２クリックでリカバリが走ります。
オペミスはないと思いますが、注意は必要ですね。
**確認**ではなく**実行**にしてほしい。。。

![8b3fc3fc.png](https://qiita-image-store.s3.amazonaws.com/0/241104/2f978973-9e44-8291-42c2-62d2884ee117.png)

# まとめ
hoge2を差し込んでから、リストアしたところ
バックアップ時点までに戻りました。

```shell
[root@poc3 ~]# telnet m-e9bfbc2700f87e54.memcache.japan.rds.aliyuncs.com 11211
Trying 10.0.3.111...
Connected to m-e9bfbc2700f87e54.memcache.japan.rds.aliyuncs.com.
Escape character is '^]'.
version
VERSION 1.4.33
get hoge1
VALUE hoge1 0 4
hoge
END
set hoge2 0 0 4
fuga
STORED
get hoge2
VALUE hoge2 0 4
fuga
END
Connection closed by foreign host.
[root@poc3 ~]# telnet m-e9bfbc2700f87e54.memcache.japan.rds.aliyuncs.com 11211
Trying 10.0.3.111...
Connected to m-e9bfbc2700f87e54.memcache.japan.rds.aliyuncs.com.
Escape character is '^]'.
get hoge1
VALUE hoge1 0 4
hoge
END
get hoge2
END
```

# おまけ
今回のバックアップは、作成したときの
自動バックアップを使いました。

設定はこんな感じです。
![f7ee77ce.png](https://qiita-image-store.s3.amazonaws.com/0/241104/2aa2199a-5ab9-24c1-e915-7c1449008d9b.png)

２回目がさきほど走ったので、こうなりました。
![15bb7975.png](https://qiita-image-store.s3.amazonaws.com/0/241104/ab144328-07b1-75f9-ed53-f7863705e7b4.png)
Android 9 Pie Google Mapで'java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion'の対処法

# 前置き
小ネタになります:pushpin:
[前回の記事](https://qiita.com/items/2343b6687bb5cef447c3)でお伝えしましたが位置情報とGoogle Mapでアプリを作成していました。AVDのAndroid 9 PieでGoogle Mapを表示しようとすると例外がスローされましたので調査し解決しました。

# 例外メッセージ
```
E/AndroidRuntime: FATAL EXCEPTION: Thread-5
    Process: com.example.devnokiyo.locationsample, PID: 31378
    java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion;
        at el.b(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):3)
        at ek.a(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):4)
        at em.a(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):51)
        at com.google.maps.api.android.lib6.drd.ap.a(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):11)
        at dw.a(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):16)
        at dw.run(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):61)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.ProtocolVersion" on path: DexPathList[[zip file "/system/priv-app/PrebuiltGmsCore/app_chimera/m/MapsDynamite.apk"],nativeLibraryDirectories=[/data/user_de/0/com.google.android.gms/app_chimera/m/00000006/MapsDynamite.apk!/lib/x86, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at ad.loadClass(:com.google.android.gms.dynamite_dynamiteloader@12862026@12.8.62 (040700-199405334):25)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at el.b(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):3) 
        at ek.a(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):4) 
        at em.a(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):51) 
        at com.google.maps.api.android.lib6.drd.ap.a(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):11) 
        at dw.a(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):16) 
        at dw.run(:com.google.android.gms.dynamite_mapsdynamite@12862026@12.8.62 (040700-199405334):61) 
```

# 対処法
調査するとApache HTTP Legacy libraryに関する問題のようで`AndroidManifest.xml`に以下を記述すれば良いことがわかりました。

```xml:AndroidManifest.xml
<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />
```

# 参考
https://developer.android.com/about/versions/pie/android-9.0-changes-28?hl=ja#apache-p
https://developers.google.com/maps/documentation/android-sdk/config#specify_requirement_for_apache_http_legacy_library
https://stackoverflow.com/questions/50461881/java-lang-noclassdeffounderrorfailed-resolution-of-lorg-apache-http-protocolve
https://qiita.com/takke/items/030af1054219e73531f6

# 終わりに
調査や解決自体は難しくないと思いますが、Android Studio 3.2の雛形で作成されたGoogle Mapで利用されているとは思いませんでした:tired_face:
macOS Mojave で brew install や brew update に失敗するときの解決法

# 症状
macOS Mojave にアップグレードして、`brew install` したところ、エラーが発生しました。

```
$ brew install imagemagick

(... 省略 ...)

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Error: Failure while executing; `git config --local --replace-all homebrew.analyticsmessage true` exited with 1.
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Error: Failure while executing; `git config --local --replace-all homebrew.private true` exited with 1.
```

# TL;DR
```
$ sudo mkdir -p /usr/local/sbin /usr/local/Frameworks
$ sudo chown -R $(whoami) /usr/local/sbin /usr/local/Frameworks
$ xcode-select --install
```

# brew doctor
困ったときはとりあえず `brew doctor` で原因を探ります。

```
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: Missing Homebrew/brew git origin remote.

Without a correctly configured origin, Homebrew won't update
properly. You can solve this by adding the Homebrew remote:
  git -C "/usr/local/Homebrew" remote add origin https://github.com/Homebrew/brew.git

Warning: The following directories do not exist:
/usr/local/sbin
/usr/local/Frameworks

You should create these directories and change their ownership to your account.
  sudo mkdir -p /usr/local/sbin /usr/local/Frameworks
  sudo chown -R $(whoami) /usr/local/sbin /usr/local/Frameworks

Warning: No developer tools installed.
Install the Command Line Tools:
  xcode-select --install

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

基本的にはここに書かれているコマンドを実行していけば問題は解決できます。

# 解決法
## Git の remote リポジトリの設定
まずは Git の remote リポジトリの設定が何かおかしいと言われるのですが、これは特に何もする必要がありませんでした。

```
$ git -C "/usr/local/Homebrew" remote add origin https://github.com/Homebrew/brew.git
fatal: remote origin already exists.
```

表示されているコマンドを実行しても、すでに「存在する」となって何も起きません。これは問題がないと思われるので無視します。

## `/usr/local/sbin` と `/usr/local/Frameworks` が存在しない
次に `/usr/local/sbin` と `/usr/local/Frameworks` が存在しないという警告についてはその通りなので、表示されているコマンドを素直に実行します。

```
$ sudo mkdir -p /usr/local/sbin /usr/local/Frameworks
$ sudo chown -R $(whoami) /usr/local/sbin /usr/local/Frameworks
```

## ディベロッパーツールがインストールされていない
最後に、Xcode のディベロッパーツールがインストールされていないと言われるのでインストールしましょう。

```
$ xcode-select --install
```

上記コマンドでインストールされます。通信環境にもよりますが、それなりに時間がかかります。

# 確認
以上で作業は完了です。最初の Git の remote リポジトリの設定がおかしいという警告もいつの間にか直っています。`brew doctor` を実行して、まだ警告が残っている場合は表示されたコマンドを素直に実行してみれば直るでしょう。

```
$ brew install imagemagick
```

ちゃんと `brew install` ができるようになりました。`brew update` に関しても問題なく実行できると思います。

# 感想
`brew doctor` は、ただ警告やエラーが表示されるだけでなく、これを実行すれば解決しますという的確なコマンドも提示してくれるのがとても親切ですね。

macOS Mojave にアップグレードによって発生したエラーに限らず、Homebrew で問題が発生したときは、まず `brew doctor` を実行してみることをおすすめします。
ブログを書いて考える、オリジナル要素を取り入れた2048をUnityとC#で作ってみよう！－1

毎日投稿と言ったな、あれは嘘だ。

それでは。


さて、最初の記事（と言っても殆ど日記のようなもの）は、現在就職用のポートフォリオとして作成している2048についての記事です。

おそらくこの2048についての記事が当分は続くと思うので、よろしくお願いします。

知らない方の為に説明しておくと4×4のマスに2or4の数字がランダムに発生。
同じ数字のマスをどんどん足していって、最終的に2048になればクリア！
というシンプルながらなかなか面白いゲームです。
複雑なAnimationも必要ありませんし、個人で作るゲームとしてはうってつけだと思います。



開発環境はUnity、言語はC#
※どちらも素人ですので了承下さい。

最初から作っていく……と言いたい所ですが、未経験の私にはいきなりゼロから作るのは難しい！
ということで、最初から完成しているモノを探し、従来の2048には存在しないオリジナル要素を追加していく方針に。

DLしたのはこちら↓
https://github.com/jamiltron/2048-unity


他者様のブログでもこちらが取り扱われています。
そちらのブログを見て、私もこのソースを使った形ですね。


Unityで開くと、
![スクリーンショット (296).png](https://qiita-image-store.s3.amazonaws.com/0/286514/bd0f6945-176b-3d03-0908-f10afe858a17.png)

こんな感じ（色々UIを弄っていますが、ほとんどまんまです）



はい、見ての通りオリジナル要素を追加する前に、いくつか修正が必要な部分がありますね。

1.画像のサイズがおかしい。
UIを担当している知人が作成した画像を、ソースで元々使われていた画像から差し替えたのですが、画像サイズの違いによりバランスの悪い見た目に・・・・
※これでも一応治しました。最初はプレイできないくらい数字がデカかったです。

ただ、未だ画像サイズをキレイにできていません！
その理由は次の記事で作成予定です。


2.UIが雑
ここは知人に任せます。
役割分担が大事。



とりあえず今日はここまで。
何事も継続が大事！
明日も更新予定！
systemdのdは何の略なのか？

https://www.freedesktop.org/wiki/Software/systemd/

daemonの略でしょ。と勝手に思っていたのですが、上記公式サイトのSpellingの章に書いてありました。

翻訳すると、


> Spelling
> はい、それはsystemdと書きます。system DでもSystem DでもSytemdDでもありません。そしてsystem dでもありません。なぜか？なぜならそれはsystem daemonで、Unix/Linuxのもとではsystem daemonは小文字であり、小文字dでsuffixされるからです。そしてsystemdはシステムを管理するので、systemdと呼ばれます。シンプルでしょ。とは言うものの、もしあまりにもシンプルに見えたら、Dはローマ数字で500なので（これはSystem Vとの関係も明確にしています）、System Five Hundredと呼んでください（そうは綴らないけど！）。名前に大文字を使用しても良い唯一のシチュエーションは、systemdで文章を始めるときだけです（どちらも好きじゃないけど）。high holidays（訳者注：ユダヤ教の祭日？）の日にはsÿstëmdと綴っても良いでしょう。とは言っても、Système Dは受け入れられないし、完全に別物です（ちょっとフィッティングがあるけど）。


やっぱりdaemonの略でした。
ESP32でMCP3208でanalogread

#ESP-WROOM-32とMCP3208でanalogread
コードは下記のやつ。回路図は後ほど書きます。

```
#include <SPI.h>

#define SPI1_CLK  32
#define SPI1_MISO 33
#define SPI1_MOSI 25
#define SPI1_SS   26

// set SPI freqency 1MHz
#define SPI_CLK 1000000

//uninitalised pointers to SPI objects
SPIClass SPI1(HSPI);
SPISettings spiSettings = SPISettings(SPI_CLK, SPI_MSBFIRST, SPI_MODE1);

void setup() {
  Serial.begin(115200);

  SPI1.begin(SPI1_CLK, SPI1_MISO, SPI1_MOSI, SPI1_SS);

  pinMode(SPI1_SS, OUTPUT);
  pinMode(SPI1_CLK, OUTPUT);
  pinMode(SPI1_MISO, INPUT);
  pinMode(SPI1_MOSI, OUTPUT);

  digitalWrite(SPI1_SS, HIGH) ;
}

void loop() {
  //byte data = 0b01010101;
  byte channel = 0;
  Serial.println(adc_read(0));
  delay(10);
}

int adc_read(uint8_t channel) {

  SPI1.beginTransaction(spiSettings);
  digitalWrite(SPI1_SS, LOW);
  SPI1.transfer(0x06 | (channel >> 2));
  int d1 = SPI1.transfer(channel << 6) ;
  int d2 = SPI1.transfer(0x00) ;
  digitalWrite(SPI1_SS, HIGH);
  SPI1.endTransaction();

  return ((d1 & 0x1F) * 256 + d2);
}
```

![IMG_3112.JPG](https://qiita-image-store.s3.amazonaws.com/0/195504/ff140a81-e545-d59a-1e73-b98e157776a3.jpeg)
JavaScriptテンプレートエンジンのPug（Jade）とEJSの比較

<a href="https://pugjs.org/api/getting-started.html" target="_blank">Pug</a>と<a href="http://ejs.co/" target="_blank">EJS</a>は、JavaScriptのテンプレートエンジンです。
Pugは、もともとJadeという名前でしたが、商標の問題でPugになりました。

## EJSのマークアップ記法
HTMLと同じです。

## Pugのマークアップ記法
Pugには、閉じタグがありません。
階層はインデントで表現します。

### Pug
```Pug

section#foo_01
  h2.title タイトル
  p.txet テキストテキスト
  img(src="./foo.jpg", alt="foo")
```

### HTML
```html

<section id="foo_01">
  <h2 class="title">タイトル</h2>
  <p class="text">テキストテキスト</p>
  <img src="./foo.jpg" alt="foo">
</section>
```

## Pug vs EJS
PugとEJSとで、変数の扱い等若干違うところがありますが、基本的にできることはそんなに違いません。
いくつか例を見てみましょう。

### 変数・定数
#### Pug
```
- const text = "テキスト";

.foo
  p.foo_txt #{text}
```

#### EJS
```html

<%_ const text = "テキスト" _%>

<div class="foo">
  <p class="foo_txt"><%= text %></p>
</div>
```

#### HTML
```html

<div class="foo">
  <p class="foo_txt">テキスト</p>
</div>
```

### 反復
#### Pug
```
- const array = ['aaa', 'bbb', 'ccc'];

ul
  each value in array
    li.value
```

#### EJS
```html

<%_ const array = ['aaa', 'bbb', 'ccc'] _%>

<ul>
  <% array.forEach(function(value) { %>
  <li><%= value %></li>
  <% }); %>
</ul>
```

#### HTML
```html

<ul>
  <li>aaa</li>
  <li>bbb</li>
  <li>ccc</li>
</ul>
```

### 条件分岐
#### Pug
```
- const page = "top";

section
  if(page === top)
    h1 トップページ
  else
    h1 下層ページ
```

#### EJS
```html

<%_ const page = "top" _%>

<section>
  <%_ if (page === "top") { _%>
  <h1>トップページ</h1>
  <%_ } else { _%>
  <h1>下層ページ</h1>
  <%_ } _%>
</section>
```

#### HTML
```html

<section>
  <h1>トップページ</h1>
</section>
```

**複雑な処理をしようとすると、Pugの方が見やすい**（と、ぼくは思う）

より詳しい記法は、それぞれの公式ページをご確認ください。

**Pug**: <a href="https://pugjs.org/api/getting-started.html" target="_blank">https://pugjs.org/</a>
**EJS**: <a href="http://ejs.co/">http://ejs.co/</a>

## Pugのみの記法
`extends`でPugファイルを継承し、`block`で部分的な上書きをすることができます。

```pug:layout.pug
doctype html
html
  head
    block title
  body
    block content
```
```pug:top.pug
extends layout.pug

block title
  title トップページ

block content
  h1 トップページ
  p トップのテキスト
```
```pug:about.pug
extends layout.pug
block title
  title アバウトページ

block content
  h1 アバウトページ
  p アバウトのテキスト
```

トランスパイルされるHTMLは、以下のようになります。

```html:top.html

<!DOCTYPE html>
<html>
  <head>
    <title>トップページ</title>
  </head>

  <body>
    <h1>トップページ</h1>
    <p>トップのテキスト</p>
  </body>
</html>
```
```html:about.html

<!DOCTYPE html>
<html>
  <head>
    <title>アバウトページ</title>
  </head>

  <body>
    <h1>アバウトページ</h1>
    <p>アバウトのテキスト</p>
  </body>
</html>
```
より詳しくは、公式ページをご確認ください。

Pug: <a href="https://pugjs.org/language/inheritance.html" target="_blank">テンプレートの継承</a>

EJSでも同じようなことができるみたいですが、Pugより複雑な処理になります。

## おすすめの使い分け
PugとEJSは、どちらが優れているというわけではなく、**プロジェクトによって使い分ける**ことが賢い選択可だと思います。
個人的な意見になってしまいますが、以下のような使い分けがおすすめです。

### Pug
- （小〜）中大規模
- 記述量が少ない
- 効率よく書きたい

### EJS
- 小中規模
- 複雑な処理は書かない
- **HTMLで書かなければならない**

## おまけ
CSS Nite Coder’s High 2017 で、Pugのセッションがありました。
http://cssnite.jp/archives/post_2962.html

運用方法や課題等、参考になるかと思います。
BOOTHの新着3Dモデル400件を正規表現で自動的に取得するやつ

　先日あげた[BOOTHからサムネを正規表現で自動取得してリストに貼り付けるやつ](https://qiita.com/hibit/items/6bbf34f58560b5f2379c)の続きのようなもの。前回のそれは、URLからサムネを引っ張ってくるものだったが、**どうせだったらURL自体を自動的に引っ張ってこれるようにならねえ？**　という発想の元、[BOOTHの「3Dモデル」タグの新着順](https://booth.pm/ja/browse/3D%E3%83%A2%E3%83%87%E3%83%AB?sort=new)からURLだけを引っ張ってくるスクリプトを書きました。

#ソースコード

　とりあえずソース見せろという方へ。

```javascript
function myFunction() {
var aBook = SpreadsheetApp.getActiveSpreadsheet();
var aSheet = aBook.getSheetByName("test")
var rownum = 1;
for (var j = 1; j <= 20; j++) {
  var url = 'https://booth.pm/ja/browse/3D%E3%83%A2%E3%83%87%E3%83%AB?page=' + j　+'&sort=new'
  var response = UrlFetchApp.fetch(url);
  var html = response.getContentText('utf-8');
  for (var i = 1; i <= 20; i++) { 
    var hoge = html.match(/https:\/\/booth.pm\/ja\/items\/[0-9]+"\>[^<].*?<\/a?/g)[i-1];
    var hoge = hoge.match(/(h.*?)"/)[1];
    aSheet.getRange(rownum , 1).setValue(hoge);
    rownum += 1;
  }
}
}
```

#解説

```javascript
for (var j = 1; j <= 20; j++) {
  var url = 'https://booth.pm/ja/browse/3D%E3%83%A2%E3%83%87%E3%83%AB?page=' + j　+'&sort=new'
  var response = UrlFetchApp.fetch(url);
  var html = response.getContentText('utf-8');
```

　新着ページは20件までしか表示されないので、まとまった量のURLを取得するにはページを2ページ目以降も順次取得していく必要があります。それぞれのページのURLは`https://booth.pm/ja/browse/3D%E3%83%A2%E3%83%87%E3%83%AB?page=` + 数字 + `&sort=new`、が割り当てられているため、`j`のイテレーションで取得していきます。

#販売ページのURL取得

![image.png](https://qiita-image-store.s3.amazonaws.com/0/288125/8d752e82-75e1-1286-6ff9-d2a3f9421092.png)

　各ソースコードの中で、取得したいURLが上図の黄色マーカ部になります。`https://booth.pm/ja/items/` + 数字の連続 + > + モデル名 + </a>、という規則性があるので、それを正規表現で抜き出すようにします。

```javascript
  for (var i = 1; i <= 20; i++) { 
    var hoge = html.match(/https:\/\/booth.pm\/ja\/items\/[0-9]+"\>[^<].*?<\/a?/g)[i-1];
    var hoge = hoge.match(/(h.*?)"/)[1];
    aSheet.getRange(20*(j-1)+i , 1).setValue(hoge);
```

　今回は`match`と`/～/`表記でいきなり正規表現を指定します。タグだけで検索すると<タグ>< /a>という組み合わせも拾ってしまうので、真ん中に`[^<].*?`をはさむことにより目的の文字列を取り出します。この時に大事なのが`/https:\/\/booth.pm\/ja\/items\/[0-9]+"\>[^<].*?<\/a?/g`の末尾の`g`の部分で、これは正規表現が複数マッチした時にすべての戻り値を配列として返すようにするものです（最初の配列は`[0]`から始まる点に注意）。残念ながら、グループ分けの`()`と併用はできないもようで、正確にはこのコードで得られるのは**URL+αの文字列**ですが、
まあそこからURLだけを切り出す操作については解説略で……すいません。</s?><font color = "red">コードを改良してURLを得られるようにしました(12/02)。</font>

　1ページごとに20体の新着3Dモデルがあるので、`ｊ`のイテレーションを20回繰り返せば400個のURLが得られます。

#免責事項

　筆者は正規表現については素人ですので、もっとエレガントな表記があるよ！　という場合もあると思われるますが、そういう場合は教えていただきたいです。

　また、Webスクレイピングはサーバに負担をかける行為ですので、皆さんもこのコードを試してみてよ！　とは気軽には言えないです。ですが何かスクレイピングしたい対象があった時に、このページが参考になれば幸いです。
JavaScriptで連想配列の件数を調べる（オブジェクトのlength件数を取得する）

# 連想配列の件数
ピッチ見たく連想配列のcountを取れないかなとお嘆きの貴兄に捧ぐ。

``` javascript
var obj = { a:1, b:2 };
var count = Object.keys( obj ).length;
```
こうするとcountに件数が取れるっす。
今日気づいたなり。
Rustでメモ用コマンド「rmemo」を作った

僕は普段思いついた疑問点などをメモするようにしています。
基本ターミナルで作業しているのでメモ用のGUIツールなどは使わず、vimで書いてます。

こんな感じに

```
$cd ~/Document/memo
$vim hogehoge.md 
```

う〜ん。メモコマンド一発でやったら良くね？そう思いぱぱっと作りました。

## ソース
https://github.com/k-nasa/rmemo

## できること
![Oct-02-2018 00-33-20.gif](https://qiita-image-store.s3.amazonaws.com/0/175962/7cf16c57-d8e0-05e0-2bc3-277a624eb289.gif)

- 一瞬でメモが取れる
- Markdownで書ける
- greでメモをすぐ見つける
- シェルで全部できる

## 使い方
```rmemo new``` をするとタイトルを聞かれます。その入力値をもとにファイル名を決めファイル作成をします。

``` rmemo config```を実行するとconfig.tomlが開くのでお好みで使用エディタやファイル保存先を指定できます

``` rmemo edit```を実行するとファイルセレクタが起動してファイルを簡単に絞り込めます

```rmemo grep```でgrepしてあの内容がすぐ見たいと言うときに使えます


ホントはrmemoではなくmemoにしたかったのですがcargo.ioで公開しようとしたら、名前を取られてました。

~~そのうち```brew install rmemo```でインストールできるようにするのでしばしお待ちを~~ 
１コマンドでは無理ですができるようになりました

```
brew tap k-nasa/homebrew-rmemo
brew install rmemo
```
OUTPUTメモ

# これはOUTPUTを意識した備忘録っぽい記事です
- 曖昧・誤った理解をしていることが多々あるので参考にはしないことをお勧めします。
- その際、何かアドバイスなどご教授いただけたら死ぬほど喜びます。

## rails tutorial 8章

###統合テスト
「エラーをキャッチするテストを先に書いて、そのエラーが解決するようにコードを書く。」←わかりやすい。
現時点での理解力で書いてって言われると`get`や`post`でつまずいてうまく書けない。
HTTPの基本から復習する。

###Helper
https://qiita.com/shunsuke227ono/items/21f5968ca7ca0391b583
わかりやすい記事↑
メソッドが使われる状況でファイルを分けているイメージ
ex(session_helper.rb, users_helper.rb
また、ヘルパーメソッドはテストから呼び出せないため、`test_helper.rb`に記述

`||=`は数字の演算子をイメージしたらわかりやすかった。
論理値で`False`なら右辺を代入と理解。

###session

sessionメソッドを使うと、ユーザーIDなどをブラウザに一時的に保存できる
↑まだちゃんと理解できていない...復習

###cookie
https://saruwakakun.com/it/web/cookie-cache#section1
参考↑


#感想
sessionで詰まった。
書きながら ん？　と思うこともあったし、まだ理解不足。

初めてQiitaという形でOUTPUTしてみたけど、この意識でする方がさらに調べるし理解が深まる。
いい癖だと思うから、これからも拙いOUTPUTをしていく
【Python】クロージャ(関数閉方)とは

# クロージャの説明
クロージャ(関数閉方)とは**外側の変数を記憶した関数**です。

```python:
# 例1
def func():
    x = 3
    def add3(y):
        return y+x
    return add3

f = func()
print(f(4)) # 7
```
func 関数は add3 関数を定義してそれを返します。
add3 関数は外側で定義された x を関数内で使用しています。
**add3 関数をクロージャ、func 関数をエンクロージャといいます。**
x は本来であれば func関数を抜けたところで消滅するfunc 関数におけるローカル変数です。
クロージャを生成したことで x が add3 関数内に記憶されて f(4) で呼び出した時に x が加算されます。


```python:
# 例2
def func(name):
    def add_msg(message):
        return "Hi " + name + ":" + message
    return add_msg

f = func("Tanaka")
print(f("how are you?")) # Hi Tanaka:how are you?
```
例2は add_msg 関数がクロージャで name 変数を記憶したものが func 関数から生成されています。

```python:
# 例2の続き
print(f.__code__.co_freevars[0], f.__closure__[0].cell_contents) # name Tanaka
```
関数 f に記憶されている変数名とその値を確認できます。
尚、クロージャには当然2個以上の変数も記憶できるので、エンクロージャの**環境を記憶する**と説明されることがあります。


# 自由変数 と 束縛(バインド)
Pythonの自由変数とは**ある関数内でローカル変数と自身の引数以外で使われている変数**です。
例1で x は add3 の中において 自由変数 です。
同様に例2で name は add_msg にとって 自由変数です。

束縛とは**名前を定義すること**です。
n = "Tanaka" とすれば この代入対象の識別子 n は 束縛されます。
関数を定義すれば関数名が束縛されますし、クラスを定義すればクラス名が束縛されます。
import文ではモジュール名が束縛されます。
つまり**名前が何らかのオブジェクトに紐付けされること**です。
また**自由変数がクロージャ内に記憶されること**をクロージャに束縛されると言います。

# 束縛された変数の更新
```python:
# 例3
def func():
    x = 3
    def value(v):
        nonlocal x
        x = v
    def add(y):
        return y+x
    x = 5
    return value, add

v, f = func()
print(f(4)) # 9 = 5 + 4 
v(10) # x の値が 5 → 10 に更新される
print(f(4)) # 14 = 4 + 10
```
束縛された変数の値を後から更新する必要がある場合は Python 3 で導入された nonlocal で宣言します。
例3では自由変数 x を nonlocal で宣言しておくことで後から value 関数を経由して add 関数内でも束縛されている x を更新しています。

```python:
# 例3の続き
print(v.__closure__[0].cell_contents is f.__closure__[0].cell_contents) # True
```
クロージャvで束縛されている変数 x とfで束縛される変数 x は同一オブジュエクトであることが判ります。

# 静的(レキシカル)スコープ
クロージャは静的スコープの言語で成り立ちます。
静的スコープとは変数の名前解決がソースコード上で成立するものいいます。
C, Python, Javascriptなどは静的スコープの言語です。
逆に動的スコープとは変数の名前解決が実行時のコースタックにて行われます。
Emacs Lisp, bash シェルスクリプト, powershell などは動的スコープです。
PerlやLispでは定義時に静的スコープか動的スコープかを選択できます。
[小ネタ] RDS パラメーターグループの動作

# 概要

RDSを構築する時に、パラメーターグループを「defalut」のまま作成したRDSで
途中で、パラメータを変更することになった。

[「default」のパラメータグループは、パラメータを変更することは出来ない](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html)   から
新しいグループを作成して、パラメータ（適用タイプ：Dynamic）を変更し適用することにした。

その時、検証した内容を記録します。

# 検証
## 0. 検証環境

- RDS
    - エンジン：PostgreSQL 10.1
    - マルチAZ：いいえ 
    - パラメータグループ-1：default.postgres10
    - パラメータグループ-2：para-new


### [ 変更したパラメータ（para-new） ]
<img width="820" alt="mod-para.png" src="https://qiita-image-store.s3.amazonaws.com/0/212868/fee5afbe-2815-3b04-f577-9897f5dd4bfb.png">

## 1. パラメータグループを変更（ default --> para-new ）

マネジメントコンソールの操作で、「変更」から「パラメータグループ」を変更する。
※ 「変更のスケジュール」は「次に予定されるメンテナンスウィンドウ中に適用します」にした。

### [ イベントログ表示 ]
<img width="1101" alt="fin-update-log.png" src="https://qiita-image-store.s3.amazonaws.com/0/212868/6add2891-b88f-8d41-1a0f-2f7d496bba38.png">

### [ パラメータの反映結果 ]
変更した内容は反映されなかった。（変更内容としては、ファイル名が変わる想定）
<img width="1107" alt="log-list.png" src="https://qiita-image-store.s3.amazonaws.com/0/212868/41567260-77fc-2e9f-a69a-8c3e0bb61c69.png">


ドキュメントをちゃんと読むと...以下のように記載されている。

```
DB インスタンスに関連付けられている DB パラメータグループを変更する場合
DB インスタンスで新しい DB パラメータグループを使用する前に、インスタンスを手動で
再起動する必要があります。
```

確かに、コンソール上でも表示されている。

### [ パラメータグループ表示 ]
<img width="296" alt="para-status.png" src="https://qiita-image-store.s3.amazonaws.com/0/212868/5874d14f-7883-7f7f-b7c3-94f1a04ffdb8.png">

**よし！再起動だ！** という具合にできれば、反映され終了です。

大体、稼働しているRDSは、容易には再起動出来ない（特にマルチAZではない場合...）。
そもそも、初期構築時に「default」は避けておきたい。

## 2. メンテナンスウィンドウに祈る
メンテナンスウィンドウの時間帯に上手いことやってくれないかと期待をして待つ...

<img width="306" alt="mai-window.png" src="https://qiita-image-store.s3.amazonaws.com/0/212868/989d6c6f-88b5-df47-b96a-4775cf263bc6.png">

特に何も起きない...

## 3. パラメータグループを変更

上記のドキュメントを読むと、パラメータグループを変更する際には
「再起動」が必要なわけで、もしかして、今の状態でなら変更出来るのでは？と思い、「para-new」の内容を変更する。
( サンプルで変更したのは適当に選んだパラメータです。)
<img width="819" alt="mod-para2.png" src="https://qiita-image-store.s3.amazonaws.com/0/212868/cc3efa12-1872-0b2f-2396-c6e9e366c68a.png">

適用が完了すると...?
おっ？反映されている。
<img width="1108" alt="log-list2.png" src="https://qiita-image-store.s3.amazonaws.com/0/212868/4b61e135-0c84-1425-0ce6-ea42721abdb2.png">

ただ、「パラメータグループ表示」は、変化しない。モヤモヤ。
<img width="302" alt="para-status2.png" src="https://qiita-image-store.s3.amazonaws.com/0/212868/e37728c5-56fc-511a-1ef2-997aaa4658d9.png">

# まとめ

ドキュメントの通り、「パラメータグループ」を変更する際は、反映には再起動が必須となる。
ただ、「再起動の保留中」の状態でも、「パラメータグループ」の変更をともなわない「パラメータ」の変更は、「適用タイプ：Dynamic」であれば、再起動不要で反映される。

なので、RDSを作成する際は、個々のパラメータを「default」から変更しないとしても
新しく作成して、それを適用しておけば、後々変更が必要になった場合に楽だなと改めて思いました。
Elasticsearchコマンド集

Elasticsearchのコマンドをまとめていく

- インデックス削除
curl -XDELETE "http://localhost:9200/{index}"

- マッピングの作成
curl -XPUT "http://localhost:9200/blog" --data-binary @blog.json

```blog.jsonの中身
{
  "mappings": {
    "blogpost": {
      "properties": {
        "comments": {
          "type": "nested",
          "properties": {
            "name":    { "type": "string"  },
            "comment": { "type": "string"  },
            "age":     { "type": "short"   },
            "stars":   { "type": "short"   },
            "date":    { "type": "date"    }
          }
        }
      }
    }
  }
}
```

- データ登録  
curl -XPUT "http://localhost:9200/blog/blogpost/1" --data-binary @data.json

```data.jsonの中身
{
  "title": "Nest eggs",
  "body":  "Making your money work...",
  "comments": [
    {
      "name":    "John Smith",
      "comment": "Great article",
      "age":     28,
      "stars":   4,
      "date":    "2014-09-01"
    },
    {
      "name":    "Alice White",
      "comment": "More like this please",
      "age":     31,
      "stars":   5,
      "date":    "2014-10-22"
    }
  ]
}
```

- インデックスの検索
curl -XGET "http://localhost:9200/{index}/_search"

- インデックスの検索（条件付き）
curl -XPOST "http://localhost:9200/blog/_search" @search.json
 
```search.jsonの中身
{
  "query": {
    "nested": { 
      "path": "comments",
      "filter": {
        "range": {
          "comments.date": {
            "gte": "2014-10-01",
            "lt":  "2014-11-01"
          }
        }
      }
    }
  },
  "sort": {
    "comments.stars": { 
      "order": "asc",  
      "mode":  "min",  
      "nested_filter": { 
        "range": {
          "comments.date": {
            "gte": "2014-10-01",
            "lt":  "2014-11-01"
          }
        }
      }
    }
  }
}
```

- バージョン確認
http://localhost:9200/

- テーブル定義確認
http://localhost:9200/{index}/_mapping

- インデックスをCloseする
curl -XPOST "http://localhost:9200/{index}/_close"

- インデックスをOpenする
curl -XPOST "http://localhost:9200/{index}/_open"

- 状態を確認
curl -XGET "http://localhost:9200/_cat/indices"
GitHubでリポジトリの特定の日付のコードにアクセスするURL

GitHubではブランチ名やSHAを指定してリポジトリのコードを表示できます。

- 特定のSHA指定: <https://github.com/tc39/proposals/tree/1626c4bef6d13bf870131d12e8a90b5350ab6978>
- 特定のタグ指定: <https://github.com/facebook/react/tree/v16.0.0>
- 特定のブランチ指定: <https://github.com/facebook/react/tree/15-stable>

このように特定の状態のリポジトリを見れますが、ある日付の状態を見ることもできます。
`リポジトリ/tree/HEAD@{2018-01-01T00:00:00Z}`のようにISO書式で日付を指定するだけです。
(HEADはなくてもいいみたい?)

- 特定の日付を指定: <https://github.com/tc39/proposals/tree/@%7B2018-01-01T00:00:00Z%7D>

これで任意の日付のファイルの状態を見れます。

[tc39/proposals: Tracking ECMAScript Proposals](https://github.com/tc39/proposals)のように同じファイルが定期的に更新されるものがある時に、日付ごとのスナップショットが簡単に取れるので便利でした。

[Refined GitHub](https://github.com/sindresorhus/refined-github)で見つけたやりかたで、公式のドキュメントがどこにあるかは調べてないです。
[cocoa][swift]MojaveのDark Mode

<p>Macintoshが革新的だったのは、白色背景に黒文字を表示したことだ。これは、macOSのAquaにも受け継がれたのだが、MojaveのDark Mode登場により状況が変わった。説明を信じれば集中したいときはDark Modeが適しているそうだ。</p>

<p>真偽はさておいて、Dark Modeに試してみて感じるのは、Dark Modeに完全対応していないアプリケーションが存在すると、画面が見苦しくなるということ。</p>

<p>今回の発表では、Dark Modeへの対応方法を駆け足で紹介してみる。</p>

<h1>lightとdark</h1>

<p>システム環境設定で、従来のlightとdarkは切り替えらる。ということは、切り替えに追従して表示を変更できるようにしないといけない、ということになる。</p>

![設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/251915af-9255-9c34-65ab-f94e8904431e.jpeg)

<h1>UI Element Colors</h1>

<p>ユーザインタフェースに使う色を直接記述してしまうと外観モードの切り替えに対応できないのは当然だ。NSColorではユーザインタフェースのために以下のような色指定を用意している。</p>

<ul>
<li>labelColor</li>
<li>controlColor</li>
<li>controlBackgroundColor</li>
</ul>

<p>また、Color Set assetを独自に定義できる。</p>

![asset.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/be6b7544-cbe1-b0fc-a065-64a48bfd17f3.jpeg)

<p>これを以下のように利用する。</p>

<pre><code>let aColor = NSColor(named: NSColor.Name("MyColor"))
</code></pre>

<p>以下は、色の定数を利用した例だ。</p>

<pre><code>override func updateLayer() {
   self.layer?.backgroundColor = NSColor.textBackgroundColor.cgColor
}
</code></pre>

【関連情報】
<a href="https://cocoa-kanto.connpass.com/event/101034/">Cocoa.swift 2018-10</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
私の未来予想図

### **テーマ: ホログラム教育**

##私の2050年を表す３つのキーワード
1.　ホログラム
2.　楽しみながら学ぶこと
3.　学生の関わり合い

##何の未来予想図
私の未来予想図のテーマはホログラム教育です。2050年に、私の見ることが教育はもっとハイテクになる、そして学生がホログラムを使うことができます。彼らは本やノートなどを使うことは必要じゃない、なぜならホログラムとやりとりすることができます。例えば、学生たちの話題は太陽系です。イメージだけが見える本と異なります、学生はズームインして、ホログラムを使って惑星をもっと近く見ることができます。そして、学生たちは歴史を勉強している、歴史的な人のホログラムは、クラスの前に表示され、それらと話をします。また、医学生は、人間の解剖学や神経系を勉強するときにもこれを使うことができます。ホログラム教育があるので、私はゲーム開発者として、３Dホログラムの教育ゲームを開発します。私が作ったゲームで遊んで笑顔になった学生たちをみたいです。

##学生たちを手伝いたい
多くの学生が勉強中に苦労しています。特に、数学と歴史。例えば、私は小学生と高校生のころ、暗記が嫌いでした。でも、歴史の授業でたくさんのことを暗記する必要がありました。本を読むことも好きじゃありませんが、フィリピンで高校生のころ、たくさん本をよむ必要がありました。だから、多分、他の学生も私の経験を感じています。そして、読むことより見ることの方がより簡単です。例えば、薔薇についての文章を読むだけでは、薔薇についてイメージすることが難しいです。でも、薔薇を実際に見と簡単にイメージできます。この方法は学生たちの興味をさらに引き立てる。

また、研究によると、「楽しみながら学んでる時はドーパミンが出ます。それが出ている時、より集中して早く学ぶことができます。」とのことです。もし、学生は3Dホログラムを使れば、彼らは楽しみながら学ぶことができます。なぜなら、ホログラムで別々のものを見て、やりとりすることができます。より多くの学生がホログラムを使って新しいアイデアを考えることができるので、大きな助けになるでしょう。

######研究のリンク：　https://kitesintheclassroom.com/your-brain-on-fun/


##未来予想のため、何をするか
最初はBIT卒業の後に日本のゲーム会社で働きます。それで、いろいろなゲーム開発の知識を学びます。例えば、2Dとか3DモデルとかAIを学びます。10年後は、フィリピンに帰って、自分の会社を作ります。日本のゲーム会社で働いた経験に基づいて、私の会社にその経験を実装します。後で、学生たちのために、いろいろなゲームを作ります。例えば、エンジニアになりたい人のため、3Dホログラムゲームで自分の建物や車を作ることができます。また、医学生の場合、ホログラムで練習として仮想手術を行うことができます。
【備忘録】日本語のワードクラウドを作る

日本語のワードクラウドを作るにはフォントのインストールが必要で少し手間がかかったのでメモ。

## 実行環境

Ubuntu 16.04
Python 3.6.2

## ワードクラウドのライブラリ
amuellerさんが公開している[word_cloud](https://github.com/amueller/word_cloud) ライブラリを使用

READMEに書いてあるとおりpip でインストール。

```shell

$ pip install wordcloud
```

## 日本語フォントのインストール

デフォルトのフォントでは日本語の表示ができないのでフォントを入れる。
[こちらの記事](https://qiita.com/yniji/items/3fac25c2ffa316990d0c) を参考にさせていただきました。

### フォントの入手

特にこだわりはないので
[Noto Sans CJK JP](https://www.google.com/get/noto/) をリンク先のサイトで探してダウンロードしてくる。

### フォントのインストール
[公式サイト](https://www.google.com/get/noto/help/install/)の通りインストールする。
シングルユーザとシステムワイドにインストールする方法があるけど、とりあえずシングルユーザにインストールする。

```
$ unzip NotoSansCJKjp-hinted.zip
$ mkdir -p ~/.fonts
$ cp *otf ~/.fonts
$ fc-cache -f -v # optional
```

## ワードクラウドを作る

### 入力データの準備
スペース区切りのテキストを与える方法や単語と出現頻度の辞書から作る方法などがある。
今回はMeCabを使って日本語をスペース区切りのテキストにする。

```python

from MeCab import Tagger
t = Tagger()
text = """
任意のテキストを入れる。
"""
splitted = " ".join([x.split("\t")[0] for x in t.parse(text).splitlines()[:-1]])
```

## WordCloudの作成

引数 `font_path` に先程インストールしたフォントを指定する。
また、デフォルトだと2文字以上の単語しか抽出してこないため、`regexp`を少し変えて1文字以上の語をすべて抽出するようにした。ただし、長い文になると助詞が大量に拾えてしまうため、品詞のフィルタリングと合わせて使った方が良い。

```python
import matplotlib.pyplot as plt
from wordcloud import WordCloud
wc = WordCloud(font_path="/home/TkrUdagawa/.fonts/NotoSansCJKjp-Regular.otf", regexp="[\w']+")
wc.generate(splitted)
plt.imshow(wc)
plt.show()
```
![test.png](https://qiita-image-store.s3.amazonaws.com/0/32245/04eb44cb-158f-cb7f-1306-4c017cc3e0d6.png)

以上でワードクラウドが作れた。
ちなみにYahooニュースのトップにあったノーベル賞受賞の記事から作ったワードクラウドが下記(助詞, 助動詞は除いた)。

```python

splitted = " ".join([x.split("\t")[0] for x in t.parse(text).splitlines()[:-1] if x.split("\t")[1].split(",")[0] not in ["助詞", "助動詞"]])
```
![nobel.png](https://qiita-image-store.s3.amazonaws.com/0/32245/ccf20c92-5db7-5ed3-cc58-ef320e10b5bd.png)

京都大の教授ががん治療に関するなにかをしたっぽいことがわかる。
swift4で異なる型のobserveをまとめてrxswiftでmergeする

今日はswift！

ボタンをタップされた時のイベントとか、UserDefaultsの情報が更新されたタイミングだとか、homeから戻ってきたタイミングだとか……そういう諸々のイベントが発生した時にobserveの入り口を一つにして処理させたいということがあったので、備忘録も兼ねて！

# それぞれの実行結果を引数として欲しい場合の実装例！

```merge1.swift
let o1 = NotificationCenter.default
    .rx.notification(.UIApplicationDidBecomeActive)
    .map { $0 as AnyObject }

let o2 = UserDefaults.standard
    .rx.observe(String.self, "hoge")
    .map { $0 as AnyObject }

Observable.merge(o1, o2).subscribe(onNext: { arg in
    // イケてる処理を書こう！
})
```

AnyObjectに変換させて、エラーにならないようにしています:heart_eyes:

# 追記 実行結果は必要ない場合の実装例！

```merge2.swift
let o1 = NotificationCenter.default
    .rx.notification(.UIApplicationDidBecomeActive)
    .map { _ in }

let o2 = UserDefaults.standard
    .rx.observe(String.self, "hoge")
    .map { _ in }

Observable.merge(o1, o2).subscribe(onNext: { _ in
    // イケてる処理
})
```

処理が簡潔になりました！
MacにEclipse(Photon)をインストールする方法

#Eclipseダウンロード
以下のサイトにアクセス
https://www.eclipse.org/downloads/packages/

<img width="1674" alt="Screen Shot 2018-10-01 at 22.09.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/277948/59b437a9-c171-caf1-a16d-3a1fa9f60321.png">

##Eclipse IDE for Java EE developersのMac Cocoa 64 bitを選択

<img width="1674" alt="Screen Shot 2018-10-01 at 22.13.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/277948/08ddb0d1-6bd1-2a25-bbaa-68f1a9833d58.png">

###すると以下の画面に遷移するのでダウンロードボタンを押下

<img width="1674" alt="Screen Shot 2018-10-01 at 22.14.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/277948/d7079df7-1cbe-f372-3ce4-98f0cf819fca.png">

###ダウンロードしたものをダブルクリック
####すると以下の画面になるので、EclipseのアイコンをApplicationにドラッグ&ドロップします。
<img width="882" alt="Screen Shot 2018-10-01 at 22.20.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/277948/e4c5896a-6f18-754c-173f-9f404045f976.png">

###ApplicationにEclipse.exeができるのでダブルクリックで起動


以上
Punditのscopeでネストしたリソースに対応する方法

Punditでネストしたリソースに対してscopeをかけたい時の話。
別の言い方をすると
PunditでURLに紐付いたリソースを使ってscopeしたい時の話。

# TL;DR
PunditのuserをUserContextクラスでラップして、与えたいものを先に入れてあげよう。

# 環境例
### routes.rb
``` routes.rb
resources :users
resources :magazines do
  resources :ads
end
```
### user.rb
``` user.rb
has_many :magazines
```
### magazine.rb
``` magazine.rb
belongs_to :user
has_many :ads
```
### ad.rb
``` ad.rb
belongs_to :magazine
```

# さあ、indexアクションでmagazineに紐付いてるad一覧を表示するぞ
`magazines/:magazine_id/ad` にアクセスした際に、URLで指定されたmagazineに紐付いているadだけが欲しい時に

### application_controller.rb
``` application_controller.rb
include Pundit
```
### ads_controller.rb
``` ads_controller.rb
class AdsController < ApplicationController
  def index
    authorize Ad
    @ads = policy_scope(Ad)
  end
```
### ad_policy.rb
``` ad_policy.rb
class AdPolicy < ApplicationPolicy
  attr_reader :user, :record

  def initialize(user, record)
    @user = user
    @record = record
  end
  
  def index?
    true
  end
  
  class Scope
    attr_reader :user, :scope

    def initialize(user, scope)
      @user = user
      @scope = scope
    end

    def resolve
      scope.where(magazine_id: 〇〇) ←あれ？どう書くの？
    end
  end
end
```
### あれ？ これは問題ですね…
- `user.magazines`…？ 指定できないなぁ。
- `@magazine`…？ 持ってこれないなぁ。
- 引数…？ Pundit公式 「`Pundit does not allow you to pass additional arguments to policies for precisely this reason.`」

URLの`:magazine_id`を渡したいだけなんだけど…あれれ？

# こーすれば、万事解決なのだ
PunditのuserをUserContextクラスでラップして、与えたいものを先に入れてあげよう！

### ads_controller.rb
``` ads_controller.rb
class AdsController < ApplicationController
  before_action :set_magazine #変更点

  class UserContext #変更点
    attr_reader :user, :magazine

    def initialize(current_user, magazine)
      @user = current_user #devise
      @magazine = magazine
    end
  end

  def pundit_user #変更点
    UserContext.new(current_user, @magazine)
  end

  def index
    authorize Ad
    @ads = policy_scope(Ad)
  end

  private
    def set_magazine #変更点
      @magazine = Magazine.find(params[:magazine_id])
    end
```
### ad_policy.rb
``` ad_policy.rb
class AdPolicy < ApplicationPolicy
  attr_reader :user, :record

  def initialize(user, record)
    @user = user.user #変更点
    @record = record
  end
  
  def index?
    true
  end
  
  class Scope
    attr_reader :user, :scope

    def initialize(user, scope)
      @user = user
      @scope = scope
    end

    def resolve
      scope.where(magazine_id: user.magazine.id) #変更点
    end
  end
end
```
こうすることで、Policyの中で見れるuser(名前が嫌なら各自で別のに変えてあげてください)はUserContextクラスのインスタンスとなり、そのインスタンスメソッドでuserとmagazineを呼べるようになります。
`user.user → Userクラスのインスタンス`
`user.magazine → Magazineクラスのインスタンス`
これで、指定したマガジンの広告だけを拾ってindexに表示させることができました！
めでたしめでたし

# 参考
- [Pundit](https://github.com/varvet/pundit)


# あとがき
Readme読んで、IPアドレスの時にしかできないかと思って30分無駄にしたのは内緒

これを書いている場所は[株式会社mofmof](https://www.mof-mof.co.jp) の社内です。
アジャイルなチームをレンタルしてくれる、goodな会社です。レンタルとは言うものの、客先常駐はせずにmofmof社内に常駐するスタイルを貫いているため、社員が皆仲良い！寂しくない！
人も募集中なそうなので、気になる方は応募してみては。
micropythonに置いたjsonファイルを読み込む方法

M5Stack上に置いたjsonファイルをconfigの用に扱いたかった。
テスト用に以下のようなjsonとコードを用意してテストしました。

```config.json
{
  "ssid":"test",
  "password":"password"
}
```

今回は`ampy push`でflash上においています。`ujson`というライブラリに読み込んだ文字列を引き渡す感じで実装してみました。

```main.py
import ujson
json = ujson.loads(open("config.json").read())
print(json)
print(json['ssid'])
print(json['password'])
```

上記のコードを`ampy run`で動かしてみると下のような出力が得られます。

```
{'ssid': 'test', 'password': 'password'}
test
password
```

というわけでconfig.json等をsdに入れることで、環境を簡単に差し替えて使えるようにすることができそうです。
dockerでyarn addすると遅い問題を改善する

# 概要というか結論
dockerで作った開発環境でyarn addをする時はcacheディレクトリもvolumesに指定しましょう。

# キャッシュの指定方法

まず、yarnのキャッシュディレクトリを調べます。

```shell
docker-compose run app yarn cache dir
```

表示されたディレクトリをvolumesで指定します。

```docker-compose.yml
version: '3'

services:
  app:
    image: node:alpine
    volumes:
      - .:${PWD}
      - yarn-cache:/usr/local/share/.cache/yarn/v2
    working_dir: ${PWD}

volumes:
  yarn-cache:
```

# 計測してみる

適当にyarn addをして計測してみます。

```test.sh
docker-compose run app yarn init -y
docker-compose run app yarn add -D firebase-tools
docker-compose run app yarn add vue
```

## volumesなし
volumesを指定しないとこんな感じです。
2つ目のyarn addはvueをインストールしただけなのに遅いですね。

```
Done in 25.24s.
Done in 15.61s.
```

## volumesあり
一旦ファイルを削除しvolumesを指定します。
再度テストしたところ2つ目のyarn addが明らかに速くなりました。

```
Done in 22.69s.
Done in 2.99s.
```

# その他
ちなみにnpmの場合はキャッシュ用にvolumesを用意しなくても、2つ目のインストールの速度は低下しませんでした。
が、やっぱりyarnの方が速いですね。

```
37.196s
5.472s
```

# 参考
https://yarnpkg.com/ja/docs/cli/cache
始めよう React（基礎編）！ Part 3 - create-react-app

本編では、すばやくReactの開発環境を作れるツールを紹介します。
#create-react-app とは
create-react-appはReactを創り出した、
Facebook社が作ったライブラリーにです。

create-react-appはReact開発時の配置を省略できますので、
Reactの開発ではかなり便利になります。

↓↓create-react-app公式のgitを添付します。
[create-react-app](https://github.com/facebook/create-react-app)
興味がある方読んでください。


#create-react-appを使う前
前章で話しました**Node.js**をインストールする必要があります。
[始めよう React（基礎編）！ Part 2 - 環境構築](https://qiita.com/ShowJs/items/aadcd389100145050f0c)
またインストールしていない方は上記URLに参考して下さい。

#create-react-appの使い方

###:one:インストール
　前章で紹介したNPMを使ってインストールします。
　こちらの　**-g**　は「グロバール」の　**g**　になります。
　-g でインストールしたら、そのままcreate-react-appのコマンドを使用できるようになります。

```
$ npm install -g create-react-app
```
:asterisk:**グロバールインストールとは**
・ローカルインストール（-gなし）
　1. 生成ファイル内の./node_modules配下にインストールします
　2. importを使って使用できます。
 
・グロバールインストール（-gあり）
　1. /usr/local　また　nodeのディレクトリにインストールします。
　2. そのままターミナルでインストールされたライブラリーのコマンドを使えます。


###:two:create-react-appでreactのウェブアプリケーションを作る
下記のコマンドを使えば、素早くreact環境のウェブアプリケーションを作れます。

```
$ create-react-app [ファイル名]
```
ファイルは下記のように生成します。
:one:インストール
![hello-react_00.png](https://qiita-image-store.s3.amazonaws.com/0/293426/ff980d35-d171-8711-6616-f7ffe744a225.png)

:two:使い方書かれてます。
![hello-react_command.png](https://qiita-image-store.s3.amazonaws.com/0/293426/5c1ed597-a10a-c31f-3224-c5950f8b002e.png)
:asterisk:**yarnとは（facebookにはこちらを推奨しています）**
　yarnはnpmと似てるようなパッケージマネージャーです。
　:arrow_down:興味がある方こちらをご覧ください。
　[yarn参考①](https://qiita.com/masterkey1009/items/50f95b1187646a7db385)
　[yarn参考②](https://qiita.com/tonkotsuboy_com/items/0242928ab32794d11f76)　
　[yarn参考③](https://qiita.com/senou/items/d939601e32c0005ebfe3)

:three:このようなファイル構成になります。
![hello-react_vs.png](https://qiita-image-store.s3.amazonaws.com/0/293426/6bef3a93-4a93-1d1d-aa7d-0892d296a516.png)

###:three:Reactで構成したウェブアプリケーションを動いて見よう
コマンドでインストールしたファイルのディレクトリに移動し、
下記のコマンド入力します。

```
$ npm start
```
または

```
$ yarn start
```

を実行すると基本的に`http://localhost:3000`に繋がります。
![hello-react_hello.png](https://qiita-image-store.s3.amazonaws.com/0/293426/908cbce3-fcf1-248e-ea10-3857d065d0e7.png)

Welcome to React表示したらReactを無事に実行しました。

#最後に
create-react-appは如何でしょうか。
かなりのスピードでreact環境を立ち上げることが出来ます。
ここまで読んで頂きまして、ありがとうございます。

次回は今回作ったファイルについて、よく使う部分を解析していきます。
興味がある方是非見てみてください！！
【変数】英単語の略し方や省略形を検索する【命名】

# はじめに
プログラムの中で、変数名がめちゃくちゃ長くなってしまった時とか、英単語をなんとか省略したくなる時があります。
例えば、`format → fmt` とか。
そんなときに使える、略語検索サイトを紹介します:mag:

# Acronym Finder（頭文字Finder）
世界最大級の頭字語、略語、頭字語の略語の検索サイト「[Acronym Finder](https://www.acronymfinder.com)」です:exclamation:
:link: https://www.acronymfinder.com
略語を入力すると、元の単語を表示してくれます。
サイトイメージはこちら :arrow_down:
赤枠の中に、略語を入力します。
![01_075.png](https://qiita-image-store.s3.amazonaws.com/0/188980/e5969077-f636-8181-bcae-bc9e1f0730b2.png)

# 使ってみる
試しに、「convert」という英単語を略してみます。
今、ぱっと思いついた略し方は次の３つ:arrow_down:

- cvt
- conv
- cnv

この３つのうち、正しい略し方はどれでしょうか・・・？

## cvt
発音のアクセントが、**コ**ン**バート**っていうイメージなので、アクセントから`cvt`を想像してみました。
検索結果はこちら :arrow_down:
![02_075.png](https://qiita-image-store.s3.amazonaws.com/0/188980/586ed19c-4d68-8bcb-67b7-b7def79964f4.png)
53件ヒットしました。
長くなるので、画面キャプチャは下の方を切ってしまいましたが:sweat_drops:、この画面の中に元の形`convert`は見つかりませんでした。
よって、`cvt`という略し方はNGです。

## conv
linuxで文字コードを変換するコマンドに`iconv`というのがあります。
ここからヒントを得て`conv`を思いつきました。
結果はこちら:arrow_down:
![03_060.png](https://qiita-image-store.s3.amazonaws.com/0/188980/4a5e60b0-7e64-b0a8-305d-8ad92ea742e5.png)
８件見つかりました！
しかも、「変換する人」という意味の「converter」が上から４番目に星５つで入っています:star:
これは、おおむね正しい省略形とみてよいでしょう:smile:

## cnv
`conv`があるなら、母音を抜いた形でもイケるのでは？と思い、試してみました。
検索結果はこちら:arrow_down:
![04_060.png](https://qiita-image-store.s3.amazonaws.com/0/188980/644d837e-da3c-3ffa-9f18-bfc19f1b0978.png)
16件見つかりましたが、それっぽい単語は見当たりませんでした。
（すみません、これも下の方切っちゃってます:scissors:）
星３つでそれっぽい単語「Conveyor」がありましたが、これは「伝える人」という意味なので、なんかちょっと違う気がします・・・。
よって、`cnv`も略し方としてはNGな感じです。

# まとめ
案件の中でも、人それぞれ略し方の癖があると思いますが、この:link:[Acronym Finder](https://www.acronymfinder.com)を使えば、ほぼ間違いのない略語を作れると思います。
例え「それなんかおかしくない～？」って言われても、このサイトを見せたら、きっと納得してもらえる・・・はず！
Botoを使用してPythonからAWSを操作する（入門編）

#はじめに
BotoはPython用のAWSのSDKである。Botoを使用することで、Amazon S3やAmazon EC2をPythonから操作することができる。

#インストール

pipを使用してboto3をインストールする。

```
pip install boto3
```

#準備
~/.aws/credentialsを以下のように作成する。

```
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
```

aws_access_key_idとaws_secret_access_keyはAWSマネジメントコンソールのIAMから作成できる。今回の例では、アクセス権限はAmazonS3FullAccessのみ追加した。

#実行
以下を実行すると、Amazon S3のバケット一覧が得られる。バケットを一つも作成していないと何も出力されないので、事前に作成しておく。

```
import boto3

s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
    print(bucket.name)
```
数学力で解くプログラミングパズル5選

数学とアルゴリズムの力で解くプログラミングの問題です。

* 全てプログラミングで解くことを想定した問題です。
* 正答を出力するコードを書いて下さい。
* 適切なアルゴリズムでコードを書けば、標準的なコンピュータで数秒以内の実行時間で正解が出せます。
* 作成者は [ideone](https://ideone.com/) にて python で 1 秒未満で正解できることを確認しています。

コメント欄やブログでのネタバレ等はご自由に…。

# A. 超階乗

自然数 n の階乗（n!）は、1 から n までの自然数の積と定義されます。
　n! = 1×2×3×・・・×n

自然数 n の「超階乗」を「1 から n までの自然数の階乗の積」と定義します。
これを n$と書き表します。
　n$ = (1!)×(2!)×(3!)×･･･×(n!)

例えば、4$ = 288 です。
　4$ = (1!)×(2!)×(3!)×(4!) = 1×2×6×24 = 288

さて、4$が、3 で何回割り切れるかを考えてみましょう。
　288 ÷ 3 ＝ 96
　96 ÷ 3 ＝ 32
ですから、4$は 3 で最大 2 回割り切れます。
同様に、10$は、3 で最大 17 回割り切れることが確かめられます。

10<sup>9</sup>$（10 億の超階乗）は、3 で最大何回割り切れるでしょうか？

# B. 禁止数字

次の条件を満たす正の整数を⼩さい順に並べて数列を作ります。
　「どの桁にも 0, 1, 2, 3 が表れない。」

つまり、下のような数列です。
　4, 5, 6, 7, 8, 9, 44, 45, 46, 47, 48, 49, 54, 55, ...

この数列の 30 番⽬の項は 79 であることが確かめられます。

この数列の 10<sup>9</sup> 番⽬の項を求めて下さい。

# C. 多段べき乗

0 以上の整数 n に対し、数列 F(n) を次の漸化式で定義します。
　F(0) ＝ 1
　F(n+1) ＝ 3<sup>F(n)</sup>

つまり、下のような数列です。
　1, 3, 27, 7625597484987,  ...

F(10<sup>9</sup>) の下 6 桁を求めて下さい。

# D. 白黒連

⽩と⿊のマークを⼀列に並べます。
このとき、もっとも⻑い⿊の連続した個数を考えましょう。
例えば次の並べ⽅では、もっとも⻑い⿊の連続した個数は 4 個です。
　◆◆◆◆◇◆

次の並べ⽅では、もっとも⻑い⿊の連続した個数は 3 個です。
　◇◇◆◆◆◇◆◇◇◆◆◆◇◆◆

6 個を並べるとき、もっとも⻑い⿊の連続した個数が 4 個となるような並べ⽅は、全部で 5 通り
あります。
　(1) ◆◆◆◆◇◆
　(2) ◆◆◆◆◇◇
　(3) ◆◇◆◆◆◆
　(4) ◇◆◆◆◆◇
　(5) ◇◇◆◆◆◆

自然数 n, m に対し、n 個のマークを並べるとき、もっとも⻑い⿊の連続した個数が m 個となるような並べ⽅の数を F(n, m) と定義します。
例えば、F(6, 4) = 5、F(12, 3) = 1167 であることが確かめられます。

F(10<sup>5</sup>, 10<sup>4</sup>) の下 6 桁を求めて下さい。

# E. 最小公倍数

最⼩公倍数とは、2 つの整数の共通の倍数のうち最⼩のものです。
例えば、6 と 8 の最⼩公倍数は 24 です。

最⼩公倍数が 24 になるような数の組 (a,b) を考えましょう。
a≦b のとき、そのような組は全部で 11 組あることが分かります。
　(1,24) (2,24) (3,8) (3,24) (4,24) (6,8)
　(6,24) (8,12) (8,24) (12,24) (24,24)

自然数 n に対し、a≦b のとき、最⼩公倍数が n!（n の階乗）となるような組 (a, b) の個数を F(n) と定義します。
例えば、F(4) = 11、F(6) = 68 であることが確かめられます。

F(10<sup>5</sup>) の下 6 桁を求めて下さい。
Google Fontsに日本語WEBフォントが正式追加された話

先日、Google Fontsに日本語WEBフォントが正式追加されたようです。
WEBフォントを使用すると、どんなデバイスでも、どんなブラウザでも、同じフォントを使用することができるので良いですよね。（自分は使いたい派ですｗ
というわけで、ちょっと紹介を。

# 追加された日本語WEBフォント
追加されたのは下記８種です。（早期アクセスで提供されていたものとは少し違うらしい。

* Noto Sans JP
* Noto Serif JP
* M PLUS 1p
* Sawarabi Mincho
* M PLUS Rounded 1c
* Kosugi Maru
* Sawarabi Gothic
* Kosugi

フォントの公開ページは下記です。
[https://fonts.google.com/?subset=japanese](https://fonts.google.com/?subset=japanese)

サンプルで表示してみるとこんな感じ。（下記はキャプチャした画像です。
自分は *Kosugi Maru* とか気に入ってますｗ

![日本語WEBフォント.png](https://qiita-image-store.s3.amazonaws.com/0/272546/ba59581f-1bbd-d203-a9e2-cef8b5ff3488.png)

# 気になるファイルサイズ(ダウンロードサイズ)は？
WEBフォントの欠点は、やはりフォントをダウンロードしないといけないという点だと思います。
キャッシュしてしまえば都度ダウンロードされることはないとはいえ、やはり気になりますよね。
というわけで、サクッと調べてみました。（簡単にブラウザの開発ツールで見ただけですｗ

## CSSファイル
まずは各フォントのCSSファイルですが、これは各フォント共通で **25KB** 程でした。
![WEBフォントCSS.png](https://qiita-image-store.s3.amazonaws.com/0/272546/5c3d4f3d-2bf6-5870-12c8-b976614c5638.png)


## Noto Sans JP
大きいもので **48KB** 程度、だいたい1ファイル **40KB** 前後といったところ。
![Noto Sans JP.png](https://qiita-image-store.s3.amazonaws.com/0/272546/249c6560-1eaf-df2d-5ae2-a06f8c56ec71.png)


## Noto Serif JP
大きいもので **60KB** 程度、だいたい1ファイル **55KB** 前後といったところ。
![Noto Serif JP.png](https://qiita-image-store.s3.amazonaws.com/0/272546/50950b55-1a29-9aab-7b92-fc3272d3a574.png)

## M PLUS 1p
大きいもので **22KB** 程度、だいたい1ファイル **18KB** 前後といったところ。
![M PLUS 1p.png](https://qiita-image-store.s3.amazonaws.com/0/272546/49838a1c-f32c-c146-18ae-2fd988f1814b.png)

## Sawarabi Mincho
大きいもので **30KB** 程度、だいたい1ファイル **25KB** 前後といったところ。
![Sawarabi Mincho.png](https://qiita-image-store.s3.amazonaws.com/0/272546/05d414b6-a0c8-64b9-44a7-2bdb50ddb8b5.png)

## M PLUS Rounded 1c
大きいもので **28KB** 程度、だいたい1ファイル **22KB** 前後といったところ。
![M PLUS Rounded 1c.png](https://qiita-image-store.s3.amazonaws.com/0/272546/c79422a5-281b-14da-f4ec-c230d8a1b76b.png)

## Kosugi Maru
大きいもので **28KB** 程度、だいたい1ファイル **22KB** 前後といったところ。
![Kosugi Maru.png](https://qiita-image-store.s3.amazonaws.com/0/272546/65c6f82d-f485-13f8-7b77-61d4726af637.png)

## Sawarabi Gothic
大きいもので **28KB** 程度、だいたい1ファイル **22KB** 前後といったところ。
![Sawarabi Gothic.png](https://qiita-image-store.s3.amazonaws.com/0/272546/04962072-c813-4ff8-8d4f-ff94c52806ff.png)

## Kosugi
大きいもので **22KB** 程度、だいたい1ファイル **20KB** 前後といったところ。
![Kosugi.png](https://qiita-image-store.s3.amazonaws.com/0/272546/11ce56d3-3503-cc78-4e49-2be433ea437c.png)

# フォントファイルは分割されている
上記フォントファイルのダウンロードを見ると、フォントファイルは1ファイルではなく、数ファイルダウンロードされているのが分かると思います。
これは、なるべくダウンロードサイズを減らすためにフォントを分割し、必要に応じてダウンロードする仕組みになっているのだとか。(20分割？)
全てのフォント(文字種)を使うことはまず無いと思うので、4～10ファイルぐらいで見積もっておけば良いのではと思います。
10ファイルで見積もって **240KB ～ 420KB** といったところなので、なんとか実用には耐えうるのではないでしょうか。