OmniAICreator/Qiita-1.07M huggingface dataset:
圧縮・解凍・確認コマンド

個人的に圧縮ファイルを扱う際によく使うコマンドメモ。特にtarファイルはオプションが多くて忘れる。。

## ファイル圧縮
### tar形式

オプションの`c`がCreateで圧縮ファイルを作成する意味
オプションの`z`がgzip形式のこと
オプションの`v`がvervoseでメッセージを表示する
オプションの`f`がfilenameでファイルのロケーションを指定する

```:tar.gzファイルでカレントディレクトリに圧縮
tar -czvf ファイル名．tar.gz 対象ディレクトリ

# カレントディレクトリから対象ディレクトリを指定する方が望ましい
tar -cxvf ファイル名．tar.gz ディレクトリ1/ディレクトリ2/対象ディレクトリ
↑で圧縮したファイルだと対象ディレクトリにあるファイルが圧縮されるが、ディレクトリ1/ディレクトリ2の構造も含まれてしまう
```

### zip形式

```:zipファイルでカレントディレクトリに圧縮
zip 作成したいファイル名．zip 対象ファイル
zip 作成したいファイル名．zip -r 対象ディレクトリ
```
### gz形式

```:gzファイルでカレントディレクトリに圧縮
gzip ファイル名
```

## ファイル解凍
### tar形式

オプションの`x`がExtract(展開)の意味

```:カレントディレクトリに解凍
tar -xzvf ファイル名.tar.gz
```

```:指定ディレクトリに解凍
tar -xvzf ファイル名.tar.gz -C ディレクトリ名
```

### zip形式

```:zipファイルでカレントディレクトリに解凍
unzip 対象ファイル
```

### gz形式
```:gzファイルでカレントディレクトリに解凍
gunzip 対象ファイル
```

## 圧縮ファイル確認
### tar形式

```:tarファイルの中身を（解凍せずに）確認する
tar -tf ファイル名
```

### zip形式
```:zipファイルの中身を（解凍せずに）確認する
zipinfo ファイル名
```

### gz形式
```:gzファイルの中身を（解凍せずに）確認する
zcat ファイル名
```
[PlayCanvas] イベントを使用して他のスクリプトのメソッドを実行する

