OmniAICreator/Qiita-1.07M huggingface dataset:
Unityエディタ拡張でLayerMaskFieldを表示する

## 経緯
UnityのデフォルトのEditorGUILayoutにはLayerMaskを編集するAPIがなぜか無い( Layer自体を設定するAPIはある )ので自作する必要があったりする
[参考ページ](https://answers.unity.com/questions/42996/how-to-create-layermask-field-in-a-custom-editorwi.html)

## サンプルスクリプト
以下のスクリプトを ~~Unityのプロジェクト内にあるEditorフォルダ以下に配置すれば利用できる。~~
Editorフォルダに配置するとゲームロジック側で利用するスクリプト内部で```#if UNITY_EDITOR```で括った箇所のエディタ拡張部分で呼び出しができない、( Editor拡張部だけをEditorフォルダ内に作る構成なら大丈夫なはず )

下の使い方スクリプトでも利用できるように書き換えました
ただこうすると通常のゲームロジック側でも呼び出せてしまうのでその際は実行ファイル出力時にビルドエラーが出るかも...いい方法ないかなぁ

```csharp
#if UNITY_EDITOR

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public static class MyEditorGUILayout
{
    
    // LayerMaskFieldはデフォルトでは無いので自作.
    public static LayerMask LayerMaskField(
        string label,
        LayerMask layerMask)
    {
        List<string> layers = new List<string>();
        List<int> layerNumbers = new List<int>();

        for (var i = 0; i < 32; ++i)
        {
            string layerName = LayerMask.LayerToName(i);
            if (!string.IsNullOrEmpty(layerName))
            {
                layers.Add(layerName);
                layerNumbers.Add(i);
            }
        }
        
        int maskWithoutEmpty = 0;
        for (var i = 0; i < layerNumbers.Count; ++i)
        {
            if (0 < ((1 << layerNumbers[i]) & layerMask.value))
                maskWithoutEmpty |= 1 << i;
        }

        maskWithoutEmpty = EditorGUILayout.MaskField(label, maskWithoutEmpty, layers.ToArray());
        int mask = 0;
        for (var i = 0; i < layerNumbers.Count; ++i)
        {
            if (0 < (maskWithoutEmpty & (1 << i)))
                mask |= 1 << layerNumbers[i];
        }
        layerMask.value = mask;

        return layerMask;
    }
}
#endif
```

**使い方**

```csharp

using UnityEngine;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif

namespace sample
{
    public class Sample : MonoBehaviour
    {

        [SerializeField] LayerMask mask;
        
#if UNITY_EDITOR

        // エディタ拡張部分.
        [CustomEditor(typeof(Sample))]
        public class SampleEditor : Editor
        {

            public override void OnInspectorGUI()
            {
                var component = target as Sample;
                component.mask = MyEditorGUILayout.LayerMaskField("Layer Mask", component.mask);
            }
        }
        
#endif
        
    }
}


```

## 実行画面

上記サンプルスクリプトを実装すると以下のようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/8b83f538-b459-516c-e195-f345c7686ef2.png)



いつかデフォルトでサポートしてくれるといいなぁ
Android プロジェクトでちょっとした Kotlin のコードを試す

## ① Scratch プラグインの導入

<img width="400" alt="スクリーンショット_2019-06-11_12_46_56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35733/a6c3dba8-22cb-f552-41a3-013b79184985.png">

## ② Scratch File を Kotlin を選択して開く

<img width="400" alt="スクリーンショット_2019-06-11_12_47_40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35733/f9f3ac84-fad2-dd17-94ef-9a9ad8b40d81.png">

<img width="200" alt="スクリーンショット_2019-06-11_12_47_54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35733/32b8238a-6bef-d474-5594-df721c595962.png">

## ③ 開いたタブで適当にコードを書いて実行

<img width="400" alt="スクリーンショット_2019-06-11_12_51_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35733/29e1d533-66a7-6102-402e-9ff2e323742b.png">

このままでも便利なのですが、モジュールを選択することで、**プロジェクト内のクラスを参照** することができます。
Pythonでツイートを全部消す

