OmniAICreator/Qiita-1.07M huggingface dataset:
GAE pushキューのタスク実行レート制御について

GAEのpushキューではタスク実行レート制御に「トークンバケット方式」を採用している。
実際に利用してみると想定通りの動作をしてくれなかったので、調査してみました。

## 試行環境
- GAE Standard Environment
- Scala2.12

## トークンバケットとは
ネットワークに流れるトラフィックを一定量以下になるように調整するアルゴリズムです。

## まず動かす

まずはbucket_size=5で rate=5/mのqueueを作成

```yaml:queue.yaml
queue:
- name: gae-study-push-queue
  mode: push
  rate: 5/m
  target: gae-study
  bucket_size: 5
  retry_parameters:
    task_retry_limit: 1
```

- bucket_size:トークンを保持できる最大数
- rate:タスクを処理する頻度で、単位はsが秒、mが分、hが時間、dが日を表します。例えば5/mという値はタスクが1分あたり5回のレートで処理されることを示します
- max_concurrent_requests:キューから同時に実行できるタスクの最大数(default:1000)


```xml:appengine-web.xml
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application>XXXXXXX</application>
    <module>gae-study</module>
    <version>app001</version>
    <runtime>java8</runtime>
    <threadsafe>false</threadsafe>
    <instance-class>F1</instance-class>
    <automatic-scaling>
        <!--https://cloud.google.com/appengine/docs/standard/java/config/appref?hl=ja#scaling_elements_automatic_scaling-->
        <min-idle-instances>0</min-idle-instances>
        <max-idle-instances>1</max-idle-instances>
        <max-concurrent-requests>30</max-concurrent-requests>
        <max-pending-latency>10s</max-pending-latency>
        <min-pending-latency>4s</min-pending-latency>
    </automatic-scaling>
    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>
</appengine-web-app>
```

### Taskで行う処理
```scala:Hello.scala
package com.gae.study

import skinny.micro.WebApp

trait Hello extends WebApp {
  get("/sayhello") {
    val key = params("key")
    val message = s"Hello, key => $key!"

    logger.info(message)

    Thread.sleep(5000) // 5秒待機

    message
  }
}
```

### 予想
`gae-study-push-queue` にタスクをいっきに7件追加したらどうなるか。
bucket_size=5でrate=5/mなので

1. まず最初の1分間で5件のタスクを処理
2. 次の1分間で残りの2件のタスクを処理

よって、全体で約1分ちょいかかる見込み