# 概要
PlayCanvasの提供しているイベントを使用することで他のスクリプト、または他のEntityが持つメソッドを呼び出す事が可能です。
[以前の記事](https://qiita.com/RabitBox/items/751bb139678484d8d3ed)の概要で書いた「衝突した対象に影響を与える」ような処理ではなく「どこかにいるEntityで処理してほしい」という処理が実現できます。
これにより、Entityの設計などを細かく調整する必要性から開放され、よりシンプルなコードになります。

# 実装例
``` javascript:mouse.js
var Mouse = pc.createScript('mouse');

Mouse.prototype.initialize = function() {
    this.app.mouse.on(pc.EVENT_MOUSEDOWN, this.mouseDown, this);
};

Mouse.prototype.mouseDown = function(event) {
    // 呼び出したいイベントが登録されているか
    if( this.app.hasEvent('onClickEvent') ){
        // イベントを発火させる
        this.app.fire('onClickEvent', event.x, event.y);
    }
};
```

``` javascript:eventListener.js
var EventListener = pc.createScript('eventListener');

EventListener.attributes.add('textUI', {type: 'entity'});

EventListener.prototype.initialize = function() {
    // イベントリスナーを登録する
    this.app.on('onClickEvent', this.onClick, this);

    // このEntityが破棄された時にリスナーの登録を解除する(やらないとメモリリークを起こす)
    this.on('destroy', function() {
        this.app.off('onClickEvent', this.onClick, this);
    });
};

EventListener.prototype.onClick = function(x, y) {
    this.textUI.element.text = 'Clicked Screen Position X: ' + x.toString() + 'Y:' + y.toString();
};
```

**this.app**に**on()**で「リスナー名」「コールバック(メソッド)」を渡す事でリスナーを登録し、**off()**で解除します。
使用する側は**hasEvent()**でリスナーがあるかを確認し**fire()**でそのリスナーを実行させます。
**this.app**にリスナーを登録するこの方法を**アプリケーションイベント**と言います。

今回は**on()**と**off()**の第3引数に**this**を渡していますが、これは必ずしも必須ではありません。
**console.log()**のような、特定のEntityに依存しないような処理だけであれば記述の必要はありません。
例の場合ではアトリビュートを参照しているので記述が必要になっています。
GASでスクレイピングしたデータからmatchメソッドで必要な情報を抜き出す


GASの正規表現はいろいろあるけど、
とりあえず基本の方法を２種類だけ自分用備忘録として残します。
<BR>

GASでGmailから、getPlainBody()　で、以下のように取得したとする。

```
タイトル：再エネを活用したEVタクシーで「地域MaaS」
浜松市佐久間町で実証へ
記事URL：https://www.kankyo-business.jp/news/026013.php
```

ここからタイトル、記事URLを抜き出すには、

タイトルは複数行にわたるので、
<B>\s([\s\S]*)</B>
を使う

urlは１行ですむので、
<B>(.*)</B>

つまり、

```js:コード.gs
let title = plainBody.match(/タイトル：\s([\s\S]*)記事URL：/);
let url =   plainBody.match(/記事URL：(.*)/);
```

<br>
Flutterで下タブを作る。

# 実装イメージ

<img width="300px" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738919/cb6bfef9-ab1e-16a2-fb08-9e4f37f71165.gif">


# 実装方法

## タブの小画面を準備する

真ん中に文字があるだけの画面です。
これを2つ（FirstPage、SecondPage）作成します。


```dart:FirstPage.dart
import 'package:flutter/material.dart';

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.orange,
      body: Center(
        child: Text(
          "First Page",
          style: TextStyle(
            fontSize: 20
          ),
        ),
      ),
    );
  }
}
```

## タブ画面を作成します。

```dart:BottomTabPage.dart
import 'package:flutter/material.dart';
import 'package:flutter_app/FirstPage.dart';
import 'package:flutter_app/SecondPage.dart';

class BottomTabPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _BottomTabPageState();
  }
}

class _BottomTabPageState extends State<BottomTabPage> {

  int _currentIndex = 0;
  final _pageWidgets = [
    FirstPage(),
    SecondPage()
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('BottomNavigationBar'),
      ),
      body: _pageWidgets.elementAt(_currentIndex),
      bottomNavigationBar: BottomNavigationBar(
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(icon: Icon(Icons.home), title: Text('First')),
          BottomNavigationBarItem(icon: Icon(Icons.photo_album), title: Text('Second')),
        ],
        currentIndex: _currentIndex,
        fixedColor: Colors.blueAccent,
        onTap: _onItemTapped,
        type: BottomNavigationBarType.fixed,
      ),
    );
  }

  void _onItemTapped(int index) => setState(() => _currentIndex = index );
}
```

## Main.dartに設定

最後に`Main.dart`に設定して完了です。

```dart:Main.dart
import 'package:flutter/material.dart';
import 'package:flutter_app/BottomTabPage.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: BottomTabPage(),
    );
  }
}
```
## 参考

https://flutter.ctrnost.com/basic/navigation/bottomnavigationbar/
無線タグアプリ（App_Tag）の子機のピン配列で、「設定選択ビット」の説明が見つけられない時

# ご参考まで
無線タグアプリ（App_Tag）の子機には、インタラクティブモードでの設定内容を、複数切り替えて記憶して、使い分けられる機能があります。

設定選択ビット1〜4は、そのアドレス指定のためのピンです。

16セットの設定を記憶でき、インタラクティブモード時、ヘッダ部分の末尾「ST=」に続いて、設定選択ビット1〜4のピンで指定したアドレスが表示されています。

```
--- CONFIG/App_Tag V2-02-1/SID=0x82020bfd/LID=0x00/RC=10278/ST=0
 a: set Application ID (0x67726305) 
 i: set Device ID (--) 
 c: set Channels (15) 
 x: set Tx Power (13) 
 b: set UART baud (38400) 
 B: set UART option (8N1) 
 k: set Enc Key (0xA5A5A5A5) 
 o: set Option Bits (0x00110001) 
 d: set Sleep Dur (5000) 
 w: set Sensor Wait Dur (30) 
 m: set Sensor Mode (0x10) 
 p: set Sensor Parameter (1) 
 P: set Sensor Parameter2 (  ) 
---
 S: save Configuration
 R: reset to Defaults
```

# 経緯
* [無線タグアプリ ピン割り当て - MONO-WIRELESS.COM](https://mono-wireless.com/jp/products/TWE-APPS/App_Tag/pinassign.html)

上記ページの子機のピン配列で、「設定選択ビット1〜4」の割り当てがされていますが、検索しても情報が見つけにくく、ソースを見ると、モジュール内蔵のEEPROM（約4kB）に読み書きする時の領域指定に使われていることがわかります。

その後、インタラクティブモードの説明ページで、「設定スロットの指定」として解説されていることを発見しました。

* [無線タグアプリ インタラクティブモード - MONO-WIRELESS.COM](https://mono-wireless.com/jp/products/TWE-APPS/App_Tag/interactive.html)

サイト内での「設定選択ビット」と「設定スロット」の表記の揺れで、わかりにくくなっているようです。（2020/09/29現在）

なお、ソース内での変数は「u8SettingsID」で、コメントでは「設定の保存先ID」となっており、EEPROMを操作する関数を呼び出す際、「SECTOR（セクタ）」指定として、渡されています。
プロセスとジョブの違い

#プロセスとは？

- `Linuxカーネルから見た処理の単位`をプロセスと呼ぶ。

- プロセスはシステム全体で一意の`「プロセスID」`を持つ。


#ジョブとは？

- `シェルから見た処理の単位`をジョブと呼ぶ。

- ジョブはシェルごとに`「ジョブ番号」`を持つ。
アクティブ・ブック・ダイアログって？

# はじめに
前職にて、ある日先輩に誘われDDDの輪読会に参加することになった。
その時、実践したのがアクティブ・ブック・ダイアログという輪読方法だった為、ここにざっくりやり方を記そうと思います。

## アクティブ・ブック・ダイアログとは？？
短時間で、本を読み発表/共有化することで理解につなげる輪読方法です。

## 進め方
**1.輪読したい本を裁断します。**
参加人数全員に行き渡るようにするといいと思います。僕がやったときは、各章ごとにページを裁断し、担当者に割り振りました。

**2.参加者に割り振ります。**

**3.各自担当ページを読み込みます。**
僕は蛍光ペンや鉛筆でがんがん書き込んでいきました。

**4.担当ページの要約をB5の用紙にまとめていきます。**
ここでまとめる用紙は１枚でなくても良い。
僕は３〜4枚でまとめました。

**5.要約を一人３分で発表します。**
ここがすごく短いので、早口にならないよう的確に要約するのが難しかった。。

**6.発表が終わったら、最後質問や感想を参加者全員で行います。**
僕らは、発表の初めから順に疑問点を聞いていく方針を取りました。

## メリット
これを実践すると、分厚い本が短時間で理解できます。
そのため、僕らはDDDを題材に取り上げました。
下記がその時使った資料です。
infoq.comで無料で落とせるので、是非。
[Domain Driven Design（ドメイン駆動設計） Quickly 日本語版](https://www.infoq.com/jp/minibooks/domain-driven-design-quickly/)

## まとめ
* 自分が読み込む内容が少なくすみ、参加者が他の内容を分かりやすくまとめてくれるので、本当に効率良く本の内容を理解できます。
* 本を裁断するので、途中のページを担当する人は、初めから本を読んでいないこともあり、要約しているうちは理解できない箇所もある。しかし、最後に共有化した際に、単語等が繋がった時喜び感じ、理解が急速に高まる気がする。
* DDDは次回まとめていこうかなと思います。

## 引用
[アクティブ・ブック・ダイアログ](http://www.abd-abd.com/)
汚いプログラムの書き方

ここに比較的読みやすいプログラムがあります。

```c++
#include <iostream>

int main() {
    int x = 10;
    int y = 25;

    std::cout << "Sum of x + y = " << x + y << std::endl;
}
```
まずは、邪魔なインデントを消します。

```c++
#include <iostream>

int main() {
int x = 10;
int y = 25;

std::cout << "Sum of x + y = " << x + y << std::endl;
}
```
きたねぇ。
次に、邪魔な空行を消します。

```c++
#include <iostream>
int main() {
int x = 10;
int y = 25;
std::cout << "Sum of x + y = " << x + y << std::endl;
}
```
きたねぇ。
次に、邪魔な空白を消します。

```c++
#include<iostream>
int main(){
int x=10;
int y=25;
std::cout<<"Sum of x + y = "<<x+y<<std::endl;
}
```
きたねぇ。
次に、邪魔な改行を消します。

```c++
#include<iostream>
int main(){int x=10;int y=25;std::cout<<"Sum of x + y = "<<x+y<<std::endl;}
```
きたねぇ。
IFTTTの気になるthisメモ

#メモ
IFTTT ProリリースということでIFTTT離れが始まってしまうのかしら。。。
とおもいつつもまだまだIFTTは便利便利。
いつもは使いたい機能が先に決まっていて、それがIFTTTの中にあるかなぁという順で探すけれど、
今回は逆にIFTTTで使えるサービスを眺めてみて、何か気になるのがあったらメモする超個人的な備忘録です。

#いくぜthis
・Amazon Alexa：言わずとしれたAlexa先輩。To Do Listに対するtriggerが充実してるみたいで、add/complete/edit/deleteなど自由度は高め。

・Android Phone Call/Android Photos：Android端末へのcallやPhotosへのfinalizeなどがTrigger。端末認証とかどうやるのか分からないけど一応メモメモ。

・Bitly：Triggerが唯一「Any new bitlink」bitlinkを作った瞬間に発火するよう。bitlinkを作ってそれを公開するとかメモするとかに使えそう。

・Button widget：これも唯一「Button press:This trigger fires every time you press the button」だけ。The buttonは何を指しとるんじゃい。

・Cortana：windows端末にあるcortanaちゃん。特定のワードを言う・数値付きワードを言うなど、この辺りはGoogle AssistantのThisと同じようなもん。

・Dropbox：昔サークルで使ってたdropbox。フォルダーの更新などで発火。

・Facebook：見た感じ「自分の投稿が」「自分にリンクが」みたいな自分絡みのTriggerが多そう。「検索してこんな情報を取ってくる」みたいなのにはやや不向き。

・Fitbit：Triggerが12種類もあり有望。「一日のgoalが何時までにクリアできなかったら発火」みたいなのもあり面白そう。

・GE Appliances Dishwashers：え、これマジ・・・？と思ったもの。食洗器・・・！基本「中が汚れてる」「水漏れしてる」みたいな異常検知向きのよう。すげー。

・Googleまわり：Assistant、Calender、Contacts、Docs、Drive、Sheets、Wifiがあるらしい。Wifiってなんだ・・・？

・Home Connect周り：これもすごい。Coffee Machine、Dishwasher、Dryer、Fridge、Ovenとか家電揃い。。。すげえええ。

・Instagram：インスタもAPIﾒﾝﾄﾞｸｻｲのでメモメモ。「写真アップロード」「特定のハッシュタグ付きで写真アップロード（new photo by YOU。。。YOUかよお)」「動画アップロード」「ハッシュタグ付きで動画アップロード」ということでこちらも検索には向かなそう。管理向けかな？

・iOSまわり：Calendar、Contacts、Photos、Remindersなどなど。

・Is It Christmas?：ナニコレナニコレナニコレ。調べてみたけどまんまクリスマスかどうかを調べるやつぽい。電話機能とかあるっぽいけどナニコレナニコレ。

・LG Dryer・Smartphone・Washer：ここまで調べた感じ、Dryerとかと接続するのは結構需要があるあれなのね。面白ーい。

・Location：海外版の位置情報アプリかな？面白いのが「You enter an area」「You exit an area」「You enter or exit an area」みたいな、エリアに入ったか出たかで発火する点。すげえええ。

・Mitsubishi Electric kumo cloud：珍しく和名のものがありました。室内の温度？が変わるとかmodeが変わると発火するよう。

・National Science Foundation：Scienceという言葉に惹かれてみてみました。このFoundationからのNewsやDiscoreriesなどをトリガーにしているよう。企業単位でIFTTTと提携しているのかしら？

・Netro・Neurio・Nice・Niko Home Control・Noon Home：中身は見てませんが、ロゴが全部家のマーク。スマートホーム需要がしゅごい。

・Office 365まわり：Calendar・Contacts・Mail・OneDriveなど。Mailは使えそうだけど情報の取り扱いがちょっとだけしんぱい。

・Pinterest：「You like a Pin」「New Pin on your board」のみ。好きなPinの管理に使えそう。

・RainMachine：これは名前で気になったもの。調べるとどうもAndroid DeviceとRainMachine hardwareをremotly controlできるもの。thisの種類も17種類あってすげえええええ。

・RSS Feed：これはシンプルに便利そう。いまいちRSSの仕組みわかってないけど。

・Rescue Time:救急車用とかのアプリ化と思ったら時間管理アプリのよう。Automatic time-trackingしてくれ、see exactly where your time goes, block your worst distractionsしてくれる優れもの。いろんなAppがあるんやなぁ。

・Simple Human：微妙に何のアプリか分からなかったけどRatingが4.9のすごいアプリっぽい。アプリアイコンが棒人間なのがキュート。

・Space：宇宙！？っておもったら本当に宇宙みたい。すごいのが「Astronaut enters space」「Astronaut exits space」っていつ使うねん。。。面白いのは「Season changes on Mars」って需要がニッチすぎる！

・Survey Monkey：昔大学で使ってたSurvey Monkey。回答が来たら発火するのは便利そう。

・Spotify：結構期待してみてみたけれど「New saved track」「New track added to a playlist」のみ。音楽の情報を取るとかは苦手かあ残念。

・Twitter：これがバチクソに便利。Twitter APIを使うとなると手続き大変だしTokenが4種類ぐらい必要になるし。。。特に「New tweet from search」や「New tweet by a specific user」は可能性無限大。

・Vimeo：これも「New video from search」があり便利そう。

・Wikipedia：これもThisが9種類あって面白そう。記事がEditされたら発火系が多そうだけど絶妙に使いにくそう。。。Picture of the day、Word of the dayは情報発信系かな？

・Youtube：「New public video from subscriptions」は便利そう。「New channel membership」とかは自分でchannelを運用し始めたい人には便利そう。
new Proxy() の set() の返り値は true でいい

## Uncaught TypeError
JavaScript らしいエラーに出会ったので残しておく。
エラーは以下。

```
VM213:16 Uncaught TypeError: 'set' on proxy: trap returned falsish for property 'a' at <anonymous>:16:21
```

setter が false を返していることが上記のエラーの原因だが、そのときに書いていたコードは false なんて返していないと思っていた。

```javascript
'use strict'
const target = {
    a: 0
};

const handler = {
    set: function (target, prop, value, receiver) {
        const res = target[prop] = value
        return res
    },
};

const proxy = new Proxy(target, handler);

console.log(proxy.a = 1);
console.log(proxy.a = 0);
```

## false は返していないが 0 を返していたので、それは false を返していることになる

`console.log(proxy.a = 0);`の 0 の代入で、setter は代入された 0 をそのまま返す。
setter の返り値は boolean 型なので暗黙的に boolean 型に変換される。
Javascript は 0 は false として扱うため、setter の返り値は false となり、エラーとなる。

```javascript
Boolean(1)
// true

Boolean(0)
// false

Boolean(2)
// true
```

そもそもの誤りとして、代入したものを return で返すコードが Proxy の仕様に沿っていない、ということ。なんとなくで `res`を返してたが、これがダメやな。

```javascript
const handler = {
    set: function (target, prop, value, receiver) {
        const res = target[prop] = value
        return res
    },
};
```

## どう書くべきか

MDN のサンプルでは、return の値に true を設定しているので、以下が正解の書き方になる。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy

```javascript
const handler = {
    set: function (target, prop, value, receiver) {
        target[prop] = value
        return true
    },
};
```

エラーを発生させたいパターンは、 false を return に設定すればいい。

```javascript
const handler = {
    set: function (target, prop, value, receiver) {
        if (value === 2) {
            return false
        } 
        target[prop] = value
        return true
    },
};
```



## まとめ

JavaScript の仕様に沿った書き方をしよう、っていう記事。以上！
【C++】関数内ローカル関数という禁術

# 関数内ローカル関数

関数内で宣言することで、その関数でしか使っていないという明示になる。
しかし、関数内の記述が増えるので分かりにくくなってしまう。

# C
GCC 拡張された C では以下のようにかけます。
詳しくは [【C言語】GCC拡張によるNested Function(関数内関数)](https://qiita.com/kizul/items/ab957856e83c18fc10d4) を読んでください。

```C
#include <stdio.h>

int main() {
    void helloWorld() {
        printf("HelloWorld\n");
    }
    
    helloWorld();
}
```

# C++
同様にこう書いても、C++ ではエラーになります。

```c++
#include <iostream>

int main() {
    void helloWorld() {
        std::cout << "HelloWorld" << std::endl;
    }
    
    helloWorld();
}
```

本来、 std::function など使うべきところですが、以下のようにも出来ます。

```c++
#include <iostream>

int main() {
    struct internal {
        static void helloWorld() {
            std::cout << "HelloWorld" << std::endl;
        }
    };
    
    internal::helloWorld();
}
```

構造体を内部で定義し、その static 関数として 関数内ローカル関数を定義するというものです。
関数宣言時にはブロック内に書き、関数呼び出し時にはスコープがつくので、案外分かりやすい気がします。

GCC 拡張の C とは違い、グローバルな関数と同じような扱いになるので、以下のようなことは出来ません。

```c++
#include <iostream>

int main() {
    int variable = 0;
    struct internal {
        static void helloWorld() {
            variable = 5; // ERROR
            std::cout << "HelloWorld" << std::endl;
        }
    };
    
    internal::helloWorld();
}
```

選択肢のひとつとして知っておいても良いのではないかと思います。
IntegromatでSlackのメッセージをTrelloのカードとして追加する方法！


私は個人的にTrelloでタスク管理をしていますが、
社内ではSlackのみで基本的にコミュニケーションをとっています。

そのため、いちいちSlackでふられたタスクをTrelloにうつさなくていいように
Integromatを使って自動化できないかやってみました！

#IntegromatでSlackからメッセージを取得する

__https://www.integromat.com/__にログインします。
右上の「Create a new scenario」をクリック！
[![Image from Gyazo](https://i.gyazo.com/b4d5f9b3b78410f79efbbba62274d618.png)](https://gyazo.com/b4d5f9b3b78410f79efbbba62274d618)
検索ボックスでSlackを検索→右上のContinueを押します。
[![Image from Gyazo](https://i.gyazo.com/890fee55d588cc31d43d2eebe5a863fd.png)](https://gyazo.com/890fee55d588cc31d43d2eebe5a863fd)
こういう画面になるので、Slackのアイコンをクリックして・・・
[![Image from Gyazo](https://i.gyazo.com/71581c6d1cc73aedb890ada89eacc118.png)](https://gyazo.com/71581c6d1cc73aedb890ada89eacc118)

トリガーで「Search for message」を選択します。

私は、タスクをふられるとメッセージに「珠里」という名前のスタンプを押すようにしています。
[![Image from Gyazo](https://i.gyazo.com/b338807e66e07bbb9c0e2dafd78ae81d.png)](https://gyazo.com/b338807e66e07bbb9c0e2dafd78ae81d)

なので、「珠里」スタンプが押されているスタンプを取得するようにしました。
had::（絵文字）:で抽出できます！
[![Image from Gyazo](https://i.gyazo.com/172c33ba97d30ccb047b4b9cf3e560cb.png)](https://gyazo.com/172c33ba97d30ccb047b4b9cf3e560cb)

#Trelloに新しいカードを作成する

Slackマークの右側に出てくるAdd another moduleを押して、
Trelloを設定します！

[![Image from Gyazo](https://i.gyazo.com/ab1909e1c9e53d3fb625577bcca2d62b.png)](https://gyazo.com/ab1909e1c9e53d3fb625577bcca2d62b)

実行する処理は「Create a Card」を選択！

[![Image from Gyazo](https://i.gyazo.com/ab41642dad07ec4e95c799a762841920.png)](https://gyazo.com/ab41642dad07ec4e95c799a762841920)

上図のように、カードを作りたいリストを指定します。
リストIDは以下の方法で取得できます！

TrelloのURLを見ると、下記のようになっていると思います。
https://trello.com/b/XXXXXX/（Boardネーム）

そのURLの最後尾に.jsonをつけて

https://trello.com/b/XXXXXX/（Boardネーム）.json　

にするとjsonデータがずらっと出てきます。
そこでlist Idがわかります！


Nameはカードの一覧で見えるとこで、私はメッセージをそのまんまカードにしたかったので、
Textを入れました！


#スケジュール設定も必要だよ！
どのタイミングでデータ取得するとかは設定する必要はありますが、
ひとまずこれでSlackから特定の絵文字が押されたメッセージを取得して
指定したリストにカードを自動的に作るようなフローが完成しました～！
【Docker for Windows】突然Dockerアプリが起動しなくなった、、、

今日、普通にDockerを起動しようとしたらなぜかDocker is starting...のままDockerが起動しない、、突然の出来事だったので焦りました。やはりまだDocker for Windowsは若干不安定なんですかね、、はやくMac買いたい、、ｗ

~~ちなみにDocker for WindowsはWindows10 Proでしか使えないのでこちらはWindows10 Proで開発している方向けの記事になります。~~
@userisgod さんよりご指摘のコメントがありました。
Docker for Window はWSL2への対応が行われた際、Window10 Homeもサポートするようになったようです。
[参考記事](https://qiita.com/wakki_haya/items/de949a0f4438058f8da3)

#解決策
Dockerアプリをアンインストールして、再インストール。私はこれで治りました。

**※注意
大事なデータがコンテナ内にありましたら全部消えてしまうので(当たり前）バックアップデータはしっかりとっておきましょう。**

#その他の解決策①
↑に加えてHyper-Vもアンインストールして、再インストールする

Docker for WindowsではHyper-Vというマイクロソフト社のサーバー仮想化技術を利用して動いています。OSのnative機能を使います。このHyper-VがWindow10 Pro にしかないのでHOMEエディション等では使えないのです。

#その他の解決策②
Hyper-Vにおける制御フローガードのチェックをはずず。

**【方法】**

1.検索窓からWindowsセキュリティと入力しアプリを起動する。
2.アプリとブラウザー コントロール
3.Exploit protection の設定 (かなり下のほうにあります)
4.プログラム設定 タブ
5.C:\WINDOWS\System32\vmcompute.exe > 編集
6.制御フローガード (CFG)の設定の「システムの上書き」 チェックを外して、適用ボタンをクリック

#最後まで読んでいただきありがとうございます！
以上がとりあえず気軽に出来ることなので、試してみてください。
これでも解決しない場合、[こちらの記事](https://qiita.com/kurone-kito/items/2e41a58f01b3d3620109)の「コマンドで強制的に起動させる」等を参考にしてみてください！
（解決）【obniz】webhookで始動した時のディスプレイは文字化けするようだ　

##追記文
関係者のみなさま、「文字化けする」なんて大々的に記事に書いて申し訳ございませんでした。

理由は分かりませんが、文字化けしても、すぐ直せます。

親切な方のツイートのとおりしたら、直りました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ãが出てくる文字化けは、latin-1 (ISO-8859-1)の日本語文字列をUTF-8だと思いこんで読むと発生するようです。<br><br>もしかしたら、一度obniz.displayの行を消して、改めて打ち直すとutf8でかけるかもしれないので試してもらえませんか？</p>&mdash; kido (@9wick) <a href="https://twitter.com/9wick/status/1311186402831265795?ref_src=twsrc%5Etfw">September 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<br>
###ありがとうございました！！


<br><br>
##以下オリジナル文

タイトルのとおり、
obnizはwebhookの時のディスプレイは文字化けするので、ハマって長時間を無駄にする前にあきらめましょうってことをお伝えします。

故障かもしれませんが、obniz２台で試して同じ結果でしたので、このコードで文字化けすることは確かだと思います。
違ってたらごめんなさい。


##再現

これは、obnizのディスプレイに「Hello World」と、文字を表示させるプログラムです。

```HTML:index.html
<html>
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/obniz@3.8.0/obniz.js"></script>
</head>

<body>
<script>
var obniz = new Obniz("YOUR OBNIZ ID");
obniz.onconnect = async function () {
  obniz.display.print("Hello World");
};
</script>
</body>
</html>
```

<br>
コンソールのプログラム画面から「実行」すると、
[![Image from Gyazo](https://i.gyazo.com/6e879daf52cf6a26b750b87f4ec868b3.png)](https://gyazo.com/6e879daf52cf6a26b750b87f4ec868b3)

obnizのディスプレイに
Hello World と表示されます。
![IMG_7979.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/fcdf5194-7ba2-c346-ff2e-b22f81911b9d.jpeg)



では、コンソール ＞ サーバーレスイベント ＞ １.トリガー から
直接　webhookのEndpointのURLをクリックすると、

[![Image from Gyazo](https://i.gyazo.com/f2971cf9381984b83a1abe59b85d48c5.png)](https://gyazo.com/f2971cf9381984b83a1abe59b85d48c5)

###文字化けします。
![IMG_7978.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/617a358d-e872-0e20-d6f9-432f00e22929.jpeg)

<br><br>
###つまり、IFTTT の webhookで obniz は文字化けするということ
今回、Twitterの つぶやきを IFTTTのwebhookでobnizのディスプレイに表示させようとしたときに、文字化けに気がつきました。
<br>
すぐに解決すると思いましたが、これだけで、半日つぶしました。
<br>
ということで、obnizのディスプレイでwebhookからは文字化けしますので、私みたいに半日もねばって時間を溶かす前にあきらめましょう。

<br>
###一縷の望み

そうはいっても、もし、文字化け回避の方法があったら、教えて下さい。

なんか、質問の投稿みたいになってしまいました。
<br>
【Ruby】リファクタリングに強くなるための基本のキ

　恥ずかしい話ですが、つい最近まで「綺麗なコードを書け」と言われると、条件反射的に「エラーがなけりゃいいじゃん。」と思っていました・・・。
　しかし、リファクタリングという言葉を理解しながら、いくつかの記法やメソッドに触れていくうちに、美しいコードを美しいと思えるようになってきた（すこし大袈裟:sweat_smile:）ので、基本的なリファクタリングの事例を紹介したいと思います。

###今回設定するインプットとアウトプット
　1から5までの連続する配列の合計を出力せよ。（答えは15）
　これをいかに綺麗に記述して導き出すかに挑戦してみたいと思います。

####その１：ザ・ごり押し
```rb
p 1 + 2 + 3 + 4 + 5
```
　…プログラムというか電卓？レベルの一番シンプルな記述。当然、1~100までの数字の合計を求める場合等に対応できないのでボツ。
拡張性を持たせていきたい。

####その２：配列とeach文を使う
```rb
numbers = [1,2,3,4,5]
sum = 0 #変数sumに0を代入
 numbers.each do |n|
   sum += n #変数sumにブロック変数nを繰り返し足しこむ
 end
p sum
```
　each文で一番最初に習うコードかもしれない。プログラミングだけんども、「配列の要素を1,2,3…と書くのが面倒」、「each文まわりが数行にわたっててコンパクトにしたい」という気持ちが湧いてくる。

####その３：範囲オブジェクトと{}のブロック記法でシンプルに
```rb
numbers = (1..5) #範囲オブジェクトの作成。1~5までの値が連続する配列を意味する。
sum = 0
  numbers.each {|n| sum += n } #{}のブロック記法で1行に収める。
p sum
```
　__(最初の値..最後の値)__で、値の範囲を表すことができる。
　　※範囲オブジェクトは、Rangeクラスのオブジェクト。
　　※ちなみに、__(最初の値...最後の値)__と書くと、最後の値を含まない。ドット.の数に注意
　また、each文の__do・・・end__までの間を、__{}__で代わりに囲むこともできる。
　　※__do・・・end__までを「ブロック」と呼び、取り出した要素を扱う「作業部屋」のような役割。
　だいぶスッキリしました。けど、もう一息！

####その４：eachの代わりにinjectメソッドを使う
```rb
numbers = (1..5)
 p sum = numbers.inject(0) {|n, s| n + s}
  #injectメソッドは下記の流れで動く。
  #メソッドの第1引数が、ブロックの第1引数に入る。
  #ブロックの第2引数には、配列の各要素が順番に入る。
  #ブロックの戻り値が、ブロックの第1引数に引き継がれる。
  #繰り返し処理が終わると、ブロックの戻り値がinjectメソッドの戻り値となる。
```
　injectメソッドを使うことで、引数を複数扱うことができ、２行に収めることができた。

　今後は、良著と聞いた「リーダブルコード」も読み進めながら、胸を張って見せられる綺麗なコードを書けるよう頑張っていきます。
　「こういう風に書いた方がもっと簡潔だよ。」という意見等ありましたら、ぜひ教えてください！
【Rails】ビューファイルは使わず、パラメータIDも存在しない中で、アソシエーションのデータを取得する。【APIモードで使う】

## はじめに
備忘録です。

ここでは、ホーム画面（"/"）で

* `「データ全件」`
* `「1つのデータに関連付けされているデータの総数」`
* `「1つのデータに関連付けされているハッシュのデータ」`

を表示させたいとして、indexアクションにて上記のデータを取得する方法について見ていきます。
例えばQiitaのようなアプリケーションを作成するとするならば、

* `「記事全件」`
* `「1つの記事に関連付けされているコメントの総数」`
* `「1つの記事に関連付けされているタグのハッシュデータ」`

を取得していくようなイメージです。

`全てのデータはハッシュとして取得します。`

## 環境
Ruby: 2.6
Rails: 5.2

## モデルの例（作成の過程は省略）

![スクリーンショット 2020-09-28 23.12.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606750/27fc22be-fca1-58f4-adbb-a68dc3aa01da.png)


## コード

#### 1.まずは記事全件を取得する

```ruby
def index
  @all_article = Article.all
end
```

#### 2.1つの記事に関連付けされているコメントの総数を取得する

```ruby
def index
  @all_article = Article.all
  
  # [ { 1: "コメント数" }, { 2: "コメント数"  }, ... ]という形のデータを作成する。
  # article.commentsでループ処理した記事データからコメントを呼び出している。
  @article_count = @all_article.map{ |article| 
    [article.id, article.comments.count.to_s]  #もしコメント数を表示させるならto_sで文字列化する。
  }.to_h 

  # 上記のコメントデータのidと記事のidが一致した場合に、コメント数をcount属性に格納する
  @article_count.map do |key, value|
    @all_article.map do |article|
      if article.id === key
        article["count"] = value
      end
    end
  end

  # => [ { "id": 1, "count": "コメント数" }, { "id": 2, "コメント数" }, ... ]のように得られる
end

```

#### 3.1つの記事に関連付けされているタグのハッシュデータを取得する（上と大体一緒）

```ruby
def index
  # 記事全件
  @all_article = Article.all
  # コメント数
  @article_count = @all_article.map{ |article| 
    [article.id, article.comments.count.to_s]
  }.to_h 
  @article_count.map do |key, value|
    @all_article.map do |article|
      if article.id === key
        article["count"] = value
      end
    end
  end

  # 1つの記事が所有するタグをハッシュで取得
  @all_article.map{ |article|
    [article.id, article.article_tags.all]
  }.to_h

  # => { 
  #      "1": [
  #         { "id": 1, "tag_name": "Rails" }, 
  #         { "id": 2, "tag_name": "React" }, 
  #          ... ,
  #      ], 
  #      "2": [ 
  #         { "id": 1, "tag_name": "JavaScript" }, 
  #         { "id": 2, "tag_name": "Qiita" }, 
  #          ... ,
  #      ]
  #     }
end
```

以上ですが、上のままだとコントローラがごちゃごちゃしてしまうので、モデルファイルにインスタンスメソッドとして抽出するなどすると良いかと思います。

<br>

## 最後に
バックエンドとフロントエンドを切り離してSPAアプリケーションを作成する際にはビューファイルは使わないので、ルートのURLを持つホーム画面でアソシエーションされているデータを取得する方法を見つけるのにとても苦労しました。
で、結果このようにする結論に辿り着いたのですが、間違いやもっといい方法があるなどあれば、是非教えて頂けるととても助かります！🙇‍♂️
暇だったのでMac OS X 10.3 をQEMUでエミュレートしてみた。

いんすこのやり方メモを置いとく

# インストール環境
Ubuntu 20.04 LTS
Celeron N4000（ゴミ）
です

#
qemu-system-ppc
openbios-ppc

これらはaptからインストールできる。
インストールメディア（吸い出しておく）

## 手順

1.上記のものをインストールしたら
  インストール用のフォルダを作って移動する 例 qemu-ppcmacなどのフォルダ名にしておくと良い

2.ターミナルを開き
インストール用のqcow2ディスクファイルを作っておく。
今回は70Gのものを作成した。

コマンドは以下の通り
```
qemu-img create -f qcow2 mac.qcow2 70G
```
3.Mac OSXをインストールする。

```
qemu-system-ppc -L pc-bios -M mac99,via=pmu -m 512 -net nic,model=sungem -net user -hda mac.qcow2 -cdrom mac1.iso -boot d -g 1920x1080x32 -cpu g4 
```
フルスクリーンの解像度で使用したいのでQEMUのオプションで-g オプションを使っている
使用しているpcの解像度に合わせると良い。

あとは実機と同じ操作で行ける。

4.起動する際は
```
qemu-system-ppc -L pc-bios -M mac99,via=pmu -m 512 -net nic,model=sungem -net user -hda mac.qcow2  -boot c -g 1920x1080x32 -cpu g4 
```
で行ける。
cd入れ替えを求められたときの操作の説明は省く。

吸い出すときは
ubuntuにデフォルトではいっている、ディスクアプリを使用すると良い

### 参考にしたサイト
https://qiita.com/Selenia/items/a152d844768fda078b90#%E6%89%8B%E5%85%83%E3%81%AE%E7%92%B0%E5%A2%83
再帰で階乗に挑戦してみる

こんばんは。
初心者なりに挑んでみたので
皆様の参考になれば幸いです。

例えばですが、3!(=3 * 2 * 1) を実現するにはどうすれば良いでしょうか。

```
print(3*2*1)
```
出来ました(笑)!
じゃあ、def を使って、こんな風に書いてみたらどうでしょうか。

```test.py
def test(n:int=3):
    if n>1:
        return n * test(n-1)
    else:
        return 1

print(test())
```

取り急ぎ初期値 3 でやってみました。
取りあえず、一個一個代入してみてみましょう。
まずは n == 3 の時です。

```test.py
# n == 3 のとき
def test(n:int=3):
    #n == 3 なので、if の中に入ります 
    if n>1:
       #return 3 * test(3-1)
        return n * test(n-1)
    else:
        return 1

print(test())
```

やった。return が来たから抜けられる!! っと思いきや、
3 * test(2) !? 
test(2) が分からないと終われないですね。
仕方ありません。
良くわからないですが、n == 2、つまり test(2) を考えてみましょう。

```test.py
# n == 2 のとき
def test(n:int=2):
    #n == 2 なので、if の中に入ります 
    if n>1:
       #return 2 * test(2-1)
        return n * test(n-1)
    else:
        return 1

print(test())
```

ん!? return 2 * test(1) !?
またもや test() が現れましたが、今度は test(1) です。
仕方ない、test(1) もやってみましょう。

```test.py
# n == 1 のとき
def test(n:int=1):
    if n>1:
        return n * test(n-1)
    #n == 1 なので、else の中に入ります 
    else:
        # 1 を返します
        return 1

print(test())
```

取りあえず、n==1 の時は return 1 なので、
答えが 1 であることがわかりました。
よかった、やっと整数に会えた(笑)

一旦整理しましょう。
![図1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/beddbb81-65bc-ab3e-0114-0b6710834a41.png)
図にあるように n==3 を実行したら、n==2 が現れて、更に n==1 が現れました。
イメージとしては test(2) の中に 2 * test(1) が埋め込まれていて、
test(1) の中に 1 * test(0) が埋め込まれているようです。

今分かっているのは、1 * test(0) が 1 * 1 、
つまり 1 であることだけです。

よし、3 * test(2) は一旦、無視し、
下図中央の 2 * test(1) の test(1) に 1 * test(0) を代入してみましょう。
![図2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/2e2db149-14d5-07de-62a6-99aa1fcc4998.png)
2 * test(1) == 2 * {1 * test(0)} なので、2 * 1 = 2 であることが分かります。
ってことは。。。
![図3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/38f89ca3-40f9-89dc-2615-99bc5cd7f21e.png)
3 * test(2) == 3 * {2 * test(1)} == 3 * {2 * 1} になりましたね。
これで何とか 3! を表現することが出来ました。

以上のように、ある事象に、自身を含んでいた場合、
再帰的であるというそうです。

この考え方を使うと 3! だけでなく、n の階乗も勿論、表現できます。
シンプルな記述ですが、ちゃんと考えると複雑だったりして
中々、面白かったです、お疲れ様でした(≧▽≦)。

| その他の記事 |
|-------------|
|[スタックをPythonで書いてみた](https://qiita.com/AKpirion/items/f3d5b51ab2ee9080e9c6) |
|[1つの配列に 2 つのスタックを Python で実装してみる](https://qiita.com/AKpirion/items/2e74eecd30063a01d2fc) |
|[Python で作ったスタックに最小値(min) を返す機能を追加するが push/pop/min は基本 O(1) !!](https://qiita.com/AKpirion/items/670efe807f17a050da0c) |
Google Apps Script で日付をフォーマットする

```JavaScript
var formattedDate = Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd (E) HH:mm:ss Z");
Logger.log(formattedDate);
```
結果　`2020/09/28 (Mon) 15:29:24 +0900`

date = new Date()：DateStringとしての形式に
timeZone= "GMT"：結果の出力タイムゾーン
format = "yyyy-MM-dd"：[SimpleDateFormat](https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)仕様ごとのフォーマット

公式のドキュメントはこちら
>[Apps Script](https://developers.google.com/apps-script/reference/utilities/utilities#formatDate(Date,String,String))

下記のサイトに詳しく書いてあります。
>[Google Apps Script メモ formatDate](https://sites.google.com/site/gasgaidobukku/utilities/formatdate)
sql文実行順序 

プログラムのスピードをアップするために、sql文の実行順序を理解することは必要とと思います。
下記はsql文の書く順序です。でも、書く順序と実行順序は全然違います。

```
(1) SELECT (2)DISTINCT<select_list>
(3) FROM <left_table>
(4) <join_type> JOIN <right_table>
(5)         ON <join_condition>
(6) WHERE <where_condition>
(7) GROUP BY <group_by_list>
(8) WITH {CUBE|ROLLUP}
(9) HAVING <having_condition>
(10) ORDER BY <order_by_condition>
(11) LIMIT <limit_number>

```

下記はsqlの実行順序です。

```
(8) SELECT (9)DISTINCT<select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2)         ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE|ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
(11) LIMIT <limit_number>
```
合計11個の手順があり、手順ごと一つの仮想テーブル(virtual table)を作成する。
(1)FROM：前の二つのテーブルに対して、デカルト積(Cartesian Product)を取得して、仮想テーブルVT1を作成する
(2)ON：VT1に対して、on条件に合致するレコードをVT2に挿入する。
(3)JOIN：OUTER JOINがある場合、並ぶもののないレコードが外部行としてVT2に挿入して、VT3を作成する。複数の連結テーブルがある場合、手順(1)～(3)を繰り返す。
(4)WHERE：VT3のレコードを洗い出して、条件に合致するレコードをVT4に挿入する。
(5)GROUP BY：VT4のレコードをグループ化して、VT5を作成する。
(6)CUBE|ROLLUP：VT5のレコードに対して、CUBE|ROLLUPを行って、VT6を作成する。
(7)HAVING：HAVINGの条件でVT6のレコードを洗い出して、VT7を作成する。
(8)SELECT：指定するカラムを検索して、VT8を作成する。
(9)DISTINCT：重複なレコードを除いて、VT9を作成する。
(10)ORDER BY：VT9のレコードを並び順でランクして、VT10を作成する。
(11)LIMIT：指定する行を取得して、VT11を作成する。
最後にVT11のレコードを返す。
[Xcode12.0.1]SpriteKitで全画面表示する

今回久々にSpriteKitに触れる機会があり、開始早々ハマりポイントがあったので備忘もかねて残しておきます。

# 解決したかった課題
対応前 | 対応後
:---: | :---:
![スクリーンショット 2020-09-28 22.38.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/62a4388d-9dd1-d237-d798-4172d7abe2ad.png) | ![スクリーンショット 2020-09-28 22.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/ec2302a2-3dda-2883-d983-b544b299e797.png)

対応前のスクショの赤矢印のように、画面中央にあるSKViewの範囲を対応後のように画面全体に広げたかった。

# 解決方法

色々調べた割に、LaunchScreenFileを指定するだけという対応で呆気なく解決しました。。。
![スクリーンショット 2020-09-28 22.44.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/32540059-a7a5-08b3-3af5-bc1433c64eae.png)

# 試行錯誤

折角なので、どんな感じで翻弄されていたかという恥ずかしい部分もさらけ出そうかと思います。

1. AutoLayoutの問題では？と思ってGameViewControllerのルートビューをUIViewに変更し、そこにSKViewを制約つけて貼る　→　🙅‍♀️
2. サイズを指定しようと思い、SKViewのFrameサイズを上書きする　→　🙅‍♀️
3. ビューデバッガを使って確認したところ、ルートがUIWindowSceneとなっていたので、もしやSceneDelegateかな？と思いSceneDelegateを追加する　→　🙅‍♀️
![スクリーンショット 2020-09-28 23.11.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/d4192c86-5d99-b292-1e6f-a0a966cb11ba.png)
4. 色々ググって、やっとLaunchScreenFileに気づく　→　🙆‍♂️


これで1時間近く浪費してしまいました。。。
これからは己を過信せず、最初からググります。反省。。。
[PHP]文字列を固定長の他の文字列で埋める(マルチバイト対応)

文字列を規定の桁数になるまで任意の文字で埋めるために、PHPのstr_pad()を使うことがあるかと思います。 
ただし、以下のようなマルチバイト文字をstr_pad()にかけて指定した桁数の文字列を出力しようとしても、バイト数で計算されるため意図した通りに出力されません。

```php
echo str_pad('東京', 8, '●', STR_PAD_RIGHT).PHP_EOL;
echo str_pad('名古屋', 8, '●', STR_PAD_LEFT).PHP_EOL;
echo str_pad('大阪', 8, '●', STR_PAD_BOTH);
```

出力結果は以下の通り…
8桁の文字列が出力されてほしいところですが、先に述べたように意図した通りになりません。
その上、文字化けになってしまいました。

```html
東京�
名古屋
�大阪�
```

そこで、マルチバイト文字にも対応したmb_str_pad()を作成しました。
使い方はstr_pad()とほとんど変わりありませんが、バイト数ではなく文字数で計算するようになっています。

```php
/**
 * 文字列を固定長の他の文字列で埋める(マルチバイト対応)
 *
 * @param string $input    対象の文字列
 * @param int    $pad_len  埋める文字数
 * @param string $pad_str  埋める文字列
 * @param int    $pad_type 埋め方(STR_PAD_RIGHT, STR_PAD_LEFT, STR_PAD_BOTH)
 * @param string $encoding 文字列のエンコーディング
 * @return string
 */
function mb_str_pad($input, $pad_len, $pad_str=' ', $pad_type=STR_PAD_RIGHT, $encoding=null)
{
    if (!$encoding || strtolower($encoding) == 'auto') {
        $encoding = mb_internal_encoding();
    }

    $input_len   = mb_strlen($input, $encoding);
    $pad_str_len = mb_strlen($pad_str, $encoding);
    $target_len  = $pad_len - $input_len;

    if (!$input_len || !$pad_str_len || $target_len <= 0) {
        return $input;
    }

    if ($pad_type === STR_PAD_BOTH) {
        $target_len /= 2;
    }

    $repeat = str_repeat($pad_str, ceil($target_len / $pad_str_len));

    if ($pad_type === STR_PAD_BOTH || $pad_type === STR_PAD_LEFT) {
        $left = mb_substr($repeat, 0, floor($target_len), $encoding);
    } else {
        $left = '';
    }

    if ($pad_type === STR_PAD_BOTH || $pad_type === STR_PAD_RIGHT) {
        $right = mb_substr($repeat, 0, ceil($target_len), $encoding);
    } else {
        $right = '';
    }

    return $left.$input.$right;
}
```

先ほどと同じ文字列を、mb_str_pad()にかけてみます。

```php
echo mb_str_pad('東京', 8, '●', STR_PAD_RIGHT).PHP_EOL;
echo mb_str_pad('名古屋', 8, '●', STR_PAD_LEFT).PHP_EOL;
echo mb_str_pad('大阪', 8, '●', STR_PAD_BOTH);
```

出力結果は以下の通りです。

```html
東京●●●●●●
●●●●●名古屋
●●●大阪●●●
```
今度は意図した通りの結果になりました！
BlynkとRaspberry Piを使ったIoT玩具の制作（１）

#はじめに
遠隔地よりスマートフォンを使ってモーターを操作したいと思い立ちました。
調べていたらBlynkというアプリとRaspberry Piを使えば実現できそうだと知り、試してみることにします。
![概要図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751909/0cc390d5-5600-1077-1cd2-db4c7c656118.png)
#用意したもの
* android タブレット
    * Blynkをインストールしてraspberry piの遠隔操作に使用します
    * 今回はBLUEDOTのBNT-700K(2014年製android Ver5.1)があったのでそちらを使用します  
* raspberry pi 4
* ブレッドボード
    * 手持ちのボード（ラズパイマガジン2019年6月号付録を使います）
* 電池ボックス
    * 用意した電池ボックスにはなぜか予めスイッチと簡単な抵抗が入っていました。スイッチはオン側固定で殺し、抵抗はそのまま使用します。
* モーター 

#まずはBlynkを接続
## Blynkの仕組み
Blynkはユーザーのスマホとユーザーのワンボードマイコンを繋ぐ役割を果たします。
スマホとワンボードマイコンの接続にはBlynkサーバーを介します。
ユーザーは独自にプロジェクトを作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751909/a1d6951a-0847-5271-a8ad-5cddb087a723.png)
JavaScriptでアラートメッセージを表示させる

#プログラミング勉強日記
2020年9月28日
エラーメッセージやサクセスメッセージを表示させるときにJSのメッセージボックスを表示するためにアラートについて簡単にまとめる。

#alertの使い方
　alert()メソッドとはアラートを出すメソッドで、以下のように記述する。
　文字列の場合は`"`か`'`で値を囲む必要がある。

```js
alert( 画面に表示させたい値 )

// 文字列・数値のメッセージを出力
alert('アラートのメッセージ')
```

##変数を使ってメッセージを出力する
　以下のようにalertには変数を使用することができる。

```js
var warn = "エラーメッセージ";
alert(warn);
```

#※注意alertのダイアログはカスタマイズできない
　ポップアップメッセージに表示されるアイコンであったり、タイトルテキストやボタンのテキストは変更することができない。
　alert()メソッドは特定のメッセージをユーザに認識してもらうことを用途としているので、カスタマイズはできない。どうしてもカスタマイズしたい場合は、HTMLやCSS,JavaScriptを用いて独自にダイアログを作成しなくてはならない。


#参考文献
[JavaScriptでalertを使ってアラートを表示させる方法【初心者向け】](https://techacademy.jp/magazine/5486)
[【JavaScript入門】alert(アラート)メッセージはこれで完璧。使い方を総まとめ！](https://www.sejuku.net/blog/29821)
【Unity】ボタンが押せないのは大体RaycastTargetの設定ミス

#UIが反応しない…
![スクリーンショット 2020-09-28 21.52.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694219/19b092b0-0e00-246a-d546-0359a280324c.png)
上の画像のようにボタンのUIをしっかり設定しているのに、なぜか押せない時ってありますよね？
そんな時は大体`RaycastTarget`の設定ミスです。

#RaycastTargetとは
まず、`Raycast`というのは**指定した場所から`Ray(光線)`を放ち、光線と接触したオブジェクトの情報を取得する機能**になります。
銃を撃って敵を攻撃する時に使用したり、本記事のテーマであるUIの情報を取得したりと様々な場面で使うことのできる機能です。

では**`RaycastTarget`**とは何か？
もうお分かりだと思いますが、その名の通り`Raycast`の**Target(対象)**とするか否かを設定するパラメータになります。
これを`true`にすると`Raycast`の**Target(対象)**となるので、情報を取得することができるということです。

#ボタンが押せない理由
本記事最初の画像のボタンが押せなかった理由は、以下の二つが同時に発生している時になります。

* **「Helloテキスト」がボタンより手前にある**
* **「Helloテキスト」の`RaycastTarget`が`true`**

手前かつ`RaycastTarget`が`true`になっていると、背後のオブジェクトまで`Ray`が通らないのでボタンが反応しない現象が起きるのです。
テキストボックスは見かけを整えるために、実際に見えてる範囲以上の大きさを持っている場合があり、ボタンと重なってしまうことが多いので要注意です。
![スクリーンショット 2020-09-28 22.17.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694219/58207468-c20a-cbce-ace2-0e24fba5e60a.png)
***見かけよりでかいテキスト***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694219/a27c1e8c-80ba-5519-7f95-372017a57121.png)
***trueになってしまっているRaycastTarget***

#解決策
基本的に**ボタン以外は`RaycastTarget`を`false`にする**ことで解決します。
新しくUIを作成する時は注意してみてください。
それでも反応しない場合はボタンの`OnClick`が設定されていないか、シーン内にEventSystemがないかだと思われます。
#まとめ

* `Raycast`は`Ray(光線)`を放ち、光線と接触したオブジェクトの情報を取得する機能
* 基本的にボタン以外は`RaycastTarget`を`false`にしよう
* それでも反応しない場合は`OnClick`を設定しているか確認しよう
【Salesforce】「条件に一致する子レコードのみを表示する関連リスト」をノーコードで作成

　Salesforce組織で親子関係のあるオブジェクトで、親オブジェクト側のレコードページに子オブジェクトの関連リストを表示することがよくあると思います。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394418/f900de8f-ba56-b4d7-f8fb-d4e1ec840b06.png)

　子レコードを一度に見たり、親オブジェクト画面からリレーションを持たせて新規の子レコードを作成出来たり、便利ですよね？
この関連リストで「条件に一致する子レコードのみ」を表示したいと思ったことはありませんか？
（例.部署が営業部の取引先責任者だけの関連リストなど）

　実はちょっとした工夫でノーコードで何個でも作ることが出来ます。（実際にはオブジェクトごとに上限がありますが笑）

　今回、経費精算関連のオブジェクトがあるという設定で詳細を説明していきます。

　**_この記事はSalesforce 開発者向けブログ投稿キャンペーンへのエントリー記事です。_**

# シナリオ
　あなたの会社には、経費精算用のオブジェクトして、経費精算オブジェクトと経費明細オブジェクトがあります。（経費精算が主、経費明細が従の主従関係）

　経費精算の必要がある明細ごとに経費明細レコードを経費精算レコードに紐づけて、毎月集計しなければなりません。
　ただレコードを作成するだけでは、関連リストは一つになってしまい、様々な種類（旅費交通費、交際費、雑費など）の明細が一つの関連リストに表示されてしまいます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394418/ecc25003-1f51-3eb5-1053-c74244ddd27f.png)
　社内では、これを種別ごとの関連リストで表示したいという声が挙がっています。

# 方法
　実はとても簡単で、作りたい関連リストの数だけ経費明細オブジェクト側に参照関係項目を作成してするだけで作成できます。

詳細手順としては
1.作成したい関連リストの数だけ参照関係項目を作る
2.プロセスビルダーなどで項目値に基づいて、主従関係の値を該当の参照関係項目に設定する自動アクションを作成する
（例.「種別」が雑費のレコードは「経費精算_雑費」参照関係項目に主従関係項目の値を設定する）
3.関連リストをページレイアウトに設定する
以上で作成です。
完成したレイアウトはこのような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394418/d68d3754-2d6e-fe5b-d1c8-41a0708bbc5f.png)

　これで旅費交通費、交際費、雑費の種別ごとに関連リストを作成することが出来ました。

# まとめ
　今回はSalesforceの中でもかなり単純な標準機能だけを用いて、「条件に一致する子レコードのみを表示する関連リスト」を作成できました。Salesforceには把握しきれないくらい数多くの標準機能が存在するので、他にもいろいろな標準機能を組み合わせ工夫することで、開発無しでちょっと便利な機能を作成できるかもしれません。そのためにもこれからも各製品の標準機能を勉強しようと思います。
FFmpegを使用して、macで動画をMOVからMP4に変換する方法

# FFmpegを使用して、macで動画をMOVからMP4に変換する方法
FFmpegを使用
[FFmpeg公式サイト](https://ffmpeg.org/)

## 導入
```
brew install ffmpeg
```

## 変換
以下のコマンドで変換できる。ファイル名を指定すれば、拡張子から変換先を自動で判定してくれる。

```
ffmpeg -i hoge.mov hoge.mp4
```

## 結論
検索すると出てくる変換ソフトより楽じゃん！拡張子を変換するだけならFFmpegで十分そうです。
Monacaで作ったソースをローカルのCordova環境でビルドする

ローカルでのAndroid、iOSビルドの詳しいやり方は[こちら](https://qiita.com/danishi/items/c7656d45bde73bf62feb)を

公式サンプルの[Hello Worldアプリ](https://docs.monaca.io/ja/sampleapp/samples/hello_world/)からMonacaのプロジェクトを作ります。
作ったプロジェクトを特にいじらずエクスポートします。

ターミナルでプロジェクトのディレクトリに入ってプラットフォームを追加。

```
$ cordova platform add android ios
```

プラットフォームと`nodo_modules`が追加されますが、
↓こんなメッセージが出ます。

```
Discovered plugin "monaca-plugin-monaca-core". Adding it to the project
Cannot find plugin.xml for plugin "monaca-plugin-monaca-core". Please try adding it again.
```

`monaca-plugin-monaca-core`はMonacaのCordovaプラグインっぽいですが、
https://libraries.io/npm/monaca-plugin-monaca-core
`This works only in Monaca build server.`
Monacaビルドサーバーでしか動かないって書いてあるので`package.json`から取り除きます。

あとは、`cordova run android`ないし`cordova run ios`すれば動きます。

以上。
IFTTTでTwitterのハッシュタグ投稿をSpreadSheetで管理する

## ハッシュタグ#弾いてみたを手元で管理したい
最近ベースの演奏動画をTwitterに投稿しているのですが、IFTTTのTwitterに「ハッシュタグ付きのつぶやきがあったら」という設定があったので、そのつぶやきをSpreadSheetと同期してゆくゆくはポートフォリをサイトを作ろうと思ったので前段階のメモを残しておきます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【弾いてみた】<br>ドライドアウト/ACIDMAN<br>2番メロの軽やかなルート弾きからスリリングなSTOP&amp;GOの展開が好きなので弾いてみました。ルートのリズムが超怪しいw<br>iMovieで字幕入れたりと少しづつ進化していきます☺️<br>ついでに <a href="https://twitter.com/hashtag/%E5%BC%BE%E3%81%84%E3%81%A6%E3%81%BF%E3%81%9F?src=hash&amp;ref_src=twsrc%5Etfw">#弾いてみた</a> のハッシュタグでIFTTTによってSpreadeSheetに保存されます。<a href="https://twitter.com/hashtag/bass?src=hash&amp;ref_src=twsrc%5Etfw">#bass</a> <a href="https://t.co/hsIMBZqCmY">pic.twitter.com/hsIMBZqCmY</a></p>&mdash; ウーリズム (@Uh_rhythm) <a href="https://twitter.com/Uh_rhythm/status/1310169581449703424?ref_src=twsrc%5Etfw">September 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## triggerを設定する
IFTTTのIFの部分です。
New tweet by you with hashtagを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/5782bf24-0a95-a8fc-55cf-922109bb7870.png" width="70%">
1.ハッシュタグを入力します。
「#弾いてみた」ハッシュタグをつけて投稿するとSpreadSheetに同期される想定です。
2.Create triggerを押して 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/7cc76896-56f1-fc73-390f-41965d974965.png" width="70%">
IFの完成です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/d755fdad-9021-4e2c-88e1-1c8035a2d139.png" width="70%">



## Thenを設定
IFTTTのThenの部分です。
Add row to spreadsheetを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/b085faff-8c1d-803c-356c-382b0299e5a1.png" width="70%">
IF〜Thenが完成したので、Continueをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/99cbb704-598e-ac75-8387-77d3a568c2e5.png" width="70%">
確認画面でFinishを押して完成です！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/81cbe37c-8495-16fa-571e-9346c5ad25fd.png" width="70%">
ホーム画面にApletが追加されました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/b8153205-f979-cfa8-af15-9306fff000aa.png" width="70%">

## 投稿してみよう
こんな感じで#弾いてみた動画を投稿します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/89824a28-0c67-5ad2-eb05-efb8c6b213ac.png" width="70%">
無事同期されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/f5445505-1a3b-cd0b-5100-4ec9cc290b5d.png" width="70%">

## まとめ

IFFFTを使ってTwitterに連携がいとも容易くできてしまいました！
最近、TwitterAPIを使って何か作ろうとしたのですが申請と審査が必要になって頓挫してしまったので。
IFFFTめっちゃ楽しい！
BAD SLAM installation on Jetson AGX Xavier

# はじめに
BAD (Bundle Adjusted Direct RGB-D) SLAMをJetson AGX Xavier上で動かしてみました。名称インパクトありますw。Denseな地図を生成できて性能も良さそうです。今後詳細に評価していきたいと思います。

# Configuration
- Jetson AGX Xavier
- JetPack 4.2
- BAD slam master: 4f1564fc56795d921de89c207c666af6035bce3d
- RealSense D455

# Install Dependencies

## DLib
```
$ git clone https://github.com/dorian3d/DLib.git
$ cd DLib
$ git checkout b6c28fb8c0e27e02a467f1ec8e0beed9a05f9433
$ mkdir build && cd build
$ cmake ../
$ make -j6
$ sudo make install
```

## Eigen
```
$ wget wget http://bitbucket.org/eigen/eigen/get/3.3.7.tar.gz
$ mkdir eigen && tar --strip-components=1 -xzvf 3.3.7.tar.gz -C eigen
$ cd eigen && mkdir build && cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. 
$ make -j6
$ sudo make install
```

### g2o
```
$ git clone https://github.com/RainerKuemmerle/g2o.git
$ cd g2o
$ mkdir build && cd build
$ cmake ../
$ make -j6
$ sudo make install
```

## SuiteSparse
```
$ sudo apt install libsuitesparse-dev
```

## QT
```
$ git clone git://code.qt.io/qt/qt5.git
$ git checkout v5.12.0
$ perl init-repository
$ ./configure -opengl desktop
$ make -j4
$ sudo make install
```

## libcanberra-gtk-module
```
$ sudo apt install libcanberra-gtk-module
```
##

## libRealsense
cf. the official.

# BAD SLAM
```
$ git clone https://github.com/ETH3D/badslam.git
$ mkdir build
$ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_CUDA_FLAGS="-arch=sm_72" ..
$ make -j4
$ sudo make install
$ sudo cp liblibvis*.so /usr/local/lib
```

# Run
```
$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/Qt/lib/:/usr/local/lib:$LD_LIBRARY_PATH
$ badslam
```

RealSense Live Streamを選択し"Start"する。カメラはゆっくり動かす。

# 結果
![badslam.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109483/674a2de2-b8cc-e186-0948-0289c04ce832.png)
【webpack】sassをバンドルする際に出たエラーの対処

##環境
PHP 7.3.8
Laravel 6.18.40
webpack 4.27.1

## TypeError: text.forEach is not a function ...  というエラー

Docker開発環境下で、`npm run watch-poll` でビルドを試みるも以下エラーで失敗する。                                      

```
ERROR in ./resources/scss/app.scss
Module build failed (from ./node_modules/css-loader/dist/cjs.js):
TypeError: text.forEach is not a function
    at /var/www/node_modules/extract-text-webpack-plugin/dist/loader.js:145:16
（略）
```
結論から言うと、sassのバンドルには`css-loader`、`node-sass`、`sass-loader`、`style-loader`を用いているが、それぞれのバージョンによる互換性の問題であった。

今回は`css-loader`のバージョンを4.3から下げる事で改善した。

```
npm uninstall --save-dev css-loader
npm install --save-dev css-loader@3.5.3
```
最終的に以下の構成でビルドを確認した。

```package.json
"css-loader": "^3.5.3",
"laravel-mix": "^4.0.7",
"lodash": "^4.17.13",
"node-sass": "^4.14.1",
"resolve-url-loader": "^2.3.1",
"sass": "^1.15.2",
"sass-loader": "^7.1.0",
"style-loader": "^1.2.1",
```

##参考にした記事
・[npm がどうしてもエラーになる](https://qiita.com/tana08/items/d50212a1919308cc1480)
・[Laravel6でVueを使おうとnpm run watchをするとエラーが出る](https://teratail.com/questions/242618)
【メモ】BeautifulSoup4の使い方(1) htmlを表示

jupyternotebook上でBeautifulSoupを用いてスクレイピングする。

In[1]BeautifulSoupをimportする

```:In[1]
from bs4 import BeautifulSoup
```

In[2]スクレイピングしたい記事のhtmlを変数kijiに格納する

```:In[2]
kiji = """<html>
    　　　　<head>
        　　　<title>Qiitaに投稿してみた</title>
    　　　　</head>
    　　　　<body>
        　　　<p class="title">
            　　<b>アウトプットのためQiitaに挑戦。</b>
        　　　</p>
　　　　　　　　<p class="article">
            　　<b>頑張って記事を書きます。</b>
        　　　</p>
    　　　　</body>
　　　</html>"""
```
格納したいhtmlは"""と"""の間に書く。

In[3]先ほど変数kijiに格納したhtmlをBeautifulSoupに読み込ませる。

```:In[3]
soup = BeautifulSoup(kiji,"html.parser")
```
BeautifulSoup（格納したhtmlの入っている変数,"使いたいパーサー（解析器）")と書く。今回は(kiji,"html.parser")である。パーサーは""で囲むことやhtmlparserというように.を書き忘れないことに気を付ける。

In[4]soupをprettifyと一緒に使うことで見やすく表示させる。

```:In[4]
print(soup.prettify())
```
prettify()を使うことで階層化されて見やすくなる。

In[4]出力結果

```:In[4]
<html>
 <head>
  <title>
   Qiitaに投稿してみた
  </title>
 </head>
 <body>
  <p class="title">
   <b>
    アウトプットのためQiitaに挑戦。
   </b>
  </p>
  <p class="article">
   <b>
    頑張って記事を書きます。
   </b>
  </p>
 </body>
</html>
```

In[5]タイトルを表示させる

```:In[5]
print(soup.html.head.title)
```
```:In[5]出力結果
<title>Qiitaに投稿してみた</title>
```
IFTTTとLINE Notifyの連携

IFTTTとLINE Notifyを連携したときのメモ
IFTTTとLINE Notifyのアカウントは登録済み

###参考記事
[【初心者向け】M5StackのUIFlowからLINEに通知を送れるようにする方法【LINE Notify】](https://qiita.com/twtjudy1128/items/e4980be7ffd1b465144a)

##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206019/490d883e-7ed5-b95b-0650-dbd0ead3ab80.png)


LINE Notifyの[ページ](https://notify-bot.line.me/ja/)からIFTTTをクリックしてIFTTTに飛びます。

右上のCreateから新しく作ることが可能。

[![Image from Gyazo](https://i.gyazo.com/873ddc014abcbe6a80684e96261b31fc.png)](https://gyazo.com/873ddc014abcbe6a80684e96261b31fc)


事例から連結も可能。

[![Image from Gyazo](https://i.gyazo.com/b64ddcb9d67009131f1c296d59a190e7.png)](https://gyazo.com/b64ddcb9d67009131f1c296d59a190e7)
Windows ネットワーク構成について


##Active Directoryとは
Active Directoryとは、LDAPに準拠したディレクトリサービスである。
Active Directoryを組織のネットワークに設定することで、ユーザーを集中管理することが可能となる。
また**グループポリシー**によってユーザーやコンピューターの構成を行うことができる。

シングルサインオン機能があり、アプリケーションごとに認証情報を個別管理することが不要になる。

Active Directotyののデータベースを保持するサーバーを**ドメインコントローラー**と呼ぶ。

##ワークグループとActive Directory

○ ワークグループとは
コンピューターごとにリソースを管理する。
ワークグループのコンピューターを利用するにはユーザーアカウントを各コンピューターごとに登録する必要があり、
ユーザーアカウント情報は共有することはできない。DBはSAMDB(ローカル)

○ Active Directoryドメインとは
ドメインコントローラーがユーザーやグループネットワーク上のあらゆるリソースを一元管理する。
DBはADDB（サーバ）

##Active Directoryについて
○ディレクトリ データベース
オブジェクト（各種構成情報）が格納されている。
オブジェクトはユーザー、コンピューター、グループ、OU（組織単位）が代表的。

○ドメインコントローラー
ドメインコントローラーには「RWDC（読み書き可能）」「RODC（読み取り専用）」の２種類がある。
単一のドメインに複数のドメインコントローラーを構成することで、冗長化が可能。
変更した内容は他のドメインコントローラーにも自動的に複製され、これをマルチマスタ複製呼ぶ。

○DNS
Active DirectoryはDNSサーバーが必要になるが、ドメインコントローラーをDNSサーバーとして構成することが可能。
これによってActive Directory統合ゾーンを利用できる。

○ドメイン、フォレスト
ドメインとはディレクトリでーたべーすの複製の単位。ドメインにはこどインを追加することが可能で、これをツリーと呼ぶ。
（親ドメイン：corpA.com,子ドメイン：sub.corpA.com)
ツリーにツリーを追加して、フォレストを構成でき、このようにして構成された複数ドメイン間は信頼関係が確率される。
信頼関係同士は、他のドメインにログオンできたり、メールアドレス検索などが可能。

##グループポリシー
グループポリシーには以下２種類がある。
・コンピューターの構成・・・コンピューターに設定されたグループポリシーはそのコンピューターを利用するユーザーにかかわらず設定内容が強制される。
・ユーザーの構成・・・ユーザーに設定されたグループポリシーは利用するコンピューターにかかわらず設定内容が強制される。

グループポリシーは*サイト、ドメイン、OU*の単位に対して適用できる！！
複数のポリシーが適用されている場合、以下の順で読み込んだポリシーによって上書きされる。
サイト→ドメイン→OU
中二男子が一度は言ったことがある「無限ループ」

#無限ループとは
eachメソッドやwhile文で、繰り返し処理をしたときに、終わりがなく、永遠に処理を繰り返している状態。もちろん、パソコンへの負荷がかかる。
##具体例
```Ruby
number = 0
while number >= 0
 puts number
 number += 1
end
```
numberに１をたし続けて、出力していく。

##while文
```Ruby
while 条件式
 #条件式が真であるときに繰り返す処理
end
```
if文のように、条件式が真でないと、処理は実行されない。trueと条件式に入れれば、確実に繰り返される。
##無限ループを止める方法
breakを使う。
例えば、

```Ruby
number = 0
while number >= 0
 if number == 100
  break
 end
 puts number
 number += 1
end
```
if文を用いて、numberが100になったら、処理を終了させる。つまり、最後の出力は99になる。
##ポイント

- [x] while文は条件式が真のときのみ、処理を行う。 
- [x] 無限ルートはbreakで止められる。


##最後に
無限ループになってしまう状況は中々ないのかなぁと思う。
勉強日誌23日目


本日は秋晴れだったらしいですね！
心地よい天気でした。


正答率　83%(72)

getent passwd
ローカルやLDAPサーバで管理しているユーザー情報の一覧を表示

usermod -U user
ユーザアカウントuserのロックを解除

id
自分のアカウントのIDや所属グループを確認

userdel -d user
ユーザアカウントuserを削除する際にホームディレクトリも

id user
ユーザーuserのユーザIDや所属グループを表示

正答率　81%(96)

0 */2 * * 5,6
スクリプトを金曜日と土曜日のに2時間ごと実行

crontab
ユーザー用のcronの設定、表示を行う

正答率　74%(70)

locale
現在のロケールの設定を確認

iconv -l 文字コードの変換を行うコマンドで、扱える文字コードを表示するコマンド

/etc/locale.conf
システム全体のロケールの設定ファイル

LC_TIME
ロケールの設定で日付や時刻

locale -a
ロケールの環境変数に設定できる値の確認