[黒歴史クリーナー](https://kurorekishi.me/cleaner/getstarted) の全ツイート削除機能の調子が悪い（全ツイートダウンロードファイルのアップロードが失敗する）ので、`python` で全ツイートを消す方法をメモする。`python` でダイレクトメッセージ出来るものとする。

1. [全ツイート履歴](https://help.twitter.com/ja/managing-your-account/how-to-download-your-twitter-archive) をダウンロードする
2. ダウンロードしたzipファイルを展開して`tweet.js` を取り出す
3. `tweet.js` の冒頭の `window.YTD.tweet.part0 = `を削除する
4. 以下のpython スクリプトを実行する

```python
import twitter
import json

api = twitter.Api(
    consumer_key='適切に置き換える',
    consumer_secret='適切に置き換える',
    access_token_key='適切に置き換える',
    access_token_secret='適切に置き換える',
    sleep_on_rate_limit=False
)

with open('tweet.js', encoding='utf-8', mode='r') as f:
    tj=json.load(f)
    for tweet0 in tj:
        tweet = tweet0['tweet']
        print(tweet['id'])
        try:
            api.DestroyStatus(tweet['id'])
        except Exception as e:
            print(e.args)
```

`DestroyStatus` で消すツイートがリツイートで元ツイートが凍結や削除されている場合にエラーが起きるから`try`-`except`で例外処理を行わないと途中で止まります。それ以外は以下とやってることは同じ

# 参考文献

* [Pythonでtweet全削除](https://trsing.hatenablog.com/entry/2019/03/06/233053)
コントローラとビューの仕組みについて

#コントローラで定義した情報をビューに渡すための仕組みについて、復習してみた。

Railsでは、**ルーティング→コントローラ→ビュー(MVC)**の順番で情報処理が行われている。
ここで、コントローラはビューにコントローラ内で定義した情報を渡すためのつなぎ役としての役割を担っている。では、コントローラで定義した情報をビューに渡す方法について、解説する。

まず、コントーラ内に以下のような記述をして情報を定義をする。

```ruby

class TweetsController < ApplicationController

    def index
      @tweets = Tweet.all
    end

  end
```
アクションの定義をして、その中にインスタンス変数を定義する。インスタンス変数とは、@つきの名前の変数をいう。上記の例では、@ tweets を指す。ここで、@マークをつけ忘れると、インスタンス変数ではなく、indexアクション内でしか使えないローカル変数としてみなされてしまい、ビューに情報(全てのツイート情報)を渡すことができない。

そして、渡された情報をビューで使用するには、その情報を<%= %>で変数名を囲んであげる必要がある。<%= %>の中のrubyコードは、ビューをレスポンスとして返すまでに実行されて、最終的にはHTMLになる。

例えば、上記の例において、ツイート情報をビューに写すためには、以下のような記述をする。

```ruby

<%= @tweet %>
```


　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
Kotlin Coroutineでイベントのテスト

`LiveData<T>`の`observe`などイベントが発行されるパターンのテストは準備が大変になりがちです。

コルーチンを使ってイベントのテストを行えるようにしたいと思います。

## イベントリスナーの実装

`LiveData<T>`の`observe`のイベントリスナーである`Observer<T>`をあらかじめ実装します。

```kotlin:AwaitableObserver.kt

import androidx.lifecycle.Observer
import kotlinx.coroutines.TimeoutCancellationException
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.withTimeout

class AwaitableObserver<T> : Observer<T> {
    private val channel = Channel<T>(Channel.UNLIMITED) //Channel.UNLIMITEDで発行済みの値を保持する

    override fun onChanged(t: T) {
        channel.offer(t) //channelに値を発行するだけ
    }

    suspend fun await(): T = channel.receive()

    suspend inline fun awaitWithTimeout(timeMillis: Long = 1000): T = try {
        withTimeout(timeMillis) { await() }
    } catch (e: TimeoutCancellationException) {
        throw Exception(e)
    }
}
```

## テスト

上記の`AwaitableObserver`で値をsuspendに取得できます。

```kotlin:test.kt
    @get:Rule
    val rule: TestRule = InstantTaskExecutorRule() // 非同期のテストをやるために必要

    @Test
    fun testAwaitableObserver() = runBlocking<Unit> {
        val observer = AwaitableObserver<Int>()
        val liveData = MutableLiveData(1).apply {
            observeForever(observer) // observeForeverならLifecycleOwnerを用意しないで済む
        }
        Assert.assertEquals(observer.awaitWithTimeout(), 1)

        launch(Dispatchers.IO) {
            delay(10)
            liveData.postValue(2)
        }
        Assert.assertEquals(observer.awaitWithTimeout(1000), 2)

        launch(Dispatchers.IO) {
            delay(10)
            liveData.postValue(3)
        }
        Assert.assertEquals(observer.awaitWithTimeout(1000), 3)
    }
```

## 複数の引数があるイベント

複数の引数があるイベントは`Pair`や`Triple`、あるいは自作の`data class`を使うことができます。

```kotlin
    @get:Rule
    val rule: TestRule = InstantTaskExecutorRule()

    class AwaitableOnSharedPreferenceChangeListener : SharedPreferences.OnSharedPreferenceChangeListener {
        private val channel = Channel<Pair<SharedPreferences?, String?>>(Channel.UNLIMITED)
        override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
            channel.offer(Pair(sharedPreferences, key))
        }

        suspend fun await(): Pair<SharedPreferences?, String?> = channel.receive()
    }

    @Test
    fun preftest() {
        // Context of the app under test.
        val appContext = InstrumentationRegistry.getInstrumentation().context
        val pref = PreferenceManager.getDefaultSharedPreferences(appContext)
        val listener = AwaitableOnSharedPreferenceChangeListener()
        pref.registerOnSharedPreferenceChangeListener(listener)
        pref.edit().putString("foo", "bar").commit()
        org.junit.Assert.assertEquals(runBlocking { listener.await() }, Pair(pref, "foo"))
    }
```
自宅サーバーでTwitter連携サービスを運営してたら家宅捜索された件

# 概要
ある朝自宅に神奈川県警が乗り込んできた。
(なお自宅は神奈川県ではない)
どうやら俺はTwitterにモロ画像を投稿していたらしい。
「間違いなくこの家から投稿されていた。プロバイダにも確認済みだ。」
「(ハンドルネーム)というアカウント使ってるでしょ」
「心当たりあるでしょ？」
「(ブランド名)のTシャツ持ってるでしょ？」

おやっ、何かがおかしいです。

# 想定される経緯
自宅サーバーではTwiGaTen( https://twigaten.204504byse.info/ )というWebサイトが稼動している。
そしてこいつはTwitterアカウントでログインしたアカウントのタイムラインを24時間365日収集し続けている。Twitterの仕様上、これは時々ログイン履歴として記録される。

そして警察はモロ画像をうｐしたアカウントのログイン履歴を見て…
「固定回線からうｐか。バカめ。」
「すぐに捜索して逮捕してやる。」
などと颯爽と我が家にやってきたようだ。

# 警察が調べていったもの

### スマートフォン
私の端末をその場で「押収」して、Twitterアカウントを確認された。
(ちなみに「押収」されると、自分の手で端末を持つことはできなくなる。)
自撮りはそれこそえちなものもあった(あるのかよ)がモロなんてあるわけない。
さらに画像フォルダも見たが当然あるわけない。なにより携帯の画面じゃ確認しにくいことこの上ない。
結局その場で「押収」は解除されて返却された。

### Wi-Fiとか
Wi-Fiのアクセスポイント、およびひかり電話ルーターのラベルを撮影していった。
おそらくMACアドレスと初期SSIDの記録が目的だろう。
もっとも自宅では初期SSIDなんて使っちゃいないのだけど。
なおPCは自宅サーバーも含め、一切調べられることはなかったし撮影もされなかった。

### 書類
プロバイダの契約書類を撮影していった。
捜査対象の回線契約はたしかにこの家に対応しているという証拠になるのだろう。

### 服
犯人がモロ画像の中で着ていたらしい服を探していた。
もちろんあるわけない。
タンスの中の写真を撮られた。

### その他
実家暮らしなので、家族の人に対しても、犯人がモロ画像を投稿したころの予定(どこかに出かけてたらしい)などを確認された。
なお結構前のことらしく、その時期の記録は何も残っていなかった。

# 何がおかしいのか
Twitterのログイン履歴には、皆さんご存知のとおり「どのアプリからログインしたか」「そのアプリの権限」が併記されている。
しかし、TwiGaTenのトークンは「読み込み」しかできないので、TwiGaTenからモロ画像を投稿することは不可能である。
というか**各ツイートに投稿に使用したアプリ名ついてるよね？**~~公式クライアント等からは見えないっぽいけど~~随分前にまた見えるようになっていたようです。
そもそもTwiGaTenは「画像転載を検索するサービス」だ。

そしてなにより、TwiGaTenの登録ユーザー数は3万人以上(2019/06/11時点)もいるのだ。
早い話が、**この3万人のうち誰かがやらかす度に、自宅に家宅捜索が入ってくる可能性がある**。ヤバい。

┌（┌ ・o・）┐ただの個人宅に3万人もツイッタラーがいるわけないだろ起きろ

┌（┌ ・o・）┐だからって俺がTwitterアカウントを3万個も持ってるわけないだろ起きろ

# 結論
- 自宅でTwitter連携サービスを運営するときは相応の覚悟が必要
 - 特に投稿が可能なやつはかなりヤバい
 - これだけのためにVPSやCDNを使う価値すらありそう
- 警察はログイン履歴をもう少しちゃんと見てくれ
 - そもそも連携アプリの概念を覚えてくれ
 - こうやって日本のITは萎縮していくんだからな(´・ω・`)

# もっと言うと
約2年前のことだけど、地元の警察が「自殺を薦めるツイートが自宅から投稿されている」って来たことがあった。TwiGaTenは変わらず自宅で運営していた。
なおそのときは「そのツイートの投稿時刻には家に誰もいなかった」「アカウント名が全然違う」などということであっさり終わった。
それと比べると神奈川県警の高圧的な態度が際立つ。嫌だねえ。
Rails6 のちょい足しな新機能を試す33（cache versioning error編）

# はじめに

Rails 6 に追加されそうな新機能を試す第33段。 今回は、 `cache versioning error` 編です。
Rails 6 では、 cache versioning をサポートしていない cache store を使っていると RuntimeError を raise するようになりました。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

今回は、cache store に [dalli](https://github.com/petergoldstein/dalli) を使います。
memcached は、1.5.16 を使ってます。

# rails プロジェクトを作る

```shell
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
```

# dalli を Gemfile に追加する

今回は、RuntimeError を raise させるためにわざと古い 2.7.9 の dalli を使います。

```ruby:Gemfile
...
gem 'dalli', '2.7.9'
```

# bundle install を実行する

```
$ bundle install
```

# cache の設定をする

`config/environments/development.rb` に、cache の設定を追加します。
ここで、 `'memcached'` は memcached が動作しているサーバーのホスト名です。

```ruby:config/environments/development.rb
  ...
  config.cache_store = :dalli_store, 'memcached'
end
```

# rails console を実行する

`rails c` を実行すると、RuntimeError が raise されます。

```
$ bin/rails c
/usr/local/bundle/gems/activerecord-6.0.0.rc1/lib/active_record/railtie.rb:104:in `block (3 levels) in <class:Railtie>':
You're using a cache store that doesn't support native cache versioning.
Your best option is to upgrade to a newer version of ActiveSupport::Cache::DalliStore
that supports cache versioning (ActiveSupport::Cache::DalliStore.supports_cache_versioning? #=> true).

Next best, switch to a different cache store that does support cache versioning:
https://guides.rubyonrails.org/caching_with_rails.html#cache-stores.

To keep using the current cache store, you can turn off cache versioning entirely:

    config.active_record.cache_versioning = false`
```

# 最新版の dalli では？

dalli を最新版にして、同じことをするとエラーが出ません。

なお、dalli は cache versioning を 2.7.9 からサポートしているようです。
ですが、Rails 6 の RuntimeError を出さないように対応しているバージョンは、 2.7.10 以降となります。

* [rails 5.2 cache_versioning support](https://github.com/petergoldstein/dalli/pull/698)
* [Advertise support for "cache versioning"](https://github.com/petergoldstein/dalli/commit/6e5e4b0d9f984446cbfd7b7d85cdb526d26af566)
* [Cache Invalidation Complexity: Rails 5.2 and Dalli Cache Store](https://blog.heroku.com/cache-invalidation-rails-5-2-dalli-store)

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try033_cache_error

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Error when using "recyclable" cache keys with a store that does not support it](https://github.com/rails/rails/pull/33932)
* [Cache Invalidation Complexity: Rails 5.2 and Dalli Cache Store](https://blog.heroku.com/cache-invalidation-rails-5-2-dalli-store)
* [rails 5.2 cache_versioning support](https://github.com/petergoldstein/dalli/pull/698)
* [Advertise support for "cache versioning"](https://github.com/petergoldstein/dalli/commit/6e5e4b0d9f984446cbfd7b7d85cdb526d26af566)
MacのGoogle IMEでかんたんに絵文字を出す

いろんな方法がありますが「誰にでも分かりやすい・面倒じゃない・忘れない」方法を。

意外に気付かないんですよね。

Google IMEを使用している場合以下からすぐ表示できます。

メニュー → 「絵文字と記号を表示」

<img width="426" alt="emoji_select.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275986/907ba747-4845-c9ff-1270-8fa5f3bd737b.png">

「文字ビューア」が起動
<img width="712" alt="emoji_palet.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275986/5868ae7d-fab0-a9ec-f053-8df4a6d69177.png">


# トラブルシューティング
メニューに「絵文字と記号を表示」がいない場合

環境設定 → キーボード設定
<img width="780" alt="keyboard-viewer.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275986/d14d4ed3-d7bb-d07b-c751-7e4c53aa79ee.png">
「メニューバーにキーボードビューアと絵文字ビューアを表示」にチェック

# おわり
たまにしか絵文字使わない方でも忘れない方法かなと。

ことえりだと、以下のショートカットがあるのでそちらがオススメです。
`command + control + スペースキー`

# ショートカット
GoogleIMEでもショートカットキーでパレットを表示できたら便利なのですが、
残念ながら存在しなそうです。(ないということが記載してあるだけでも価値があるかと)
トーク bot に送信した画像をダウンロードする

普段使わない API シリーズ第二弾。
トーク BOT の [コンテンツダウンロード API](https://developers.worksmobile.com/jp/document/1005026?lang=ja) です。

前回の記事「[LINEWORKS のコンテンツアップロード API を使う](https://qiita.com/kunihiros/items/9816fa1860613b3b1a3a)」と合わせると、別テナント同士でトーク bot を介して画像をやりとりすることができます。
お客様サポート用の bot とかだと、この機能は必要ですよね。

でもこれ、実はすんごい苦戦しました。
「わっかんないよっ！( ﾉД`)」と投げ出しかけましたが、先輩方の温かいアドバイスと、
前回「次はダウンロード API にするぞ！」と言ったことによるセルフ叱咤激励により、
ようやく完成しました！ヾ(*´∀｀*)ﾉ

##完成したコード

事前に `fs` モジュールと `request` モジュールはインストールしておきます。

```
> npm install fs
> npm install request
```
こちらが実際のコードです。

```js:download.js
const fs = require('fs');
const request = require('request');
const options = {
    method: "GET",
    uri: "http://storage.worksmobile.com/openapi/message/download.api",
    encoding: null,
    headers: {
        "consumerKey": consumer_key,
        "Authorization": "Bearer " + token,
        "x-works-apiid": api_id,
        "x-works-resource-id": resourceId
    }
};
request(options, function (error, response, body) {
    if (error){
        console.log(error);
        return;
    }
    fs.writeFileSync('image.png', body, 'binary');
});
```

それでは、今回のハイライトをば。

## request 時の encoding
これ、突き止めるのに苦労しました。。。みんな、当たり前に知ってることなのかな？

６行目の `encoding: null` 
こうしておかないと、response で送られてくる画像データがわけのわからない文字化けデータになります。
![1560219995.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/aba01be9-8b75-7754-9ad6-0ad1a5509e6d.png)

`encoding: null` 指定しておくと binary データで送られてきます。
![1560220111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/f5c15329-2180-10b5-56a7-98cc23a06a40.png)

これは、通常 request モジュールは `response` の `body` データを `toString()` に渡しているからです。
この時点でテキストデータとなり、`utf-8` でエンコードされます。
画像は binary データで処理しますので `encoding: null` の設定をしておく必要があります。

request モジュールで画像を扱うときには必要な知識ですね！大変勉強になりました(*´▽｀*)

## writeFileSync 時に拡張子と binary の指定

ローカルのフォルダに保存する際には `fs.writeFileSync` を使いました。
ファイル名には拡張子をつけて明確に「PNG ファイルだよ！」と強調しておきます。
こちらも、`encoding` の指定をしておかないと既定値の `utf-8` になるので `binary` を指定しておきます。

これで、トーク bot に送信した画像データを、あれやこれやすることができますよ！
やったね！(^^)/

#おわりに
ここまでお付き合いいただきありがとうございました。

これ、本当に苦戦しました( ﾉД`)ｼｸｼｸ…
request での画像データの扱い方とか、binary の知識とか、色々と足らないものがわかった一件でした。
ここ一年近く GoogleAppsScript と node.js 使って、少しは慣れたかな？と思っていましたが、まだまだ知識不足ですね。もっと勉強しないと。

ではまた！(^^)/

#参考にさせていただきましたm(_ _)m
[LINEWORKS Developers](https://developers.worksmobile.com/jp/document?lang=ja)
[request (GitHub)](https://github.com/request/request)
[fs.writeFileSync (公式)](https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options)

[node.js でインターネット上の画像をダウンロード](https://qiita.com/kobake@github/items/2a8e691d4755a9601b20)
rubyで証明写真を加工する

# 方法
## ライブラリー等のインストール
```sh
$ brew install imagemagick
$ gem install mini_magick
```

## 画像処理
```rb
require "mini_magick"
image = MiniMagick::Image.open("./image.jpg")

# 回転と切り取りを同じ処理プロセスの中に囲む
image.combine_options do |img|
  img.auto_orient # 画像の向きをEXIF情報を
  img.strip # EXIF情報の除去
  img.density(300) # DPIを300にする
  img.gravity(:center) # 画像の切り取り重心を中央に置く
  # width = 30mm, height = 40mm として切り取り開始
  img.crop("#{30 * 2.83 * 300}x#{40 * 2.83 * 300}+0+0!")
end

# `./output.jpg` に書き込む
image.write("./output.jpg")
```

# 結果
## 入力画像
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87438/499c4704-a44a-66fa-4de1-b059177f223c.jpeg)

## 出力画像
![output.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87438/370b68bb-2905-eae9-9f70-28b71dfbc6f6.jpeg)



# 参考
https://qiita.com/NaokiIshimura/items/a71cc118774e06d418c4
https://qiita.com/goyachanpuru/items/5939dbc1637e5ea4be74
https://morizyun.github.io/blog/minimagick-square-thumbnail-ruby/index.html
ROSでPython3を使う方法

# 背景
ROS1は公式にはPython2.7にしか対応していない。
けどいまさらPython2というのはやりづらい。
Web上にはソースからPython3でインストールする例が多いけど、時間がかかるし、なんだかんだうまくいかない。

# 基本
**ここを抑えておけばエラーが起きても対応できるし、応用もできる。**

* ROSのツール類(roscore, roslaunch, rosrun, catkinなど)はやっぱりpython2じゃないとだめ
* rospyだとかmsgs類（std_msgsとか自作のmsgs）などROSノード実行に必要なものははpython3でも動く
* ROSのツール類はshebangにより/usr/bin/pythonで起動する
* 以上からROSツール類は標準のpython2.7(/usr/bin/python)で実行され、python3で書かれた自作ノードは仮想環境上のpython3(/home/xxx/anaconda3/bin/pythonなど)で実行される状態が幸せ


# HOW

### Install
まず公式の通りにインストールする。
**その際に仮想環境(pyenv, conda)等からは抜けておくこと。**
ubuntu 18.04の場合python2.7がそもそも入ってなかったりだけど大丈夫。
pythonと打って標準の3.6が起動する状態でOK
[http://wiki.ros.org/melodic/Installation/Ubuntu](http://wiki.ros.org/melodic/Installation/Ubuntu)
この時点でpythonコマンドのリンク先がpython2.7になっているはず

### 環境構築
catkin_wsの作成も公式通り
**この場合も仮想環境からは抜けておくこと**
[http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment](http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment)
### Python3に切り替え
condaなりpyenvなり（私はcondaを使ってます）python3に切り替える。(pythonとうって仮想環境上のpython3が起動する状態)

このとき`echo $PYTHONPATH`すると`/opt/ros/melodic`と`./xxx/catkin_ws`内のdist-packageが設定されているはず。
この状態でroslaunchなりrosrunなりすると、roslaunch,rosrun自体はpython2.7で実行されるが、ROSノードは仮想環境上pythonで実行される。

当然この状態だとROSノード実行に必要なものがpython3の環境に含まれていないのでエラーが出る(rospkgなど)がpython3のpipでインストールできるのでエラーが無くなるまでpipでインストールする。
# その他
この状態だとpython2で書かれたノードもpython3で実行されてしまうけど、仮想環境を抜けるなりpython3に書き直すなりすればOK。
# 環境
Ubuntu 18.04
python3.7(Anaconda 3.7)
ROS melodic
【Unity】Oculus Questのコントローラ入力の取得方法まとめ

# はじめに
この記事は、OculusQuestのコントローラ入力の取得方法についての記事です。
OculusQuestのセットアップなどは他の人が記事でまとめているので参考にしてください。
筆者が参考にした記事は[こちら([Unity] Oculus Questで3Dキャラクターを眺めよう)](https://cocoamix.jp/archives/9243)

# OculusQuestのコントローラ入力の取得方法
Oculus系のコントローラ入力は、基本的にOVRInputを用いて取得します。公式リファレンスを参考にまとめました。
公式リファレンスのURL：[https://developer.oculus.com/documentation/unity/latest/concepts/unity-ovrinput/](https://developer.oculus.com/documentation/unity/latest/concepts/unity-ovrinput/)

## 入力可能な値
OculusQuestはOculus Touchコントローラを使用します。
入力として取れるものは以下の通りです。
- OVRInput.Button：ボタンを押しているかどうか(bool型)
- OVRInput.Touch：ボタンが指に触れているかどうか（bool型）
- OVRInput.Axis1D：トリガなどをどれくらい引いているか（float型）
- OVRInput.Axis2D：3Dスティックなどをどの方向に押しているか（Vector2型）
ここですごいのがOVRInput.Touch、ボタンを押さずに指が触れているだけで検知されます。

## 入力の取得方法
コントローラ入力の取得にはOVRInput.Get()を使用します。例えば、「Aボタンを押しているかどうか」取りたい場合は、
```OVRInput.Get(OVRInput.Button.One))```
を記述することで押していればTrue、押していなければFalseが返ってきます。
ほかにも、押された瞬間を取りたいときはOVRInput.GetDown()を、離した瞬間を取りたいときはOVRInput.GetUp()を使用すれば取れます（SteamVR Ver1.#で同じような関数を使用していたのでかなり使いやすく感じました）。

# さいごに
詳細は[公式リファレンス](https://developer.oculus.com/documentation/unity/latest/concepts/unity-ovrinput/)を参考にしてください。

# 参考
Oculus Questで入力全てを確認できるサンプルコードはGitHub([https://github.com/NaoKanata/OculusQuestControllerInputManager](https://github.com/NaoKanata/OculusQuestControllerInputManager))で公開してます。
※使用は自己責任でお願いします。
Pixi.jsの高解像度端末の対応

#今回の問題
高解像度端末でPixi.jsを用いて画像を表示した場合に
ぼやけて表示されてしまう。

#今回のゴール
iPhoneのRetinaディスプレイ端末のような高解像端末でも
ぼやけずに表示が可能になる。

#実際に行った対応
Pixiのアプリケーションに対して下記の設定を追加する。

```
resolution: window.devicePixelRatio || 1,
autoResize: true
```

#高解像度端末に対する対応ってそもそもなに？

高解像度端末に対する対応ってそもそもなに？
という方にはこちらのリンクが分かりやすいのでオススメです。
http://un-tech.jp/display-resolution/

今回ハマったところ
元々はpixi-spineがぼやけているのを改修するタスクだったのですが
調べていくとそもそもPixiの画像全体がぼやけていることに気づいた。

色々調べていくうちに解像度を設定できることには気づいたのですが
autoResizeのオプションがあることを知らずに色々と自分で試行錯誤しました。
https://github.com/pixijs/pixi-compressed-textures

というかnpmのPixiのコメントにautoResizeに関する記載書いてね〜〜〜😭と気づいた時は思いましたw
他のオプションはちゃんと解説はしてるのに…

Pixi内部のrendererが何やっているか１つづつ読んでいてオプションに気がつきました、という沼にハマったお話です。

#最後に

HTML5ゲームの開発でPixiを業務で触っていますがネット上にこれまでの知見がないため基本的に海外のGitHubのissueが頼りだったりします。
そのため実際の開発では実装よりも問題の調査などに時間を取られてしまうのが現状です。

今後伸びてくる分野だと思っているので記事を書いてくれる方が一人でも多いとPixi.jsの発展に繋がっていくのではと思い記事を書きました。
intelliJ IDEAで publicディレクトリをルート設定してパス補完する

こんな方法しかないんだろうか。。

追記：もっと楽な方法がありました。下記です。

## 解決すること

### 環境

```
IntelliJ IDEA 2019.1.3 (Ultimate Edition)
Build #IU-191.7479.19, built on May 28, 2019
JRE: 1.8.0_202-release-1483-b58 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.14
```

- site/ (intelliJ の project root)
    - .idea/
    - app/
    - public/

みたいなディレクトリ構成において、html内のsrcとかhrefとかのパスを、publicディレクトリ内で探索してコード補完してほしい場合、ググると「mark as resrouce root」に設定すればよい、みたいな情報を見かけますが、やってみてもだめです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255465/55d39c9e-ed15-057a-2b32-ccd3202e4f48.png)

そのやり方です。

## publicディレクトリのパスを ContentRoot として、手作業でimlファイルに追加する

手作業じゃないと「このディレクトリはプロジェクトに内包されてる」とおこられてしまいます。
おそらくこんな感じになります。

```.idea/site.iml
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$/public" /> <!-- この１行を足す -->
    <content url="file://$MODULE_DIR$" />
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>
```

この結果、publicディレクトリ内のファイルをコード補完してくれるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255465/53ae5b80-ed9e-e7a2-b280-68f4862f1e90.png)
plunkerで真理値表 その6

# 概要

plunkerで真理値表やってみた。
フリップフロップを再現してみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f33f79d9-c9a1-a081-ac86-d65f9d147b85.png)

# 成果物

https://embed.plnkr.co/x1Il46dlLcahEtH3Zw00/

以上。
ターミナルコマンド一覧 

touch　　　ファイルを作成する
mkdir 　　　ディレクトリを作成する
cd　　　　　ディレクトリを指定する
ls　　　　　ディレクトリの中身を表示する
ls -l　　　ファイルのパーミッションを確認する
pwd　　　　現在の位置を表示する
mv　　　　　ファイルとディレクトリの移動する。及び名前の変更をする。
  　　　　　（mv 移動させたいファイル 移動先）
  　　　　　（mv 名前を変えたいファイル 変更後名前）
rm　　　　　ファイル及びディレクトリを削除する
rm-rf　　　ディレクトリごと消す
モンティホール問題を通してVue.jsを学ぶ(入門者向け)


# はじめに

モンティホール問題をご存知でしょうか？
アメリカのテレビ番組で以下のようなゲームがあったそうです。

司会者と挑戦者がいる。
会場には３つのドアがある。
３つのうちどれか１つの後ろに景品（高級車）がある。残り２つの後ろはハズレとしてヤギがいる。

まず挑戦者は３つのうちどれか１つのドアを選ぶ。
次に司会者（モンティホール氏）が、挑戦者が選んでいない２つのうち１つのドアを開けてくれる。そこには必ずヤギがいる。つまりハズレである。
挑戦者は最初に選んだドアを開けてもよいし、ドアを選びなおして別のドアを開いてもよい。さて、どちらを開けるか？？

……ここで直感的にはどちらのドアを選んでも確率5分5分で、どっちでも同じのように思えてしまうのですが、実はここで**別のドアを選びなおしたほうが、景品（高級車）が当たる確率が２倍になるそうです**。

はたして、本当でしょうか？

私は本当かどうかを確かめるために、まずは家にあるお椀３つと豆で実験してみたところ、確かに選びなおしたほうが正解の確率が高くなる状態になっていました。

皆さんも試してみたいと思いませんか？

そんなわけで、「モンティホール問題を手動で検証する」サイトを作ってみました。

# モンティホール問題を手動で試してみる

https://yoshihisamurakami.github.io/monty-hall/

<img width="1154" alt="スクリーンショット 2019-06-10 23.31.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221909/10282097-bed6-82a8-b5ea-ca8e60a29a56.png">

(step1 ドアを選ぶ・・)

<img width="1154" alt="スクリーンショット 2019-06-10 23.31.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221909/997f3e47-cae2-6105-c8af-a0eac3aefb86.png">

(step2 次へボタンを押すと・・)

<img width="1154" alt="スクリーンショット 2019-06-10 23.32.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221909/c3eb5c38-7f31-0025-caaa-457cd6a3dd5c.png">

(step3 ヤギが現れる。別のドアを選んで「ドアを開ける」と・・？）

<img width="1154" alt="スクリーンショット 2019-06-10 23.32.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221909/4ca23cb9-3e33-e3f2-585c-98ef7e505a0c.png">

(step4 不正解！！)

というなんとも力技に近い検証方法になりますが、これを30回くらい（手動で）一生懸命に繰り返すと、

- ドアを選び直さなかった場合
　正解数: 11, 不正解数: 19, 正解率: 36.7 %
- ドアを選びなおした場合
　正解数: 24, 不正解数: 6, 正解率: 80 %

という結果になりました。理論上は選び直さなかた場合が33.3%、選びなおした場合が66.6% になるらしいです。

## 技術面について
上記ページですが、ソースコードは以下になります。

https://github.com/yoshihisamurakami/monty-hall

Vue.jsを使ったものになります。それほどきれいなコードではないかもしれませんが、Vue.jsの基礎レベルとして以下のような技術を使っています。

- [算出プロパティとウォッチャ](https://jp.vuejs.org/v2/guide/computed.html)
- [クラスとスタイルのバインディング](https://jp.vuejs.org/v2/guide/class-and-style.html)
- [条件付きレンダリング](https://jp.vuejs.org/v2/guide/conditional.html)
- [リストレンダリング](https://jp.vuejs.org/v2/guide/list.html)
- [コンポーネントの基本](https://jp.vuejs.org/v2/guide/components.html)
- propsを通して親componentから子componentへデータを渡す
- $emitを通して子componentから親componentの関数を呼ぶ
- $storeを使ったデータの保存

私はVue.jsを学習するにあたって、まずは公式サイトを「読んで」, 気になるところは入力して動作を試してみたりしたのですが、文章を読むだけでいまひとつ「何に使われるのか」イメージしづらいことがありました。
モンティホール問題の検証サイトを手を動かして作ってみることによって、それぞれの技術の使いどころを把握することができましたし、ある程度Vue.jsに慣れることができました。

SPAの初期学習の段階では、上記のようなサイトを自力で作ってみることをオススメします！

# ちなみに
https://qiita.com/search?q=%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB

他の方々もモンティホール問題を解くサンプルが様々あるようです。ご参考までに。
初めまして

# 初めまして
全然関係ない業界から未経験でPG転職を目指してます。
職業訓練校に通いながら、ProgateでPythonやJavaを勉強しています。
訓練で広く浅くLinuxやらhtml/CSS/JavaScriptも勉強しています。

Qiitaで技術系の記事をいつも参考にさせていただいてます。

## ポートフォリオについて
メンターから「作った成果物をポートフォリオに纏めておくといいよ」ということで、色々と考えているんですが、どういった形式で作るのが便利なんだろうか･･･。
というところが最近の悩み。

PythonでCLI上で動くAVGっぽいのを作ってみたけれど、どこに出したもんかと思案中。
Lambdaのカスタムランタイムを試す

##はじめに
いまさらながらLambdaのカスタムランタイムを試してみます。
https://docs.aws.amazon.com/lambda/latest/dg/runtimes-walkthrough.html

##手順
関数の作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/ca0042da-4046-b938-fbc9-8f3e6f0f8561.png)

-から作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/61f1e201-6d49-6a85-6064-c5ac24d9d8e0.png)


ランタイム>デフォルトのブートストラップを使用する。＞関数の作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/5e8461f3-fec4-5cba-3fb5-caa2480bd1b4.png)

※ユーザ独自のブートストラップも使用可能です。
ブートストラップは、初期化処理と無限ループでイベントが来るとLambda関数を実行し、レスポンスを返す定義をします。

bootsrapとhello.shが作成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/e5499384-295f-76c9-c175-4ece42b6c856.png)

bootsrap

```sh

#!/bin/sh
set -euo pipefail

# Handler format: <script_name>.<function_name>
#
# The script file <script_name>.sh  must be located at the root of your
# function's deployment package, alongside this bootstrap executable.
source $(dirname "$0")/"$(echo $_HANDLER | cut -d. -f1).sh"

while true
do
    # Request the next event from the Lambda runtime
    HEADERS="$(mktemp)"
    EVENT_DATA=$(curl -v -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
    INVOCATION_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)

    # Execute the handler function from the script
    RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")

    # Send the response to Lambda runtime
    curl -v -sS -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$INVOCATION_ID/response" -d "$RESPONSE"
done

```

hello.sh

```sh
function handler () {
    EVENT_DATA=$1

    RESPONSE="{\"statusCode\": 200, \"body\": \"Hello from Lambda!\"}"
    echo $RESPONSE
}
```

###テスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/5f301bb5-19b0-347d-f3b0-18f59316e281.png)

##投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
Jenkins not executing jobs (pending - waiting for next executor)

初めてJenkins触っている。
JOB単体が動くけど、パイプラインにすると動かなくて、

`Jenkins not executing jobs (pending - waiting for next executor)
`

が出てた。
色々ネットで調べて、主にノードがOffされたとか、容量が足りないとか書かれているが、
その以前に、

Jenkinsの平行実行ジョブ数１になっていた、
`Manage Jenkins>システムの設定>エグゼキュータの数`

pipeline自体が１つのJOBとしてカウントされるから、当然それ以下JOBもずっと終わらないものを待っている。
そもそも、もしPipelineにjob buildした場合、平行実行数が足りないよって警告をだしてほしいなと密かに要望。
Python タプルまとめ

# タプルまとめ

## タプルとは
要素を順序づけて組み合わせたもの。型はtuple型

```
book=(1001,'Python入門') #タプルを生成しbookに代入
print(type(book)) # tuple
print(book[0]) # 1001
print(book[1]) #'Python入門'
```

## リストとの違い
タプルはイミュータブル（変更不可)
以下はエラー

```
book=(1001,'Python入門')
book[0]=1002
```

## タプルの生成

基本は()の中にカンマ区切りで生成。
ただし、曖昧さがなければ()は省略可能

```
t0=(1,2,3) # 基本
t1=1,2,3 #t0と同様
t2=1,2,3, #最後にカンマOK(1,2,3)を生成
x=(1) # これはタプルではないxはint 1
```

### メソッドでのタプル生成
tuple()メソッドの引数に様々なものを渡して生成できる。

```
t0=tuple()
t1=tuple('ABC') # ('A','B','C')
t2=tuple([1,2,3]) # (1,2,3) リストから生成
t3=tuple({1,2,3}) # (1,2,3) セットから生成
t4=tuple(range(5,8)) # (5,6,7) イテラブルから生成
```

## パックとアンパック
複数個の値からタプルを作ることをパックという。

```
t1=1,2,3 # (1,2,3)を生成

```

逆にタプルを複数の値に分割するのがアンパック
なお、要素数違いはエラーとなる

```
a,b,c=(1,2,3) # aに1,bに2,cに3が代入される
a,b,c=(1,2,3,4) # エラー
```
tarコマンドで圧縮ファイルの場所を指定する方法

# 大したことではないのです。
初めて知った時はこのコマンドに対してオプションがめちゃんこあったので、そっちを覚えるのに時間を食って、ついぞそれ以来tarコマンドに関して調べることはしていなかったのですが、展開したパッケージを移動させるために、mvコマンドで動かしていたのですが、地味にめんどくさいと感じてきた、というのが今回の話です。

海外サイト眺めると、ExtractとCompressで表記されています。直訳だと抽出と展開ですが、Extarctは展開とされています。

## 圧縮先も展開先もtarコマンドで指定できるってよ

圧縮する場合。

```
$ tar -czf 圧縮先パス/圧縮ファイル名　圧縮対象ファイルorディレクトリ

# 例
$ tar -czf ~/hogehoge/hugahuga/aaaaa.tgz dabadaba/
```

展開する場合。

```
$ tar -xf 展開したいファイルのあるパス/展開したいファイル -C 展開したいパス

# 例
$ tar -xf ~/hugahuga/zubazuba/gagaga.tgz -C /hogehoge/
```

圧縮も展開もパス指定して任意の場所にできるので楽ですね。
Firebase-Functionsのハローワールド覚書

## 何がしたいか
Functions使いたい。


## プロジェクトを作成
1. FirebaseConsoleにアクセス
	- [Firebase](https://console.firebase.google.com/)
2. プロジェクトを作成
	- プロジェクト名決めて、規約に同意するだけ

## firestoreのセットアップ
※これないとデプロイする時に「firestoreが有効になってない(意訳)」ってエラーでデプロイが止まる。

1. FirebaseConsoleにアクセス
	- [Firebase](https://console.firebase.google.com/)
2. サイドメニューからdatabaseを選択
	- ルール設定しとく



## Functionsをセットアップ
※これだけwebで完結しない。
開発環境用意して色々しないといけない。

### 開発環境を作成
1. PCにNode.jsを入れる
	- [Node.js](https://nodejs.org/ja/)
2. Firebase CLIを入れて設定
	1. `npm install -g firebase-tools`
	2. `firebase login`
3. Firebaseディレクトリを作成
	1. 空のディレクトリを作成
	2. `firebase init`
		- ディレクトリはさっき作ったので。
		- 入れる機能は全部でOK。
		- プロジェクトはさっきweb上で作ったモノで。
		- 色々セットアップ用のファイル名聞かれるけど、デフォルト名を使うならそのままEnterでOK。
		- JSかTSかというとTS。
	3. `functions/src/index.ts`にハローワールドの例文があるので、コメント外しとく。
	4. `firebase deploy`
4. Functionsにアクセス
	- [Functions](https://console.firebase.google.com/u/0/project/sample-fb-9e25e/functions)
	- ハローワールドのAPIが追加されているので、URLパクってアクセスしてみる
	- ハローワールド
dot net core アプリケーションでapplication.jsonを参照する

# 結論
application.jsonの記述に対応したclassを作成し、Startup.csと使用するコントローラで読み込み処理を記述する。

## 環境
JetBrains Rider
dot net core 2.2
C#

## 準備
### appication.json
```json
  "IsDebug": false,
  "Logging": {
    "LogLevel": "Warning"
    }
  },
```

### 対応クラス(AppSetting.cs)
```C#
    public class AppSetting
    {
        public bool IsDebug { get; set; }

        public Logging Logging { get; set; }        
    }
```

### 読み込み用クラス(Logging.cs)
```C#
    public class Logging
    {
        public string LogLevel { get; set; }
    }
```

## 読み込み
### Startup.cs
```C#
        public void ConfigureServices(IServiceCollection services)
        {
            // 元からある行
            services
            .AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            
            // これを追記
            services.Configure<AppSetting>(Configuration);
        }
```

### HogeController.cs
```C#
        public HogeController(IOptions<AppSettings> optionsAccessor)
        {
            AppSetting = optionsAccessor.Value;
        }

        private AppSetting AppSetting { get; }
```

これでコントローラ内で値が設定されたAppSettingクラスを参照できます。
オブジェクトもキャストしてくれるみたいで便利。
Aginity Workbench for Netezzaでテーブル作成DDLをエクスポートする

データベースを指定し、そこで管理している全テーブルやVIEWのDDLがほしい、というときの
一括生成する方法を忘れないようにメモ。

１．対象のデータベースを右クリックで
Script Databaseを選択。
![scriptdatabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386370/7f7568a5-03a9-af4c-f47a-b71bccd8adfe.png)

２．テーブルやビュー、シノニムなどエクスポートしたオブジェクトにチェックを入れる。

![テーブル選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386370/e5c5d3d6-1fc0-436e-ef86-8cd059ad5c23.png)

３．画面上のGenerateで欲しい形式を選択。
![generate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386370/59f483db-2b4b-5ca5-e318-85503c7c4458.png)
Powerappsで並び替えをする方法

#Powerappsで並び替えをする方法

参考文献はこちら
[PowerAppsTips～データのソート SortByColumns関数～](http://poohkids.com/office/powerapps-sortbycolumnfunc/)

##Sortをコントロールする場所をみつける。
sortがはまっている場所は、ギャラリーから選択すると見つけられる。場所は、ここ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204488/bd29fd6b-8d9d-f89f-5386-30885fa4f296.png)



##コードを書き換えてみよう

```
SortByColumns(Search(テーブル1, TextSearchBox1.Text, "ジャンル","金額","項目"), 
"ジャンル", If(SortDescending1, Descending, Ascending))
```

とこんなかんじになっていますので、ジャンル→日付にしてみましょう。


以下のコードに変更すればいいでしょう。

```
SortByColumns(Search(テーブル1, TextSearchBox1.Text, "ジャンル","金額","項目"),
 "日付", If(SortDescending1, Descending, Ascending))
```

そうするとこんなかんじでまずは並び替えることに成功する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204488/cd7566ce-a266-34a1-9ada-a5558a0a3a7d.png)

出力結果はこんな感じで、日付別になる。

##昇順と、降順を切り替えよう。

sort desending

```
SortByColumns(Search(テーブル1, TextSearchBox1.Text, "ジャンル","金額","項目"), 
"日付", Descending)
```

最後の項目を
If(SortDescending1, Descending, Ascending))
→
Descending
#Webエンジニア,  #Webスタートアップ 向け IoT 入門 の 地図 (初級編)

もと Web系フリーランスだった私が、電子工作やサーバサイド 試作エンジニアになった時の流れを いくつかの投稿にわけて簡単にまとめてみようと思っています。

現在 #Webエンジニア #Webスタートアップ の方も デバイス側がわかると API設計や Web画面設計に役立つと思います。 IoT系の仕組みを取り入れる事で他にない強みになる可能性も。

今回は 簡単な電子工作として LEDを光らせるまで の地図です。 
(私の頃にはなかった サービスや電子工作部品も紹介しています。

#準備 必要環境
- Wi-Fiがある環境
- ノートPC や Androidタブレット
- 最新のChromeブラウザ

# STEP1 
学習の為に obniz(マイコン) と LED(発行ダイオード) を購入する
[obniz](https://obniz.io/ja/) 
[５ｍｍ赤色ＬＥＤ　ＯＳＲ５ＪＡ５Ｅ３４Ｂ](http://akizukidenshi.com/catalog/g/gI-12605/)

## [obniz](https://obniz.io/ja/) 
私が 電子工作を始めた頃は [Arduino](https://www.arduino.cc/) が入門としては良かったのですが、 開発環境作ったり回路部分を理解したり大変なのであまりオススメできません。 
現在はブラウザで開発環境が実行でき手軽に動かす体験ができる obniz がいいかなと思います。

```
obnizはWebから操作できるハードウェアです。難しかったハードウェアもWEB技術なら簡単に扱えます。
WEBで使える豊富なライブラリとハードウェアを組み合わせることもできます。
また、WEBにある1つのソフトウェアから世界中に置いたすべてのハードウェアをコントロールできます。
```

## [５ｍｍ赤色ＬＥＤ　ＯＳＲ５ＪＡ５Ｅ３４Ｂ](http://akizukidenshi.com/catalog/g/gI-12605/)
色々種類はあるのですが、まずは 価格も安くよく使われている 赤色 砲弾型 LED がおすすめです。

```
電流を流すと光を発する半導体素子。
電気信号を光信号に変える機能がある。
高輝度で電球に比べて発光量あたりの消費電力も少ない。
発光色は、赤やオレンジ、緑などの他、青色発光のLEDも登場している。
振動にも強く、寿命も長いため屋外の装飾用サインなどに利用されている。
```

# STEP2 ドキュメントを眺めてみる。
[obniz ドキュメント](https://obniz.io/ja/doc/root)
電子工作では ドキュメントを眺めてみるのは大事な工程です。
その 電子基板(マイコンボードが) どんなことができる物なのか簡単に理解してから
次へのステップへ

# STEP3 obniz を初期化してみる。
[HTML5 クイックスタート](https://obniz.io/ja/lessons/lessons/quickstart) を参考に初期化してみる。

[写真]

# STEP4 obniz と LEDを接続
[LED ドキュメント](https://obniz.io/ja/sdk/parts/LED/README.md) を参考に接続してみましょう。

[写真]

# STEP4 LEDを光らせてみる (Lチカ)
プログラミングでいう `Hello world!!` に当たるのが LED を光らせる `Lチカ` です。初めていじるマイコンボードや動作テストの時に利用することがあります。

[写真]

# おわり
無事に光ったでしょうか？ 通信部分を意識せずに、ブラウザから物理的なLEDを 
ON/OFF できるようになったかと思います。
興味湧いた方は [SDKパーツライブラリ](https://obniz.io/ja/sdk/parts) をみて
モーターやセンサー等も試していくといいと思います。

モーターやセンサーは [秋月電子](http://akizukidenshi.com/) や [スイッチサイエンス](https://www.switch-science.com/) で通販できるので覗いてみてください。


# 備考
[スイッチサイエンス](https://www.switch-science.com/)
とてもよく利用しています。

[秋月電子](http://akizukidenshi.com/)

[浅草橋工房](https://www.craft-studios.com/)
電子工作入門的な ワークショップをしている スペースのようです。
いちど入門系ワークショップに行ってみるのもおすすめです。
BootStrap２日目

しばらく空いてしまったが続き。これ書いたらJavaScriptに入る。
JSが終わってたらMySQLやって、WEBページ作ってみようかな。

#グリッドシステム
##グリッドシステムとは？
- レイアウトを格子状に分解して配置するデザイン手法
- コンテナ、列、行を使用して、コンテンツをレイアウトし、整列
- 画面サイズによって、レイアウトが変わり、画面サイズが異なるデバイスでも、いい感じに表示される。


グリッドは列数を12として考える。

このサイトが詳しそう→[ref](http://websae.net/twitter-bootstrap-grid-system-21060224/)

１２分割したカラムのうち、１つだけを使っている場合

```
<div class="row">
	<div class="col-1 orange">1</div>
</div>
```

これはcol-5が先に決まり、未指定は自動で決まる。
auto1とauto2は同じグリッド数。

```
			<div class="row">
				<div class="col orange">auto1</div>
				<div class="col-5 orange">5</div>
				<div class="col orange">auto2</div>
			</div>
```

### 画面幅についてもう少し。

- Extra Small
- Small
- Medium
- Large
- Extra Large

それぞれブレイクポイントを期に切り替わり、大きい画面幅から切り替わったら縦並びになる。
例えば画面幅をsmall(sm)に設定していたら、smallの画面幅になった途端に縦並びになる。

```
			<div class="row">
				<div class="col-sm orange">A</div>
				<div class="col-sm orange">B</div>
				<div class="col-sm orange">C</div>
			</div>
```

lgより上の画面サイズではlgで指定したグリッド数
lgより下では、mdで指定したグリッド数になる
mdの画面サイズ以下では縦並びになる。

```
			<div class="row">
				<div class="col-lg-1 col-md-2 orange">1</div>
				<div class="col-lg-1 col-md-2 orange">1</div>
				<div class="col-lg-1 col-md-2 orange">1</div>
				<div class="col-lg-1 col-md-2 orange">1</div>
				<div class="col-lg-1 col-md-2 orange">1</div>
				<div class="col-lg-1 col-md-2 orange">1</div>
				<div class="col-lg-1 col-md-2 orange">1</div>
				<div class="col-lg-1 col-md-2 orange">1</div>
				<div class="col-lg-1 col-md-2 orange">1</div>
				<div class="col-lg-1 col-md-2 orange">1</div>
				<div class="col-lg-1 col-md-2 orange">1</div>
				<div class="col-lg-1 col-md-2 orange">1</div>
			</div>
```
Rubyでスリザーリンクを解いてみた-その１(導入)

今回は導入です。

Rubyの勉強も兼ねて、スリザーリンク(ループコースパズル・ナンバーライン)を
解くアルゴリズムを開発してみました。
[スリザーリンクとは] (https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AA%E3%82%B6%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%AF)

スリザーリンクはNP完全問題なので、大きさや難易度によって時間はかかりますが、
30x30くらいならば1分かからないくらいで解けます。

こちらは作成中のサイトです。
[スリザーリンク解答サイト] (https://www.sentohsharyoga.com/)
RobolectricでDuplicate class エラー

Robolectricでテスト実装しています。
sharedTestディレクトリに配置することでJVMでのテストも実機でのテストも可能ということでやっています。
しかしローカルJVMでのテストは正常に動作したのですが、実機でのInstrumented Testを実行すると以下のようなエラーがでてハマりました。

```
Duplicate class org.apache.maven.artifact.Artifact found in modules maven-ant-tasks-2.1.3.jar (org.apache.maven:maven-ant-tasks:2.1.3) and maven-artifact-2.2.1.jar (org.apache.maven:maven-artifact:2.2.1)
Duplicate class org.apache.maven.artifact.ArtifactStatus found in modules maven-ant-tasks-2.1.3.jar (org.apache.maven:maven-ant-tasks:2.1.3) and maven-artifact-2.2.1.jar (org.apache.maven:maven-artifact:2.2.1)
Duplicate class org.apache.maven.artifact.ArtifactUtils found in modules maven-ant-tasks-2.1.3.jar (org.apache.maven:maven-ant-tasks:2.1.3) and maven-artifact-2.2.1.jar (org.apache.maven:maven-artifact:2.2.1)
...略
```

`./gradlew app:dependencies` で依存関係を調べてみましたが、そもそも `maven-ant-task` も `maven-artifact` も Robolectric内部でしか参照されていない状態でした。
バグかなーと思い[シンプルなサンプル](https://github.com/googlesamples/android-testing/tree/master/ui/espresso/FragmentScenarioSample)と見比べていたところ、
`app/build.gradle`に以下の誤りを見つけました。

```gradle:app/build.gradle
// 誤
androidTestImplementation "org.robolectric:robolectric:$robolectricVersion"

// 正
androidTestImplementation "org.robolectric:annotations:$robolectricVersion"
```

わかりますか？ モジュール名の `robolectric` と `annotations` が違っていました。
ぐぐっても出てこないし時間かかりました。
WSL環境をバックアップするためのシェルスクリプト


#どうしてつくった
ubuntu 18.04の中にLAMP環境を構築しています。
しかし、初心者なので失敗が多く、そのたびに再インストールして…がしんどくなってきました。
そこで、仮想環境みたいにここまで環境設定したら状況保存（スナップショット的に）できないかな？と思って調べたら、できるそうです。

[WSLのバックアップを検討する - concerti.tsukubaのブログ](http://concerti.hatenablog.com/entry/2018/02/06/214659)
[WSL環境のバックアップ - 杜撰ブログ](http://sloppy-content.blog.jp/archives/8754267.html)

#環境
- windows 10
- ubuntu 18.04

# シェルスクリプト
スナップショット的に使いたいので、シェルスクリプトにしました。

```sh:backup.sh
#!/bin/sh

#バックアップパス
bkpath="/mnt/c/WSL_Ubuntu/bkup"

# バックアップ先のディレクトリがあるか確認する
if [! -e $bkpath ] ; then
# 存在しない場合、作成する
mkdir -p $bkpath
# 除外ファイルリスト作成
cat <<EOL >> $bkpath/exclude_list.txt
/mnt
/dev
/proc
/tmp
/sys
/run
/var/log
EOL

fi

# バックアップ
# バックアップフォルダ名（yyyyMMddHHmm）
today=$(date "+%Y%m%d%H%M")

# バックアップフォルダ作成
mkdir -p $bkpath/$today

# ルートディレクトリからtarで圧縮
sudo tar -cvpjf $bkpath/$today/backup.tar.bz2 -X $bkpath/exclude_list.txt /

# パッケージリストを作成（バックアップだけが目的であれば必要ない）
dpkg-query -f '${binary:Package}\n' -W >   $bkpath/$today/list_pkg.txt
pip list --format=columns > $bkpath/$today/list_pip.txt
tlmgr list --only-installed > $bkpath/$today/list_tex.txt
```

#### TODO
- [ ] 差分取り込み
- [ ] レストア
- [ ] レストアの差分込の復帰
NPM advisory #886: fstreamの任意のファイルを上書きされる脆弱性

「[Top 5 New Open Source Security Vulnerabilities in May 2019](https://resources.whitesourcesoftware.com/blog-whitesource/top-5-open-source-vulnerabilities-for-may-2019)」に挙げられている[fstreamの「Arbitrary File Overwrite」](https://www.npmjs.com/advisories/886)について、日本語情報が[JVNDB等にも見つからなかった](https://jvndb.jvn.jp/search/index.php?mode=_vulnerability_search_IA_VulnSearch&lang=ja&useSynonym=1&keyword=fstream)のでアドバイザリーを和訳しておく。なお冒頭記事の公開時点では、NVDに登録されていなかったとのこと（多分まだNVDにはみつからないはず）。

# 任意のファイルが上書きされる - fstream

※以下は https://www.npmjs.com/advisories/886 の私訳です。

## 概要

`fstream` 1.0.12以前のバージョンには、任意のファイルを上書きされる脆弱性があります。ハードリンクを含むtarボールを展開する際、システム上にそのファイルが存在する場合に、このハードリンクに対応するファイルがその展開された内容で、システム上のファイルを上書きします。`fstream.DirWriter()`に脆弱性があります。

## 修正方法

1.0.12またはそれ以降のバージョンにアップグレードしてください。

## リソース

* [GitHub Commit](https://github.com/npm/fstream/commit/6a77d2fa6e1462693cf8e46f930da96ec1b0bb22)

----

本ページ内容は筆者が参照の便のためにある時点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
Windows 10 > **トラブル**> Windows Updateを適用後、OSが起動しなくなった (VScodeは無実 => ホストOSが壊れた)

```txt:動作環境
VMWare Workstation 14 Pro
Windows 10 Pro (64bit) バージョン 1809  on VMware
  VScode 2019年6月7日最新版をインストール
  RAD Studio 10.2 Tokyoインストール
```

### 症状

VMWare上のゲストOS(Windows 10)に2019年6月10日に取得されたWindows Updateを適用した。

Windows Update適用に45分かかり、再起動後、黒い画面のままログイン画面に到達しなくなった。
(1時間放置、再起動してもダメ）。

### VScodeインストール前

VScodeインストール時(6月7日)にVMWareにてスナップショットをとっていた。
スナップショットでVScodeインストール前に戻しWindows Updateを適用したところ、正常に起動した。

### VScodeが問題? (=> 無実)

再現テストはしていない。
VScodeがらみでWindows Updateが失敗したか不明であるが、上記のような状況ではあった。

RAD Studio 10.2 Tokyoはインストールして長く使っているが、それ自体ではこれまで問題はなかった。

### 関連

VScode関連でWindows Updateに問題が出た例としては以下がある。

- 14 Apr 2018 [Windows update failed: Access is denied](https://github.com/Microsoft/vscode/issues/47841)


### 追記 
(追記: 2019-06-11)

VScodeを入れていないゲストOSも起動しなくなった。
どうもホストOSが壊れたようだ。

ゲストOSの症状として

A. 起動に失敗する
B. 起動に成功した後、USB接続でOSがフリーズする

致命的な問題。

(追記: 2019-06-12)
以下で対処した。
[2019-06-12 Windows 10 > v1903適用後、VMWareが使い物にならなくなる > v1809に戻す](https://qiita.com/7of9/items/3cfbc0459bc8d0b3edcc#_reference-0ff14e901fb7a839390a)
Node: 関数の実行速度を計測する(Performance Timing API使用)

Node.jsの[Performance Timing API](https://nodejs.org/api/perf_hooks.html#perf_hooks_performance_timerify_fn)を使って、関数の実行速度を計測する方法を紹介する。


Performance Timing APIは高解像度パフォーマンスメトリクスの収集をサポートするAPI。

## 基本的な使い方

```js
const {performance, PerformanceObserver} = require('perf_hooks');

// 測定対象の関数
function someFunction() {
    console.log('hello world');
}

// 測定対象の関数を測定可能にする
const wrapped = performance.timerify(someFunction);

// 測定結果を随時処理するオブザーバーを定義する
const obs = new PerformanceObserver((list) => {
    console.log(list.getEntries()[0].duration);
    obs.disconnect();
});
obs.observe({ entryTypes: ['function'] });

// 測定を開始
wrapped();
```

## 測定しやすくする関数を作る

Performance Timing APIをそのまま使ってもいいが、測定しやすくなるよう関数化しておくといい。

```js
const {PerformanceObserver, performance} = require('perf_hooks')

const measure = (fn, loop = 100) => {
    return new Promise(resolve => {
        const obs = new PerformanceObserver((items) => {
            const durations = []
            for (const perf of items.getEntriesByType('function')) {
                durations.push(perf.duration)
            }
            const average = durations.reduce((a, b) => a + b, 0) / durations.length // 平均値の計算
            obs.disconnect()
            resolve(average)
        })
        obs.observe({entryTypes: ['function'], buffered: true})
        const f = performance.timerify(fn)

        for (let i = 0; i < loop; i++) {
            f()
        }
    })
}
```

測定する:

```js
(async () => {
    function fib(n) {
        return n < 2 ? n : fib(n - 2) + fib(n - 1)
    }

    let seconds = await measure(() => {
        fib(30)
    })
    console.log(seconds)
})()
```
SFDC:メールリレー　office365でSMTPリレーを使用できなかったためSPFで対応

office365でSMTPリレーを設定したのですがSF上でエラーが解消されなかったのでSPFで対応しました。
そのやり方を紹介します。

#設定方法
大まかな設定は２つです。
SFでの設定ではURLを参考にしてください。

１．[SF](https://help.salesforce.com/articleView?id=000323475&type=1&mode=1)で設定

２．DNSサーバーでTXTレコードを追加

#確認方法
[こちら](https://mxtoolbox.com/spf.aspx)で確認できます。

また、SFからメールを送ってみてそのメールの詳細に
spf=pass とあればSPFの設定が確実であるとわかります。
TXTレコードの書き方が違っていたりすると　spf=softfail と表示されたりします。

#注意点
SFでメールリレーの設定を完全に削除しSPFの設定をしてください。
メールリレーの設定がそのままでSPFの設定をしてしまいメールが送信できないという現象が置きました。
第７回　Raspberry Pi で監視カメラを作ろう！　～開発環境構築編～

Raspberry Piと専用のカメラモジュールを使用し、ONVIF対応の監視カメラを作成する[シリーズ記事](https://qiita.com/lis-hanzomon/items/cc1f7f316fbeb9579b28)です。
本記事は[リンク情報システム株式会社](https://www.lis.co.jp/)の有志が作成しています。

---

ここからは、監視カメラ映像配信アプリのプログラムを作成するにあたって使用したオープンソースのライブラリの説明などの技術的な部分について書いていきます。

この監視カメラ映像配信アプリのライセンスはGPLとなっており、ソースコードは以下のサイトにて全て公開しております。

[https://github.com/lis-hanzomon/RedBrick](https://github.com/lis-hanzomon/RedBrick)

まずは、監視カメラ映像配信アプリをビルドするために必要な設定と、ビルド手順について説明します。
このアプリのソースを流用し機能を追加したいと思われた場合は、以下の手順でビルドを行ってください。
全てのソースはGPLで公開しているため、改造されたソースはGithub等を利用し、公開していただければと思います。

###ビルド済みライブラリのダウンロード
既にRaspberryPi用として、開発用ライブラリが公開されている物に関しては、以下のコマンドを実行してインストールします。

```console
$ sudo apt-get install cmake
$ sudo apt-get install libxml2-dev
$ sudo apt-get install uuid-dev
$ sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev libswresample-dev libswscale-dev
$ sudo apt-get install libjson-c-dev
```

インストールするツールやライブラリについて、簡単に説明します。

|ライブラリ名|説明|
|:-- |:------------ |
|cmake | Makefileの生成を行うためのツール |
|libxml2|XMLを使うためのライブラリ|
|uuid|uuidを使うためのライブラリ|
|libavformat、libavcodec、libavutil、libswresample、libswscale|映像や音声を使うためのライブラリ|
|libjson-c|JSONを使うためのライブラリ|

###必要なライブラリのビルド
RaspberryPi用のビルド済みファイルが公開されていないライブラリは、オフィシャルのページから必要なファイルをダウンロードして、ビルドします。

####・LIVE555
LIVE555という、RTP/RTCPやRTSPなどで動画配信を行う為のライブラリをビルドします。

LIVE555は以下のサイトのhereをクリックすると表示される一覧から"live.2018.02.12.tar.gz"をダウンロードします。
参考元：[LIVE555 Streaming Media](http://www.live555.com/liveMedia/)

ダウンロードしたファイルを解凍し、ライブラリをビルドします。

```console
$ tar zxvf live.2018.02.12.tar.gz
$ cd live
$ ./genMakefiles linux
$ make
$ sudo make install
```

####・gSOAP
gSOAPという、CおよびC++でSOAP通信を実現する為のライブラリをビルドします。

まずはgSOAPのビルドに必要なライブラリをダウンロードします。

```console
$ sudo apt-get install flex bison
$ sudo apt-get install libssl-dev
```

gSOAPは以下のサイトの"gsoap_2.8.62.zip"をダウンロードします。
参考元：[gSOAP Toolkit 日本語情報トップページ - OSDN](https://ja.osdn.net/projects/sfnet_gsoap2/)

ダウンロードしたファイルを解凍し、ライブラリをビルドします。

```console
$ unzip gsoap_2.8.62.zip
$ cd gsoap_2.8
$ ./configure
$ make
$ sudo make install
```

####・OpenCV
OpenCVという、画像処理や画像解析を行う為のライブラリをビルドします。

OpenCVは以下のサイトの"opencv-3.2.0.zip"をダウンロードします。
参考元：[https://sourceforge.net/projects/opencvlibrary/files/opencv-unix/3.2.0/](https://sourceforge.net/projects/opencvlibrary/files/opencv-unix/3.2.0/)

ダウンロードしたファイルを解凍し、ライブラリをビルドします。

```console
$ unzip opencv-3.2.0.zip
$ cd opencv-3.2.0
$ mkdir build
$ cd build
$ cmake -DBUILD_SHARED_LIBS=OFF -DWITH_CAROTENE=NO ..
$ make
$ sudo make install
```

###監視カメラ映像配信アプリのビルド
必要なライブラリが全て揃ったら、監視カメラ映像配信アプリをビルドします。

```console
$ tar zxvf RedBrick.tar.gz
$ cd RedBrick
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
```

以上で監視カメラ映像配信アプリはビルド完了になります。

---
[インデックス記事へ](https://qiita.com/lis-hanzomon/items/cc1f7f316fbeb9579b28)
[第６回記事へ](https://qiita.com/lis-hanzomon/items/ff502f79223da871b45e)
[第８回記事へ](https://qiita.com/lis-hanzomon/items/d5bbd68c7e1ab38efdad)

---
[リンク情報システム株式会社](https://www.lis.co.jp)では一緒に働く仲間を[随時募集](https://www.lis.co.jp/employ_top)しています！
また、お仕事のご依頼、ビジネスパートナー様も募集しております。[お気軽にご連絡](https://www.lis.co.jp/inquiry)ください。