### 実行結果
![process_log.png](https://qiita-image-store.s3.amazonaws.com/0/81313/3c0608d4-79b5-e716-a3fa-2c07d9cdfc11.png)

`30秒` で全処理が完了。。。rate=5/mなのに1分間に5件以上処理をしているのでは???

最初の5件は想定通り、13:58:47〜48で受付されており、
6件目は13:58:59に受付
7件目は13:59:11に受付
なので、初回から12秒後に6件目、さらに12秒後に7件目が受付されている

イメージ的には以下のような感じです。
![token_budget.gif](https://qiita-image-store.s3.amazonaws.com/0/81313/4610e93e-9935-7776-d0f7-97c8ef0e5a2a.gif)

### 結論
最初は5個のトークンが存在するため、1分間で5件以上のタスクが処理されているように見えるだけで
基本的にはrateが5/mの場合、タスクは1分あたり5回のrateで処理される。
ただ、トークンが補充されるタイミングは1分後にいっきに補充されるのではなく、rateが5/mであれば、60秒/5=12秒おきに1個ずつ補充されていく。rateが10/mであれば、60秒/10=6秒おきにトークンが1個ずつ補充されていくといった動きになる。
静的サイト用の Webpack4 boilerplate を作った

### はじめに
この記事は、 [UUUM Advent Calendar 2018](https://qiita.com/advent-calendar/2018/uuum) 23日目の記事です。

### TL;DR
 - HTMLとJSとCSSをまとめずに、個別に出力するWebpack4の設定を書いたよ
 - ES6, SCSSのコンパイルと、生成HTMLにjs/cssのinline injectはやってくれるよ！
 - ファイルから勝手に生成するから、webpackに追記は必要無し！
 - テンプレートエンジンはejsだよ
 - とはいえディレクトリ構造はわりと自由なので、共通ファイルの置き場所とか好きにしてね
 - 完成品はこちら
    - https://github.com/rascate/webpack4-boilerplate-static-separated

### 動機

Webpack4のboilerplateで、VueとかReact使えないとかSPA要件無しでピンポイントに合ったものがみつからなかった。
VueとかReactとかSPAとかちょっとしたことを一切したくない（できない）場合、
ちょっと古い作りでやる必要があるときなどにwebpack設定を使い回したかった。

## ディレクトリ構造

```bash
├── README.md
├── dist - 出力先
│   ├── css
│   │   ├── index.css
│   │   └── page1.css
│   ├── js
│   │   ├── index.js
│   │   └── page1.js
│   ├── index.html --- C
│   └── page1.html
├── package.json
├── src
│   ├── partial --- templateから読み込みたいejsファイルを置くところ
│   │   └── partial.ejs
│   ├── js --- templatesの方とファイル名を合わせる必要がある、ない場合はjsが入らないだけだからなくてもよい
│   │   ├── index.js  --- B
│   │   └── page1.js
│   ├── scss --- ファイル名はなんでもいいよ、jsでインポートするかhtmlで読み込むかして使ってね
│   │   ├── a.scss
│   │   └── b.scss
│   └── templates --- ここの構造がそのまま配信するときの生成htmlになります
│       ├── index.ejs  --- A
│       └── page1.ejs
├── webpack.config.js
└── yarn.lock
```

src/templatesにあるejs(A)に対して、同名のjsファイルがsrc/jsにある場合(B)に、
そのejsに対してコンパイルしたjsを自動的にinjectしたhtmlを生成して、distディレクトリの直下に出力します(C)。

こんなejs

```src/templates/index.ejs
<!DOCTYPE html>
<html>
<head>
    <title>hi</title>
</head>
<body>
test
<% include ./src/partial/partial %>
<img src="<%- require("../images/example.jpg") %>" class="hidden_image">
</body>
</html>
```

があって、こんな同名のindex.jsがある場合

```src/js/index.js
import "../scss/index.scss";

const test = "aa";
console.log(test);
```

こんなhtmlがdist直下に出力されます。
(**jsとcssはそれぞれコンパイルされて別々に出力される**)

```dist/index.html
<!DOCTYPE html>
<html>
<head>
    <title>hi</title>
<link href="css/index.css" rel="stylesheet"></head>
<body>
test
<p>ejs templating </p>
<img class="text" src="images/example.jpg" alt="">
<script type="text/javascript" src="js/index.js"></script></body>
</html>
```

~~Gulpでよくない？~~

### 公開方法
zeitの[now](https://zeit.co/now)がめちゃくちゃ早くておすすめ！
登録してcliツールまでインストールされたら

```
yarn build
now dist
```

で速攻でデプロイできます！

### いつ使える？

ちょっとした静的サイトとか、LPに毛が生えたやつとかを作るとき


### 課題
 - scssをいちいちjsからインポートするのがダルい
 - 新規ファイル追加したときにHMRが動かない
 - いちいちjsファイルとejsファイルを作成するのがダルい
 - 共通なscssとか、jsとかをいちいちインポートするのがダルい
 - ２階層以上のurlに対応してない
 - ejsの中の別ejsをincludeするときのpath解決
 - ejsの中の画像パス指定にrequireしないといけない

ここらへんを解決したver２を現在誠意作成中です。
できたら記事を上げます！
【TIC-80】ゲーム作って公開するぞ！（したぞ！）

「[TIC-80](https://tic.computer/create)」で制作したゲームを「[VOICEゲームジャム2](https://itch.io/jam/voicegamejam2)」に参加して公開しました！

「ZUNDARIS」
https://uokagi.itch.io/zundaris
Win用実行形式ファイルとhtml版

![QIITA_s.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/eccd1f0d-95e1-f259-4808-57feb6a43dbe.gif)

![ZUNDA_demo_s.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/d6b15e13-85f8-30d0-c5f0-75caef083e22.gif)

よかったこと

- 1つのゲームを完成、公開までできたこと（初めて）
- 予定していた機能は概ね実装できたこと

ダメだったところ

- 本来はゲームジャム期間開始から作り始めるべき（今回は事前準備フライングOKとはいえ）
- 音関係、マウス操作が実装できなかったこと
- クリア判定という最も基本的なところにバグがあったこと（修正済）


TIC-80でひらがな表示するコードを抜粋して載せておきます。
濁音、半濁音などは2行で表示します。
（がっつりドット打ち＆ハードコーディング）

```kana.lua
KANA={
	['a']={176},['i']={177},['u']={178},['e']={179},['o']={180},
	['ka']={181},['ki']={182},['ku']={183},['ke']={184},['ko']={185},
	['sa']={186},['si']={187},['shi']={187},['su']={188},['se']={189},['so']={190},
	['ta']={191},['ti']={192},['chi']={192},['tu']={193},['tsu']={193},['te']={194},['to']={195},
	['na']={196},['ni']={197},['nu']={198},['ne']={199},['no']={200},
	['ha']={201},['hi']={202},['hu']={203},['he']={204},['ho']={205},
	['ma']={206},['mi']={207},['mu']={208},['me']={209},['mo']={210},
	['ya']={211},['yu']={212},['yo']={213},
	['ra']={214},['ri']={215},['ru']={216},['re']={217},['ro']={218},
	['wa']={219},['wo']={220},['nn']={221},
	['xtu']={222},['xya']={223},['xyu']={224},['xyo']={225},
	['"']={230},[',']={228},['.']={229},[' ']={0},['[']={237},[']']={238},
	['!']={239},['?']={240},['-']={241},
	['ga']={181,226},['gi']={182,226},['gu']={183,226},['ge']={184,226},['go']={185,226},
	['za']={186,226},['zi']={187,226},['ji']={187,226},['zu']={188,226},['ze']={189,226},['zo']={190,226},
	['da']={191,226},['di']={192,226},['du']={193,226},['de']={194,226},['do']={195,226},
	['ba']={201,226},['bi']={202,226},['bu']={203,226},['be']={204,226},['bo']={205,226},
	['pa']={201,227},['pi']={202,227},['pu']={203,227},['pe']={204,227},['po']={205,227},
	['xa']={232},['xi']={233},['xu']={234},['xe']={235},['xo']={236},
	['la']={232},['li']={233},['lu']={234},['le']={235},['lo']={236},
	['HO']={242},['KO']={243},['KI']={244}
}
function kana(txt,x,y,scale)
	local x,y,s=x or 0,y or 0,scale or 1
	local i,j,n=1,1,1
	while(i<=#txt)do
		local ks=string.sub(txt,i,j)
		local kid=KANA[ks]
		if kid then
			spr(kid[1],x+(n-1)*8*s,y+8*s,13,s)
			if kid[2] then
				spr(kid[2],x+(n-1)*8*s,y,13,s)end
			i=j+1
			j=i
			n=n+1
		else
			j=j+1
			if (j-i)>2 then
				i=j end end end end

kana("nanika botann ositene",20,48,2) -- 使用例

```

![kana2.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/d252c816-9942-74b4-c6e5-f6ce03408828.gif)
MacbookAir2018年版での電源投入挙動制御

みなさまおはようございます。
ずっと寝たいのに、起きてしまいます(数年前からの仕様変更が原因です)。

というのは、MacbookAirの最新版が数ヶ月前に発売され、指をくわえて眺めていたところに、バイト先を見つけたことにより、働く前に購入するというアホなことをしたためです。
(意味がわからないか)

さっそく本題

# MacOSの挙動変更
電源を切ったはずなのに、蓋をあけたら電源が投入され、勝手に起動されてしまった。
最初はスリープモードで蓋を閉じたと思っていたが、どうやら勘違いではなかった。

[Mac の電源を入れる (起動する)](https://support.apple.com/ja-jp/HT201150 "Appleの公式Helpページ")

<img width="825" alt="SupportApplecom.png" src="https://qiita-image-store.s3.amazonaws.com/0/82414/b731c8ee-4c5c-822e-b8c5-cb378a1c41ea.png">

蓋を開ける度に`おはようございます`と言わんばかりに起動する。
そして、今までのような、起動音はなくなったようだ。

音はともかく、かなり困った。
電源を切ったのだから人間様の指示通りに、切れたままにしておけ。
私が切れるぞ。

ということで、対処

# 電源投入を手動に切り替える
電源ボタン押下にて、電源が投入されるように変更するには、ターミナル画面から変更する必要がある。

```macos:ターミナル
sudo nvram AutoBoot=%00
```

末尾の数字を`00`にすることで、望んだ結果が得られる。

<img width="365" alt="prompt.png" src="https://qiita-image-store.s3.amazonaws.com/0/82414/efff0adb-8c83-f02e-1796-afab066ae524.png">

そして、この数字を`03`にすることで、戻せるようだ(未検証)。



# 結果
望んだ結果が得られた。
しかし、蓋を開いた時に、電池残量が表示されるようになってしまった。
結局蓋の挙動をどこかで監視しているということなのだろう。

![残尿.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/2413ed22-01ea-7fd5-0134-d2140e52279f.jpeg)

Apple独自のCPUによるセキュリティ機能が働いているとかいないとか・・・。
私も社会に出て働こう。





今回は、MacbookAir2018年版だったが、数年前かららしい。
もちろん、2018年版のMacbookProはこの挙動が標準の挙動になっている。





# 余談
今回の挙動で、本来の目的が解消されると思っていた。
その目的というのが、セキュリティ向上について。


ログイン時に、パスワードを入力するのは当たり前として、ユーザ名の入力もできるようにしたかった。

<img width="452" alt="目的.png" src="https://qiita-image-store.s3.amazonaws.com/0/82414/f6018625-c57a-06cd-184b-3a2675b73905.png">

しかし、なぜか**ユーザのリスト**が表示され、**名前とパスワード**の入力ができない。
なんのためのオプションなのか・・・。
`FileVault`を有効にしているのが原因か(その可能性は高いが、切るわけにはいかないよね)。









以上。
Power BIでの移動体データの可視化


# 移動体データの可視化
### 最近、MaaSサービスの企画・検討のため、移動体データの分析や活用ニーズが高まってきている。今回はPower BIを使った移動体データの可視化、分析を行う。

## なぜ、移動体データの分析・活用が必要か？
### 1.MaaS（モビリティ・アズ・ア・サービス）型のサービス
##### MaaS は、ICT を活用して交通をクラウド化し、公共交通か否か、またその運営主体にかかわらず、マイカー以外のすべての交通手段によるモビリティ（移動）を 1 つのサービスとしてとらえ、シームレスにつなぐ新たな「移動」の概念である。
##### 利用者はスマートフォンのアプリを用いて、交通手段やルートを検索、利用し、運賃等の決済を行う例が多い。

### 2.具体的には・・・
##### 携帯電話やカーナビなどの位置情報を利用したサービス。移動しながら利用する。外や街中で利用するサービス。

### 3.今の事例
##### 自動運転・VICS・バス運行情報・Uber・Pokemon Go・ナウキャスト　とか。動きながらサービスするもの。B to Cだけでなく、C to C 的なサービスもある。

### 4．移動体
##### 移動するもの：電車・バス・車・バイク・自転車・人・天気（雨雲、台風）

# 移動体データ概要
### 本来なら車などのデータを使った分析ができればいいのであるが、取得に難しいため、今回はマラソンランナーのデータという事で、私が走った以下２つのレース。東京マラソン・湘南国際マラソンを比較し、分析を行ってみる。

|レース |東京2014      |湘南国際2018      |
|:------------------:|:-----------------:|:-----------------:|
|データ取得           |GPS Watch      |Fitness Watch      |
|データ形式           |GPX(XML)           |TCX(XML) |
|データ項目           |時刻,緯度,経度,標高|時刻,緯度,経度,標高,距離,心拍数|
|データ粒度           |2秒～30秒間隔|1秒間隔|

# データ下処理
##### ２つのレースで取得したGPX、TCXファイルが持つデータ項目が異なるため、下処理として、GPXの緯度経度データから、走行距離を算出したが、GPSの誤差のため、大きなズレが発生するため、一度計算を行ってから、フルマラソンの距離にて補正をおこなう。
##### 緯度経度から距離の算出処理についてはいくつか方法があるようだが、精緻な検証が難しいため、省かさせていただく。

# データモデル
##### ファクト(集計値)は移動体データ、ディメンジョン(分析軸)は距離マスタ、時間マスタ、マラソン基本情報マスタのスタースキーマ モデル作成。
![図スタースキーマ.png](https://qiita-image-store.s3.amazonaws.com/0/108328/06247dfc-b7f1-41b8-1e66-f0d0cec9ded7.png)

# 使用するビジュアル
##### Power BIの標準の「縦棒グラフ」、「折れ線グラフ」、「マップ」を使用。
##### 時系列での動きのある分析については、Custom Visualの「[Play Axis](https://appsource.microsoft.com/en-us/product/power-bi-visuals/WA104380981?tab=Overview)」を組み合わせて使用。

# 以下の可視化、分析を行う。
### [サンプルレポートURL（全５頁構成）](https://app.powerbi.com/view?r=eyJrIjoiYWJhOGMyYWYtYjJmYS00YzRhLTg5NTYtNGQ1NzA0MjU3ODZiIiwidCI6IjNkMGMxMTdmLTBjY2MtNDcxYy1hMzkzLTNmYjAxMjg1YjIwMyIsImMiOjEwfQ%3D%3D)

### 時刻×走行距離、区間別×時間、位置分析をさらに時系列で動かすため、Custom Visualの「Play Axis」の再生ボタンを付けたレポートを用意したので確認してほしい。

##### ※湘南国際マラソン（緑色グラフ）の9キロポストと、21キロポストについては、異常値に見えるが、ピットインにてタイムロスが発生したため、値は正しい。
<img width="940" alt="①キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/108328/8e11b78b-60b8-c80a-215e-9ac4a6d0b39a.png">
<img width="942" alt="②キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/108328/5b7cc35d-ffd9-cff4-ce2a-8d075e80beb8.png">
<img width="939" alt="③キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/108328/4a16dc45-0577-228b-5d3c-f09f980f033d.png">

# 分析にてわかったこと
### マラソン初心者であるが、分析により、以下のことが分かった。
### 1．湘南国際マラソン（緑色）は２度のピットインが影響したため、東京マラソン（黒色）に比べ遅れが発生。
### 2．35キロ地点～ゴールまでは、過去の東京マラソンに対して、追い上げている事がわかる。
### 3．２度のピットインでのタイムロスが無ければ、過去の東京マラソンの記録を更新事がわかる。


# 最後に
### Custom Visualの「[Play Axis](https://appsource.microsoft.com/en-us/product/power-bi-visuals/WA104380981?tab=Overview)」は、動的にディメンジョンデータを動かすことが可能。今回の時系列ディメンジョンのほかに様々な活用ができると思いますので、是非、いろんな分析に活用してみてください。
Ethereumのスマートコントラクトのオーディット

こんにちは、サム （[@sbenemerito](https://twitter.com/sbenemerito)） です。奥多摩の留学生です。日本語とブロクチェーン技術を勉強しています。２０１８年１０月に日本にフィリピンから来ました。

この記事で、Ethereumのスマートコントラクトのオーディットについて話します。

## 問題
![image.png](https://qiita-image-store.s3.amazonaws.com/0/300933/bbbbd82b-fc02-1664-29f4-0492fbae2018.png)

現在、ブロックチェーンに関連した多くのハッキング事件が発生しています。その理由は、Ethereumブロックチェーン自体は改ざんされにくいですが、スマートコントラクトや、そのプログラムは必ずしも安全とは言えません。

### DAOハック（2016年）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/300933/4d6e7832-163e-5aa1-c1dd-87cbe8ba37d3.png)

DAOのスマートコントラクトには、「Reentrancy」という脆弱性があり、およそ80億円を盗まれる事件がありました。

Reentrancyについて、[このリンク](https://github.com/trailofbits/slither/wiki/Vulnerabilities-Description#reentrancy-vulnerabilities)でもっと読むことができます。


## 解決
ブロックチェーン業界では、その問題に対して、「スマートコントラクトオーディット」と呼ばれるシステムで対処しようとしています。

## スマートコントラクトオーディットとは

![image.png](https://qiita-image-store.s3.amazonaws.com/0/300933/cb569478-7cf9-b5a8-b2c3-362e678b5f8e.png)

オーディットとは、「監査」を意味しています。それで、スマートコントラクトのコードの脆弱性を見つけることができます。そして、その脆弱性を直することができます。今のところ、[Quanstamp](https://quantstamp.com/)や[Sooho](https://www.sooho.io)のような、いくつかのサービスがあります。また、[Mythril](https://github.com/ConsenSys/mythril-classic)や[Slither](https://github.com/trailofbits/slither)のようなフレームワークがあります。

## まとめ
スマートコントラクトの安全はすごく大事なことです。スマートコントラクト開発者として、そんなことを意識するほうがいいと思います。そのために、今のところ、いくつかのサービスがあります。どれで、ブロックチェーン上のコードは信頼できます。
IoTLT初参加から一年経ってもIoTが理解できないことを非ITド素人が報告します。

#はじめに
[IoTLT Advent Calendar 2018 mitz](https://qiita.com/advent-calendar/2018/iotlt_mitz "Qiita")22日目ですね。ギリギリの更新。今日は早川が担当します。皆さまのとても有意義な記事をしっかり読むためにもここいらでいったん休憩しませんか？ちなみにQiitaで記事を書いたことがなかったのでめちゃくちゃ読みづらいと思います。余裕があったら直します。

#誰だよ
普段はITとかそれっぽい業界には片足も小指もつっこんでおらず（？）水産食品メーカーのOLをやっています。人材営業・カウンセラー、フリーター、私大助手なども水たまりレベルに浅～～～く経験アリ。

#IoT(IoTLT)との出逢い
たまたま知人に紹介を受け「IoTとか知らんけど行ってみようかな」と参加したのが昨年の12/26でした。さぞかし暇だったんでしょうね！
1/23には[Nefry BT初心者向けIoTハンズオン #nefry](https://dotstudio.connpass.com/event/76072/?utm_campaign=event_reminder&utm_source=notifications&utm_medium=email&utm_content=title_link)に参加し、それを機に2/14にIoTLT登壇して「IoTの分からなさと[わみさん](https://twitter.com/wamisnet)が如何にやさしいか」をお伝えしました。
![カバー写真.jpg](https://qiita-image-store.s3.amazonaws.com/0/309193/a873ce79-0720-266f-f989-003cdfbce9bf.jpeg)


#IoTLTを知ってから一年近く経つけど別にIoTのことは理解できない

登壇したのは良いんだけどお察しのとおり別にIoTLTに参加し続けるくらいじゃIoTのこと理解できない。何から調べたら良いの？こんなにあなたのこと知りたいのに…！！片想いってずっと続くとつらいじゃないですか。知らんけど。

じゃあ一体なぜ分からないのか？何がどう分からないのか？ってこれが分かっていたらもう結構理解できるようになっていると思うんですけど、これを機に分からないの内容をずらずらっと並べてみました。

#自分はおそらくこの辺でつまずいてるんじゃないか（予想）

###1.そもそもIoT(=Internet of Things)とはどういうことなのか
何かしら対象物が指示に反応すればIoTなのか。その認識でいいの？だめ？

まぁ、ここは開き直るしかない。

###2.「まずはこれ使おう」が定まらない
ラズパイ
NefryBT
M5Stack
obniz
ADZUKI
その他その他その他その他…

（そもそもこれらは並列して良いものなのかは知らんけど）
多種多様過ぎるぜ…。
ちなみに私からすると多分どれを選んでもカンタンにはいかない。

###4.どれなら何ができるのか一目では分からない
「ラズパイ難しいよ！」「M5Stackむずかしくないよ？」「Nefryよりはラズパイの方が簡単だよ」「僕はこっちが好きです」とか言われがち。派閥でもあるの？
上記はどれも現実にお話いただいた内容ですが、Nefryよりラズパイが簡単ってことはあまり考えにくい、気がする。

###5.おかげで登竜門的なものが決まってない
多分あるかもしれないけど、共通認識にはなってなさそう。
「好きなものから始めましょう」と言われることも多いがガチの素人はどれも同じに見えるし（いやそもそも知らないのに好きも何も…）となる。

###6.IoTLT登壇者の話すテーマから理解できない
IoTLTあるある「初心者じゃないじゃん…！！！」という感想。
でも、派生イベントに当てはまっていなければ本体でLTしますよね？多分自然現象。

###7.LTを中心で耳にする単語が軒並み分からない問題
IoTLTで私の身に起こりがちな現象⇊
　①LT始まる
　②「〇〇知ってるひと～？」（挙手をうながす）
　③「皆さん結構知ってますね～」「じゃあ割愛します」
　④割愛される参加者が分かっている前提でLT進む
　⑤自分だけ分からない（気がする）
　⑥追いつこうとする
　⑦３～５分しか話さないため、そうこうしてる内にLTが終わる
　⑧次のLTに移ってる
　⑨詰む

ちなみに、ボードとマイコンとモジュールとデバイスの違いは何なんだろう。と思いながらいつも雰囲気で話しています。

###8.帰宅してググるも結局は沼にハマる
あとあと追いつこうとするとこんな現象が起こります
　①LTで知らないワードが出てくる
　②ググる
　③説明文中にもっと知らないワードが出てくる
　④②と③を繰り返す
　⑤ウィンドウのタブが20個くらいになる→沼
　⑥何ならもともと調べていたワードが何だったのか忘れる
　⑦ウィンドウ全消し
　⑧ちょっとスッキリするけど詰む

一瞬だけぷよぷよ全消しみたいな気分になるけどすぐに錯覚と気づく。
結論：結局詰む

#結局詰む。それでも、「まずはやってみる」の一線を越える
ここまでに書いた疑問やつまずきはおそらく調べ続けても大して解決しないんじゃないかと思います。全部調べてるうちに40年くらい経ってそう。そうなると、どこかで「やってみよう」が必要になりますよね。どこかでスタートラインの向こう側に跳ぶタイミングをもっと明確に作れないかな～と思っています。

#自分がIoTに触れることで描ける未来をイメージする
たとえばレシピ動画をひととおりマネしていって、徐々に「NefryBTを使った制作」が方法論としてより明確に出てくると「NefryBTで3か月後には〇〇を作れるようにしよう」とか思い描けませんかね。いま書いてて自分で思うけど全然ニュアンスが伝わらなそうでヤバい。とりあえず道筋ですよ道筋（投げやり）。いや、まぁ、この先自分が立てられるように頑張ります。。。
でも、誰か語らう人がいたら嬉しいな～(ﾁﾗｯ

これだけ分からない分からないって書きまくっていますけどIoTLTはすごく良いイベントだと思っているので今後もしつこく参加していきます！イメージしているものが作れるようになるその日まで。。
SQL文法（備忘録）

備忘録代わりに書きました。
新しい構文を学習したら追記していきます。

■ORDER BY

　役割：指定したカラムで検索結果を昇順/降順に並び替える。
　構文：SELECT * FROM table <font color = "Red">ORDER BY</font> カラム名 <font color = "Red">ASC/DESC</font>;
    ```
           ASC…昇順　DESC…降順
    ```

■AS

　役割：取得したカラムに好きな名前を付ける
　構文：SELECT カラム名A <font color = "Red">AS</font> カラム名B FROM table;

■LIKE

　役割：LIKE検索を行う
　構文：SELECT * FROM table WHERE <font color = "Red">カラム名</font> LIKE '<font color = "Red">%キーワード%</font>';
```
      %…任意の０文字以上の文字列
　　  _（アンダーバー）…任意の１文字
```

■
Nuxt.js + Firebase Cloud Messagingを使ってWeb pushをしてみた（実践編）

今回は[Nuxt.js #2 Advent Calendar 2018](https://qiita.com/yakiniku0220/items/98715a9cd8f20a159d27)の9日目に書いた記事の続きを書こうと思います。
まだ見てない方はご覧ください。

# 概要
今回は実践編ということで、curlを使ってプッシュ通知を送ってみましたが、フォームで入力した文字をそのままプッシュのメッセージとして送るようにしようと思います。

### 実際の処理の流れ
```js

const messaging = firebase.messaging()
messaging.usePublicVapidKey('PUBLIC KEY')
messaging.requestPermission().then(function() {
  messaging.getToken().then(function(currentToken) {
    const headers = {
      headers: {
        'Content-Type': 'application/json',
        Authorization: 'Bearer {access token}'
      }
    }
    let data = {
      message: {
        to: currentToken,
        notification: {
          title: 'Formで入力したtitle',
          body: 'Formで入力したbody',
          click_action: 'Formで入力したurl'
        }
      }
    }
    axios.post('https://fcm.googleapis.com/fcm/send', data, headers)
  })
  .catch(function(err) {
    console.log('not', err)
  })
})
.catch(function(err) {
  console.log('Unable to get permission to notify.', err)
})
```
実際の処理はこれだけです。

Authorizationのサーバーキーは
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3237313435302f63613334663962352d333237352d653033322d313537312d3838326566623530326635612e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/271450/617f994a-d072-1741-707d-a5efa02b744f.png)
に表示されているサーバーキーを使います。

notificationに書いてある項目は、実際にフォームで入力したdateを渡します。

最後にaxiosを使ってpostすると通知が届くようになります。

今回は実装の量が少ないので、直接method内に記載しましたが、token取得や、axiosでのpushの処理はvuexで処理した方がコードは綺麗になります。


# まとめ
今回はフォームで入力した文字をそのまま自分のブラウザにpush通知を送る仕様にしましたが、業務などで使う場合は、ログインや新規登録のタイミングでtoken発行してdbに保存しておけば、そのユーザーのみに個別pushを送ることができます。
簡単にWebでのpush通知ができるのはいいなと思いました。
個人的には今後も使ってみようと思います。

今回書いたコードは後ほどgihubに載せようと思うのでご覧ください。

明日は弊社Androidチームの[fuji](https://qiita.com/iki_de_inase)くんです。
お楽しみに。
PythonでUNIXタイム（POSIXタイム）とタイムゾーン


## 概要

Pythonで時刻を扱う際には[datetimeモジュール](https://docs.python.jp/3/library/datetime.html)を使うのが一般的。Python3でも少し前までは、UNIXタイムを扱うのに一手間かかったが、Python3.7ではとても扱いやすくなっている。

datetimeオブジェクトに対して`timestamp()`でUNIXタイムを取得することができ、 `datetime.fromtimestamp()`(classmethod)でUNIXタイムからdatetimeオブジェクトを作ることができる。

気軽にUNIXタイムを扱えるのは嬉しいが、タイムゾーンに気にしないと、意図しない結果になることがある。


## 環境
Pythonのバージョンは3.7を使用する。macOSで動作を確認した。

## UNIXタイムとは

説明不要だと思うが、[ウィキペディア](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93)から念の為引用しておく。

> UNIX時間（ユニックスじかん）またはUNIX時刻（ユニックスじこく、UNIX time（ユニックスタイム）、POSIX time（ポジックスタイム））とはコンピューターシステム上での時刻表現の一種。UNIXエポック、すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数（すなわち、実質的な経過秒数から、その間に挿入された閏秒を引き、削除された閏秒を加えたもの）として表される。

## 個人的に想定外だった挙動

```
>>> from datetime import datetime
>>> datetime.fromtimestamp(0)
datetime.datetime(1970, 1, 1, 9, 0)
```

"1970/01/01 00:00:00"を期待していたら、9時間ずれていた。お察しの通り、日本標準時（UTC+9）が関係している。

## 仕様です

[ドキュメント](https://docs.python.jp/3/library/datetime.html#datetime-objects)には、`datetime.fromtimestamp(timestamp, tz=None)`について次のように書いてある。

> POSIX タイムスタンプに対応するローカルな日付と時刻を返します。オプションの引数 tz が None であるか、指定されていない場合、タイムスタンプはプラットフォームのローカルな日付および時刻に変換され、返される datetime オブジェクトは naive なものになります。

「**POSIX タイムスタンプに対応するローカルな日付と時刻を返します**　」ということで、ローカルな時刻（今回はJST）の時刻が返された。引用中の「naiveなもの」については、後述する。

UTCの時刻情報がほしい時は、`datetime.utcfromtimestamp(timestamp)`のほうを使えばよかった。

```
>>> datetime.utcfromtimestamp(0)
datetime.datetime(1970, 1, 1, 0, 0)
```

また、`fromtimestamp()`にはタイムゾーンの情報が渡せるので、そちらの方法で対応することもできる。

```
>>> from datetime import datetime, timezone
>>> datetime.fromtimestamp(0, timezone.utc)
datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)
```

`tzinfo`が追加されたが、同じっぽい結果が得られた。この`tzinfo`が何かを知ろうと思うと、"naive" と "aware"の２種類のオブジェクトについて理解する必要がある。

## "naive" と "aware"

datetimeモジュールで扱う時刻オブジェクトは、"naive"と"aware"の２種類に区別される。
簡単にいうと、"naive"はタイムゾーンに関する情報を持たず、"aware"はタイムゾーンに関する情報を持つ時刻オブジェクトを指す。

それぞれのメリット、デメリットについては[公式ドキュメント](https://docs.python.jp/3/library/datetime.html#)を読むとよい。

オブジェクトの作成時にタイムゾーンの情報を渡せばawareなオブジェクトを得られるし、そうでなければnaiveになると覚えておけば、基本的に問題ないと思われる。

先ほどの例でいうと、`datetime.fromtimestamp(0)`ではnaiveなオブジェクトが生成され、`datetime.fromtimestamp(0, timezone.utc)`ではawareなオブジェクトが生成された。


## awareなオブジェクトの作り方

datetimeモジュールでは、タイムゾーンを表すために`tzinfo`のサブクラスが使われる。このサブクラスを自分で実装することもできるが、[dateutil](https://dateutil.readthedocs.io/en/stable/)もしくは[pytz](https://pypi.org/project/pytz/)というライブラリがよく使われている。

例えば、dateutilを使うと次のようになる。

```
>>> from datetime import datetime
>>> from dateutil import tz
>>> datetime.now(tz=tz.gettz("Asia/Tokyo"))
datetime.datetime(2018, 12, 22, 23, 20, 56, 431366, tzinfo=tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
```

ここで`tz`を指定しないと、naiveなオブジェクトが作られる。

```
>>> datetime.now()
datetime.datetime(2018, 12, 22, 23, 22, 45, 910050)
```

## 余談

naiveなオブジェクトはプログラムを実行する環境に依存するので、awareな方を使った方がいいと思う。

例えば、手元の環境では`datetime.now()`でJSTが返るが、AppEngineではUTCになっている、など。



以上です。
Gitを学んできた方法



GitどころかIT初心者だった私が、どうやってGitを勉強してきたのかをまとめます。

# 先にまとめ
Gitを勉強するときは

* とにかく手順を覚えてしまう→意味を調べる、理解する、という順番もあり
* 新しいコマンドなどは10分くらい使って実際に使ってみるとよい
* とにかく自分の成果物をリモートリポジトリ管理することで知識は増えていくし、コマンドも覚える

# Git歴
Git　5年くらい
Github　2年くらい
Bitbucket　3年くらい

プライベートではBitbucketを使っています。


## いわれるがままにやってみていた時期
配属直後くらいの時です。
配属された部署ではGitを使っていたため、必然的にGitを使うようになりました。
最初はEclipseのEgit(プラグイン)を使用してGUIでGitを使っていました。ただし、やっていることは全く分かっておらず、とにかく先輩に教えてもらった手順を行うことしかできませんでした。
そのため、何かちょっと(自分の手順に対して)イレギュラーなことが起こると自分ではどうにもできず、先輩に聞いてなんとかしていました。

## 理解し始めた時期
上の時期を乗り越えると正直仕事では困らなくなりました。
余裕も出てきて、今自分が行っている操作の意味を調べるようになりました。
Gitってそもそも何？とかaddとかmergeって何？というあたりを調べ始めました。
またブランチやブランチの運用方法についても調べたりしていました。

意味と手順を同時に知っていく、というのもあると思うのですが、今回は手順をとにかく覚えてそのあとに意味を調べる、という方法でした。
手順としては全体を知っているので、一部分一部分を調べた時にほかのところとつながりやすい、という利点があったと思います。


## +αを学び始めた時期
困ったことも一人で解決できるようになり、だんだんと「Gitが得意になりたい！」と思い始めた時期です。
コマンドをいろいろ打つようになり、CUIで操作をするようになりました。
業務で使ったことがないコマンドも調べて使うようになりました。
このときは、ちょっと調べてすぐに使ってみる、という方法をとっていました。
実際に仕事をしているときに「こういうときってなんかいいコマンドないかな・・・」と思ったら、ちょっと調べて実際に使ってみる、という感じです。10分くらいしらべてよくわからなかったらいつも通りのやり方でやるということをしていました。

Gitはとにかく使ってみるのが一番定着する&理解が進むと思います。
使う機会を増やす、というのがGit初心者を抜ける第一歩かもしれないです。

## Outputし始めた時期
知識もたまってきて、発信したい欲がでてきました。

* Qiitaへの投稿
* チームメンバーへの発信

ということを行いました。

Qiitaへの投稿はコマンドチートシートなどを投稿していました。
チームメンバーへの情報発信は、ペアプロをしているときに「こういうときこのコマンド使えますよ」的な感じでちょっとずつ話をしていました。
(aliasなんかは知らない人にはとても受けがいいです)
またちょうどプロジェクトが新しく始まるところだったので、ブランチの運用方法について説明したりしていました(「A successful Git branching model」です)。

Outputすることで知識も定着しますし、周りから「Gitが得意だ」と思ってもらえることが増えた気がします。
また、便利になることを周りに共有すると喜ばれたり、実際にそれを使っていてくれたりするなどしてとてもうれしいです。

## 新人研修の講師を担当
こんな感じでGitを学んできたところ、新人研修の講師を依頼され、実際に2年間講師をさせていただきました。

講師を依頼されて純粋に嬉しかったですし、やりたいことは盛りだくさんでした。自身の経験からも「わかりやすさ」を追求していきたいという思いもありました。

実際は、ものすごく大変でした。
1からどころか0から内容を考えたり、そもそもこんなに長い時間話すイベントも、イベントの計画も初めてでした。
また、本当に時間通りに終わるのか、わかってもらえるのか、操作で失敗しないか、など不安だらけでした。
実際に実施したところ、うまくいかないところやハプニングもあったりしましたが、なんとか終わらせることができました。

## 勉強法
「とにかく使ってみる」というのが一番だと思います。
業務で使うのももちろんですが、自分の成果物とかちょっとローカルで書いてみたコードとかなんでもリポジトリ管理するとだいぶ操作になれると思います。
とくに`clone`とか`init`コマンドは業務で使う機会は本当に少ないと思います。個人的にコードを書いてGit管理することで業務でなかなか使わないコマンドにも触れることができると思います。
メモ：「３０日でできる！OS自作入門 」10日目

## 重ね合わせ処理

1) メモリ管理の続き
- memory.c に切り出す
    - １バイト単位ではなく 4k 単位で Allocate する
    - 0x1000 切り捨て、size & 0xfffff000;
    - 0x1000 切り上げ,(size & 0xfffff000) + 0x1000; ただし size & 0xfff が 0 じゃない時のみ
        - または (size + 0xfff) & 0xfffff000; 同じなためこれを採用
    - １０進数の切り捨ての場合はどうするかなど, (i / 100) * 100 とか i - (i % 100) などすればよい

2) 重ね合わせ処理 (マウス移動時問題など用)
- sheet 構造体を定義
    - buf、座標、サイズフラグなどを持ってる
- layers　（sheets) の構造体を作る
    - 画面サイズ、VRAM全体、シートの詳細情報とシート順番をもってるポインターなどをもってる
- shtctl 初期化関数の作成
    - memory allocate 4k を利用
- sheet_alloc 関数の作成
- sheet　の buf を指定する関数の作成
- シートの順序を変える関数の作成 (sheet_updown)
- refresh する関数の作成
- sheet_slide, windows　を動かしたいときとかに使える関数、x, y 変えて refresh する
- sheet_free,　非表示にして未使用フラグをセットする

初期状態シート関数呼び出す順番のイメージ
- shtctl_init
- sheet_alloc (背景とマウスの分）
- sheet_setbuf
- sheet_slide
- sheet_updown
- sheet_refresh

マウス動かすときのイメージ
- sheet_slide + refresh

![mouse-move.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/540b5583-361c-d7b4-51f1-2ee07b203b1f.gif)

かっこいいですね。

3) 重ね合わせ処理の高速化
- refresh は毎回画面全体を描画しているため、部分的に描画するように変更　（refresh_sub)

ちょっと早くなったかなぁ

4) 高速化２
- refresh_sub に再描画する範囲を絞って更新するように変更

![mouse-move2.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/22f10477-be37-03f0-65a8-718aa98d58bd.gif)

GIF上はあまり変わっていないが、処理が軽くなったからよし  🎉
Flutterを触ってみた感想

# 概要
以前ReactNativeでイラスト閲覧アプリを作ったが、今回はそのままの仕様でFlutterで1から書き直した。

両方触ってみた結果、個人的にはFlutterの方が好みだったのだが、
どういった部分で魅力に感じたのか簡単にまとめようと思う。

ReactNativeは0.52.0とかそれくらいの時期に触ってた記憶のものなので、
もしかしたら改善されているかもしれない(期待感)

# 雑に箇条書き
記事をまとめる力が尽きる前にざっと箇条書きする。
まとめる気持ちが向いてきたら詳細に落としていく。

**※以下個人の感想です**

## 良い
- dartの言語は複雑ではないので取っ付きやすい。すぐ覚えられる。
    - async/awaitあるのもいいね(jsにもあるから優位性はないけど)
- ViewはReactNative同様組みやすい
    - CenterとかExpandedとかレイアウト用のWidgetがあって最初は慣れななかった
    - 慣れてしまえばサクサク作れる
- ReactNativeに比べてFlutterのバージョン上げやすい
    - `flutter upgrade`の後、特にすることがない
    - `react-native-git-upgrade`の後の悲しいコンフリクト解消みたいなのは自分の環境では今のとこ無さそう
- Android Studioと組み合わせると開発が便利
    - 保存時に自動的に依存解決してくれる
    - 保存時に自動的にホットリロードしてくれる
    - エミュレータ起動用のUIがあるのですぐ起動できる(iOS/Android両方)
    - 慣れ親しんだショートカットキーが使える(これは人による)
- プロジェクト作成時にオプション付ければネイティブのコードを`swift`/`kotlin`で作成してくれる
    - ReactNativeだと`Java`/`Objective-C`がデフォだった
- ネイティブライブラリに依存したプラグイン入れても自動的にリンクしてくれる
    - pubspec.yamlに書いて保存したらもう参照できるようになってた。意識しなくていいレベル。
    - `react-native link`より楽(ライブラリによっては非推奨なこともあるし)
- 自作プラグインのプロジェクト作成時に`example`もセットで作成してくれるのは嬉しい
    - 作ったウィジェットやモジュールをすぐ試せる
    - ReactNativeは自分で作る必要があった
- ネイティブのViewとの繋ぎこみの`過程`はどっちもどっち
    - プロジェクト作成時点で`kotlin`/`swift`が用意されてるからその分楽と言えば楽か
- 複雑なリストを組む仕組みが標準で用意されている
    - CustomScrollView + Sliverを使う
    - 考え方が自分の作った[recyclerview-adapters](https://qiita.com/chuross/items/8bdf26a4fc87f6fab5e2)に近くて好み
- データバインディング用のWidgetやクラスが用意されてる
    - `Stream`や`StreamBuilder`あたりを使うと値がある状態を保証して表示とかが書きやすい
    - RxDartのBehaviorSubjectも使えば困ることは無かった
- アノテーションからコード自動生成みたいな仕組みがある
    - Android(というかJava)でよく使われているAnnotation Processingと同じような感じで色々できそう
    - [json_serializable](https://pub.dartlang.org/packages/json_serializable)はアノテーションからJSONシリアライズ・デシリアライズの処理を自動生成してくれる

## 不満
- 普段kotlinとかswiftとか書いてるとdartが物足りなく感じる
    - enumがシンプルすぎる...
    - 拡張関数使いたい(mixinがあるので大体は解消できる)
    - セミコロンがもはやだるい
- importしてないクラスはクラス名全部打ってからじゃないと補完してくれない
    - これはAndroid Studioのプラグインへの不満
    - せめて自分のプロジェクト内で作ったクラスくらいは2文字くらい打ったら補完してほしい
- ライブラリ少ないなぁ
    - 検索しても関係ないやつばかり引っかかってくる
    - 自分も作ってく内にどんどんpackage切り出して貢献していく気持ち

## その他
- AndroidやiOSの知識不要かと言われるとそんなことはない
    - 特にリリースビルドはそれぞれの知識が少なからず必要になる
    - ここら辺は仕方ない

### 解せぬ
以下のコード実行時エラーになる(コンパイルは通る)
環境構築だるい人はDartPadで試すとわかる(https://dartpad.dartlang.org/)

```dart
void main() {
  final piyo = [1, 2, 3, 4, 5];
  final stringPiyo = piyo.map((value) => value.toString());
  
  /// Uncaught exception:
  /// TypeError: Instance of 'MappedListIterable<int, String>': type 'MappedListIterable<int, String>' is not a subtype of type 'List<String>'
  Hoge(values: stringPiyo);
}

class Hoge {
  List<String> values;
  
  Hoge({this.values});
}

```

これは最後に`toList()`を加える必要がある。

```dart
final piyo = [1, 2, 3, 4, 5]; // List<int>
final stringPiyo = piyo.map((value) => value.toString()).toList(); // toList無しでもList<String>になってくれよお
```
【Salesforce】SOQLでレコードに対する権限を一覧表示する

この記事は[LIFULL Advent Calendar2018](https://qiita.com/advent-calendar/2018/lifull "LIFULL Advent Calendar2018")の22日目の記事です。

昨年LIFULLに転職し、Salesforceエンジニアとなりました。
そして初投稿・Qiitaデビューです。初投稿はSalesforceで何度も悩まされた権限管理について、SOQLを使って楽にしようというテーマで書いていきたいと思います。


# 共有オブジェクト
Salesforceには共有オブジェクトという権限を管理するオブジェクトがあります。
この共有オブジェクトはオブジェクトごとに1:1で存在し、標準オブジェクトには予め用意されていますが、カスタムオブジェクトを作成した場合は自動で作成されます。

管理画面上からはシステム管理者でさえも見えないシステムオブジェクトのため、結構存在や名前を忘れがちだったりします。共有オブジェクトの名前（API参照名）はこちら。

　・標準オブジェクト：[ObjectName] + Share
　　（例）Caseの場合：共有オブジェクトは「CaseShare」
　・カスタムオブジェクト：[MyCustomObject] + __Share
　　（例）Property\_\_cの場合：共有オブジェクトは「Property\_\_Share」'


# 共有オブジェクトが管理するアクセスレベル
オブジェクトによって項目名が異なりますが、Caseの場合は「CaseAccessLevel」という項目でアクセスレベルを保持しています。アクセスレベルは下記３つ。
　 1. 【Read】参照のみ
　 2. 【Edit】参照・編集可能
　 3. 【All】参照・編集・移行・共有・削除可能


# SOQLで権限を取得する
オブジェクトなのでSOQLで権限レコード取得することもできます。
例えば特定のケースレコードに対する編集権限を持つユーザやグループの一覧を取得したい場合。

``` sql
SELECT CaseAccessLevel, RowCause, UserOrGroupId, UserOrGroup.Name FROM CaseShare WHERE CaseId = '{ケースID}' AND (CaseAccessLevel = 'All' OR CaseAccessLevel = 'Edit') LIMIT 100
```

特定のユーザもしくはグループが持つケースレコードの一覧を取得したい場合はこちら。

``` sql
SELECT CaseAccessLevel, RowCause, CaseId, Case.RecordTypeId FROM CaseShare WHERE UserOrGroupId = '{ユーザもしくはグループID}' And Case.RecordTypeId = '｛レコードタイプID｝' LIMIT 1000
```


# 注意点
上記ように権限の一覧は簡単に取得ができますが「ユーザもしくはグループ」と何度も書いている通り、権限レコードはユーザ単位ではなく「ユーザもしくはグループ」単位で作成されます。そのためグループ内にどのユーザがいるのかは一覧上からは分かりません。
さらにやっかいなことに、グループはネストします。

例えば、キューが参照権限をもつレコードがあったとします。
このキューのメンバーが公開グループやロールの場合もよくあり、公開グループのメンバーにもロールを設定できるのでさらにネスト。メンバーがロール＋ユーザなんてパターンもあります。

# グループの階層構造
ただ、ロールにはユーザしか割り当てられないのでようやくここでネストが止まります。また公開グループにはキューは割り当てられません。
つまり、キュー＞公開グループ＞ロール＞ユーザの最大4階層でしょうか。

# グループメンバーを取得する
特定のユーザもしくはグループが持つケースレコードの一覧を取得したときに、グループ（SFID：00G）が取得された場合にグループメンバー一覧を表示するにはこちら。
グループオブジェクトの「Type」項目を取得することでそのグループがキュー、公開グループ、ロールなどなどが判別可能です。

``` sql
SELECT UserOrGroupId, Group.Type FROM GroupMember WHERE GroupId = '{グループID}' LIMIT 1000
```

ちなみに、参照が張られていないのか共有オブジェクトと違って「UserOrGroup.Name」でユーザ氏名を取得することはできません。


# 最後に
上記SOQLを組み合わせたり応用することにより、特定のユーザが権限を持つレコードの一覧や、レコードの特定のレコードに対する権限を持つユーザ一覧の表示が可能です。
厳密にいうとロールがもたらす階層権限やオブジェクト自体に対する権限も組み合わせる必要がありますが、Salesforceの多様な設定により掌握困難な権限構造を可視化するには活用できるかもしれません。

今後はこの共有オブジェクトの仕組みをベースをにGUIの検索画面を作って簡単に権限一覧を表示したり、予期しない権限が付いていればアラートを出すツールなどを作って権限管理を楽にしていけたらと思います。

それではよいSalesforceライフを。
単身赴任で離れて暮らすネコのためにおうちハックを始めた話

こんばんは、おうちハック同好会ROM会員のMasawo Yamazaki(tomorrow56)です。

普段は神奈川の中央付近でハードウエアエンジニアをやっているのですが、単身赴任で自宅は札幌にあります。札幌では嫁さんとネコの二人で留守を守っています。

#### 最近で一番移りのいい写真
![1543645789362.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/9e1bfe19-a13c-c31a-029d-357a217a6dad.jpeg)

#おうちハックのきっかけ
北海道の冬、単身赴任で一番怖いのが「飛行機の欠航」です。
うちの場合は、嫁さんがどうしても泊まりで家を空けなくればならない時に、私が札幌まで帰ってネコの世話といいつつ親交を温めるという事がある意味最大の楽しみなのですが、「降雪により飛行機の遅延・欠航」というのがよくあり、その場合以下の問題が発生します。

1. ネコゴハンが無くなってお腹を空かせて辛い思いをさせてしまう
2. 日が暮れてしまい、家中が暗くなる
3. 部屋の暖房が入らなくて、凍えてしまう(特に夜)

1.については、自動給餌器を導入する事で解決したのですが、2と3についてはたまには「おうちハック」っぽい事をしようという事で、赤外線コントロールのIRKitを導入しました。

## ESP8266 IRKit
IRKitについてはおうちハックの皆様ご存じで今更語るまでもないのですが、今回は以下のFBにて基板を作成した「ESP8266 IRKit互換機」を使いました。(グループの皆様、感謝感謝です！！)

https://www.facebook.com/groups/159147158054276/
![IRKit基板つくろーぜの会.JPG](https://qiita-image-store.s3.amazonaws.com/0/120903/f3eef1d9-962a-2bd1-543a-5f622f4bfae5.jpeg)

実装したIRKit基板はダイソーの食品タッパーに格納しました。半透明で赤外線を通すので非常に相性が良いです。

![IMG_20181209_111813.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/658fc2a0-9a10-a968-e4a8-d0e4f4ed516b.jpeg)

これを部屋に設置します。IR出力の向きについては、1台で複数の部屋にわたって制御したいので、壁に向けて反射する様に設置しました。

![IMG_20181209_111830.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/05262139-6441-679a-d4b1-79177fc59e97.jpeg)

## 制御用のアプリ
「ESP8266 IRKit」は許可をいただいてIRKitのサーバーを使わせていただいています。
アプリについては「IRKitシンプルリモコン」を導入しました。
https://play.google.com/store/apps/details?id=com.getirkit.irkitsimpleremote&hl=ja

今回は、照明・エアコンの制御に加えてテレビの制御も行いました。とはいっても、ボタンを追加してリモコンコードを記憶させるだけです。IRKitのシンプルなUIは本当にすごいです。

![Screenshot_2018-12-09-12-00-03-221_com.getirkit.irkitsimpleremote.png](https://qiita-image-store.s3.amazonaws.com/0/120903/b339d58b-ff6f-79f7-a3ab-c5bb81cfb8de.png)

## 照明について
照明は普通の赤外線制御のシーリングライトを使いました。壁のスイッチで電源を切ってしまうと、IRKitでの制御が出来なくなってしまうので、スイッチの横に赤外線リモコンを貼り付けて、基本はこれで制御する癖をつける様にしました。

![IMG_20181209_111839.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/c69aa778-9eca-cc04-c8f7-06d91025296b.jpeg)

## エアコンについて
エアコン制御は普通にリモコンのコードをIRKitに学習させただけで、特別な事はしていません。
設置場所が照明から遠かったので、1個のIRKitで制御するために配置に結構苦労しました。
(それが、最初に書いた「壁に向けて反射させる」です)

## テレビについて
せっかくなのでテレビの制御も追加しました。よく見るチャンネルについてはダイレクトキーのコードを記憶させています。
また、自宅にはFire TV Stickを導入しており、Amazon Primeビデオのアプリから直接再生させることが出来ます。

![Screenshot_2018-12-22-22-53-26-688_com.amazon.avod.thirdpartyclient.png](https://qiita-image-store.s3.amazonaws.com/0/120903/fe1afdd1-5b59-ef30-bb94-cf782b41a4bf.png)

Fire Stick TVはHDMIの家電制御規格である「CEC」対応ですので、再生が始まると自動で入力が切り替わるので非常に便利です。

## Echo Dot

IRKitの導入にあわせて、Echo Dotも設置しました。
家具の側面と不要なCD-Rを3Mのコマンドタブで固定し、CD-RにEcho Dotを強力な両面テープで貼り付けました。これによって、家具を傷つけることなく固定できています。
(Echo Dotの裏面はクッション状になっており、コマンドタブで固定出来ない)

![IMG_20181209_113822.jpg](https://qiita-image-store.s3.amazonaws.com/0/120903/7eb5af18-b5dd-9a3f-903f-a3ec90dc703f.jpeg)

Echo DotとIRKitの連携は以下のページを参考にさせていただきました。

Amazon Echo(Alexa)とIRKitをIFTTTで連携してホームオートメーション
http://innossh.hatenablog.com/entry/2017/11/21/022204

![alexa_tv.JPG](https://qiita-image-store.s3.amazonaws.com/0/120903/7a4173d8-2661-bd55-27f5-06a6beb86e0b.jpeg)

ネットの情報を参考にして私のようなおうちハック初心者でも半日程度で簡単に色々と制御できてしまいました。いい時代だと思います。

来年はもう少し色々なものをIRで制御できるようにしてみようと思います。そしてMA2019ではおうちハックした内容をLTできる様に頑張ります(笑)
SATySFiでTeX関係のロゴ

> これは「SATySFi Advent Caleandar 2018」の22日目の記事です。
（21日目は [mtsg4code](https://qiita.com/mumum/items/5b9892c4d29594bb75a9)さんでした。23日目は[hsjoihs](https://hsjoihs.hatenablog.com/entry/2018/12/23/214419#)さんです。）

SATySFiで`\LuaLaTeX`とか`\LaTeXTeX`とかコマンドを打ちたくなっても残念ながらコマンドは存在しません。

しかし、同じ組版ソフトであるTeX関係のロゴをSATySFiで再現できないはずがありません。なので、今回再現できるものをほとんど再現したパッケージを作成しました。

基本的に使用したプリミティブは`set-manual-rising`と`inline-skip`で、これを使って位置の調整を行いました。これらの値はbxtexlogo.styやhologo.styの中身を直接見て参考にして決めました。

Bxtexlogoパッケージで追加されているロゴの内、ある程度使うものとフォント関係がめんどくさくなさそうなロゴを全て再現しました。

置き場所は[Gist](https://gist.github.com/puripuri2100/9143639ef19c54abf5ac629c940dbd04)です。

何日間かかけて作成したのでだいたい44個ほどあります（TeX関係のロゴ多すぎないか？）。
自律的なプロダクト改善ができるチームを作るために

# はじめに

この記事は[Makuake Product Team Advent Calendar 2018](https://qiita.com/advent-calendar/2018/makuake)の24日目の記事です。

株式会社マクアケ開発本部マネージャーの[kimura-ryohei](https://qiita.com/kimura-ryohei)と申します。
プロダクト改善を目的とするチームのリーダーとして活動していくなかで、チームが自律的にプロダクト改善を進められるように意識していたことをまとめます。

# チームで権限を得ること

チームに権限がないとチーム外からの意向に沿って動くケースが増え、自律的に動くことが難しくなります。権限を得られない場合には、まず先にチームで信頼を得る必要があります。具体的に何をするかということになりますが、自分のチームでは最初は提案から行いました。今サービスにとって必要な改善はここではないかという提案を、決定権のある人に向けて行いました。その後、実際に提案を形にすることで信頼を得ていき、権限を移譲してもらえる状態に持っていけたと感じています。

# 技術配置がバランス良いチームであること

プロダクトの改善は一つの技術で完結しません。例えばフロントエンドの知識のみがあるチームでサービスの改善を行おうとすると、APIの改善が必要なというときに他チームに力を借りることになり、改善が遅れたり、実施できなかったりします。チーム内に技術に偏りがあっては、チームでプロダクト改善を担えないのです。そのような状況の場合には、チーム編成を変えます。サーバーサイドエンジニア、フロントエンジニア、iOSアプリエンジニア、など、チーム内でバランス良い状態を目指しましょう。
しかし、チーム内ですべてをまかなえない場合もあるかと思います。その場合はチームでその技術を習得するしかありません。自分のチームでは最初データ分析の技術が乏しかったのですが、知り合いをたどってチーム外に協力を仰ぎ、必要な場合には教えを請いながらチームで習得していきました。
    
## 目標に沿って行動できること

前提になりますが、まず目標が決まっていることが重要です。チームの目標について決定権を持つ人とチームの間とですり合わせを行います。できる限りチームメンバー全員が参加する場で話すことが望ましいです。メンバー個人が目標に対する納得感を持っていると、その後の行動もしやすくなります。これが難しい場合には、チームリーダーが目標とそれを追う理由をセットでメンバーに伝えられるようにします。できる限り納得感を得られるように、理由についてきちんと理解し伝えることが重要です。
目標が決まったら、その後の活動の中で目標に沿った動きができているかを確認します。例えば、OKRを使うことはその役に立つと思います。また、メンバーが今やっていることについて、なぜそれをやっているのかを適宜聞くということも役立ちます。今やっていることの理由がチームの目標から逸れていないかを日々確認することで、自分がやっていることと目標とのつながりを意識できます。

## 自分たちで自分たちを改善できること

チームで自律的なプロダクト改善を行う場合、チーム自身がチームの動き方を改善できることはとても重要です。チーム外から見てチームが結果を出せていないと感じたとき、基本的には何かしらの改善をチーム外から行いたくなります。場合によっては、自律的に活動できる範囲を制限したくなるかもしれません。そのような状況を防ぐために、チームが苦しい状況になったときに、チーム自身でその状況を改善できるようにすることが重要です。
そのために、振り返りの仕組みを作ります。自分のチームでは１週間に１回、または２週間に１回でKPTを行い、自分たちの行動を振り返り、改善をしていきました。また、このとき、チーム内に出てきた改善の動きを、できる限りサポートすることが重要です。チームのメンバーや状況にもよりますが、とにかく任せてみるときと、手を入れて直すときとのバランスを意識しましょう。個人的には、基本的に任せるスタンスを維持することが多いです。ある程度時間が経っても、チーム内に改善が進んでいるという意識が薄いときには、大きく手を入れることもあります。

## アイディアをユーザーに当てて結果を得ること

自律的な活動を行うには、メンバー個人のモチベーションはとても重要です。施策のアイディアが浮かんでも、チーム内の提案時点でボツになってしまう、という状況が続くと、モチベーションの維持は難しいと思います。なので、できる限りアイディアは実際にユーザーに当てて検証しましょう。例えばA/Bテストを行うことが役に立ちます。自分のチームでは、ユーザー全体ではなく一部のユーザーに対してA/Bテストを行い、有用性を確かめてから、ユーザー全体にリリースするという流れを多く行いました。これによって、社内のメンバーからのフィードバックではなく、実際のユーザーからのフィードバックを得ることができます。ユーザーに自分のやりたいと思った施策を当てられることは、サービスを良くしたいと考えるメンバーにとって、重要な機会です。もちろん、明らかにクオリティ不足のアイディアの場合には、A/Bテストの前に磨き上げることが重要ですが、メンバーの思いをユーザーに届ける機会を増やし、それによって高まったモチベーションを次の施策へのエネルギーにするようなサイクルを作ることを意識したいところです。

# まとめ

今回、自分が、プロダクト改善を目的とするチームのリーダーをするなかで、自律的にプロダクト改善を進められるように意識をしていたことについて書きました。

1. チームに権限を与えること
2. 技術配置がバランス良いチームであること
3. 目標に沿って行動できること
4. 自分たちで自分たちを改善できること
5. アイディアをユーザーに当てて結果を得ること

これらを行い、メンバー個々人のアイディアを実際にユーザーに当てて評価を得るという体験を繰り返すことができる状態に持っていくことが、自律的なプロダクト改善ができるチームを作る上で重要だと考えています。これからも良いチームで良いプロダクトを作っていけるように頑張っていきます。
自律的なプロダクトの改善に熱意のある方は、ぜひ、「[各種エンジニア募集！ クラウドファンディングMakuake](https://www.wantedly.com/projects/26807)」からご連絡いただければと思います。
画像前処理で描画速度とメンテナンス性を両立する


## はじめに
この記事はDxLib Advent Calendar 2018 23日目の記事です。

2018/12/23 : 分かりにくい部分の訂正
2020/わかりにくかった部分を修正

<< [19日目 | DXライブラリ+nuklearでGUIを実現する](https://qiita.com/ta_dragon/items/b30c190d2108fd915e92) || 24日目 | 五芒星つくった>>


## DirectXとDerivationGraph()の仕様の復習
同人の弾幕STGは圧倒的にc/c++で作られたものが多いです。これは、DirectXでは、同じテクスチャにいろいろな弾幕の画像がまとめてあると、複数の弾の描画を一度のDrawPrimitiveUP()[^2]でやってくれるため高速化するからです。DXライブラリでは、同じ画像(DerivationGraph()で同じ親ハンドルから得られるものも含む)を連続で描画すると、自動でこの最適化をやってくれるようになっています。（因みにDrawPrimitiveUP()を呼んだ回数はGetDrawCallCount()で取得可能）
ちなみに、5年くらい前にjavaで弾幕STGを作ろうとしたことがありますが、300発くらいで処理落ちを始めて断念しました。
一般に、弾幕STGを作るためには200～2000発の画像を60fpsで描画する必要があります。


[^2]: DXライブラリの関数ではなくDirectXの関数

今までは弾幕の話をしてましたが、RPGツクール/ウディタのようなRPG系の2Dゲームでも同じ問題が起こり得ます。
典型的な画面サイズで640x480、マップチップ32x32ピクセルが3レイヤ、とすると一度に表示するマップチップの最大数は
(640/32)×(480/32)×3=20×15×3でなんと**900枚**です。大往生の二周目(210発)より多いね！

**要するに:一枚の画像ファイルにまとまっていると速く描画できる**
## 高速化案:画像を一つにまとめる
作ってるゲームが1000発くらい弾が飛んでくるゲームなのですが、いくらc++&DXライブラリであっても適当に書くと上記の原因で処理落ちしてゲームになりません。そこで、使う全部の画像を2048x2048等の大きな.pngファイル[^3]にまとめてしまえばいいのではないか？との結論にたどり着きます

[^3]: だからといって16384x16384とかの巨大サイズだとグラボが対応してない可能性があるので、2048くらいで数枚の画像にわけるのが無難ではないでしょうか

## 画像を一つにまとめた場合の弊害
理論上は最速で描画できます。機械には優しいですが、**メンテナンス性が極端に悪いので毛髪が瞬く間に禿げ上がります。**
・ship.pngという画像が巨大画像のどの位置に格納されているかを手打ちでどこかに持っておく必要がある
・この画像ちょっと暗いな、色味補正しよう -> 色味補正が全体に適用されて死んだ！
・大き目の画像で背景が透明の部分に、未使用領域と勘違いして別の画像を配置してしまう
・敵の画像の種類を増やしたい -> 画像の隣接した領域が空いているとは限らない ->　敵画像の位置が散り散りになってしまう

## 前処理で解決
もう何がしたいか分かった聡明な方もいると思います。全画像を例えばdata/image直下等に置いて、**ゲームを起動するたびにプログラムから画像を一つにまとめるような仕組みを作ります[^4]。**こうすれば、敵画像はdata/image/enemyにまとめるだとか、管理はすごく楽です。DXライブラリ的には、まずc++標準関数でdata/image直下の.pngファイルを全部列挙し、ソフトイメージ系の関数で画像を合成して書き出します[^6]。個々の画像の埋め込み位置と元.pngの最終更新日時(FileRead_getInfo()や標準関数で取得する)をまとめて.jsonにでも書き出しておいておけば、ゲームコードからは

```cpp:game.cpp
const auto healItem = graph_maker::getHandle("システム/回復アイテム");
```
みたいに簡潔な形に呼び出せます。グラフィックハンドルの分割とか破棄はゲームエンジンが開始/終了時にまとめてやるので、ハンドルの所有権の管理に手を煩わせることもありません。自分の環境で、この合成には5秒くらいかかるので、全.pngの最終更新日時を取ってきて更新が不要ならサボる(cmakeみたいに)機能をつけるとベターです。ちなみに、DirectXの仕様で、画像描画時に周囲の画像が1px未満だけにじみ出ることがあるので(DXライブラリ側ではどうにもできない)画像合成のときには1ピクセルずつ透明色のパディングを挟んでおくと安心です。


[^4]: DXアーカイブとの兼ね合いがあるので、開発中のみ画像合成し、リリース前にアーカイブにしてから、完成品では画像合成によってできた大きい画像のみ同梱するようにする


[^6]: Dxlib 3.19f現在、ソフトイメージ系の関数で画像をただ読み込んで書き出すだけでも乗算済みαの影響を受けてしまう(読み込みと書き出しの画像が変化してしまう)罠があるので、ソフトイメージ使用前には必ず乗算済みαをオフにしておくこと

## 余談:この議論の例外
DXライブラリで(大規模な)ノベルゲームを作る人はどれだけいるか知りませんが、([ノベルゲームエンジン](https://qiita.com/S_H_/items/a983c1ade26f57ce942e)を作ってた方はいましたね)
例えばノベルゲームのイベントCGが200枚(800x600サイズ)とかだと**一度しか使わないイベントのCGが起動時から終了までメモリを使用し続けます。**こういう用途では、むしろ描画速度は一切必要ないので、合成せずに普通に持っておいた方がいいです。でもゲームコードではさっきの使用例と統一的なインターフェースになるようにしたいですね！
【BingMaps】Infoboxへ埋め込んだDOMにイベントを設定する方法

BingMapsのWebAPIを使ったとき、infobox内に差し込んだDOMにおいて、イベントが発生しませんでした。その解決策をご紹介します。



　※公式で用意されているinfobox(アクション付)
<img width="259" alt="スクリーンショット 2018-12-22 21.56.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/314351/a7eb23f5-d86c-b9a0-df31-c72f73e58a61.png">
引用：[BingMaps GO!|Infobox:Pushpin/event](https://mapapi.org/open.php?file=example11)

## 動的に差し込んだDOMはイベントに反応しない！
どうしてもwebアイコンをinfoboxに入れたくて、下図のようにDOMを差し込みました。
![スクリーンショット 2018-12-22 22.02.00.png](https://qiita-image-store.s3.amazonaws.com/0/314351/c0a07015-48e2-133a-0556-6ec2aa4fb174.png)

```map.js
  mapPushpin(lat, lon, id, color, t, d) {
    const location = new Microsoft.Maps.Location(lat, lon);

    let infobox = this.mapInfobox(lat, lon);
    let pin = new Microsoft.Maps.Pushpin(location, {
      color: color
    });

    pin.metadata = {
      title: "店名",
      description: '<i class="fas fa-camera-retro"></i>'
    };

    Microsoft.Maps.Events.addHandler(pin, "click", e => {
      if (e.target.metadata) {
        infobox.setOptions({
          location: e.target.getLocation(),
          title: e.target.metadata.title,
          description: e.target.metadata.description,
          visible: true
        });

      }
    });

    this.map.entities.push(pin);
  }
```
　![qiita_map.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/542f59c4-0af2-81d2-8f8b-b782bf7182b6.gif)

そしてクリックイベントを設定しようと思ったら問題が…。全く反応しないんです。documentをクリックしても無反応…。困ったので、色々調べてみました。

```map.js
$(document).on("click", el => {
  console.log(el.target);
});

```



## BingMapsにはイベントクラスがある

公式ページで、`Microsoft.Maps.Events`を使うと、イベントを設定できることが判明。

> Events can be added and removed by using the methods available through the Microsoft.Maps.Events class. The Events class has the following static methods available.

　引用：[公式サイト：Events Class](https://docs.microsoft.com/en-us/bingmaps/v8-web-control/map-control-api/events-class)

ただ、イベント対象になるtargetの型はobject形式なので、DOMはダメっぽい…。

## onchangeやonclickなどの属性を入れよう！
なので、DOMにonchangeやonclickを入れて解決しました。自分でクリックイベント後の処理を関数化すれば、バッチリ機能します！

参考になれば幸いです！

```map.js
    pin.metadata = {
      title: "店名",
      description: '<i class="fas fa-camera-retro" onClick='console.log("hello")'></i>'
    };

```

![qiita_map2.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/11302a6f-2706-2d4e-5b01-77d2dea82ea9.gif)




## 参考URL
- [BingMapsを簡単に使う関数を作る](https://qiita.com/daisu_yamazaki/items/21cf0d7ca8b4b64847d5#%EF%BC%93map%E8%A1%A8%E7%A4%BAinfobox%E8%BF%BD%E5%8A%A0)
- [BingMaps GO!](https://mapapi.org/)
- [公式サイト：Events Classの説明](https://docs.microsoft.com/en-us/bingmaps/v8-web-control/map-control-api/events-class)
「石狩市へのプログラミング教育支援プロジェクト」

## さくらインターネット 『石狩市への小学校プログラミング教育支援プロジェクト』
2020年の小学校でのプログラミング教育必須化を迎えた時に、 石狩市内すべての小学校で、学校の先生がプログラミング教育の授業をおこなえるよう、2017年から活動しています。
メンバーも増え、活動も順調。みなさんにご覧いただけるものをポータルサイトにまとめて公開することもできました。

## ポータルサイトが出来ました!!
- [さくらのプログラミング教育ポータル](https://prog-edu.sakura.ad.jp/)
    -  [こどもプログラミング通信](https://prog-edu.sakura.ad.jp/kodomo-programming-tsushin/)
    - プログラミング教育に関連する動向、教材の紹介、出前授業に関するレポートなどをA4裏表に印刷し、石狩市教育委員会を通して各学校の先生方に配布しています。オンラインで、バックナンバーをご覧いただけるようになりました。


## Twitterアカウントを開設しました
- [@SakuraProgEdu](https://twitter.com/sakuraprogedu)
    - プロジェクトからのお知らせや、現場の授業で役に立つ情報をお届けしています。フォローをお願いします！
    - 2018年の HourOfCodeJP 企画にも参加し、[**プロジェクトからのメッセージ**を送りました](https://twitter.com/codeforeveryone/status/1071966607772147712)。(全員で集まることが珍しいチームのため、写真は2018年3月末のものです。その後に迎えたメンバーは、来年ご紹介します!)


## さくナレにて連載中!!
- [プログラミング教育必須化 ～さくらの取り組み～](https://knowledge.sakura.ad.jp/17215/)
    - プロジェクトの概要、取り組み、出前授業の様子などをじっくり紹介しています!


## イベントを開催しています
- 札幌、東京、大阪にて、[**小学校プログラミング教育を考える夕べ**](https://prog-edu.sakura.ad.jp/event-information/) を開催しています。

- 2018/12/09 には、[**第3回 小学校プログラミング教育を考える夕べ @東京**](https://sakura-kanto.doorkeeper.jp/events/82852) を西新宿セミナールームにて開催。参加者の皆さまには、パネリストに迎えた有識者の方々と忌憚なく意見を交わしていただくことができました。
- **2019/1/26** には、**オープンソースカンファレンス 2019 OSAKA**にて [**ITエンジニアも誤解している、2020年から始まる小学校プログラミング教育の話**](https://www.ospn.jp/osc2019-osaka/modules/eguide/event.php?eid=38) をお届けします！**お近くの方、ぜひお誘い合わせの上、ご参加ください！！**


### いよいよ2019年、新学習指導要領施行まであと1年です！ 目標に向かって、1日1日を大切に活動していきます!!
counsel-recentf の対象を Project 内ファイルに絞る

現在の Project 内のファイルのみを対象に `counsel-recentf` を実行する package を作りました。

本体は [GitHub/git-counsel-recentf](https://github.com/blue0513/git-counsel-recentf) に置いておきます。

## これは何

`counsel-recentf` の対象を「現在の Project のファイルのみ」に絞る package です。

#### Before: 対象を絞り込まない
<img width="600" alt="before.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/007dbfbe-d48e-cfc4-e897-295558fa4e34.png"> 

#### After: Project 内のファイルのみを対象にする
<img width="600" alt="after.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/9318adc5-67fb-1066-ad30-849ba0a68c52.png">

### 前提と課題と解決と

`recentf` は最近開いたファイルを一覧表示してくれる機能です。
そして `counsel` と組み合わせることで、インクリメンタルな絞り込みが可能になっています（See: [counsel-recentf]()）

しかし現在の Project 以外のファイルもすべて表示してしまい、絞り込み切れないこともあります。
なので Git 管理下の Project のファイルのみを対象にして、問題を解決します。

## 使い方

`init.el` に以下を記述します。

```elisp
(add-to-list 'load-path "YOUR PATH")
(require 'git-counsel-recentf)

;; お好みでどうぞ
(global-set-key (kbd "YOUR KEY") 'git-counsel-recentf) 
```

Git 管理下の Project で `M-x git-counsel-recentf` を実行すれば OK です。

## ちょっとした説明

```elisp
(defun git-counsel-recentf ()
  "Find a file on filterd `recentf-list'."
  (interactive)
  ;; Git Project でないなら、発火させない
  (if (not (check-git-project)) 
      (message "Not a Git Repository")
    (let* ((original-recentf-list recentf-list)
       ;; root ディレクトリの path を取得
	   (git-root-dir (git-root-dir-path))
       ;; recentf-list の要素で、root ディレクトリの path を含む要素のみに filter する
	   (filtered-list (--filter (check-path-match git-root-dir it) original-recentf-list)))
      ;; ivy に結果を渡す（ここは counsel と同じ）
      (ivy-read "Git Recentf: " (mapcar #'substring-no-properties filtered-list)
		:action (lambda (f)
			  (with-ivy-window
			    (find-file f)))
		:caller 'counsel-recentf))))
```
Rails ActiveRecordのアンチパターン　初心者→中級者へのSTEP22/25

#Rails ActiveRecordのアンチパターン
##はじめに
急にスケジュールが詰め詰めになったので、残り４日とわずかですが、今回は少なめです。すみません...
頑張ります。
今回はActiveRecordにおけるアンチパターンについて。パフォーマンスを落とすようなコードを書かないようにアンチパターンを日々、覚えるようにしましょう。

##All Each Pattern
`User.all`などでレコードを全取得してそこからeachで回すパターン。

```rb
User.all.each do|user|
  if user.created_at >= Date.new(2018)
    user.point += 100
    user.save
  end
end
```
2018年以降に登録してくれたユーザにポイントをプレゼントしよう的なコード（ほぼ[参考元](https://speakerdeck.com/toshimaru/active-record-anti-patterns?slide=14)のコードです。すみません）

**ダメなとこ**
1,Userの全件取得でメモリを圧迫。
2,eachメソッドにより取得したユーザー全件を一気にメモリに展開してから処理するので、こちらもよろしくない。

**改善策**
1,そもそも全件取得する必要がない。`where`を使って取得件数を下げる。
2,find_eachメソッドを使って、分割して処理する。（find_eachメソッドはeachメソッドと違って、一気にではなく分割して処理する。）


##改善後

```rb
User.where("created_at >= ?", Date.new(2018)).find_each do |user|
    user.point += 100
    user.save
end
```
よくなりました...と思いきや、まだ問題があります。

##N+1 update queries pattern
前にN+1問題は書きましたね。↓
[RailsのN+1問題の解決方法　初心者→中級者へのSTEP9/25](https://qiita.com/kamohicokamo/items/3303bc88f0ab5dc0aba8)

似たような感じの問題です。１回のselectに対し、N回のupdateが起きています。１回にしましょう。
→`update_all`を使う。

##再改善後

```rb
User.where("created_at >= ?", Date.new(2018)).update_all("point = point + 100")
```
**以前書きましたが、`update_all`はバリデーションをしませんので今回は問題ないですが、パフォーマンスが上がる！と言っってむやみに使ってはダメです。**

これでパフォーマンスがぐぐっと上がるはずです。

##まとめ
なんかほぼ自分のブログみたいになってきたこのカレンダー。お家がゴタゴタして書く暇あるか微妙ですが、残り数日休まず記事をあげたいです。今回のアンチパターンは参考元のスライドが非常にわかりやすいです。興味持ったらぜひそちらを読んでください。他の例も載せてくださってます。

##参考にしたの

ActiveRecordデータ処理アンチパターン
https://speakerdeck.com/toshimaru/active-record-anti-patterns?slide=26

簡単に始められるRailsパフォーマンス改善
https://qiita.com/yu-croco/items/d7a39b34036d638c5026